unused because the relevant computations are now done in line.
git-svn-id: svn://svn.valgrind.org/vex/trunk@1370
/* --- CLEAN HELPERS --- */
-// Calculate XER flags
-extern
-UInt ppc32g_calculate_xer_ov ( UInt op,
- UInt res, UInt argL, UInt argR );
-
-extern
-UInt ppc32g_calculate_xer_ca ( UInt op,
- UInt res, UInt argL, UInt argR,
- UInt old_ca );
/*
Enumeration for xer_ca/ov calculation helper functions
*/
-#define INT32_MIN (-2147483647-1)
-
-// Calculate XER_OV
-UInt ppc32g_calculate_xer_ov ( UInt op, UInt res, UInt argL, UInt argR )
-{
- switch (op) {
- case PPC32G_FLAG_OP_ADD: // addo, addc
- case PPC32G_FLAG_OP_ADDE: // addeo, addmeo, addzeo
- return ((argL^argR^-1) & (argL^res) & (1<<31)) ? 1:0;
- // i.e. ((both_same_sign) & (sign_changed) & (sign_mask))
-
- case PPC32G_FLAG_OP_DIVW: // divwo
- return ((argL == INT32_MIN && argR == -1) || argR == 0) ? 1:0;
-
- case PPC32G_FLAG_OP_DIVWU: // divwuo
- return (argR == 0) ? 1:0;
-
- case PPC32G_FLAG_OP_MULLW: { // mullwo
- /* OV true if result can't be represented in 32 bits
- i.e sHi != sign extension of sLo */
- Long l_res = ((Long)((Int)argL)) * ((Long)((Int)argR));
- Int sHi = (Int)toUInt(l_res >> 32);
- Int sLo = (Int)l_res;
- return (sHi != (sLo >> /*s*/ 31)) ? 1:0;
- }
-
- case PPC32G_FLAG_OP_NEG: // nego
- return (argL == 0x80000000) ? 1:0;
-
- case PPC32G_FLAG_OP_SUBF: // subfo
- case PPC32G_FLAG_OP_SUBFC: // subfco
- case PPC32G_FLAG_OP_SUBFE: // subfeo, subfmeo, subfzeo
- return (((~argL)^argR^(-1)) & ((~argL)^res) & (1<<31)) ? 1:0;
-
- default:
- break;
- }
-
- vpanic("ppc32g_calculate_xer_ov(ppc32)");
- return 0; // notreached
-}
-
-// Calculate XER_CA
-UInt ppc32g_calculate_xer_ca ( UInt op, UInt res,
- UInt argL, UInt argR, UInt old_ca )
-{
- switch (op) {
- case PPC32G_FLAG_OP_ADD: // addc[o], addic
- return (res < argL) ? 1:0;
-
- case PPC32G_FLAG_OP_ADDE: // adde[o], addze[o], addme[o]
- return (res < argL || (old_ca==1 && res==argL)) ? 1:0;
-
- case PPC32G_FLAG_OP_SUBFC: // subfc[o]
- case PPC32G_FLAG_OP_SUBFI: // subfic
- return (res <= argR) ? 1:0;
-
- case PPC32G_FLAG_OP_SUBFE: // subfe[o], subfze[o], subfme[o]
- return ((res < argR) || (old_ca == 1 && res == argR)) ? 1:0;
-
- case PPC32G_FLAG_OP_SRAW: // sraw
- if ((argR & 0x20) == 0) { // shift <= 31
- // xer_ca = sign && (bits_shifted_out != 0)
- return (((argL & 0x80000000) &&
- ((argL & (0xFFFFFFFF >> (32-argR))) != 0)) != 0) ? 1:0;
- }
- // shift > 31
- // xer_ca = sign && src != 0
- return (((argL & 0x80000000) && (argR != 0)) != 0) ? 1:0;
-
- case PPC32G_FLAG_OP_SRAWI: // srawi
- // xer_ca = sign && (bits_shifted_out != 0)
- return (((argL & 0x80000000) &&
- ((argL & (0xFFFFFFFF >> (32-argR))) != 0)) != 0) ? 1:0;
-
- default:
- break;
- }
- vpanic("ppc32g_calculate_xer_ov(ppc32)");
- return 0; // notreached
-}
-
IRExpr* guest_ppc32_spechelper ( HChar* function_name,
IRExpr** args )
}
-//zz /* -------------- Evaluating the flags-thunk. -------------- */
-//zz
-//zz /* Calculate CR7 (IBM CR0) conditional flags */
-//zz static IRExpr* mk_ppc32g_calculate_cr7 ( void )
-//zz {
-//zz IRExpr** args =
-//zz mkIRExprVec_3( IRExpr_Get(OFFB_CC_OP, Ity_I32),
-//zz IRExpr_Get(OFFB_CC_DEP1, Ity_I32),
-//zz IRExpr_Get(OFFB_CC_DEP2, Ity_I32) );
-//zz IRExpr* call
-//zz = mkIRExprCCall(
-//zz Ity_I32,
-//zz 0/*regparm*/,
-//zz "ppc32g_calculate_cr7", &ppc32g_calculate_cr7,
-//zz args
-//zz );
-//zz
-//zz // TODO
-//zz // 02/02/05 - leaving definedness stuff 'till get memcheck working well.
-//zz
-//zz /* Exclude OP from definedness checking. We're only
-//zz interested in DEP1 and DEP2. */
-//zz // call->Iex.CCall.cee->mcx_mask = 1;
-//zz
-//zz return call;
-//zz }
-//zz
-//zz /* Calculate XER_OV flag */
-//zz static IRExpr* mk_ppc32g_calculate_xer_ov ( UInt op, IRExpr* res,
-//zz IRExpr* argL, IRExpr* argR )
-//zz {
-//zz IRExpr** args;
-//zz IRExpr* call;
-//zz vassert(op < PPC32G_FLAG_OP_NUMBER);
-//zz vassert(typeOfIRExpr(irbb->tyenv,res) == Ity_I32);
-//zz vassert(typeOfIRExpr(irbb->tyenv,argL) == Ity_I32);
-//zz vassert(typeOfIRExpr(irbb->tyenv,argR) == Ity_I32);
-//zz
-//zz args = mkIRExprVec_4( mkU32(op), res, argL, argR );
-//zz
-//zz call
-//zz = mkIRExprCCall(
-//zz Ity_I32,
-//zz 0/*regparm*/,
-//zz "ppc32g_calculate_xer_ov", &ppc32g_calculate_xer_ov,
-//zz args
-//zz );
-//zz return binop(Iop_And32, mkU32(1), call);
-//zz }
-
-//uu /* Calculate XER_CA flag. RES is the result of applying OP to ARGL
-//uu and ARGR, and OLDCA is the old carry flag. The latter may be zero
-//uu if it is known that OP does not need to consult it. */
-//uu
-//uu static IRExpr* mk_ppc32g_calculate_xer_ca ( UInt op,
-//uu IRExpr* res,
-//uu IRExpr* argL,
-//uu IRExpr* argR,
-//uu IRExpr* oldca )
-//uu {
-//uu IRExpr** args;
-//uu IRExpr* call;
-//uu vassert(op < PPC32G_FLAG_OP_NUMBER);
-//uu vassert(typeOfIRExpr(irbb->tyenv,res) == Ity_I32);
-//uu vassert(typeOfIRExpr(irbb->tyenv,argL) == Ity_I32);
-//uu vassert(typeOfIRExpr(irbb->tyenv,argR) == Ity_I32);
-//uu vassert(typeOfIRExpr(irbb->tyenv,oldca) == Ity_I32);
-//uu
-//uu args = mkIRExprVec_5( mkU32(op), res, argL, argR, oldca );
-//uu
-//uu call
-//uu = mkIRExprCCall(
-//uu Ity_I32,
-//uu 0/*regparm*/,
-//uu "ppc32g_calculate_xer_ca", &ppc32g_calculate_xer_ca,
-//uu args
-//uu );
-//uu return binop(Iop_And32, mkU32(1), call);
-//uu }
-
-
/* Set the CR0 flags following an arithmetic operation.
(Condition Register CR0 Field Definition, PPC32 p60)
*/