Home | History | Annotate | Download | only in priv

Lines Matching defs:st

398 /* Append a completely flattened form of 'st' to the end of 'bb'. */
400 static void flatten_Stmt ( IRSB* bb, IRStmt* st )
409 switch (st->tag) {
411 if (isIRAtom(st->Ist.Put.data)) {
414 addStmtToIRSB(bb, st);
417 e1 = flatten_Expr(bb, st->Ist.Put.data);
418 addStmtToIRSB(bb, IRStmt_Put(st->Ist.Put.offset, e1));
422 puti = st->Ist.PutI.details;
429 if (isFlat(st->Ist.WrTmp.data)) {
432 addStmtToIRSB(bb, st);
435 e1 = flatten_Expr(bb, st->Ist.WrTmp.data);
436 addStmtToIRSB(bb, IRStmt_WrTmp(st->Ist.WrTmp.tmp, e1));
440 e1 = flatten_Expr(bb, st->Ist.Store.addr);
441 e2 = flatten_Expr(bb, st->Ist.Store.data);
442 addStmtToIRSB(bb, IRStmt_Store(st->Ist.Store.end, e1,e2));
445 sg = st->Ist.StoreG.details;
452 lg = st->Ist.LoadG.details;
460 cas = st->Ist.CAS.details;
471 e1 = flatten_Expr(bb, st->Ist.LLSC.addr);
472 e2 = st->Ist.LLSC.storedata
473 ? flatten_Expr(bb, st->Ist.LLSC.storedata)
475 addStmtToIRSB(bb, IRStmt_LLSC(st->Ist.LLSC.end,
476 st->Ist.LLSC.result, e1, e2));
479 d = st->Ist.Dirty.details;
499 addStmtToIRSB(bb, st);
502 e1 = flatten_Expr(bb, st->Ist.AbiHint.base);
503 e2 = flatten_Expr(bb, st->Ist.AbiHint.nia);
504 addStmtToIRSB(bb, IRStmt_AbiHint(e1, st->Ist.AbiHint.len, e2));
507 e1 = flatten_Expr(bb, st->Ist.Exit.guard);
508 addStmtToIRSB(bb, IRStmt_Exit(e1, st->Ist.Exit.jk,
509 st->Ist.Exit.dst,
510 st->Ist.Exit.offsIP));
514 ppIRStmt(st);
622 IRStmt* st = bb->stmts[i];
624 if (st->tag == Ist_NoOp)
628 if (st->tag == Ist_WrTmp
629 && st->Ist.WrTmp.data->tag == Iex_Get) {
630 /* st is 't = Get(...)'. Look up in the environment and see
632 IRExpr* get = st->Ist.WrTmp.data;
644 == st->Ist.WrTmp.data->Iex.Get.ty );
651 bb->stmts[i] = IRStmt_WrTmp(st->Ist.WrTmp.tmp, valE);
657 (HWord)(void*)(IRExpr_RdTmp(st->Ist.WrTmp.tmp)) );
663 if (st->tag == Ist_Put || st->tag == Ist_PutI) {
665 if (st->tag == Ist_Put) {
666 key = mk_key_GetPut( st->Ist.Put.offset,
667 typeOfIRExpr(bb->tyenv,st->Ist.Put.data) );
669 vassert(st->tag == Ist_PutI);
670 key = mk_key_GetIPutI( st->Ist.PutI.details->descr );
678 if (st->tag == Ist_Dirty) {
682 IRDirty* d = st->Ist.Dirty.details;
698 if (st->tag == Ist_Put) {
699 vassert(isIRAtom(st->Ist.Put.data));
700 addToHHW( env, (HWord)key, (HWord)(st->Ist.Put.data));
712 /* Find any Get uses in st and invalidate any partially or fully
718 IRStmt* st,
729 switch (st->tag) {
734 e = st->Ist.WrTmp.data;
770 vassert(isIRAtom(st->Ist.AbiHint.base));
771 vassert(isIRAtom(st->Ist.AbiHint.nia));
783 vassert(isIRAtom(st->Ist.Store.addr));
784 vassert(isIRAtom(st->Ist.Store.data));
788 IRStoreG* sg = st->Ist.StoreG.details;
796 IRLoadG* lg = st->Ist.LoadG.details;
804 vassert(isIRAtom(st->Ist.Exit.guard));
808 vassert(isIRAtom(st->Ist.Put.data));
812 vassert(isIRAtom(st->Ist.PutI.details->ix));
813 vassert(isIRAtom(st->Ist.PutI.details->data));
822 ppIRStmt(st);
893 IRStmt* st;
908 st = bb->stmts[i];
910 if (st->tag == Ist_NoOp)
914 if (st->tag == Ist_Exit) {
930 //vassert(isIRAtom(st->Ist.Exit.guard));
932 //key = mk_key_GetPut(st->Ist.Exit.offsIP,
933 // typeOfIRConst(st->Ist.Exit.dst));
945 switch (st->tag) {
948 key = mk_key_GetPut( st->Ist.Put.offset,
949 typeOfIRExpr(bb->tyenv,st->Ist.Put.data) );
950 vassert(isIRAtom(st->Ist.Put.data));
954 key = mk_key_GetIPutI( st->Ist.PutI.details->descr );
955 vassert(isIRAtom(st->Ist.PutI.details->ix));
956 vassert(isIRAtom(st->Ist.PutI.details->data));
961 if (isPut && st->tag != Ist_PutI) {
971 vex_printf("rPUT: "); ppIRStmt(st);
988 handle_gets_Stmt( env, st, preciseMemExnsFn, pxControl );
2546 static IRStmt* subst_and_fold_Stmt ( IRExpr** env, IRStmt* st )
2550 ppIRStmt(st);
2554 switch (st->tag) {
2556 vassert(isIRAtom(st->Ist.AbiHint.base));
2557 vassert(isIRAtom(st->Ist.AbiHint.nia));
2559 fold_Expr(env, subst_Expr(env, st->Ist.AbiHint.base)),
2560 st->Ist.AbiHint.len,
2561 fold_Expr(env, subst_Expr(env, st->Ist.AbiHint.nia))
2564 vassert(isIRAtom(st->Ist.Put.data));
2566 st->Ist.Put.offset,
2567 fold_Expr(env, subst_Expr(env, st->Ist.Put.data))
2572 puti = st->Ist.PutI.details;
2583 /* This is the one place where an expr (st->Ist.WrTmp.data) is
2586 st->Ist.WrTmp.tmp,
2587 fold_Expr(env, subst_Expr(env, st->Ist.WrTmp.data))
2591 vassert(isIRAtom(st->Ist.Store.addr));
2592 vassert(isIRAtom(st->Ist.Store.data));
2594 st->Ist.Store.end,
2595 fold_Expr(env, subst_Expr(env, st->Ist.Store.addr)),
2596 fold_Expr(env, subst_Expr(env, st->Ist.Store.data))
2600 IRStoreG* sg = st->Ist.StoreG.details;
2627 IRLoadG* lg = st->Ist.LoadG.details;
2657 cas = st->Ist.CAS.details;
2677 vassert(isIRAtom(st->Ist.LLSC.addr));
2678 if (st->Ist.LLSC.storedata)
2679 vassert(isIRAtom(st->Ist.LLSC.storedata));
2681 st->Ist.LLSC.end,
2682 st->Ist.LLSC.result,
2683 fold_Expr(env, subst_Expr(env, st->Ist.LLSC.addr)),
2684 st->Ist.LLSC.storedata
2685 ? fold_Expr(env, subst_Expr(env, st->Ist.LLSC.storedata))
2692 d = st->Ist.Dirty.details;
2713 return IRStmt_IMark(st->Ist.IMark.addr,
2714 st->Ist.IMark.len,
2715 st->Ist.IMark.delta);
2721 return IRStmt_MBE(st->Ist.MBE.event);
2725 vassert(isIRAtom(st->Ist.Exit.guard));
2726 fcond = fold_Expr(env, subst_Expr(env, st->Ist.Exit.guard));
2746 return IRStmt_Exit(fcond, st->Ist.Exit.jk,
2747 st->Ist.Exit.dst, st->Ist.Exit.offsIP);
2751 vex_printf("\n"); ppIRStmt(st);
2987 static void addUses_Stmt ( Bool* set, IRStmt* st )
2992 switch (st->tag) {
2994 addUses_Expr(set, st->Ist.AbiHint.base);
2995 addUses_Expr(set, st->Ist.AbiHint.nia);
2998 addUses_Expr(set, st->Ist.PutI.details->ix);
2999 addUses_Expr(set, st->Ist.PutI.details->data);
3002 addUses_Expr(set, st->Ist.WrTmp.data);
3005 addUses_Expr(set, st->Ist.Put.data);
3008 addUses_Expr(set, st->Ist.Store.addr);
3009 addUses_Expr(set, st->Ist.Store.data);
3012 IRStoreG* sg = st->Ist.StoreG.details;
3019 IRLoadG* lg = st->Ist.LoadG.details;
3026 cas = st->Ist.CAS.details;
3036 addUses_Expr(set, st->Ist.LLSC.addr);
3037 if (st->Ist.LLSC.storedata)
3038 addUses_Expr(set, st->Ist.LLSC.storedata);
3041 d = st->Ist.Dirty.details;
3056 addUses_Expr(set, st->Ist.Exit.guard);
3060 ppIRStmt(st);
3102 IRStmt* st;
3115 st = bb->stmts[i];
3116 if (st->tag == Ist_NoOp)
3119 if (st->tag == Ist_Exit
3120 && isOneU1(st->Ist.Exit.guard))
3122 if (st->tag == Ist_WrTmp
3123 && set[(Int)(st->Ist.WrTmp.tmp)] == False) {
3127 ppIRStmt(st);
3133 if (st->tag == Ist_Dirty
3134 && st->Ist.Dirty.details->guard
3135 && isZeroU1(st->Ist.Dirty.details->guard)) {
3142 addUses_Stmt(set, st);
3178 IRStmt* st;
3183 st = bb->stmts[i];
3185 if (st->tag != Ist_WrTmp
3186 || st->Ist.WrTmp.data->tag != Iex_CCall)
3189 ex = (*specHelper)( st->Ist.WrTmp.data->Iex.CCall.cee->name,
3190 st->Ist.WrTmp.data->Iex.CCall.args,
3199 = IRStmt_WrTmp(st->Ist.WrTmp.tmp, ex);
3203 ppIRExpr(st->Ist.WrTmp.data);
3876 IRStmt* st;
3905 st = bb->stmts[i];
3917 switch (st->tag) {
3951 if (st->tag == Ist_Put) {
3955 st->Ist.Put.offset,
3956 typeOfIRExpr(bb->tyenv,st->Ist.Put.data)
3961 if (st->tag == Ist_PutI) {
3962 IRPutI *puti = st->Ist.PutI.details;
3987 if (st->tag != Ist_WrTmp)
3990 t = st->Ist.WrTmp.tmp;
3991 eprime = irExpr_to_AvailExpr(st->Ist.WrTmp.data, allowLoadsToBeCSEd);
3996 /* vex_printf("considering: " ); ppIRStmt(st); vex_printf("\n"); */
4070 IRStmt* st;
4081 st = bb->stmts[j];
4082 if (st->tag != Ist_WrTmp)
4084 if (st->Ist.WrTmp.tmp != var)
4086 e = st->Ist.WrTmp.data;
4110 IRStmt *st;
4115 st = bb->stmts[i];
4116 if (st->tag == Ist_NoOp)
4121 if (st->tag == Ist_WrTmp
4122 && isAdd32OrSub32(st->Ist.WrTmp.data, &var, &con)) {
4129 ppIRStmt(st);
4135 st->Ist.WrTmp.tmp,
4155 if (st->tag == Ist_WrTmp
4156 && st->Ist.WrTmp.data->tag == Iex_GetI
4157 && st->Ist.WrTmp.data->Iex.GetI.ix->tag == Iex_RdTmp
4158 && collapseChain(bb, i-1, st->Ist.WrTmp.data->Iex.GetI.ix
4162 ppIRStmt(st);
4165 con2 += st->Ist.WrTmp.data->Iex.GetI.bias;
4168 st->Ist.WrTmp.tmp,
4169 IRExpr_GetI(st->Ist.WrTmp.data->Iex.GetI.descr,
4179 /* Perhaps st is PutI[t, con] ? */
4180 IRPutI *puti = st->Ist.PutI.details;
4181 if (st->tag == Ist_PutI
4187 ppIRStmt(st);
4221 IRStmt* st;
4236 st = bb->stmts[j];
4237 if (st->tag == Ist_NoOp)
4240 if (st->tag == Ist_Put) {
4248 st->Ist.Put.offset,
4249 typeOfIRExpr(bb->tyenv,st->Ist.Put.data) );
4266 if (st->tag == Ist_PutI) {
4267 IRPutI *puti = st->Ist.PutI.details;
4292 } /* if (st->tag == Ist_PutI) */
4294 if (st->tag == Ist_Dirty) {
4298 if (st->Ist.Dirty.details->nFxState > 0)
4448 IRStmt* st;
4451 st = bb->stmts[i];
4452 if (st->tag == Ist_NoOp)
4455 if (st->tag == Ist_WrTmp
4456 && st->Ist.WrTmp.data->tag == Iex_GetI
4457 && st->Ist.WrTmp.data->Iex.GetI.ix->tag == Iex_RdTmp) {
4458 IRRegArray* descr = st->Ist.WrTmp.data->Iex.GetI.descr;
4459 IRExpr* ix = st->Ist.WrTmp.data->Iex.GetI.ix;
4460 Int bias = st->Ist.WrTmp.data->Iex.GetI.bias;
4468 ppIRExpr(st->Ist.WrTmp.data);
4473 bb->stmts[i] = IRStmt_WrTmp(st->Ist.WrTmp.tmp, replacement);
4489 IRStmt *st, *stj;
4494 st = bb->stmts[i];
4495 if (st->tag != Ist_PutI)
4515 if (identicalPutIs(st, stj)) {
4523 if (st->tag == Ist_Dirty)
4526 if (guestAccessWhichMightOverlapPutI(bb->tyenv, st, stj))
4534 ppIRStmt(st);
4600 /* Adjust all tmp values (names) in st by delta. st is destructively
4603 static void deltaIRStmt ( IRStmt* st, Int delta )
4607 switch (st->tag) {
4613 deltaIRExpr(st->Ist.AbiHint.base, delta);
4614 deltaIRExpr(st->Ist.AbiHint.nia, delta);
4617 deltaIRExpr(st->Ist.Put.data, delta);
4620 deltaIRExpr(st->Ist.PutI.details->ix, delta);
4621 deltaIRExpr(st->Ist.PutI.details->data, delta);
4624 st->Ist.WrTmp.tmp += delta;
4625 deltaIRExpr(st->Ist.WrTmp.data, delta);
4628 deltaIRExpr(st->Ist.Exit.guard, delta);
4631 deltaIRExpr(st->Ist.Store.addr, delta);
4632 deltaIRExpr(st->Ist.Store.data, delta);
4635 IRStoreG* sg = st->Ist.StoreG.details;
4642 IRLoadG* lg = st->Ist.LoadG.details;
4650 if (st->Ist.CAS.details->oldHi != IRTemp_INVALID)
4651 st->Ist.CAS.details->oldHi += delta;
4652 st->Ist.CAS.details->oldLo += delta;
4653 deltaIRExpr(st->Ist.CAS.details->addr, delta);
4654 if (st->Ist.CAS.details->expdHi)
4655 deltaIRExpr(st->Ist.CAS.details->expdHi, delta);
4656 deltaIRExpr(st->Ist.CAS.details->expdLo, delta);
4657 if (st->Ist.CAS.details->dataHi)
4658 deltaIRExpr(st->Ist.CAS.details->dataHi, delta);
4659 deltaIRExpr(st->Ist.CAS.details->dataLo, delta);
4662 st->Ist.LLSC.result += delta;
4663 deltaIRExpr(st->Ist.LLSC.addr, delta);
4664 if (st->Ist.LLSC.storedata)
4665 deltaIRExpr(st->Ist.LLSC.storedata, delta);
4668 d = st->Ist.Dirty.details;
4681 vex_printf("\n"); ppIRStmt(st); vex_printf("\n");
4749 IRStmt* st;
4810 st = bb0->stmts[i];
4811 if (st->tag != Ist_Exit)
4813 if (st->Ist.Exit.jk != Ijk_Boring)
4816 con = st->Ist.Exit.dst;
4820 ? st->Ist.Exit.dst->Ico.U64
4821 : (Addr64)(st->Ist.Exit.dst->Ico.U32);
4851 st = bb1->stmts[i];
4852 vassert(st->tag == Ist_Exit);
4854 con = st->Ist.Exit.dst;
4873 st->Ist.Exit.guard
4874 = IRExpr_Unop(Iop_Not1,deepCopyIRExpr(st->Ist.Exit.guard));
5149 static void aoccCount_Stmt ( UShort* uses, IRStmt* st )
5154 switch (st->tag) {
5156 aoccCount_Expr(uses, st->Ist.AbiHint.base);
5157 aoccCount_Expr(uses, st->Ist.AbiHint.nia);
5160 aoccCount_Expr(uses, st->Ist.WrTmp.data);
5163 aoccCount_Expr(uses, st->Ist.Put.data);
5166 aoccCount_Expr(uses, st->Ist.PutI.details->ix);
5167 aoccCount_Expr(uses, st->Ist.PutI.details->data);
5170 aoccCount_Expr(uses, st->Ist.Store.addr);
5171 aoccCount_Expr(uses, st->Ist.Store.data);
5174 IRStoreG* sg = st->Ist.StoreG.details;
5181 IRLoadG* lg = st->Ist.LoadG.details;
5188 cas = st->Ist.CAS.details;
5198 aoccCount_Expr(uses, st->Ist.LLSC.addr);
5199 if (st->Ist.LLSC.storedata)
5200 aoccCount_Expr(uses, st->Ist.LLSC.storedata);
5203 d = st->Ist.Dirty.details;
5218 aoccCount_Expr(uses, st->Ist.Exit.guard);
5221 vex_printf("\n"); ppIRStmt(st); vex_printf("\n");
5505 static IRStmt* atbSubst_Stmt ( ATmpInfo* env, IRStmt* st )
5512 switch (st->tag) {
5515 atbSubst_Expr(env, st->Ist.AbiHint.base),
5516 st->Ist.AbiHint.len,
5517 atbSubst_Expr(env, st->Ist.AbiHint.nia)
5521 st->Ist.Store.end,
5522 atbSubst_Expr(env, st->Ist.Store.addr),
5523 atbSubst_Expr(env, st->Ist.Store.data)
5526 IRStoreG* sg = st->Ist.StoreG.details;
5533 IRLoadG* lg = st->Ist.LoadG.details;
5541 st->Ist.WrTmp.tmp,
5542 atbSubst_Expr(env, st->Ist.WrTmp.data)
5546 st->Ist.Put.offset,
5547 atbSubst_Expr(env, st->Ist.Put.data)
5550 puti = st->Ist.PutI.details;
5559 atbSubst_Expr(env, st->Ist.Exit.guard),
5560 st->Ist.Exit.jk,
5561 st->Ist.Exit.dst,
5562 st->Ist.Exit.offsIP
5565 return IRStmt_IMark(st->Ist.IMark.addr,
5566 st->Ist.IMark.len,
5567 st->Ist.IMark.delta);
5571 return IRStmt_MBE(st->Ist.MBE.event);
5573 cas = st->Ist.CAS.details;
5585 st->Ist.LLSC.end,
5586 st->Ist.LLSC.result,
5587 atbSubst_Expr(env, st->Ist.LLSC.addr),
5588 st->Ist.LLSC.storedata
5589 ? atbSubst_Expr(env, st->Ist.LLSC.storedata) : NULL
5592 d = st->Ist.Dirty.details;
5605 vex_printf("\n"); ppIRStmt(st); vex_printf("\n");
5666 /* Return an interval if st modifies the guest state. Via
5670 IRSB *bb, const IRStmt *st,
5678 switch (st->tag) {
5680 Int offset = st->Ist.Put.offset;
5681 Int size = sizeofIRType(typeOfIRExpr(bb->tyenv, st->Ist.Put.data));
5692 IRRegArray *descr = st->Ist.PutI.details->descr;
5710 return dirty_helper_puts(st->Ist.Dirty.details,
5732 IRStmt* st;
5752 st = bb->stmts[i];
5753 switch (st->tag) {
5757 UInt len = st->Ist.IMark.len;
5758 Addr mga = st->Ist.IMark.addr + (len < 1 ? 1 : len) - 1;
5767 aoccCount_Stmt( uses, st );
5816 st = bb->stmts[i];
5817 if (st->tag == Ist_NoOp)
5831 if (st->tag == Ist_WrTmp && uses[st->Ist.WrTmp.tmp] <= 1) {
5836 if (uses[st->Ist.WrTmp.tmp] == 0) {
5840 vassert(uses[st->Ist.WrTmp.tmp] == 1);
5844 e = st->Ist.WrTmp.data;
5846 addToEnvFront(env, st->Ist.WrTmp.tmp, e2);
5855 st2 = atbSubst_Stmt(env, st);
5867 bb, st, preciseMemExnsFn, pxControl,
5877 = toBool( st->tag == Ist_Store
5878 || (st->tag == Ist_Dirty
5879 && dirty_helper_stores(st->Ist.Dirty.details))
5880 || st->tag == Ist_LLSC
5881 || st->tag == Ist_CAS );
5909 || st->tag == Ist_MBE
5911 || st->tag == Ist_AbiHint
6252 IRStmt* st = sb->stmts[i];
6253 if (st->tag != Ist_WrTmp)
6255 IRTemp t = st->Ist.WrTmp.tmp;
6257 env[t] = st->Ist.WrTmp.data;
6261 IRStmt* st = sb->stmts[i];
6263 switch (st->tag) {
6265 vassert(isIRAtom(st->Ist.AbiHint.base));
6266 vassert(isIRAtom(st->Ist.AbiHint.nia));
6269 vassert(isIRAtom(st->Ist.Put.data));
6272 IRPutI* puti = st->Ist.PutI.details;
6278 /* This is the one place where an expr (st->Ist.WrTmp.data) is
6281 = do_XOR_TRANSFORMS_IRExpr(env, st->Ist.WrTmp.data);
6284 st->Ist.WrTmp.data = mb_new_data;
6291 vassert(isIRAtom(st->Ist.Store.addr));
6292 vassert(isIRAtom(st->Ist.Store.data));
6295 IRStoreG* sg = st->Ist.StoreG.details;
6302 IRLoadG* lg = st->Ist.LoadG.details;
6309 IRCAS* cas = st->Ist.CAS.details;
6318 vassert(isIRAtom(st->Ist.LLSC.addr));
6319 if (st->Ist.LLSC.storedata)
6320 vassert(isIRAtom(st->Ist.LLSC.storedata));
6323 IRDirty* d = st->Ist.Dirty.details;
6341 vassert(isIRAtom(st->Ist.Exit.guard));
6344 vex_printf("\n"); ppIRStmt(st);
6465 IRStmt* st;
6473 st = bb->stmts[i];
6474 switch (st->tag) {
6476 vassert(isIRAtom(st->Ist.AbiHint.base));
6477 vassert(isIRAtom(st->Ist.AbiHint.nia));
6483 if (st->Ist.WrTmp.data->tag == Iex_GetI)
6485 switch (typeOfIRTemp(bb->tyenv, st->Ist.WrTmp.tmp)) {
6501 vassert(isIRAtom(st->Ist.Put.data));
6504 vassert(isIRAtom(st->Ist.Store.addr));
6505 vassert(isIRAtom(st->Ist.Store.data));
6508 IRStoreG* sg = st->Ist.StoreG.details;
6515 IRLoadG* lg = st->Ist.LoadG.details;
6522 cas = st->Ist.CAS.details;
6530 vassert(isIRAtom(st->Ist.LLSC.addr));
6531 if (st->Ist.LLSC.storedata)
6532 vassert(isIRAtom(st->Ist.LLSC.storedata));
6535 d = st->Ist.Dirty.details;
6550 vassert(isIRAtom(st->Ist.Exit.guard));
6554 ppIRStmt(st);