}    if ((IfCmp.getVal1(cb).isRegister() &&  IfCmp.getVal1(cb).asRegister().register.isLong()) || (IfCmp.getVal2(cb).isRegister() &&  IfCmp.getVal2(cb).asRegister().register.isLong())) { return false;
  private boolean generateCondMove(OPT_IR ir, OPT_BasicBlock bb,                                    OPT_Instruction cb) {    if (!VM.BuildForIA32) return false;    if (!IfCmp.conforms(cb)) return false;    // see if bb is the root of an if-then-else.    OPT_Diamond diamond = OPT_Diamond.buildDiamond(bb);    if (diamond == null) return false;    OPT_BasicBlock taken = diamond.getTaken();    OPT_BasicBlock notTaken= diamond.getNotTaken();    // do not perform the transformation if either branch of the diamond    // has a taboo instruction (eg., a PEI, store or divide).    if (taken != null && hasCMTaboo(taken)) return false;    if (notTaken != null && hasCMTaboo(notTaken)) return false;    // if we must generate FCMP, make sure the condition code is OK	 OPT_ConditionOperand cond = IfCmp.getCond(cb);    if (cond.isFLOATINGPOINT()) {      if (!fpConditionOK(cond)) {		  // Condition not OK, but maybe if we flip the operands		  if(!fpConditionOK(cond.flipOperands())) {			 // still not ok so flip operands back and give up			 cond.flipOperands();			 return false;		  }		  else {			 // flip operands			 OPT_Operand val1 = IfCmp.getVal1(cb);			 OPT_Operand val2 = IfCmp.getVal2(cb);			 IfCmp.setVal1(cb, val2);			 IfCmp.setVal2(cb, val1);		  }		}    }	 	 // Can only generate FMOV instructions for FP and unsigned int compares	 if(!cond.isFLOATINGPOINT() || !cond.isUNSIGNED()) {		if (hasFloatingPointDef(taken) || hasFloatingPointDef(notTaken)) {		  return false;		}	 }    // For now, do not generate CMOVs if the condition depends on    // long compares    if ((IfCmp.getVal1(cb).isRegister() &&  IfCmp.getVal1(cb).asRegister().register.isLong()) ||		  (IfCmp.getVal2(cb).isRegister() &&  IfCmp.getVal2(cb).asRegister().register.isLong())) {		return false;	 }    // Don't generate CMOVs for branches that can be folded.    if (IfCmp.getVal1(cb).isConstant() && IfCmp.getVal2(cb).isConstant()) {      return false;    }        // For now, do not generate CMOVs for longs.    if (hasLongDef(taken) || hasLongDef(notTaken)) {      return false;    }        // count the number of expression evaluations in each side of the    // diamond    int takenCost = 0;    int notTakenCost = 0;    if (taken != null) takenCost = evaluateCost(taken);    if (notTaken != null) notTakenCost = evaluateCost(notTaken);        // evaluate whether it's profitable.    int shortestCost = Math.min(takenCost,notTakenCost);    int xformCost = 2 * (takenCost + notTakenCost);    int k = ir.options.COND_MOVE_CUTOFF;    if (xformCost - shortestCost > k) return false;    // Perform the transformation!    doCondMove(ir, diamond, cb);    return true;  }