//
-// AndbInstruction.cs:
+// AndInstruction.cs:
//
// Authors: Marek Safar (marek.safar@gmail.com)
//
using Microsoft.Scripting.Utils;
namespace Microsoft.Scripting.Interpreter {
- internal abstract class AndInstruction : Instruction {
+ internal abstract class AndInstruction : AritmeticInstruction {
private static Instruction _Int16, _Int32, _Int64, _UInt16, _UInt32, _UInt64, _Boolean;
-
- public override int ConsumedStack { get { return 2; } }
- public override int ProducedStack { get { return 1; } }
+ private static Instruction _Int16Lifted, _Int32Lifted, _Int64Lifted, _UInt16Lifted, _UInt32Lifted, _UInt64Lifted, _BooleanLifted;
private AndInstruction() {
}
internal sealed class AndInt32 : AndInstruction {
- public override int Run(InterpretedFrame frame) {
- object l = frame.Data[frame.StackIndex - 2];
- object r = frame.Data[frame.StackIndex - 1];
- frame.Data[frame.StackIndex - 2] = ScriptingRuntimeHelpers.Int32ToObject((Int32)l & (Int32)r);
- frame.StackIndex--;
- return 1;
+ protected override object Calculate (object l, object r)
+ {
+ return ScriptingRuntimeHelpers.Int32ToObject((Int32)l & (Int32)r);
}
}
internal sealed class AndInt16 : AndInstruction {
- public override int Run(InterpretedFrame frame) {
- object l = frame.Data[frame.StackIndex - 2];
- object r = frame.Data[frame.StackIndex - 1];
- frame.Data[frame.StackIndex - 2] = (Int16)((Int16)l & (Int16)r);
- frame.StackIndex--;
- return 1;
+ protected override object Calculate (object l, object r)
+ {
+ return (Int16)((Int16)l & (Int16)r);
}
}
internal sealed class AndInt64 : AndInstruction {
- public override int Run(InterpretedFrame frame) {
- object l = frame.Data[frame.StackIndex - 2];
- object r = frame.Data[frame.StackIndex - 1];
- frame.Data[frame.StackIndex - 2] = (Int64)((Int64)l & (Int64)r);
- frame.StackIndex--;
- return 1;
+ protected override object Calculate (object l, object r)
+ {
+ return (Int64)((Int64)l & (Int64)r);
}
}
internal sealed class AndUInt16 : AndInstruction {
- public override int Run(InterpretedFrame frame) {
- object l = frame.Data[frame.StackIndex - 2];
- object r = frame.Data[frame.StackIndex - 1];
- frame.Data[frame.StackIndex - 2] = (UInt16)((UInt16)l & (UInt16)r);
- frame.StackIndex--;
- return 1;
+ protected override object Calculate (object l, object r)
+ {
+ return (UInt16)((UInt16)l & (UInt16)r);
}
}
internal sealed class AndUInt32 : AndInstruction {
- public override int Run(InterpretedFrame frame) {
- object l = frame.Data[frame.StackIndex - 2];
- object r = frame.Data[frame.StackIndex - 1];
- frame.Data[frame.StackIndex - 2] = (UInt32)((UInt32)l & (UInt32)r);
- frame.StackIndex--;
- return 1;
+ protected override object Calculate (object l, object r)
+ {
+ return (UInt32)((UInt32)l & (UInt32)r);
}
}
internal sealed class AndUInt64 : AndInstruction {
- public override int Run(InterpretedFrame frame) {
- object l = frame.Data[frame.StackIndex - 2];
- object r = frame.Data[frame.StackIndex - 1];
- frame.Data[frame.StackIndex - 2] = (UInt64)((UInt64)l & (UInt64)r);
- frame.StackIndex--;
- return 1;
+ protected override object Calculate (object l, object r)
+ {
+ return (UInt64)((UInt64)l & (UInt64)r);
}
}
internal sealed class AndBoolean : AndInstruction {
- public override int Run(InterpretedFrame frame) {
- object l = frame.Data[frame.StackIndex - 2];
- object r = frame.Data[frame.StackIndex - 1];
- frame.Data[frame.StackIndex - 2] = (Boolean)((Boolean)l & (Boolean)r);
- frame.StackIndex--;
- return 1;
+ protected override object Calculate (object l, object r)
+ {
+ return (Boolean)((Boolean)l & (Boolean)r);
+ }
+ }
+
+ internal sealed class AndInt32Lifted : AndInstruction {
+ protected override object Calculate (object l, object r)
+ {
+ return (Int32?)((Int32?)l & (Int32?)r);
+ }
+ }
+
+ internal sealed class AndInt16Lifted : AndInstruction {
+ protected override object Calculate (object l, object r)
+ {
+ return (Int16?)((Int16?)l & (Int16?)r);
+ }
+ }
+
+ internal sealed class AndInt64Lifted : AndInstruction {
+ protected override object Calculate (object l, object r)
+ {
+ return (Int64?)((Int64?)l & (Int64?)r);
+ }
+ }
+
+ internal sealed class AndUInt16Lifted : AndInstruction {
+ protected override object Calculate (object l, object r)
+ {
+ return (UInt16?)((UInt16?)l & (UInt16?)r);
+ }
+ }
+
+ internal sealed class AndUInt32Lifted : AndInstruction {
+ protected override object Calculate (object l, object r)
+ {
+ return (UInt32?)((UInt32?)l & (UInt32?)r);
+ }
+ }
+
+ internal sealed class AndUInt64Lifted : AndInstruction {
+ protected override object Calculate (object l, object r)
+ {
+ return (UInt64?)((UInt64?)l & (UInt64?)r);
+ }
+ }
+
+ internal sealed class AndBooleanLifted : AndInstruction {
+ protected override object Calculate (object l, object r)
+ {
+ return ((Boolean?)l & (Boolean?)r);
}
}
}
}
+ public static Instruction CreateLifted(Type type) {
+ Debug.Assert(!type.IsEnum());
+ switch (type.GetTypeCode()) {
+ case TypeCode.Int16: return _Int16Lifted ?? (_Int16Lifted = new AndInt16Lifted());
+ case TypeCode.Int32: return _Int32Lifted ?? (_Int32Lifted = new AndInt32Lifted());
+ case TypeCode.Int64: return _Int64Lifted ?? (_Int64Lifted = new AndInt64Lifted());
+ case TypeCode.UInt16: return _UInt16Lifted ?? (_UInt16Lifted = new AndUInt16Lifted());
+ case TypeCode.UInt32: return _UInt32Lifted ?? (_UInt32Lifted = new AndUInt32Lifted());
+ case TypeCode.UInt64: return _UInt64Lifted ?? (_UInt64Lifted = new AndUInt64Lifted());
+ case TypeCode.Boolean: return _BooleanLifted ?? (_BooleanLifted = new AndBooleanLifted());
+
+ default:
+ throw Assert.Unreachable;
+ }
+ }
+
public override string ToString() {
return "And()";
}