1663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
2663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*--------------------------------------------------------------------*/
3663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*--- begin                                      guest_mips_toIR.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/* Translates MIPS code to IR. */
32663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
33663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include "libvex_basictypes.h"
34663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include "libvex_ir.h"
35663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include "libvex.h"
36663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include "libvex_guest_mips32.h"
37436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "libvex_guest_mips64.h"
38663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
39663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include "main_util.h"
40663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include "main_globals.h"
41663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include "guest_generic_bb_to_IR.h"
42663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include "guest_mips_defs.h"
43663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
44663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*------------------------------------------------------------*/
45436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*---                      Globals                         ---*/
46663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*------------------------------------------------------------*/
47663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
48663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* These are set at the start of the translation of a instruction, so
49436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   that we don't have to pass them around endlessly. CONST means does
50436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   not change during translation of the instruction. */
51663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
52663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* CONST: is the host bigendian?  This has to do with float vs double
53663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   register accesses on VFP, but it's complex and not properly thought
54663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   out. */
55663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic Bool host_is_bigendian;
56663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
57663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Pointer to the guest code area. */
58663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar *guest_code;
59663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
60663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* CONST: The guest address for the instruction currently being
61663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   translated. */
62436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#if defined(VGP_mips32_linux)
63663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic Addr32 guest_PC_curr_instr;
64436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#else
65436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic Addr64 guest_PC_curr_instr;
66436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
67663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
68663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* MOD: The IRSB* into which we're generating code. */
69663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRSB *irsb;
70663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
71436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Is our guest binary 32 or 64bit? Set at each call to
72663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   disInstr_MIPS below. */
73663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic Bool mode64 = False;
74663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
75436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* CPU has FPU and 32 dbl. prec. FP registers. */
76436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic Bool fp_mode64 = False;
77436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
78436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Define 1.0 in single and double precision. */
79436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define ONE_SINGLE 0x3F800000
80436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define ONE_DOUBLE 0x3FF0000000000000ULL
81436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
82663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*------------------------------------------------------------*/
83436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*---                  Debugging output                    ---*/
84663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*------------------------------------------------------------*/
85663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
86663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define DIP(format, args...)           \
87663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (vex_traceflags & VEX_TRACE_FE)  \
88663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vex_printf(format, ## args)
89663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
90663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*------------------------------------------------------------*/
91663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*--- Helper bits and pieces for deconstructing the        ---*/
92663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*--- mips insn stream.                                    ---*/
93663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*------------------------------------------------------------*/
94663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
95663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* ---------------- Integer registers ---------------- */
96663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
97663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt integerGuestRegOffset(UInt iregNo)
98663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
99663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Do we care about endianness here?  We do if sub-parts of integer
100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      registers are accessed, but I don't think that ever happens on
101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      MIPS. */
102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt ret;
103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (!mode64)
104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      switch (iregNo) {
105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 0:
106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_r0); break;
107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 1:
108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_r1); break;
109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 2:
110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_r2); break;
111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 3:
112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_r3); break;
113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 4:
114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_r4); break;
115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 5:
116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_r5); break;
117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 6:
118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_r6); break;
119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 7:
120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_r7); break;
121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 8:
122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_r8); break;
123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 9:
124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_r9); break;
125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 10:
126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_r10); break;
127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 11:
128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_r11); break;
129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 12:
130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_r12); break;
131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 13:
132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_r13); break;
133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 14:
134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_r14); break;
135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 15:
136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_r15); break;
137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 16:
138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_r16); break;
139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 17:
140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_r17); break;
141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 18:
142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_r18); break;
143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 19:
144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_r19); break;
145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 20:
146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_r20); break;
147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 21:
148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_r21); break;
149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 22:
150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_r22); break;
151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 23:
152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_r23); break;
153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 24:
154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_r24); break;
155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 25:
156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_r25); break;
157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 26:
158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_r26); break;
159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 27:
160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_r27); break;
161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 28:
162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_r28); break;
163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 29:
164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_r29); break;
165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 30:
166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_r30); break;
167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 31:
168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_r31); break;
169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         default:
170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vassert(0);
171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   else
174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      switch (iregNo) {
175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 0:
176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_r0); break;
177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 1:
178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_r1); break;
179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 2:
180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_r2); break;
181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 3:
182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_r3); break;
183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 4:
184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_r4); break;
185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 5:
186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_r5); break;
187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 6:
188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_r6); break;
189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 7:
190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_r7); break;
191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 8:
192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_r8); break;
193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 9:
194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_r9); break;
195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 10:
196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_r10); break;
197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 11:
198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_r11); break;
199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 12:
200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_r12); break;
201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 13:
202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_r13); break;
203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 14:
204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_r14); break;
205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 15:
206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_r15); break;
207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 16:
208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_r16); break;
209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 17:
210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_r17); break;
211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 18:
212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_r18); break;
213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 19:
214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_r19); break;
215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 20:
216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_r20); break;
217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 21:
218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_r21); break;
219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 22:
220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_r22); break;
221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 23:
222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_r23); break;
223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 24:
224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_r24); break;
225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 25:
226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_r25); break;
227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 26:
228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_r26); break;
229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 27:
230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_r27); break;
231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 28:
232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_r28); break;
233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 29:
234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_r29); break;
235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 30:
236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_r30); break;
237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 31:
238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_r31); break;
239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         default:
240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vassert(0);
241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return ret;
244663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
245663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#if defined(VGP_mips32_linux)
247663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define OFFB_PC     offsetof(VexGuestMIPS32State, guest_PC)
248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#else
249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define OFFB_PC     offsetof(VexGuestMIPS64State, guest_PC)
250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
251663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
252663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* ---------------- Floating point registers ---------------- */
253663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
254663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt floatGuestRegOffset(UInt fregNo)
255663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
256663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(fregNo < 32);
257663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt ret;
258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (!mode64)
259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      switch (fregNo) {
260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 0:
261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_f0); break;
262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 1:
263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_f1); break;
264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 2:
265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_f2); break;
266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 3:
267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_f3); break;
268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 4:
269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_f4); break;
270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 5:
271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_f5); break;
272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 6:
273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_f6); break;
274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 7:
275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_f7); break;
276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 8:
277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_f8); break;
278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 9:
279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_f9); break;
280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 10:
281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_f10); break;
282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 11:
283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_f11); break;
284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 12:
285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_f12); break;
286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 13:
287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_f13); break;
288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 14:
289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_f14); break;
290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 15:
291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_f15); break;
292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 16:
293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_f16); break;
294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 17:
295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_f17); break;
296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 18:
297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_f18); break;
298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 19:
299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_f19); break;
300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 20:
301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_f20); break;
302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 21:
303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_f21); break;
304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 22:
305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_f22); break;
306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 23:
307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_f23); break;
308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 24:
309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_f24); break;
310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 25:
311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_f25); break;
312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 26:
313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_f26); break;
314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 27:
315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_f27); break;
316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 28:
317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_f28); break;
318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 29:
319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_f29); break;
320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 30:
321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_f30); break;
322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 31:
323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS32State, guest_f31); break;
324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         default:
325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vassert(0);
326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   else
329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      switch (fregNo) {
330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 0:
331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_f0); break;
332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 1:
333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_f1); break;
334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 2:
335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_f2); break;
336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 3:
337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_f3); break;
338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 4:
339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_f4); break;
340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 5:
341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_f5); break;
342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 6:
343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_f6); break;
344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 7:
345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_f7); break;
346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 8:
347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_f8); break;
348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 9:
349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_f9); break;
350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 10:
351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_f10); break;
352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 11:
353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_f11); break;
354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 12:
355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_f12); break;
356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 13:
357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_f13); break;
358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 14:
359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_f14); break;
360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 15:
361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_f15); break;
362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 16:
363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_f16); break;
364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 17:
365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_f17); break;
366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 18:
367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_f18); break;
368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 19:
369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_f19); break;
370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 20:
371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_f20); break;
372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 21:
373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_f21); break;
374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 22:
375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_f22); break;
376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 23:
377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_f23); break;
378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 24:
379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_f24); break;
380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 25:
381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_f25); break;
382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 26:
383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_f26); break;
384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 27:
385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_f27); break;
386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 28:
387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_f28); break;
388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 29:
389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_f29); break;
390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 30:
391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_f30); break;
392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 31:
393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ret = offsetof(VexGuestMIPS64State, guest_f31); break;
394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         default:
395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vassert(0);
396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return ret;
399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
401436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* ---------------- MIPS32 DSP ASE(r2) accumulators ---------------- */
402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic UInt accumulatorGuestRegOffset(UInt acNo)
404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(!mode64);
406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(acNo <= 3);
407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UInt ret;
408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (acNo) {
409663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 0:
410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ret = offsetof(VexGuestMIPS32State, guest_ac0); break;
411663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 1:
412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ret = offsetof(VexGuestMIPS32State, guest_ac1); break;
413663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 2:
414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ret = offsetof(VexGuestMIPS32State, guest_ac2); break;
415663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 3:
416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ret = offsetof(VexGuestMIPS32State, guest_ac3); break;
417663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      default:
418663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vassert(0);
419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov    break;
420663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
421663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return ret;
422663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
423663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Do a endian load of a 32-bit word, regardless of the endianness of the
425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   underlying host. */
426663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic inline UInt getUInt(UChar * p)
427663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
428663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt w = 0;
429663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if defined (_MIPSEL)
430663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   w = (w << 8) | p[3];
431663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   w = (w << 8) | p[2];
432663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   w = (w << 8) | p[1];
433663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   w = (w << 8) | p[0];
434663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#elif defined (_MIPSEB)
435663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   w = (w << 8) | p[0];
436663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   w = (w << 8) | p[1];
437663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   w = (w << 8) | p[2];
438663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   w = (w << 8) | p[3];
439663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
440663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return w;
441663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
442663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
443663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define BITS2(_b1,_b0) \
444663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   (((_b1) << 1) | (_b0))
445663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
446663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define BITS3(_b2,_b1,_b0)                      \
447663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  (((_b2) << 2) | ((_b1) << 1) | (_b0))
448663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
449663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define BITS4(_b3,_b2,_b1,_b0) \
450663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   (((_b3) << 3) | ((_b2) << 2) | ((_b1) << 1) | (_b0))
451663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
452663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define BITS5(_b4,_b3,_b2,_b1,_b0)  \
453663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   (((_b4) << 4) | BITS4((_b3),(_b2),(_b1),(_b0)))
454663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
455663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define BITS6(_b5,_b4,_b3,_b2,_b1,_b0)  \
456663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   ((BITS2((_b5),(_b4)) << 4) \
457663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    | BITS4((_b3),(_b2),(_b1),(_b0)))
458663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
459663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define BITS8(_b7,_b6,_b5,_b4,_b3,_b2,_b1,_b0)  \
460663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   ((BITS4((_b7),(_b6),(_b5),(_b4)) << 4) \
461663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    | BITS4((_b3),(_b2),(_b1),(_b0)))
462663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
463663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define LOAD_STORE_PATTERN \
464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   t1 = newTemp(mode64 ? Ity_I64 : Ity_I32); \
465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if(!mode64) \
466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, binop(Iop_Add32, getIReg(rs), \
467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     mkU32(extend_s_16to32(imm)))); \
468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      else \
469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, binop(Iop_Add64, getIReg(rs), \
470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     mkU64(extend_s_16to64(imm)))); \
471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define LOADX_STORE_PATTERN \
473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   t1 = newTemp(mode64 ? Ity_I64 : Ity_I32); \
474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if(!mode64) \
475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, binop(Iop_Add32, getIReg(regRs), getIReg(regRt))); \
476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      else \
477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, binop(Iop_Add64, getIReg(regRs), getIReg(regRt)));
478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define LWX_SWX_PATTERN64 \
480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   t2 = newTemp(Ity_I64); \
481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(t2, binop(Iop_And64, mkexpr(t1), mkU64(0xFFFFFFFFFFFFFFFCULL))); \
482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   t4 = newTemp(Ity_I32); \
483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(t4, mkNarrowTo32( ty, binop(Iop_And64, \
484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkexpr(t1), mkU64(0x3))));
485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define LWX_SWX_PATTERN64_1 \
487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   t2 = newTemp(Ity_I64); \
488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(t2, binop(Iop_And64, mkexpr(t1), mkU64(0xFFFFFFFFFFFFFFF8ULL))); \
489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   t4 = newTemp(Ity_I64); \
490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(t4, binop(Iop_And64, mkexpr(t1), mkU64(0x7)));
491663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
492663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define LWX_SWX_PATTERN \
493663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   t2 = newTemp(Ity_I32); \
494663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(t2, binop(Iop_And32, mkexpr(t1), mkU32(0xFFFFFFFC))); \
495663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   t4 = newTemp(Ity_I32); \
496663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(t4, binop(Iop_And32, mkexpr(t1), mkU32(0x00000003)))
497663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
498663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define SXXV_PATTERN(op) \
499663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   putIReg(rd, binop(op, \
500663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         getIReg(rt), \
501663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            unop(Iop_32to8, \
502663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               binop(Iop_And32, \
503663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  getIReg(rs), \
504663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  mkU32(0x0000001F) \
505663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               ) \
506663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            ) \
507663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         ) \
508663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      )
509663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define SXXV_PATTERN64(op) \
511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   putIReg(rd, mkWidenFrom32(ty, binop(op, \
512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           mkNarrowTo32(ty, getIReg(rt)), \
513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov             unop(Iop_32to8, \
514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                binop(Iop_And32, \
515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                   mkNarrowTo32(ty, getIReg(rs)), \
516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                   mkU32(0x0000001F) \
517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                ) \
518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov             ) \
519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov          ), True \
520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       ))
521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
522663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define SXX_PATTERN(op) \
523663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   putIReg(rd, binop(op, getIReg(rt), mkU8(sa)));
524663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
525663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define ALU_PATTERN(op) \
526663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   putIReg(rd, binop(op, getIReg(rs), getIReg(rt)));
527663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
528663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define ALUI_PATTERN(op) \
529663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   putIReg(rt, binop(op, getIReg(rs), mkU32(imm)));
530663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
531663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define ALUI_PATTERN64(op) \
532663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   putIReg(rt, binop(op, getIReg(rs), mkU64(imm)));
533663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define ALU_PATTERN64(op) \
535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   putIReg(rd, mkWidenFrom32(ty, binop(op, \
536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             mkNarrowTo32(ty, getIReg(rs)), \
537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             mkNarrowTo32(ty, getIReg(rt))), True));
538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
539663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#define FP_CONDITIONAL_CODE \
540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   t3 = newTemp(Ity_I32);   \
541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(t3, binop(Iop_And32, \
542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 IRExpr_ITE( binop(Iop_CmpEQ32, mkU32(cc), mkU32(0)), \
543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             binop(Iop_Shr32, getFCSR(), mkU8(23)), \
544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             binop(Iop_Shr32, getFCSR(), mkU8(24+cc))), \
545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 mkU32(0x1)));
546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define ILLEGAL_INSTRUCTON \
548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   putPC(mkU32(guest_PC_curr_instr + 4)); \
549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   dres.jk_StopHere = Ijk_SigILL; \
550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   dres.whatNext    = Dis_StopHere;
551663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
552663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*------------------------------------------------------------*/
553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*---                  Field helpers                       ---*/
554663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*------------------------------------------------------------*/
555663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
556663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt get_opcode(UInt mipsins)
557663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
558663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return (0xFC000000 & mipsins) >> 26;
559663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
560663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
561663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt get_rs(UInt mipsins)
562663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
563663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return (0x03E00000 & mipsins) >> 21;
564663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
565663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
566663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt get_rt(UInt mipsins)
567663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
568663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return (0x001F0000 & mipsins) >> 16;
569663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
570663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
571663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt get_imm(UInt mipsins)
572663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
573663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return (0x0000FFFF & mipsins);
574663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
575663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
576663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt get_instr_index(UInt mipsins)
577663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
578663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return (0x03FFFFFF & mipsins);
579663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
580663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
581663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt get_rd(UInt mipsins)
582663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
583663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return (0x0000F800 & mipsins) >> 11;
584663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
585663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
586663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt get_sa(UInt mipsins)
587663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
588663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return (0x000007C0 & mipsins) >> 6;
589663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
590663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
591663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt get_function(UInt mipsins)
592663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
593663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return (0x0000003F & mipsins);
594663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
595663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
596663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt get_ft(UInt mipsins)
597663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
598663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return (0x001F0000 & mipsins) >> 16;
599663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
600663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
601663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt get_fs(UInt mipsins)
602663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
603663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return (0x0000F800 & mipsins) >> 11;
604663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
605663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
606663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt get_fd(UInt mipsins)
607663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
608663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return (0x000007C0 & mipsins) >> 6;
609663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
610663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
611663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt get_mov_cc(UInt mipsins)
612663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
613663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return (0x001C0000 & mipsins) >> 18;
614663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
615663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
616663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt get_bc1_cc(UInt mipsins)
617663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
618663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return (0x001C0000 & mipsins) >> 18;
619663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
620663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
621663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt get_fpc_cc(UInt mipsins)
622663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
623663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return (0x00000700 & mipsins) >> 8;
624663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
625663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
626663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt get_tf(UInt mipsins)
627663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
628663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return (0x00010000 & mipsins) >> 16;
629663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
630663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
631663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt get_nd(UInt mipsins)
632663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
633663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return (0x00020000 & mipsins) >> 17;
634663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
635663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
636663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt get_fmt(UInt mipsins)
637663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
638663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return (0x03E00000 & mipsins) >> 21;
639663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
640663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
641663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt get_FC(UInt mipsins)
642663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
643663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return (0x000000F0 & mipsins) >> 4;
644663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
645663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
646663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt get_cond(UInt mipsins)
647663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
648663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return (0x0000000F & mipsins);
649663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
650663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
651663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* for break & syscall */
652663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt get_code(UInt mipsins)
653663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
654663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return (0xFFC0 & mipsins) >> 6;
655663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
656663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
657663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt get_lsb(UInt mipsins)
658663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
659663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return (0x7C0 & mipsins) >> 6;
660663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
661663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
662663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt get_msb(UInt mipsins)
663663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
664663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return (0x0000F800 & mipsins) >> 11;
665663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
666663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
667663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt get_rot(UInt mipsins)
668663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
669663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return (0x00200000 & mipsins) >> 21;
670663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
671663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
672663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt get_rotv(UInt mipsins)
673663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
674663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return (0x00000040 & mipsins) >> 6;
675663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
676663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
677663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt get_sel(UInt mipsins)
678663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
679663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return (0x00000007 & mipsins);
680663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
681663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Get acc number for all MIPS32 DSP ASE(r2) instructions that use them,
683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   except for MFHI and MFLO. */
684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic UInt get_acNo(UInt mipsins)
685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return (0x00001800 & mipsins) >> 11;
687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Get accumulator number for MIPS32 DSP ASEr2 MFHI and MFLO instructions. */
690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic UInt get_acNo_mfhilo(UInt mipsins)
691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return (0x00600000 & mipsins) >> 21;
693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Get mask field (helper function for wrdsp instruction). */
696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic UInt get_wrdspMask(UInt mipsins)
697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return (0x001ff800 & mipsins) >> 11;
699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Get mask field (helper function for rddsp instruction). */
702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic UInt get_rddspMask(UInt mipsins)
703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return (0x03ff0000 & mipsins) >> 16;
705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Get shift field (helper function for DSP ASE instructions). */
708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic UInt get_shift(UInt mipsins)
709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return (0x03f00000 & mipsins) >> 20;
711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Get immediate field for DSP ASE instructions. */
714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic UInt get_dspImm(UInt mipsins)
715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return (0x03ff0000 & mipsins) >> 16;
717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
719663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic Bool branch_or_jump(UChar * addr)
720663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
721663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt fmt;
722663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt cins = getUInt(addr);
723663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
724663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt opcode = get_opcode(cins);
725663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt rt = get_rt(cins);
726663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt function = get_function(cins);
727663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
728663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* bgtz, blez, bne, beq, jal */
729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (opcode == 0x07 || opcode == 0x06 || opcode == 0x05 || opcode == 0x04
730663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       || opcode == 0x03 || opcode == 0x02) {
731663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return True;
732663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
733663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
734663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* bgez */
735663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (opcode == 0x01 && rt == 0x01) {
736663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return True;
737663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
738663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
739663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* bgezal */
740663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (opcode == 0x01 && rt == 0x11) {
741663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return True;
742663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
743663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
744663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* bltzal */
745663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (opcode == 0x01 && rt == 0x10) {
746663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return True;
747663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
748663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
749663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* bltz */
750663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (opcode == 0x01 && rt == 0x00) {
751663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return True;
752663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
753663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
754663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* jalr */
755663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (opcode == 0x00 && function == 0x09) {
756663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return True;
757663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
758663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
759663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* jr */
760663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (opcode == 0x00 && function == 0x08) {
761663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return True;
762663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
763663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
764663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (opcode == 0x11) {
765663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /*bc1f & bc1t */
766663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      fmt = get_fmt(cins);
767663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (fmt == 0x08) {
768663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         return True;
769663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
770663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
771663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* bposge32 */
773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (opcode == 0x01 && rt == 0x1c) {
774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return True;
775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
777663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return False;
778663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
779663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
780663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic Bool is_Branch_or_Jump_and_Link(UChar * addr)
781663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
782663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt cins = getUInt(addr);
783663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
784663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt opcode = get_opcode(cins);
785663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt rt = get_rt(cins);
786663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt function = get_function(cins);
787663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
788663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* jal */
789663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (opcode == 0x02) {
790663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return True;
791663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
792663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
793663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* bgezal */
794663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (opcode == 0x01 && rt == 0x11) {
795663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return True;
796663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
797663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
798663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* bltzal */
799663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (opcode == 0x01 && rt == 0x10) {
800663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return True;
801663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
802663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
803663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* jalr */
804663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (opcode == 0x00 && function == 0x09) {
805663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return True;
806663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
807663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
808663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return False;
809663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
810663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
811663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic Bool branch_or_link_likely(UChar * addr)
812663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
813663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt cins = getUInt(addr);
814663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt opcode = get_opcode(cins);
815663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt rt = get_rt(cins);
816663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
817663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* bgtzl, blezl, bnel, beql */
818663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (opcode == 0x17 || opcode == 0x16 || opcode == 0x15 || opcode == 0x14)
819663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return True;
820663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
821663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* bgezl */
822663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (opcode == 0x01 && rt == 0x03)
823663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return True;
824663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
825663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* bgezall */
826663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (opcode == 0x01 && rt == 0x13)
827663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return True;
828663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
829663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* bltzall */
830663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (opcode == 0x01 && rt == 0x12)
831663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return True;
832663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
833663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* bltzl */
834663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (opcode == 0x01 && rt == 0x02)
835663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return True;
836663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
837663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return False;
838663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
839663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
840663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*------------------------------------------------------------*/
841663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*--- Helper bits and pieces for creating IR fragments.    ---*/
842663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*------------------------------------------------------------*/
843663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
844663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *mkU8(UInt i)
845663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
846663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(i < 256);
847663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return IRExpr_Const(IRConst_U8((UChar) i));
848663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
849663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Create an expression node for a 16-bit integer constant. */
851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic IRExpr *mkU16(UInt i)
852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return IRExpr_Const(IRConst_U16(i));
854436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
856436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Create an expression node for a 32-bit integer constant. */
857663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *mkU32(UInt i)
858663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
859663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return IRExpr_Const(IRConst_U32(i));
860663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
861663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Create an expression node for a 64-bit integer constant. */
863663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *mkU64(ULong i)
864663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
865663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return IRExpr_Const(IRConst_U64(i));
866663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
867663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
868663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *mkexpr(IRTemp tmp)
869663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
870663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return IRExpr_RdTmp(tmp);
871663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
872663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
873663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *unop(IROp op, IRExpr * a)
874663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
875663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return IRExpr_Unop(op, a);
876663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
877663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
878663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *binop(IROp op, IRExpr * a1, IRExpr * a2)
879663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
880663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return IRExpr_Binop(op, a1, a2);
881663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
882663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
883663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *triop(IROp op, IRExpr * a1, IRExpr * a2, IRExpr * a3)
884663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
885663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return IRExpr_Triop(op, a1, a2, a3);
886663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
887663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic IRExpr *qop ( IROp op, IRExpr * a1, IRExpr * a2, IRExpr * a3,
889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     IRExpr * a4 )
890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return IRExpr_Qop(op, a1, a2, a3, a4);
892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
894663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *load(IRType ty, IRExpr * addr)
895663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
896663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRExpr *load1 = NULL;
897663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if defined (_MIPSEL)
898663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   load1 = IRExpr_Load(Iend_LE, ty, addr);
899663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#elif defined (_MIPSEB)
900663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   load1 = IRExpr_Load(Iend_BE, ty, addr);
901663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
902663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return load1;
903663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
904663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
905663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Add a statement to the list held by "irsb". */
906663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void stmt(IRStmt * st)
907663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
908663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   addStmtToIRSB(irsb, st);
909663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
910663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
911663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void assign(IRTemp dst, IRExpr * e)
912663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
913663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   stmt(IRStmt_WrTmp(dst, e));
914663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
915663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
916663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void store(IRExpr * addr, IRExpr * data)
917663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
918663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if defined (_MIPSEL)
919663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   stmt(IRStmt_Store(Iend_LE, addr, data));
920663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#elif defined (_MIPSEB)
921663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   stmt(IRStmt_Store(Iend_BE, addr, data));
922663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
923663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
924663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
925663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Generate a new temporary of the given type. */
926663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRTemp newTemp(IRType ty)
927663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
928663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(isPlausibleIRType(ty));
929663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return newIRTemp(irsb->tyenv, ty);
930663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
931663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
932663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Generate an expression for SRC rotated right by ROT. */
933663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *genROR32(IRExpr * src, Int rot)
934663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
935663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(rot >= 0 && rot < 32);
936663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (rot == 0)
937663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return src;
938663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return binop(Iop_Or32, binop(Iop_Shl32, src, mkU8(32 - rot)),
939663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                          binop(Iop_Shr32, src, mkU8(rot)));
940663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
941663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
942663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *genRORV32(IRExpr * src, IRExpr * rs)
943663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
944663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp t0 = newTemp(Ity_I8);
945663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp t1 = newTemp(Ity_I8);
946663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
947663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(t0, unop(Iop_32to8, binop(Iop_And32, rs, mkU32(0x0000001F))));
948663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(t1, binop(Iop_Sub8, mkU8(32), mkexpr(t0)));
949663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return binop(Iop_Or32, binop(Iop_Shl32, src, mkexpr(t1)),
950663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                          binop(Iop_Shr32, src, mkexpr(t0)));
951663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
952663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic UShort extend_s_10to16(UInt x)
954436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
955436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return (UShort) ((((Int) x) << 22) >> 22);
956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic ULong extend_s_10to32(UInt x)
959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return (ULong)((((Long) x) << 22) >> 22);
961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic ULong extend_s_10to64(UInt x)
964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return (ULong)((((Long) x) << 54) >> 54);
966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
968663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt extend_s_16to32(UInt x)
969663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
970663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return (UInt) ((((Int) x) << 16) >> 16);
971663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
972663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
973663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UInt extend_s_18to32(UInt x)
974663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
975663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return (UInt) ((((Int) x) << 14) >> 14);
976663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
977663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic ULong extend_s_16to64 ( UInt x )
979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return (ULong) ((((Long) x) << 48) >> 48);
981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic ULong extend_s_18to64 ( UInt x )
984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return (ULong) ((((Long) x) << 46) >> 46);
986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic ULong extend_s_32to64 ( UInt x )
989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return (ULong) ((((Long) x) << 32) >> 32);
991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void jmp_lit32 ( /*MOD*/ DisResult* dres, IRJumpKind kind, Addr32 d32 )
994663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
995663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(dres->whatNext    == Dis_Continue);
996663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(dres->len         == 0);
997663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(dres->continueAt  == 0);
998663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(dres->jk_StopHere == Ijk_INVALID);
999663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dres->whatNext    = Dis_StopHere;
1000663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dres->jk_StopHere = kind;
1001663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   stmt( IRStmt_Put( OFFB_PC, mkU32(d32) ) );
1002663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1003663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void jmp_lit64 ( /*MOD*/ DisResult* dres, IRJumpKind kind, Addr64 d64 )
1005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
1006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(dres->whatNext    == Dis_Continue);
1007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(dres->len         == 0);
1008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(dres->continueAt  == 0);
1009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(dres->jk_StopHere == Ijk_INVALID);
1010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   dres->whatNext    = Dis_StopHere;
1011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   dres->jk_StopHere = kind;
1012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   stmt(IRStmt_Put(OFFB_PC, mkU64(d64)));
1013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Get value from accumulator (helper function for MIPS32 DSP ASE instructions).
1016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   This function should be called before any other operation if widening
1017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   multiplications are used. */
1018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic IRExpr *getAcc(UInt acNo)
1019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
1020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(!mode64);
1021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(acNo <= 3);
1022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return IRExpr_Get(accumulatorGuestRegOffset(acNo), Ity_I64);
1023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Get value from DSPControl register (helper function for MIPS32 DSP ASE
1026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   instructions). */
1027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic IRExpr *getDSPControl(void)
1028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
1029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(!mode64);
1030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return IRExpr_Get(offsetof(VexGuestMIPS32State, guest_DSPControl), Ity_I32);
1031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Put value to DSPControl register. Expression e is written to DSPControl as
1034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   is. If only certain bits of DSPControl need to be changed, it should be done
1035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   before calling putDSPControl(). It could be done by reading DSPControl and
1036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ORing it with appropriate mask. */
1037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void putDSPControl(IRExpr * e)
1038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
1039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(!mode64);
1040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   stmt(IRStmt_Put(offsetof(VexGuestMIPS32State, guest_DSPControl), e));
1041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1043663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Fetch a byte from the guest insn stream. */
1044663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic UChar getIByte(Int delta)
1045663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1046663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return guest_code[delta];
1047663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1048663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1049663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *getIReg(UInt iregNo)
1050663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1051663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (0 == iregNo) {
1052663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return mode64 ? mkU64(0x0) : mkU32(0x0);
1053663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   } else {
1054663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      IRType ty = mode64 ? Ity_I64 : Ity_I32;
1055663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(iregNo < 32);
1056663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return IRExpr_Get(integerGuestRegOffset(iregNo), ty);
1057663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
1058663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1059663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1060663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *getHI(void)
1061663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (mode64)
1063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return IRExpr_Get(offsetof(VexGuestMIPS64State, guest_HI), Ity_I64);
1064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   else
1065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return IRExpr_Get(offsetof(VexGuestMIPS32State, guest_HI), Ity_I32);
1066663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1067663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1068663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *getLO(void)
1069663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (mode64)
1071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return IRExpr_Get(offsetof(VexGuestMIPS64State, guest_LO), Ity_I64);
1072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   else
1073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return IRExpr_Get(offsetof(VexGuestMIPS32State, guest_LO), Ity_I32);
1074663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1075663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1076663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *getFCSR(void)
1077663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (mode64)
1079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return IRExpr_Get(offsetof(VexGuestMIPS64State, guest_FCSR), Ity_I32);
1080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   else
1081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return IRExpr_Get(offsetof(VexGuestMIPS32State, guest_FCSR), Ity_I32);
1082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Get byte from register reg, byte pos from 0 to 3 (or 7 for MIPS64) . */
1085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic IRExpr *getByteFromReg(UInt reg, UInt byte_pos)
1086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
1087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  UInt pos = byte_pos * 8;
1088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov  if (mode64)
1089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return unop(Iop_64to8, binop(Iop_And64,
1090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   binop(Iop_Shr64, getIReg(reg), mkU8(pos)),
1091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   mkU64(0xFF)));
1092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   else
1093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return unop(Iop_32to8, binop(Iop_And32,
1094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   binop(Iop_Shr32, getIReg(reg), mkU8(pos)),
1095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   mkU32(0xFF)));
1096663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1097663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1098663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void putFCSR(IRExpr * e)
1099663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (mode64)
1101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      stmt(IRStmt_Put(offsetof(VexGuestMIPS64State, guest_FCSR), e));
1102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   else
1103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      stmt(IRStmt_Put(offsetof(VexGuestMIPS32State, guest_FCSR), e));
1104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* fs   - fpu source register number.
1107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   inst - fpu instruction that needs to be executed.
1108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   sz32 - size of source register.
1109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   opN  - number of operads:
1110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov          1 - unary operation.
1111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov          2 - binary operation. */
1112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void calculateFCSR(UInt fs, UInt ft, UInt inst, Bool sz32, UInt opN)
1113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
1114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRDirty *d;
1115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp fcsr = newTemp(Ity_I32);
1116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* IRExpr_BBPTR() => Need to pass pointer to guest state to helper. */
1117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (fp_mode64)
1118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      d = unsafeIRDirty_1_N(fcsr, 0,
1119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            "mips_dirtyhelper_calculate_FCSR_fp64",
1120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            &mips_dirtyhelper_calculate_FCSR_fp64,
1121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            mkIRExprVec_4(IRExpr_BBPTR(),
1122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          mkU32(fs),
1123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          mkU32(ft),
1124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          mkU32(inst)));
1125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   else
1126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      d = unsafeIRDirty_1_N(fcsr, 0,
1127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            "mips_dirtyhelper_calculate_FCSR_fp32",
1128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            &mips_dirtyhelper_calculate_FCSR_fp32,
1129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            mkIRExprVec_4(IRExpr_BBPTR(),
1130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          mkU32(fs),
1131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          mkU32(ft),
1132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          mkU32(inst)));
1133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (opN == 1) {  /* Unary operation. */
1135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* Declare we're reading guest state. */
1136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (sz32 || fp_mode64)
1137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         d->nFxState = 2;
1138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      else
1139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         d->nFxState = 3;
1140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vex_bzero(&d->fxState, sizeof(d->fxState));
1141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      d->fxState[0].fx     = Ifx_Read;  /* read */
1143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (mode64)
1144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         d->fxState[0].offset = offsetof(VexGuestMIPS64State, guest_FCSR);
1145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      else
1146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         d->fxState[0].offset = offsetof(VexGuestMIPS32State, guest_FCSR);
1147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      d->fxState[0].size   = sizeof(UInt);
1148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      d->fxState[1].fx     = Ifx_Read;  /* read */
1149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      d->fxState[1].offset = floatGuestRegOffset(fs);
1150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      d->fxState[1].size   = sizeof(ULong);
1151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (!(sz32 || fp_mode64)) {
1153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         d->fxState[2].fx     = Ifx_Read;  /* read */
1154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         d->fxState[2].offset = floatGuestRegOffset(fs+1);
1155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         d->fxState[2].size   = sizeof(ULong);
1156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
1157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else if (opN == 2) {  /* Binary operation. */
1158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* Declare we're reading guest state. */
1159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (sz32 || fp_mode64)
1160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         d->nFxState = 3;
1161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      else
1162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         d->nFxState = 5;
1163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vex_bzero(&d->fxState, sizeof(d->fxState));
1164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      d->fxState[0].fx     = Ifx_Read;  /* read */
1166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (mode64)
1167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         d->fxState[0].offset = offsetof(VexGuestMIPS64State, guest_FCSR);
1168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      else
1169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         d->fxState[0].offset = offsetof(VexGuestMIPS32State, guest_FCSR);
1170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      d->fxState[0].size   = sizeof(UInt);
1171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      d->fxState[1].fx     = Ifx_Read;  /* read */
1172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      d->fxState[1].offset = floatGuestRegOffset(fs);
1173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      d->fxState[1].size   = sizeof(ULong);
1174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      d->fxState[2].fx     = Ifx_Read;  /* read */
1175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      d->fxState[2].offset = floatGuestRegOffset(ft);
1176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      d->fxState[2].size   = sizeof(ULong);
1177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (!(sz32 || fp_mode64)) {
1179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         d->fxState[3].fx     = Ifx_Read;  /* read */
1180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         d->fxState[3].offset = floatGuestRegOffset(fs+1);
1181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         d->fxState[3].size   = sizeof(ULong);
1182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         d->fxState[4].fx     = Ifx_Read;  /* read */
1183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         d->fxState[4].offset = floatGuestRegOffset(ft+1);
1184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         d->fxState[4].size   = sizeof(ULong);
1185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
1186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
1187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   stmt(IRStmt_Dirty(d));
1189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   putFCSR(mkexpr(fcsr));
1191663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1192663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1193663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *getULR(void)
1194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (mode64)
1196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return IRExpr_Get(offsetof(VexGuestMIPS64State, guest_ULR), Ity_I64);
1197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   else
1198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return IRExpr_Get(offsetof(VexGuestMIPS32State, guest_ULR), Ity_I32);
1199663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1201663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void putIReg(UInt archreg, IRExpr * e)
1202663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1203663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRType ty = mode64 ? Ity_I64 : Ity_I32;
1204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(archreg < 32);
1205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(typeOfIRExpr(irsb->tyenv, e) == ty);
1206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (archreg != 0)
1207663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      stmt(IRStmt_Put(integerGuestRegOffset(archreg), e));
1208663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1209663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic IRExpr *mkNarrowTo32(IRType ty, IRExpr * src)
1211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
1212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(ty == Ity_I32 || ty == Ity_I64);
1213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return ty == Ity_I64 ? unop(Iop_64to32, src) : src;
1214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1216663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void putLO(IRExpr * e)
1217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (mode64) {
1219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      stmt(IRStmt_Put(offsetof(VexGuestMIPS64State, guest_LO), e));
1220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
1221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      stmt(IRStmt_Put(offsetof(VexGuestMIPS32State, guest_LO), e));
1222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* Add value to lower 32 bits of ac0 to maintain compatibility between
1223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      regular MIPS32 instruction set and MIPS DSP ASE. Keep higher 32bits
1224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      unchanged. */
1225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp t_lo = newTemp(Ity_I32);
1226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp t_hi = newTemp(Ity_I32);
1227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t_lo, e);
1228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t_hi, unop(Iop_64HIto32, getAcc(0)));
1229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      stmt(IRStmt_Put(accumulatorGuestRegOffset(0),
1230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           binop(Iop_32HLto64, mkexpr(t_hi), mkexpr(t_lo))));
1231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
1232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void putHI(IRExpr * e)
1235663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (mode64) {
1237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      stmt(IRStmt_Put(offsetof(VexGuestMIPS64State, guest_HI), e));
1238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
1239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      stmt(IRStmt_Put(offsetof(VexGuestMIPS32State, guest_HI), e));
1240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* Add value to higher 32 bits of ac0 to maintain compatibility between
1241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      regular MIPS32 instruction set and MIPS DSP ASE. Keep lower 32bits
1242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      unchanged. */
1243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp t_lo = newTemp(Ity_I32);
1244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp t_hi = newTemp(Ity_I32);
1245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t_hi, e);
1246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t_lo, unop(Iop_64to32, getAcc(0)));
1247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      stmt(IRStmt_Put(accumulatorGuestRegOffset(0),
1248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           binop(Iop_32HLto64, mkexpr(t_hi), mkexpr(t_lo))));
1249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
1250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Put value to accumulator(helper function for MIPS32 DSP ASE instructions). */
1253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic void putAcc(UInt acNo, IRExpr * e)
1254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
1255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(!mode64);
1256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(acNo <= 3);
1257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(typeOfIRExpr(irsb->tyenv, e) == Ity_I64);
1258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   stmt(IRStmt_Put(accumulatorGuestRegOffset(acNo), e));
1259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* If acNo = 0, split value to HI and LO regs in order to maintain compatibility
1260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   between MIPS32 and MIPS DSP ASE insn sets. */
1261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (0 == acNo) {
1262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     putLO(unop(Iop_64to32, e));
1263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov     putHI(unop(Iop_64HIto32, e));
1264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
1265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic IRExpr *mkNarrowTo8 ( IRType ty, IRExpr * src )
1268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
1269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(ty == Ity_I32 || ty == Ity_I64);
1270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return ty == Ity_I64 ? unop(Iop_64to8, src) : unop(Iop_32to8, src);
1271663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1272663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1273663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void putPC(IRExpr * e)
1274663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1275663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   stmt(IRStmt_Put(OFFB_PC, e));
1276663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1277663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1278663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *mkWidenFrom32(IRType ty, IRExpr * src, Bool sined)
1279663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1280663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(ty == Ity_I32 || ty == Ity_I64);
1281663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (ty == Ity_I32)
1282663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return src;
1283663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return (sined) ? unop(Iop_32Sto64, src) : unop(Iop_32Uto64, src);
1284663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1285663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1286663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Narrow 8/16/32 bit int expr to 8/16/32.  Clearly only some
1287663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   of these combinations make sense. */
1288663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *narrowTo(IRType dst_ty, IRExpr * e)
1289663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1290663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRType src_ty = typeOfIRExpr(irsb->tyenv, e);
1291663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (src_ty == dst_ty)
1292663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return e;
1293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (src_ty == Ity_I32 && dst_ty == Ity_I16)
1294663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return unop(Iop_32to16, e);
1295663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (src_ty == Ity_I32 && dst_ty == Ity_I8)
1296663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return unop(Iop_32to8, e);
1297663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (src_ty == Ity_I64 && dst_ty == Ity_I8) {
1298663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(mode64);
1299663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return unop(Iop_64to8, e);
1300663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
1301663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (src_ty == Ity_I64 && dst_ty == Ity_I16) {
1302663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      vassert(mode64);
1303663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return unop(Iop_64to16, e);
1304663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
1305663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vpanic("narrowTo(mips)");
1306663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return 0;
1307663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1308663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1309663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *getLoFromF64(IRType ty, IRExpr * src)
1310663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1311663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(ty == Ity_F32 || ty == Ity_F64);
1312663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (ty == Ity_F64) {
1313663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      IRTemp t0, t1;
1314663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      t0 = newTemp(Ity_I64);
1315663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      t1 = newTemp(Ity_I32);
1316663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      assign(t0, unop(Iop_ReinterpF64asI64, src));
1317663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      assign(t1, unop(Iop_64to32, mkexpr(t0)));
1318663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return unop(Iop_ReinterpI32asF32, mkexpr(t1));
1319663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   } else
1320663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return src;
1321663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1322663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1323663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *mkWidenFromF32(IRType ty, IRExpr * src)
1324663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1325663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(ty == Ity_F32 || ty == Ity_F64);
1326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (ty == Ity_F64) {
1327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp t0 = newTemp(Ity_I32);
1328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp t1 = newTemp(Ity_I64);
1329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t0, unop(Iop_ReinterpF32asI32, src));
1330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t1, binop(Iop_32HLto64, mkU32(0x0), mkexpr(t0)));
1331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return unop(Iop_ReinterpI64asF64, mkexpr(t1));
1332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else
1333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return src;
1334663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1335663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1336663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *dis_branch_likely(IRExpr * guard, UInt imm)
1337663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1338663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   ULong branch_offset;
1339663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp t0;
1340663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1341663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* PC = PC + (SignExtend(signed_immed_24) << 2)
1342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      An 18-bit signed offset (the 16-bit offset field shifted left 2 bits)
1343663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      is added to the address of the instruction following
1344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      the branch (not the branch itself), in the branch delay slot, to form
1345663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      a PC-relative effective target address. */
1346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (mode64)
1347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      branch_offset = extend_s_18to64(imm << 2);
1348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   else
1349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      branch_offset = extend_s_18to32(imm << 2);
1350663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1351663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   t0 = newTemp(Ity_I1);
1352663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(t0, guard);
1353663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (mode64)
1355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      stmt(IRStmt_Exit(mkexpr(t0), Ijk_Boring,
1356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                       IRConst_U64(guest_PC_curr_instr + 8), OFFB_PC));
1357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   else
1358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      stmt(IRStmt_Exit(mkexpr(t0), Ijk_Boring,
1359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                       IRConst_U32(guest_PC_curr_instr + 8), OFFB_PC));
1360663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1361663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   irsb->jumpkind = Ijk_Boring;
1362663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (mode64)
1364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return mkU64(guest_PC_curr_instr + 4 + branch_offset);
1365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   else
1366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return mkU32(guest_PC_curr_instr + 4 + branch_offset);
1367663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1368663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1369663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void dis_branch(Bool link, IRExpr * guard, UInt imm, IRStmt ** set)
1370663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1371663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   ULong branch_offset;
1372663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp t0;
1373663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (link) {  /* LR (GPR31) = addr of the 2nd instr after branch instr */
1375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (mode64)
1376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(31, mkU64(guest_PC_curr_instr + 8));
1377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      else
1378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(31, mkU32(guest_PC_curr_instr + 8));
1379663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
1380663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1381663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* PC = PC + (SignExtend(signed_immed_24) << 2)
1382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      An 18-bit signed offset (the 16-bit offset field shifted left 2 bits)
1383663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      is added to the address of the instruction following
1384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      the branch (not the branch itself), in the branch delay slot, to form
1385663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      a PC-relative effective target address. */
1386663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (mode64)
1388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      branch_offset = extend_s_18to64(imm << 2);
1389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   else
1390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      branch_offset = extend_s_18to32(imm << 2);
1391663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1392663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   t0 = newTemp(Ity_I1);
1393663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   assign(t0, guard);
1394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (mode64)
1395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      *set = IRStmt_Exit(mkexpr(t0), link ? Ijk_Call : Ijk_Boring,
1396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         IRConst_U64(guest_PC_curr_instr + 4 + branch_offset),
1397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         OFFB_PC);
1398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   else
1399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      *set = IRStmt_Exit(mkexpr(t0), link ? Ijk_Call : Ijk_Boring,
1400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         IRConst_U32(guest_PC_curr_instr + 4 +
1401436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     (UInt) branch_offset), OFFB_PC);
1402663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1403663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic IRExpr *getFReg(UInt fregNo)
1405663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(fregNo < 32);
1407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRType ty = fp_mode64 ? Ity_F64 : Ity_F32;
1408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return IRExpr_Get(floatGuestRegOffset(fregNo), ty);
1409663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1410663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1411663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic IRExpr *getDReg(UInt dregNo)
1412663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1413663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(dregNo < 32);
1414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (fp_mode64) {
1415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return IRExpr_Get(floatGuestRegOffset(dregNo), Ity_F64);
1416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
1417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* Read a floating point register pair and combine their contents into a
1418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         64-bit value */
1419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp t0 = newTemp(Ity_F32);
1420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp t1 = newTemp(Ity_F32);
1421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp t2 = newTemp(Ity_F64);
1422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp t3 = newTemp(Ity_I32);
1423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp t4 = newTemp(Ity_I32);
1424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp t5 = newTemp(Ity_I64);
1425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t0, getFReg(dregNo));
1427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t1, getFReg(dregNo + 1));
1428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t3, unop(Iop_ReinterpF32asI32, mkexpr(t0)));
1430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t4, unop(Iop_ReinterpF32asI32, mkexpr(t1)));
1431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t5, binop(Iop_32HLto64, mkexpr(t4), mkexpr(t3)));
1432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t2, unop(Iop_ReinterpI64asF64, mkexpr(t5)));
1433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return mkexpr(t2);
1435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
1436663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1437663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1438663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void putFReg(UInt dregNo, IRExpr * e)
1439663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1440663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(dregNo < 32);
1441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRType ty = fp_mode64 ? Ity_F64 : Ity_F32;
1442663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   vassert(typeOfIRExpr(irsb->tyenv, e) == ty);
1443663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   stmt(IRStmt_Put(floatGuestRegOffset(dregNo), e));
1444663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1445663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1446663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void putDReg(UInt dregNo, IRExpr * e)
1447663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1448436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (fp_mode64) {
1449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vassert(dregNo < 32);
1450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRType ty = Ity_F64;
1451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vassert(typeOfIRExpr(irsb->tyenv, e) == ty);
1452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      stmt(IRStmt_Put(floatGuestRegOffset(dregNo), e));
1453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
1454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vassert(dregNo < 32);
1455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vassert(typeOfIRExpr(irsb->tyenv, e) == Ity_F64);
1456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp t1 = newTemp(Ity_F64);
1457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp t4 = newTemp(Ity_I32);
1458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp t5 = newTemp(Ity_I32);
1459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp t6 = newTemp(Ity_I64);
1460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t1, e);
1461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t6, unop(Iop_ReinterpF64asI64, mkexpr(t1)));
1462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t4, unop(Iop_64HIto32, mkexpr(t6)));  /* hi */
1463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t5, unop(Iop_64to32, mkexpr(t6)));    /* lo */
1464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      putFReg(dregNo, unop(Iop_ReinterpI32asF32, mkexpr(t5)));
1465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      putFReg(dregNo + 1, unop(Iop_ReinterpI32asF32, mkexpr(t4)));
1466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
1467663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1468663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1469663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic void setFPUCondCode(IRExpr * e, UInt cc)
1470663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1471663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (cc == 0) {
1472663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      putFCSR(binop(Iop_And32, getFCSR(), mkU32(0xFF7FFFFF)));
1473663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      putFCSR(binop(Iop_Or32, getFCSR(), binop(Iop_Shl32, e, mkU8(23))));
1474663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   } else {
1475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      putFCSR(binop(Iop_And32, getFCSR(), unop(Iop_Not32,
1476663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                               binop(Iop_Shl32, mkU32(0x01000000), mkU8(cc)))));
1477663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      putFCSR(binop(Iop_Or32, getFCSR(), binop(Iop_Shl32, e, mkU8(24 + cc))));
1478663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
1479663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1480663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic IRExpr* get_IR_roundingmode ( void )
1482663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*
1484663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   rounding mode | MIPS | IR
1485663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   ------------------------
1486663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   to nearest    | 00  | 00
1487663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   to zero       | 01  | 11
1488663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   to +infinity  | 10  | 10
1489663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   to -infinity  | 11  | 01
1490663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng*/
1491663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp rm_MIPS = newTemp(Ity_I32);
1492663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Last two bits in FCSR are rounding mode. */
1493663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (mode64)
1495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(rm_MIPS, binop(Iop_And32, IRExpr_Get(offsetof(VexGuestMIPS64State,
1496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       guest_FCSR), Ity_I32), mkU32(3)));
1497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   else
1498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(rm_MIPS, binop(Iop_And32, IRExpr_Get(offsetof(VexGuestMIPS32State,
1499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       guest_FCSR), Ity_I32), mkU32(3)));
1500663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* rm_IR = XOR( rm_MIPS32, (rm_MIPS32 << 1) & 2) */
1502663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1503663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return binop(Iop_Xor32, mkexpr(rm_MIPS), binop(Iop_And32,
1504663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                binop(Iop_Shl32, mkexpr(rm_MIPS), mkU8(1)), mkU32(2)));
1505663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
1506663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* sz, ULong -> IRExpr */
1508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic IRExpr *mkSzImm ( IRType ty, ULong imm64 )
1509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
1510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(ty == Ity_I32 || ty == Ity_I64);
1511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return ty == Ity_I64 ? mkU64(imm64) : mkU32((UInt) imm64);
1512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic IRConst *mkSzConst ( IRType ty, ULong imm64 )
1515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
1516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(ty == Ity_I32 || ty == Ity_I64);
1517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return (ty == Ity_I64 ? IRConst_U64(imm64) : IRConst_U32((UInt) imm64));
1518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Make sure we get valid 32 and 64bit addresses */
1521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic Addr64 mkSzAddr ( IRType ty, Addr64 addr )
1522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
1523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(ty == Ity_I32 || ty == Ity_I64);
1524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return (ty == Ity_I64 ? (Addr64) addr :
1525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           (Addr64) extend_s_32to64(toUInt(addr)));
1526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Shift and Rotate instructions for MIPS64 */
1529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic Bool dis_instr_shrt ( UInt theInstr )
1530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
1531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UInt opc2 = get_function(theInstr);
1532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UChar regRs = get_rs(theInstr);
1533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UChar regRt = get_rt(theInstr);
1534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UChar regRd = get_rd(theInstr);
1535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UChar uImmsa = get_sa(theInstr);
1536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Long sImmsa = extend_s_16to64(uImmsa);
1537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRType ty = mode64 ? Ity_I64 : Ity_I32;
1538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp tmp = newTemp(ty);
1539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp tmpOr = newTemp(ty);
1540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp tmpRt = newTemp(ty);
1541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp tmpRs = newTemp(ty);
1542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp tmpRd = newTemp(ty);
1543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(tmpRs, getIReg(regRs));
1545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(tmpRt, getIReg(regRt));
1546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (opc2) {
1548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x3A:
1549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if ((regRs & 0x01) == 0) {
1550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* Doubleword Shift Right Logical - DSRL; MIPS64 */
1551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            DIP("dsrl r%u, r%u, %d", regRd, regRt, (Int)sImmsa);
1552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpRd, binop(Iop_Shr64, mkexpr(tmpRt), mkU8(uImmsa)));
1553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(regRd, mkexpr(tmpRd));
1554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else if ((regRs & 0x01) == 1) {
1555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* Doubleword Rotate Right - DROTR; MIPS64r2 */
1556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vassert(mode64);
1557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            DIP("drotr r%u, r%u, %d", regRd, regRt, (Int)sImmsa);
1558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpL = newTemp(ty);
1559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpR = newTemp(ty);
1560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpR, binop(Iop_Shr64, mkexpr(tmpRt), mkU8(uImmsa)));
1561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmp, binop(Iop_Shl64, mkexpr(tmpRt), mkU8(63 - uImmsa)));
1562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpL, binop(Iop_Shl64, mkexpr(tmp), mkU8(1)));
1563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpRd, binop(Iop_Or64, mkexpr(tmpL), mkexpr(tmpR)));
1564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(regRd, mkexpr(tmpRd));
1565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else
1566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            return False;
1567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
1568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x3E:
1570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if ((regRs & 0x01) == 0) {
1571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* Doubleword Shift Right Logical Plus 32 - DSRL32; MIPS64 */
1572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            DIP("dsrl32 r%u, r%u, %d", regRd, regRt, (Int)(sImmsa + 32));
1573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpRd, binop(Iop_Shr64, mkexpr(tmpRt), mkU8(uImmsa + 32)));
1574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(regRd, mkexpr(tmpRd));
1575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else if ((regRs & 0x01) == 1) {
1576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* Doubleword Rotate Right Plus 32 - DROTR32; MIPS64r2 */
1577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            DIP("drotr32 r%u, r%u, %d", regRd, regRt, (Int)sImmsa);
1578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vassert(mode64);
1579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpL = newTemp(ty);
1580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpR = newTemp(ty);
1581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* (tmpRt >> sa) | (tmpRt << (64 - sa)) */
1582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpR, binop(Iop_Shr64, mkexpr(tmpRt), mkU8(uImmsa + 32)));
1583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmp, binop(Iop_Shl64, mkexpr(tmpRt),
1584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              mkU8(63 - (uImmsa + 32))));
1585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpL, binop(Iop_Shl64, mkexpr(tmp), mkU8(1)));
1586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpRd, binop(Iop_Or64, mkexpr(tmpL), mkexpr(tmpR)));
1587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(regRd, mkexpr(tmpRd));
1588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else
1589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            return False;
1590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
1591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x16:
1593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if ((uImmsa & 0x01) == 0) {
1594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* Doubleword Shift Right Logical Variable - DSRLV; MIPS64 */
1595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            DIP("dsrlv r%u, r%u, r%u", regRd, regRt, regRs);
1596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpRs8 = newTemp(Ity_I8);
1597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* s = tmpRs[5..0] */
1598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmp, binop(Iop_And64, mkexpr(tmpRs), mkU64(63)));
1599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpRs8, mkNarrowTo8(ty, mkexpr(tmp)));
1600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpRd, binop(Iop_Shr64, mkexpr(tmpRt), mkexpr(tmpRs8)));
1601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(regRd, mkexpr(tmpRd));
1602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else if ((uImmsa & 0x01) == 1) {
1603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* Doubleword Rotate Right Variable - DROTRV; MIPS64r2 */
1604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            DIP("drotrv r%u, r%u, r%u", regRd, regRt, regRs);
1605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpL = newTemp(ty);
1606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpR = newTemp(ty);
1607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpRs8 = newTemp(Ity_I8);
1608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpLs8 = newTemp(Ity_I8);
1609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmp64 = newTemp(ty);
1610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* s = tmpRs[5...0]
1611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               m = 64 - s
1612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               (tmpRt << s) | (tmpRt >> m) */
1613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmp64, binop(Iop_And64, mkexpr(tmpRs), mkSzImm(ty, 63)));
1615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmp, binop(Iop_Sub64, mkU64(63), mkexpr(tmp64)));
1616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpLs8, mkNarrowTo8(ty, mkexpr(tmp)));
1618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpRs8, mkNarrowTo8(ty, mkexpr(tmp64)));
1619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpR, binop(Iop_Shr64, mkexpr(tmpRt), mkexpr(tmpRs8)));
1621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpL, binop(Iop_Shl64, mkexpr(tmpRt), mkexpr(tmpLs8)));
1622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpRd, binop(Iop_Shl64, mkexpr(tmpL), mkU8(1)));
1623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpOr, binop(Iop_Or64, mkexpr(tmpRd), mkexpr(tmpR)));
1624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(regRd, mkexpr(tmpOr));
1626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else
1627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            return False;
1628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
1629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x38:  /* Doubleword Shift Left Logical - DSLL; MIPS64 */
1631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("dsll r%u, r%u, %d", regRd, regRt, (Int)sImmsa);
1632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(mode64);
1633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(tmpRd, binop(Iop_Shl64, mkexpr(tmpRt), mkU8(uImmsa)));
1634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(regRd, mkexpr(tmpRd));
1635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
1636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x3C:  /* Doubleword Shift Left Logical Plus 32 - DSLL32; MIPS64 */
1638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("dsll32 r%u, r%u, %d", regRd, regRt, (Int)sImmsa);
1639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(tmpRd, binop(Iop_Shl64, mkexpr(tmpRt), mkU8(uImmsa + 32)));
1640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(regRd, mkexpr(tmpRd));
1641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
1642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x14: {  /* Doubleword Shift Left Logical Variable - DSLLV; MIPS64 */
1644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("dsllv r%u, r%u, r%u", regRd, regRt, regRs);
1645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp tmpRs8 = newTemp(Ity_I8);
1646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(tmp, binop(Iop_And64, mkexpr(tmpRs), mkSzImm(ty, 63)));
1648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(tmpRs8, mkNarrowTo8(ty, mkexpr(tmp)));
1649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(tmpRd, binop(Iop_Shl64, mkexpr(tmpRt), mkexpr(tmpRs8)));
1650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(regRd, mkexpr(tmpRd));
1651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
1652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
1653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x3B:  /* Doubleword Shift Right Arithmetic - DSRA; MIPS64 */
1655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("dsra r%u, r%u, %d", regRd, regRt, (Int)sImmsa);
1656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(tmpRd, binop(Iop_Sar64, mkexpr(tmpRt), mkU8(uImmsa)));
1657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(regRd, mkexpr(tmpRd));
1658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
1659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x3F:  /* Doubleword Shift Right Arithmetic Plus 32 - DSRA32;
1661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     MIPS64 */
1662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("dsra32 r%u, r%u, %d", regRd, regRt, (Int)sImmsa);
1663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(tmpRd, binop(Iop_Sar64, mkexpr(tmpRt), mkU8(uImmsa + 32)));
1664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(regRd, mkexpr(tmpRd));
1665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
1666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x17: {  /* Doubleword Shift Right Arithmetic Variable - DSRAV;
1668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                       MIPS64 */
1669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("dsrav r%u, r%u, r%u", regRd, regRt, regRs);
1670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp tmpRs8 = newTemp(Ity_I8);
1671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(tmp, binop(Iop_And64, mkexpr(tmpRs), mkSzImm(ty, 63)));
1672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(tmpRs8, mkNarrowTo8(ty, mkexpr(tmp)));
1673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(tmpRd, binop(Iop_Sar64, mkexpr(tmpRt), mkexpr(tmpRs8)));
1674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(regRd, mkexpr(tmpRd));
1675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
1676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
1678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
1680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return False;
1681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
1683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return True;
1684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic IROp mkSzOp ( IRType ty, IROp op8 )
1687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
1688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Int adj;
1689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(ty == Ity_I8 || ty == Ity_I16 || ty == Ity_I32 || ty == Ity_I64);
1690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(op8 == Iop_Add8 || op8 == Iop_Sub8 || op8 == Iop_Mul8
1691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           || op8 == Iop_Or8 || op8 == Iop_And8 || op8 == Iop_Xor8
1692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           || op8 == Iop_Shl8 || op8 == Iop_Shr8 || op8 == Iop_Sar8
1693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           || op8 == Iop_CmpEQ8 || op8 == Iop_CmpNE8 || op8 == Iop_Not8);
1694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   adj = ty == Ity_I8 ? 0 : (ty == Ity_I16 ? 1 : (ty == Ity_I32 ? 2 : 3));
1695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return adj + op8;
1696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1698663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*********************************************************/
1699663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*---             Floating Point Compare              ---*/
1700663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*********************************************************/
1701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Function that returns a string that represent mips cond
1702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   mnemonic for the input code. */
1703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic const HChar* showCondCode(UInt code) {
1704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   const HChar* ret;
1705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (code) {
1706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0: ret = "f"; break;
1707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 1: ret = "un"; break;
1708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 2: ret = "eq"; break;
1709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 3: ret = "ueq"; break;
1710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 4: ret = "olt"; break;
1711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 5: ret = "ult"; break;
1712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 6: ret = "ole"; break;
1713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 7: ret = "ule"; break;
1714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 8: ret = "sf"; break;
1715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 9: ret = "ngle"; break;
1716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 10: ret = "seq"; break;
1717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 11: ret = "ngl"; break;
1718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 12: ret = "lt"; break;
1719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 13: ret = "nge"; break;
1720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 14: ret = "le"; break;
1721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 15: ret = "ngt"; break;
1722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default: vpanic("showCondCode"); break;
1723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
1724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return ret;
1725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
1726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic Bool dis_instr_CCondFmt ( UInt cins )
1728663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
1729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp t0, t1, t2, t3, tmp5, tmp6;
1730663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp ccIR = newTemp(Ity_I32);
1731663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRTemp ccMIPS = newTemp(Ity_I32);
1732663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt FC = get_FC(cins);
1733663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt fmt = get_fmt(cins);
1734663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt fs = get_fs(cins);
1735663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt ft = get_ft(cins);
1736663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt cond = get_cond(cins);
1737663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (FC == 0x3) {  /* C.cond.fmt */
1739663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      UInt fpc_cc = get_fpc_cc(cins);
1740663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (fmt) {
1741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 0x10: {  /* C.cond.S */
1742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            DIP("c.%s.s %d, f%d, f%d", showCondCode(cond), fpc_cc, fs, ft);
1743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (fp_mode64) {
1744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t0 = newTemp(Ity_I32);
1745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t1 = newTemp(Ity_I32);
1746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t2 = newTemp(Ity_I32);
1747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t3 = newTemp(Ity_I32);
1748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               tmp5 = newTemp(Ity_F64);
1750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               tmp6 = newTemp(Ity_F64);
1751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmp5, unop(Iop_F32toF64, getLoFromF64(Ity_F64,
1753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 getFReg(fs))));
1754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmp6, unop(Iop_F32toF64, getLoFromF64(Ity_F64,
1755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 getFReg(ft))));
1756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(ccIR, binop(Iop_CmpF64, mkexpr(tmp5), mkexpr(tmp6)));
1758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putHI(mkWidenFrom32(mode64 ? Ity_I64: Ity_I32,
1759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   mkexpr(ccIR), True));
1760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* Map compare result from IR to MIPS
1761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  FP cmp result | MIPS | IR
1762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  --------------------------
1763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UN            | 0x1 | 0x45
1764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  EQ            | 0x2 | 0x40
1765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  GT            | 0x4 | 0x00
1766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  LT            | 0x8 | 0x01
1767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                */
1768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* ccMIPS = Shl(1, (~(ccIR>>5) & 2) | ((ccIR ^ (ccIR>>6)) & 1) */
1770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(ccMIPS, binop(Iop_Shl32, mkU32(1), unop(Iop_32to8,
1771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              binop(Iop_Or32, binop(Iop_And32, unop(Iop_Not32,
1772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              binop(Iop_Shr32, mkexpr(ccIR),mkU8(5))),mkU32(2)),
1773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              binop(Iop_And32, binop(Iop_Xor32, mkexpr(ccIR),
1774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              binop(Iop_Shr32, mkexpr(ccIR), mkU8(6))),
1775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              mkU32(1))))));
1776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putLO(mkWidenFrom32(mode64 ? Ity_I64: Ity_I32,
1777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   mkexpr(ccMIPS), True));
1778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* UN */
1780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t0, binop(Iop_And32, mkexpr(ccMIPS), mkU32(0x1)));
1781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* EQ */
1782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t1, binop(Iop_And32, binop(Iop_Shr32, mkexpr(ccMIPS),
1783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU8(0x1)), mkU32(0x1)));
1784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* NGT */
1785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t2, binop(Iop_And32, unop(Iop_Not32, binop(Iop_Shr32,
1786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 mkexpr(ccMIPS), mkU8(0x2))),mkU32(0x1)));
1787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* LT */
1788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t3, binop(Iop_And32, binop(Iop_Shr32, mkexpr(ccMIPS),
1789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU8(0x3)), mkU32(0x1)));
1790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               switch (cond) {
1791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x0:
1792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     setFPUCondCode(mkU32(0), fpc_cc);
1793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
1794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x1:
1795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     setFPUCondCode(mkexpr(t0), fpc_cc);
1796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
1797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x2:
1798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     setFPUCondCode(mkexpr(t1), fpc_cc);
1799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
1800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x3:
1801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     setFPUCondCode(binop(Iop_Or32, mkexpr(t0), mkexpr(t1)),
1802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          fpc_cc);
1803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
1804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x4:
1805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     setFPUCondCode(mkexpr(t3), fpc_cc);
1806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
1807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x5:
1808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     setFPUCondCode(binop(Iop_Or32, mkexpr(t0), mkexpr(t3)),
1809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          fpc_cc);
1810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
1811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x6:
1812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     setFPUCondCode(binop(Iop_Or32, mkexpr(t3), mkexpr(t1)),
1813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          fpc_cc);
1814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
1815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x7:
1816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     setFPUCondCode(mkexpr(t2), fpc_cc);
1817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
1818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x8:
1819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     setFPUCondCode(mkU32(0), fpc_cc);
1820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
1821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x9:
1822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     setFPUCondCode(mkexpr(t0), fpc_cc);
1823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
1824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xA:
1825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     setFPUCondCode(mkexpr(t1), fpc_cc);
1826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
1827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xB:
1828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     setFPUCondCode(binop(Iop_Or32, mkexpr(t0), mkexpr(t1)),
1829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          fpc_cc);
1830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
1831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xC:
1832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     setFPUCondCode(mkexpr(t3), fpc_cc);
1833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
1834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xD:
1835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     setFPUCondCode(binop(Iop_Or32, mkexpr(t0), mkexpr(t3)),
1836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          fpc_cc);
1837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
1838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xE:
1839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     setFPUCondCode(binop(Iop_Or32, mkexpr(t3), mkexpr(t1)),
1840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          fpc_cc);
1841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
1842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xF:
1843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     setFPUCondCode(mkexpr(t2), fpc_cc);
1844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
1845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
1847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     return False;
1848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
1849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            } else {
1851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t0 = newTemp(Ity_I32);
1852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t1 = newTemp(Ity_I32);
1853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t2 = newTemp(Ity_I32);
1854436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t3 = newTemp(Ity_I32);
1855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1856436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(ccIR, binop(Iop_CmpF64, unop(Iop_F32toF64, getFReg(fs)),
1857436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_F32toF64, getFReg(ft))));
1858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* Map compare result from IR to MIPS
1859436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  FP cmp result | MIPS | IR
1860436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  --------------------------
1861436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UN            | 0x1 | 0x45
1862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  EQ            | 0x2 | 0x40
1863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  GT            | 0x4 | 0x00
1864436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  LT            | 0x8 | 0x01
1865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                */
1866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* ccMIPS = Shl(1, (~(ccIR>>5) & 2) | ((ccIR ^ (ccIR>>6)) & 1) */
1868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(ccMIPS, binop(Iop_Shl32, mkU32(1), unop(Iop_32to8,
1869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              binop(Iop_Or32, binop(Iop_And32, unop(Iop_Not32,
1870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              binop(Iop_Shr32, mkexpr(ccIR), mkU8(5))),
1871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                    mkU32(2)), binop(Iop_And32,
1872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              binop(Iop_Xor32, mkexpr(ccIR),
1873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              binop(Iop_Shr32, mkexpr(ccIR), mkU8(6))),
1874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              mkU32(1))))));
1875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* UN */
1876436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t0, binop(Iop_And32, mkexpr(ccMIPS), mkU32(0x1)));
1877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* EQ */
1878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t1, binop(Iop_And32, binop(Iop_Shr32, mkexpr(ccMIPS),
1879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      mkU8(0x1)), mkU32(0x1)));
1880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* NGT */
1881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t2, binop(Iop_And32, unop(Iop_Not32, binop(Iop_Shr32,
1882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      mkexpr(ccMIPS), mkU8(0x2))), mkU32(0x1)));
1883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* LT */
1884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t3, binop(Iop_And32, binop(Iop_Shr32, mkexpr(ccMIPS),
1885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      mkU8(0x3)), mkU32(0x1)));
1886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               switch (cond) {
1888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x0:
1889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     setFPUCondCode(mkU32(0), fpc_cc);
1890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
1891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x1:
1892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     setFPUCondCode(mkexpr(t0), fpc_cc);
1893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
1894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x2:
1895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     setFPUCondCode(mkexpr(t1), fpc_cc);
1896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
1897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x3:
1898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     setFPUCondCode(binop(Iop_Or32, mkexpr(t0), mkexpr(t1)),
1899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          fpc_cc);
1900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
1901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x4:
1902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     setFPUCondCode(mkexpr(t3), fpc_cc);
1903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
1904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x5:
1905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     setFPUCondCode(binop(Iop_Or32, mkexpr(t0), mkexpr(t3)),
1906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          fpc_cc);
1907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
1908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x6:
1909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     setFPUCondCode(binop(Iop_Or32, mkexpr(t3), mkexpr(t1)),
1910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          fpc_cc);
1911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
1912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x7:
1913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     setFPUCondCode(mkexpr(t2), fpc_cc);
1914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
1915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x8:
1916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     setFPUCondCode(mkU32(0), fpc_cc);
1917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
1918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x9:
1919436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     setFPUCondCode(mkexpr(t0), fpc_cc);
1920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
1921436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xA:
1922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     setFPUCondCode(mkexpr(t1), fpc_cc);
1923436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
1924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xB:
1925436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     setFPUCondCode(binop(Iop_Or32, mkexpr(t0), mkexpr(t1)),
1926436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          fpc_cc);
1927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
1928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xC:
1929436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     setFPUCondCode(mkexpr(t3), fpc_cc);
1930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
1931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xD:
1932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     setFPUCondCode(binop(Iop_Or32, mkexpr(t0), mkexpr(t3)),
1933436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          fpc_cc);
1934436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
1935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xE:
1936436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     setFPUCondCode(binop(Iop_Or32, mkexpr(t3), mkexpr(t1)),
1937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          fpc_cc);
1938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
1939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xF:
1940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     setFPUCondCode(mkexpr(t2), fpc_cc);
1941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
1942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
1944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     return False;
1945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
1946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
1947436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
1948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
1949436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1950436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 0x11: {  /* C.cond.D */
1951436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            DIP("c.%s.d %d, f%d, f%d", showCondCode(cond), fpc_cc, fs, ft);
1952663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            t0 = newTemp(Ity_I32);
1953663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            t1 = newTemp(Ity_I32);
1954663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            t2 = newTemp(Ity_I32);
1955663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            t3 = newTemp(Ity_I32);
1956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(ccIR, binop(Iop_CmpF64, getDReg(fs), getDReg(ft)));
1957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* Map compare result from IR to MIPS
1958663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               FP cmp result | MIPS | IR
1959663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               --------------------------
1960663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               UN            | 0x1 | 0x45
1961663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               EQ            | 0x2 | 0x40
1962663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               GT            | 0x4 | 0x00
1963663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               LT            | 0x8 | 0x01
1964663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng             */
1965663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* ccMIPS = Shl(1, (~(ccIR>>5) & 2) | ((ccIR ^ (ccIR>>6)) & 1) */
1967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(ccMIPS, binop(Iop_Shl32, mkU32(1), unop(Iop_32to8,
1968663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           binop(Iop_Or32, binop(Iop_And32, unop(Iop_Not32,
1969663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           binop(Iop_Shr32, mkexpr(ccIR), mkU8(5))), mkU32(2)),
1970663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           binop(Iop_And32, binop(Iop_Xor32, mkexpr(ccIR),
1971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           binop(Iop_Shr32, mkexpr(ccIR), mkU8(6))),
1972663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           mkU32(1))))));
1973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
1974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* UN */
1975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t0, binop(Iop_And32, mkexpr(ccMIPS), mkU32(0x1)));
1976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* EQ */
1977663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            assign(t1, binop(Iop_And32, binop(Iop_Shr32, mkexpr(ccMIPS),
1978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                   mkU8(0x1)), mkU32(0x1)));
1979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* NGT */
1980663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            assign(t2, binop(Iop_And32, unop(Iop_Not32, binop(Iop_Shr32,
1981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                   mkexpr(ccMIPS), mkU8(0x2))), mkU32(0x1)));
1982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* LT */
1983663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            assign(t3, binop(Iop_And32, binop(Iop_Shr32, mkexpr(ccMIPS),
1984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                   mkU8(0x3)), mkU32(0x1)));
1985663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
1986663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            switch (cond) {
1987663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               case 0x0:
1988663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  setFPUCondCode(mkU32(0), fpc_cc);
1989663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  break;
1990663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               case 0x1:
1991663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  setFPUCondCode(mkexpr(t0), fpc_cc);
1992663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  break;
1993663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               case 0x2:
1994663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  setFPUCondCode(mkexpr(t1), fpc_cc);
1995663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  break;
1996663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               case 0x3:
1997663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  setFPUCondCode(binop(Iop_Or32, mkexpr(t0), mkexpr(t1)),
1998663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       fpc_cc);
1999663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  break;
2000663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               case 0x4:
2001663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  setFPUCondCode(mkexpr(t3), fpc_cc);
2002663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  break;
2003663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               case 0x5:
2004663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  setFPUCondCode(binop(Iop_Or32, mkexpr(t0), mkexpr(t3)),
2005663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       fpc_cc);
2006663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  break;
2007663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               case 0x6:
2008663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  setFPUCondCode(binop(Iop_Or32, mkexpr(t3), mkexpr(t1)),
2009663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       fpc_cc);
2010663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  break;
2011663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               case 0x7:
2012663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  setFPUCondCode(mkexpr(t2), fpc_cc);
2013663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  break;
2014663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               case 0x8:
2015663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  setFPUCondCode(mkU32(0), fpc_cc);
2016663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  break;
2017663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               case 0x9:
2018663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  setFPUCondCode(mkexpr(t0), fpc_cc);
2019663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  break;
2020663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               case 0xA:
2021663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  setFPUCondCode(mkexpr(t1), fpc_cc);
2022663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  break;
2023663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               case 0xB:
2024663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  setFPUCondCode(binop(Iop_Or32, mkexpr(t0), mkexpr(t1)),
2025663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       fpc_cc);
2026663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  break;
2027663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               case 0xC:
2028663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  setFPUCondCode(mkexpr(t3), fpc_cc);
2029663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  break;
2030663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               case 0xD:
2031663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  setFPUCondCode(binop(Iop_Or32, mkexpr(t0), mkexpr(t3)),
2032663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       fpc_cc);
2033663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  break;
2034663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               case 0xE:
2035663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  setFPUCondCode(binop(Iop_Or32, mkexpr(t3), mkexpr(t1)),
2036663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       fpc_cc);
2037663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  break;
2038663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               case 0xF:
2039663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  setFPUCondCode(mkexpr(t2), fpc_cc);
2040663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  break;
2041663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               default:
2042663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  return False;
2043663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
2044663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
2045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
2046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         default:
2048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            return False;
2049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
2050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } else {
2051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      return False;
2052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
2053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return True;
2055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
2056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*********************************************************/
2058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*---        Branch Instructions for mips64           ---*/
2059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*********************************************************/
2060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic Bool dis_instr_branch ( UInt theInstr, DisResult * dres,
2061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               Bool(*resteerOkFn) (void *, Addr64),
2062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               void *callback_opaque, IRStmt ** set )
2063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
2064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UInt jmpKind = 0;
2065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UChar opc1 = get_opcode(theInstr);
2066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UChar regRs = get_rs(theInstr);
2067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UChar regRt = get_rt(theInstr);
2068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UInt offset = get_imm(theInstr);
2069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Long sOffset = extend_s_16to64(offset);
2070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRType ty = mode64 ? Ity_I64 : Ity_I32;
2071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IROp opSlt = mode64 ? Iop_CmpLT64S : Iop_CmpLT32S;
2072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp tmp = newTemp(ty);
2074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp tmpRs = newTemp(ty);
2075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp tmpRt = newTemp(ty);
2076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp tmpLt = newTemp(ty);
2077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp tmpReg0 = newTemp(ty);
2078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UChar regLnk = 31;   /* reg 31 is link reg in MIPS */
2080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Addr64 addrTgt = 0;
2081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Addr64 cia = guest_PC_curr_instr;
2082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRExpr *eConst0 = mkSzImm(ty, (UInt) 0);
2084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRExpr *eNia = mkSzImm(ty, cia + 8);
2085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRExpr *eCond = NULL;
2086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(tmpRs, getIReg(regRs));
2088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(tmpRt, getIReg(regRt));
2089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(tmpReg0, getIReg(0));
2090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   eCond = binop(mkSzOp(ty, Iop_CmpNE8), mkexpr(tmpReg0), mkexpr(tmpReg0));
2092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (opc1) {
2094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x01:
2095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch (regRt) {
2096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x00: {  /* BLTZ rs, offset */
2097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               addrTgt = mkSzAddr(ty, cia + 4 + (sOffset << 2));
2098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               IRTemp tmpLtRes = newTemp(Ity_I1);
2099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmp, eConst0);
2101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmpLtRes, binop(opSlt, mkexpr(tmpRs), mkexpr(tmp)));
2102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmpLt, mode64 ? unop(Iop_1Uto64, mkexpr(tmpLtRes)) :
2103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      unop(Iop_1Uto32, mkexpr(tmpLtRes)));
2104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               eCond = binop(mkSzOp(ty, Iop_CmpNE8), mkexpr(tmpLt),
2106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             mkexpr(tmpReg0));
2107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               jmpKind = Ijk_Call;
2109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
2110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
2111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x01: {  /* BGEZ rs, offset */
2113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               IRTemp tmpLtRes = newTemp(Ity_I1);
2114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               addrTgt = mkSzAddr(ty, cia + 4 + (sOffset << 2));
2115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmp, eConst0);
2117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmpLtRes, binop(opSlt, mkexpr(tmpRs), mkexpr(tmp)));
2118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmpLt, mode64 ? unop(Iop_1Uto64, mkexpr(tmpLtRes)) :
2119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_1Uto32, mkexpr(tmpLtRes)));
2120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               eCond = binop(mkSzOp(ty, Iop_CmpEQ8), mkexpr(tmpLt),
2121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                    mkexpr(tmpReg0));
2122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               jmpKind = Ijk_Call;
2124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
2125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
2126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x11: {  /* BGEZAL rs, offset */
2128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               addrTgt = mkSzAddr(ty, cia + 4 + (sOffset << 2));
2129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putIReg(regLnk, eNia);
2130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               IRTemp tmpLtRes = newTemp(Ity_I1);
2131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmpLtRes, binop(opSlt, mkexpr(tmpRs), eConst0));
2133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmpLt, mode64 ? unop(Iop_1Uto64, mkexpr(tmpLtRes)) :
2134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_1Uto32, mkexpr(tmpLtRes)));
2135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               eCond = binop(mkSzOp(ty, Iop_CmpEQ8), mkexpr(tmpLt),
2137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                    mkexpr(tmpReg0));
2138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               jmpKind = Ijk_Call;
2140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
2141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
2142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x10: {  /* BLTZAL rs, offset */
2144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               IRTemp tmpLtRes = newTemp(Ity_I1);
2145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               IRTemp tmpRes = newTemp(ty);
2146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               addrTgt = mkSzAddr(ty, cia + 4 + (sOffset << 2));
2148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putIReg(regLnk, eNia);
2149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmp, eConst0);
2151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmpLtRes, binop(opSlt, mkexpr(tmpRs), mkexpr(tmp)));
2152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmpRes, mode64 ? unop(Iop_1Uto64,
2153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      mkexpr(tmpLtRes)) : unop(Iop_1Uto32, mkexpr(tmpLtRes)));
2154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               eCond = binop(mkSzOp(ty, Iop_CmpNE8), mkexpr(tmpRes),
2155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkexpr(tmpReg0));
2156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               jmpKind = Ijk_Call;
2158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
2159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
2160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
2162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
2163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
2164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return False;
2165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
2166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   *set = IRStmt_Exit(eCond, jmpKind, mkSzConst(ty, addrTgt), OFFB_PC);
2167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return True;
2168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
2169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*********************************************************/
2171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*---         Cavium Specific Instructions            ---*/
2172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*********************************************************/
2173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic Bool dis_instr_CVM ( UInt theInstr )
2174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
2175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UChar  opc2     = get_function(theInstr);
2176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UChar  opc1     = get_opcode(theInstr);
2177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UChar  regRs    = get_rs(theInstr);
2178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UChar  regRt    = get_rt(theInstr);
2179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UChar  regRd    = get_rd(theInstr);
2180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UInt   imm 	   = get_imm(theInstr);
2181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UChar  lenM1    = get_msb(theInstr);
2182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UChar  p        = get_lsb(theInstr);
2183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRType ty       = mode64? Ity_I64 : Ity_I32;
2184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp tmp      = newTemp(ty);
2185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp tmpRs    = newTemp(ty);
2186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp tmpRt    = newTemp(ty);
2187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp t1       = newTemp(ty);
2188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UInt size;
2189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   assign(tmpRs, getIReg(regRs));
2190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch(opc1){
2192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x1C:  {
2193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch(opc2) {
2194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x03: {  /* DMUL rd, rs, rt */
2195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               DIP("dmul r%d, r%d, r%d", regRd, regRs, regRt);
2196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               IRType t0 = newTemp(Ity_I128);
2197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t0, binop(Iop_MullU64, getIReg(regRs), getIReg(regRt)));
2198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putIReg(regRd, unop(Iop_128to64, mkexpr(t0)));
2199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
2200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
2201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x32:  /* 5. CINS rd, rs, p, lenm1 */
2203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               DIP("cins r%u, r%u, %d, %d\n", regRt, regRs, p, lenM1);
2204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign ( tmp  , binop(Iop_Shl64, mkexpr(tmpRs),
2205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     mkU8(64-( lenM1+1 ))));
2206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign ( tmpRt, binop(Iop_Shr64, mkexpr( tmp ),
2207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     mkU8(64-(p+lenM1+1))));
2208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putIReg( regRt, mkexpr(tmpRt));
2209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
2210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x33:  /* 6. CINS32 rd, rs, p+32, lenm1 */
2212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               DIP("cins32 r%u, r%u, %d, %d\n", regRt, regRs, p+32, lenM1);
2213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign ( tmp  , binop(Iop_Shl64, mkexpr(tmpRs),
2214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     mkU8(64-( lenM1+1 ))));
2215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign ( tmpRt, binop(Iop_Shr64, mkexpr( tmp ),
2216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     mkU8(32-(p+lenM1+1))));
2217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putIReg( regRt, mkexpr(tmpRt));
2218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
2219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x3A:  /* 3. EXTS rt, rs, p len */
2221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               DIP("exts r%u, r%u, %d, %d\n", regRt, regRs, p, lenM1);
2222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               size = lenM1 + 1;  /* lenm1+1 */
2223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               UChar lsAmt = 64 - (p + size);  /* p+lenm1+1 */
2224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               UChar rsAmt = 64 - size;  /* lenm1+1 */
2225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               tmp = newTemp(Ity_I64);
2226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmp, binop(Iop_Shl64, mkexpr(tmpRs), mkU8(lsAmt)));
2227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putIReg(regRt, binop(Iop_Sar64, mkexpr(tmp), mkU8(rsAmt)));
2228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
2229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x3B:  /* 4. EXTS32 rt, rs, p len */
2231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               DIP("exts32 r%u, r%u, %d, %d\n", regRt, regRs, p, lenM1);
2232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign ( tmp  , binop(Iop_Shl64, mkexpr(tmpRs),
2233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     mkU8(32-(p+lenM1+1))));
2234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign ( tmpRt, binop(Iop_Sar64, mkexpr(tmp),
2235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     mkU8(64-(lenM1+1))) );
2236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putIReg( regRt, mkexpr(tmpRt));
2237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
2238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x2B:  /* 20. SNE rd, rs, rt */
2240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               DIP("sne r%d, r%d, r%d", regRd,regRs, regRt);
2241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (mode64)
2242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  putIReg(regRd, unop(Iop_1Uto64, binop(Iop_CmpNE64,
2243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        getIReg(regRs),
2244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        getIReg(regRt))));
2245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               else
2246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  putIReg(regRd,unop(Iop_1Uto32, binop(Iop_CmpNE32,
2247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       getIReg(regRs),
2248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       getIReg(regRt))));
2249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
2250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x2A:  /* Set Equals - SEQ; Cavium OCTEON */
2252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               DIP("seq r%d, r%d, %d", regRd, regRs, regRt);
2253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (mode64)
2254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  putIReg(regRd, unop(Iop_1Uto64,
2255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_CmpEQ64, getIReg(regRs),
2256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(regRt))));
2257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               else
2258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  putIReg(regRd, unop(Iop_1Uto32,
2259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_CmpEQ32, getIReg(regRs),
2260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(regRt))));
2261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
2262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x2E:  /* Set Equals Immediate - SEQI; Cavium OCTEON */
2264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               DIP("seqi r%d, r%d, %d", regRt, regRs, imm);
2265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (mode64)
2266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  putIReg(regRt, unop(Iop_1Uto64,
2267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_CmpEQ64, getIReg(regRs),
2268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU64(extend_s_10to64(imm)))));
2269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               else
2270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  putIReg(regRt, unop(Iop_1Uto32,
2271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_CmpEQ32, getIReg(regRs),
2272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(extend_s_10to32(imm)))));
2273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
2274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x2F:  /* Set Not Equals Immediate - SNEI; Cavium OCTEON */
2276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               DIP("snei r%d, r%d, %d", regRt, regRs, imm);
2277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (mode64)
2278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  putIReg(regRt, unop(Iop_1Uto64,
2279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   binop(Iop_CmpNE64,
2280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         getIReg(regRs),
2281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkU64(extend_s_10to64(imm)))));
2282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               else
2283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  putIReg(regRt, unop(Iop_1Uto32,
2284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   binop(Iop_CmpNE32,
2285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         getIReg(regRs),
2286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkU32(extend_s_10to32(imm)))));
2287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
2288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default:
2290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               return False;
2291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
2292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
2293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      } /* opc1 0x1C ends here*/
2294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x1F:{
2295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch(opc2) {
2296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x0A: {  // lx - Load indexed instructions
2297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               switch (get_sa(theInstr)) {
2298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x00: {  // LWX rd, index(base)
2299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("lwx r%d, r%d(r%d)", regRd, regRt, regRs);
2300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     LOADX_STORE_PATTERN;
2301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(regRd, mkWidenFrom32(ty, load(Ity_I32, mkexpr(t1)),
2302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  True));
2303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
2304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
2305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x08: {  // LDX rd, index(base)
2306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("ldx r%d, r%d(r%d)", regRd, regRt, regRs);
2307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(mode64); /* Currently Implemented only for n64 */
2308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     LOADX_STORE_PATTERN;
2309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(regRd, load(Ity_I64, mkexpr(t1)));
2310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
2311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
2312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x06: {  // LBUX rd, index(base)
2313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("lbux r%d, r%d(r%d)", regRd, regRt, regRs);
2314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     LOADX_STORE_PATTERN;
2315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (mode64)
2316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(regRd, unop(Iop_8Uto64, load(Ity_I8,
2317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkexpr(t1))));
2318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     else
2319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(regRd, unop(Iop_8Uto32, load(Ity_I8,
2320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkexpr(t1))));
2321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
2322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
2323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x10: {  // LWUX rd, index(base) (Cavium OCTEON)
2324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("lwux r%d, r%d(r%d)", regRd, regRt, regRs);
2325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     LOADX_STORE_PATTERN; /* same for both 32 and 64 modes*/
2326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(regRd, mkWidenFrom32(ty, load(Ity_I32, mkexpr(t1)),
2327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  False));
2328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
2329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
2330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x14: {  // LHUX rd, index(base) (Cavium OCTEON)
2331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("lhux r%d, r%d(r%d)", regRd, regRt, regRs);
2332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     LOADX_STORE_PATTERN;
2333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (mode64)
2334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(regRd,
2335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                unop(Iop_16Uto64, load(Ity_I16, mkexpr(t1))));
2336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     else
2337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(regRd,
2338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                unop(Iop_16Uto32, load(Ity_I16, mkexpr(t1))));
2339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
2340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
2341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x16: {  // LBX rd, index(base) (Cavium OCTEON)
2342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("lbx r%d, r%d(r%d)", regRd, regRs, regRt);
2343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     LOADX_STORE_PATTERN;
2344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (mode64)
2345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(regRd,
2346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                unop(Iop_8Sto64, load(Ity_I8, mkexpr(t1))));
2347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     else
2348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(regRd,
2349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                unop(Iop_8Sto32, load(Ity_I8, mkexpr(t1))));
2350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
2351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
2352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
2353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vex_printf("\nUnhandled LX instruction opc3 = %x\n",
2354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                get_sa(theInstr));
2355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     return False;
2356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
2357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
2358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
2359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } /* opc1 = 0x1F & opc2 = 0xA (LX) ends here*/
2360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
2361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      } /* opc1 = 0x1F ends here*/
2362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
2363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         return False;
2364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   } /* main opc1 switch ends here */
2365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return True;
2366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov}
2367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*------------------------------------------------------------*/
2369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*---       Disassemble a single DSP ASE instruction       ---*/
2370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*------------------------------------------------------------*/
2371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanovstatic UInt disDSPInstr_MIPS_WRK ( UInt cins )
2373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov{
2374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp t0, t1 = 0, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14,
2375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov          t15, t16, t17;
2376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UInt opcode, rs, rt, rd, sa, function, ac, ac_mfhilo, rddsp_mask,
2377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov        wrdsp_mask, dsp_imm, shift;
2378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   opcode = get_opcode(cins);
2380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   rs = get_rs(cins);
2381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   rt = get_rt(cins);
2382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   rd = get_rd(cins);
2383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   sa = get_sa(cins);
2384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   function = get_function(cins);
2385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ac = get_acNo(cins);
2386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ac_mfhilo = get_acNo_mfhilo(cins);
2387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   rddsp_mask = get_rddspMask(cins);
2388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   wrdsp_mask = get_wrdspMask(cins);
2389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   dsp_imm = get_dspImm(cins);
2390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   shift = get_shift(cins);
2391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   switch (opcode) {
2393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x00: {  /* Special */
2394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch (function) {
2395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x10: {  /* MFHI */
2396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               DIP("mfhi ac%d r%d", ac_mfhilo, rd);
2397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putIReg(rd, unop(Iop_64HIto32, getAcc(ac_mfhilo)));
2398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
2399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
2400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2401436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x11: {  /* MTHI */
2402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               DIP("mthi ac%d r%d", ac, rs);
2403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t1 = newTemp(Ity_I32);
2404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t1, unop(Iop_64to32, getAcc(ac)));
2405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putAcc(ac, binop(Iop_32HLto64, getIReg(rs), mkexpr(t1)));
2406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
2407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
2408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x12: {  /* MFLO */
2410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               DIP("mflo ac%d r%d", ac_mfhilo, rd);
2411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putIReg(rd, unop(Iop_64to32, getAcc(ac_mfhilo)));
2412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
2413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
2414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x13: {  /* MTLO */
2416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               DIP("mtlo ac%d r%d", ac, rs);
2417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t1 = newTemp(Ity_I32);
2418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t1, unop(Iop_64HIto32, getAcc(ac)));
2419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putAcc(ac, binop(Iop_32HLto64, mkexpr(t1), getIReg(rs)));
2420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
2421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
2422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x18: {  /* MULT */
2424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               DIP("mult ac%d r%d, r%d", ac, rs, rt);
2425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t1 = newTemp(Ity_I64);
2426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t1, binop(Iop_MullS32, mkNarrowTo32(Ity_I32, getIReg(rs)),
2427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                mkNarrowTo32(Ity_I32, getIReg(rt))));
2428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putAcc(ac, mkexpr(t1));
2429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
2430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
2431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x19: {  /* MULTU */
2433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               DIP("multu ac%d r%d, r%d", ac, rs, rt);
2434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t1 = newTemp(Ity_I64);
2435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t1, binop(Iop_MullU32, mkNarrowTo32(Ity_I32, getIReg(rs)),
2436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkNarrowTo32(Ity_I32,
2437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          getIReg(rt))));
2438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putAcc(ac, mkexpr(t1));
2439663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            break;
2440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
2441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
2442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
2443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
2444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x1C: {  /* Special2 */
2445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch (function) {
2446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x00: {  /* MADD */
2447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               DIP("madd ac%d, r%d, r%d", ac, rs, rt);
2448436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t1 = newTemp(Ity_I64);
2449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t2 = newTemp(Ity_I64);
2450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t3 = newTemp(Ity_I64);
2451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t1, getAcc(ac));
2453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t2, binop(Iop_MullS32, getIReg(rs), getIReg(rt)));
2454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t3, binop(Iop_Add64, mkexpr(t1), mkexpr(t2)));
2455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putAcc(ac, mkexpr(t3));
2457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
2458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
2459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x01: {  /* MADDU */
2460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               DIP("maddu ac%d r%d, r%d", ac, rs, rt);
2461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t1 = newTemp(Ity_I64);
2462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t2 = newTemp(Ity_I64);
2463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t3 = newTemp(Ity_I64);
2464663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
2465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t1, getAcc(ac));
2466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t2, binop(Iop_MullU32, getIReg(rs), getIReg(rt)));
2467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t3, binop(Iop_Add64, mkexpr(t2), mkexpr(t1)));
2468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putAcc(ac, mkexpr(t3));
2470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
2471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
2472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x04: {  /* MSUB */
2473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               DIP("msub ac%d r%d, r%d", ac, rs, rt);
2474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t1 = newTemp(Ity_I64);
2475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t2 = newTemp(Ity_I64);
2476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t3 = newTemp(Ity_I64);
2477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t1, getAcc(ac));
2479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t2, binop(Iop_MullS32, getIReg(rs), getIReg(rt)));
2480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t3, binop(Iop_Sub64, mkexpr(t1), mkexpr(t2)));
2481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putAcc(ac, mkexpr(t3));
2483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
2484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
2485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x05: {  /* MSUBU */
2486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               DIP("msubu ac%d r%d, r%d", ac, rs, rt);
2487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t1 = newTemp(Ity_I64);
2488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t2 = newTemp(Ity_I64);
2489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t3 = newTemp(Ity_I64);
2490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t1, getAcc(ac));
2492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t2, binop(Iop_MullU32, getIReg(rs), getIReg(rt)));
2493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t3, binop(Iop_Sub64, mkexpr(t1), mkexpr(t2)));
2494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putAcc(ac, mkexpr(t3));
2496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
2497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
2498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
2499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
2500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
2501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x1F: {  /* Special3 */
2502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch (function) {
2503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x12: {  /* ABSQ_S.PH */
2504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               switch (sa) {
2505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x1: {  /* ABSQ_S.QB */
2506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("absq_s.qb r%d, r%d", rd, rt);
2507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
2508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I8);
2509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
2510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
2511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I8);
2512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I8);
2513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I1);
2514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I1);
2515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I8);
2516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I8);
2517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I1);
2518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t10 = newTemp(Ity_I1);
2519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t11 = newTemp(Ity_I8);
2520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t12 = newTemp(Ity_I8);
2521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t13 = newTemp(Ity_I1);
2522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t14 = newTemp(Ity_I1);
2523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t15 = newTemp(Ity_I8);
2524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t16 = newTemp(Ity_I32);
2525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t17 = newTemp(Ity_I32);
2526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Absolute value of the rightmost byte (bits 7-0). */
2528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t0 - rightmost byte. */
2529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, unop(Iop_16to8, unop(Iop_32to16, getIReg(rt))));
2530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t1 holds 1 if t0 is equal to 0x80, or 0 otherwise. */
2531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpEQ32,
2532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32, mkexpr(t0)),
2533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00000080)));
2534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t2 holds 1 if value in t0 is negative, 0 otherwise. */
2535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, unop(Iop_32to1,
2536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Shr32,
2537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_And32,
2538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 getIReg(rt),
2539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x00000080)),
2540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(0x7))));
2541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t3 holds abs(t0). */
2542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, IRExpr_ITE(mkexpr(t1),
2543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(0x7F),
2544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           IRExpr_ITE(mkexpr(t2),
2545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      binop(Iop_Add8,
2546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            unop(Iop_Not8,
2547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                 mkexpr(t0)),
2548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkU8(0x1)),
2549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkexpr(t0))));
2550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Absolute value of bits 15-8. */
2552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t4 - input byte. */
2553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4,
2554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            unop(Iop_16HIto8, unop(Iop_32to16, getIReg(rt))));
2555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t5 holds 1 if t4 is equal to 0x80, or 0 otherwise. */
2556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, binop(Iop_CmpEQ32,
2557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32, mkexpr(t4)),
2558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00000080)));
2559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t6 holds 1 if value in t4 is negative, 0 otherwise. */
2560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, unop(Iop_32to1,
2561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Shr32,
2562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_And32,
2563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 getIReg(rt),
2564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x00008000)),
2565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(15))));
2566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t3 holds abs(t4). */
2567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, IRExpr_ITE(mkexpr(t5),
2568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(0x7F),
2569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           IRExpr_ITE(mkexpr(t6),
2570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      binop(Iop_Add8,
2571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            unop(Iop_Not8,
2572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                 mkexpr(t4)),
2573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkU8(0x1)),
2574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkexpr(t4))));
2575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Absolute value of bits 23-15. */
2577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t8 - input byte. */
2578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8,
2579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            unop(Iop_16to8, unop(Iop_32HIto16, getIReg(rt))));
2580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t9 holds 1 if t8 is equal to 0x80, or 0 otherwise. */
2581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t9, binop(Iop_CmpEQ32,
2582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32, mkexpr(t8)),
2583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00000080)));
2584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t6 holds 1 if value in t8 is negative, 0 otherwise. */
2585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t10, unop(Iop_32to1,
2586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shr32,
2587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_And32,
2588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  getIReg(rt),
2589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x00800000)),
2590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(23))));
2591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t3 holds abs(t8). */
2592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t11, IRExpr_ITE(mkexpr(t9),
2593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(0x7F),
2594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            IRExpr_ITE(mkexpr(t10),
2595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       binop(Iop_Add8,
2596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             unop(Iop_Not8,
2597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                  mkexpr(t8)),
2598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU8(0x1)),
2599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t8))));
2600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Absolute value of bits 31-24. */
2602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t12 - input byte. */
2603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t12,
2604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            unop(Iop_16HIto8, unop(Iop_32HIto16, getIReg(rt))));
2605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t13 holds 1 if t12 is equal to 0x80, or 0 otherwise. */
2606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t13, binop(Iop_CmpEQ32,
2607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_8Uto32, mkexpr(t12)),
2608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkU32(0x00000080)));
2609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t14 holds 1 if value in t12 is negative, 0 otherwise. */
2610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t14, unop(Iop_32to1,
2611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shr32,
2612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_And32,
2613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  getIReg(rt),
2614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x80000000)),
2615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(31))));
2616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t15 holds abs(t12). */
2617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t15, IRExpr_ITE(mkexpr(t13),
2618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(0x7F),
2619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            IRExpr_ITE(mkexpr(t14),
2620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       binop(Iop_Add8,
2621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             unop(Iop_Not8,
2622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                  mkexpr(t12)),
2623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU8(0x1)),
2624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t12))));
2625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t16 holds !0 if any of input bytes is 0x80 or 0
2627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        otherwise. */
2628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t16,
2629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Or32,
2630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  binop(Iop_Or32,
2631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_Or32,
2632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_1Sto32, mkexpr(t13)),
2633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_1Sto32, mkexpr(t9))),
2634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        unop(Iop_1Sto32, mkexpr(t5))),
2635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_1Sto32, mkexpr(t1))));
2636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpEQ32,
2638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t16),
2639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x0)),
2640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl(),
2641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
2642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
2643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00100000))));
2644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t17 = t15|t11|t7|t3 */
2646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t17,
2647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_16HLto32,
2648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  binop(Iop_8HLto16, mkexpr(t15), mkexpr(t11)),
2649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  binop(Iop_8HLto16, mkexpr(t7), mkexpr(t3))));
2650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, mkexpr(t17));
2652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
2653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
2654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x2: {  /* REPL.QB */
2655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("repl.qb r%d, %d", rd, dsp_imm);
2656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
2657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, mkU32((dsp_imm << 24) | (dsp_imm << 16) |
2659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       (dsp_imm << 8) | (dsp_imm)));
2660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
2661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
2662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x3: {  /* REPLV.QB */
2663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("replv.qb r%d, r%d", rd, rt);
2664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
2665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I8);
2666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, unop(Iop_32to8,
2668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                binop(Iop_And32, getIReg(rt), mkU32(0xff))));
2669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd,
2670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             binop(Iop_16HLto32,
2671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   binop(Iop_8HLto16, mkexpr(t0), mkexpr(t0)),
2672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   binop(Iop_8HLto16, mkexpr(t0), mkexpr(t0))));
2673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
2674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
2675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x4: {  /* PRECEQU.PH.QBL */
2676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("precequ.ph.qbl r%d, r%d", rd, rt);
2677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
2678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_Or32,
2680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_Shr32,
2681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_And32,
2682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   getIReg(rt),
2683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0xff000000)),
2684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU8(1)),
2685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_Shr32,
2686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_And32,
2687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   getIReg(rt),
2688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0x00ff0000)),
2689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU8(9))));
2690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
2691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
2692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x5: {  /* PRECEQU.PH.QBR */
2693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("precequ.ph.qbr r%d, r%d", rd, rt);
2694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
2695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_Or32,
2697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_Shl32,
2698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_And32,
2699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   getIReg(rt),
2700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0x0000ff00)),
2701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU8(15)),
2702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_Shl32,
2703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_And32,
2704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   getIReg(rt),
2705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0x000000ff)),
2706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU8(7))));
2707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
2708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
2709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x6: {  /* PRECEQU.PH.QBLA */
2710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("precequ.ph.qbla r%d, r%d", rd, rt);
2711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
2712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_Or32,
2714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_Shr32,
2715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_And32,
2716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   getIReg(rt),
2717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0xff000000)),
2718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU8(1)),
2719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_Shr32,
2720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_And32,
2721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   getIReg(rt),
2722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0x0000ff00)),
2723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU8(1))));
2724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
2725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
2726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x7: {  /* PRECEQU.PH.QBRA */
2727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("precequ.ph.qbra r%d, r%d", rd, rt);
2728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
2729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_Or32,
2731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_Shl32,
2732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_And32,
2733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   getIReg(rt),
2734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0x00ff0000)),
2735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU8(7)),
2736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_Shl32,
2737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_And32,
2738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   getIReg(rt),
2739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0x000000ff)),
2740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU8(7))));
2741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
2742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
2743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x9: {  /* ABSQ_S.PH */
2744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("absq_s.ph r%d, r%d", rd, rt);
2745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
2746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I16);
2747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
2748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
2749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I16);
2750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I16);
2751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I1);
2752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I1);
2753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I16);
2754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I32);
2755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I32);
2756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t0 holds lower 16 bits of value in rt. */
2758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, unop(Iop_32to16, getIReg(rt)));
2759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t1 holds 1 if t0 is equal to 0x8000. */
2760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpEQ32,
2761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32, mkexpr(t0)),
2762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
2763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t2 holds 1 if value in t0 is negative, 0 otherwise. */
2764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, unop(Iop_32to1,
2765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Shr32,
2766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_And32,
2767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 getIReg(rt),
2768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x00008000)),
2769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(15))));
2770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t3 holds abs(t0). */
2771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, IRExpr_ITE(mkexpr(t1),
2772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU16(0x7FFF),
2773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           IRExpr_ITE(mkexpr(t2),
2774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      binop(Iop_Add16,
2775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            unop(Iop_Not16,
2776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                 mkexpr(t0)),
2777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkU16(0x1)),
2778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkexpr(t0))));
2779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t4 holds lower 16 bits of value in rt. */
2781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, unop(Iop_32HIto16, getIReg(rt)));
2782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t5 holds 1 if t4 is equal to 0x8000. */
2783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, binop(Iop_CmpEQ32,
2784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32, mkexpr(t4)),
2785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
2786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t6 holds 1 if value in t4 is negative, 0 otherwise. */
2787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, unop(Iop_32to1,
2788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Shr32,
2789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_And32,
2790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 getIReg(rt),
2791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x80000000)),
2792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(31))));
2793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t7 holds abs(t4). */
2794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, IRExpr_ITE(mkexpr(t5),
2795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU16(0x7FFF),
2796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           IRExpr_ITE(mkexpr(t6),
2797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      binop(Iop_Add16,
2798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            unop(Iop_Not16,
2799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                 mkexpr(t4)),
2800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkU16(0x1)),
2801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkexpr(t4))));
2802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* If any of the two input halfwords is equal 0x8000,
2803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        set bit 20 in DSPControl register. */
2804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8, binop(Iop_Or32,
2805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_1Sto32, mkexpr(t5)),
2806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_1Sto32, mkexpr(t1))));
2807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpEQ32,
2809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t8),
2810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x0)),
2811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl(),
2812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
2813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
2814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00100000))));
2815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t9 = t7|t3 */
2817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t9, binop(Iop_16HLto32, mkexpr(t7), mkexpr(t3)));
2818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, mkexpr(t9));
2820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
2821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
2822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xA: {  /* REPL.PH */
2823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("repl.ph r%d, %d", rd, dsp_imm);
2824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
2825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     UShort immediate = extend_s_10to16(dsp_imm);
2826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, mkU32(immediate << 16 | immediate));
2828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
2829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
2830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xB: {  /* REPLV.PH */
2831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("replv.ph r%d, r%d", rd, rt);
2832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
2833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_16HLto32,
2835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_32to16, getIReg(rt)),
2836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_32to16, getIReg(rt))));
2837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
2838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
2839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xC: {  /* PRECEQ.W.PHL */
2840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("preceq.w.phl r%d, r%d", rd, rt);
2841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
2842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_And32,
2843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       getIReg(rt),
2844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkU32(0xffff0000)));
2845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
2846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
2847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xD: {  /* PRECEQ.W.PHR */
2848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("preceq.w.phr r%d, r%d", rd, rt);
2849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
2850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_16HLto32,
2851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_32to16, getIReg(rt)),
2852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkU16(0x0)));
2853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
2854436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
2855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x11: {  /* ABSQ_S.W */
2856436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("absq_s.w r%d, r%d", rd, rt);
2857436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
2858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I1);
2859436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
2860436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
2861436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0,
2863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_CmpEQ32, getIReg(rt), mkU32(0x80000000)));
2864436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t0),
2866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
2867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
2868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00100000)),
2869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
2870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpLT32S, getIReg(rt), mkU32(0x0)));
2872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, IRExpr_ITE(mkexpr(t0),
2874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x7FFFFFFF),
2875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           IRExpr_ITE(mkexpr(t1),
2876436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      binop(Iop_Add32,
2877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            unop(Iop_Not32,
2878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                 getIReg(rt)),
2879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkU32(0x1)),
2880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      getIReg(rt))));
2881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, mkexpr(t2));
2882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
2883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
2884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x1B: {  /* BITREV */
2885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("bitrev r%d, r%d", rd, rt);
2886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
2887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* 32bit reversal as seen on Bit Twiddling Hacks site
2888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        http://graphics.stanford.edu/~seander/bithacks.html
2889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        section ReverseParallel */
2890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
2891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
2892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I32);
2893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I32);
2894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I32);
2895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_Or32,
2897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shr32,
2898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_And32,
2899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  getIReg(rt),
2900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0xaaaaaaaa)),
2901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(0x1)),
2902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shl32,
2903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_And32,
2904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  getIReg(rt),
2905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x55555555)),
2906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(0x1))));
2907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_Or32,
2908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shr32,
2909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_And32,
2910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t1),
2911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0xcccccccc)),
2912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(0x2)),
2913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shl32,
2914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_And32,
2915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t1),
2916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x33333333)),
2917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(0x2))));
2918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_Or32,
2919436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shr32,
2920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_And32,
2921436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t2),
2922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0xf0f0f0f0)),
2923436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(0x4)),
2924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shl32,
2925436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_And32,
2926436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t2),
2927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x0f0f0f0f)),
2928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(0x4))));
2929436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, binop(Iop_Or32,
2930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shr32,
2931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_And32,
2932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t3),
2933436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0xff00ff00)),
2934436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(0x8)),
2935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shl32,
2936436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_And32,
2937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t3),
2938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x00ff00ff)),
2939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(0x8))));
2940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, binop(Iop_Or32,
2941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shr32,
2942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t4),
2943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(0x10)),
2944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shl32,
2945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t4),
2946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(0x10))));
2947436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_Shr32,
2948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t5),
2949436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkU8(16)));
2950436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
2951436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
2952436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x1C: {  /* PRECEU.PH.QBL */
2953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("preceu.ph.qbl r%d, r%d", rd, rt);
2954436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
2955436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_Or32,
2957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_Shr32,
2958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_And32,
2959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   getIReg(rt),
2960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0xff000000)),
2961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU8(8)),
2962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_Shr32,
2963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_And32,
2964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   getIReg(rt),
2965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0x00ff0000)),
2966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU8(16))));
2967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
2968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
2969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x1E: {  /* PRECEU.PH.QBLA */
2970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("preceu.ph.qbla r%d, r%d", rd, rt);
2971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
2972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_Or32,
2974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_Shr32,
2975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_And32,
2976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   getIReg(rt),
2977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0xff000000)),
2978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU8(8)),
2979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_Shr32,
2980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_And32,
2981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   getIReg(rt),
2982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0x0000ff00)),
2983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU8(8))));
2984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
2985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
2986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x1D: {  /* PRECEU.PH.QBR */
2987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("preceu.ph.qbr r%d, r%d", rd, rt);
2988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
2989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
2990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_Or32,
2991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_Shl32,
2992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_And32,
2993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   getIReg(rt),
2994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0x0000ff00)),
2995436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU8(8)),
2996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_And32,
2997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             getIReg(rt),
2998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU32(0x000000ff))));
2999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
3000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
3001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x1F: {  /* PRECEU.PH.QBRA */
3002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("preceu.ph.qbra r%d, r%d", rd, rt);
3003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
3004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_Or32,
3006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_And32,
3007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             getIReg(rt),
3008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU32(0x00ff0000)),
3009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_And32,
3010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             getIReg(rt),
3011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU32(0x000000ff))));
3012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
3013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
3014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
3015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     return -1;
3016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
3017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;  /* end of ABSQ_S.PH */
3018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
3019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x38: {  /* EXTR.W */
3020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               switch(sa) {
3021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x0: {  /* EXTR.W */
3022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("extr.w r%d, ac%d, %d", rt, ac, rs);
3023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
3024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
3025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I64);
3026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
3027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
3028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I1);
3029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I1);
3030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I1);
3031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I32);
3032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I64);
3033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I64);
3034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t10 = newTemp(Ity_I1);
3035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t11 = newTemp(Ity_I1);
3036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t12 = newTemp(Ity_I1);
3037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t13 = newTemp(Ity_I1);
3038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t14 = newTemp(Ity_I32);
3039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, getAcc(ac));
3041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (0 == rs) {
3042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t1, mkexpr(t0));
3043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
3044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t1, binop(Iop_Sar64, mkexpr(t0), mkU8(rs)));
3045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
3046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Check if bits 63..31 of the result in t1 aren't 0. */
3047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpNE32,
3048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64HIto32,
3049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t1)),
3050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0)));
3051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, binop(Iop_CmpNE32,
3052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
3053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64to32,
3054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t1)),
3055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x80000000)),
3056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0)));
3057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Check if bits 63..31 of the result in t1 aren't
3058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        0x1ffffffff. */
3059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, binop(Iop_CmpNE32,
3060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64HIto32,
3061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t1)),
3062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0xffffffff)));
3063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, binop(Iop_CmpNE32,
3064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
3065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64to32,
3066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t1)),
3067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x80000000)),
3068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x80000000)));
3069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* If bits 63..31 aren't 0 nor 0x1ffffffff, set DSP
3070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        control register. */
3071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, binop(Iop_And32,
3072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Or32,
3073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t3)),
3074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t4))),
3075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Or32,
3076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t5)),
3077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t6)))));
3078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpNE32,
3079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t7),
3080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0)),
3081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
3082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
3083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00800000)),
3084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
3085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* If the last discarded bit is 1, there would be carry
3087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        when rounding, otherwise there wouldn't. We use that
3088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        fact and just add the value of the last discarded bit
3089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        to the least sifgnificant bit of the shifted value
3090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        from acc. */
3091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (0 == rs) {
3092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t8, mkU64(0x0ULL));
3093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
3094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t8, binop(Iop_And64,
3095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         binop(Iop_Shr64,
3096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               mkexpr(t0),
3097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               mkU8(rs-1)),
3098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkU64(0x1ULL)));
3099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
3100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t9, binop(Iop_Add64, mkexpr(t1), mkexpr(t8)));
3101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Repeat previous steps for the rounded value. */
3103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t10, binop(Iop_CmpNE32,
3104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64HIto32,
3105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t9)),
3106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0)));
3107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t11, binop(Iop_CmpNE32,
3108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
3109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64to32,
3110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t9)),
3111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x80000000)),
3112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0)));
3113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t12, binop(Iop_CmpNE32,
3115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64HIto32,
3116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t9)),
3117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0xffffffff)));
3118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t13, binop(Iop_CmpNE32,
3119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
3120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64to32,
3121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t9)),
3122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x80000000)),
3123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x80000000)));
3124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t14, binop(Iop_And32,
3126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Or32,
3127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t10)),
3128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t11))),
3129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Or32,
3130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t12)),
3131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t13)))));
3132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpNE32,
3133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t14),
3134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0)),
3135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
3136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
3137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00800000)),
3138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
3139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (0 == rs) {
3140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rt, unop(Iop_64to32, mkexpr(t0)));
3141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
3142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rt, unop(Iop_64to32, mkexpr(t1)));
3143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
3144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
3145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
3146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x1: {  /* EXTRV.W */
3147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("extrv.w r%d, ac%d, r%d", rt, ac, rs);
3148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
3149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
3150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I64);
3151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
3152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
3153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I1);
3154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I1);
3155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I1);
3156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I32);
3157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I64);
3158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I64);
3159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t10 = newTemp(Ity_I1);
3160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t11 = newTemp(Ity_I1);
3161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t12 = newTemp(Ity_I1);
3162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t13 = newTemp(Ity_I1);
3163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t14 = newTemp(Ity_I32);
3164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t15 = newTemp(Ity_I8);
3165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t15, unop(Iop_32to8,
3167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
3168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(rs),
3169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x1f))));
3170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, getAcc(ac));
3171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_Sar64, mkexpr(t0), mkexpr(t15)));
3172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rt, IRExpr_ITE(binop(Iop_CmpEQ32,
3173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        unop(Iop_8Uto32,
3174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkexpr(t15)),
3175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkU32(0)),
3176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_64to32, mkexpr(t0)),
3177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_64to32, mkexpr(t1))));
3178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Check if bits 63..31 of the result in t1 aren't 0. */
3180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpNE32,
3181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64HIto32,
3182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t1)),
3183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0)));
3184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, binop(Iop_CmpNE32,
3185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
3186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64to32,
3187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t1)),
3188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x80000000)),
3189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0)));
3190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Check if bits 63..31 of the result in t1 aren't
3191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        0x1ffffffff. */
3192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, binop(Iop_CmpNE32,
3193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64HIto32,
3194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t1)),
3195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0xffffffff)));
3196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, binop(Iop_CmpNE32,
3197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
3198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64to32,
3199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t1)),
3200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x80000000)),
3201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x80000000)));
3202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* If bits 63..31 aren't 0 nor 0x1ffffffff, set DSP
3203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        control register. */
3204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, binop(Iop_And32,
3205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Or32,
3206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t3)),
3207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t4))),
3208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Or32,
3209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t5)),
3210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t6)))));
3211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpNE32,
3212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t7),
3213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0)),
3214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
3215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
3216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00800000)),
3217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
3218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* If the last discarded bit is 1, there would be carry
3220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        when rounding, otherwise there wouldn't. We use that
3221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        fact and just add the value of the last discarded bit
3222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        to the least sifgnificant bit of the shifted value
3223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        from acc. */
3224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8,
3225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(binop(Iop_CmpEQ32,
3226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             unop(Iop_8Uto32,
3227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t15)),
3228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU32(0)),
3229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkU64(0x0ULL),
3230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_And64,
3231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_Shr64,
3232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkexpr(t0),
3233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   unop(Iop_32to8,
3234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        binop(Iop_Sub32,
3235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              unop(Iop_8Uto32,
3236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                   mkexpr(t15)),
3237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                   mkU32(1)))),
3238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU64(0x1ULL))));
3239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t9, binop(Iop_Add64, mkexpr(t1), mkexpr(t8)));
3241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Repeat previous steps for the rounded value. */
3243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t10, binop(Iop_CmpNE32,
3244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64HIto32,
3245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t9)),
3246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0)));
3247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t11, binop(Iop_CmpNE32,
3248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
3249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64to32,
3250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t9)),
3251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x80000000)),
3252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0)));
3253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t12, binop(Iop_CmpNE32,
3255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64HIto32,
3256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t9)),
3257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0xffffffff)));
3258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t13, binop(Iop_CmpNE32,
3259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
3260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64to32,
3261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t9)),
3262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x80000000)),
3263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x80000000)));
3264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t14, binop(Iop_And32,
3266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Or32,
3267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t10)),
3268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t11))),
3269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Or32,
3270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t12)),
3271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t13)))));
3272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpNE32,
3273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t14),
3274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0)),
3275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
3276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
3277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00800000)),
3278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
3279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
3280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
3281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x2: {  /* EXTP */
3282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("extp r%d, ac%d, %d", rt, ac, rs);
3283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
3284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
3285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
3286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
3287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
3288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I8);
3289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I64);
3290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I64);
3291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I32);
3292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, getAcc(ac));
3294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Extract pos field of DSPControl register. */
3295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_And32, getDSPControl(), mkU32(0x3f)));
3296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Check if (pos - size) >= 0 [size <= pos]
3298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        if (pos < size)
3299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           put 1 to EFI field of DSPControl register
3300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        else
3301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           extract bits from acc and put 0 to EFI field of
3302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           DSPCtrl */
3303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpLT32U, mkexpr(t1), mkU32(rs)));
3304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t2),
3306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
3307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_And32,
3308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          getDSPControl(),
3309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU32(0xffffbfff)),
3310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x4000)),
3311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
3312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
3313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xffffbfff))));
3314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* If pos <= 31, shift right the value from the acc
3316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        (pos-size) times and take (size+1) bits from the least
3317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        significant positions. Otherwise, shift left the value
3318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        (63-pos) times, take (size+1) bits from the most
3319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        significant positions and shift right (31-size) times.*/
3320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpLE32U, mkexpr(t1), mkU32(31)));
3321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4,
3323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           IRExpr_ITE(mkexpr(t3),
3324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to8,
3325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Sub32,
3326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t1), mkU32(rs))),
3327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to8,
3328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Sub32,
3329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(63), mkexpr(t1)))));
3330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, IRExpr_ITE(mkexpr(t3),
3332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Shr64,
3333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t0), mkexpr(t4)),
3334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Shl64,
3335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t0), mkexpr(t4))));
3336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t6 holds a mask for bit extraction */
3338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6,
3339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(mkexpr(t3),
3340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_Not64,
3341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_Shl64,
3342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0xffffffffffffffffULL),
3343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU8(rs+1))),
3344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_Not64,
3345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_Shr64,
3346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0xffffffffffffffffULL),
3347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU8(rs+1)))));
3348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, IRExpr_ITE(mkexpr(t3),
3350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_64to32,
3351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                binop(Iop_And64,
3352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkexpr(t5),
3353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkexpr(t6))),
3354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Shr32,
3355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_64HIto32,
3356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      binop(Iop_And64,
3357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t5),
3358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t6))),
3359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU8(31-rs))));
3360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rt, mkexpr(t7));
3362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
3363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
3364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x3: {  /* EXTPV */
3365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("extpv r%d, ac%d, r%d", rt, ac, rs);
3366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
3367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
3368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
3369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
3370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
3371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I8);
3372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I64);
3373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I64);
3374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I32);
3375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I32);
3376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8, binop(Iop_And32, getIReg(rs), mkU32(0x1f)));
3378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, getAcc(ac));
3379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Extract pos field of DSPControl register. */
3380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_And32, getDSPControl(), mkU32(0x3f)));
3381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Check if (pos - size) >= 0 [size <= pos]
3383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        if (pos < size)
3384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           put 1 to EFI field of DSPControl register
3385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        else
3386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           extract bits from acc and put 0 to EFI field of
3387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           DSPCtrl */
3388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpLT32U, mkexpr(t1), mkexpr(t8)));
3389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t2),
3391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
3392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_And32,
3393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          getDSPControl(),
3394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU32(0xffffbfff)),
3395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x4000)),
3396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
3397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
3398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xffffbfff))));
3399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* If pos <= 31, shift right the value from the acc
3401436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        (pos-size) times and take (size+1) bits from the least
3402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        significant positions. Otherwise, shift left the value
3403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        (63-pos) times, take (size+1) bits from the most
3404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        significant positions and shift right (31-size)
3405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        times. */
3406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpLE32U, mkexpr(t1), mkU32(31)));
3407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4,
3409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           IRExpr_ITE(mkexpr(t3),
3410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to8,
3411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Sub32,
3412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t1), mkexpr(t8))),
3413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to8,
3414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Sub32,
3415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(63), mkexpr(t1)))));
3416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, IRExpr_ITE(mkexpr(t3),
3418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Shr64,
3419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t0), mkexpr(t4)),
3420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Shl64,
3421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t0), mkexpr(t4))));
3422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t6 holds a mask for bit extraction. */
3424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6,
3425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(mkexpr(t3),
3426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_Not64,
3427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_Shl64,
3428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0xffffffffffffffffULL),
3429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_32to8,
3430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       binop(Iop_Add32,
3431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkexpr(t8),
3432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU32(1))))),
3433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_Not64,
3434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_Shr64,
3435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0xffffffffffffffffULL),
3436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_32to8,
3437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       binop(Iop_Add32,
3438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkexpr(t8),
3439436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU32(1)))))));
3440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, IRExpr_ITE(mkexpr(t3),
3442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_64to32,
3443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                binop(Iop_And64,
3444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkexpr(t5),
3445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkexpr(t6))),
3446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Shr32,
3447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_64HIto32,
3448436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      binop(Iop_And64,
3449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t5),
3450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t6))),
3451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_32to8,
3452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      binop(Iop_Sub32,
3453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkU32(31),
3454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t8))))));
3455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rt, mkexpr(t7));
3457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
3458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
3459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x4: {  /* EXTR_R.W */
3460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("extr_r.w r%d, ac%d, %d", rt, ac, rs);
3461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
3462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
3463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I64);
3464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
3465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
3466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I1);
3467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I1);
3468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I1);
3469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I32);
3470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I64);
3471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I64);
3472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t10 = newTemp(Ity_I1);
3473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t11 = newTemp(Ity_I1);
3474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t12 = newTemp(Ity_I1);
3475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t13 = newTemp(Ity_I1);
3476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t14 = newTemp(Ity_I32);
3477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t15 = newTemp(Ity_I64);
3478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t16 = newTemp(Ity_I1);
3479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, getAcc(ac));
3481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t16, binop(Iop_CmpEQ32,
3482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkU32(rs),
3483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkU32(0)));
3484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, IRExpr_ITE(mkexpr(t16),
3485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t0),
3486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Sar64,
3487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t0),
3488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU8(rs))));
3489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* If the last discarded bit is 1, there would be carry
3490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        when rounding, otherwise there wouldn't. We use that
3491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        fact and just add the value of the last discarded bit
3492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        to the least significant bit of the shifted value
3493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        from acc. */
3494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t15, binop(Iop_Shr64,
3495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t0),
3496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_32to8,
3497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_Sub32,
3498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  binop(Iop_And32,
3499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkU32(rs),
3500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkU32(0x1f)),
3501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(1)))));
3502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8,
3504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(mkexpr(t16),
3505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkU64(0x0ULL),
3506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_And64,
3507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkexpr(t15),
3508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU64(0x0000000000000001ULL))));
3509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t9, binop(Iop_Add64, mkexpr(t1), mkexpr(t8)));
3510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rt, unop(Iop_64to32, mkexpr(t9)));
3511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Check if bits 63..31 of the result in t1 aren't 0. */
3513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpNE32,
3514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64HIto32,
3515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t1)),
3516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0)));
3517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, binop(Iop_CmpNE32,
3518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
3519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64to32,
3520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t1)),
3521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x80000000)),
3522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0)));
3523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Check if bits 63..31 of the result in t1 aren't
3525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        0x1ffffffff. */
3526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, binop(Iop_CmpNE32,
3527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64HIto32,
3528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t1)),
3529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0xffffffff)));
3530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, binop(Iop_CmpNE32,
3531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
3532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64to32,
3533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t1)),
3534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x80000000)),
3535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x80000000)));
3536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* If bits 63..31 aren't 0 nor 0x1ffffffff, set DSP
3537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        control register. */
3538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, binop(Iop_And32,
3539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Or32,
3540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t3)),
3541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t4))),
3542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Or32,
3543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t5)),
3544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t6)))));
3545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpNE32,
3546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t7),
3547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0)),
3548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
3549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
3550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00800000)),
3551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
3552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Repeat previous steps for the rounded value. */
3554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t10, binop(Iop_CmpNE32,
3555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64HIto32,
3556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t9)),
3557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0)));
3558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t11, binop(Iop_CmpNE32,
3559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
3560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64to32,
3561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t9)),
3562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x80000000)),
3563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0)));
3564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t12, binop(Iop_CmpNE32,
3566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64HIto32,
3567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t9)),
3568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0xffffffff)));
3569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t13, binop(Iop_CmpNE32,
3570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
3571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64to32,
3572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t9)),
3573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x80000000)),
3574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x80000000)));
3575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t14, binop(Iop_And32,
3577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Or32,
3578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t10)),
3579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t11))),
3580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Or32,
3581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t12)),
3582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t13)))));
3583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpNE32,
3584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t14),
3585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0)),
3586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
3587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
3588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00800000)),
3589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
3590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
3591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
3592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x5: {  /* EXTRV_R.W */
3593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("extrv_r.w r%d, ac%d, r%d", rt, ac, rs);
3594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
3595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
3596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I64);
3597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
3598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
3599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I1);
3600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I1);
3601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I1);
3602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I32);
3603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I64);
3604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I64);
3605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t10 = newTemp(Ity_I1);
3606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t11 = newTemp(Ity_I1);
3607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t12 = newTemp(Ity_I1);
3608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t13 = newTemp(Ity_I1);
3609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t14 = newTemp(Ity_I32);
3610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t15 = newTemp(Ity_I8);
3611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t15, unop(Iop_32to8,
3613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
3614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(rs),
3615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x1f))));
3616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, getAcc(ac));
3617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_Sar64, mkexpr(t0), mkexpr(t15)));
3618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Check if bits 63..31 of the result in t1 aren't 0. */
3620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpNE32,
3621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64HIto32,
3622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t1)),
3623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0)));
3624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, binop(Iop_CmpNE32,
3625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
3626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64to32,
3627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t1)),
3628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x80000000)),
3629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0)));
3630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Check if bits 63..31 of the result in t1 aren't
3631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        0x1ffffffff. */
3632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, binop(Iop_CmpNE32,
3633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64HIto32,
3634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t1)),
3635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0xffffffff)));
3636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, binop(Iop_CmpNE32,
3637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
3638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64to32,
3639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t1)),
3640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x80000000)),
3641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x80000000)));
3642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* If bits 63..31 aren't 0 nor 0x1ffffffff, set DSP
3643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        control register. */
3644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, binop(Iop_And32,
3645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Or32,
3646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t3)),
3647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t4))),
3648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Or32,
3649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t5)),
3650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t6)))));
3651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpNE32,
3652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t7),
3653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0)),
3654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
3655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
3656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00800000)),
3657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
3658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* If the last discarded bit is 1, there would be carry
3660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        when rounding, otherwise there wouldn't. We use that
3661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        fact and just add the value of the last discarded bit
3662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        to the least sifgnificant bit of the shifted value
3663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        from acc. */
3664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8,
3665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(binop(Iop_CmpEQ32,
3666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             unop(Iop_8Uto32,
3667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t15)),
3668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU32(0)),
3669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkU64(0x0ULL),
3670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_And64,
3671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_Shr64,
3672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkexpr(t0),
3673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   unop(Iop_32to8,
3674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        binop(Iop_Sub32,
3675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              unop(Iop_8Uto32,
3676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                   mkexpr(t15)),
3677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                   mkU32(1)))),
3678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU64(0x1ULL))));
3679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t9, binop(Iop_Add64, mkexpr(t1), mkexpr(t8)));
3681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Put rounded value in destination register. */
3682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rt, unop(Iop_64to32, mkexpr(t9)));
3683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Repeat previous steps for the rounded value. */
3685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t10, binop(Iop_CmpNE32,
3686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64HIto32,
3687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t9)),
3688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0)));
3689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t11, binop(Iop_CmpNE32,
3690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
3691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64to32,
3692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t9)),
3693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x80000000)),
3694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0)));
3695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t12, binop(Iop_CmpNE32,
3697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64HIto32,
3698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t9)),
3699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0xffffffff)));
3700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t13, binop(Iop_CmpNE32,
3701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
3702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64to32,
3703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t9)),
3704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x80000000)),
3705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x80000000)));
3706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t14, binop(Iop_And32,
3708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Or32,
3709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t10)),
3710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t11))),
3711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Or32,
3712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t12)),
3713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t13)))));
3714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpNE32,
3715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t14),
3716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0)),
3717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
3718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
3719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00800000)),
3720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
3721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
3722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
3723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x6: {  /* EXTR_RS.W */
3724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("extr_rs.w r%d, ac%d, %d", rt, ac, rs);
3725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
3726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
3727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I64);
3728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
3729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
3730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I1);
3731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I1);
3732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I1);
3733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I32);
3734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I64);
3735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I64);
3736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t10 = newTemp(Ity_I1);
3737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t11 = newTemp(Ity_I1);
3738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t12 = newTemp(Ity_I1);
3739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t13 = newTemp(Ity_I1);
3740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t14 = newTemp(Ity_I32);
3741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t16 = newTemp(Ity_I32);
3742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, getAcc(ac));
3744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (0 == rs) {
3745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t1, mkexpr(t0));
3746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
3747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t1, binop(Iop_Sar64, mkexpr(t0), mkU8(rs)));
3748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
3749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Check if bits 63..31 of the result in t1 aren't 0. */
3751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpNE32,
3752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64HIto32,
3753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t1)),
3754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0)));
3755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, binop(Iop_CmpNE32,
3756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
3757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64to32,
3758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t1)),
3759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x80000000)),
3760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0)));
3761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Check if bits 63..31 of the result in t1 aren't
3762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        0x1ffffffff. */
3763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, binop(Iop_CmpNE32,
3764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64HIto32,
3765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t1)),
3766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0xffffffff)));
3767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, binop(Iop_CmpNE32,
3768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
3769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64to32,
3770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t1)),
3771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x80000000)),
3772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x80000000)));
3773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* If bits 63..31 aren't 0 nor 0x1ffffffff, set DSP
3774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        control register. */
3775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, binop(Iop_And32,
3776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Or32,
3777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t3)),
3778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t4))),
3779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Or32,
3780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t5)),
3781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t6)))));
3782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpNE32,
3783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t7),
3784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0)),
3785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
3786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
3787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00800000)),
3788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
3789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* If the last discarded bit is 1, there would be carry
3791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        when rounding, otherwise there wouldn't. We use that
3792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        fact and just add the value of the last discarded bit
3793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        to the least sifgnificant bit of the shifted value
3794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        from acc. */
3795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (0 == rs) {
3796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t8, mkU64(0x0ULL));
3797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
3798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t8, binop(Iop_And64,
3799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         binop(Iop_Shr64,
3800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               mkexpr(t0),
3801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               mkU8(rs-1)),
3802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkU64(0x1ULL)));
3803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
3804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t9, binop(Iop_Add64, mkexpr(t1), mkexpr(t8)));
3806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Repeat previous steps for the rounded value. */
3808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t10, binop(Iop_CmpNE32,
3809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64HIto32,
3810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t9)),
3811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0)));
3812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t11, binop(Iop_CmpNE32,
3813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
3814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64to32,
3815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t9)),
3816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x80000000)),
3817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0)));
3818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t12, binop(Iop_CmpNE32,
3820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64HIto32,
3821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t9)),
3822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0xffffffff)));
3823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t13, binop(Iop_CmpNE32,
3824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
3825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64to32,
3826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t9)),
3827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x80000000)),
3828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x80000000)));
3829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t14, binop(Iop_And32,
3831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Or32,
3832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t10)),
3833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t11))),
3834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Or32,
3835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t12)),
3836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t13)))));
3837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpNE32,
3838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t14),
3839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0)),
3840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
3841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
3842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00800000)),
3843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
3844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t16, binop(Iop_And32,
3846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_64HIto32,
3847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t9)),
3848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkU32(0x80000000)));
3849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rt, IRExpr_ITE(binop(Iop_CmpNE32,
3850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t14),
3851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0)),
3852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            IRExpr_ITE(binop(Iop_CmpEQ32,
3853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkexpr(t16),
3854436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU32(0)),
3855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x7fffffff),
3856436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x80000000)),
3857436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64to32, mkexpr(t9))));
3858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
3859436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
3860436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x7: {  /* EXTRV_RS.W */
3861436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("extrv_rs.w r%d, ac%d, r%d", rt, ac, rs);
3862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
3863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
3864436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I64);
3865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
3866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
3867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I1);
3868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I1);
3869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I1);
3870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I32);
3871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I64);
3872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I64);
3873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t10 = newTemp(Ity_I1);
3874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t11 = newTemp(Ity_I1);
3875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t12 = newTemp(Ity_I1);
3876436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t13 = newTemp(Ity_I1);
3877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t14 = newTemp(Ity_I32);
3878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t15 = newTemp(Ity_I32);
3879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t16 = newTemp(Ity_I32);
3880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t17 = newTemp(Ity_I1);
3881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t15, binop(Iop_And32,
3883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       getIReg(rs),
3884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkU32(0x1f)));
3885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t17, binop(Iop_CmpEQ32,
3886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t15),
3887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkU32(0)));
3888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, getAcc(ac));
3889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, IRExpr_ITE(mkexpr(t17),
3890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t0),
3891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Sar64,
3892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t0),
3893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_32to8,
3894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkexpr(t15)))));
3895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Check if bits 63..31 of the result in t1 aren't 0. */
3897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpNE32,
3898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64HIto32,
3899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t1)),
3900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0)));
3901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, binop(Iop_CmpNE32,
3902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
3903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64to32,
3904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t1)),
3905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x80000000)),
3906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0)));
3907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Check if bits 63..31 of the result in t1 aren't
3908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        0x1ffffffff. */
3909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, binop(Iop_CmpNE32,
3910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64HIto32,
3911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t1)),
3912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0xffffffff)));
3913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, binop(Iop_CmpNE32,
3914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
3915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64to32,
3916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t1)),
3917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x80000000)),
3918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x80000000)));
3919436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* If bits 63..31 aren't 0 nor 0x1ffffffff, set DSP
3920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        control register. */
3921436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, binop(Iop_And32,
3922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Or32,
3923436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t3)),
3924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t4))),
3925436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Or32,
3926436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t5)),
3927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t6)))));
3928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpNE32,
3929436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t7),
3930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0)),
3931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
3932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
3933436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00800000)),
3934436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
3935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3936436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* If the last discarded bit is 1, there would be carry
3937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        when rounding, otherwise there wouldn't. We use that
3938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        fact and just add the value of the last discarded bit
3939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        to the least sifgnificant bit of the shifted value
3940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        from acc. */
3941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8,
3942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(mkexpr(t17),
3943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkU64(0x0ULL),
3944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_And64,
3945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_Shr64,
3946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkexpr(t0),
3947436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   unop(Iop_32to8,
3948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        binop(Iop_Sub32,
3949436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              mkexpr(t15),
3950436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              mkU32(1)))),
3951436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU64(0x1ULL))));
3952436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t9, binop(Iop_Add64, mkexpr(t1), mkexpr(t8)));
3954436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3955436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Repeat previous steps for the rounded value. */
3956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t10, binop(Iop_CmpNE32,
3957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64HIto32,
3958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t9)),
3959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0)));
3960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t11, binop(Iop_CmpNE32,
3961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
3962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64to32,
3963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t9)),
3964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x80000000)),
3965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0)));
3966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t12, binop(Iop_CmpNE32,
3968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64HIto32,
3969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t9)),
3970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0xffffffff)));
3971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t13, binop(Iop_CmpNE32,
3972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
3973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64to32,
3974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t9)),
3975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x80000000)),
3976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x80000000)));
3977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t14, binop(Iop_And32,
3979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Or32,
3980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t10)),
3981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t11))),
3982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Or32,
3983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t12)),
3984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t13)))));
3985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpNE32,
3986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t14),
3987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0)),
3988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
3989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
3990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00800000)),
3991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
3992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
3993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t16, binop(Iop_And32,
3994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_64HIto32,
3995436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t9)),
3996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkU32(0x80000000)));
3997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rt, IRExpr_ITE(binop(Iop_CmpNE32,
3998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t14),
3999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0)),
4000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            IRExpr_ITE(binop(Iop_CmpEQ32,
4001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkexpr(t16),
4002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU32(0)),
4003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x7fffffff),
4004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x80000000)),
4005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64to32, mkexpr(t9))));
4006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
4007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
4008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xA: {  /* EXTPDP */
4009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("extpdp r%d, ac%d, %d", rt, ac, rs);
4010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
4011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
4012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
4013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
4014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
4015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I8);
4016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I64);
4017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I64);
4018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I32);
4019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I32);
4020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, getAcc(ac));
4022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Extract pos field of DSPControl register. */
4023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_And32, getDSPControl(), mkU32(0x3f)));
4024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Check if (pos - size) >= 0 [size <= pos]
4026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        if (pos < size)
4027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           put 1 to EFI field of DSPControl register
4028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        else
4029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           extract bits from acc and put 0 to EFI field of
4030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           DSPCtrl */
4031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpLT32U, mkexpr(t1), mkU32(rs)));
4032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8, binop(Iop_Or32,
4034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
4035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getDSPControl(),
4036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0xffffbfc0)),
4037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
4038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_Sub32,
4039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  binop(Iop_And32,
4040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        getDSPControl(),
4041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkU32(0x3f)),
4042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(rs+1)),
4043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x3f))));
4044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t2),
4045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
4046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     binop(Iop_And32,
4047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                           getDSPControl(),
4048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                           mkU32(0xffffbfff)),
4049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkU32(0x4000)),
4050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkexpr(t8)));
4051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* If pos <= 31, shift right the value from the acc
4053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        (pos-size) times and take (size+1) bits from the least
4054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        significant positions. Otherwise, shift left the value
4055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        (63-pos) times, take (size+1) bits from the most
4056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        significant positions and shift right (31-size) times.
4057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     */
4058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpLE32U, mkexpr(t1), mkU32(31)));
4059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4,
4061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(mkexpr(t3),
4062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_32to8,
4063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_Sub32,
4064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t1), mkU32(rs))),
4065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_32to8,
4066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_Sub32,
4067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(63), mkexpr(t1)))));
4068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, IRExpr_ITE(mkexpr(t3),
4070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Shr64,
4071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t0), mkexpr(t4)),
4072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Shl64,
4073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t0), mkexpr(t4))));
4074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t6 holds a mask for bit extraction. */
4076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6,
4077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(mkexpr(t3),
4078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_Not64,
4079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_Shl64,
4080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0xffffffffffffffffULL),
4081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU8(rs+1))),
4082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_Not64,
4083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_Shr64,
4084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0xffffffffffffffffULL),
4085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU8(rs+1)))));
4086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, IRExpr_ITE(mkexpr(t3),
4088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_64to32,
4089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                binop(Iop_And64,
4090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkexpr(t5),
4091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkexpr(t6))),
4092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Shr32,
4093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_64HIto32,
4094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      binop(Iop_And64,
4095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t5),
4096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t6))),
4097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU8(31-rs))));
4098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rt, mkexpr(t7));
4100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
4101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
4102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xB: {  /* EXTPDPV */
4103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("extpdpv r%d, ac%d, r%d", rt, ac, rs);
4104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
4105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
4106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
4107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
4108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
4109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I8);
4110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I64);
4111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I64);
4112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I32);
4113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I32);
4114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I32);
4115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8, binop(Iop_And32, getIReg(rs), mkU32(0x1f)));
4117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, getAcc(ac));
4118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Extract pos field of DSPControl register. */
4119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_And32, getDSPControl(), mkU32(0x3f)));
4120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Check if (pos - size) >= 0 [size <= pos]
4122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        if (pos < size)
4123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           put 1 to EFI field of DSPControl register
4124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        else
4125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           extract bits from acc and put 0 to EFI field of
4126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           DSPCtrl */
4127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpLT32U, mkexpr(t1), mkexpr(t8)));
4128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t9, binop(Iop_Or32,
4130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
4131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getDSPControl(),
4132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0xffffbfc0)),
4133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
4134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_Sub32,
4135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  binop(Iop_And32,
4136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        getDSPControl(),
4137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkU32(0x3f)),
4138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  binop(Iop_Add32,
4139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkexpr(t8),
4140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkU32(0x1))),
4141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x3f))));
4142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t2),
4143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
4144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_And32,
4145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          getDSPControl(),
4146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU32(0xffffbfff)),
4147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x4000)),
4148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkexpr(t9)));
4149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* If pos <= 31, shift right the value from the acc
4151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        (pos-size) times and take (size+1) bits from the least
4152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        significant positions. Otherwise, shift left the value
4153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        (63-pos) times, take (size+1) bits from the most
4154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        significant positions and shift right (31-size) times.
4155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     */
4156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpLE32U, mkexpr(t1), mkU32(31)));
4157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4,
4159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(mkexpr(t3),
4160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to8,
4161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Sub32,
4162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t1), mkexpr(t8))),
4163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to8,
4164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Sub32,
4165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(63), mkexpr(t1)))));
4166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, IRExpr_ITE(mkexpr(t3),
4168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Shr64,
4169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t0), mkexpr(t4)),
4170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Shl64,
4171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t0), mkexpr(t4))));
4172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t6 holds a mask for bit extraction. */
4174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6,
4175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(mkexpr(t3),
4176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_Not64,
4177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_Shl64,
4178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0xffffffffffffffffULL),
4179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_32to8,
4180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       binop(Iop_Add32,
4181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkexpr(t8),
4182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU32(1))))),
4183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_Not64,
4184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_Shr64,
4185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0xffffffffffffffffULL),
4186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_32to8,
4187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       binop(Iop_Add32,
4188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkexpr(t8),
4189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU32(1)))))));
4190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, IRExpr_ITE(mkexpr(t3),
4192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_64to32,
4193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                binop(Iop_And64,
4194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkexpr(t5),
4195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkexpr(t6))),
4196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Shr32,
4197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_64HIto32,
4198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      binop(Iop_And64,
4199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t5),
4200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t6))),
4201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_32to8,
4202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      binop(Iop_Sub32,
4203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkU32(31),
4204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t8))))));
4205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rt, mkexpr(t7));
4207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
4208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
4209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xE: {  /* EXTR_S.H */
4210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("extr_s.h r%d, ac%d, %d", rt, ac, rs);
4211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
4212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
4213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I64);
4214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
4215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I64);
4216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I32);
4217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I32);
4218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I64);
4219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I32);
4220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I32);
4221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, getAcc(ac));
4223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_Sar64, mkexpr(t0), mkU8(rs)));
4225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_Or32,
4227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getDSPControl(), mkU32(0x00800000)));
4228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t9, binop(Iop_And32,
4230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64to32,
4231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t1)),
4232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x80000000)));
4233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpNE32,
4234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t9),
4235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_And32,
4236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          unop(Iop_64HIto32,
4237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkexpr(t0)),
4238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU32(0x80000000))),
4239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkexpr(t2),
4240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
4241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Check if t1 > 0x7fff ((t1 - 0x7fff) > 0)
4243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        1. subtract 0x7fff from t1
4244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        2. if the resulting number is positive (sign bit = 0)
4245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           and any of the other bits is 1, the value is > 0. */
4246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_Sub64,
4247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkexpr(t1),
4248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU64(0x0000000000007fffULL)));
4249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, binop(Iop_And32,
4250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_Or32,
4251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32,
4252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_CmpNE32,
4253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0),
4254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       binop(Iop_And32,
4255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             unop(Iop_64HIto32,
4256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                  mkexpr(t3)),
4257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU32(0x7fffffff)))),
4258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32,
4259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_CmpNE32,
4260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0),
4261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_64to32,
4262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t3))))),
4263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_1Sto32,
4264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_CmpEQ32,
4265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  binop(Iop_And32,
4266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        unop(Iop_64HIto32,
4267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                  mkexpr(t3)),
4268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU32(0x80000000)),
4269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0)))));
4270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpNE32,
4271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0),
4272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t4)),
4273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
4274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
4275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00800000)),
4276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
4277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Check if t1<0xffffffffffff8000 (0xffffffffffff8000-t1)>0
4278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        1. subtract t1 from 0xffffffffffff8000
4279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        2. if the resulting number is positive (sign bit = 0)
4280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            and any of the other bits is 1, the value is > 0 */
4281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, binop(Iop_Sub64,
4282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkU64(0xffffffffffff8000ULL),
4283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t1)));
4284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, binop(Iop_And32,
4285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Or32,
4286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32,
4287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_CmpNE32,
4288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0),
4289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       binop(Iop_And32,
4290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             unop(Iop_64HIto32,
4291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                  mkexpr(t6)),
4292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU32(0x7fffffff)))),
4293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32,
4294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_CmpNE32,
4295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0),
4296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_64to32,
4297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t6))))),
4298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_1Sto32,
4299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_CmpEQ32,
4300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  binop(Iop_And32,
4301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        unop(Iop_64HIto32,
4302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                  mkexpr(t6)),
4303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU32(0x80000000)),
4304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0)))));
4305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpNE32,
4306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0),
4307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t7)),
4308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
4309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
4310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00800000)),
4311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
4312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rt, IRExpr_ITE(binop(Iop_CmpNE32,
4313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0),
4314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t4)),
4315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x00007fff),
4316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            IRExpr_ITE(binop(Iop_CmpNE32,
4317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU32(0),
4318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkexpr(t7)),
4319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0xffff8000),
4320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_64to32,
4321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t1)))));
4322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
4323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
4324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xF: {  /* EXTRV_S.H */
4325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("extrv_s.h r%d, ac%d, %d", rt, ac, rs);
4326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
4327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
4328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I64);
4329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
4330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I64);
4331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I32);
4332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I32);
4333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I64);
4334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I32);
4335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I32);
4336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, getAcc(ac));
4338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_Sar64,
4340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkexpr(t0),
4341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to8,
4342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_And32,
4343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 getIReg(rs),
4344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x1f)))));
4345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_Or32,
4347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getDSPControl(), mkU32(0x00800000)));
4348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t9, binop(Iop_And32,
4350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64to32,
4351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t1)),
4352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x80000000)));
4353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpNE32,
4354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t9),
4355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_And32,
4356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          unop(Iop_64HIto32,
4357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkexpr(t0)),
4358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU32(0x80000000))),
4359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkexpr(t2),
4360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
4361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Check if t1 > 0x7fff ((t1 - 0x7fff) > 0)
4363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        1. subtract 0x7fff from t1
4364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        2. if the resulting number is positive (sign bit = 0)
4365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           and any of the other bits is 1, the value is > 0. */
4366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_Sub64,
4367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkexpr(t1),
4368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU64(0x0000000000007fffULL)));
4369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, binop(Iop_And32,
4370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_Or32,
4371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32,
4372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_CmpNE32,
4373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0),
4374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       binop(Iop_And32,
4375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             unop(Iop_64HIto32,
4376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                  mkexpr(t3)),
4377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU32(0x7fffffff)))),
4378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32,
4379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_CmpNE32,
4380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0),
4381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_64to32,
4382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t3))))),
4383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_1Sto32,
4384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_CmpEQ32,
4385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  binop(Iop_And32,
4386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        unop(Iop_64HIto32,
4387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                  mkexpr(t3)),
4388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU32(0x80000000)),
4389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0)))));
4390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpNE32,
4391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0),
4392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t4)),
4393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
4394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
4395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00800000)),
4396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
4397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Check if t1<0xffffffffffff8000 (0xffffffffffff8000-t1)>0
4398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        1. subtract t1 from 0xffffffffffff8000
4399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        2. if the resulting number is positive (sign bit = 0)
4400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            and any of the other bits is 1, the value is > 0 */
4401436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, binop(Iop_Sub64,
4402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkU64(0xffffffffffff8000ULL),
4403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t1)));
4404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, binop(Iop_And32,
4405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Or32,
4406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32,
4407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_CmpNE32,
4408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0),
4409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       binop(Iop_And32,
4410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             unop(Iop_64HIto32,
4411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                  mkexpr(t6)),
4412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU32(0x7fffffff)))),
4413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32,
4414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_CmpNE32,
4415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0),
4416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_64to32,
4417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t6))))),
4418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_1Sto32,
4419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_CmpEQ32,
4420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  binop(Iop_And32,
4421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        unop(Iop_64HIto32,
4422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                  mkexpr(t6)),
4423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU32(0x80000000)),
4424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0)))));
4425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpNE32,
4426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0),
4427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t7)),
4428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
4429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
4430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00800000)),
4431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
4432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rt, IRExpr_ITE(binop(Iop_CmpNE32,
4433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0),
4434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t4)),
4435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x00007fff),
4436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            IRExpr_ITE(binop(Iop_CmpNE32,
4437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU32(0),
4438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkexpr(t7)),
4439436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0xffff8000),
4440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_64to32,
4441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t1)))));
4442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
4443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
4444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x12: {  /* RDDSP*/
4445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("rddsp r%d, mask 0x%x", rd, rddsp_mask);
4446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
4447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4448436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, mkU32(0x0));
4449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if ((rddsp_mask & 0x1) == 0x1) {
4451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        /* Read pos field (bits 5-0) of DSPControl register. */
4452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rd, binop(Iop_Or32,
4453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          getIReg(rd),
4454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          binop(Iop_And32,
4455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                getDSPControl(),
4456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                mkU32(0x0000003F))));
4457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
4458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if ((rddsp_mask & 0x2) == 0x2) {
4460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        /* Read scount field (bits 12-7) of DSPControl
4461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           register. */
4462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rd, binop(Iop_Or32,
4463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          getIReg(rd),
4464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          binop(Iop_And32,
4465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                getDSPControl(),
4466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                mkU32(0x00001F80))));
4467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
4468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if ((rddsp_mask & 0x4) == 0x4) {
4470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        /* Read C field (bit 13) of DSPControl register. */
4471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rd, binop(Iop_Or32,
4472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          getIReg(rd),
4473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          binop(Iop_And32,
4474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                getDSPControl(),
4475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                mkU32(0x00002000))));
4476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
4477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if ((rddsp_mask & 0x8) == 0x8) {
4479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        /* Read outflag field (bit s 23-16) of DSPControl
4480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           register. */
4481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rd, binop(Iop_Or32,
4482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          getIReg(rd),
4483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          binop(Iop_And32,
4484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                getDSPControl(),
4485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                mkU32(0x00FF0000))));
4486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
4487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if ((rddsp_mask & 0x10) == 0x10) {
4489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        /* Read ccond field (bits 31-24) of DSPControl
4490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           register. */
4491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rd, binop(Iop_Or32,
4492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          getIReg(rd),
4493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          binop(Iop_And32,
4494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                getDSPControl(),
4495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                mkU32(0xFF000000))));
4496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
4497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if ((rddsp_mask & 0x20) == 0x20) {
4499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        /* Read EFI field (bit 14) of DSPControl register. */
4500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rd, binop(Iop_Or32,
4501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          getIReg(rd),
4502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          binop(Iop_And32,
4503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                getDSPControl(),
4504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                mkU32(0x00004000))));
4505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
4506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if ((rddsp_mask & 0x3f) == 0x3f) {
4508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        /* Read all fields of DSPControl register. */
4509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rd, getDSPControl());
4510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
4511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
4512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
4513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x13: {  /* WRDSP */
4514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("wrdsp r%d, mask 0x%x", rs, wrdsp_mask);
4515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
4516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if ((wrdsp_mask & 0x3f) == 0x3f) {
4518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        /* If mips64 put all fields of rs, except bit 15 and bit
4519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           6, to DSPControl register, otherwise put all except
4520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           bits 15, 6 and bits 31..28. */
4521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putDSPControl(mode64 ?
4522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
4523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(rs),
4524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0xffff7fbf)) :
4525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
4526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(rs),
4527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x0fff7fbf)));
4528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
4529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        if ((wrdsp_mask & 0x1) == 0x1) {
4530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           /* Put bits 5-0 of rs to DSPControl register pos
4531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              field. */
4532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           putDSPControl(binop(Iop_Or32,
4533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               binop(Iop_And32,
4534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getDSPControl(),
4535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkU32(0xFFFF7F40)),
4536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               binop(Iop_And32,
4537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs),
4538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkU32(0x0000003F))));
4539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        }
4540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        if ((wrdsp_mask & 0x2) == 0x2) {
4542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           /* Put bits 12-7 of rs to DSPControl scount field. */
4543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           putDSPControl(binop(Iop_Or32,
4544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               binop(Iop_And32,
4545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getDSPControl(),
4546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkU32(0xFFFFE03F)),
4547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               binop(Iop_And32,
4548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs),
4549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkU32(0x00001F80))));
4550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        }
4551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        if ((wrdsp_mask & 0x4) == 0x4) {
4553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           /* Put bit 13 of rs to DSPControl register C
4554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              field. */
4555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           putDSPControl(binop(Iop_Or32,
4556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               binop(Iop_And32,
4557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getDSPControl(),
4558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkU32(0xFFFF5FBF)),
4559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               binop(Iop_And32,
4560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs),
4561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkU32(0x00002000))));
4562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        }
4563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        if ((wrdsp_mask & 0x8) == 0x8) {
4565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           /* Put bits 23-16 of rs to DSPControl reg outflag
4566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              field. */
4567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           putDSPControl(binop(Iop_Or32,
4568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               binop(Iop_And32,
4569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getDSPControl(),
4570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkU32(0xFF007FBF)),
4571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               binop(Iop_And32,
4572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs),
4573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkU32(0x00FF0000))));
4574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        }
4575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        if ((wrdsp_mask & 0x10) == 0x10) {
4577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           /* Put bits 31-24 of rs to DSPControl reg ccond
4578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              field. */
4579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           putDSPControl(binop(Iop_Or32,
4580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               binop(Iop_And32,
4581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getDSPControl(),
4582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkU32(0x00FF7FBF)),
4583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               binop(Iop_And32,
4584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs),
4585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mode64 ? mkU32(0xFF000000)
4586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            : mkU32(0x0F000000))
4587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               )
4588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        );
4589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        }
4590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        if ((wrdsp_mask & 0x20) == 0x20) {
4592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           /* Put bit 14 of rs to DSPControl register EFI
4593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              field. */
4594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           putDSPControl(binop(Iop_Or32,
4595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               binop(Iop_And32,
4596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getDSPControl(),
4597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkU32(0xFFFF3FBF)),
4598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               binop(Iop_And32,
4599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs),
4600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkU32(0x00004000))));
4601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        }
4602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
4603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
4604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
4605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x1A: {  /* SHILO */
4606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("shilo ac%d, %d", ac, shift);
4607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
4608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
4609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I64);
4610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, getAcc(ac));
4612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putAcc(ac, mkexpr(t0));
4614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (0x20 == (shift & 0x3f)) {
4616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putAcc(ac, binop(Iop_32HLto64,
4617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         unop(Iop_64to32, mkexpr(t0)),
4618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkU32(0x0)));
4619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else if (0x20 == (shift & 0x20)) {
4620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t1, binop(Iop_Shl64,
4621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkexpr(t0),
4622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         unop(Iop_32to8,
4623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Add32,
4624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    unop(Iop_Not32,
4625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkU32(shift)),
4626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x1)))));
4627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putAcc(ac, mkexpr(t1));
4629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
4630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t1, binop(Iop_Shr64, mkexpr(t0), mkU8(shift)));
4631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putAcc(ac, mkexpr(t1));
4633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
4634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
4635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
4636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x1B: {  /* SHILOV */
4637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("shilov ac%d, r%d", ac, rs);
4638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
4639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
4640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
4641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
4642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I64);
4643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I64);
4644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, getAcc(ac));
4646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_And32, getIReg(rs), mkU32(0x3f)));
4647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpEQ32, mkexpr(t1), mkU32(0x20)));
4648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_Shl64,
4649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkexpr(t0),
4650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to8,
4651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Add32,
4652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_Not32,
4653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkexpr(t1)),
4654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x1)))));
4655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, binop(Iop_Shr64,
4656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkexpr(t0),
4657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to8,
4658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t1))));
4659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putAcc(ac,
4661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(mkexpr(t2),
4662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_32HLto64,
4663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             unop(Iop_64to32, mkexpr(t0)),
4664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU32(0x0)),
4665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       IRExpr_ITE(binop(Iop_CmpEQ32,
4666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        binop(Iop_And32,
4667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              mkexpr(t1),
4668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              mkU32(0x20)),
4669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkU32(0x20)),
4670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t3),
4671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t4))));
4672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
4673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
4674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x1F: {  /* MTHLIP */
4675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("mthlip r%d, ac%d", rs, ac);
4676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
4677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
4678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
4679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
4680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
4681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, getAcc(ac));
4683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putAcc(ac, binop(Iop_32HLto64,
4684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64to32, mkexpr(t0)),
4685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg(rs)));
4686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_And32, getDSPControl(), mkU32(0x3f)));
4687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpLE32U,
4688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(32),
4689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t1)),
4690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
4691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_Sub32,
4692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkexpr(t1),
4693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU32(32)),
4694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   binop(Iop_And32,
4695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getDSPControl(),
4696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkU32(0xffffffc0))),
4697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
4698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_Add32,
4699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkexpr(t1),
4700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU32(32)),
4701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_And32,
4702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          getDSPControl(),
4703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU32(0xffffffc0)))));
4704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
4705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
4706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
4707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     return -1;
4708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
4709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;  /* end of EXTR.W */
4710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
4711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0xA: {  /* LX */
4712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               switch(sa) {
4713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x0: {  /* LWX */
4714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("lwx r%d, r%d(r%d)", rd, rt, rs);
4715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
4716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
4717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_Add32, getIReg(rt), getIReg(rs)));
4719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, load(Ity_I32, mkexpr(t0)));
4721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
4722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
4723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x4: {  /* LHX */
4724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("lhx r%d, r%d(r%d)", rd, rt, rs);
4725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
4726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
4727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_Add32, getIReg(rt), getIReg(rs)));
4729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, unop(Iop_16Sto32, load(Ity_I16, mkexpr(t0))));
4731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
4732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
4733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x6: {  /* LBUX */
4734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("lbux r%d, r%d(r%d)", rd, rt, rs);
4735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
4736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
4737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_Add32, getIReg(rt), getIReg(rs)));
4739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, unop(Iop_8Uto32, load(Ity_I8, mkexpr(t0))));
4741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
4742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
4743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
4744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     return -1;
4745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
4746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;  /* end of LX */
4747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
4748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0xC: {  /* INSV */
4749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               switch(sa) {
4750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x0: {  /* INSV */
4751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("insv r%d, r%d", rt, rs);
4752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
4753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
4755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
4756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I8);
4757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I8);
4758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I32);
4759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I1);
4760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I32);
4761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I32);
4762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I32);
4763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I32);
4764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t0 <- pos field of DSPControl register. */
4766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_And32, getDSPControl(), mkU32(0x3f)));
4767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t1 <- scount field of DSPControl register. */
4768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_Shr32,
4769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
4770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getDSPControl(),
4771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x1f80)),
4772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU8(7)));
4773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, unop(Iop_32to8,
4775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Add32,
4776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t1),
4777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t0))));
4778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* 32-(pos+size) most significant bits of rt. */
4780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, binop(Iop_Shl32,
4781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shr32,
4782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(rt),
4783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t2)),
4784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkexpr(t2)));
4785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, unop(Iop_32to8,
4787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Sub32,
4788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(32),
4789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t0))));
4790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Pos least significant bits of rt. */
4791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, binop(Iop_Shr32,
4792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shl32,
4793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(rt),
4794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t3)),
4795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkexpr(t3)));
4796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Size least significant bits of rs,
4798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        shifted to appropriate position. */
4799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8, binop(Iop_Shl32,
4800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
4801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(rs),
4802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_Not32,
4803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Shl32,
4804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0xffffffff),
4805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_32to8,
4806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t1))))),
4807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to8,
4808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t0))));
4809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rt, IRExpr_ITE(binop(Iop_CmpEQ32,
4811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t0),
4812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0)),
4813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            IRExpr_ITE(binop(Iop_CmpEQ32,
4814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkexpr(t1),
4815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU32(32)),
4816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       getIReg(rs),
4817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       binop(Iop_Or32,
4818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkexpr(t6),
4819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkexpr(t8))),
4820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            IRExpr_ITE(binop(Iop_CmpEQ32,
4821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             unop(Iop_8Uto32,
4822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                  mkexpr(t2)),
4823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU32(32)),
4824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       binop(Iop_Or32,
4825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkexpr(t7),
4826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkexpr(t8)),
4827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       binop(Iop_Or32,
4828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             binop(Iop_Or32,
4829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                   mkexpr(t6),
4830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                   mkexpr(t7)),
4831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkexpr(t8)))));
4832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
4833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
4834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
4835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     return -1;
4836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
4837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;  /* enf of INSV */
4838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
4839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x10: {  /* ADDU.QB */
4840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               switch(sa) {
4841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x00: {  /* ADDU.QB */
4842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("addu.qb r%d, r%d, r%d", rd, rs, rt);
4843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
4844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
4845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
4846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
4847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
4848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I32);
4849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I1);
4850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I32);
4851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I1);
4852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I32);
4853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4854436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Add rightmost bytes of rs and rt. */
4855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0,
4856436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Add32,
4857436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
4858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16to8,
4859436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rs)))),
4860436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
4861436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16to8,
4862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rt))))));
4863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t1 will be 1 if there is overflow, 0 otherwise. */
4864436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpEQ32,
4865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
4866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t0),
4867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x00000100)),
4868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00000100)));
4869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Add bits 15-8 of rs and rt. */
4871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2,
4872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Add32,
4873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
4874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16HIto8,
4875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rs)))),
4876436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
4877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16HIto8,
4878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rt))))));
4879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t3 will be 1 if there is overflow, 0 otherwise. */
4880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpEQ32,
4881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
4882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t2),
4883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x00000100)),
4884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00000100)));
4885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Add bits 15-8 of rs and rt. */
4887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4,
4888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Add32,
4889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
4890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16to8,
4891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rs)))),
4892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
4893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16to8,
4894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rt))))));
4895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t5 will be 1 if there is overflow, 0 otherwise. */
4896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, binop(Iop_CmpEQ32,
4897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
4898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t4),
4899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x00000100)),
4900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00000100)));
4901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Add bits 15-8 of rs and rt. */
4903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6,
4904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Add32,
4905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
4906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16HIto8,
4907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rs)))),
4908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
4909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16HIto8,
4910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rt))))));
4911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t7 will be 1 if there is overflow, 0 otherwise. */
4912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, binop(Iop_CmpEQ32,
4913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
4914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t6),
4915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x00000100)),
4916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00000100)));
4917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8,
4919436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Or32,
4920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  binop(Iop_Or32,
4921436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_Or32,
4922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_1Sto32, mkexpr(t7)),
4923436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_1Sto32,  mkexpr(t5))),
4924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        unop(Iop_1Sto32, mkexpr(t3))),
4925436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_1Sto32, mkexpr(t1))));
4926436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpEQ32,
4928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t8),
4929436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x0)),
4930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl(),
4931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
4932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
4933436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00100000))));
4934436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_16HLto32,
4936436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_8HLto16,
4937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             unop(Iop_32to8, mkexpr(t6)),
4938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             unop(Iop_32to8, mkexpr(t4))),
4939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_8HLto16,
4940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             unop(Iop_32to8, mkexpr(t2)),
4941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             unop(Iop_32to8, mkexpr(t0)))));
4942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
4943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
4944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x1: {  /* SUBU.QB */
4945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("subu.qb r%d, r%d, r%d", rd, rs, rt);
4946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
4947436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
4948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
4949436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
4950436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
4951436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I32);
4952436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I1);
4953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I32);
4954436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I1);
4955436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I32);
4956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Subtract rightmost bytes of rs and rt. */
4958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0,
4959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Sub32,
4960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
4961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16to8,
4962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rs)))),
4963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
4964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16to8,
4965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rt))))));
4966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t1 will be 1 if there is overflow, 0 otherwise. */
4967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpEQ32,
4968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
4969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t0),
4970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x00000100)),
4971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00000100)));
4972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Subtract bits 15-8 of rs and rt. */
4974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2,
4975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Sub32,
4976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
4977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16HIto8,
4978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rs)))),
4979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
4980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16HIto8,
4981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rt))))));
4982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t3 will be 1 if there is overflow, 0 otherwise. */
4983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpEQ32,
4984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
4985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t2),
4986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x00000100)),
4987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00000100)));
4988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
4989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Subtract bits 15-8 of rs and rt. */
4990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4,
4991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Sub32,
4992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
4993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16to8,
4994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rs)))),
4995436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
4996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16to8,
4997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rt))))));
4998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t5 will be 1 if there is overflow, 0 otherwise. */
4999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, binop(Iop_CmpEQ32,
5000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
5001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t4),
5002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x00000100)),
5003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00000100)));
5004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Subtract bits 15-8 of rs and rt. */
5006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6,
5007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Sub32,
5008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
5009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16HIto8,
5010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rs)))),
5011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
5012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16HIto8,
5013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rt))))));
5014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t7 will be 1 if there is overflow, 0 otherwise. */
5015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, binop(Iop_CmpEQ32,
5016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
5017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t6),
5018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x00000100)),
5019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00000100)));
5020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8, binop(Iop_Or32,
5022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Or32,
5023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_Or32,
5024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_1Sto32, mkexpr(t7)),
5025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_1Sto32, mkexpr(t5))),
5026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_1Sto32, mkexpr(t3))),
5027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_1Sto32, mkexpr(t1))));
5028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpEQ32,
5030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkexpr(t8),
5031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkU32(0x0)),
5032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl(),
5033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
5034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
5035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00100000))));
5036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_16HLto32,
5038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_8HLto16,
5039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             unop(Iop_32to8, mkexpr(t6)),
5040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             unop(Iop_32to8, mkexpr(t4))),
5041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_8HLto16,
5042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             unop(Iop_32to8, mkexpr(t2)),
5043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             unop(Iop_32to8, mkexpr(t0)))));
5044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
5045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
5046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x04: {  /* ADDU_S.QB */
5047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("addu_s.qb r%d, r%d, r%d", rd, rs, rt);
5048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
5049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
5050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
5051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I8);
5052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I32);
5053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I1);
5054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I8);
5055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I32);
5056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I1);
5057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I8);
5058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I32);
5059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t10 = newTemp(Ity_I1);
5060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t11 = newTemp(Ity_I8);
5061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t12 = newTemp(Ity_I32);
5062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Add rightmost bytes of rs and rt. */
5064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0,
5065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Add32,
5066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
5067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16to8,
5068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rs)))),
5069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
5070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16to8,
5071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rt))))));
5072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t1 will be 1 if there is overflow, 0 otherwise. */
5073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpEQ32,
5074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
5075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t0),
5076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x00000100)),
5077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00000100)));
5078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Saturate if necessary. */
5079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, IRExpr_ITE(mkexpr(t1),
5080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(0xff),
5081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to8, mkexpr(t0))));
5082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Add bits 15-8 of rs and rt. */
5084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3,
5085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Add32,
5086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
5087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16HIto8,
5088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rs)))),
5089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
5090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16HIto8,
5091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rt))))));
5092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t4 will be 1 if there is overflow, 0 otherwise. */
5093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, binop(Iop_CmpEQ32,
5094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
5095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t3),
5096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x00000100)),
5097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00000100)));
5098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Saturate if necessary. */
5099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, IRExpr_ITE(mkexpr(t4),
5100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(0xff),
5101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to8, mkexpr(t3))));
5102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Add bits 15-8 of rs and rt. */
5104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6,
5105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Add32,
5106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
5107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16to8,
5108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rs)))),
5109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
5110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16to8,
5111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rt))))));
5112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t7 will be 1 if there is overflow, 0 otherwise. */
5113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, binop(Iop_CmpEQ32,
5114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
5115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t6),
5116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x00000100)),
5117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00000100)));
5118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Saturate if necessary. */
5119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8, IRExpr_ITE(mkexpr(t7),
5120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(0xff),
5121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to8, mkexpr(t6))));
5122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Add bits 15-8 of rs and rt. */
5124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t9,
5125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Add32,
5126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
5127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16HIto8,
5128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rs)))),
5129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
5130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16HIto8,
5131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rt))))));
5132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t10 will be 1 if there is overflow, 0 otherwise. */
5133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t10, binop(Iop_CmpEQ32,
5134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_And32,
5135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkexpr(t9),
5136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU32(0x00000100)),
5137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkU32(0x00000100)));
5138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Saturate if necessary. */
5139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t11, IRExpr_ITE(mkexpr(t10),
5140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(0xff),
5141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to8, mkexpr(t9))));
5142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t12,
5144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Or32,
5145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  binop(Iop_Or32,
5146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_Or32,
5147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_1Sto32, mkexpr(t10)),
5148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_1Sto32, mkexpr(t7))),
5149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        unop(Iop_1Sto32, mkexpr(t4))),
5150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_1Sto32, mkexpr(t1))));
5151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpEQ32,
5153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t12),
5154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x0)),
5155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl(),
5156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
5157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
5158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00100000))));
5159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd,
5161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             binop(Iop_16HLto32,
5162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   binop(Iop_8HLto16, mkexpr(t11), mkexpr(t8)),
5163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   binop(Iop_8HLto16, mkexpr(t5), mkexpr(t2))));
5164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
5165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
5166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x05: {  /* SUBU_S.QB */
5167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("subu_s.qb r%d, r%d, r%d", rd, rs, rt);
5168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
5169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
5170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
5171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
5172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I1);
5173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I1);
5174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I32);
5175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I32);
5176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I32);
5177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I32);
5178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Use C function to easily calculate the result
5180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        and write it in the register more conveniently
5181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        Underflow is checked using step by step subtraction. */
5182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_QSub8Ux4, getIReg(rs), getIReg(rt)));
5183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Subtract each byte of rs and rt. */
5185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6,
5186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Sub32,
5187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
5188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16to8,
5189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rs)))),
5190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
5191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16to8,
5192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rt))))));
5193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7,
5194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Sub32,
5195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
5196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16HIto8,
5197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rs)))),
5198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
5199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16HIto8,
5200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rt))))));
5201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8,
5202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Sub32,
5203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
5204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16to8,
5205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rs)))),
5206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
5207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16to8,
5208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rt))))));
5209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t9,
5210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Sub32,
5211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
5212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16HIto8,
5213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rs)))),
5214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
5215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16HIto8,
5216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rt))))));
5217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Put 1 to bit 20 in DSPControl if there is underflow
5219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        in either byte. */
5220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpEQ32,
5221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
5222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t6),
5223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x00000100)),
5224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00000100)));
5225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t2),
5226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
5227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
5228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00100000)),
5229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
5230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpEQ32,
5231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
5232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t7),
5233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x00000100)),
5234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00000100)));
5235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t3),
5236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
5237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
5238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00100000)),
5239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
5240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, binop(Iop_CmpEQ32,
5241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
5242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t8),
5243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x00000100)),
5244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00000100)));
5245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t4),
5246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
5247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
5248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00100000)),
5249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
5250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, binop(Iop_CmpEQ32,
5251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
5252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t9),
5253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x00000100)),
5254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00000100)));
5255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t5),
5256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
5257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
5258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00100000)),
5259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
5260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, mkexpr(t1));
5261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
5262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
5263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x6: {  /* MULEU_S.PH.QBL */
5264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("muleu_s.ph.qbl r%d, r%d, r%d", rd, rs, rt);
5265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
5266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
5267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
5268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
5269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
5270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0,
5272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            unop(Iop_64to32,
5273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 binop(Iop_MullU32,
5274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_8Uto32,
5275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_16HIto8,
5276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_32HIto16,
5277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      getIReg(rs)))),
5278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16Uto32,
5279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rt))))));
5280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1,
5281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            unop(Iop_64to32,
5282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 binop(Iop_MullU32,
5283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_8Uto32,
5284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_16to8,
5285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_32HIto16,
5286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      getIReg(rs)))),
5287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16Uto32,
5288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rt))))));
5289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpNE32,
5291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x0),
5292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
5293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t0),
5294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x03ff0000))));
5295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpNE32,
5296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x0),
5297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
5298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t1),
5299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x03ff0000))));
5300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t2),
5301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
5302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
5303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x200000)),
5304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(mkexpr(t3),
5305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_Or32,
5306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               getDSPControl(),
5307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0x200000)),
5308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getDSPControl())));
5309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd,
5310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             binop(Iop_16HLto32,
5311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   IRExpr_ITE(mkexpr(t2),
5312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkU16(0xffff),
5313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_32to16, mkexpr(t0))),
5314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   IRExpr_ITE(mkexpr(t3),
5315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkU16(0xffff),
5316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_32to16, mkexpr(t1)))));
5317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
5318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
5319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x7: {  /* MULEU_S.PH.QBR */
5320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("muleu_s.ph.qbr r%d, r%d, r%d", rd, rs, rt);
5321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
5322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
5323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
5324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
5325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
5326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, unop(Iop_64to32,
5328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_MullU32,
5329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_8Uto32,
5330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_16HIto8,
5331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     unop(Iop_32to16,
5332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          getIReg(rs)))),
5333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16Uto32,
5334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
5335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
5336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, unop(Iop_64to32,
5337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_MullU32,
5338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_8Uto32,
5339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_16to8,
5340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     unop(Iop_32to16,
5341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          getIReg(rs)))),
5342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16Uto32,
5343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16,
5344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
5345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpNE32,
5347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x0),
5348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
5349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t0),
5350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x03ff0000))));
5351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpNE32,
5352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x0),
5353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
5354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t1),
5355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x03ff0000))));
5356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t2),
5357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
5358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
5359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x200000)),
5360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(mkexpr(t3),
5361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_Or32,
5362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               getDSPControl(),
5363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0x200000)),
5364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getDSPControl())));
5365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_16HLto32,
5366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       IRExpr_ITE(mkexpr(t2),
5367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU16(0xffff),
5368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_32to16,
5369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t0))),
5370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       IRExpr_ITE(mkexpr(t3),
5371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU16(0xffff),
5372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_32to16,
5373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t1)))));
5374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
5375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
5376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x08: {  /* ADDU.PH */
5377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("addu.ph r%d, r%d, r%d", rd, rs, rt);
5378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
5379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
5380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
5381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
5382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
5383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Add lower halves. */
5385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_Add32,
5386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
5387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rs))),
5388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
5389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rt)))));
5390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Detect overflow. */
5392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpLT32U,
5393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
5394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, mkexpr(t0))),
5395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
5396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rs)))));
5397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t1),
5399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
5400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
5401436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00100000)),
5402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
5403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Add higher halves. */
5405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_Add32,
5406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
5407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rs))),
5408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
5409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rt)))));
5410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Detect overflow. */
5412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpLT32U,
5413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
5414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, mkexpr(t2))),
5415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
5416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16,
5417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                getIReg(rs)))));
5418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t3),
5420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
5421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
5422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00100000)),
5423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
5424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_16HLto32,
5426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_32to16, mkexpr(t2)),
5427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_32to16, mkexpr(t0))));
5428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
5429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
5430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x9: {  /* SUBU.PH */
5431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("subu.ph r%d, r%d, r%d", rd, rs, rt);
5432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
5433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
5434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
5435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
5436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
5437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Substract lower halves. */
5439436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_Sub32,
5440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
5441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rs))),
5442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
5443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rt)))));
5444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Detect underflow. */
5446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpNE32,
5447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
5448436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t0),
5449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x00010000)),
5450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x0)));
5451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t1),
5453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
5454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
5455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00100000)),
5456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
5457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Subtract higher halves. */
5459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_Sub32,
5460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
5461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rs))),
5462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
5463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rt)))));
5464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Detect underflow. */
5466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpNE32,
5467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
5468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t2),
5469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x00010000)),
5470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x0)));
5471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t3),
5473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
5474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
5475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00100000)),
5476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
5477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_16HLto32,
5479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_32to16, mkexpr(t2)),
5480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_32to16, mkexpr(t0))));
5481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
5482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
5483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xA: {  /* ADDQ.PH */
5484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("addq.ph r%d, r%d, r%d", rd, rs, rt);
5485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
5486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
5487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
5488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
5489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
5490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I32);
5491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I32);
5492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Add lower halves. */
5494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_Add32,
5495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
5496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rs))),
5497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
5498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rt)))));
5499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Bit 16 of the result. */
5501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, binop(Iop_And32,
5502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
5503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, mkexpr(t0))),
5504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x1)));
5505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Detect overflow. */
5506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpNE32,
5507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shr32,
5508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_And32,
5509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t0),
5510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x8000)),
5511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(15)),
5512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkexpr(t6)));
5513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t1),
5515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
5516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
5517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00100000)),
5518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
5519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Add higher halves. */
5521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_Add32,
5522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
5523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rs))),
5524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
5525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rt)))));
5526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Bit 16 of the result. */
5528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, binop(Iop_And32,
5529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
5530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, mkexpr(t2))),
5531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x1)));
5532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Detect overflow. */
5533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpNE32,
5534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shr32,
5535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_And32,
5536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t2),
5537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x00008000)),
5538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(15)),
5539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkexpr(t7)));
5540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t3),
5542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
5543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
5544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00100000)),
5545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
5546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_16HLto32,
5548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_32to16, mkexpr(t2)),
5549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_32to16, mkexpr(t0))));
5550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
5551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
5552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xB: {  /* SUBQ.PH */
5553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("subq.ph r%d, r%d, r%d", rd, rs, rt);
5554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
5555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
5556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
5557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
5558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
5559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I32);
5560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I32);
5561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Subtract lower halves. */
5563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_Sub32,
5564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
5565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rs))),
5566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
5567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rt)))));
5568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Bit 16 of the result. */
5570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, binop(Iop_And32,
5571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
5572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, mkexpr(t0))),
5573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x1)));
5574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Compare the signs of input value and the result. */
5575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpNE32,
5576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shr32,
5577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_And32,
5578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t0),
5579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x8000)),
5580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(15)),
5581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkexpr(t6)));
5582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t1),
5584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
5585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
5586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00100000)),
5587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
5588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Subtract higher halves. */
5590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_Sub32,
5591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
5592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rs))),
5593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
5594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rt)))));
5595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Bit 16 of the result. */
5597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, binop(Iop_And32,
5598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
5599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, mkexpr(t2))),
5600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x1)));
5601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Compare the signs of input value and the result. */
5602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpNE32,
5603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shr32,
5604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_And32,
5605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t2),
5606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x00008000)),
5607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(15)),
5608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkexpr(t7)));
5609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t3),
5611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
5612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
5613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00100000)),
5614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
5615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_16HLto32,
5617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_32to16, mkexpr(t2)),
5618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_32to16, mkexpr(t0))));
5619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
5620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
5621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xC: {  /* ADDU_S.PH */
5622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("addu_s.ph r%d, r%d, r%d", rd, rs, rt);
5623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
5624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
5625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
5626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
5627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
5628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Add lower halves. */
5630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_Add32,
5631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
5632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rs))),
5633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
5634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rt)))));
5635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Detect overflow. */
5637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpLT32U,
5638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
5639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, mkexpr(t0))),
5640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
5641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rs)))));
5642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t1),
5644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
5645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
5646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00100000)),
5647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
5648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Add higher halves. */
5650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_Add32,
5651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
5652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rs))),
5653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
5654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rt)))));
5655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Detect overflow. */
5657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpLT32U,
5658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
5659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, mkexpr(t2))),
5660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
5661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rs)))));
5662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t3),
5664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
5665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
5666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00100000)),
5667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
5668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_16HLto32,
5670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       IRExpr_ITE(mkexpr(t3),
5671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU16(0xffff),
5672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_32to16,
5673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t2))),
5674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       IRExpr_ITE(mkexpr(t1),
5675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU16(0xffff),
5676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_32to16,
5677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t0)))));
5678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
5679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
5680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xD: {  /* SUBU_S.PH */
5681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("subu_s.ph r%d, r%d, r%d", rd, rs, rt);
5682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
5683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
5684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
5685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
5686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
5687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Subtract lower halves. */
5689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_Sub32,
5690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
5691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rs))),
5692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
5693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rt)))));
5694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Detect underflow. */
5696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpNE32,
5697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
5698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t0), mkU32(0x00010000)),
5699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x0)));
5700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t1),
5702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
5703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
5704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00100000)),
5705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
5706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Subtract higher halves. */
5708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_Sub32,
5709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
5710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rs))),
5711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
5712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rt)))));
5713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Detect underflow. */
5715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpNE32,
5716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
5717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t2), mkU32(0x00010000)),
5718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x0)));
5719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t3),
5721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
5722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
5723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00100000)),
5724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
5725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd,
5727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             binop(Iop_16HLto32,
5728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   IRExpr_ITE(mkexpr(t3),
5729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkU16(0x0000),
5730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_32to16, mkexpr(t2))),
5731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   IRExpr_ITE(mkexpr(t1),
5732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkU16(0x0000),
5733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_32to16, mkexpr(t0)))));
5734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
5735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
5736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xE: {  /* ADDQ_S.PH */
5737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("addq_s.ph r%d r%d, r%d", rd, rs, rt);
5738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
5739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
5740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
5741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
5742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
5743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I16);
5744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I16);
5745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I32);
5746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I32);
5747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Add lower halves. */
5749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_Add32,
5750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
5751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rs))),
5752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
5753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rt)))));
5754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Bit 16 of the result. */
5756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, binop(Iop_And32,
5757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
5758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, mkexpr(t0))),
5759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x1)));
5760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Detect overflow. */
5761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpNE32,
5762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shr32,
5763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_And32,
5764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t0),
5765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x8000)),
5766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(15)),
5767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkexpr(t6)));
5768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t1),
5770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
5771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
5772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00100000)),
5773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
5774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Saturate if needed. */
5775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, IRExpr_ITE(mkexpr(t1),
5776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           IRExpr_ITE(binop(Iop_CmpEQ32,
5777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t6),
5778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkU32(0x0)),
5779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkU16(0x7fff),
5780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkU16(0x8000)),
5781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, mkexpr(t0))));
5782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Add higher halves. */
5784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_Add32,
5785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
5786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rs))),
5787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
5788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rt)))));
5789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Bit 16 of the result. */
5791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, binop(Iop_And32,
5792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
5793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, mkexpr(t2))),
5794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x1)));
5795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Detect overflow. */
5796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpNE32,
5797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shr32,
5798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_And32,
5799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t2),
5800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x00008000)),
5801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(15)),
5802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkexpr(t7)));
5803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t3),
5805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
5806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
5807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00100000)),
5808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
5809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Saturate if needed. */
5810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, IRExpr_ITE(mkexpr(t3),
5811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           IRExpr_ITE(binop(Iop_CmpEQ32,
5812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t7),
5813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkU32(0x0)),
5814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkU16(0x7fff),
5815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkU16(0x8000)),
5816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, mkexpr(t2))));
5817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_16HLto32, mkexpr(t5), mkexpr(t4)));
5819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
5820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
5821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xF: {  /* SUBQ_S.PH */
5822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("subq_s.ph r%d r%d, r%d", rd, rs, rt);
5823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
5824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
5825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
5826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
5827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
5828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I16);
5829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I16);
5830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I32);
5831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I32);
5832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Subtract lower halves. */
5834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_Sub32,
5835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
5836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rs))),
5837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
5838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rt)))));
5839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Bit 16 of the result. */
5841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, binop(Iop_And32,
5842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
5843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, mkexpr(t0))),
5844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x1)));
5845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Detect overflow or underflow. */
5846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpNE32,
5847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shr32,
5848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_And32,
5849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t0),
5850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x8000)),
5851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(15)),
5852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkexpr(t6)));
5853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5854436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t1),
5855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
5856436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
5857436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00100000)),
5858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
5859436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Saturate if needed. */
5860436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, IRExpr_ITE(mkexpr(t1),
5861436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           IRExpr_ITE(binop(Iop_CmpEQ32,
5862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t6),
5863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkU32(0x0)),
5864436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkU16(0x7fff),
5865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkU16(0x8000)),
5866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, mkexpr(t0))));
5867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Subtract higher halves. */
5869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_Sub32,
5870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
5871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rs))),
5872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
5873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rt)))));
5874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Bit 16 of the result. */
5876436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, binop(Iop_And32,
5877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
5878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, mkexpr(t2))),
5879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x1)));
5880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Detect overflow or underflow. */
5881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpNE32,
5882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shr32,
5883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_And32,
5884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t2),
5885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x00008000)),
5886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(15)),
5887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkexpr(t7)));
5888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t3),
5890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
5891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
5892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00100000)),
5893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
5894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Saturate if needed. */
5895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, IRExpr_ITE(mkexpr(t3),
5896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           IRExpr_ITE(binop(Iop_CmpEQ32,
5897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t7),
5898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkU32(0x0)),
5899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkU16(0x7fff),
5900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkU16(0x8000)),
5901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, mkexpr(t2))));
5902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_16HLto32, mkexpr(t5), mkexpr(t4)));
5904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
5905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
5906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x10: {  /* ADDSC */
5907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("addsc r%d, r%d, r%d", rd, rs, rt);
5908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
5909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
5910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
5911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* The carry bit result out of the addition operation is
5913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        written to bit 13(the c field) of the DSPControl reg. */
5914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_Add64,
5915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32Uto64, getIReg(rs)),
5916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32Uto64, getIReg(rt))));
5917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpEQ32,
5919436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
5920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64HIto32, mkexpr(t0)),
5921436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x1)),
5922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x1)));
5923436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t1),
5924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
5925436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
5926436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x2000)),
5927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
5928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
5929436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xffffdfff))));
5930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, unop(Iop_64to32, mkexpr(t0)));
5932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
5933436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
5934436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x11: {  /* ADDWC */
5935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("addwc r%d, r%d, r%d", rd, rs, rt);
5936436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
5937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
5938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I64);
5939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
5940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I32);
5941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I1);
5942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Get carry bit from DSPControl register. */
5944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_Shr32,
5945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_And32,
5946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             getDSPControl(),
5947436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU32(0x2000)),
5948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkU8(0xd)));
5949436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_Add64,
5950436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32Sto64, getIReg(rs)),
5951436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32Sto64,
5952436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Add32,
5953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 getIReg(rt),
5954436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t0)))));
5955436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Extract bits 32 and 31. */
5957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_And32,
5958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64HIto32, mkexpr(t1)),
5959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x1)));
5960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_Shr32,
5961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
5962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64to32, mkexpr(t1)),
5963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x80000000)),
5964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU8(31)));
5965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, binop(Iop_CmpNE32, mkexpr(t2), mkexpr(t3)));
5966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t4),
5968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
5969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
5970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00100000)),
5971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
5972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, unop(Iop_64to32, mkexpr(t1)));
5973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
5974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
5975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x12: {  /* MODSUB */
5976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("modsub r%d, r%d, r%d", rd, rs, rt);
5977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
5978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
5979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
5980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
5981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* decr_7..0 */
5983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0,
5984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            unop(Iop_8Uto32,
5985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 unop(Iop_16to8,
5986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to16, getIReg(rt)))));
5987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
5988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* lastindex_15..0 */
5989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1,
5990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            unop(Iop_16Uto32,
5991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 binop(Iop_8HLto16,
5992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16to8,
5993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rt))),
5994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16HIto8,
5995436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rt))))));
5996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* temp_15..0 */
5997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2,
5998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(binop(Iop_CmpEQ32,
5999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             getIReg(rs),
6000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU32(0x00000000)),
6001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t1),
6002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_Sub32,
6003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             getIReg(rs), mkexpr(t0))));
6004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, mkexpr(t2));
6005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
6006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
6007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x14: {  /* RADDU.W.QB */
6008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("raddu.w.qb r%d, r%d", rd, rs);
6009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
6010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_Add32,
6011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_Add32,
6012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             unop(Iop_8Uto32,
6013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_16to8,
6014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_32to16,
6015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            getIReg(rs)))),
6016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             unop(Iop_8Uto32,
6017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_16HIto8,
6018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_32to16,
6019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            getIReg(rs))))),
6020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_Add32,
6021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             unop(Iop_8Uto32,
6022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_16to8,
6023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_32HIto16,
6024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            getIReg(rs)))),
6025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             unop(Iop_8Uto32,
6026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_16HIto8,
6027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_32HIto16,
6028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            getIReg(rs)))))));
6029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
6030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
6031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x16: {  /* ADDQ_S.W */
6032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("addq_s.w r%d, r%d, r%d", rd, rs, rt);
6033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
6034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
6035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
6036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
6037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I32);
6038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_Add64,
6040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32Sto64, getIReg(rs)),
6041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32Sto64, getIReg(rt))));
6042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_And32,
6044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64HIto32, mkexpr(t0)),
6045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x1)));
6046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpNE32,
6047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shr32,
6048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_And32,
6049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_64to32, mkexpr(t0)),
6050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x80000000)),
6051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(31)),
6052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkexpr(t3)));
6053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t1),
6055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
6056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00100000)),
6058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
6059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, IRExpr_ITE(mkexpr(t1),
6061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            IRExpr_ITE(binop(Iop_CmpEQ32,
6062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkexpr(t3),
6063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU32(0x0)),
6064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x7fffffff),
6065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x80000000)),
6066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64to32, mkexpr(t0))));
6067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
6068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
6069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x17: {  /* SUBQ_S.W */
6070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("subq_s.w r%d, r%d, r%d", rd, rs, rt);
6071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
6072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
6073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
6074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
6075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I32);
6076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_Sub64,
6078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32Sto64, getIReg(rs)),
6079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32Sto64, getIReg(rt))));
6080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_And32,
6082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64HIto32, mkexpr(t0)),
6083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x1)));
6084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpNE32,
6085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shr32,
6086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_And32,
6087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_64to32, mkexpr(t0)),
6088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x80000000)),
6089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(31)),
6090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkexpr(t3)));
6091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t1),
6093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
6094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00100000)),
6096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
6097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, IRExpr_ITE(mkexpr(t1),
6099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            IRExpr_ITE(binop(Iop_CmpEQ32,
6100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkexpr(t3),
6101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU32(0x0)),
6102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x7fffffff),
6103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x80000000)),
6104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64to32, mkexpr(t0))));
6105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
6106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
6107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x1C: {  /* MULEQ_S.W.PHL */
6108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("muleq_s.w.phl r%d, r%d, r%d", rd, rs, rt);
6109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
6110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
6111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
6112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
6113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I32);
6114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0,
6116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Shl32,
6117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  binop(Iop_Mul32,
6118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        unop(Iop_16Sto32,
6119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             unop(Iop_32HIto16, getIReg(rt))),
6120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        unop(Iop_16Sto32,
6121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             unop(Iop_32HIto16, getIReg(rs)))),
6122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU8(0x1)));
6123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpEQ32,
6124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
6125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(rt),
6126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0xffff0000)),
6127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x80000000)));
6128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpEQ32,
6129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
6130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(rs),
6131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0xffff0000)),
6132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x80000000)));
6133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, IRExpr_ITE(mkexpr(t1),
6134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           IRExpr_ITE(mkexpr(t2),
6135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      binop(Iop_Or32,
6136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            getDSPControl(),
6137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkU32(0x00200000)),
6138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      getDSPControl()),
6139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           getDSPControl()));
6140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(mkexpr(t3));
6141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, IRExpr_ITE(mkexpr(t1),
6143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            IRExpr_ITE(mkexpr(t2),
6144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x7fffffff),
6145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t0)),
6146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t0)));
6147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
6148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
6149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x1D: {  /* MULEQ_S.W.PHR */
6150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("muleq_s.w.phr r%d, r%d, r%d", rd, rs, rt);
6151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
6152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
6153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
6154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
6155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0,
6157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Shl32,
6158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  binop(Iop_Mul32,
6159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        unop(Iop_16Sto32,
6160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             unop(Iop_32to16, getIReg(rt))),
6161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        unop(Iop_16Sto32,
6162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             unop(Iop_32to16, getIReg(rs)))),
6163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU8(0x1)));
6164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpEQ32,
6165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
6166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(rt),
6167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0xffff)),
6168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x8000)));
6169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpEQ32,
6170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
6171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(rs),
6172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0xffff)),
6173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x8000)));
6174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t1),
6175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(mkexpr(t2),
6176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_Or32,
6177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               getDSPControl(),
6178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0x00200000)
6179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              ),
6180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getDSPControl()),
6181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
6182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, IRExpr_ITE(mkexpr(t1),
6183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            IRExpr_ITE(mkexpr(t2),
6184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x7fffffff),
6185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t0)),
6186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t0)));
6187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
6188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
6189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x1E: {  /* MULQ_S.PH */
6190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("mulq_s.ph r%d, r%d, r%d", rd, rs, rt);
6191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
6192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
6193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
6194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I16);
6195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I16);
6196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I32);
6197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I32);
6198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I32);
6199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I32);
6200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5,
6202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            unop(Iop_16Sto32, unop(Iop_32to16, getIReg(rs))));
6203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6,
6204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            unop(Iop_16Sto32, unop(Iop_32to16, getIReg(rt))));
6205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7,
6207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            unop(Iop_16Sto32, unop(Iop_32HIto16, getIReg(rs))));
6208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8,
6209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            unop(Iop_16Sto32, unop(Iop_32HIto16, getIReg(rt))));
6210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_And32,
6212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_1Sto32,
6213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_CmpEQ32,
6214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_And32,
6215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t5),
6216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0xffff)),
6217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x8000))),
6218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_1Sto32,
6219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_CmpEQ32,
6220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_And32,
6221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t6),
6222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0xffff)),
6223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x8000)))));
6224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_And32,
6225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_1Sto32,
6226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_CmpEQ32,
6227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_And32,
6228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t7),
6229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0xffff)),
6230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x8000))),
6231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_1Sto32,
6232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_CmpEQ32,
6233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_And32,
6234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t8),
6235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0xffff)),
6236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x8000)))));
6237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpEQ32,
6239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_Or32,
6240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkexpr(t0),
6241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkexpr(t1)),
6242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x0)),
6243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl(),
6244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
6245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x200000))));
6247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, unop(Iop_32HIto16,
6249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Shl32,
6250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_64to32,
6251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                binop(Iop_MullS32,
6252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkexpr(t7),
6253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkexpr(t8))),
6254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(0x1))));
6255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, unop(Iop_32HIto16,
6256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Shl32,
6257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_64to32,
6258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                binop(Iop_MullS32,
6259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkexpr(t5),
6260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkexpr(t6))),
6261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(0x1))));
6262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_16HLto32,
6263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       IRExpr_ITE(binop(Iop_CmpEQ32,
6264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkexpr(t1),
6265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkU32(0x0)),
6266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t2),
6267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU16(0x7fff)),
6268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       IRExpr_ITE(binop(Iop_CmpEQ32,
6269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkexpr(t0),
6270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkU32(0x0)),
6271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t3),
6272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU16(0x7fff))));
6273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
6274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
6275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x1F: {  /* MULQ_RS.PH */
6276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("mulq_rs.ph r%d, r%d, r%d", rd, rs, rt);
6277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
6278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
6279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
6280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
6281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I16);
6282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I32);
6283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I1);
6284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I1);
6285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I16);
6286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Multiply and round lower halfwords. */
6288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_Add32,
6289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shl32,
6290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_Mul32,
6291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_16Sto32,
6292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_32to16,
6293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            getIReg(rt))),
6294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_16Sto32,
6295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_32to16,
6296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            getIReg(rs)))),
6297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(0x1)),
6298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
6299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpEQ32,
6300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
6301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(rt), mkU32(0xffff)),
6302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x8000)));
6303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpEQ32,
6304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
6305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(rs), mkU32(0xffff)),
6306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x8000)));
6307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t1),
6308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(mkexpr(t2),
6309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_Or32,
6310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               getDSPControl(),
6311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0x00200000)
6312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              ),
6313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getDSPControl()),
6314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
6315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, IRExpr_ITE(mkexpr(t1),
6316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           IRExpr_ITE(mkexpr(t2),
6317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkU16(0x7fff),
6318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      unop(Iop_32HIto16,
6319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                           mkexpr(t0))),
6320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, mkexpr(t0))));
6321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Multiply and round higher halfwords. */
6323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, binop(Iop_Add32,
6324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shl32,
6325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_Mul32,
6326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_16Sto32,
6327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_32HIto16,
6328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            getIReg(rt))),
6329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_16Sto32,
6330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_32HIto16,
6331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            getIReg(rs)))),
6332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(0x1)),
6333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
6334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, binop(Iop_CmpEQ32,
6335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
6336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(rt),
6337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0xffff0000)),
6338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x80000000)));
6339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, binop(Iop_CmpEQ32,
6340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
6341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(rs),
6342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0xffff0000)),
6343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x80000000)));
6344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t5),
6345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             IRExpr_ITE(mkexpr(t6),
6346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        binop(Iop_Or32,
6347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             getDSPControl(),
6348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU32(0x00200000)),
6349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        getDSPControl()),
6350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             getDSPControl()));
6351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, IRExpr_ITE(mkexpr(t5),
6352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           IRExpr_ITE(mkexpr(t6),
6353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkU16(0x7fff),
6354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      unop(Iop_32HIto16,
6355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                           mkexpr(t4))),
6356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, mkexpr(t4))));
6357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_16HLto32, mkexpr(t7), mkexpr(t3)));
6359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
6360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
6361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
6362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     return -1;
6363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
6364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;  /* end of ADDU.QB */
6365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
6366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x11: {  /* CMPU.EQ.QB */
6367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               switch(sa) {
6368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x0: {  /* CMPU.EQ.QB */
6369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("cmpu.eq.qb r%d, r%d", rs, rt);
6370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
6371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
6372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
6373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
6374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I1);
6375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1,
6377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_CmpEQ32,
6378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  binop(Iop_And32, getIReg(rs), mkU32(0xff)),
6379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  binop(Iop_And32, getIReg(rt), mkU32(0xff))));
6380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t1),
6381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
6382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x01000000)),
6384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
6385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xfeffffff))));
6387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpEQ32,
6389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
6391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16,
6392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs)))),
6393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
6395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16,
6396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
6397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t2),
6398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
6399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x02000000)),
6401436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
6402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xfdffffff))));
6404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpEQ32,
6406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
6408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
6409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs)))),
6410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
6412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
6413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
6414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t3),
6415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
6416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x04000000)),
6418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
6419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xfbffffff))));
6421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, binop(Iop_CmpEQ32,
6423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
6425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
6426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs)))),
6427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
6429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
6430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
6431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t4),
6432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
6433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x08000000)),
6435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
6436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xf7ffffff))));
6438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
6439436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
6440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x1: {  /* CMPU.LT.QB */
6441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("cmpu.lt.qb r%d, r%d", rs, rt);
6442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
6443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
6444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
6445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
6446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I1);
6447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6448436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpLT32U,
6449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
6451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16,
6452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs)))),
6453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
6455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16,
6456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
6457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t1),
6458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
6459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x01000000)),
6461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
6462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xfeffffff))));
6464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpLT32U,
6466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
6468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16,
6469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs)))),
6470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
6472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16,
6473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
6474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t2),
6475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
6476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x02000000)),
6478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
6479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xfdffffff))));
6481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpLT32U,
6483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
6485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
6486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs)))),
6487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
6489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
6490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
6491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t3),
6492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
6493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x04000000)),
6495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
6496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xfbffffff))));
6498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, binop(Iop_CmpLT32U,
6500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
6502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
6503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs)))),
6504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
6506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
6507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
6508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t4),
6509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
6510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x08000000)),
6512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
6513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xf7ffffff))));
6515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
6516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
6517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x2: {  /* CMPU.LE.QB */
6518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("cmpu.le.qb r%d, r%d", rs, rt);
6519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
6520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
6521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
6522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
6523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I1);
6524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpLE32U,
6526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
6528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16,
6529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs)))),
6530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
6532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16,
6533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
6534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t1),
6535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
6536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x01000000)),
6538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
6539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xfeffffff))));
6541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpLE32U,
6543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
6545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16,
6546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs)))),
6547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
6549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16,
6550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
6551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t2),
6552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
6553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x02000000)),
6555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
6556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xfdffffff))));
6558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpLE32U,
6560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
6562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
6563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs)))),
6564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
6566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
6567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
6568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t3),
6569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
6570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x04000000)),
6572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
6573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xfbffffff))));
6575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, binop(Iop_CmpLE32U,
6577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
6579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
6580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs)))),
6581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
6583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
6584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
6585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t4),
6586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
6587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x08000000)),
6589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
6590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xf7ffffff))));
6592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
6593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
6594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x3: {  /* PICK.QB */
6595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("pick.qb r%d, r%d, r%d", rd, rs, rt);
6596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
6597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
6598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I8);
6599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I8);
6600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I8);
6601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I8);
6602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, getDSPControl());
6604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, IRExpr_ITE(binop(Iop_CmpNE32,
6605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_And32,
6606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t0),
6607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x01000000)),
6608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x0)),
6609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
6610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_32to16,
6611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      getIReg(rs))),
6612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
6613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16,
6614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt)))));
6615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, IRExpr_ITE(binop(Iop_CmpNE32,
6616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_And32,
6617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t0),
6618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x02000000)),
6619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x0)),
6620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
6621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16, getIReg(rs))),
6622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
6623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16,
6624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt)))));
6625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, IRExpr_ITE(binop(Iop_CmpNE32,
6626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_And32,
6627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t0),
6628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x04000000)),
6629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x0)),
6630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
6631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
6632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs))),
6633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
6634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
6635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt)))));
6636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, IRExpr_ITE(binop(Iop_CmpNE32,
6637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_And32,
6638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t0),
6639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x08000000)),
6640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x0)),
6641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
6642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
6643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs))),
6644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
6645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
6646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt)))));
6647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd,
6648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             binop(Iop_16HLto32,
6649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   binop(Iop_8HLto16, mkexpr(t4), mkexpr(t3)),
6650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   binop(Iop_8HLto16, mkexpr(t2), mkexpr(t1))));
6651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
6652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
6653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x4: {  /* CMPGU.EQ.QB */
6654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("cmpgu.eq.qb r%d, r%d, r%d", rd, rs, rt);
6655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
6656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
6657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
6658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
6659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I1);
6660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I32);
6661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I32);
6662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I32);
6663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I32);
6664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpEQ32,
6666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
6668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16, getIReg(rs)))),
6669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
6671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16,
6672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
6673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, IRExpr_ITE(mkexpr(t1),
6674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x00000001), mkU32(0)));
6675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpEQ32,
6677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
6679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16, getIReg(rs)))),
6680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
6682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16,
6683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
6684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, IRExpr_ITE(mkexpr(t2),
6685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x00000002), mkU32(0)));
6686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpEQ32,
6688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
6690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
6691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs)))),
6692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
6694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
6695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
6696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, IRExpr_ITE(mkexpr(t3),
6697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x00000004), mkU32(0)));
6698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, binop(Iop_CmpEQ32,
6700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
6702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
6703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs)))),
6704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
6706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
6707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
6708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8, IRExpr_ITE(mkexpr(t4),
6709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x00000008), mkU32(0)));
6710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_Or32,
6712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_Or32,
6713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_Or32,
6714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkexpr(t5), mkexpr(t6)),
6715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkexpr(t7)),
6716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t8)));
6717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
6718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
6719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x5: {  /* CMPGU.LT.QB */
6720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("cmpgu.lt.qb r%d, r%d, r%d", rd, rs, rt);
6721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
6722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
6723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
6724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
6725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I1);
6726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I32);
6727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I32);
6728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I32);
6729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I32);
6730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpLT32U,
6732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
6734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16, getIReg(rs)))),
6735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
6737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16,
6738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
6739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, IRExpr_ITE(mkexpr(t1),
6740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x00000001), mkU32(0)));
6741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpLT32U,
6743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
6745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16, getIReg(rs)))),
6746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
6748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16,
6749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
6750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, IRExpr_ITE(mkexpr(t2),
6751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x00000002), mkU32(0)));
6752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpLT32U,
6754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
6756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
6757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs)))),
6758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
6760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
6761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
6762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, IRExpr_ITE(mkexpr(t3),
6763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x00000004), mkU32(0)));
6764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, binop(Iop_CmpLT32U,
6766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
6768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
6769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs)))),
6770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
6772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
6773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
6774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8, IRExpr_ITE(mkexpr(t4),
6775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x00000008), mkU32(0)));
6776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_Or32,
6777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_Or32,
6778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_Or32,
6779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkexpr(t5), mkexpr(t6)),
6780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkexpr(t7)),
6781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t8)));
6782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
6783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
6784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x6: {  /* CMPGU.LE.QB */
6785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("cmpgu.le.qb r%d, r%d, r%d", rd, rs, rt);
6786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
6787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
6788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
6789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
6790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I1);
6791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I32);
6792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I32);
6793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I32);
6794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I32);
6795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpLE32U,
6797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
6799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16, getIReg(rs)))),
6800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
6802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16,
6803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
6804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, IRExpr_ITE(mkexpr(t1),
6805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x00000001), mkU32(0)));
6806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpLE32U,
6808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
6810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16, getIReg(rs)))),
6811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
6813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16,
6814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
6815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, IRExpr_ITE(mkexpr(t2),
6816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x00000002), mkU32(0)));
6817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpLE32U,
6819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
6821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
6822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs)))),
6823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
6825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
6826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
6827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, IRExpr_ITE(mkexpr(t3),
6828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x00000004), mkU32(0)));
6829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, binop(Iop_CmpLE32U,
6831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
6833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
6834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs)))),
6835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
6836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
6837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
6838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
6839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8, IRExpr_ITE(mkexpr(t4),
6840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x00000008), mkU32(0)));
6841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_Or32,
6842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_Or32,
6843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_Or32,
6844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkexpr(t5), mkexpr(t6)),
6845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkexpr(t7)),
6846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t8)));
6847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
6848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
6849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x8: {  /* CMP.EQ.PH */
6850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("cmp.eq.ph r%d, r%d", rs, rt);
6851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
6852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
6853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
6854436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpEQ16,
6856436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to16, getIReg(rs)),
6857436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to16, getIReg(rt))));
6858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t1),
6859436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
6860436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6861436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x01000000)),
6862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
6863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6864436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xfeffffff))));
6865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpEQ16,
6866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32HIto16, getIReg(rs)),
6867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32HIto16, getIReg(rt))));
6868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t2),
6869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
6870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x02000000)),
6872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
6873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xfdffffff))));
6875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
6876436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
6877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x9: {  /* CMP.LT.PH */
6878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("cmp.lt.ph r%d, r%d", rs, rt);
6879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
6880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
6881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
6882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpLT32S,
6884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
6885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rs))),
6886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
6887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rt)))));
6888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t1),
6889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
6890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x01000000)),
6892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
6893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xfeffffff))));
6895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpLT32S,
6897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
6898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rs))),
6899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
6900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rt)))));
6901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t2),
6902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
6903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x02000000)),
6905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
6906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xfdffffff))));
6908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
6909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
6910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xA: {  /* CMP.LE.PH */
6911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("cmp.le.ph r%d, r%d", rs, rt);
6912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
6913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
6914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
6915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpLE32S,
6917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
6918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rs))),
6919436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
6920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rt)))));
6921436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t1),
6922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
6923436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x01000000)),
6925436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
6926436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xfeffffff))));
6928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6929436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpLE32S,
6930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
6931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rs))),
6932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
6933436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rt)))));
6934436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t2),
6935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
6936436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x02000000)),
6938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
6939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
6940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xfdffffff))));
6941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
6942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
6943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xB: {  /* PICK.PH */
6944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("pick.qb r%d, r%d, r%d", rd, rs, rt);
6945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
6946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
6947436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I16);
6948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I16);
6949436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6950436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, getDSPControl());
6951436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6952436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, IRExpr_ITE(binop(Iop_CmpNE32,
6953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_And32,
6954436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t0),
6955436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x01000000)),
6956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x0)),
6957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rs)),
6958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rt))));
6959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, IRExpr_ITE(binop(Iop_CmpNE32,
6961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_And32,
6962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t0),
6963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x02000000)),
6964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x0)),
6965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rs)),
6966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rt))));
6967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_16HLto32, mkexpr(t2), mkexpr(t1)));
6969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
6970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
6971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xC: {  /* PRECRQ.QB.PH */
6972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("precrq.qb.ph r%d, r%d, %d", rd, rs, rt);
6973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
6974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd,
6975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             binop(Iop_16HLto32,
6976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   binop(Iop_8HLto16,
6977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         unop(Iop_16HIto8,
6978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_32HIto16, getIReg(rs))),
6979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         unop(Iop_16HIto8,
6980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_32to16, getIReg(rs)))),
6981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   binop(Iop_8HLto16,
6982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         unop(Iop_16HIto8,
6983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_32HIto16, getIReg(rt))),
6984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         unop(Iop_16HIto8,
6985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_32to16, getIReg(rt))))));
6986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
6987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
6988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xD: {  /* PRECR.QB.PH */
6989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("precr.qb.ph r%d, r%d, r%d", rd, rs, rt);
6990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
6991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
6992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd,
6993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             binop(Iop_16HLto32,
6994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   binop(Iop_8HLto16,
6995436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         unop(Iop_16to8,
6996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_32HIto16, getIReg(rs))),
6997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         unop(Iop_16to8,
6998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_32to16, getIReg(rs)))),
6999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   binop(Iop_8HLto16,
7000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         unop(Iop_16to8,
7001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_32HIto16, getIReg(rt))),
7002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         unop(Iop_16to8,
7003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_32to16, getIReg(rt))))));
7004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
7005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
7006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xF: {  /* PRECRQU_S.QB.PH */
7007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("precrqu_s.qb.ph r%d, r%d, %d", rd, rs, rt);
7008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
7009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I8);
7010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I8);
7011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I8);
7012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I8);
7013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I8);
7014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I32);
7015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I1);
7016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I8);
7017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I1);
7018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I32);
7019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t10 = newTemp(Ity_I8);
7020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t11 = newTemp(Ity_I1);
7021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t12 = newTemp(Ity_I32);
7022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t13 = newTemp(Ity_I8);
7023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t14 = newTemp(Ity_I1);
7024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t15 = newTemp(Ity_I32);
7025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, IRExpr_ITE(binop(Iop_CmpLT32U,
7027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x7f80),
7028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_And32,
7029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_16Uto32,
7030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            unop(Iop_32to16,
7031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            getIReg(rs))),
7032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x7fff))),
7033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(0xff),
7034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
7035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16,
7036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     binop(Iop_Shl32,
7037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                           getIReg(rs),
7038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                           mkU8(1))))));
7039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, IRExpr_ITE(binop(Iop_CmpEQ32,
7040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_And32,
7041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_16Uto32,
7042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            unop(Iop_32to16,
7043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                 getIReg(rs))),
7044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x00008000)),
7045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x0)),
7046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t4),
7047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(0x0)));
7048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, binop(Iop_And32,
7049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
7050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16,
7051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 getIReg(rs))),
7052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
7053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, binop(Iop_CmpLT32U,
7054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x7f80),
7055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
7056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_16Uto32,
7057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_32to16,
7058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 getIReg(rs))),
7059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x7fff))));
7060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpEQ32,
7061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t5),
7062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x0)),
7063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(mkexpr(t6),
7064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_Or32,
7065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               getDSPControl(),
7066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0x00400000)
7067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              ),
7068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getDSPControl()),
7069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
7070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
7071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00400000))));
7072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, IRExpr_ITE(binop(Iop_CmpLT32U,
7074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x7f80),
7075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_And32,
7076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_16Uto32,
7077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            unop(Iop_32HIto16,
7078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                 getIReg(rs))),
7079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x7fff))),
7080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(0xff),
7081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
7082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
7083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     binop(Iop_Shl32,
7084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                           getIReg(rs),
7085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                           mkU8(1))))));
7086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, IRExpr_ITE(binop(Iop_CmpEQ32,
7087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_And32,
7088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_16Uto32,
7089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            unop(Iop_32HIto16,
7090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                 getIReg(rs))),
7091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x00008000)),
7092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x0)),
7093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t7),
7094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(0x0)));
7095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8, binop(Iop_CmpEQ32,
7096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
7097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_16Uto32,
7098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_32HIto16,
7099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      getIReg(rs))),
7100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x00008000)),
7101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x0)));
7102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t9, IRExpr_ITE(binop(Iop_CmpLT32U,
7103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x7f80),
7104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_And32,
7105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_16Uto32,
7106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            unop(Iop_32HIto16,
7107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                 getIReg(rs))),
7108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x7fff))),
7109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Or32,
7110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 getDSPControl(),
7111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x00400000)),
7112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           getDSPControl()));
7113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t8),
7114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkexpr(t9),
7115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
7116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
7117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00400000))));
7118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t10, IRExpr_ITE(binop(Iop_CmpLT32U,
7120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x7f80),
7121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  binop(Iop_And32,
7122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        unop(Iop_16Uto32,
7123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             unop(Iop_32to16,
7124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             getIReg(rt))),
7125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkU32(0x7fff))),
7126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(0xff),
7127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_16HIto8,
7128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_32to16,
7129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      binop(Iop_Shl32,
7130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            getIReg(rt),
7131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkU8(1))))));
7132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, IRExpr_ITE(binop(Iop_CmpEQ32,
7133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_And32,
7134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_16Uto32,
7135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            unop(Iop_32to16,
7136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                 getIReg(rt))),
7137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x00008000)),
7138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x0)),
7139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t10),
7140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(0x0)));
7141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t11, binop(Iop_CmpEQ32,
7142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_And32,
7143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             unop(Iop_16Uto32,
7144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_32to16,
7145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       getIReg(rt))),
7146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU32(0x00008000)),
7147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkU32(0x0)));
7148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t12, IRExpr_ITE(binop(Iop_CmpLT32U,
7149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x7f80),
7150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  binop(Iop_And32,
7151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        unop(Iop_16Uto32,
7152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             unop(Iop_32to16,
7153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             getIReg(rt))),
7154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkU32(0x7fff))),
7155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_Or32,
7156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  getDSPControl(),
7157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x00400000)),
7158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getDSPControl()));
7159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t11),
7160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkexpr(t12),
7161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
7162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
7163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00400000))));
7164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t13, IRExpr_ITE(binop(Iop_CmpLT32U,
7166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x7f80),
7167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  binop(Iop_And32,
7168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        unop(Iop_16Uto32,
7169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             unop(Iop_32HIto16,
7170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                  getIReg(rt))),
7171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkU32(0x7fff))),
7172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(0xff),
7173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_16HIto8,
7174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_32HIto16,
7175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      binop(Iop_Shl32,
7176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            getIReg(rt),
7177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkU8(1))))));
7178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, IRExpr_ITE(binop(Iop_CmpEQ32,
7179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_And32,
7180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_16Uto32,
7181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            unop(Iop_32HIto16,
7182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                 getIReg(rt))),
7183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x00008000)),
7184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x0)),
7185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t13),
7186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(0x0)));
7187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t14, binop(Iop_CmpEQ32,
7188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_And32,
7189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             unop(Iop_16Uto32,
7190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_32HIto16,
7191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       getIReg(rt))),
7192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU32(0x00008000)),
7193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkU32(0x0)));
7194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t15, IRExpr_ITE(binop(Iop_CmpLT32U,
7195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x7f80),
7196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  binop(Iop_And32,
7197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        unop(Iop_16Uto32,
7198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             unop(Iop_32HIto16,
7199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                  getIReg(rt))),
7200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkU32(0x7fff))),
7201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_Or32,
7202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  getDSPControl(),
7203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x00400000)),
7204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getDSPControl()));
7205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t14),
7206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkexpr(t15),
7207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
7208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
7209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00400000))));
7210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_16HLto32,
7212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_8HLto16,
7213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkexpr(t1), mkexpr(t0)),
7214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_8HLto16,
7215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkexpr(t3), mkexpr(t2))));
7216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
7217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
7218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x14: {  /* PRECRQ.PH.W */
7219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("precrq.ph.w r%d, r%d, %d", rd, rs, rt);
7220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
7221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_16HLto32,
7222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_32HIto16, getIReg(rs)),
7223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_32HIto16, getIReg(rt))));
7224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
7225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
7226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x15: {  /* PRECRQ_RS.PH.W */
7227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("precrq_rs.ph.w r%d, r%d, %d", rd, rs, rt);
7228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
7229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
7230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
7231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
7232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I64);
7233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I1);
7234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I32);
7235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_Add64,
7237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_32HLto64,
7238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_Shr32,
7239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  binop(Iop_And32,
7240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        getIReg(rs),
7241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkU32(0x80000000)),
7242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU8(31)),
7243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(rs)),
7244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU64(0x0000000000008000ULL)));
7245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpNE32,
7246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
7247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64HIto32, mkexpr(t0)),
7248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x1)),
7249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
7250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_Shr32,
7251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_64to32, mkexpr(t0)),
7252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU8(31)),
7253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x1))));
7254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, IRExpr_ITE(mkexpr(t1),
7255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x7fffffff),
7256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_64to32, mkexpr(t0))));
7257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t1),
7258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
7259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
7260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x400000)),
7261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
7262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_Add64,
7263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_32HLto64,
7264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_Shr32,
7265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  binop(Iop_And32,
7266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        getIReg(rt),
7267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkU32(0x80000000)),
7268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU8(31)),
7269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(rt)),
7270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU64(0x0000000000008000ULL)));
7271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, binop(Iop_CmpNE32,
7272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
7273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64HIto32, mkexpr(t3)),
7274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x1)),
7275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
7276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_Shr32,
7277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_64to32, mkexpr(t3)),
7278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU8(31)),
7279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x1))));
7280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, IRExpr_ITE(mkexpr(t4),
7281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x7fffffff),
7282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_64to32, mkexpr(t3))));
7283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t4),
7284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
7285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
7286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x400000)),
7287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
7288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_16HLto32,
7289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_32HIto16, mkexpr(t2)),
7290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_32HIto16, mkexpr(t5))));
7291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
7292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
7293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x1E: {  /* PRECR_SRA.PH.W */
7294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("precr_sra.ph.w r%d, r%d, %d", rt, rs, rd);
7295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
7296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (0 == rd) {
7298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rt, binop(Iop_16HLto32,
7299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32to16, getIReg(rt)),
7300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32to16, getIReg(rs))));
7301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
7302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rt, binop(Iop_16HLto32,
7303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32to16, binop(Iop_Sar32,
7304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                 getIReg(rt),
7305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                 mkU8(rd))),
7306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32to16, binop(Iop_Sar32,
7307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                 getIReg(rs),
7308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                 mkU8(rd)))));
7309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
7310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
7311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
7312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x1F: {  /* PRECR_SRA_R.PH.W */
7313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("precr_sra_r.ph.w r%d, r%d, %d", rt, rs, rd);
7314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
7315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
7317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
7318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (0 == rd) {
7320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rt, binop(Iop_16HLto32,
7321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32to16, getIReg(rt)),
7322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32to16, getIReg(rs))));
7323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
7324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t0, binop(Iop_Shr32,
7325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         binop(Iop_Add32,
7326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               binop(Iop_Sar32,
7327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt),
7328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkU8(rd-1)),
7329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               mkU32(0x1)),
7330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkU8(0x1)));
7331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t1, binop(Iop_Shr32,
7332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         binop(Iop_Add32,
7333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               binop(Iop_Sar32,
7334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs),
7335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkU8(rd-1)),
7336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               mkU32(0x1)),
7337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkU8(0x1)));
7338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rt, binop(Iop_16HLto32,
7339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32to16, mkexpr(t0)),
7340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32to16, mkexpr(t1))));
7341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     };
7342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
7343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
7344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xE: {  /* PACKRL.PH */
7345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("packrl.ph r%d, r%d, r%d", rd, rs, rt);
7346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
7347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_16HLto32,
7349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_32to16, getIReg(rs)),
7350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_32HIto16, getIReg(rt))));
7351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
7352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
7353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x18: {  /* CMPGDU.EQ.QB */
7354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("cmpgdu.eq.qb r%d, r%d, r%d", rd, rs, rt);
7355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
7356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
7357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
7358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
7359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I1);
7360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I32);
7361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I32);
7362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I32);
7363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I32);
7364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1,
7366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_CmpEQ32,
7367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
7368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16to8,
7369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rs)))),
7370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
7371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16to8,
7372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rt))))));
7373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, IRExpr_ITE(mkexpr(t1),
7374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x00000001), mkU32(0)));
7375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t1),
7376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
7377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
7378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x01000000)),
7379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
7380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
7381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xfeffffff))));
7382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpEQ32,
7384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
7385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
7386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16, getIReg(rs)))),
7387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
7388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
7389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16,
7390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
7391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, IRExpr_ITE(mkexpr(t2),
7392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x00000002), mkU32(0)));
7393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t2),
7394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
7395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
7396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x02000000)),
7397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
7398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
7399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xfdffffff))));
7400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7401436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpEQ32,
7402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
7403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
7404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
7405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs)))),
7406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
7407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
7408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
7409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
7410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, IRExpr_ITE(mkexpr(t3),
7411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x00000004), mkU32(0)));
7412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t3),
7413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
7414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
7415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x04000000)),
7416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
7417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
7418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xfbffffff))));
7419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, binop(Iop_CmpEQ32,
7421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
7422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
7423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
7424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs)))),
7425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
7426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
7427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
7428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
7429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8, IRExpr_ITE(mkexpr(t4),
7430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x00000008), mkU32(0)));
7431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t4),
7432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
7433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
7434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x08000000)),
7435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
7436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
7437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xf7ffffff))));
7438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7439436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_Or32,
7440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_Or32,
7441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_Or32,
7442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkexpr(t5), mkexpr(t6)),
7443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkexpr(t7)),
7444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t8)));
7445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
7446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
7447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x19: {  /* CMPGDU.LT.QB */
7448436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("cmpgdu.lt.qb r%d, r%d, r%d", rd, rs, rt);
7449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
7450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
7451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
7452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
7453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I1);
7454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I32);
7455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I32);
7456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I32);
7457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I32);
7458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpLT32U,
7460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
7461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
7462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16, getIReg(rs)))),
7463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
7464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
7465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16,
7466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
7467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, IRExpr_ITE(mkexpr(t1),
7468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x00000001), mkU32(0)));
7469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t1),
7470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
7471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
7472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x01000000)),
7473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
7474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
7475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xfeffffff))));
7476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpLT32U,
7478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
7479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
7480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16, getIReg(rs)))),
7481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
7482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
7483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16,
7484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
7485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, IRExpr_ITE(mkexpr(t2),
7486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x00000002), mkU32(0)));
7487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t2),
7488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
7489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
7490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x02000000)),
7491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
7492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
7493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xfdffffff))));
7494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpLT32U,
7496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
7497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
7498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
7499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs)))),
7500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
7501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
7502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
7503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
7504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, IRExpr_ITE(mkexpr(t3),
7505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x00000004), mkU32(0)));
7506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t3),
7507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
7508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
7509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x04000000)),
7510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
7511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
7512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xfbffffff))));
7513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, binop(Iop_CmpLT32U,
7515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
7516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
7517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
7518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs)))),
7519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
7520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
7521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
7522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
7523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8, IRExpr_ITE(mkexpr(t4),
7524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x00000008), mkU32(0)));
7525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t4),
7526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
7527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
7528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x08000000)),
7529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
7530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
7531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xf7ffffff))));
7532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_Or32,
7534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_Or32,
7535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_Or32,
7536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkexpr(t5), mkexpr(t6)),
7537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkexpr(t7)),
7538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t8)));
7539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
7540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
7541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x1A: {  /* CMPGDU.LE.QB */
7542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("cmpgdu.le.qb r%d, r%d, r%d", rd, rs, rt);
7543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
7544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
7545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
7546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
7547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I1);
7548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I32);
7549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I32);
7550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I32);
7551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I32);
7552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpLE32U,
7554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
7555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
7556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16, getIReg(rs)))),
7557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
7558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
7559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16,
7560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
7561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, IRExpr_ITE(mkexpr(t1),
7562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x00000001),
7563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0)));
7564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t1),
7565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
7566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
7567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x01000000)),
7568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
7569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
7570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xfeffffff))));
7571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpLE32U,
7573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
7574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
7575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16, getIReg(rs)))),
7576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
7577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
7578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to16,
7579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
7580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, IRExpr_ITE(mkexpr(t2),
7581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x00000002), mkU32(0)));
7582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t2),
7583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
7584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
7585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x02000000)),
7586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
7587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
7588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xfdffffff))));
7589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpLE32U,
7591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
7592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
7593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
7594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs)))),
7595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
7596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16to8,
7597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
7598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
7599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, IRExpr_ITE(mkexpr(t3),
7600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x00000004), mkU32(0)));
7601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t3),
7602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
7603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
7604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x04000000)),
7605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
7606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
7607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xfbffffff))));
7608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, binop(Iop_CmpLE32U,
7610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
7611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
7612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
7613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs)))),
7614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_8Uto32,
7615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_16HIto8,
7616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32HIto16,
7617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt))))));
7618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8, IRExpr_ITE(mkexpr(t4),
7619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x00000008), mkU32(0)));
7620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t4),
7621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
7622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
7623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x08000000)),
7624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_And32,
7625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
7626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xf7ffffff))));
7627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_Or32,
7629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_Or32,
7630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_Or32,
7631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkexpr(t5), mkexpr(t6)),
7632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkexpr(t7)),
7633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t8)));
7634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
7635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
7636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
7637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     return -1;
7638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
7639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;  /* end of CMPU.EQ.QB */
7640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
7641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x13: {  /* SHLL.QB */
7642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               switch(sa) {
7643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x0: {  /* SHLL.QB */
7644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("shll.qb r%d, r%d, %d", rd, rt, rs);
7645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
7646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
7647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
7648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
7649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I32);
7650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I1);
7651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I1);
7652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I32);
7653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I1);
7654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I1);
7655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I1);
7656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t10 = newTemp(Ity_I1);
7657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (0 == rs) {
7659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rd, getIReg(rt));
7660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
7661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        /* Shift bits 7..0 and 23..16. */
7662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t0, binop(Iop_Shl32,
7663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         binop(Iop_And32,
7664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               getIReg(rt),
7665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               mkU32(0x00ff00ff)),
7666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkU8(rs)));
7667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t1, binop(Iop_CmpNE32,
7668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_And32,
7669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkexpr(t0),
7670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkU32(0xff000000)),
7671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        mkU32(0x00000000)));
7672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t2, binop(Iop_CmpNE32,
7673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_And32,
7674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkexpr(t0),
7675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkU32(0xff000000)),
7676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        mkU32(0xff000000)));
7677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t7, binop(Iop_CmpNE32,
7678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_And32,
7679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkexpr(t0),
7680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkU32(0x0000ff00)),
7681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        mkU32(0x00000000)));
7682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t8, binop(Iop_CmpNE32,
7683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_And32,
7684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkexpr(t0),
7685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkU32(0x0000ff00)),
7686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        mkU32(0x000ff00)));
7687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        /* Shift bits 15..8 and 31..24. */
7688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t3, binop(Iop_Shl32,
7689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         binop(Iop_Shr32,
7690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               binop(Iop_And32,
7691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rt),
7692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkU32(0xff00ff00)),
7693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               mkU8(8)),
7694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkU8(rs)));
7695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t4, binop(Iop_CmpNE32,
7696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_And32,
7697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkexpr(t3),
7698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkU32(0xff000000)),
7699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        mkU32(0x00000000)));
7700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t5, binop(Iop_CmpNE32,
7701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_And32,
7702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkexpr(t3),
7703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkU32(0xff000000)),
7704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        mkU32(0xff000000)));
7705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t9, binop(Iop_CmpNE32,
7706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_And32,
7707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkexpr(t3),
7708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkU32(0x0000ff00)),
7709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        mkU32(0x00000000)));
7710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t10, binop(Iop_CmpNE32,
7711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_And32,
7712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkexpr(t3),
7713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkU32(0x0000ff00)),
7714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        mkU32(0x0000ff00)));
7715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t6, binop(Iop_Or32,
7717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         binop(Iop_Or32,
7718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               binop(Iop_And32,
7719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     unop(Iop_1Uto32,
7720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkexpr(t1)),
7721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     unop(Iop_1Uto32,
7722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkexpr(t2))),
7723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               binop(Iop_And32,
7724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     unop(Iop_1Uto32,
7725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkexpr(t7)),
7726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     unop(Iop_1Uto32,
7727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkexpr(t8)))),
7728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         binop(Iop_Or32,
7729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               binop(Iop_And32,
7730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     unop(Iop_1Uto32,
7731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkexpr(t4)),
7732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     unop(Iop_1Uto32,
7733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkexpr(t5))),
7734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               binop(Iop_And32,
7735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     unop(Iop_1Uto32,
7736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkexpr(t9)),
7737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     unop(Iop_1Uto32,
7738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkexpr(t10))))));
7739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putDSPControl(IRExpr_ITE(binop(Iop_CmpNE32,
7741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t6),
7742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x0)),
7743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Or32,
7744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       getDSPControl(),
7745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x400000)),
7746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 getDSPControl()));
7747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rd, binop(Iop_Or32,
7748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          binop(Iop_Shl32,
7749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                binop(Iop_And32,
7750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkexpr(t3),
7751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkU32(0x00ff00ff)),
7752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                mkU8(8)),
7753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          binop(Iop_And32,
7754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                mkexpr(t0),
7755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                mkU32(0x00ff00ff))));
7756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
7757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
7758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
7759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x3: {  /* SHRL.QB */
7760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("shrl.qb r%d, r%d, %d", rd, rt, rs);
7761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
7762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
7763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I8);
7764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
7765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I8);
7766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I32);
7767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I8);
7768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I32);
7769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I8);
7770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I32);
7771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t9, binop(Iop_And32, getIReg(rs), mkU32(0x7)));
7773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, unop(Iop_8Uto32,
7774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_16to8,
7775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32to16, getIReg(rt)))));
7776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, unop(Iop_32to8,
7777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Shr32,
7778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t0),
7779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to8, mkexpr(t9)))));
7780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, unop(Iop_8Uto32,
7782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_16HIto8,
7783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32to16, getIReg(rt)))));
7784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, unop(Iop_32to8,
7785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Shr32,
7786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t2),
7787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to8, mkexpr(t9)))));
7788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, unop(Iop_8Uto32,
7790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_16to8,
7791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32HIto16, getIReg(rt)))));
7792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, unop(Iop_32to8,
7793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Shr32,
7794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t4),
7795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to8, mkexpr(t9)))));
7796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, unop(Iop_8Uto32,
7798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_16HIto8,
7799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32HIto16, getIReg(rt)))));
7800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, unop(Iop_32to8,
7801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Shr32,
7802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t6),
7803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to8, mkexpr(t9)))));
7804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, IRExpr_ITE(binop(Iop_CmpEQ32,
7805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t9),
7806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x0)),
7807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(rt),
7808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_16HLto32,
7809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  binop(Iop_8HLto16,
7810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkexpr(t7),
7811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkexpr(t5)),
7812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  binop(Iop_8HLto16,
7813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkexpr(t3),
7814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkexpr(t1)))));
7815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
7816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
7817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x2: {  /* SHLLV.QB */
7818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("shllv.qb r%d, r%d, r%d", rd, rt, rs);
7819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
7820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
7821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
7822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
7823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I32);
7824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I1);
7825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I1);
7826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I32);
7827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I1);
7828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I1);
7829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I1);
7830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t10 = newTemp(Ity_I1);
7831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t11 = newTemp(Ity_I8);
7832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t11, unop(Iop_32to8,
7834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
7835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(rs),
7836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x7))));
7837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Shift bits 7..0 and 23..16. */
7838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_Shl32,
7839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
7840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(rt),
7841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x00ff00ff)),
7842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkexpr(t11)));
7843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpNE32,
7844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_And32,
7845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t0),
7846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0xff000000)),
7847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     mkU32(0x00000000)));
7848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpNE32,
7849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_And32,
7850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t0),
7851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0xff000000)),
7852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     mkU32(0xff000000)));
7853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, binop(Iop_CmpNE32,
7854436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_And32,
7855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t0),
7856436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x0000ff00)),
7857436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     mkU32(0x00000000)));
7858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8, binop(Iop_CmpNE32,
7859436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_And32,
7860436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t0),
7861436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x0000ff00)),
7862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     mkU32(0x000ff00)));
7863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Shift bits 15..8 and 31..24. */
7864436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_Shl32,
7865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shr32,
7866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_And32,
7867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  getIReg(rt),
7868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0xff00ff00)),
7869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(8)),
7870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkexpr(t11)));
7871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, binop(Iop_CmpNE32,
7872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_And32,
7873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t3),
7874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0xff000000)),
7875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     mkU32(0x00000000)));
7876436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, binop(Iop_CmpNE32,
7877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_And32,
7878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t3),
7879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0xff000000)),
7880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     mkU32(0xff000000)));
7881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t9, binop(Iop_CmpNE32,
7882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_And32,
7883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t3),
7884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x0000ff00)),
7885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     mkU32(0x00000000)));
7886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t10, binop(Iop_CmpNE32,
7887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_And32,
7888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t3),
7889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x0000ff00)),
7890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     mkU32(0x0000ff00)));
7891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, binop(Iop_Or32,
7893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Or32,
7894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_And32,
7895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_1Uto32,
7896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t1)),
7897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_1Uto32,
7898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t2))),
7899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_And32,
7900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_1Uto32,
7901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t7)),
7902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_1Uto32,
7903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t8)))),
7904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Or32,
7905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_And32,
7906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_1Uto32,
7907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t4)),
7908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_1Uto32,
7909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t5))),
7910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_And32,
7911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_1Uto32,
7912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t9)),
7913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_1Uto32,
7914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t10))))));
7915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpNE32,
7917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t6),
7918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x0)),
7919436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
7920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
7921436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x400000)),
7922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
7923436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, IRExpr_ITE(binop(Iop_CmpEQ32,
7924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_8Uto32, mkexpr(t11)),
7925436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0)),
7926436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(rt),
7927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_Or32,
7928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  binop(Iop_Shl32,
7929436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        binop(Iop_And32,
7930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              mkexpr(t3),
7931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              mkU32(0xff00ff)),
7932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkU8(8)),
7933436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  binop(Iop_And32,
7934436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkexpr(t0),
7935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkU32(0x00ff00ff)))));
7936436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
7937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
7938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x1: {  /* SHRLV.QB */
7939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("shrlv.qb r%d, r%d, r%d", rd, rt, rs);
7940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
7941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I8);
7942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I8);
7943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I8);
7944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I8);
7945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, unop(Iop_32to8,
7947436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Shr32,
7948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_8Uto32,
7949436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_32to8, getIReg(rt))),
7950436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(rs))));
7951436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, unop(Iop_32to8,
7952436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Shr32,
7953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_8Uto32,
7954436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_16HIto8,
7955436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     unop(Iop_32to16,
7956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          getIReg(rt)))),
7957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(rs))));
7958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, unop(Iop_32to8,
7959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shr32,
7960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_8Uto32,
7961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_16to8,
7962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      unop(Iop_32HIto16,
7963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                           getIReg(rt)))),
7964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(rs))));
7965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, unop(Iop_32to8,
7966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Shr32,
7967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_8Uto32,
7968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                unop(Iop_16HIto8,
7969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     unop(Iop_32HIto16,
7970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          getIReg(rt)))),
7971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(rs))));
7972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd,
7973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             binop(Iop_16HLto32,
7974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   binop(Iop_8HLto16, mkexpr(t3), mkexpr(t2)),
7975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   binop(Iop_8HLto16, mkexpr(t1), mkexpr(t0))));
7976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
7977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
7978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x4: {  /* SHRA.QB */
7979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("shra.qb r%d, r%d, %d", rd, rt, rs);
7980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
7981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
7982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
7983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
7984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I32);
7985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I32);
7986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I32);
7987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I32);
7988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I32);
7989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I32);
7990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I32);
7991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t10 = newTemp(Ity_I32);
7992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t11 = newTemp(Ity_I32);
7993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
7994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* ========== GPR[rt]_31..24 ========== */
7995436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1,
7996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            unop(Iop_8Uto32,
7997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 unop(Iop_16HIto8,
7998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32HIto16, getIReg(rt)))));
7999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2,
8000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Shr32, mkexpr(t1), mkU8(rs)));
8001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* tempD_7..0 */
8002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0,
8003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Or32,
8004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkexpr(t2),
8005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  binop(Iop_Shl32,
8006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        IRExpr_ITE(binop(Iop_CmpEQ32,
8007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_And32,
8008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkexpr(t1),
8009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0x00000080)
8010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              ),
8011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkU32(0x00000080)),
8012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0xFFFFFFFF),
8013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0x00000000)),
8014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_Sub8, mkU8(0x8), mkU8(rs)))));
8015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* ========== GPR[rt]_23..16 ========== */
8017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4,
8018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            unop(Iop_8Uto32,
8019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 unop(Iop_16to8,
8020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32HIto16, getIReg(rt)))));
8021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, binop(Iop_Shr32, mkexpr(t4), mkU8(rs)));
8022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* tempC_7..0 */
8023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3,
8024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Or32,
8025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkexpr(t5),
8026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  binop(Iop_Shl32,
8027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        IRExpr_ITE(binop(Iop_CmpEQ32,
8028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_And32,
8029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkexpr(t4),
8030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0x00000080)
8031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              ),
8032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkU32(0x00000080)),
8033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0xFFFFFFFF),
8034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0x00000000)),
8035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_Sub8, mkU8(0x8), mkU8(rs)))));
8036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* ========== GPR[rt]_15..8 ========== */
8038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7,
8039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            unop(Iop_8Uto32,
8040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 unop(Iop_16HIto8,
8041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to16, getIReg(rt)))));
8042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8, binop(Iop_Shr32, mkexpr(t7), mkU8(rs)));
8043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* tempB_7..0 */
8044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6,
8045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Or32,
8046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkexpr(t8),
8047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  binop(Iop_Shl32,
8048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        IRExpr_ITE(binop(Iop_CmpEQ32,
8049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_And32,
8050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkexpr(t7),
8051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0x00000080)
8052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              ),
8053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkU32(0x00000080)),
8054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0xFFFFFFFF),
8055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0x00000000)),
8056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_Sub8, mkU8(0x8), mkU8(rs)))));
8057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* ========== GPR[rt]_7..0 ========== */
8059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t10,
8060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            unop(Iop_8Uto32,
8061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 unop(Iop_16to8,
8062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to16, getIReg(rt)))));
8063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t11, binop(Iop_Shr32, mkexpr(t10), mkU8(rs)));
8064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* tempB_7..0 */
8065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t9,
8066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Or32,
8067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkexpr(t11),
8068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  binop(Iop_Shl32,
8069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        IRExpr_ITE(binop(Iop_CmpEQ32,
8070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_And32,
8071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkexpr(t10),
8072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0x00000080)
8073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              ),
8074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkU32(0x00000080)),
8075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0xFFFFFFFF),
8076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0x00000000)),
8077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_Sub8, mkU8(0x8), mkU8(rs)))));
8078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd,
8080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             binop(Iop_16HLto32,
8081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   binop(Iop_8HLto16,
8082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         unop(Iop_32to8, mkexpr(t0)),
8083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         unop(Iop_32to8, mkexpr(t3))),
8084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   binop(Iop_8HLto16,
8085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         unop(Iop_32to8, mkexpr(t6)),
8086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         unop(Iop_32to8, mkexpr(t9)))));
8087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
8088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
8089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x5: {  /* SHRA_R.QB */
8090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("shra_r.qb r%d, r%d, %d", rd, rt, rs);
8091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
8092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
8093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I8);
8094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
8095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I8);
8096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I32);
8097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I8);
8098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I32);
8099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I8);
8100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (0 == rs) {
8102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rd, getIReg(rt));
8103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
8104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t0, unop(Iop_8Sto32,
8105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        unop(Iop_16to8,
8106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             unop(Iop_32to16, getIReg(rt)))));
8107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t1, unop(Iop_32to8,
8108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_Sar32,
8109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Add32,
8110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t0),
8111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_Shl32,
8112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU32(0x1),
8113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU8(rs-1))),
8114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkU8(rs))));
8115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t2, unop(Iop_8Sto32,
8117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        unop(Iop_16HIto8,
8118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             unop(Iop_32to16, getIReg(rt)))));
8119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t3, unop(Iop_32to8,
8120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_Sar32,
8121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Add32,
8122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t2),
8123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_Shl32,
8124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU32(0x1),
8125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU8(rs-1))),
8126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkU8(rs))));
8127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t4, unop(Iop_8Sto32,
8129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        unop(Iop_16to8,
8130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             unop(Iop_32HIto16, getIReg(rt)))));
8131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t5, unop(Iop_32to8,
8132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_Sar32,
8133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Add32,
8134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t4),
8135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_Shl32,
8136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU32(0x1),
8137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU8(rs-1))),
8138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkU8(rs))));
8139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t6, unop(Iop_8Sto32,
8141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        unop(Iop_16HIto8,
8142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             unop(Iop_32HIto16, getIReg(rt)))));
8143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t7, unop(Iop_32to8,
8144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_Sar32,
8145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Add32,
8146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t6),
8147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_Shl32,
8148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU32(0x1),
8149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU8(rs-1))),
8150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkU8(rs))));
8151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rd, binop(Iop_16HLto32,
8152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         binop(Iop_8HLto16,
8153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               mkexpr(t7), mkexpr(t5)),
8154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         binop(Iop_8HLto16,
8155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               mkexpr(t3), mkexpr(t1))));
8156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
8157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
8158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
8159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x6: {  /* SHRAV.QB */
8160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("shrav.qb r%d, r%d, %d", rd, rt, rs);
8161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
8162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
8164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
8165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
8166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I32);
8168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I32);
8169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I32);
8170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I32);
8172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I32);
8173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I32);
8174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I32);
8176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t10 = newTemp(Ity_I32);
8177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t11 = newTemp(Ity_I32);
8178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* ========== GPR[rt]_31..24 ========== */
8180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1,
8181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            unop(Iop_8Uto32,
8182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 unop(Iop_16HIto8,
8183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32HIto16, getIReg(rt)))));
8184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2,
8185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Shr32,
8186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkexpr(t1),
8187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_32to8, binop(Iop_And32,
8188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        getIReg(rs),
8189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkU32(0x7)))));
8190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* tempD_7..0 */
8191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0,
8192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Or32,
8193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkexpr(t2),
8194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  binop(Iop_Shl32,
8195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        IRExpr_ITE(binop(Iop_CmpEQ32,
8196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_And32,
8197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkexpr(t1),
8198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0x00000080)
8199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              ),
8200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkU32(0x00000080)),
8201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0xFFFFFFFF),
8202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0x00000000)),
8203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_Sub8,
8204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkU8(0x8),
8205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_32to8, binop(Iop_And32,
8206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                    getIReg(rs),
8207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                    mkU32(0x7)))
8208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              ))));
8209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* ========== GPR[rt]_23..16 ========== */
8211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4,
8212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            unop(Iop_8Uto32,
8213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 unop(Iop_16to8,
8214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32HIto16, getIReg(rt)))));
8215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5,
8216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Shr32,
8217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkexpr(t4),
8218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_32to8, binop(Iop_And32,
8219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        getIReg(rs),
8220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkU32(0x7)))));
8221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* tempC_7..0 */
8222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3,
8223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Or32,
8224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkexpr(t5),
8225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  binop(Iop_Shl32,
8226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        IRExpr_ITE(binop(Iop_CmpEQ32,
8227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_And32,
8228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkexpr(t4),
8229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0x00000080)
8230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              ),
8231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkU32(0x00000080)),
8232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0xFFFFFFFF),
8233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0x00000000)),
8234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_Sub8,
8235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkU8(0x8),
8236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_32to8, binop(Iop_And32,
8237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                    getIReg(rs),
8238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                    mkU32(0x7)))
8239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              ))));
8240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* ========== GPR[rt]_15..8 ========== */
8242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7,
8243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            unop(Iop_8Uto32,
8244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 unop(Iop_16HIto8,
8245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to16, getIReg(rt)))));
8246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8,
8247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Shr32,
8248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkexpr(t7),
8249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_32to8, binop(Iop_And32,
8250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        getIReg(rs),
8251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkU32(0x7)))));
8252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* tempB_7..0 */
8253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6,
8254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Or32,
8255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkexpr(t8),
8256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  binop(Iop_Shl32,
8257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        IRExpr_ITE(binop(Iop_CmpEQ32,
8258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_And32,
8259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkexpr(t7),
8260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0x00000080)
8261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              ),
8262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkU32(0x00000080)),
8263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0xFFFFFFFF),
8264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0x00000000)),
8265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_Sub8,
8266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkU8(0x8),
8267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_32to8, binop(Iop_And32,
8268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                    getIReg(rs),
8269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                    mkU32(0x7)))
8270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              ))));
8271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* ========== GPR[rt]_7..0 ========== */
8273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t10,
8274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            unop(Iop_8Uto32,
8275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 unop(Iop_16to8,
8276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to16, getIReg(rt)))));
8277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t11,
8278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Shr32,
8279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkexpr(t10),
8280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_32to8, binop(Iop_And32,
8281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        getIReg(rs),
8282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkU32(0x7)))));
8283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* tempB_7..0 */
8284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t9,
8285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Or32,
8286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkexpr(t11),
8287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  binop(Iop_Shl32,
8288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        IRExpr_ITE(binop(Iop_CmpEQ32,
8289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_And32,
8290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkexpr(t10),
8291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0x00000080)
8292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              ),
8293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkU32(0x00000080)),
8294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0xFFFFFFFF),
8295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0x00000000)),
8296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_Sub8,
8297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkU8(0x8),
8298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_32to8, binop(Iop_And32,
8299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                    getIReg(rs),
8300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                    mkU32(0x7)))
8301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              ))));
8302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd,
8304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             binop(Iop_16HLto32,
8305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   binop(Iop_8HLto16,
8306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         unop(Iop_32to8,
8307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(binop(Iop_CmpEQ32,
8308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               binop(Iop_And32,
8309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                     mkU32(rs),
8310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                     mkU32(0x7)
8311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                    ),
8312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0x0)),
8313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkexpr(t1),
8314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkexpr(t0))),
8315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         unop(Iop_32to8,
8316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(binop(Iop_CmpEQ32,
8317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               binop(Iop_And32,
8318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                     mkU32(rs),
8319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                     mkU32(0x7)
8320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                    ),
8321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0x0)),
8322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkexpr(t2),
8323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkexpr(t3)))),
8324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   binop(Iop_8HLto16,
8325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         unop(Iop_32to8,
8326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(binop(Iop_CmpEQ32,
8327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               binop(Iop_And32,
8328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                     mkU32(rs),
8329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                     mkU32(0x7)
8330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                    ),
8331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0x0)),
8332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkexpr(t5),
8333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkexpr(t6))),
8334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         unop(Iop_32to8,
8335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(binop(Iop_CmpEQ32,
8336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               binop(Iop_And32,
8337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                     mkU32(rs),
8338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                     mkU32(0x7)
8339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                    ),
8340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0x0)),
8341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkexpr(t8),
8342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkexpr(t9))))));
8343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
8344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
8345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x7: {  /* SHRAV_R.QB */
8346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("shrav_r.qb r%d, r%d, r%d", rd, rt, rs);
8347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
8348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
8349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I8);
8350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
8351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I8);
8352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I32);
8353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I8);
8354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I32);
8355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I8);
8356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I8);
8357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I32);
8358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t9, binop(Iop_And32, getIReg(rs), mkU32(0x7)));
8360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8, unop(Iop_32to8,
8361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Sub32, mkexpr(t9), mkU32(0x1))));
8362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, unop(Iop_8Sto32,
8363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_16to8,
8364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32to16, getIReg(rt)))));
8365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, unop(Iop_32to8,
8366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Sar32,
8367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Add32,
8368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t0),
8369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Shl32,
8370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x1),
8371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t8))),
8372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to8,
8373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                mkexpr(t9)))));
8374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, unop(Iop_8Sto32,
8376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_16HIto8,
8377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32to16, getIReg(rt)))));
8378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, unop(Iop_32to8,
8379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Sar32,
8380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Add32,
8381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t2),
8382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Shl32,
8383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x1),
8384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t8))),
8385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to8, mkexpr(t9)))));
8386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, unop(Iop_8Sto32,
8388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_16to8,
8389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32HIto16, getIReg(rt)))));
8390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, unop(Iop_32to8,
8391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Sar32,
8392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Add32,
8393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t4),
8394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Shl32,
8395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x1),
8396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t8))),
8397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to8, mkexpr(t9)))));
8398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, unop(Iop_8Sto32,
8400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_16HIto8,
8401436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32HIto16, getIReg(rt)))));
8402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, unop(Iop_32to8,
8403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Sar32,
8404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Add32,
8405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t6),
8406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Shl32,
8407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x1),
8408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t8))),
8409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to8, mkexpr(t9)))));
8410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, IRExpr_ITE(binop(Iop_CmpEQ32,
8411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t9),
8412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x0)),
8413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(rt),
8414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_16HLto32,
8415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  binop(Iop_8HLto16,
8416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkexpr(t7),
8417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkexpr(t5)),
8418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  binop(Iop_8HLto16,
8419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkexpr(t3),
8420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkexpr(t1)))));
8421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
8422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
8423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x8: {  /* SHLL.PH */
8424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("shll.ph r%d, r%d, %d", rd, rt, rs);
8425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
8426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
8427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
8428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
8429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I32);
8430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I32);
8431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I32);
8432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I32);
8433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I32);
8434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (0 == rs) {
8436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rd, getIReg(rt));
8437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
8438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        /* Shift lower 16 bits. */
8439436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t0, binop(Iop_Shl32,
8440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         unop(Iop_16Sto32,
8441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_32to16, getIReg(rt))),
8442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkU8(rs)));
8443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t1, unop(Iop_1Uto32,
8445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_CmpNE32,
8446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               binop(Iop_Sar32,
8447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkexpr(t0),
8448436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkU8(16)),
8449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               mkU32(0))));
8450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t2, unop(Iop_1Uto32,
8451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_CmpNE32,
8452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Sar32,
8453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t0),
8454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU8(16)),
8455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkU32(0xffffffff))));
8456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t3, binop(Iop_And32,
8457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkexpr(t1),
8458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkexpr(t2)));
8459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putDSPControl(IRExpr_ITE(binop(Iop_CmpEQ32,
8460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t3),
8461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x1)),
8462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Or32,
8463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       getDSPControl(),
8464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x400000)),
8465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 getDSPControl()));
8466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putDSPControl(IRExpr_ITE(binop(Iop_CmpEQ32,
8467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       binop(Iop_And32,
8468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             getIReg(rt),
8469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU32(0x00008000)),
8470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       binop(Iop_And32,
8471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkexpr(t0),
8472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU32(0x00008000))
8473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      ),
8474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 getDSPControl(),
8475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Or32,
8476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       getDSPControl(),
8477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x400000))));
8478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        /* Shift higher 16 bits. */
8479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t4, binop(Iop_Shl32,
8480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         unop(Iop_16Sto32,
8481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_32HIto16, getIReg(rt))),
8482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkU8(rs)));
8483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t5, unop(Iop_1Uto32,
8485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_CmpNE32,
8486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               binop(Iop_Sar32,
8487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkexpr(t4),
8488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkU8(16)),
8489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               mkU32(0))));
8490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t6, unop(Iop_1Uto32,
8491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_CmpNE32,
8492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Sar32,
8493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t4),
8494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU8(16)),
8495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkU32(0xffffffff))));
8496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t7, binop(Iop_And32,
8497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkexpr(t5),
8498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkexpr(t6)));
8499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putDSPControl(IRExpr_ITE(binop(Iop_CmpEQ32,
8500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t7),
8501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x1)),
8502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Or32,
8503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       getDSPControl(),
8504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x400000)),
8505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 getDSPControl()));
8506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putDSPControl(IRExpr_ITE(binop(Iop_CmpEQ32,
8507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t7),
8508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x1)),
8509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Or32,
8510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       getDSPControl(),
8511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x400000)),
8512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 getDSPControl()));
8513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putDSPControl(IRExpr_ITE(binop(Iop_CmpEQ32,
8514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       binop(Iop_And32,
8515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             getIReg(rt),
8516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU32(0x80000000)),
8517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       binop(Iop_Shl32,
8518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             binop(Iop_And32,
8519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                   mkexpr(t4),
8520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                   mkU32(0x00008000)),
8521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU8(16))
8522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      ),
8523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 getDSPControl(),
8524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Or32,
8525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       getDSPControl(),
8526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x400000))));
8527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rd, binop(Iop_16HLto32,
8528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32to16, mkexpr(t4)),
8529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32to16, mkexpr(t0))));
8530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
8531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
8532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
8533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x9: {  /* SHRA.PH */
8534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("shra.ph r%d, r%d, %d", rd, rt, rs);
8535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
8536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
8537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
8538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (0 == rs) {
8539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rd, getIReg(rt));
8540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
8541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t0, binop(Iop_Sar32,
8542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         unop(Iop_16Sto32,
8543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_32to16, getIReg(rt))),
8544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkU8(rs)));
8545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t1, binop(Iop_Sar32,
8546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         unop(Iop_16Sto32,
8547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_32HIto16, getIReg(rt))),
8548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkU8(rs)));
8549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rd, binop(Iop_16HLto32,
8550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32to16, mkexpr(t1)),
8551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32to16, mkexpr(t0))));
8552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
8553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
8554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
8555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xA: {  /* SHLLV.PH */
8556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("shllv.ph r%d, r%d, r%d", rd, rt, rs);
8557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
8558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
8559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
8560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
8561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I1);
8562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I32);
8563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I32);
8564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I1);
8565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I1);
8566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I32);
8567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t10 = newTemp(Ity_I32);
8568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t11 = newTemp(Ity_I32);
8569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t12 = newTemp(Ity_I1);
8570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t13 = newTemp(Ity_I1);
8571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_And32, getIReg(rs), mkU32(0x0f)));
8573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Shift lower 16 bits. */
8575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_Shl32,
8576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
8577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rt))),
8578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to8, mkexpr(t0))));
8579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpNE32,
8581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
8582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, mkexpr(t2))),
8583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00000000)));
8584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, binop(Iop_CmpNE32,
8585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
8586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, mkexpr(t2))),
8587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0xffffffff)));
8588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t10, binop(Iop_And32,
8589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_1Sto32, mkexpr(t3)),
8590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_1Sto32, mkexpr(t4))));
8591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, binop(Iop_Shr32,
8592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
8593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(rt),
8594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x00008000)),
8595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU8(15)));
8596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t12, binop(Iop_CmpEQ32,
8597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t5),
8598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_Shr32,
8599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_And32,
8600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkexpr(t2),
8601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0x00008000)),
8602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU8(15))));
8603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpNE32,
8605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t10),
8606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x0)),
8607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
8608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
8609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x400000)),
8610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(mkexpr(t12),
8611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getDSPControl(),
8612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_Or32,
8613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               getDSPControl(),
8614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0x400000)))
8615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             ));
8616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Shift higher 16 bits. */
8617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, binop(Iop_Shl32,
8618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
8619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rt))),
8620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to8, mkexpr(t0))));
8621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, binop(Iop_CmpNE32,
8623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
8624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, mkexpr(t6))),
8625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00000000)));
8626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8, binop(Iop_CmpNE32,
8627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
8628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, mkexpr(t6))),
8629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0xffffffff)));
8630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t11, binop(Iop_And32,
8631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_1Sto32, mkexpr(t7)),
8632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_1Sto32, mkexpr(t8))));
8633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t9, binop(Iop_Shr32,
8635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
8636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(rt),
8637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x80000000)),
8638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU8(31)));
8639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t13, binop(Iop_CmpEQ32,
8640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t9),
8641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_Shr32,
8642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_And32,
8643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkexpr(t6),
8644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0x00008000)),
8645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU8(15))));
8646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpNE32,
8648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t11),
8649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x0)),
8650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
8651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
8652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x400000)),
8653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(mkexpr(t13),
8654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getDSPControl(),
8655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_Or32,
8656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               getDSPControl(),
8657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0x400000)))
8658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             ));
8659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_16HLto32,
8661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_32to16, mkexpr(t6)),
8662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_32to16, mkexpr(t2))));
8663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
8664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
8665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xB: {  /* SHRAV.PH */
8666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("shrav.ph r%d, r%d, r%d", rd, rt, rs);
8667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
8668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
8669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
8670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
8671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I32);
8672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_And32, getIReg(rs), mkU32(0x0f)));
8674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpEQ32, mkexpr(t0), mkU32(0x0)));
8675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_Sar32,
8676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
8677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rt))),
8678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to8, mkexpr(t0))));
8679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_Sar32,
8680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
8681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rt))),
8682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to8, mkexpr(t0))));
8683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd,
8684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             binop(Iop_16HLto32,
8685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   IRExpr_ITE(mkexpr(t1),
8686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_32HIto16, getIReg(rt)),
8687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_32to16, mkexpr(t3))),
8688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   IRExpr_ITE(mkexpr(t1),
8689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_32to16, getIReg(rt)),
8690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_32to16, mkexpr(t2)))));
8691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
8692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
8693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xC: {  /* SHLL_S.PH */
8694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("shll_s.ph r%d, r%d, %d", rd, rt, rs);
8695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
8696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
8697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
8698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
8699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I32);
8700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I32);
8701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I32);
8702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I32);
8703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I32);
8704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I32);
8705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I32);
8706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t10 = newTemp(Ity_I32);
8707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t11 = newTemp(Ity_I32);
8708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t12 = newTemp(Ity_I32);
8709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t13 = newTemp(Ity_I32);
8710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t14 = newTemp(Ity_I32);
8711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (0 == rs) {
8713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rd, getIReg(rt));
8714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
8715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        /* Shift lower 16 bits. */
8716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t0, binop(Iop_Shl32,
8717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         unop(Iop_16Sto32,
8718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_32to16, getIReg(rt))),
8719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkU8(rs)));
8720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t1, unop(Iop_1Uto32,
8722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_CmpNE32,
8723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               binop(Iop_Sar32,
8724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkexpr(t0),
8725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkU8(16)),
8726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               mkU32(0))));
8727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t2, unop(Iop_1Uto32,
8728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_CmpNE32,
8729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Sar32,
8730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t0),
8731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU8(16)),
8732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkU32(0xffffffff))));
8733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t3, binop(Iop_And32,
8734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkexpr(t1),
8735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkexpr(t2)));
8736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putDSPControl(IRExpr_ITE(binop(Iop_CmpEQ32,
8737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t3),
8738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x1)),
8739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Or32,
8740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       getDSPControl(),
8741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x400000)),
8742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 getDSPControl()));
8743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putDSPControl(IRExpr_ITE(binop(Iop_CmpEQ32,
8744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       binop(Iop_And32,
8745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             getIReg(rt),
8746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU32(0x00008000)),
8747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       binop(Iop_And32,
8748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkexpr(t0),
8749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU32(0x00008000))
8750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      ),
8751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 getDSPControl(),
8752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Or32,
8753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       getDSPControl(),
8754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x400000))));
8755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t8,
8756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               IRExpr_ITE(binop(Iop_CmpEQ32,
8757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                mkexpr(t3),
8758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                mkU32(0x1)),
8759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          IRExpr_ITE(binop(Iop_CmpEQ32,
8760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                           binop(Iop_And32,
8761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                 getIReg(rt),
8762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                 mkU32(0x8000)),
8763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                           mkU32(0)),
8764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkU32(0x00007fff),
8765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkU32(0x00008000)),
8766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          binop(Iop_And32,
8767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                mkexpr(t0),
8768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                mkU32(0x0000ffff))));
8769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t10,
8770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               IRExpr_ITE(binop(Iop_CmpEQ32,
8771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                binop(Iop_And32,
8772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      getIReg(rt),
8773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkU32(0x00008000)),
8774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                binop(Iop_And32,
8775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkexpr(t0),
8776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkU32(0x00008000))),
8777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          mkexpr(t8),
8778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          IRExpr_ITE(binop(Iop_CmpEQ32,
8779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                           binop(Iop_And32,
8780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                 getIReg(rt),
8781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                 mkU32(0x8000)),
8782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                           mkU32(0)),
8783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkU32(0x00007fff),
8784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkU32(0x00008000))));
8785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        /* Shift higher 16 bits. */
8786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t4, binop(Iop_Shl32,
8787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         unop(Iop_16Sto32,
8788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_32HIto16, getIReg(rt))),
8789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkU8(rs)));
8790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t5, unop(Iop_1Uto32,
8792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_CmpNE32,
8793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               binop(Iop_Sar32,
8794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkexpr(t4),
8795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkU8(16)),
8796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               mkU32(0))));
8797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t6, unop(Iop_1Uto32,
8798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_CmpNE32,
8799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Sar32,
8800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t4),
8801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU8(16)),
8802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkU32(0xffffffff))));
8803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t7, binop(Iop_And32,
8804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkexpr(t5),
8805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkexpr(t6)));
8806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putDSPControl(IRExpr_ITE(binop(Iop_CmpEQ32,
8807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t7),
8808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x1)),
8809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Or32,
8810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       getDSPControl(),
8811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x400000)),
8812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 getDSPControl()));
8813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putDSPControl(IRExpr_ITE(binop(Iop_CmpEQ32,
8814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t7),
8815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x1)),
8816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Or32,
8817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       getDSPControl(),
8818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x400000)),
8819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 getDSPControl()));
8820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t12, binop(Iop_Shl32,
8821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          binop(Iop_And32,
8822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                mkexpr(t4),
8823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                mkU32(0x8000)),
8824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          mkU8(16)));
8825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putDSPControl(IRExpr_ITE(binop(Iop_CmpEQ32,
8826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       binop(Iop_And32,
8827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             getIReg(rt),
8828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU32(0x80000000)),
8829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t12)),
8830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 getDSPControl(),
8831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Or32,
8832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       getDSPControl(),
8833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x400000))));
8834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t13, IRExpr_ITE(binop(Iop_CmpEQ32,
8835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     binop(Iop_And32,
8836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                           getIReg(rt),
8837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                           mkU32(0x80000000)),
8838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkU32(0)),
8839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               mkU32(0x7fff0000),
8840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               mkU32(0x80000000)));
8841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t9,
8842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               IRExpr_ITE(binop(Iop_CmpEQ32,
8843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                mkexpr(t7),
8844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                mkU32(0x1)),
8845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          mkexpr(t13),
8846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          binop(Iop_Shl32,
8847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                binop(Iop_And32,
8848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkexpr(t4),
8849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkU32(0x0000ffff)),
8850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                mkU8(16))));
8851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t14, IRExpr_ITE(binop(Iop_CmpEQ32,
8852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     binop(Iop_And32,
8853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                           getIReg(rt),
8854436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                           mkU32(0x80000000)),
8855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkU32(0)),
8856436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               mkU32(0x7fff0000),
8857436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               mkU32(0x80000000)));
8858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t11,
8859436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               IRExpr_ITE(binop(Iop_CmpEQ32,
8860436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                binop(Iop_And32,
8861436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      getIReg(rt),
8862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkU32(0x80000000)),
8863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                binop(Iop_Shl32,
8864436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      binop(Iop_And32,
8865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t4),
8866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkU32(0x00008000)),
8867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkU8(16))),
8868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          mkexpr(t9),
8869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          mkexpr(t14)));
8870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rd, binop(Iop_Or32,
8871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          mkexpr(t10),
8872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          mkexpr(t11)));
8873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
8874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
8875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
8876436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xD: {  /* SHRA_R.PH */
8877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("shra.ph r%d, r%d, %d", rd, rt, rs);
8878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
8879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
8880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
8881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (0 == rs) {
8882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rd, getIReg(rt));
8883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
8884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t0, binop(Iop_Sar32,
8885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         binop(Iop_Add32,
8886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               unop(Iop_16Sto32,
8887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    unop(Iop_32to16,
8888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getIReg(rt))),
8889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               binop(Iop_Shl32,
8890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkU32(0x1),
8891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkU8(rs-1))),
8892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkU8(rs)));
8893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t1, binop(Iop_Sar32,
8894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         binop(Iop_Add32,
8895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               unop(Iop_16Sto32,
8896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    unop(Iop_32HIto16,
8897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getIReg(rt))),
8898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               binop(Iop_Shl32,
8899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkU32(0x1),
8900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkU8(rs-1))),
8901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkU8(rs)));
8902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rd, binop(Iop_16HLto32,
8903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32to16, mkexpr(t1)),
8904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32to16, mkexpr(t0))));
8905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
8906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
8907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
8908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xE: {  /* SHLLV_S.PH */
8909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("shllv_s.ph r%d, r%d, r%d", rd, rt, rs);
8910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
8911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
8912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
8913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
8914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I1);
8915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I32);
8916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I32);
8917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I1);
8918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I1);
8919436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I32);
8920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t10 = newTemp(Ity_I32);
8921436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t11 = newTemp(Ity_I32);
8922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t12 = newTemp(Ity_I1);
8923436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t13 = newTemp(Ity_I1);
8924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t14 = newTemp(Ity_I16);
8925436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t15 = newTemp(Ity_I16);
8926436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t16 = newTemp(Ity_I16);
8927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t17 = newTemp(Ity_I16);
8928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8929436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_And32, getIReg(rs), mkU32(0x0f)));
8930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Shift lower 16 bits. */
8932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_Shl32,
8933436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
8934436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rt))),
8935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to8, mkexpr(t0))));
8936436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpNE32,
8938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
8939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, mkexpr(t2))),
8940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00000000)));
8941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, binop(Iop_CmpNE32,
8942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
8943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, mkexpr(t2))),
8944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0xffffffff)));
8945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t10, binop(Iop_And32,
8946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_1Sto32, mkexpr(t3)),
8947436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_1Sto32, mkexpr(t4))));
8948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, binop(Iop_Shr32,
8949436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_And32,
8950436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             getIReg(rt),
8951436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU32(0x00008000)),
8952436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkU8(15)));
8953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t12, binop(Iop_CmpEQ32,
8954436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t5),
8955436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_Shr32,
8956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_And32,
8957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkexpr(t2),
8958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0x00008000)),
8959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU8(15))));
8960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpNE32,
8962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t10),
8963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x0)),
8964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
8965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
8966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x400000)),
8967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(mkexpr(t12),
8968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getDSPControl(),
8969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_Or32,
8970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               getDSPControl(),
8971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0x400000)))
8972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             ));
8973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t14, IRExpr_ITE(binop(Iop_CmpNE32,
8974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t5),
8975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x0)),
8976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU16(0x8000),
8977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU16(0x7fff)));
8978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t15, IRExpr_ITE(binop(Iop_CmpNE32,
8979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t10),
8980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x0)),
8981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t14),
8982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            IRExpr_ITE(mkexpr(t12),
8983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_32to16,
8984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t2)),
8985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t14))));
8986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Shift higher 16 bits. */
8987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, binop(Iop_Shl32,
8988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
8989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rt))),
8990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to8, mkexpr(t0))));
8991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
8992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, binop(Iop_CmpNE32,
8993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
8994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, mkexpr(t6))),
8995436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00000000)));
8996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8, binop(Iop_CmpNE32,
8997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
8998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, mkexpr(t6))),
8999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0xffffffff)));
9000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t11, binop(Iop_And32,
9001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_1Sto32, mkexpr(t7)),
9002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_1Sto32, mkexpr(t8))));
9003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t9, binop(Iop_Shr32,
9005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
9006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(rt),
9007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x80000000)),
9008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU8(31)));
9009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t13, binop(Iop_CmpEQ32,
9010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t9),
9011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_Shr32,
9012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_And32,
9013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkexpr(t6),
9014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0x00008000)),
9015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU8(15))));
9016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpNE32,
9018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t11),
9019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x0)),
9020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
9021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
9022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x400000)),
9023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(mkexpr(t13),
9024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getDSPControl(),
9025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_Or32,
9026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               getDSPControl(),
9027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0x400000)))
9028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             ));
9029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t16, IRExpr_ITE(binop(Iop_CmpNE32,
9031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t9),
9032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x0)),
9033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU16(0x8000),
9034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU16(0x7fff)));
9035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t17, IRExpr_ITE(binop(Iop_CmpNE32,
9036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t11),
9037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x0)),
9038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkexpr(t16),
9039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            IRExpr_ITE(mkexpr(t13),
9040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_32to16,
9041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t6)),
9042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t16))));
9043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_16HLto32, mkexpr(t17), mkexpr(t15)));
9045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
9046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
9047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xF: {  /* SHRAV_R.PH */
9048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("shrav_r.ph r%d, r%d, r%d", rd, rt, rs);
9049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
9050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
9051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
9052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I8);
9053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I32);
9054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I32);
9055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_And32, getIReg(rs), mkU32(0x0f)));
9057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpEQ32, mkexpr(t0), mkU32(0x0)));
9058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, unop(Iop_32to8,
9059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Sub32, mkexpr(t0), mkU32(1))));
9060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_Sar32,
9062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Add32,
9063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_16Sto32,
9064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_32to16, getIReg(rt))),
9065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_Shl32,
9066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x1),
9067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t2))),
9068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to8, mkexpr(t0))));
9069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, binop(Iop_Sar32,
9070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Add32,
9071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_16Sto32,
9072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_32HIto16,
9073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      getIReg(rt))),
9074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_Shl32,
9075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x1),
9076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t2))),
9077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to8, mkexpr(t0))));
9078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_16HLto32,
9080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       IRExpr_ITE(mkexpr(t1),
9081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_32HIto16,
9082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       getIReg(rt)),
9083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_32to16,
9084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t4))),
9085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       IRExpr_ITE(mkexpr(t1),
9086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_32to16, getIReg(rt)),
9087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_32to16,
9088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t3)))));
9089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
9090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
9091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x14: {  /* SHLL_S.W */
9092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("shll_s.w r%d, r%d, %d", rd, rt, rs);
9093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
9094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
9095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
9096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
9097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I32);
9098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I32);
9099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I32);
9100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (0 == rs) {
9102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rd, getIReg(rt));
9103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
9104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        /* t0-bits that will be discarded, sign extended to
9105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           32bits. */
9106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t0, binop(Iop_Sar32,
9107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         binop(Iop_And32,
9108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               getIReg(rt),
9109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               binop(Iop_Sar32,
9110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkU32(0x80000000),
9111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     mkU8(rs-1))),
9112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkU8(32-rs)));
9113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t1, IRExpr_ITE(binop(Iop_CmpEQ32,
9115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_And32,
9116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          getIReg(rt),
9117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU32(0x80000000)),
9118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x0)),
9119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkU32(0x7fffffff),
9120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkU32(0x80000000)));
9121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t2, binop(Iop_Shl32, getIReg(rt), mkU8(rs)));
9123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t3, IRExpr_ITE(binop(Iop_CmpEQ32,
9124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_And32,
9125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          getIReg(rt),
9126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU32(0x80000000)),
9127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_And32,
9128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkexpr(t2),
9129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU32(0x80000000))),
9130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkexpr(t2),
9131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkexpr(t1)));
9132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t4, IRExpr_ITE(binop(Iop_CmpNE32,
9134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t0),
9135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x0)),
9136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(binop(Iop_CmpNE32,
9137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkexpr(t0),
9138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0xffffffff)
9139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              ),
9140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkexpr(t1),
9141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkexpr(t3)),
9142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkexpr(t3)));
9143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t5, IRExpr_ITE(binop(Iop_CmpNE32,
9144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t0),
9145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0xffffffff)),
9146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
9147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
9148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x400000)),
9149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
9150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putDSPControl(IRExpr_ITE(binop(Iop_CmpNE32,
9151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t0),
9152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x0)),
9153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t5),
9154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 getDSPControl()));
9155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putDSPControl(IRExpr_ITE(binop(Iop_CmpEQ32,
9156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       binop(Iop_And32,
9157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             getIReg(rt),
9158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU32(0x80000000)),
9159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       binop(Iop_And32,
9160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkexpr(t2),
9161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU32(0x80000000))
9162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            ),
9163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 getDSPControl(),
9164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Or32,
9165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       getDSPControl(),
9166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x400000))));
9167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rd, mkexpr(t4));
9168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
9169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
9170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
9171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x15: {  /* SHRA_R.W */
9172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("shra_r.w r%d, r%d, %d", rd, rt, rs);
9173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
9174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (0 == rs) {
9175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rd, getIReg(rt));
9176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
9177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rd, binop(Iop_Add32,
9178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          binop(Iop_Sar32,
9179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                getIReg(rt), mkU8(rs)),
9180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          binop(Iop_Shr32,
9181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                binop(Iop_And32,
9182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      getIReg(rt),
9183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      binop(Iop_Shl32,
9184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkU32(0x1),
9185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkU8(rs-1))),
9186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                mkU8(rs-1))));
9187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
9188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
9189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
9190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x16: {  /* SHLLV_S.W */
9191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("shllv_s.w r%d, r%d, r%d", rd, rt, rs);
9192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
9193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
9194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
9195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
9196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I64);
9197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I1);
9198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I1);
9199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I32);
9200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I1);
9201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I32);
9202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Check if shift amount is zero. */
9204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_And32, getIReg(rs), mkU32(0x1f)));
9205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpEQ32, mkexpr(t0), mkU32(0x0)));
9206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t2 = sign of the input value. */
9208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_Shr32,
9209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
9210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(rt),
9211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x80000000)),
9212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU8(31)));
9213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Shift left input value and check for overflow. */
9214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_Shl64,
9215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32Sto64, getIReg(rt)),
9216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to8, mkexpr(t0))));
9217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, binop(Iop_CmpNE32,
9218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64HIto32, mkexpr(t3)),
9219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00000000)));
9220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, binop(Iop_CmpNE32,
9221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64HIto32, mkexpr(t3)),
9222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0xffffffff)));
9223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, binop(Iop_And32,
9224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_1Uto32, mkexpr(t4)),
9225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_1Uto32, mkexpr(t5))));
9226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, binop(Iop_CmpEQ32,
9227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shr32,
9228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_And32,
9229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  getIReg(rt),
9230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x80000000)),
9231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(31)),
9232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shr32,
9233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_And32,
9234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_64to32, mkexpr(t3)),
9235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x80000000)),
9236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(31))));
9237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(unop(Iop_32to1, mkexpr(t6)),
9239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   binop(Iop_Or32,
9240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getDSPControl(),
9241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkU32(0x400000)),
9242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(mkexpr(t7),
9243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getDSPControl(),
9244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_Or32,
9245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               getDSPControl(),
9246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0x400000)))
9247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             ));
9248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8, IRExpr_ITE(unop(Iop_32to1,
9250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                mkexpr(t2)),
9251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x80000000),
9252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x7fffffff)));
9253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, IRExpr_ITE(unop(Iop_32to1, mkexpr(t6)),
9254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            IRExpr_ITE(unop(Iop_32to1,
9255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t2)),
9256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x80000000),
9257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x7fffffff)),
9258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            IRExpr_ITE(mkexpr(t7),
9259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_64to32,
9260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t3)),
9261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t8))));
9262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
9263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
9264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x17: {  /* SHRAV_R.W */
9265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("shrav_r.w r%d, r%d, r%d", rd, rt, rs);
9266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
9267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
9268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
9269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I8);
9270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I32);
9271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_And32, getIReg(rs), mkU32(0x1f)));
9273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpEQ32, mkexpr(t0), mkU32(0x0)));
9274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, unop(Iop_32to8,
9275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Sub32, mkexpr(t0), mkU32(1))));
9276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, IRExpr_ITE(mkexpr(t1),
9278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(rt),
9279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_Sar32,
9280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  binop(Iop_Add32,
9281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        binop(Iop_Sar32,
9282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              getIReg(rt),
9283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              mkexpr(t2)),
9284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkU32(0x1)),
9285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU8(1))));
9286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
9287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
9288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x19: {  /* SHRL.PH */
9289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("shrl.ph r%d, r%d, %d", rd, rt, rs);
9290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
9291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
9292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
9293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_Shr32,
9294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
9295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rt))),
9296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU8(rs)));
9297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_Shr32,
9298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
9299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rt))),
9300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU8(rs)));
9301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_16HLto32,
9302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_32to16, mkexpr(t1)),
9303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_32to16, mkexpr(t0))));
9304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
9305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
9306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x1B: {  /* SHRLV.PH */
9307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("shrlv.ph r%d, r%d, r%d", rd, rt, rs);
9308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
9309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
9310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
9311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
9312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I32);
9313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I16);
9314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I16);
9315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Get shift amount from lower 5 bits of rs
9317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        and check if it is zero. */
9318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_And32, getIReg(rs), mkU32(0x0f)));
9319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpEQ32, mkexpr(t0), mkU32(0x0)));
9320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_Shr32,
9322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
9323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rt))),
9324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to8, mkexpr(t0))));
9325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_Shr32,
9326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
9327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rt))),
9328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to8, mkexpr(t0))));
9329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, IRExpr_ITE(mkexpr(t1),
9331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rt)),
9332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, mkexpr(t3))));
9333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, IRExpr_ITE(mkexpr(t1),
9334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rt)),
9335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, mkexpr(t2))));
9336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_16HLto32, mkexpr(t4), mkexpr(t5)));
9337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
9338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
9339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
9340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     return -1;
9341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
9342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;  /* end of SHLL.QB */
9343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
9344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x18: {  /* ADDUH.QB/MUL.PH */
9345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               switch(sa) {
9346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x00: {  /* ADDUH.QB */
9347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("adduh.qb r%d, r%d, r%d", rd, rs, rt);
9348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
9349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
9350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_HAdd8Ux4, getIReg(rs), getIReg(rt)));
9352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, mkexpr(t0));
9354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
9355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
9356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x1: {  /* SUBUH.QB */
9357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("subuh.qb r%d, r%d, r%d", rd, rs, rt);
9358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
9359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
9360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_HSub8Ux4, getIReg(rs), getIReg(rt)));
9362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, mkexpr(t0));
9364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
9365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
9366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x02: {  /* ADDUH_R.QB */
9367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("adduh_r.qb r%d, r%d, r%d", rd, rs, rt);
9368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
9369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
9370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
9371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I8);
9372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I32);
9373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I32);
9374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I8);
9375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I32);
9376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I32);
9377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I8);
9378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I32);
9379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t10 = newTemp(Ity_I32);
9380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t11 = newTemp(Ity_I8);
9381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Extract input bytes, add values, add 1 and half the
9383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        result. */
9384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, unop(Iop_8Uto32,
9385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_16to8,
9386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32to16, getIReg(rs)))));
9387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, unop(Iop_8Uto32,
9388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_16to8,
9389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32to16, getIReg(rt)))));
9390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, unop(Iop_16to8,
9391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_32to16,
9392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          binop(Iop_Shr32,
9393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                binop(Iop_Add32,
9394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      binop(Iop_Add32,
9395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t0),
9396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t1)),
9397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkU32(0x00000001)),
9398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                mkU8(0x01)))));
9399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, unop(Iop_8Uto32,
9401436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_16HIto8,
9402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32to16, getIReg(rs)))));
9403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, unop(Iop_8Uto32,
9404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_16HIto8,
9405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32to16, getIReg(rt)))));
9406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, unop(Iop_16to8,
9407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_32to16,
9408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          binop(Iop_Shr32,
9409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                binop(Iop_Add32,
9410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      binop(Iop_Add32,
9411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t3),
9412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t4)),
9413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkU32(0x00000001)),
9414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                mkU8(0x01)))));
9415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, unop(Iop_8Uto32,
9417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_16to8,
9418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32HIto16, getIReg(rs)))));
9419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, unop(Iop_8Uto32,
9420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_16to8,
9421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32HIto16, getIReg(rt)))));
9422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8, unop(Iop_16to8,
9423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_32to16,
9424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          binop(Iop_Shr32,
9425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                binop(Iop_Add32,
9426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      binop(Iop_Add32,
9427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t7),
9428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t6)),
9429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkU32(0x00000001)),
9430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                mkU8(0x01)))));
9431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t9, unop(Iop_8Uto32,
9433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_16HIto8,
9434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32HIto16, getIReg(rs)))));
9435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t10, unop(Iop_8Uto32,
9436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16HIto8,
9437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rt)))));
9438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t11, unop(Iop_16to8,
9439436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to16,
9440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Shr32,
9441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Add32,
9442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       binop(Iop_Add32,
9443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkexpr(t9),
9444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkexpr(t10)),
9445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x00000001)),
9446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU8(0x01)))));
9447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9448436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_16HLto32,
9449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_8HLto16,
9450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkexpr(t11), mkexpr(t8)),
9451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_8HLto16,
9452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkexpr(t5), mkexpr(t2))));
9453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
9454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
9455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x3: {  /* SUBUH_R.QB */
9456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("subuh_r.qb r%d, r%d, r%d", rd, rs, rt);
9457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
9458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
9459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
9460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I32);
9461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I32);
9462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I32);
9463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I32);
9464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I32);
9465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I32);
9466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I8);
9467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t10 = newTemp(Ity_I8);
9468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t11 = newTemp(Ity_I8);
9469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t12 = newTemp(Ity_I8);
9470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Extract each byte of rs and rt. */
9472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, unop(Iop_8Uto32,
9473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_16to8,
9474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32to16, getIReg(rs)))));
9475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, unop(Iop_8Uto32,
9476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_16HIto8,
9477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32to16, getIReg(rs)))));
9478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, unop(Iop_8Uto32,
9479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_16to8,
9480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32HIto16, getIReg(rs)))));
9481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, unop(Iop_8Uto32,
9482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_16HIto8,
9483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32HIto16, getIReg(rs)))));
9484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, unop(Iop_8Uto32,
9486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_16to8,
9487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32to16, getIReg(rt)))));
9488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, unop(Iop_8Uto32,
9489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_16HIto8,
9490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32to16, getIReg(rt)))));
9491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, unop(Iop_8Uto32,
9492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_16to8,
9493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32HIto16, getIReg(rt)))));
9494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8, unop(Iop_8Uto32,
9495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_16HIto8,
9496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          unop(Iop_32HIto16, getIReg(rt)))));
9497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Add 1 to each resulting byte and half the results. */
9499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t9, unop(Iop_16to8,
9500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_32to16,
9501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          binop(Iop_Shr32,
9502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                binop(Iop_Add32,
9503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      binop(Iop_Sub32,
9504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t1),
9505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t5)),
9506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkU32(0x00000001)),
9507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                mkU8(0x01)))));
9508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t10, unop(Iop_16to8,
9509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to16,
9510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Shr32,
9511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Add32,
9512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       binop(Iop_Sub32,
9513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkexpr(t2),
9514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkexpr(t6)),
9515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x00000001)),
9516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU8(0x01)))));
9517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t11, unop(Iop_16to8,
9518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to16,
9519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_Shr32,
9520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  binop(Iop_Add32,
9521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        binop(Iop_Sub32,
9522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              mkexpr(t3),
9523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              mkexpr(t7)),
9524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkU32(0x00000001)),
9525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU8(0x01)))));
9526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t12, unop(Iop_16to8,
9527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to16,
9528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Shr32,
9529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Add32,
9530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       binop(Iop_Sub32,
9531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkexpr(t4),
9532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkexpr(t8)),
9533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x00000001)),
9534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU8(0x01)))));
9535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_16HLto32,
9537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_8HLto16,
9538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkexpr(t12), mkexpr(t11)),
9539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_8HLto16,
9540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkexpr(t10), mkexpr(t9))));
9541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
9542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
9543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x8: {  /* ADDQH.PH */
9544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("addqh.ph r%d, r%d, r%d", rd, rs, rt);
9545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
9546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
9547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I16);
9548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
9549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I16);
9550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Add lower halfs of rs and rt
9552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        and right shift the result by 1. */
9553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_Add32,
9554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
9555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rs))),
9556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
9557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rt)))));
9558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, unop(Iop_32to16,
9559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Shr32,
9560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_And32,
9561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t0),
9562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x0001fffe)),
9563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(0x1))));
9564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Add higher halfs of rs and rt
9565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        and right shift the result by 1. */
9566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_Add32,
9567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
9568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rs))),
9569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
9570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rt)))));
9571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, unop(Iop_32to16,
9572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Shr32,
9573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_And32,
9574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t2),
9575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x0001fffe)),
9576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(0x1))));
9577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_16HLto32, mkexpr(t3), mkexpr(t1)));
9578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
9579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
9580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x9: {  /* SUBQH.PH */
9581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("subqh.ph r%d, r%d, r%d", rd, rs, rt);
9582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
9583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_HSub16Sx2,
9585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       getIReg(rs), getIReg(rt)));
9586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
9587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
9588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xA: {/* ADDQH_R.PH */
9589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("addqh_r.ph r%d, r%d, r%d", rd, rs, rt);
9590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
9591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
9592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I16);
9593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
9594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I16);
9595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Add lower halfs of rs and rt, add 1
9597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        and right shift the result by 1. */
9598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_Add32,
9599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
9600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rs))),
9601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
9602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rt)))));
9603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, unop(Iop_32to16,
9604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Shr32,
9605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_And32,
9606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Add32,
9607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t0),
9608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x1)),
9609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x0001fffe)),
9610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(0x1))));
9611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Add higher halfs of rs and rt, add 1
9612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        and right shift the result by 1. */
9613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_Add32,
9614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
9615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rs))),
9616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
9617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rt)))));
9618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, unop(Iop_32to16,
9619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Shr32,
9620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_And32,
9621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Add32,
9622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t2),
9623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x1)),
9624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x0001fffe)),
9625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(0x1))));
9626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_16HLto32, mkexpr(t3), mkexpr(t1)));
9628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
9629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
9630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xB: {  /* SUBQH_R.PH */
9631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("subqh_r.ph r%d, r%d, r%d", rd, rs, rt);
9632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
9633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
9634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I16);
9635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
9636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I16);
9637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Sub lower halfs of rs and rt, add 1
9639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        and right shift the result by 1. */
9640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_Sub32,
9641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
9642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rs))),
9643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
9644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rt)))));
9645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, unop(Iop_32to16,
9646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Shr32,
9647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_And32,
9648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Add32,
9649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t0),
9650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x1)),
9651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x0001fffe)),
9652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(0x1))));
9653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Sub higher halfs of rs and rt, add 1
9654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        and right shift the result by 1. */
9655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_Sub32,
9656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
9657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rs))),
9658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
9659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rt)))));
9660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, unop(Iop_32to16,
9661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Shr32,
9662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_And32,
9663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Add32,
9664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t2),
9665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x1)),
9666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x0001fffe)),
9667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(0x1))));
9668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, binop(Iop_16HLto32, mkexpr(t3), mkexpr(t1)));
9670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
9671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
9672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xC: {  /* MUL.PH */
9673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("mul.ph r%d, r%d, r%d", rd, rs, rt);
9674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
9675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
9676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
9677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
9678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0,
9680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Mul32,
9681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_16Sto32,
9682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_32HIto16, getIReg(rs))),
9683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_16Sto32,
9684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_32HIto16, getIReg(rt)))));
9685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* DSP Control flag. */
9686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(unop(Iop_Not1,
9687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   binop(Iop_CmpLE32S,
9688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkexpr(t0),
9689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkU32(0x7FFF))),
9690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
9691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
9692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00200000)),
9693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(binop(Iop_CmpLT32S,
9694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkexpr(t0),
9695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0xFFFF8000)
9696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             ),
9697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_Or32,
9698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               getDSPControl(),
9699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0x00200000)
9700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              ),
9701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getDSPControl())));
9702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1,
9704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Mul32,
9705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_16Sto32,
9706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_32to16, getIReg(rs))),
9707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_16Sto32,
9708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_32to16, getIReg(rt)))));
9709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* DSP Control flag. */
9710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(unop(Iop_Not1,
9711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   binop(Iop_CmpLE32S,
9712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkexpr(t1),
9713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkU32(0x7FFF))),
9714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
9715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
9716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00200000)),
9717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(binop(Iop_CmpLT32S,
9718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkexpr(t1),
9719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0xFFFF8000)
9720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              ),
9721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_Or32,
9722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               getDSPControl(),
9723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0x00200000)
9724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              ),
9725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getDSPControl())));
9726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_16HLto32,
9728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to16, mkexpr(t0)),
9729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to16, mkexpr(t1))));
9730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, mkexpr(t2));
9731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
9732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
9733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xE: {  /* MUL_S.PH */
9734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("mul_s.ph r%d r%d, r%d", rd, rs, rt);
9735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
9736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
9738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
9739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
9740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I32);
9741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I32);
9742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t0 - signed intermediate result. */
9744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0,
9745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           binop(Iop_Mul32,
9746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 unop(Iop_16Sto32,
9747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32HIto16, getIReg(rs))),
9748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 unop(Iop_16Sto32,
9749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32HIto16, getIReg(rt)))));
9750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1,
9752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(unop(Iop_Not1,
9753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_CmpLE32S,
9754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t0),
9755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x7FFF))),
9756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkU32(0x00007FFF),
9757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       IRExpr_ITE(binop(Iop_CmpLT32S,
9758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkexpr(t0),
9759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkU32(0xFFFF8000)),
9760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0xFFFF8000),
9761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t0))));
9762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* DSP Control flag. */
9764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(unop(Iop_Not1,
9765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   binop(Iop_CmpLE32S,
9766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkexpr(t0),
9767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkU32(0x7FFF))),
9768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
9769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
9770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00200000)),
9771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(binop(Iop_CmpLT32S,
9772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkexpr(t0),
9773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0xFFFF8000)
9774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              ),
9775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_Or32,
9776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               getDSPControl(),
9777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0x00200000)
9778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              ),
9779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getDSPControl())));
9780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* t2 - signed intermediate result. */
9782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_Mul32,
9783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
9784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rs))),
9785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
9786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rt)))));
9787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, IRExpr_ITE(unop(Iop_Not1,
9789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                binop(Iop_CmpLE32S,
9790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkexpr(t2),
9791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkU32(0x7FFF))),
9792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU32(0x00007FFF),
9793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           IRExpr_ITE(binop(Iop_CmpLT32S,
9794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t2),
9795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkU32(0xFFFF8000)),
9796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkU32(0xFFFF8000),
9797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkexpr(t2))));
9798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* DSP Control flag. */
9800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(unop(Iop_Not1,
9801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   binop(Iop_CmpLE32S,
9802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkexpr(t2),
9803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkU32(0x7FFF))),
9804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
9805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
9806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x00200000)),
9807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(binop(Iop_CmpLT32S,
9808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkexpr(t2),
9809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0xFFFF8000)
9810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              ),
9811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_Or32,
9812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               getDSPControl(),
9813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0x00200000)
9814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              ),
9815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getDSPControl())));
9816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, binop(Iop_16HLto32,
9818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to16, mkexpr(t1)),
9819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32to16, mkexpr(t3))));
9820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, mkexpr(t4));
9821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
9822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
9823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x10: {  /* ADDQH.W */
9824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("addqh.w r%d, r%d, r%d", rd, rs, rt);
9825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
9826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
9827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I64);
9828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_Add64,
9830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32Sto64, getIReg(rs)),
9831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32Sto64, getIReg(rt))));
9832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_And64,
9833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkexpr(t0),
9834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU64(0x00000001fffffffeULL)));
9835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, unop(Iop_64to32,
9836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shr64, mkexpr(t1), mkU8(0x1))));
9837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
9838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
9839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x11: {  /* SUBQH.W */
9840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("subqh.w r%d, r%d, r%d", rd, rs, rt);
9841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
9842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
9843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I64);
9844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_Sub64,
9846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32Sto64, getIReg(rs)),
9847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32Sto64, getIReg(rt))));
9848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_And64,
9849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkexpr(t0),
9850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU64(0x00000001fffffffeULL)));
9851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, unop(Iop_64to32,
9852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shr64, mkexpr(t1), mkU8(0x1))));
9853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
9854436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
9855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x12: {  /* ADDQH_R.W */
9856436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("addqh_r.w r%d, r%d, r%d", rd, rs, rt);
9857436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
9858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
9859436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I64);
9860436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I64);
9861436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_Add64,
9863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32Sto64, getIReg(rs)),
9864436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32Sto64, getIReg(rt))));
9865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_Add64,
9866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkexpr(t0),
9867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU64(0x0000000000000001ULL)));
9868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_And64,
9869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkexpr(t1),
9870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU64(0x00000001fffffffeULL)));
9871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, unop(Iop_64to32,
9872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shr64, mkexpr(t2), mkU8(0x1))));
9873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
9874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
9875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x13: {  /* SUBQH_R.W */
9876436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("subqh_r.w r%d, r%d, r%d", rd, rs, rt);
9877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
9878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
9879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I64);
9880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I64);
9881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_Sub64,
9883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32Sto64, getIReg(rs)),
9884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32Sto64, getIReg(rt))));
9885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_Add64,
9886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkexpr(t0),
9887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU64(0x0000000000000001ULL)));
9888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_And64,
9889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkexpr(t1),
9890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU64(0x00000001fffffffeULL)));
9891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, unop(Iop_64to32,
9892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shr64, mkexpr(t2), mkU8(0x1))));
9893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
9894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
9895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x16: {  /* MULQ_S.W */
9896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("mulq_s.w r%d, r%d, r%d", rd, rs, rt);
9897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
9898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
9899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
9900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
9901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_Shl64,
9903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_MullS32,
9904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(rt), getIReg(rs)),
9905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU8(0x1)));
9906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpEQ32,
9907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg(rt), mkU32(0x80000000)));
9908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpEQ32,
9909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg(rs), mkU32(0x80000000)));
9910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t1),
9912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(mkexpr(t2),
9913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_Or32,
9914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               getDSPControl(),
9915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0x00200000)
9916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              ),
9917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getDSPControl()),
9918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
9919436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, IRExpr_ITE(mkexpr(t1),
9920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            IRExpr_ITE(mkexpr(t2),
9921436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x7fffffff),
9922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_64HIto32,
9923436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t0))),
9924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64HIto32, mkexpr(t0))));
9925436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
9926436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
9927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x17: {  /* MULQ_RS.W */
9928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("mulq_rs.w r%d, r%d, r%d", rd, rs, rt);
9929436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
9930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
9931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
9932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
9933436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9934436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_Add64,
9935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shl64,
9936436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_MullS32,
9937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  getIReg(rt),
9938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  getIReg(rs)),
9939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(0x1)),
9940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU64(0x0000000080000000ULL)));
9941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1,
9942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_CmpEQ32, getIReg(rt), mkU32(0x80000000)));
9943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2,
9944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_CmpEQ32, getIReg(rs), mkU32(0x80000000)));
9945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t1),
9946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(mkexpr(t2),
9947436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_Or32,
9948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               getDSPControl(),
9949436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkU32(0x00200000)
9950436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              ),
9951436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getDSPControl()),
9952436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
9953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rd, IRExpr_ITE(mkexpr(t1),
9954436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            IRExpr_ITE(mkexpr(t2),
9955436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x7fffffff),
9956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_64HIto32,
9957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t0))),
9958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64HIto32, mkexpr(t0))));
9959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
9960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
9961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
9962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     return -1;
9963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
9964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;  /* end of ADDUH.QB/MUL.PH */
9965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
9966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x30: {  /* DPAQ.W.PH */
9967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               switch(sa) {
9968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x0: {  /* DPA.W.PH */
9969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("dpa.w.ph ac%d, r%d, r%d", ac, rs, rt);
9970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
9971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
9973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I64);
9974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I64);
9975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
9976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0,
9977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            unop(Iop_32Sto64,
9978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 binop(Iop_Mul32,
9979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16Sto32,
9980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rs))),
9981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16Sto32,
9982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rt))))));
9983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1,
9984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            unop(Iop_32Sto64,
9985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 binop(Iop_Mul32,
9986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16Sto32,
9987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rs))),
9988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16Sto32,
9989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rt))))));
9990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2,
9991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Add64,
9992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  getAcc(ac),
9993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  binop(Iop_Add64, mkexpr(t0), mkexpr(t1))));
9994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putAcc(ac, mkexpr(t2));
9995436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
9996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
9997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x1: {  /* DPS.W.PH */
9998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("dps.w.ph ac%d, r%d, r%d", ac, rs, rt);
9999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
10000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
10002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I64);
10003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I64);
10004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0,
10006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            unop(Iop_32Sto64,
10007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 binop(Iop_Mul32,
10008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16Sto32,
10009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rs))),
10010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16Sto32,
10011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rt))))));
10012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1,
10013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            unop(Iop_32Sto64,
10014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 binop(Iop_Mul32,
10015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16Sto32,
10016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rs))),
10017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16Sto32,
10018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rt))))));
10019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2,
10020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Sub64,
10021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  getAcc(ac),
10022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  binop(Iop_Add64, mkexpr(t0), mkexpr(t1))));
10023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putAcc(ac, mkexpr(t2));
10024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
10025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
10026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x2: {  /* MULSA.W.PH */
10027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("mulsa.w.ph ac%d, r%d, r%d", ac, rs, rt);
10028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
10029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
10030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
10031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
10032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
10033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I64);
10034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, getAcc(ac));
10036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_Mul32,
10037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
10038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rt))),
10039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
10040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rs)))));
10041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_Mul32,
10042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
10043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rt))),
10044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Sto32,
10045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rs)))));
10046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_Sub32, mkexpr(t1), mkexpr(t0)));
10047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putAcc(ac, binop(Iop_Add64,
10048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkexpr(t4),
10049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32Sto64, mkexpr(t2))));
10050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
10051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
10052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x3: {  /* DPAU.H.QBL */
10053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("dpau.h.qbl ac%d, r%d, r%d", ac, rs, rt);
10054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
10055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
10056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
10057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I64);
10058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I64);
10059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0,
10061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Mul32,
10062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
10063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16HIto8,
10064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rs)))),
10065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
10066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16HIto8,
10067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rt))))));
10068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1,
10069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Mul32,
10070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
10071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16to8,
10072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rs)))),
10073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
10074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16to8,
10075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rt))))));
10076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2,
10077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            unop(Iop_32Uto64,
10078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 binop(Iop_Add32,
10079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t0),
10080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t1))));
10081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3,
10082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Add64, getAcc(ac), mkexpr(t2)));
10083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putAcc(ac, mkexpr(t3));
10084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
10085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
10086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x4: {  /* DPAQ_S.W.PH */
10087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("dpaq_s.w.ph ac%d, r%d, r%d", ac, rs, rt);
10088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
10089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
10090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I64);
10091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
10092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
10093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I64);
10094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I64);
10095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I1);
10096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I1);
10097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I64);
10098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I64);
10099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, getAcc(ac));
10101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_Shl64,
10103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_MullS32,
10104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_16Sto32,
10105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_32HIto16,
10106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      getIReg(rs))),
10107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_16Sto32,
10108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_32HIto16,
10109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      getIReg(rt)))),
10110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU8(0x1)));
10111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpEQ32,
10112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
10113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rs))),
10114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
10115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpEQ32,
10116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
10117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rt))),
10118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
10119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4,
10120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(mkexpr(t2),
10121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       IRExpr_ITE(mkexpr(t3),
10122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0x000000007fffffffULL),
10123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t1)),
10124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t1)));
10125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t2),
10127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(mkexpr(t3),
10128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_Or32,
10129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               getDSPControl(),
10130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               binop(Iop_Shl32,
10131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                     mkU32(0x1),
10132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                     mkU8(ac+16)
10133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                    )
10134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              ),
10135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getDSPControl()),
10136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
10137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, binop(Iop_Shl64,
10139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_MullS32,
10140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_16Sto32,
10141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_32to16, getIReg(rs))),
10142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_16Sto32,
10143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_32to16, getIReg(rt)))
10144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           ),
10145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU8(0x1)));
10146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, binop(Iop_CmpEQ32,
10147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
10148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rs))),
10149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
10150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, binop(Iop_CmpEQ32,
10151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
10152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rt))),
10153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
10154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8,
10155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(mkexpr(t6),
10156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       IRExpr_ITE(mkexpr(t7),
10157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0x000000007fffffffULL),
10158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t5)),
10159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t5)));
10160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t6),
10162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(mkexpr(t7),
10163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_Or32,
10164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               getDSPControl(),
10165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               binop(Iop_Shl32,
10166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                     mkU32(0x1),
10167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                     mkU8(ac+16)
10168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                    )
10169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              ),
10170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getDSPControl()),
10171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
10172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t9, binop(Iop_Add64,
10174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Add64, mkexpr(t4), mkexpr(t8)),
10175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkexpr(t0)));
10176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putAcc(ac, mkexpr(t9));
10177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
10178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
10179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x5: {  /* DPSQ_S.W.PH */
10180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("dpsq_s.w.ph ac%d r%d, r%d", ac, rs, rt);
10181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
10182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
10183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I64);
10184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
10185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
10186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I64);
10187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I64);
10188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I1);
10189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I1);
10190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I64);
10191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I64);
10192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, getAcc(ac));
10194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_Shl64,
10196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_MullS32,
10197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_16Sto32,
10198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_32HIto16,
10199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      getIReg(rs))),
10200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_16Sto32,
10201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_32HIto16,
10202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      getIReg(rt)))),
10203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU8(0x1)));
10204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpEQ32,
10205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
10206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rs))),
10207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
10208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpEQ32,
10209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
10210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rt))),
10211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
10212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4,
10213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(mkexpr(t2),
10214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       IRExpr_ITE(mkexpr(t3),
10215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0x000000007fffffffULL),
10216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t1)),
10217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t1)));
10218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t2),
10220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(mkexpr(t3),
10221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_Or32,
10222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               getDSPControl(),
10223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               binop(Iop_Shl32,
10224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                     mkU32(0x1),
10225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                     mkU8(ac+16)
10226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                    )
10227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              ),
10228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getDSPControl()),
10229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
10230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5,
10232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Shl64,
10233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  binop(Iop_MullS32,
10234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        unop(Iop_16Sto32,
10235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             unop(Iop_32to16, getIReg(rs))),
10236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        unop(Iop_16Sto32,
10237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             unop(Iop_32to16, getIReg(rt)))),
10238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU8(0x1)));
10239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, binop(Iop_CmpEQ32,
10240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
10241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rs))),
10242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
10243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, binop(Iop_CmpEQ32,
10244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
10245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rt))),
10246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
10247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8,
10248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(mkexpr(t6),
10249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       IRExpr_ITE(mkexpr(t7),
10250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0x000000007fffffffULL),
10251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t5)),
10252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t5)));
10253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t6),
10255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(mkexpr(t7),
10256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_Or32,
10257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               getDSPControl(),
10258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               binop(Iop_Shl32,
10259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                     mkU32(0x1),
10260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                     mkU8(ac+16)
10261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                    )
10262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              ),
10263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getDSPControl()),
10264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
10265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t9,
10267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Sub64,
10268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkexpr(t0),
10269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  binop(Iop_Add64, mkexpr(t4), mkexpr(t8))));
10270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putAcc(ac, mkexpr(t9));
10271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
10272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
10273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x6: {  /* MULSAQ_S.W.PH */
10274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("mulsaq_s.w.ph ac%d r%d, r%d", ac, rs, rt);
10275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
10276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
10278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
10279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
10280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I32);
10281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I32);
10282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I32);
10283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I64);
10284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I64);
10285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I32);
10286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I32);
10287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, unop(Iop_16Sto32,
10289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_32HIto16, getIReg(rs))));
10290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, unop(Iop_16Sto32,
10291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_32HIto16, getIReg(rt))));
10292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8, binop(Iop_And32,
10294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_1Sto32,
10295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_CmpEQ32,
10296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_16Uto32,
10297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      unop(Iop_32HIto16,
10298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                           getIReg(rs))),
10299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x8000))),
10300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                    unop(Iop_1Sto32,
10301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         binop(Iop_CmpEQ32,
10302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               unop(Iop_16Uto32,
10303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    unop(Iop_32HIto16,
10304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getIReg(rt))),
10305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               mkU32(0x8000)))));
10306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* DSPControl_outflag:16+acc <- 1 */
10307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpNE32,
10308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t8),
10309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x0)),
10310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
10311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
10312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_Shl32,
10313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU32(0x00010000),
10314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU8(ac))),
10315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
10316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* tempB_31..0 */
10318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2,
10319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(binop(Iop_CmpNE32,
10320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkexpr(t8), mkU32(0x0)),
10321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkU32(0x7FFFFFFF),
10322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_Shl32,
10323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_Mul32,
10324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkexpr(t0), mkexpr(t1)),
10325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU8(1))));
10326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, unop(Iop_16Sto32,
10328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_32to16, getIReg(rs))));
10329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, unop(Iop_16Sto32,
10330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_32to16, getIReg(rt))));
10331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t9, binop(Iop_And32,
10333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_1Sto32,
10334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_CmpEQ32,
10335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_16Uto32,
10336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      unop(Iop_32to16,
10337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                           getIReg(rs))),
10338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x8000))),
10339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_1Sto32,
10340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_CmpEQ32,
10341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_16Uto32,
10342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      unop(Iop_32to16,
10343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                           getIReg(rt))),
10344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x8000)))));
10345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* DSPControl_outflag:16+acc <- 1 */
10346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpNE32,
10347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkexpr(t9),
10348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0x0)),
10349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
10350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
10351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_Shl32,
10352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU32(0x00010000),
10353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU8(ac))),
10354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
10355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* tempA_31..0 */
10356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5,
10357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(binop(Iop_CmpNE32,
10358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkexpr(t9),
10359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU32(0x0)),
10360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkU32(0x7FFFFFFF),
10361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_Shl32,
10362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_Mul32,
10363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkexpr(t3),
10364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkexpr(t4)),
10365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU8(1))));
10366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* dotp_63..0 */
10367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6,
10368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Sub64,
10369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_32Sto64, mkexpr(t2)),
10370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_32Sto64, mkexpr(t5))));
10371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* tempC_63..0 */
10372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, binop(Iop_Add64, getAcc(ac), mkexpr(t6)));
10373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putAcc(ac, mkexpr(t7));
10375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
10376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
10377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x7: {  /* DPAU.H.QBR */
10378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("dpau.h.qbr ac%d, r%d, r%d", ac, rs, rt);
10379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
10380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
10381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
10382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I64);
10383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I64);
10384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0,
10386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Mul32,
10387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
10388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16HIto8,
10389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rs)))),
10390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
10391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16HIto8,
10392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rt))))));
10393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1,
10394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Mul32,
10395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
10396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16to8,
10397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rs)))),
10398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
10399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16to8,
10400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rt))))));
10401436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, unop(Iop_32Uto64,
10402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Add32, mkexpr(t0), mkexpr(t1))));
10403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_Add64, getAcc(ac), mkexpr(t2)));
10404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putAcc(ac, mkexpr(t3));
10405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
10406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
10407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x8: {  /* DPAX.W.PH */
10408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("dpax.w.ph ac%d, r%d, r%d", ac, rs, rt);
10409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
10410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
10411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I64);
10412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I64);
10413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0,
10415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            unop(Iop_32Sto64,
10416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 binop(Iop_Mul32,
10417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16Sto32,
10418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rs))),
10419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16Sto32,
10420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rt))))));
10421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1,
10422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            unop(Iop_32Sto64,
10423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 binop(Iop_Mul32,
10424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16Sto32,
10425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rs))),
10426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16Sto32,
10427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rt))))));
10428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2,
10429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Add64,
10430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  getAcc(ac),
10431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  binop(Iop_Add64, mkexpr(t0), mkexpr(t1))));
10432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putAcc(ac, mkexpr(t2));
10433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
10434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
10435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x9: {  /* DPSX.W.PH */
10436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("dpsx.w.ph ac%d r%d, r%d", ac, rs, rt);
10437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
10438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10439436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
10440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I64);
10441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I64);
10442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0,
10444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            unop(Iop_32Sto64,
10445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 binop(Iop_Mul32,
10446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16Sto32,
10447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rs))),
10448436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16Sto32,
10449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rt))))));
10450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1,
10451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            unop(Iop_32Sto64,
10452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 binop(Iop_Mul32,
10453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16Sto32,
10454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rs))),
10455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16Sto32,
10456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rt))))));
10457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2,
10458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Sub64,
10459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  getAcc(ac),
10460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  binop(Iop_Add64, mkexpr(t0), mkexpr(t1))));
10461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putAcc(ac, mkexpr(t2));
10462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
10463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
10464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xB: {  /* DPSU.H.QBL */
10465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("dpsu.h.qbl ac%d, r%d, r%d", ac, rs, rt);
10466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
10467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
10469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
10470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I64);
10471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I64);
10472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0,
10474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Mul32,
10475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
10476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16HIto8,
10477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rs)))),
10478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
10479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16HIto8,
10480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rt))))));
10481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1,
10482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Mul32,
10483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
10484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16to8,
10485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rs)))),
10486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
10487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16to8,
10488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32HIto16, getIReg(rt))))));
10489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2,
10490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            unop(Iop_32Uto64,
10491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 binop(Iop_Add32, mkexpr(t0), mkexpr(t1))));
10492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3,
10493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Sub64, getAcc(ac), mkexpr(t2)));
10494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putAcc(ac, mkexpr(t3));
10495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
10496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
10497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xC: {  /* DPAQ_SA.L.W */
10498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("dpaq_sa.l.w ac%d, r%d, r%d", ac, rs, rt);
10499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
10500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
10501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I64);
10502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
10503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
10504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I64);
10505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I64);
10506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I64);
10507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I64);
10508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I1);
10509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I1);
10510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, getAcc(ac));
10512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_Shl64,
10514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_MullS32,
10515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(rs), getIReg(rt)),
10516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU8(0x1)));
10517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpEQ32,
10519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg(rs),
10520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x80000000)));
10521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpEQ32,
10522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg(rt),
10523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x80000000)));
10524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4,
10526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(mkexpr(t2),
10527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       IRExpr_ITE(mkexpr(t3),
10528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0x7fffffffffffffffULL),
10529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t1)),
10530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t1)));
10531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t2),
10533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(mkexpr(t3),
10534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_Or32,
10535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               getDSPControl(),
10536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               binop(Iop_Shl32,
10537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                     mkU32(0x1),
10538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                     mkU8(ac+16)
10539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                    )
10540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              ),
10541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getDSPControl()),
10542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
10543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, binop(Iop_Add64,
10545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32Uto64,
10546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_64to32, mkexpr(t0))),
10547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32Uto64,
10548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_64to32, mkexpr(t4)))));
10549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6,
10550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Add64,
10551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  binop(Iop_Add64,
10552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        unop(Iop_32Sto64,
10553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             unop(Iop_64HIto32, mkexpr(t0))),
10554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        unop(Iop_32Sto64,
10555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             unop(Iop_64HIto32, mkexpr(t4)))),
10556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_32Uto64,
10557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_And32,
10558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             unop(Iop_64HIto32, mkexpr(t5)),
10559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU32(0x1)))));
10560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, binop(Iop_32HLto64,
10561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64to32, mkexpr(t6)),
10562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64to32, mkexpr(t5))));
10563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8, binop(Iop_CmpEQ32,
10564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shr32,
10565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_And32,
10566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_64to32, mkexpr(t6)),
10567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x80000000)),
10568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(31)),
10569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
10570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64HIto32, mkexpr(t6)),
10571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x00000001))));
10572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t9, binop(Iop_CmpEQ32,
10573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
10574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64HIto32,
10575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t6)),
10576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x00000001)),
10577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x1)));
10578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t8),
10579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl(),
10580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
10581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
10582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_Shl32,
10583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU32(0x1),
10584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU8(ac+16)))));
10585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putAcc(ac,
10586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(mkexpr(t8),
10587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t7),
10588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       IRExpr_ITE(mkexpr(t9),
10589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0x8000000000000000ULL),
10590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0x7fffffffffffffffULL)))
10591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           );
10592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
10593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
10594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xD: {  /* DPSQ_SA.L.W */
10595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("dpsq_sa.l.w ac%d, r%d, r%d", ac, rs, rt);
10596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
10597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
10598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I64);
10599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
10600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
10601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I64);
10602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I64);
10603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I64);
10604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I64);
10605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I1);
10606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I1);
10607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, getAcc(ac));
10609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_Shl64,
10611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_MullS32,
10612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(rs), getIReg(rt)),
10613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU8(0x1)));
10614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpEQ32,
10616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg(rs),
10617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x80000000)));
10618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpEQ32,
10619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg(rt),
10620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x80000000)));
10621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4,
10623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(mkexpr(t2),
10624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       IRExpr_ITE(mkexpr(t3),
10625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0x7fffffffffffffffULL),
10626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t1)),
10627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t1)));
10628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t2),
10630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(mkexpr(t3),
10631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_Or32,
10632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               getDSPControl(),
10633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               binop(Iop_Shl32,
10634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                     mkU32(0x1),
10635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                     mkU8(ac+16)
10636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                    )
10637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              ),
10638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getDSPControl()),
10639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
10640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, binop(Iop_Sub64,
10642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32Uto64,
10643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_64to32, mkexpr(t0))),
10644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32Uto64,
10645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_64to32, mkexpr(t4)))));
10646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, binop(Iop_Sub64,
10647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Add64,
10648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32Sto64,
10649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_64HIto32, mkexpr(t0))
10650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                ),
10651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32Sto64,
10652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_1Sto32,
10653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      binop(Iop_CmpLT32U,
10654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            unop(Iop_64to32,
10655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                 mkexpr(t0)),
10656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            unop(Iop_64to32,
10657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                mkexpr(t4)))))),
10658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_32Sto64,
10659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_64HIto32, mkexpr(t4)))));
10660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, binop(Iop_32HLto64,
10661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64to32, mkexpr(t6)),
10662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_64to32, mkexpr(t5))));
10663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8, binop(Iop_CmpEQ32,
10664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shr32,
10665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_And32,
10666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_64to32, mkexpr(t6)),
10667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x80000000)),
10668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(31)),
10669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
10670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64HIto32, mkexpr(t6)),
10671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x00000001))));
10672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t9, binop(Iop_CmpEQ32,
10673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
10674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64HIto32, mkexpr(t6)),
10675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x00000001)),
10676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x1)));
10677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t8),
10678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl(),
10679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
10680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
10681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_Shl32,
10682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU32(0x1),
10683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU8(ac+16)))));
10684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putAcc(ac,
10685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(mkexpr(t8),
10686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t7),
10687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       IRExpr_ITE(mkexpr(t9),
10688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0x8000000000000000ULL),
10689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0x7fffffffffffffffULL)))
10690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           );
10691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
10692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
10693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0xF: {  /* DPSU.H.QBR */
10694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("dpsu.h.qbr ac%d r%d, r%d", ac, rs, rt);
10695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
10696663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
10698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
10699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I64);
10700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I64);
10701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0,
10703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Mul32,
10704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
10705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16HIto8,
10706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rs)))),
10707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
10708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16HIto8,
10709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rt))))));
10710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1,
10711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Mul32,
10712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
10713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16to8,
10714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rs)))),
10715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  unop(Iop_8Uto32,
10716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       unop(Iop_16to8,
10717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_32to16, getIReg(rt))))));
10718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, unop(Iop_32Uto64,
10719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Add32, mkexpr(t0), mkexpr(t1))));
10720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_Sub64, getAcc(ac), mkexpr(t2)));
10721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putAcc(ac, mkexpr(t3));
10722663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
10724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
10725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x10: {  /* MAQ_SA.W.PHL */
10726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("maq_sa.w.phl ac%d, r%d, r%d", ac, rs, rt);
10727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
10728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
10729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I64);
10730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
10731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
10732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I64);
10733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I64);
10734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I1);
10735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I64);
10736663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, getAcc(ac));
10738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, unop(Iop_32Sto64,
10739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Shl32,
10740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Mul32,
10741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_16Sto32,
10742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      unop(Iop_32HIto16,
10743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                           getIReg(rs))),
10744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_16Sto32,
10745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      unop(Iop_32HIto16,
10746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                           getIReg(rt)))),
10747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(0x1))));
10748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* If both input arguments are equal 0x8000, saturate
10750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        intermediate product and write to DSPControl register.
10751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     */
10752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpEQ32,
10753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
10754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rs))),
10755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
10756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpEQ32,
10757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
10758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rt))),
10759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
10760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4,
10762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(mkexpr(t2),
10763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       IRExpr_ITE(mkexpr(t3),
10764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0x000000007fffffffULL),
10765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t1)),
10766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t1)));
10767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t2),
10769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(mkexpr(t3),
10770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_Or32,
10771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               getDSPControl(),
10772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               binop(Iop_Shl32,
10773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                     mkU32(0x1),
10774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                     mkU8(ac+16)
10775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                    )
10776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              ),
10777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getDSPControl()),
10778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
10779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Add intermediate product and value in the
10780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        accumulator. */
10781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, binop(Iop_Add64, mkexpr(t0), mkexpr(t4)));
10782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Compare bits 31 and 32 of the value in t5. */
10784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, binop(Iop_CmpEQ32,
10785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shr32,
10786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_And32,
10787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_64to32, mkexpr(t5)),
10788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x80000000)),
10789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(31)),
10790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
10791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64HIto32, mkexpr(t5)),
10792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(1))));
10793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t6),
10794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl(),
10795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
10796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
10797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_Shl32,
10798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU32(0x1),
10799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU8(ac+16)))));
10800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7,
10801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(mkexpr(t6),
10802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t5),
10803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       IRExpr_ITE(binop(Iop_CmpEQ32,
10804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        binop(Iop_And32,
10805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              unop(Iop_64HIto32,
10806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                   mkexpr(t5)),
10807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              mkU32(1)),
10808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkU32(0x0)),
10809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0x000000007fffffffULL),
10810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0xffffffff80000000ULL)))
10811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           );
10812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putAcc(ac, mkexpr(t7));
10813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
10814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
10815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x12: {  /* MAQ_SA.W.PHR */
10816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("maq_sa.w.phr ac%d, r%d, r%d", ac, rs, rt);
10817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
10818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
10819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I64);
10820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
10821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
10822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I64);
10823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I64);
10824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I1);
10825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I64);
10826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, getAcc(ac));
10828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, unop(Iop_32Sto64,
10829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Shl32,
10830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Mul32,
10831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_16Sto32,
10832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      unop(Iop_32to16,
10833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                           getIReg(rs))),
10834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_16Sto32,
10835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      unop(Iop_32to16,
10836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                           getIReg(rt)))),
10837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(0x1))));
10838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* If both input arguments are equal 0x8000, saturate
10840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        intermediate product and write to DSPControl
10841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        register. */
10842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpEQ32,
10843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
10844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rs))),
10845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
10846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpEQ32,
10847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
10848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rt))),
10849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
10850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4,
10852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(mkexpr(t2),
10853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       IRExpr_ITE(mkexpr(t3),
10854436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0x000000007fffffffULL),
10855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t1)),
10856436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t1)));
10857436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t2),
10859436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(mkexpr(t3),
10860436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_Or32,
10861436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               getDSPControl(),
10862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               binop(Iop_Shl32,
10863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                     mkU32(0x1),
10864436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                     mkU8(ac+16)
10865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                    )
10866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              ),
10867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getDSPControl()),
10868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
10869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Add intermediate product and value in the
10870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        accumulator. */
10871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, binop(Iop_Add64, mkexpr(t0), mkexpr(t4)));
10872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Compare bits 31 and 32 of the value in t5. */
10874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, binop(Iop_CmpEQ32,
10875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Shr32,
10876436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_And32,
10877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_64to32, mkexpr(t5)),
10878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU32(0x80000000)),
10879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU8(31)),
10880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
10881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_64HIto32, mkexpr(t5)),
10882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(1))));
10883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t6),
10884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl(),
10885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
10886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
10887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_Shl32,
10888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU32(0x1),
10889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU8(ac+16)))));
10890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7,
10891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(mkexpr(t6),
10892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t5),
10893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       IRExpr_ITE(binop(Iop_CmpEQ32,
10894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        binop(Iop_And32,
10895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              unop(Iop_64HIto32,
10896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                   mkexpr(t5)),
10897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              mkU32(1)),
10898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkU32(0x0)),
10899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0x000000007fffffffULL),
10900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0xffffffff80000000ULL)))
10901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           );
10902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putAcc(ac, mkexpr(t7));
10903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
10904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
10905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x14: {  /* MAQ_S.W.PHL */
10906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("maq_s.w.phl ac%d, r%d, r%d", ac, rs, rt);
10907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
10908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
10909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
10910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
10911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
10912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I32);
10913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I64);
10914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, getAcc(ac));
10916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, unop(Iop_16Sto32,
10918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_32HIto16, getIReg(rs))));
10919436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, unop(Iop_16Sto32,
10920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_32HIto16, getIReg(rt))));
10921436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_And32,
10923436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_1Sto32,
10924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_CmpEQ32,
10925436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_And32,
10926436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t0),
10927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0xffff)),
10928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x8000))),
10929436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_1Sto32,
10930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_CmpEQ32,
10931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_And32,
10932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t1),
10933436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0xffff)),
10934436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x8000)))));
10935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10936436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpEQ32, mkexpr(t2), mkU32(0x0)));
10937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t3),
10939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl(),
10940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
10941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
10942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_Shl32,
10943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU32(0x1),
10944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU8(ac+16)))));
10945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, unop(Iop_64to32,
10947436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_MullS32,
10948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t0), mkexpr(t1))));
10949436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putAcc(ac, IRExpr_ITE(mkexpr(t3),
10950436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Add64,
10951436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_32Sto64,
10952436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      binop(Iop_Shl32,
10953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t4),
10954436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkU8(0x1))),
10955436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t5)),
10956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Add64,
10957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t5),
10958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_32Sto64,
10959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkU32(0x7fffffff)))));
10960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
10961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
10962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x16: {  /* MAQ_S.W.PHR */
10963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("maq_s.w.phr ac%d, r%d, r%d", ac, rs, rt);
10964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
10965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
10966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
10967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
10968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
10969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I32);
10970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I64);
10971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, getAcc(ac));
10973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, unop(Iop_16Sto32,
10975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_32to16, getIReg(rs))));
10976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, unop(Iop_16Sto32,
10977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     unop(Iop_32to16, getIReg(rt))));
10978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_And32,
10980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_1Sto32,
10981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_CmpEQ32,
10982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_And32,
10983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t0),
10984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0xffff)),
10985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x8000))),
10986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_1Sto32,
10987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_CmpEQ32,
10988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_And32,
10989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t1),
10990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0xffff)),
10991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x8000)))));
10992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpEQ32, mkexpr(t2), mkU32(0x0)));
10994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
10995436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t3),
10996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl(),
10997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
10998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
10999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_Shl32,
11000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU32(0x1),
11001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU8(ac+16)))));
11002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, unop(Iop_64to32,
11004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_MullS32,
11005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t0), mkexpr(t1))));
11006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putAcc(ac, IRExpr_ITE(mkexpr(t3),
11007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Add64,
11008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_32Sto64,
11009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      binop(Iop_Shl32,
11010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t4),
11011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkU8(0x1))),
11012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t5)),
11013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Add64,
11014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkexpr(t5),
11015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_32Sto64,
11016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkU32(0x7fffffff)))));
11017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
11018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
11019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x18: {  /* DPAQX_S.W.PH */
11020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("dpaqx_s.w.ph ac%d, r%d, r%d", ac, rs, rt);
11021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
11022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
11023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I64);
11024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
11025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
11026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I64);
11027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I64);
11028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I1);
11029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I1);
11030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I64);
11031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I64);
11032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, getAcc(ac));
11034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_Shl64,
11036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_MullS32,
11037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_16Sto32,
11038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_32HIto16,
11039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      getIReg(rs))),
11040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_16Sto32,
11041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_32to16,
11042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      getIReg(rt)))),
11043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU8(0x1)));
11044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpEQ32,
11045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
11046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rs))),
11047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
11048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpEQ32,
11049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
11050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rt))),
11051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
11052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4,
11053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(mkexpr(t2),
11054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       IRExpr_ITE(mkexpr(t3),
11055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0x000000007fffffffULL),
11056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t1)),
11057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t1)));
11058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t2),
11060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(mkexpr(t3),
11061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_Or32,
11062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               getDSPControl(),
11063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               binop(Iop_Shl32,
11064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                  mkU32(0x1),
11065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                  mkU8(ac+16))),
11066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getDSPControl()),
11067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
11068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, binop(Iop_Shl64,
11070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_MullS32,
11071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_16Sto32,
11072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_32to16,
11073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      getIReg(rs))),
11074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_16Sto32,
11075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_32HIto16,
11076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      getIReg(rt)))),
11077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU8(0x1)));
11078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, binop(Iop_CmpEQ32,
11079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
11080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rs))),
11081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
11082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, binop(Iop_CmpEQ32,
11083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
11084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rt))),
11085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
11086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8,
11087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(mkexpr(t6),
11088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       IRExpr_ITE(mkexpr(t7),
11089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0x000000007fffffffULL),
11090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t5)),
11091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t5)));
11092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t6),
11094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(mkexpr(t7),
11095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_Or32,
11096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               getDSPControl(),
11097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               binop(Iop_Shl32,
11098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                     mkU32(0x1),
11099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                     mkU8(ac+16)
11100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                    )
11101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              ),
11102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getDSPControl()),
11103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
11104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t9, binop(Iop_Add64,
11106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_Add64, mkexpr(t4), mkexpr(t8)),
11107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkexpr(t0)));
11108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putAcc(ac, mkexpr(t9));
11109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
11110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
11111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x19: {  /* DPSQX_S.W.PH */
11112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("dpsqx_s.w.ph ac%d, r%d, r%d", ac, rs, rt);
11113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
11114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
11115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I64);
11116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
11117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
11118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I64);
11119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I64);
11120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I1);
11121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I1);
11122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I64);
11123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I64);
11124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, getAcc(ac));
11126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_Shl64,
11128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_MullS32,
11129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_16Sto32,
11130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_32HIto16,
11131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      getIReg(rs))),
11132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_16Sto32,
11133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_32to16,
11134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      getIReg(rt)))),
11135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU8(0x1)));
11136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpEQ32,
11137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
11138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rs))),
11139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
11140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpEQ32,
11141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
11142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rt))),
11143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
11144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4,
11145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(mkexpr(t2),
11146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       IRExpr_ITE(mkexpr(t3),
11147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0x000000007fffffffULL),
11148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t1)),
11149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t1)));
11150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t2),
11152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(mkexpr(t3),
11153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_Or32,
11154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               getDSPControl(),
11155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               binop(Iop_Shl32,
11156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                     mkU32(0x1),
11157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                     mkU8(ac+16)
11158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                    )
11159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              ),
11160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getDSPControl()),
11161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
11162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, binop(Iop_Shl64,
11164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_MullS32,
11165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_16Sto32,
11166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_32to16,
11167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      getIReg(rs))),
11168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            unop(Iop_16Sto32,
11169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_32HIto16,
11170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      getIReg(rt)))),
11171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU8(0x1)));
11172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, binop(Iop_CmpEQ32,
11173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
11174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rs))),
11175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
11176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, binop(Iop_CmpEQ32,
11177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
11178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rt))),
11179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
11180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8,
11181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(mkexpr(t6),
11182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       IRExpr_ITE(mkexpr(t7),
11183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0x000000007fffffffULL),
11184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t5)),
11185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t5)));
11186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(mkexpr(t6),
11188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              IRExpr_ITE(mkexpr(t7),
11189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         binop(Iop_Or32,
11190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               getDSPControl(),
11191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               binop(Iop_Shl32,
11192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                     mkU32(0x1),
11193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                     mkU8(ac+16)
11194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                    )
11195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                              ),
11196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getDSPControl()),
11197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
11198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t9, binop(Iop_Sub64,
11200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     mkexpr(t0),
11201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Add64, mkexpr(t4), mkexpr(t8))));
11202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putAcc(ac, mkexpr(t9));
11203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
11204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
11205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x1A: {  /* DPAQX_SA.W.PH */
11206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("dpaqx_sa.w.ph ac%d, r%d, r%d", ac, rs, rt);
11207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
11208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
11209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I64);
11210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
11211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
11212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I64);
11213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I64);
11214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I1);
11215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I1);
11216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I64);
11217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I64);
11218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t10 = newTemp(Ity_I32);
11219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, getAcc(ac));
11221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Calculate the first cross dot product and saturate if
11222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        needed. */
11223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, unop(Iop_32Sto64,
11224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Shl32,
11225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Mul32,
11226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_16Sto32,
11227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      unop(Iop_32HIto16,
11228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                           getIReg(rs))),
11229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_16Sto32,
11230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      unop(Iop_32to16,
11231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                           getIReg(rt)))),
11232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(0x1))));
11233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* If both input arguments are equal 0x8000, saturate
11235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        intermediate product and write to DSPControl
11236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        register. */
11237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpEQ32,
11238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
11239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rs))),
11240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
11241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpEQ32,
11242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
11243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rt))),
11244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
11245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, IRExpr_ITE(binop(Iop_CmpNE32,
11247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_And32,
11248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_1Sto32,
11249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t2)),
11250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_1Sto32,
11251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t3))),
11252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0)),
11253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU64(0x000000007fffffffULL),
11254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t1)));
11255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpNE32,
11257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_And32,
11258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          unop(Iop_1Sto32,
11259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkexpr(t2)),
11260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          unop(Iop_1Sto32,
11261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkexpr(t3))),
11262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0)),
11263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
11264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
11265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_Shl32,
11266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU32(0x1),
11267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU8(ac+16))),
11268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
11269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Calculate second cross dot product and saturate if
11270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        needed. */
11271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, unop(Iop_32Sto64,
11272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Shl32,
11273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Mul32,
11274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_16Sto32,
11275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      unop(Iop_32to16,
11276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                           getIReg(rs))),
11277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_16Sto32,
11278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      unop(Iop_32HIto16,
11279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                           getIReg(rt)))),
11280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(0x1))));
11281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* If both input arguments are equal 0x8000, saturate
11283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        intermediate product and write to DSPControl
11284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        register. */
11285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, binop(Iop_CmpEQ32,
11286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
11287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rs))),
11288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
11289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, binop(Iop_CmpEQ32,
11290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
11291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rt))),
11292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
11293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8, IRExpr_ITE(binop(Iop_CmpNE32,
11295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_And32,
11296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_1Sto32,
11297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t6)),
11298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_1Sto32,
11299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t7))),
11300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0)),
11301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU64(0x000000007fffffffULL),
11302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t5)));
11303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpNE32,
11305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_And32,
11306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          unop(Iop_1Sto32,
11307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkexpr(t6)),
11308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          unop(Iop_1Sto32,
11309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkexpr(t7))),
11310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0)),
11311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
11312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
11313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_Shl32,
11314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU32(0x1),
11315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU8(ac+16))),
11316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
11317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Subtract intermediate products from value in the
11318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        accumulator. */
11319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t9,
11320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Add64,
11321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkexpr(t0),
11322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  binop(Iop_Add64, mkexpr(t8), mkexpr(t4))));
11323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putAcc(ac,
11325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(binop(Iop_CmpEQ32,
11326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_And32,
11327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   unop(Iop_64HIto32,
11328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkexpr(t9)),
11329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0x80000000)),
11330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU32(0x0)),
11331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       IRExpr_ITE(binop(Iop_CmpNE32,
11332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        unop(Iop_64HIto32,
11333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             binop(Iop_Shl64,
11334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                   mkexpr(t9),
11335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                   mkU8(1))),
11336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkU32(0x0)),
11337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0x000000007fffffffULL),
11338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t9)),
11339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       IRExpr_ITE(binop(Iop_CmpNE32,
11340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        unop(Iop_64HIto32,
11341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             binop(Iop_Shl64,
11342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                   mkexpr(t9),
11343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                   mkU8(1))),
11344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkU32(0xffffffff)),
11345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0xffffffff80000000ULL),
11346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t9))));
11347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t10, IRExpr_ITE(binop(Iop_CmpEQ32,
11348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_64to32,
11349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t9)),
11350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_64to32,
11351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       getAcc(ac))),
11352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           getDSPControl(),
11353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Or32,
11354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 getDSPControl(),
11355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Shl32,
11356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x1),
11357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU8(ac+16)))));
11358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpEQ32,
11359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    unop(Iop_64HIto32,
11360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkexpr(t9)),
11361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    unop(Iop_64HIto32,
11362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getAcc(ac))),
11363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkexpr(t10),
11364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
11365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
11366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_Shl32,
11367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU32(0x1),
11368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU8(ac+16)))));
11369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
11370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
11371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x1B: {  /* DPSQX_SA.W.PH */
11372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("dpsqx_sa.w.ph ac%d, r%d, r%d", ac, rs, rt);
11373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
11374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
11375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I64);
11376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I1);
11377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
11378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_I64);
11379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I64);
11380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_I1);
11381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I1);
11382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t8 = newTemp(Ity_I64);
11383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t9 = newTemp(Ity_I64);
11384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t10 = newTemp(Ity_I32);
11385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, getAcc(ac));
11387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Calculate the first cross dot product and saturate if
11388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        needed. */
11389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, unop(Iop_32Sto64,
11390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Shl32,
11391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Mul32,
11392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_16Sto32,
11393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      unop(Iop_32HIto16,
11394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                           getIReg(rs))),
11395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_16Sto32,
11396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      unop(Iop_32to16,
11397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                           getIReg(rt)))),
11398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(0x1))));
11399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* If both input arguments are equal 0x8000, saturate
11401436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        intermediate product and write to DSPControl
11402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        register. */
11403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, binop(Iop_CmpEQ32,
11404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
11405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rs))),
11406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
11407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpEQ32,
11408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
11409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rt))),
11410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
11411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, IRExpr_ITE(binop(Iop_CmpNE32,
11413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_And32,
11414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_1Sto32,
11415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t2)),
11416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_1Sto32,
11417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t3))),
11418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0)),
11419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU64(0x000000007fffffffULL),
11420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t1)));
11421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpNE32,
11423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_And32,
11424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          unop(Iop_1Sto32,
11425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkexpr(t2)),
11426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          unop(Iop_1Sto32,
11427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkexpr(t3))),
11428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0)),
11429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
11430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
11431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_Shl32,
11432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU32(0x1),
11433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU8(ac+16))),
11434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
11435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Calculate second cross dot product and saturate if
11436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        needed. */
11437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, unop(Iop_32Sto64,
11438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Shl32,
11439436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Mul32,
11440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_16Sto32,
11441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      unop(Iop_32to16,
11442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                           getIReg(rs))),
11443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_16Sto32,
11444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      unop(Iop_32HIto16,
11445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                           getIReg(rt)))),
11446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(0x1))));
11447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11448436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* If both input arguments are equal 0x8000, saturate
11449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        intermediate product and write to DSPControl
11450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        register. */
11451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t6, binop(Iop_CmpEQ32,
11452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
11453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32to16, getIReg(rs))),
11454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
11455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, binop(Iop_CmpEQ32,
11456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_16Uto32,
11457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_32HIto16, getIReg(rt))),
11458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x00008000)));
11459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t8, IRExpr_ITE(binop(Iop_CmpNE32,
11461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_And32,
11462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_1Sto32,
11463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t6)),
11464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       unop(Iop_1Sto32,
11465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t7))),
11466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0)),
11467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU64(0x000000007fffffffULL),
11468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t5)));
11469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpNE32,
11471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_And32,
11472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          unop(Iop_1Sto32,
11473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkexpr(t6)),
11474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          unop(Iop_1Sto32,
11475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkexpr(t7))),
11476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU32(0)),
11477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
11478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
11479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_Shl32,
11480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU32(0x1),
11481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU8(ac+16))),
11482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getDSPControl()));
11483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* Subtract intermediate products from value in the
11484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        accumulator. */
11485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t9,
11486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            binop(Iop_Sub64,
11487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkexpr(t0),
11488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  binop(Iop_Add64, mkexpr(t8), mkexpr(t4))));
11489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putAcc(ac,
11491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            IRExpr_ITE(binop(Iop_CmpEQ32,
11492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_And32,
11493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   unop(Iop_64HIto32,
11494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkexpr(t9)),
11495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU32(0x80000000)),
11496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkU32(0x0)),
11497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       IRExpr_ITE(binop(Iop_CmpNE32,
11498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        unop(Iop_64HIto32,
11499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             binop(Iop_Shl64,
11500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                   mkexpr(t9),
11501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                   mkU8(1))),
11502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkU32(0x0)),
11503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0x000000007fffffffULL),
11504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t9)),
11505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       IRExpr_ITE(binop(Iop_CmpNE32,
11506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        unop(Iop_64HIto32,
11507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             binop(Iop_Shl64,
11508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                   mkexpr(t9),
11509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                   mkU8(1))),
11510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                        mkU32(0xffffffff)),
11511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0xffffffff80000000ULL),
11512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkexpr(t9))));
11513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t10, IRExpr_ITE(binop(Iop_CmpEQ32,
11514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_64to32,
11515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkexpr(t9)),
11516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  unop(Iop_64to32,
11517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       getAcc(ac))),
11518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           getDSPControl(),
11519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Or32,
11520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 getDSPControl(),
11521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Shl32,
11522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU32(0x1),
11523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU8(ac+16)))));
11524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDSPControl(IRExpr_ITE(binop(Iop_CmpEQ32,
11525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    unop(Iop_64HIto32,
11526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkexpr(t9)),
11527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    unop(Iop_64HIto32,
11528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getAcc(ac))),
11529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkexpr(t10),
11530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Or32,
11531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    getDSPControl(),
11532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_Shl32,
11533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU32(0x1),
11534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU8(ac+16)))));
11535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
11536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
11537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
11538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     return -1;
11539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
11540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;  /* end of DPAQ.W.PH */
11541663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
11542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x31: {  /* APPEND */
11543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               switch(sa) {
11544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x0: {  /* APPEND */
11545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("append r%d, r%d, %d", rt, rs, rd);
11546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
11547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
11548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
11549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I32);
11550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_Shl32, getIReg(rt), mkU8(rd)));
11552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (31 == rd) {
11554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rt, binop(Iop_Or32,
11555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          mkexpr(t1),
11556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          binop(Iop_And32,
11557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                getIReg(rs),
11558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                mkU32(0x7fffffff))));
11559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else if (1 == rd) {
11560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rt,
11561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                binop(Iop_Or32,
11562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkexpr(t1),
11563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      binop(Iop_And32,
11564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg(rs), mkU32(0x1))));
11565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
11566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t2,
11567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               unop(Iop_Not32,
11568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                    binop(Iop_Shl32,
11569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          mkU32(0xffffffff), mkU8(rd))));
11570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rt, binop(Iop_Or32,
11572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          mkexpr(t1),
11573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          binop(Iop_And32,
11574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                getIReg(rs), mkexpr(t2))));
11575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
11576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
11577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
11578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x1: {  /* PREPEND */
11579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("prepend r%d, r%d, %d", rt, rs, rd);
11580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
11581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
11582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
11583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I32);
11584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (0 != rd) {
11586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t1, binop(Iop_Shr32, getIReg(rt), mkU8(rd)));
11587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        if (31 == rd) {
11589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           putIReg(rt, binop(Iop_Or32,
11590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkexpr(t1),
11591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_Shl32,
11592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   binop(Iop_And32,
11593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getIReg(rs),
11594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkU32(0x7fffffff)),
11595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU8(1))));
11596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        } else if (1 == rd) {
11597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           putIReg(rt, binop(Iop_Or32,
11598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkexpr(t1),
11599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_Shl32,
11600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   binop(Iop_And32,
11601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getIReg(rs),
11602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkU32(0x1)),
11603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU8(31))));
11604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        } else {
11605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           assign(t2, binop(Iop_Add32, mkU32(rd), mkU32(0x1)));
11606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           assign(t3, unop(Iop_Not32,
11608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_Shl32,
11609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0xffffffff),
11610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 unop(Iop_32to8, mkexpr(t2)))));
11611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           putIReg(rt, binop(Iop_Or32,
11613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkexpr(t1),
11614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             binop(Iop_Shl32,
11615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   binop(Iop_And32,
11616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         getIReg(rs),
11617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                         mkexpr(t3)),
11618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkU8(32-rd))));
11619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        }
11620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
11621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
11622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
11623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x10: {  /* BALIGN */
11624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("balign r%d, r%d, %d", rt, rs, rd);
11625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     vassert(!mode64);
11626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
11627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
11628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I32);
11629663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if ((2 != rd) && (0 != rd)) {
11631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t1, binop(Iop_Shl32,
11632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         binop(Iop_And32,
11633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               mkU32(rd), mkU32(0x3)),
11634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkU8(0x3)));
11635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t2, binop(Iop_Shl32,
11636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         getIReg(rt),
11637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         unop(Iop_32to8, mkexpr(t1))));
11638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t3, binop(Iop_Shr32,
11639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         getIReg(rs),
11640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         unop(Iop_32to8,
11641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              binop(Iop_Shl32,
11642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    binop(Iop_Sub32,
11643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkU32(0x4),
11644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          binop(Iop_And32,
11645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                mkU32(rd),
11646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                                mkU32(0x3))),
11647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                    mkU8(0x3)))));
11648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putIReg(rt, binop(Iop_Or32, mkexpr(t2), mkexpr(t3)));
11649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
11650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
11651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
11652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
11653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     return -1;
11654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
11655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;  /* end of APPEND */
11656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
11657663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            default:
11658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               return -1;
11659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
11660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
11661663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
11662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
11663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            return -1;
11664663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
11665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   return 0;
11666663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
11667663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11668663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*------------------------------------------------------------*/
11669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*---          Disassemble a single instruction            ---*/
11670663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*------------------------------------------------------------*/
11671663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/* Disassemble a single instruction into IR. The instruction is
11673663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   located in host memory at guest_instr, and has guest IP of
11674663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   guest_PC_curr_instr, which will have been set before the call
11675663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   here. */
11676663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11677663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstatic DisResult disInstr_MIPS_WRK ( Bool(*resteerOkFn) (/*opaque */void *,
11678663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                                                    Addr64),
11679663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     Bool         resteerCisOk,
11680663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     void*        callback_opaque,
11681663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     Long         delta64,
11682663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     VexArchInfo* archinfo,
11683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     VexAbiInfo*  abiinfo,
11684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     Bool         sigill_diag )
11685663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
11686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRTemp t0, t1 = 0, t2, t3, t4, t5, t6, t7;
11687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11688663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UInt opcode, cins, rs, rt, rd, sa, ft, fs, fd, fmt, tf, nd, function,
11689663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng        trap_code, imm, instr_index, p, msb, lsb, size, rot, sel;
11690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* Additional variables for instruction fields in DSP ASE insructions */
11691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   UInt ac;
11692663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11693663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   DisResult dres;
11694663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11695663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   static IRExpr *lastn = NULL;  /* last jump addr */
11696663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   static IRStmt *bstmt = NULL;  /* branch (Exit) stmt */
11697663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11698663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* The running delta */
11699663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Int delta = (Int) delta64;
11700663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11701663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Holds eip at the start of the insn, so that we can print
11702663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      consistent error messages for unimplemented insns. */
11703663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Int delta_start = delta;
11704663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11705663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Are we in a delay slot ? */
11706663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Bool delay_slot_branch, likely_delay_slot, delay_slot_jump;
11707663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11708663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Set result defaults. */
11709663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dres.whatNext = Dis_Continue;
11710663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dres.len = 0;
11711663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dres.continueAt = 0;
11712663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dres.jk_StopHere = Ijk_INVALID;
11713663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11714663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   delay_slot_branch = likely_delay_slot = delay_slot_jump = False;
11715663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11716663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   UChar *code = (UChar *) (guest_code + delta);
11717663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   cins = getUInt(code);
11718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   DIP("\t0x%lx:\t0x%08x\t", (long)guest_PC_curr_instr, cins);
11719663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11720663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (delta != 0) {
11721663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (branch_or_jump(guest_code + delta - 4)) {
11722663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if (lastn == NULL && bstmt == NULL) {
11723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vassert(0);
11724663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } else {
11725663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            dres.whatNext = Dis_StopHere;
11726663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            if (lastn != NULL) {
11727663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               delay_slot_jump = True;
11728663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            } else if (bstmt != NULL) {
11729663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               delay_slot_branch = True;
11730663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
11731663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
11732663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
11733663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11734663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (branch_or_link_likely(guest_code + delta - 4)) {
11735663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         likely_delay_slot = True;
11736663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
11737663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
11738663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11739663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Spot "Special" instructions (see comment at top of file). */
11740663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   {
11741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* Spot the 16-byte preamble:
11742663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       ****mips32****
11743663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       "srl $0, $0, 13
11744663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       "srl $0, $0, 29
11745663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       "srl $0, $0, 3
11746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       "srl $0, $0, 19
11747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       ****mips64****
11749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       dsll $0, $0, 3
11750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       dsll $0, $0, 13
11751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       dsll $0, $0, 29
11752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       dsll $0, $0, 19 */
11753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt word1 = mode64 ? 0xF8  : 0x342;
11755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt word2 = mode64 ? 0x378 : 0x742;
11756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt word3 = mode64 ? 0x778 : 0xC2;
11757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      UInt word4 = mode64 ? 0x4F8 : 0x4C2;
11758663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (getUInt(code + 0) == word1 && getUInt(code + 4) == word2 &&
11759663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng          getUInt(code + 8) == word3 && getUInt(code + 12) == word4) {
11760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Got a "Special" instruction preamble. Which one is it? */
11761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (getUInt(code + 16) == 0x01ad6825 /* or $13, $13, $13 */ ) {
11762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* $11 = client_request ( $12 ) */
11763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            DIP("$11 = client_request ( $12 )");
11764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (mode64)
11765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putPC(mkU64(guest_PC_curr_instr + 20));
11766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            else
11767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putPC(mkU32(guest_PC_curr_instr + 20));
11768663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            dres.jk_StopHere = Ijk_ClientReq;
11769663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            dres.whatNext    = Dis_StopHere;
11770663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11771663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            goto decode_success;
11772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else if (getUInt(code + 16) == 0x01ce7025 /* or $14, $14, $14 */ ) {
11773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* $11 = guest_NRADDR */
11774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            DIP("$11 = guest_NRADDR");
11775663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            dres.len = 20;
11776663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            delta += 20;
11777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (mode64)
11778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putIReg(11, IRExpr_Get(offsetof(VexGuestMIPS64State,
11779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               guest_NRADDR), Ity_I64));
11780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            else
11781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putIReg(11, IRExpr_Get(offsetof(VexGuestMIPS32State,
11782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               guest_NRADDR), Ity_I32));
11783663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            goto decode_success;
11784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else if (getUInt(code + 16) == 0x01ef7825 /* or $15, $15, $15 */ ) {
11785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /*  branch-and-link-to-noredir $25 */
11786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            DIP("branch-and-link-to-noredir $25");
11787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (mode64)
11788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putIReg(31, mkU64(guest_PC_curr_instr + 20));
11789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            else
11790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putIReg(31, mkU32(guest_PC_curr_instr + 20));
11791663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            putPC(getIReg(25));
11792663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            dres.jk_StopHere = Ijk_NoRedir;
11793663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            dres.whatNext    = Dis_StopHere;
11794663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            goto decode_success;
11795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else if (getUInt(code + 16) == 0x016b5825 /* or $11,$11,$11 */ ) {
11796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           /* IR injection */
11797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            DIP("IR injection");
11798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#if defined (_MIPSEL)
11799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_inject_ir(irsb, Iend_LE);
11800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#elif defined (_MIPSEB)
11801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_inject_ir(irsb, Iend_BE);
11802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
11803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (mode64) {
11804eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               stmt(IRStmt_Put(offsetof(VexGuestMIPS64State, guest_CMSTART),
11805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(guest_PC_curr_instr)));
11806eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               stmt(IRStmt_Put(offsetof(VexGuestMIPS64State, guest_CMLEN),
11807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(20)));
11808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putPC(mkU64(guest_PC_curr_instr + 20));
11810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            } else {
11811eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               stmt(IRStmt_Put(offsetof(VexGuestMIPS32State, guest_CMSTART),
11812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU32(guest_PC_curr_instr)));
11813eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov               stmt(IRStmt_Put(offsetof(VexGuestMIPS32State, guest_CMLEN),
11814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU32(20)));
11815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putPC(mkU32(guest_PC_curr_instr + 20));
11817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
11818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            dres.whatNext    = Dis_StopHere;
11819eb0bae136f4eeaaf29761dddb148b118fb824632Dmitriy Ivanov            dres.jk_StopHere = Ijk_InvalICache;
11820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            dres.len = 20;
11821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            delta += 20;
11822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            goto decode_success;
11823663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
11824663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11825663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* We don't know what it is.  Set opc1/opc2 so decode_failure
11826663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            can print the insn following the Special-insn preamble. */
11827663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         delta += 16;
11828663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         goto decode_failure;
11829663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng       /*NOTREACHED*/}
11830663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
11831663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11832663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   opcode = get_opcode(cins);
11833663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   imm = get_imm(cins);
11834663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   rs = get_rs(cins);
11835663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   rt = get_rt(cins);
11836663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   rd = get_rd(cins);
11837663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   sa = get_sa(cins);
11838663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   fs = get_fs(cins);
11839663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   fd = get_fd(cins);
11840663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   ft = get_ft(cins);
11841663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   tf = get_tf(cins);
11842663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   nd = get_nd(cins);
11843663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   sel = get_sel(cins);
11844663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   fmt = get_fmt(cins);
11845663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   instr_index = get_instr_index(cins);
11846663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   trap_code = get_code(cins);
11847663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   function = get_function(cins);
11848663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   IRType ty = mode64 ? Ity_I64 : Ity_I32;
11849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   IRType tyF = fp_mode64 ? Ity_F64 : Ity_F32;
11850663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   ac = get_acNo(cins);
11852663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11853663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   switch (opcode) {
11854663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11855663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0x03:     /* JAL */
11856663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("jal 0x%x", instr_index);
11857436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (mode64) {
11858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(31, mkU64(guest_PC_curr_instr + 8));
11859436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t0 = newTemp(ty);
11860436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t0, mkU64((guest_PC_curr_instr & 0xFFFFFFFFF0000000ULL) |
11861436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          (instr_index << 2)));
11862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      } else {
11863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(31, mkU32(guest_PC_curr_instr + 8));
11864436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t0 = newTemp(ty);
11865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t0, mkU32((guest_PC_curr_instr & 0xF0000000) |
11866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          (instr_index << 2)));
11867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
11868663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      lastn = mkexpr(t0);
11869663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
11870663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0x02:     /* J */
11871663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("j 0x%x", instr_index);
11872663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      t0 = newTemp(ty);
11873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (mode64)
11874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t0, mkU64((guest_PC_curr_instr & 0xFFFFFFFFF0000000ULL) |
11875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          (instr_index << 2)));
11876436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      else
11877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t0, mkU32((guest_PC_curr_instr & 0xF0000000) |
11878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          (instr_index << 2)));
11879663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      lastn = mkexpr(t0);
11880663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
11881663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x11: {  /* COP1 */
11883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (fmt == 0x3 && fd == 0 && function == 0) {  /* MFHC1 */
11884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("mfhc1 r%d, f%d", rt, fs);
11885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (fp_mode64) {
11886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t0 = newTemp(Ity_I64);
11887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t1 = newTemp(Ity_I32);
11888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t0, unop(Iop_ReinterpF64asI64, getDReg(fs)));
11889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t1, unop(Iop_64HIto32, mkexpr(t0)));
11890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rt, mkWidenFrom32(ty, mkexpr(t1), True));
11891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
11892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ILLEGAL_INSTRUCTON;
11893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
11894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
11895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      } else if (fmt == 0x7 && fd == 0 && function == 0) {  /* MTHC1 */
11896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("mthc1 r%d, f%d", rt, fs);
11897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (fp_mode64) {
11898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t0 = newTemp(Ity_I64);
11899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t0, binop(Iop_32HLto64, getIReg(rt),
11900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             unop(Iop_ReinterpF32asI32,
11901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  getLoFromF64(Ity_F64 /* 32FPR mode. */,
11902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               getDReg(fs)))));
11903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putDReg(fs, unop(Iop_ReinterpI64asF64, mkexpr(t0)));
11904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
11905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ILLEGAL_INSTRUCTON;
11906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
11907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
11908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      } else if (fmt == 0x8) {  /* BC */
11909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* FcConditionalCode(bc1_cc) */
11910663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         UInt bc1_cc = get_bc1_cc(cins);
11911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t1 = newTemp(Ity_I1);
11912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t2 = newTemp(Ity_I32);
11913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t3 = newTemp(Ity_I1);
11914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, binop(Iop_CmpEQ32, mkU32(0), mkU32(bc1_cc)));
11916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t2, IRExpr_ITE(mkexpr(t1),
11917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               binop(Iop_And32,
11918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Shr32, getFCSR(), mkU8(23)),
11919436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     mkU32(0x1)),
11920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               binop(Iop_And32,
11921436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop(Iop_Shr32, getFCSR(),
11922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(24 + bc1_cc)),
11923436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     mkU32(0x1))));
11924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
11925436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (tf == 1 && nd == 0) {
11926436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* branch on true */
11927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            DIP("bc1t %d, %d", bc1_cc, imm);
11928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t3, binop(Iop_CmpEQ32, mkU32(1), mkexpr(t2)));
11929436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            dis_branch(False, mkexpr(t3), imm, &bstmt);
11930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
11931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else if (tf == 0 && nd == 0) {
11932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* branch on false */
11933436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            DIP("bc1f %d, %d", bc1_cc, imm);
11934436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t3, binop(Iop_CmpEQ32, mkU32(0), mkexpr(t2)));
11935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            dis_branch(False, mkexpr(t3), imm, &bstmt);
11936436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
11937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else if (nd == 1 && tf == 0) {
11938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            DIP("bc1fl %d, %d", bc1_cc, imm);
11939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            lastn = dis_branch_likely(binop(Iop_CmpNE32, mkexpr(t2),
11940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x0)), imm);
11941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
11942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else if (nd == 1 && tf == 1) {
11943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            DIP("bc1tl %d, %d", bc1_cc, imm);
11944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            lastn = dis_branch_likely(binop(Iop_CmpEQ32, mkexpr(t2),
11945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(0x0)), imm);
11946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
11947436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else
11948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            goto decode_failure;
11949436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      } else {
11950436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch (function) {
11951436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x4: {  /* SQRT.fmt */
11952436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               switch (fmt) {
11953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x10: {  /* S */
11954436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     IRExpr *rm = get_IR_roundingmode();
11955436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putFReg(fd, mkWidenFromF32(tyF, binop(Iop_SqrtF32, rm,
11956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 getLoFromF64(tyF, getFReg(fs)))));
11957663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     break;
11958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
11959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x11: {  /* D */
11960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     IRExpr *rm = get_IR_roundingmode();
11961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDReg(fd, binop(Iop_SqrtF64, rm, getDReg(fs)));
11962663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     break;
11963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
11964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
11965663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     goto decode_failure;
11966663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  }
11967663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               }
11968663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               break;
11969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x5:  /* abs.fmt */
11970663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               switch (fmt) {
11971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x10:  /* S */
11972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("abs.s f%d, f%d", fd, fs);
11973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putFReg(fd, mkWidenFromF32(tyF, unop(Iop_AbsF32,
11974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 getLoFromF64(tyF, getFReg(fs)))));
11975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
11976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x11:  /* D  */
11977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("abs.d f%d, f%d", fd, fs);
11978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDReg(fd, unop(Iop_AbsF64, getDReg(fs)));
11979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
11980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
11981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     goto decode_failure;
11982663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               }
11983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;  /* case 0x5 */
11984663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x02:  /* MUL.fmt */
11986663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               switch (fmt) {
11987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x11: {  /* D */
11988663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     DIP("mul.d f%d, f%d, f%d", fd, fs, ft);
11989663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     IRExpr *rm = get_IR_roundingmode();
11990663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     putDReg(fd, triop(Iop_MulF64, rm, getDReg(fs),
11991663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       getDReg(ft)));
11992663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     break;
11993663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  }
11994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x10: {  /* S */
11995663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     DIP("mul.s f%d, f%d, f%d", fd, fs, ft);
11996663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     IRExpr *rm = get_IR_roundingmode();
11997663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     putFReg(fd, mkWidenFromF32(tyF, triop(Iop_MulF32, rm,
11998663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 getLoFromF64(tyF, getFReg(fs)),
11999663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 getLoFromF64(tyF, getFReg(ft)))));
12000663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     break;
12001663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  }
12002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
12003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     goto decode_failure;
12004663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               }
12005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;  /* MUL.fmt */
12006663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x03:  /* DIV.fmt */
12008663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               switch (fmt) {
12009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x11: {  /* D */
12010663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     DIP("div.d f%d, f%d, f%d", fd, fs, ft);
12011663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     IRExpr *rm = get_IR_roundingmode();
12012663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     putDReg(fd, triop(Iop_DivF64, rm, getDReg(fs),
12013663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 getDReg(ft)));
12014663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     break;
12015663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  }
12016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x10: {  /* S */
12017663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     DIP("div.s f%d, f%d, f%d", fd, fs, ft);
12018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     calculateFCSR(fs, ft, DIVS, False, 2);
12019663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     IRExpr *rm = get_IR_roundingmode();
12020663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     putFReg(fd, mkWidenFromF32(tyF, triop(Iop_DivF32, rm,
12021663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 getLoFromF64(tyF, getFReg(fs)),
12022663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 getLoFromF64(tyF, getFReg(ft)))));
12023663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     break;
12024663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  }
12025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
12026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     goto decode_failure;
12027663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               }
12028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;  /* DIV.fmt */
12029663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x01:  /* SUB.fmt */
12031663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               switch (fmt) {
12032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x11: {  /* D */
12033663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     DIP("sub.d f%d, f%d, f%d", fd, fs, ft);
12034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     calculateFCSR(fs, ft, SUBD, False, 2);
12035663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     IRExpr *rm = get_IR_roundingmode();
12036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDReg(fd, triop(Iop_SubF64, rm, getDReg(fs),
12037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       getDReg(ft)));
12038663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     break;
12039663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  }
12040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x10: {  /* S */
12041663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     DIP("sub.s f%d, f%d, f%d", fd, fs, ft);
12042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     calculateFCSR(fs, ft, SUBS, True, 2);
12043663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     IRExpr *rm = get_IR_roundingmode();
12044663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     putFReg(fd, mkWidenFromF32(tyF, triop(Iop_SubF32, rm,
12045663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 getLoFromF64(tyF, getFReg(fs)),
12046663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 getLoFromF64(tyF, getFReg(ft)))));
12047663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     break;
12048663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  }
12049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
12050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     goto decode_failure;
12051663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               }
12052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;  /* SUB.fmt */
12053663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x06:  /* MOV.fmt */
12055663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               switch (fmt) {
12056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x11:  /* D */
12057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("mov.d f%d, f%d", fd, fs);
12058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (fp_mode64) {
12059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putDReg(fd, getDReg(fs));
12060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
12061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putFReg(fd, getFReg(fs));
12062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putFReg(fd + 1, getFReg(fs + 1));
12063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
12064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
12065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x10:  /* S */
12066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("mov.s f%d, f%d", fd, fs);
12067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putFReg(fd, getFReg(fs));
12068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
12069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
12070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     goto decode_failure;
12071663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               }
12072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;  /* MOV.fmt */
12073663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x7:  /* neg.fmt */
12075663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               switch (fmt) {
12076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x10:  /* S */
12077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("neg.s f%d, f%d", fd, fs);
12078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putFReg(fd, mkWidenFromF32(tyF, unop(Iop_NegF32,
12079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 getLoFromF64(tyF, getFReg(fs)))));
12080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
12081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x11:  /* D */
12082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("neg.d f%d, f%d", fd, fs);
12083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDReg(fd, unop(Iop_NegF64, getDReg(fs)));
12084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
12085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
12086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     goto decode_failure;
12087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
12088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;  /* case 0x7 */
12089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x08:  /* ROUND.L.fmt */
12091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               switch (fmt) {
12092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x10:  /* S */
12093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("round.l.s f%d, f%d", fd, fs);
12094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (fp_mode64) {
12095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        calculateFCSR(fs, 0, ROUNDLS, True, 1);
12096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t0 = newTemp(Ity_I64);
12097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t0, binop(Iop_F32toI64S, mkU32(0x0),
12099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         getLoFromF64(Ity_F64, getFReg(fs))));
12100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putDReg(fd, unop(Iop_ReinterpI64asF64, mkexpr(t0)));
12102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
12103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        ILLEGAL_INSTRUCTON;
12104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
12105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
12106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x11:  /* D */
12107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("round.l.d f%d, f%d", fd, fs);
12108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (fp_mode64) {
12109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        calculateFCSR(fs, 0, ROUNDLD, False, 1);
12110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putDReg(fd, binop(Iop_RoundF64toInt, mkU32(0x0),
12111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          getDReg(fs)));
12112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
12113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        ILLEGAL_INSTRUCTON;
12114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
12115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
12116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
12117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    goto decode_failure;
12118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               }
12120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;  /* ROUND.L.fmt */
12121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x09:  /* TRUNC.L.fmt */
12123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               switch (fmt) {
12124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x10:  /* S */
12125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("trunc.l.s f%d, f%d", fd, fs);
12126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (fp_mode64) {
12127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        calculateFCSR(fs, 0, TRUNCLS, True, 1);
12128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t0 = newTemp(Ity_I64);
12129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t0, binop(Iop_F32toI64S, mkU32(0x3),
12130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         getLoFromF64(Ity_F64, getFReg(fs))));
12131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putDReg(fd, unop(Iop_ReinterpI64asF64, mkexpr(t0)));
12133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
12134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        ILLEGAL_INSTRUCTON;
12135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
12136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
12137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x11:  /* D */
12138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("trunc.l.d f%d, f%d", fd, fs);
12139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (fp_mode64) {
12140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        calculateFCSR(fs, 0, TRUNCLD, False, 1);
12141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putDReg(fd, binop(Iop_RoundF64toInt, mkU32(0x3),
12142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          getDReg(fs)));
12143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
12144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        ILLEGAL_INSTRUCTON;
12145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
12146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
12147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
12148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     goto decode_failure;
12149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 }
12150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov              break;  /* TRUNC.L.fmt */
12151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x15:  /* RECIP.fmt */
12153663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               switch (fmt) {
12154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x10: {  /* S */
12155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("recip.s f%d, f%d", fd, fs);
12156663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     IRExpr *rm = get_IR_roundingmode();
12157663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     putFReg(fd, mkWidenFromF32(tyF, triop(Iop_DivF32,
12158663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 rm, unop(Iop_ReinterpI32asF32,
12159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 mkU32(ONE_SINGLE)), getLoFromF64(tyF,
12160663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 getFReg(fs)))));
12161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     break;
12162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  }
12163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x11: {  /* D */
12164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("recip.d f%d, f%d", fd, fs);
12165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     IRExpr *rm = get_IR_roundingmode();
12166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* putDReg(fd, 1.0/getDreg(fs)); */
12167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putDReg(fd, triop(Iop_DivF64, rm,
12168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 unop(Iop_ReinterpI64asF64,
12169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 mkU64(ONE_DOUBLE)), getDReg(fs)));
12170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     break;
12171663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  }
12172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               default:
12173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  goto decode_failure;
12174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               }
12176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;  /* case 0x15 */
12177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x13:  /* MOVN.fmt */
12179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               switch (fmt) {
12180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               case 0x10:  /* S */
12181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  DIP("movn.s f%d, f%d, r%d", fd, fs, rt);
12182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  t1 = newTemp(Ity_F64);
12183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  t2 = newTemp(Ity_F64);
12184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  t3 = newTemp(Ity_I1);
12185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  t4 = newTemp(Ity_F64);
12186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  if (mode64) {
12187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, getFReg(fs));
12188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, getFReg(fd));
12189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpNE64, mkU64(0), getIReg(rt)));
12190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  } else {
12191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (fp_mode64) {
12192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t1, getFReg(fs));
12193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t2, getFReg(fd));
12194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t3, binop(Iop_CmpNE32, mkU32(0), getIReg(rt)));
12195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
12196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t1, unop(Iop_F32toF64, getFReg(fs)));
12197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t2, unop(Iop_F32toF64, getFReg(fd)));
12198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t3, binop(Iop_CmpNE32, mkU32(0), getIReg(rt)));
12199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
12200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
12201663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  assign(t4, IRExpr_ITE(mkexpr(t3), mkexpr(t1), mkexpr(t2)));
12203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  if (fp_mode64) {
12204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     IRTemp f = newTemp(Ity_F64);
12205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     IRTemp fd_hi = newTemp(Ity_I32);
12206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_I64);
12207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(f, getFReg(fd));
12208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(fd_hi, unop(Iop_64HIto32, unop(Iop_ReinterpF64asI64,
12209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        mkexpr(f))));
12210663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t5, mkWidenFrom32(Ity_I64, unop(Iop_64to32,
12212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                unop(Iop_ReinterpF64asI64, mkexpr(t4))), True));
12213663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putFReg(fd, unop (Iop_ReinterpI64asF64, mkexpr(t5)));
12215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  } else
12216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putFReg(fd, binop(Iop_F64toF32, get_IR_roundingmode(),
12217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t4)));
12218663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  break;
12219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               case 0x11:  /* D */
12220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  DIP("movn.d f%d, f%d, r%d", fd, fs, rt);
12221663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  t3 = newTemp(Ity_I1);
12223663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  t4 = newTemp(Ity_F64);
12224663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  if (mode64)
12226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpNE64, mkU64(0), getIReg(rt)));
12227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  else
12228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpNE32, mkU32(0), getIReg(rt)));
12229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  putDReg(fd, IRExpr_ITE(mkexpr(t3), getDReg(fs), getDReg(fd)));
12231663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  break;
12232663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               default:
12233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  goto decode_failure;
12234663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               }
12235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;  /* MOVN.fmt */
12236663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x12:  /* MOVZ.fmt */
12238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               switch (fmt) {
12239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               case 0x10:  /* S */
12240663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  DIP("movz.s f%d, f%d, r%d", fd, fs, rt);
12241663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  t1 = newTemp(Ity_F64);
12243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  t2 = newTemp(Ity_F64);
12244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  t3 = newTemp(Ity_I1);
12245663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  t4 = newTemp(Ity_F64);
12246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  if (fp_mode64) {
12247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, getFReg(fs));
12248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, getFReg(fd));
12249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (mode64)
12250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t3, binop(Iop_CmpEQ64, mkU64(0), getIReg(rt)));
12251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     else
12252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t3, binop(Iop_CmpEQ32, mkU32(0), getIReg(rt)));
12253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  } else {
12254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, unop(Iop_F32toF64, getFReg(fs)));
12255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, unop(Iop_F32toF64, getFReg(fd)));
12256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpEQ32, mkU32(0), getIReg(rt)));
12257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
12258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  assign(t4, IRExpr_ITE(mkexpr(t3), mkexpr(t1), mkexpr(t2)));
12259663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 if (fp_mode64) {
12261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     IRTemp f = newTemp(Ity_F64);
12262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     IRTemp fd_hi = newTemp(Ity_I32);
12263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t7 = newTemp(Ity_I64);
12264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(f, getFReg(fd));
12265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(fd_hi, unop(Iop_64HIto32,
12266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   unop(Iop_ReinterpF64asI64, mkexpr(f))));
12267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t7, mkWidenFrom32(Ity_I64, unop(Iop_64to32,
12268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                unop(Iop_ReinterpF64asI64, mkexpr(t4))), True));
12269663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putFReg(fd, unop(Iop_ReinterpI64asF64, mkexpr(t7)));
12271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  } else
12272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putFReg(fd, binop(Iop_F64toF32, get_IR_roundingmode(),
12273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t4)));
12274663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12275663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  break;
12276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               case 0x11:  /* D */
12277663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  DIP("movz.d f%d, f%d, r%d", fd, fs, rt);
12278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  t3 = newTemp(Ity_I1);
12279663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  t4 = newTemp(Ity_F64);
12280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  if (mode64)
12281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpEQ64, mkU64(0), getIReg(rt)));
12282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  else
12283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpEQ32, mkU32(0), getIReg(rt)));
12284663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  putDReg(fd, IRExpr_ITE(mkexpr(t3), getDReg(fs), getDReg(fd)));
12286663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  break;
12287663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               default:
12288663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  goto decode_failure;
12289663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               }
12290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;  /* MOVZ.fmt */
12291663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x11:  /* MOVT.fmt */
12293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               if (tf == 1) {
12294663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  UInt mov_cc = get_mov_cc(cins);
12295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  switch (fmt) {  /* MOVCF = 010001 */
12296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x11:  /* D */
12297663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     DIP("movt.d f%d, f%d, %d", fd, fs, mov_cc);
12298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
12299663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     t2 = newTemp(Ity_I32);
12300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
12301663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     t4 = newTemp(Ity_F64);
12302663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpEQ32, mkU32(0), mkU32(mov_cc)));
12304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, IRExpr_ITE(mkexpr(t1),
12305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_And32,
12306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Shr32, getFCSR(),
12307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU8(23)),
12308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x1)),
12309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_And32,
12310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Shr32, getFCSR(),
12311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU8(24 + mov_cc)),
12312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x1))
12313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           ));
12314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpEQ32, mkU32(1), mkexpr(t2)));
12316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, IRExpr_ITE(mkexpr(t3),
12317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           getDReg(fs), getDReg(fd)));
12318663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     putDReg(fd, mkexpr(t4));
12319663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     break;
12320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x10:  /* S */
12321663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     DIP("movt.s f%d, f%d, %d", fd, fs, mov_cc);
12322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
12323663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     t2 = newTemp(Ity_I32);
12324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
12325663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     t4 = newTemp(Ity_F64);
12326663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     t5 = newTemp(Ity_F64);
12327663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     t6 = newTemp(Ity_F64);
12328663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     t7 = newTemp(Ity_I64);
12329663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (fp_mode64) {
12331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t5, getFReg(fs));
12332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t6, getFReg(fd));
12333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
12334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t5, unop(Iop_F32toF64, getFReg(fs)));
12335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t6, unop(Iop_F32toF64, getFReg(fd)));
12336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
12337663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpEQ32, mkU32(0), mkU32(mov_cc)));
12339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, IRExpr_ITE(mkexpr(t1),
12340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_And32,
12341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Shr32, getFCSR(),
12342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU8(23)),
12343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x1)),
12344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_And32,
12345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Shr32, getFCSR(),
12346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU8(24 + mov_cc)),
12347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x1))
12348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           ));
12349663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpEQ32, mkU32(1), mkexpr(t2)));
12351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, IRExpr_ITE(mkexpr(t3),
12352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t5), mkexpr(t6)));
12353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (fp_mode64) {
12355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        IRTemp f = newTemp(Ity_F64);
12356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        IRTemp fd_hi = newTemp(Ity_I32);
12357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(f, getFReg(fd));
12358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(fd_hi, unop(Iop_64HIto32,
12359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_ReinterpF64asI64, mkexpr(f))));
12360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t7, mkWidenFrom32(Ity_I64, unop(Iop_64to32,
12361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_ReinterpF64asI64, mkexpr(t4))),
12362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      True));
12363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putFReg(fd, unop(Iop_ReinterpI64asF64, mkexpr(t7)));
12365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else
12366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putFReg(fd, binop(Iop_F64toF32, get_IR_roundingmode(),
12367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          mkexpr(t4)));
12368663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     break;
12369663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  default:
12370663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     goto decode_failure;
12371663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  }
12372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               } else if (tf == 0)  /* movf.fmt */
12373663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               {
12374663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  UInt mov_cc = get_mov_cc(cins);
12375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  switch (fmt)  /* MOVCF = 010001 */
12376663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  {
12377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x11:  /* D */
12378663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     DIP("movf.d f%d, f%d, %d", fd, fs, mov_cc);
12379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
12380663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     t2 = newTemp(Ity_I32);
12381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
12382663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     t4 = newTemp(Ity_F64);
12383663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpEQ32, mkU32(0), mkU32(mov_cc)));
12385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, IRExpr_ITE(mkexpr(t1),
12386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_And32,
12387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Shr32, getFCSR(),
12388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU8(23)),
12389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x1)),
12390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_And32,
12391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Shr32, getFCSR(),
12392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU8(24 + mov_cc)),
12393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x1))
12394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           ));
12395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpEQ32, mkU32(0), mkexpr(t2)));
12397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, IRExpr_ITE(mkexpr(t3),
12398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           getDReg(fs), getDReg(fd)));
12399663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     putDReg(fd, mkexpr(t4));
12400663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     break;
12401436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x10:  /* S */
12402663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     DIP("movf.s f%d, f%d, %d", fd, fs, mov_cc);
12403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I1);
12404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t2 = newTemp(Ity_I32);
12405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t3 = newTemp(Ity_I1);
12406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t4 = newTemp(Ity_F64);
12407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t5 = newTemp(Ity_F64);
12408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t6 = newTemp(Ity_F64);
12409663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (fp_mode64) {
12411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t5, getFReg(fs));
12412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t6, getFReg(fd));
12413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
12414663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        assign(t5, unop(Iop_F32toF64, getFReg(fs)));
12415663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        assign(t6, unop(Iop_F32toF64, getFReg(fd)));
12416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
12417663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, binop(Iop_CmpEQ32, mkU32(0), mkU32(mov_cc)));
12419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t2, IRExpr_ITE(mkexpr(t1),
12420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_And32,
12421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Shr32, getFCSR(),
12422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU8(23)),
12423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x1)),
12424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           binop(Iop_And32,
12425436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 binop(Iop_Shr32, getFCSR(),
12426436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                       mkU8(24 + mov_cc)),
12427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 mkU32(0x1))
12428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           ));
12429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t3, binop(Iop_CmpEQ32, mkU32(0), mkexpr(t2)));
12431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t4, IRExpr_ITE(mkexpr(t3),
12432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t5), mkexpr(t6)));
12433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (fp_mode64) {
12435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        IRTemp f = newTemp(Ity_F64);
12436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        IRTemp fd_hi = newTemp(Ity_I32);
12437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t7 = newTemp(Ity_I64);
12438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(f, getFReg(fd));
12439436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(fd_hi, unop(Iop_64HIto32,
12440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      unop(Iop_ReinterpF64asI64, mkexpr(f))));
12441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t7, mkWidenFrom32(Ity_I64, unop(Iop_64to32,
12442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   unop(Iop_ReinterpF64asI64, mkexpr(t4))),
12443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   True));
12444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putFReg(fd, unop(Iop_ReinterpI64asF64, mkexpr(t7)));
12446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else
12447663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        putFReg(fd, binop(Iop_F64toF32, get_IR_roundingmode(),
12448663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                          mkexpr(t4)));
12449663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     break;
12450663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  default:
12451663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     goto decode_failure;
12452663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  }
12453663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               }
12454663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;  /* MOVT.fmt */
12456663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x0:  /* add.fmt */
12458663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               switch (fmt) {
12459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               case 0x10: {  /* S */
12460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  DIP("add.s f%d, f%d, f%d", fd, fs, ft);
12461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  calculateFCSR(fs, ft, ADDS, True, 2);
12462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  IRExpr *rm = get_IR_roundingmode();
12463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  putFReg(fd, mkWidenFromF32(tyF, triop(Iop_AddF32, rm,
12464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              getLoFromF64(tyF, getFReg(fs)),
12465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              getLoFromF64(tyF, getFReg(ft)))));
12466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  break;
12467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
12468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               case 0x11: {  /* D */
12469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  DIP("add.d f%d, f%d, f%d", fd, fs, ft);
12470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  calculateFCSR(fs, ft, ADDD, False, 2);
12471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  IRExpr *rm = get_IR_roundingmode();
12472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  putDReg(fd, triop(Iop_AddF64, rm, getDReg(fs), getDReg(ft)));
12473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  break;
12474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
12475663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               case 0x4:  /* MTC1 (Move Word to Floating Point) */
12477663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  DIP("mtc1 r%d, f%d", rt, fs);
12478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  if (fp_mode64) {
12479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I32);
12480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_F32);
12481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, mkNarrowTo32(ty, getIReg(rt)));
12482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, unop(Iop_ReinterpI32asF32, mkexpr(t0)));
12483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putFReg(fs, mkWidenFromF32(tyF, mkexpr(t1)));
12485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  } else
12486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putFReg(fs, unop(Iop_ReinterpI32asF32, getIReg(rt)));
12487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  break;
12488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               case 0x5:  /* Doubleword Move to Floating Point DMTC1; MIPS64 */
12490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  DIP("dmtc1 r%d, f%d", rt, fs);
12491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  vassert(mode64);
12492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  putFReg(fs, unop(Iop_ReinterpI64asF64, getIReg(rt)));
12493663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  break;
12494663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               case 0x0:  /* MFC1 */
12496663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  DIP("mfc1 r%d, f%d", rt, fs);
12497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  if (fp_mode64) {
12498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
12499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t1 = newTemp(Ity_I32);
12500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, unop(Iop_ReinterpF64asI64, getFReg(fs)));
12501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t1, unop(Iop_64to32, mkexpr(t0)));
12502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rt, mkWidenFrom32(ty, mkexpr(t1), True));
12503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  } else
12504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putIReg(rt, unop(Iop_ReinterpF32asI32, getFReg(fs)));
12505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  break;
12506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               case 0x1:  /* Doubleword Move from Floating Point DMFC1;
12508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             MIPS64 */
12509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  DIP("dmfc1 r%d, f%d", rt, fs);
12510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  putIReg(rt, unop(Iop_ReinterpF64asI64, getFReg(fs)));
12511663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  break;
12512663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               case 0x6:  /* CTC1 */
12514663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  DIP("ctc1 r%d, f%d", rt, fs);
12515663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  t0 = newTemp(Ity_I32);
12516663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  t1 = newTemp(Ity_I32);
12517663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  t2 = newTemp(Ity_I32);
12518663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  t3 = newTemp(Ity_I32);
12519663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  t4 = newTemp(Ity_I32);
12520663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  t5 = newTemp(Ity_I32);
12521663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  t6 = newTemp(Ity_I32);
12522663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  assign(t0, mkNarrowTo32(ty, getIReg(rt)));
12523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  if (fs == 25) {  /* FCCR */
12524663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     assign(t1, binop(Iop_Shl32, binop(Iop_And32, mkexpr(t0),
12525663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                      mkU32(0x000000FE)), mkU8(24)));
12526663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     assign(t2, binop(Iop_And32, mkexpr(t0),
12527663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                      mkU32(0x01000000)));
12528663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     assign(t3, binop(Iop_Shl32, binop(Iop_And32, mkexpr(t0),
12529663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                      mkU32(0x00000001)), mkU8(23)));
12530663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     assign(t4, binop(Iop_And32, mkexpr(t0),
12531663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                      mkU32(0x007FFFFF)));
12532663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     putFCSR(binop(Iop_Or32, binop(Iop_Or32, mkexpr(t1),
12533663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   mkexpr(t2)), binop(Iop_Or32, mkexpr(t3),
12534663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   mkexpr(t4))));
12535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  } else if (fs == 26) {  /* FEXR */
12536663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     assign(t1, binop(Iop_And32, getFCSR(), mkU32(0xFFFC0000)));
12537663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     assign(t2, binop(Iop_And32, mkexpr(t0),
12538663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                      mkU32(0x0003F000)));
12539663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     assign(t3, binop(Iop_And32, getFCSR(), mkU32(0x00000F80)));
12540663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     assign(t4, binop(Iop_And32, mkexpr(t0),
12541663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                      mkU32(0x0000007C)));
12542663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     assign(t5, binop(Iop_And32, getFCSR(), mkU32(0x00000003)));
12543663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     putFCSR(binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Or32,
12544663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   mkexpr(t1), mkexpr(t2)), binop(Iop_Or32,
12545663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   mkexpr(t3), mkexpr(t4))), mkexpr(t5)));
12546663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  } else if (fs == 28) {
12547663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     assign(t1, binop(Iop_And32, getFCSR(), mkU32(0xFE000000)));
12548663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     assign(t2, binop(Iop_Shl32, binop(Iop_And32, mkexpr(t0),
12549663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                mkU32(0x00000002)), mkU8(22)));
12550663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     assign(t3, binop(Iop_And32, getFCSR(), mkU32(0x00FFF000)));
12551663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     assign(t4, binop(Iop_And32, mkexpr(t0),
12552663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                mkU32(0x00000F80)));
12553663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     assign(t5, binop(Iop_And32, getFCSR(), mkU32(0x0000007C)));
12554663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     assign(t6, binop(Iop_And32, mkexpr(t0),
12555663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                mkU32(0x00000003)));
12556663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     putFCSR(binop(Iop_Or32, binop(Iop_Or32, binop(Iop_Or32,
12557663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   mkexpr(t1), mkexpr(t2)), binop(Iop_Or32,
12558663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   mkexpr(t3), mkexpr(t4))), binop(Iop_Or32,
12559663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                   mkexpr(t5), mkexpr(t6))));
12560663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  } else if (fs == 31) {
12561663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     putFCSR(mkexpr(t0));
12562663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  }
12563663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  break;
12564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               case 0x2:  /* CFC1 */
12565663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  DIP("cfc1 r%d, f%d", rt, fs);
12566663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  t0 = newTemp(Ity_I32);
12567663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  t1 = newTemp(Ity_I32);
12568663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  t2 = newTemp(Ity_I32);
12569663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  t3 = newTemp(Ity_I32);
12570663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  t4 = newTemp(Ity_I32);
12571663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  t5 = newTemp(Ity_I32);
12572663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  t6 = newTemp(Ity_I32);
12573663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  assign(t0, getFCSR());
12574663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  if (fs == 0) {
12575663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     putIReg(rt, mkWidenFrom32(ty,
12576663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                             IRExpr_Get(offsetof(VexGuestMIPS32State,
12577663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                                 guest_FIR),
12578663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                       Ity_I32),
12579663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                             False));
12580663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  } else if (fs == 25) {
12581663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     assign(t1, mkU32(0x000000FF));
12582663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     assign(t2, binop(Iop_Shr32, binop(Iop_And32, mkexpr(t0),
12583663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                      mkU32(0xFE000000)), mkU8(25)));
12584663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     assign(t3, binop(Iop_Shr32, binop(Iop_And32, mkexpr(t0),
12585663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                      mkU32(0x00800000)), mkU8(23)));
12586663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     putIReg(rt, mkWidenFrom32(ty, binop(Iop_Or32,
12587663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 binop(Iop_Or32, mkexpr(t1), mkexpr(t2)),
12588663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 mkexpr(t3)), False));
12589663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  } else if (fs == 26) {
12590663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     assign(t1, mkU32(0xFFFFF07C));
12591663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     assign(t2, binop(Iop_And32, mkexpr(t0),
12592663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                mkU32(0x0003F000)));
12593663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     assign(t3, binop(Iop_And32, mkexpr(t0),
12594663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                      mkU32(0x0000007C)));
12595663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     putIReg(rt, mkWidenFrom32(ty, binop(Iop_Or32,
12596663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 binop(Iop_Or32, mkexpr(t1), mkexpr(t2)),
12597663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 mkexpr(t3)), False));
12598663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  } else if (fs == 28) {
12599663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     assign(t1, mkU32(0x00000F87));
12600663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     assign(t2, binop(Iop_And32, mkexpr(t0),
12601663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                      mkU32(0x00000F83)));
12602663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     assign(t3, binop(Iop_Shr32, binop(Iop_And32, mkexpr(t0),
12603663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                      mkU32(0x01000000)), mkU8(22)));
12604663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     putIReg(rt, mkWidenFrom32(ty, binop(Iop_Or32,
12605663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 binop(Iop_Or32, mkexpr(t1), mkexpr(t2)),
12606663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 mkexpr(t3)), False));
12607663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  } else if (fs == 31) {
12608663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     putIReg(rt, mkWidenFrom32(ty, getFCSR(), False));
12609663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  }
12610663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  break;
12611663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               default:
12612663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  goto decode_failure;
12613663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               }
12614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
12615663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x21:  /* CVT.D */
12617663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               switch (fmt) {
12618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x10:  /* S */
12619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("cvt.d.s f%d, f%d", fd, fs);
12620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     calculateFCSR(fs, 0, CVTDS, True, 1);
12621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (fp_mode64) {
12622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t0 = newTemp(Ity_I64);
12623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t1 = newTemp(Ity_I32);
12624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t3 = newTemp(Ity_F32);
12625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t4 = newTemp(Ity_F32);
12626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        /* get lo half of FPR */
12627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t0, unop(Iop_ReinterpF64asI64, getFReg(fs)));
12628663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t1, unop(Iop_64to32, mkexpr(t0)));
12630663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t3, unop(Iop_ReinterpI32asF32, mkexpr(t1)));
12632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putFReg(fd, unop(Iop_F32toF64, mkexpr(t3)));
12634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else
12635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putDReg(fd, unop(Iop_F32toF64, getFReg(fs)));
12636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
12637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x14:
12639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("cvt.d.w %d, %d", fd, fs);
12640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     calculateFCSR(fs, 0, CVTDW, True, 1);
12641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (fp_mode64) {
12642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t0 = newTemp(Ity_I64);
12643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t1 = newTemp(Ity_I32);
12644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t3 = newTemp(Ity_F32);
12645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t4 = newTemp(Ity_F32);
12646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        /* get lo half of FPR */
12647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t0, unop(Iop_ReinterpF64asI64, getFReg(fs)));
12648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t1, unop(Iop_64to32, mkexpr(t0)));
12650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putDReg(fd,unop(Iop_I32StoF64, mkexpr(t1)));
12651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        break;
12652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
12653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t0 = newTemp(Ity_I32);
12654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t0, unop(Iop_ReinterpF32asI32, getFReg(fs)));
12655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putDReg(fd, unop(Iop_I32StoF64, mkexpr(t0)));
12656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        break;
12657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
12658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x15: {  /* L */
12660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (fp_mode64) {
12661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        DIP("cvt.d.l %d, %d", fd, fs);
12662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        calculateFCSR(fs, 0, CVTDL, False, 1);
12663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t0 = newTemp(Ity_I64);
12664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t0, unop(Iop_ReinterpF64asI64, getFReg(fs)));
12665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putFReg(fd, binop(Iop_I64StoF64,
12667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          get_IR_roundingmode(), mkexpr(t0)));
12668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        break;
12669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else
12670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        goto decode_failure;
12671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
12672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
12673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     goto decode_failure;
12674663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               }
12675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;  /* CVT.D */
12676663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x20:  /* cvt.s */
12678663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               switch (fmt) {
12679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x14:  /* W */
12680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("cvt.s.w %d, %d", fd, fs);
12681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     calculateFCSR(fs, 0, CVTSW, True, 1);
12682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (fp_mode64) {
12683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t0 = newTemp(Ity_I64);
12684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t1 = newTemp(Ity_I32);
12685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t3 = newTemp(Ity_F32);
12686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t4 = newTemp(Ity_F32);
12687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        /* get lo half of FPR */
12688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t0, unop(Iop_ReinterpF64asI64, getFReg(fs)));
12689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t1, unop(Iop_64to32, mkexpr(t0)));
12691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putFReg(fd, mkWidenFromF32(tyF, binop(Iop_I32StoF32,
12692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                    get_IR_roundingmode(), mkexpr(t1))));
12693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
12694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t0 = newTemp(Ity_I32);
12695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t0, unop(Iop_ReinterpF32asI32, getFReg(fs)));
12696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putFReg(fd, binop(Iop_I32StoF32, get_IR_roundingmode(),
12697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                    mkexpr(t0)));
12698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
12699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
12700663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x11:  /* D */
12702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("cvt.s.d %d, %d", fd, fs);
12703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     calculateFCSR(fs, 0, CVTSD, False, 1);
12704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_F32);
12705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, binop(Iop_F64toF32, get_IR_roundingmode(),
12706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getDReg(fs)));
12707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putFReg(fd, mkWidenFromF32(tyF, mkexpr(t0)));
12708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
12709663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x15:  /* L */
12711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("cvt.s.l %d, %d", fd, fs);
12712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     calculateFCSR(fs, 0, CVTSL, False, 1);
12713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     t0 = newTemp(Ity_I64);
12714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     assign(t0, unop(Iop_ReinterpF64asI64, getFReg(fs)));
12715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     putFReg(fd, mkWidenFromF32(tyF, binop(Iop_I64StoF32,
12717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 get_IR_roundingmode(), mkexpr(t0))));
12718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
12719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
12721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     goto decode_failure;
12722663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               }
12723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;  /* cvt.s */
12724663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x24:  /* cvt.w */
12726663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               switch (fmt) {
12727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               case 0x10:  /* S */
12728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  DIP("cvt.w.s %d, %d", fd, fs);
12729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  calculateFCSR(fs, 0, CVTWS, True, 1);
12730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  putFReg(fd,
12731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          mkWidenFromF32(tyF,
12732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         binop(Iop_RoundF32toInt,
12733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               get_IR_roundingmode(),
12734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               getLoFromF64(tyF, getFReg(fs))))
12735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         );
12736663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  break;
12737663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12738663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               case 0x11:
12739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  DIP("cvt.w.d %d, %d", fd, fs);
12740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  calculateFCSR(fs, 0, CVTWD, False, 1);
12741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  t0 = newTemp(Ity_I32);
12742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  t1 = newTemp(Ity_F32);
12743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  assign(t0, binop(Iop_F64toI32S, get_IR_roundingmode(),
12744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   getDReg(fs)));
12745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  assign(t1, unop(Iop_ReinterpI32asF32, mkexpr(t0)));
12746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  putFReg(fd, mkWidenFromF32(tyF, mkexpr(t1)));
12747663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  break;
12748663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12749663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               default:
12750663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  goto decode_failure;
12751663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12752663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               }
12753663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               break;
12754663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x25:  /* cvt.l */
12756663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               switch (fmt) {
12757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x10:  /* S */
12758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("cvt.l.s %d, %d", fd, fs);
12759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (fp_mode64) {
12760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        calculateFCSR(fs, 0, CVTLS, True, 1);
12761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t0 = newTemp(Ity_I64);
12762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t0, binop(Iop_F32toI64S, get_IR_roundingmode(),
12764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         getLoFromF64(tyF, getFReg(fs))));
12765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putDReg(fd, unop(Iop_ReinterpI64asF64, mkexpr(t0)));
12767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
12768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        ILLEGAL_INSTRUCTON;
12769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
12770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
12771663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x11: {  /* D */
12773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("cvt.l.d %d, %d", fd, fs);
12774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (fp_mode64) {
12775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        calculateFCSR(fs, 0, CVTLD, False, 1);
12776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putDReg(fd, binop(Iop_RoundF64toInt,
12777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                get_IR_roundingmode(), getDReg(fs)));
12778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
12779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        ILLEGAL_INSTRUCTON;
12780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
12781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
12782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
12783663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
12785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     goto decode_failure;
12786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
12787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
12788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x0B:  /* FLOOR.L.fmt */
12790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               switch (fmt) {
12791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x10:  /* S */
12792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("floor.l.s %d, %d", fd, fs);
12793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (fp_mode64) {
12794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        calculateFCSR(fs, 0, FLOORLS, True, 1);
12795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t0 = newTemp(Ity_I64);
12796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t0, binop(Iop_F32toI64S, mkU32(0x1),
12798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         getLoFromF64(tyF, getFReg(fs))));
12799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putDReg(fd, unop(Iop_ReinterpI64asF64, mkexpr(t0)));
12801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
12802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        ILLEGAL_INSTRUCTON;
12803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
12804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
12805663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x11:  /* D */
12807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("floor.l.d %d, %d", fd, fs);
12808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (fp_mode64) {
12809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        calculateFCSR(fs, 0, FLOORLD, False, 1);
12810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putDReg(fd, binop(Iop_RoundF64toInt, mkU32(0x1),
12811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          getDReg(fs)));
12812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
12813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        ILLEGAL_INSTRUCTON;
12814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
12815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
12816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
12817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     goto decode_failure;
12818663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               }
12819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
12820663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x0C:  /* ROUND.W.fmt */
12822663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               switch (fmt) {
12823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x10:  /* S */
12824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("round.w.s f%d, f%d", fd, fs);
12825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     calculateFCSR(fs, 0, ROUNDWS, True, 1);
12826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (fp_mode64) {
12827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t0 = newTemp(Ity_I64);
12828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t1 = newTemp(Ity_I32);
12829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t3 = newTemp(Ity_F32);
12830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t4 = newTemp(Ity_F32);
12831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        /* get lo half of FPR */
12832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t0, unop(Iop_ReinterpF64asI64, getFReg(fs)));
12833663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t1, unop(Iop_64to32, mkexpr(t0)));
12835663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t3, unop(Iop_ReinterpI32asF32, mkexpr(t1)));
12837663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t4, binop(Iop_RoundF32toInt, mkU32(0x0),
12839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkexpr(t3)));
12840663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putFReg(fd, mkWidenFromF32(tyF, mkexpr(t4)));
12842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else
12843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putFReg(fd, binop(Iop_RoundF32toInt, mkU32(0x0),
12844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          getFReg(fs)));
12845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
12846663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x11:  /* D */
12848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("round.w.d f%d, f%d", fd, fs);
12849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     calculateFCSR(fs, 0, ROUNDWD, False, 1);
12850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (fp_mode64) {
12851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t0 = newTemp(Ity_I32);
12852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t0, binop(Iop_F64toI32S, mkU32(0x0),
12853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         getDReg(fs)));
12854436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putFReg(fd, mkWidenFromF32(tyF,
12855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                    unop(Iop_ReinterpI32asF32, mkexpr(t0))));
12856436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
12857436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t0 = newTemp(Ity_I32);
12858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12859436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t0, binop(Iop_F64toI32S, mkU32(0x0),
12860436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         getDReg(fs)));
12861436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putFReg(fd, unop(Iop_ReinterpI32asF32, mkexpr(t0)));
12863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
12864436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
12865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
12866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     goto decode_failure;
12867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
12869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  break;  /* ROUND.W.fmt */
12870663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x0F:  /* FLOOR.W.fmt */
12872663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               switch (fmt) {
12873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x10:  /* S */
12874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("floor.w.s f%d, f%d", fd, fs);
12875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     calculateFCSR(fs, 0, FLOORWS, True, 1);
12876436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (fp_mode64) {
12877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t0 = newTemp(Ity_I64);
12878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t1 = newTemp(Ity_I32);
12879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t3 = newTemp(Ity_F32);
12880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t4 = newTemp(Ity_F32);
12881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        /* get lo half of FPR */
12882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t0, unop(Iop_ReinterpF64asI64, getFReg(fs)));
12883663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t1, unop(Iop_64to32, mkexpr(t0)));
12885663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t3, unop(Iop_ReinterpI32asF32, mkexpr(t1)));
12887663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t4, binop(Iop_RoundF32toInt, mkU32(0x1),
12889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkexpr(t3)));
12890663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putFReg(fd, mkWidenFromF32(tyF, mkexpr(t4)));
12892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else
12893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putFReg(fd, binop(Iop_RoundF32toInt, mkU32(0x1),
12894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         getFReg(fs)));
12895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
12896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x11:  /* D */
12898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("floor.w.d f%d, f%d", fd, fs);
12899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     calculateFCSR(fs, 0, FLOORWD, False, 1);
12900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (fp_mode64) {
12901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t0 = newTemp(Ity_I32);
12902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t0, binop(Iop_F64toI32S, mkU32(0x1),
12903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         getDReg(fs)));
12904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putFReg(fd, mkWidenFromF32(tyF,
12905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                    unop(Iop_ReinterpI32asF32, mkexpr(t0))));
12906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        break;
12907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
12908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t0 = newTemp(Ity_I32);
12909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t0, binop(Iop_F64toI32S, mkU32(0x1),
12911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         getDReg(fs)));
12912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putFReg(fd, unop(Iop_ReinterpI32asF32, mkexpr(t0)));
12914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        break;
12915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
12916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
12917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     goto decode_failure;
12918663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12919663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               }
12920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;  /* FLOOR.W.fmt */
12921663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x0D:  /* TRUNC.W */
12923663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               switch (fmt) {
12924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x10:  /* S */
12925436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("trunc.w.s %d, %d", fd, fs);
12926436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     calculateFCSR(fs, 0, TRUNCWS, True, 1);
12927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (fp_mode64) {
12928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t0 = newTemp(Ity_I64);
12929436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t1 = newTemp(Ity_I32);
12930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t3 = newTemp(Ity_F32);
12931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t4 = newTemp(Ity_F32);
12932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        /* get lo half of FPR */
12933436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t0, unop(Iop_ReinterpF64asI64, getFReg(fs)));
12934663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t1, unop(Iop_64to32, mkexpr(t0)));
12936663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t3, unop(Iop_ReinterpI32asF32, mkexpr(t1)));
12938663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t4, binop(Iop_RoundF32toInt, mkU32(0x3),
12940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkexpr(t3)));
12941663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putFReg(fd, mkWidenFromF32(tyF, mkexpr(t4)));
12943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else
12944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putFReg(fd, binop(Iop_RoundF32toInt, mkU32(0x3),
12945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       getFReg(fs)));
12946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
12947436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x11:  /* D */
12948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("trunc.w.d %d, %d", fd, fs);
12949436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     calculateFCSR(fs, 0, TRUNCWD, False, 1);
12950436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (fp_mode64) {
12951436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t0 = newTemp(Ity_I32);
12952436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t0, binop(Iop_F64toI32S, mkU32(0x3),
12954436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         getFReg(fs)));
12955436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putFReg(fd, mkWidenFromF32(tyF,
12957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                    unop(Iop_ReinterpI32asF32, mkexpr(t0))));
12958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
12959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t0 = newTemp(Ity_I32);
12960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t0, binop(Iop_F64toI32S, mkU32(0x3),
12962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         getDReg(fs)));
12963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putFReg(fd, unop(Iop_ReinterpI32asF32, mkexpr(t0)));
12965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
12966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
12967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
12968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     goto decode_failure;
12969663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12970663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               }
12971663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               break;
12972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x0E:  /* CEIL.W.fmt */
12974663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               switch (fmt) {
12975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x10:  /* S */
12976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("ceil.w.s %d, %d", fd, fs);
12977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     calculateFCSR(fs, 0, CEILWS, True, 1);
12978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (fp_mode64) {
12979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t0 = newTemp(Ity_I64);
12980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t1 = newTemp(Ity_I32);
12981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t3 = newTemp(Ity_F32);
12982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t4 = newTemp(Ity_F32);
12983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        /* get lo half of FPR */
12984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t0, unop(Iop_ReinterpF64asI64, getFReg(fs)));
12985663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t1, unop(Iop_64to32, mkexpr(t0)));
12987663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t3, unop(Iop_ReinterpI32asF32, mkexpr(t1)));
12989663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t4, binop(Iop_RoundF32toInt, mkU32(0x2),
12991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkexpr(t3)));
12992663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
12993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putFReg(fd, mkWidenFromF32(tyF, mkexpr(t4)));
12994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else
12995436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putFReg(fd, binop(Iop_RoundF32toInt, mkU32(0x2),
12996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          getFReg(fs)));
12997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
12998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
12999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x11:  /* D */
13000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("ceil.w.d %d, %d", fd, fs);
13001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     calculateFCSR(fs, 0, CEILWD, False, 1);
13002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (!fp_mode64) {
13003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t0 = newTemp(Ity_I32);
13004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t0, binop(Iop_F64toI32S, mkU32(0x2),
13005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         getDReg(fs)));
13006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putFReg(fd, unop(Iop_ReinterpI32asF32, mkexpr(t0)));
13007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
13008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t0 = newTemp(Ity_I32);
13009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t0, binop(Iop_F64toI32S, mkU32(0x2),
13010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         getDReg(fs)));
13011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putFReg(fd, mkWidenFromF32(tyF,
13012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                    unop(Iop_ReinterpI32asF32, mkexpr(t0))));
13013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
13014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
13015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
13016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     goto decode_failure;
13017663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13018663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               }
13019663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               break;
13020663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x0A:  /* CEIL.L.fmt */
13022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               switch (fmt) {
13023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x10:  /* S */
13024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("ceil.l.s %d, %d", fd, fs);
13025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (fp_mode64) {
13026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        calculateFCSR(fs, 0, CEILLS, True, 1);
13027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        t0 = newTemp(Ity_I64);
13028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        assign(t0, binop(Iop_F32toI64S, mkU32(0x2),
13030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   getLoFromF64(tyF, getFReg(fs))));
13031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putFReg(fd, unop(Iop_ReinterpI64asF64, mkexpr(t0)));
13033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
13034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        ILLEGAL_INSTRUCTON;
13035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
13036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
13037663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x11:  /* D */
13039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("ceil.l.d %d, %d", fd, fs);
13040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (fp_mode64) {
13041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        calculateFCSR(fs, 0, CEILLD, False, 1);
13042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        putFReg(fd, binop(Iop_RoundF64toInt, mkU32(0x2),
13043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          getFReg(fs)));
13044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     } else {
13045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        ILLEGAL_INSTRUCTON;
13046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
13047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
13048663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
13050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     goto decode_failure;
13051663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13052663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               }
13053663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               break;
13054663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x16:  /* RSQRT.fmt */
13056663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               switch (fmt) {
13057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x10: {  /* S */
13058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("rsqrt.s %d, %d", fd, fs);
13059663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     IRExpr *rm = get_IR_roundingmode();
13060663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     putFReg(fd, mkWidenFromF32(tyF, triop(Iop_DivF32, rm,
13061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 unop(Iop_ReinterpI32asF32, mkU32(ONE_SINGLE)),
13062663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 binop(Iop_SqrtF32, rm, getLoFromF64(tyF,
13063663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 getFReg(fs))))));
13064663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     break;
13065663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  }
13066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  case 0x11: {  /* D */
13067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     DIP("rsqrt.d %d, %d", fd, fs);
13068663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     IRExpr *rm = get_IR_roundingmode();
13069663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     putDReg(fd, triop(Iop_DivF64, rm,
13070663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 unop(Iop_ReinterpI64asF64,
13071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 mkU64(ONE_DOUBLE)),
13072663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                 binop(Iop_SqrtF64, rm, getDReg(fs))));
13073663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     break;
13074663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  }
13075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  default:
13076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     goto decode_failure;
13077663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13078663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               }
13079663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               break;
13080663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13081663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            default:
13082663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               if (dis_instr_CCondFmt(cins))
13083663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                  break;
13084663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               goto decode_failure;
13085663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13086663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
13087663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13088663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
13089663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
13090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;  /* COP1 */
13091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x10:  /* COP0 */
13092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (rs == 0) {  /* MFC0 */
13093663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         DIP("mfc0 r%d, r%d, %d", rt, rd, sel);
13094663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         IRTemp   val  = newTemp(Ity_I32);
13095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRExpr** args = mkIRExprVec_3 (IRExpr_BBPTR(), mkU32(rd), mkU32(sel));
13096663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         IRDirty *d = unsafeIRDirty_1_N(val,
13097663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                        0,
13098663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                        "mips32_dirtyhelper_mfc0",
13099663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                        &mips32_dirtyhelper_mfc0,
13100663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                        args);
13101663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         stmt(IRStmt_Dirty(d));
13102663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         putIReg(rt, mkexpr(val));
13103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      } else if (rs == 1) {
13104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Doubleword Move from Coprocessor 0 - DMFC0; MIPS64 */
13105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("dmfc0 r%d, r%d, %d", rt, rd, sel);
13106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp   val  = newTemp(Ity_I64);
13107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRExpr** args = mkIRExprVec_3 (IRExpr_BBPTR(), mkU64(rd), mkU64(sel));
13108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRDirty *d = unsafeIRDirty_1_N(val,
13109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        0,
13110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        "mips64_dirtyhelper_dmfc0",
13111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        &mips64_dirtyhelper_dmfc0,
13112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        args);
13113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         stmt(IRStmt_Dirty(d));
13114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putDReg(rt, mkexpr(val));
13115663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      } else
13116663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         goto decode_failure;
13117663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
13118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x31:  /* LWC1 */
13120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* Load Word to Floating Point - LWC1 (MIPS32) */
13121663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("lwc1 f%d, %d(r%d)", ft, imm, rs);
13122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (fp_mode64) {
13123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t1 = newTemp(Ity_F32);
13124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t2 = newTemp(Ity_I64);
13125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
13126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t0 = newTemp(Ity_I64);
13127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* new LO */
13128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t0, binop(Iop_Add64, getIReg(rs),
13129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             mkU64(extend_s_16to64(imm))));
13130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
13131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t0 = newTemp(Ity_I32);
13132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* new LO */
13133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t0, binop(Iop_Add32, getIReg(rs),
13134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             mkU32(extend_s_16to32(imm))));
13135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
13136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, load(Ity_F32, mkexpr(t0)));
13137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t2, mkWidenFrom32(Ity_I64, unop(Iop_ReinterpF32asI32,
13138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                mkexpr(t1)), True));
13139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putDReg(ft, unop(Iop_ReinterpI64asF64, mkexpr(t2)));
13140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      } else {
13141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t0 = newTemp(Ity_I32);
13142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t0, binop(Iop_Add32, getIReg(rs),
13143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                           mkU32(extend_s_16to32(imm))));
13144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putFReg(ft, load(Ity_F32, mkexpr(t0)));
13145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
13146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
13147663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x39:  /* SWC1 */
13149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("swc1 f%d, %d(r%d)", ft, imm, rs);
13150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (fp_mode64) {
13151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t0 = newTemp(Ity_I64);
13152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t2 = newTemp(Ity_I32);
13153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         LOAD_STORE_PATTERN;
13154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t0, unop(Iop_ReinterpF64asI64, getFReg(ft)));
13155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t2, unop(Iop_64to32, mkexpr(t0)));
13156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(mkexpr(t1), unop(Iop_ReinterpI32asF32, mkexpr(t2)));
13157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      } else {
13158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         LOAD_STORE_PATTERN;
13159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(mkexpr(t1), getFReg(ft));
13160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
13161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
13162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x33:  /* PREF */
13164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("pref");
13165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
13166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13167663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0x35:
13168663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Load Doubleword to Floating Point - LDC1 (MIPS32) */
13169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      DIP("ldc1 f%d, %d(%d)", rt, imm, rs);
13170663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      LOAD_STORE_PATTERN;
13171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      putDReg(ft, load(Ity_F64, mkexpr(t1)));
13172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
13173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0x3D:
13175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Store Doubleword from Floating Point - SDC1 */
13176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("sdc1 f%d, %d(%d)", ft, imm, rs);
13177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      LOAD_STORE_PATTERN;
13178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(mkexpr(t1), getDReg(ft));
13179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
13180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x23:  /* LW */
13182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("lw r%d, %d(r%d)", rt, imm, rs);
13183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      LOAD_STORE_PATTERN;
13184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      putIReg(rt, mkWidenFrom32(ty, load(Ity_I32, mkexpr(t1)), True));
13185663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
13186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x20:  /* LB */
13188663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("lb r%d, %d(r%d)", rt, imm, rs);
13189663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      LOAD_STORE_PATTERN;
13190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (mode64)
13191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rt, unop(Iop_8Sto64, load(Ity_I8, mkexpr(t1))));
13192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      else
13193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rt, unop(Iop_8Sto32, load(Ity_I8, mkexpr(t1))));
13194663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
13195663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x24:  /* LBU */
13197663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("lbu r%d, %d(r%d)", rt, imm, rs);
13198663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      LOAD_STORE_PATTERN;
13199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (mode64)
13200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rt, unop(Iop_8Uto64, load(Ity_I8, mkexpr(t1))));
13201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      else
13202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rt, unop(Iop_8Uto32, load(Ity_I8, mkexpr(t1))));
13203663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
13204663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x21:  /* LH */
13206663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("lh r%d, %d(r%d)", rt, imm, rs);
13207663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      LOAD_STORE_PATTERN;
13208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (mode64)
13209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rt, unop(Iop_16Sto64, load(Ity_I16, mkexpr(t1))));
13210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      else
13211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rt, unop(Iop_16Sto32, load(Ity_I16, mkexpr(t1))));
13212663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
13213663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x25:  /* LHU */
13215663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("lhu r%d, %d(r%d)", rt, imm, rs);
13216663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      LOAD_STORE_PATTERN;
13217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (mode64)
13218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rt, unop(Iop_16Uto64, load(Ity_I16, mkexpr(t1))));
13219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      else
13220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rt, unop(Iop_16Uto32, load(Ity_I16, mkexpr(t1))));
13221663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
13222663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x0F:  /* LUI */
13224663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      p = (imm << 16);
13225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      DIP("lui r%d, imm: 0x%x", rt, imm);
13226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (mode64)
13227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rt, mkU64(extend_s_32to64(p)));
13228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      else
13229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rt, mkU32(p));
13230663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
13231663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x13:  /* COP1X */
13233663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (function) {
13234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x0: {  /* LWXC1 */
13235663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* Load Word  Indexed to Floating Point - LWXC1 (MIPS32r2) */
13236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("lwxc1 f%d, r%d(r%d)", fd, rt, rs);
13237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (fp_mode64) {
13238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t0 = newTemp(Ity_I64);
13239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t1 = newTemp(Ity_I32);
13240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t3 = newTemp(Ity_F32);
13241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t4 = newTemp(Ity_I64);
13242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t2 = newTemp(ty);
13244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* new LO */
13245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t2, binop(mode64 ? Iop_Add64 : Iop_Add32, getIReg(rs),
13246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             getIReg(rt)));
13247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t3, load(Ity_F32, mkexpr(t2)));
13248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t4, mkWidenFrom32(Ity_I64, unop(Iop_ReinterpF32asI32,
13250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkexpr(t3)), True));
13251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putFReg(fd, unop(Iop_ReinterpI64asF64, mkexpr(t4)));
13253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
13254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t0 = newTemp(Ity_I32);
13255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t0, binop(Iop_Add32, getIReg(rs), getIReg(rt)));
13256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putFReg(fd, load(Ity_F32, mkexpr(t0)));
13257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
13258663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
13259663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
13260663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x1: {  /* LDXC1 */
13262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Load Doubleword  Indexed to Floating Point
13263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            LDXC1 (MIPS32r2 and MIPS64) */
13264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (fp_mode64) {
13265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            DIP("ldxc1 f%d, r%d(r%d)", fd, rt, rs);
13266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t0 = newTemp(ty);
13267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t0, binop(mode64 ? Iop_Add64 : Iop_Add32, getIReg(rs),
13268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             getIReg(rt)));
13269436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putFReg(fd, load(Ity_F64, mkexpr(t0)));
13270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
13271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
13272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t0 = newTemp(Ity_I32);
13273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t0, binop(Iop_Add32, getIReg(rs), getIReg(rt)));
13274663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t1 = newTemp(Ity_I32);
13276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t1, binop(Iop_Add32, mkexpr(t0), mkU32(4)));
13277663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13278663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if defined (_MIPSEL)
13279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putFReg(fd, load(Ity_F32, mkexpr(t0)));
13280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putFReg(fd + 1, load(Ity_F32, mkexpr(t1)));
13281663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#elif defined (_MIPSEB)
13282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putFReg(fd + 1, load(Ity_F32, mkexpr(t0)));
13283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putFReg(fd, load(Ity_F32, mkexpr(t1)));
13284663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
13285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
13286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
13287663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
13288663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x5:  /* Load Doubleword Indexed Unaligned to Floating Point - LUXC1;
13290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    MIPS32r2 */
13291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("luxc1 f%d, r%d(r%d)", fd, rt, rs);
13292663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         t0 = newTemp(Ity_I64);
13293663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         t1 = newTemp(Ity_I64);
13294663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(t0, binop(Iop_Add64, getIReg(rs), getIReg(rt)));
13295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, binop(Iop_And64, mkexpr(t0),
13296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     mkU64(0xfffffffffffffff8ULL)));
13297663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         putFReg(fd, load(Ity_F64, mkexpr(t1)));
13298663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
13299663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x8: {  /* Store Word Indexed from Floating Point - SWXC1 */
13301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("swxc1 f%d, r%d(r%d)", ft, rt, rs);
13302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (fp_mode64) {
13303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t0 = newTemp(ty);
13304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t0, binop(mode64 ? Iop_Add64 : Iop_Add32, getIReg(rs),
13305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             getIReg(rt)));
13306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            store(mkexpr(t0), getLoFromF64(tyF, getFReg(fs)));
13307663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
13309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t0 = newTemp(Ity_I32);
13310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t0, binop(Iop_Add32, getIReg(rs), getIReg(rt)));
13311663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            store(mkexpr(t0), getFReg(fs));
13313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
13314663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
13315663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
13316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x9: {  /* Store Doubleword Indexed from Floating Point - SDXC1 */
13317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("sdc1 f%d, %d(%d)", ft, imm, rs);
13318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (fp_mode64) {
13319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t0 = newTemp(ty);
13320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t0, binop(mode64 ? Iop_Add64 : Iop_Add32, getIReg(rs),
13321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             getIReg(rt)));
13322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            store(mkexpr(t0), getFReg(fs));
13323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
13324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t0 = newTemp(Ity_I32);
13325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t0, binop(Iop_Add32, getIReg(rs), getIReg(rt)));
13326663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t1 = newTemp(Ity_I32);
13328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t1, binop(Iop_Add32, mkexpr(t0), mkU32(4)));
13329663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13330663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if defined (_MIPSEL)
13331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            store(mkexpr(t0), getFReg(fs));
13332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            store(mkexpr(t1), getFReg(fs + 1));
13333663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#elif defined (_MIPSEB)
13334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            store(mkexpr(t0), getFReg(fs + 1));
13335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            store(mkexpr(t1), getFReg(fs));
13336663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
13337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
13338663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
13339663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
13340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0xD:  /* Store Doubleword Indexed Unaligned from Floating Point -
13341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    SUXC1; MIPS64 MIPS32r2 */
13342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("suxc1 f%d, r%d(r%d)", fd, rt, rs);
13343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t0 = newTemp(Ity_I64);
13344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t1 = newTemp(Ity_I64);
13345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t0, binop(Iop_Add64, getIReg(rs), getIReg(rt)));
13346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, binop(Iop_And64, mkexpr(t0), mkU64(0xfffffffffffffff8ULL)));
13347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(mkexpr(t1), getFReg(fs));
13348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
13349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13350663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 0x0F: {
13351663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         DIP("prefx");
13352663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
13353663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
13354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x20:  {  /* MADD.S */
13355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("madd.s f%d, f%d, f%d, f%d", fd, fmt, fs, ft);
13356663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         IRExpr *rm = get_IR_roundingmode();
13357663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         t1 = newTemp(Ity_F32);
13358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, qop(Iop_MAddF32, rm,
13359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        getLoFromF64(tyF, getFReg(fmt)),
13360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        getLoFromF64(tyF, getFReg(fs)),
13361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        getLoFromF64(tyF, getFReg(ft))));
13362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putFReg(fd, mkWidenFromF32(tyF, mkexpr(t1)));
13363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;  /* MADD.S */
13364663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
13365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x21: {  /* MADD.D */
13366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("madd.d f%d, f%d, f%d, f%d", fd, fmt, fs, ft);
13367663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         IRExpr *rm = get_IR_roundingmode();
13368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putDReg(fd, qop(Iop_MAddF64, rm, getDReg(fmt), getDReg(fs),
13369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         getDReg(ft)));
13370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;  /* MADD.D */
13371663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
13372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x28: {  /* MSUB.S */
13373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("msub.s f%d, f%d, f%d, f%d", fd, fmt, fs, ft);
13374663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         IRExpr *rm = get_IR_roundingmode();
13375663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         t1 = newTemp(Ity_F32);
13376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, qop(Iop_MSubF32, rm,
13377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        getLoFromF64(tyF, getFReg(fmt)),
13378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        getLoFromF64(tyF, getFReg(fs)),
13379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        getLoFromF64(tyF, getFReg(ft))));
13380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putFReg(fd, mkWidenFromF32(tyF, mkexpr(t1)));
13381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;  /* MSUB.S */
13382663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
13383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x29: {  /* MSUB.D */
13384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("msub.d f%d, f%d, f%d, f%d", fd, fmt, fs, ft);
13385663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         IRExpr *rm = get_IR_roundingmode();
13386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putDReg(fd, qop(Iop_MSubF64, rm, getDReg(fmt), getDReg(fs),
13387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         getDReg(ft)));
13388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;  /* MSUB.D */
13389663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
13390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x30: {  /* NMADD.S */
13391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("nmadd.s f%d, f%d, f%d, f%d", fd, fmt, fs, ft);
13392663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         IRExpr *rm = get_IR_roundingmode();
13393663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         t1 = newTemp(Ity_F32);
13394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, qop(Iop_MAddF32, rm,
13395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        getLoFromF64(tyF, getFReg(fmt)),
13396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        getLoFromF64(tyF, getFReg(fs)),
13397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        getLoFromF64(tyF, getFReg(ft))));
13398663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putFReg(fd, mkWidenFromF32(tyF, unop(Iop_NegF32, mkexpr(t1))));
13400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;  /* NMADD.S */
13401663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
13402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x31: {  /* NMADD.D */
13403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("nmadd.d f%d, f%d, f%d, f%d", fd, fmt, fs, ft);
13404663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         IRExpr *rm = get_IR_roundingmode();
13405663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         t1 = newTemp(Ity_F64);
13406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, qop(Iop_MAddF64, rm, getDReg(fmt), getDReg(fs),
13407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        getDReg(ft)));
13408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putDReg(fd, unop(Iop_NegF64, mkexpr(t1)));
13409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;  /* NMADD.D */
13410663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
13411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x38: {  /* NMSUBB.S */
13412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("nmsub.s f%d, f%d, f%d, f%d", fd, fmt, fs, ft);
13413663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         IRExpr *rm = get_IR_roundingmode();
13414663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         t1 = newTemp(Ity_F32);
13415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, qop(Iop_MSubF32, rm,
13416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        getLoFromF64(tyF, getFReg(fmt)),
13417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        getLoFromF64(tyF, getFReg(fs)),
13418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        getLoFromF64(tyF, getFReg(ft))));
13419663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putFReg(fd, mkWidenFromF32(tyF, unop(Iop_NegF32, mkexpr(t1))));
13421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;  /* NMSUBB.S */
13422663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
13423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x39: {  /* NMSUBB.D */
13424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("nmsub.d f%d, f%d, f%d, f%d", fd, fmt, fs, ft);
13425663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         IRExpr *rm = get_IR_roundingmode();
13426663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         t1 = newTemp(Ity_F64);
13427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, qop(Iop_MSubF64, rm, getDReg(fmt), getDReg(fs),
13428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        getDReg(ft)));
13429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putDReg(fd, unop(Iop_NegF64, mkexpr(t1)));
13430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;  /* NMSUBB.D */
13431663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
13432663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13433663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      default:
13434663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         goto decode_failure;
13435663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
13436663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
13437663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x22:  /* LWL */
13439663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("lwl r%d, %d(r%d)", rt, imm, rs);
13440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (mode64) {
13441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* t1 = addr */
13442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t1 = newTemp(Ity_I64);
13443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#if defined (_MIPSEL)
13444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, binop(Iop_Add64, getIReg(rs), mkU64(extend_s_16to64(imm))));
13445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* t2 = word addr */
13446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* t4 = addr mod 4 */
13447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         LWX_SWX_PATTERN64;
13448436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* t3 = word content - shifted */
13450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t3 = newTemp(Ity_I32);
13451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t3, binop(Iop_Shl32, mkNarrowTo32(ty, load(Ity_I64,
13452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          mkexpr(t2))), narrowTo(Ity_I8, binop(Iop_Shl32,
13453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    binop(Iop_Sub32, mkU32(0x03), mkexpr(t4)), mkU8(3)))));
13454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* rt content - adjusted */
13456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t5 = newTemp(Ity_I32);
13457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t5, binop(Iop_And32,
13458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          mkNarrowTo32(ty, getIReg(rt)),
13459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          binop(Iop_Shr32,
13460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                mkU32(0x00FFFFFF),
13461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      narrowTo(Ity_I8, binop(Iop_Mul32,
13462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU32(0x08),
13463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkexpr(t4))))));
13464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rt, mkWidenFrom32(ty, binop(Iop_Or32, mkexpr(t5),
13466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkexpr(t3)), True));
13467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#elif defined (_MIPSEB)
13468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, binop(Iop_Xor64, mkU64(0x3),
13469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                binop(Iop_Add64, getIReg(rs), mkU64(extend_s_16to64(imm)))));
13470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* t2 = word addr */
13471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* t4 = addr mod 4 */
13472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         LWX_SWX_PATTERN64;
13473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* t3 = word content - shifted */
13475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t3 = newTemp(Ity_I32);
13476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t3, binop(Iop_Shl32, unop(Iop_64HIto32, load(Ity_I64,
13477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          mkexpr(t2))), narrowTo(Ity_I8, binop(Iop_Shl32,
13478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    binop(Iop_Sub32, mkU32(0x03), mkexpr(t4)), mkU8(3)))));
13479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* rt content - adjusted */
13481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t5 = newTemp(Ity_I32);
13482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t5, binop(Iop_And32,
13483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          mkNarrowTo32(ty, getIReg(rt)),
13484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          binop(Iop_Shr32,
13485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                mkU32(0x00FFFFFF),
13486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      narrowTo(Ity_I8, binop(Iop_Mul32,
13487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU32(0x08),
13488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkexpr(t4))))));
13489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rt, mkWidenFrom32(ty, binop(Iop_Or32, mkexpr(t5),
13491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkexpr(t3)), True));
13492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
13493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      } else {
13494663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* t1 = addr */
13495663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         t1 = newTemp(Ity_I32);
13496663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if defined (_MIPSEL)
13497663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(t1, binop(Iop_Add32, getIReg(rs), mkU32(extend_s_16to32(imm))));
13498663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#elif defined (_MIPSEB)
13499663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(t1, binop(Iop_Xor32, mkU32(0x3), binop(Iop_Add32, getIReg(rs),
13500663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     mkU32(extend_s_16to32(imm)))));
13501663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
13502663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13503663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* t2 = word addr */
13504663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* t4 = addr mod 4 */
13505663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         LWX_SWX_PATTERN;
13506663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13507663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* t3 = word content - shifted */
13508663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         t3 = newTemp(Ity_I32);
13509663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(t3, binop(Iop_Shl32, load(Ity_I32, mkexpr(t2)), narrowTo(Ity_I8,
13510663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    binop(Iop_Shl32, binop(Iop_Sub32, mkU32(0x03), mkexpr(t4)),
13511663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    mkU8(3)))));
13512663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13513663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* rt content  - adjusted */
13514663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         t5 = newTemp(Ity_I32);
13515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t5, binop(Iop_And32,
13516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          getIReg(rt),
13517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          binop(Iop_Shr32,
13518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                mkU32(0x00FFFFFF),
13519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      narrowTo(Ity_I8, binop(Iop_Mul32,
13520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkU32(0x08),
13521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                             mkexpr(t4))))));
13522663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13523663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         putIReg(rt, binop(Iop_Or32, mkexpr(t5), mkexpr(t3)));
13524663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
13525663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
13526663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x26:  /* LWR */
13528663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("lwr r%d, %d(r%d)", rt, imm, rs);
13529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (mode64) {
13530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* t1 = addr */
13531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t1 = newTemp(Ity_I64);
13532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#if defined (_MIPSEL)
13533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, binop(Iop_Add64, getIReg(rs), mkU64(extend_s_16to64(imm))));
13534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* t2 = word addr */
13535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* t4 = addr mod 8 */
13536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         LWX_SWX_PATTERN64;
13537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* t3 = word content - shifted */
13539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t3 = newTemp(Ity_I32);
13540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t3, binop(Iop_Shr32, mkNarrowTo32(ty, load(Ity_I64,mkexpr(t2))),
13541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    narrowTo(Ity_I8, binop(Iop_Shl32, mkexpr(t4), mkU8(3)))));
13542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* rt content  - adjusted */
13544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t5 = newTemp(Ity_I32);
13545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t5, binop(Iop_And32, mkNarrowTo32(ty, getIReg(rt)),
13546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                unop(Iop_Not32, binop(Iop_Shr32, mkU32(0xFFFFFFFF),
13547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                narrowTo(Ity_I8, binop(Iop_Shl32, mkexpr(t4), mkU8(0x3)))))));
13548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rt, mkWidenFrom32(ty, binop(Iop_Or32, mkexpr(t5),
13550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t3)), True));
13551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#elif defined (_MIPSEB)
13552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, binop(Iop_Xor64, mkU64(0x3), binop(Iop_Add64, getIReg(rs),
13553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          mkU64(extend_s_16to64(imm)))));
13554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* t2 = word addr */
13555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* t4 = addr mod 4 */
13556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         LWX_SWX_PATTERN64;
13557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* t3 = word content - shifted */
13559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t3 = newTemp(Ity_I32);
13560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t3, binop(Iop_Shr32, unop(Iop_64HIto32, load(Ity_I64,mkexpr(t2))),
13561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    narrowTo(Ity_I8, binop(Iop_Shl32, mkexpr(t4), mkU8(3)))));
13562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* rt content  - adjusted */
13564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t5 = newTemp(Ity_I32);
13565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t5, binop(Iop_And32, mkNarrowTo32(ty, getIReg(rt)),
13566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                unop(Iop_Not32, binop(Iop_Shr32, mkU32(0xFFFFFFFF),
13567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                narrowTo(Ity_I8, binop(Iop_Shl32, mkexpr(t4), mkU8(0x3)))))));
13568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rt, mkWidenFrom32(ty, binop(Iop_Or32, mkexpr(t5),
13570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t3)), True));
13571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
13572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      } else {
13574663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* t1 = addr */
13575663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         t1 = newTemp(Ity_I32);
13576663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if defined (_MIPSEL)
13577663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(t1, binop(Iop_Add32, getIReg(rs), mkU32(extend_s_16to32(imm))));
13578663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#elif defined (_MIPSEB)
13579663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(t1, binop(Iop_Xor32, mkU32(0x3), binop(Iop_Add32, getIReg(rs),
13580663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                     mkU32(extend_s_16to32(imm)))));
13581663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
13582663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13583663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* t2 = word addr */
13584663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* t4 = addr mod 4 */
13585663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         LWX_SWX_PATTERN;
13586663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13587663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* t3 = word content - shifted */
13588663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         t3 = newTemp(Ity_I32);
13589663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(t3, binop(Iop_Shr32, load(Ity_I32, mkexpr(t2)),
13590663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    narrowTo(Ity_I8, binop(Iop_Shl32, mkexpr(t4),
13591663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    mkU8(3)))));
13592663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13593663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* rt content  - adjusted */
13594663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         t5 = newTemp(Ity_I32);
13595663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(t5, binop(Iop_And32, getIReg(rt), unop(Iop_Not32,
13596663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                    binop(Iop_Shr32, mkU32(0xFFFFFFFF), narrowTo(Ity_I8,
13597663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                          binop(Iop_Shl32, mkexpr(t4), mkU8(0x3)))))));
13598663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13599663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         putIReg(rt, binop(Iop_Or32, mkexpr(t5), mkexpr(t3)));
13600663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
13601663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
13602663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x2B:  /* SW */
13604663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("sw r%d, %d(r%d)", rt, imm, rs);
13605663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      LOAD_STORE_PATTERN;
13606663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      store(mkexpr(t1), mkNarrowTo32(ty, getIReg(rt)));
13607663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
13608663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x2C: {  /* SDL rt, offset(base) MIPS64 */
13610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      DIP("sdl r%u, %d(r%u)", rt, (Int) imm, rs);
13611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vassert(mode64);
13612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp A_byte = newTemp(Ity_I8);
13613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp B_byte = newTemp(Ity_I8);
13614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp C_byte = newTemp(Ity_I8);
13615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp D_byte = newTemp(Ity_I8);
13616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp E_byte = newTemp(Ity_I8);
13617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp F_byte = newTemp(Ity_I8);
13618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp G_byte = newTemp(Ity_I8);
13619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp H_byte = newTemp(Ity_I8);
13620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp B_pos  = newTemp(Ity_I64);
13621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp C_pos  = newTemp(Ity_I64);
13622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp D_pos  = newTemp(Ity_I64);
13623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp E_pos  = newTemp(Ity_I64);
13624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp F_pos  = newTemp(Ity_I64);
13625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp G_pos  = newTemp(Ity_I64);
13626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* H byte */
13628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(H_byte, getByteFromReg(rt, 0));
13629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* G byte */
13630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(G_byte, getByteFromReg(rt, 1));
13631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* F byte */
13632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(F_byte, getByteFromReg(rt, 2));
13633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* E byte */
13634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(E_byte, getByteFromReg(rt, 3));
13635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* D byte */
13636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(D_byte, getByteFromReg(rt, 4));
13637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* C byte */
13638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(C_byte, getByteFromReg(rt, 5));
13639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* B byte */
13640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(B_byte, getByteFromReg(rt, 6));
13641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* A byte */
13642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(A_byte, getByteFromReg(rt, 7));
13643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* t1 = addr */
13645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      t1 = newTemp(Ity_I64);
13646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t1, binop(Iop_Add64, getIReg(rs), mkU64(extend_s_16to64(imm))));
13647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* t2 = word addr */
13649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      t2 = newTemp(Ity_I64);
13650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t2, binop(Iop_And64, mkexpr(t1), mkU64(0xFFFFFFFFFFFFFFF8ULL)));
13651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* t3 = addr mod 7 */
13653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      t3 = newTemp(Ity_I64);
13654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t3, binop(Iop_And64, mkexpr(t1), mkU64(0x7)));
13655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#if defined (_MIPSEL)
13657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* Calculate X_byte position. */
13658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(B_pos, IRExpr_ITE(binop(Iop_CmpLT64U, mkexpr(t3), mkU64(0x1)),
13659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x0),
13660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x1)));
13661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(C_pos, IRExpr_ITE(binop(Iop_CmpLT64U, mkexpr(t3), mkU64(0x2)),
13663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x0),
13664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x2)));
13665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(D_pos, IRExpr_ITE(binop(Iop_CmpLT64U, mkexpr(t3), mkU64(0x3)),
13667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x0),
13668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x3)));
13669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(E_pos, IRExpr_ITE(binop(Iop_CmpLT64U, mkexpr(t3), mkU64(0x4)),
13671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x0),
13672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x4)));
13673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(F_pos, IRExpr_ITE(binop(Iop_CmpLT64U, mkexpr(t3), mkU64(0x5)),
13675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x0),
13676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x5)));
13677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(G_pos, IRExpr_ITE(binop(Iop_CmpEQ64, mkexpr(t3), mkU64(0x7)),
13679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x1),
13680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x0)));
13681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* Store X_byte on the right place. */
13683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(mkexpr(t2), mkexpr(H_byte));
13684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(binop(Iop_Add64, mkexpr(t2), mkexpr(G_pos)), mkexpr(G_byte));
13685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(binop(Iop_Sub64, mkexpr(t1), mkexpr(F_pos)), mkexpr(F_byte));
13686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(binop(Iop_Sub64, mkexpr(t1), mkexpr(E_pos)), mkexpr(E_byte));
13687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(binop(Iop_Sub64, mkexpr(t1), mkexpr(D_pos)), mkexpr(D_byte));
13688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(binop(Iop_Sub64, mkexpr(t1), mkexpr(C_pos)), mkexpr(C_byte));
13689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(binop(Iop_Sub64, mkexpr(t1), mkexpr(B_pos)), mkexpr(B_byte));
13690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(mkexpr(t1), mkexpr(A_byte));
13691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#else /* _MIPSEB */
13693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* Calculate X_byte position. */
13694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(B_pos, IRExpr_ITE(binop(Iop_CmpEQ64, mkexpr(t3), mkU64(0x7)),
13695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x0),
13696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x1)));
13697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(C_pos, IRExpr_ITE(binop(Iop_CmpLT64U, mkexpr(t3), mkU64(0x6)),
13699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x2),
13700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x0)));
13701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(D_pos, IRExpr_ITE(binop(Iop_CmpLT64U, mkexpr(t3), mkU64(0x5)),
13703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x3),
13704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x0)));
13705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(E_pos, IRExpr_ITE(binop(Iop_CmpLT64U, mkexpr(t3), mkU64(0x4)),
13707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x4),
13708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x0)));
13709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(F_pos, IRExpr_ITE(binop(Iop_CmpLT64U, mkexpr(t3), mkU64(0x3)),
13711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x5),
13712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x0)));
13713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(G_pos, IRExpr_ITE(binop(Iop_CmpEQ64, mkexpr(t3), mkU64(0x0)),
13715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x6),
13716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x7)));
13717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* Store X_byte on the right place. */
13719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(binop(Iop_Add64, mkexpr(t2), mkU64(0x7)), mkexpr(H_byte));
13720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(binop(Iop_Add64, mkexpr(t2), mkexpr(G_pos)), mkexpr(G_byte));
13721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(binop(Iop_Add64, mkexpr(t1), mkexpr(F_pos)), mkexpr(F_byte));
13722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(binop(Iop_Add64, mkexpr(t1), mkexpr(E_pos)), mkexpr(E_byte));
13723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(binop(Iop_Add64, mkexpr(t1), mkexpr(D_pos)), mkexpr(D_byte));
13724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(binop(Iop_Add64, mkexpr(t1), mkexpr(C_pos)), mkexpr(C_byte));
13725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(binop(Iop_Add64, mkexpr(t1), mkexpr(B_pos)), mkexpr(B_byte));
13726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(mkexpr(t1), mkexpr(A_byte));
13727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
13728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
13730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
13731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x2D: {
13733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* SDR rt, offset(base) - MIPS64 */
13734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vassert(mode64);
13735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      DIP("sdr r%u, %d(r%u)", rt, imm, rs);
13736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp A_byte = newTemp(Ity_I8);
13737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp B_byte = newTemp(Ity_I8);
13738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp C_byte = newTemp(Ity_I8);
13739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp D_byte = newTemp(Ity_I8);
13740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp E_byte = newTemp(Ity_I8);
13741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp F_byte = newTemp(Ity_I8);
13742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp G_byte = newTemp(Ity_I8);
13743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp H_byte = newTemp(Ity_I8);
13744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp B_pos  = newTemp(Ity_I64);
13745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp C_pos  = newTemp(Ity_I64);
13746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp D_pos  = newTemp(Ity_I64);
13747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp E_pos  = newTemp(Ity_I64);
13748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp F_pos  = newTemp(Ity_I64);
13749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp G_pos  = newTemp(Ity_I64);
13750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* H byte */
13752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(H_byte, getByteFromReg(rt, 0));
13753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* G byte */
13754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(G_byte, getByteFromReg(rt, 1));
13755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* F byte */
13756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(F_byte, getByteFromReg(rt, 2));
13757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* E byte */
13758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(E_byte, getByteFromReg(rt, 3));
13759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* D byte */
13760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(D_byte, getByteFromReg(rt, 4));
13761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* C byte */
13762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(C_byte, getByteFromReg(rt, 5));
13763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* B byte */
13764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(B_byte, getByteFromReg(rt, 6));
13765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* A byte */
13766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(A_byte, getByteFromReg(rt, 7));
13767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* t1 = addr */
13769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      t1 = newTemp(Ity_I64);
13770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t1, binop(Iop_Add64, getIReg(rs), mkU64(extend_s_16to64(imm))));
13771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* t2 = word addr */
13773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      t2 = newTemp(Ity_I64);
13774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t2, binop(Iop_And64, mkexpr(t1), mkU64(0xFFFFFFFFFFFFFFF8ULL)));
13775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* t3 = addr mod 7 */
13777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      t3 = newTemp(Ity_I64);
13778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t3, binop(Iop_And64, mkexpr(t1), mkU64(0x7)));
13779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#if defined (_MIPSEL)
13781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* Calculate X_byte position. */
13782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(B_pos, IRExpr_ITE(binop(Iop_CmpLT64U, mkU64(0x1), mkexpr(t3)),
13783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x0),
13784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x6)));
13785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(C_pos, IRExpr_ITE(binop(Iop_CmpLT64U, mkU64(0x2), mkexpr(t3)),
13787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x0),
13788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x5)));
13789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(D_pos, IRExpr_ITE(binop(Iop_CmpLT64U, mkU64(0x3), mkexpr(t3)),
13791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x0),
13792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x4)));
13793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(E_pos, IRExpr_ITE(binop(Iop_CmpLT64U, mkU64(0x4), mkexpr(t3)),
13795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x0),
13796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x3)));
13797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(F_pos, IRExpr_ITE(binop(Iop_CmpLT64U, mkU64(0x5), mkexpr(t3)),
13799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x0),
13800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x2)));
13801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(G_pos, IRExpr_ITE(binop(Iop_CmpEQ64, mkexpr(t3), mkU64(0x7)),
13803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x0),
13804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x1)));
13805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* Store X_byte on the right place. */
13807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(binop(Iop_Add64, mkexpr(t2), mkU64(0x7)), mkexpr(A_byte));
13808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(binop(Iop_Add64, mkexpr(t1), mkexpr(B_pos)), mkexpr(B_byte));
13809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(binop(Iop_Add64, mkexpr(t1), mkexpr(C_pos)), mkexpr(C_byte));
13810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(binop(Iop_Add64, mkexpr(t1), mkexpr(D_pos)), mkexpr(D_byte));
13811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(binop(Iop_Add64, mkexpr(t1), mkexpr(E_pos)), mkexpr(E_byte));
13812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(binop(Iop_Add64, mkexpr(t1), mkexpr(F_pos)), mkexpr(F_byte));
13813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(binop(Iop_Add64, mkexpr(t1), mkexpr(G_pos)), mkexpr(G_byte));
13814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(mkexpr(t1), mkexpr(H_byte));
13815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#else /* _MIPSEB */
13817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* Calculate X_byte position. */
13818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(B_pos, IRExpr_ITE(binop(Iop_CmpLT64U, mkU64(0x5), mkexpr(t3)),
13819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x6),
13820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x0)));
13821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(C_pos, IRExpr_ITE(binop(Iop_CmpLT64U, mkU64(0x4), mkexpr(t3)),
13823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x5),
13824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x0)));
13825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(D_pos, IRExpr_ITE(binop(Iop_CmpLT64U, mkU64(0x3), mkexpr(t3)),
13827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x4),
13828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x0)));
13829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(E_pos, IRExpr_ITE(binop(Iop_CmpLT64U, mkU64(0x2), mkexpr(t3)),
13831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x3),
13832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x0)));
13833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(F_pos, IRExpr_ITE(binop(Iop_CmpLT64U, mkU64(0x1), mkexpr(t3)),
13835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x2),
13836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x0)));
13837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(G_pos, IRExpr_ITE(binop(Iop_CmpEQ64, mkexpr(t3), mkU64(0x0)),
13839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x0),
13840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x1)));
13841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* Store X_byte on the right place. */
13843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(mkexpr(t2), mkexpr(A_byte));
13844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(binop(Iop_Sub64, mkexpr(t1), mkexpr(B_pos)), mkexpr(B_byte));
13845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(binop(Iop_Sub64, mkexpr(t1), mkexpr(C_pos)), mkexpr(C_byte));
13846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(binop(Iop_Sub64, mkexpr(t1), mkexpr(D_pos)), mkexpr(D_byte));
13847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(binop(Iop_Sub64, mkexpr(t1), mkexpr(E_pos)), mkexpr(E_byte));
13848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(binop(Iop_Sub64, mkexpr(t1), mkexpr(F_pos)), mkexpr(F_byte));
13849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(binop(Iop_Sub64, mkexpr(t1), mkexpr(G_pos)), mkexpr(G_byte));
13850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(mkexpr(t1), mkexpr(H_byte));
13851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
13852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
13853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
13854436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x28:  /* SB */
13856663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("sb r%d, %d(r%d)", rt, imm, rs);
13857663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      LOAD_STORE_PATTERN;
13858663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      store(mkexpr(t1), narrowTo(Ity_I8, getIReg(rt)));
13859663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
13860663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13861436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x29:  /* SH */
13862663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("sh r%d, %d(r%d)", rt, imm, rs);
13863663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      LOAD_STORE_PATTERN;
13864663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      store(mkexpr(t1), narrowTo(Ity_I16, getIReg(rt)));
13865663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
13866663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x2A:  /* SWL */
13868663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("swl r%d, %d(r%d)", rt, imm, rs);
13869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (mode64) {
13870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp E_byte = newTemp(Ity_I8);
13871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp F_byte = newTemp(Ity_I8);
13872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp G_byte = newTemp(Ity_I8);
13873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp H_byte = newTemp(Ity_I8);
13874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp F_pos  = newTemp(Ity_I64);
13875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp G_pos  = newTemp(Ity_I64);
13876436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* H byte */
13878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(H_byte, getByteFromReg(rt, 0));
13879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* G byte */
13880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(G_byte, getByteFromReg(rt, 1));
13881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* F byte */
13882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(F_byte, getByteFromReg(rt, 2));
13883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* E byte */
13884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(E_byte, getByteFromReg(rt, 3));
13885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13886663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* t1 = addr */
13887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t1 = newTemp(Ity_I64);
13888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, binop(Iop_Add64, getIReg(rs), mkU64(extend_s_16to64(imm))));
13889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* t2 = word addr */
13891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t2 = newTemp(Ity_I64);
13892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t2, binop(Iop_And64, mkexpr(t1), mkU64(0xFFFFFFFFFFFFFFFCULL)));
13893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* t3 = addr mod 4 */
13895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t3 = newTemp(Ity_I64);
13896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t3, binop(Iop_And64, mkexpr(t1), mkU64(0x3)));
13897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13898663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if defined (_MIPSEL)
13899436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Calculate X_byte position. */
13900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(F_pos, IRExpr_ITE(binop(Iop_CmpEQ64, mkexpr(t3), mkU64(0x0)),
13901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU64(0x0),
13902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU64(0x1)));
13903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(G_pos, IRExpr_ITE(binop(Iop_CmpEQ64, mkexpr(t3), mkU64(0x3)),
13905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU64(0x1),
13906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU64(0x0)));
13907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Store X_byte on the right place. */
13909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(mkexpr(t2), mkexpr(H_byte));
13910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(binop(Iop_Add64, mkexpr(t2), mkexpr(G_pos)), mkexpr(G_byte));
13911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(binop(Iop_Sub64, mkexpr(t1), mkexpr(F_pos)), mkexpr(F_byte));
13912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(mkexpr(t1), mkexpr(E_byte));
13913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#else    /* _MIPSEB */
13915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Calculate X_byte position. */
13916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(F_pos, IRExpr_ITE(binop(Iop_CmpEQ64, mkexpr(t3), mkU64(0x3)),
13917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU64(0x0),
13918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU64(0x1)));
13919436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(G_pos, IRExpr_ITE(binop(Iop_CmpEQ64, mkexpr(t3), mkU64(0x0)),
13921436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU64(0x2),
13922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU64(0x3)));
13923436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(binop(Iop_Add64, mkexpr(t2), mkU64(3)), mkexpr(H_byte));
13925436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(binop(Iop_Add64, mkexpr(t2), mkexpr(G_pos)), mkexpr(G_byte));
13926436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(binop(Iop_Add64, mkexpr(t1), mkexpr(F_pos)), mkexpr(F_byte));
13927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(mkexpr(t1), mkexpr(E_byte));
13928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13929663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
13930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      } else {
13931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp E_byte = newTemp(Ity_I8);
13932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp F_byte = newTemp(Ity_I8);
13933436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp G_byte = newTemp(Ity_I8);
13934436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp H_byte = newTemp(Ity_I8);
13935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp F_pos  = newTemp(Ity_I32);
13936436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp G_pos  = newTemp(Ity_I32);
13937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* H byte */
13939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(H_byte, getByteFromReg(rt, 0));
13940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* G byte */
13941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(G_byte, getByteFromReg(rt, 1));
13942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* F byte */
13943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(F_byte, getByteFromReg(rt, 2));
13944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* E byte */
13945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(E_byte, getByteFromReg(rt, 3));
13946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13947436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* t1 = addr */
13948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t1 = newTemp(Ity_I32);
13949436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, binop(Iop_Add32, getIReg(rs), mkU32(extend_s_16to32(imm))));
13950663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13951663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* t2 = word addr */
13952436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t2 = newTemp(Ity_I32);
13953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t2, binop(Iop_And32, mkexpr(t1), mkU32(0xFFFFFFFCULL)));
13954663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13955436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* t3 = addr mod 4 */
13956663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         t3 = newTemp(Ity_I32);
13957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t3, binop(Iop_And32, mkexpr(t1), mkU32(0x3)));
13958663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#if defined (_MIPSEL)
13960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Calculate X_byte position. */
13961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(F_pos, IRExpr_ITE(binop(Iop_CmpEQ32, mkexpr(t3), mkU32(0x0)),
13962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU32(0x0),
13963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU32(0x1)));
13964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(G_pos, IRExpr_ITE(binop(Iop_CmpEQ32, mkexpr(t3), mkU32(0x3)),
13966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU32(0x1),
13967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU32(0x0)));
13968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Store X_byte on the right place. */
13970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(mkexpr(t2), mkexpr(H_byte));
13971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(binop(Iop_Add32, mkexpr(t2), mkexpr(G_pos)), mkexpr(G_byte));
13972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(binop(Iop_Sub32, mkexpr(t1), mkexpr(F_pos)), mkexpr(F_byte));
13973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(mkexpr(t1), mkexpr(E_byte));
13974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#else    /* _MIPSEB */
13976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Calculate X_byte position. */
13977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(F_pos, IRExpr_ITE(binop(Iop_CmpEQ32, mkexpr(t3), mkU32(0x3)),
13978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU32(0x0),
13979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU32(0x1)));
13980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(G_pos, IRExpr_ITE(binop(Iop_CmpEQ32, mkexpr(t3), mkU32(0x0)),
13982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU32(0x2),
13983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU32(0x3)));
13984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
13985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(binop(Iop_Add32, mkexpr(t2), mkU32(3)), mkexpr(H_byte));
13986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(binop(Iop_Add32, mkexpr(t2), mkexpr(G_pos)), mkexpr(G_byte));
13987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(binop(Iop_Add32, mkexpr(t1), mkexpr(F_pos)), mkexpr(F_byte));
13988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(mkexpr(t1), mkexpr(E_byte));
13989663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
13991663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
13992663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
13993663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x2E:  /* SWR */
13995663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("swr r%d, %d(r%d)", rt, imm, rs);
13996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (mode64) {
13997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp E_byte = newTemp(Ity_I8);
13998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp F_byte = newTemp(Ity_I8);
13999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp G_byte = newTemp(Ity_I8);
14000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp H_byte = newTemp(Ity_I8);
14001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp F_pos  = newTemp(Ity_I64);
14002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp G_pos  = newTemp(Ity_I64);
14003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* H byte */
14005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(H_byte, getByteFromReg(rt, 0));
14006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* G byte */
14007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(G_byte, getByteFromReg(rt, 1));
14008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* F byte */
14009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(F_byte, getByteFromReg(rt, 2));
14010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* E byte */
14011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(E_byte, getByteFromReg(rt, 3));
14012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14013663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* t1 = addr */
14014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t1 = newTemp(Ity_I64);
14015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, binop(Iop_Add64, getIReg(rs), mkU64(extend_s_16to64(imm))));
14016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* t2 = word addr */
14018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t2 = newTemp(Ity_I64);
14019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t2, binop(Iop_And64, mkexpr(t1), mkU64(0xFFFFFFFFFFFFFFFCULL)));
14020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* t3 = addr mod 4 */
14022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t3 = newTemp(Ity_I64);
14023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t3, binop(Iop_And64, mkexpr(t1), mkU64(0x3)));
14024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14025663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if defined (_MIPSEL)
14026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Calculate X_byte position. */
14027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(F_pos, IRExpr_ITE(binop(Iop_CmpEQ64, mkexpr(t3), mkU64(0x0)),
14028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU64(0x2),
14029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU64(0x3)));
14030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(G_pos, IRExpr_ITE(binop(Iop_CmpEQ64, mkexpr(t3), mkU64(0x3)),
14032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU64(0x0),
14033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU64(0x1)));
14034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Store X_byte on the right place. */
14036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(binop(Iop_Add64, mkexpr(t2), mkU64(0x3)), mkexpr(E_byte));
14037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(binop(Iop_Add64, mkexpr(t2), mkexpr(F_pos)), mkexpr(F_byte));
14038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(binop(Iop_Add64, mkexpr(t1), mkexpr(G_pos)), mkexpr(G_byte));
14039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(mkexpr(t1), mkexpr(H_byte));
14040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#else    /* _MIPSEB */
14042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Calculate X_byte position. */
14043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(F_pos, IRExpr_ITE(binop(Iop_CmpEQ64, mkexpr(t3), mkU64(0x3)),
14044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU64(0x1),
14045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU64(0x0)));
14046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(G_pos, IRExpr_ITE(binop(Iop_CmpEQ64, mkexpr(t3), mkU64(0x0)),
14048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU64(0x0),
14049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU64(0x1)));
14050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Store X_byte on the right place. */
14052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(mkexpr(t2), mkexpr(E_byte));
14053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(binop(Iop_Add64, mkexpr(t2), mkexpr(F_pos)), mkexpr(F_byte));
14054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(binop(Iop_Sub64, mkexpr(t1), mkexpr(G_pos)), mkexpr(G_byte));
14055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(mkexpr(t1), mkexpr(H_byte));
14056663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
14057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      } else {
14058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp E_byte = newTemp(Ity_I8);
14059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp F_byte = newTemp(Ity_I8);
14060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp G_byte = newTemp(Ity_I8);
14061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp H_byte = newTemp(Ity_I8);
14062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp F_pos  = newTemp(Ity_I32);
14063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp G_pos  = newTemp(Ity_I32);
14064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* H byte */
14066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(H_byte, getByteFromReg(rt, 0));
14067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* G byte */
14068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(G_byte, getByteFromReg(rt, 1));
14069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* F byte */
14070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(F_byte, getByteFromReg(rt, 2));
14071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* E byte */
14072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(E_byte, getByteFromReg(rt, 3));
14073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* t1 = addr */
14075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t1 = newTemp(Ity_I32);
14076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, binop(Iop_Add32, getIReg(rs), mkU32(extend_s_16to32(imm))));
14077663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14078663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         /* t2 = word addr */
14079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t2 = newTemp(Ity_I32);
14080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t2, binop(Iop_And32, mkexpr(t1), mkU32(0xFFFFFFFCULL)));
14081663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* t3 = addr mod 4 */
14083663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         t3 = newTemp(Ity_I32);
14084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t3, binop(Iop_And32, mkexpr(t1), mkU32(0x3)));
14085663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#if defined (_MIPSEL)
14087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Calculate X_byte position. */
14088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(F_pos, IRExpr_ITE(binop(Iop_CmpEQ32, mkexpr(t3), mkU32(0x0)),
14089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU32(0x2),
14090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU32(0x3)));
14091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(G_pos, IRExpr_ITE(binop(Iop_CmpEQ32, mkexpr(t3), mkU32(0x3)),
14093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU32(0x0),
14094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU32(0x1)));
14095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Store X_byte on the right place. */
14097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(binop(Iop_Add32, mkexpr(t2), mkU32(0x3)), mkexpr(E_byte));
14098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(binop(Iop_Add32, mkexpr(t2), mkexpr(F_pos)), mkexpr(F_byte));
14099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(binop(Iop_Add32, mkexpr(t1), mkexpr(G_pos)), mkexpr(G_byte));
14100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(mkexpr(t1), mkexpr(H_byte));
14101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#else    /* _MIPSEB */
14103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Calculate X_byte position. */
14104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(F_pos, IRExpr_ITE(binop(Iop_CmpEQ32, mkexpr(t3), mkU32(0x3)),
14105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU32(0x1),
14106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU32(0x0)));
14107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(G_pos, IRExpr_ITE(binop(Iop_CmpEQ32, mkexpr(t3), mkU32(0x0)),
14109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU32(0x0),
14110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU32(0x1)));
14111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Store X_byte on the right place. */
14113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(mkexpr(t2), mkexpr(E_byte));
14114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(binop(Iop_Add32, mkexpr(t2), mkexpr(F_pos)), mkexpr(F_byte));
14115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(binop(Iop_Sub32, mkexpr(t1), mkexpr(G_pos)), mkexpr(G_byte));
14116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(mkexpr(t1), mkexpr(H_byte));
14117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
14118663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
14119663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
14120663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x1C:  /* Special2 */
14122663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (function) {
14123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* Cavium Specific instructions */
14124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x03: case 0x32: case 0x33:  /* DMUL, CINS , CINS32 */
14125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x3A: case 0x3B: case 0x2B:  /* EXT,  EXT32, SNE    */
14126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* CVM Compare Instructions */
14127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x2A: case 0x2E: case 0x2F:  /* SEQ,  SEQI,  SNEI   */
14128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (VEX_MIPS_COMP_ID(archinfo->hwcaps) == VEX_PRID_COMP_CAVIUM) {
14129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (dis_instr_CVM(cins))
14130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
14131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            goto decode_failure;
14132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
14133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            goto decode_failure;
14134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
14135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
14136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x02: {  /* MUL */
14137663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         DIP("mul r%d, r%d, r%d", rd, rs, rt);
14138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
14139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpRs32 = newTemp(Ity_I32);
14140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpRt32 = newTemp(Ity_I32);
14141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpRes = newTemp(Ity_I32);
14142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpRs32, mkNarrowTo32(ty, getIReg(rs)));
14144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpRt32, mkNarrowTo32(ty, getIReg(rt)));
14145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpRes, binop(Iop_Mul32, mkexpr(tmpRs32), mkexpr(tmpRt32)));
14146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rd, mkWidenFrom32(ty, mkexpr(tmpRes), True));
14147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else
14148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rd, binop(Iop_Mul32, getIReg(rs), getIReg(rt)));
14149663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
14150663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
14151663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 0x00: {  /* MADD */
14153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (mode64) {
14154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               DIP("madd r%d, r%d", rs, rt);
14155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t1 = newTemp(Ity_I32);
14156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t2 = newTemp(Ity_I32);
14157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t3 = newTemp(Ity_I64);
14158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t4 = newTemp(Ity_I64);
14159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t5 = newTemp(Ity_I64);
14160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t6 = newTemp(Ity_I32);
14161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t1, mkNarrowTo32(ty, getHI()));
14163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t2, mkNarrowTo32(ty, getLO()));
14164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14165436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t3, binop(Iop_MullS32, mkNarrowTo32(ty, getIReg(rs)),
14166436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                             mkNarrowTo32(ty, getIReg(rt))));
14167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t4, binop(Iop_32HLto64, mkexpr(t1), mkexpr(t2)));
14169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t5, binop(Iop_Add64, mkexpr(t3), mkexpr(t4)));
14170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putHI(mkWidenFrom32(ty, unop(Iop_64HIto32, mkexpr(t5)), True));
14172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putLO(mkWidenFrom32(ty, unop(Iop_64to32, mkexpr(t5)), True));
14173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            } else {
14174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if ( (1 <= ac) && ( 3 >= ac) ) {
14175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  if (VEX_MIPS_PROC_DSP(archinfo->hwcaps)) {
14176436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     /* If DSP is present -> DSP ASE MADD */
14177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     UInt retVal = disDSPInstr_MIPS_WRK ( cins );
14178436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     if (0 != retVal ) {
14179436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        goto decode_failure_dsp;
14180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     }
14181436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     break;
14182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  } else {
14183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     goto decode_failure_dsp;
14184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
14185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               } else {
14186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  DIP("madd r%d, r%d", rs, rt);
14187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  t1 = newTemp(Ity_I32);
14188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  t2 = newTemp(Ity_I32);
14189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  t3 = newTemp(Ity_I64);
14190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  t4 = newTemp(Ity_I32);
14191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  t5 = newTemp(Ity_I32);
14192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  t6 = newTemp(Ity_I32);
14193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  assign(t1, getHI());
14195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  assign(t2, getLO());
14196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  assign(t3, binop(Iop_MullS32, getIReg(rs), getIReg(rt)));
14198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  assign(t4, binop(Iop_Add32, mkexpr(t2), unop(Iop_64to32,
14200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                               mkexpr(t3))));
14201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  assign(t5, unop(Iop_1Uto32, binop(Iop_CmpLT32U, mkexpr(t4),
14203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              unop(Iop_64to32, mkexpr(t3)))));
14204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  assign(t6, binop(Iop_Add32, mkexpr(t5), mkexpr(t1)));
14205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  putHI(binop(Iop_Add32, mkexpr(t6), unop(Iop_64HIto32,
14207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                          mkexpr(t3))));
14208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  putLO(mkexpr(t4));
14209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  break;
14210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
14211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
14212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
14213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
14214663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x01: {  /* MADDU */
14216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
14217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            DIP("maddu r%d, r%d", rs, rt);
14218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t1 = newTemp(Ity_I32);
14219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t2 = newTemp(Ity_I32);
14220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t3 = newTemp(Ity_I64);
14221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t4 = newTemp(Ity_I64);
14222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t5 = newTemp(Ity_I64);
14223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t6 = newTemp(Ity_I32);
14224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t1, mkNarrowTo32(ty, getHI()));
14226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t2, mkNarrowTo32(ty, getLO()));
14227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14228436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t3, binop(Iop_MullU32, mkNarrowTo32(ty, getIReg(rs)),
14229436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          mkNarrowTo32(ty, getIReg(rt))));
14230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t4, binop(Iop_32HLto64, mkexpr(t1), mkexpr(t2)));
14232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t5, binop(Iop_Add64, mkexpr(t3), mkexpr(t4)));
14233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putHI(mkWidenFrom32(ty, unop(Iop_64HIto32, mkexpr(t5)), True));
14235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putLO(mkWidenFrom32(ty, unop(Iop_64to32, mkexpr(t5)), True));
14236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
14237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if ( (1 <= ac) && ( 3 >= ac) ) {
14238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (VEX_MIPS_PROC_DSP(archinfo->hwcaps)) {
14239436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  /* If DSP is present -> DSP ASE MADDU */
14240436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UInt retVal = disDSPInstr_MIPS_WRK ( cins );
14241436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  if (0 != retVal ) {
14242436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     goto decode_failure_dsp;
14243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
14244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  break;
14245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               } else {
14246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  goto decode_failure_dsp;
14247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
14248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            } else {
14249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               DIP("maddu r%d, r%d", rs, rt);
14250436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t1 = newTemp(Ity_I32);
14251436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t2 = newTemp(Ity_I32);
14252436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t3 = newTemp(Ity_I64);
14253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t4 = newTemp(Ity_I32);
14254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t5 = newTemp(Ity_I32);
14255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t6 = newTemp(Ity_I32);
14256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t1, getHI());
14258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t2, getLO());
14259663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t3, binop(Iop_MullU32, getIReg(rs), getIReg(rt)));
14261663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t4, binop(Iop_Add32, mkexpr(t2), unop(Iop_64to32,
14263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                            mkexpr(t3))));
14264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t5, unop(Iop_1Uto32, binop(Iop_CmpLT32U, mkexpr(t4),
14265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           unop(Iop_64to32, mkexpr(t3)))));
14266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t6, binop(Iop_Add32, mkexpr(t5), mkexpr(t1)));
14267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14268436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putHI(binop(Iop_Add32, mkexpr(t6), unop(Iop_64HIto32,
14269663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                                      mkexpr(t3))));
14270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putLO(mkexpr(t4));
14271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
14272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
14273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
14274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
14275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
14276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x04: {  /* MSUB */
14278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
14279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            DIP("msub r%d, r%d", rs, rt);
14280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t1 = newTemp(Ity_I32);
14281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t2 = newTemp(Ity_I32);
14282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t3 = newTemp(Ity_I64);
14283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t4 = newTemp(Ity_I64);
14284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t5 = newTemp(Ity_I64);
14285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t6 = newTemp(Ity_I32);
14286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t1, mkNarrowTo32(ty, getHI()));
14288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t2, mkNarrowTo32(ty, getLO()));
14289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t3, binop(Iop_MullS32, mkNarrowTo32(ty, getIReg(rs)),
14291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          mkNarrowTo32(ty, getIReg(rt))));
14292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t4, binop(Iop_32HLto64, mkexpr(t1), mkexpr(t2)));
14294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t5, binop(Iop_Sub64, mkexpr(t4), mkexpr(t3)));
14295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putHI(mkWidenFrom32(ty, unop(Iop_64HIto32, mkexpr(t5)), True));
14297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putLO(mkWidenFrom32(ty, unop(Iop_64to32, mkexpr(t5)), True));
14298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
14299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if ( (1 <= ac) && ( 3 >= ac) ) {
14300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (VEX_MIPS_PROC_DSP(archinfo->hwcaps)) {
14301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  /* If DSP is present -> DSP ASE MSUB */
14302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UInt retVal = disDSPInstr_MIPS_WRK ( cins );
14303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  if (0 != retVal ) {
14304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     goto decode_failure_dsp;
14305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
14306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  break;
14307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               } else {
14308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  goto decode_failure_dsp;
14309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
14310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            } else {
14311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               DIP("msub r%d, r%d", rs, rt);
14312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t1 = newTemp(Ity_I32);
14313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t2 = newTemp(Ity_I32);
14314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t3 = newTemp(Ity_I64);
14315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t4 = newTemp(Ity_I32);
14316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t5 = newTemp(Ity_I1);
14317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t6 = newTemp(Ity_I32);
14318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t1, getHI());
14320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t2, getLO());
14321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t3, binop(Iop_MullS32, getIReg(rs), getIReg(rt)));
14323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t4, unop(Iop_64to32, mkexpr(t3)));  /* new lo */
14324663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* if lo<lo(mul) hi = hi - 1 */
14326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t5, binop(Iop_CmpLT32U,
14327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 mkexpr(t2),
14328436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 mkexpr(t4)));
14329663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t6, IRExpr_ITE(mkexpr(t5),
14331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       binop(Iop_Sub32, mkexpr(t1), mkU32(0x1)),
14332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                       mkexpr(t1)));
14333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putHI(binop(Iop_Sub32, mkexpr(t6), unop(Iop_64HIto32,
14335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkexpr(t3))));
14336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putLO(binop(Iop_Sub32, mkexpr(t2), mkexpr(t4)));
14337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
14338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
14339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
14340663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
14341663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
14342663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x05: {  /* MSUBU */
14344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
14345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            DIP("msubu r%d, r%d", rs, rt);
14346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t1 = newTemp(Ity_I32);
14347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t2 = newTemp(Ity_I32);
14348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t3 = newTemp(Ity_I64);
14349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t4 = newTemp(Ity_I64);
14350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t5 = newTemp(Ity_I64);
14351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t6 = newTemp(Ity_I32);
14352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t1, mkNarrowTo32(ty, getHI()));
14354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t2, mkNarrowTo32(ty, getLO()));
14355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t3, binop(Iop_MullU32, mkNarrowTo32(ty, getIReg(rs)),
14357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          mkNarrowTo32(ty, getIReg(rt))));
14358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t4, binop(Iop_32HLto64, mkexpr(t1), mkexpr(t2)));
14360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t5, binop(Iop_Sub64, mkexpr(t4), mkexpr(t3)));
14361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putHI(mkWidenFrom32(ty, unop(Iop_64HIto32, mkexpr(t5)), True));
14363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putLO(mkWidenFrom32(ty, unop(Iop_64to32, mkexpr(t5)), True));
14364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
14365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if ( (1 <= ac) && ( 3 >= ac) ) {
14366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (VEX_MIPS_PROC_DSP(archinfo->hwcaps)) {
14367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  /* If DSP is present -> DSP ASE MSUBU */
14368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UInt retVal = disDSPInstr_MIPS_WRK ( cins );
14369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  if (0 != retVal ) {
14370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     goto decode_failure_dsp;
14371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
14372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  break;
14373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               } else {
14374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  goto decode_failure_dsp;
14375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
14376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            } else {
14377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               DIP("msubu r%d, r%d", rs, rt);
14378436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t1 = newTemp(Ity_I32);
14379436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t2 = newTemp(Ity_I32);
14380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t3 = newTemp(Ity_I64);
14381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t4 = newTemp(Ity_I32);
14382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t5 = newTemp(Ity_I1);
14383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t6 = newTemp(Ity_I32);
14384663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t1, getHI());
14386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t2, getLO());
14387663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t3, binop(Iop_MullU32, getIReg(rs), getIReg(rt)));
14389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t4, unop(Iop_64to32, mkexpr(t3)));  /* new lo */
14390663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* if lo<lo(mul) hi = hi - 1 */
14392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t5, binop(Iop_CmpLT32U,
14393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 mkexpr(t2),
14394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 mkexpr(t4)));
14395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t6, IRExpr_ITE(mkexpr(t5),
14397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                    binop(Iop_Sub32,
14398436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          mkexpr(t1),
14399436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          mkU32(0x1)),
14400436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                    mkexpr(t1)));
14401663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putHI(binop(Iop_Sub32, mkexpr(t6), unop(Iop_64HIto32,
14403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                      mkexpr(t3))));
14404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putLO(binop(Iop_Sub32, mkexpr(t2), mkexpr(t4)));
14405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
14406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
14407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
14408663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
14409663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
14410663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x6:  /* dmul MIPS64 - Netlogic */
14412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("dmul r%u, r%u, r%u", rd, rs, rt);
14413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t0 = newTemp(Ity_I128);
14414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14415436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t0, binop(Iop_MullU64, getIReg(rs), getIReg(rt)));
14416436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rd, unop(Iop_128to64, mkexpr(t0)));
14418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
14419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x10:  /* LDADDW - Swap Word - Netlogic */
14421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("ldaddw r%u, r%u", rt, rs);
14422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t0 = newTemp(Ity_I32);
14423663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         t1 = newTemp(Ity_I32);
14424663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         t2 = newTemp(Ity_I32);
14425663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         t3 = newTemp(Ity_I64);
14426663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         t4 = newTemp(Ity_I32);
14427663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         t5 = newTemp(Ity_I32);
14428663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         t6 = newTemp(Ity_I32);
14429663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* v = GPR[rt] */
14431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t0, mkNarrowTo32(ty, getIReg(rt)));
14432663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* GPR[rt] = memory[base]; */
14434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, load(Ity_I32, getIReg(rs)));
14435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rt, mkWidenFrom32(ty, mkexpr(t1), True));
14436663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* memory[base] = memory[base] + v; */
14438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(getIReg(rs), binop(Iop_Add32, mkexpr(t0), mkexpr(t1)));
14439663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
14440663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x12:  /* LDADDD - Swap Word - Netlogic */
14442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("ldaddw r%u, r%u", rt, rs);
14443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t0 = newTemp(Ity_I64);
14444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t1 = newTemp(Ity_I64);
14445663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /*  v = GPR[rt] */
14447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t0, getIReg(rt));
14448663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14449436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* GPR[rt] = memory[base]; */
14450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, load(Ity_I64, getIReg(rs)));
14451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rt, mkexpr(t1));
14452663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* memory[base] = memory[base] + v; */
14454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(getIReg(rs), binop(Iop_Add64, mkexpr(t0), mkexpr(t1)));
14455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
14456663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x14:  /* SWAPW - Swap Word - Netlogic */
14458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("swapw r%u, r%u", rt, rs);
14459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t0 = newTemp(Ity_I32);
14460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t1 = newTemp(Ity_I32);
14461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t0, mkNarrowTo32(ty, getIReg(rt)));
14462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, load(Ity_I32, getIReg(rs)));
14463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rt, mkWidenFrom32(ty, mkexpr(t1), True));
14464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(getIReg(rs), mkexpr(t0));
14465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
14466663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x16:  /* SWAPD - Swap Double - Netlogic */
14468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("swapw r%u, r%u", rt, rs);
14469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t0 = newTemp(Ity_I64);
14470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t1 = newTemp(Ity_I64);
14471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t0, getIReg(rt));
14472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, load(Ity_I64, getIReg(rs)));
14473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rt, mkexpr(t1));
14474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         store(getIReg(rs), mkexpr(t0));
14475663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
14476663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x20: {  /* CLZ */
14478663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         DIP("clz r%d, r%d", rd, rs);
14479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
14480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpClz32 = newTemp(Ity_I32);
14481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpRs32 = newTemp(Ity_I32);
14482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpRs32, mkNarrowTo32(ty, getIReg(rs)));
14484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpClz32, unop(Iop_Clz32, mkexpr(tmpRs32)));
14485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rd, mkWidenFrom32(ty, mkexpr(tmpClz32), True));
14486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
14487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t1 = newTemp(Ity_I1);
14488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t1, binop(Iop_CmpEQ32, getIReg(rs), mkU32(0)));
14489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rd, IRExpr_ITE(mkexpr(t1),
14490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   mkU32(0x00000020),
14491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   unop(Iop_Clz32, getIReg(rs))));
14492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
14493663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
14494663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
14495663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x21: {  /* CLO */
14497663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         DIP("clo r%d, r%d", rd, rs);
14498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
14499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpClo32 = newTemp(Ity_I32);
14500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpRs32 = newTemp(Ity_I32);
14501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpRs32, mkNarrowTo32(ty, getIReg(rs)));
14502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t1 = newTemp(Ity_I1);
14504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t1, binop(Iop_CmpEQ32, mkexpr(tmpRs32), mkU32(0xffffffff)));
14505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpClo32, IRExpr_ITE(mkexpr(t1),
14506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      mkU32(0x00000020),
14507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      unop(Iop_Clz32, unop(Iop_Not32, mkexpr(tmpRs32)))));
14508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rd, mkWidenFrom32(ty, mkexpr(tmpClo32), True));
14510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
14511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
14512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t1 = newTemp(Ity_I1);
14513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t1, binop(Iop_CmpEQ32, getIReg(rs), mkU32(0xffffffff)));
14514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rd, IRExpr_ITE(mkexpr(t1),
14515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   mkU32(0x00000020),
14516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   unop(Iop_Clz32,
14517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        unop(Iop_Not32, getIReg(rs)))));
14518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
14519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
14520663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
14521663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x24:  /* Count Leading Zeros in Doubleword - DCLZ; MIPS64 */
14523436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("dclz r%d, r%d", rd, rs);
14524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t1 = newTemp(Ity_I1);
14525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, binop(Iop_CmpEQ64, getIReg(rs), mkU64(0)));
14526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rd, IRExpr_ITE(mkexpr(t1),
14527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     mkU64(0x00000040),
14528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     unop(Iop_Clz64, getIReg(rs))));
14529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
14530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x25:  /* Count Leading Ones in Doubleword - DCLO; MIPS64 */
14532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("dclo r%d, r%d", rd, rs);
14533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t1 = newTemp(Ity_I1);
14534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, binop(Iop_CmpEQ64, getIReg(rs),
14535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        mkU64(0xffffffffffffffffULL)));
14536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rd, IRExpr_ITE(mkexpr(t1),
14537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                mkU64(0x40),
14538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                unop(Iop_Clz64, unop(Iop_Not64,
14539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                     getIReg(rs)))));
14540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
14541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14542663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      default:
14543663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         goto decode_failure;
14544663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
14545663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
14546663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x1F:  /* Special3 */
14548663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (function) {
14549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 0x01: {
14550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* Doubleword Extract Bit Field - DEXTM; MIPS64r2 */
14551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            msb = get_msb(cins);
14552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            lsb = get_lsb(cins);
14553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            size = msb + 1;
14554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UInt srcPos = lsb;
14555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UInt dstSz = msb + 33;
14556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t1 = newTemp(Ity_I64);
14557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            DIP("dextm r%u, r%u, %d, %d", rt, rs, lsb, msb + 1);
14558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UChar lsAmt = 64 - (srcPos + dstSz);  /* left shift amount; */
14560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UChar rsAmt = 64 - dstSz;  /* right shift amount; */
14561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t1, binop(Iop_Shl64, getIReg(rs), mkU8(lsAmt)));
14563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rt, binop(Iop_Shr64, mkexpr(t1), mkU8(rsAmt)));
14564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
14566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
14567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 0x02: {
14568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* Doubleword Extract Bit Field Upper - DEXTU; MIPS64r2 */
14569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            msb = get_msb(cins);
14570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            lsb = get_lsb(cins);
14571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            size = msb + 1;
14572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UInt srcPos = lsb + 32;
14573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UInt dstSz = msb + 1;
14574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            DIP("dextu r%u, r%u, %d, %d", rt, rs, srcPos, dstSz);
14575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t1 = newTemp(Ity_I64);
14576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vassert(srcPos >= 32 && srcPos < 64);
14578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vassert(dstSz > 0 && dstSz <= 32);
14579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vassert((srcPos + dstSz) > 32 && (srcPos + dstSz) <= 64);
14580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UChar lsAmt = 64 - (srcPos + dstSz);  /* left shift amount; */
14582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UChar rsAmt = 64 - dstSz;  /* right shift amount; */
14583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t1, binop(Iop_Shl64, getIReg(rs), mkU8(lsAmt)));
14585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rt, binop(Iop_Shr64, mkexpr(t1), mkU8(rsAmt)));
14586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
14587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
14588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 0x05: {
14589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* Doubleword Insert Bit Field Middle - DINSM; MIPS64r2 */
14590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            msb = get_msb(cins);
14591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            lsb = get_lsb(cins);
14592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            size = msb + 1;
14593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UInt dstPos = lsb;
14594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UInt srcSz = msb - lsb + 33;
14595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t1 = newTemp(ty);
14596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t2 = newTemp(ty);
14597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t3 = newTemp(ty);
14598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t4 = newTemp(ty);
14599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpT1 = newTemp(ty);
14600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpT2 = newTemp(ty);
14601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpT3 = newTemp(ty);
14602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpT4 = newTemp(ty);
14603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpT5 = newTemp(ty);
14604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpT6 = newTemp(ty);
14605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpT7 = newTemp(ty);
14606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpRs = newTemp(ty);
14607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpRt = newTemp(ty);
14608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpRd = newTemp(ty);
14609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpRs, getIReg(rs));
14611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpRt, getIReg(rt));
14612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            DIP("dinsm r%u, r%u, %d, %d", rt, rs, lsb, msb);
14613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UChar lsAmt = dstPos + srcSz - 1;   /* left shift amount; */
14615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UChar rsAmt = dstPos + srcSz - 1;   /* right shift amount; */
14616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t1, binop(Iop_Shr64, mkexpr(tmpRt), mkU8(rsAmt)));
14618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpT1, binop(Iop_Shr64, mkexpr(t1), mkU8(1)));
14619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t2, binop(Iop_Shl64, mkexpr(tmpT1), mkU8(lsAmt)));
14620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpT2, binop(Iop_Shl64, mkexpr(t2), mkU8(1)));
14621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            lsAmt = 63 - dstPos; /* left shift amount; */
14623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            rsAmt = 63 - dstPos; /* right shift amount; */
14624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t3, binop(Iop_Shl64, mkexpr(tmpRt), mkU8(lsAmt)));
14626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpT3, binop(Iop_Shl64, mkexpr(t3), mkU8(1)));
14627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t4, binop(Iop_Shr64, mkexpr(tmpT3), mkU8(rsAmt)));
14628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpT4, binop(Iop_Shr64, mkexpr(t4), mkU8(1)));
14629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* extract size from src register */
14631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            lsAmt = 64 - srcSz;  /* left shift amount; */
14632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            rsAmt = 64 - (lsb + srcSz);   /* right shift amount; */
14633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpT5, binop(Iop_Shl64, mkexpr(tmpRs), mkU8(lsAmt)));
14635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpT6, binop(Iop_Shr64, mkexpr(tmpT5), mkU8(rsAmt)));
14636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpT7, binop(Iop_Or64, mkexpr(tmpT2), mkexpr(tmpT4)));
14638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpRd, binop(Iop_Or64, mkexpr(tmpT6), mkexpr(tmpT7)));
14639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rt, mkexpr(tmpRd));
14640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
14641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
14642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 0x06: {
14643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* Doubleword Insert Bit Field Upper - DINSU; MIPS64r2 */
14644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            msb = get_msb(cins);
14645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            lsb = get_lsb(cins);
14646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            size = msb + 1;
14647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UInt dstPos = lsb + 32;
14648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UInt srcSz = msb - lsb + 1;
14649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpT1 = newTemp(ty);
14650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpT2 = newTemp(ty);
14651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpT3 = newTemp(ty);
14652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpT4 = newTemp(ty);
14653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpT5 = newTemp(ty);
14654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpT6 = newTemp(ty);
14655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpT7 = newTemp(ty);
14656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpT8 = newTemp(ty);
14657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpT9 = newTemp(ty);
14658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpRs = newTemp(ty);
14659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpRt = newTemp(ty);
14660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpRd = newTemp(ty);
14661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpRs, getIReg(rs));
14663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpRt, getIReg(rt));
14664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            DIP("dinsu r%u, r%u, %d, %d", rt, rs, lsb, msb);
14665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UChar lsAmt = 64 - srcSz;  /* left shift amount; */
14667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UChar rsAmt = 64 - (dstPos + srcSz);  /* right shift amount; */
14668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpT1, binop(Iop_Shl64, mkexpr(tmpRs), mkU8(lsAmt)));
14669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpT2, binop(Iop_Shr64, mkexpr(tmpT1), mkU8(rsAmt)));
14670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            lsAmt = 64 - dstPos;  /* left shift amount; */
14672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            rsAmt = 64 - dstPos;  /* right shift amount; */
14673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpT3, binop(Iop_Shl64, mkexpr(tmpRt), mkU8(lsAmt)));
14674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpT4, binop(Iop_Shr64, mkexpr(tmpT3), mkU8(rsAmt)));
14675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            lsAmt = dstPos;  /* left shift amount; */
14677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            rsAmt = srcSz;  /* right shift amount; */
14678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpT5, binop(Iop_Shr64, mkexpr(tmpRt), mkU8(rsAmt)));
14679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpT6, binop(Iop_Shr64, mkexpr(tmpT5), mkU8(lsAmt)));
14680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpT7, binop(Iop_Shl64, mkexpr(tmpT6), mkU8(rsAmt)));
14682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpT8, binop(Iop_Shl64, mkexpr(tmpT7), mkU8(lsAmt)));
14683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpT9, binop(Iop_Or64, mkexpr(tmpT8), mkexpr(tmpT4)));
14685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpRd, binop(Iop_Or64, mkexpr(tmpT2), mkexpr(tmpT9)));
14686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rt, mkexpr(tmpRd));
14687436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
14688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
14689436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         case 0x07: {
14690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* Doubleword Insert Bit Field - DINS; MIPS64r2 */
14691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmp1 = newTemp(ty);
14692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpT1 = newTemp(ty);
14693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpT2 = newTemp(ty);
14694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpT3 = newTemp(ty);
14695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpT4 = newTemp(ty);
14696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpT5 = newTemp(ty);
14697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpT6 = newTemp(ty);
14698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpT7 = newTemp(ty);
14699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpT8 = newTemp(ty);
14700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpT9 = newTemp(ty);
14701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmp = newTemp(ty);
14702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpRs = newTemp(ty);
14703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpRt = newTemp(ty);
14704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpRd = newTemp(ty);
14705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpRs, getIReg(rs));
14707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpRt, getIReg(rt));
14708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            msb = get_msb(cins);
14710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            lsb = get_lsb(cins);
14711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            size = msb + 1;
14712436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            DIP("dins r%u, r%u, %d, %d", rt, rs, lsb,
14713436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                msb - lsb + 1);
14714436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UChar lsAmt = 63 - lsb;  /* left shift amount; */
14715436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UChar rsAmt = 63 - lsb;  /* right shift amount; */
14716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmp, binop(Iop_Shl64, mkexpr(tmpRt), mkU8(lsAmt)));
14717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpT1, binop(Iop_Shl64, mkexpr(tmp), mkU8(1)));
14718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmp1, binop(Iop_Shr64, mkexpr(tmpT1), mkU8(rsAmt)));
14719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpT2, binop(Iop_Shr64, mkexpr(tmp1), mkU8(1)));
14720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            lsAmt = msb;  /* left shift amount; */
14722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            rsAmt = 1;  /*right shift amount; */
14723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpT3, binop(Iop_Shr64, mkexpr(tmpRt), mkU8(rsAmt)));
14724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpT4, binop(Iop_Shr64, mkexpr(tmpT3), mkU8(lsAmt)));
14725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpT5, binop(Iop_Shl64, mkexpr(tmpT4), mkU8(rsAmt)));
14726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpT6, binop(Iop_Shl64, mkexpr(tmpT5), mkU8(lsAmt)));
14727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            lsAmt = 64 - (msb - lsb + 1);  /* left shift amount; */
14729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            rsAmt = 64 - (msb + 1);  /* right shift amount; */
14730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpT7, binop(Iop_Shl64, mkexpr(tmpRs), mkU8(lsAmt)));
14731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpT8, binop(Iop_Shr64, mkexpr(tmpT7), mkU8(rsAmt)));
14732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpT9, binop(Iop_Or64, mkexpr(tmpT2), mkexpr(tmpT8)));
14734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpRd, binop(Iop_Or64, mkexpr(tmpT6), mkexpr(tmpT9)));
14735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rt, mkexpr(tmpRd));
14736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
14737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
14738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x24:  /* DBSHFL */
14739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         lsb = get_lsb(cins);
14740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp tmpRs = newTemp(ty);
14741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp tmpRt = newTemp(ty);
14742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp tmpRd = newTemp(ty);
14743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(tmpRs, getIReg(rs));
14744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(tmpRt, getIReg(rt));
14745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch (lsb) {
14746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x02: {  /* DSBH */
14747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               DIP("dsbh r%u, r%u", rd, rt);
14748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               IRTemp tmpT1 = newTemp(ty);
14749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               IRTemp tmpT2 = newTemp(ty);
14750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               IRTemp tmpT3 = newTemp(ty);
14751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               IRTemp tmpT4 = newTemp(ty);
14752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               IRTemp tmpT5 = newTemp(Ity_I64);
14753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               IRTemp tmpT6 = newTemp(ty);
14754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmpT5, mkU64(0xFF00FF00FF00FF00ULL));
14755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmpT6, mkU64(0x00FF00FF00FF00FFULL));
14756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmpT1, binop(Iop_And64, mkexpr(tmpRt), mkexpr(tmpT5)));
14757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmpT2, binop(Iop_Shr64, mkexpr(tmpT1), mkU8(8)));
14758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmpT3, binop(Iop_And64, mkexpr(tmpRt), mkexpr(tmpT6)));
14759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmpT4, binop(Iop_Shl64, mkexpr(tmpT3), mkU8(8)));
14760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmpRd, binop(Iop_Or64, mkexpr(tmpT4), mkexpr(tmpT2)));
14761436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putIReg(rd, mkexpr(tmpRd));
14762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
14763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
14764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x05: {  /* DSHD */
14765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               DIP("dshd r%u, r%u\n", rd, rt);
14766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               IRTemp tmpT1 = newTemp(ty);
14767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               IRTemp tmpT2 = newTemp(ty);
14768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               IRTemp tmpT3 = newTemp(ty);
14769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               IRTemp tmpT4 = newTemp(ty);
14770436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               IRTemp tmpT5 = newTemp(Ity_I64);
14771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               IRTemp tmpT6 = newTemp(ty);
14772436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               IRTemp tmpT7 = newTemp(ty);
14773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               IRTemp tmpT8 = newTemp(ty);
14774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               IRTemp tmpT9 = newTemp(ty);
14775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmpT5, mkU64(0xFFFF0000FFFF0000ULL));
14776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmpT6, mkU64(0x0000FFFF0000FFFFULL));
14777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmpT1, binop(Iop_And64, mkexpr(tmpRt), mkexpr(tmpT5)));
14778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmpT2, binop(Iop_Shr64, mkexpr(tmpT1), mkU8(16)));
14779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmpT3, binop(Iop_And64, mkexpr(tmpRt), mkexpr(tmpT6)));
14780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmpT4, binop(Iop_Shl64, mkexpr(tmpT3), mkU8(16)));
14781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmpT7, binop(Iop_Or64, mkexpr(tmpT4), mkexpr(tmpT2)));
14782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmpT8, binop(Iop_Shl64, mkexpr(tmpT7), mkU8(32)));
14783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmpT9, binop(Iop_Shr64, mkexpr(tmpT7), mkU8(32)));
14784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmpRd, binop(Iop_Or64, mkexpr(tmpT8), mkexpr(tmpT9)));
14785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putIReg(rd, mkexpr(tmpRd));
14786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
14787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
14788436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         default:
14789436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            vex_printf("\nop6o10 = %d", lsb);
14790436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            goto decode_failure;;
14791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
14792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
14793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x3B: {  /* RDHWR */
14794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("rdhwr r%d, r%d", rt, rd);
14795663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            if (rd == 29) {
14796663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               putIReg(rt, getULR());
14797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#if defined(__mips__) && ((defined(__mips_isa_rev) && __mips_isa_rev >= 2))
14798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            } else if (rd == 1) {
14799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (mode64) {
14800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  IRTemp   val  = newTemp(Ity_I64);
14801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  IRExpr** args = mkIRExprVec_2 (mkU64(rt), mkU64(rd));
14802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  IRDirty *d = unsafeIRDirty_1_N(val,
14803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 0,
14804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 "mips64_dirtyhelper_rdhwr",
14805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 &mips64_dirtyhelper_rdhwr,
14806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 args);
14807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  stmt(IRStmt_Dirty(d));
14808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  putIReg(rt, mkexpr(val));
14809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               } else {
14810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  IRTemp   val  = newTemp(Ity_I32);
14811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  IRExpr** args = mkIRExprVec_2 (mkU32(rt), mkU32(rd));
14812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  IRDirty *d = unsafeIRDirty_1_N(val,
14813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 0,
14814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 "mips32_dirtyhelper_rdhwr",
14815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 &mips32_dirtyhelper_rdhwr,
14816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                 args);
14817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  stmt(IRStmt_Dirty(d));
14818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  putIReg(rt, mkexpr(val));
14819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
14820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
14821663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            } else
14822663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               goto decode_failure;
14823663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            break;
14824663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
14825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x04:  /* INS */
14826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         msb = get_msb(cins);
14827663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         lsb = get_lsb(cins);
14828663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         size = msb - lsb + 1;
14829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("ins size:%d msb:%d lsb:%d", size, msb, lsb);
14830663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14831663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vassert(lsb + size <= 32);
14832663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vassert(lsb + size > 0);
14833663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* put size bits from rs at the pos in temporary */
14835663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         t0 = newTemp(Ity_I32);
14836663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         t3 = newTemp(Ity_I32);
14837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* shift left for 32 - size to clear leading bits and get zeros
14838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            at the end */
14839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t0, binop(Iop_Shl32, mkNarrowTo32(ty, getIReg(rs)),
14840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          mkU8(32 - size)));
14841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* now set it at pos */
14842663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         t1 = newTemp(Ity_I32);
14843663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(t1, binop(Iop_Shr32, mkexpr(t0), mkU8(32 - size - lsb)));
14844663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14845663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if (lsb > 0) {
14846663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            t2 = newTemp(Ity_I32);
14847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* clear everything but lower pos bits from rt */
14848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t2, binop(Iop_Shl32, mkNarrowTo32(ty, getIReg(rt)),
14849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             mkU8(32 - lsb)));
14850663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            assign(t3, binop(Iop_Shr32, mkexpr(t2), mkU8(32 - lsb)));
14851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else
14852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t3, mkU32(0));
14853663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14854663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if (msb < 31) {
14855663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            t4 = newTemp(Ity_I32);
14856436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* clear everything but upper msb + 1 bits from rt */
14857436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t4, binop(Iop_Shr32, mkNarrowTo32(ty, getIReg(rt)),
14858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             mkU8(msb + 1)));
14859663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            t5 = newTemp(Ity_I32);
14860663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            assign(t5, binop(Iop_Shl32, mkexpr(t4), mkU8(msb + 1)));
14861663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* now combine these registers */
14863663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            if (lsb > 0) {
14864663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               t6 = newTemp(Ity_I32);
14865663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng               assign(t6, binop(Iop_Or32, mkexpr(t5), mkexpr(t1)));
14866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putIReg(rt, mkWidenFrom32(ty, binop(Iop_Or32, mkexpr(t6),
14867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkexpr(t3)), True));
14868663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            } else {
14869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putIReg(rt, mkWidenFrom32(ty, binop(Iop_Or32, mkexpr(t1),
14870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                   mkexpr(t5)), True));
14871663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            }
14872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
14873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rt, mkWidenFrom32(ty, binop(Iop_Or32, mkexpr(t1),
14874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                mkexpr(t3)), True));
14875663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
14876663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
14877663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x00:  /* EXT */
14879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         msb = get_msb(cins);
14880663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         lsb = get_lsb(cins);
14881663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         size = msb + 1;
14882663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         DIP("ext size:%d msb:%d lsb:%d", size, msb, lsb);
14883663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vassert(lsb + size <= 32);
14884663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vassert(lsb + size > 0);
14885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* put size bits from rs at the top of in temporary */
14886663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if (lsb + size < 32) {
14887663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            t0 = newTemp(Ity_I32);
14888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t0, binop(Iop_Shl32, mkNarrowTo32(ty, getIReg(rs)),
14889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             mkU8(32 - lsb - size)));
14890663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rt, mkWidenFrom32(ty, binop(Iop_Shr32, mkexpr(t0),
14892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                mkU8(32 - size)), True));
14893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
14894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rt, mkWidenFrom32(ty, binop(Iop_Shr32,
14895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                mkNarrowTo32(ty, getIReg(rs)),
14896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                mkU8(32 - size)), True));
14897663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
14898663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
14899663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14900436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x03:  /* Doubleword Extract Bit Field - DEXT; MIPS64r2 */
14901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         msb = get_msb(cins);
14902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         lsb = get_lsb(cins);
14903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         size = msb + 1;
14904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("dext r%u, r%u, %d, %d", rt, rs, lsb, msb + 1);
14905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t1 = newTemp(Ity_I64);
14906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(lsb >= 0 && lsb < 32);
14907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(size > 0 && size <= 32);
14908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert((lsb + size) > 0 && (lsb + size) <= 63);
14909663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UChar lsAmt = 63 - (lsb + msb);  /* left shift amount; */
14911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         UChar rsAmt = 63 - msb;  /* right shift amount; */
14912663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, binop(Iop_Shl64, getIReg(rs), mkU8(lsAmt)));
14914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rt, binop(Iop_Shr64, mkexpr(t1), mkU8(rsAmt)));
14915663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
14917663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
14918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x20:  /* BSHFL */
14919436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch (sa) {
14920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x02:  /* WSBH */
14921436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               DIP("wsbh r%d, r%d", rd, rt);
14922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t0 = newTemp(Ity_I32);
14923436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t1 = newTemp(Ity_I32);
14924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t2 = newTemp(Ity_I32);
14925436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               t3 = newTemp(Ity_I32);
14926436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t0, binop(Iop_Shl32, binop(Iop_And32, mkNarrowTo32(ty,
14927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           getIReg(rt)), mkU32(0x00FF0000)),
14928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkU8(0x8)));
14929436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t1, binop(Iop_Shr32, binop(Iop_And32, mkNarrowTo32(ty,
14930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                getIReg(rt)), mkU32(0xFF000000)), mkU8(0x8)));
14931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t2, binop(Iop_Shl32, binop(Iop_And32, mkNarrowTo32(ty,
14932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                getIReg(rt)), mkU32(0x000000FF)), mkU8(0x8)));
14933436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(t3, binop(Iop_Shr32, binop(Iop_And32, mkNarrowTo32(ty,
14934436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                getIReg(rt)), mkU32(0x0000FF00)), mkU8(0x8)));
14935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putIReg(rd, mkWidenFrom32(ty, binop(Iop_Or32, binop(Iop_Or32,
14936436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkexpr(t0), mkexpr(t1)),
14937436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         binop(Iop_Or32, mkexpr(t2),
14938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkexpr(t3))), True));
14939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
14940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x10:  /* SEB */
14942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               DIP("seb r%d, r%d", rd, rt);
14943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (mode64)
14944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  putIReg(rd, unop(Iop_8Sto64, unop(Iop_64to8, getIReg(rt))));
14945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               else
14946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  putIReg(rd, unop(Iop_8Sto32, unop(Iop_32to8, getIReg(rt))));
14947436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
14948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14949436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x18:  /* SEH */
14950436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               DIP("seh r%d, r%d", rd, rt);
14951436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (mode64)
14952436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  putIReg(rd, unop(Iop_16Sto64, unop(Iop_64to16, getIReg(rt))));
14953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               else
14954436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  putIReg(rd, unop(Iop_16Sto32, unop(Iop_32to16, getIReg(rt))));
14955436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
14956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default:
14958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               goto decode_failure;
14959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
14961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;  /* BSHFL */
14962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
14963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* --- MIPS32(r2) DSP ASE(r2) / Cavium Specfic (LX) instructions --- */
14964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0xA:  /* LX */
14965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (VEX_MIPS_COMP_ID(archinfo->hwcaps) == VEX_PRID_COMP_CAVIUM) {
14966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (dis_instr_CVM(cins))
14967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
14968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            goto decode_failure;
14969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
14970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0xC:  /* INSV */
14971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x38: {  /* EXTR.W */
14972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (VEX_MIPS_PROC_DSP(archinfo->hwcaps)) {
14973436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UInt retVal = disDSPInstr_MIPS_WRK ( cins );
14974436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (0 != retVal ) {
14975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               goto decode_failure_dsp;
14976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
14977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
14978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
14979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            goto decode_failure_dsp;
14980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
14981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
14982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
14983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x10: {  /* ADDU.QB */
14984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch(sa) {
14985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case  0xC:  /* SUBU_S.PH */
14986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case  0xD:  /* ADDU_S.PH */
14987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x1E: {  /* MULQ_S.PH */
14988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (VEX_MIPS_PROC_DSP2(archinfo->hwcaps)) {
14989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UInt retVal = disDSPInstr_MIPS_WRK ( cins );
14990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  if (0 != retVal ) {
14991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     goto decode_failure_dsp;
14992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
14993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  break;
14994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               } else {
14995436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  goto decode_failure_dsp;
14996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
14997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
14998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
14999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default: {
15000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (VEX_MIPS_PROC_DSP(archinfo->hwcaps)) {
15001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UInt retVal = disDSPInstr_MIPS_WRK ( cins );
15002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  if (0 != retVal ) {
15003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     goto decode_failure_dsp;
15004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
15005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  break;
15006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               } else {
15007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  goto decode_failure_dsp;
15008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
15009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
15010436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
15011436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
15012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
15013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
15014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x11: {  /* CMPU.EQ.QB */
15015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch(sa) {
15016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x18:  /* CMPGDU.EQ.QB */
15017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x19:  /* CMPGDU.LT.QB */
15018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x1A:  /* CMPGDU.LE.QB */
15019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x0D:  /* PRECR.QB.PH */
15020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x1E:  /* PRECR_SRA.PH.W */
15021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x1F: {  /* PRECR_SRA_R.PH.W */
15022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (VEX_MIPS_PROC_DSP2(archinfo->hwcaps)) {
15023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UInt retVal = disDSPInstr_MIPS_WRK ( cins );
15024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  if (0 != retVal ) {
15025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     goto decode_failure_dsp;
15026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
15027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  break;
15028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               } else {
15029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  goto decode_failure_dsp;
15030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
15031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
15032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
15033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default: {
15034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (VEX_MIPS_PROC_DSP(archinfo->hwcaps)) {
15035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UInt retVal = disDSPInstr_MIPS_WRK ( cins );
15036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  if (0 != retVal ) {
15037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     goto decode_failure_dsp;
15038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
15039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  break;
15040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               } else {
15041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  goto decode_failure_dsp;
15042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
15043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
15044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
15045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
15046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
15047436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
15048436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x12: {  /* ABSQ_S.PH */
15049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch(sa){
15050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x1: {  /* ABSQ_S.QB */
15051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (VEX_MIPS_PROC_DSP2(archinfo->hwcaps)) {
15052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UInt retVal = disDSPInstr_MIPS_WRK ( cins );
15053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  if (0 != retVal ) {
15054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     goto decode_failure_dsp;
15055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
15056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  break;
15057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               } else {
15058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  goto decode_failure_dsp;
15059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
15060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
15061436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
15062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default: {
15063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (VEX_MIPS_PROC_DSP(archinfo->hwcaps)) {
15064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UInt retVal = disDSPInstr_MIPS_WRK ( cins );
15065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  if (0 != retVal ) {
15066436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     goto decode_failure_dsp;
15067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
15068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  break;
15069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               } else {
15070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  goto decode_failure_dsp;
15071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
15072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
15073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
15074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
15075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
15076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
15077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x13: {  /* SHLL.QB */
15078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch(sa) {
15079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x04:  /* SHRA.QB */
15080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x05:  /* SHRA_R.QB */
15081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x06:  /* SHRAV.QB */
15082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x07:  /* SHRAV_R.QB */
15083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x19:  /* SHLR.PH */
15084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x1B: {  /* SHLRV.PH */
15085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (VEX_MIPS_PROC_DSP2(archinfo->hwcaps)) {
15086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UInt retVal = disDSPInstr_MIPS_WRK ( cins );
15087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  if (0 != retVal ) {
15088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     goto decode_failure_dsp;
15089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
15090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  break;
15091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               } else {
15092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  goto decode_failure_dsp;
15093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
15094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
15095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
15096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default: {
15097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (VEX_MIPS_PROC_DSP(archinfo->hwcaps)) {
15098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UInt retVal = disDSPInstr_MIPS_WRK ( cins );
15099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  if (0 != retVal ) {
15100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     goto decode_failure_dsp;
15101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
15102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  break;
15103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               } else {
15104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  goto decode_failure_dsp;
15105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
15106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
15107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
15108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
15109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
15110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
15111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x30: {  /* DPAQ.W.PH */
15112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         switch(sa) {
15113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case  0x0:  /* DPA.W.PH */
15114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x18:  /* DPAQX_S.W.PH */
15115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x1A:  /* DPAQX_SA.W.PH */
15116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case  0x8:  /* DPAX.W.PH */
15117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case  0x1:  /* DPS.W.PH */
15118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x19:  /* DPSQX_S.W.PH */
15119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case 0x1B:  /* DPSQX_SA.W.PH */
15120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case  0x9:  /* DPSX.W.PH */
15121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            case  0x2: {  /* MULSA.W.PH */
15122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (VEX_MIPS_PROC_DSP2(archinfo->hwcaps)) {
15123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UInt retVal = disDSPInstr_MIPS_WRK ( cins );
15124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  if (0 != retVal ) {
15125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     goto decode_failure_dsp;
15126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
15127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  break;
15128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               } else {
15129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  goto decode_failure_dsp;
15130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
15131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
15132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
15133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            default: {
15134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (VEX_MIPS_PROC_DSP(archinfo->hwcaps)) {
15135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  UInt retVal = disDSPInstr_MIPS_WRK ( cins );
15136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  if (0 != retVal ) {
15137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     goto decode_failure_dsp;
15138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  }
15139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  break;
15140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               } else {
15141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  goto decode_failure_dsp;
15142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
15143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
15144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
15145663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
15146663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
15147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
15148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x18:  /* ADDUH.QB/MUL.PH */
15149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x31: {  /* APPEND */
15150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (VEX_MIPS_PROC_DSP2(archinfo->hwcaps)) {
15151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UInt retVal = disDSPInstr_MIPS_WRK ( cins );
15152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (0 != retVal ) {
15153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               goto decode_failure_dsp;
15154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
15155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
15156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
15157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            goto decode_failure_dsp;
15158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
15159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
15160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      default:
15161663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         goto decode_failure;
15162663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
15164436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;  /* Special3 */
15165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0x3B:
15167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (0x3B == function &&
15168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov          (VEX_MIPS_COMP_ID(archinfo->hwcaps) == VEX_PRID_COMP_BROADCOM)) {
15169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /*RDHWR*/
15170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("rdhwr r%d, r%d", rt, rd);
15171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (rd == 29) {
15172436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rt, getULR());
15173436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else
15174436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            goto decode_failure;
15175436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
15176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      } else {
15177663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         goto decode_failure;
15178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
15179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15180436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x00:  /* Special */
15181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15182663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (function) {
15183663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 0x1: {
15184663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         UInt mov_cc = get_mov_cc(cins);
15185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (tf == 0) {  /* MOVF */
15186663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            DIP("movf r%d, r%d, %d", rd, rs, mov_cc);
15187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t1 = newTemp(Ity_I1);
15188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t2 = newTemp(Ity_I32);
15189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t3 = newTemp(Ity_I1);
15190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t1, binop(Iop_CmpEQ32, mkU32(0), mkU32(mov_cc)));
15192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t2, IRExpr_ITE(mkexpr(t1),
15193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  binop(Iop_And32,
15194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_Shr32, getFCSR(),
15195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkU8(23)),
15196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        mkU32(0x1)),
15197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  binop(Iop_And32,
15198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_Shr32, getFCSR(),
15199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkU8(24 + mov_cc)),
15200436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        mkU32(0x1))
15201436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  ));
15202436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t3, binop(Iop_CmpEQ32, mkU32(0), mkexpr(t2)));
15203436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rd, IRExpr_ITE(mkexpr(t3), getIReg(rs), getIReg(rd)));
15204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else if (tf == 1) {  /* MOVT */
15205663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            DIP("movt r%d, r%d, %d", rd, rs, mov_cc);
15206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t1 = newTemp(Ity_I1);
15207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t2 = newTemp(Ity_I32);
15208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t3 = newTemp(Ity_I1);
15209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t1, binop(Iop_CmpEQ32, mkU32(0), mkU32(mov_cc)));
15211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t2, IRExpr_ITE(mkexpr(t1),
15212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  binop(Iop_And32,
15213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_Shr32, getFCSR(),
15214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkU8(23)),
15215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        mkU32(0x1)),
15216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  binop(Iop_And32,
15217436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop(Iop_Shr32, getFCSR(),
15218436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              mkU8(24 + mov_cc)),
15219436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        mkU32(0x1))
15220436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  ));
15221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t3, binop(Iop_CmpEQ32, mkU32(1), mkexpr(t2)));
15222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rd, IRExpr_ITE(mkexpr(t3), getIReg(rs), getIReg(rd)));
15223663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
15224663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
15225663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
15226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x0A: {  /* MOVZ */
15227663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         DIP("movz r%d, r%d, r%d", rd, rs, rt);
15228663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         t1 = newTemp(ty);
15229663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         t2 = newTemp(ty);
15230436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
15231436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t1, unop(Iop_32Sto64, unop(Iop_1Sto32, binop(Iop_CmpEQ64,
15232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            getIReg(rt), mkU64(0x0)))));
15233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t2, unop(Iop_32Sto64, unop(Iop_1Sto32, binop(Iop_CmpNE64,
15234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            getIReg(rt), mkU64(0x0)))));
15235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rd, binop(Iop_Add64, binop(Iop_And64, getIReg(rs),
15236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        mkexpr(t1)), binop(Iop_And64, getIReg(rd),mkexpr(t2))));
15237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
15238663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            assign(t1, unop(Iop_1Sto32, binop(Iop_CmpEQ32, getIReg(rt),
15239663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              mkU32(0x0))));
15240663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            assign(t2, unop(Iop_1Sto32, binop(Iop_CmpNE32, getIReg(rt),
15241663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              mkU32(0x0))));
15242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            putIReg(rd, binop(Iop_Add32, binop(Iop_And32, getIReg(rs),
15243663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        mkexpr(t1)), binop(Iop_And32, getIReg(rd),
15244663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        mkexpr(t2))));
15245663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
15246663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
15247663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
15248663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x0B: {  /* MOVN */
15250663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         DIP("movn r%d, r%d, r%d", rd, rs, rt);
15251663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         t1 = newTemp(ty);
15252663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         t2 = newTemp(ty);
15253436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
15254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t1, unop(Iop_32Sto64, unop(Iop_1Sto32, binop(Iop_CmpEQ64,
15255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            getIReg(rt), mkU64(0x0)))));
15256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t2, unop(Iop_32Sto64, unop(Iop_1Sto32, binop(Iop_CmpNE64,
15257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            getIReg(rt), mkU64(0x0)))));
15258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rd, binop(Iop_Add64, binop(Iop_And64, getIReg(rs),
15259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        mkexpr(t2)), binop(Iop_And64, getIReg(rd),
15260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                           mkexpr(t1))));
15261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
15262663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            assign(t1, unop(Iop_1Sto32, binop(Iop_CmpEQ32, getIReg(rt),
15263663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              mkU32(0x0))));
15264663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            assign(t2, unop(Iop_1Sto32, binop(Iop_CmpNE32, getIReg(rt),
15265663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                                              mkU32(0x0))));
15266663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            putIReg(rd, binop(Iop_Add32, binop(Iop_And32, getIReg(rs),
15267663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        mkexpr(t2)), binop(Iop_And32, getIReg(rd),
15268663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        mkexpr(t1))));
15269663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
15270663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
15271663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
15272663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x18:  {  /* MULT */
15274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if ( (1 <= ac) && ( 3 >= ac) ) {
15275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (VEX_MIPS_PROC_DSP(archinfo->hwcaps)) {
15276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* If DSP is present -> DSP ASE MULT */
15277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               UInt retVal = disDSPInstr_MIPS_WRK ( cins );
15278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (0 != retVal ) {
15279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  goto decode_failure_dsp;
15280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
15281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
15282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            } else {
15283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               goto decode_failure_dsp;
15284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
15285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
15286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            DIP("mult r%d, r%d", rs, rt);
15287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t2 = newTemp(Ity_I64);
15288663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15289436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t2, binop(Iop_MullS32, mkNarrowTo32(ty, getIReg(rs)),
15290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          mkNarrowTo32(ty, getIReg(rt))));
15291663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putHI(mkWidenFrom32(ty, unop(Iop_64HIto32, mkexpr(t2)), True));
15293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putLO(mkWidenFrom32(ty, unop(Iop_64to32, mkexpr(t2)), True));
15294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
15295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
15296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
15297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x19:  {  /* MULTU */
15298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if ( (1 <= ac) && ( 3 >= ac) ) {
15299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (VEX_MIPS_PROC_DSP(archinfo->hwcaps)) {
15300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               /* If DSP is present -> DSP ASE MULTU */
15301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               UInt retVal = disDSPInstr_MIPS_WRK ( cins );
15302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               if (0 != retVal ) {
15303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                  goto decode_failure_dsp;
15304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               }
15305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               break;
15306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            } else {
15307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               goto decode_failure_dsp;
15308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
15309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
15310436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            DIP("multu r%d, r%d", rs, rt);
15311436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t2 = newTemp(Ity_I64);
15312663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t2, binop(Iop_MullU32, mkNarrowTo32(ty, getIReg(rs)),
15314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                          mkNarrowTo32(ty, getIReg(rt))));
15315663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putHI(mkWidenFrom32(ty, unop(Iop_64HIto32, mkexpr(t2)), True));
15317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putLO(mkWidenFrom32(ty, unop(Iop_64to32, mkexpr(t2)), True));
15318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
15319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
15320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
15321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x20: {  /* ADD */
15322663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         DIP("add r%d, r%d, r%d", rd, rs, rt);
15323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp tmpRs32 = newTemp(Ity_I32);
15324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp tmpRt32 = newTemp(Ity_I32);
15325663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(tmpRs32, mkNarrowTo32(ty, getIReg(rs)));
15327436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(tmpRt32, mkNarrowTo32(ty, getIReg(rt)));
15328663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t0 = newTemp(Ity_I32);
15330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t1 = newTemp(Ity_I32);
15331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t2 = newTemp(Ity_I32);
15332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t3 = newTemp(Ity_I32);
15333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t4 = newTemp(Ity_I32);
15334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* dst = src0 + src1
15335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (sign(src0 ) != sign(src1 ))
15336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            goto no overflow;
15337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (sign(dst) == sign(src0 ))
15338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            goto no overflow;
15339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            we have overflow! */
15340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t0, binop(Iop_Add32, mkexpr(tmpRs32), mkexpr(tmpRt32)));
15342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, binop(Iop_Xor32, mkexpr(tmpRs32), mkexpr(tmpRt32)));
15343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t2, unop(Iop_1Uto32,
15344436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         binop(Iop_CmpEQ32,
15345436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               binop(Iop_And32, mkexpr(t1), mkU32(0x80000000)),
15346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU32(0x80000000))));
15347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t3, binop(Iop_Xor32, mkexpr(t0), mkexpr(tmpRs32)));
15349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t4, unop(Iop_1Uto32,
15350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         binop(Iop_CmpNE32,
15351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               binop(Iop_And32, mkexpr(t3), mkU32(0x80000000)),
15352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU32(0x80000000))));
15353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         stmt(IRStmt_Exit(binop(Iop_CmpEQ32,
15355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                binop(Iop_Or32, mkexpr(t2), mkexpr(t4)),
15356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                mkU32(0)),
15357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          Ijk_SigFPE_IntOvf,
15358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          mode64 ? IRConst_U64(guest_PC_curr_instr + 4) :
15359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   IRConst_U32(guest_PC_curr_instr + 4),
15360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          OFFB_PC));
15361436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15362436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rd,  mkWidenFrom32(ty, mkexpr(t0), True));
15363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
15364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
15365663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 0x1A:  /* DIV */
15366663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         DIP("div r%d, r%d", rs, rt);
15367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
15368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t2 = newTemp(Ity_I64);
15369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t2, binop(Iop_DivModS64to32,
15371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             getIReg(rs), mkNarrowTo32(ty, getIReg(rt))));
15372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putHI(mkWidenFrom32(ty, unop(Iop_64HIto32, mkexpr(t2)), True));
15374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putLO(mkWidenFrom32(ty, unop(Iop_64to32, mkexpr(t2)), True));
15375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
15376663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            t1 = newTemp(Ity_I64);
15377663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            t2 = newTemp(Ity_I64);
15378663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15379663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            assign(t1, unop(Iop_32Sto64, getIReg(rs)));
15380663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            assign(t2, binop(Iop_DivModS64to32, mkexpr(t1), getIReg(rt)));
15381663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15382663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            putHI(unop(Iop_64HIto32, mkexpr(t2)));
15383663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            putLO(unop(Iop_64to32, mkexpr(t2)));
15384663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
15385663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
15386663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x1B:  /* DIVU */
15388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("divu r%d, r%d", rs, rt);
15389436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
15390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t2 = newTemp(Ity_I64);
15391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t2, binop(Iop_DivModU64to32,
15393436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             getIReg(rs), mkNarrowTo32(ty, getIReg(rt))));
15394436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15395436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putHI(mkWidenFrom32(ty, unop(Iop_64HIto32, mkexpr(t2)), True));
15396436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putLO(mkWidenFrom32(ty, unop(Iop_64to32, mkexpr(t2)), True));
15397436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
15398663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            t1 = newTemp(Ity_I64);
15399663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            t2 = newTemp(Ity_I64);
15400663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            assign(t1, unop(Iop_32Uto64, getIReg(rs)));
15401663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            assign(t2, binop(Iop_DivModU64to32, mkexpr(t1), getIReg(rt)));
15402663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            putHI(unop(Iop_64HIto32, mkexpr(t2)));
15403663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            putLO(unop(Iop_64to32, mkexpr(t2)));
15404663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
15405663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
15406663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15407436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x1C:  /* Doubleword Multiply - DMULT; MIPS64 */
15408436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("dmult r%u, r%u", rs, rt);
15409436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t0 = newTemp(Ity_I128);
15410436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t0, binop(Iop_MullS64, getIReg(rs), getIReg(rt)));
15412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15413436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putHI(unop(Iop_128HIto64, mkexpr(t0)));
15414436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putLO(unop(Iop_128to64, mkexpr(t0)));
15415663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
15416663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x1D:  /* Doubleword Multiply Unsigned - DMULTU; MIPS64 */
15418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("dmultu r%u, r%u", rs, rt);
15419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t0 = newTemp(Ity_I128);
15420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t0, binop(Iop_MullU64, getIReg(rs), getIReg(rt)));
15422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15423436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putHI(unop(Iop_128HIto64, mkexpr(t0)));
15424436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putLO(unop(Iop_128to64, mkexpr(t0)));
15425663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
15426663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x1E:  /* Doubleword Divide DDIV; MIPS64 */
15428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("ddiv r%u, r%u", rs, rt);
15429436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t1 = newTemp(Ity_I128);
15430436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, binop(Iop_DivModS64to64, getIReg(rs), getIReg(rt)));
15432436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putHI(unop(Iop_128HIto64, mkexpr(t1)));
15434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putLO(unop(Iop_128to64, mkexpr(t1)));
15435663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
15436663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x1F:  /* Doubleword Divide Unsigned DDIVU; MIPS64 check this */
15438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("ddivu r%u, r%u", rs, rt);
15439436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t1 = newTemp(Ity_I128);
15440436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t2 = newTemp(Ity_I128);
15441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15442436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, binop(Iop_64HLto128, mkU64(0), getIReg(rs)));
15443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t2, binop(Iop_DivModU128to64, mkexpr(t1), getIReg(rt)));
15445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putHI(unop(Iop_128HIto64, mkexpr(t2)));
15447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putLO(unop(Iop_128to64, mkexpr(t2)));
15448663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
15449663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15450436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x10: {  /* MFHI */
15451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (VEX_MIPS_PROC_DSP(archinfo->hwcaps)) {
15452436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* If DSP is present -> DSP ASE MFHI */
15453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UInt retVal = disDSPInstr_MIPS_WRK ( cins );
15454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (0 != retVal ) {
15455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               goto decode_failure;
15456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
15457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
15458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
15459436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            DIP("mfhi r%d", rd);
15460436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rd, getHI());
15461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
15462436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
15463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
15464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x11:  {  /* MTHI */
15466436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (VEX_MIPS_PROC_DSP(archinfo->hwcaps)) {
15467436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* If DSP is present -> DSP ASE MTHI */
15468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UInt retVal = disDSPInstr_MIPS_WRK ( cins );
15469436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (0 != retVal ) {
15470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               goto decode_failure;
15471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
15472436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
15473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
15474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            DIP("mthi r%d", rs);
15475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putHI(getIReg(rs));
15476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
15477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
15478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
15479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x12:  {  /* MFLO */
15481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (VEX_MIPS_PROC_DSP(archinfo->hwcaps)) {
15482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* If DSP is present -> DSP ASE MFLO */
15483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UInt retVal = disDSPInstr_MIPS_WRK ( cins );
15484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (0 != retVal ) {
15485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               goto decode_failure;
15486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
15487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
15488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
15489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            DIP("mflo r%d", rd);
15490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rd, getLO());
15491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
15492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
15493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
15494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x13:  {  /* MTLO */
15496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (VEX_MIPS_PROC_DSP(archinfo->hwcaps)) {
15497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            /* If DSP is present -> DSP ASE MTLO */
15498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            UInt retVal = disDSPInstr_MIPS_WRK ( cins );
15499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (0 != retVal ) {
15500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               goto decode_failure;
15501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
15502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
15503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
15504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            DIP("mtlo r%d", rs);
15505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putLO(getIReg(rs));
15506436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
15507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
15508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
15509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15510663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 0x21:  /* ADDU */
15511663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         DIP("addu r%d, r%d, r%d", rd, rs, rt);
15512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
15513436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ALU_PATTERN64(Iop_Add32);
15514436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
15515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ALU_PATTERN(Iop_Add32);
15516436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
15517663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
15518663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x22: {  /* SUB */
15520663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         DIP("sub r%d, r%d, r%d", rd, rs, rt);
15521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp tmpRs32 = newTemp(Ity_I32);
15522436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp tmpRt32 = newTemp(Ity_I32);
15523663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(tmpRs32, mkNarrowTo32(ty, getIReg(rs)));
15525436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(tmpRt32, mkNarrowTo32(ty, getIReg(rt)));
15526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t0 = newTemp(Ity_I32);
15527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t1 = newTemp(Ity_I32);
15528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t2 = newTemp(Ity_I32);
15529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t3 = newTemp(Ity_I32);
15530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t4 = newTemp(Ity_I32);
15531436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t5 = newTemp(Ity_I32);
15532436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* dst = src0 + (-1 * src1)
15533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if(sign(src0 ) != sign((-1 * src1) ))
15534436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            goto no overflow;
15535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if(sign(dst) == sign(src0 ))
15536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            goto no overflow;
15537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            we have overflow! */
15538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t5, binop(Iop_Mul32, mkexpr(tmpRt32), mkU32(-1)));
15540436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t0, binop(Iop_Add32, mkexpr(tmpRs32), mkexpr(t5)));
15541436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, binop(Iop_Xor32, mkexpr(tmpRs32), mkexpr(t5)));
15542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t2, unop(Iop_1Sto32, binop(Iop_CmpEQ32, binop(Iop_And32,
15543436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         mkexpr(t1), mkU32(0x80000000)), mkU32(0x80000000))));
15544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t3, binop(Iop_Xor32, mkexpr(t0), mkexpr(tmpRs32)));
15546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t4, unop(Iop_1Sto32, binop(Iop_CmpNE32, binop(Iop_And32,
15547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         mkexpr(t3), mkU32(0x80000000)), mkU32(0x80000000))));
15548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         stmt(IRStmt_Exit(binop(Iop_CmpEQ32, binop(Iop_Or32, mkexpr(t2),
15550436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                mkexpr(t4)), mkU32(0)), Ijk_SigFPE_IntOvf,
15551436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          mode64 ? IRConst_U64(guest_PC_curr_instr + 4) :
15552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                   IRConst_U32(guest_PC_curr_instr + 4),
15553436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          OFFB_PC));
15554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rd, mkWidenFrom32(ty, mkexpr(t0), True));
15556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
15557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
15558663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 0x23:  /* SUBU */
15559663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         DIP("subu r%d, r%d, r%d", rd, rs, rt);
15560436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
15561436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ALU_PATTERN64(Iop_Sub32);
15562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
15563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ALU_PATTERN(Iop_Sub32);
15564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
15565663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
15566663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15567663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 0x24:  /* AND */
15568663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         DIP("and r%d, r%d, r%d", rd, rs, rt);
15569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
15570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ALU_PATTERN(Iop_And64);
15571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
15572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ALU_PATTERN(Iop_And32);
15573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
15574663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
15575663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15576663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 0x25:  /* OR */
15577663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         DIP("or r%d, r%d, r%d", rd, rs, rt);
15578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
15579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ALU_PATTERN(Iop_Or64);
15580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
15581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ALU_PATTERN(Iop_Or32);
15582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
15583663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
15584663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15585663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 0x26:  /* XOR */
15586663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         DIP("xor r%d, r%d, r%d", rd, rs, rt);
15587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
15588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ALU_PATTERN(Iop_Xor64);
15589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
15590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            ALU_PATTERN(Iop_Xor32);
15591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
15592663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
15593663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15594663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 0x27:  /* NOR */
15595663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         DIP("nor r%d, r%d, r%d", rd, rs, rt);
15596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64)
15597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rd, unop(Iop_Not64, binop(Iop_Or64, getIReg(rs),
15598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getIReg(rt))));
15599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         else
15600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rd, unop(Iop_Not32, binop(Iop_Or32, getIReg(rs),
15601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                              getIReg(rt))));
15602663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
15603663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15604663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 0x08:  /* JR */
15605663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         DIP("jr r%d", rs);
15606663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         t0 = newTemp(ty);
15607663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         assign(t0, getIReg(rs));
15608663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         lastn = mkexpr(t0);
15609663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
15610663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15611663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 0x09:  /* JALR */
15612663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         DIP("jalr r%d r%d", rd, rs);
15613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
15614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rd, mkU64(guest_PC_curr_instr + 8));
15615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t0 = newTemp(Ity_I64);
15616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t0, getIReg(rs));
15617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            lastn = mkexpr(t0);
15618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
15619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rd, mkU32(guest_PC_curr_instr + 8));
15620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t0 = newTemp(Ity_I32);
15621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t0, getIReg(rs));
15622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            lastn = mkexpr(t0);
15623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
15624663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
15625663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15626663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 0x0C:  /* SYSCALL */
15627663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         DIP("syscall");
15628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64)
15629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putPC(mkU64(guest_PC_curr_instr + 4));
15630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         else
15631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putPC(mkU32(guest_PC_curr_instr + 4));
15632663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         dres.jk_StopHere = Ijk_Sys_syscall;
15633663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         dres.whatNext    = Dis_StopHere;
15634663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
15635663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15636663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 0x2A:  /* SLT */
15637663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         DIP("slt r%d, r%d, r%d", rd, rs, rt);
15638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64)
15639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rd, unop(Iop_1Uto64, binop(Iop_CmpLT64S, getIReg(rs),
15640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               getIReg(rt))));
15641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         else
15642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rd, unop(Iop_1Uto32, binop(Iop_CmpLT32S, getIReg(rs),
15643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               getIReg(rt))));
15644663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
15645663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15646663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 0x2B:  /* SLTU */
15647663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         DIP("sltu r%d, r%d, r%d", rd, rs, rt);
15648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64)
15649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rd, unop(Iop_1Uto64, binop(Iop_CmpLT64U, getIReg(rs),
15650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         getIReg(rt))));
15651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         else
15652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rd, unop(Iop_1Uto32, binop(Iop_CmpLT32U, getIReg(rs),
15653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         getIReg(rt))));
15654663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
15655663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x00: {  /* SLL */
15657663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         DIP("sll r%d, r%d, %d", rd, rt, sa);
15658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp tmpRt32 = newTemp(Ity_I32);
15659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp tmpSh32 = newTemp(Ity_I32);
15660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp tmpRd = newTemp(Ity_I64);
15661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
15662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpRt32, mkNarrowTo32(ty, getIReg(rt)));
15663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpSh32, binop(Iop_Shl32, mkexpr(tmpRt32), mkU8(sa)));
15664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpRd, mkWidenFrom32(ty, mkexpr(tmpSh32), True));
15665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rd, mkexpr(tmpRd));
15666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else
15667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            SXX_PATTERN(Iop_Shl32);
15668663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
15669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
15670663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x04: {  /* SLLV */
15672663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         DIP("sllv r%d, r%d, r%d", rd, rt, rs);
15673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
15674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpRs8 = newTemp(Ity_I8);
15675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpRt32 = newTemp(Ity_I32);
15676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpSh32 = newTemp(Ity_I32);
15677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmp = newTemp(ty);
15678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmp, binop(mkSzOp(ty, Iop_And8), getIReg(rs),
15679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              mkSzImm(ty, 31)));
15680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpRs8, mkNarrowTo8(ty, mkexpr(tmp)));
15681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpRt32, mkNarrowTo32(ty, getIReg(rt)));
15682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpSh32, binop(Iop_Shl32, mkexpr(tmpRt32), mkexpr(tmpRs8)));
15683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rd, mkWidenFrom32(ty, mkexpr(tmpSh32), True));
15684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
15685436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            SXXV_PATTERN(Iop_Shl32);
15686436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
15687663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
15688436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
15689663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15690663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 0x03:  /* SRA */
15691663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         DIP("sra r%d, r%d, %d", rd, rt, sa);
15692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
15693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpRt32 = newTemp(Ity_I32);
15694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpSh32 = newTemp(Ity_I32);
15695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t1 = newTemp(Ity_I64);
15697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t2 = newTemp(Ity_I64);
15698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t3 = newTemp(Ity_I64);
15699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t1, binop(Iop_And64, getIReg(rt),  /* hi */
15701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             mkU64(0xFFFFFFFF00000000ULL)));
15702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t2, binop(Iop_Sar64, mkexpr(t1), mkU8(sa)));
15704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpRt32, mkNarrowTo32(ty, getIReg(rt)));
15706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpSh32, binop(Iop_Sar32, mkexpr(tmpRt32), mkU8(sa)));
15707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15708436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rd, mkWidenFrom32(ty, mkexpr(tmpSh32), True));
15709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
15710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            SXX_PATTERN(Iop_Sar32);
15711436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
15712663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
15713663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15714663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 0x07:  /* SRAV */
15715663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         DIP("srav r%d, r%d, r%d", rd, rt, rs);
15716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
15717436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpRt32 = newTemp(Ity_I32);
15718436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            IRTemp tmpSh32 = newTemp(Ity_I32);
15719436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15720436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t1 = newTemp(Ity_I64);
15721436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t2 = newTemp(Ity_I64);
15722436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t3 = newTemp(Ity_I64);
15723436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            t4 = newTemp(Ity_I8);
15724436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15725436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t4, unop(Iop_32to8, binop(Iop_And32,
15726436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                       mkNarrowTo32(ty, getIReg(rs)), mkU32(0x0000001F))));
15727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t1, binop(Iop_And64, getIReg(rt),  /* hi */
15729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                   mkU64(0xFFFFFFFF00000000ULL)));
15730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(t2, binop(Iop_Sar64, mkexpr(t1), mkexpr(t4)));
15732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpRt32, mkNarrowTo32(ty, getIReg(rt)));
15734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            assign(tmpSh32, binop(Iop_Sar32, mkexpr(tmpRt32), mkexpr(t4)));
15735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(rd, mkWidenFrom32(ty, mkexpr(tmpSh32), True));
15737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
15738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            SXXV_PATTERN(Iop_Sar32);
15739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
15740663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
15741663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15742663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 0x02: {  /* SRL */
15743663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         rot = get_rot(cins);
15744663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if (rot) {
15745663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            DIP("rotr r%d, r%d, %d", rd, rt, sa);
15746663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            putIReg(rd, mkWidenFrom32(ty, genROR32(mkNarrowTo32(ty,
15747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        getIReg(rt)), sa), True));
15748663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         } else {
15749663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            DIP("srl r%d, r%d, %d", rd, rt, sa);
15750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (mode64) {
15751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               IRTemp tmpSh32 = newTemp(Ity_I32);
15752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               IRTemp tmpRt32 = newTemp(Ity_I32);
15753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
15754436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmpRt32, mkNarrowTo32(ty, getIReg(rt)));
15755436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               assign(tmpSh32, binop(Iop_Shr32, mkexpr(tmpRt32), mkU8(sa)));
15756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               putIReg(rd, mkWidenFrom32(ty, mkexpr(tmpSh32), True));
15757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            } else {
15758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               SXX_PATTERN(Iop_Shr32);
15759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
15760663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
15761663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
15762663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
15763663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15764663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 0x06: {
15765663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         rot = get_rotv(cins);
15766663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         if (rot) {
15767663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            DIP("rotrv r%d, r%d, r%d", rd, rt, rs);
15768663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            putIReg(rd, mkWidenFrom32(ty, genRORV32(mkNarrowTo32(ty,
15769436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        getIReg(rt)), mkNarrowTo32(ty, getIReg(rs))), True));
15770663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            break;
15771436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {  /* SRLV */
15772663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            DIP("srlv r%d, r%d, r%d", rd, rt, rs);
15773436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (mode64) {
15774436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               SXXV_PATTERN64(Iop_Shr32);
15775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            } else {
15776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               SXXV_PATTERN(Iop_Shr32);
15777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            }
15778663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng            break;
15779663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         }
15780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
15781663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15782663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 0x0D:  /* BREAK */
15783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("break 0x%x", trap_code);
15784436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64)
15785436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            jmp_lit64(&dres, Ijk_SigTRAP, (guest_PC_curr_instr + 4));
15786436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         else
15787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            jmp_lit32(&dres, Ijk_SigTRAP, (guest_PC_curr_instr + 4));
15788663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vassert(dres.whatNext == Dis_StopHere);
15789663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
15790663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
15791436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x30: {  /* TGE */
15792436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("tge r%d, r%d %d", rs, rt, trap_code);
15793436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
15794436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (trap_code == 7)
15795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt (IRStmt_Exit (unop (Iop_Not1,
15796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop (Iop_CmpLT64S,
15797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               getIReg (rs),
15798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               getIReg (rt))),
15799436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                Ijk_SigFPE_IntDiv,
15800436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                IRConst_U64(guest_PC_curr_instr + 4),
15801436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                OFFB_PC));
15802436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            else if (trap_code == 6)
15803436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt (IRStmt_Exit (unop (Iop_Not1,
15804436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop (Iop_CmpLT64S,
15805436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               getIReg (rs),
15806436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               getIReg (rt))),
15807436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                Ijk_SigFPE_IntOvf,
15808436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                IRConst_U64(guest_PC_curr_instr + 4),
15809436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                OFFB_PC));
15810436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            else
15811436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt (IRStmt_Exit (unop (Iop_Not1,
15812436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop (Iop_CmpLT64S,
15813436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               getIReg (rs),
15814436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               getIReg (rt))),
15815436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                Ijk_SigTRAP,
15816436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                IRConst_U64(guest_PC_curr_instr + 4),
15817436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                OFFB_PC));
15818436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
15819436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (trap_code == 7)
15820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt (IRStmt_Exit (unop (Iop_Not1,
15821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop (Iop_CmpLT32S,
15822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               getIReg (rs),
15823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               getIReg (rt))),
15824436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  Ijk_SigFPE_IntDiv,
15825436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  IRConst_U32(guest_PC_curr_instr + 4),
15826436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  OFFB_PC));
15827436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            else if (trap_code == 6)
15828436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt (IRStmt_Exit (unop (Iop_Not1,
15829436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop (Iop_CmpLT32S,
15830436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               getIReg (rs),
15831436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               getIReg (rt))),
15832436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  Ijk_SigFPE_IntOvf,
15833436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  IRConst_U32(guest_PC_curr_instr + 4),
15834436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  OFFB_PC));
15835436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            else
15836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt (IRStmt_Exit (unop (Iop_Not1,
15837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop (Iop_CmpLT32S,
15838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               getIReg (rs),
15839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               getIReg (rt))),
15840436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  Ijk_SigTRAP,
15841436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  IRConst_U32(guest_PC_curr_instr + 4),
15842436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  OFFB_PC));
15843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
15844663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
15845663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
15846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x31: {  /* TGEU */
15847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("tgeu r%d, r%d %d", rs, rt, trap_code);
15848436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
15849436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (trap_code == 7)
15850436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt (IRStmt_Exit (unop (Iop_Not1,
15851436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop (Iop_CmpLT64U,
15852436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               getIReg (rs),
15853436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               getIReg (rt))),
15854436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  Ijk_SigFPE_IntDiv,
15855436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  IRConst_U64(guest_PC_curr_instr + 4),
15856436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  OFFB_PC));
15857436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            else if (trap_code == 6)
15858436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt (IRStmt_Exit (unop (Iop_Not1,
15859436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop (Iop_CmpLT64U,
15860436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               getIReg (rs),
15861436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               getIReg (rt))),
15862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  Ijk_SigFPE_IntOvf,
15863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  IRConst_U64(guest_PC_curr_instr + 4),
15864436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  OFFB_PC));
15865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            else
15866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt (IRStmt_Exit (unop (Iop_Not1,
15867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop (Iop_CmpLT64U,
15868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               getIReg (rs),
15869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               getIReg (rt))),
15870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  Ijk_SigTRAP,
15871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  IRConst_U64(guest_PC_curr_instr + 4),
15872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  OFFB_PC));
15873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
15874436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (trap_code == 7)
15875436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt (IRStmt_Exit (unop (Iop_Not1,
15876436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop (Iop_CmpLT32U,
15877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               getIReg (rs),
15878436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               getIReg (rt))),
15879436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  Ijk_SigFPE_IntDiv,
15880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  IRConst_U32(guest_PC_curr_instr + 4),
15881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  OFFB_PC));
15882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            else if (trap_code == 6)
15883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt (IRStmt_Exit (unop (Iop_Not1,
15884436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop (Iop_CmpLT32U,
15885436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               getIReg (rs),
15886436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               getIReg (rt))),
15887436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  Ijk_SigFPE_IntOvf,
15888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  IRConst_U32(guest_PC_curr_instr + 4),
15889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  OFFB_PC));
15890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            else
15891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt (IRStmt_Exit (unop (Iop_Not1,
15892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        binop (Iop_CmpLT32U,
15893436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               getIReg (rs),
15894436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                               getIReg (rt))),
15895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  Ijk_SigTRAP,
15896436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  IRConst_U32(guest_PC_curr_instr + 4),
15897436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  OFFB_PC));
15898436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
15899663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
15900663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
15901436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x32: {  /* TLT */
15902436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("tlt r%d, r%d %d", rs, rt, trap_code);
15903436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
15904436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (trap_code == 7)
15905436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt(IRStmt_Exit(binop(Iop_CmpLT64S, getIReg(rs),
15906436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg(rt)), Ijk_SigFPE_IntDiv,
15907436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                IRConst_U64(guest_PC_curr_instr + 4),
15908436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                OFFB_PC));
15909436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            else if (trap_code == 6)
15910436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt(IRStmt_Exit(binop(Iop_CmpLT64S, getIReg(rs),
15911436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg(rt)), Ijk_SigFPE_IntOvf,
15912436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                IRConst_U64(guest_PC_curr_instr + 4),
15913436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                OFFB_PC));
15914436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            else
15915436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt(IRStmt_Exit(binop(Iop_CmpLT64S, getIReg(rs),
15916436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg(rt)), Ijk_SigTRAP,
15917436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                IRConst_U64(guest_PC_curr_instr + 4),
15918436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                OFFB_PC));
15919436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
15920436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (trap_code == 7)
15921436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt(IRStmt_Exit(binop(Iop_CmpLT32S, getIReg(rs),
15922436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg(rt)), Ijk_SigFPE_IntDiv,
15923436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                IRConst_U32(guest_PC_curr_instr + 4),
15924436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                OFFB_PC));
15925436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            else if (trap_code == 6)
15926436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt(IRStmt_Exit(binop(Iop_CmpLT32S, getIReg(rs),
15927436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg(rt)), Ijk_SigFPE_IntOvf,
15928436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                IRConst_U32(guest_PC_curr_instr + 4),
15929436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                OFFB_PC));
15930436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            else
15931436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt(IRStmt_Exit(binop(Iop_CmpLT32S, getIReg(rs),
15932436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg(rt)), Ijk_SigTRAP,
15933436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                IRConst_U32(guest_PC_curr_instr + 4),
15934436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                OFFB_PC));
15935436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
15936663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
15937663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
15938436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x33: {  /* TLTU */
15939436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("tltu r%d, r%d %d", rs, rt, trap_code);
15940436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
15941436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (trap_code == 7)
15942436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt(IRStmt_Exit(binop(Iop_CmpLT64U, getIReg(rs),
15943436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg(rt)), Ijk_SigFPE_IntDiv,
15944436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                IRConst_U64(guest_PC_curr_instr + 4),
15945436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                OFFB_PC));
15946436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            else if (trap_code == 6)
15947436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt(IRStmt_Exit(binop(Iop_CmpLT64U, getIReg(rs),
15948436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg(rt)), Ijk_SigFPE_IntOvf,
15949436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                IRConst_U64(guest_PC_curr_instr + 4),
15950436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                OFFB_PC));
15951436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            else
15952436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt(IRStmt_Exit(binop(Iop_CmpLT64U, getIReg(rs),
15953436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg(rt)), Ijk_SigTRAP,
15954436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                IRConst_U64(guest_PC_curr_instr + 4),
15955436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                OFFB_PC));
15956436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
15957436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (trap_code == 7)
15958436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt(IRStmt_Exit(binop(Iop_CmpLT32U, getIReg(rs),
15959436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg(rt)), Ijk_SigFPE_IntDiv,
15960436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                IRConst_U32(guest_PC_curr_instr + 4),
15961436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                OFFB_PC));
15962436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            else if (trap_code == 6)
15963436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt(IRStmt_Exit(binop(Iop_CmpLT32U, getIReg(rs),
15964436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg(rt)), Ijk_SigFPE_IntOvf,
15965436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                IRConst_U32(guest_PC_curr_instr + 4),
15966436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                OFFB_PC));
15967436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            else
15968436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt(IRStmt_Exit(binop(Iop_CmpLT32U, getIReg(rs),
15969436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg (rt)), Ijk_SigTRAP,
15970436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                IRConst_U32(guest_PC_curr_instr + 4),
15971436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                OFFB_PC));
15972436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
15973663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
15974663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
15975436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x34: {  /* TEQ */
15976436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("teq r%d, r%d, %d", rs, rt, trap_code);
15977436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
15978436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (trap_code == 7)
15979436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt(IRStmt_Exit(binop(Iop_CmpEQ64, getIReg(rs),
15980436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg(rt)), Ijk_SigFPE_IntDiv,
15981436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                IRConst_U64(guest_PC_curr_instr + 4),
15982436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                OFFB_PC));
15983436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            else if (trap_code == 6)
15984436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt(IRStmt_Exit(binop(Iop_CmpEQ64, getIReg(rs),
15985436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg(rt)), Ijk_SigFPE_IntOvf,
15986436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                IRConst_U64(guest_PC_curr_instr + 4),
15987436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                OFFB_PC));
15988436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            else
15989436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt(IRStmt_Exit(binop(Iop_CmpEQ64, getIReg(rs),
15990436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg(rt)), Ijk_SigTRAP,
15991436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                IRConst_U64(guest_PC_curr_instr + 4),
15992436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                OFFB_PC));
15993436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
15994436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (trap_code == 7)
15995436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt(IRStmt_Exit(binop(Iop_CmpEQ32, getIReg(rs),
15996436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg(rt)), Ijk_SigFPE_IntDiv,
15997436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                IRConst_U32(guest_PC_curr_instr + 4),
15998436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                OFFB_PC));
15999436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            else if (trap_code == 6)
16000436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt(IRStmt_Exit(binop(Iop_CmpEQ32, getIReg(rs),
16001436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg(rt)), Ijk_SigFPE_IntOvf,
16002436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                IRConst_U32(guest_PC_curr_instr + 4),
16003436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                OFFB_PC));
16004436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            else
16005436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt(IRStmt_Exit(binop(Iop_CmpEQ32, getIReg(rs),
16006436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg(rt)), Ijk_SigTRAP,
16007436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                IRConst_U32(guest_PC_curr_instr + 4),
16008436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                OFFB_PC));
16009436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
16010663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
16011663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
16012436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x36: {  /* TNE */
16013436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("tne r%d, r%d %d", rs, rt, trap_code);
16014436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
16015436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (trap_code == 7)
16016436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt(IRStmt_Exit(binop(Iop_CmpNE64, getIReg(rs),
16017436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg(rt)), Ijk_SigFPE_IntDiv,
16018436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                IRConst_U64(guest_PC_curr_instr + 4),
16019436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                OFFB_PC));
16020436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            else if (trap_code == 6)
16021436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt(IRStmt_Exit(binop(Iop_CmpNE64, getIReg(rs),
16022436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg(rt)), Ijk_SigFPE_IntOvf,
16023436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                IRConst_U64(guest_PC_curr_instr + 4),
16024436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                OFFB_PC));
16025436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            else
16026436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt(IRStmt_Exit(binop(Iop_CmpNE64, getIReg(rs),
16027436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg(rt)), Ijk_SigTRAP,
16028436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                IRConst_U64(guest_PC_curr_instr + 4),
16029436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                OFFB_PC));
16030436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
16031436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (trap_code == 7)
16032436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt(IRStmt_Exit(binop(Iop_CmpNE32, getIReg(rs),
16033436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg(rt)), Ijk_SigFPE_IntDiv,
16034436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                IRConst_U32(guest_PC_curr_instr + 4),
16035436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                OFFB_PC));
16036436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            else if (trap_code == 6)
16037436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt(IRStmt_Exit(binop(Iop_CmpNE32, getIReg(rs),
16038436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg(rt)), Ijk_SigFPE_IntOvf,
16039436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                IRConst_U32(guest_PC_curr_instr + 4),
16040436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                OFFB_PC));
16041436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            else
16042436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               stmt(IRStmt_Exit(binop(Iop_CmpNE32, getIReg(rs),
16043436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg(rt)), Ijk_SigTRAP,
16044436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                IRConst_U32(guest_PC_curr_instr + 4),
16045436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                OFFB_PC));
16046436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
16047663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
16048663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
16049436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x14:
16050436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x16:
16051436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x17:  /* DSLLV, DROTRV:DSRLV, DSRAV */
16052436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x38:
16053436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x3A:
16054436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x3B:  /* DSLL, DROTL:DSRL, DSRA  */
16055436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x3C:
16056436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x3E:
16057436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x3F:  /* DSLL32, DROTR32:DSRL32, DSRA32 */
16058436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (dis_instr_shrt(cins))
16059436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            break;
16060436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto decode_failure;
16061663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16062436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x0F:  /* SYNC */
16063436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("sync 0x%x", sel);
16064436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Just ignore it. */
16065436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
16066663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16067436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x2C: {  /* Doubleword Add - DADD; MIPS64 */
16068436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("dadd r%d, r%d, r%d", rd, rs, rt);
16069436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp tmpRs64 = newTemp(Ity_I64);
16070436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp tmpRt64 = newTemp(Ity_I64);
16071436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16072436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(tmpRs64, getIReg(rs));
16073436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(tmpRt64, getIReg(rt));
16074436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16075436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t0 = newTemp(Ity_I64);
16076436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t1 = newTemp(Ity_I64);
16077436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t2 = newTemp(Ity_I64);
16078436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t3 = newTemp(Ity_I64);
16079436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t4 = newTemp(Ity_I64);
16080436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* dst = src0 + src1
16081436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if(sign(src0 ) != sign(src1 ))
16082436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            goto no overflow;
16083436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if(sign(dst) == sign(src0 ))
16084436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            goto no overflow;
16085436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            we have overflow! */
16086436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16087436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t0, binop(Iop_Add64, mkexpr(tmpRs64), mkexpr(tmpRt64)));
16088436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, binop(Iop_Xor64, mkexpr(tmpRs64), mkexpr(tmpRt64)));
16089436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t2, unop(Iop_1Uto64,
16090436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         binop(Iop_CmpEQ64,
16091436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               binop(Iop_And64, mkexpr(t1),
16092436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     mkU64(0x8000000000000000ULL)),
16093436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x8000000000000000ULL))));
16094436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16095436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t3, binop(Iop_Xor64, mkexpr(t0), mkexpr(tmpRs64)));
16096436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t4, unop(Iop_1Uto64,
16097436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         binop(Iop_CmpNE64,
16098436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               binop(Iop_And64, mkexpr(t3),
16099436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     mkU64(0x8000000000000000ULL)),
16100436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x8000000000000000ULL))));
16101436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16102436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         stmt(IRStmt_Exit(binop(Iop_CmpEQ64,
16103436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                binop(Iop_Or64, mkexpr(t2), mkexpr(t4)),
16104436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                mkU64(0)),
16105436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          Ijk_SigFPE_IntOvf,
16106436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          IRConst_U64(guest_PC_curr_instr + 4),
16107436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          OFFB_PC));
16108436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16109436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rd,  mkexpr(t0));
16110436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
16111436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
16112436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16113436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x2D:  /* Doubleword Add Unsigned - DADDU; MIPS64 */
16114436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("daddu r%d, r%d, r%d", rd, rs, rt);
16115436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ALU_PATTERN(Iop_Add64);
16116436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
16117436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16118436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x2E: {  /* Doubleword Subtract - DSUB; MIPS64 */
16119436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("dsub r%u, r%u, r%u", rd, rs, rt);
16120436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp tmpRs64 = newTemp(Ity_I64);
16121436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         IRTemp tmpRt64 = newTemp(Ity_I64);
16122436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16123436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(tmpRs64, getIReg(rs));
16124436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(tmpRt64, getIReg(rt));
16125436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t0 = newTemp(Ity_I64);
16126436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t1 = newTemp(Ity_I64);
16127436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t2 = newTemp(Ity_I64);
16128436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t3 = newTemp(Ity_I64);
16129436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t4 = newTemp(Ity_I64);
16130436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t5 = newTemp(Ity_I64);
16131436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* dst = src0 + (-1 * src1)
16132436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if(sign(src0 ) != sign((-1 * src1) ))
16133436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            goto no overflow;
16134436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if(sign(dst) == sign(src0 ))
16135436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            goto no overflow;
16136436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            we have overflow! */
16137436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16138436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t5, binop(Iop_Mul64,
16139436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          mkexpr(tmpRt64),
16140436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          mkU64(0xffffffffffffffffULL)));
16141436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t0, binop(Iop_Add64, mkexpr(tmpRs64), mkexpr(t5)));
16142436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t1, binop(Iop_Xor64, mkexpr(tmpRs64), mkexpr(t5)));
16143436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t2, unop(Iop_1Sto64,
16144436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         binop(Iop_CmpEQ64,
16145436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               binop(Iop_And64,
16146436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     mkexpr(t1),
16147436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     mkU64(0x8000000000000000ULL)),
16148436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x8000000000000000ULL))));
16149436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16150436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t3, binop(Iop_Xor64, mkexpr(t0), mkexpr(tmpRs64)));
16151436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t4, unop(Iop_1Sto64,
16152436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         binop(Iop_CmpNE64,
16153436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               binop(Iop_And64,
16154436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     mkexpr(t3),
16155436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     mkU64(0x8000000000000000ULL)),
16156436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               mkU64(0x8000000000000000ULL))));
16157436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16158436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         stmt(IRStmt_Exit(binop(Iop_CmpEQ64, binop(Iop_Or64, mkexpr(t2),
16159436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                mkexpr(t4)), mkU64(0)), Ijk_SigFPE_IntOvf,
16160436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          IRConst_U64(guest_PC_curr_instr + 4),
16161436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                          OFFB_PC));
16162436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16163436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rd, binop(Iop_Sub64, getIReg(rs), getIReg(rt)));
16164663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
16165663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
16166663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16167436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x2F:  /* Doubleword Subtract Unsigned - DSUBU; MIPS64 */
16168436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("dsub r%u, r%u,r%u", rd, rt, rt);
16169436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ALU_PATTERN(Iop_Sub64);
16170436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
16171436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16172663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      default:
16173663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         goto decode_failure;
16174663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
16175663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
16176663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16177436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x01:  /* Regimm */
16178663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16179663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      switch (rt) {
16180663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 0x00:  /* BLTZ */
16181663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         DIP("bltz r%d, %d", rs, imm);
16182436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
16183436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (!dis_instr_branch(cins, &dres, resteerOkFn,
16184436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        callback_opaque, &bstmt))
16185436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               goto decode_failure;
16186436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else
16187436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            dis_branch(False, binop(Iop_CmpEQ32, binop(Iop_And32, getIReg(rs),
16188436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                       mkU32(0x80000000)), mkU32(0x80000000)), imm, &bstmt);
16189436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
16190436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16191436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x01:  /* BGEZ */
16192436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("bgez r%d, %d", rs, imm);
16193436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
16194436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (!dis_instr_branch(cins, &dres, resteerOkFn,
16195436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  callback_opaque, &bstmt))
16196436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               goto decode_failure;
16197436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else
16198436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            dis_branch(False, binop(Iop_CmpEQ32, binop(Iop_And32, getIReg(rs),
16199436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              mkU32(0x80000000)), mkU32(0x0)), imm, &bstmt);
16200663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
16201663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16202663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 0x02:  /* BLTZL */
16203663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         DIP("bltzl r%d, %d", rs, imm);
16204436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         lastn = dis_branch_likely(binop(mode64 ? Iop_CmpNE64 : Iop_CmpNE32,
16205436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     binop(mode64 ? Iop_And64 : Iop_And32, getIReg(rs),
16206436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     mode64 ? mkU64(0x8000000000000000ULL) : mkU32(0x80000000)),
16207436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     mode64 ? mkU64(0x8000000000000000ULL) : mkU32(0x80000000)),
16208436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     imm);
16209436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
16210436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16211436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x03:  /* BGEZL */
16212436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("bgezl r%d, %d", rs, imm);
16213436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         lastn = dis_branch_likely(binop(mode64 ? Iop_CmpNE64 : Iop_CmpNE32,
16214436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     binop(mode64 ? Iop_And64 : Iop_And32, getIReg(rs),
16215436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     mode64 ? mkU64(0x8000000000000000ULL) : mkU32(0x80000000)),
16216436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     mode64 ? mkU64(0x0) : mkU32(0x0)), imm);
16217663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
16218663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16219663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 0x10:  /* BLTZAL */
16220663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         DIP("bltzal r%d, %d", rs, imm);
16221436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
16222436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (!dis_instr_branch(cins, &dres, resteerOkFn,
16223436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        callback_opaque, &bstmt))
16224436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               goto decode_failure;
16225436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else
16226436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            dis_branch(True, binop(Iop_CmpEQ32, binop(Iop_And32, getIReg(rs),
16227436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                       mkU32(0x80000000)), mkU32(0x80000000)), imm, &bstmt);
16228663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
16229663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16230663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 0x12:  /* BLTZALL */
16231663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         DIP("bltzall r%d, %d", rs, imm);
16232436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(31, mode64 ? mkU64(guest_PC_curr_instr + 8) :
16233436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                              mkU32(guest_PC_curr_instr + 8));
16234436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         lastn = dis_branch_likely(binop(mode64 ? Iop_CmpNE64 : Iop_CmpNE32,
16235436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     binop(mode64 ? Iop_And64 : Iop_And32, getIReg(rs),
16236436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     mode64 ? mkU64(0x8000000000000000ULL) : mkU32(0x80000000)),
16237436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     mode64 ? mkU64(0x8000000000000000ULL) : mkU32(0x80000000)),
16238436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     imm);
16239663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
16240663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16241663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 0x11:  /* BGEZAL */
16242663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         DIP("bgezal r%d, %d", rs, imm);
16243436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
16244436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            if (!dis_instr_branch(cins, &dres, resteerOkFn,
16245436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        callback_opaque, &bstmt))
16246436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov               goto decode_failure;
16247436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else
16248436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            dis_branch(True, binop(Iop_CmpEQ32, binop(Iop_And32, getIReg(rs),
16249436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                       mkU32(0x80000000)), mkU32(0x0)), imm, &bstmt);
16250663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
16251663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16252663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 0x13:  /* BGEZALL */
16253663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         DIP("bgezall r%d, %d", rs, imm);
16254436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
16255436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(31, mkU64(guest_PC_curr_instr + 8));
16256436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            lastn = dis_branch_likely(binop(Iop_CmpNE64,
16257436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            binop(Iop_And64,
16258436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  getIReg(rs),
16259436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                                  mkU64(0x8000000000000000ULL)),
16260436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU64(0x0)),
16261436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      imm);
16262436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
16263436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putIReg(31, mkU32(guest_PC_curr_instr + 8));
16264436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            lastn = dis_branch_likely(binop(Iop_CmpNE32, binop(Iop_And32,
16265436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg(rs), mkU32(0x80000000)),
16266436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32(0x0)), imm);
16267436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
16268663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
16269663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16270436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x08:  /* TGEI */
16271436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("tgei r%d, %d %d", rs, imm, trap_code);
16272436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
16273436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            stmt (IRStmt_Exit (unop (Iop_Not1,
16274436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop (Iop_CmpLT64S,
16275436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg (rs),
16276436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU64 (extend_s_16to64 (imm)))),
16277436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             Ijk_SigTRAP,
16278436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             IRConst_U64(guest_PC_curr_instr + 4),
16279436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             OFFB_PC));
16280436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
16281436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            stmt (IRStmt_Exit (unop (Iop_Not1,
16282436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop (Iop_CmpLT32S,
16283436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     getIReg (rs),
16284436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     mkU32 (extend_s_16to32 (imm)))),
16285436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             Ijk_SigTRAP,
16286436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             IRConst_U32(guest_PC_curr_instr + 4),
16287436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             OFFB_PC));
16288436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
16289663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
16290436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16291436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x09: {  /* TGEIU */
16292436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("tgeiu r%d, %d %d", rs, imm, trap_code);
16293436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
16294436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            stmt (IRStmt_Exit (unop (Iop_Not1,
16295436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop (Iop_CmpLT64U,
16296436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg (rs),
16297436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU64 (extend_s_16to64 (imm)))),
16298436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             Ijk_SigTRAP,
16299436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             IRConst_U64(guest_PC_curr_instr + 4),
16300436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             OFFB_PC));
16301436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
16302436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            stmt (IRStmt_Exit (unop (Iop_Not1,
16303436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     binop (Iop_CmpLT32U,
16304436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            getIReg (rs),
16305436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32 (extend_s_16to32 (imm)))),
16306436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               Ijk_SigTRAP,
16307436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               IRConst_U32(guest_PC_curr_instr + 4),
16308436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               OFFB_PC));
16309436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
16310663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
16311663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
16312436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x0A: {  /* TLTI */
16313436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("tlti r%d, %d %d", rs, imm, trap_code);
16314436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
16315436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            stmt (IRStmt_Exit (binop (Iop_CmpLT64S, getIReg (rs),
16316436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU64 (extend_s_16to64 (imm))),
16317436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             Ijk_SigTRAP,
16318436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             IRConst_U64(guest_PC_curr_instr + 4),
16319436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             OFFB_PC));
16320436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
16321436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            stmt (IRStmt_Exit (binop (Iop_CmpLT32S, getIReg (rs),
16322436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32 (extend_s_16to32 (imm))),
16323436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               Ijk_SigTRAP,
16324436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               IRConst_U32(guest_PC_curr_instr + 4),
16325436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               OFFB_PC));
16326436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
16327663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
16328663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
16329436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x0B: {  /* TLTIU */
16330436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("tltiu r%d, %d %d", rs, imm, trap_code);
16331436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
16332436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            stmt (IRStmt_Exit (binop (Iop_CmpLT64U, getIReg (rs),
16333436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU64 (extend_s_16to64 (imm))),
16334436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             Ijk_SigTRAP,
16335436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             IRConst_U64(guest_PC_curr_instr + 4),
16336436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             OFFB_PC));
16337436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
16338436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            stmt (IRStmt_Exit (binop (Iop_CmpLT32U, getIReg (rs),
16339436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32 (extend_s_16to32 (imm))),
16340436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               Ijk_SigTRAP,
16341436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               IRConst_U32(guest_PC_curr_instr + 4),
16342436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               OFFB_PC));
16343436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
16344663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
16345663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
16346436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x0C: {  /* TEQI */
16347436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov          DIP("teqi r%d, %d %d", rs, imm, trap_code);
16348436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
16349436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            stmt (IRStmt_Exit (binop (Iop_CmpEQ64, getIReg (rs),
16350436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU64 (extend_s_16to64 (imm))),
16351436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               Ijk_SigTRAP,
16352436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               IRConst_U64(guest_PC_curr_instr + 4),
16353436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               OFFB_PC));
16354436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
16355436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            stmt (IRStmt_Exit (binop (Iop_CmpEQ32, getIReg (rs),
16356436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32 (extend_s_16to32 (imm))),
16357436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               Ijk_SigTRAP,
16358436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               IRConst_U32(guest_PC_curr_instr + 4),
16359436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               OFFB_PC));
16360436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
16361663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
16362663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
16363436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x0E: {  /* TNEI */
16364436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("tnei r%d, %d %d", rs, imm, trap_code);
16365436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64) {
16366436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            stmt (IRStmt_Exit (binop (Iop_CmpNE64, getIReg (rs),
16367436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU64 (extend_s_16to64 (imm))),
16368436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               Ijk_SigTRAP,
16369436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               IRConst_U64(guest_PC_curr_instr + 4),
16370436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               OFFB_PC));
16371436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         } else {
16372436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            stmt (IRStmt_Exit (binop (Iop_CmpNE32, getIReg (rs),
16373436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      mkU32 (extend_s_16to32 (imm))),
16374436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               Ijk_SigTRAP,
16375436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               IRConst_U32(guest_PC_curr_instr + 4),
16376436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                               OFFB_PC));
16377436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         }
16378663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
16379663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
16380436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      case 0x1C: {  /* BPOSGE32 */
16381436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         DIP("bposge32 %d", imm);
16382436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vassert(!mode64);
16383436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         t0 = newTemp(Ity_I32);
16384436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Get pos field from DSPControl register. */
16385436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         assign(t0, binop(Iop_And32, getDSPControl(), mkU32(0x3f)));
16386436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         dis_branch(False, unop(Iop_Not1, binop(Iop_CmpLT32U, mkexpr(t0),
16387436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                mkU32(32))), imm, &bstmt);
16388436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
16389663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case 0x1F:
16390436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* SYNCI */
16391436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         /* Just ignore it */
16392436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         break;
16393663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16394663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      default:
16395663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         goto decode_failure;
16396663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      }
16397663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
16398663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16399663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0x04:
16400663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("beq r%d, r%d, %d", rs, rt, imm);
16401436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (mode64)
16402436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         dis_branch(False, binop(Iop_CmpEQ64, getIReg(rs), getIReg(rt)),
16403436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 imm, &bstmt);
16404436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      else
16405436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         dis_branch(False, binop(Iop_CmpEQ32, getIReg(rs), getIReg(rt)),
16406436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 imm, &bstmt);
16407663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
16408663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16409663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0x14:
16410663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("beql r%d, r%d, %d", rs, rt, imm);
16411436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      lastn = dis_branch_likely(binop(mode64 ? Iop_CmpNE64 : Iop_CmpNE32,
16412436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                getIReg(rs), getIReg(rt)), imm);
16413663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
16414663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16415663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0x05:
16416663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("bne r%d, r%d, %d", rs, rt, imm);
16417436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (mode64)
16418436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         dis_branch(False, binop(Iop_CmpNE64, getIReg(rs), getIReg(rt)),
16419436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 imm, &bstmt);
16420436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      else
16421436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         dis_branch(False, binop(Iop_CmpNE32, getIReg(rs), getIReg(rt)),
16422436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                 imm, &bstmt);
16423663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
16424663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16425663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   case 0x15:
16426663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("bnel r%d, r%d, %d", rs, rt, imm);
16427436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      lastn = dis_branch_likely(binop(mode64 ? Iop_CmpEQ64 : Iop_CmpEQ32,
16428436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                      getIReg(rs), getIReg(rt)), imm);
16429663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
16430663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16431436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x07:  /* BGTZ */
16432663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("bgtz r%d, %d", rs, imm);
16433436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (mode64)
16434436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         dis_branch(False, unop(Iop_Not1, binop(Iop_CmpLE64S, getIReg(rs),
16435436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                mkU64(0x00))), imm, &bstmt);
16436436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      else
16437436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         dis_branch(False, unop(Iop_Not1, binop(Iop_CmpLE32S, getIReg(rs),
16438436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                mkU32(0x00))), imm, &bstmt);
16439663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
16440663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16441436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x17:  /* BGTZL */
16442663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("bgtzl r%d, %d", rs, imm);
16443436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (mode64)
16444436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         lastn = dis_branch_likely(binop(Iop_CmpLE64S, getIReg(rs),
16445436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkU64(0x00)), imm);
16446436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      else
16447436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         lastn = dis_branch_likely(binop(Iop_CmpLE32S, getIReg(rs),
16448436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                         mkU32(0x00)), imm);
16449663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
16450663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16451436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x06:  /* BLEZ */
16452663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("blez r%d, %d", rs, imm);
16453436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (mode64)
16454436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         dis_branch(False, binop(Iop_CmpLE64S, getIReg(rs), mkU64(0x0)),
16455436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                imm, &bstmt);
16456436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      else
16457436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         dis_branch(False,binop(Iop_CmpLE32S, getIReg(rs), mkU32(0x0)), imm,
16458436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                &bstmt);
16459663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
16460663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16461436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x16:  /* BLEZL */
16462663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("blezl r%d, %d", rs, imm);
16463436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      lastn = dis_branch_likely(unop(Iop_Not1, (binop(mode64 ? Iop_CmpLE64S :
16464436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     Iop_CmpLE32S, getIReg(rs), mode64 ?
16465436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                     mkU64(0x0) : mkU32(0x0)))), imm);
16466663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
16467663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16468436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x08: {  /* ADDI */
16469663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("addi r%d, r%d, %d", rt, rs, imm);
16470436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp tmpRs32 = newTemp(Ity_I32);
16471436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(tmpRs32, mkNarrowTo32(ty, getIReg(rs)));
16472663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16473436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      t0 = newTemp(Ity_I32);
16474436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      t1 = newTemp(Ity_I32);
16475436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      t2 = newTemp(Ity_I32);
16476436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      t3 = newTemp(Ity_I32);
16477436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      t4 = newTemp(Ity_I32);
16478436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* dst = src0 + sign(imm)
16479436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if(sign(src0 ) != sign(imm ))
16480436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto no overflow;
16481436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if(sign(dst) == sign(src0 ))
16482436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto no overflow;
16483436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         we have overflow! */
16484436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16485436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t0, binop(Iop_Add32, mkexpr(tmpRs32),
16486436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                       mkU32(extend_s_16to32(imm))));
16487436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t1, binop(Iop_Xor32, mkexpr(tmpRs32),
16488436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                       mkU32(extend_s_16to32(imm))));
16489436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t2, unop(Iop_1Sto32, binop(Iop_CmpEQ32, binop(Iop_And32,
16490436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      mkexpr(t1), mkU32(0x80000000)), mkU32(0x80000000))));
16491436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16492436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t3, binop(Iop_Xor32, mkexpr(t0), mkexpr(tmpRs32)));
16493436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t4, unop(Iop_1Sto32, binop(Iop_CmpNE32, binop(Iop_And32,
16494436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      mkexpr(t3), mkU32(0x80000000)), mkU32(0x80000000))));
16495436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16496436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      stmt(IRStmt_Exit(binop(Iop_CmpEQ32, binop(Iop_Or32, mkexpr(t2),
16497436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             mkexpr(t4)), mkU32(0)), Ijk_SigFPE_IntOvf,
16498436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                       mode64 ? IRConst_U64(guest_PC_curr_instr + 4) :
16499436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                IRConst_U32(guest_PC_curr_instr + 4),
16500436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                       OFFB_PC));
16501436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16502436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      putIReg(rt,  mkWidenFrom32(ty, mkexpr(t0), True));
16503436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
16504436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
16505436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x09:  /* ADDIU */
16506663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("addiu r%d, r%d, %d", rt, rs, imm);
16507436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (mode64) {
16508436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rt, mkWidenFrom32(ty, binop(Iop_Add32,
16509436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     mkNarrowTo32(ty, getIReg(rs)),mkU32(extend_s_16to32(imm))),
16510436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                     True));
16511436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      } else
16512436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rt, binop(Iop_Add32, getIReg(rs),mkU32(extend_s_16to32(imm))));
16513663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
16514663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16515436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x0C:  /* ANDI */
16516663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("andi r%d, r%d, %d", rt, rs, imm);
16517436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (mode64) {
16518436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ALUI_PATTERN64(Iop_And64);
16519436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      } else {
16520436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ALUI_PATTERN(Iop_And32);
16521436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
16522663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
16523663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16524436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x0E:  /* XORI */
16525663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("xori r%d, r%d, %d", rt, rs, imm);
16526436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (mode64) {
16527436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ALUI_PATTERN64(Iop_Xor64);
16528436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      } else {
16529436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ALUI_PATTERN(Iop_Xor32);
16530436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
16531663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
16532663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16533436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x0D:  /* ORI */
16534663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("ori r%d, r%d, %d", rt, rs, imm);
16535436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (mode64) {
16536436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ALUI_PATTERN64(Iop_Or64);
16537436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      } else {
16538436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         ALUI_PATTERN(Iop_Or32);
16539436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
16540663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
16541663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16542436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x0A:  /* SLTI */
16543663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("slti r%d, r%d, %d", rt, rs, imm);
16544436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (mode64)
16545436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rt, unop(Iop_1Uto64, binop(Iop_CmpLT64S, getIReg(rs),
16546436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU64(extend_s_16to64(imm)))));
16547436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      else
16548436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rt, unop(Iop_1Uto32, binop(Iop_CmpLT32S, getIReg(rs),
16549436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(extend_s_16to32(imm)))));
16550663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
16551663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16552436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x0B:  /* SLTIU */
16553663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("sltiu r%d, r%d, %d", rt, rs, imm);
16554436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (mode64)
16555436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rt, unop(Iop_1Uto64, binop(Iop_CmpLT64U, getIReg(rs),
16556436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU64(extend_s_16to64(imm)))));
16557436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      else
16558436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rt, unop(Iop_1Uto32, binop(Iop_CmpLT32U, getIReg(rs),
16559436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                            mkU32(extend_s_16to32(imm)))));
16560663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
16561663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16562436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x18: {  /* Doubleword Add Immidiate - DADD; MIPS64 */
16563436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      DIP("daddi r%d, r%d, %d", rt, rs, imm);
16564436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      IRTemp tmpRs64 = newTemp(Ity_I64);
16565436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(tmpRs64, getIReg(rs));
16566436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16567436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      t0 = newTemp(Ity_I64);
16568436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      t1 = newTemp(Ity_I64);
16569436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      t2 = newTemp(Ity_I64);
16570436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      t3 = newTemp(Ity_I64);
16571436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      t4 = newTemp(Ity_I64);
16572436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* dst = src0 + sign(imm)
16573436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if(sign(src0 ) != sign(imm ))
16574436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto no overflow;
16575436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if(sign(dst) == sign(src0 ))
16576436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         goto no overflow;
16577436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         we have overflow! */
16578436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16579436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t0, binop(Iop_Add64, mkexpr(tmpRs64),
16580436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                       mkU64(extend_s_16to64(imm))));
16581436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t1, binop(Iop_Xor64, mkexpr(tmpRs64),
16582436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                       mkU64(extend_s_16to64(imm))));
16583436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t2, unop(Iop_1Sto64, binop(Iop_CmpEQ64, binop(Iop_And64,
16584436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      mkexpr(t1), mkU64(0x8000000000000000ULL)),
16585436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        mkU64(0x8000000000000000ULL))));
16586436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16587436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t3, binop(Iop_Xor64, mkexpr(t0), mkexpr(tmpRs64)));
16588436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t4, unop(Iop_1Sto64, binop(Iop_CmpNE64, binop(Iop_And64,
16589436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                      mkexpr(t3), mkU64(0x8000000000000000ULL)),
16590436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                        mkU64(0x8000000000000000ULL))));
16591436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16592436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      stmt(IRStmt_Exit(binop(Iop_CmpEQ64, binop(Iop_Or64, mkexpr(t2),
16593436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                             mkexpr(t4)), mkU64(0)), Ijk_SigFPE_IntOvf,
16594436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                       IRConst_U64(guest_PC_curr_instr + 4),
16595436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                       OFFB_PC));
16596436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16597436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      putIReg(rt,  mkexpr(t0));
16598436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
16599436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
16600436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16601436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x19:  /* Doubleword Add Immidiate Unsigned - DADDIU; MIPS64 */
16602436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      DIP("daddiu r%d, r%d, %d", rt, rs, imm);
16603436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      putIReg(rt, binop(Iop_Add64, getIReg(rs), mkU64(extend_s_16to64(imm))));
16604436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
16605436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16606436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x1A: {
16607436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* Load Doubleword Left - LDL; MIPS64 */
16608436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vassert(mode64);
16609436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      DIP("ldl r%u, %d(r%u)", rt, imm, rs);
16610436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* t1 = addr */
16611436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#if defined (_MIPSEL)
16612436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      t1 = newTemp(Ity_I64);
16613436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t1, binop(Iop_Add64, getIReg(rs), mkU64(extend_s_16to64(imm))));
16614436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#elif defined (_MIPSEB)
16615436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      t1 = newTemp(Ity_I64);
16616436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t1, binop(Iop_Xor64, mkU64(0x7), binop(Iop_Add64, getIReg(rs),
16617436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU64(extend_s_16to64(imm)))));
16618436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
16619436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* t2 = word addr */
16620436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* t4 = addr mod 8 */
16621436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      LWX_SWX_PATTERN64_1;
16622436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16623436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* t3 = word content - shifted */
16624436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      t3 = newTemp(Ity_I64);
16625436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t3, binop(Iop_Shl64, load(Ity_I64, mkexpr(t2)),
16626436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 narrowTo(Ity_I8, binop(Iop_Shl64, binop(Iop_Sub64, mkU64(0x07),
16627436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 mkexpr(t4)), mkU8(3)))));
16628436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16629436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* rt content  - adjusted */
16630436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      t5 = newTemp(Ity_I64);
16631436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      t6 = newTemp(Ity_I64);
16632436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      t7 = newTemp(Ity_I64);
16633436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16634436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t5, binop(Iop_Mul64, mkexpr(t4), mkU64(0x8)));
16635436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16636436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t6, binop(Iop_Shr64, mkU64(0x00FFFFFFFFFFFFFFULL),
16637436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                       narrowTo(Ity_I8, mkexpr(t5))));
16638436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16639436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t7, binop(Iop_And64, getIReg(rt), mkexpr(t6)));
16640436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16641436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      putIReg(rt, binop(Iop_Or64, mkexpr(t7), mkexpr(t3)));
16642436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
16643436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
16644436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16645436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x1B: {
16646436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* Load Doubleword Right - LDR; MIPS64 */
16647436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vassert(mode64);
16648436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      DIP("ldr r%u,%d(r%u)", rt, imm, rs);
16649436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* t1 = addr */
16650436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#if defined (_MIPSEL)
16651436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      t1 = newTemp(Ity_I64);
16652436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t1, binop(Iop_Add64, getIReg(rs), mkU64(extend_s_16to64(imm))));
16653436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#elif defined (_MIPSEB)
16654436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      t1 = newTemp(Ity_I64);
16655436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t1, binop(Iop_Xor64, mkU64(0x7), binop(Iop_Add64, getIReg(rs),
16656436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                                  mkU64(extend_s_16to64(imm)))));
16657436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
16658436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* t2 = word addr */
16659436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* t4 = addr mod 8 */
16660436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      LWX_SWX_PATTERN64_1;
16661436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16662436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* t3 = word content - shifted */
16663436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      t3 = newTemp(Ity_I64);
16664436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t3, binop(Iop_Shr64, load(Ity_I64, mkexpr(t2)),
16665436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 narrowTo(Ity_I8, binop(Iop_Shl64, mkexpr(t4), mkU8(3)))));
16666436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16667436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      /* rt content  - adjusted */
16668436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      t5 = newTemp(Ity_I64);
16669436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      assign(t5, binop(Iop_And64, getIReg(rt), unop(Iop_Not64,
16670436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 binop(Iop_Shr64, mkU64(0xFFFFFFFFFFFFFFFFULL),
16671436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 narrowTo(Ity_I8, binop(Iop_Shl64, mkexpr(t4), mkU8(0x3)))))));
16672436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16673436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      putIReg(rt, binop(Iop_Or64, mkexpr(t5), mkexpr(t3)));
16674436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
16675436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }
16676436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16677436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x27:  /* Load Word unsigned - LWU; MIPS64 */
16678436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      DIP("lwu r%u,%d(r%u)", rt, imm, rs);
16679436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      LOAD_STORE_PATTERN;
16680436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16681436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      putIReg(rt, mkWidenFrom32(ty, load(Ity_I32, mkexpr(t1)), False));
16682436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
16683436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16684436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x30:  /* LL / LWC0 */
16685663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("ll r%d, %d(r%d)", rt, imm, rs);
16686663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      LOAD_STORE_PATTERN;
16687663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16688663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      t2 = newTemp(Ity_I32);
16689663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if defined (_MIPSEL)
16690436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      stmt(IRStmt_LLSC(Iend_LE, t2, mkexpr(t1), NULL /* this is a load */ ));
16691436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#elif defined (_MIPSEB)
16692436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      stmt(IRStmt_LLSC(Iend_BE, t2, mkexpr(t1), NULL /* this is a load */ ));
16693436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
16694436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (mode64)
16695436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rt, unop(Iop_32Sto64, mkexpr(t2)));
16696436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      else
16697436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putIReg(rt, mkexpr(t2));
16698436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
16699436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16700436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x34:  /* Load Linked Doubleword - LLD; MIPS64 */
16701436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      DIP("lld r%d, %d(r%d)", rt, imm, rs);
16702436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      LOAD_STORE_PATTERN;
16703436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16704436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      t2 = newTemp(Ity_I64);
16705436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#if defined (_MIPSEL)
16706436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      stmt(IRStmt_LLSC
16707436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           (Iend_LE, t2, mkexpr(t1), NULL /* this is a load */ ));
16708663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#elif defined (_MIPSEB)
16709436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      stmt(IRStmt_LLSC
16710436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov           (Iend_BE, t2, mkexpr(t1), NULL /* this is a load */ ));
16711663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
16712663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16713663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      putIReg(rt, mkexpr(t2));
16714663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
16715663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16716436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x38:  /* SC / SWC0 */
16717663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      DIP("sc r%d, %d(r%d)", rt, imm, rs);
16718663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      LOAD_STORE_PATTERN;
16719663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16720663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      t2 = newTemp(Ity_I1);
16721663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#if defined (_MIPSEL)
16722663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      stmt(IRStmt_LLSC(Iend_LE, t2, mkexpr(t1), mkNarrowTo32(ty, getIReg(rt))));
16723663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#elif defined (_MIPSEB)
16724663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      stmt(IRStmt_LLSC(Iend_BE, t2, mkexpr(t1), mkNarrowTo32(ty, getIReg(rt))));
16725663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif
16726663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16727436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      putIReg(rt, unop(mode64 ? Iop_1Uto64 : Iop_1Uto32, mkexpr(t2)));
16728436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
16729436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16730436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x3C:  /* Store Conditional Doubleword - SCD; MIPS64 */
16731436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      DIP("sdc r%d, %d(r%d)", rt, imm, rs);
16732436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      LOAD_STORE_PATTERN;
16733436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16734436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      t2 = newTemp(Ity_I1);
16735436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#if defined (_MIPSEL)
16736436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      stmt(IRStmt_LLSC(Iend_LE, t2, mkexpr(t1), getIReg(rt)));
16737436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#elif defined (_MIPSEB)
16738436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      stmt(IRStmt_LLSC(Iend_BE, t2, mkexpr(t1), getIReg(rt)));
16739436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
16740436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16741436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      putIReg(rt, unop(Iop_1Uto64, mkexpr(t2)));
16742436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
16743436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16744436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x37:  /* Load Doubleword - LD; MIPS64 */
16745436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      DIP("ld r%u, %d(r%u)", rt, imm, rs);
16746436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      LOAD_STORE_PATTERN;
16747436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      putIReg(rt, load(Ity_I64, mkexpr(t1)));
16748436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      break;
16749436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
16750436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   case 0x3F:  /* Store Doubleword - SD; MIPS64 */
16751436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      DIP("sd r%u, %d(r%u)", rt, imm, rs);
16752436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      LOAD_STORE_PATTERN;
16753436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      store(mkexpr(t1), getIReg(rt));
16754663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      break;
16755663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16756436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   decode_failure_dsp:
16757436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      vex_printf("Error occured while trying to decode MIPS32 DSP "
16758436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "instruction.\nYour platform probably doesn't support "
16759436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                 "MIPS32 DSP ASE.\n");
16760436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   decode_failure:
16761663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* All decode failures end up here. */
16762436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (sigill_diag)
16763436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         vex_printf("vex mips->IR: unhandled instruction bytes: "
16764436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    "0x%x 0x%x 0x%x 0x%x\n",
16765436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    (Int) getIByte(delta_start + 0),
16766436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    (Int) getIByte(delta_start + 1),
16767436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    (Int) getIByte(delta_start + 2),
16768436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                    (Int) getIByte(delta_start + 3));
16769663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16770663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      /* Tell the dispatcher that this insn cannot be decoded, and so has
16771663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         not been executed, and (is currently) the next to be executed.
16772663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         EIP should be up-to-date since it made so at the start bnezof each
16773663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         insn, but nevertheless be paranoid and update it again right
16774663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         now. */
16775436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (mode64) {
16776436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         stmt(IRStmt_Put(offsetof(VexGuestMIPS64State, guest_PC),
16777436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov              mkU64(guest_PC_curr_instr)));
16778436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         jmp_lit64(&dres, Ijk_NoDecode, guest_PC_curr_instr);
16779436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      } else {
16780436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         stmt(IRStmt_Put(offsetof(VexGuestMIPS32State, guest_PC),
16781436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov              mkU32(guest_PC_curr_instr)));
16782436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         jmp_lit32(&dres, Ijk_NoDecode, guest_PC_curr_instr);
16783436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
16784663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dres.whatNext = Dis_StopHere;
16785663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dres.len = 0;
16786663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      return dres;
16787436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   }  /* switch (opc) for the main (primary) opcode switch. */
16788663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16789663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* All MIPS insn have 4 bytes */
16790663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16791663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (delay_slot_branch) {
16792663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      delay_slot_branch = False;
16793663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      stmt(bstmt);
16794663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      bstmt = NULL;
16795436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      if (mode64)
16796436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putPC(mkU64(guest_PC_curr_instr + 4));
16797436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      else
16798436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         putPC(mkU32(guest_PC_curr_instr + 4));
16799663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dres.jk_StopHere = is_Branch_or_Jump_and_Link(guest_code + delta - 4) ?
16800663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                         Ijk_Call : Ijk_Boring;
16801663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
16802663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16803663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (likely_delay_slot) {
16804663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dres.jk_StopHere = Ijk_Boring;
16805663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dres.whatNext = Dis_StopHere;
16806663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      putPC(lastn);
16807663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      lastn = NULL;
16808663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
16809663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   if (delay_slot_jump) {
16810663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      putPC(lastn);
16811663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      lastn = NULL;
16812663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      dres.jk_StopHere = is_Branch_or_Jump_and_Link(guest_code + delta - 4) ?
16813663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                         Ijk_Call : Ijk_Boring;
16814663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
16815663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16816663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng decode_success:
16817663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* All decode successes end up here. */
16818663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   switch (dres.whatNext) {
16819663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Dis_Continue:
16820436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64)
16821436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putPC(mkU64(guest_PC_curr_instr + 4));
16822436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         else
16823436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putPC(mkU32(guest_PC_curr_instr + 4));
16824663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
16825663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Dis_ResteerU:
16826663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Dis_ResteerC:
16827663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         putPC(mkU32(dres.continueAt));
16828663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
16829663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      case Dis_StopHere:
16830663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
16831663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      default:
16832663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         vassert(0);
16833663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         break;
16834663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   }
16835663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16836436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   /* On MIPS we need to check if the last instruction in block is branch or
16837436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      jump. */
16838436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   if (((vex_control.guest_max_insns - 1) == (delta + 4) / 4)
16839436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov       &&  (dres.whatNext != Dis_StopHere))
16840663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng      if (branch_or_jump(guest_code + delta + 4)) {
16841663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         dres.whatNext = Dis_StopHere;
16842663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng         dres.jk_StopHere = Ijk_Boring;
16843436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         if (mode64)
16844436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putPC(mkU64(guest_PC_curr_instr + 4));
16845436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov         else
16846436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov            putPC(mkU32(guest_PC_curr_instr + 4));
16847436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov      }
16848663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dres.len = 4;
16849663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16850663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   DIP("\n");
16851663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16852663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return dres;
16853663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16854663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
16855663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16856663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*------------------------------------------------------------*/
16857663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*--- Top-level fn                                         ---*/
16858663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*------------------------------------------------------------*/
16859663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16860663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Disassemble a single instruction into IR.  The instruction
16861663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   is located in host memory at &guest_code[delta]. */
16862436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy IvanovDisResult disInstr_MIPS( IRSB*        irsb_IN,
16863436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         Bool         (*resteerOkFn) ( void *, Addr64 ),
16864436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         Bool         resteerCisOk,
16865436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         void*        callback_opaque,
16866436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         UChar*       guest_code_IN,
16867436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         Long         delta,
16868436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         Addr64       guest_IP,
16869436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         VexArch      guest_arch,
16870436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         VexArchInfo* archinfo,
16871436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         VexAbiInfo*  abiinfo,
16872436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         Bool         host_bigendian_IN,
16873436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                         Bool         sigill_diag_IN )
16874663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
16875663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   DisResult dres;
16876663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   /* Set globals (see top of this file) */
16877436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   vassert(guest_arch == VexArchMIPS32 || guest_arch == VexArchMIPS64);
16878663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16879663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   mode64 = guest_arch != VexArchMIPS32;
16880436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#if (__mips_fpr==64)
16881436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   fp_mode64 = ((VEX_MIPS_REV(archinfo->hwcaps) == VEX_PRID_CPU_32FPR)
16882436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                || guest_arch == VexArchMIPS64);
16883436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
16884663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16885663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   guest_code = guest_code_IN;
16886663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   irsb = irsb_IN;
16887663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   host_is_bigendian = host_bigendian_IN;
16888436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#if defined(VGP_mips32_linux)
16889436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   guest_PC_curr_instr = (Addr32)guest_IP;
16890436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#elif defined(VGP_mips64_linux)
16891436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   guest_PC_curr_instr = (Addr64)guest_IP;
16892436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#endif
16893663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16894663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   dres = disInstr_MIPS_WRK(resteerOkFn, resteerCisOk, callback_opaque,
16895436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                            delta, archinfo, abiinfo, sigill_diag_IN);
16896663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16897663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return dres;
16898663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
16899663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
16900663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*--------------------------------------------------------------------*/
16901663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*--- end                                        guest_mips_toIR.c ---*/
16902663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*--------------------------------------------------------------------*/
16903