}
-#if 0
-/* UNUSED -- DELETE */
-/* Get some particular flag to the lowest bit in a word. It's not
- masked, tho. */
-static IRExpr* flag_to_bit0 ( UInt ccmask, IRTemp eflags )
-{
- Int shifts = 0;
- vassert(ccmask == CC_MASK_C || ccmask == CC_MASK_P
- || ccmask == CC_MASK_A || ccmask == CC_MASK_Z
- || ccmask == CC_MASK_S || ccmask == CC_MASK_O);
- while ((ccmask & 1) == 0) {
- ccmask >>= 1;
- shifts++;
- vassert(ccmask != 0);
- }
- if (shifts == 0)
- return mkexpr(eflags);
- else
- return binop(Iop_Shr32, mkexpr(eflags), mkU8(shifts));
-}
-
-
-/* Calculate the eflags, and hence return a 1-bit expression
- which is 1 iff the given condition-code test would succeed.
- Returns a value :: Ity_Bit.
-*/
-static IRExpr* calculate_condition ( Condcode cond )
-{
- IRExpr *e;
- IRTemp eflags = newTemp(Ity_I32);
- Bool invert = (cond & 1) == 1;
-
- assign( eflags, cond == CondB ? mk_calculate_eflags_c()
- : mk_calculate_eflags_all() );
-
- switch (cond) {
- case CondNO:
- case CondO: /* OF == 1 */
- e = flag_to_bit0( CC_MASK_O, eflags );
- break;
- case CondNZ:
- case CondZ: /* ZF == 1 */
- e = flag_to_bit0( CC_MASK_Z, eflags );
- break;
- case CondNB:
- case CondB: /* CF == 1 */
- e = flag_to_bit0( CC_MASK_C, eflags );
- break;
- case CondNBE:
- case CondBE: /* (CF or ZF) == 1 */
- e = binop(Iop_Or32,
- flag_to_bit0(CC_MASK_C,eflags),
- flag_to_bit0(CC_MASK_Z,eflags) );
- break;
- case CondNS:
- case CondS: /* SF == 1 */
- e = flag_to_bit0( CC_MASK_S, eflags );
- break;
- case CondNP:
- case CondP: /* PF == 1 */
- e = flag_to_bit0( CC_MASK_P, eflags );
- break;
- case CondNL:
- case CondL: /* (SF xor OF) == 1 */
- e = binop(Iop_Xor32,
- flag_to_bit0(CC_MASK_S,eflags),
- flag_to_bit0(CC_MASK_O,eflags)
- );
- break;
- case CondNLE:
- case CondLE: /* ((SF xor OF) or ZF) == 1 */
- e = binop(Iop_Or32,
- binop(Iop_Xor32,
- flag_to_bit0(CC_MASK_S,eflags),
- flag_to_bit0(CC_MASK_O,eflags)
- ),
- flag_to_bit0(CC_MASK_Z,eflags));
- break;
- default:
- vex_printf("calculate_condition(%d)\n", (Int)cond);
- vpanic("calculate_condition(x86)");
- }
- return
- invert ? unop(Iop_32to1, unop(Iop_Not32, e))
- : unop(Iop_32to1, e);
-}
-#endif
-
-
/* -------------- Helpers for ADD/SUB with carry. -------------- */
/* Given ta1, ta2 and tdst, compute tdst = ADC(ta1,ta2) and set flags