using System; using CPUx86 = Indy.IL2CPU.Assembler.X86; namespace Indy.IL2CPU.IL.X86 { [OpCode(OpCodeEnum.Switch)] public class Switch: Op { private string[] mLabels; public Switch(ILReader aReader, MethodInformation aMethodInfo) : base(aReader, aMethodInfo) { uint[] xCases = aReader.OperandValueBranchLocations; mLabels = new string[xCases.Length]; for (int i = 0; i < xCases.Length; i++) { mLabels[i] = GetInstructionLabel(xCases[i]); } } public override void DoAssemble() { new CPUx86.Pop { DestinationReg = CPUx86.Registers.EAX }; for(int i = 0; i < mLabels.Length; i++){ new CPUx86.Compare { DestinationReg = CPUx86.Registers.EAX, SourceValue =(uint)i }; new CPUx86.JumpIfEqual { DestinationLabel = mLabels[i] }; } Assembler.StackContents.Pop(); } } }