diff --git a/source/Indy.IL2CPU.IL.X86/Clt.cs b/source/Indy.IL2CPU.IL.X86/Clt.cs index 8508f017c..f1d9f976d 100644 --- a/source/Indy.IL2CPU.IL.X86/Clt.cs +++ b/source/Indy.IL2CPU.IL.X86/Clt.cs @@ -5,6 +5,7 @@ using System.IO; using CPUx86 = Indy.IL2CPU.Assembler.X86; using CPU = Indy.IL2CPU.Assembler; using Indy.IL2CPU.Assembler; +using Indy.IL2CPU.Assembler.X86; namespace Indy.IL2CPU.IL.X86 { [OpCode(OpCodeEnum.Clt)] @@ -28,26 +29,40 @@ namespace Indy.IL2CPU.IL.X86 { string BaseLabel = CurInstructionLabel + "__"; string LabelTrue = BaseLabel + "True"; string LabelFalse = BaseLabel + "False"; - new CPUx86.Pop(CPUx86.Registers.ECX); - if (xSize > 4) { - new CPUx86.Add("esp", "4"); + if (xSize > 4) + { + new CPUx86.Xor("esi", "esi"); + new CPUx86.Add("esi", "1"); + new CPUx86.Xor("edi", "edi"); + //esi = 1 + new CPUx86.Pop(CPUx86.Registers.EAX); + new CPUx86.Pop(CPUx86.Registers.EDX); + //value2: EDX:EAX + new CPUx86.Pop("ebx"); + new CPUx86.Pop("ecx"); + //value1: ECX:EBX + new CPUx86.Sub("ebx", "eax"); + new CPUx86.SubWithCarry("ecx", "edx"); + //result = value1 - value2 + new CPUx86.ConditionalMove(Condition.Less, "edi", "esi"); + new CPUx86.Push("edi"); + } else + { + new CPUx86.Pop(CPUx86.Registers.ECX); + new CPUx86.Pop(CPUx86.Registers.EAX); + new CPUx86.Pushd(CPUx86.Registers.ECX); + new CPUx86.Compare(CPUx86.Registers.EAX, CPUx86.Registers.AtESP); + new CPUx86.JumpIfLess(LabelTrue); + new CPUx86.JumpAlways(LabelFalse); + new CPU.Label(LabelTrue); + new CPUx86.Add(CPUx86.Registers.ESP, "4"); + new CPUx86.Push("01h"); + new CPUx86.JumpAlways(NextInstructionLabel); + new CPU.Label(LabelFalse); + new CPUx86.Add(CPUx86.Registers.ESP, "4"); + new CPUx86.Push("00h"); + new CPUx86.JumpAlways(NextInstructionLabel); } - new CPUx86.Pop(CPUx86.Registers.EAX); - if (xSize > 4) { - new CPUx86.Add("esp", "4"); - } - new CPUx86.Pushd(CPUx86.Registers.ECX); - new CPUx86.Compare(CPUx86.Registers.EAX, CPUx86.Registers.AtESP); - new CPUx86.JumpIfLess(LabelTrue); - new CPUx86.JumpAlways(LabelFalse); - new CPU.Label(LabelTrue); - new CPUx86.Add(CPUx86.Registers.ESP, "4"); - new CPUx86.Push("01h"); - new CPUx86.JumpAlways(NextInstructionLabel); - new CPU.Label(LabelFalse); - new CPUx86.Add(CPUx86.Registers.ESP, "4"); - new CPUx86.Push("00h"); - new CPUx86.JumpAlways(NextInstructionLabel); } } } \ No newline at end of file diff --git a/source/Indy.IL2CPU.IL.X86/Clt_Un.cs b/source/Indy.IL2CPU.IL.X86/Clt_Un.cs index 56361dd69..300edaa3c 100644 --- a/source/Indy.IL2CPU.IL.X86/Clt_Un.cs +++ b/source/Indy.IL2CPU.IL.X86/Clt_Un.cs @@ -5,6 +5,7 @@ using System.IO; using CPUx86 = Indy.IL2CPU.Assembler.X86; using CPU = Indy.IL2CPU.Assembler; using Indy.IL2CPU.Assembler; +using Indy.IL2CPU.Assembler.X86; namespace Indy.IL2CPU.IL.X86 { [OpCode(OpCodeEnum.Clt_Un)] @@ -28,26 +29,40 @@ namespace Indy.IL2CPU.IL.X86 { string BaseLabel = CurInstructionLabel + "__"; string LabelTrue = BaseLabel + "True"; string LabelFalse = BaseLabel + "False"; - new CPUx86.Pop(CPUx86.Registers.ECX); - if (xSize > 4) { - new CPUx86.Add("esp", "4"); + if (xSize > 4) + { + new CPUx86.Xor("esi", "esi"); + new CPUx86.Add("esi", "1"); + new CPUx86.Xor("edi", "edi"); + //esi = 1 + new CPUx86.Pop(CPUx86.Registers.EAX); + new CPUx86.Pop(CPUx86.Registers.EDX); + //value2: EDX:EAX + new CPUx86.Pop("ebx"); + new CPUx86.Pop("ecx"); + //value1: ECX:EBX + new CPUx86.Sub("ebx", "eax"); + new CPUx86.SubWithCarry("ecx", "edx"); + //result = value1 - value2 + new CPUx86.ConditionalMove(Condition.Below, "edi", "esi"); + new CPUx86.Push("edi"); + } else + { + new CPUx86.Pop(CPUx86.Registers.ECX); + new CPUx86.Pop(CPUx86.Registers.EAX); + new CPUx86.Pushd(CPUx86.Registers.ECX); + new CPUx86.Compare(CPUx86.Registers.EAX, CPUx86.Registers.AtESP); + new CPUx86.JumpIfLess(LabelTrue); + new CPUx86.JumpAlways(LabelFalse); + new CPU.Label(LabelTrue); + new CPUx86.Add(CPUx86.Registers.ESP, "4"); + new CPUx86.Push("01h"); + new CPUx86.JumpAlways(NextInstructionLabel); + new CPU.Label(LabelFalse); + new CPUx86.Add(CPUx86.Registers.ESP, "4"); + new CPUx86.Push("00h"); + new CPUx86.JumpAlways(NextInstructionLabel); } - new CPUx86.Pop(CPUx86.Registers.EAX); - if (xSize > 4) { - new CPUx86.Add("esp", "4"); - } - new CPUx86.Pushd(CPUx86.Registers.ECX); - new CPUx86.Compare(CPUx86.Registers.EAX, CPUx86.Registers.AtESP); - new CPUx86.JumpIfLess(LabelTrue); - new CPUx86.JumpAlways(LabelFalse); - new CPU.Label(LabelTrue); - new CPUx86.Add(CPUx86.Registers.ESP, "4"); - new CPUx86.Push("01h"); - new CPUx86.JumpAlways(NextInstructionLabel); - new CPU.Label(LabelFalse); - new CPUx86.Add(CPUx86.Registers.ESP, "4"); - new CPUx86.Push("00h"); - new CPUx86.JumpAlways(NextInstructionLabel); } } } \ No newline at end of file