private static void EmitCcmp(ILEmitterCtx context, CcmpOp cmpOp) { OpCodeCcmp64 op = (OpCodeCcmp64)context.CurrOp; ILLabel lblTrue = new ILLabel(); ILLabel lblEnd = new ILLabel(); context.EmitCondBranch(lblTrue, op.Cond); context.EmitLdc_I4((op.Nzcv >> 0) & 1); context.EmitStflg((int)PState.VBit); context.EmitLdc_I4((op.Nzcv >> 1) & 1); context.EmitStflg((int)PState.CBit); context.EmitLdc_I4((op.Nzcv >> 2) & 1); context.EmitStflg((int)PState.ZBit); context.EmitLdc_I4((op.Nzcv >> 3) & 1); context.EmitStflg((int)PState.NBit); context.Emit(OpCodes.Br_S, lblEnd); context.MarkLabel(lblTrue); EmitAluLoadOpers(context); if (cmpOp == CcmpOp.Cmp) { context.Emit(OpCodes.Sub); context.EmitZnFlagCheck(); EmitSubsCCheck(context); EmitSubsVCheck(context); } else if (cmpOp == CcmpOp.Cmn) { context.Emit(OpCodes.Add); context.EmitZnFlagCheck(); EmitAddsCCheck(context); EmitAddsVCheck(context); } else { throw new ArgumentException(nameof(cmpOp)); } context.Emit(OpCodes.Pop); context.MarkLabel(lblEnd); }
private static void EmitCcmp(AILEmitterCtx Context, CcmpOp CmpOp) { AOpCodeCcmp Op = (AOpCodeCcmp)Context.CurrOp; AILLabel LblTrue = new AILLabel(); AILLabel LblEnd = new AILLabel(); Context.EmitCondBranch(LblTrue, Op.Cond); Context.EmitLdc_I4((Op.NZCV >> 0) & 1); Context.EmitStflg((int)APState.VBit); Context.EmitLdc_I4((Op.NZCV >> 1) & 1); Context.EmitStflg((int)APState.CBit); Context.EmitLdc_I4((Op.NZCV >> 2) & 1); Context.EmitStflg((int)APState.ZBit); Context.EmitLdc_I4((Op.NZCV >> 3) & 1); Context.EmitStflg((int)APState.NBit); Context.Emit(OpCodes.Br_S, LblEnd); Context.MarkLabel(LblTrue); EmitDataLoadOpers(Context); if (CmpOp == CcmpOp.Cmp) { Context.Emit(OpCodes.Sub); Context.EmitZNFlagCheck(); EmitSubsCCheck(Context); EmitSubsVCheck(Context); } else if (CmpOp == CcmpOp.Cmn) { Context.Emit(OpCodes.Add); Context.EmitZNFlagCheck(); EmitAddsCCheck(Context); EmitAddsVCheck(Context); } else { throw new ArgumentException(nameof(CmpOp)); } Context.Emit(OpCodes.Pop); Context.MarkLabel(LblEnd); }