10de80192f57cd132b31b233c65734de04939ce65sewardj
20de80192f57cd132b31b233c65734de04939ce65sewardj/*--------------------------------------------------------------------*/
30de80192f57cd132b31b233c65734de04939ce65sewardj/*--- begin                                    guest_tilegx_toIR.c ---*/
40de80192f57cd132b31b233c65734de04939ce65sewardj/*--------------------------------------------------------------------*/
50de80192f57cd132b31b233c65734de04939ce65sewardj
60de80192f57cd132b31b233c65734de04939ce65sewardj/*
70de80192f57cd132b31b233c65734de04939ce65sewardj  This file is part of Valgrind, a dynamic binary instrumentation
80de80192f57cd132b31b233c65734de04939ce65sewardj  framework.
90de80192f57cd132b31b233c65734de04939ce65sewardj
100de80192f57cd132b31b233c65734de04939ce65sewardj  Copyright (C) 2010-2013  Tilera Corp.
110de80192f57cd132b31b233c65734de04939ce65sewardj
120de80192f57cd132b31b233c65734de04939ce65sewardj  This program is free software; you can redistribute it and/or
130de80192f57cd132b31b233c65734de04939ce65sewardj  modify it under the terms of the GNU General Public License as
140de80192f57cd132b31b233c65734de04939ce65sewardj  published by the Free Software Foundation; either version 2 of the
150de80192f57cd132b31b233c65734de04939ce65sewardj  License, or (at your option) any later version.
160de80192f57cd132b31b233c65734de04939ce65sewardj
170de80192f57cd132b31b233c65734de04939ce65sewardj  This program is distributed in the hope that it will be useful, but
180de80192f57cd132b31b233c65734de04939ce65sewardj  WITHOUT ANY WARRANTY; without even the implied warranty of
190de80192f57cd132b31b233c65734de04939ce65sewardj  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
200de80192f57cd132b31b233c65734de04939ce65sewardj  General Public License for more details.
210de80192f57cd132b31b233c65734de04939ce65sewardj
220de80192f57cd132b31b233c65734de04939ce65sewardj  You should have received a copy of the GNU General Public License
230de80192f57cd132b31b233c65734de04939ce65sewardj  along with this program; if not, write to the Free Software
240de80192f57cd132b31b233c65734de04939ce65sewardj  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
250de80192f57cd132b31b233c65734de04939ce65sewardj  02111-1307, USA.
260de80192f57cd132b31b233c65734de04939ce65sewardj
270de80192f57cd132b31b233c65734de04939ce65sewardj  The GNU General Public License is contained in the file COPYING.
280de80192f57cd132b31b233c65734de04939ce65sewardj*/
290de80192f57cd132b31b233c65734de04939ce65sewardj
300de80192f57cd132b31b233c65734de04939ce65sewardj/* Contributed by Zhi-Gang Liu <zliu at tilera dot com> */
310de80192f57cd132b31b233c65734de04939ce65sewardj
320de80192f57cd132b31b233c65734de04939ce65sewardj/* Translates TILEGX code to IR. */
330de80192f57cd132b31b233c65734de04939ce65sewardj
340de80192f57cd132b31b233c65734de04939ce65sewardj#include "libvex_basictypes.h"
350de80192f57cd132b31b233c65734de04939ce65sewardj#include "libvex_ir.h"
360de80192f57cd132b31b233c65734de04939ce65sewardj#include "libvex.h"
370de80192f57cd132b31b233c65734de04939ce65sewardj#include "libvex_guest_tilegx.h"
380de80192f57cd132b31b233c65734de04939ce65sewardj
390de80192f57cd132b31b233c65734de04939ce65sewardj#include "main_util.h"
400de80192f57cd132b31b233c65734de04939ce65sewardj#include "main_globals.h"
410de80192f57cd132b31b233c65734de04939ce65sewardj#include "guest_generic_bb_to_IR.h"
420de80192f57cd132b31b233c65734de04939ce65sewardj#include "guest_tilegx_defs.h"
430de80192f57cd132b31b233c65734de04939ce65sewardj#include "tilegx_disasm.h"
440de80192f57cd132b31b233c65734de04939ce65sewardj
450de80192f57cd132b31b233c65734de04939ce65sewardj/*------------------------------------------------------------*/
460de80192f57cd132b31b233c65734de04939ce65sewardj/*--- Globals                                              ---*/
470de80192f57cd132b31b233c65734de04939ce65sewardj/*------------------------------------------------------------*/
480de80192f57cd132b31b233c65734de04939ce65sewardj
490de80192f57cd132b31b233c65734de04939ce65sewardj/* These are set at the start of the translation of a instruction, so
500de80192f57cd132b31b233c65734de04939ce65sewardj   that we don't have to pass them around endlessly.  CONST means does
510de80192f57cd132b31b233c65734de04939ce65sewardj   not change during translation of the instruction.
520de80192f57cd132b31b233c65734de04939ce65sewardj*/
530de80192f57cd132b31b233c65734de04939ce65sewardj
540de80192f57cd132b31b233c65734de04939ce65sewardj/* CONST: is the host bigendian?  This has to do with float vs double
550de80192f57cd132b31b233c65734de04939ce65sewardj   register accesses on VFP, but it's complex and not properly thought
560de80192f57cd132b31b233c65734de04939ce65sewardj   out. */
570de80192f57cd132b31b233c65734de04939ce65sewardjstatic VexEndness host_endness;
580de80192f57cd132b31b233c65734de04939ce65sewardj
590de80192f57cd132b31b233c65734de04939ce65sewardj/* Pointer to the guest code area. */
600de80192f57cd132b31b233c65734de04939ce65sewardjstatic UChar *guest_code;
610de80192f57cd132b31b233c65734de04939ce65sewardj
620de80192f57cd132b31b233c65734de04939ce65sewardj/* The guest address corresponding to guest_code[0]. */
630de80192f57cd132b31b233c65734de04939ce65sewardjstatic Addr64 guest_PC_bbstart;
640de80192f57cd132b31b233c65734de04939ce65sewardj
650de80192f57cd132b31b233c65734de04939ce65sewardj/* CONST: The guest address for the instruction currently being
660de80192f57cd132b31b233c65734de04939ce65sewardj   translated. */
670de80192f57cd132b31b233c65734de04939ce65sewardjstatic Addr64 guest_PC_curr_instr;
680de80192f57cd132b31b233c65734de04939ce65sewardj
690de80192f57cd132b31b233c65734de04939ce65sewardj/* MOD: The IRSB* into which we're generating code. */
700de80192f57cd132b31b233c65734de04939ce65sewardjstatic IRSB *irsb;
710de80192f57cd132b31b233c65734de04939ce65sewardj
720de80192f57cd132b31b233c65734de04939ce65sewardj/*------------------------------------------------------------*/
730de80192f57cd132b31b233c65734de04939ce65sewardj/*--- Debugging output                                     ---*/
740de80192f57cd132b31b233c65734de04939ce65sewardj/*------------------------------------------------------------*/
750de80192f57cd132b31b233c65734de04939ce65sewardj
760de80192f57cd132b31b233c65734de04939ce65sewardj#define DIP(format, args...)                    \
770de80192f57cd132b31b233c65734de04939ce65sewardj  if (vex_traceflags & VEX_TRACE_FE)            \
780de80192f57cd132b31b233c65734de04939ce65sewardj    vex_printf(format, ## args)
790de80192f57cd132b31b233c65734de04939ce65sewardj
800de80192f57cd132b31b233c65734de04939ce65sewardj/*------------------------------------------------------------*/
810de80192f57cd132b31b233c65734de04939ce65sewardj/*--- Helper bits and pieces for deconstructing the        ---*/
820de80192f57cd132b31b233c65734de04939ce65sewardj/*--- tilegx insn stream.                                  ---*/
830de80192f57cd132b31b233c65734de04939ce65sewardj/*------------------------------------------------------------*/
840de80192f57cd132b31b233c65734de04939ce65sewardj
850de80192f57cd132b31b233c65734de04939ce65sewardjstatic Int integerGuestRegOffset ( UInt iregNo )
860de80192f57cd132b31b233c65734de04939ce65sewardj{
870de80192f57cd132b31b233c65734de04939ce65sewardj  return 8 * (iregNo);
880de80192f57cd132b31b233c65734de04939ce65sewardj}
890de80192f57cd132b31b233c65734de04939ce65sewardj
900de80192f57cd132b31b233c65734de04939ce65sewardj/*------------------------------------------------------------*/
910de80192f57cd132b31b233c65734de04939ce65sewardj/*---                           Field helpers              ---*/
920de80192f57cd132b31b233c65734de04939ce65sewardj/*------------------------------------------------------------*/
930de80192f57cd132b31b233c65734de04939ce65sewardj
940de80192f57cd132b31b233c65734de04939ce65sewardj/*------------------------------------------------------------*/
950de80192f57cd132b31b233c65734de04939ce65sewardj/*--- Helper bits and pieces for creating IR fragments.    ---*/
960de80192f57cd132b31b233c65734de04939ce65sewardj/*------------------------------------------------------------*/
970de80192f57cd132b31b233c65734de04939ce65sewardj
980de80192f57cd132b31b233c65734de04939ce65sewardjstatic IRExpr *mkU8 ( UInt i )
990de80192f57cd132b31b233c65734de04939ce65sewardj{
1000de80192f57cd132b31b233c65734de04939ce65sewardj  return IRExpr_Const(IRConst_U8((UChar) i));
1010de80192f57cd132b31b233c65734de04939ce65sewardj}
1020de80192f57cd132b31b233c65734de04939ce65sewardj
1030de80192f57cd132b31b233c65734de04939ce65sewardj/* Create an expression node for a 32-bit integer constant */
1040de80192f57cd132b31b233c65734de04939ce65sewardjstatic IRExpr *mkU32 ( UInt i )
1050de80192f57cd132b31b233c65734de04939ce65sewardj{
1060de80192f57cd132b31b233c65734de04939ce65sewardj  return IRExpr_Const(IRConst_U32(i));
1070de80192f57cd132b31b233c65734de04939ce65sewardj}
1080de80192f57cd132b31b233c65734de04939ce65sewardj
1090de80192f57cd132b31b233c65734de04939ce65sewardj/* Create an expression node for a 64-bit integer constant */
1100de80192f57cd132b31b233c65734de04939ce65sewardjstatic IRExpr *mkU64 ( ULong i )
1110de80192f57cd132b31b233c65734de04939ce65sewardj{
1120de80192f57cd132b31b233c65734de04939ce65sewardj  return IRExpr_Const(IRConst_U64(i));
1130de80192f57cd132b31b233c65734de04939ce65sewardj}
1140de80192f57cd132b31b233c65734de04939ce65sewardj
1150de80192f57cd132b31b233c65734de04939ce65sewardjstatic IRExpr *mkexpr ( IRTemp tmp )
1160de80192f57cd132b31b233c65734de04939ce65sewardj{
1170de80192f57cd132b31b233c65734de04939ce65sewardj  return IRExpr_RdTmp(tmp);
1180de80192f57cd132b31b233c65734de04939ce65sewardj}
1190de80192f57cd132b31b233c65734de04939ce65sewardj
1200de80192f57cd132b31b233c65734de04939ce65sewardjstatic IRExpr *unop ( IROp op, IRExpr * a )
1210de80192f57cd132b31b233c65734de04939ce65sewardj{
1220de80192f57cd132b31b233c65734de04939ce65sewardj  return IRExpr_Unop(op, a);
1230de80192f57cd132b31b233c65734de04939ce65sewardj}
1240de80192f57cd132b31b233c65734de04939ce65sewardj
1250de80192f57cd132b31b233c65734de04939ce65sewardjstatic IRExpr *binop ( IROp op, IRExpr * a1, IRExpr * a2 )
1260de80192f57cd132b31b233c65734de04939ce65sewardj{
1270de80192f57cd132b31b233c65734de04939ce65sewardj  return IRExpr_Binop(op, a1, a2);
1280de80192f57cd132b31b233c65734de04939ce65sewardj}
1290de80192f57cd132b31b233c65734de04939ce65sewardj
1300de80192f57cd132b31b233c65734de04939ce65sewardjstatic IRExpr *load ( IRType ty, IRExpr * addr )
1310de80192f57cd132b31b233c65734de04939ce65sewardj{
1320de80192f57cd132b31b233c65734de04939ce65sewardj  IRExpr *load1 = NULL;
1330de80192f57cd132b31b233c65734de04939ce65sewardj
1340de80192f57cd132b31b233c65734de04939ce65sewardj  load1 = IRExpr_Load(Iend_LE, ty, addr);
1350de80192f57cd132b31b233c65734de04939ce65sewardj  return load1;
1360de80192f57cd132b31b233c65734de04939ce65sewardj}
1370de80192f57cd132b31b233c65734de04939ce65sewardj
1380de80192f57cd132b31b233c65734de04939ce65sewardj/* Add a statement to the list held by "irsb". */
1390de80192f57cd132b31b233c65734de04939ce65sewardjstatic void stmt ( IRStmt * st )
1400de80192f57cd132b31b233c65734de04939ce65sewardj{
1410de80192f57cd132b31b233c65734de04939ce65sewardj  addStmtToIRSB(irsb, st);
1420de80192f57cd132b31b233c65734de04939ce65sewardj}
1430de80192f57cd132b31b233c65734de04939ce65sewardj
1440de80192f57cd132b31b233c65734de04939ce65sewardj#define OFFB_PC     offsetof(VexGuestTILEGXState, guest_pc)
1450de80192f57cd132b31b233c65734de04939ce65sewardj
1460de80192f57cd132b31b233c65734de04939ce65sewardjstatic void putPC ( IRExpr * e )
1470de80192f57cd132b31b233c65734de04939ce65sewardj{
1480de80192f57cd132b31b233c65734de04939ce65sewardj  stmt(IRStmt_Put(OFFB_PC, e));
1490de80192f57cd132b31b233c65734de04939ce65sewardj}
1500de80192f57cd132b31b233c65734de04939ce65sewardj
1510de80192f57cd132b31b233c65734de04939ce65sewardjstatic void assign ( IRTemp dst, IRExpr * e )
1520de80192f57cd132b31b233c65734de04939ce65sewardj{
1530de80192f57cd132b31b233c65734de04939ce65sewardj  stmt(IRStmt_WrTmp(dst, e));
1540de80192f57cd132b31b233c65734de04939ce65sewardj}
1550de80192f57cd132b31b233c65734de04939ce65sewardj
1560de80192f57cd132b31b233c65734de04939ce65sewardjstatic void store ( IRExpr * addr, IRExpr * data )
1570de80192f57cd132b31b233c65734de04939ce65sewardj{
1580de80192f57cd132b31b233c65734de04939ce65sewardj  stmt(IRStmt_Store(Iend_LE, addr, data));
1590de80192f57cd132b31b233c65734de04939ce65sewardj}
1600de80192f57cd132b31b233c65734de04939ce65sewardj
1610de80192f57cd132b31b233c65734de04939ce65sewardj/* Generate a new temporary of the given type. */
1620de80192f57cd132b31b233c65734de04939ce65sewardjstatic IRTemp newTemp ( IRType ty )
1630de80192f57cd132b31b233c65734de04939ce65sewardj{
1640de80192f57cd132b31b233c65734de04939ce65sewardj  vassert(isPlausibleIRType(ty));
1650de80192f57cd132b31b233c65734de04939ce65sewardj  return newIRTemp(irsb->tyenv, ty);
1660de80192f57cd132b31b233c65734de04939ce65sewardj}
1670de80192f57cd132b31b233c65734de04939ce65sewardj
1680de80192f57cd132b31b233c65734de04939ce65sewardjstatic ULong extend_s_16to64 ( UInt x )
1690de80192f57cd132b31b233c65734de04939ce65sewardj{
1700de80192f57cd132b31b233c65734de04939ce65sewardj  return (ULong) ((((Long) x) << 48) >> 48);
1710de80192f57cd132b31b233c65734de04939ce65sewardj}
1720de80192f57cd132b31b233c65734de04939ce65sewardj
1730de80192f57cd132b31b233c65734de04939ce65sewardjstatic ULong extend_s_8to64 ( UInt x )
1740de80192f57cd132b31b233c65734de04939ce65sewardj{
1750de80192f57cd132b31b233c65734de04939ce65sewardj  return (ULong) ((((Long) x) << 56) >> 56);
1760de80192f57cd132b31b233c65734de04939ce65sewardj}
1770de80192f57cd132b31b233c65734de04939ce65sewardj
1780de80192f57cd132b31b233c65734de04939ce65sewardjstatic IRExpr *getIReg ( UInt iregNo )
1790de80192f57cd132b31b233c65734de04939ce65sewardj{
1800de80192f57cd132b31b233c65734de04939ce65sewardj  IRType ty = Ity_I64;
1810de80192f57cd132b31b233c65734de04939ce65sewardj  if(!(iregNo < 56 || iregNo == 63 ||
1820de80192f57cd132b31b233c65734de04939ce65sewardj       (iregNo >= 70 && iregNo <= 73))) {
1830de80192f57cd132b31b233c65734de04939ce65sewardj    vex_printf("iregNo=%d\n", iregNo);
1840de80192f57cd132b31b233c65734de04939ce65sewardj    vassert(0);
1850de80192f57cd132b31b233c65734de04939ce65sewardj  }
1860de80192f57cd132b31b233c65734de04939ce65sewardj  return IRExpr_Get(integerGuestRegOffset(iregNo), ty);
1870de80192f57cd132b31b233c65734de04939ce65sewardj}
1880de80192f57cd132b31b233c65734de04939ce65sewardj
1890de80192f57cd132b31b233c65734de04939ce65sewardjstatic void putIReg ( UInt archreg, IRExpr * e )
1900de80192f57cd132b31b233c65734de04939ce65sewardj{
1910de80192f57cd132b31b233c65734de04939ce65sewardj  IRType ty = Ity_I64;
1920de80192f57cd132b31b233c65734de04939ce65sewardj  if(!(archreg < 56 || archreg == 63 || archreg == 70 ||
1930de80192f57cd132b31b233c65734de04939ce65sewardj       archreg == 72 || archreg == 73)) {
1940de80192f57cd132b31b233c65734de04939ce65sewardj    vex_printf("archreg=%d\n", archreg);
1950de80192f57cd132b31b233c65734de04939ce65sewardj    vassert(0);
1960de80192f57cd132b31b233c65734de04939ce65sewardj  }
1970de80192f57cd132b31b233c65734de04939ce65sewardj  vassert(typeOfIRExpr(irsb->tyenv, e) == ty);
1980de80192f57cd132b31b233c65734de04939ce65sewardj  if (archreg != 63)
1990de80192f57cd132b31b233c65734de04939ce65sewardj    stmt(IRStmt_Put(integerGuestRegOffset(archreg), e));
2000de80192f57cd132b31b233c65734de04939ce65sewardj}
2010de80192f57cd132b31b233c65734de04939ce65sewardj
2020de80192f57cd132b31b233c65734de04939ce65sewardj/* Narrow 8/16/32 bit int expr to 8/16/32.  Clearly only some
2030de80192f57cd132b31b233c65734de04939ce65sewardj   of these combinations make sense. */
2040de80192f57cd132b31b233c65734de04939ce65sewardjstatic IRExpr *narrowTo ( IRType dst_ty, IRExpr * e )
2050de80192f57cd132b31b233c65734de04939ce65sewardj{
2060de80192f57cd132b31b233c65734de04939ce65sewardj  IRType src_ty = typeOfIRExpr(irsb->tyenv, e);
2070de80192f57cd132b31b233c65734de04939ce65sewardj  if (src_ty == dst_ty)
2080de80192f57cd132b31b233c65734de04939ce65sewardj    return e;
2090de80192f57cd132b31b233c65734de04939ce65sewardj  if (src_ty == Ity_I32 && dst_ty == Ity_I16)
2100de80192f57cd132b31b233c65734de04939ce65sewardj    return unop(Iop_32to16, e);
2110de80192f57cd132b31b233c65734de04939ce65sewardj  if (src_ty == Ity_I32 && dst_ty == Ity_I8)
2120de80192f57cd132b31b233c65734de04939ce65sewardj    return unop(Iop_32to8, e);
2130de80192f57cd132b31b233c65734de04939ce65sewardj
2140de80192f57cd132b31b233c65734de04939ce65sewardj  if (src_ty == Ity_I64 && dst_ty == Ity_I8) {
2150de80192f57cd132b31b233c65734de04939ce65sewardj    return unop(Iop_64to8, e);
2160de80192f57cd132b31b233c65734de04939ce65sewardj  }
2170de80192f57cd132b31b233c65734de04939ce65sewardj  if (src_ty == Ity_I64 && dst_ty == Ity_I16) {
2180de80192f57cd132b31b233c65734de04939ce65sewardj    return unop(Iop_64to16, e);
2190de80192f57cd132b31b233c65734de04939ce65sewardj  }
2200de80192f57cd132b31b233c65734de04939ce65sewardj  if (src_ty == Ity_I64 && dst_ty == Ity_I32) {
2210de80192f57cd132b31b233c65734de04939ce65sewardj    return unop(Iop_64to32, e);
2220de80192f57cd132b31b233c65734de04939ce65sewardj  }
2230de80192f57cd132b31b233c65734de04939ce65sewardj
2240de80192f57cd132b31b233c65734de04939ce65sewardj  if (vex_traceflags & VEX_TRACE_FE) {
2250de80192f57cd132b31b233c65734de04939ce65sewardj    vex_printf("\nsrc, dst tys are: ");
2260de80192f57cd132b31b233c65734de04939ce65sewardj    ppIRType(src_ty);
2270de80192f57cd132b31b233c65734de04939ce65sewardj    vex_printf(", ");
2280de80192f57cd132b31b233c65734de04939ce65sewardj    ppIRType(dst_ty);
2290de80192f57cd132b31b233c65734de04939ce65sewardj    vex_printf("\n");
2300de80192f57cd132b31b233c65734de04939ce65sewardj  }
2310de80192f57cd132b31b233c65734de04939ce65sewardj  vpanic("narrowTo(tilegx)");
2320de80192f57cd132b31b233c65734de04939ce65sewardj  return e;
2330de80192f57cd132b31b233c65734de04939ce65sewardj}
2340de80192f57cd132b31b233c65734de04939ce65sewardj
2350de80192f57cd132b31b233c65734de04939ce65sewardj#define signExtend(_e, _n)                                              \
2360de80192f57cd132b31b233c65734de04939ce65sewardj  ((_n == 32) ?                                                         \
2370de80192f57cd132b31b233c65734de04939ce65sewardj   unop(Iop_32Sto64, _e) :                                              \
2380de80192f57cd132b31b233c65734de04939ce65sewardj   ((_n == 16) ?                                                        \
23932bf4136270f100788bcad4edb7d47e1b43df254zliu    unop(Iop_16Sto64, _e) :						\
2400de80192f57cd132b31b233c65734de04939ce65sewardj    (binop(Iop_Sar64, binop(Iop_Shl64, _e, mkU8(63 - (_n))), mkU8(63 - (_n))))))
2410de80192f57cd132b31b233c65734de04939ce65sewardj
2420de80192f57cd132b31b233c65734de04939ce65sewardjstatic IRStmt* dis_branch ( IRExpr* guard, ULong imm )
2430de80192f57cd132b31b233c65734de04939ce65sewardj{
2440de80192f57cd132b31b233c65734de04939ce65sewardj  IRTemp t0;
2450de80192f57cd132b31b233c65734de04939ce65sewardj
2460de80192f57cd132b31b233c65734de04939ce65sewardj  t0 = newTemp(Ity_I1);
2470de80192f57cd132b31b233c65734de04939ce65sewardj  assign(t0, guard);
2480de80192f57cd132b31b233c65734de04939ce65sewardj  return IRStmt_Exit(mkexpr(t0), Ijk_Boring,
2490de80192f57cd132b31b233c65734de04939ce65sewardj                     IRConst_U64(imm), OFFB_PC);
2500de80192f57cd132b31b233c65734de04939ce65sewardj}
2510de80192f57cd132b31b233c65734de04939ce65sewardj
2520de80192f57cd132b31b233c65734de04939ce65sewardj#define  MARK_REG_WB(_rd, _td)                  \
2530de80192f57cd132b31b233c65734de04939ce65sewardj  do {                                          \
2540de80192f57cd132b31b233c65734de04939ce65sewardj    vassert(rd_wb_index < 6);                   \
2550de80192f57cd132b31b233c65734de04939ce65sewardj    rd_wb_temp[rd_wb_index] = _td;              \
2560de80192f57cd132b31b233c65734de04939ce65sewardj    rd_wb_reg[rd_wb_index] = _rd;               \
2570de80192f57cd132b31b233c65734de04939ce65sewardj    rd_wb_index++;                              \
2580de80192f57cd132b31b233c65734de04939ce65sewardj  } while(0)
2590de80192f57cd132b31b233c65734de04939ce65sewardj
2600de80192f57cd132b31b233c65734de04939ce65sewardj/*------------------------------------------------------------*/
2610de80192f57cd132b31b233c65734de04939ce65sewardj/*--- Disassemble a single instruction                     ---*/
2620de80192f57cd132b31b233c65734de04939ce65sewardj/*------------------------------------------------------------*/
2630de80192f57cd132b31b233c65734de04939ce65sewardj
2640de80192f57cd132b31b233c65734de04939ce65sewardj/* Disassemble a single instruction bundle into IR.  The bundle is
2650de80192f57cd132b31b233c65734de04939ce65sewardj   located in host memory at guest_instr, and has guest IP of
2660de80192f57cd132b31b233c65734de04939ce65sewardj   guest_PC_curr_instr, which will have been set before the call
2670de80192f57cd132b31b233c65734de04939ce65sewardj   here. */
2680de80192f57cd132b31b233c65734de04939ce65sewardjstatic DisResult disInstr_TILEGX_WRK ( Bool(*resteerOkFn) (void *, Addr),
2690de80192f57cd132b31b233c65734de04939ce65sewardj                                       Bool resteerCisOk,
2700de80192f57cd132b31b233c65734de04939ce65sewardj                                       void *callback_opaque,
2710de80192f57cd132b31b233c65734de04939ce65sewardj                                       Long delta64,
2720de80192f57cd132b31b233c65734de04939ce65sewardj                                       const VexArchInfo * archinfo,
2730de80192f57cd132b31b233c65734de04939ce65sewardj                                       const VexAbiInfo * abiinfo,
2740de80192f57cd132b31b233c65734de04939ce65sewardj                                       Bool sigill_diag )
2750de80192f57cd132b31b233c65734de04939ce65sewardj{
2760de80192f57cd132b31b233c65734de04939ce65sewardj  struct tilegx_decoded_instruction
2770de80192f57cd132b31b233c65734de04939ce65sewardj    decoded[TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE];
27832bf4136270f100788bcad4edb7d47e1b43df254zliu  ULong  cins, opcode = -1, rd, ra, rb, imm = 0;
2790de80192f57cd132b31b233c65734de04939ce65sewardj  ULong  opd[4];
2800de80192f57cd132b31b233c65734de04939ce65sewardj  ULong  opd_src_map, opd_dst_map, opd_imm_map;
2810de80192f57cd132b31b233c65734de04939ce65sewardj  Int    use_dirty_helper;
2820de80192f57cd132b31b233c65734de04939ce65sewardj  IRTemp t0, t1, t2, t3, t4;
2830de80192f57cd132b31b233c65734de04939ce65sewardj  IRTemp tb[4];
2840de80192f57cd132b31b233c65734de04939ce65sewardj  IRTemp rd_wb_temp[6];
2850de80192f57cd132b31b233c65734de04939ce65sewardj  ULong  rd_wb_reg[6];
2860de80192f57cd132b31b233c65734de04939ce65sewardj  /* Tilegx is a VLIW processor, we have to commit register write after read.*/
2870de80192f57cd132b31b233c65734de04939ce65sewardj  Int    rd_wb_index;
28832bf4136270f100788bcad4edb7d47e1b43df254zliu  Int    n = 0, nr_insn;
2890de80192f57cd132b31b233c65734de04939ce65sewardj  DisResult dres;
2900de80192f57cd132b31b233c65734de04939ce65sewardj
2910de80192f57cd132b31b233c65734de04939ce65sewardj  /* The running delta */
2920de80192f57cd132b31b233c65734de04939ce65sewardj  Long delta = delta64;
2930de80192f57cd132b31b233c65734de04939ce65sewardj
2940de80192f57cd132b31b233c65734de04939ce65sewardj  /* Holds pc at the start of the insn, so that we can print
2950de80192f57cd132b31b233c65734de04939ce65sewardj     consistent error messages for unimplemented insns. */
2960de80192f57cd132b31b233c65734de04939ce65sewardj  //Long delta_start = delta;
2970de80192f57cd132b31b233c65734de04939ce65sewardj
2980de80192f57cd132b31b233c65734de04939ce65sewardj  UChar *code = (UChar *) (guest_code + delta);
2990de80192f57cd132b31b233c65734de04939ce65sewardj
3000de80192f57cd132b31b233c65734de04939ce65sewardj  IRStmt *bstmt = NULL;  /* Branch statement. */
3010de80192f57cd132b31b233c65734de04939ce65sewardj  IRExpr *next = NULL; /* Next bundle expr. */
3020de80192f57cd132b31b233c65734de04939ce65sewardj  ULong  jumpkind =  Ijk_Boring;
3030de80192f57cd132b31b233c65734de04939ce65sewardj  ULong  steering_pc;
3040de80192f57cd132b31b233c65734de04939ce65sewardj
3050de80192f57cd132b31b233c65734de04939ce65sewardj  /* Set result defaults. */
3060de80192f57cd132b31b233c65734de04939ce65sewardj  dres.whatNext = Dis_Continue;
3070de80192f57cd132b31b233c65734de04939ce65sewardj  dres.len = 0;
3080de80192f57cd132b31b233c65734de04939ce65sewardj  dres.continueAt = 0;
3090de80192f57cd132b31b233c65734de04939ce65sewardj  dres.jk_StopHere = Ijk_INVALID;
3100de80192f57cd132b31b233c65734de04939ce65sewardj
3110de80192f57cd132b31b233c65734de04939ce65sewardj  /* Verify the code addr is 8-byte aligned. */
31232bf4136270f100788bcad4edb7d47e1b43df254zliu  vassert((((Addr)code) & 7) == 0);
3130de80192f57cd132b31b233c65734de04939ce65sewardj
3140de80192f57cd132b31b233c65734de04939ce65sewardj  /* Get the instruction bundle. */
3150de80192f57cd132b31b233c65734de04939ce65sewardj  cins = *((ULong *)(Addr) code);
3160de80192f57cd132b31b233c65734de04939ce65sewardj
3170de80192f57cd132b31b233c65734de04939ce65sewardj  /* "Special" instructions. */
3180de80192f57cd132b31b233c65734de04939ce65sewardj  /* Spot the 16-byte preamble:   ****tilegx****
3190de80192f57cd132b31b233c65734de04939ce65sewardj     0:02b3c7ff91234fff { moveli zero, 4660 ; moveli zero, 22136 }
3200de80192f57cd132b31b233c65734de04939ce65sewardj     8:0091a7ff95678fff { moveli zero, 22136 ; moveli zero, 4660 }
3210de80192f57cd132b31b233c65734de04939ce65sewardj  */
3220de80192f57cd132b31b233c65734de04939ce65sewardj#define CL_W0 0x02b3c7ff91234fffULL
3230de80192f57cd132b31b233c65734de04939ce65sewardj#define CL_W1 0x0091a7ff95678fffULL
3240de80192f57cd132b31b233c65734de04939ce65sewardj
3250de80192f57cd132b31b233c65734de04939ce65sewardj  if (*((ULong*)(Addr)(code)) == CL_W0 &&
3260de80192f57cd132b31b233c65734de04939ce65sewardj      *((ULong*)(Addr)(code + 8)) == CL_W1) {
3270de80192f57cd132b31b233c65734de04939ce65sewardj    /* Got a "Special" instruction preamble.  Which one is it? */
3280de80192f57cd132b31b233c65734de04939ce65sewardj    if (*((ULong*)(Addr)(code + 16)) ==
3290de80192f57cd132b31b233c65734de04939ce65sewardj        0x283a69a6d1483000ULL /* or r13, r13, r13 */ ) {
3300de80192f57cd132b31b233c65734de04939ce65sewardj      /* r0 = client_request ( r12 ) */
3310de80192f57cd132b31b233c65734de04939ce65sewardj      DIP("r0 = client_request ( r12 )\n");
3320de80192f57cd132b31b233c65734de04939ce65sewardj
3330de80192f57cd132b31b233c65734de04939ce65sewardj      putPC(mkU64(guest_PC_curr_instr + 24));
3340de80192f57cd132b31b233c65734de04939ce65sewardj
3350de80192f57cd132b31b233c65734de04939ce65sewardj      dres.jk_StopHere = Ijk_ClientReq;
3360de80192f57cd132b31b233c65734de04939ce65sewardj      dres.whatNext = Dis_StopHere;
3370de80192f57cd132b31b233c65734de04939ce65sewardj      dres.len = 24;
3380de80192f57cd132b31b233c65734de04939ce65sewardj      goto decode_success;
3390de80192f57cd132b31b233c65734de04939ce65sewardj
3400de80192f57cd132b31b233c65734de04939ce65sewardj    } else if (*((ULong*)(Addr)(code + 16)) ==
3410de80192f57cd132b31b233c65734de04939ce65sewardj               0x283a71c751483000ULL /* or r14, r14, r14 */ ) {
3420de80192f57cd132b31b233c65734de04939ce65sewardj      /* r11 = guest_NRADDR */
3430de80192f57cd132b31b233c65734de04939ce65sewardj      DIP("r11 = guest_NRADDR\n");
3440de80192f57cd132b31b233c65734de04939ce65sewardj      dres.len = 24;
3450de80192f57cd132b31b233c65734de04939ce65sewardj      putIReg(11, IRExpr_Get(offsetof(VexGuestTILEGXState, guest_NRADDR),
3460de80192f57cd132b31b233c65734de04939ce65sewardj                             Ity_I64));
3470de80192f57cd132b31b233c65734de04939ce65sewardj      putPC(mkU64(guest_PC_curr_instr + 8));
3480de80192f57cd132b31b233c65734de04939ce65sewardj      goto decode_success;
3490de80192f57cd132b31b233c65734de04939ce65sewardj
3500de80192f57cd132b31b233c65734de04939ce65sewardj    } else if (*((ULong*)(Addr)(code + 16)) ==
3510de80192f57cd132b31b233c65734de04939ce65sewardj               0x283a79e7d1483000ULL  /* or r15, r15, r15 */ ) {
3520de80192f57cd132b31b233c65734de04939ce65sewardj      /*  branch-and-link-to-noredir r12 */
3530de80192f57cd132b31b233c65734de04939ce65sewardj      DIP("branch-and-link-to-noredir r12\n");
3540de80192f57cd132b31b233c65734de04939ce65sewardj      dres.len = 24;
3550de80192f57cd132b31b233c65734de04939ce65sewardj      putIReg(55, mkU64(guest_PC_curr_instr + 24));
3560de80192f57cd132b31b233c65734de04939ce65sewardj
3570de80192f57cd132b31b233c65734de04939ce65sewardj      putPC(getIReg(12));
3580de80192f57cd132b31b233c65734de04939ce65sewardj
3590de80192f57cd132b31b233c65734de04939ce65sewardj      dres.jk_StopHere = Ijk_NoRedir;
3600de80192f57cd132b31b233c65734de04939ce65sewardj      dres.whatNext = Dis_StopHere;
3610de80192f57cd132b31b233c65734de04939ce65sewardj      goto decode_success;
3620de80192f57cd132b31b233c65734de04939ce65sewardj
3630de80192f57cd132b31b233c65734de04939ce65sewardj    }  else if (*((ULong*)(Addr)(code + 16)) ==
3640de80192f57cd132b31b233c65734de04939ce65sewardj                0x283a5965d1483000ULL  /* or r11, r11, r11 */ ) {
3650de80192f57cd132b31b233c65734de04939ce65sewardj      /*  vex-inject-ir */
3660de80192f57cd132b31b233c65734de04939ce65sewardj      DIP("vex-inject-ir\n");
3670de80192f57cd132b31b233c65734de04939ce65sewardj      dres.len = 24;
3680de80192f57cd132b31b233c65734de04939ce65sewardj
3690de80192f57cd132b31b233c65734de04939ce65sewardj      vex_inject_ir(irsb, Iend_LE);
3700de80192f57cd132b31b233c65734de04939ce65sewardj
3710de80192f57cd132b31b233c65734de04939ce65sewardj      stmt(IRStmt_Put(offsetof(VexGuestTILEGXState, guest_CMSTART),
3720de80192f57cd132b31b233c65734de04939ce65sewardj                      mkU64(guest_PC_curr_instr)));
3730de80192f57cd132b31b233c65734de04939ce65sewardj      stmt(IRStmt_Put(offsetof(VexGuestTILEGXState, guest_CMLEN),
3740de80192f57cd132b31b233c65734de04939ce65sewardj                      mkU64(24)));
3750de80192f57cd132b31b233c65734de04939ce65sewardj
3760de80192f57cd132b31b233c65734de04939ce65sewardj      /* 2 + 1 = 3 bundles. 24 bytes. */
3770de80192f57cd132b31b233c65734de04939ce65sewardj      putPC(mkU64(guest_PC_curr_instr + 24));
3780de80192f57cd132b31b233c65734de04939ce65sewardj
3790de80192f57cd132b31b233c65734de04939ce65sewardj      dres.jk_StopHere = Ijk_InvalICache;
3800de80192f57cd132b31b233c65734de04939ce65sewardj      dres.whatNext = Dis_StopHere;
3810de80192f57cd132b31b233c65734de04939ce65sewardj      goto decode_success;
3820de80192f57cd132b31b233c65734de04939ce65sewardj    }
3830de80192f57cd132b31b233c65734de04939ce65sewardj
3840de80192f57cd132b31b233c65734de04939ce65sewardj    /* We don't expect this. */
3850de80192f57cd132b31b233c65734de04939ce65sewardj    vex_printf("%s: unexpect special bundles at %lx\n",
3860de80192f57cd132b31b233c65734de04939ce65sewardj               __func__, (Addr)guest_PC_curr_instr);
3870de80192f57cd132b31b233c65734de04939ce65sewardj    delta += 16;
3880de80192f57cd132b31b233c65734de04939ce65sewardj    goto decode_failure;
3890de80192f57cd132b31b233c65734de04939ce65sewardj    /*NOTREACHED*/
3900de80192f57cd132b31b233c65734de04939ce65sewardj  }
3910de80192f57cd132b31b233c65734de04939ce65sewardj
3920de80192f57cd132b31b233c65734de04939ce65sewardj  /* To decode the given instruction bundle. */
3930de80192f57cd132b31b233c65734de04939ce65sewardj  nr_insn = parse_insn_tilegx((tilegx_bundle_bits)cins,
39432bf4136270f100788bcad4edb7d47e1b43df254zliu                              (ULong)(Addr)code,
3950de80192f57cd132b31b233c65734de04939ce65sewardj                              decoded);
3960de80192f57cd132b31b233c65734de04939ce65sewardj
3970de80192f57cd132b31b233c65734de04939ce65sewardj  if (vex_traceflags & VEX_TRACE_FE)
39832bf4136270f100788bcad4edb7d47e1b43df254zliu    decode_and_display(&cins, 1, (ULong)(Addr)code);
3990de80192f57cd132b31b233c65734de04939ce65sewardj
4000de80192f57cd132b31b233c65734de04939ce65sewardj  /* Init. rb_wb_index */
4010de80192f57cd132b31b233c65734de04939ce65sewardj  rd_wb_index = 0;
4020de80192f57cd132b31b233c65734de04939ce65sewardj
4030de80192f57cd132b31b233c65734de04939ce65sewardj  steering_pc = -1ULL;
4040de80192f57cd132b31b233c65734de04939ce65sewardj
4050de80192f57cd132b31b233c65734de04939ce65sewardj  for (n = 0; n < nr_insn; n++) {
4060de80192f57cd132b31b233c65734de04939ce65sewardj    opcode = decoded[n].opcode->mnemonic;
4070de80192f57cd132b31b233c65734de04939ce65sewardj    Int opi;
4080de80192f57cd132b31b233c65734de04939ce65sewardj
4090de80192f57cd132b31b233c65734de04939ce65sewardj    rd = ra = rb = -1;
4100de80192f57cd132b31b233c65734de04939ce65sewardj    opd[0] = opd[1] = opd[2] = opd[3] = -1;
4110de80192f57cd132b31b233c65734de04939ce65sewardj    opd_dst_map = 0;
4120de80192f57cd132b31b233c65734de04939ce65sewardj    opd_src_map = 0;
4130de80192f57cd132b31b233c65734de04939ce65sewardj    opd_imm_map = 0;
4140de80192f57cd132b31b233c65734de04939ce65sewardj
4150de80192f57cd132b31b233c65734de04939ce65sewardj    for (opi = 0; opi < decoded[n].opcode->num_operands; opi++) {
4160de80192f57cd132b31b233c65734de04939ce65sewardj      const struct tilegx_operand *op = decoded[n].operands[opi];
4170de80192f57cd132b31b233c65734de04939ce65sewardj      opd[opi] = decoded[n].operand_values[opi];
4180de80192f57cd132b31b233c65734de04939ce65sewardj
4190de80192f57cd132b31b233c65734de04939ce65sewardj      /* Set the operands. rd, ra, rb and imm. */
4200de80192f57cd132b31b233c65734de04939ce65sewardj      if (opi < 3) {
4210de80192f57cd132b31b233c65734de04939ce65sewardj        if (op->is_dest_reg) {
4220de80192f57cd132b31b233c65734de04939ce65sewardj          if (rd == -1)
4230de80192f57cd132b31b233c65734de04939ce65sewardj            rd =  decoded[n].operand_values[opi];
4240de80192f57cd132b31b233c65734de04939ce65sewardj          else if (ra == -1)
4250de80192f57cd132b31b233c65734de04939ce65sewardj            ra =  decoded[n].operand_values[opi];
4260de80192f57cd132b31b233c65734de04939ce65sewardj        } else if (op->is_src_reg) {
4270de80192f57cd132b31b233c65734de04939ce65sewardj          if (ra == -1) {
4280de80192f57cd132b31b233c65734de04939ce65sewardj            ra = decoded[n].operand_values[opi];
4290de80192f57cd132b31b233c65734de04939ce65sewardj          } else if(rb == -1) {
4300de80192f57cd132b31b233c65734de04939ce65sewardj            rb = decoded[n].operand_values[opi];
4310de80192f57cd132b31b233c65734de04939ce65sewardj          } else {
4320de80192f57cd132b31b233c65734de04939ce65sewardj            vassert(0);
4330de80192f57cd132b31b233c65734de04939ce65sewardj          }
4340de80192f57cd132b31b233c65734de04939ce65sewardj        } else {
4350de80192f57cd132b31b233c65734de04939ce65sewardj          imm = decoded[n].operand_values[opi];
4360de80192f57cd132b31b233c65734de04939ce65sewardj        }
4370de80192f57cd132b31b233c65734de04939ce65sewardj      }
4380de80192f57cd132b31b233c65734de04939ce65sewardj
4390de80192f57cd132b31b233c65734de04939ce65sewardj      /* Build bit maps of used dest, source registers
4400de80192f57cd132b31b233c65734de04939ce65sewardj         and immediate. */
4410de80192f57cd132b31b233c65734de04939ce65sewardj      if (op->is_dest_reg) {
4420de80192f57cd132b31b233c65734de04939ce65sewardj        opd_dst_map |= 1ULL << opi;
4430de80192f57cd132b31b233c65734de04939ce65sewardj        if(op->is_src_reg)
4440de80192f57cd132b31b233c65734de04939ce65sewardj          opd_src_map |= 1ULL << opi;
4450de80192f57cd132b31b233c65734de04939ce65sewardj      } else if(op->is_src_reg) {
4460de80192f57cd132b31b233c65734de04939ce65sewardj        opd_src_map |= 1ULL << opi;
4470de80192f57cd132b31b233c65734de04939ce65sewardj      } else {
4480de80192f57cd132b31b233c65734de04939ce65sewardj        opd_imm_map |= 1ULL << opi;
4490de80192f57cd132b31b233c65734de04939ce65sewardj      }
4500de80192f57cd132b31b233c65734de04939ce65sewardj    }
4510de80192f57cd132b31b233c65734de04939ce65sewardj
4520de80192f57cd132b31b233c65734de04939ce65sewardj    use_dirty_helper = 0;
4530de80192f57cd132b31b233c65734de04939ce65sewardj
4540de80192f57cd132b31b233c65734de04939ce65sewardj    switch (opcode) {
4550de80192f57cd132b31b233c65734de04939ce65sewardj    case 0:  /* "bpt" */  /* "raise" */
4560de80192f57cd132b31b233c65734de04939ce65sewardj      /* "bpt" pseudo instruction is an illegal instruction */
4570de80192f57cd132b31b233c65734de04939ce65sewardj      opd_imm_map |= (1 << 0);
4580de80192f57cd132b31b233c65734de04939ce65sewardj      opd[0] = cins;
4590de80192f57cd132b31b233c65734de04939ce65sewardj      use_dirty_helper = 1;
4600de80192f57cd132b31b233c65734de04939ce65sewardj      break;
4610de80192f57cd132b31b233c65734de04939ce65sewardj    case 1:  /* "info" */   /* Ignore this instruction. */
4620de80192f57cd132b31b233c65734de04939ce65sewardj      break;
4630de80192f57cd132b31b233c65734de04939ce65sewardj    case 2:  /* "infol" */   /* Ignore this instruction. */
4640de80192f57cd132b31b233c65734de04939ce65sewardj      break;
4650de80192f57cd132b31b233c65734de04939ce65sewardj    case 3:  /* "ld4s_tls" */   /* Ignore this instruction. */
4660de80192f57cd132b31b233c65734de04939ce65sewardj      break;
4670de80192f57cd132b31b233c65734de04939ce65sewardj    case 4:  /* "ld_tls" */    /* Ignore this instruction. */
4680de80192f57cd132b31b233c65734de04939ce65sewardj      break;
4690de80192f57cd132b31b233c65734de04939ce65sewardj    case 5:  /* "move" */
4700de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
4710de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, getIReg(ra));
4720de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
4730de80192f57cd132b31b233c65734de04939ce65sewardj      break;
4740de80192f57cd132b31b233c65734de04939ce65sewardj    case 6:  /* "movei" */
4750de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
4760de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, mkU64(extend_s_8to64(imm)));
4770de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
4780de80192f57cd132b31b233c65734de04939ce65sewardj      break;
4790de80192f57cd132b31b233c65734de04939ce65sewardj    case 7:  /* "moveli" */
4800de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
4810de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, mkU64(extend_s_16to64(imm)));
4820de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
4830de80192f57cd132b31b233c65734de04939ce65sewardj      break;
4840de80192f57cd132b31b233c65734de04939ce65sewardj    case 8:  /* "prefetch" */   /* Ignore. */
4850de80192f57cd132b31b233c65734de04939ce65sewardj      break;
4860de80192f57cd132b31b233c65734de04939ce65sewardj    case 9:  /* "prefetch_add_l1" */   /* Ignore. */
4870de80192f57cd132b31b233c65734de04939ce65sewardj      break;
4880de80192f57cd132b31b233c65734de04939ce65sewardj    case 10: /* "prefetch_add_l1_fault" */   /* Ignore. */
4890de80192f57cd132b31b233c65734de04939ce65sewardj      break;
4900de80192f57cd132b31b233c65734de04939ce65sewardj    case 11: /* "prefetch_add_l2" */   /* Ignore. */
4910de80192f57cd132b31b233c65734de04939ce65sewardj      break;
4920de80192f57cd132b31b233c65734de04939ce65sewardj    case 12: /* "prefetch_add_l2_fault" */   /* Ignore. */
4930de80192f57cd132b31b233c65734de04939ce65sewardj      break;
4940de80192f57cd132b31b233c65734de04939ce65sewardj    case 13: /* "prefetch_add_l3" */   /* Ignore. */
4950de80192f57cd132b31b233c65734de04939ce65sewardj      break;
4960de80192f57cd132b31b233c65734de04939ce65sewardj    case 14: /* "prefetch_add_l3_fault" */   /* Ignore. */
4970de80192f57cd132b31b233c65734de04939ce65sewardj      break;
4980de80192f57cd132b31b233c65734de04939ce65sewardj    case 15: /* "prefetch_l1" */  /* Ignore. */
4990de80192f57cd132b31b233c65734de04939ce65sewardj      break;
5000de80192f57cd132b31b233c65734de04939ce65sewardj    case 16: /* "prefetch_l1_fault" */   /* Ignore. */
5010de80192f57cd132b31b233c65734de04939ce65sewardj      break;
5020de80192f57cd132b31b233c65734de04939ce65sewardj    case 17: /* "prefetch_l2" */   /* Ignore. */
5030de80192f57cd132b31b233c65734de04939ce65sewardj      break;
5040de80192f57cd132b31b233c65734de04939ce65sewardj    case 18: /* "prefetch_l2_fault" */   /* Ignore. */
5050de80192f57cd132b31b233c65734de04939ce65sewardj      break;
5060de80192f57cd132b31b233c65734de04939ce65sewardj    case 19: /* "prefetch_l3" */   /* Ignore. */
5070de80192f57cd132b31b233c65734de04939ce65sewardj      break;
5080de80192f57cd132b31b233c65734de04939ce65sewardj    case 20: /* "prefetch_l3_fault" */   /* Ignore. */
5090de80192f57cd132b31b233c65734de04939ce65sewardj      break;
5100de80192f57cd132b31b233c65734de04939ce65sewardj    case 21: /* "raise" */
5110de80192f57cd132b31b233c65734de04939ce65sewardj      /* "raise" pseudo instruction is an illegal instruction plusing
5120de80192f57cd132b31b233c65734de04939ce65sewardj         a "moveli zero, <sig>", so we need save whole bundle in the
5130de80192f57cd132b31b233c65734de04939ce65sewardj         opd[0], which will be used in the dirty helper. */
5140de80192f57cd132b31b233c65734de04939ce65sewardj      opd_imm_map |= (1 << 0);
5150de80192f57cd132b31b233c65734de04939ce65sewardj      opd[0] = cins;
5160de80192f57cd132b31b233c65734de04939ce65sewardj      use_dirty_helper = 1;
5170de80192f57cd132b31b233c65734de04939ce65sewardj      break;
5180de80192f57cd132b31b233c65734de04939ce65sewardj    case 22: /* "add" */
5190de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
5200de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Add64, getIReg(ra), getIReg(rb)));
5210de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
5220de80192f57cd132b31b233c65734de04939ce65sewardj      break;
5230de80192f57cd132b31b233c65734de04939ce65sewardj    case 23: /* "addi" */
5240de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
5250de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Add64, getIReg(ra),
5260de80192f57cd132b31b233c65734de04939ce65sewardj                       mkU64(extend_s_8to64(imm))));
5270de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
5280de80192f57cd132b31b233c65734de04939ce65sewardj      break;
5290de80192f57cd132b31b233c65734de04939ce65sewardj    case 24: /* "addli" */
5300de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
5310de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Add64, getIReg(ra),
5320de80192f57cd132b31b233c65734de04939ce65sewardj                       mkU64(extend_s_16to64(imm))));
5330de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
5340de80192f57cd132b31b233c65734de04939ce65sewardj      break;
5350de80192f57cd132b31b233c65734de04939ce65sewardj    case 25: /* "addx" */
5360de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
5370de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, signExtend(binop(Iop_Add32,
5380de80192f57cd132b31b233c65734de04939ce65sewardj                                  narrowTo(Ity_I32, getIReg(ra)),
5390de80192f57cd132b31b233c65734de04939ce65sewardj                                  narrowTo(Ity_I32, getIReg(rb))),
5400de80192f57cd132b31b233c65734de04939ce65sewardj                            32));
5410de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
5420de80192f57cd132b31b233c65734de04939ce65sewardj      break;
5430de80192f57cd132b31b233c65734de04939ce65sewardj    case 26: /* "addxi" */
5440de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
5450de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, signExtend(binop(Iop_Add32,
5460de80192f57cd132b31b233c65734de04939ce65sewardj                                  narrowTo(Ity_I32, getIReg(ra)),
5470de80192f57cd132b31b233c65734de04939ce65sewardj                                  mkU32(imm)), 32));
5480de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
5490de80192f57cd132b31b233c65734de04939ce65sewardj      break;
5500de80192f57cd132b31b233c65734de04939ce65sewardj    case 27: /* "addxli" */
5510de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
5520de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, signExtend(binop(Iop_Add32,
5530de80192f57cd132b31b233c65734de04939ce65sewardj                                  narrowTo(Ity_I32, getIReg(ra)),
5540de80192f57cd132b31b233c65734de04939ce65sewardj                                  mkU32(imm)), 32));
5550de80192f57cd132b31b233c65734de04939ce65sewardj
5560de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
5570de80192f57cd132b31b233c65734de04939ce65sewardj      break;
5580de80192f57cd132b31b233c65734de04939ce65sewardj    case 28: /* "addxsc" */
5590de80192f57cd132b31b233c65734de04939ce65sewardj      use_dirty_helper = 1;
5600de80192f57cd132b31b233c65734de04939ce65sewardj      break;
5610de80192f57cd132b31b233c65734de04939ce65sewardj    case 29: /* "and" */
5620de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
5630de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_And64, getIReg(ra), getIReg(rb)));
5640de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
5650de80192f57cd132b31b233c65734de04939ce65sewardj      break;
5660de80192f57cd132b31b233c65734de04939ce65sewardj    case 30: /* "andi" */
5670de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
5680de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_And64, getIReg(ra),
5690de80192f57cd132b31b233c65734de04939ce65sewardj                       mkU64(extend_s_8to64(imm))));
5700de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
5710de80192f57cd132b31b233c65734de04939ce65sewardj      break;
5720de80192f57cd132b31b233c65734de04939ce65sewardj    case 31: /* "beqz" */
5730de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
5740de80192f57cd132b31b233c65734de04939ce65sewardj    case 32:
5750de80192f57cd132b31b233c65734de04939ce65sewardj      /* "beqzt" */
5760de80192f57cd132b31b233c65734de04939ce65sewardj      bstmt = dis_branch(binop(Iop_CmpEQ64, getIReg(ra), mkU64(0)),
5770de80192f57cd132b31b233c65734de04939ce65sewardj                         imm);
5780de80192f57cd132b31b233c65734de04939ce65sewardj      break;
5790de80192f57cd132b31b233c65734de04939ce65sewardj    case 33: /* "bfexts" */
5800de80192f57cd132b31b233c65734de04939ce65sewardj      {
5810de80192f57cd132b31b233c65734de04939ce65sewardj        ULong imm0 = decoded[n].operand_values[3];
5820de80192f57cd132b31b233c65734de04939ce65sewardj        ULong mask = ((-1ULL) ^ ((-1ULL << ((imm0 - imm) & 63)) << 1));
5830de80192f57cd132b31b233c65734de04939ce65sewardj        t0 = newTemp(Ity_I64);
5840de80192f57cd132b31b233c65734de04939ce65sewardj        t2 = newTemp(Ity_I64);
5850de80192f57cd132b31b233c65734de04939ce65sewardj        assign(t0, binop(Iop_Xor64,
5860de80192f57cd132b31b233c65734de04939ce65sewardj                         binop(Iop_Sub64,
5870de80192f57cd132b31b233c65734de04939ce65sewardj                               binop(Iop_And64,
5880de80192f57cd132b31b233c65734de04939ce65sewardj                                     binop(Iop_Shr64,
5890de80192f57cd132b31b233c65734de04939ce65sewardj                                           getIReg(ra),
5900de80192f57cd132b31b233c65734de04939ce65sewardj                                           mkU8(imm0)),
5910de80192f57cd132b31b233c65734de04939ce65sewardj                                     mkU64(1)),
5920de80192f57cd132b31b233c65734de04939ce65sewardj                               mkU64(1)),
5930de80192f57cd132b31b233c65734de04939ce65sewardj                         mkU64(-1ULL)));
5940de80192f57cd132b31b233c65734de04939ce65sewardj        assign(t2,
5950de80192f57cd132b31b233c65734de04939ce65sewardj               binop(Iop_Or64,
5960de80192f57cd132b31b233c65734de04939ce65sewardj                     binop(Iop_And64,
5970de80192f57cd132b31b233c65734de04939ce65sewardj                           binop(Iop_Or64,
5980de80192f57cd132b31b233c65734de04939ce65sewardj                                 binop(Iop_Shr64,
5990de80192f57cd132b31b233c65734de04939ce65sewardj                                       getIReg(ra),
6000de80192f57cd132b31b233c65734de04939ce65sewardj                                       mkU8(imm)),
6010de80192f57cd132b31b233c65734de04939ce65sewardj                                 binop(Iop_Shl64,
6020de80192f57cd132b31b233c65734de04939ce65sewardj                                       getIReg(ra),
6030de80192f57cd132b31b233c65734de04939ce65sewardj                                       mkU8(64 - imm))),
6040de80192f57cd132b31b233c65734de04939ce65sewardj                           mkU64(mask)),
6050de80192f57cd132b31b233c65734de04939ce65sewardj                     binop(Iop_And64,
6060de80192f57cd132b31b233c65734de04939ce65sewardj                           mkexpr(t0),
6070de80192f57cd132b31b233c65734de04939ce65sewardj                           mkU64(~mask))));
6080de80192f57cd132b31b233c65734de04939ce65sewardj
6090de80192f57cd132b31b233c65734de04939ce65sewardj        MARK_REG_WB(rd, t2);
6100de80192f57cd132b31b233c65734de04939ce65sewardj      }
6110de80192f57cd132b31b233c65734de04939ce65sewardj      break;
6120de80192f57cd132b31b233c65734de04939ce65sewardj    case 34:  /* "bfextu" */
6130de80192f57cd132b31b233c65734de04939ce65sewardj      {
6140de80192f57cd132b31b233c65734de04939ce65sewardj        ULong imm0 = decoded[n].operand_values[3];
6150de80192f57cd132b31b233c65734de04939ce65sewardj        ULong mask = 0;
6160de80192f57cd132b31b233c65734de04939ce65sewardj        t2 = newTemp(Ity_I64);
6170de80192f57cd132b31b233c65734de04939ce65sewardj        mask = ((-1ULL) ^ ((-1ULL << ((imm0 - imm) & 63)) << 1));
6180de80192f57cd132b31b233c65734de04939ce65sewardj
6190de80192f57cd132b31b233c65734de04939ce65sewardj        assign(t2,
6200de80192f57cd132b31b233c65734de04939ce65sewardj               binop(Iop_And64,
6210de80192f57cd132b31b233c65734de04939ce65sewardj                     binop(Iop_Or64,
6220de80192f57cd132b31b233c65734de04939ce65sewardj                           binop(Iop_Shr64,
6230de80192f57cd132b31b233c65734de04939ce65sewardj                                 getIReg(ra),
6240de80192f57cd132b31b233c65734de04939ce65sewardj                                 mkU8(imm)),
6250de80192f57cd132b31b233c65734de04939ce65sewardj                           binop(Iop_Shl64,
6260de80192f57cd132b31b233c65734de04939ce65sewardj                                 getIReg(ra),
6270de80192f57cd132b31b233c65734de04939ce65sewardj                                 mkU8(64 - imm))),
6280de80192f57cd132b31b233c65734de04939ce65sewardj                     mkU64(mask)));
6290de80192f57cd132b31b233c65734de04939ce65sewardj        MARK_REG_WB(rd, t2);
6300de80192f57cd132b31b233c65734de04939ce65sewardj      }
6310de80192f57cd132b31b233c65734de04939ce65sewardj      break;
6320de80192f57cd132b31b233c65734de04939ce65sewardj    case 35:  /* "bfins" */
6330de80192f57cd132b31b233c65734de04939ce65sewardj      {
6340de80192f57cd132b31b233c65734de04939ce65sewardj        ULong mask;
6350de80192f57cd132b31b233c65734de04939ce65sewardj        ULong imm0 = decoded[n].operand_values[3];
6360de80192f57cd132b31b233c65734de04939ce65sewardj        t0 = newTemp(Ity_I64);
6370de80192f57cd132b31b233c65734de04939ce65sewardj        t2 = newTemp(Ity_I64);
6380de80192f57cd132b31b233c65734de04939ce65sewardj        if (imm <= imm0)
6390de80192f57cd132b31b233c65734de04939ce65sewardj        {
6400de80192f57cd132b31b233c65734de04939ce65sewardj          mask = ((-1ULL << imm) ^ ((-1ULL << imm0) << 1));
6410de80192f57cd132b31b233c65734de04939ce65sewardj        }
6420de80192f57cd132b31b233c65734de04939ce65sewardj        else
6430de80192f57cd132b31b233c65734de04939ce65sewardj        {
6440de80192f57cd132b31b233c65734de04939ce65sewardj          mask = ((-1ULL << imm) | (-1ULL >> (63 - imm0)));
6450de80192f57cd132b31b233c65734de04939ce65sewardj        }
6460de80192f57cd132b31b233c65734de04939ce65sewardj
6470de80192f57cd132b31b233c65734de04939ce65sewardj        assign(t0, binop(Iop_Or64,
6480de80192f57cd132b31b233c65734de04939ce65sewardj                         binop(Iop_Shl64,
6490de80192f57cd132b31b233c65734de04939ce65sewardj                               getIReg(ra),
6500de80192f57cd132b31b233c65734de04939ce65sewardj                               mkU8(imm)),
6510de80192f57cd132b31b233c65734de04939ce65sewardj                         binop(Iop_Shr64,
6520de80192f57cd132b31b233c65734de04939ce65sewardj                               getIReg(ra),
6530de80192f57cd132b31b233c65734de04939ce65sewardj                               mkU8(64 - imm))));
6540de80192f57cd132b31b233c65734de04939ce65sewardj
6550de80192f57cd132b31b233c65734de04939ce65sewardj        assign(t2, binop(Iop_Or64,
6560de80192f57cd132b31b233c65734de04939ce65sewardj                         binop(Iop_And64,
6570de80192f57cd132b31b233c65734de04939ce65sewardj                               mkexpr(t0),
6580de80192f57cd132b31b233c65734de04939ce65sewardj                               mkU64(mask)),
6590de80192f57cd132b31b233c65734de04939ce65sewardj                         binop(Iop_And64,
6600de80192f57cd132b31b233c65734de04939ce65sewardj                               getIReg(rd),
6610de80192f57cd132b31b233c65734de04939ce65sewardj                               mkU64(~mask))));
6620de80192f57cd132b31b233c65734de04939ce65sewardj
6630de80192f57cd132b31b233c65734de04939ce65sewardj        MARK_REG_WB(rd, t2);
6640de80192f57cd132b31b233c65734de04939ce65sewardj      }
6650de80192f57cd132b31b233c65734de04939ce65sewardj      break;
6660de80192f57cd132b31b233c65734de04939ce65sewardj    case 36:  /* "bgez" */
6670de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
6680de80192f57cd132b31b233c65734de04939ce65sewardj    case 37:  /* "bgezt" */
6690de80192f57cd132b31b233c65734de04939ce65sewardj      bstmt = dis_branch(binop(Iop_CmpEQ64,
6700de80192f57cd132b31b233c65734de04939ce65sewardj                               binop(Iop_And64,
6710de80192f57cd132b31b233c65734de04939ce65sewardj                                     getIReg(ra),
6720de80192f57cd132b31b233c65734de04939ce65sewardj                                     mkU64(0x8000000000000000ULL)),
6730de80192f57cd132b31b233c65734de04939ce65sewardj                               mkU64(0x0)),
6740de80192f57cd132b31b233c65734de04939ce65sewardj                         imm);
6750de80192f57cd132b31b233c65734de04939ce65sewardj      break;
6760de80192f57cd132b31b233c65734de04939ce65sewardj    case 38:  /* "bgtz" */
6770de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
6780de80192f57cd132b31b233c65734de04939ce65sewardj    case 39:
6790de80192f57cd132b31b233c65734de04939ce65sewardj      /* "bgtzt" */
6800de80192f57cd132b31b233c65734de04939ce65sewardj      bstmt = dis_branch(unop(Iop_Not1,
6810de80192f57cd132b31b233c65734de04939ce65sewardj                              binop(Iop_CmpLE64S,
6820de80192f57cd132b31b233c65734de04939ce65sewardj                                    getIReg(ra),
6830de80192f57cd132b31b233c65734de04939ce65sewardj                                    mkU64(0))),
6840de80192f57cd132b31b233c65734de04939ce65sewardj                         imm);
6850de80192f57cd132b31b233c65734de04939ce65sewardj      break;
6860de80192f57cd132b31b233c65734de04939ce65sewardj    case 40:  /* "blbc" */
6870de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
6880de80192f57cd132b31b233c65734de04939ce65sewardj    case 41:  /* "blbct" */
6890de80192f57cd132b31b233c65734de04939ce65sewardj      bstmt = dis_branch(unop(Iop_64to1,
6900de80192f57cd132b31b233c65734de04939ce65sewardj                              unop(Iop_Not64, getIReg(ra))),
6910de80192f57cd132b31b233c65734de04939ce65sewardj                         imm);
6920de80192f57cd132b31b233c65734de04939ce65sewardj
6930de80192f57cd132b31b233c65734de04939ce65sewardj      break;
6940de80192f57cd132b31b233c65734de04939ce65sewardj    case 42:  /* "blbs" */
6950de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
6960de80192f57cd132b31b233c65734de04939ce65sewardj    case 43:
6970de80192f57cd132b31b233c65734de04939ce65sewardj      /* "blbst" */
6980de80192f57cd132b31b233c65734de04939ce65sewardj      bstmt = dis_branch(unop(Iop_64to1,
6990de80192f57cd132b31b233c65734de04939ce65sewardj                              getIReg(ra)),
7000de80192f57cd132b31b233c65734de04939ce65sewardj                         imm);
7010de80192f57cd132b31b233c65734de04939ce65sewardj      break;
7020de80192f57cd132b31b233c65734de04939ce65sewardj    case 44:  /* "blez" */
7030de80192f57cd132b31b233c65734de04939ce65sewardj      bstmt = dis_branch(binop(Iop_CmpLE64S, getIReg(ra),
7040de80192f57cd132b31b233c65734de04939ce65sewardj                               mkU64(0)),
7050de80192f57cd132b31b233c65734de04939ce65sewardj                         imm);
7060de80192f57cd132b31b233c65734de04939ce65sewardj      break;
7070de80192f57cd132b31b233c65734de04939ce65sewardj    case 45:  /* "blezt" */
7080de80192f57cd132b31b233c65734de04939ce65sewardj      bstmt = dis_branch(binop(Iop_CmpLE64S, getIReg(ra),
7090de80192f57cd132b31b233c65734de04939ce65sewardj                               mkU64(0)),
7100de80192f57cd132b31b233c65734de04939ce65sewardj                         imm);
7110de80192f57cd132b31b233c65734de04939ce65sewardj      break;
7120de80192f57cd132b31b233c65734de04939ce65sewardj    case 46:  /* "bltz" */
7130de80192f57cd132b31b233c65734de04939ce65sewardj      bstmt = dis_branch(binop(Iop_CmpLT64S, getIReg(ra),
7140de80192f57cd132b31b233c65734de04939ce65sewardj                               mkU64(0)),
7150de80192f57cd132b31b233c65734de04939ce65sewardj                         imm);
7160de80192f57cd132b31b233c65734de04939ce65sewardj      break;
7170de80192f57cd132b31b233c65734de04939ce65sewardj    case 47:  /* "bltzt" */
7180de80192f57cd132b31b233c65734de04939ce65sewardj      bstmt = dis_branch(binop(Iop_CmpLT64S, getIReg(ra),
7190de80192f57cd132b31b233c65734de04939ce65sewardj                               mkU64(0)),
7200de80192f57cd132b31b233c65734de04939ce65sewardj                         imm);
7210de80192f57cd132b31b233c65734de04939ce65sewardj      break;
7220de80192f57cd132b31b233c65734de04939ce65sewardj    case 48:  /* "bnez" */
7230de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
7240de80192f57cd132b31b233c65734de04939ce65sewardj    case 49:
7250de80192f57cd132b31b233c65734de04939ce65sewardj      /* "bnezt" */
7260de80192f57cd132b31b233c65734de04939ce65sewardj      bstmt = dis_branch(binop(Iop_CmpNE64, getIReg(ra),
7270de80192f57cd132b31b233c65734de04939ce65sewardj                               mkU64(0)),
7280de80192f57cd132b31b233c65734de04939ce65sewardj                         imm);
7290de80192f57cd132b31b233c65734de04939ce65sewardj      break;
7300de80192f57cd132b31b233c65734de04939ce65sewardj    case 50:  /* "clz" */
7310de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
7320de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, unop(Iop_Clz64, getIReg(ra)));
7330de80192f57cd132b31b233c65734de04939ce65sewardj
7340de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
7350de80192f57cd132b31b233c65734de04939ce65sewardj      break;
7360de80192f57cd132b31b233c65734de04939ce65sewardj    case 51:  /* "cmoveqz rd, ra, rb" */
7370de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
7380de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, IRExpr_ITE(binop(Iop_CmpEQ64, getIReg(ra), mkU64(0)),
7390de80192f57cd132b31b233c65734de04939ce65sewardj                            getIReg(rb), getIReg(rd)));
7400de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
7410de80192f57cd132b31b233c65734de04939ce65sewardj      break;
7420de80192f57cd132b31b233c65734de04939ce65sewardj    case 52:  /* "cmovnez" */
7430de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
7440de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, IRExpr_ITE(binop(Iop_CmpEQ64, getIReg(ra), mkU64(0)),
7450de80192f57cd132b31b233c65734de04939ce65sewardj                            getIReg(rd), getIReg(rb)));
7460de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
7470de80192f57cd132b31b233c65734de04939ce65sewardj      break;
7480de80192f57cd132b31b233c65734de04939ce65sewardj    case 53:  /* "cmpeq" */
7490de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
7500de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2,  unop(Iop_1Uto64, binop(Iop_CmpEQ64,
7510de80192f57cd132b31b233c65734de04939ce65sewardj                                         getIReg(ra), getIReg(rb))));
7520de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
7530de80192f57cd132b31b233c65734de04939ce65sewardj      break;
7540de80192f57cd132b31b233c65734de04939ce65sewardj
7550de80192f57cd132b31b233c65734de04939ce65sewardj    case 54:  /* "cmpeqi" */
7560de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
7570de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, unop(Iop_1Uto64, binop(Iop_CmpEQ64,
7580de80192f57cd132b31b233c65734de04939ce65sewardj                                        getIReg(ra),
7590de80192f57cd132b31b233c65734de04939ce65sewardj                                        mkU64(extend_s_8to64(imm)))));
7600de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
7610de80192f57cd132b31b233c65734de04939ce65sewardj      break;
7620de80192f57cd132b31b233c65734de04939ce65sewardj    case 55:  /* "cmpexch" */
7630de80192f57cd132b31b233c65734de04939ce65sewardj      t1 = newTemp(Ity_I64);
7640de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
7650de80192f57cd132b31b233c65734de04939ce65sewardj
7660de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t1, getIReg(rb));
7670de80192f57cd132b31b233c65734de04939ce65sewardj      stmt( IRStmt_CAS(mkIRCAS(IRTemp_INVALID, t2, Iend_LE,
7680de80192f57cd132b31b233c65734de04939ce65sewardj                               getIReg(ra),
7690de80192f57cd132b31b233c65734de04939ce65sewardj                               NULL, binop(Iop_Add64,
7700de80192f57cd132b31b233c65734de04939ce65sewardj                                           getIReg(70),
7710de80192f57cd132b31b233c65734de04939ce65sewardj                                           getIReg(71)),
7720de80192f57cd132b31b233c65734de04939ce65sewardj                               NULL, mkexpr(t1))));
7730de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
7740de80192f57cd132b31b233c65734de04939ce65sewardj      break;
7750de80192f57cd132b31b233c65734de04939ce65sewardj    case 56:  /* "cmpexch4" */
7760de80192f57cd132b31b233c65734de04939ce65sewardj      t1 = newTemp(Ity_I32);
7770de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
7780de80192f57cd132b31b233c65734de04939ce65sewardj      t3 = newTemp(Ity_I32);
7790de80192f57cd132b31b233c65734de04939ce65sewardj
7800de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t1, narrowTo(Ity_I32, getIReg(rb)));
7810de80192f57cd132b31b233c65734de04939ce65sewardj      stmt( IRStmt_CAS(mkIRCAS(IRTemp_INVALID, t3, Iend_LE,
7820de80192f57cd132b31b233c65734de04939ce65sewardj                               getIReg(ra),
7830de80192f57cd132b31b233c65734de04939ce65sewardj                               NULL,
7840de80192f57cd132b31b233c65734de04939ce65sewardj                               narrowTo(Ity_I32, binop(Iop_Add64,
7850de80192f57cd132b31b233c65734de04939ce65sewardj                                                       getIReg(70),
7860de80192f57cd132b31b233c65734de04939ce65sewardj                                                       getIReg(71))),
7870de80192f57cd132b31b233c65734de04939ce65sewardj                               NULL,
7880de80192f57cd132b31b233c65734de04939ce65sewardj                               mkexpr(t1))));
7890de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, unop(Iop_32Uto64, mkexpr(t3)));
7900de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
7910de80192f57cd132b31b233c65734de04939ce65sewardj      break;
7920de80192f57cd132b31b233c65734de04939ce65sewardj    case 57:  /* "cmples" */
7930de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
7940de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, unop(Iop_1Uto64,
7950de80192f57cd132b31b233c65734de04939ce65sewardj                      binop(Iop_CmpLE64S, getIReg(ra), getIReg(rb))));
7960de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
7970de80192f57cd132b31b233c65734de04939ce65sewardj      break;
7980de80192f57cd132b31b233c65734de04939ce65sewardj    case 58:  /* "cmpleu" */
7990de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
8000de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2,  unop(Iop_1Uto64,
8010de80192f57cd132b31b233c65734de04939ce65sewardj                       binop(Iop_CmpLE64U, getIReg(ra), getIReg(rb))));
8020de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
8030de80192f57cd132b31b233c65734de04939ce65sewardj      break;
8040de80192f57cd132b31b233c65734de04939ce65sewardj    case 59:  /* "cmplts" */
8050de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
8060de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, unop(Iop_1Uto64,
8070de80192f57cd132b31b233c65734de04939ce65sewardj                      binop(Iop_CmpLT64S, getIReg(ra), getIReg(rb))));
8080de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
8090de80192f57cd132b31b233c65734de04939ce65sewardj      break;
8100de80192f57cd132b31b233c65734de04939ce65sewardj    case 60:  /* "cmpltsi" */
8110de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
8120de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, unop(Iop_1Uto64,
8130de80192f57cd132b31b233c65734de04939ce65sewardj                      binop(Iop_CmpLT64S,
8140de80192f57cd132b31b233c65734de04939ce65sewardj                            getIReg(ra),
8150de80192f57cd132b31b233c65734de04939ce65sewardj                            mkU64(extend_s_8to64(imm)))));
8160de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
8170de80192f57cd132b31b233c65734de04939ce65sewardj      break;
8180de80192f57cd132b31b233c65734de04939ce65sewardj    case 61:
8190de80192f57cd132b31b233c65734de04939ce65sewardj
8200de80192f57cd132b31b233c65734de04939ce65sewardj      /* "cmpltu" */
8210de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
8220de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, unop(Iop_1Uto64,
8230de80192f57cd132b31b233c65734de04939ce65sewardj                      binop(Iop_CmpLT64U, getIReg(ra), getIReg(rb))));
8240de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
8250de80192f57cd132b31b233c65734de04939ce65sewardj
8260de80192f57cd132b31b233c65734de04939ce65sewardj
8270de80192f57cd132b31b233c65734de04939ce65sewardj      break;
8280de80192f57cd132b31b233c65734de04939ce65sewardj    case 62:  /* "cmpltui" */
8290de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
8300de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2,  unop(Iop_1Uto64,
8310de80192f57cd132b31b233c65734de04939ce65sewardj                       binop(Iop_CmpLT64U,
8320de80192f57cd132b31b233c65734de04939ce65sewardj                             getIReg(ra),
8330de80192f57cd132b31b233c65734de04939ce65sewardj                             mkU64(imm))));
8340de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
8350de80192f57cd132b31b233c65734de04939ce65sewardj
8360de80192f57cd132b31b233c65734de04939ce65sewardj
8370de80192f57cd132b31b233c65734de04939ce65sewardj      break;
8380de80192f57cd132b31b233c65734de04939ce65sewardj    case 63:  /* "cmpne" */
8390de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
8400de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, unop(Iop_1Uto64,
8410de80192f57cd132b31b233c65734de04939ce65sewardj                      binop(Iop_CmpNE64, getIReg(ra), getIReg(rb))));
8420de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
8430de80192f57cd132b31b233c65734de04939ce65sewardj
8440de80192f57cd132b31b233c65734de04939ce65sewardj
8450de80192f57cd132b31b233c65734de04939ce65sewardj      break;
8460de80192f57cd132b31b233c65734de04939ce65sewardj    case 64:
8470de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
8480de80192f57cd132b31b233c65734de04939ce65sewardj    case 65:
8490de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
8500de80192f57cd132b31b233c65734de04939ce65sewardj    case 66:
8510de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
8520de80192f57cd132b31b233c65734de04939ce65sewardj    case 67:
8530de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
8540de80192f57cd132b31b233c65734de04939ce65sewardj    case 68:
8550de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
8560de80192f57cd132b31b233c65734de04939ce65sewardj    case 69:
8570de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
8580de80192f57cd132b31b233c65734de04939ce65sewardj    case 70:
8590de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
8600de80192f57cd132b31b233c65734de04939ce65sewardj    case 71:
8610de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
8620de80192f57cd132b31b233c65734de04939ce65sewardj    case 72:
8630de80192f57cd132b31b233c65734de04939ce65sewardj      use_dirty_helper = 1;
8640de80192f57cd132b31b233c65734de04939ce65sewardj      break;
8650de80192f57cd132b31b233c65734de04939ce65sewardj    case 73:  /* "ctz" */
8660de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
8670de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, unop(Iop_Ctz64, getIReg(ra)));
8680de80192f57cd132b31b233c65734de04939ce65sewardj
8690de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
8700de80192f57cd132b31b233c65734de04939ce65sewardj
8710de80192f57cd132b31b233c65734de04939ce65sewardj
8720de80192f57cd132b31b233c65734de04939ce65sewardj      break;
8730de80192f57cd132b31b233c65734de04939ce65sewardj    case 74:  /* "dblalign" */
8740de80192f57cd132b31b233c65734de04939ce65sewardj      t0 = newTemp(Ity_I64);
8750de80192f57cd132b31b233c65734de04939ce65sewardj      t1 = newTemp(Ity_I64);
8760de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
8770de80192f57cd132b31b233c65734de04939ce65sewardj
8780de80192f57cd132b31b233c65734de04939ce65sewardj      /* t0 is the bit shift amount */
8790de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t0, binop(Iop_Shl64,
8800de80192f57cd132b31b233c65734de04939ce65sewardj                       binop(Iop_And64,
8810de80192f57cd132b31b233c65734de04939ce65sewardj                             getIReg(rb),
8820de80192f57cd132b31b233c65734de04939ce65sewardj                             mkU64(7)),
8830de80192f57cd132b31b233c65734de04939ce65sewardj                       mkU8(3)));
8840de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t1, binop(Iop_Sub64,
8850de80192f57cd132b31b233c65734de04939ce65sewardj                       mkU64(64),
8860de80192f57cd132b31b233c65734de04939ce65sewardj                       mkexpr(t0)));
8870de80192f57cd132b31b233c65734de04939ce65sewardj
8880de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Or64,
8890de80192f57cd132b31b233c65734de04939ce65sewardj                       binop(Iop_Shl64,
8900de80192f57cd132b31b233c65734de04939ce65sewardj                             getIReg(ra),
8910de80192f57cd132b31b233c65734de04939ce65sewardj                             unop(Iop_64to8, mkexpr(t1))),
8920de80192f57cd132b31b233c65734de04939ce65sewardj                       binop(Iop_Shr64,
8930de80192f57cd132b31b233c65734de04939ce65sewardj                             getIReg(rd),
8940de80192f57cd132b31b233c65734de04939ce65sewardj                             unop(Iop_64to8, mkexpr(t0)))));
8950de80192f57cd132b31b233c65734de04939ce65sewardj
8960de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
8970de80192f57cd132b31b233c65734de04939ce65sewardj      break;
8980de80192f57cd132b31b233c65734de04939ce65sewardj    case 75:
8990de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
9000de80192f57cd132b31b233c65734de04939ce65sewardj    case 76:
9010de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
9020de80192f57cd132b31b233c65734de04939ce65sewardj    case 77:
9030de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
9040de80192f57cd132b31b233c65734de04939ce65sewardj    case 78:
9050de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
9060de80192f57cd132b31b233c65734de04939ce65sewardj    case 79:
9070de80192f57cd132b31b233c65734de04939ce65sewardj      use_dirty_helper = 1;
9080de80192f57cd132b31b233c65734de04939ce65sewardj      break;
9090de80192f57cd132b31b233c65734de04939ce65sewardj    case 80:  /* "exch" */
9100de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
9110de80192f57cd132b31b233c65734de04939ce65sewardj      stmt( IRStmt_CAS(
9120de80192f57cd132b31b233c65734de04939ce65sewardj              mkIRCAS(IRTemp_INVALID,
9130de80192f57cd132b31b233c65734de04939ce65sewardj                      t2,
9140de80192f57cd132b31b233c65734de04939ce65sewardj                      Iend_LE,
9150de80192f57cd132b31b233c65734de04939ce65sewardj                      getIReg(ra),
9160de80192f57cd132b31b233c65734de04939ce65sewardj                      NULL,
9170de80192f57cd132b31b233c65734de04939ce65sewardj                      mkU64(0x0),
9180de80192f57cd132b31b233c65734de04939ce65sewardj                      NULL,
9190de80192f57cd132b31b233c65734de04939ce65sewardj                      getIReg(rb))));
9200de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
9210de80192f57cd132b31b233c65734de04939ce65sewardj      break;
9220de80192f57cd132b31b233c65734de04939ce65sewardj    case 81:  /* "exch4 rd, ra, rb" */
9230de80192f57cd132b31b233c65734de04939ce65sewardj      t0 = newTemp(Ity_I32);
9240de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
9250de80192f57cd132b31b233c65734de04939ce65sewardj      stmt( IRStmt_CAS(
9260de80192f57cd132b31b233c65734de04939ce65sewardj              mkIRCAS(IRTemp_INVALID,
9270de80192f57cd132b31b233c65734de04939ce65sewardj                      t0,
9280de80192f57cd132b31b233c65734de04939ce65sewardj                      Iend_LE,
9290de80192f57cd132b31b233c65734de04939ce65sewardj                      getIReg(ra),
9300de80192f57cd132b31b233c65734de04939ce65sewardj                      NULL,
9310de80192f57cd132b31b233c65734de04939ce65sewardj                      mkU32(0x0),
9320de80192f57cd132b31b233c65734de04939ce65sewardj                      NULL,
9330de80192f57cd132b31b233c65734de04939ce65sewardj                      narrowTo(Ity_I32,
9340de80192f57cd132b31b233c65734de04939ce65sewardj                               getIReg(rb)))));
9350de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, unop(Iop_32Sto64, mkexpr(t0)));
9360de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
9370de80192f57cd132b31b233c65734de04939ce65sewardj      break;
9380de80192f57cd132b31b233c65734de04939ce65sewardj    case 82:
9390de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
9400de80192f57cd132b31b233c65734de04939ce65sewardj    case 83:
9410de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
9420de80192f57cd132b31b233c65734de04939ce65sewardj    case 84:
9430de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
9440de80192f57cd132b31b233c65734de04939ce65sewardj    case 85:
9450de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
9460de80192f57cd132b31b233c65734de04939ce65sewardj    case 86:
9470de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
9480de80192f57cd132b31b233c65734de04939ce65sewardj    case 87:
9490de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
9500de80192f57cd132b31b233c65734de04939ce65sewardj    case 88:
9510de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
9520de80192f57cd132b31b233c65734de04939ce65sewardj    case 89:
9530de80192f57cd132b31b233c65734de04939ce65sewardj      use_dirty_helper = 1;
9540de80192f57cd132b31b233c65734de04939ce65sewardj      break;
9550de80192f57cd132b31b233c65734de04939ce65sewardj    case 90:  /* "fetchadd" */
9560de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
9570de80192f57cd132b31b233c65734de04939ce65sewardj      stmt( IRStmt_CAS(
9580de80192f57cd132b31b233c65734de04939ce65sewardj              mkIRCAS(IRTemp_INVALID,
9590de80192f57cd132b31b233c65734de04939ce65sewardj                      t2,
9600de80192f57cd132b31b233c65734de04939ce65sewardj                      Iend_LE,
9610de80192f57cd132b31b233c65734de04939ce65sewardj                      getIReg(ra),
9620de80192f57cd132b31b233c65734de04939ce65sewardj                      NULL,
9630de80192f57cd132b31b233c65734de04939ce65sewardj                      // fetchadd=3
9640de80192f57cd132b31b233c65734de04939ce65sewardj                      mkU64(0x3),
9650de80192f57cd132b31b233c65734de04939ce65sewardj                      NULL,
9660de80192f57cd132b31b233c65734de04939ce65sewardj                      getIReg(rb))));
9670de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
9680de80192f57cd132b31b233c65734de04939ce65sewardj      break;
9690de80192f57cd132b31b233c65734de04939ce65sewardj    case 91:  /* "fetchadd4" */
9700de80192f57cd132b31b233c65734de04939ce65sewardj      t0 = newTemp(Ity_I32);
9710de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
9720de80192f57cd132b31b233c65734de04939ce65sewardj      stmt( IRStmt_CAS(
9730de80192f57cd132b31b233c65734de04939ce65sewardj              mkIRCAS(IRTemp_INVALID,
9740de80192f57cd132b31b233c65734de04939ce65sewardj                      t0,
9750de80192f57cd132b31b233c65734de04939ce65sewardj                      Iend_LE,
9760de80192f57cd132b31b233c65734de04939ce65sewardj                      getIReg(ra),
9770de80192f57cd132b31b233c65734de04939ce65sewardj                      NULL,
9780de80192f57cd132b31b233c65734de04939ce65sewardj                      // fetchadd=3
9790de80192f57cd132b31b233c65734de04939ce65sewardj                      mkU32(0x3),
9800de80192f57cd132b31b233c65734de04939ce65sewardj                      NULL,
9810de80192f57cd132b31b233c65734de04939ce65sewardj                      narrowTo(Ity_I32,
9820de80192f57cd132b31b233c65734de04939ce65sewardj                               getIReg(rb)))));
9830de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, unop(Iop_32Sto64, mkexpr(t0)));
9840de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
9850de80192f57cd132b31b233c65734de04939ce65sewardj
9860de80192f57cd132b31b233c65734de04939ce65sewardj      break;
9870de80192f57cd132b31b233c65734de04939ce65sewardj    case 92:  /* "fetchaddgez" */
9880de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
9890de80192f57cd132b31b233c65734de04939ce65sewardj      stmt( IRStmt_CAS(
9900de80192f57cd132b31b233c65734de04939ce65sewardj              mkIRCAS(IRTemp_INVALID,
9910de80192f57cd132b31b233c65734de04939ce65sewardj                      t2,
9920de80192f57cd132b31b233c65734de04939ce65sewardj                      Iend_LE,
9930de80192f57cd132b31b233c65734de04939ce65sewardj                      getIReg(ra),
9940de80192f57cd132b31b233c65734de04939ce65sewardj                      NULL,
9950de80192f57cd132b31b233c65734de04939ce65sewardj                      // fetchaddgez=5
9960de80192f57cd132b31b233c65734de04939ce65sewardj                      mkU64(0x5),
9970de80192f57cd132b31b233c65734de04939ce65sewardj                      NULL,
9980de80192f57cd132b31b233c65734de04939ce65sewardj                      getIReg(rb))));
9990de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
10000de80192f57cd132b31b233c65734de04939ce65sewardj      break;
10010de80192f57cd132b31b233c65734de04939ce65sewardj    case 93:  /* "fetchaddgez4" */
10020de80192f57cd132b31b233c65734de04939ce65sewardj      t0 = newTemp(Ity_I32);
10030de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
10040de80192f57cd132b31b233c65734de04939ce65sewardj      stmt( IRStmt_CAS(
10050de80192f57cd132b31b233c65734de04939ce65sewardj              mkIRCAS(IRTemp_INVALID,
10060de80192f57cd132b31b233c65734de04939ce65sewardj                      t0,
10070de80192f57cd132b31b233c65734de04939ce65sewardj                      Iend_LE,
10080de80192f57cd132b31b233c65734de04939ce65sewardj                      getIReg(ra),
10090de80192f57cd132b31b233c65734de04939ce65sewardj                      NULL,
10100de80192f57cd132b31b233c65734de04939ce65sewardj                      // fetchaddgez=5
10110de80192f57cd132b31b233c65734de04939ce65sewardj                      mkU32(0x5),
10120de80192f57cd132b31b233c65734de04939ce65sewardj                      NULL,
10130de80192f57cd132b31b233c65734de04939ce65sewardj                      narrowTo(Ity_I32,
10140de80192f57cd132b31b233c65734de04939ce65sewardj                               getIReg(rb)))));
10150de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, unop(Iop_32Sto64, mkexpr(t0)));
10160de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
10170de80192f57cd132b31b233c65734de04939ce65sewardj      break;
10180de80192f57cd132b31b233c65734de04939ce65sewardj    case 94:  /* "fetchand\n") */
10190de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
10200de80192f57cd132b31b233c65734de04939ce65sewardj      stmt( IRStmt_CAS(
10210de80192f57cd132b31b233c65734de04939ce65sewardj              mkIRCAS(IRTemp_INVALID,
10220de80192f57cd132b31b233c65734de04939ce65sewardj                      t2,
10230de80192f57cd132b31b233c65734de04939ce65sewardj                      Iend_LE,
10240de80192f57cd132b31b233c65734de04939ce65sewardj                      getIReg(ra),
10250de80192f57cd132b31b233c65734de04939ce65sewardj                      NULL,
10260de80192f57cd132b31b233c65734de04939ce65sewardj                      mkU64(0x2),
10270de80192f57cd132b31b233c65734de04939ce65sewardj                      NULL,
10280de80192f57cd132b31b233c65734de04939ce65sewardj                      getIReg(rb))));
10290de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
10300de80192f57cd132b31b233c65734de04939ce65sewardj      break;
10310de80192f57cd132b31b233c65734de04939ce65sewardj    case 95:
10320de80192f57cd132b31b233c65734de04939ce65sewardj      /* mkIRCAS.
10330de80192f57cd132b31b233c65734de04939ce65sewardj         0: xch###      1: cmpexch###,
10340de80192f57cd132b31b233c65734de04939ce65sewardj         2: fetchand##  3: fetchadd##
10350de80192f57cd132b31b233c65734de04939ce65sewardj         4: fetchor##   5: fetchaddgez
10360de80192f57cd132b31b233c65734de04939ce65sewardj      */
10370de80192f57cd132b31b233c65734de04939ce65sewardj      /* "fetchand4" */
10380de80192f57cd132b31b233c65734de04939ce65sewardj      t0 = newTemp(Ity_I32);
10390de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
10400de80192f57cd132b31b233c65734de04939ce65sewardj      stmt( IRStmt_CAS(
10410de80192f57cd132b31b233c65734de04939ce65sewardj              mkIRCAS(IRTemp_INVALID,
10420de80192f57cd132b31b233c65734de04939ce65sewardj                      t0,
10430de80192f57cd132b31b233c65734de04939ce65sewardj                      Iend_LE,
10440de80192f57cd132b31b233c65734de04939ce65sewardj                      getIReg(ra),
10450de80192f57cd132b31b233c65734de04939ce65sewardj                      NULL,
10460de80192f57cd132b31b233c65734de04939ce65sewardj                      mkU32(0x2),
10470de80192f57cd132b31b233c65734de04939ce65sewardj                      NULL,
10480de80192f57cd132b31b233c65734de04939ce65sewardj                      narrowTo(Ity_I32,
10490de80192f57cd132b31b233c65734de04939ce65sewardj                               getIReg(rb)))));
10500de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, unop(Iop_32Sto64, mkexpr(t0)));
10510de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
10520de80192f57cd132b31b233c65734de04939ce65sewardj      break;
10530de80192f57cd132b31b233c65734de04939ce65sewardj    case 96:  /* "fetchor" */
10540de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
10550de80192f57cd132b31b233c65734de04939ce65sewardj      stmt( IRStmt_CAS(
10560de80192f57cd132b31b233c65734de04939ce65sewardj              mkIRCAS(IRTemp_INVALID,
10570de80192f57cd132b31b233c65734de04939ce65sewardj                      t2,
10580de80192f57cd132b31b233c65734de04939ce65sewardj                      Iend_LE,
10590de80192f57cd132b31b233c65734de04939ce65sewardj                      getIReg(ra),
10600de80192f57cd132b31b233c65734de04939ce65sewardj                      NULL,
10610de80192f57cd132b31b233c65734de04939ce65sewardj                      mkU64(0x4),
10620de80192f57cd132b31b233c65734de04939ce65sewardj                      NULL,
10630de80192f57cd132b31b233c65734de04939ce65sewardj                      getIReg(rb))));
10640de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
10650de80192f57cd132b31b233c65734de04939ce65sewardj      break;
10660de80192f57cd132b31b233c65734de04939ce65sewardj    case 97:  /* "fetchor4" */
10670de80192f57cd132b31b233c65734de04939ce65sewardj      t0 = newTemp(Ity_I32);
10680de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
10690de80192f57cd132b31b233c65734de04939ce65sewardj      stmt( IRStmt_CAS(
10700de80192f57cd132b31b233c65734de04939ce65sewardj              mkIRCAS(IRTemp_INVALID,
10710de80192f57cd132b31b233c65734de04939ce65sewardj                      t0,
10720de80192f57cd132b31b233c65734de04939ce65sewardj                      Iend_LE,
10730de80192f57cd132b31b233c65734de04939ce65sewardj                      getIReg(ra),
10740de80192f57cd132b31b233c65734de04939ce65sewardj                      NULL,
10750de80192f57cd132b31b233c65734de04939ce65sewardj                      mkU32(0x4),
10760de80192f57cd132b31b233c65734de04939ce65sewardj                      NULL,
10770de80192f57cd132b31b233c65734de04939ce65sewardj                      narrowTo(Ity_I32,
10780de80192f57cd132b31b233c65734de04939ce65sewardj                               getIReg(rb)))));
10790de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, unop(Iop_32Sto64, mkexpr(t0)));
10800de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
10810de80192f57cd132b31b233c65734de04939ce65sewardj      break;
10820de80192f57cd132b31b233c65734de04939ce65sewardj    case 98:
10830de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
10840de80192f57cd132b31b233c65734de04939ce65sewardj    case 99:
10850de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
10860de80192f57cd132b31b233c65734de04939ce65sewardj    case 100:
10870de80192f57cd132b31b233c65734de04939ce65sewardj      use_dirty_helper = 1;
10880de80192f57cd132b31b233c65734de04939ce65sewardj      break;
10890de80192f57cd132b31b233c65734de04939ce65sewardj    case 101: /* "fnop"  Ignore */
10900de80192f57cd132b31b233c65734de04939ce65sewardj      break;
10910de80192f57cd132b31b233c65734de04939ce65sewardj    case 102:
10920de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
10930de80192f57cd132b31b233c65734de04939ce65sewardj    case 103:
10940de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
10950de80192f57cd132b31b233c65734de04939ce65sewardj    case 104:
10960de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
10970de80192f57cd132b31b233c65734de04939ce65sewardj    case 105:
10980de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
10990de80192f57cd132b31b233c65734de04939ce65sewardj    case 106:
11000de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
11010de80192f57cd132b31b233c65734de04939ce65sewardj    case 107:
11020de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
11030de80192f57cd132b31b233c65734de04939ce65sewardj    case 108:
11040de80192f57cd132b31b233c65734de04939ce65sewardj      use_dirty_helper = 1;
11050de80192f57cd132b31b233c65734de04939ce65sewardj      break;
11060de80192f57cd132b31b233c65734de04939ce65sewardj    case 109:
11070de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
11080de80192f57cd132b31b233c65734de04939ce65sewardj    case 110:
11090de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
11100de80192f57cd132b31b233c65734de04939ce65sewardj    case 111:
11110de80192f57cd132b31b233c65734de04939ce65sewardj      use_dirty_helper = 1;
11120de80192f57cd132b31b233c65734de04939ce65sewardj      break;
11130de80192f57cd132b31b233c65734de04939ce65sewardj    case 112:  /* "iret" */
11140de80192f57cd132b31b233c65734de04939ce65sewardj      next = mkU64(guest_PC_curr_instr + 8);
11150de80192f57cd132b31b233c65734de04939ce65sewardj      jumpkind = Ijk_Ret;
11160de80192f57cd132b31b233c65734de04939ce65sewardj      break;
11170de80192f57cd132b31b233c65734de04939ce65sewardj    case 113:  /* "j" */
11180de80192f57cd132b31b233c65734de04939ce65sewardj      next = mkU64(imm);
11190de80192f57cd132b31b233c65734de04939ce65sewardj      /* set steering address. */
11200de80192f57cd132b31b233c65734de04939ce65sewardj      steering_pc = imm;
11210de80192f57cd132b31b233c65734de04939ce65sewardj      jumpkind = Ijk_Boring;
11220de80192f57cd132b31b233c65734de04939ce65sewardj      break;
11230de80192f57cd132b31b233c65734de04939ce65sewardj    case 114:
11240de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
11250de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, mkU64(guest_PC_curr_instr + 8));
11260de80192f57cd132b31b233c65734de04939ce65sewardj      /* set steering address. */
11270de80192f57cd132b31b233c65734de04939ce65sewardj      steering_pc = imm;
11280de80192f57cd132b31b233c65734de04939ce65sewardj      next = mkU64(imm);
11290de80192f57cd132b31b233c65734de04939ce65sewardj      jumpkind = Ijk_Call;
11300de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(55, t2);
11310de80192f57cd132b31b233c65734de04939ce65sewardj      break;
11320de80192f57cd132b31b233c65734de04939ce65sewardj    case 115:  /* "jalr" */
11330de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
11340de80192f57cd132b31b233c65734de04939ce65sewardj    case 116:  /* "jalrp" */
11350de80192f57cd132b31b233c65734de04939ce65sewardj      t1 = newTemp(Ity_I64);
11360de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
11370de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t1, getIReg(ra));
11380de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, mkU64(guest_PC_curr_instr + 8));
11390de80192f57cd132b31b233c65734de04939ce65sewardj      next = mkexpr(t1);
11400de80192f57cd132b31b233c65734de04939ce65sewardj      jumpkind = Ijk_Call;
11410de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(55, t2);
11420de80192f57cd132b31b233c65734de04939ce65sewardj      break;
11430de80192f57cd132b31b233c65734de04939ce65sewardj    case 117:  /* "jr" */
11440de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
11450de80192f57cd132b31b233c65734de04939ce65sewardj    case 118:  /* "jrp" */
11460de80192f57cd132b31b233c65734de04939ce65sewardj      next = getIReg(ra);
11470de80192f57cd132b31b233c65734de04939ce65sewardj      jumpkind = Ijk_Boring;
11480de80192f57cd132b31b233c65734de04939ce65sewardj      break;
11490de80192f57cd132b31b233c65734de04939ce65sewardj    case 119:  /* "ld" */
11500de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
11510de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, load(Ity_I64, (getIReg(ra))));
11520de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
11530de80192f57cd132b31b233c65734de04939ce65sewardj      break;
11540de80192f57cd132b31b233c65734de04939ce65sewardj    case 120:  /* "ld1s" */
11550de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
11560de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2,  unop(Iop_8Sto64,
11570de80192f57cd132b31b233c65734de04939ce65sewardj                       load(Ity_I8, (getIReg(ra)))));
11580de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
11590de80192f57cd132b31b233c65734de04939ce65sewardj      break;
11600de80192f57cd132b31b233c65734de04939ce65sewardj    case 121:  /* "ld1s_add" */
11610de80192f57cd132b31b233c65734de04939ce65sewardj      t1 = newTemp(Ity_I64);
11620de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
11630de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t1, binop(Iop_Add64, getIReg(ra), mkU64(imm)));
11640de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2,  unop(Iop_8Sto64,
11650de80192f57cd132b31b233c65734de04939ce65sewardj                       load(Ity_I8, (getIReg(ra)))));
11660de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(ra, t1);
11670de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
11680de80192f57cd132b31b233c65734de04939ce65sewardj      break;
11690de80192f57cd132b31b233c65734de04939ce65sewardj    case 122:  /* "ld1u" */
11700de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
11710de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2,  unop(Iop_8Uto64,
11720de80192f57cd132b31b233c65734de04939ce65sewardj                       load(Ity_I8, (getIReg(ra)))));
11730de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
11740de80192f57cd132b31b233c65734de04939ce65sewardj
11750de80192f57cd132b31b233c65734de04939ce65sewardj      break;
11760de80192f57cd132b31b233c65734de04939ce65sewardj    case 123:  /* "ld1u_add" */
11770de80192f57cd132b31b233c65734de04939ce65sewardj      t1 = newTemp(Ity_I64);
11780de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
11790de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t1,  binop(Iop_Add64, getIReg(ra), mkU64(imm)));
11800de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2,  unop(Iop_8Uto64,
11810de80192f57cd132b31b233c65734de04939ce65sewardj                       load(Ity_I8, (getIReg(ra)))));
11820de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(ra, t1);
11830de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
11840de80192f57cd132b31b233c65734de04939ce65sewardj      break;
11850de80192f57cd132b31b233c65734de04939ce65sewardj    case 124:  /* "ld2s" */
11860de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
11870de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2,  unop(Iop_16Sto64,
11880de80192f57cd132b31b233c65734de04939ce65sewardj                       load(Ity_I16, getIReg(ra))));
11890de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
11900de80192f57cd132b31b233c65734de04939ce65sewardj      break;
11910de80192f57cd132b31b233c65734de04939ce65sewardj    case 125:  /* "ld2s_add" */
11920de80192f57cd132b31b233c65734de04939ce65sewardj      t1 = newTemp(Ity_I64);
11930de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
11940de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t1,  binop(Iop_Add64, getIReg(ra), mkU64(imm)));
11950de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2,  unop(Iop_16Sto64,
11960de80192f57cd132b31b233c65734de04939ce65sewardj                       load(Ity_I16, getIReg(ra))));
11970de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
11980de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(ra, t1);
11990de80192f57cd132b31b233c65734de04939ce65sewardj      break;
12000de80192f57cd132b31b233c65734de04939ce65sewardj    case 126: /* "ld2u" */
12010de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
12020de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2,  unop(Iop_16Uto64,
12030de80192f57cd132b31b233c65734de04939ce65sewardj                       load(Ity_I16, getIReg(ra))));
12040de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
12050de80192f57cd132b31b233c65734de04939ce65sewardj      break;
12060de80192f57cd132b31b233c65734de04939ce65sewardj    case 127: /* "ld2u_add" */
12070de80192f57cd132b31b233c65734de04939ce65sewardj      t1 = newTemp(Ity_I64);
12080de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
12090de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t1,  binop(Iop_Add64, getIReg(ra), mkU64(imm)));
12100de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2,  unop(Iop_16Uto64,
12110de80192f57cd132b31b233c65734de04939ce65sewardj                       load(Ity_I16, getIReg(ra))));
12120de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
12130de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(ra, t1);
12140de80192f57cd132b31b233c65734de04939ce65sewardj      break;
12150de80192f57cd132b31b233c65734de04939ce65sewardj    case 128: /* "ld4s" */
12160de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
12170de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2,  unop(Iop_32Sto64,
12180de80192f57cd132b31b233c65734de04939ce65sewardj                       load(Ity_I32, (getIReg(ra)))));
12190de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
12200de80192f57cd132b31b233c65734de04939ce65sewardj      break;
12210de80192f57cd132b31b233c65734de04939ce65sewardj    case 129: /* "ld4s_add" */
12220de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
12230de80192f57cd132b31b233c65734de04939ce65sewardj      t1 = newTemp(Ity_I64);
12240de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t1,  binop(Iop_Add64, getIReg(ra), mkU64(imm)));
12250de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2,  unop(Iop_32Sto64,
12260de80192f57cd132b31b233c65734de04939ce65sewardj                       load(Ity_I32, (getIReg(ra)))));
12270de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
12280de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(ra, t1);
12290de80192f57cd132b31b233c65734de04939ce65sewardj      break;
12300de80192f57cd132b31b233c65734de04939ce65sewardj    case 130:  /* "ld4u" */
12310de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
12320de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2,  unop(Iop_32Uto64,
12330de80192f57cd132b31b233c65734de04939ce65sewardj                       load(Ity_I32, getIReg(ra))));
12340de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
12350de80192f57cd132b31b233c65734de04939ce65sewardj      break;
12360de80192f57cd132b31b233c65734de04939ce65sewardj    case 131:  /* "ld4u_add" */
12370de80192f57cd132b31b233c65734de04939ce65sewardj      t1 = newTemp(Ity_I64);
12380de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
12390de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t1, binop(Iop_Add64, getIReg(ra), mkU64(imm)));
12400de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2,  unop(Iop_32Uto64,
12410de80192f57cd132b31b233c65734de04939ce65sewardj                       load(Ity_I32, getIReg(ra))));
12420de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(ra, t1);
12430de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
12440de80192f57cd132b31b233c65734de04939ce65sewardj      break;
12450de80192f57cd132b31b233c65734de04939ce65sewardj    case 132:  /* "ld_add" */
12460de80192f57cd132b31b233c65734de04939ce65sewardj      t1 = newTemp(Ity_I64);
12470de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
12480de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t1, load(Ity_I64, getIReg(ra)));
12490de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Add64, getIReg(ra), mkU64(imm)));
12500de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(ra, t2);
12510de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t1);
12520de80192f57cd132b31b233c65734de04939ce65sewardj      break;
12530de80192f57cd132b31b233c65734de04939ce65sewardj    case 133:  /* "ldna" */
12540de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
12550de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, load(Ity_I64,
12560de80192f57cd132b31b233c65734de04939ce65sewardj                      binop(Iop_And64,
12570de80192f57cd132b31b233c65734de04939ce65sewardj                            getIReg(ra),
12580de80192f57cd132b31b233c65734de04939ce65sewardj                            unop(Iop_Not64,
12590de80192f57cd132b31b233c65734de04939ce65sewardj                                 mkU64(7)))));
12600de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
12610de80192f57cd132b31b233c65734de04939ce65sewardj      break;
12620de80192f57cd132b31b233c65734de04939ce65sewardj    case 134:  /* "ldna_add" */
12630de80192f57cd132b31b233c65734de04939ce65sewardj      t1 = newTemp(Ity_I64);
12640de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
12650de80192f57cd132b31b233c65734de04939ce65sewardj
12660de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t1, binop(Iop_Add64, getIReg(ra), mkU64(imm)));
12670de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, load(Ity_I64,
12680de80192f57cd132b31b233c65734de04939ce65sewardj                      binop(Iop_And64,
12690de80192f57cd132b31b233c65734de04939ce65sewardj                            getIReg(ra),
12700de80192f57cd132b31b233c65734de04939ce65sewardj                            unop(Iop_Not64,
12710de80192f57cd132b31b233c65734de04939ce65sewardj                                 mkU64(7)))));
12720de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(ra, t1);
12730de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
12740de80192f57cd132b31b233c65734de04939ce65sewardj      break;
12750de80192f57cd132b31b233c65734de04939ce65sewardj    case 135:  /* "ldnt" */
12760de80192f57cd132b31b233c65734de04939ce65sewardj      /* Valgrind IR has no Non-Temp load. Use normal load. */
12770de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
12780de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, load(Ity_I64, (getIReg(ra))));
12790de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
12800de80192f57cd132b31b233c65734de04939ce65sewardj      break;
12810de80192f57cd132b31b233c65734de04939ce65sewardj    case 136:  /* "ldnt1s" */
12820de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
12830de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2,  unop(Iop_8Sto64,
12840de80192f57cd132b31b233c65734de04939ce65sewardj                       load(Ity_I8, (getIReg(ra)))));
12850de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
12860de80192f57cd132b31b233c65734de04939ce65sewardj      break;
12870de80192f57cd132b31b233c65734de04939ce65sewardj    case 137:  /* "ldnt1s_add" */
12880de80192f57cd132b31b233c65734de04939ce65sewardj      t1 = newTemp(Ity_I64);
12890de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
12900de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2,  unop(Iop_8Sto64,
12910de80192f57cd132b31b233c65734de04939ce65sewardj                       load(Ity_I8, (getIReg(ra)))));
12920de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t1, binop(Iop_Add64, getIReg(ra), mkU64(imm)));
12930de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(ra, t1);
12940de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
12950de80192f57cd132b31b233c65734de04939ce65sewardj      break;
12960de80192f57cd132b31b233c65734de04939ce65sewardj    case 138:  /* "ldnt1u" */
12970de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
12980de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2,  unop(Iop_8Uto64,
12990de80192f57cd132b31b233c65734de04939ce65sewardj                       load(Ity_I8, (getIReg(ra)))));
13000de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
13010de80192f57cd132b31b233c65734de04939ce65sewardj      break;
13020de80192f57cd132b31b233c65734de04939ce65sewardj    case 139:  /* "ldnt1u_add" */
13030de80192f57cd132b31b233c65734de04939ce65sewardj      t1 = newTemp(Ity_I64);
13040de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
13050de80192f57cd132b31b233c65734de04939ce65sewardj
13060de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t1, binop(Iop_Add64, getIReg(ra), mkU64(imm)));
13070de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2,  unop(Iop_8Uto64,
13080de80192f57cd132b31b233c65734de04939ce65sewardj                       load(Ity_I8, (getIReg(ra)))));
13090de80192f57cd132b31b233c65734de04939ce65sewardj
13100de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(ra, t1);
13110de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
13120de80192f57cd132b31b233c65734de04939ce65sewardj      break;
13130de80192f57cd132b31b233c65734de04939ce65sewardj    case 140:  /* "ldnt2s" */
13140de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
13150de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2,  unop(Iop_16Sto64,
13160de80192f57cd132b31b233c65734de04939ce65sewardj                       load(Ity_I16, getIReg(ra))));
13170de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
13180de80192f57cd132b31b233c65734de04939ce65sewardj      break;
13190de80192f57cd132b31b233c65734de04939ce65sewardj    case 141:  /* "ldnt2s_add" */
13200de80192f57cd132b31b233c65734de04939ce65sewardj      t1 = newTemp(Ity_I64);
13210de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
13220de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2,  unop(Iop_16Sto64,
13230de80192f57cd132b31b233c65734de04939ce65sewardj                       load(Ity_I16, getIReg(ra))));
13240de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t1, binop(Iop_Add64, getIReg(ra), mkU64(imm)));
13250de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(ra, t1);
13260de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
13270de80192f57cd132b31b233c65734de04939ce65sewardj      break;
13280de80192f57cd132b31b233c65734de04939ce65sewardj    case 142:  /* "ldnt2u" */
13290de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
13300de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2,  unop(Iop_16Uto64,
13310de80192f57cd132b31b233c65734de04939ce65sewardj                       load(Ity_I16, getIReg(ra))));
13320de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
13330de80192f57cd132b31b233c65734de04939ce65sewardj      break;
13340de80192f57cd132b31b233c65734de04939ce65sewardj    case 143:  /* "ldnt2u_add" */
13350de80192f57cd132b31b233c65734de04939ce65sewardj      t1 = newTemp(Ity_I64);
13360de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
13370de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2,  unop(Iop_16Uto64,
13380de80192f57cd132b31b233c65734de04939ce65sewardj                       load(Ity_I16, getIReg(ra))));
13390de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t1, binop(Iop_Add64, getIReg(ra), mkU64(imm)));
13400de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(ra, t1);
13410de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
13420de80192f57cd132b31b233c65734de04939ce65sewardj      break;
13430de80192f57cd132b31b233c65734de04939ce65sewardj    case 144:  /* "ldnt4s" */
13440de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
13450de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2,  unop(Iop_32Sto64,
13460de80192f57cd132b31b233c65734de04939ce65sewardj                       load(Ity_I32, (getIReg(ra)))));
13470de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
13480de80192f57cd132b31b233c65734de04939ce65sewardj      break;
13490de80192f57cd132b31b233c65734de04939ce65sewardj    case 145:  /* "ldnt4s_add" */
13500de80192f57cd132b31b233c65734de04939ce65sewardj      t1 = newTemp(Ity_I64);
13510de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
13520de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2,  unop(Iop_32Sto64,
13530de80192f57cd132b31b233c65734de04939ce65sewardj                       load(Ity_I32, (getIReg(ra)))));
13540de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t1, binop(Iop_Add64, getIReg(ra), mkU64(imm)));
13550de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
13560de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(ra, t1);
13570de80192f57cd132b31b233c65734de04939ce65sewardj      break;
13580de80192f57cd132b31b233c65734de04939ce65sewardj    case 146:  /* "ldnt4u" */
13590de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
13600de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2,  unop(Iop_32Uto64,
13610de80192f57cd132b31b233c65734de04939ce65sewardj                       load(Ity_I32, getIReg(ra))));
13620de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
13630de80192f57cd132b31b233c65734de04939ce65sewardj      break;
13640de80192f57cd132b31b233c65734de04939ce65sewardj    case 147:  /* "ldnt4u_add" */
13650de80192f57cd132b31b233c65734de04939ce65sewardj      t1 = newTemp(Ity_I64);
13660de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
13670de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2,  unop(Iop_32Uto64,
13680de80192f57cd132b31b233c65734de04939ce65sewardj                       load(Ity_I32, getIReg(ra))));
13690de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t1, binop(Iop_Add64, getIReg(ra), mkU64(imm)));
13700de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
13710de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(ra, t1);
13720de80192f57cd132b31b233c65734de04939ce65sewardj      break;
13730de80192f57cd132b31b233c65734de04939ce65sewardj    case 148:  /* "ldnt_add" */
13740de80192f57cd132b31b233c65734de04939ce65sewardj      t1 = newTemp(Ity_I64);
13750de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
13760de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t1, load(Ity_I64, getIReg(ra)));
13770de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Add64, getIReg(ra), mkU64(imm)));
13780de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t1);
13790de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(ra, t2);
13800de80192f57cd132b31b233c65734de04939ce65sewardj      break;
13810de80192f57cd132b31b233c65734de04939ce65sewardj    case 149:  /* "lnk" */
13820de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
13830de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2,  mkU64(guest_PC_curr_instr + 8));
13840de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
13850de80192f57cd132b31b233c65734de04939ce65sewardj      break;
13860de80192f57cd132b31b233c65734de04939ce65sewardj    case 150:  /* "mf" */
13870de80192f57cd132b31b233c65734de04939ce65sewardj      use_dirty_helper = 1;
13880de80192f57cd132b31b233c65734de04939ce65sewardj      break;
13890de80192f57cd132b31b233c65734de04939ce65sewardj    case 151:  /* "mfspr" */
139032bf4136270f100788bcad4edb7d47e1b43df254zliu      t2 = newTemp(Ity_I64);
139132bf4136270f100788bcad4edb7d47e1b43df254zliu      if (imm == 0x2780) { // Get Cmpexch value
139232bf4136270f100788bcad4edb7d47e1b43df254zliu	 assign(t2, getIReg(70));
139332bf4136270f100788bcad4edb7d47e1b43df254zliu	 MARK_REG_WB(rd, t2);
139432bf4136270f100788bcad4edb7d47e1b43df254zliu      } else if (imm == 0x2580) { // Get EX_CONTEXT_0_0
139532bf4136270f100788bcad4edb7d47e1b43df254zliu         assign(t2, getIReg(576 / 8));
139632bf4136270f100788bcad4edb7d47e1b43df254zliu         MARK_REG_WB(rd, t2);
139732bf4136270f100788bcad4edb7d47e1b43df254zliu      } else if (imm == 0x2581) { // Get EX_CONTEXT_0_1
139832bf4136270f100788bcad4edb7d47e1b43df254zliu         assign(t2, getIReg(584 / 8));
139932bf4136270f100788bcad4edb7d47e1b43df254zliu         MARK_REG_WB(rd, t2);
140032bf4136270f100788bcad4edb7d47e1b43df254zliu      } else
14010de80192f57cd132b31b233c65734de04939ce65sewardj        use_dirty_helper = 1;
14020de80192f57cd132b31b233c65734de04939ce65sewardj      break;
14030de80192f57cd132b31b233c65734de04939ce65sewardj    case 152:  /* "mm" */
14040de80192f57cd132b31b233c65734de04939ce65sewardj      use_dirty_helper = 1;
14050de80192f57cd132b31b233c65734de04939ce65sewardj      break;
14060de80192f57cd132b31b233c65734de04939ce65sewardj    case 153:  /* "mnz" */
14070de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
14080de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_And64,
14090de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_1Sto64, binop(Iop_CmpNE64,
14100de80192f57cd132b31b233c65734de04939ce65sewardj                                              getIReg(ra),
14110de80192f57cd132b31b233c65734de04939ce65sewardj                                              mkU64(0))),
14120de80192f57cd132b31b233c65734de04939ce65sewardj                       getIReg(rb)));
14130de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
14140de80192f57cd132b31b233c65734de04939ce65sewardj      break;
14150de80192f57cd132b31b233c65734de04939ce65sewardj    case 154:  /* "mtspr imm, ra" */
14160de80192f57cd132b31b233c65734de04939ce65sewardj      if (imm == 0x2780) // Set Cmpexch value
14170de80192f57cd132b31b233c65734de04939ce65sewardj        putIReg(70, getIReg(ra));
14180de80192f57cd132b31b233c65734de04939ce65sewardj      else if (imm == 0x2580) // set EX_CONTEXT_0_0
14190de80192f57cd132b31b233c65734de04939ce65sewardj        putIReg(576/8, getIReg(ra));
14200de80192f57cd132b31b233c65734de04939ce65sewardj      else if (imm == 0x2581) // set EX_CONTEXT_0_1
14210de80192f57cd132b31b233c65734de04939ce65sewardj        putIReg(584/8, getIReg(ra));
14220de80192f57cd132b31b233c65734de04939ce65sewardj      else
14230de80192f57cd132b31b233c65734de04939ce65sewardj        use_dirty_helper = 1;
14240de80192f57cd132b31b233c65734de04939ce65sewardj      break;
14250de80192f57cd132b31b233c65734de04939ce65sewardj    case 155:  /* "mul_hs_hs" */
14260de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
14270de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_MullS32,
14280de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32,
14290de80192f57cd132b31b233c65734de04939ce65sewardj                            binop(Iop_Shr64,
14300de80192f57cd132b31b233c65734de04939ce65sewardj                                  getIReg(ra),
14310de80192f57cd132b31b233c65734de04939ce65sewardj                                  mkU8(32))),
14320de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32,
14330de80192f57cd132b31b233c65734de04939ce65sewardj                            binop(Iop_Shr64,
14340de80192f57cd132b31b233c65734de04939ce65sewardj                                  getIReg(rb),
14350de80192f57cd132b31b233c65734de04939ce65sewardj                                  mkU8(32)))));
14360de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
14370de80192f57cd132b31b233c65734de04939ce65sewardj      break;
14380de80192f57cd132b31b233c65734de04939ce65sewardj    case 156:  /* "mul_hs_hu" */
14390de80192f57cd132b31b233c65734de04939ce65sewardj      t0 = newTemp(Ity_I64);
14400de80192f57cd132b31b233c65734de04939ce65sewardj      t1 = newTemp(Ity_I64);
14410de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
14420de80192f57cd132b31b233c65734de04939ce65sewardj      t3 = newTemp(Ity_I64);
14430de80192f57cd132b31b233c65734de04939ce65sewardj
14440de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t0, unop(Iop_32Sto64,
14450de80192f57cd132b31b233c65734de04939ce65sewardj                      unop(Iop_64to32,
14460de80192f57cd132b31b233c65734de04939ce65sewardj                           binop(Iop_Shr64, getIReg(ra), mkU8(32)))));
14470de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t1, binop(Iop_MullU32,
14480de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, mkexpr(t0)),
14490de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, binop(Iop_Shr64, getIReg(rb), mkU8(32)))));
14500de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t3, binop(Iop_MullU32,
14510de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, binop(Iop_Shr64,
14520de80192f57cd132b31b233c65734de04939ce65sewardj                                              mkexpr(t0),
14530de80192f57cd132b31b233c65734de04939ce65sewardj                                              mkU8(32))),
14540de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, binop(Iop_Shr64, getIReg(rb), mkU8(32)))));
14550de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Add64,
14560de80192f57cd132b31b233c65734de04939ce65sewardj                       mkexpr(t1),
14570de80192f57cd132b31b233c65734de04939ce65sewardj                       binop(Iop_Shl64,
14580de80192f57cd132b31b233c65734de04939ce65sewardj                             mkexpr(t3),
14590de80192f57cd132b31b233c65734de04939ce65sewardj                             mkU8(32))));
14600de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
14610de80192f57cd132b31b233c65734de04939ce65sewardj      break;
14620de80192f57cd132b31b233c65734de04939ce65sewardj    case 157:  /* "mul_hs_ls" */
14630de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
14640de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_MullS32,
14650de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32,
14660de80192f57cd132b31b233c65734de04939ce65sewardj                            binop(Iop_Shr64,
14670de80192f57cd132b31b233c65734de04939ce65sewardj                                  getIReg(ra),
14680de80192f57cd132b31b233c65734de04939ce65sewardj                                  mkU8(32))),
14690de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32,
14700de80192f57cd132b31b233c65734de04939ce65sewardj                            getIReg(rb))));
14710de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
14720de80192f57cd132b31b233c65734de04939ce65sewardj      break;
14730de80192f57cd132b31b233c65734de04939ce65sewardj    case 158:  /* "mul_hs_lu" */
14740de80192f57cd132b31b233c65734de04939ce65sewardj      t0 = newTemp(Ity_I64);
14750de80192f57cd132b31b233c65734de04939ce65sewardj      t1 = newTemp(Ity_I64);
14760de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
14770de80192f57cd132b31b233c65734de04939ce65sewardj      t3 = newTemp(Ity_I64);
14780de80192f57cd132b31b233c65734de04939ce65sewardj
14790de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t0, unop(Iop_32Sto64,
14800de80192f57cd132b31b233c65734de04939ce65sewardj                      unop(Iop_64to32,
14810de80192f57cd132b31b233c65734de04939ce65sewardj                           binop(Iop_Shr64, getIReg(ra), mkU8(32)))));
14820de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t1, binop(Iop_MullU32,
14830de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, mkexpr(t0)),
14840de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, getIReg(rb))));
14850de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t3, binop(Iop_MullU32,
14860de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, binop(Iop_Shr64,
14870de80192f57cd132b31b233c65734de04939ce65sewardj                                              mkexpr(t0),
14880de80192f57cd132b31b233c65734de04939ce65sewardj                                              mkU8(32))),
14890de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, getIReg(rb))));
14900de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Add64,
14910de80192f57cd132b31b233c65734de04939ce65sewardj                       mkexpr(t1),
14920de80192f57cd132b31b233c65734de04939ce65sewardj                       binop(Iop_Shl64,
14930de80192f57cd132b31b233c65734de04939ce65sewardj                             mkexpr(t3),
14940de80192f57cd132b31b233c65734de04939ce65sewardj                             mkU8(32))));
14950de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
14960de80192f57cd132b31b233c65734de04939ce65sewardj      break;
14970de80192f57cd132b31b233c65734de04939ce65sewardj    case 159:  /* "mul_hu_hu" */
14980de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
14990de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_MullU32,
15000de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32,
15010de80192f57cd132b31b233c65734de04939ce65sewardj                            binop(Iop_Shr64,
15020de80192f57cd132b31b233c65734de04939ce65sewardj                                  getIReg(ra),
15030de80192f57cd132b31b233c65734de04939ce65sewardj                                  mkU8(32))),
15040de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32,
15050de80192f57cd132b31b233c65734de04939ce65sewardj                            binop(Iop_Shr64,
15060de80192f57cd132b31b233c65734de04939ce65sewardj                                  getIReg(rb),
15070de80192f57cd132b31b233c65734de04939ce65sewardj                                  mkU8(32)))));
15080de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
15090de80192f57cd132b31b233c65734de04939ce65sewardj      break;
15100de80192f57cd132b31b233c65734de04939ce65sewardj    case 160:  /* "mul_hu_ls" */
15110de80192f57cd132b31b233c65734de04939ce65sewardj      t0 = newTemp(Ity_I64);
15120de80192f57cd132b31b233c65734de04939ce65sewardj      t1 = newTemp(Ity_I64);
15130de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
15140de80192f57cd132b31b233c65734de04939ce65sewardj      t3 = newTemp(Ity_I64);
15150de80192f57cd132b31b233c65734de04939ce65sewardj
15160de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t0, unop(Iop_32Sto64,
15170de80192f57cd132b31b233c65734de04939ce65sewardj                      unop(Iop_64to32,
15180de80192f57cd132b31b233c65734de04939ce65sewardj                           getIReg(ra))));
15190de80192f57cd132b31b233c65734de04939ce65sewardj
15200de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t1, binop(Iop_MullU32,
15210de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, mkexpr(t0)),
15220de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, binop(Iop_Shr64, getIReg(rb), mkU8(32)))));
15230de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t3, binop(Iop_MullU32,
15240de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, binop(Iop_Shr64,
15250de80192f57cd132b31b233c65734de04939ce65sewardj                                              mkexpr(t0),
15260de80192f57cd132b31b233c65734de04939ce65sewardj                                              mkU8(32))),
15270de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, binop(Iop_Shr64, getIReg(rb), mkU8(32)))));
15280de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Add64,
15290de80192f57cd132b31b233c65734de04939ce65sewardj                       mkexpr(t1),
15300de80192f57cd132b31b233c65734de04939ce65sewardj                       binop(Iop_Shl64,
15310de80192f57cd132b31b233c65734de04939ce65sewardj                             mkexpr(t3),
15320de80192f57cd132b31b233c65734de04939ce65sewardj                             mkU8(32))));
15330de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
15340de80192f57cd132b31b233c65734de04939ce65sewardj      break;
15350de80192f57cd132b31b233c65734de04939ce65sewardj    case 161:  /* "mul_hu_lu" */
15360de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
15370de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_MullU32,
15380de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32,
15390de80192f57cd132b31b233c65734de04939ce65sewardj                            binop(Iop_Shr64,
15400de80192f57cd132b31b233c65734de04939ce65sewardj                                  getIReg(ra),
15410de80192f57cd132b31b233c65734de04939ce65sewardj                                  mkU8(32))),
15420de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32,
15430de80192f57cd132b31b233c65734de04939ce65sewardj                            getIReg(rb))));
15440de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
15450de80192f57cd132b31b233c65734de04939ce65sewardj      break;
15460de80192f57cd132b31b233c65734de04939ce65sewardj    case 162:  /* "mul_ls_ls" */
15470de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
15480de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_MullS32,
15490de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, getIReg(ra)),
15500de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, getIReg(rb))));
15510de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
15520de80192f57cd132b31b233c65734de04939ce65sewardj      break;
15530de80192f57cd132b31b233c65734de04939ce65sewardj    case 163:  /* "mul_ls_lu" */
15540de80192f57cd132b31b233c65734de04939ce65sewardj      t0 = newTemp(Ity_I64);
15550de80192f57cd132b31b233c65734de04939ce65sewardj      t1 = newTemp(Ity_I64);
15560de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
15570de80192f57cd132b31b233c65734de04939ce65sewardj      t3 = newTemp(Ity_I64);
15580de80192f57cd132b31b233c65734de04939ce65sewardj
15590de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t0, unop(Iop_32Sto64,
15600de80192f57cd132b31b233c65734de04939ce65sewardj                      unop(Iop_64to32, getIReg(ra))));
15610de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t1, binop(Iop_MullU32,
15620de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, mkexpr(t0)),
15630de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, getIReg(rb))));
15640de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t3, binop(Iop_MullU32,
15650de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, binop(Iop_Shr64,
15660de80192f57cd132b31b233c65734de04939ce65sewardj                                              mkexpr(t0),
15670de80192f57cd132b31b233c65734de04939ce65sewardj                                              mkU8(32))),
15680de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, getIReg(rb))));
15690de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Add64,
15700de80192f57cd132b31b233c65734de04939ce65sewardj                       mkexpr(t1),
15710de80192f57cd132b31b233c65734de04939ce65sewardj                       binop(Iop_Shl64,
15720de80192f57cd132b31b233c65734de04939ce65sewardj                             mkexpr(t3),
15730de80192f57cd132b31b233c65734de04939ce65sewardj                             mkU8(32))));
15740de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
15750de80192f57cd132b31b233c65734de04939ce65sewardj      break;
15760de80192f57cd132b31b233c65734de04939ce65sewardj    case 164:   /* "mul_lu_lu" */
15770de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
15780de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_MullU32,
15790de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, getIReg(ra)),
15800de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, getIReg(rb))));
15810de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
15820de80192f57cd132b31b233c65734de04939ce65sewardj      break;
15830de80192f57cd132b31b233c65734de04939ce65sewardj    case 165:   /* "mula_hs_hs" */
15840de80192f57cd132b31b233c65734de04939ce65sewardj      t0 = newTemp(Ity_I64);
15850de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
15860de80192f57cd132b31b233c65734de04939ce65sewardj
15870de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t0, binop(Iop_MullS32,
15880de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, binop(Iop_Shr64,
15890de80192f57cd132b31b233c65734de04939ce65sewardj                                              getIReg(ra), mkU8(32))),
15900de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, binop(Iop_Shr64,
15910de80192f57cd132b31b233c65734de04939ce65sewardj                                              getIReg(rb), mkU8(32)))));
15920de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Add64, getIReg(rd), mkexpr(t0)));
15930de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
15940de80192f57cd132b31b233c65734de04939ce65sewardj      break;
15950de80192f57cd132b31b233c65734de04939ce65sewardj    case 166:   /* "mula_hs_hu" */
15960de80192f57cd132b31b233c65734de04939ce65sewardj      t0 = newTemp(Ity_I64);
15970de80192f57cd132b31b233c65734de04939ce65sewardj      t1 = newTemp(Ity_I64);
15980de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
15990de80192f57cd132b31b233c65734de04939ce65sewardj      t3 = newTemp(Ity_I64);
16000de80192f57cd132b31b233c65734de04939ce65sewardj      t4 = newTemp(Ity_I64);
16010de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t0, unop(Iop_32Sto64,
16020de80192f57cd132b31b233c65734de04939ce65sewardj                      unop(Iop_64to32,
16030de80192f57cd132b31b233c65734de04939ce65sewardj                           binop(Iop_Shr64, getIReg(ra), mkU8(32)))));
16040de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t1, binop(Iop_MullU32,
16050de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, mkexpr(t0)),
16060de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, binop(Iop_Shr64,
16070de80192f57cd132b31b233c65734de04939ce65sewardj                                              getIReg(rb), mkU8(32)))));
16080de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t3, binop(Iop_MullU32,
16090de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, binop(Iop_Shr64,
16100de80192f57cd132b31b233c65734de04939ce65sewardj                                              mkexpr(t0),
16110de80192f57cd132b31b233c65734de04939ce65sewardj                                              mkU8(32))),
16120de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, binop(Iop_Shr64,
16130de80192f57cd132b31b233c65734de04939ce65sewardj                                              getIReg(rb), mkU8(32)))));
16140de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Add64,
16150de80192f57cd132b31b233c65734de04939ce65sewardj                       mkexpr(t1),
16160de80192f57cd132b31b233c65734de04939ce65sewardj                       binop(Iop_Shl64,
16170de80192f57cd132b31b233c65734de04939ce65sewardj                             mkexpr(t3),
16180de80192f57cd132b31b233c65734de04939ce65sewardj                             mkU8(32))));
16190de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t4, binop(Iop_Add64, getIReg(rd), mkexpr(t2)));
16200de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t4);
16210de80192f57cd132b31b233c65734de04939ce65sewardj      break;
16220de80192f57cd132b31b233c65734de04939ce65sewardj    case 167:   /* "mula_hs_ls" */
16230de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
16240de80192f57cd132b31b233c65734de04939ce65sewardj      t4 = newTemp(Ity_I64);
16250de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_MullS32,
16260de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32,
16270de80192f57cd132b31b233c65734de04939ce65sewardj                            binop(Iop_Shr64,
16280de80192f57cd132b31b233c65734de04939ce65sewardj                                  getIReg(ra),
16290de80192f57cd132b31b233c65734de04939ce65sewardj                                  mkU8(32))),
16300de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32,
16310de80192f57cd132b31b233c65734de04939ce65sewardj                            getIReg(rb))));
16320de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t4, binop(Iop_Add64, getIReg(rd), mkexpr(t2)));
16330de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t4);
16340de80192f57cd132b31b233c65734de04939ce65sewardj      break;
16350de80192f57cd132b31b233c65734de04939ce65sewardj    case 168:   /* "mula_hs_lu" */
16360de80192f57cd132b31b233c65734de04939ce65sewardj      t0 = newTemp(Ity_I64);
16370de80192f57cd132b31b233c65734de04939ce65sewardj      t1 = newTemp(Ity_I64);
16380de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
16390de80192f57cd132b31b233c65734de04939ce65sewardj      t3 = newTemp(Ity_I64);
16400de80192f57cd132b31b233c65734de04939ce65sewardj      t4 = newTemp(Ity_I64);
16410de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t0, unop(Iop_32Sto64,
16420de80192f57cd132b31b233c65734de04939ce65sewardj                      unop(Iop_64to32,
16430de80192f57cd132b31b233c65734de04939ce65sewardj                           binop(Iop_Shr64, getIReg(ra), mkU8(32)))));
16440de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t1, binop(Iop_MullU32,
16450de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, mkexpr(t0)),
16460de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, getIReg(rb))));
16470de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t3, binop(Iop_MullU32,
16480de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, binop(Iop_Shr64,
16490de80192f57cd132b31b233c65734de04939ce65sewardj                                              mkexpr(t0),
16500de80192f57cd132b31b233c65734de04939ce65sewardj                                              mkU8(32))),
16510de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, getIReg(rb))));
16520de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Add64,
16530de80192f57cd132b31b233c65734de04939ce65sewardj                       mkexpr(t1),
16540de80192f57cd132b31b233c65734de04939ce65sewardj                       binop(Iop_Shl64,
16550de80192f57cd132b31b233c65734de04939ce65sewardj                             mkexpr(t3),
16560de80192f57cd132b31b233c65734de04939ce65sewardj                             mkU8(32))));
16570de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t4, binop(Iop_Add64, getIReg(rd), mkexpr(t2)));
16580de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t4);
16590de80192f57cd132b31b233c65734de04939ce65sewardj      break;
16600de80192f57cd132b31b233c65734de04939ce65sewardj    case 169:   /* "mula_hu_hu" */
16610de80192f57cd132b31b233c65734de04939ce65sewardj      use_dirty_helper = 1;
16620de80192f57cd132b31b233c65734de04939ce65sewardj      break;
16630de80192f57cd132b31b233c65734de04939ce65sewardj    case 170:   /* "mula_hu_ls" */
16640de80192f57cd132b31b233c65734de04939ce65sewardj      use_dirty_helper = 1;
16650de80192f57cd132b31b233c65734de04939ce65sewardj      break;
16660de80192f57cd132b31b233c65734de04939ce65sewardj    case 171:   /* "mula_hu_lu" */
16670de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
16680de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Add64,
16690de80192f57cd132b31b233c65734de04939ce65sewardj                       binop(Iop_MullU32,
16700de80192f57cd132b31b233c65734de04939ce65sewardj                             unop(Iop_64to32,
16710de80192f57cd132b31b233c65734de04939ce65sewardj                                  binop(Iop_Shr64,
16720de80192f57cd132b31b233c65734de04939ce65sewardj                                        getIReg(ra),
16730de80192f57cd132b31b233c65734de04939ce65sewardj                                        mkU8(32))),
16740de80192f57cd132b31b233c65734de04939ce65sewardj                             unop(Iop_64to32,
16750de80192f57cd132b31b233c65734de04939ce65sewardj                                  getIReg(rb))),
16760de80192f57cd132b31b233c65734de04939ce65sewardj                       getIReg(rd)));
16770de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
16780de80192f57cd132b31b233c65734de04939ce65sewardj      break;
16790de80192f57cd132b31b233c65734de04939ce65sewardj    case 172:  /* "mula_ls_ls" */
16800de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
16810de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Add64,
16820de80192f57cd132b31b233c65734de04939ce65sewardj                       getIReg(rd),
16830de80192f57cd132b31b233c65734de04939ce65sewardj                       binop(Iop_MullS32,
16840de80192f57cd132b31b233c65734de04939ce65sewardj                             unop(Iop_64to32, getIReg(ra)),
16850de80192f57cd132b31b233c65734de04939ce65sewardj                             unop(Iop_64to32, getIReg(rb)))));
16860de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
16870de80192f57cd132b31b233c65734de04939ce65sewardj      break;
16880de80192f57cd132b31b233c65734de04939ce65sewardj    case 173:  /* "mula_ls_lu" */
16890de80192f57cd132b31b233c65734de04939ce65sewardj      t0 = newTemp(Ity_I64);
16900de80192f57cd132b31b233c65734de04939ce65sewardj      t1 = newTemp(Ity_I64);
16910de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
16920de80192f57cd132b31b233c65734de04939ce65sewardj      t3 = newTemp(Ity_I64);
16930de80192f57cd132b31b233c65734de04939ce65sewardj
16940de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t0, unop(Iop_32Sto64,
16950de80192f57cd132b31b233c65734de04939ce65sewardj                      unop(Iop_64to32, getIReg(ra))));
16960de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t1, binop(Iop_MullU32,
16970de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, mkexpr(t0)),
16980de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, getIReg(rb))));
16990de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t3, binop(Iop_MullU32,
17000de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, binop(Iop_Shr64,
17010de80192f57cd132b31b233c65734de04939ce65sewardj                                              mkexpr(t0),
17020de80192f57cd132b31b233c65734de04939ce65sewardj                                              mkU8(32))),
17030de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to32, getIReg(rb))));
17040de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Add64,
17050de80192f57cd132b31b233c65734de04939ce65sewardj                       getIReg(rd),
17060de80192f57cd132b31b233c65734de04939ce65sewardj                       binop(Iop_Add64,
17070de80192f57cd132b31b233c65734de04939ce65sewardj                             mkexpr(t1),
17080de80192f57cd132b31b233c65734de04939ce65sewardj                             binop(Iop_Shl64,
17090de80192f57cd132b31b233c65734de04939ce65sewardj                                   mkexpr(t3),
17100de80192f57cd132b31b233c65734de04939ce65sewardj                                   mkU8(32)))));
17110de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
17120de80192f57cd132b31b233c65734de04939ce65sewardj      break;
17130de80192f57cd132b31b233c65734de04939ce65sewardj    case 174:  /* "mula_lu_lu" */
17140de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
17150de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Add64,
17160de80192f57cd132b31b233c65734de04939ce65sewardj                       binop(Iop_MullU32,
17170de80192f57cd132b31b233c65734de04939ce65sewardj                             unop(Iop_64to32,
17180de80192f57cd132b31b233c65734de04939ce65sewardj                                  getIReg(ra)),
17190de80192f57cd132b31b233c65734de04939ce65sewardj                             unop(Iop_64to32,
17200de80192f57cd132b31b233c65734de04939ce65sewardj                                  getIReg(rb))),
17210de80192f57cd132b31b233c65734de04939ce65sewardj                       getIReg(rd)));
17220de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
17230de80192f57cd132b31b233c65734de04939ce65sewardj      break;
17240de80192f57cd132b31b233c65734de04939ce65sewardj    case 175:   /* "mulax" */
17250de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
17260de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, unop(Iop_32Sto64,
17270de80192f57cd132b31b233c65734de04939ce65sewardj                      unop(Iop_64to32,
17280de80192f57cd132b31b233c65734de04939ce65sewardj                           binop(Iop_Add64,
17290de80192f57cd132b31b233c65734de04939ce65sewardj                                 getIReg(rd),
17300de80192f57cd132b31b233c65734de04939ce65sewardj                                 binop(Iop_MullU32,
17310de80192f57cd132b31b233c65734de04939ce65sewardj                                       narrowTo(Ity_I32, getIReg(ra)),
17320de80192f57cd132b31b233c65734de04939ce65sewardj                                       narrowTo(Ity_I32, getIReg(rb)))))));
17330de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
17340de80192f57cd132b31b233c65734de04939ce65sewardj      break;
17350de80192f57cd132b31b233c65734de04939ce65sewardj    case 176:   /* "mulx" */
17360de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
17370de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, unop(Iop_32Sto64,
17380de80192f57cd132b31b233c65734de04939ce65sewardj                      unop(Iop_64to32,
17390de80192f57cd132b31b233c65734de04939ce65sewardj                           binop(Iop_MullU32,
17400de80192f57cd132b31b233c65734de04939ce65sewardj                                 narrowTo(Ity_I32, getIReg(ra)),
17410de80192f57cd132b31b233c65734de04939ce65sewardj                                 narrowTo(Ity_I32, getIReg(rb))))));
17420de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
17430de80192f57cd132b31b233c65734de04939ce65sewardj      break;
17440de80192f57cd132b31b233c65734de04939ce65sewardj    case 177:   /* "mz" */
17450de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
17460de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_And64,
17470de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_1Sto64, binop(Iop_CmpEQ64,
17480de80192f57cd132b31b233c65734de04939ce65sewardj                                              getIReg(ra),
17490de80192f57cd132b31b233c65734de04939ce65sewardj                                              mkU64(0))),
17500de80192f57cd132b31b233c65734de04939ce65sewardj                       getIReg(rb)));
17510de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
17520de80192f57cd132b31b233c65734de04939ce65sewardj      break;
17530de80192f57cd132b31b233c65734de04939ce65sewardj    case 178:  /* "nap" */
17540de80192f57cd132b31b233c65734de04939ce65sewardj      break;
17550de80192f57cd132b31b233c65734de04939ce65sewardj    case 179:  /* "nop" */
17560de80192f57cd132b31b233c65734de04939ce65sewardj      break;
17570de80192f57cd132b31b233c65734de04939ce65sewardj    case 180:  /* "nor" */
17580de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
17590de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, unop(Iop_Not64,
17600de80192f57cd132b31b233c65734de04939ce65sewardj                      binop(Iop_Or64,
17610de80192f57cd132b31b233c65734de04939ce65sewardj                            getIReg(ra),
17620de80192f57cd132b31b233c65734de04939ce65sewardj                            getIReg(rb))));
17630de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
17640de80192f57cd132b31b233c65734de04939ce65sewardj      break;
17650de80192f57cd132b31b233c65734de04939ce65sewardj    case 181:  /* "or" */
17660de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
17670de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Or64,
17680de80192f57cd132b31b233c65734de04939ce65sewardj                       getIReg(ra),
17690de80192f57cd132b31b233c65734de04939ce65sewardj                       getIReg(rb)));
17700de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
17710de80192f57cd132b31b233c65734de04939ce65sewardj      break;
17720de80192f57cd132b31b233c65734de04939ce65sewardj    case 182:  /* "ori" */
17730de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
17740de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Or64,
17750de80192f57cd132b31b233c65734de04939ce65sewardj                       getIReg(ra),
17760de80192f57cd132b31b233c65734de04939ce65sewardj                       mkU64(imm)));
17770de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
17780de80192f57cd132b31b233c65734de04939ce65sewardj      break;
17790de80192f57cd132b31b233c65734de04939ce65sewardj    case 183:
17800de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
17810de80192f57cd132b31b233c65734de04939ce65sewardj    case 184:
17820de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
17830de80192f57cd132b31b233c65734de04939ce65sewardj    case 185:
17840de80192f57cd132b31b233c65734de04939ce65sewardj      use_dirty_helper = 1;
17850de80192f57cd132b31b233c65734de04939ce65sewardj      break;
17860de80192f57cd132b31b233c65734de04939ce65sewardj    case 186:  /* "rotl" */
17870de80192f57cd132b31b233c65734de04939ce65sewardj      t0 = newTemp(Ity_I64);
17880de80192f57cd132b31b233c65734de04939ce65sewardj      t1 = newTemp(Ity_I64);
17890de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
17900de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t0, binop(Iop_Shl64,
17910de80192f57cd132b31b233c65734de04939ce65sewardj                       getIReg(ra),
17920de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to8, getIReg(rb))));
17930de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t1, binop(Iop_Shr64,
17940de80192f57cd132b31b233c65734de04939ce65sewardj                       getIReg(ra),
17950de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to8, binop(Iop_Sub64,
17960de80192f57cd132b31b233c65734de04939ce65sewardj                                             mkU64(0),
17970de80192f57cd132b31b233c65734de04939ce65sewardj                                             getIReg(rb)))));
17980de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Or64, mkexpr(t0), mkexpr(t1)));
17990de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
18000de80192f57cd132b31b233c65734de04939ce65sewardj      break;
18010de80192f57cd132b31b233c65734de04939ce65sewardj    case 187:  /* "rotli" */
18020de80192f57cd132b31b233c65734de04939ce65sewardj      t0 = newTemp(Ity_I64);
18030de80192f57cd132b31b233c65734de04939ce65sewardj      t1 = newTemp(Ity_I64);
18040de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
18050de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t0, binop(Iop_Shl64,
18060de80192f57cd132b31b233c65734de04939ce65sewardj                       getIReg(ra),
18070de80192f57cd132b31b233c65734de04939ce65sewardj                       mkU8(imm)));
18080de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t1, binop(Iop_Shr64,
18090de80192f57cd132b31b233c65734de04939ce65sewardj                       getIReg(ra),
18100de80192f57cd132b31b233c65734de04939ce65sewardj                       mkU8(0 - imm)));
18110de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Or64, mkexpr(t0), mkexpr(t1)));
18120de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
18130de80192f57cd132b31b233c65734de04939ce65sewardj      break;
18140de80192f57cd132b31b233c65734de04939ce65sewardj    case 188:   /* "shl" */
18150de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
18160de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Shl64,
18170de80192f57cd132b31b233c65734de04939ce65sewardj                       getIReg(ra),
18180de80192f57cd132b31b233c65734de04939ce65sewardj                       unop(Iop_64to8, getIReg(rb))));
18190de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
18200de80192f57cd132b31b233c65734de04939ce65sewardj
18210de80192f57cd132b31b233c65734de04939ce65sewardj      break;
18220de80192f57cd132b31b233c65734de04939ce65sewardj    case 189:   /* "shl16insli" */
18230de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
18240de80192f57cd132b31b233c65734de04939ce65sewardj      t3 = newTemp(Ity_I64);
18250de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t3, binop(Iop_Shl64, getIReg(ra), mkU8(16)));
18260de80192f57cd132b31b233c65734de04939ce65sewardj      imm &= 0xFFFFULL;
18270de80192f57cd132b31b233c65734de04939ce65sewardj      if (imm & 0x8000)
18280de80192f57cd132b31b233c65734de04939ce65sewardj      {
18290de80192f57cd132b31b233c65734de04939ce65sewardj        t4 = newTemp(Ity_I64);
18300de80192f57cd132b31b233c65734de04939ce65sewardj        assign(t4, mkU64(imm));
18310de80192f57cd132b31b233c65734de04939ce65sewardj        assign(t2, binop(Iop_Add64, mkexpr(t3), mkexpr(t4)));
18320de80192f57cd132b31b233c65734de04939ce65sewardj      }
18330de80192f57cd132b31b233c65734de04939ce65sewardj      else
18340de80192f57cd132b31b233c65734de04939ce65sewardj      {
18350de80192f57cd132b31b233c65734de04939ce65sewardj        assign(t2, binop(Iop_Add64, mkexpr(t3), mkU64(imm)));
18360de80192f57cd132b31b233c65734de04939ce65sewardj      }
18370de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
18380de80192f57cd132b31b233c65734de04939ce65sewardj
18390de80192f57cd132b31b233c65734de04939ce65sewardj      break;
18400de80192f57cd132b31b233c65734de04939ce65sewardj    case 190:   /* "shl1add" */
18410de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
18420de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Add64,
18430de80192f57cd132b31b233c65734de04939ce65sewardj                       binop(Iop_Shl64,
18440de80192f57cd132b31b233c65734de04939ce65sewardj                             getIReg(ra), mkU8(1)),
18450de80192f57cd132b31b233c65734de04939ce65sewardj                       getIReg(rb)));
18460de80192f57cd132b31b233c65734de04939ce65sewardj
18470de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
18480de80192f57cd132b31b233c65734de04939ce65sewardj      break;
18490de80192f57cd132b31b233c65734de04939ce65sewardj    case 191:   /* "shl1addx" */
18500de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
18510de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2,
18520de80192f57cd132b31b233c65734de04939ce65sewardj             unop(Iop_32Sto64,
18530de80192f57cd132b31b233c65734de04939ce65sewardj                  unop(Iop_64to32,
18540de80192f57cd132b31b233c65734de04939ce65sewardj                       binop(Iop_Add64,
18550de80192f57cd132b31b233c65734de04939ce65sewardj                             binop(Iop_Shl64,
18560de80192f57cd132b31b233c65734de04939ce65sewardj                                   getIReg(ra), mkU8(1)),
18570de80192f57cd132b31b233c65734de04939ce65sewardj                             getIReg(rb)))));
18580de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
18590de80192f57cd132b31b233c65734de04939ce65sewardj      break;
18600de80192f57cd132b31b233c65734de04939ce65sewardj    case 192:   /* "shl2add" */
18610de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
18620de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Add64,
18630de80192f57cd132b31b233c65734de04939ce65sewardj                       binop(Iop_Shl64,
18640de80192f57cd132b31b233c65734de04939ce65sewardj                             getIReg(ra), mkU8(2)),
18650de80192f57cd132b31b233c65734de04939ce65sewardj                       getIReg(rb)));
18660de80192f57cd132b31b233c65734de04939ce65sewardj
18670de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
18680de80192f57cd132b31b233c65734de04939ce65sewardj
18690de80192f57cd132b31b233c65734de04939ce65sewardj      break;
18700de80192f57cd132b31b233c65734de04939ce65sewardj    case 193:   /* "shl2addx" */
18710de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
18720de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2,
18730de80192f57cd132b31b233c65734de04939ce65sewardj             unop(Iop_32Sto64,
18740de80192f57cd132b31b233c65734de04939ce65sewardj                  unop(Iop_64to32,
18750de80192f57cd132b31b233c65734de04939ce65sewardj                       binop(Iop_Add64,
18760de80192f57cd132b31b233c65734de04939ce65sewardj                             binop(Iop_Shl64,
18770de80192f57cd132b31b233c65734de04939ce65sewardj                                   getIReg(ra), mkU8(2)),
18780de80192f57cd132b31b233c65734de04939ce65sewardj                             getIReg(rb)))));
18790de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
18800de80192f57cd132b31b233c65734de04939ce65sewardj
18810de80192f57cd132b31b233c65734de04939ce65sewardj      break;
18820de80192f57cd132b31b233c65734de04939ce65sewardj    case 194:   /* "shl3add" */
18830de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
18840de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Add64,
18850de80192f57cd132b31b233c65734de04939ce65sewardj                       binop(Iop_Shl64,
18860de80192f57cd132b31b233c65734de04939ce65sewardj                             getIReg(ra), mkU8(3)),
18870de80192f57cd132b31b233c65734de04939ce65sewardj                       getIReg(rb)));
18880de80192f57cd132b31b233c65734de04939ce65sewardj
18890de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
18900de80192f57cd132b31b233c65734de04939ce65sewardj      break;
18910de80192f57cd132b31b233c65734de04939ce65sewardj    case 195:   /* "shl3addx" */
18920de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
18930de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2,
18940de80192f57cd132b31b233c65734de04939ce65sewardj             unop(Iop_32Sto64,
18950de80192f57cd132b31b233c65734de04939ce65sewardj                  unop(Iop_64to32,
18960de80192f57cd132b31b233c65734de04939ce65sewardj                       binop(Iop_Add64,
18970de80192f57cd132b31b233c65734de04939ce65sewardj                             binop(Iop_Shl64,
18980de80192f57cd132b31b233c65734de04939ce65sewardj                                   getIReg(ra), mkU8(3)),
18990de80192f57cd132b31b233c65734de04939ce65sewardj                             getIReg(rb)))));
19000de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
19010de80192f57cd132b31b233c65734de04939ce65sewardj      break;
19020de80192f57cd132b31b233c65734de04939ce65sewardj    case 196:   /* "shli" */
19030de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
19040de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Shl64, getIReg(ra),
19050de80192f57cd132b31b233c65734de04939ce65sewardj                       mkU8(imm)));
19060de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
19070de80192f57cd132b31b233c65734de04939ce65sewardj      break;
19080de80192f57cd132b31b233c65734de04939ce65sewardj    case 197:   /* "shlx" */
19090de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
19100de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, unop(Iop_32Sto64,
19110de80192f57cd132b31b233c65734de04939ce65sewardj                      binop(Iop_Shl32,
19120de80192f57cd132b31b233c65734de04939ce65sewardj                            narrowTo(Ity_I32, getIReg(ra)),
19130de80192f57cd132b31b233c65734de04939ce65sewardj                            narrowTo(Ity_I8, getIReg(rb)))));
19140de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
19150de80192f57cd132b31b233c65734de04939ce65sewardj      break;
19160de80192f57cd132b31b233c65734de04939ce65sewardj    case 198:   /* "shlxi" */
19170de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
19180de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, signExtend(binop(Iop_Shl32,
19190de80192f57cd132b31b233c65734de04939ce65sewardj                                  narrowTo(Ity_I32, getIReg(ra)),
19200de80192f57cd132b31b233c65734de04939ce65sewardj                                  mkU8(imm)),
19210de80192f57cd132b31b233c65734de04939ce65sewardj                            32));
19220de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
19230de80192f57cd132b31b233c65734de04939ce65sewardj      break;
19240de80192f57cd132b31b233c65734de04939ce65sewardj    case 199:  /* "shrs" */
19250de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
19260de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Sar64, getIReg(ra),
19270de80192f57cd132b31b233c65734de04939ce65sewardj                       narrowTo(Ity_I8, getIReg(rb))));
19280de80192f57cd132b31b233c65734de04939ce65sewardj
19290de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
19300de80192f57cd132b31b233c65734de04939ce65sewardj      break;
19310de80192f57cd132b31b233c65734de04939ce65sewardj    case 200:  /* "shrsi" */
19320de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
19330de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Sar64, getIReg(ra),
19340de80192f57cd132b31b233c65734de04939ce65sewardj                       mkU8(imm)));
19350de80192f57cd132b31b233c65734de04939ce65sewardj
19360de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
19370de80192f57cd132b31b233c65734de04939ce65sewardj      break;
19380de80192f57cd132b31b233c65734de04939ce65sewardj    case 201:  /* "shru" */
19390de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
19400de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Shr64,
19410de80192f57cd132b31b233c65734de04939ce65sewardj                       getIReg(ra),
19420de80192f57cd132b31b233c65734de04939ce65sewardj                       narrowTo(Ity_I8, (getIReg(rb)))));
19430de80192f57cd132b31b233c65734de04939ce65sewardj
19440de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
19450de80192f57cd132b31b233c65734de04939ce65sewardj      break;
19460de80192f57cd132b31b233c65734de04939ce65sewardj    case 202:  /* "shrui" */
19470de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
19480de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Shr64, getIReg(ra), mkU8(imm)));
19490de80192f57cd132b31b233c65734de04939ce65sewardj
19500de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
19510de80192f57cd132b31b233c65734de04939ce65sewardj      break;
19520de80192f57cd132b31b233c65734de04939ce65sewardj    case 203:  /* "shrux" */
19530de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
19540de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, unop(Iop_32Sto64,
19550de80192f57cd132b31b233c65734de04939ce65sewardj                      (binop(Iop_Shr32,
19560de80192f57cd132b31b233c65734de04939ce65sewardj                             narrowTo(Ity_I32, getIReg(ra)),
19570de80192f57cd132b31b233c65734de04939ce65sewardj                             narrowTo(Ity_I8, getIReg(rb))))));
19580de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
19590de80192f57cd132b31b233c65734de04939ce65sewardj      break;
19600de80192f57cd132b31b233c65734de04939ce65sewardj    case 204:  /* "shruxi" */
19610de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
19620de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, unop(Iop_32Sto64,
19630de80192f57cd132b31b233c65734de04939ce65sewardj                      (binop(Iop_Shr32,
19640de80192f57cd132b31b233c65734de04939ce65sewardj                             narrowTo(Ity_I32, getIReg(ra)),
19650de80192f57cd132b31b233c65734de04939ce65sewardj                             mkU8(imm)))));
19660de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
19670de80192f57cd132b31b233c65734de04939ce65sewardj      break;
19680de80192f57cd132b31b233c65734de04939ce65sewardj    case 205:  /* "shufflebytes" */
19690de80192f57cd132b31b233c65734de04939ce65sewardj      use_dirty_helper = 1;
19700de80192f57cd132b31b233c65734de04939ce65sewardj      break;
19710de80192f57cd132b31b233c65734de04939ce65sewardj    case 206:  /* "st" */
19720de80192f57cd132b31b233c65734de04939ce65sewardj      store(getIReg(ra),  getIReg(rb));
19730de80192f57cd132b31b233c65734de04939ce65sewardj      break;
19740de80192f57cd132b31b233c65734de04939ce65sewardj    case 207:  /* "st1" */
19750de80192f57cd132b31b233c65734de04939ce65sewardj      store(getIReg(ra),  narrowTo(Ity_I8, getIReg(rb)));
19760de80192f57cd132b31b233c65734de04939ce65sewardj      break;
19770de80192f57cd132b31b233c65734de04939ce65sewardj    case 208:  /* "st1_add" */
19780de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
19790de80192f57cd132b31b233c65734de04939ce65sewardj      store(getIReg(opd[0]),  narrowTo(Ity_I8, getIReg(opd[1])));
19800de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Add64, getIReg(opd[0]), mkU64(opd[2])));
19810de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(opd[0], t2);
19820de80192f57cd132b31b233c65734de04939ce65sewardj      break;
19830de80192f57cd132b31b233c65734de04939ce65sewardj    case 209:  /* "st2" */
19840de80192f57cd132b31b233c65734de04939ce65sewardj      store(getIReg(ra),  narrowTo(Ity_I16, getIReg(rb)));
19850de80192f57cd132b31b233c65734de04939ce65sewardj      break;
19860de80192f57cd132b31b233c65734de04939ce65sewardj    case 210:  /* "st2_add" */
19870de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
19880de80192f57cd132b31b233c65734de04939ce65sewardj      store(getIReg(opd[0]),  narrowTo(Ity_I16, getIReg(opd[1])));
19890de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Add64, getIReg(opd[0]), mkU64(opd[2])));
19900de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(opd[0], t2);
19910de80192f57cd132b31b233c65734de04939ce65sewardj      break;
19920de80192f57cd132b31b233c65734de04939ce65sewardj    case 211:  /* "st4" */
19930de80192f57cd132b31b233c65734de04939ce65sewardj      store(getIReg(ra),  narrowTo(Ity_I32, getIReg(rb)));
19940de80192f57cd132b31b233c65734de04939ce65sewardj      break;
19950de80192f57cd132b31b233c65734de04939ce65sewardj    case 212:  /* "st4_add" */
19960de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
19970de80192f57cd132b31b233c65734de04939ce65sewardj      store(getIReg(opd[0]),  narrowTo(Ity_I32, getIReg(opd[1])));
19980de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Add64, getIReg(opd[0]), mkU64(opd[2])));
19990de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(opd[0], t2);
20000de80192f57cd132b31b233c65734de04939ce65sewardj      break;
20010de80192f57cd132b31b233c65734de04939ce65sewardj    case 213:  /* "st_add" */
20020de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
20030de80192f57cd132b31b233c65734de04939ce65sewardj      store(getIReg(opd[0]),  getIReg(opd[1]));
20040de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Add64, getIReg(opd[0]), mkU64(opd[2])));
20050de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(opd[0], t2);
20060de80192f57cd132b31b233c65734de04939ce65sewardj      break;
20070de80192f57cd132b31b233c65734de04939ce65sewardj    case 214:  /* "stnt" */
20080de80192f57cd132b31b233c65734de04939ce65sewardj      store(getIReg(ra),  getIReg(rb));
20090de80192f57cd132b31b233c65734de04939ce65sewardj      break;
20100de80192f57cd132b31b233c65734de04939ce65sewardj    case 215:  /* "stnt1" */
20110de80192f57cd132b31b233c65734de04939ce65sewardj      store(getIReg(ra),  narrowTo(Ity_I8, getIReg(rb)));
20120de80192f57cd132b31b233c65734de04939ce65sewardj      break;
20130de80192f57cd132b31b233c65734de04939ce65sewardj    case 216:  /* "stnt1_add" */
20140de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
20150de80192f57cd132b31b233c65734de04939ce65sewardj      store(getIReg(opd[0]),  narrowTo(Ity_I8, getIReg(opd[1])));
20160de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Add64, getIReg(opd[0]), mkU64(opd[2])));
20170de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(opd[0], t2);
20180de80192f57cd132b31b233c65734de04939ce65sewardj      break;
20190de80192f57cd132b31b233c65734de04939ce65sewardj    case 217:  /* "stnt2" */
20200de80192f57cd132b31b233c65734de04939ce65sewardj      store(getIReg(ra),  narrowTo(Ity_I16, getIReg(rb)));
20210de80192f57cd132b31b233c65734de04939ce65sewardj      break;
20220de80192f57cd132b31b233c65734de04939ce65sewardj    case 218:  /* "stnt2_add" */
20230de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
20240de80192f57cd132b31b233c65734de04939ce65sewardj      store(getIReg(opd[0]),  narrowTo(Ity_I16, getIReg(opd[1])));
20250de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Add64, getIReg(opd[0]), mkU64(opd[2])));
20260de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(opd[0], t2);
20270de80192f57cd132b31b233c65734de04939ce65sewardj      break;
20280de80192f57cd132b31b233c65734de04939ce65sewardj    case 219:  /* "stnt4" */
20290de80192f57cd132b31b233c65734de04939ce65sewardj      store(getIReg(ra),  narrowTo(Ity_I32, getIReg(rb)));
20300de80192f57cd132b31b233c65734de04939ce65sewardj      break;
20310de80192f57cd132b31b233c65734de04939ce65sewardj    case 220:  /* "stnt4_add" */
20320de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
20330de80192f57cd132b31b233c65734de04939ce65sewardj      store(getIReg(opd[0]),  narrowTo(Ity_I32, getIReg(opd[1])));
20340de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Add64, getIReg(opd[0]), mkU64(opd[2])));
20350de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(opd[0], t2);
20360de80192f57cd132b31b233c65734de04939ce65sewardj      break;
20370de80192f57cd132b31b233c65734de04939ce65sewardj    case 221:  /* "stnt_add" */
20380de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
20390de80192f57cd132b31b233c65734de04939ce65sewardj      store(getIReg(opd[0]),  getIReg(opd[1]));
20400de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Add64, getIReg(opd[0]), mkU64(opd[2])));
20410de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(opd[0], t2);
20420de80192f57cd132b31b233c65734de04939ce65sewardj      break;
20430de80192f57cd132b31b233c65734de04939ce65sewardj    case 222:  /* "sub" */
20440de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
20450de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Sub64, getIReg(ra),
20460de80192f57cd132b31b233c65734de04939ce65sewardj                       getIReg(rb)));
20470de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
20480de80192f57cd132b31b233c65734de04939ce65sewardj      break;
20490de80192f57cd132b31b233c65734de04939ce65sewardj    case 223:  /* "subx" */
20500de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
20510de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2,  unop(Iop_32Sto64,
20520de80192f57cd132b31b233c65734de04939ce65sewardj                       binop(Iop_Sub32,
20530de80192f57cd132b31b233c65734de04939ce65sewardj                             narrowTo(Ity_I32, getIReg(ra)),
20540de80192f57cd132b31b233c65734de04939ce65sewardj                             narrowTo(Ity_I32, getIReg(rb)))));
20550de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
20560de80192f57cd132b31b233c65734de04939ce65sewardj      break;
20570de80192f57cd132b31b233c65734de04939ce65sewardj    case 224:  /* "subxsc" */
20580de80192f57cd132b31b233c65734de04939ce65sewardj      use_dirty_helper = 1;
20590de80192f57cd132b31b233c65734de04939ce65sewardj      break;
20600de80192f57cd132b31b233c65734de04939ce65sewardj    case 225:  /* "swint0" */
20610de80192f57cd132b31b233c65734de04939ce65sewardj      vex_printf( "\n *** swint0 ***\n");
20620de80192f57cd132b31b233c65734de04939ce65sewardj      vassert(0);
20630de80192f57cd132b31b233c65734de04939ce65sewardj      break;
20640de80192f57cd132b31b233c65734de04939ce65sewardj    case 226:  /* "swint1" */
20650de80192f57cd132b31b233c65734de04939ce65sewardj      next = mkU64(guest_PC_curr_instr + 8);
20660de80192f57cd132b31b233c65734de04939ce65sewardj      jumpkind = Ijk_Sys_syscall;
20670de80192f57cd132b31b233c65734de04939ce65sewardj      break;
20680de80192f57cd132b31b233c65734de04939ce65sewardj    case 227:  /* "swint2" */
20690de80192f57cd132b31b233c65734de04939ce65sewardj      vex_printf( "\n *** swint2 ***\n");
20700de80192f57cd132b31b233c65734de04939ce65sewardj      vassert(0);
20710de80192f57cd132b31b233c65734de04939ce65sewardj      break;
20720de80192f57cd132b31b233c65734de04939ce65sewardj    case 228:  /* "swint3" */
20730de80192f57cd132b31b233c65734de04939ce65sewardj      vex_printf( "\n *** swint3 ***\n");
20740de80192f57cd132b31b233c65734de04939ce65sewardj      vassert(0);
20750de80192f57cd132b31b233c65734de04939ce65sewardj      break;
20760de80192f57cd132b31b233c65734de04939ce65sewardj    case 229:
20770de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
20780de80192f57cd132b31b233c65734de04939ce65sewardj    case 230:
20790de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
20800de80192f57cd132b31b233c65734de04939ce65sewardj    case 231:
20810de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
20820de80192f57cd132b31b233c65734de04939ce65sewardj    case 232:
20830de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
20840de80192f57cd132b31b233c65734de04939ce65sewardj    case 233:
20850de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
20860de80192f57cd132b31b233c65734de04939ce65sewardj    case 234:
20870de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
20880de80192f57cd132b31b233c65734de04939ce65sewardj    case 235:
20890de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
20900de80192f57cd132b31b233c65734de04939ce65sewardj    case 236:
20910de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
20920de80192f57cd132b31b233c65734de04939ce65sewardj    case 237:
20930de80192f57cd132b31b233c65734de04939ce65sewardj      use_dirty_helper = 1;
20940de80192f57cd132b31b233c65734de04939ce65sewardj      break;
20950de80192f57cd132b31b233c65734de04939ce65sewardj    case 238:  /* "v1cmpeq" */
20960de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
20970de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_CmpEQ8x8, getIReg(ra),
20980de80192f57cd132b31b233c65734de04939ce65sewardj                       getIReg(rb)));
20990de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
21000de80192f57cd132b31b233c65734de04939ce65sewardj      break;
21010de80192f57cd132b31b233c65734de04939ce65sewardj    case 239:  /* "v1cmpeqi" */
21020de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
21030de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_CmpEQ8x8, getIReg(ra),
21040de80192f57cd132b31b233c65734de04939ce65sewardj                       mkU64(imm)));
21050de80192f57cd132b31b233c65734de04939ce65sewardj
21060de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
21070de80192f57cd132b31b233c65734de04939ce65sewardj      break;
21080de80192f57cd132b31b233c65734de04939ce65sewardj    case 240:
21090de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21100de80192f57cd132b31b233c65734de04939ce65sewardj    case 241:
21110de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21120de80192f57cd132b31b233c65734de04939ce65sewardj    case 242:
21130de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21140de80192f57cd132b31b233c65734de04939ce65sewardj    case 243:
21150de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21160de80192f57cd132b31b233c65734de04939ce65sewardj    case 244:
21170de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21180de80192f57cd132b31b233c65734de04939ce65sewardj    case 245:
21190de80192f57cd132b31b233c65734de04939ce65sewardj      use_dirty_helper = 1;
21200de80192f57cd132b31b233c65734de04939ce65sewardj      break;
21210de80192f57cd132b31b233c65734de04939ce65sewardj    case 246:  /* "v1cmpne" */
21220de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
21230de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_CmpEQ8x8,
21240de80192f57cd132b31b233c65734de04939ce65sewardj                       binop(Iop_CmpEQ8x8, getIReg(ra),
21250de80192f57cd132b31b233c65734de04939ce65sewardj                             getIReg(rb)),
21260de80192f57cd132b31b233c65734de04939ce65sewardj                       getIReg(63)));
21270de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
21280de80192f57cd132b31b233c65734de04939ce65sewardj      break;
21290de80192f57cd132b31b233c65734de04939ce65sewardj    case 247:
21300de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21310de80192f57cd132b31b233c65734de04939ce65sewardj    case 248:
21320de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21330de80192f57cd132b31b233c65734de04939ce65sewardj    case 249:
21340de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21350de80192f57cd132b31b233c65734de04939ce65sewardj    case 250:
21360de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21370de80192f57cd132b31b233c65734de04939ce65sewardj    case 251:
21380de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21390de80192f57cd132b31b233c65734de04939ce65sewardj    case 252:
21400de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21410de80192f57cd132b31b233c65734de04939ce65sewardj    case 253:
21420de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21430de80192f57cd132b31b233c65734de04939ce65sewardj    case 254:
21440de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21450de80192f57cd132b31b233c65734de04939ce65sewardj    case 255:
21460de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21470de80192f57cd132b31b233c65734de04939ce65sewardj    case 256:
21480de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21490de80192f57cd132b31b233c65734de04939ce65sewardj    case 257:
21500de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21510de80192f57cd132b31b233c65734de04939ce65sewardj    case 258:
21520de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21530de80192f57cd132b31b233c65734de04939ce65sewardj    case 259:
21540de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21550de80192f57cd132b31b233c65734de04939ce65sewardj    case 260:
21560de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21570de80192f57cd132b31b233c65734de04939ce65sewardj    case 261:
21580de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21590de80192f57cd132b31b233c65734de04939ce65sewardj    case 262:
21600de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21610de80192f57cd132b31b233c65734de04939ce65sewardj    case 263:
21620de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21630de80192f57cd132b31b233c65734de04939ce65sewardj    case 264:
21640de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21650de80192f57cd132b31b233c65734de04939ce65sewardj    case 265:
21660de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21670de80192f57cd132b31b233c65734de04939ce65sewardj    case 266:
21680de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21690de80192f57cd132b31b233c65734de04939ce65sewardj    case 267:
21700de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21710de80192f57cd132b31b233c65734de04939ce65sewardj    case 268:
21720de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21730de80192f57cd132b31b233c65734de04939ce65sewardj    case 269:
21740de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21750de80192f57cd132b31b233c65734de04939ce65sewardj    case 270:
21760de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21770de80192f57cd132b31b233c65734de04939ce65sewardj    case 271:
21780de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21790de80192f57cd132b31b233c65734de04939ce65sewardj    case 272:
21800de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21810de80192f57cd132b31b233c65734de04939ce65sewardj    case 273:
21820de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21830de80192f57cd132b31b233c65734de04939ce65sewardj    case 274:
21840de80192f57cd132b31b233c65734de04939ce65sewardj      use_dirty_helper = 1;
21850de80192f57cd132b31b233c65734de04939ce65sewardj      break;
21860de80192f57cd132b31b233c65734de04939ce65sewardj    case 275:  /* "v1shrui" */
21870de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
21880de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Shr8x8,
21890de80192f57cd132b31b233c65734de04939ce65sewardj                       getIReg(ra),
21900de80192f57cd132b31b233c65734de04939ce65sewardj                       mkU64(imm)));
21910de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
21920de80192f57cd132b31b233c65734de04939ce65sewardj      break;
21930de80192f57cd132b31b233c65734de04939ce65sewardj    case 276:
21940de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21950de80192f57cd132b31b233c65734de04939ce65sewardj    case 277:
21960de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21970de80192f57cd132b31b233c65734de04939ce65sewardj    case 278:
21980de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
21990de80192f57cd132b31b233c65734de04939ce65sewardj    case 279:
22000de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22010de80192f57cd132b31b233c65734de04939ce65sewardj    case 280:
22020de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22030de80192f57cd132b31b233c65734de04939ce65sewardj    case 281:
22040de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22050de80192f57cd132b31b233c65734de04939ce65sewardj    case 282:
22060de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22070de80192f57cd132b31b233c65734de04939ce65sewardj    case 283:
22080de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22090de80192f57cd132b31b233c65734de04939ce65sewardj    case 284:
22100de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22110de80192f57cd132b31b233c65734de04939ce65sewardj    case 285:
22120de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22130de80192f57cd132b31b233c65734de04939ce65sewardj    case 286:
22140de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22150de80192f57cd132b31b233c65734de04939ce65sewardj    case 287:
22160de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22170de80192f57cd132b31b233c65734de04939ce65sewardj    case 288:
22180de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22190de80192f57cd132b31b233c65734de04939ce65sewardj    case 289:
22200de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22210de80192f57cd132b31b233c65734de04939ce65sewardj    case 290:
22220de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22230de80192f57cd132b31b233c65734de04939ce65sewardj    case 291:
22240de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22250de80192f57cd132b31b233c65734de04939ce65sewardj    case 292:
22260de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22270de80192f57cd132b31b233c65734de04939ce65sewardj    case 293:
22280de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22290de80192f57cd132b31b233c65734de04939ce65sewardj    case 294:
22300de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22310de80192f57cd132b31b233c65734de04939ce65sewardj    case 295:
22320de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22330de80192f57cd132b31b233c65734de04939ce65sewardj    case 296:
22340de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22350de80192f57cd132b31b233c65734de04939ce65sewardj    case 297:
22360de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22370de80192f57cd132b31b233c65734de04939ce65sewardj    case 298:
22380de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22390de80192f57cd132b31b233c65734de04939ce65sewardj    case 299:
22400de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22410de80192f57cd132b31b233c65734de04939ce65sewardj    case 300:
22420de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22430de80192f57cd132b31b233c65734de04939ce65sewardj    case 301:
22440de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22450de80192f57cd132b31b233c65734de04939ce65sewardj    case 302:
22460de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22470de80192f57cd132b31b233c65734de04939ce65sewardj    case 303:
22480de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22490de80192f57cd132b31b233c65734de04939ce65sewardj    case 304:
22500de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22510de80192f57cd132b31b233c65734de04939ce65sewardj    case 305:
22520de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22530de80192f57cd132b31b233c65734de04939ce65sewardj    case 306:
22540de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22550de80192f57cd132b31b233c65734de04939ce65sewardj    case 307:
22560de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22570de80192f57cd132b31b233c65734de04939ce65sewardj    case 308:
22580de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22590de80192f57cd132b31b233c65734de04939ce65sewardj    case 309:
22600de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22610de80192f57cd132b31b233c65734de04939ce65sewardj    case 310:
22620de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22630de80192f57cd132b31b233c65734de04939ce65sewardj    case 311:
22640de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22650de80192f57cd132b31b233c65734de04939ce65sewardj    case 312:
22660de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22670de80192f57cd132b31b233c65734de04939ce65sewardj    case 313:
22680de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22690de80192f57cd132b31b233c65734de04939ce65sewardj    case 314:
22700de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22710de80192f57cd132b31b233c65734de04939ce65sewardj    case 315:
22720de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22730de80192f57cd132b31b233c65734de04939ce65sewardj    case 316:
22740de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22750de80192f57cd132b31b233c65734de04939ce65sewardj    case 317:
22760de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22770de80192f57cd132b31b233c65734de04939ce65sewardj    case 318:
22780de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22790de80192f57cd132b31b233c65734de04939ce65sewardj    case 319:
22800de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22810de80192f57cd132b31b233c65734de04939ce65sewardj    case 320:
22820de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22830de80192f57cd132b31b233c65734de04939ce65sewardj    case 321:
22840de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22850de80192f57cd132b31b233c65734de04939ce65sewardj    case 322:
22860de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
22870de80192f57cd132b31b233c65734de04939ce65sewardj    case 323:
22880de80192f57cd132b31b233c65734de04939ce65sewardj      use_dirty_helper = 1;
22890de80192f57cd132b31b233c65734de04939ce65sewardj      break;
22900de80192f57cd132b31b233c65734de04939ce65sewardj    case 324:   /* "v4int_l" */
22910de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
22920de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Or64,
22930de80192f57cd132b31b233c65734de04939ce65sewardj                       binop(Iop_Shl64,
22940de80192f57cd132b31b233c65734de04939ce65sewardj                             getIReg(ra),
22950de80192f57cd132b31b233c65734de04939ce65sewardj                             mkU8(32)),
22960de80192f57cd132b31b233c65734de04939ce65sewardj                       binop(Iop_And64,
22970de80192f57cd132b31b233c65734de04939ce65sewardj                             getIReg(rb),
22980de80192f57cd132b31b233c65734de04939ce65sewardj                             mkU64(0xFFFFFFFF))));
22990de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
23000de80192f57cd132b31b233c65734de04939ce65sewardj      break;
23010de80192f57cd132b31b233c65734de04939ce65sewardj    case 325:
23020de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
23030de80192f57cd132b31b233c65734de04939ce65sewardj    case 326:
23040de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
23050de80192f57cd132b31b233c65734de04939ce65sewardj    case 327:
23060de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
23070de80192f57cd132b31b233c65734de04939ce65sewardj    case 328:
23080de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
23090de80192f57cd132b31b233c65734de04939ce65sewardj    case 329:
23100de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
23110de80192f57cd132b31b233c65734de04939ce65sewardj    case 330:
23120de80192f57cd132b31b233c65734de04939ce65sewardj      /* Fall-through */
23130de80192f57cd132b31b233c65734de04939ce65sewardj    case 331:
23140de80192f57cd132b31b233c65734de04939ce65sewardj      use_dirty_helper = 1;
23150de80192f57cd132b31b233c65734de04939ce65sewardj      break;
23160de80192f57cd132b31b233c65734de04939ce65sewardj    case 332:   /* "wh64" */     /* Ignore store hint */
23170de80192f57cd132b31b233c65734de04939ce65sewardj      break;
23180de80192f57cd132b31b233c65734de04939ce65sewardj    case 333:   /* "xor" */
23190de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
23200de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Xor64,
23210de80192f57cd132b31b233c65734de04939ce65sewardj                       getIReg(ra),
23220de80192f57cd132b31b233c65734de04939ce65sewardj                       getIReg(rb)));
23230de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
23240de80192f57cd132b31b233c65734de04939ce65sewardj      break;
23250de80192f57cd132b31b233c65734de04939ce65sewardj    case 334:   /* "xori" */
23260de80192f57cd132b31b233c65734de04939ce65sewardj      t2 = newTemp(Ity_I64);
23270de80192f57cd132b31b233c65734de04939ce65sewardj      assign(t2, binop(Iop_Xor64,
23280de80192f57cd132b31b233c65734de04939ce65sewardj                       getIReg(ra),
23290de80192f57cd132b31b233c65734de04939ce65sewardj                       mkU64(imm)));
23300de80192f57cd132b31b233c65734de04939ce65sewardj      MARK_REG_WB(rd, t2);
23310de80192f57cd132b31b233c65734de04939ce65sewardj      break;
23320de80192f57cd132b31b233c65734de04939ce65sewardj    case 335:  /* "(null)" */   /* ignore */
23330de80192f57cd132b31b233c65734de04939ce65sewardj      break;
23340de80192f57cd132b31b233c65734de04939ce65sewardj    default:
23350de80192f57cd132b31b233c65734de04939ce65sewardj
23360de80192f57cd132b31b233c65734de04939ce65sewardj    decode_failure:
23370de80192f57cd132b31b233c65734de04939ce65sewardj      vex_printf("error: %d\n",  (Int)opcode);
23380de80192f57cd132b31b233c65734de04939ce65sewardj
23390de80192f57cd132b31b233c65734de04939ce65sewardj      /* All decode failures end up here. */
23400de80192f57cd132b31b233c65734de04939ce65sewardj      vex_printf("vex tilegx->IR: unhandled instruction: "
23410de80192f57cd132b31b233c65734de04939ce65sewardj                 "%s 0x%llx 0x%llx 0x%llx 0x%llx\n",
23420de80192f57cd132b31b233c65734de04939ce65sewardj                 decoded[n].opcode->name,
23430de80192f57cd132b31b233c65734de04939ce65sewardj                 opd[0], opd[1], opd[2], opd[3]);
23440de80192f57cd132b31b233c65734de04939ce65sewardj
23450de80192f57cd132b31b233c65734de04939ce65sewardj      /* Tell the dispatcher that this insn cannot be decoded, and so has
23460de80192f57cd132b31b233c65734de04939ce65sewardj         not been executed, and (is currently) the next to be executed. */
23470de80192f57cd132b31b233c65734de04939ce65sewardj      stmt(IRStmt_Put(offsetof(VexGuestTILEGXState, guest_pc),
23480de80192f57cd132b31b233c65734de04939ce65sewardj                      mkU64(guest_PC_curr_instr)));
23490de80192f57cd132b31b233c65734de04939ce65sewardj      dres.whatNext = Dis_StopHere;
23500de80192f57cd132b31b233c65734de04939ce65sewardj      dres.len = 0;
23510de80192f57cd132b31b233c65734de04939ce65sewardj      return dres;
23520de80192f57cd132b31b233c65734de04939ce65sewardj    }
23530de80192f57cd132b31b233c65734de04939ce65sewardj
23540de80192f57cd132b31b233c65734de04939ce65sewardj    /* Hook the dirty helper for rare instruxtions. */
23550de80192f57cd132b31b233c65734de04939ce65sewardj    if (use_dirty_helper)
23560de80192f57cd132b31b233c65734de04939ce65sewardj    {
23570de80192f57cd132b31b233c65734de04939ce65sewardj      Int i = 0;
23580de80192f57cd132b31b233c65734de04939ce65sewardj      Int wbc = 0;
23590de80192f57cd132b31b233c65734de04939ce65sewardj      IRExpr *opc_oprand[5];
23600de80192f57cd132b31b233c65734de04939ce65sewardj
23610de80192f57cd132b31b233c65734de04939ce65sewardj      opc_oprand[0] = mkU64(opcode);
23620de80192f57cd132b31b233c65734de04939ce65sewardj
23630de80192f57cd132b31b233c65734de04939ce65sewardj      /* Get the operand registers or immediate. */
23640de80192f57cd132b31b233c65734de04939ce65sewardj      for (i = 0 ; i < 4; i++)
23650de80192f57cd132b31b233c65734de04939ce65sewardj      {
23660de80192f57cd132b31b233c65734de04939ce65sewardj        opc_oprand[i + 1] = NULL;
23670de80192f57cd132b31b233c65734de04939ce65sewardj
23680de80192f57cd132b31b233c65734de04939ce65sewardj        if (opd_dst_map & (1ULL << i))
23690de80192f57cd132b31b233c65734de04939ce65sewardj        {
23700de80192f57cd132b31b233c65734de04939ce65sewardj          tb[wbc] = newTemp(Ity_I64);
23710de80192f57cd132b31b233c65734de04939ce65sewardj          wbc++;
23720de80192f57cd132b31b233c65734de04939ce65sewardj          opc_oprand[i + 1] = getIReg(opd[i]);
23730de80192f57cd132b31b233c65734de04939ce65sewardj        }
23740de80192f57cd132b31b233c65734de04939ce65sewardj        else if (opd_imm_map & (1ULL << i))
23750de80192f57cd132b31b233c65734de04939ce65sewardj          opc_oprand[i + 1] = mkU64(opd[i]);
23760de80192f57cd132b31b233c65734de04939ce65sewardj        else if (opd_src_map & (1ULL << i))
23770de80192f57cd132b31b233c65734de04939ce65sewardj          opc_oprand[i + 1] = getIReg(opd[i]);
23780de80192f57cd132b31b233c65734de04939ce65sewardj        else
23790de80192f57cd132b31b233c65734de04939ce65sewardj          opc_oprand[i + 1] = mkU64(0xfeee);
23800de80192f57cd132b31b233c65734de04939ce65sewardj      }
23810de80192f57cd132b31b233c65734de04939ce65sewardj
23820de80192f57cd132b31b233c65734de04939ce65sewardj      IRExpr **args = mkIRExprVec_5(opc_oprand[0], opc_oprand[1],
23830de80192f57cd132b31b233c65734de04939ce65sewardj                                    opc_oprand[2], opc_oprand[3],
23840de80192f57cd132b31b233c65734de04939ce65sewardj                                    opc_oprand[4]);
23850de80192f57cd132b31b233c65734de04939ce65sewardj      IRDirty *genIR = NULL;
23860de80192f57cd132b31b233c65734de04939ce65sewardj
23870de80192f57cd132b31b233c65734de04939ce65sewardj      switch (wbc) {
23880de80192f57cd132b31b233c65734de04939ce65sewardj      case 0:
23890de80192f57cd132b31b233c65734de04939ce65sewardj        {
23900de80192f57cd132b31b233c65734de04939ce65sewardj          genIR = unsafeIRDirty_0_N (0/*regparms*/,
23910de80192f57cd132b31b233c65734de04939ce65sewardj                                     "tilegx_dirtyhelper_gen",
23920de80192f57cd132b31b233c65734de04939ce65sewardj                                     &tilegx_dirtyhelper_gen,
23930de80192f57cd132b31b233c65734de04939ce65sewardj                                     args);
23940de80192f57cd132b31b233c65734de04939ce65sewardj        }
23950de80192f57cd132b31b233c65734de04939ce65sewardj        break;
23960de80192f57cd132b31b233c65734de04939ce65sewardj      case 1:
23970de80192f57cd132b31b233c65734de04939ce65sewardj        {
23980de80192f57cd132b31b233c65734de04939ce65sewardj          genIR = unsafeIRDirty_1_N (tb[0],
23990de80192f57cd132b31b233c65734de04939ce65sewardj                                     0/*regparms*/,
24000de80192f57cd132b31b233c65734de04939ce65sewardj                                     "tilegx_dirtyhelper_gen",
24010de80192f57cd132b31b233c65734de04939ce65sewardj                                     &tilegx_dirtyhelper_gen,
24020de80192f57cd132b31b233c65734de04939ce65sewardj                                     args);
24030de80192f57cd132b31b233c65734de04939ce65sewardj        }
24040de80192f57cd132b31b233c65734de04939ce65sewardj        break;
24050de80192f57cd132b31b233c65734de04939ce65sewardj      default:
24060de80192f57cd132b31b233c65734de04939ce65sewardj        vex_printf("opc = %d\n", (Int)opcode);
24070de80192f57cd132b31b233c65734de04939ce65sewardj        vassert(0);
24080de80192f57cd132b31b233c65734de04939ce65sewardj      }
24090de80192f57cd132b31b233c65734de04939ce65sewardj
24100de80192f57cd132b31b233c65734de04939ce65sewardj      stmt(IRStmt_Dirty(genIR));
24110de80192f57cd132b31b233c65734de04939ce65sewardj
24120de80192f57cd132b31b233c65734de04939ce65sewardj      wbc = 0;
24130de80192f57cd132b31b233c65734de04939ce65sewardj      for (i = 0 ; i < 4; i++)
24140de80192f57cd132b31b233c65734de04939ce65sewardj      {
24150de80192f57cd132b31b233c65734de04939ce65sewardj        if(opd_dst_map & (1 << i))
24160de80192f57cd132b31b233c65734de04939ce65sewardj        {
24170de80192f57cd132b31b233c65734de04939ce65sewardj          /* Queue the writeback destination registers. */
24180de80192f57cd132b31b233c65734de04939ce65sewardj          MARK_REG_WB(opd[i], tb[wbc]);
24190de80192f57cd132b31b233c65734de04939ce65sewardj          wbc++;
24200de80192f57cd132b31b233c65734de04939ce65sewardj        }
24210de80192f57cd132b31b233c65734de04939ce65sewardj      }
24220de80192f57cd132b31b233c65734de04939ce65sewardj    }
24230de80192f57cd132b31b233c65734de04939ce65sewardj  }
24240de80192f57cd132b31b233c65734de04939ce65sewardj
24250de80192f57cd132b31b233c65734de04939ce65sewardj  /* Write back registers for a bundle. Note have to get all source registers
24260de80192f57cd132b31b233c65734de04939ce65sewardj     for all instructions in a bundle before write the destinations b/c this is
24270de80192f57cd132b31b233c65734de04939ce65sewardj     an VLIW processor. */
24280de80192f57cd132b31b233c65734de04939ce65sewardj  for (n = 0; n < rd_wb_index; n++)
24290de80192f57cd132b31b233c65734de04939ce65sewardj    putIReg(rd_wb_reg[n], mkexpr(rd_wb_temp[n]));
24300de80192f57cd132b31b233c65734de04939ce65sewardj
24310de80192f57cd132b31b233c65734de04939ce65sewardj  /* Add branch IR if apply finally, only upto one branch per bundle. */
24320de80192f57cd132b31b233c65734de04939ce65sewardj  if (bstmt) {
24330de80192f57cd132b31b233c65734de04939ce65sewardj    stmt(bstmt);
24340de80192f57cd132b31b233c65734de04939ce65sewardj    dres.whatNext = Dis_StopHere;
24350de80192f57cd132b31b233c65734de04939ce65sewardj
24360de80192f57cd132b31b233c65734de04939ce65sewardj    dres.jk_StopHere = jumpkind;
24370de80192f57cd132b31b233c65734de04939ce65sewardj    stmt(IRStmt_Put(offsetof(VexGuestTILEGXState, guest_pc),
24380de80192f57cd132b31b233c65734de04939ce65sewardj                    mkU64(guest_PC_curr_instr + 8)));
24390de80192f57cd132b31b233c65734de04939ce65sewardj  } else if (next) {
24400de80192f57cd132b31b233c65734de04939ce65sewardj    if (steering_pc != -1ULL) {
24410de80192f57cd132b31b233c65734de04939ce65sewardj      if (resteerOkFn(callback_opaque, steering_pc)) {
24420de80192f57cd132b31b233c65734de04939ce65sewardj        dres.whatNext   = Dis_ResteerU;
24430de80192f57cd132b31b233c65734de04939ce65sewardj        dres.continueAt = steering_pc;
24440de80192f57cd132b31b233c65734de04939ce65sewardj        stmt(IRStmt_Put(offsetof(VexGuestTILEGXState, guest_pc),
24450de80192f57cd132b31b233c65734de04939ce65sewardj                        mkU64(steering_pc)));
24460de80192f57cd132b31b233c65734de04939ce65sewardj      } else {
24470de80192f57cd132b31b233c65734de04939ce65sewardj        dres.whatNext = Dis_StopHere;
24480de80192f57cd132b31b233c65734de04939ce65sewardj        dres.jk_StopHere = jumpkind;
24490de80192f57cd132b31b233c65734de04939ce65sewardj        stmt(IRStmt_Put(offsetof(VexGuestTILEGXState, guest_pc),
24500de80192f57cd132b31b233c65734de04939ce65sewardj                        mkU64(steering_pc)));
24510de80192f57cd132b31b233c65734de04939ce65sewardj      }
24520de80192f57cd132b31b233c65734de04939ce65sewardj    } else {
24530de80192f57cd132b31b233c65734de04939ce65sewardj      dres.whatNext = Dis_StopHere;
24540de80192f57cd132b31b233c65734de04939ce65sewardj      dres.jk_StopHere = jumpkind;
24550de80192f57cd132b31b233c65734de04939ce65sewardj      stmt(IRStmt_Put(offsetof(VexGuestTILEGXState, guest_pc), next));
24560de80192f57cd132b31b233c65734de04939ce65sewardj    }
24570de80192f57cd132b31b233c65734de04939ce65sewardj  } else {
24580de80192f57cd132b31b233c65734de04939ce65sewardj    /* As dafault dres.whatNext = Dis_Continue. */
24590de80192f57cd132b31b233c65734de04939ce65sewardj    stmt(IRStmt_Put(offsetof(VexGuestTILEGXState, guest_pc),
24600de80192f57cd132b31b233c65734de04939ce65sewardj                    mkU64(guest_PC_curr_instr + 8)));
24610de80192f57cd132b31b233c65734de04939ce65sewardj  }
24620de80192f57cd132b31b233c65734de04939ce65sewardj
24630de80192f57cd132b31b233c65734de04939ce65sewardj  irsb->jumpkind = Ijk_Boring;
24640de80192f57cd132b31b233c65734de04939ce65sewardj  irsb->next = NULL;
24650de80192f57cd132b31b233c65734de04939ce65sewardj  dres.len = 8;
24660de80192f57cd132b31b233c65734de04939ce65sewardj
24670de80192f57cd132b31b233c65734de04939ce65sewardj decode_success:
24680de80192f57cd132b31b233c65734de04939ce65sewardj
24690de80192f57cd132b31b233c65734de04939ce65sewardj  return dres;
24700de80192f57cd132b31b233c65734de04939ce65sewardj}
24710de80192f57cd132b31b233c65734de04939ce65sewardj
24720de80192f57cd132b31b233c65734de04939ce65sewardj/*------------------------------------------------------------*/
24730de80192f57cd132b31b233c65734de04939ce65sewardj/*--- Top-level fn                                         ---*/
24740de80192f57cd132b31b233c65734de04939ce65sewardj/*------------------------------------------------------------*/
24750de80192f57cd132b31b233c65734de04939ce65sewardj
24760de80192f57cd132b31b233c65734de04939ce65sewardj/* Disassemble a single instruction into IR.  The instruction
24770de80192f57cd132b31b233c65734de04939ce65sewardj   is located in host memory at &guest_code[delta]. */
24780de80192f57cd132b31b233c65734de04939ce65sewardj
24790de80192f57cd132b31b233c65734de04939ce65sewardjDisResult
24800de80192f57cd132b31b233c65734de04939ce65sewardjdisInstr_TILEGX ( IRSB* irsb_IN,
24810de80192f57cd132b31b233c65734de04939ce65sewardj                  Bool (*resteerOkFn) (void *, Addr),
24820de80192f57cd132b31b233c65734de04939ce65sewardj                  Bool resteerCisOk,
24830de80192f57cd132b31b233c65734de04939ce65sewardj                  void* callback_opaque,
24840de80192f57cd132b31b233c65734de04939ce65sewardj                  const UChar* guest_code_IN,
24850de80192f57cd132b31b233c65734de04939ce65sewardj                  Long delta,
24860de80192f57cd132b31b233c65734de04939ce65sewardj                  Addr guest_IP,
24870de80192f57cd132b31b233c65734de04939ce65sewardj                  VexArch guest_arch,
24880de80192f57cd132b31b233c65734de04939ce65sewardj                  const VexArchInfo* archinfo,
24890de80192f57cd132b31b233c65734de04939ce65sewardj                  const VexAbiInfo* abiinfo,
24900de80192f57cd132b31b233c65734de04939ce65sewardj                  VexEndness host_endness_IN,
24910de80192f57cd132b31b233c65734de04939ce65sewardj                  Bool sigill_diag_IN )
24920de80192f57cd132b31b233c65734de04939ce65sewardj{
24930de80192f57cd132b31b233c65734de04939ce65sewardj  DisResult dres;
24940de80192f57cd132b31b233c65734de04939ce65sewardj
24950de80192f57cd132b31b233c65734de04939ce65sewardj  /* Set globals (see top of this file) */
24960de80192f57cd132b31b233c65734de04939ce65sewardj  vassert(guest_arch == VexArchTILEGX);
24970de80192f57cd132b31b233c65734de04939ce65sewardj
24980de80192f57cd132b31b233c65734de04939ce65sewardj  guest_code = (UChar*)(Addr)guest_code_IN;
24990de80192f57cd132b31b233c65734de04939ce65sewardj  irsb = irsb_IN;
25000de80192f57cd132b31b233c65734de04939ce65sewardj  host_endness = host_endness_IN;
25010de80192f57cd132b31b233c65734de04939ce65sewardj  guest_PC_curr_instr = (Addr64) guest_IP;
25020de80192f57cd132b31b233c65734de04939ce65sewardj  guest_PC_bbstart = (Addr64) toUInt(guest_IP - delta);
25030de80192f57cd132b31b233c65734de04939ce65sewardj
25040de80192f57cd132b31b233c65734de04939ce65sewardj  dres = disInstr_TILEGX_WRK(resteerOkFn, resteerCisOk,
25050de80192f57cd132b31b233c65734de04939ce65sewardj                             callback_opaque,
25060de80192f57cd132b31b233c65734de04939ce65sewardj                             delta, archinfo, abiinfo, sigill_diag_IN);
250732bf4136270f100788bcad4edb7d47e1b43df254zliu
25080de80192f57cd132b31b233c65734de04939ce65sewardj  return dres;
25090de80192f57cd132b31b233c65734de04939ce65sewardj}
25100de80192f57cd132b31b233c65734de04939ce65sewardj
25110de80192f57cd132b31b233c65734de04939ce65sewardj/*--------------------------------------------------------------------*/
25120de80192f57cd132b31b233c65734de04939ce65sewardj/*--- end                                      guest_tilegx_toIR.c ---*/
25130de80192f57cd132b31b233c65734de04939ce65sewardj/*--------------------------------------------------------------------*/
2514