public static void EmitSoftFloatCall(ILEmitterCtx context, string name) { IOpCodeSimd64 op = (IOpCodeSimd64)context.CurrOp; Type type = (op.Size & 1) == 0 ? typeof(SoftFloat32) : typeof(SoftFloat64); context.EmitLdarg(TranslatedSub.StateArgIdx); context.EmitCall(type, name); }
public static void EmitBinaryMathCall(ILEmitterCtx context, string name) { IOpCodeSimd64 op = (IOpCodeSimd64)context.CurrOp; int sizeF = op.Size & 1; MethodInfo mthdInfo; if (sizeF == 0) { mthdInfo = typeof(MathF).GetMethod(name, new Type[] { typeof(float), typeof(float) }); } else /* if (sizeF == 1) */ { mthdInfo = typeof(Math).GetMethod(name, new Type[] { typeof(double), typeof(double) }); } context.EmitCall(mthdInfo); }
private static void EmitNaNCheck(ILEmitterCtx context, int reg) { IOpCodeSimd64 op = (IOpCodeSimd64)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 EmitRoundMathCall(ILEmitterCtx context, MidpointRounding roundMode) { IOpCodeSimd64 op = (IOpCodeSimd64)context.CurrOp; int sizeF = op.Size & 1; MethodInfo mthdInfo; if (sizeF == 0) { mthdInfo = typeof(MathF).GetMethod(nameof(MathF.Round), new Type[] { typeof(float), typeof(MidpointRounding) }); } else /* if (sizeF == 1) */ { mthdInfo = typeof(Math).GetMethod(nameof(Math.Round), new Type[] { typeof(double), typeof(MidpointRounding) }); } context.EmitLdc_I4((int)roundMode); context.EmitCall(mthdInfo); }