Home | History | Annotate | Download | only in priv

Lines Matching defs:env

119 static HReg lookupIRTemp ( ISelEnv * env, IRTemp tmp )
122 vassert(tmp < env->n_vregmap);
123 return env->vregmap[tmp];
126 static void addInstr ( ISelEnv * env, TILEGXInstr * instr )
128 addHInstr(env->code, instr);
135 static HReg newVRegI ( ISelEnv * env )
137 HReg reg = mkHReg(True /*virtual R*/, HRcGPR(), 0, env->vreg_ctr);
138 env->vreg_ctr++;
158 static TILEGXRH *iselWordExpr_RH_wrk ( ISelEnv * env, Bool syned, IRExpr * e );
159 static TILEGXRH *iselWordExpr_RH ( ISelEnv * env, Bool syned, IRExpr * e );
161 static TILEGXRH *iselWordExpr_RH6u_wrk ( ISelEnv * env, IRExpr * e );
162 static TILEGXRH *iselWordExpr_RH6u ( ISelEnv * env, IRExpr * e );
165 static HReg iselWordExpr_R_wrk ( ISelEnv * env, IRExpr * e );
166 static HReg iselWordExpr_R ( ISelEnv * env, IRExpr * e );
169 static TILEGXAMode *iselWordExpr_AMode_wrk ( ISelEnv * env, IRExpr * e,
171 static TILEGXAMode *iselWordExpr_AMode ( ISelEnv * env, IRExpr * e,
174 static TILEGXCondCode iselCondCode_wrk ( ISelEnv * env, IRExpr * e );
175 static TILEGXCondCode iselCondCode ( ISelEnv * env, IRExpr * e );
214 static void doHelperCall ( ISelEnv * env, IRExpr * guard, IRCallee * cee,
304 vassert(typeOfIRExpr(env->type_env, args[i]) == Ity_I32 ||
305 typeOfIRExpr(env->type_env, args[i]) == Ity_I64);
308 addInstr(env, mk_iMOVds_RR(argregs[argreg],
309 iselWordExpr_R(env,
321 vassert(typeOfIRExpr(env->type_env, args[i]) == Ity_I32
322 || typeOfIRExpr(env->type_env, args[i]) == Ity_I64);
323 tmpregs[argreg] = iselWordExpr_R(env, args[i]);
337 cc = iselCondCode(env, guard);
338 src = iselWordExpr_R(env, guard);
348 addInstr(env, mk_iMOVds_RR(argregs[i], tmpregs[i]));
356 addInstr(env, TILEGXInstr_CallAlways(cc, target, argiregs));
358 addInstr(env, TILEGXInstr_Call(cc, target, argiregs, src));
380 static Bool sane_AMode ( ISelEnv * env, TILEGXAMode * am )
390 static TILEGXAMode *iselWordExpr_AMode ( ISelEnv * env, IRExpr * e,
393 TILEGXAMode *am = iselWordExpr_AMode_wrk(env, e, xferTy);
394 vassert(sane_AMode(env, am));
399 static TILEGXAMode *iselWordExpr_AMode_wrk ( ISelEnv * env, IRExpr * e,
402 IRType ty = typeOfIRExpr(env->type_env, e);
413 iselWordExpr_R(env, e->Iex.Binop.arg1));
418 return TILEGXAMode_IR(0, iselWordExpr_R(env, e));
440 static HReg iselWordExpr_R ( ISelEnv * env, IRExpr * e )
442 HReg r = iselWordExpr_R_wrk(env, e);
451 static HReg iselWordExpr_R_wrk ( ISelEnv * env, IRExpr * e )
453 IRType ty = typeOfIRExpr(env->type_env, e);
460 return lookupIRTemp(env, e->Iex.RdTmp.tmp);
464 HReg r_dst = newVRegI(env);
465 TILEGXAMode *am_addr = iselWordExpr_AMode(env, e->Iex.Load.addr, ty);
471 addInstr(env, TILEGXInstr_Load(toUChar(sizeofIRType(ty)),
526 HReg r_dst = newVRegI(env);
527 HReg r_srcL = iselWordExpr_R(env, e->Iex.Binop.arg1);
533 ri_srcR = iselWordExpr_RH(env, True /*signed */ ,
539 ri_srcR = iselWordExpr_RH(env, True /*signed */,
545 addInstr(env, TILEGXInstr_Alu(aluOp, r_dst, r_srcL, ri_srcR));
575 HReg r_dst = newVRegI(env);
576 HReg r_srcL = iselWordExpr_R(env, e->Iex.Binop.arg1);
583 //ri_srcR = iselWordExpr_RH6u(env, e->Iex.Binop.arg2);
589 // ri_srcR = iselWordExpr_RH6u(env, e->Iex.Binop.arg2);
592 ri_srcR = iselWordExpr_RH6u(env, e->Iex.Binop.arg2);
602 addInstr(env, TILEGXInstr_Shft(shftOp, False/*64bit shift */,
605 addInstr(env, TILEGXInstr_Shft(shftOp, True /*32bit shift */,
633 HReg dst = newVRegI(env);
634 HReg r1 = iselWordExpr_R(env, e->Iex.Binop.arg1);
635 HReg r2 = iselWordExpr_R(env, e->Iex.Binop.arg2);
692 addInstr(env, TILEGXInstr_Cmp(syned, size32, dst, r1, r2, cc));
704 HReg dst = newVRegI(env);
705 HReg r1 = iselWordExpr_R(env, e->Iex.Binop.arg1);
706 TILEGXRH *r2 = iselWordExpr_RH(env, True, e->Iex.Binop.arg2);
719 addInstr(env, TILEGXInstr_CmpI(syned, size32, dst, r1, r2, cc));
731 HReg argL = iselWordExpr_R(env, e->Iex.Binop.arg1);
732 TILEGXRH *argR = iselWordExpr_RH(env, False /*signed */ ,
734 HReg dst = newVRegI(env);
735 HReg tmp = newVRegI(env);
737 addInstr(env, TILEGXInstr_Alu(GXalu_SUB, tmp, argL, argR));
739 addInstr(env, TILEGXInstr_Bf(GXbf_EXTU, tmp, tmp , 31, 31));
741 addInstr(env, TILEGXInstr_MovCond(dst, argL, argR, tmp, TILEGXcc_EZ));
748 HReg r_dst = newVRegI(env);
749 HReg r_srcL = iselWordExpr_R(env, e->Iex.Binop.arg1);
750 HReg r_srcR = iselWordExpr_R(env, e->Iex.Binop.arg2);
751 addInstr(env, TILEGXInstr_Mul(syned /*Unsigned or Signed */ ,
759 HReg tHi = iselWordExpr_R(env, e->Iex.Binop.arg1);
760 HReg tLo = iselWordExpr_R(env, e->Iex.Binop.arg2);
761 HReg tLo_1 = newVRegI(env);
762 HReg tHi_1 = newVRegI(env);
763 HReg r_dst = newVRegI(env);
764 HReg mask = newVRegI(env);
766 addInstr(env, TILEGXInstr_Shft(GXshft_SLL, False, tHi_1, tHi,
769 addInstr(env, TILEGXInstr_LI(mask, 0xffffffff));
770 addInstr(env, TILEGXInstr_Alu(GXalu_AND, tLo_1, tLo,
772 addInstr(env, TILEGXInstr_Alu(GXalu_OR, r_dst, tHi_1,
789 HReg r_dst = newVRegI(env);
790 HReg r_srcL = iselWordExpr_R(env, e->Iex.Unop.arg);
793 addInstr(env, TILEGXInstr_LI(r_dst, 0x1));
794 addInstr(env, TILEGXInstr_Alu(GXalu_SUB, r_dst, r_dst, r_srcR));
803 HReg r_dst = newVRegI(env);
804 HReg r_srcL = iselWordExpr_R(env, e->Iex.Unop.arg);
807 addInstr(env, TILEGXInstr_Alu(GXalu_NOR, r_dst, r_srcL, r_srcR));
815 HReg dst = newVRegI(env);
819 r1 = iselWordExpr_R(env, e->Iex.Unop.arg);
820 addInstr(env, TILEGXInstr_CmpI(syned, size32, dst, hregTILEGX_R63(),
835 return iselWordExpr_R(env, e->Iex.Unop.arg);
840 HReg dst = newVRegI(env);
841 HReg src = iselWordExpr_R(env, e->Iex.Unop.arg);
842 addInstr(env, TILEGXInstr_Alu(GXalu_AND, dst, src, TILEGXRH_Imm(False, 1)));
851 HReg dst = newVRegI(env);
852 HReg src = iselWordExpr_R(env, e->Iex.Unop.arg);
856 addInstr(env, TILEGXInstr_Bf(GXbf_EXTU, dst, src,
866 HReg r_dst = newVRegI(env);
867 HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg);
869 addInstr(env, TILEGXInstr_Bf(GXbf_EXTU, r_dst, r_src, 0, 0));
875 HReg r_dst = newVRegI(env);
876 HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg);
878 addInstr(env, TILEGXInstr_Bf(GXbf_EXTS, r_dst, r_src, 0, 0));
885 HReg r_dst = newVRegI(env);
886 HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg);
888 addInstr(env, TILEGXInstr_Bf(GXbf_EXTS, r_dst, r_src, 0, 7));
894 HReg r_dst = newVRegI(env);
895 HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg);
897 addInstr(env, TILEGXInstr_Bf(GXbf_EXTS, r_dst, r_src, 0, 15));
902 HReg r_dst = newVRegI(env);
903 HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg);
905 addInstr(env, TILEGXInstr_Bf(GXbf_EXTU, r_dst, r_src, 0, 31));
910 HReg r_dst = newVRegI(env);
911 HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg);
913 addInstr(env, TILEGXInstr_Bf(GXbf_EXTS, r_dst, r_src, 0, 31));
918 HReg r_dst = newVRegI(env);
919 HReg tmp = newVRegI(env);
920 HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg);
925 addInstr(env, TILEGXInstr_Alu(GXalu_AND, tmp, r_src,
927 addInstr(env, TILEGXInstr_Cmp(False, True, r_dst, tmp,
933 HReg r_dst = newVRegI(env);
934 HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg);
940 addInstr(env, TILEGXInstr_Cmp(False, True, r_dst, r_src,
946 HReg r_dst = newVRegI(env);
947 HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg);
949 addInstr(env, TILEGXInstr_Alu(GXalu_SUB, r_dst, hregTILEGX_R63(),
952 addInstr(env, TILEGXInstr_Alu(GXalu_OR, r_dst, r_dst,
954 addInstr(env, TILEGXInstr_Shft(GXshft_SRA, True, r_dst, r_dst,
964 HReg r_dst = newVRegI(env);
965 HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg);
966 addInstr(env, TILEGXInstr_Alu(GXalu_SUB, r_dst, hregTILEGX_R63(),
968 addInstr(env, TILEGXInstr_Alu(GXalu_OR, r_dst, r_dst,
975 HReg r_dst = newVRegI(env);
976 HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg);
978 addInstr(env, TILEGXInstr_Unary(GXun_CLZ, r_dst, r_src));
980 addInstr(env, TILEGXInstr_Unary(GXun_CTZ, r_dst, r_src));
986 HReg r_dst = newVRegI(env);
987 HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg);
993 addInstr(env, TILEGXInstr_Cmp(False, False, r_dst, r_src,
1000 HReg tmp2 = newVRegI(env);
1002 tmp1 = iselWordExpr_R(env, e->Iex.Unop.arg);
1004 addInstr(env, TILEGXInstr_Alu(GXalu_SUB, tmp2, hregTILEGX_R63(),
1007 addInstr(env, TILEGXInstr_Alu(GXalu_OR, tmp2, tmp2, TILEGXRH_Reg(tmp1)));
1008 addInstr(env, TILEGXInstr_Shft(GXshft_SRA, False, tmp2, tmp2,
1026 r_dst = newVRegI(env);
1029 addInstr(env, TILEGXInstr_Load(toUChar(sizeofIRType(ty)),
1039 typeOfIRExpr(env->type_env, e->Iex.ITE.cond) == Ity_I1) {
1041 HReg r0 = iselWordExpr_R(env, e->Iex.ITE.iffalse);
1042 HReg r1 = iselWordExpr_R(env, e->Iex.ITE.iftrue);
1043 HReg r_cond = iselWordExpr_R(env, e->Iex.ITE.cond);
1044 HReg r_dst = newVRegI(env);
1048 addInstr(env, TILEGXInstr_MovCond(r_dst, r0, TILEGXRH_Reg(r1),
1059 HReg r_dst = newVRegI(env);
1078 addInstr(env, TILEGXInstr_LI(r_dst, (ULong) l));
1084 HReg r_dst = newVRegI(env);
1088 doHelperCall(env, NULL, e->Iex.CCall.cee, e->Iex.CCall.args,
1092 addInstr(env, mk_iMOVds_RR(r_dst, hregTILEGX_R0()));
1121 static TILEGXRH *iselWordExpr_RH ( ISelEnv * env, Bool syned, IRExpr * e )
1123 TILEGXRH *ri = iselWordExpr_RH_wrk(env, syned, e);
1141 static TILEGXRH *iselWordExpr_RH_wrk ( ISelEnv * env, Bool syned, IRExpr * e )
1145 IRType ty = typeOfIRExpr(env->type_env, e);
1181 return TILEGXRH_Reg(iselWordExpr_R(env, e));
1190 static TILEGXRH *iselWordExpr_RH6u ( ISelEnv * env, IRExpr * e )
1193 ri = iselWordExpr_RH6u_wrk(env, e);
1210 static TILEGXRH *iselWordExpr_RH6u_wrk ( ISelEnv * env, IRExpr * e )
1212 IRType ty = typeOfIRExpr(env->type_env, e);
1233 return TILEGXRH_Reg(iselWordExpr_R(env, e));
1242 static TILEGXCondCode iselCondCode(ISelEnv * env, IRExpr * e)
1244 TILEGXCondCode cc = iselCondCode_wrk(env,e);
1250 static TILEGXCondCode iselCondCode_wrk ( ISelEnv * env, IRExpr * e )
1253 vassert(typeOfIRExpr(env->type_env, e) == Ity_I1);
1274 HReg dst = newVRegI(env);
1275 HReg r1 = iselWordExpr_R(env, e->Iex.Binop.arg1);
1276 HReg r2 = iselWordExpr_R(env, e->Iex.Binop.arg2);
1328 addInstr(env, TILEGXInstr_Cmp(syned, size32, dst, r1, r2, cc));
1332 addInstr(env, TILEGXInstr_Store(8,
1341 HReg r_dst = newVRegI(env);
1342 HReg r_srcL = iselWordExpr_R(env, e->Iex.Unop.arg);
1345 addInstr(env, TILEGXInstr_LI(r_dst, 0x1));
1346 addInstr(env, TILEGXInstr_Alu(GXalu_SUB, r_dst, r_dst, r_srcR));
1351 addInstr(env, TILEGXInstr_Store(8,
1360 HReg r_dst = iselWordExpr_R_wrk(env, e);
1364 addInstr(env, TILEGXInstr_Store(8,
1398 static void iselStmt ( ISelEnv * env, IRStmt * stmt )
1410 IRType tyd = typeOfIRExpr(env->type_env, stmt->Ist.Store.data);
1413 am_addr = iselWordExpr_AMode(env, stmt->Ist.Store.addr, tyd);
1417 HReg r_src = iselWordExpr_R(env, stmt->Ist.Store.data);
1418 addInstr(env, TILEGXInstr_Store(toUChar(sizeofIRType(tyd)),
1427 IRType ty = typeOfIRExpr(env->type_env, stmt->Ist.Put.data);
1431 HReg r_src = iselWordExpr_R(env, stmt->Ist.Put.data);
1434 addInstr(env, TILEGXInstr_Store(toUChar(sizeofIRType(ty)),
1444 IRType ty = typeOfIRTemp(env->type_env, tmp);
1445 HReg r_dst = lookupIRTemp(env, tmp);
1446 HReg r_src = iselWordExpr_R(env, stmt->Ist.WrTmp.data);
1447 IRType dty = typeOfIRExpr(env->type_env, stmt->Ist.WrTmp.data);
1452 addInstr(env, mk_iMOVds_RR(r_dst, r_src));
1459 addInstr(env, TILEGXInstr_Bf(GXbf_EXTU, r_src, r_src, 0, 31));
1462 addInstr(env, TILEGXInstr_Bf(GXbf_EXTU, r_src, r_src, 0, 15));
1465 addInstr(env, TILEGXInstr_Bf(GXbf_EXTU, r_src, r_src, 0, 7));
1471 addInstr(env, TILEGXInstr_MovCond(r_dst,
1487 doHelperCall(env, d->guard, d->cee, d->args, -1);
1494 retty = typeOfIRTemp(env->type_env, d->tmp);
1500 HReg r_dst = lookupIRTemp(env, d->tmp);
1501 addInstr(env, mk_iMOVds_RR(r_dst, hregTILEGX_R0()));
1513 IRType ty = typeOfIRExpr(env->type_env, cas->dataLo);
1515 TILEGXAMode *r_addr = iselWordExpr_AMode(env, cas->addr, Ity_I64);
1516 HReg r_new = iselWordExpr_R(env, cas->dataLo);
1517 HReg r_old = lookupIRTemp(env, cas->oldLo);
1534 r_exp = iselWordExpr_R(env, cas->expdLo);
1535 addInstr(env, TILEGXInstr_Acas(GXacas_CMPEXCH, r_old,
1544 addInstr(env, TILEGXInstr_Acas(GXacas_EXCH, r_old,
1551 addInstr(env, TILEGXInstr_Acas(GXacas_FetchAnd, r_old,
1558 addInstr(env, TILEGXInstr_Acas(GXacas_FetchAdd, r_old,
1565 addInstr(env, TILEGXInstr_Acas(GXacas_FetchOr, r_old,
1572 addInstr(env, TILEGXInstr_Acas(GXacas_FetchAddgez, r_old,
1603 TILEGXCondCode cc = iselCondCode(env, stmt->Ist.Exit.guard);
1611 if (env->chainingAllowed) {
1616 ((Addr64)stmt->Ist.Exit.dst->Ico.U64) > ((Addr64)env->max_ga);
1619 addInstr(env, TILEGXInstr_XDirect(
1626 HReg r = iselWordExpr_R(env, IRExpr_Const(stmt->Ist.Exit.dst));
1627 addInstr(env, TILEGXInstr_XAssisted(r, amPC, cc, Ijk_Boring));
1649 HReg r = iselWordExpr_R(env, IRExpr_Const(stmt->Ist.Exit.dst));
1650 addInstr(env, TILEGXInstr_XAssisted(r, amPC, cc,
1676 static void iselNext ( ISelEnv * env, IRExpr * next, IRJumpKind jk,
1694 if (env->chainingAllowed) {
1698 Bool toFastEP = ((Addr64)cdst->Ico.U64) > ((Addr64)env->max_ga);
1701 addInstr(env, TILEGXInstr_XDirect((Addr64)cdst->Ico.U64,
1707 HReg r = iselWordExpr_R(env, next);
1708 addInstr(env, TILEGXInstr_XAssisted(r, amPC, TILEGXcc_AL,
1718 HReg r = iselWordExpr_R(env, next);
1721 if (env->chainingAllowed)
1722 addInstr(env, TILEGXInstr_XIndir(r, amPC, TILEGXcc_AL));
1724 addInstr(env, TILEGXInstr_XAssisted(r, amPC, TILEGXcc_AL,
1748 HReg r = iselWordExpr_R(env, next);
1750 addInstr(env, TILEGXInstr_XAssisted(r, amPC, TILEGXcc_AL, jk));
1782 ISelEnv *env;
1790 env = LibVEX_Alloc(sizeof(ISelEnv));
1791 env->vreg_ctr = 0;
1792 env->mode64 = True;
1795 env->code = newHInstrArray();
1797 /* Copy BB's type env. */
1798 env->type_env = bb->tyenv;
1802 env->n_vregmap = bb->tyenv->types_used;
1803 env->vregmap = LibVEX_Alloc(env->n_vregmap * sizeof(HReg));
1806 env->hwcaps = hwcaps_host;
1807 env->chainingAllowed = chainingAllowed;
1808 env->hwcaps = hwcaps_host;
1809 env->max_ga = max_ga;
1815 for (i = 0; i < env->n_vregmap; i++) {
1831 env->vregmap[i] = hreg;
1833 env->vreg_ctr = j;
1840 addInstr(env, TILEGXInstr_EvCheck(amCounter, amFailAddr));
1847 addInstr(env, TILEGXInstr_ProfInc());
1852 iselStmt(env, bb->stmts[i]);
1854 iselNext(env, bb->next, bb->jumpkind, bb->offsIP);
1857 env->code->n_vregs = env->vreg_ctr;
1858 return env->code;