private static void EmitSbc(AILEmitterCtx Context, bool SetFlags) { EmitDataLoadOpers(Context); Context.Emit(OpCodes.Sub); Context.EmitLdflg((int)APState.CBit); Type[] MthdTypes = new Type[] { typeof(bool) }; MethodInfo MthdInfo = typeof(Convert).GetMethod(nameof(Convert.ToInt32), MthdTypes); Context.EmitCall(MthdInfo); Context.EmitLdc_I4(1); Context.Emit(OpCodes.Xor); if (Context.CurrOp.RegisterSize != ARegisterSize.Int32) { Context.Emit(OpCodes.Conv_U8); } Context.Emit(OpCodes.Sub); if (SetFlags) { Context.EmitZNFlagCheck(); EmitSbcsCCheck(Context); EmitSubsVCheck(Context); } EmitDataStore(Context); }
public static void Sbc(AILEmitterCtx Context) { EmitDataLoadOpers(Context); Context.Emit(OpCodes.Sub); Context.EmitLdflg((int)APState.CBit); Type[] MthdTypes = new Type[] { typeof(bool) }; MethodInfo MthdInfo = typeof(Convert).GetMethod(nameof(Convert.ToInt32), MthdTypes); Context.EmitCall(MthdInfo); Context.EmitLdc_I4(1); Context.Emit(OpCodes.Xor); if (Context.CurrOp.RegisterSize != ARegisterSize.Int32) { Context.Emit(OpCodes.Conv_I8); } Context.Emit(OpCodes.Sub); EmitDataStore(Context); }
public static void EmitSbcsCCheck(AILEmitterCtx Context) { //C = (Rn == Rm && CIn) || Rn > Rm EmitDataLoadOpers(Context); Context.Emit(OpCodes.Ceq); Context.EmitLdflg((int)APState.CBit); Context.Emit(OpCodes.And); EmitDataLoadOpers(Context); Context.Emit(OpCodes.Cgt_Un); Context.Emit(OpCodes.Or); Context.EmitStflg((int)APState.CBit); }
public static void EmitAdcsCCheck(AILEmitterCtx Context) { //C = (Rd == Rn && CIn) || Rd < Rn Context.EmitSttmp(); Context.EmitLdtmp(); Context.EmitLdtmp(); EmitDataLoadRn(Context); Context.Emit(OpCodes.Ceq); Context.EmitLdflg((int)APState.CBit); Context.Emit(OpCodes.And); Context.EmitLdtmp(); EmitDataLoadRn(Context); Context.Emit(OpCodes.Clt_Un); Context.Emit(OpCodes.Or); Context.EmitStflg((int)APState.CBit); }