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