private void RewriteLocr(PrimitiveType dt, ConditionCode ccode) { if (ccode != ConditionCode.ALWAYS) { var cc = binder.EnsureFlagGroup(Registers.CC); m.Branch(m.Test(ccode.Invert(), cc), instr.Address + instr.Length); } var src = Op(1, dt); src.DataType = dt; Assign(Reg(0), src); }
private void EmitBranch(Expression destination, byte bi, ConditionCode cc) { var flag = binder.EnsureFlagGroup(arch.GetFlagGroup(arch.cr, 1u << bi)); if (destination is Address addrDst) { m.Branch(m.Test(cc, flag), addrDst); } else { m.BranchInMiddleOfInstruction(m.Test(cc.Invert(), flag), instr.Address + instr.Length, InstrClass.ConditionalTransfer); m.Goto(destination); } }
public Expression ComparisonFromConditionCode(ConditionCode cc, BinaryExpression bin, bool isNegated) { BinaryOperator?cmpOp; if (isNegated) { cc = cc.Invert(); } bool isReal = (bin.DataType is PrimitiveType p && p.Domain == Domain.Real); switch (cc) { case ConditionCode.UGT: cmpOp = Operator.Ugt; break; case ConditionCode.UGE: cmpOp = Operator.Uge; break; case ConditionCode.ULE: cmpOp = Operator.Ule; break; case ConditionCode.ULT: cmpOp = Operator.Ult; break; case ConditionCode.GT: cmpOp = isReal ? Operator.Fgt : Operator.Gt; break; case ConditionCode.GE: cmpOp = isReal ? Operator.Fge : Operator.Ge; break; case ConditionCode.LE: cmpOp = isReal ? Operator.Fle : Operator.Le; break; case ConditionCode.LT: cmpOp = isReal ? Operator.Flt : Operator.Lt; break; case ConditionCode.NE: cmpOp = Operator.Ne; break; case ConditionCode.EQ: cmpOp = Operator.Eq; break; case ConditionCode.SG: cmpOp = Operator.Lt; break; case ConditionCode.NS: cmpOp = Operator.Ge; break; case ConditionCode.OV: return(ComparisonFromOverflow(bin, isNegated)); case ConditionCode.NO: return(ComparisonFromOverflow(bin, !isNegated)); case ConditionCode.IS_NAN: return(OrderedComparison(bin, false)); case ConditionCode.NOT_NAN: return(OrderedComparison(bin, true)); case ConditionCode.PE: return(ComparisonFromParity(bin, isNegated)); case ConditionCode.PO: return(ComparisonFromParity(bin, !isNegated)); default: throw new NotImplementedException(string.Format("Case {0} not handled.", cc)); } Expression e; if (bin.Operator == Operator.ISub || bin.Operator == Operator.FSub) { e = new BinaryExpression(cmpOp, PrimitiveType.Bool, bin.Left, bin.Right); } else { var dt = bin.Left.DataType; var ptr = dt.ResolveAs <Pointer>(); Expression zero; if (ptr != null) { //$REVIEW: assumes a null pointer has bit pattern 0000...00. zero = Address.Create(ptr, 0); } else { var pt = bin.Left.DataType.ResolveAs <PrimitiveType>(); zero = Constant.Zero(pt !); } e = new BinaryExpression(cmpOp, PrimitiveType.Bool, bin, zero); } return(e); }