Esempio n. 1
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="condition"></param>
        /// <returns></returns>
        public static bool CheckCondition(ExecutionCore executionCore, ArmCondition condition)
        {
            var z = executionCore.CurrentProgramStatusRegister.Zero;
            var c = executionCore.CurrentProgramStatusRegister.Carry;
            var n = executionCore.CurrentProgramStatusRegister.Signed;
            var v = executionCore.CurrentProgramStatusRegister.Overflow;

            switch (condition)
            {
                case ArmCondition.Equals: return z;
                case ArmCondition.NotEquals: return !z;
                case ArmCondition.UnsignedHigherOrSame: return c;
                case ArmCondition.UnsignedLower: return !c;
                case ArmCondition.Negative: return n;
                case ArmCondition.Positive: return !n;
                case ArmCondition.Overflow: return v;
                case ArmCondition.NoOverflow: return !v;
                case ArmCondition.UnsignedHigher: return c && !z;
                case ArmCondition.UnsignedLowerOrSame: return !c || z;
                case ArmCondition.GreaterOrEqual: return n == v;
                case ArmCondition.LessThan: return n != v;
                case ArmCondition.GreaterThan: return !z && n == v;
                case ArmCondition.LessOrEqual: return z || n != v;
                case ArmCondition.Always: return true;
                case ArmCondition.Never: return false;
            }

            throw new NotSupportedException();
        }
Esempio n. 2
0
        protected Expression TestCond(ArmCondition cond)
        {
            switch (cond)
            {
            //default:
            //	throw new NotImplementedException(string.Format("ARM condition code {0} not implemented.", cond));
            case ArmCondition.HS:
                return(m.Test(ConditionCode.UGE, FlagGroup(FlagM.CF, "C", PrimitiveType.Byte)));

            case ArmCondition.LO:
                return(m.Test(ConditionCode.ULT, FlagGroup(FlagM.CF, "C", PrimitiveType.Byte)));

            case ArmCondition.EQ:
                return(m.Test(ConditionCode.EQ, FlagGroup(FlagM.ZF, "Z", PrimitiveType.Byte)));

            case ArmCondition.GE:
                return(m.Test(ConditionCode.GE, FlagGroup(FlagM.NF | FlagM.ZF | FlagM.VF, "NZV", PrimitiveType.Byte)));

            case ArmCondition.GT:
                return(m.Test(ConditionCode.GT, FlagGroup(FlagM.NF | FlagM.ZF | FlagM.VF, "NZV", PrimitiveType.Byte)));

            case ArmCondition.HI:
                return(m.Test(ConditionCode.UGT, FlagGroup(FlagM.ZF | FlagM.CF, "ZC", PrimitiveType.Byte)));

            case ArmCondition.LE:
                return(m.Test(ConditionCode.LE, FlagGroup(FlagM.ZF | FlagM.CF | FlagM.VF, "NZV", PrimitiveType.Byte)));

            case ArmCondition.LS:
                return(m.Test(ConditionCode.ULE, FlagGroup(FlagM.ZF | FlagM.CF, "ZC", PrimitiveType.Byte)));

            case ArmCondition.LT:
                return(m.Test(ConditionCode.LT, FlagGroup(FlagM.NF | FlagM.VF, "NV", PrimitiveType.Byte)));

            case ArmCondition.MI:
                return(m.Test(ConditionCode.LT, FlagGroup(FlagM.NF, "N", PrimitiveType.Byte)));

            case ArmCondition.PL:
                return(m.Test(ConditionCode.GE, FlagGroup(FlagM.NF, "N", PrimitiveType.Byte)));

            case ArmCondition.NE:
                return(m.Test(ConditionCode.NE, FlagGroup(FlagM.ZF, "Z", PrimitiveType.Byte)));

            case ArmCondition.VC:
                return(m.Test(ConditionCode.NO, FlagGroup(FlagM.VF, "V", PrimitiveType.Byte)));

            case ArmCondition.VS:
                return(m.Test(ConditionCode.OV, FlagGroup(FlagM.VF, "V", PrimitiveType.Byte)));
            }
            return(null);
        }
Esempio n. 3
0
        protected Expression TestCond(ArmCondition cond)
        {
            switch (cond)
            {
            default:
                throw new NotImplementedException(string.Format("ARM condition code {0} not implemented.", cond));

            case ArmCondition.HS:
                return(m.Test(ConditionCode.UGE, FlagGroup(Registers.C)));

            case ArmCondition.LO:
                return(m.Test(ConditionCode.ULT, FlagGroup(Registers.C)));

            case ArmCondition.EQ:
                return(m.Test(ConditionCode.EQ, FlagGroup(Registers.Z)));

            case ArmCondition.GE:
                return(m.Test(ConditionCode.GE, FlagGroup(Registers.NZV)));

            case ArmCondition.GT:
                return(m.Test(ConditionCode.GT, FlagGroup(Registers.NZV)));

            case ArmCondition.HI:
                return(m.Test(ConditionCode.UGT, FlagGroup(Registers.ZC)));

            case ArmCondition.LE:
                return(m.Test(ConditionCode.LE, FlagGroup(Registers.NZV)));

            case ArmCondition.LS:
                return(m.Test(ConditionCode.ULE, FlagGroup(Registers.ZC)));

            case ArmCondition.LT:
                return(m.Test(ConditionCode.LT, FlagGroup(Registers.NV)));

            case ArmCondition.MI:
                return(m.Test(ConditionCode.LT, FlagGroup(Registers.N)));

            case ArmCondition.PL:
                return(m.Test(ConditionCode.GE, FlagGroup(Registers.N)));

            case ArmCondition.NE:
                return(m.Test(ConditionCode.NE, FlagGroup(Registers.Z)));

            case ArmCondition.VC:
                return(m.Test(ConditionCode.NO, FlagGroup(Registers.V)));

            case ArmCondition.VS:
                return(m.Test(ConditionCode.OV, FlagGroup(Registers.V)));
            }
        }
Esempio n. 4
0
        protected ArmCondition Invert(ArmCondition cc)
        {
            switch (cc)
            {
            case ArmCondition.EQ: return(ArmCondition.NE);

            case ArmCondition.NE: return(ArmCondition.EQ);

            case ArmCondition.HS: return(ArmCondition.LO);

            case ArmCondition.LO: return(ArmCondition.HS);

            case ArmCondition.MI: return(ArmCondition.PL);

            case ArmCondition.PL: return(ArmCondition.MI);

            case ArmCondition.VS: return(ArmCondition.VC);

            case ArmCondition.VC: return(ArmCondition.VS);

            case ArmCondition.HI: return(ArmCondition.LS);

            case ArmCondition.LS: return(ArmCondition.HI);

            case ArmCondition.GE: return(ArmCondition.LT);

            case ArmCondition.LT: return(ArmCondition.GE);

            case ArmCondition.GT: return(ArmCondition.LE);

            case ArmCondition.LE: return(ArmCondition.GT);

            case ArmCondition.AL: return(ArmCondition.Invalid);
            }
            return(ArmCondition.Invalid);
        }
Esempio n. 5
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="condition"></param>
        /// <returns></returns>
        public static string ToString(ArmCondition condition)
        {
            switch (condition)
            {
                case ArmCondition.Equals: return "eq";
                case ArmCondition.NotEquals: return "ne";
                case ArmCondition.UnsignedHigherOrSame: return "hs";
                case ArmCondition.UnsignedLower: return "lo";
                case ArmCondition.Negative: return "mi";
                case ArmCondition.Positive: return "pl";
                case ArmCondition.Overflow: return "vs";
                case ArmCondition.NoOverflow: return "";
                case ArmCondition.UnsignedHigher: return "hi";
                case ArmCondition.UnsignedLowerOrSame: return "ls";
                case ArmCondition.GreaterOrEqual: return "ge";
                case ArmCondition.LessThan: return "lt";
                case ArmCondition.GreaterThan: return "gt";
                case ArmCondition.LessOrEqual: return "le";
                case ArmCondition.Always: return "";
                case ArmCondition.Never: return "";
            }

            throw new NotSupportedException();
        }
Esempio n. 6
0
 public ConditionOperand(ArmCondition cond) : base(PrimitiveType.Byte)
 {
     this.Condition = cond;
 }