10de80192f57cd132b31b233c65734de04939ce65sewardj 20de80192f57cd132b31b233c65734de04939ce65sewardj/*---------------------------------------------------------------*/ 30de80192f57cd132b31b233c65734de04939ce65sewardj/*--- begin host_tilegx_isel.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., 51 Franklin Street, Fifth Floor, Boston, MA 250de80192f57cd132b31b233c65734de04939ce65sewardj 02110-1301, 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#include "libvex_basictypes.h" 330de80192f57cd132b31b233c65734de04939ce65sewardj#include "libvex_ir.h" 340de80192f57cd132b31b233c65734de04939ce65sewardj#include "libvex.h" 350de80192f57cd132b31b233c65734de04939ce65sewardj 360de80192f57cd132b31b233c65734de04939ce65sewardj#include "main_util.h" 370de80192f57cd132b31b233c65734de04939ce65sewardj#include "main_globals.h" 380de80192f57cd132b31b233c65734de04939ce65sewardj#include "host_generic_regs.h" 390de80192f57cd132b31b233c65734de04939ce65sewardj#include "host_tilegx_defs.h" 400de80192f57cd132b31b233c65734de04939ce65sewardj#include "tilegx_disasm.h" 410de80192f57cd132b31b233c65734de04939ce65sewardj 420de80192f57cd132b31b233c65734de04939ce65sewardj/*---------------------------------------------------------*/ 430de80192f57cd132b31b233c65734de04939ce65sewardj/*--- Register Usage Conventions ---*/ 440de80192f57cd132b31b233c65734de04939ce65sewardj/*---------------------------------------------------------*/ 450de80192f57cd132b31b233c65734de04939ce65sewardj 460de80192f57cd132b31b233c65734de04939ce65sewardj/* GPR register class for tilegx */ 470de80192f57cd132b31b233c65734de04939ce65sewardj#define HRcGPR() HRcInt64 480de80192f57cd132b31b233c65734de04939ce65sewardj 490de80192f57cd132b31b233c65734de04939ce65sewardj/* guest_COND offset. */ 500de80192f57cd132b31b233c65734de04939ce65sewardj#define COND_OFFSET() (608) 510de80192f57cd132b31b233c65734de04939ce65sewardj 520de80192f57cd132b31b233c65734de04939ce65sewardj/*---------------------------------------------------------*/ 530de80192f57cd132b31b233c65734de04939ce65sewardj/*--- ISelEnv ---*/ 540de80192f57cd132b31b233c65734de04939ce65sewardj/*---------------------------------------------------------*/ 550de80192f57cd132b31b233c65734de04939ce65sewardj 560de80192f57cd132b31b233c65734de04939ce65sewardj/* This carries around: 570de80192f57cd132b31b233c65734de04939ce65sewardj 580de80192f57cd132b31b233c65734de04939ce65sewardj - A mapping from IRTemp to IRType, giving the type of any IRTemp we 590de80192f57cd132b31b233c65734de04939ce65sewardj might encounter. This is computed before insn selection starts, 600de80192f57cd132b31b233c65734de04939ce65sewardj and does not change. 610de80192f57cd132b31b233c65734de04939ce65sewardj 620de80192f57cd132b31b233c65734de04939ce65sewardj - A mapping from IRTemp to HReg. This tells the insn selector 630de80192f57cd132b31b233c65734de04939ce65sewardj which virtual register(s) are associated with each IRTemp 640de80192f57cd132b31b233c65734de04939ce65sewardj temporary. This is computed before insn selection starts, and 650de80192f57cd132b31b233c65734de04939ce65sewardj does not change. We expect this mapping to map precisely the 660de80192f57cd132b31b233c65734de04939ce65sewardj same set of IRTemps as the type mapping does. 670de80192f57cd132b31b233c65734de04939ce65sewardj 680de80192f57cd132b31b233c65734de04939ce65sewardj - vregmap holds the primary register for the IRTemp. 690de80192f57cd132b31b233c65734de04939ce65sewardj - vregmapHI holds the secondary register for the IRTemp, 700de80192f57cd132b31b233c65734de04939ce65sewardj if any is needed. That's only for Ity_I64 temps 710de80192f57cd132b31b233c65734de04939ce65sewardj in 32 bit mode or Ity_I128 temps in 64-bit mode. 720de80192f57cd132b31b233c65734de04939ce65sewardj 730de80192f57cd132b31b233c65734de04939ce65sewardj - The name of the vreg in which we stash a copy of the link reg, 740de80192f57cd132b31b233c65734de04939ce65sewardj so helper functions don't kill it. 750de80192f57cd132b31b233c65734de04939ce65sewardj 760de80192f57cd132b31b233c65734de04939ce65sewardj - The code array, that is, the insns selected so far. 770de80192f57cd132b31b233c65734de04939ce65sewardj 780de80192f57cd132b31b233c65734de04939ce65sewardj - A counter, for generating new virtual registers. 790de80192f57cd132b31b233c65734de04939ce65sewardj 800de80192f57cd132b31b233c65734de04939ce65sewardj - The host subarchitecture we are selecting insns for. 810de80192f57cd132b31b233c65734de04939ce65sewardj This is set at the start and does not change. 820de80192f57cd132b31b233c65734de04939ce65sewardj 830de80192f57cd132b31b233c65734de04939ce65sewardj - A Bool to tell us if the host is 32 or 64bit. 840de80192f57cd132b31b233c65734de04939ce65sewardj This is set at the start and does not change. 850de80192f57cd132b31b233c65734de04939ce65sewardj 860de80192f57cd132b31b233c65734de04939ce65sewardj - An IRExpr*, which may be NULL, holding the IR expression (an 870de80192f57cd132b31b233c65734de04939ce65sewardj IRRoundingMode-encoded value) to which the FPU's rounding mode 880de80192f57cd132b31b233c65734de04939ce65sewardj was most recently set. Setting to NULL is always safe. Used to 890de80192f57cd132b31b233c65734de04939ce65sewardj avoid redundant settings of the FPU's rounding mode, as 900de80192f57cd132b31b233c65734de04939ce65sewardj described in set_FPU_rounding_mode below. 910de80192f57cd132b31b233c65734de04939ce65sewardj 920de80192f57cd132b31b233c65734de04939ce65sewardj - A VexMiscInfo*, needed for knowing how to generate 930de80192f57cd132b31b233c65734de04939ce65sewardj function calls for this target 940de80192f57cd132b31b233c65734de04939ce65sewardj*/ 950de80192f57cd132b31b233c65734de04939ce65sewardjtypedef struct { 960de80192f57cd132b31b233c65734de04939ce65sewardj IRTypeEnv *type_env; 970de80192f57cd132b31b233c65734de04939ce65sewardj 980de80192f57cd132b31b233c65734de04939ce65sewardj HReg *vregmap; 990de80192f57cd132b31b233c65734de04939ce65sewardj 1000de80192f57cd132b31b233c65734de04939ce65sewardj Int n_vregmap; 1010de80192f57cd132b31b233c65734de04939ce65sewardj 1020de80192f57cd132b31b233c65734de04939ce65sewardj HInstrArray *code; 1030de80192f57cd132b31b233c65734de04939ce65sewardj 1040de80192f57cd132b31b233c65734de04939ce65sewardj Int vreg_ctr; 1050de80192f57cd132b31b233c65734de04939ce65sewardj 1060de80192f57cd132b31b233c65734de04939ce65sewardj UInt hwcaps; 1070de80192f57cd132b31b233c65734de04939ce65sewardj 1080de80192f57cd132b31b233c65734de04939ce65sewardj Bool mode64; 1090de80192f57cd132b31b233c65734de04939ce65sewardj 1100de80192f57cd132b31b233c65734de04939ce65sewardj Bool chainingAllowed; 1110de80192f57cd132b31b233c65734de04939ce65sewardj 1120de80192f57cd132b31b233c65734de04939ce65sewardj Addr64 max_ga; 1130de80192f57cd132b31b233c65734de04939ce65sewardj 1140de80192f57cd132b31b233c65734de04939ce65sewardj IRExpr *previous_rm; 1150de80192f57cd132b31b233c65734de04939ce65sewardj 1160de80192f57cd132b31b233c65734de04939ce65sewardj VexAbiInfo *vbi; 1170de80192f57cd132b31b233c65734de04939ce65sewardj} ISelEnv; 1180de80192f57cd132b31b233c65734de04939ce65sewardj 1190de80192f57cd132b31b233c65734de04939ce65sewardjstatic HReg lookupIRTemp ( ISelEnv * env, IRTemp tmp ) 1200de80192f57cd132b31b233c65734de04939ce65sewardj{ 1210de80192f57cd132b31b233c65734de04939ce65sewardj vassert(tmp >= 0); 1220de80192f57cd132b31b233c65734de04939ce65sewardj vassert(tmp < env->n_vregmap); 1230de80192f57cd132b31b233c65734de04939ce65sewardj return env->vregmap[tmp]; 1240de80192f57cd132b31b233c65734de04939ce65sewardj} 1250de80192f57cd132b31b233c65734de04939ce65sewardj 1260de80192f57cd132b31b233c65734de04939ce65sewardjstatic void addInstr ( ISelEnv * env, TILEGXInstr * instr ) 1270de80192f57cd132b31b233c65734de04939ce65sewardj{ 1280de80192f57cd132b31b233c65734de04939ce65sewardj addHInstr(env->code, instr); 1290de80192f57cd132b31b233c65734de04939ce65sewardj if (vex_traceflags & VEX_TRACE_VCODE) { 1300de80192f57cd132b31b233c65734de04939ce65sewardj ppTILEGXInstr(instr); 1310de80192f57cd132b31b233c65734de04939ce65sewardj vex_printf("\n"); 1320de80192f57cd132b31b233c65734de04939ce65sewardj } 1330de80192f57cd132b31b233c65734de04939ce65sewardj} 1340de80192f57cd132b31b233c65734de04939ce65sewardj 1350de80192f57cd132b31b233c65734de04939ce65sewardjstatic HReg newVRegI ( ISelEnv * env ) 1360de80192f57cd132b31b233c65734de04939ce65sewardj{ 1370de80192f57cd132b31b233c65734de04939ce65sewardj HReg reg = mkHReg(True /*virtual R*/, HRcGPR(), 0, env->vreg_ctr); 1380de80192f57cd132b31b233c65734de04939ce65sewardj env->vreg_ctr++; 1390de80192f57cd132b31b233c65734de04939ce65sewardj return reg; 1400de80192f57cd132b31b233c65734de04939ce65sewardj} 1410de80192f57cd132b31b233c65734de04939ce65sewardj 1420de80192f57cd132b31b233c65734de04939ce65sewardj/*---------------------------------------------------------*/ 1430de80192f57cd132b31b233c65734de04939ce65sewardj/*--- ISEL: Forward declarations ---*/ 1440de80192f57cd132b31b233c65734de04939ce65sewardj/*---------------------------------------------------------*/ 1450de80192f57cd132b31b233c65734de04939ce65sewardj 1460de80192f57cd132b31b233c65734de04939ce65sewardj/* These are organised as iselXXX and iselXXX_wrk pairs. The 1470de80192f57cd132b31b233c65734de04939ce65sewardj iselXXX_wrk do the real work, but are not to be called directly. 1480de80192f57cd132b31b233c65734de04939ce65sewardj For each XXX, iselXXX calls its iselXXX_wrk counterpart, then 1490de80192f57cd132b31b233c65734de04939ce65sewardj checks that all returned registers are virtual. You should not 1500de80192f57cd132b31b233c65734de04939ce65sewardj call the _wrk version directly. 1510de80192f57cd132b31b233c65734de04939ce65sewardj*/ 1520de80192f57cd132b31b233c65734de04939ce65sewardj/* Compute an I8/I16/I32/I64 into a RH (reg-or-halfword-immediate). 1530de80192f57cd132b31b233c65734de04939ce65sewardj It's important to specify whether the immediate is to be regarded 1540de80192f57cd132b31b233c65734de04939ce65sewardj as signed or not. If yes, this will never return -32768 as an 1550de80192f57cd132b31b233c65734de04939ce65sewardj immediate; this guaranteed that all signed immediates that are 1560de80192f57cd132b31b233c65734de04939ce65sewardj return can have their sign inverted if need be. 1570de80192f57cd132b31b233c65734de04939ce65sewardj*/ 1580de80192f57cd132b31b233c65734de04939ce65sewardjstatic TILEGXRH *iselWordExpr_RH_wrk ( ISelEnv * env, Bool syned, IRExpr * e ); 1590de80192f57cd132b31b233c65734de04939ce65sewardjstatic TILEGXRH *iselWordExpr_RH ( ISelEnv * env, Bool syned, IRExpr * e ); 1600de80192f57cd132b31b233c65734de04939ce65sewardj 1610de80192f57cd132b31b233c65734de04939ce65sewardjstatic TILEGXRH *iselWordExpr_RH6u_wrk ( ISelEnv * env, IRExpr * e ); 1620de80192f57cd132b31b233c65734de04939ce65sewardjstatic TILEGXRH *iselWordExpr_RH6u ( ISelEnv * env, IRExpr * e ); 1630de80192f57cd132b31b233c65734de04939ce65sewardj 1640de80192f57cd132b31b233c65734de04939ce65sewardj/* compute an I8/I16/I32/I64 into a GPR*/ 1650de80192f57cd132b31b233c65734de04939ce65sewardjstatic HReg iselWordExpr_R_wrk ( ISelEnv * env, IRExpr * e ); 1660de80192f57cd132b31b233c65734de04939ce65sewardjstatic HReg iselWordExpr_R ( ISelEnv * env, IRExpr * e ); 1670de80192f57cd132b31b233c65734de04939ce65sewardj 1680de80192f57cd132b31b233c65734de04939ce65sewardj/* compute an I64 into an AMode. */ 1690de80192f57cd132b31b233c65734de04939ce65sewardjstatic TILEGXAMode *iselWordExpr_AMode_wrk ( ISelEnv * env, IRExpr * e, 1700de80192f57cd132b31b233c65734de04939ce65sewardj IRType xferTy ); 1710de80192f57cd132b31b233c65734de04939ce65sewardjstatic TILEGXAMode *iselWordExpr_AMode ( ISelEnv * env, IRExpr * e, 1720de80192f57cd132b31b233c65734de04939ce65sewardj IRType xferTy ); 1730de80192f57cd132b31b233c65734de04939ce65sewardj 1740de80192f57cd132b31b233c65734de04939ce65sewardjstatic TILEGXCondCode iselCondCode_wrk ( ISelEnv * env, IRExpr * e ); 1750de80192f57cd132b31b233c65734de04939ce65sewardjstatic TILEGXCondCode iselCondCode ( ISelEnv * env, IRExpr * e ); 1760de80192f57cd132b31b233c65734de04939ce65sewardj 1770de80192f57cd132b31b233c65734de04939ce65sewardj/*---------------------------------------------------------*/ 1780de80192f57cd132b31b233c65734de04939ce65sewardj/*--- ISEL: Misc helpers ---*/ 1790de80192f57cd132b31b233c65734de04939ce65sewardj/*---------------------------------------------------------*/ 1800de80192f57cd132b31b233c65734de04939ce65sewardj 1810de80192f57cd132b31b233c65734de04939ce65sewardj/* Make an int reg-reg move. */ 1820de80192f57cd132b31b233c65734de04939ce65sewardjstatic TILEGXInstr *mk_iMOVds_RR ( HReg r_dst, HReg r_src ) 1830de80192f57cd132b31b233c65734de04939ce65sewardj{ 1840de80192f57cd132b31b233c65734de04939ce65sewardj vassert(hregClass(r_dst) == hregClass(r_src)); 1850de80192f57cd132b31b233c65734de04939ce65sewardj vassert(hregClass(r_src) == HRcInt32 || hregClass(r_src) == HRcInt64); 1860de80192f57cd132b31b233c65734de04939ce65sewardj return TILEGXInstr_Alu(GXalu_OR, r_dst, r_src, TILEGXRH_Reg(r_src)); 1870de80192f57cd132b31b233c65734de04939ce65sewardj} 1880de80192f57cd132b31b233c65734de04939ce65sewardj 1890de80192f57cd132b31b233c65734de04939ce65sewardj/*---------------------------------------------------------*/ 1900de80192f57cd132b31b233c65734de04939ce65sewardj/*--- ISEL: Function call helpers ---*/ 1910de80192f57cd132b31b233c65734de04939ce65sewardj/*---------------------------------------------------------*/ 1920de80192f57cd132b31b233c65734de04939ce65sewardj 1930de80192f57cd132b31b233c65734de04939ce65sewardj/* Used only in doHelperCall. See big comment in doHelperCall 1940de80192f57cd132b31b233c65734de04939ce65sewardj handling of register-parameter args. This function figures out 1950de80192f57cd132b31b233c65734de04939ce65sewardj whether evaluation of an expression might require use of a fixed 1960de80192f57cd132b31b233c65734de04939ce65sewardj register. 1970de80192f57cd132b31b233c65734de04939ce65sewardj*/ 1980de80192f57cd132b31b233c65734de04939ce65sewardjstatic Bool mightRequireFixedRegs ( IRExpr * e ) 1990de80192f57cd132b31b233c65734de04939ce65sewardj{ 2000de80192f57cd132b31b233c65734de04939ce65sewardj switch (e->tag) { 2010de80192f57cd132b31b233c65734de04939ce65sewardj case Iex_RdTmp: 2020de80192f57cd132b31b233c65734de04939ce65sewardj case Iex_Const: 2030de80192f57cd132b31b233c65734de04939ce65sewardj case Iex_Get: 2040de80192f57cd132b31b233c65734de04939ce65sewardj return False; 2050de80192f57cd132b31b233c65734de04939ce65sewardj default: 2060de80192f57cd132b31b233c65734de04939ce65sewardj return True; 2070de80192f57cd132b31b233c65734de04939ce65sewardj } 2080de80192f57cd132b31b233c65734de04939ce65sewardj} 2090de80192f57cd132b31b233c65734de04939ce65sewardj 2100de80192f57cd132b31b233c65734de04939ce65sewardj/* Do a complete function call. guard is a Ity_Bit expression 2110de80192f57cd132b31b233c65734de04939ce65sewardj indicating whether or not the call happens. If guard==NULL, the 2120de80192f57cd132b31b233c65734de04939ce65sewardj call is unconditional. */ 2130de80192f57cd132b31b233c65734de04939ce65sewardj 2140de80192f57cd132b31b233c65734de04939ce65sewardjstatic void doHelperCall ( ISelEnv * env, IRExpr * guard, IRCallee * cee, 2150de80192f57cd132b31b233c65734de04939ce65sewardj IRExpr ** args, IRType retTy ) 2160de80192f57cd132b31b233c65734de04939ce65sewardj{ 2170de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXCondCode cc; 2180de80192f57cd132b31b233c65734de04939ce65sewardj HReg argregs[TILEGX_N_REGPARMS]; 2190de80192f57cd132b31b233c65734de04939ce65sewardj HReg tmpregs[TILEGX_N_REGPARMS]; 2200de80192f57cd132b31b233c65734de04939ce65sewardj Bool go_fast; 2210de80192f57cd132b31b233c65734de04939ce65sewardj Long n_args, i, argreg; 2220de80192f57cd132b31b233c65734de04939ce65sewardj ULong argiregs; 2230de80192f57cd132b31b233c65734de04939ce65sewardj ULong target; 2240de80192f57cd132b31b233c65734de04939ce65sewardj HReg src = INVALID_HREG; 2250de80192f57cd132b31b233c65734de04939ce65sewardj 2260de80192f57cd132b31b233c65734de04939ce65sewardj 2270de80192f57cd132b31b233c65734de04939ce65sewardj UInt nVECRETs = 0; 2280de80192f57cd132b31b233c65734de04939ce65sewardj UInt nBBPTRs = 0; 2290de80192f57cd132b31b233c65734de04939ce65sewardj 2300de80192f57cd132b31b233c65734de04939ce65sewardj /* TILEGX calling convention: up to 10 registers (r0 ... r9) 2310de80192f57cd132b31b233c65734de04939ce65sewardj are allowed to be used for passing integer arguments. They correspond 2320de80192f57cd132b31b233c65734de04939ce65sewardj to regs GPR0 ... GPR9. */ 2330de80192f57cd132b31b233c65734de04939ce65sewardj 2340de80192f57cd132b31b233c65734de04939ce65sewardj /* Note that the cee->regparms field is meaningless on ARM64 hosts 2350de80192f57cd132b31b233c65734de04939ce65sewardj (since there is only one calling convention) and so we always 2360de80192f57cd132b31b233c65734de04939ce65sewardj ignore it. */ 2370de80192f57cd132b31b233c65734de04939ce65sewardj 2380de80192f57cd132b31b233c65734de04939ce65sewardj n_args = 0; 2390de80192f57cd132b31b233c65734de04939ce65sewardj for (i = 0; args[i]; i++) { 2400de80192f57cd132b31b233c65734de04939ce65sewardj n_args++; 2410de80192f57cd132b31b233c65734de04939ce65sewardj IRExpr* arg = args[i]; 2420de80192f57cd132b31b233c65734de04939ce65sewardj if (UNLIKELY(arg->tag == Iex_VECRET)) { 2430de80192f57cd132b31b233c65734de04939ce65sewardj nVECRETs++; 2440de80192f57cd132b31b233c65734de04939ce65sewardj } else if (UNLIKELY(arg->tag == Iex_BBPTR)) { 2450de80192f57cd132b31b233c65734de04939ce65sewardj nBBPTRs++; 2460de80192f57cd132b31b233c65734de04939ce65sewardj } 2470de80192f57cd132b31b233c65734de04939ce65sewardj } 2480de80192f57cd132b31b233c65734de04939ce65sewardj 2490de80192f57cd132b31b233c65734de04939ce65sewardj if (nVECRETs || nBBPTRs) 2500de80192f57cd132b31b233c65734de04939ce65sewardj vex_printf("nVECRETs=%d, nBBPTRs=%d\n", 2510de80192f57cd132b31b233c65734de04939ce65sewardj nVECRETs, nBBPTRs); 2520de80192f57cd132b31b233c65734de04939ce65sewardj 2530de80192f57cd132b31b233c65734de04939ce65sewardj if (TILEGX_N_REGPARMS < n_args) { 2540de80192f57cd132b31b233c65734de04939ce65sewardj vpanic("doHelperCall(TILEGX): cannot currently handle > 10 args"); 2550de80192f57cd132b31b233c65734de04939ce65sewardj } 2560de80192f57cd132b31b233c65734de04939ce65sewardj argregs[0] = hregTILEGX_R0(); 2570de80192f57cd132b31b233c65734de04939ce65sewardj argregs[1] = hregTILEGX_R1(); 2580de80192f57cd132b31b233c65734de04939ce65sewardj argregs[2] = hregTILEGX_R2(); 2590de80192f57cd132b31b233c65734de04939ce65sewardj argregs[3] = hregTILEGX_R3(); 2600de80192f57cd132b31b233c65734de04939ce65sewardj argregs[4] = hregTILEGX_R4(); 2610de80192f57cd132b31b233c65734de04939ce65sewardj argregs[5] = hregTILEGX_R5(); 2620de80192f57cd132b31b233c65734de04939ce65sewardj argregs[6] = hregTILEGX_R6(); 2630de80192f57cd132b31b233c65734de04939ce65sewardj argregs[7] = hregTILEGX_R7(); 2640de80192f57cd132b31b233c65734de04939ce65sewardj argregs[8] = hregTILEGX_R8(); 2650de80192f57cd132b31b233c65734de04939ce65sewardj argregs[9] = hregTILEGX_R9(); 2660de80192f57cd132b31b233c65734de04939ce65sewardj argiregs = 0; 2670de80192f57cd132b31b233c65734de04939ce65sewardj 2680de80192f57cd132b31b233c65734de04939ce65sewardj for (i = 0; i < TILEGX_N_REGPARMS; i++) 2690de80192f57cd132b31b233c65734de04939ce65sewardj tmpregs[i] = INVALID_HREG; 2700de80192f57cd132b31b233c65734de04939ce65sewardj 2710de80192f57cd132b31b233c65734de04939ce65sewardj /* First decide which scheme (slow or fast) is to be used. First 2720de80192f57cd132b31b233c65734de04939ce65sewardj assume the fast scheme, and select slow if any contraindications 2730de80192f57cd132b31b233c65734de04939ce65sewardj (wow) appear. */ 2740de80192f57cd132b31b233c65734de04939ce65sewardj 2750de80192f57cd132b31b233c65734de04939ce65sewardj go_fast = True; 2760de80192f57cd132b31b233c65734de04939ce65sewardj 2770de80192f57cd132b31b233c65734de04939ce65sewardj if (guard) { 2780de80192f57cd132b31b233c65734de04939ce65sewardj if (guard->tag == Iex_Const && guard->Iex.Const.con->tag == Ico_U1 2790de80192f57cd132b31b233c65734de04939ce65sewardj && guard->Iex.Const.con->Ico.U1 == True) { 2800de80192f57cd132b31b233c65734de04939ce65sewardj /* unconditional */ 2810de80192f57cd132b31b233c65734de04939ce65sewardj } else { 2820de80192f57cd132b31b233c65734de04939ce65sewardj /* Not manifestly unconditional -- be conservative. */ 2830de80192f57cd132b31b233c65734de04939ce65sewardj go_fast = False; 2840de80192f57cd132b31b233c65734de04939ce65sewardj } 2850de80192f57cd132b31b233c65734de04939ce65sewardj } 2860de80192f57cd132b31b233c65734de04939ce65sewardj 2870de80192f57cd132b31b233c65734de04939ce65sewardj if (go_fast) { 2880de80192f57cd132b31b233c65734de04939ce65sewardj for (i = 0; i < n_args; i++) { 2890de80192f57cd132b31b233c65734de04939ce65sewardj if (mightRequireFixedRegs(args[i])) { 2900de80192f57cd132b31b233c65734de04939ce65sewardj go_fast = False; 2910de80192f57cd132b31b233c65734de04939ce65sewardj break; 2920de80192f57cd132b31b233c65734de04939ce65sewardj } 2930de80192f57cd132b31b233c65734de04939ce65sewardj } 2940de80192f57cd132b31b233c65734de04939ce65sewardj } 2950de80192f57cd132b31b233c65734de04939ce65sewardj 2960de80192f57cd132b31b233c65734de04939ce65sewardj /* At this point the scheme to use has been established. Generate 2970de80192f57cd132b31b233c65734de04939ce65sewardj code to get the arg values into the argument rregs. */ 2980de80192f57cd132b31b233c65734de04939ce65sewardj if (go_fast) { 2990de80192f57cd132b31b233c65734de04939ce65sewardj /* FAST SCHEME */ 3000de80192f57cd132b31b233c65734de04939ce65sewardj argreg = 0; 3010de80192f57cd132b31b233c65734de04939ce65sewardj 3020de80192f57cd132b31b233c65734de04939ce65sewardj for (i = 0; i < n_args; i++) { 3030de80192f57cd132b31b233c65734de04939ce65sewardj vassert(argreg < TILEGX_N_REGPARMS); 3040de80192f57cd132b31b233c65734de04939ce65sewardj vassert(typeOfIRExpr(env->type_env, args[i]) == Ity_I32 || 3050de80192f57cd132b31b233c65734de04939ce65sewardj typeOfIRExpr(env->type_env, args[i]) == Ity_I64); 3060de80192f57cd132b31b233c65734de04939ce65sewardj 3070de80192f57cd132b31b233c65734de04939ce65sewardj argiregs |= (1 << (argreg)); 3080de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, mk_iMOVds_RR(argregs[argreg], 3090de80192f57cd132b31b233c65734de04939ce65sewardj iselWordExpr_R(env, 3100de80192f57cd132b31b233c65734de04939ce65sewardj args[i]))); 3110de80192f57cd132b31b233c65734de04939ce65sewardj argreg++; 3120de80192f57cd132b31b233c65734de04939ce65sewardj } 3130de80192f57cd132b31b233c65734de04939ce65sewardj /* Fast scheme only applies for unconditional calls. Hence: */ 3140de80192f57cd132b31b233c65734de04939ce65sewardj cc = TILEGXcc_AL; 3150de80192f57cd132b31b233c65734de04939ce65sewardj } else { 3160de80192f57cd132b31b233c65734de04939ce65sewardj /* SLOW SCHEME; move via temporaries */ 3170de80192f57cd132b31b233c65734de04939ce65sewardj argreg = 0; 3180de80192f57cd132b31b233c65734de04939ce65sewardj 3190de80192f57cd132b31b233c65734de04939ce65sewardj for (i = 0; i < n_args; i++) { 3200de80192f57cd132b31b233c65734de04939ce65sewardj vassert(argreg < TILEGX_N_REGPARMS); 3210de80192f57cd132b31b233c65734de04939ce65sewardj vassert(typeOfIRExpr(env->type_env, args[i]) == Ity_I32 3220de80192f57cd132b31b233c65734de04939ce65sewardj || typeOfIRExpr(env->type_env, args[i]) == Ity_I64); 3230de80192f57cd132b31b233c65734de04939ce65sewardj tmpregs[argreg] = iselWordExpr_R(env, args[i]); 3240de80192f57cd132b31b233c65734de04939ce65sewardj argreg++; 3250de80192f57cd132b31b233c65734de04939ce65sewardj } 3260de80192f57cd132b31b233c65734de04939ce65sewardj 3270de80192f57cd132b31b233c65734de04939ce65sewardj /* Now we can compute the condition. We can't do it earlier 3280de80192f57cd132b31b233c65734de04939ce65sewardj because the argument computations could trash the condition 3290de80192f57cd132b31b233c65734de04939ce65sewardj codes. Be a bit clever to handle the common case where the 3300de80192f57cd132b31b233c65734de04939ce65sewardj guard is 1:Bit. */ 3310de80192f57cd132b31b233c65734de04939ce65sewardj cc = TILEGXcc_AL; 3320de80192f57cd132b31b233c65734de04939ce65sewardj if (guard) { 3330de80192f57cd132b31b233c65734de04939ce65sewardj if (guard->tag == Iex_Const && guard->Iex.Const.con->tag == Ico_U1 3340de80192f57cd132b31b233c65734de04939ce65sewardj && guard->Iex.Const.con->Ico.U1 == True) { 3350de80192f57cd132b31b233c65734de04939ce65sewardj /* unconditional -- do nothing */ 3360de80192f57cd132b31b233c65734de04939ce65sewardj } else { 3370de80192f57cd132b31b233c65734de04939ce65sewardj cc = iselCondCode(env, guard); 3380de80192f57cd132b31b233c65734de04939ce65sewardj src = iselWordExpr_R(env, guard); 3390de80192f57cd132b31b233c65734de04939ce65sewardj } 3400de80192f57cd132b31b233c65734de04939ce65sewardj } 3410de80192f57cd132b31b233c65734de04939ce65sewardj /* Move the args to their final destinations. */ 3420de80192f57cd132b31b233c65734de04939ce65sewardj for (i = 0; i < argreg; i++) { 3430de80192f57cd132b31b233c65734de04939ce65sewardj if (hregIsInvalid(tmpregs[i])) // Skip invalid regs 3440de80192f57cd132b31b233c65734de04939ce65sewardj continue; 3450de80192f57cd132b31b233c65734de04939ce65sewardj /* None of these insns, including any spill code that might 3460de80192f57cd132b31b233c65734de04939ce65sewardj be generated, may alter the condition codes. */ 3470de80192f57cd132b31b233c65734de04939ce65sewardj argiregs |= (1 << (i)); 3480de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, mk_iMOVds_RR(argregs[i], tmpregs[i])); 3490de80192f57cd132b31b233c65734de04939ce65sewardj } 3500de80192f57cd132b31b233c65734de04939ce65sewardj } 3510de80192f57cd132b31b233c65734de04939ce65sewardj 3520de80192f57cd132b31b233c65734de04939ce65sewardj target = (Addr)(cee->addr); 3530de80192f57cd132b31b233c65734de04939ce65sewardj 3540de80192f57cd132b31b233c65734de04939ce65sewardj /* Finally, the call itself. */ 3550de80192f57cd132b31b233c65734de04939ce65sewardj if (cc == TILEGXcc_AL) 3560de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_CallAlways(cc, target, argiregs)); 3570de80192f57cd132b31b233c65734de04939ce65sewardj else 3580de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Call(cc, target, argiregs, src)); 3590de80192f57cd132b31b233c65734de04939ce65sewardj} 3600de80192f57cd132b31b233c65734de04939ce65sewardj 3610de80192f57cd132b31b233c65734de04939ce65sewardj/*---------------------------------------------------------*/ 3620de80192f57cd132b31b233c65734de04939ce65sewardj/*--- ISEL: Integer expression auxiliaries ---*/ 3630de80192f57cd132b31b233c65734de04939ce65sewardj/*---------------------------------------------------------*/ 3640de80192f57cd132b31b233c65734de04939ce65sewardj 3650de80192f57cd132b31b233c65734de04939ce65sewardj/* --------------------- AMODEs --------------------- */ 3660de80192f57cd132b31b233c65734de04939ce65sewardj 3670de80192f57cd132b31b233c65734de04939ce65sewardj/* Return an AMode which computes the value of the specified 3680de80192f57cd132b31b233c65734de04939ce65sewardj expression, possibly also adding insns to the code list as a 3690de80192f57cd132b31b233c65734de04939ce65sewardj result. The expression may only be a word-size one. 3700de80192f57cd132b31b233c65734de04939ce65sewardj*/ 3710de80192f57cd132b31b233c65734de04939ce65sewardj 3720de80192f57cd132b31b233c65734de04939ce65sewardjstatic Bool uInt_fits_in_16_bits ( UInt u ) 3730de80192f57cd132b31b233c65734de04939ce65sewardj{ 3740de80192f57cd132b31b233c65734de04939ce65sewardj Int i = u & 0xFFFF; 3750de80192f57cd132b31b233c65734de04939ce65sewardj i <<= 16; 3760de80192f57cd132b31b233c65734de04939ce65sewardj i >>= 16; 3770de80192f57cd132b31b233c65734de04939ce65sewardj return toBool(u == (UInt) i); 3780de80192f57cd132b31b233c65734de04939ce65sewardj} 3790de80192f57cd132b31b233c65734de04939ce65sewardj 3800de80192f57cd132b31b233c65734de04939ce65sewardjstatic Bool sane_AMode ( ISelEnv * env, TILEGXAMode * am ) 3810de80192f57cd132b31b233c65734de04939ce65sewardj{ 3820de80192f57cd132b31b233c65734de04939ce65sewardj if (am->tag == GXam_IR) 3830de80192f57cd132b31b233c65734de04939ce65sewardj return toBool(hregClass(am->GXam.IR.base) == HRcGPR() && 3840de80192f57cd132b31b233c65734de04939ce65sewardj hregIsVirtual(am->GXam.IR.base) && 3850de80192f57cd132b31b233c65734de04939ce65sewardj uInt_fits_in_16_bits(am->GXam.IR.index)); 3860de80192f57cd132b31b233c65734de04939ce65sewardj 3870de80192f57cd132b31b233c65734de04939ce65sewardj vpanic("sane_AMode: unknown tilegx amode tag"); 3880de80192f57cd132b31b233c65734de04939ce65sewardj} 3890de80192f57cd132b31b233c65734de04939ce65sewardj 3900de80192f57cd132b31b233c65734de04939ce65sewardjstatic TILEGXAMode *iselWordExpr_AMode ( ISelEnv * env, IRExpr * e, 3910de80192f57cd132b31b233c65734de04939ce65sewardj IRType xferTy ) 3920de80192f57cd132b31b233c65734de04939ce65sewardj{ 3930de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXAMode *am = iselWordExpr_AMode_wrk(env, e, xferTy); 3940de80192f57cd132b31b233c65734de04939ce65sewardj vassert(sane_AMode(env, am)); 3950de80192f57cd132b31b233c65734de04939ce65sewardj return am; 3960de80192f57cd132b31b233c65734de04939ce65sewardj} 3970de80192f57cd132b31b233c65734de04939ce65sewardj 3980de80192f57cd132b31b233c65734de04939ce65sewardj/* DO NOT CALL THIS DIRECTLY ! */ 3990de80192f57cd132b31b233c65734de04939ce65sewardjstatic TILEGXAMode *iselWordExpr_AMode_wrk ( ISelEnv * env, IRExpr * e, 4000de80192f57cd132b31b233c65734de04939ce65sewardj IRType xferTy ) 4010de80192f57cd132b31b233c65734de04939ce65sewardj{ 4020de80192f57cd132b31b233c65734de04939ce65sewardj IRType ty = typeOfIRExpr(env->type_env, e); 4030de80192f57cd132b31b233c65734de04939ce65sewardj 4040de80192f57cd132b31b233c65734de04939ce65sewardj vassert(ty == Ity_I64); 4050de80192f57cd132b31b233c65734de04939ce65sewardj /* Add64(expr,i), where i == sign-extend of (i & 0xFFFF) */ 4060de80192f57cd132b31b233c65734de04939ce65sewardj if (e->tag == Iex_Binop 4070de80192f57cd132b31b233c65734de04939ce65sewardj && e->Iex.Binop.op == Iop_Add64 4080de80192f57cd132b31b233c65734de04939ce65sewardj && e->Iex.Binop.arg2->tag == Iex_Const 4090de80192f57cd132b31b233c65734de04939ce65sewardj && e->Iex.Binop.arg2->Iex.Const.con->tag == Ico_U64 4100de80192f57cd132b31b233c65734de04939ce65sewardj && uInt_fits_in_16_bits(e->Iex.Binop.arg2->Iex.Const.con->Ico.U64)) { 4110de80192f57cd132b31b233c65734de04939ce65sewardj 4120de80192f57cd132b31b233c65734de04939ce65sewardj return TILEGXAMode_IR((Long) e->Iex.Binop.arg2->Iex.Const.con->Ico.U64, 4130de80192f57cd132b31b233c65734de04939ce65sewardj iselWordExpr_R(env, e->Iex.Binop.arg1)); 4140de80192f57cd132b31b233c65734de04939ce65sewardj } 4150de80192f57cd132b31b233c65734de04939ce65sewardj 4160de80192f57cd132b31b233c65734de04939ce65sewardj /* Doesn't match anything in particular. Generate it into 4170de80192f57cd132b31b233c65734de04939ce65sewardj a register and use that. */ 4180de80192f57cd132b31b233c65734de04939ce65sewardj return TILEGXAMode_IR(0, iselWordExpr_R(env, e)); 4190de80192f57cd132b31b233c65734de04939ce65sewardj} 4200de80192f57cd132b31b233c65734de04939ce65sewardj 4210de80192f57cd132b31b233c65734de04939ce65sewardj 4220de80192f57cd132b31b233c65734de04939ce65sewardj 4230de80192f57cd132b31b233c65734de04939ce65sewardj 4240de80192f57cd132b31b233c65734de04939ce65sewardj 4250de80192f57cd132b31b233c65734de04939ce65sewardj/*---------------------------------------------------------*/ 4260de80192f57cd132b31b233c65734de04939ce65sewardj/*--- ISEL: Integer expressions (64/32/16/8 bit) ---*/ 4270de80192f57cd132b31b233c65734de04939ce65sewardj/*---------------------------------------------------------*/ 4280de80192f57cd132b31b233c65734de04939ce65sewardj 4290de80192f57cd132b31b233c65734de04939ce65sewardj/* Select insns for an integer-typed expression, and add them to the 4300de80192f57cd132b31b233c65734de04939ce65sewardj code list. Return a reg holding the result. This reg will be a 4310de80192f57cd132b31b233c65734de04939ce65sewardj virtual register. THE RETURNED REG MUST NOT BE MODIFIED. If you 4320de80192f57cd132b31b233c65734de04939ce65sewardj want to modify it, ask for a new vreg, copy it in there, and modify 4330de80192f57cd132b31b233c65734de04939ce65sewardj the copy. The register allocator will do its best to map both 4340de80192f57cd132b31b233c65734de04939ce65sewardj add vregs to the same real register, so the copies will often disappear 4350de80192f57cd132b31b233c65734de04939ce65sewardj later in the game. 4360de80192f57cd132b31b233c65734de04939ce65sewardj 4370de80192f57cd132b31b233c65734de04939ce65sewardj This should handle expressions of 64, 32, 16 and 8-bit type. 4380de80192f57cd132b31b233c65734de04939ce65sewardj All results are returned in a 64bit register. 4390de80192f57cd132b31b233c65734de04939ce65sewardj*/ 4400de80192f57cd132b31b233c65734de04939ce65sewardjstatic HReg iselWordExpr_R ( ISelEnv * env, IRExpr * e ) 4410de80192f57cd132b31b233c65734de04939ce65sewardj{ 4420de80192f57cd132b31b233c65734de04939ce65sewardj HReg r = iselWordExpr_R_wrk(env, e); 4430de80192f57cd132b31b233c65734de04939ce65sewardj /* sanity checks ... */ 4440de80192f57cd132b31b233c65734de04939ce65sewardj 4450de80192f57cd132b31b233c65734de04939ce65sewardj vassert(hregClass(r) == HRcGPR()); 4460de80192f57cd132b31b233c65734de04939ce65sewardj vassert(hregIsVirtual(r)); 4470de80192f57cd132b31b233c65734de04939ce65sewardj return r; 4480de80192f57cd132b31b233c65734de04939ce65sewardj} 4490de80192f57cd132b31b233c65734de04939ce65sewardj 4500de80192f57cd132b31b233c65734de04939ce65sewardj/* DO NOT CALL THIS DIRECTLY ! */ 4510de80192f57cd132b31b233c65734de04939ce65sewardjstatic HReg iselWordExpr_R_wrk ( ISelEnv * env, IRExpr * e ) 4520de80192f57cd132b31b233c65734de04939ce65sewardj{ 4530de80192f57cd132b31b233c65734de04939ce65sewardj IRType ty = typeOfIRExpr(env->type_env, e); 4540de80192f57cd132b31b233c65734de04939ce65sewardj vassert(ty == Ity_I8 || ty == Ity_I16 || ty == Ity_I32 || 4550de80192f57cd132b31b233c65734de04939ce65sewardj ty == Ity_I1 || ty == Ity_I64); 4560de80192f57cd132b31b233c65734de04939ce65sewardj 4570de80192f57cd132b31b233c65734de04939ce65sewardj switch (e->tag) { 4580de80192f57cd132b31b233c65734de04939ce65sewardj /* --------- TEMP --------- */ 4590de80192f57cd132b31b233c65734de04939ce65sewardj case Iex_RdTmp: 4600de80192f57cd132b31b233c65734de04939ce65sewardj return lookupIRTemp(env, e->Iex.RdTmp.tmp); 4610de80192f57cd132b31b233c65734de04939ce65sewardj 4620de80192f57cd132b31b233c65734de04939ce65sewardj /* --------- LOAD --------- */ 4630de80192f57cd132b31b233c65734de04939ce65sewardj case Iex_Load: { 4640de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_dst = newVRegI(env); 4650de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXAMode *am_addr = iselWordExpr_AMode(env, e->Iex.Load.addr, ty); 4660de80192f57cd132b31b233c65734de04939ce65sewardj 4670de80192f57cd132b31b233c65734de04939ce65sewardj if (e->Iex.Load.end != Iend_LE 4680de80192f57cd132b31b233c65734de04939ce65sewardj && e->Iex.Load.end != Iend_BE) 4690de80192f57cd132b31b233c65734de04939ce65sewardj goto irreducible; 4700de80192f57cd132b31b233c65734de04939ce65sewardj 4710de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Load(toUChar(sizeofIRType(ty)), 4720de80192f57cd132b31b233c65734de04939ce65sewardj r_dst, am_addr)); 4730de80192f57cd132b31b233c65734de04939ce65sewardj return r_dst; 4740de80192f57cd132b31b233c65734de04939ce65sewardj break; 4750de80192f57cd132b31b233c65734de04939ce65sewardj } 4760de80192f57cd132b31b233c65734de04939ce65sewardj /* --------- BINARY OP --------- */ 4770de80192f57cd132b31b233c65734de04939ce65sewardj case Iex_Binop: { 4780de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXAluOp aluOp; 4790de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXShftOp shftOp; 4800de80192f57cd132b31b233c65734de04939ce65sewardj 4810de80192f57cd132b31b233c65734de04939ce65sewardj switch (e->Iex.Binop.op) { 4820de80192f57cd132b31b233c65734de04939ce65sewardj 483009b5fc3a8762fada94db8960fd58ec347613f6fzliu case Iop_Add8: 484009b5fc3a8762fada94db8960fd58ec347613f6fzliu case Iop_Add16: 4850de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_Add32: 4860de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_Add64: 4870de80192f57cd132b31b233c65734de04939ce65sewardj aluOp = GXalu_ADD; 4880de80192f57cd132b31b233c65734de04939ce65sewardj break; 4890de80192f57cd132b31b233c65734de04939ce65sewardj 490009b5fc3a8762fada94db8960fd58ec347613f6fzliu case Iop_Sub8: 491009b5fc3a8762fada94db8960fd58ec347613f6fzliu case Iop_Sub16: 4920de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_Sub32: 4930de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_Sub64: 4940de80192f57cd132b31b233c65734de04939ce65sewardj aluOp = GXalu_SUB; 4950de80192f57cd132b31b233c65734de04939ce65sewardj break; 4960de80192f57cd132b31b233c65734de04939ce65sewardj 497009b5fc3a8762fada94db8960fd58ec347613f6fzliu case Iop_And8: 498009b5fc3a8762fada94db8960fd58ec347613f6fzliu case Iop_And16: 4990de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_And32: 5000de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_And64: 5010de80192f57cd132b31b233c65734de04939ce65sewardj aluOp = GXalu_AND; 5020de80192f57cd132b31b233c65734de04939ce65sewardj break; 5030de80192f57cd132b31b233c65734de04939ce65sewardj 504009b5fc3a8762fada94db8960fd58ec347613f6fzliu case Iop_Or8: 505009b5fc3a8762fada94db8960fd58ec347613f6fzliu case Iop_Or16: 5060de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_Or32: 5070de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_Or64: 5080de80192f57cd132b31b233c65734de04939ce65sewardj aluOp = GXalu_OR; 5090de80192f57cd132b31b233c65734de04939ce65sewardj break; 5100de80192f57cd132b31b233c65734de04939ce65sewardj 511009b5fc3a8762fada94db8960fd58ec347613f6fzliu case Iop_Xor8: 512009b5fc3a8762fada94db8960fd58ec347613f6fzliu case Iop_Xor16: 5130de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_Xor32: 5140de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_Xor64: 5150de80192f57cd132b31b233c65734de04939ce65sewardj aluOp = GXalu_XOR; 5160de80192f57cd132b31b233c65734de04939ce65sewardj break; 5170de80192f57cd132b31b233c65734de04939ce65sewardj 5180de80192f57cd132b31b233c65734de04939ce65sewardj default: 5190de80192f57cd132b31b233c65734de04939ce65sewardj aluOp = GXalu_INVALID; 5200de80192f57cd132b31b233c65734de04939ce65sewardj break; 5210de80192f57cd132b31b233c65734de04939ce65sewardj } 5220de80192f57cd132b31b233c65734de04939ce65sewardj 5230de80192f57cd132b31b233c65734de04939ce65sewardj /* For commutative ops we assume any literal 5240de80192f57cd132b31b233c65734de04939ce65sewardj values are on the second operand. */ 5250de80192f57cd132b31b233c65734de04939ce65sewardj if (aluOp != GXalu_INVALID) { 5260de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_dst = newVRegI(env); 5270de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_srcL = iselWordExpr_R(env, e->Iex.Binop.arg1); 5280de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXRH *ri_srcR = NULL; 5290de80192f57cd132b31b233c65734de04939ce65sewardj /* get right arg into an RH, in the appropriate way */ 5300de80192f57cd132b31b233c65734de04939ce65sewardj switch (aluOp) { 5310de80192f57cd132b31b233c65734de04939ce65sewardj case GXalu_ADD: 5320de80192f57cd132b31b233c65734de04939ce65sewardj case GXalu_SUB: 5330de80192f57cd132b31b233c65734de04939ce65sewardj ri_srcR = iselWordExpr_RH(env, True /*signed */ , 5340de80192f57cd132b31b233c65734de04939ce65sewardj e->Iex.Binop.arg2); 5350de80192f57cd132b31b233c65734de04939ce65sewardj break; 5360de80192f57cd132b31b233c65734de04939ce65sewardj case GXalu_AND: 5370de80192f57cd132b31b233c65734de04939ce65sewardj case GXalu_OR: 5380de80192f57cd132b31b233c65734de04939ce65sewardj case GXalu_XOR: 5390de80192f57cd132b31b233c65734de04939ce65sewardj ri_srcR = iselWordExpr_RH(env, True /*signed */, 5400de80192f57cd132b31b233c65734de04939ce65sewardj e->Iex.Binop.arg2); 5410de80192f57cd132b31b233c65734de04939ce65sewardj break; 5420de80192f57cd132b31b233c65734de04939ce65sewardj default: 5430de80192f57cd132b31b233c65734de04939ce65sewardj vpanic("iselWordExpr_R_wrk-aluOp-arg2"); 5440de80192f57cd132b31b233c65734de04939ce65sewardj } 5450de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Alu(aluOp, r_dst, r_srcL, ri_srcR)); 5460de80192f57cd132b31b233c65734de04939ce65sewardj return r_dst; 5470de80192f57cd132b31b233c65734de04939ce65sewardj } 5480de80192f57cd132b31b233c65734de04939ce65sewardj 5490de80192f57cd132b31b233c65734de04939ce65sewardj /* a shift? */ 5500de80192f57cd132b31b233c65734de04939ce65sewardj switch (e->Iex.Binop.op) { 5510de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_Shl32: 5520de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_Shl64: 5530de80192f57cd132b31b233c65734de04939ce65sewardj shftOp = GXshft_SLL; 5540de80192f57cd132b31b233c65734de04939ce65sewardj break; 5550de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_Shr32: 5560de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_Shr64: 5570de80192f57cd132b31b233c65734de04939ce65sewardj shftOp = GXshft_SRL; 5580de80192f57cd132b31b233c65734de04939ce65sewardj break; 5590de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_Sar64: 5600de80192f57cd132b31b233c65734de04939ce65sewardj shftOp = GXshft_SRA; 5610de80192f57cd132b31b233c65734de04939ce65sewardj break; 5620de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_Shl8x8: 5630de80192f57cd132b31b233c65734de04939ce65sewardj shftOp = GXshft_SLL8x8; 5640de80192f57cd132b31b233c65734de04939ce65sewardj break; 5650de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_Shr8x8: 5660de80192f57cd132b31b233c65734de04939ce65sewardj shftOp = GXshft_SRL8x8; 5670de80192f57cd132b31b233c65734de04939ce65sewardj break; 5680de80192f57cd132b31b233c65734de04939ce65sewardj default: 5690de80192f57cd132b31b233c65734de04939ce65sewardj shftOp = GXshft_INVALID; 5700de80192f57cd132b31b233c65734de04939ce65sewardj break; 5710de80192f57cd132b31b233c65734de04939ce65sewardj } 5720de80192f57cd132b31b233c65734de04939ce65sewardj 5730de80192f57cd132b31b233c65734de04939ce65sewardj /* we assume any literal values are on the second operand. */ 5740de80192f57cd132b31b233c65734de04939ce65sewardj if (shftOp != GXshft_INVALID) { 5750de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_dst = newVRegI(env); 5760de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_srcL = iselWordExpr_R(env, e->Iex.Binop.arg1); 5770de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXRH *ri_srcR = NULL; 5780de80192f57cd132b31b233c65734de04939ce65sewardj /* get right arg into an RH, in the appropriate way */ 5790de80192f57cd132b31b233c65734de04939ce65sewardj switch (shftOp) { 5800de80192f57cd132b31b233c65734de04939ce65sewardj case GXshft_SLL: 5810de80192f57cd132b31b233c65734de04939ce65sewardj case GXshft_SRL: 5820de80192f57cd132b31b233c65734de04939ce65sewardj case GXshft_SRA: 5830de80192f57cd132b31b233c65734de04939ce65sewardj //ri_srcR = iselWordExpr_RH6u(env, e->Iex.Binop.arg2); 5840de80192f57cd132b31b233c65734de04939ce65sewardj //break; 5850de80192f57cd132b31b233c65734de04939ce65sewardj case GXshft_SLL8x8: 5860de80192f57cd132b31b233c65734de04939ce65sewardj case GXshft_SRL8x8: 5870de80192f57cd132b31b233c65734de04939ce65sewardj //if (e->Iex.Binop.arg2->tag == GXrh_Imm) 5880de80192f57cd132b31b233c65734de04939ce65sewardj //{ 5890de80192f57cd132b31b233c65734de04939ce65sewardj // ri_srcR = iselWordExpr_RH6u(env, e->Iex.Binop.arg2); 5900de80192f57cd132b31b233c65734de04939ce65sewardj // break; 5910de80192f57cd132b31b233c65734de04939ce65sewardj //} 5920de80192f57cd132b31b233c65734de04939ce65sewardj ri_srcR = iselWordExpr_RH6u(env, e->Iex.Binop.arg2); 5930de80192f57cd132b31b233c65734de04939ce65sewardj break; 5940de80192f57cd132b31b233c65734de04939ce65sewardj default: 5950de80192f57cd132b31b233c65734de04939ce65sewardj vpanic("iselIntExpr_R_wrk-shftOp-arg2"); 5960de80192f57cd132b31b233c65734de04939ce65sewardj } 5970de80192f57cd132b31b233c65734de04939ce65sewardj /* widen the left arg if needed */ 5980de80192f57cd132b31b233c65734de04939ce65sewardj /*TODO do we need this? */ 5990de80192f57cd132b31b233c65734de04939ce65sewardj if (ty == Ity_I8 || ty == Ity_I16) 6000de80192f57cd132b31b233c65734de04939ce65sewardj goto irreducible; 6010de80192f57cd132b31b233c65734de04939ce65sewardj if (ty == Ity_I64) { 6020de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Shft(shftOp, False/*64bit shift */, 6030de80192f57cd132b31b233c65734de04939ce65sewardj r_dst, r_srcL, ri_srcR)); 6040de80192f57cd132b31b233c65734de04939ce65sewardj } else { 6050de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Shft(shftOp, True /*32bit shift */, 6060de80192f57cd132b31b233c65734de04939ce65sewardj r_dst, r_srcL, ri_srcR)); 6070de80192f57cd132b31b233c65734de04939ce65sewardj } 6080de80192f57cd132b31b233c65734de04939ce65sewardj return r_dst; 6090de80192f57cd132b31b233c65734de04939ce65sewardj } 6100de80192f57cd132b31b233c65734de04939ce65sewardj 6110de80192f57cd132b31b233c65734de04939ce65sewardj /* Cmp*32*(x,y) ? */ 6120de80192f57cd132b31b233c65734de04939ce65sewardj if (e->Iex.Binop.op == Iop_CasCmpEQ32 6130de80192f57cd132b31b233c65734de04939ce65sewardj || e->Iex.Binop.op == Iop_CmpEQ32 6140de80192f57cd132b31b233c65734de04939ce65sewardj || e->Iex.Binop.op == Iop_CasCmpNE32 6150de80192f57cd132b31b233c65734de04939ce65sewardj || e->Iex.Binop.op == Iop_CmpNE32 6160de80192f57cd132b31b233c65734de04939ce65sewardj || e->Iex.Binop.op == Iop_CmpNE64 6170de80192f57cd132b31b233c65734de04939ce65sewardj || e->Iex.Binop.op == Iop_CmpLT32S 6180de80192f57cd132b31b233c65734de04939ce65sewardj || e->Iex.Binop.op == Iop_CmpLT32U 6190de80192f57cd132b31b233c65734de04939ce65sewardj || e->Iex.Binop.op == Iop_CmpLT64U 6200de80192f57cd132b31b233c65734de04939ce65sewardj || e->Iex.Binop.op == Iop_CmpLE32S 6210de80192f57cd132b31b233c65734de04939ce65sewardj || e->Iex.Binop.op == Iop_CmpLE64S 6220de80192f57cd132b31b233c65734de04939ce65sewardj || e->Iex.Binop.op == Iop_CmpLE64U 6230de80192f57cd132b31b233c65734de04939ce65sewardj || e->Iex.Binop.op == Iop_CmpLT64S 6240de80192f57cd132b31b233c65734de04939ce65sewardj || e->Iex.Binop.op == Iop_CmpEQ64 6250de80192f57cd132b31b233c65734de04939ce65sewardj || e->Iex.Binop.op == Iop_CasCmpEQ64 6260de80192f57cd132b31b233c65734de04939ce65sewardj || e->Iex.Binop.op == Iop_CasCmpNE64) { 6270de80192f57cd132b31b233c65734de04939ce65sewardj 6280de80192f57cd132b31b233c65734de04939ce65sewardj Bool syned = (e->Iex.Binop.op == Iop_CmpLT32S 6290de80192f57cd132b31b233c65734de04939ce65sewardj || e->Iex.Binop.op == Iop_CmpLE32S 6300de80192f57cd132b31b233c65734de04939ce65sewardj || e->Iex.Binop.op == Iop_CmpLT64S 6310de80192f57cd132b31b233c65734de04939ce65sewardj || e->Iex.Binop.op == Iop_CmpLE64S); 6320de80192f57cd132b31b233c65734de04939ce65sewardj Bool size32; 6330de80192f57cd132b31b233c65734de04939ce65sewardj HReg dst = newVRegI(env); 6340de80192f57cd132b31b233c65734de04939ce65sewardj HReg r1 = iselWordExpr_R(env, e->Iex.Binop.arg1); 6350de80192f57cd132b31b233c65734de04939ce65sewardj HReg r2 = iselWordExpr_R(env, e->Iex.Binop.arg2); 6360de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXCondCode cc; 6370de80192f57cd132b31b233c65734de04939ce65sewardj 6380de80192f57cd132b31b233c65734de04939ce65sewardj switch (e->Iex.Binop.op) { 6390de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CasCmpEQ32: 6400de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CmpEQ32: 6410de80192f57cd132b31b233c65734de04939ce65sewardj cc = TILEGXcc_EQ; 6420de80192f57cd132b31b233c65734de04939ce65sewardj size32 = True; 6430de80192f57cd132b31b233c65734de04939ce65sewardj break; 6440de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CasCmpNE32: 6450de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CmpNE32: 6460de80192f57cd132b31b233c65734de04939ce65sewardj cc = TILEGXcc_NE; 6470de80192f57cd132b31b233c65734de04939ce65sewardj size32 = True; 6480de80192f57cd132b31b233c65734de04939ce65sewardj break; 6490de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CasCmpNE64: 6500de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CmpNE64: 6510de80192f57cd132b31b233c65734de04939ce65sewardj cc = TILEGXcc_NE; 6520de80192f57cd132b31b233c65734de04939ce65sewardj size32 = True; 6530de80192f57cd132b31b233c65734de04939ce65sewardj break; 6540de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CmpLT32S: 6550de80192f57cd132b31b233c65734de04939ce65sewardj cc = TILEGXcc_LT; 6560de80192f57cd132b31b233c65734de04939ce65sewardj size32 = True; 6570de80192f57cd132b31b233c65734de04939ce65sewardj break; 6580de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CmpLT32U: 6590de80192f57cd132b31b233c65734de04939ce65sewardj cc = TILEGXcc_LO; 6600de80192f57cd132b31b233c65734de04939ce65sewardj size32 = True; 6610de80192f57cd132b31b233c65734de04939ce65sewardj break; 6620de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CmpLT64U: 6630de80192f57cd132b31b233c65734de04939ce65sewardj cc = TILEGXcc_LT; 6640de80192f57cd132b31b233c65734de04939ce65sewardj size32 = False; 6650de80192f57cd132b31b233c65734de04939ce65sewardj break; 6660de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CmpLE32S: 6670de80192f57cd132b31b233c65734de04939ce65sewardj cc = TILEGXcc_LE; 6680de80192f57cd132b31b233c65734de04939ce65sewardj size32 = True; 6690de80192f57cd132b31b233c65734de04939ce65sewardj break; 6700de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CmpLE64S: 6710de80192f57cd132b31b233c65734de04939ce65sewardj cc = TILEGXcc_LE; 6720de80192f57cd132b31b233c65734de04939ce65sewardj size32 = False; 6730de80192f57cd132b31b233c65734de04939ce65sewardj break; 6740de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CmpLE64U: 6750de80192f57cd132b31b233c65734de04939ce65sewardj cc = TILEGXcc_LE; 6760de80192f57cd132b31b233c65734de04939ce65sewardj size32 = False; 6770de80192f57cd132b31b233c65734de04939ce65sewardj break; 6780de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CmpLT64S: 6790de80192f57cd132b31b233c65734de04939ce65sewardj cc = TILEGXcc_LT; 6800de80192f57cd132b31b233c65734de04939ce65sewardj size32 = False; 6810de80192f57cd132b31b233c65734de04939ce65sewardj break; 6820de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CasCmpEQ64: 6830de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CmpEQ64: 6840de80192f57cd132b31b233c65734de04939ce65sewardj cc = TILEGXcc_EQ; 6850de80192f57cd132b31b233c65734de04939ce65sewardj size32 = False; 6860de80192f57cd132b31b233c65734de04939ce65sewardj break; 6870de80192f57cd132b31b233c65734de04939ce65sewardj default: 6880de80192f57cd132b31b233c65734de04939ce65sewardj vpanic 6890de80192f57cd132b31b233c65734de04939ce65sewardj ("iselCondCode(tilegx): CmpXX32 or CmpXX64"); 6900de80192f57cd132b31b233c65734de04939ce65sewardj } 6910de80192f57cd132b31b233c65734de04939ce65sewardj 6920de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Cmp(syned, size32, dst, r1, r2, cc)); 6930de80192f57cd132b31b233c65734de04939ce65sewardj return dst; 6940de80192f57cd132b31b233c65734de04939ce65sewardj 6950de80192f57cd132b31b233c65734de04939ce65sewardj break; 6960de80192f57cd132b31b233c65734de04939ce65sewardj 6970de80192f57cd132b31b233c65734de04939ce65sewardj } 6980de80192f57cd132b31b233c65734de04939ce65sewardj 6990de80192f57cd132b31b233c65734de04939ce65sewardj if (e->Iex.Binop.op == Iop_CmpEQ8x8) { 7000de80192f57cd132b31b233c65734de04939ce65sewardj 7010de80192f57cd132b31b233c65734de04939ce65sewardj Bool syned = False; 7020de80192f57cd132b31b233c65734de04939ce65sewardj 7030de80192f57cd132b31b233c65734de04939ce65sewardj Bool size32; 7040de80192f57cd132b31b233c65734de04939ce65sewardj HReg dst = newVRegI(env); 7050de80192f57cd132b31b233c65734de04939ce65sewardj HReg r1 = iselWordExpr_R(env, e->Iex.Binop.arg1); 7060de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXRH *r2 = iselWordExpr_RH(env, True, e->Iex.Binop.arg2); 7070de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXCondCode cc; 7080de80192f57cd132b31b233c65734de04939ce65sewardj 7090de80192f57cd132b31b233c65734de04939ce65sewardj switch (e->Iex.Binop.op) { 7100de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CmpEQ8x8: 7110de80192f57cd132b31b233c65734de04939ce65sewardj cc = TILEGXcc_EQ8x8; 7120de80192f57cd132b31b233c65734de04939ce65sewardj size32 = False; 7130de80192f57cd132b31b233c65734de04939ce65sewardj break; 7140de80192f57cd132b31b233c65734de04939ce65sewardj 7150de80192f57cd132b31b233c65734de04939ce65sewardj default: 7160de80192f57cd132b31b233c65734de04939ce65sewardj vassert(0); 7170de80192f57cd132b31b233c65734de04939ce65sewardj } 7180de80192f57cd132b31b233c65734de04939ce65sewardj 7190de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_CmpI(syned, size32, dst, r1, r2, cc)); 7200de80192f57cd132b31b233c65734de04939ce65sewardj return dst; 7210de80192f57cd132b31b233c65734de04939ce65sewardj 7220de80192f57cd132b31b233c65734de04939ce65sewardj break; 7230de80192f57cd132b31b233c65734de04939ce65sewardj } 7240de80192f57cd132b31b233c65734de04939ce65sewardj 7250de80192f57cd132b31b233c65734de04939ce65sewardj if (e->Iex.Binop.op == Iop_Max32U) { 7260de80192f57cd132b31b233c65734de04939ce65sewardj /* 7270de80192f57cd132b31b233c65734de04939ce65sewardj tmp = argL - argR; 7280de80192f57cd132b31b233c65734de04939ce65sewardj tmp &= (1<<31) 7290de80192f57cd132b31b233c65734de04939ce65sewardj dst = (tmp) ? (argL) ? (argR) 7300de80192f57cd132b31b233c65734de04939ce65sewardj */ 7310de80192f57cd132b31b233c65734de04939ce65sewardj HReg argL = iselWordExpr_R(env, e->Iex.Binop.arg1); 7320de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXRH *argR = iselWordExpr_RH(env, False /*signed */ , 7330de80192f57cd132b31b233c65734de04939ce65sewardj e->Iex.Binop.arg2); 7340de80192f57cd132b31b233c65734de04939ce65sewardj HReg dst = newVRegI(env); 7350de80192f57cd132b31b233c65734de04939ce65sewardj HReg tmp = newVRegI(env); 7360de80192f57cd132b31b233c65734de04939ce65sewardj // temp = argL - argR 7370de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Alu(GXalu_SUB, tmp, argL, argR)); 7380de80192f57cd132b31b233c65734de04939ce65sewardj // tmp &= bit31 7390de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Bf(GXbf_EXTU, tmp, tmp , 31, 31)); 7400de80192f57cd132b31b233c65734de04939ce65sewardj // (tmp == 0) ? (argL) : (argR) 7410de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_MovCond(dst, argL, argR, tmp, TILEGXcc_EZ)); 7420de80192f57cd132b31b233c65734de04939ce65sewardj return dst; 7430de80192f57cd132b31b233c65734de04939ce65sewardj } 7440de80192f57cd132b31b233c65734de04939ce65sewardj 7450de80192f57cd132b31b233c65734de04939ce65sewardj if (e->Iex.Binop.op == Iop_MullS32 || e->Iex.Binop.op == Iop_MullU32) { 7460de80192f57cd132b31b233c65734de04939ce65sewardj Bool syned = (e->Iex.Binop.op == Iop_MullS32); 7470de80192f57cd132b31b233c65734de04939ce65sewardj Bool sz32 = (e->Iex.Binop.op == Iop_Mul32); 7480de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_dst = newVRegI(env); 7490de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_srcL = iselWordExpr_R(env, e->Iex.Binop.arg1); 7500de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_srcR = iselWordExpr_R(env, e->Iex.Binop.arg2); 7510de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Mul(syned /*Unsigned or Signed */ , 7520de80192f57cd132b31b233c65734de04939ce65sewardj True /*widen */ , 7530de80192f57cd132b31b233c65734de04939ce65sewardj sz32 /*32bit or 64bit */, 7540de80192f57cd132b31b233c65734de04939ce65sewardj r_dst, r_srcL, r_srcR)); 7550de80192f57cd132b31b233c65734de04939ce65sewardj return r_dst; 7560de80192f57cd132b31b233c65734de04939ce65sewardj } 7570de80192f57cd132b31b233c65734de04939ce65sewardj 7580de80192f57cd132b31b233c65734de04939ce65sewardj if (e->Iex.Binop.op == Iop_32HLto64) { 7590de80192f57cd132b31b233c65734de04939ce65sewardj HReg tHi = iselWordExpr_R(env, e->Iex.Binop.arg1); 7600de80192f57cd132b31b233c65734de04939ce65sewardj HReg tLo = iselWordExpr_R(env, e->Iex.Binop.arg2); 7610de80192f57cd132b31b233c65734de04939ce65sewardj HReg tLo_1 = newVRegI(env); 7620de80192f57cd132b31b233c65734de04939ce65sewardj HReg tHi_1 = newVRegI(env); 7630de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_dst = newVRegI(env); 7640de80192f57cd132b31b233c65734de04939ce65sewardj HReg mask = newVRegI(env); 7650de80192f57cd132b31b233c65734de04939ce65sewardj 7660de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Shft(GXshft_SLL, False, tHi_1, tHi, 7670de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXRH_Imm(False, 32))); 7680de80192f57cd132b31b233c65734de04939ce65sewardj 7690de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_LI(mask, 0xffffffff)); 7700de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Alu(GXalu_AND, tLo_1, tLo, 7710de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXRH_Reg(mask))); 7720de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Alu(GXalu_OR, r_dst, tHi_1, 7730de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXRH_Reg(tLo_1))); 7740de80192f57cd132b31b233c65734de04939ce65sewardj 7750de80192f57cd132b31b233c65734de04939ce65sewardj return r_dst; 7760de80192f57cd132b31b233c65734de04939ce65sewardj } 7770de80192f57cd132b31b233c65734de04939ce65sewardj 7780de80192f57cd132b31b233c65734de04939ce65sewardj /* Anything reached here !*/ 7790de80192f57cd132b31b233c65734de04939ce65sewardj goto irreducible; 7800de80192f57cd132b31b233c65734de04939ce65sewardj } 7810de80192f57cd132b31b233c65734de04939ce65sewardj 7820de80192f57cd132b31b233c65734de04939ce65sewardj /* --------- UNARY OP --------- */ 7830de80192f57cd132b31b233c65734de04939ce65sewardj case Iex_Unop: { 7840de80192f57cd132b31b233c65734de04939ce65sewardj 7850de80192f57cd132b31b233c65734de04939ce65sewardj IROp op_unop = e->Iex.Unop.op; 7860de80192f57cd132b31b233c65734de04939ce65sewardj 7870de80192f57cd132b31b233c65734de04939ce65sewardj switch (op_unop) { 7880de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_Not1: { 7890de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_dst = newVRegI(env); 7900de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_srcL = iselWordExpr_R(env, e->Iex.Unop.arg); 7910de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXRH *r_srcR = TILEGXRH_Reg(r_srcL); 7920de80192f57cd132b31b233c65734de04939ce65sewardj 7930de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_LI(r_dst, 0x1)); 7940de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Alu(GXalu_SUB, r_dst, r_dst, r_srcR)); 7950de80192f57cd132b31b233c65734de04939ce65sewardj return r_dst; 7960de80192f57cd132b31b233c65734de04939ce65sewardj } 7970de80192f57cd132b31b233c65734de04939ce65sewardj 7980de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_Not8: 7990de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_Not16: 8000de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_Not32: 8010de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_Not64: { 8020de80192f57cd132b31b233c65734de04939ce65sewardj /* not x = nor x, x */ 8030de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_dst = newVRegI(env); 8040de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_srcL = iselWordExpr_R(env, e->Iex.Unop.arg); 8050de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXRH *r_srcR = TILEGXRH_Reg(r_srcL); 8060de80192f57cd132b31b233c65734de04939ce65sewardj 8070de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Alu(GXalu_NOR, r_dst, r_srcL, r_srcR)); 8080de80192f57cd132b31b233c65734de04939ce65sewardj return r_dst; 8090de80192f57cd132b31b233c65734de04939ce65sewardj } 8100de80192f57cd132b31b233c65734de04939ce65sewardj 8110de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CmpNEZ8x8: { 8120de80192f57cd132b31b233c65734de04939ce65sewardj 8130de80192f57cd132b31b233c65734de04939ce65sewardj Bool syned = False; 8140de80192f57cd132b31b233c65734de04939ce65sewardj Bool size32; 8150de80192f57cd132b31b233c65734de04939ce65sewardj HReg dst = newVRegI(env); 8160de80192f57cd132b31b233c65734de04939ce65sewardj HReg r1; 8170de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXCondCode cc = TILEGXcc_NE8x8; 8180de80192f57cd132b31b233c65734de04939ce65sewardj size32 = False; 8190de80192f57cd132b31b233c65734de04939ce65sewardj r1 = iselWordExpr_R(env, e->Iex.Unop.arg); 8200de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_CmpI(syned, size32, dst, hregTILEGX_R63(), 8210de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXRH_Reg(r1), cc)); 8220de80192f57cd132b31b233c65734de04939ce65sewardj 8230de80192f57cd132b31b233c65734de04939ce65sewardj return dst; 8240de80192f57cd132b31b233c65734de04939ce65sewardj break; 8250de80192f57cd132b31b233c65734de04939ce65sewardj } 8260de80192f57cd132b31b233c65734de04939ce65sewardj 8270de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_16to8: 8280de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_32to8: 8290de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_64to8: 8300de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_32to16: 8310de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_64to16: 8320de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_64to32: 8330de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_128to64: 8340de80192f57cd132b31b233c65734de04939ce65sewardj 8350de80192f57cd132b31b233c65734de04939ce65sewardj return iselWordExpr_R(env, e->Iex.Unop.arg); 8360de80192f57cd132b31b233c65734de04939ce65sewardj 8370de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_1Uto64: 8380de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_1Uto32: 8390de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_1Uto8: { 8400de80192f57cd132b31b233c65734de04939ce65sewardj HReg dst = newVRegI(env); 8410de80192f57cd132b31b233c65734de04939ce65sewardj HReg src = iselWordExpr_R(env, e->Iex.Unop.arg); 8420de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Alu(GXalu_AND, dst, src, TILEGXRH_Imm(False, 1))); 8430de80192f57cd132b31b233c65734de04939ce65sewardj return dst; 8440de80192f57cd132b31b233c65734de04939ce65sewardj } 8450de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_8Uto16: 8460de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_8Uto32: 8470de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_8Uto64: 8480de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_16Uto32: 8490de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_16Uto64: { 8500de80192f57cd132b31b233c65734de04939ce65sewardj 8510de80192f57cd132b31b233c65734de04939ce65sewardj HReg dst = newVRegI(env); 8520de80192f57cd132b31b233c65734de04939ce65sewardj HReg src = iselWordExpr_R(env, e->Iex.Unop.arg); 8530de80192f57cd132b31b233c65734de04939ce65sewardj Bool srcIs16 = toBool( e->Iex.Unop.op==Iop_16Uto32 8540de80192f57cd132b31b233c65734de04939ce65sewardj || e->Iex.Unop.op==Iop_16Uto64 ); 8550de80192f57cd132b31b233c65734de04939ce65sewardj 8560de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Bf(GXbf_EXTU, dst, src, 8570de80192f57cd132b31b233c65734de04939ce65sewardj 0, 8580de80192f57cd132b31b233c65734de04939ce65sewardj srcIs16 ? 15 : 7)); 8590de80192f57cd132b31b233c65734de04939ce65sewardj 8600de80192f57cd132b31b233c65734de04939ce65sewardj return dst; 8610de80192f57cd132b31b233c65734de04939ce65sewardj } 8620de80192f57cd132b31b233c65734de04939ce65sewardj 8630de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_32to1: 8640de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_64to1: 8650de80192f57cd132b31b233c65734de04939ce65sewardj { 8660de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_dst = newVRegI(env); 8670de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg); 8680de80192f57cd132b31b233c65734de04939ce65sewardj 8690de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Bf(GXbf_EXTU, r_dst, r_src, 0, 0)); 8700de80192f57cd132b31b233c65734de04939ce65sewardj return r_dst; 8710de80192f57cd132b31b233c65734de04939ce65sewardj } 8720de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_1Sto32: 8730de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_1Sto64: 8740de80192f57cd132b31b233c65734de04939ce65sewardj { 8750de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_dst = newVRegI(env); 8760de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg); 8770de80192f57cd132b31b233c65734de04939ce65sewardj 8780de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Bf(GXbf_EXTS, r_dst, r_src, 0, 0)); 8790de80192f57cd132b31b233c65734de04939ce65sewardj return r_dst; 8800de80192f57cd132b31b233c65734de04939ce65sewardj } 8810de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_8Sto16: 8820de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_8Sto32: 8830de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_8Sto64: 8840de80192f57cd132b31b233c65734de04939ce65sewardj { 8850de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_dst = newVRegI(env); 8860de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg); 8870de80192f57cd132b31b233c65734de04939ce65sewardj 8880de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Bf(GXbf_EXTS, r_dst, r_src, 0, 7)); 8890de80192f57cd132b31b233c65734de04939ce65sewardj return r_dst; 8900de80192f57cd132b31b233c65734de04939ce65sewardj } 8910de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_16Sto32: 8920de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_16Sto64: 8930de80192f57cd132b31b233c65734de04939ce65sewardj { 8940de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_dst = newVRegI(env); 8950de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg); 8960de80192f57cd132b31b233c65734de04939ce65sewardj 8970de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Bf(GXbf_EXTS, r_dst, r_src, 0, 15)); 8980de80192f57cd132b31b233c65734de04939ce65sewardj return r_dst; 8990de80192f57cd132b31b233c65734de04939ce65sewardj } 9000de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_32Uto64: 9010de80192f57cd132b31b233c65734de04939ce65sewardj { 9020de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_dst = newVRegI(env); 9030de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg); 9040de80192f57cd132b31b233c65734de04939ce65sewardj 9050de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Bf(GXbf_EXTU, r_dst, r_src, 0, 31)); 9060de80192f57cd132b31b233c65734de04939ce65sewardj return r_dst; 9070de80192f57cd132b31b233c65734de04939ce65sewardj } 9080de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_32Sto64: 9090de80192f57cd132b31b233c65734de04939ce65sewardj { 9100de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_dst = newVRegI(env); 9110de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg); 9120de80192f57cd132b31b233c65734de04939ce65sewardj 9130de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Bf(GXbf_EXTS, r_dst, r_src, 0, 31)); 9140de80192f57cd132b31b233c65734de04939ce65sewardj return r_dst; 9150de80192f57cd132b31b233c65734de04939ce65sewardj } 9160de80192f57cd132b31b233c65734de04939ce65sewardj 9170de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CmpNEZ8: { 9180de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_dst = newVRegI(env); 9190de80192f57cd132b31b233c65734de04939ce65sewardj HReg tmp = newVRegI(env); 9200de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg); 9210de80192f57cd132b31b233c65734de04939ce65sewardj 9220de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXCondCode cc; 9230de80192f57cd132b31b233c65734de04939ce65sewardj 9240de80192f57cd132b31b233c65734de04939ce65sewardj cc = TILEGXcc_NE; 9250de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Alu(GXalu_AND, tmp, r_src, 9260de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXRH_Imm(False, 0xFF))); 9270de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Cmp(False, True, r_dst, tmp, 9280de80192f57cd132b31b233c65734de04939ce65sewardj hregTILEGX_R63(), cc)); 9290de80192f57cd132b31b233c65734de04939ce65sewardj return r_dst; 9300de80192f57cd132b31b233c65734de04939ce65sewardj } 9310de80192f57cd132b31b233c65734de04939ce65sewardj 9320de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CmpNEZ32: { 9330de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_dst = newVRegI(env); 9340de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg); 9350de80192f57cd132b31b233c65734de04939ce65sewardj 9360de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXCondCode cc; 9370de80192f57cd132b31b233c65734de04939ce65sewardj 9380de80192f57cd132b31b233c65734de04939ce65sewardj cc = TILEGXcc_NE; 9390de80192f57cd132b31b233c65734de04939ce65sewardj 9400de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Cmp(False, True, r_dst, r_src, 9410de80192f57cd132b31b233c65734de04939ce65sewardj hregTILEGX_R63(), cc)); 9420de80192f57cd132b31b233c65734de04939ce65sewardj return r_dst; 9430de80192f57cd132b31b233c65734de04939ce65sewardj } 9440de80192f57cd132b31b233c65734de04939ce65sewardj 9450de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CmpwNEZ32: { 9460de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_dst = newVRegI(env); 9470de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg); 9480de80192f57cd132b31b233c65734de04939ce65sewardj 9490de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Alu(GXalu_SUB, r_dst, hregTILEGX_R63(), 9500de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXRH_Reg(r_src))); 9510de80192f57cd132b31b233c65734de04939ce65sewardj 9520de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Alu(GXalu_OR, r_dst, r_dst, 9530de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXRH_Reg(r_src))); 9540de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Shft(GXshft_SRA, True, r_dst, r_dst, 9550de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXRH_Imm(False, 31))); 9560de80192f57cd132b31b233c65734de04939ce65sewardj return r_dst; 9570de80192f57cd132b31b233c65734de04939ce65sewardj } 9580de80192f57cd132b31b233c65734de04939ce65sewardj 9590de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_Left8: 9600de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_Left16: 9610de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_Left32: 9620de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_Left64: { 9630de80192f57cd132b31b233c65734de04939ce65sewardj 9640de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_dst = newVRegI(env); 9650de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg); 9660de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Alu(GXalu_SUB, r_dst, hregTILEGX_R63(), 9670de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXRH_Reg(r_src))); 9680de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Alu(GXalu_OR, r_dst, r_dst, 9690de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXRH_Reg(r_src))); 9700de80192f57cd132b31b233c65734de04939ce65sewardj return r_dst; 9710de80192f57cd132b31b233c65734de04939ce65sewardj } 9720de80192f57cd132b31b233c65734de04939ce65sewardj 9730de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_Ctz64: 9740de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_Clz64: { 9750de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_dst = newVRegI(env); 9760de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg); 9770de80192f57cd132b31b233c65734de04939ce65sewardj if (op_unop == Iop_Clz64) 9780de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Unary(GXun_CLZ, r_dst, r_src)); 9790de80192f57cd132b31b233c65734de04939ce65sewardj else 9800de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Unary(GXun_CTZ, r_dst, r_src)); 9810de80192f57cd132b31b233c65734de04939ce65sewardj return r_dst; 9820de80192f57cd132b31b233c65734de04939ce65sewardj } 9830de80192f57cd132b31b233c65734de04939ce65sewardj 9840de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CmpNEZ64: { 9850de80192f57cd132b31b233c65734de04939ce65sewardj 9860de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_dst = newVRegI(env); 9870de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg); 9880de80192f57cd132b31b233c65734de04939ce65sewardj 9890de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXCondCode cc; 9900de80192f57cd132b31b233c65734de04939ce65sewardj 9910de80192f57cd132b31b233c65734de04939ce65sewardj cc = TILEGXcc_NE; 9920de80192f57cd132b31b233c65734de04939ce65sewardj 9930de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Cmp(False, False, r_dst, r_src, 9940de80192f57cd132b31b233c65734de04939ce65sewardj hregTILEGX_R63(), cc)); 9950de80192f57cd132b31b233c65734de04939ce65sewardj return r_dst; 9960de80192f57cd132b31b233c65734de04939ce65sewardj } 9970de80192f57cd132b31b233c65734de04939ce65sewardj 9980de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CmpwNEZ64: { 9990de80192f57cd132b31b233c65734de04939ce65sewardj HReg tmp1; 10000de80192f57cd132b31b233c65734de04939ce65sewardj HReg tmp2 = newVRegI(env); 10010de80192f57cd132b31b233c65734de04939ce65sewardj 10020de80192f57cd132b31b233c65734de04939ce65sewardj tmp1 = iselWordExpr_R(env, e->Iex.Unop.arg); 10030de80192f57cd132b31b233c65734de04939ce65sewardj 10040de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Alu(GXalu_SUB, tmp2, hregTILEGX_R63(), 10050de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXRH_Reg(tmp1))); 10060de80192f57cd132b31b233c65734de04939ce65sewardj 10070de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Alu(GXalu_OR, tmp2, tmp2, TILEGXRH_Reg(tmp1))); 10080de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Shft(GXshft_SRA, False, tmp2, tmp2, 10090de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXRH_Imm (False, 63))); 10100de80192f57cd132b31b233c65734de04939ce65sewardj return tmp2; 10110de80192f57cd132b31b233c65734de04939ce65sewardj } 10120de80192f57cd132b31b233c65734de04939ce65sewardj 10130de80192f57cd132b31b233c65734de04939ce65sewardj default: 10140de80192f57cd132b31b233c65734de04939ce65sewardj goto irreducible; 10150de80192f57cd132b31b233c65734de04939ce65sewardj break; 10160de80192f57cd132b31b233c65734de04939ce65sewardj } 10170de80192f57cd132b31b233c65734de04939ce65sewardj break; 10180de80192f57cd132b31b233c65734de04939ce65sewardj } 10190de80192f57cd132b31b233c65734de04939ce65sewardj 10200de80192f57cd132b31b233c65734de04939ce65sewardj /* --------- GET --------- */ 10210de80192f57cd132b31b233c65734de04939ce65sewardj case Iex_Get: { 10220de80192f57cd132b31b233c65734de04939ce65sewardj if (ty == Ity_I8 || ty == Ity_I16 || ty == Ity_I32 10230de80192f57cd132b31b233c65734de04939ce65sewardj || ((ty == Ity_I64))) { 10240de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_dst; 10250de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXAMode *am_addr; 10260de80192f57cd132b31b233c65734de04939ce65sewardj r_dst = newVRegI(env); 10270de80192f57cd132b31b233c65734de04939ce65sewardj am_addr = TILEGXAMode_IR(e->Iex.Get.offset, 10280de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXGuestStatePointer()); 10290de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Load(toUChar(sizeofIRType(ty)), 10300de80192f57cd132b31b233c65734de04939ce65sewardj r_dst, am_addr)); 10310de80192f57cd132b31b233c65734de04939ce65sewardj return r_dst; 10320de80192f57cd132b31b233c65734de04939ce65sewardj } 10330de80192f57cd132b31b233c65734de04939ce65sewardj } 10340de80192f57cd132b31b233c65734de04939ce65sewardj 10350de80192f57cd132b31b233c65734de04939ce65sewardj /* --------- ITE --------- */ 10360de80192f57cd132b31b233c65734de04939ce65sewardj case Iex_ITE: { 10370de80192f57cd132b31b233c65734de04939ce65sewardj if ((ty == Ity_I8 || ty == Ity_I16 || 10380de80192f57cd132b31b233c65734de04939ce65sewardj ty == Ity_I32 || ((ty == Ity_I64))) && 10390de80192f57cd132b31b233c65734de04939ce65sewardj typeOfIRExpr(env->type_env, e->Iex.ITE.cond) == Ity_I1) { 10400de80192f57cd132b31b233c65734de04939ce65sewardj 10410de80192f57cd132b31b233c65734de04939ce65sewardj HReg r0 = iselWordExpr_R(env, e->Iex.ITE.iffalse); 10420de80192f57cd132b31b233c65734de04939ce65sewardj HReg r1 = iselWordExpr_R(env, e->Iex.ITE.iftrue); 10430de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_cond = iselWordExpr_R(env, e->Iex.ITE.cond); 10440de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_dst = newVRegI(env); 10450de80192f57cd132b31b233c65734de04939ce65sewardj 10460de80192f57cd132b31b233c65734de04939ce65sewardj /* r_dst = (r_cond) ? r1 : r0 */ 10470de80192f57cd132b31b233c65734de04939ce65sewardj 10480de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_MovCond(r_dst, r0, TILEGXRH_Reg(r1), 10490de80192f57cd132b31b233c65734de04939ce65sewardj r_cond, TILEGXcc_EZ)); 10500de80192f57cd132b31b233c65734de04939ce65sewardj 10510de80192f57cd132b31b233c65734de04939ce65sewardj return r_dst; 10520de80192f57cd132b31b233c65734de04939ce65sewardj } 10530de80192f57cd132b31b233c65734de04939ce65sewardj } 10540de80192f57cd132b31b233c65734de04939ce65sewardj 10550de80192f57cd132b31b233c65734de04939ce65sewardj /* --------- LITERAL --------- */ 10560de80192f57cd132b31b233c65734de04939ce65sewardj /* 32/16/8-bit literals */ 10570de80192f57cd132b31b233c65734de04939ce65sewardj case Iex_Const: { 10580de80192f57cd132b31b233c65734de04939ce65sewardj Long l; 10590de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_dst = newVRegI(env); 10600de80192f57cd132b31b233c65734de04939ce65sewardj IRConst *con = e->Iex.Const.con; 10610de80192f57cd132b31b233c65734de04939ce65sewardj switch (con->tag) { 10620de80192f57cd132b31b233c65734de04939ce65sewardj case Ico_U64: 10630de80192f57cd132b31b233c65734de04939ce65sewardj 10640de80192f57cd132b31b233c65734de04939ce65sewardj l = (Long) con->Ico.U64; 10650de80192f57cd132b31b233c65734de04939ce65sewardj break; 10660de80192f57cd132b31b233c65734de04939ce65sewardj case Ico_U32: 10670de80192f57cd132b31b233c65734de04939ce65sewardj l = (Long) (Int) con->Ico.U32; 10680de80192f57cd132b31b233c65734de04939ce65sewardj break; 10690de80192f57cd132b31b233c65734de04939ce65sewardj case Ico_U16: 10700de80192f57cd132b31b233c65734de04939ce65sewardj l = (Long) (Int) (Short) con->Ico.U16; 10710de80192f57cd132b31b233c65734de04939ce65sewardj break; 10720de80192f57cd132b31b233c65734de04939ce65sewardj case Ico_U8: 10730de80192f57cd132b31b233c65734de04939ce65sewardj l = (Long) (Int) (Char) con->Ico.U8; 10740de80192f57cd132b31b233c65734de04939ce65sewardj break; 10750de80192f57cd132b31b233c65734de04939ce65sewardj default: 10760de80192f57cd132b31b233c65734de04939ce65sewardj vpanic("iselIntExpr_R.const(tilegx)"); 10770de80192f57cd132b31b233c65734de04939ce65sewardj } 10780de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_LI(r_dst, (ULong) l)); 10790de80192f57cd132b31b233c65734de04939ce65sewardj return r_dst; 10800de80192f57cd132b31b233c65734de04939ce65sewardj } 10810de80192f57cd132b31b233c65734de04939ce65sewardj 10820de80192f57cd132b31b233c65734de04939ce65sewardj /* --------- CCALL --------- */ 10830de80192f57cd132b31b233c65734de04939ce65sewardj case Iex_CCall: { 10840de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_dst = newVRegI(env); 10850de80192f57cd132b31b233c65734de04939ce65sewardj vassert(ty == e->Iex.CCall.retty); 10860de80192f57cd132b31b233c65734de04939ce65sewardj 10870de80192f57cd132b31b233c65734de04939ce65sewardj /* Marshal args, do the call, clear stack. */ 10880de80192f57cd132b31b233c65734de04939ce65sewardj doHelperCall(env, NULL, e->Iex.CCall.cee, e->Iex.CCall.args, 10890de80192f57cd132b31b233c65734de04939ce65sewardj e->Iex.CCall.retty); 10900de80192f57cd132b31b233c65734de04939ce65sewardj 10910de80192f57cd132b31b233c65734de04939ce65sewardj /* r0 is the return value. */ 10920de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, mk_iMOVds_RR(r_dst, hregTILEGX_R0())); 10930de80192f57cd132b31b233c65734de04939ce65sewardj 10940de80192f57cd132b31b233c65734de04939ce65sewardj return r_dst; 10950de80192f57cd132b31b233c65734de04939ce65sewardj } 10960de80192f57cd132b31b233c65734de04939ce65sewardj 10970de80192f57cd132b31b233c65734de04939ce65sewardj default: 10980de80192f57cd132b31b233c65734de04939ce65sewardj goto irreducible; 10990de80192f57cd132b31b233c65734de04939ce65sewardj break; 11000de80192f57cd132b31b233c65734de04939ce65sewardj } /* end switch(e->tag) */ 11010de80192f57cd132b31b233c65734de04939ce65sewardj 11020de80192f57cd132b31b233c65734de04939ce65sewardj /* We get here if no pattern matched. */ 11030de80192f57cd132b31b233c65734de04939ce65sewardj irreducible: 11040de80192f57cd132b31b233c65734de04939ce65sewardj vex_printf("--------------->\n"); 11050de80192f57cd132b31b233c65734de04939ce65sewardj if (e->tag == Iex_RdTmp) 11060de80192f57cd132b31b233c65734de04939ce65sewardj vex_printf("Iex_RdTmp \n"); 11070de80192f57cd132b31b233c65734de04939ce65sewardj ppIRExpr(e); 11080de80192f57cd132b31b233c65734de04939ce65sewardj 11090de80192f57cd132b31b233c65734de04939ce65sewardj vpanic("iselWordExpr_R(tilegx): cannot reduce tree"); 11100de80192f57cd132b31b233c65734de04939ce65sewardj} 11110de80192f57cd132b31b233c65734de04939ce65sewardj 11120de80192f57cd132b31b233c65734de04939ce65sewardj/* --------------------- RH --------------------- */ 11130de80192f57cd132b31b233c65734de04939ce65sewardj 11140de80192f57cd132b31b233c65734de04939ce65sewardj/* Compute an I8/I16/I32/I64 into a RH 11150de80192f57cd132b31b233c65734de04939ce65sewardj (reg-or-halfword-immediate). It's important to specify whether the 11160de80192f57cd132b31b233c65734de04939ce65sewardj immediate is to be regarded as signed or not. If yes, this will 11170de80192f57cd132b31b233c65734de04939ce65sewardj never return -32768 as an immediate; this guaranteed that all 11180de80192f57cd132b31b233c65734de04939ce65sewardj signed immediates that are return can have their sign inverted if 11190de80192f57cd132b31b233c65734de04939ce65sewardj need be. */ 11200de80192f57cd132b31b233c65734de04939ce65sewardj 11210de80192f57cd132b31b233c65734de04939ce65sewardjstatic TILEGXRH *iselWordExpr_RH ( ISelEnv * env, Bool syned, IRExpr * e ) 11220de80192f57cd132b31b233c65734de04939ce65sewardj{ 11230de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXRH *ri = iselWordExpr_RH_wrk(env, syned, e); 11240de80192f57cd132b31b233c65734de04939ce65sewardj /* sanity checks ... */ 11250de80192f57cd132b31b233c65734de04939ce65sewardj switch (ri->tag) { 11260de80192f57cd132b31b233c65734de04939ce65sewardj case GXrh_Imm: 11270de80192f57cd132b31b233c65734de04939ce65sewardj vassert(ri->GXrh.Imm.syned == syned); 11280de80192f57cd132b31b233c65734de04939ce65sewardj if (syned) 11290de80192f57cd132b31b233c65734de04939ce65sewardj vassert(ri->GXrh.Imm.imm16 != 0x8000); 11300de80192f57cd132b31b233c65734de04939ce65sewardj return ri; 11310de80192f57cd132b31b233c65734de04939ce65sewardj case GXrh_Reg: 11320de80192f57cd132b31b233c65734de04939ce65sewardj vassert(hregClass(ri->GXrh.Reg.reg) == HRcGPR()); 11330de80192f57cd132b31b233c65734de04939ce65sewardj vassert(hregIsVirtual(ri->GXrh.Reg.reg)); 11340de80192f57cd132b31b233c65734de04939ce65sewardj return ri; 11350de80192f57cd132b31b233c65734de04939ce65sewardj default: 11360de80192f57cd132b31b233c65734de04939ce65sewardj vpanic("iselIntExpr_RH: unknown tilegx RH tag"); 11370de80192f57cd132b31b233c65734de04939ce65sewardj } 11380de80192f57cd132b31b233c65734de04939ce65sewardj} 11390de80192f57cd132b31b233c65734de04939ce65sewardj 11400de80192f57cd132b31b233c65734de04939ce65sewardj/* DO NOT CALL THIS DIRECTLY ! */ 11410de80192f57cd132b31b233c65734de04939ce65sewardjstatic TILEGXRH *iselWordExpr_RH_wrk ( ISelEnv * env, Bool syned, IRExpr * e ) 11420de80192f57cd132b31b233c65734de04939ce65sewardj{ 11430de80192f57cd132b31b233c65734de04939ce65sewardj ULong u; 11440de80192f57cd132b31b233c65734de04939ce65sewardj Long l; 11450de80192f57cd132b31b233c65734de04939ce65sewardj IRType ty = typeOfIRExpr(env->type_env, e); 11460de80192f57cd132b31b233c65734de04939ce65sewardj vassert(ty == Ity_I8 || ty == Ity_I16 || ty == Ity_I32 || 11470de80192f57cd132b31b233c65734de04939ce65sewardj ((ty == Ity_I64))); 11480de80192f57cd132b31b233c65734de04939ce65sewardj 11490de80192f57cd132b31b233c65734de04939ce65sewardj /* special case: immediate */ 11500de80192f57cd132b31b233c65734de04939ce65sewardj if (e->tag == Iex_Const) { 11510de80192f57cd132b31b233c65734de04939ce65sewardj IRConst *con = e->Iex.Const.con; 11520de80192f57cd132b31b233c65734de04939ce65sewardj /* What value are we aiming to generate? */ 11530de80192f57cd132b31b233c65734de04939ce65sewardj switch (con->tag) { 11540de80192f57cd132b31b233c65734de04939ce65sewardj /* Note: Not sign-extending - we carry 'syned' around */ 11550de80192f57cd132b31b233c65734de04939ce65sewardj case Ico_U64: 11560de80192f57cd132b31b233c65734de04939ce65sewardj u = con->Ico.U64; 11570de80192f57cd132b31b233c65734de04939ce65sewardj break; 11580de80192f57cd132b31b233c65734de04939ce65sewardj case Ico_U32: 11590de80192f57cd132b31b233c65734de04939ce65sewardj u = 0xFFFFFFFF & con->Ico.U32; 11600de80192f57cd132b31b233c65734de04939ce65sewardj break; 11610de80192f57cd132b31b233c65734de04939ce65sewardj case Ico_U16: 11620de80192f57cd132b31b233c65734de04939ce65sewardj u = 0x0000FFFF & con->Ico.U16; 11630de80192f57cd132b31b233c65734de04939ce65sewardj break; 11640de80192f57cd132b31b233c65734de04939ce65sewardj case Ico_U8: 11650de80192f57cd132b31b233c65734de04939ce65sewardj u = 0x000000FF & con->Ico.U8; 11660de80192f57cd132b31b233c65734de04939ce65sewardj break; 11670de80192f57cd132b31b233c65734de04939ce65sewardj default: 11680de80192f57cd132b31b233c65734de04939ce65sewardj vpanic("iselIntExpr_RH.Iex_Const(tilegx)"); 11690de80192f57cd132b31b233c65734de04939ce65sewardj } 11700de80192f57cd132b31b233c65734de04939ce65sewardj l = (Long) u; 11710de80192f57cd132b31b233c65734de04939ce65sewardj /* Now figure out if it's representable. */ 11720de80192f57cd132b31b233c65734de04939ce65sewardj if (!syned && u <= 255) { 11730de80192f57cd132b31b233c65734de04939ce65sewardj return TILEGXRH_Imm(False /*unsigned */ , toUShort(u & 0xFFFF)); 11740de80192f57cd132b31b233c65734de04939ce65sewardj } 11750de80192f57cd132b31b233c65734de04939ce65sewardj if (syned && l >= -127 && l <= 127) { 11760de80192f57cd132b31b233c65734de04939ce65sewardj return TILEGXRH_Imm(True /*signed */ , toUShort(u & 0xFFFF)); 11770de80192f57cd132b31b233c65734de04939ce65sewardj } 11780de80192f57cd132b31b233c65734de04939ce65sewardj /* no luck; use the Slow Way. */ 11790de80192f57cd132b31b233c65734de04939ce65sewardj } 11800de80192f57cd132b31b233c65734de04939ce65sewardj /* default case: calculate into a register and return that */ 11810de80192f57cd132b31b233c65734de04939ce65sewardj return TILEGXRH_Reg(iselWordExpr_R(env, e)); 11820de80192f57cd132b31b233c65734de04939ce65sewardj} 11830de80192f57cd132b31b233c65734de04939ce65sewardj 11840de80192f57cd132b31b233c65734de04939ce65sewardj/* --------------------- RH6u --------------------- */ 11850de80192f57cd132b31b233c65734de04939ce65sewardj 11860de80192f57cd132b31b233c65734de04939ce65sewardj/* Compute an I8 into a reg-or-6-bit-unsigned-immediate, the latter 11870de80192f57cd132b31b233c65734de04939ce65sewardj being an immediate in the range 0 .. 63 inclusive. Used for doing 11880de80192f57cd132b31b233c65734de04939ce65sewardj shift amounts. */ 11890de80192f57cd132b31b233c65734de04939ce65sewardj 11900de80192f57cd132b31b233c65734de04939ce65sewardjstatic TILEGXRH *iselWordExpr_RH6u ( ISelEnv * env, IRExpr * e ) 11910de80192f57cd132b31b233c65734de04939ce65sewardj{ 11920de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXRH *ri; 11930de80192f57cd132b31b233c65734de04939ce65sewardj ri = iselWordExpr_RH6u_wrk(env, e); 11940de80192f57cd132b31b233c65734de04939ce65sewardj /* sanity checks ... */ 11950de80192f57cd132b31b233c65734de04939ce65sewardj switch (ri->tag) { 11960de80192f57cd132b31b233c65734de04939ce65sewardj case GXrh_Imm: 11970de80192f57cd132b31b233c65734de04939ce65sewardj vassert(ri->GXrh.Imm.imm16 >= 1 && ri->GXrh.Imm.imm16 <= 63); 11980de80192f57cd132b31b233c65734de04939ce65sewardj vassert(!ri->GXrh.Imm.syned); 11990de80192f57cd132b31b233c65734de04939ce65sewardj return ri; 12000de80192f57cd132b31b233c65734de04939ce65sewardj case GXrh_Reg: 12010de80192f57cd132b31b233c65734de04939ce65sewardj vassert(hregClass(ri->GXrh.Reg.reg) == HRcInt64); 12020de80192f57cd132b31b233c65734de04939ce65sewardj vassert(hregIsVirtual(ri->GXrh.Reg.reg)); 12030de80192f57cd132b31b233c65734de04939ce65sewardj return ri; 12040de80192f57cd132b31b233c65734de04939ce65sewardj default: 12050de80192f57cd132b31b233c65734de04939ce65sewardj vpanic("iselIntExpr_RH6u: unknown tilegx RH tag"); 12060de80192f57cd132b31b233c65734de04939ce65sewardj } 12070de80192f57cd132b31b233c65734de04939ce65sewardj} 12080de80192f57cd132b31b233c65734de04939ce65sewardj 12090de80192f57cd132b31b233c65734de04939ce65sewardj/* DO NOT CALL THIS DIRECTLY ! */ 12100de80192f57cd132b31b233c65734de04939ce65sewardjstatic TILEGXRH *iselWordExpr_RH6u_wrk ( ISelEnv * env, IRExpr * e ) 12110de80192f57cd132b31b233c65734de04939ce65sewardj{ 12120de80192f57cd132b31b233c65734de04939ce65sewardj IRType ty = typeOfIRExpr(env->type_env, e); 12130de80192f57cd132b31b233c65734de04939ce65sewardj 12140de80192f57cd132b31b233c65734de04939ce65sewardj /* special case: immediate */ 12150de80192f57cd132b31b233c65734de04939ce65sewardj if (e->tag == Iex_Const) 12160de80192f57cd132b31b233c65734de04939ce65sewardj { 12170de80192f57cd132b31b233c65734de04939ce65sewardj if (ty == Ity_I8) 12180de80192f57cd132b31b233c65734de04939ce65sewardj { 12190de80192f57cd132b31b233c65734de04939ce65sewardj if(e->Iex.Const.con->tag == Ico_U8 12200de80192f57cd132b31b233c65734de04939ce65sewardj && e->Iex.Const.con->Ico.U8 >= 1 && e->Iex.Const.con->Ico.U8 <= 63) 12210de80192f57cd132b31b233c65734de04939ce65sewardj return TILEGXRH_Imm(False /*unsigned */ , e->Iex.Const.con->Ico.U8); 12220de80192f57cd132b31b233c65734de04939ce65sewardj } 12230de80192f57cd132b31b233c65734de04939ce65sewardj else if (ty == Ity_I64) 12240de80192f57cd132b31b233c65734de04939ce65sewardj { 12250de80192f57cd132b31b233c65734de04939ce65sewardj if(e->Iex.Const.con->tag == Ico_U64 12260de80192f57cd132b31b233c65734de04939ce65sewardj && e->Iex.Const.con->Ico.U64 >= 1 12270de80192f57cd132b31b233c65734de04939ce65sewardj && e->Iex.Const.con->Ico.U64 <= 63) 12280de80192f57cd132b31b233c65734de04939ce65sewardj return TILEGXRH_Imm(False /*unsigned */, e->Iex.Const.con->Ico.U64); 12290de80192f57cd132b31b233c65734de04939ce65sewardj } 12300de80192f57cd132b31b233c65734de04939ce65sewardj } 12310de80192f57cd132b31b233c65734de04939ce65sewardj 12320de80192f57cd132b31b233c65734de04939ce65sewardj /* default case: calculate into a register and return that */ 12330de80192f57cd132b31b233c65734de04939ce65sewardj return TILEGXRH_Reg(iselWordExpr_R(env, e)); 12340de80192f57cd132b31b233c65734de04939ce65sewardj} 12350de80192f57cd132b31b233c65734de04939ce65sewardj 12360de80192f57cd132b31b233c65734de04939ce65sewardj/* --------------------- CONDCODE --------------------- */ 12370de80192f57cd132b31b233c65734de04939ce65sewardj 12380de80192f57cd132b31b233c65734de04939ce65sewardj/* Generate code to evaluated a bit-typed expression, returning the 12390de80192f57cd132b31b233c65734de04939ce65sewardj condition code which would correspond when the expression would 12400de80192f57cd132b31b233c65734de04939ce65sewardj notionally have returned 1. */ 12410de80192f57cd132b31b233c65734de04939ce65sewardj 12420de80192f57cd132b31b233c65734de04939ce65sewardjstatic TILEGXCondCode iselCondCode(ISelEnv * env, IRExpr * e) 12430de80192f57cd132b31b233c65734de04939ce65sewardj{ 12440de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXCondCode cc = iselCondCode_wrk(env,e); 12450de80192f57cd132b31b233c65734de04939ce65sewardj vassert(cc != TILEGXcc_NV); 12460de80192f57cd132b31b233c65734de04939ce65sewardj return cc; 12470de80192f57cd132b31b233c65734de04939ce65sewardj} 12480de80192f57cd132b31b233c65734de04939ce65sewardj 12490de80192f57cd132b31b233c65734de04939ce65sewardj/* DO NOT CALL THIS DIRECTLY ! */ 12500de80192f57cd132b31b233c65734de04939ce65sewardjstatic TILEGXCondCode iselCondCode_wrk ( ISelEnv * env, IRExpr * e ) 12510de80192f57cd132b31b233c65734de04939ce65sewardj{ 12520de80192f57cd132b31b233c65734de04939ce65sewardj vassert(e); 12530de80192f57cd132b31b233c65734de04939ce65sewardj vassert(typeOfIRExpr(env->type_env, e) == Ity_I1); 12540de80192f57cd132b31b233c65734de04939ce65sewardj 12550de80192f57cd132b31b233c65734de04939ce65sewardj /* Cmp*(x,y) ? */ 12560de80192f57cd132b31b233c65734de04939ce65sewardj if (e->Iex.Binop.op == Iop_CmpEQ32 12570de80192f57cd132b31b233c65734de04939ce65sewardj || e->Iex.Binop.op == Iop_CmpNE32 12580de80192f57cd132b31b233c65734de04939ce65sewardj || e->Iex.Binop.op == Iop_CmpNE64 12590de80192f57cd132b31b233c65734de04939ce65sewardj || e->Iex.Binop.op == Iop_CmpLT32S 12600de80192f57cd132b31b233c65734de04939ce65sewardj || e->Iex.Binop.op == Iop_CmpLT32U 12610de80192f57cd132b31b233c65734de04939ce65sewardj || e->Iex.Binop.op == Iop_CmpLT64U 12620de80192f57cd132b31b233c65734de04939ce65sewardj || e->Iex.Binop.op == Iop_CmpLE32S 12630de80192f57cd132b31b233c65734de04939ce65sewardj || e->Iex.Binop.op == Iop_CmpLE64S 12640de80192f57cd132b31b233c65734de04939ce65sewardj || e->Iex.Binop.op == Iop_CmpLT64S 12650de80192f57cd132b31b233c65734de04939ce65sewardj || e->Iex.Binop.op == Iop_CmpEQ64 12660de80192f57cd132b31b233c65734de04939ce65sewardj || e->Iex.Binop.op == Iop_CasCmpEQ32 12670de80192f57cd132b31b233c65734de04939ce65sewardj || e->Iex.Binop.op == Iop_CasCmpEQ64) { 12680de80192f57cd132b31b233c65734de04939ce65sewardj 12690de80192f57cd132b31b233c65734de04939ce65sewardj Bool syned = (e->Iex.Binop.op == Iop_CmpLT32S 12700de80192f57cd132b31b233c65734de04939ce65sewardj || e->Iex.Binop.op == Iop_CmpLE32S 12710de80192f57cd132b31b233c65734de04939ce65sewardj || e->Iex.Binop.op == Iop_CmpLT64S 12720de80192f57cd132b31b233c65734de04939ce65sewardj || e->Iex.Binop.op == Iop_CmpLE64S); 12730de80192f57cd132b31b233c65734de04939ce65sewardj Bool size32; 12740de80192f57cd132b31b233c65734de04939ce65sewardj HReg dst = newVRegI(env); 12750de80192f57cd132b31b233c65734de04939ce65sewardj HReg r1 = iselWordExpr_R(env, e->Iex.Binop.arg1); 12760de80192f57cd132b31b233c65734de04939ce65sewardj HReg r2 = iselWordExpr_R(env, e->Iex.Binop.arg2); 12770de80192f57cd132b31b233c65734de04939ce65sewardj 12780de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXCondCode cc; 12790de80192f57cd132b31b233c65734de04939ce65sewardj 12800de80192f57cd132b31b233c65734de04939ce65sewardj switch (e->Iex.Binop.op) { 12810de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CmpEQ32: 12820de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CasCmpEQ32: 12830de80192f57cd132b31b233c65734de04939ce65sewardj cc = TILEGXcc_EQ; 12840de80192f57cd132b31b233c65734de04939ce65sewardj size32 = True; 12850de80192f57cd132b31b233c65734de04939ce65sewardj break; 12860de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CmpNE32: 12870de80192f57cd132b31b233c65734de04939ce65sewardj cc = TILEGXcc_NE; 12880de80192f57cd132b31b233c65734de04939ce65sewardj size32 = True; 12890de80192f57cd132b31b233c65734de04939ce65sewardj break; 12900de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CmpNE64: 12910de80192f57cd132b31b233c65734de04939ce65sewardj cc = TILEGXcc_NE; 12920de80192f57cd132b31b233c65734de04939ce65sewardj size32 = True; 12930de80192f57cd132b31b233c65734de04939ce65sewardj break; 12940de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CmpLT32S: 12950de80192f57cd132b31b233c65734de04939ce65sewardj cc = TILEGXcc_LT; 12960de80192f57cd132b31b233c65734de04939ce65sewardj size32 = True; 12970de80192f57cd132b31b233c65734de04939ce65sewardj break; 12980de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CmpLT32U: 12990de80192f57cd132b31b233c65734de04939ce65sewardj cc = TILEGXcc_LO; 13000de80192f57cd132b31b233c65734de04939ce65sewardj size32 = True; 13010de80192f57cd132b31b233c65734de04939ce65sewardj break; 13020de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CmpLT64U: 13030de80192f57cd132b31b233c65734de04939ce65sewardj cc = TILEGXcc_LO; 13040de80192f57cd132b31b233c65734de04939ce65sewardj size32 = False; 13050de80192f57cd132b31b233c65734de04939ce65sewardj break; 13060de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CmpLE32S: 13070de80192f57cd132b31b233c65734de04939ce65sewardj cc = TILEGXcc_LE; 13080de80192f57cd132b31b233c65734de04939ce65sewardj size32 = True; 13090de80192f57cd132b31b233c65734de04939ce65sewardj break; 13100de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CmpLE64S: 13110de80192f57cd132b31b233c65734de04939ce65sewardj cc = TILEGXcc_LE; 13120de80192f57cd132b31b233c65734de04939ce65sewardj size32 = False; 13130de80192f57cd132b31b233c65734de04939ce65sewardj break; 13140de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CmpLT64S: 13150de80192f57cd132b31b233c65734de04939ce65sewardj cc = TILEGXcc_LT; 13160de80192f57cd132b31b233c65734de04939ce65sewardj size32 = False; 13170de80192f57cd132b31b233c65734de04939ce65sewardj break; 13180de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CmpEQ64: 13190de80192f57cd132b31b233c65734de04939ce65sewardj case Iop_CasCmpEQ64: 13200de80192f57cd132b31b233c65734de04939ce65sewardj cc = TILEGXcc_EQ; 13210de80192f57cd132b31b233c65734de04939ce65sewardj size32 = False; 13220de80192f57cd132b31b233c65734de04939ce65sewardj break; 13230de80192f57cd132b31b233c65734de04939ce65sewardj default: 13240de80192f57cd132b31b233c65734de04939ce65sewardj vpanic("iselCondCode(tilegx): CmpXX32 or CmpXX64"); 13250de80192f57cd132b31b233c65734de04939ce65sewardj break; 13260de80192f57cd132b31b233c65734de04939ce65sewardj } 13270de80192f57cd132b31b233c65734de04939ce65sewardj 13280de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Cmp(syned, size32, dst, r1, r2, cc)); 13290de80192f57cd132b31b233c65734de04939ce65sewardj /* Store result to guest_COND */ 13300de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXAMode *am_addr = TILEGXAMode_IR(0, TILEGXGuestStatePointer()); 13310de80192f57cd132b31b233c65734de04939ce65sewardj 13320de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Store(8, 13330de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXAMode_IR(am_addr->GXam.IR.index + 13340de80192f57cd132b31b233c65734de04939ce65sewardj COND_OFFSET(), 13350de80192f57cd132b31b233c65734de04939ce65sewardj am_addr->GXam.IR.base), 13360de80192f57cd132b31b233c65734de04939ce65sewardj dst)); 13370de80192f57cd132b31b233c65734de04939ce65sewardj return cc; 13380de80192f57cd132b31b233c65734de04939ce65sewardj } 13390de80192f57cd132b31b233c65734de04939ce65sewardj 13400de80192f57cd132b31b233c65734de04939ce65sewardj if (e->Iex.Binop.op == Iop_Not1) { 13410de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_dst = newVRegI(env); 13420de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_srcL = iselWordExpr_R(env, e->Iex.Unop.arg); 13430de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXRH *r_srcR = TILEGXRH_Reg(r_srcL); 13440de80192f57cd132b31b233c65734de04939ce65sewardj 13450de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_LI(r_dst, 0x1)); 13460de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Alu(GXalu_SUB, r_dst, r_dst, r_srcR)); 13470de80192f57cd132b31b233c65734de04939ce65sewardj 13480de80192f57cd132b31b233c65734de04939ce65sewardj /* Store result to guest_COND */ 13490de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXAMode *am_addr = TILEGXAMode_IR(0, TILEGXGuestStatePointer()); 13500de80192f57cd132b31b233c65734de04939ce65sewardj 13510de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Store(8, 13520de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXAMode_IR(am_addr->GXam.IR.index + 13530de80192f57cd132b31b233c65734de04939ce65sewardj COND_OFFSET(), 13540de80192f57cd132b31b233c65734de04939ce65sewardj am_addr->GXam.IR.base), 13550de80192f57cd132b31b233c65734de04939ce65sewardj r_dst)); 13560de80192f57cd132b31b233c65734de04939ce65sewardj return TILEGXcc_NE; 13570de80192f57cd132b31b233c65734de04939ce65sewardj } 13580de80192f57cd132b31b233c65734de04939ce65sewardj 13590de80192f57cd132b31b233c65734de04939ce65sewardj if (e->tag == Iex_RdTmp || e->tag == Iex_Unop) { 13600de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_dst = iselWordExpr_R_wrk(env, e); 13610de80192f57cd132b31b233c65734de04939ce65sewardj /* Store result to guest_COND */ 13620de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXAMode *am_addr = TILEGXAMode_IR(0, TILEGXGuestStatePointer()); 13630de80192f57cd132b31b233c65734de04939ce65sewardj 13640de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Store(8, 13650de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXAMode_IR(am_addr->GXam.IR.index + 13660de80192f57cd132b31b233c65734de04939ce65sewardj COND_OFFSET(), 13670de80192f57cd132b31b233c65734de04939ce65sewardj am_addr->GXam.IR.base), 13680de80192f57cd132b31b233c65734de04939ce65sewardj r_dst)); 13690de80192f57cd132b31b233c65734de04939ce65sewardj return TILEGXcc_EQ; 13700de80192f57cd132b31b233c65734de04939ce65sewardj } 13710de80192f57cd132b31b233c65734de04939ce65sewardj 13720de80192f57cd132b31b233c65734de04939ce65sewardj vex_printf("iselCondCode(tilegx): No such tag(%u)\n", e->tag); 13730de80192f57cd132b31b233c65734de04939ce65sewardj ppIRExpr(e); 13740de80192f57cd132b31b233c65734de04939ce65sewardj vpanic("iselCondCode(tilegx)"); 13750de80192f57cd132b31b233c65734de04939ce65sewardj 13760de80192f57cd132b31b233c65734de04939ce65sewardj /* Constant 1:Bit */ 13770de80192f57cd132b31b233c65734de04939ce65sewardj if (e->tag == Iex_Const && e->Iex.Const.con->Ico.U1 == True) 13780de80192f57cd132b31b233c65734de04939ce65sewardj return TILEGXcc_AL; 13790de80192f57cd132b31b233c65734de04939ce65sewardj 13800de80192f57cd132b31b233c65734de04939ce65sewardj if (e->tag == Iex_RdTmp) 13810de80192f57cd132b31b233c65734de04939ce65sewardj return TILEGXcc_EQ; 13820de80192f57cd132b31b233c65734de04939ce65sewardj 13830de80192f57cd132b31b233c65734de04939ce65sewardj if (e->tag == Iex_Binop) 13840de80192f57cd132b31b233c65734de04939ce65sewardj return TILEGXcc_EQ; 13850de80192f57cd132b31b233c65734de04939ce65sewardj 13860de80192f57cd132b31b233c65734de04939ce65sewardj if (e->tag == Iex_Unop) 13870de80192f57cd132b31b233c65734de04939ce65sewardj return TILEGXcc_EQ; 13880de80192f57cd132b31b233c65734de04939ce65sewardj 13890de80192f57cd132b31b233c65734de04939ce65sewardj vex_printf("iselCondCode(tilegx): No such tag(%u)\n", e->tag); 13900de80192f57cd132b31b233c65734de04939ce65sewardj ppIRExpr(e); 13910de80192f57cd132b31b233c65734de04939ce65sewardj vpanic("iselCondCode(tilegx)"); 13920de80192f57cd132b31b233c65734de04939ce65sewardj} 13930de80192f57cd132b31b233c65734de04939ce65sewardj 13940de80192f57cd132b31b233c65734de04939ce65sewardj/*---------------------------------------------------------*/ 13950de80192f57cd132b31b233c65734de04939ce65sewardj/*--- ISEL: Statements ---*/ 13960de80192f57cd132b31b233c65734de04939ce65sewardj/*---------------------------------------------------------*/ 13970de80192f57cd132b31b233c65734de04939ce65sewardj 13980de80192f57cd132b31b233c65734de04939ce65sewardjstatic void iselStmt ( ISelEnv * env, IRStmt * stmt ) 13990de80192f57cd132b31b233c65734de04939ce65sewardj{ 14000de80192f57cd132b31b233c65734de04939ce65sewardj if (vex_traceflags & VEX_TRACE_VCODE) { 14010de80192f57cd132b31b233c65734de04939ce65sewardj vex_printf("\n-- "); 14020de80192f57cd132b31b233c65734de04939ce65sewardj ppIRStmt(stmt); 14030de80192f57cd132b31b233c65734de04939ce65sewardj vex_printf("\n"); 14040de80192f57cd132b31b233c65734de04939ce65sewardj } 14050de80192f57cd132b31b233c65734de04939ce65sewardj 14060de80192f57cd132b31b233c65734de04939ce65sewardj switch (stmt->tag) { 14070de80192f57cd132b31b233c65734de04939ce65sewardj /* --------- STORE --------- */ 14080de80192f57cd132b31b233c65734de04939ce65sewardj case Ist_Store: { 14090de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXAMode *am_addr; 14100de80192f57cd132b31b233c65734de04939ce65sewardj IRType tyd = typeOfIRExpr(env->type_env, stmt->Ist.Store.data); 14110de80192f57cd132b31b233c65734de04939ce65sewardj 14120de80192f57cd132b31b233c65734de04939ce65sewardj /*constructs addressing mode from address provided */ 14130de80192f57cd132b31b233c65734de04939ce65sewardj am_addr = iselWordExpr_AMode(env, stmt->Ist.Store.addr, tyd); 14140de80192f57cd132b31b233c65734de04939ce65sewardj 14150de80192f57cd132b31b233c65734de04939ce65sewardj if (tyd == Ity_I8 || tyd == Ity_I16 || tyd == Ity_I32 || 14160de80192f57cd132b31b233c65734de04939ce65sewardj (tyd == Ity_I64)) { 14170de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_src = iselWordExpr_R(env, stmt->Ist.Store.data); 14180de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Store(toUChar(sizeofIRType(tyd)), 14190de80192f57cd132b31b233c65734de04939ce65sewardj am_addr, r_src)); 14200de80192f57cd132b31b233c65734de04939ce65sewardj return; 14210de80192f57cd132b31b233c65734de04939ce65sewardj } 14220de80192f57cd132b31b233c65734de04939ce65sewardj break; 14230de80192f57cd132b31b233c65734de04939ce65sewardj } 14240de80192f57cd132b31b233c65734de04939ce65sewardj 14250de80192f57cd132b31b233c65734de04939ce65sewardj /* --------- PUT --------- */ 14260de80192f57cd132b31b233c65734de04939ce65sewardj case Ist_Put: { 14270de80192f57cd132b31b233c65734de04939ce65sewardj IRType ty = typeOfIRExpr(env->type_env, stmt->Ist.Put.data); 14280de80192f57cd132b31b233c65734de04939ce65sewardj 14290de80192f57cd132b31b233c65734de04939ce65sewardj if (ty == Ity_I8 || ty == Ity_I16 || ty == Ity_I32 || 14300de80192f57cd132b31b233c65734de04939ce65sewardj (ty == Ity_I64)) { 14310de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_src = iselWordExpr_R(env, stmt->Ist.Put.data); 14320de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXAMode *am_addr = TILEGXAMode_IR(stmt->Ist.Put.offset, 14330de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXGuestStatePointer()); 14340de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Store(toUChar(sizeofIRType(ty)), 14350de80192f57cd132b31b233c65734de04939ce65sewardj am_addr, r_src)); 14360de80192f57cd132b31b233c65734de04939ce65sewardj return; 14370de80192f57cd132b31b233c65734de04939ce65sewardj } 14380de80192f57cd132b31b233c65734de04939ce65sewardj break; 14390de80192f57cd132b31b233c65734de04939ce65sewardj } 14400de80192f57cd132b31b233c65734de04939ce65sewardj 14410de80192f57cd132b31b233c65734de04939ce65sewardj /* --------- TMP --------- */ 14420de80192f57cd132b31b233c65734de04939ce65sewardj case Ist_WrTmp: { 14430de80192f57cd132b31b233c65734de04939ce65sewardj IRTemp tmp = stmt->Ist.WrTmp.tmp; 14440de80192f57cd132b31b233c65734de04939ce65sewardj IRType ty = typeOfIRTemp(env->type_env, tmp); 14450de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_dst = lookupIRTemp(env, tmp); 14460de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_src = iselWordExpr_R(env, stmt->Ist.WrTmp.data); 14470de80192f57cd132b31b233c65734de04939ce65sewardj IRType dty = typeOfIRExpr(env->type_env, stmt->Ist.WrTmp.data); 14480de80192f57cd132b31b233c65734de04939ce65sewardj 14490de80192f57cd132b31b233c65734de04939ce65sewardj if (ty == Ity_I64 || ty == Ity_I32 || ty == Ity_I16 || ty == Ity_I8 || 14500de80192f57cd132b31b233c65734de04939ce65sewardj (ty == dty)) 14510de80192f57cd132b31b233c65734de04939ce65sewardj { 14520de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, mk_iMOVds_RR(r_dst, r_src)); 14530de80192f57cd132b31b233c65734de04939ce65sewardj return; 14540de80192f57cd132b31b233c65734de04939ce65sewardj } 14550de80192f57cd132b31b233c65734de04939ce65sewardj else if (ty == Ity_I1) { 14560de80192f57cd132b31b233c65734de04939ce65sewardj switch (dty) 14570de80192f57cd132b31b233c65734de04939ce65sewardj { 14580de80192f57cd132b31b233c65734de04939ce65sewardj case Ity_I32: 14590de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Bf(GXbf_EXTU, r_src, r_src, 0, 31)); 14600de80192f57cd132b31b233c65734de04939ce65sewardj break; 14610de80192f57cd132b31b233c65734de04939ce65sewardj case Ity_I16: 14620de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Bf(GXbf_EXTU, r_src, r_src, 0, 15)); 14630de80192f57cd132b31b233c65734de04939ce65sewardj break; 14640de80192f57cd132b31b233c65734de04939ce65sewardj case Ity_I8: 14650de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Bf(GXbf_EXTU, r_src, r_src, 0, 7)); 14660de80192f57cd132b31b233c65734de04939ce65sewardj break; 14670de80192f57cd132b31b233c65734de04939ce65sewardj default: 14680de80192f57cd132b31b233c65734de04939ce65sewardj vassert(0); 14690de80192f57cd132b31b233c65734de04939ce65sewardj } 14700de80192f57cd132b31b233c65734de04939ce65sewardj 14710de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_MovCond(r_dst, 14720de80192f57cd132b31b233c65734de04939ce65sewardj hregTILEGX_R63(), 14730de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXRH_Imm(False, 1), 14740de80192f57cd132b31b233c65734de04939ce65sewardj r_src, 14750de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXcc_EZ)); 14760de80192f57cd132b31b233c65734de04939ce65sewardj return; 14770de80192f57cd132b31b233c65734de04939ce65sewardj } 14780de80192f57cd132b31b233c65734de04939ce65sewardj break; 14790de80192f57cd132b31b233c65734de04939ce65sewardj } 14800de80192f57cd132b31b233c65734de04939ce65sewardj 14810de80192f57cd132b31b233c65734de04939ce65sewardj /* --------- Call to DIRTY helper --------- */ 14820de80192f57cd132b31b233c65734de04939ce65sewardj case Ist_Dirty: { 14830de80192f57cd132b31b233c65734de04939ce65sewardj IRType retty; 14840de80192f57cd132b31b233c65734de04939ce65sewardj IRDirty *d = stmt->Ist.Dirty.details; 14850de80192f57cd132b31b233c65734de04939ce65sewardj 14860de80192f57cd132b31b233c65734de04939ce65sewardj /* Marshal args, do the call, clear stack. */ 14870de80192f57cd132b31b233c65734de04939ce65sewardj doHelperCall(env, d->guard, d->cee, d->args, -1); 14880de80192f57cd132b31b233c65734de04939ce65sewardj 14890de80192f57cd132b31b233c65734de04939ce65sewardj /* Now figure out what to do with the returned value, if any. */ 14900de80192f57cd132b31b233c65734de04939ce65sewardj if (d->tmp == IRTemp_INVALID) 14910de80192f57cd132b31b233c65734de04939ce65sewardj /* No return value. Nothing to do. */ 14920de80192f57cd132b31b233c65734de04939ce65sewardj return; 14930de80192f57cd132b31b233c65734de04939ce65sewardj 14940de80192f57cd132b31b233c65734de04939ce65sewardj retty = typeOfIRTemp(env->type_env, d->tmp); 14950de80192f57cd132b31b233c65734de04939ce65sewardj 14960de80192f57cd132b31b233c65734de04939ce65sewardj if (retty == Ity_I8 || retty == Ity_I16 || retty == Ity_I32 14970de80192f57cd132b31b233c65734de04939ce65sewardj || (retty == Ity_I64)) { 14980de80192f57cd132b31b233c65734de04939ce65sewardj /* The returned value is in r0. Park it in the register 14990de80192f57cd132b31b233c65734de04939ce65sewardj associated with tmp. */ 15000de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_dst = lookupIRTemp(env, d->tmp); 15010de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, mk_iMOVds_RR(r_dst, hregTILEGX_R0())); 15020de80192f57cd132b31b233c65734de04939ce65sewardj return; 15030de80192f57cd132b31b233c65734de04939ce65sewardj } 15040de80192f57cd132b31b233c65734de04939ce65sewardj break; 15050de80192f57cd132b31b233c65734de04939ce65sewardj } 15060de80192f57cd132b31b233c65734de04939ce65sewardj 15070de80192f57cd132b31b233c65734de04939ce65sewardj 15080de80192f57cd132b31b233c65734de04939ce65sewardj /* --------- ACAS --------- */ 15090de80192f57cd132b31b233c65734de04939ce65sewardj case Ist_CAS: 15100de80192f57cd132b31b233c65734de04939ce65sewardj { 15110de80192f57cd132b31b233c65734de04939ce65sewardj UChar sz; 15120de80192f57cd132b31b233c65734de04939ce65sewardj IRCAS* cas = stmt->Ist.CAS.details; 15130de80192f57cd132b31b233c65734de04939ce65sewardj IRType ty = typeOfIRExpr(env->type_env, cas->dataLo); 15140de80192f57cd132b31b233c65734de04939ce65sewardj 15150de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXAMode *r_addr = iselWordExpr_AMode(env, cas->addr, Ity_I64); 15160de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_new = iselWordExpr_R(env, cas->dataLo); 15170de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_old = lookupIRTemp(env, cas->oldLo); 15180de80192f57cd132b31b233c65734de04939ce65sewardj HReg r_exp = INVALID_HREG; 15190de80192f57cd132b31b233c65734de04939ce65sewardj 15200de80192f57cd132b31b233c65734de04939ce65sewardj vassert(cas->expdHi == NULL); 15210de80192f57cd132b31b233c65734de04939ce65sewardj vassert(cas->dataHi == NULL); 15220de80192f57cd132b31b233c65734de04939ce65sewardj vassert(r_addr->tag == GXam_IR); 15230de80192f57cd132b31b233c65734de04939ce65sewardj vassert(r_addr->GXam.IR.index == 0); 15240de80192f57cd132b31b233c65734de04939ce65sewardj 15250de80192f57cd132b31b233c65734de04939ce65sewardj switch (ty) 15260de80192f57cd132b31b233c65734de04939ce65sewardj { 15270de80192f57cd132b31b233c65734de04939ce65sewardj case Ity_I64: sz = 8; break; 15280de80192f57cd132b31b233c65734de04939ce65sewardj case Ity_I32: sz = 4; break; 15290de80192f57cd132b31b233c65734de04939ce65sewardj default: vassert(0); 15300de80192f57cd132b31b233c65734de04939ce65sewardj } 15310de80192f57cd132b31b233c65734de04939ce65sewardj 15320de80192f57cd132b31b233c65734de04939ce65sewardj if (cas->expdLo->tag != Iex_Const) 15330de80192f57cd132b31b233c65734de04939ce65sewardj { 15340de80192f57cd132b31b233c65734de04939ce65sewardj r_exp = iselWordExpr_R(env, cas->expdLo); 15350de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Acas(GXacas_CMPEXCH, r_old, 15360de80192f57cd132b31b233c65734de04939ce65sewardj r_addr->GXam.IR.base, r_exp, 15370de80192f57cd132b31b233c65734de04939ce65sewardj r_new, sz)); 15380de80192f57cd132b31b233c65734de04939ce65sewardj } 15390de80192f57cd132b31b233c65734de04939ce65sewardj else 15400de80192f57cd132b31b233c65734de04939ce65sewardj { 15410de80192f57cd132b31b233c65734de04939ce65sewardj if((sz == 8 && cas->expdLo->Iex.Const.con->Ico.U64 == 0) || 15420de80192f57cd132b31b233c65734de04939ce65sewardj (sz == 4 && cas->expdLo->Iex.Const.con->Ico.U32 == 0)) 15430de80192f57cd132b31b233c65734de04939ce65sewardj { 15440de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Acas(GXacas_EXCH, r_old, 15450de80192f57cd132b31b233c65734de04939ce65sewardj r_addr->GXam.IR.base, 15460de80192f57cd132b31b233c65734de04939ce65sewardj r_exp, r_new, sz)); 15470de80192f57cd132b31b233c65734de04939ce65sewardj } 15480de80192f57cd132b31b233c65734de04939ce65sewardj else if((sz == 8 && cas->expdLo->Iex.Const.con->Ico.U64 == 2) || 15490de80192f57cd132b31b233c65734de04939ce65sewardj (sz == 4 && cas->expdLo->Iex.Const.con->Ico.U32 == 2)) 15500de80192f57cd132b31b233c65734de04939ce65sewardj { 15510de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Acas(GXacas_FetchAnd, r_old, 15520de80192f57cd132b31b233c65734de04939ce65sewardj r_addr->GXam.IR.base, r_exp, 15530de80192f57cd132b31b233c65734de04939ce65sewardj r_new, sz)); 15540de80192f57cd132b31b233c65734de04939ce65sewardj } 15550de80192f57cd132b31b233c65734de04939ce65sewardj else if((sz == 8 && cas->expdLo->Iex.Const.con->Ico.U64 == 3) || 15560de80192f57cd132b31b233c65734de04939ce65sewardj (sz == 4 && cas->expdLo->Iex.Const.con->Ico.U32 == 3)) 15570de80192f57cd132b31b233c65734de04939ce65sewardj { 15580de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Acas(GXacas_FetchAdd, r_old, 15590de80192f57cd132b31b233c65734de04939ce65sewardj r_addr->GXam.IR.base, 15600de80192f57cd132b31b233c65734de04939ce65sewardj r_exp, r_new, sz)); 15610de80192f57cd132b31b233c65734de04939ce65sewardj } 15620de80192f57cd132b31b233c65734de04939ce65sewardj else if((sz == 8 && cas->expdLo->Iex.Const.con->Ico.U64 == 4) || 15630de80192f57cd132b31b233c65734de04939ce65sewardj (sz == 4 && cas->expdLo->Iex.Const.con->Ico.U32 == 4)) 15640de80192f57cd132b31b233c65734de04939ce65sewardj { 15650de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Acas(GXacas_FetchOr, r_old, 15660de80192f57cd132b31b233c65734de04939ce65sewardj r_addr->GXam.IR.base, r_exp, 15670de80192f57cd132b31b233c65734de04939ce65sewardj r_new, sz)); 15680de80192f57cd132b31b233c65734de04939ce65sewardj } 15690de80192f57cd132b31b233c65734de04939ce65sewardj else if((sz == 8 && cas->expdLo->Iex.Const.con->Ico.U64 == 5) || 15700de80192f57cd132b31b233c65734de04939ce65sewardj (sz == 4 && cas->expdLo->Iex.Const.con->Ico.U32 == 5)) 15710de80192f57cd132b31b233c65734de04939ce65sewardj { 15720de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_Acas(GXacas_FetchAddgez, r_old, 15730de80192f57cd132b31b233c65734de04939ce65sewardj r_addr->GXam.IR.base, r_exp, 15740de80192f57cd132b31b233c65734de04939ce65sewardj r_new, sz)); 15750de80192f57cd132b31b233c65734de04939ce65sewardj } 15760de80192f57cd132b31b233c65734de04939ce65sewardj else 15770de80192f57cd132b31b233c65734de04939ce65sewardj { 15780de80192f57cd132b31b233c65734de04939ce65sewardj vassert(0); 15790de80192f57cd132b31b233c65734de04939ce65sewardj } 15800de80192f57cd132b31b233c65734de04939ce65sewardj } 15810de80192f57cd132b31b233c65734de04939ce65sewardj return; 15820de80192f57cd132b31b233c65734de04939ce65sewardj } 15830de80192f57cd132b31b233c65734de04939ce65sewardj 15840de80192f57cd132b31b233c65734de04939ce65sewardj /* --------- INSTR MARK --------- */ 15850de80192f57cd132b31b233c65734de04939ce65sewardj /* Doesn't generate any executable code ... */ 15860de80192f57cd132b31b233c65734de04939ce65sewardj case Ist_IMark: 15870de80192f57cd132b31b233c65734de04939ce65sewardj return; 15880de80192f57cd132b31b233c65734de04939ce65sewardj 15890de80192f57cd132b31b233c65734de04939ce65sewardj /* --------- ABI HINT --------- */ 15900de80192f57cd132b31b233c65734de04939ce65sewardj /* These have no meaning (denotation in the IR) and so we ignore 15910de80192f57cd132b31b233c65734de04939ce65sewardj them ... if any actually made it this far. */ 15920de80192f57cd132b31b233c65734de04939ce65sewardj case Ist_AbiHint: 15930de80192f57cd132b31b233c65734de04939ce65sewardj return; 15940de80192f57cd132b31b233c65734de04939ce65sewardj 15950de80192f57cd132b31b233c65734de04939ce65sewardj /* --------- NO-OP --------- */ 15960de80192f57cd132b31b233c65734de04939ce65sewardj /* Fairly self-explanatory, wouldn't you say? */ 15970de80192f57cd132b31b233c65734de04939ce65sewardj case Ist_NoOp: 15980de80192f57cd132b31b233c65734de04939ce65sewardj return; 15990de80192f57cd132b31b233c65734de04939ce65sewardj 16000de80192f57cd132b31b233c65734de04939ce65sewardj /* --------- EXIT --------- */ 16010de80192f57cd132b31b233c65734de04939ce65sewardj case Ist_Exit: { 16020de80192f57cd132b31b233c65734de04939ce65sewardj 16030de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXCondCode cc = iselCondCode(env, stmt->Ist.Exit.guard); 16040de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXAMode* amPC = TILEGXAMode_IR(stmt->Ist.Exit.offsIP, 16050de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXGuestStatePointer()); 16060de80192f57cd132b31b233c65734de04939ce65sewardj 16070de80192f57cd132b31b233c65734de04939ce65sewardj /* Case: boring transfer to known address */ 16080de80192f57cd132b31b233c65734de04939ce65sewardj if (stmt->Ist.Exit.jk == Ijk_Boring 16090de80192f57cd132b31b233c65734de04939ce65sewardj || stmt->Ist.Exit.jk == Ijk_Call 16100de80192f57cd132b31b233c65734de04939ce65sewardj /* || stmt->Ist.Exit.jk == Ijk_Ret */) { 16110de80192f57cd132b31b233c65734de04939ce65sewardj if (env->chainingAllowed) { 16120de80192f57cd132b31b233c65734de04939ce65sewardj /* .. almost always true .. */ 16130de80192f57cd132b31b233c65734de04939ce65sewardj /* Skip the event check at the dst if this is a forwards 16140de80192f57cd132b31b233c65734de04939ce65sewardj edge. */ 16150de80192f57cd132b31b233c65734de04939ce65sewardj Bool toFastEP = 16160de80192f57cd132b31b233c65734de04939ce65sewardj ((Addr64)stmt->Ist.Exit.dst->Ico.U64) > ((Addr64)env->max_ga); 16170de80192f57cd132b31b233c65734de04939ce65sewardj 16180de80192f57cd132b31b233c65734de04939ce65sewardj if (0) vex_printf("%s", toFastEP ? "Y" : ","); 16190de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_XDirect( 16200de80192f57cd132b31b233c65734de04939ce65sewardj (Addr64)stmt->Ist.Exit.dst->Ico.U64, 16210de80192f57cd132b31b233c65734de04939ce65sewardj amPC, cc, toFastEP)); 16220de80192f57cd132b31b233c65734de04939ce65sewardj } else { 16230de80192f57cd132b31b233c65734de04939ce65sewardj /* .. very occasionally .. */ 16240de80192f57cd132b31b233c65734de04939ce65sewardj /* We can't use chaining, so ask for an assisted transfer, 16250de80192f57cd132b31b233c65734de04939ce65sewardj as that's the only alternative that is allowable. */ 16260de80192f57cd132b31b233c65734de04939ce65sewardj HReg r = iselWordExpr_R(env, IRExpr_Const(stmt->Ist.Exit.dst)); 16270de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_XAssisted(r, amPC, cc, Ijk_Boring)); 16280de80192f57cd132b31b233c65734de04939ce65sewardj } 16290de80192f57cd132b31b233c65734de04939ce65sewardj return; 16300de80192f57cd132b31b233c65734de04939ce65sewardj } 16310de80192f57cd132b31b233c65734de04939ce65sewardj 16320de80192f57cd132b31b233c65734de04939ce65sewardj /* Case: assisted transfer to arbitrary address */ 16330de80192f57cd132b31b233c65734de04939ce65sewardj switch (stmt->Ist.Exit.jk) { 16340de80192f57cd132b31b233c65734de04939ce65sewardj /* Keep this list in sync with that in iselNext below */ 16350de80192f57cd132b31b233c65734de04939ce65sewardj case Ijk_ClientReq: 16360de80192f57cd132b31b233c65734de04939ce65sewardj case Ijk_EmFail: 16370de80192f57cd132b31b233c65734de04939ce65sewardj case Ijk_EmWarn: 16380de80192f57cd132b31b233c65734de04939ce65sewardj case Ijk_NoDecode: 16390de80192f57cd132b31b233c65734de04939ce65sewardj case Ijk_NoRedir: 16400de80192f57cd132b31b233c65734de04939ce65sewardj case Ijk_SigBUS: 16410de80192f57cd132b31b233c65734de04939ce65sewardj case Ijk_Yield: 16420de80192f57cd132b31b233c65734de04939ce65sewardj case Ijk_SigTRAP: 16430de80192f57cd132b31b233c65734de04939ce65sewardj case Ijk_SigFPE_IntDiv: 16440de80192f57cd132b31b233c65734de04939ce65sewardj case Ijk_SigFPE_IntOvf: 16450de80192f57cd132b31b233c65734de04939ce65sewardj case Ijk_Sys_syscall: 16460de80192f57cd132b31b233c65734de04939ce65sewardj case Ijk_InvalICache: 16470de80192f57cd132b31b233c65734de04939ce65sewardj case Ijk_Ret: 16480de80192f57cd132b31b233c65734de04939ce65sewardj { 16490de80192f57cd132b31b233c65734de04939ce65sewardj HReg r = iselWordExpr_R(env, IRExpr_Const(stmt->Ist.Exit.dst)); 16500de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_XAssisted(r, amPC, cc, 16510de80192f57cd132b31b233c65734de04939ce65sewardj stmt->Ist.Exit.jk)); 16520de80192f57cd132b31b233c65734de04939ce65sewardj return; 16530de80192f57cd132b31b233c65734de04939ce65sewardj } 16540de80192f57cd132b31b233c65734de04939ce65sewardj default: 16550de80192f57cd132b31b233c65734de04939ce65sewardj break; 16560de80192f57cd132b31b233c65734de04939ce65sewardj } 16570de80192f57cd132b31b233c65734de04939ce65sewardj 16580de80192f57cd132b31b233c65734de04939ce65sewardj /* Do we ever expect to see any other kind? */ 16590de80192f57cd132b31b233c65734de04939ce65sewardj goto stmt_fail; 16600de80192f57cd132b31b233c65734de04939ce65sewardj } 16610de80192f57cd132b31b233c65734de04939ce65sewardj 16620de80192f57cd132b31b233c65734de04939ce65sewardj default: 16630de80192f57cd132b31b233c65734de04939ce65sewardj break; 16640de80192f57cd132b31b233c65734de04939ce65sewardj } 16650de80192f57cd132b31b233c65734de04939ce65sewardj 16660de80192f57cd132b31b233c65734de04939ce65sewardj stmt_fail: 16670de80192f57cd132b31b233c65734de04939ce65sewardj vex_printf("stmt_fail tag: 0x%x\n", stmt->tag); 16680de80192f57cd132b31b233c65734de04939ce65sewardj ppIRStmt(stmt); 16690de80192f57cd132b31b233c65734de04939ce65sewardj vpanic("iselStmt:\n"); 16700de80192f57cd132b31b233c65734de04939ce65sewardj} 16710de80192f57cd132b31b233c65734de04939ce65sewardj 16720de80192f57cd132b31b233c65734de04939ce65sewardj/*---------------------------------------------------------*/ 16730de80192f57cd132b31b233c65734de04939ce65sewardj/*--- ISEL: Basic block terminators (Nexts) ---*/ 16740de80192f57cd132b31b233c65734de04939ce65sewardj/*---------------------------------------------------------*/ 16750de80192f57cd132b31b233c65734de04939ce65sewardj 16760de80192f57cd132b31b233c65734de04939ce65sewardjstatic void iselNext ( ISelEnv * env, IRExpr * next, IRJumpKind jk, 16770de80192f57cd132b31b233c65734de04939ce65sewardj Int offsIP ) 16780de80192f57cd132b31b233c65734de04939ce65sewardj{ 16790de80192f57cd132b31b233c65734de04939ce65sewardj 16800de80192f57cd132b31b233c65734de04939ce65sewardj if (vex_traceflags & VEX_TRACE_VCODE) { 16810de80192f57cd132b31b233c65734de04939ce65sewardj vex_printf("\n-- PUT(%d) = ", offsIP); 16820de80192f57cd132b31b233c65734de04939ce65sewardj ppIRExpr(next); 16830de80192f57cd132b31b233c65734de04939ce65sewardj vex_printf( "; exit-"); 16840de80192f57cd132b31b233c65734de04939ce65sewardj ppIRJumpKind(jk); 16850de80192f57cd132b31b233c65734de04939ce65sewardj vex_printf( "\n"); 16860de80192f57cd132b31b233c65734de04939ce65sewardj } 16870de80192f57cd132b31b233c65734de04939ce65sewardj 16880de80192f57cd132b31b233c65734de04939ce65sewardj /* Case: boring transfer to known address */ 16890de80192f57cd132b31b233c65734de04939ce65sewardj if (next->tag == Iex_Const) { 16900de80192f57cd132b31b233c65734de04939ce65sewardj IRConst* cdst = next->Iex.Const.con; 16910de80192f57cd132b31b233c65734de04939ce65sewardj if (jk == Ijk_Boring || jk == Ijk_Call) { 16920de80192f57cd132b31b233c65734de04939ce65sewardj /* Boring transfer to known address */ 16930de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXAMode* amPC = TILEGXAMode_IR(offsIP, TILEGXGuestStatePointer()); 16940de80192f57cd132b31b233c65734de04939ce65sewardj if (env->chainingAllowed) { 16950de80192f57cd132b31b233c65734de04939ce65sewardj /* .. almost always true .. */ 16960de80192f57cd132b31b233c65734de04939ce65sewardj /* Skip the event check at the dst if this is a forwards 16970de80192f57cd132b31b233c65734de04939ce65sewardj edge. */ 16980de80192f57cd132b31b233c65734de04939ce65sewardj Bool toFastEP = ((Addr64)cdst->Ico.U64) > ((Addr64)env->max_ga); 16990de80192f57cd132b31b233c65734de04939ce65sewardj 17000de80192f57cd132b31b233c65734de04939ce65sewardj if (0) vex_printf("%s", toFastEP ? "X" : "."); 17010de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_XDirect((Addr64)cdst->Ico.U64, 17020de80192f57cd132b31b233c65734de04939ce65sewardj amPC, TILEGXcc_AL, toFastEP)); 17030de80192f57cd132b31b233c65734de04939ce65sewardj } else { 17040de80192f57cd132b31b233c65734de04939ce65sewardj /* .. very occasionally .. */ 17050de80192f57cd132b31b233c65734de04939ce65sewardj /* We can't use chaining, so ask for an assisted transfer, 17060de80192f57cd132b31b233c65734de04939ce65sewardj as that's the only alternative that is allowable. */ 17070de80192f57cd132b31b233c65734de04939ce65sewardj HReg r = iselWordExpr_R(env, next); 17080de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_XAssisted(r, amPC, TILEGXcc_AL, 17090de80192f57cd132b31b233c65734de04939ce65sewardj Ijk_Boring)); 17100de80192f57cd132b31b233c65734de04939ce65sewardj } 17110de80192f57cd132b31b233c65734de04939ce65sewardj return; 17120de80192f57cd132b31b233c65734de04939ce65sewardj } 17130de80192f57cd132b31b233c65734de04939ce65sewardj } 17140de80192f57cd132b31b233c65734de04939ce65sewardj 17150de80192f57cd132b31b233c65734de04939ce65sewardj /* Case: call/return (==boring) transfer to any address */ 17160de80192f57cd132b31b233c65734de04939ce65sewardj switch (jk) { 17170de80192f57cd132b31b233c65734de04939ce65sewardj case Ijk_Boring: case Ijk_Call: { 17180de80192f57cd132b31b233c65734de04939ce65sewardj HReg r = iselWordExpr_R(env, next); 17190de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXAMode* amPC = TILEGXAMode_IR(offsIP, 17200de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXGuestStatePointer()); 17210de80192f57cd132b31b233c65734de04939ce65sewardj if (env->chainingAllowed) 17220de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_XIndir(r, amPC, TILEGXcc_AL)); 17230de80192f57cd132b31b233c65734de04939ce65sewardj else 17240de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_XAssisted(r, amPC, TILEGXcc_AL, 17250de80192f57cd132b31b233c65734de04939ce65sewardj Ijk_Boring)); 17260de80192f57cd132b31b233c65734de04939ce65sewardj return; 17270de80192f57cd132b31b233c65734de04939ce65sewardj } 17280de80192f57cd132b31b233c65734de04939ce65sewardj default: 17290de80192f57cd132b31b233c65734de04939ce65sewardj break; 17300de80192f57cd132b31b233c65734de04939ce65sewardj } 17310de80192f57cd132b31b233c65734de04939ce65sewardj 17320de80192f57cd132b31b233c65734de04939ce65sewardj /* Case: assisted transfer to arbitrary address */ 17330de80192f57cd132b31b233c65734de04939ce65sewardj switch (jk) { 17340de80192f57cd132b31b233c65734de04939ce65sewardj /* Keep this list in sync with that for Ist_Exit above */ 17350de80192f57cd132b31b233c65734de04939ce65sewardj case Ijk_ClientReq: 17360de80192f57cd132b31b233c65734de04939ce65sewardj case Ijk_EmFail: 17370de80192f57cd132b31b233c65734de04939ce65sewardj case Ijk_EmWarn: 17380de80192f57cd132b31b233c65734de04939ce65sewardj case Ijk_NoDecode: 17390de80192f57cd132b31b233c65734de04939ce65sewardj case Ijk_NoRedir: 17400de80192f57cd132b31b233c65734de04939ce65sewardj case Ijk_SigBUS: 17410de80192f57cd132b31b233c65734de04939ce65sewardj case Ijk_SigILL: 17420de80192f57cd132b31b233c65734de04939ce65sewardj case Ijk_SigTRAP: 17430de80192f57cd132b31b233c65734de04939ce65sewardj case Ijk_SigFPE_IntDiv: 17440de80192f57cd132b31b233c65734de04939ce65sewardj case Ijk_SigFPE_IntOvf: 17450de80192f57cd132b31b233c65734de04939ce65sewardj case Ijk_Sys_syscall: 17460de80192f57cd132b31b233c65734de04939ce65sewardj case Ijk_InvalICache: 17470de80192f57cd132b31b233c65734de04939ce65sewardj case Ijk_Ret: { 17480de80192f57cd132b31b233c65734de04939ce65sewardj HReg r = iselWordExpr_R(env, next); 17490de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXAMode* amPC = TILEGXAMode_IR(offsIP, TILEGXGuestStatePointer()); 17500de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_XAssisted(r, amPC, TILEGXcc_AL, jk)); 17510de80192f57cd132b31b233c65734de04939ce65sewardj return; 17520de80192f57cd132b31b233c65734de04939ce65sewardj } 17530de80192f57cd132b31b233c65734de04939ce65sewardj default: 17540de80192f57cd132b31b233c65734de04939ce65sewardj break; 17550de80192f57cd132b31b233c65734de04939ce65sewardj } 17560de80192f57cd132b31b233c65734de04939ce65sewardj 17570de80192f57cd132b31b233c65734de04939ce65sewardj vex_printf("\n-- PUT(%d) = ", offsIP); 17580de80192f57cd132b31b233c65734de04939ce65sewardj ppIRExpr(next ); 17590de80192f57cd132b31b233c65734de04939ce65sewardj vex_printf("; exit-"); 17600de80192f57cd132b31b233c65734de04939ce65sewardj ppIRJumpKind(jk); 17610de80192f57cd132b31b233c65734de04939ce65sewardj vex_printf("\n"); 17620de80192f57cd132b31b233c65734de04939ce65sewardj vassert(0); /* are we expecting any other kind? */ 17630de80192f57cd132b31b233c65734de04939ce65sewardj} 17640de80192f57cd132b31b233c65734de04939ce65sewardj 17650de80192f57cd132b31b233c65734de04939ce65sewardj/*---------------------------------------------------------*/ 17660de80192f57cd132b31b233c65734de04939ce65sewardj/*--- Insn selector top-level ---*/ 17670de80192f57cd132b31b233c65734de04939ce65sewardj/*---------------------------------------------------------*/ 17680de80192f57cd132b31b233c65734de04939ce65sewardj 17690de80192f57cd132b31b233c65734de04939ce65sewardj/* Translate an entire BB to tilegx code. */ 17700de80192f57cd132b31b233c65734de04939ce65sewardjHInstrArray *iselSB_TILEGX ( const IRSB* bb, 17710de80192f57cd132b31b233c65734de04939ce65sewardj VexArch arch_host, 17720de80192f57cd132b31b233c65734de04939ce65sewardj const VexArchInfo* archinfo_host, 17730de80192f57cd132b31b233c65734de04939ce65sewardj const VexAbiInfo* vbi, 17740de80192f57cd132b31b233c65734de04939ce65sewardj Int offs_Host_EvC_Counter, 17750de80192f57cd132b31b233c65734de04939ce65sewardj Int offs_Host_EvC_FailAddr, 17760de80192f57cd132b31b233c65734de04939ce65sewardj Bool chainingAllowed, 17770de80192f57cd132b31b233c65734de04939ce65sewardj Bool addProfInc, 17780de80192f57cd132b31b233c65734de04939ce65sewardj Addr max_ga ) 17790de80192f57cd132b31b233c65734de04939ce65sewardj{ 17800de80192f57cd132b31b233c65734de04939ce65sewardj Int i, j; 17810de80192f57cd132b31b233c65734de04939ce65sewardj HReg hreg; 17820de80192f57cd132b31b233c65734de04939ce65sewardj ISelEnv *env; 17830de80192f57cd132b31b233c65734de04939ce65sewardj UInt hwcaps_host = archinfo_host->hwcaps; 17840de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXAMode *amCounter, *amFailAddr; 17850de80192f57cd132b31b233c65734de04939ce65sewardj 17860de80192f57cd132b31b233c65734de04939ce65sewardj /* sanity ... */ 17870de80192f57cd132b31b233c65734de04939ce65sewardj vassert(arch_host == VexArchTILEGX); 17880de80192f57cd132b31b233c65734de04939ce65sewardj 17890de80192f57cd132b31b233c65734de04939ce65sewardj /* Make up an initial environment to use. */ 17900de80192f57cd132b31b233c65734de04939ce65sewardj env = LibVEX_Alloc(sizeof(ISelEnv)); 17910de80192f57cd132b31b233c65734de04939ce65sewardj env->vreg_ctr = 0; 17920de80192f57cd132b31b233c65734de04939ce65sewardj env->mode64 = True; 17930de80192f57cd132b31b233c65734de04939ce65sewardj 17940de80192f57cd132b31b233c65734de04939ce65sewardj /* Set up output code array. */ 17950de80192f57cd132b31b233c65734de04939ce65sewardj env->code = newHInstrArray(); 17960de80192f57cd132b31b233c65734de04939ce65sewardj 17970de80192f57cd132b31b233c65734de04939ce65sewardj /* Copy BB's type env. */ 17980de80192f57cd132b31b233c65734de04939ce65sewardj env->type_env = bb->tyenv; 17990de80192f57cd132b31b233c65734de04939ce65sewardj 18000de80192f57cd132b31b233c65734de04939ce65sewardj /* Make up an IRTemp -> virtual HReg mapping. This doesn't 18010de80192f57cd132b31b233c65734de04939ce65sewardj change as we go along. */ 18020de80192f57cd132b31b233c65734de04939ce65sewardj env->n_vregmap = bb->tyenv->types_used; 18030de80192f57cd132b31b233c65734de04939ce65sewardj env->vregmap = LibVEX_Alloc(env->n_vregmap * sizeof(HReg)); 18040de80192f57cd132b31b233c65734de04939ce65sewardj 18050de80192f57cd132b31b233c65734de04939ce65sewardj /* and finally ... */ 18060de80192f57cd132b31b233c65734de04939ce65sewardj env->hwcaps = hwcaps_host; 18070de80192f57cd132b31b233c65734de04939ce65sewardj env->chainingAllowed = chainingAllowed; 18080de80192f57cd132b31b233c65734de04939ce65sewardj env->hwcaps = hwcaps_host; 18090de80192f57cd132b31b233c65734de04939ce65sewardj env->max_ga = max_ga; 18100de80192f57cd132b31b233c65734de04939ce65sewardj 18110de80192f57cd132b31b233c65734de04939ce65sewardj /* For each IR temporary, allocate a suitably-kinded virtual 18120de80192f57cd132b31b233c65734de04939ce65sewardj register. */ 18130de80192f57cd132b31b233c65734de04939ce65sewardj j = 0; 18140de80192f57cd132b31b233c65734de04939ce65sewardj 18150de80192f57cd132b31b233c65734de04939ce65sewardj for (i = 0; i < env->n_vregmap; i++) { 18160de80192f57cd132b31b233c65734de04939ce65sewardj hreg = INVALID_HREG; 18170de80192f57cd132b31b233c65734de04939ce65sewardj switch (bb->tyenv->types[i]) { 18180de80192f57cd132b31b233c65734de04939ce65sewardj case Ity_I1: 18190de80192f57cd132b31b233c65734de04939ce65sewardj case Ity_I8: 18200de80192f57cd132b31b233c65734de04939ce65sewardj case Ity_I16: 18210de80192f57cd132b31b233c65734de04939ce65sewardj case Ity_I32: 18220de80192f57cd132b31b233c65734de04939ce65sewardj hreg = mkHReg(True, HRcInt64, 0, j++); 18230de80192f57cd132b31b233c65734de04939ce65sewardj break; 18240de80192f57cd132b31b233c65734de04939ce65sewardj case Ity_I64: 18250de80192f57cd132b31b233c65734de04939ce65sewardj hreg = mkHReg(True, HRcInt64, 0, j++); 18260de80192f57cd132b31b233c65734de04939ce65sewardj break; 18270de80192f57cd132b31b233c65734de04939ce65sewardj default: 18280de80192f57cd132b31b233c65734de04939ce65sewardj ppIRType(bb->tyenv->types[i]); 18290de80192f57cd132b31b233c65734de04939ce65sewardj vpanic("iselBB(tilegx): IRTemp type"); 18300de80192f57cd132b31b233c65734de04939ce65sewardj } 18310de80192f57cd132b31b233c65734de04939ce65sewardj env->vregmap[i] = hreg; 18320de80192f57cd132b31b233c65734de04939ce65sewardj } 18330de80192f57cd132b31b233c65734de04939ce65sewardj env->vreg_ctr = j; 18340de80192f57cd132b31b233c65734de04939ce65sewardj 18350de80192f57cd132b31b233c65734de04939ce65sewardj /* The very first instruction must be an event check. */ 18360de80192f57cd132b31b233c65734de04939ce65sewardj amCounter = TILEGXAMode_IR(offs_Host_EvC_Counter, 18370de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXGuestStatePointer()); 18380de80192f57cd132b31b233c65734de04939ce65sewardj amFailAddr = TILEGXAMode_IR(offs_Host_EvC_FailAddr, 18390de80192f57cd132b31b233c65734de04939ce65sewardj TILEGXGuestStatePointer()); 18400de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_EvCheck(amCounter, amFailAddr)); 18410de80192f57cd132b31b233c65734de04939ce65sewardj 18420de80192f57cd132b31b233c65734de04939ce65sewardj /* Possibly a block counter increment (for profiling). At this 18430de80192f57cd132b31b233c65734de04939ce65sewardj point we don't know the address of the counter, so just pretend 18440de80192f57cd132b31b233c65734de04939ce65sewardj it is zero. It will have to be patched later, but before this 18450de80192f57cd132b31b233c65734de04939ce65sewardj translation is used, by a call to LibVEX_patchProfCtr. */ 18460de80192f57cd132b31b233c65734de04939ce65sewardj if (addProfInc) { 18470de80192f57cd132b31b233c65734de04939ce65sewardj addInstr(env, TILEGXInstr_ProfInc()); 18480de80192f57cd132b31b233c65734de04939ce65sewardj } 18490de80192f57cd132b31b233c65734de04939ce65sewardj 18500de80192f57cd132b31b233c65734de04939ce65sewardj /* Ok, finally we can iterate over the statements. */ 18510de80192f57cd132b31b233c65734de04939ce65sewardj for (i = 0; i < bb->stmts_used; i++) 18520de80192f57cd132b31b233c65734de04939ce65sewardj iselStmt(env, bb->stmts[i]); 18530de80192f57cd132b31b233c65734de04939ce65sewardj 18540de80192f57cd132b31b233c65734de04939ce65sewardj iselNext(env, bb->next, bb->jumpkind, bb->offsIP); 18550de80192f57cd132b31b233c65734de04939ce65sewardj 18560de80192f57cd132b31b233c65734de04939ce65sewardj /* record the number of vregs we used. */ 18570de80192f57cd132b31b233c65734de04939ce65sewardj env->code->n_vregs = env->vreg_ctr; 18580de80192f57cd132b31b233c65734de04939ce65sewardj return env->code; 18590de80192f57cd132b31b233c65734de04939ce65sewardj} 18600de80192f57cd132b31b233c65734de04939ce65sewardj 18610de80192f57cd132b31b233c65734de04939ce65sewardj/*---------------------------------------------------------------*/ 18620de80192f57cd132b31b233c65734de04939ce65sewardj/*--- end host_tilegx_isel.c ---*/ 18630de80192f57cd132b31b233c65734de04939ce65sewardj/*---------------------------------------------------------------*/ 1864