diff --git a/source2/IL2PCU/Cosmos.IL2CPU.X86/Cosmos.IL2CPU.X86.csproj b/source2/IL2PCU/Cosmos.IL2CPU.X86/Cosmos.IL2CPU.X86.csproj index 9e22ad1b1..4cbff3019 100644 --- a/source2/IL2PCU/Cosmos.IL2CPU.X86/Cosmos.IL2CPU.X86.csproj +++ b/source2/IL2PCU/Cosmos.IL2CPU.X86/Cosmos.IL2CPU.X86.csproj @@ -59,11 +59,6 @@ - - - - - @@ -113,6 +108,7 @@ + diff --git a/source2/IL2PCU/Cosmos.IL2CPU.X86/IL/Bge_Un.cs b/source2/IL2PCU/Cosmos.IL2CPU.X86/IL/Bge_Un.cs deleted file mode 100644 index 05eaf7bfd..000000000 --- a/source2/IL2PCU/Cosmos.IL2CPU.X86/IL/Bge_Un.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System; - -namespace Cosmos.IL2CPU.X86.IL -{ - [Cosmos.IL2CPU.OpCode(ILOpCode.Code.Bge_Un)] - public class Bge_Un: ILOp - { - public Bge_Un(Cosmos.IL2CPU.Assembler aAsmblr):base(aAsmblr) - { - } - - public override void Execute(MethodInfo aMethod, ILOpCode aOpCode) { - //TODO: Implement this Op - //TODO: Merge these like Branch if possible, ie Branch_Un - } - - - // using System; - // using System.IO; - // - // - // using CPU = Indy.IL2CPU.Assembler; - // using CPUx86 = Indy.IL2CPU.Assembler.X86; - // - // namespace Indy.IL2CPU.IL.X86 { - // [OpCode(OpCodeEnum.Bge_Un)] - // public class Bge_Un: Op { - // public readonly string TargetLabel; - // public readonly string CurInstructionLabel; - // private string mNextLabel; - // private string mCurLabel; - // private uint mCurOffset; - // private MethodInformation mMethodInformation; - // public Bge_Un(ILReader aReader, MethodInformation aMethodInfo) - // : base(aReader, aMethodInfo) { - // TargetLabel = GetInstructionLabel(aReader.OperandValueBranchPosition); - // CurInstructionLabel = GetInstructionLabel(aReader); - // mMethodInformation = aMethodInfo; - // mCurOffset = aReader.Position; - // mCurLabel = IL.Op.GetInstructionLabel(aReader); - // mNextLabel = IL.Op.GetInstructionLabel(aReader.NextPosition); - // } - // public override void DoAssemble() { - // if (Assembler.StackContents.Peek().IsFloat) { - // EmitNotSupportedException(Assembler, GetServiceProvider(), "Floats are not yet supported (Bge)", mCurLabel, mMethodInformation, mCurOffset, mNextLabel); - // return; - // } - // int xSize = Math.Max(Assembler.StackContents.Pop().Size, Assembler.StackContents.Pop().Size); - // if (xSize > 8) { - // EmitNotSupportedException(Assembler, GetServiceProvider(), "StackSize>8 not supported (Bge)", mCurLabel, mMethodInformation, mCurOffset, mNextLabel); - // return; - // } - // string BaseLabel = CurInstructionLabel + "__"; - // string LabelTrue = BaseLabel + "True"; - // string LabelFalse = BaseLabel + "False"; - // if (xSize > 4) - // { - // new CPUx86.Pop{DestinationReg = CPUx86.Registers.EAX}; - // new CPUx86.Pop { DestinationReg = CPUx86.Registers.EDX }; - // //value2: EDX:EAX - // new CPUx86.Pop { DestinationReg = CPUx86.Registers.EBX }; - // new CPUx86.Pop { DestinationReg = CPUx86.Registers.ECX }; - // //value1: ECX:EBX - // new CPUx86.Sub { DestinationReg = CPUx86.Registers.EBX, SourceReg = CPUx86.Registers.EAX }; - // new CPUx86.SubWithCarry { DestinationReg = CPUx86.Registers.ECX, SourceReg = CPUx86.Registers.EDX }; - // //result = value1 - value2 - // new CPUx86.ConditionalJump { Condition = CPUx86.ConditionalTestEnum.GreaterThanOrEqualTo, DestinationLabel = TargetLabel }; - // } else { - // new CPUx86.Pop { DestinationReg = CPUx86.Registers.EAX }; - // new CPUx86.Compare { DestinationReg = CPUx86.Registers.EAX, SourceReg=CPUx86.Registers.ESP, SourceIsIndirect=true}; - // new CPUx86.ConditionalJump { Condition = CPUx86.ConditionalTestEnum.GreaterThanOrEqualTo, DestinationLabel = LabelFalse }; - // new CPUx86.Jump { DestinationLabel = LabelTrue }; - // new CPU.Label(LabelTrue); - // new CPUx86.Add { DestinationReg = CPUx86.Registers.ESP, SourceValue = 4 }; - // new CPUx86.Jump { DestinationLabel = TargetLabel }; - // new CPU.Label(LabelFalse); - // new CPUx86.Add { DestinationReg = CPUx86.Registers.ESP, SourceValue = 4 }; - // } - // } - // } - // } - - } -} diff --git a/source2/IL2PCU/Cosmos.IL2CPU.X86/IL/Bgt_Un.cs b/source2/IL2PCU/Cosmos.IL2CPU.X86/IL/Bgt_Un.cs deleted file mode 100644 index 1a1bd401b..000000000 --- a/source2/IL2PCU/Cosmos.IL2CPU.X86/IL/Bgt_Un.cs +++ /dev/null @@ -1,97 +0,0 @@ -using System; - -namespace Cosmos.IL2CPU.X86.IL -{ - [Cosmos.IL2CPU.OpCode(ILOpCode.Code.Bgt_Un)] - public class Bgt_Un: ILOp - { - public Bgt_Un(Cosmos.IL2CPU.Assembler aAsmblr):base(aAsmblr) - { - } - - public override void Execute(MethodInfo aMethod, ILOpCode aOpCode) { - //TODO: Implement this Op - } - - - // using System; - // using System.IO; - // - // - // using CPU = Indy.IL2CPU.Assembler; - // using CPUx86 = Indy.IL2CPU.Assembler.X86; - // - // namespace Indy.IL2CPU.IL.X86 { - // [OpCode(OpCodeEnum.Bgt_Un)] - // public class Bgt_Un: Op { - // public readonly string TargetLabel; - // public readonly string CurInstructionLabel; - // private string mNextLabel; - // private string mCurLabel; - // private uint mCurOffset; - // private MethodInformation mMethodInformation; - // - // public Bgt_Un(ILReader aReader, MethodInformation aMethodInfo) - // : base(aReader, aMethodInfo) { - // TargetLabel = GetInstructionLabel(aReader.OperandValueBranchPosition); - // CurInstructionLabel = GetInstructionLabel(aReader); - // mMethodInformation = aMethodInfo; - // mCurOffset = aReader.Position; - // mCurLabel = IL.Op.GetInstructionLabel(aReader); - // mNextLabel = IL.Op.GetInstructionLabel(aReader.NextPosition); - // } - // public override void DoAssemble() { - // if (Assembler.StackContents.Peek().IsFloat) - // { - // EmitNotSupportedException(Assembler, GetServiceProvider(), "Floats not yet supported!", mCurLabel, mMethodInformation, mCurOffset, mNextLabel); - // return; - // } - // var rightTop = Assembler.StackContents.Pop(); - // var leftBottom = Assembler.StackContents.Pop(); - // int xSize = Math.Max(rightTop.Size, leftBottom.Size); - // if (xSize > 8) - // { - // EmitNotSupportedException(Assembler, GetServiceProvider(), "StackSize>8 not supported", mCurLabel, mMethodInformation, mCurOffset, mNextLabel); - // return; - // } - // - // string BaseLabel = CurInstructionLabel + "__"; - // string LabelTrue = BaseLabel + "True"; - // string LabelFalse = BaseLabel + "False"; - // - // if (xSize <= 4) - // { - // new CPUx86.Pop { DestinationReg = CPUx86.Registers.EAX }; - // new CPUx86.Compare{DestinationReg=CPUx86.Registers.EAX, SourceReg=CPUx86.Registers.ESP, SourceIsIndirect=true}; - // new CPUx86.ConditionalJump { Condition = CPUx86.ConditionalTestEnum.Below, DestinationLabel = LabelTrue }; - // new CPUx86.Jump { DestinationLabel = LabelFalse }; - // new CPU.Label(LabelTrue); - // new CPUx86.Add { DestinationReg = CPUx86.Registers.ESP, SourceValue = 4 }; - // new CPUx86.Jump { DestinationLabel = TargetLabel }; - // new CPU.Label(LabelFalse); - // new CPUx86.Add { DestinationReg = CPUx86.Registers.ESP, SourceValue = 4 }; - // return; - // } - // - // if (xSize == 8) - // { - // new CPUx86.Pop { DestinationReg = CPUx86.Registers.EAX }; - // new CPUx86.Pop { DestinationReg = CPUx86.Registers.EDX }; - // //value2: EDX:EAX - // new CPUx86.Pop { DestinationReg = CPUx86.Registers.EBX }; - // new CPUx86.Pop { DestinationReg = CPUx86.Registers.ECX }; - // //value1: ECX:EBX - // new CPUx86.Sub { DestinationReg = CPUx86.Registers.EBX, SourceReg = CPUx86.Registers.EAX }; - // new CPUx86.SubWithCarry { DestinationReg = CPUx86.Registers.ECX, SourceReg = CPUx86.Registers.EDX }; - // //result = value1 - value2 - // new CPUx86.ConditionalJump{Condition=CPUx86.ConditionalTestEnum.Above,DestinationLabel = TargetLabel }; - // return; - // } - // - // throw new NotSupportedException(); - // } - // } - // } - - } -} diff --git a/source2/IL2PCU/Cosmos.IL2CPU.X86/IL/Ble_Un.cs b/source2/IL2PCU/Cosmos.IL2CPU.X86/IL/Ble_Un.cs deleted file mode 100644 index b16fbf7a5..000000000 --- a/source2/IL2PCU/Cosmos.IL2CPU.X86/IL/Ble_Un.cs +++ /dev/null @@ -1,88 +0,0 @@ -using System; - -namespace Cosmos.IL2CPU.X86.IL -{ - [Cosmos.IL2CPU.OpCode(ILOpCode.Code.Ble_Un)] - public class Ble_Un: ILOp - { - public Ble_Un(Cosmos.IL2CPU.Assembler aAsmblr):base(aAsmblr) - { - } - - public override void Execute(MethodInfo aMethod, ILOpCode aOpCode) { - //TODO: Implement this Op - } - - - // using System; - // using System.IO; - // - // - // using CPU = Indy.IL2CPU.Assembler; - // using CPUx86 = Indy.IL2CPU.Assembler.X86; - // using Indy.IL2CPU.Assembler; - // - // namespace Indy.IL2CPU.IL.X86 { - // [OpCode(OpCodeEnum.Ble_Un)] - // public class Ble_Un: Op { - // public readonly string TargetLabel; - // public readonly string CurInstructionLabel; - // private string mNextLabel; - // private string mCurLabel; - // private uint mCurOffset; - // private MethodInformation mMethodInformation; - // public Ble_Un(ILReader aReader, MethodInformation aMethodInfo) - // : base(aReader, aMethodInfo) { - // TargetLabel = GetInstructionLabel(aReader.OperandValueBranchPosition); - // CurInstructionLabel = GetInstructionLabel(aReader); - // mMethodInformation = aMethodInfo; - // mCurOffset = aReader.Position; - // mCurLabel = IL.Op.GetInstructionLabel(aReader); - // mNextLabel = IL.Op.GetInstructionLabel(aReader.NextPosition); - // } - // public override void DoAssemble() { - // StackContent xItem1 = Assembler.StackContents.Pop(); - // StackContent xItem2 = Assembler.StackContents.Pop(); - // int xSize = Math.Max(xItem1.Size, xItem2.Size); - // var xIsFloat = xItem1.IsFloat || xItem2.IsFloat; - // if (xIsFloat) { - // EmitNotImplementedException(Assembler, GetServiceProvider(), "Ble_Un: Float support not yet implemented!", mCurLabel, mMethodInformation, mCurOffset, mNextLabel); - // return; - // } - // if (xSize > 8) { - // EmitNotImplementedException(Assembler, GetServiceProvider(), "Ble_Un: StackSize>8 not supported yet!", mCurLabel, mMethodInformation, mCurOffset, mNextLabel); - // return; - // } - // string BaseLabel = CurInstructionLabel + "__"; - // string LabelTrue = BaseLabel + "True"; - // string LabelFalse = BaseLabel + "False"; - // if (xSize > 4) - // { - // new CPUx86.Pop{DestinationReg = CPUx86.Registers.EAX}; - // new CPUx86.Pop { DestinationReg = CPUx86.Registers.EDX }; - // //value2: EDX:EAX - // new CPUx86.Pop { DestinationReg = CPUx86.Registers.EBX }; - // new CPUx86.Pop { DestinationReg = CPUx86.Registers.ECX }; - // //value1: ECX:EBX - // new CPUx86.Sub { DestinationReg = CPUx86.Registers.EBX, SourceReg = CPUx86.Registers.EAX }; - // new CPUx86.SubWithCarry { DestinationReg = CPUx86.Registers.ECX, SourceReg = CPUx86.Registers.EDX }; - // //result = value1 - value2 - // new CPUx86.ConditionalJump { Condition = CPUx86.ConditionalTestEnum.BelowOrEqual, DestinationLabel = TargetLabel }; - // } else - // { - // new CPUx86.Pop { DestinationReg = CPUx86.Registers.EAX }; ; - // new CPUx86.Compare { DestinationReg = CPUx86.Registers.EAX, SourceReg = CPUx86.Registers.ESP, SourceIsIndirect = true }; - // new CPUx86.ConditionalJump { Condition = CPUx86.ConditionalTestEnum.LessThanOrEqualTo, DestinationLabel = LabelFalse }; - // new CPUx86.Jump { DestinationLabel = LabelTrue }; - // new CPU.Label(LabelTrue); - // new CPUx86.Add { DestinationReg = CPUx86.Registers.ESP, SourceValue = 4 }; - // new CPUx86.Jump { DestinationLabel = TargetLabel }; - // new CPU.Label(LabelFalse); - // new CPUx86.Add { DestinationReg = CPUx86.Registers.ESP, SourceValue = 4 }; - // } - // } - // } - // } - - } -} diff --git a/source2/IL2PCU/Cosmos.IL2CPU.X86/IL/Blt_Un.cs b/source2/IL2PCU/Cosmos.IL2CPU.X86/IL/Blt_Un.cs deleted file mode 100644 index 34da77fd8..000000000 --- a/source2/IL2PCU/Cosmos.IL2CPU.X86/IL/Blt_Un.cs +++ /dev/null @@ -1,102 +0,0 @@ -using System; - -namespace Cosmos.IL2CPU.X86.IL -{ - [Cosmos.IL2CPU.OpCode(ILOpCode.Code.Blt_Un)] - public class Blt_Un: ILOp - { - public Blt_Un(Cosmos.IL2CPU.Assembler aAsmblr):base(aAsmblr) - { - } - - public override void Execute(MethodInfo aMethod, ILOpCode aOpCode) { - //TODO: Implement this Op - } - - - // using System; - // using System.IO; - // - // - // using CPU = Indy.IL2CPU.Assembler; - // using CPUx86 = Indy.IL2CPU.Assembler.X86; - // - // namespace Indy.IL2CPU.IL.X86 { - // [OpCode(OpCodeEnum.Blt_Un)] - // public class Blt_Un: Op { - // public readonly string TargetLabel; - // public readonly string CurInstructionLabel; - // private string mNextLabel; - // private string mCurLabel; - // private uint mCurOffset; - // private MethodInformation mMethodInformation; - // public Blt_Un(ILReader aReader, MethodInformation aMethodInfo) - // : base(aReader, aMethodInfo) { - // TargetLabel = GetInstructionLabel(aReader.OperandValueBranchPosition); - // CurInstructionLabel = GetInstructionLabel(aReader); - // mMethodInformation = aMethodInfo; - // mCurOffset = aReader.Position; - // mCurLabel = IL.Op.GetInstructionLabel(aReader); - // mNextLabel = IL.Op.GetInstructionLabel(aReader.NextPosition); - // } - // public override void DoAssemble() { - // if (Assembler.StackContents.Peek().IsFloat) { - // EmitNotImplementedException(Assembler, GetServiceProvider(), "Blt_Un: Floats are not yet supported", mCurLabel, mMethodInformation, mCurOffset, mNextLabel); - // return; - // } - // var rightTop = Assembler.StackContents.Pop(); - // var leftBottom = Assembler.StackContents.Pop(); - // int xSize = Math.Max(rightTop.Size, leftBottom.Size); - // if (xSize > 8) { - // EmitNotImplementedException(Assembler, GetServiceProvider(), "Blt_Un: StackSize>8 not supported yet", mCurLabel, mMethodInformation, mCurOffset, mNextLabel); - // return; - // } - // string BaseLabel = CurInstructionLabel + "__"; - // string LabelTrue = BaseLabel + "True"; - // string LabelFalse = BaseLabel + "False"; - // if (xSize <= 4) - // { - // new CPUx86.Pop { DestinationReg = CPUx86.Registers.ECX }; - // //if (xSize > 4) - // //{ - // // throw new NotImplementedException("long comprasion is not implemented"); - // // new CPUx86.Add("esp", "4"); - // //} - // new CPUx86.Pop { DestinationReg = CPUx86.Registers.EAX }; - // //if (xSize > 4) - // //{ - // // throw new NotImplementedException("long comprasion is not implemented"); - // // new CPUx86.Add("esp", "4"); - // //} - // new CPUx86.Push { DestinationReg = CPUx86.Registers.ECX }; - // new CPUx86.Compare { DestinationReg = CPUx86.Registers.EAX, SourceReg = CPUx86.Registers.ESP, SourceIsIndirect = true }; - // new CPUx86.ConditionalJump { Condition = CPUx86.ConditionalTestEnum.LessThan, DestinationLabel = LabelTrue }; - // new CPUx86.Jump { DestinationLabel = LabelFalse }; - // new CPU.Label(LabelTrue); - // new CPUx86.Add { DestinationReg = CPUx86.Registers.ESP, SourceValue = 4 }; - // new CPUx86.Jump { DestinationLabel = TargetLabel }; - // new CPU.Label(LabelFalse); - // new CPUx86.Add { DestinationReg = CPUx86.Registers.ESP, SourceValue=4 }; - // return; - // } - // - // if (xSize == 8) - // { - // new CPUx86.Pop { DestinationReg = CPUx86.Registers.EAX }; - // new CPUx86.Pop{DestinationReg = CPUx86.Registers.EDX}; - // //value2: EDX:EAX - // new CPUx86.Pop { DestinationReg = CPUx86.Registers.EBX }; - // new CPUx86.Pop { DestinationReg = CPUx86.Registers.ECX }; - // //value1: ECX:EBX - // new CPUx86.Sub { DestinationReg = CPUx86.Registers.EBX, SourceReg = CPUx86.Registers.EAX }; - // new CPUx86.SubWithCarry { DestinationReg = CPUx86.Registers.ECX, SourceReg = CPUx86.Registers.EDX }; - // //result = value1 - value2 - // new CPUx86.ConditionalJump { Condition = CPUx86.ConditionalTestEnum.Below, DestinationLabel = TargetLabel }; - // } - // EmitNotImplementedException(Assembler, GetServiceProvider(), "Blt_Un: Circumstances not supported", mCurLabel, mMethodInformation, mCurOffset, mNextLabel); - // } - // } - // } - - } -} diff --git a/source2/IL2PCU/Cosmos.IL2CPU.X86/IL/Bne_Un.cs b/source2/IL2PCU/Cosmos.IL2CPU.X86/IL/Bne_Un.cs deleted file mode 100644 index 858e0f3f9..000000000 --- a/source2/IL2PCU/Cosmos.IL2CPU.X86/IL/Bne_Un.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System; - -namespace Cosmos.IL2CPU.X86.IL -{ - [Cosmos.IL2CPU.OpCode(ILOpCode.Code.Bne_Un)] - public class Bne_Un: ILOp - { - public Bne_Un(Cosmos.IL2CPU.Assembler aAsmblr):base(aAsmblr) - { - } - - public override void Execute(MethodInfo aMethod, ILOpCode aOpCode) { - //TODO: Implement this Op - } - - - // using System; - // using System.IO; - // - // - // using CPU = Indy.IL2CPU.Assembler; - // using CPUx86 = Indy.IL2CPU.Assembler.X86; - // - // namespace Indy.IL2CPU.IL.X86 { - // [OpCode(OpCodeEnum.Bne_Un)] - // public class Bne_Un: Op { - // public readonly string TargetLabel; - // public readonly string CurInstructionLabel; - // private string mNextLabel; - // private string mCurLabel; - // private uint mCurOffset; - // private MethodInformation mMethodInformation; - // public Bne_Un(ILReader aReader, MethodInformation aMethodInfo) - // : base(aReader, aMethodInfo) { - // TargetLabel = GetInstructionLabel(aReader.OperandValueBranchPosition); - // CurInstructionLabel = GetInstructionLabel(aReader); - // mMethodInformation = aMethodInfo; - // mCurOffset = aReader.Position; - // mCurLabel = IL.Op.GetInstructionLabel(aReader); - // mNextLabel = IL.Op.GetInstructionLabel(aReader.NextPosition); - // } - // public override void DoAssemble() { - // if (Assembler.StackContents.Peek().IsFloat) { - // EmitNotImplementedException(Assembler, GetServiceProvider(), "Bne_Un: Float support not yet implemented!", mCurLabel, mMethodInformation, mCurOffset, mNextLabel); - // return; - // } - // int xSize = Math.Max(Assembler.StackContents.Pop().Size, Assembler.StackContents.Pop().Size); - // if (xSize > 8) { - // EmitNotImplementedException(Assembler, GetServiceProvider(), "Bne_Un: StackSize>8 not supported yet", mCurLabel, mMethodInformation, mCurOffset, mNextLabel); - // return; - // } - // string BaseLabel = CurInstructionLabel + "__"; - // string LabelTrue = BaseLabel + "True"; - // string LabelFalse = BaseLabel + "False"; - // if (xSize > 4) - // { - // new CPUx86.Pop { DestinationReg = CPUx86.Registers.EAX }; - // new CPUx86.Pop { DestinationReg = CPUx86.Registers.EBX }; - // //value2 = EBX:EAX - // new CPUx86.Pop { DestinationReg = CPUx86.Registers.ECX }; - // new CPUx86.Pop { DestinationReg = CPUx86.Registers.EDX }; - // //value1 = EDX:ECX - // new CPUx86.Xor { DestinationReg = CPUx86.Registers.EAX, SourceReg = CPUx86.Registers.ECX }; - // new CPUx86.ConditionalJump { Condition = CPUx86.ConditionalTestEnum.NotZero, DestinationLabel = TargetLabel }; - // new CPUx86.Xor { DestinationReg = CPUx86.Registers.EBX, SourceReg = CPUx86.Registers.EDX }; - // new CPUx86.ConditionalJump { Condition = CPUx86.ConditionalTestEnum.NotZero, DestinationLabel = TargetLabel }; - // } else - // { - // new CPUx86.Pop { DestinationReg = CPUx86.Registers.EAX }; - // new CPUx86.Compare { DestinationReg = CPUx86.Registers.EAX, SourceReg=CPUx86.Registers.ESP, SourceIsIndirect=true}; - // new CPUx86.ConditionalJump { Condition = CPUx86.ConditionalTestEnum.Equal, DestinationLabel = LabelTrue }; - // new CPUx86.Jump { DestinationLabel = LabelFalse }; - // new CPU.Label(LabelFalse); - // new CPUx86.Add { DestinationReg = CPUx86.Registers.ESP, SourceValue = 4 }; - // new CPUx86.Jump { DestinationLabel = TargetLabel }; - // new CPU.Label(LabelTrue); - // new CPUx86.Add{DestinationReg = CPUx86.Registers.ESP, SourceValue=4}; - // } - // } - // } - // } - - } -} diff --git a/source2/IL2PCU/Cosmos.IL2CPU.X86/IL/Branch_Un.cs b/source2/IL2PCU/Cosmos.IL2CPU.X86/IL/Branch_Un.cs new file mode 100644 index 000000000..62eb48885 --- /dev/null +++ b/source2/IL2PCU/Cosmos.IL2CPU.X86/IL/Branch_Un.cs @@ -0,0 +1,73 @@ +using System; +using Indy.IL2CPU.Assembler; +using CPU = Indy.IL2CPU.Assembler.X86; + +namespace Cosmos.IL2CPU.X86.IL +{ + [Cosmos.IL2CPU.OpCode( ILOpCode.Code.Bne_Un )] + [Cosmos.IL2CPU.OpCode( ILOpCode.Code.Bge_Un )] + [Cosmos.IL2CPU.OpCode( ILOpCode.Code.Bgt_Un )] + [Cosmos.IL2CPU.OpCode( ILOpCode.Code.Ble_Un )] + [Cosmos.IL2CPU.OpCode( ILOpCode.Code.Blt_Un )] + public class Branch_Un : ILOp + { + + public Branch_Un( Cosmos.IL2CPU.Assembler aAsmblr ) + : base( aAsmblr ) + { + } + + public override void Execute( MethodInfo aMethod, ILOpCode aOpCode ) + { + var xStackContent = Assembler.StackContents.Pop(); + Assembler.StackContents.Pop(); + if( xStackContent.Size > 8 ) + { + throw new Exception( "StackSize > 8 not supported" ); + } + + CPU.ConditionalTestEnum xTestOp; + switch( aOpCode.OpCode ) + { + case ILOpCode.Code.Bne_Un: + xTestOp = CPU.ConditionalTestEnum.NotEqual; + break; + case ILOpCode.Code.Bge_Un: + xTestOp = CPU.ConditionalTestEnum.AboveOrEqual; + break; + case ILOpCode.Code.Bgt_Un: + xTestOp = CPU.ConditionalTestEnum.Above; + break; + case ILOpCode.Code.Ble_Un: + xTestOp = CPU.ConditionalTestEnum.BelowOrEqual; + break; + case ILOpCode.Code.Blt_Un: + xTestOp = CPU.ConditionalTestEnum.Below; + break; + default: + throw new Exception( "Unknown OpCode for conditional branch." ); + break; + } + + if( xStackContent.Size <= 4 ) + { + new CPU.Pop { DestinationReg = CPU.Registers.EAX }; + new CPU.Pop { DestinationReg = CPU.Registers.EBX }; + new CPU.Compare { DestinationReg = CPU.Registers.EAX, SourceReg = CPU.Registers.EBX }; + new CPU.ConditionalJump { Condition = xTestOp, DestinationLabel = AssemblerNasm.TmpBranchLabel( aMethod, aOpCode ) }; + } + else + { + new CPU.Pop { DestinationReg = CPU.Registers.EAX }; + new CPU.Pop { DestinationReg = CPU.Registers.EBX }; + new CPU.Pop { DestinationReg = CPU.Registers.ECX }; + new CPU.Pop { DestinationReg = CPU.Registers.EDX }; + new CPU.Xor { DestinationReg = CPU.Registers.EAX, SourceReg = CPU.Registers.ECX }; + new CPU.ConditionalJump { Condition = xTestOp, DestinationLabel = AssemblerNasm.TmpBranchLabel( aMethod, aOpCode ) }; + new CPU.Xor { DestinationReg = CPU.Registers.EBX, SourceReg = CPU.Registers.EDX }; + new CPU.ConditionalJump { Condition = xTestOp, DestinationLabel = AssemblerNasm.TmpBranchLabel( aMethod, aOpCode ) }; + } + } + + } +}