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));
        }
Beispiel #2
0
        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));
        }