public static void EmitRoundMathCall(AILEmitterCtx Context, MidpointRounding RoundMode) { IAOpCodeSimd Op = (IAOpCodeSimd)Context.CurrOp; int SizeF = Op.Size & 1; Context.EmitLdc_I4((int)RoundMode); MethodInfo MthdInfo; Type[] Types = new Type[] { null, typeof(MidpointRounding) }; Types[0] = SizeF == 0 ? typeof(float) : typeof(double); if (SizeF == 0) { MthdInfo = typeof(MathF).GetMethod(nameof(MathF.Round), Types); } else /* if (SizeF == 1) */ { MthdInfo = typeof(Math).GetMethod(nameof(Math.Round), Types); } Context.EmitCall(MthdInfo); }
public static void EmitRoundMathCall(AILEmitterCtx Context, MidpointRounding RoundMode) { IAOpCodeSimd Op = (IAOpCodeSimd)Context.CurrOp; Context.EmitLdc_I4((int)RoundMode); MethodInfo MthdInfo; Type[] Types = new Type[] { null, typeof(MidpointRounding) }; Types[0] = Op.Size == 0 ? typeof(float) : typeof(double); if (Op.Size == 0) { MthdInfo = typeof(Math).GetMethod(nameof(Math.Round), Types); } else if (Op.Size == 1) { MthdInfo = typeof(Math).GetMethod(nameof(Math.Round), Types); } else { throw new InvalidOperationException(); } Context.EmitCall(MthdInfo); }
public static void EmitSoftFloatCall(AILEmitterCtx Context, string Name) { IAOpCodeSimd Op = (IAOpCodeSimd)Context.CurrOp; Type Type = (Op.Size & 1) == 0 ? typeof(ASoftFloat_32) : typeof(ASoftFloat_64); Context.EmitLdarg(ATranslatedSub.StateArgIdx); Context.EmitCall(Type, Name); }
private static void EmitVectorExtract(AILEmitterCtx Context, int Reg, int Index, int Size, bool Signed) { IAOpCodeSimd Op = (IAOpCodeSimd)Context.CurrOp; Context.EmitLdvec(Reg); Context.EmitLdc_I4(Index); Context.EmitLdc_I4(Size); ASoftFallback.EmitCall(Context, Signed ? nameof(ASoftFallback.ExtractSVec) : nameof(ASoftFallback.ExtractVec)); }
public static void EmitVectorExtract(AILEmitterCtx Context, int Reg, int Index, int Size, bool Signed) { ThrowIfInvalid(Index, Size); IAOpCodeSimd Op = (IAOpCodeSimd)Context.CurrOp; Context.EmitLdvec(Reg); Context.EmitLdc_I4(Index); Context.EmitLdc_I4(Size); AVectorHelper.EmitCall(Context, Signed ? nameof(AVectorHelper.VectorExtractIntSx) : nameof(AVectorHelper.VectorExtractIntZx)); }
public static void EmitVectorExtract(AILEmitterCtx Context, int Reg, int Index, int Size, bool Signed) { if (Size < 0 || Size > 3) { throw new ArgumentOutOfRangeException(nameof(Size)); } IAOpCodeSimd Op = (IAOpCodeSimd)Context.CurrOp; Context.EmitLdvec(Reg); Context.EmitLdc_I4(Index); Context.EmitLdc_I4(Size); ASoftFallback.EmitCall(Context, Signed ? nameof(ASoftFallback.VectorExtractIntSx) : nameof(ASoftFallback.VectorExtractIntZx)); }
private static void EmitNaNCheck(AILEmitterCtx Context, int Reg) { IAOpCodeSimd Op = (IAOpCodeSimd)Context.CurrOp; EmitVectorExtractF(Context, Reg, 0, Op.Size); if (Op.Size == 0) { Context.EmitCall(typeof(float), nameof(float.IsNaN)); } else if (Op.Size == 1) { Context.EmitCall(typeof(double), nameof(double.IsNaN)); } else { throw new InvalidOperationException(); } }
public static void EmitUnarySoftFloatCall(AILEmitterCtx Context, string Name) { IAOpCodeSimd Op = (IAOpCodeSimd)Context.CurrOp; int SizeF = Op.Size & 1; MethodInfo MthdInfo; if (SizeF == 0) { MthdInfo = typeof(ASoftFloat).GetMethod(Name, new Type[] { typeof(float) }); } else /* if (SizeF == 1) */ { MthdInfo = typeof(ASoftFloat).GetMethod(Name, new Type[] { typeof(double) }); } Context.EmitCall(MthdInfo); }
private static void EmitNaNCheck(AILEmitterCtx Context, int Index) { IAOpCodeSimd Op = (IAOpCodeSimd)Context.CurrOp; Context.EmitLdvecsf(Index); if (Op.Size == 0) { Context.EmitCall(typeof(float), nameof(float.IsNaN)); } else if (Op.Size == 1) { Context.EmitCall(typeof(double), nameof(double.IsNaN)); } else { throw new InvalidOperationException(); } }
private static void EmitMathOpCall(AILEmitterCtx Context, string Name) { IAOpCodeSimd Op = (IAOpCodeSimd)Context.CurrOp; MethodInfo MthdInfo; if (Op.Size == 0) { MthdInfo = typeof(MathF).GetMethod(Name); } else if (Op.Size == 1) { MthdInfo = typeof(Math).GetMethod(Name); } else { throw new InvalidOperationException(); } Context.EmitCall(MthdInfo); }
public static void EmitBinaryMathCall(AILEmitterCtx Context, string Name) { IAOpCodeSimd Op = (IAOpCodeSimd)Context.CurrOp; MethodInfo MthdInfo; if (Op.Size == 0) { MthdInfo = typeof(Math).GetMethod(Name, new Type[] { typeof(float), typeof(float) }); } else if (Op.Size == 1) { MthdInfo = typeof(Math).GetMethod(Name, new Type[] { typeof(double), typeof(double) }); } else { throw new InvalidOperationException(); } Context.EmitCall(MthdInfo); }