Exemplo n.º 1
0
 public static Int32Value Add(Int32Value a, Int32Value b)
 {
     if (a.AllBitsValid() && b.AllBitsValid())
         return new Int32Value(a.Value + b.Value);
     if (ReferenceEquals(a, b))
         return new Int32Value(a.Value << 1, (a.ValidMask << 1) | 1);
     return CreateUnknown();
 }
Exemplo n.º 2
0
		public static Block GetSwitchTarget(IList<Block> targets, Block fallThrough, Int32Value intValue) {
			if (!intValue.AllBitsValid())
				return null;

			int index = intValue.Value;
			if (targets == null || index < 0 || index >= targets.Count)
				return fallThrough;
			else
				return targets[index];
		}
		bool IBranchHandler.HandleSwitch(Int32Value switchIndex) {
			if (!switchIndex.AllBitsValid())
				return false;
			var instr = instructions[emulateIndex];
			var targets = (Instruction[])instr.Operand;
			if (switchIndex.Value >= 0 && switchIndex.Value < targets.Length)
				emulateIndex = instructions.IndexOf(targets[switchIndex.Value]);
			else
				emulateIndex++;
			return true;
		}
Exemplo n.º 4
0
 public static Int32Value Add_Ovf(Int32Value a, Int32Value b)
 {
     if (a.AllBitsValid() && b.AllBitsValid()) {
         try {
             return new Int32Value(checked(a.Value + b.Value));
         }
         catch (OverflowException) {
         }
     }
     return CreateUnknown();
 }
Exemplo n.º 5
0
 public static Int32Value Add_Ovf_Un(Int32Value a, Int32Value b)
 {
     if (a.AllBitsValid() && b.AllBitsValid()) {
         uint aa = (uint)a.Value, bb = (uint)b.Value;
         try {
             return new Int32Value((int)checked(aa + bb));
         }
         catch (OverflowException) {
         }
     }
     return CreateUnknown();
 }
Exemplo n.º 6
0
 public static Int32Value Sub_Ovf_Un(Int32Value a, Int32Value b)
 {
     if (a.AllBitsValid() && b.AllBitsValid())
     {
         uint aa = (uint)a.Value, bb = (uint)b.Value;
         try {
             return(new Int32Value((int)checked (aa - bb)));
         }
         catch (OverflowException) {
         }
     }
     return(CreateUnknown());
 }
Exemplo n.º 7
0
		public static Int32Value Div_Un(Int32Value a, Int32Value b) {
			if (a.AllBitsValid() && b.AllBitsValid()) {
				try {
					return new Int32Value((int)((uint)a.Value / (uint)b.Value));
				}
				catch (ArithmeticException) {
					return CreateUnknown();
				}
			}
			if (ReferenceEquals(a, b) && a.IsNonZero())
				return One;
			if (b.HasValue(1))
				return a;
			return CreateUnknown();
		}
Exemplo n.º 8
0
 public static Bool3 CompareGt(Int32Value a, Int32Value b)
 {
     if (a.AllBitsValid() && b.AllBitsValid())
     {
         return(a.Value > b.Value ? Bool3.True : Bool3.False);
     }
     if (a.HasValue(int.MinValue))
     {
         return(Bool3.False);                    // min > x => false
     }
     if (b.HasValue(int.MaxValue))
     {
         return(Bool3.False);                    // x > max => false
     }
     return(Bool3.Unknown);
 }
Exemplo n.º 9
0
 public static Bool3 CompareLt_Un(Int32Value a, Int32Value b)
 {
     if (a.AllBitsValid() && b.AllBitsValid())
     {
         return((uint)a.Value < (uint)b.Value ? Bool3.True : Bool3.False);
     }
     if (a.HasValue(uint.MaxValue))
     {
         return(Bool3.False);                    // max < x => false
     }
     if (b.HasValue(uint.MinValue))
     {
         return(Bool3.False);                    // x < min => false
     }
     return(Bool3.Unknown);
 }
Exemplo n.º 10
0
 public static Bool3 CompareLe(Int32Value a, Int32Value b)
 {
     if (a.AllBitsValid() && b.AllBitsValid())
     {
         return(a.Value <= b.Value ? Bool3.True : Bool3.False);
     }
     if (a.HasValue(int.MinValue))
     {
         return(Bool3.True);                     // min <= x => true
     }
     if (b.HasValue(int.MaxValue))
     {
         return(Bool3.True);                     // x <= max => true
     }
     return(Bool3.Unknown);
 }
Exemplo n.º 11
0
 public static Bool3 CompareNeq(Int32Value a, Int32Value b)
 {
     if (a.AllBitsValid() && b.AllBitsValid())
     {
         return(a.Value != b.Value ? Bool3.True : Bool3.False);
     }
     if (ReferenceEquals(a, b))
     {
         return(Bool3.False);
     }
     if (((uint)a.Value & a.ValidMask & b.ValidMask) != ((uint)b.Value & a.ValidMask & b.ValidMask))
     {
         return(Bool3.True);
     }
     return(Bool3.Unknown);
 }
Exemplo n.º 12
0
 public static Int32Value Rem_Un(Int32Value a, Int32Value b)
 {
     if (a.AllBitsValid() && b.AllBitsValid())
     {
         try {
             return(new Int32Value((int)((uint)a.Value % (uint)b.Value)));
         }
         catch (ArithmeticException) {
             return(CreateUnknown());
         }
     }
     if ((ReferenceEquals(a, b) && a.IsNonZero()) || b.HasValue(1))
     {
         return(Zero);
     }
     return(CreateUnknown());
 }
Exemplo n.º 13
0
        public static Block GetSwitchTarget(IList <Block> targets, Block fallThrough, Int32Value intValue)
        {
            if (!intValue.AllBitsValid())
            {
                return(null);
            }

            int index = intValue.Value;

            if (targets == null || index < 0 || index >= targets.Count)
            {
                return(fallThrough);
            }
            else
            {
                return(targets[index]);
            }
        }
Exemplo n.º 14
0
 public static Int32Value Mul(Int32Value a, Int32Value b)
 {
     if (a.AllBitsValid() && b.AllBitsValid())
     {
         return(new Int32Value(a.Value * b.Value));
     }
     if (a.IsZero() || b.IsZero())
     {
         return(Zero);
     }
     if (a.HasValue(1))
     {
         return(b);
     }
     if (b.HasValue(1))
     {
         return(a);
     }
     return(CreateUnknown());
 }
Exemplo n.º 15
0
 public static Int32Value Div(Int32Value a, Int32Value b)
 {
     if (a.AllBitsValid() && b.AllBitsValid())
     {
         try {
             return(new Int32Value(a.Value / b.Value));
         }
         catch (ArithmeticException) {
             return(CreateUnknown());
         }
     }
     if (ReferenceEquals(a, b) && a.IsNonZero())
     {
         return(One);
     }
     if (b.HasValue(1))
     {
         return(a);
     }
     return(CreateUnknown());
 }
Exemplo n.º 16
0
		public static Int32Value Neg(Int32Value a) {
			if (a.AllBitsValid())
				return new Int32Value(-a.Value);
			return CreateUnknown();
		}
Exemplo n.º 17
0
		public static Int32Value Rem_Un(Int32Value a, Int32Value b) {
			if (a.AllBitsValid() && b.AllBitsValid()) {
				try {
					return new Int32Value((int)((uint)a.Value % (uint)b.Value));
				}
				catch (ArithmeticException) {
					return CreateUnknown();
				}
			}
			if ((ReferenceEquals(a, b) && a.IsNonZero()) || b.HasValue(1))
				return Zero;
			return CreateUnknown();
		}
Exemplo n.º 18
0
		public static Int32Value Div(Int32Value a, Int32Value b) {
			if (a.AllBitsValid() && b.AllBitsValid()) {
				try {
					return new Int32Value(a.Value / b.Value);
				}
				catch (ArithmeticException) {
					return CreateUnknown();
				}
			}
			if (ReferenceEquals(a, b) && a.IsNonZero())
				return One;
			if (b.HasValue(1))
				return a;
			return CreateUnknown();
		}
Exemplo n.º 19
0
		public static Int32Value Mul(Int32Value a, Int32Value b) {
			if (a.AllBitsValid() && b.AllBitsValid())
				return new Int32Value(a.Value * b.Value);
			if (a.IsZero() || b.IsZero())
				return Zero;
			if (a.HasValue(1))
				return b;
			if (b.HasValue(1))
				return a;
			return CreateUnknown();
		}
Exemplo n.º 20
0
		public static Real8Value Conv_R_Un(Int32Value a) {
			if (a.AllBitsValid())
				return new Real8Value((float)(uint)a.Value);
			return Real8Value.CreateUnknown();
		}
Exemplo n.º 21
0
		public static Bool3 CompareLt_Un(Int32Value a, Int32Value b) {
			if (a.AllBitsValid() && b.AllBitsValid())
				return (uint)a.Value < (uint)b.Value ? Bool3.True : Bool3.False;
			if (a.HasValue(uint.MaxValue))
				return Bool3.False;	// max < x => false
			if (b.HasValue(uint.MinValue))
				return Bool3.False;	// x < min => false
			return Bool3.Unknown;
		}
Exemplo n.º 22
0
		public static Bool3 CompareGe(Int32Value a, Int32Value b) {
			if (a.AllBitsValid() && b.AllBitsValid())
				return a.Value >= b.Value ? Bool3.True : Bool3.False;
			if (a.HasValue(int.MaxValue))
				return Bool3.True;	// max >= x => true
			if (b.HasValue(int.MinValue))
				return Bool3.True;	// x >= min => true
			return Bool3.Unknown;
		}
Exemplo n.º 23
0
		public static Real8Value Conv_R8(Int32Value a) {
			if (a.AllBitsValid())
				return new Real8Value((double)(int)a.Value);
			return Real8Value.CreateUnknown();
		}
Exemplo n.º 24
0
		public static Bool3 CompareNeq(Int32Value a, Int32Value b) {
			if (a.AllBitsValid() && b.AllBitsValid())
				return a.Value != b.Value ? Bool3.True : Bool3.False;
			if (ReferenceEquals(a, b))
				return Bool3.False;
			if (((uint)a.Value & a.ValidMask & b.ValidMask) != ((uint)b.Value & a.ValidMask & b.ValidMask))
				return Bool3.True;
			return Bool3.Unknown;
		}
Exemplo n.º 25
0
		public static Bool3 CompareGt(Int32Value a, Int32Value b) {
			if (a.AllBitsValid() && b.AllBitsValid())
				return a.Value > b.Value ? Bool3.True : Bool3.False;
			if (a.HasValue(int.MinValue))
				return Bool3.False;	// min > x => false
			if (b.HasValue(int.MaxValue))
				return Bool3.False;	// x > max => false
			return Bool3.Unknown;
		}
Exemplo n.º 26
0
		public static Real8Value Conv_R8(Int32Value a) {
			if (a.AllBitsValid())
				return new Real8Value((double)(int)a.Value);
			return Real8Value.CreateUnknown();
		}
Exemplo n.º 27
0
		public static Bool3 CompareLe_Un(Int32Value a, Int32Value b) {
			if (a.AllBitsValid() && b.AllBitsValid())
				return (uint)a.Value <= (uint)b.Value ? Bool3.True : Bool3.False;
			if (a.HasValue(uint.MinValue))
				return Bool3.True;	// min <= x => true
			if (b.HasValue(uint.MaxValue))
				return Bool3.True;	// x <= max => true
			return Bool3.Unknown;
		}
Exemplo n.º 28
0
		public static Int32Value Sub(Int32Value a, Int32Value b) {
			if (a.AllBitsValid() && b.AllBitsValid())
				return new Int32Value(a.Value - b.Value);
			if (ReferenceEquals(a, b))
				return Zero;
			return CreateUnknown();
		}
Exemplo n.º 29
0
		public static Bool3 CompareFalse(Int32Value a) {
			if (a.AllBitsValid())
				return a.Value == 0 ? Bool3.True : Bool3.False;
			if (((uint)a.Value & a.ValidMask) != 0)
				return Bool3.False;
			return Bool3.Unknown;
		}
Exemplo n.º 30
0
		public static Int32Value Neg(Int32Value a) {
			if (a.AllBitsValid())
				return new Int32Value(-a.Value);
			return CreateUnknown();
		}