From 233e4fc76f58ee6b24ade0d9185a55a1cf3ca7de Mon Sep 17 00:00:00 2001 From: LostTheBlack_cp Date: Thu, 17 Apr 2008 23:57:56 +0000 Subject: [PATCH] [+] Brtrue and Brfalse both support 64-bit operands. --- source/Indy.IL2CPU.IL.X86/Brfalse.cs | 29 ++++++++++++++++++++++------ source/Indy.IL2CPU.IL.X86/Brtrue.cs | 18 ++++++++++++----- 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/source/Indy.IL2CPU.IL.X86/Brfalse.cs b/source/Indy.IL2CPU.IL.X86/Brfalse.cs index bc22df5a2..9c08eb7bb 100644 --- a/source/Indy.IL2CPU.IL.X86/Brfalse.cs +++ b/source/Indy.IL2CPU.IL.X86/Brfalse.cs @@ -1,20 +1,21 @@ using System; using System.IO; - +using CPU = Indy.IL2CPU.Assembler; using CPUx86 = Indy.IL2CPU.Assembler.X86; namespace Indy.IL2CPU.IL.X86 { [OpCode(OpCodeEnum.Brfalse)] public class Brfalse: Op { public readonly string TargetLabel; + public readonly string CurInstructionLabel; public Brfalse(ILReader aReader, MethodInformation aMethodInfo) : base(aReader, aMethodInfo) { TargetLabel = GetInstructionLabel(aReader.OperandValueBranchPosition); + CurInstructionLabel = GetInstructionLabel(aReader); } public override void DoAssemble() { - new CPUx86.Popd(CPUx86.Registers.EAX); var xStackContent = Assembler.StackContents.Pop(); if (xStackContent.IsFloat) { throw new Exception("Floats not yet supported!"); @@ -22,11 +23,27 @@ namespace Indy.IL2CPU.IL.X86 { if (xStackContent.Size > 8) { throw new Exception("StackSize>8 not supported"); } - if (xStackContent.Size > 4) { - new CPUx86.Add("esp", "4"); + + string BaseLabel = CurInstructionLabel + "__"; + string LabelTrue = BaseLabel + "True"; + string LabelFalse = BaseLabel + "False"; + + if (xStackContent.Size > 4) + { + new CPUx86.Popd("eax"); + new CPUx86.Popd("ebx"); + new CPUx86.Xor("eax", "eax"); + new CPUx86.JumpIfNotZero(LabelFalse); + new CPUx86.Xor("ebx", "ebx"); + new CPUx86.JumpIfNotZero(LabelFalse); + new CPUx86.JumpAlways(TargetLabel); + new CPU.Label(LabelFalse); + } else + { + new CPUx86.Popd(CPUx86.Registers.EAX); + new CPUx86.Compare(CPUx86.Registers.EAX, "0"); + new CPUx86.JumpIfEquals(TargetLabel); } - new CPUx86.Compare(CPUx86.Registers.EAX, "0"); - new CPUx86.JumpIfEquals(TargetLabel); } } } \ No newline at end of file diff --git a/source/Indy.IL2CPU.IL.X86/Brtrue.cs b/source/Indy.IL2CPU.IL.X86/Brtrue.cs index 3b46c2267..1369df5d4 100644 --- a/source/Indy.IL2CPU.IL.X86/Brtrue.cs +++ b/source/Indy.IL2CPU.IL.X86/Brtrue.cs @@ -14,16 +14,24 @@ namespace Indy.IL2CPU.IL.X86 { } public override void DoAssemble() { - new CPUx86.Popd(CPUx86.Registers.EAX); int xSize = Assembler.StackContents.Pop().Size; if (xSize > 8) { throw new Exception("StackSize>8 not supported"); } - if (xSize > 4) { - new CPUx86.Add("esp", "4"); + if (xSize > 4) + { + new CPUx86.Popd("eax"); + new CPUx86.Popd("ebx"); + new CPUx86.Xor("eax", "eax"); + new CPUx86.JumpIfNotZero(TargetLabel); + new CPUx86.Xor("ebx", "ebx"); + new CPUx86.JumpIfNotZero(TargetLabel); + } else + { + new CPUx86.Popd(CPUx86.Registers.EAX); + new CPUx86.Compare(CPUx86.Registers.EAX, "0"); + new CPUx86.JumpIfNotEquals(TargetLabel); } - new CPUx86.Compare(CPUx86.Registers.EAX, "0"); - new CPUx86.JumpIfNotEquals(TargetLabel); } } } \ No newline at end of file