private static void EmitBranch(ArmEmitterContext context, Condition cond) { OpCodeBImm op = (OpCodeBImm)context.CurrOp; if (context.CurrBlock.Branch != null) { EmitCondBranch(context, context.GetLabel((ulong)op.Immediate), cond); if (context.CurrBlock.Next == null) { context.Return(Const(op.Address + 4)); } } else { Operand lblTaken = Label(); EmitCondBranch(context, lblTaken, cond); context.Return(Const(op.Address + 4)); context.MarkLabel(lblTaken); context.Return(Const(op.Immediate)); } }
private static void EmitBranch(ArmEmitterContext context, Operand value, bool onNotZero) { OpCodeBImm op = (OpCodeBImm)context.CurrOp; Operand lblTarget = context.GetLabel((ulong)op.Immediate); if (onNotZero) { context.BranchIfTrue(lblTarget, value); } else { context.BranchIfFalse(lblTarget, value); } }
private static void EmitBranch(ArmEmitterContext context, Operand value, bool onNotZero) { OpCodeBImm op = (OpCodeBImm)context.CurrOp; if (context.CurrBlock.Branch != null) { Operand lblTarget = context.GetLabel((ulong)op.Immediate); if (onNotZero) { context.BranchIfTrue(lblTarget, value); } else { context.BranchIfFalse(lblTarget, value); } if (context.CurrBlock.Next == null) { context.Return(Const(op.Address + 4)); } } else { Operand lblTaken = Label(); if (onNotZero) { context.BranchIfTrue(lblTaken, value); } else { context.BranchIfFalse(lblTaken, value); } context.Return(Const(op.Address + 4)); context.MarkLabel(lblTaken); context.Return(Const(op.Immediate)); } }
private static void EmitBranch(ArmEmitterContext context, Condition cond) { OpCodeBImm op = (OpCodeBImm)context.CurrOp; EmitCondBranch(context, context.GetLabel((ulong)op.Immediate), cond); }