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