public static void Mufu(EmitterContext context) { InstMufu op = context.GetOp <InstMufu>(); Operand res = context.FPAbsNeg(GetSrcReg(context, op.SrcA), op.AbsA, op.NegA); switch (op.MufuOp) { case MufuOp.Cos: res = context.FPCosine(res); break; case MufuOp.Sin: res = context.FPSine(res); break; case MufuOp.Ex2: res = context.FPExponentB2(res); break; case MufuOp.Lg2: res = context.FPLogarithmB2(res); break; case MufuOp.Rcp: res = context.FPReciprocal(res); break; case MufuOp.Rsq: res = context.FPReciprocalSquareRoot(res); break; case MufuOp.Rcp64h: res = context.PackDouble2x32(OperandHelper.Const(0), res); res = context.UnpackDouble2x32High(context.FPReciprocal(res, Instruction.FP64)); break; case MufuOp.Rsq64h: res = context.PackDouble2x32(OperandHelper.Const(0), res); res = context.UnpackDouble2x32High(context.FPReciprocalSquareRoot(res, Instruction.FP64)); break; case MufuOp.Sqrt: res = context.FPSquareRoot(res); break; default: context.Config.GpuAccessor.Log($"Invalid MUFU operation \"{op.MufuOp}\"."); break; } context.Copy(GetDest(op.Dest), context.FPSaturate(res, op.Sat)); }
public static void Mufu(EmitterContext context) { InstMufu op = context.GetOp <InstMufu>(); Operand res = context.FPAbsNeg(GetSrcReg(context, op.SrcA), op.AbsA, op.NegA); switch (op.MufuOp) { case MufuOp.Cos: res = context.FPCosine(res); break; case MufuOp.Sin: res = context.FPSine(res); break; case MufuOp.Ex2: res = context.FPExponentB2(res); break; case MufuOp.Lg2: res = context.FPLogarithmB2(res); break; case MufuOp.Rcp: res = context.FPReciprocal(res); break; case MufuOp.Rsq: res = context.FPReciprocalSquareRoot(res); break; case MufuOp.Sqrt: res = context.FPSquareRoot(res); break; default: /* TODO */ break; } context.Copy(GetDest(op.Dest), context.FPSaturate(res, op.Sat)); }