/// <summary> /// Visitation function for IntegerCompareBranchInstruction. /// </summary> /// <param name="context">The context.</param> void IR.IIRVisitor.IntegerCompareBranch(Context context) { int target = context.BranchTargets[0]; var condition = context.ConditionCode; var operand1 = context.Operand1; var operand2 = context.Operand2; context.SetInstruction(AVR32.Cp, operand1, operand2); context.AppendInstruction(AVR32.Branch, condition); context.SetBranch(target); }
/// <summary> /// Visitation function for ReturnInstruction. /// </summary> /// <param name="context">The context.</param> void IR.IIRVisitor.Return(Context context) { if (context.BranchTargets == null) { // To return from an internal method call (usually from within a finally or exception clause) context.SetInstruction(AVR32.Ret); return; } if (context.Operand1 != null) { callingConvention.MoveReturnValue(context, context.Operand1); context.AppendInstruction(AVR32.Rjmp); context.SetBranch(Int32.MaxValue); } else { context.SetInstruction(AVR32.Jmp); context.SetBranch(Int32.MaxValue); } }
/// <summary> /// Visitation function for SwitchInstruction. /// </summary> /// <param name="context">The context.</param> void IIRVisitor.Switch(Context context) { int[] targets = context.BranchTargets; Operand operand = context.Operand1; context.Remove(); for (int i = 0; i < targets.Length - 1; ++i) { context.AppendInstruction(X86.Cmp, null, operand, Operand.CreateConstant(BuiltInSigType.IntPtr, i)); context.AppendInstruction(X86.Branch, ConditionCode.Equal); context.SetBranch(targets[i]); } }
/// <summary> /// Visitation function for IntegerCompareBranchInstruction. /// </summary> /// <param name="context">The context.</param> void IIRVisitor.IntegerCompareBranch(Context context) { EmitOperandConstants(context); int target = context.BranchTargets[0]; var condition = context.ConditionCode; var operand1 = context.Operand1; var operand2 = context.Operand2; context.SetInstruction(X86.Cmp, null, operand1, operand2); context.AppendInstruction(X86.Branch, condition); context.SetBranch(target); }
/// <summary> /// Visitation function for IntegerCompareBranchInstruction. /// </summary> /// <param name="context">The context.</param> void IR.IIRVisitor.IntegerCompareBranchInstruction(Context context) { IBranch branch = context.Branch; var condition = context.ConditionCode; var operand1 = context.Operand1; var operand2 = context.Operand2; context.SetInstruction(Instruction.CpInstruction, operand1, operand2); context.AppendInstruction(Instruction.BranchInstruction, condition); context.SetBranch(branch.Targets[0]); }
/// <summary> /// Visitation function for Return. /// </summary> /// <param name="context">The context.</param> void IIRVisitor.Return(Context context) { Debug.Assert(context.BranchTargets != null); if (context.Operand1 != null) { // HACK - to support test suit on windows //if (context.Operand1.IsR) //{ // Operand stack = methodCompiler.StackLayout.AddStackLocal(context.Operand1.Type); // Context before = context.InsertBefore(); // architecture.InsertMoveInstruction(before, stack, context.Operand1); // before.AppendInstruction(X86.Fld, null, stack); //} var returnOperand = context.Operand1; context.Remove(); CallingConvention.SetReturnValue(TypeLayout, context, returnOperand); context.AppendInstruction(X86.Jmp); context.SetBranch(Int32.MaxValue); } else { context.SetInstruction(X86.Jmp); context.SetBranch(Int32.MaxValue); } }
private static void CreatePrologueAndEpilogueBlocks(InstructionSet instructionSet, BasicBlocks basicBlocks) { // Create the prologue block Context context = new Context(instructionSet); // Add a jump instruction to the first block from the prologue context.AppendInstruction(IRInstruction.Jmp); context.SetBranch(0); context.Label = BasicBlock.PrologueLabel; var prologue = basicBlocks.CreateBlock(BasicBlock.PrologueLabel, context.Index); basicBlocks.AddHeaderBlock(prologue); // Create the epilogue block context = new Context(instructionSet); // Add null instruction, necessary to generate a block index context.AppendInstruction(null); context.Label = BasicBlock.EpilogueLabel; var epilogue = basicBlocks.CreateBlock(BasicBlock.EpilogueLabel, context.Index); }
/// <summary> /// Visitation function for IntegerCompareBranchInstruction. /// </summary> /// <param name="context">The context.</param> void IIRVisitor.IntegerCompareBranch(Context context) { int target = context.BranchTargets[0]; var condition = context.ConditionCode; var operand1 = context.Operand1; var operand2 = context.Operand2; Operand r9 = Operand.CreateCPURegister(operand1.Type, GeneralPurposeRegister.R9); Operand r10 = Operand.CreateCPURegister(operand1.Type, GeneralPurposeRegister.R10); context.SetInstruction(AVR32.Ld, r9, operand1); if (operand2.IsConstant) { context.AppendInstruction(AVR32.Cp, r9, operand2); } else { context.AppendInstruction(AVR32.Ld, r10, operand2); context.AppendInstruction(AVR32.Cp, r9, r10); } context.AppendInstruction(AVR32.Branch, condition); context.SetBranch(target); }
/// <summary> /// Visitation function for SwitchInstruction. /// </summary> /// <param name="context">The context.</param> void IR.IIRVisitor.SwitchInstruction(Context context) { IBranch branch = context.Branch; Operand operand = context.Operand1; context.Remove(); for (int i = 0; i < branch.Targets.Length - 1; ++i) { context.AppendInstruction(Instruction.CmpInstruction, operand, new ConstantOperand(BuiltInSigType.IntPtr, i)); context.AppendInstruction(Instruction.BranchInstruction, IR.ConditionCode.Equal); context.SetBranch(branch.Targets[i]); } }