private static void EmitCsel(AILEmitterCtx Context, CselOperation CselOp) { AOpCodeCsel Op = (AOpCodeCsel)Context.CurrOp; AILLabel LblTrue = new AILLabel(); AILLabel LblEnd = new AILLabel(); Context.EmitCondBranch(LblTrue, Op.Cond); Context.EmitLdintzr(Op.Rm); if (CselOp == CselOperation.Increment) { Context.EmitLdc_I(1); Context.Emit(OpCodes.Add); } else if (CselOp == CselOperation.Invert) { Context.Emit(OpCodes.Not); } else if (CselOp == CselOperation.Negate) { Context.Emit(OpCodes.Neg); } Context.Emit(OpCodes.Br_S, LblEnd); Context.MarkLabel(LblTrue); Context.EmitLdintzr(Op.Rn); Context.MarkLabel(LblEnd); Context.EmitStintzr(Op.Rd); }
private static void EmitCsel(ArmEmitterContext context, CselOperation cselOp) { OpCodeCsel op = (OpCodeCsel)context.CurrOp; Operand n = GetIntOrZR(context, op.Rn); Operand m = GetIntOrZR(context, op.Rm); if (cselOp == CselOperation.Increment) { m = context.Add(m, Const(m.Type, 1)); } else if (cselOp == CselOperation.Invert) { m = context.BitwiseNot(m); } else if (cselOp == CselOperation.Negate) { m = context.Negate(m); } Operand condTrue = GetCondTrue(context, op.Cond); Operand d = context.ConditionalSelect(condTrue, n, m); SetIntOrZR(context, op.Rd, d); }
private static void EmitCsel(ILEmitterCtx context, CselOperation cselOp) { OpCodeCsel64 op = (OpCodeCsel64)context.CurrOp; ILLabel lblTrue = new ILLabel(); ILLabel lblEnd = new ILLabel(); context.EmitCondBranch(lblTrue, op.Cond); context.EmitLdintzr(op.Rm); if (cselOp == CselOperation.Increment) { context.EmitLdc_I(1); context.Emit(OpCodes.Add); } else if (cselOp == CselOperation.Invert) { context.Emit(OpCodes.Not); } else if (cselOp == CselOperation.Negate) { context.Emit(OpCodes.Neg); } context.Emit(OpCodes.Br_S, lblEnd); context.MarkLabel(lblTrue); context.EmitLdintzr(op.Rn); context.MarkLabel(lblEnd); context.EmitStintzr(op.Rd); }