Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
            }
        }
Exemplo n.º 3
0
        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);
        }