private static void EmitBranch(ILEmitterCtx context, OpCode ilOp) { OpCodeBImm64 op = (OpCodeBImm64)context.CurrOp; if (context.CurrBlock.Branch != null) { context.Emit(ilOp, context.GetLabel(op.Imm)); if (context.CurrBlock.Next == null) { context.EmitStoreContext(); context.EmitLdc_I8(op.Position + 4); context.Emit(OpCodes.Ret); } } else { context.EmitStoreContext(); ILLabel lblTaken = new ILLabel(); context.Emit(ilOp, lblTaken); context.EmitLdc_I8(op.Position + 4); context.Emit(OpCodes.Ret); context.MarkLabel(lblTaken); context.EmitLdc_I8(op.Imm); context.Emit(OpCodes.Ret); } }
private static void EmitBranch(ILEmitterCtx context, Cond cond) { OpCodeBImm64 op = (OpCodeBImm64)context.CurrOp; if (context.CurrBlock.Next != null && context.CurrBlock.Branch != null) { context.EmitCondBranch(context.GetLabel(op.Imm), cond); } else { context.EmitStoreState(); ILLabel lblTaken = new ILLabel(); context.EmitCondBranch(lblTaken, cond); context.EmitLdc_I8(op.Position + 4); context.Emit(OpCodes.Ret); context.MarkLabel(lblTaken); context.EmitLdc_I8(op.Imm); context.Emit(OpCodes.Ret); } }