/// <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(); }
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); }
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))); } }
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); }
/// <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(); }
public ConditionOperand(ArmCondition cond) : base(PrimitiveType.Byte) { this.Condition = cond; }