diff --git a/source/Indy.IL2CPU.IL.X86/Bgt.cs b/source/Indy.IL2CPU.IL.X86/Bgt.cs index c39fa32d1..8f2dcf028 100644 --- a/source/Indy.IL2CPU.IL.X86/Bgt.cs +++ b/source/Indy.IL2CPU.IL.X86/Bgt.cs @@ -27,26 +27,30 @@ namespace Indy.IL2CPU.IL.X86 { if (xStackContent.Size > 8) { throw new Exception("StackSize>8 not supported"); } - new CPUx86.Pop(CPUx86.Registers.EAX); - if (xStackContent.Size > 4) { - throw new NotImplementedException("long comprasion is not implemented"); - new CPUx86.Add("esp", "4"); - } - new CPUx86.Compare(CPUx86.Registers.EAX, CPUx86.Registers.AtESP); - new CPUx86.JumpIfGreater(LabelTrue); - new CPUx86.JumpAlways(LabelFalse); - new CPU.Label(LabelTrue); - new CPUx86.Add(CPUx86.Registers.ESP, "4"); - if (xStackContent.Size > 4) { - throw new NotImplementedException("long comprasion is not implemented"); - new CPUx86.Add("esp", "4"); - } - new CPUx86.JumpAlways(TargetLabel); - new CPU.Label(LabelFalse); - new CPUx86.Add(CPUx86.Registers.ESP, "4"); - if (xStackContent.Size > 4) { - throw new NotImplementedException("long comprasion is not implemented"); - new CPUx86.Add("esp", "4"); + if (xStackContent.Size > 4) + { + //target label is then value1 >= value2 + 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 = value2 - value1 + new CPUx86.JumpOnGreater(TargetLabel); + }else + { + new CPUx86.Pop(CPUx86.Registers.EAX); + new CPUx86.Compare(CPUx86.Registers.EAX, CPUx86.Registers.AtESP); + new CPUx86.JumpIfGreater(LabelTrue); + new CPUx86.JumpAlways(LabelFalse); + new CPU.Label(LabelTrue); + new CPUx86.Add(CPUx86.Registers.ESP, "4"); + new CPUx86.JumpAlways(TargetLabel); + new CPU.Label(LabelFalse); + new CPUx86.Add(CPUx86.Registers.ESP, "4"); } } }