示例#1
0
        private static void EmitIadd(
            EmitterContext context,
            Operand srcA,
            Operand srcB,
            int rd,
            AvgMode avgMode,
            bool extended,
            bool writeCC)
        {
            srcA = context.INegate(srcA, avgMode == AvgMode.NegA);
            srcB = context.INegate(srcB, avgMode == AvgMode.NegB);

            Operand res = context.IAdd(srcA, srcB);

            if (extended)
            {
                res = context.IAdd(res, context.BitwiseAnd(GetCF(), Const(1)));
            }

            SetIaddFlags(context, res, srcA, srcB, writeCC, extended);

            // TODO: SAT.

            context.Copy(GetDest(rd), res);
        }
示例#2
0
        private static void EmitImad(
            EmitterContext context,
            Operand srcA,
            Operand srcB,
            Operand srcC,
            int rd,
            AvgMode avgMode,
            bool signedA,
            bool signedB,
            bool high)
        {
            srcB = context.INegate(srcB, avgMode == AvgMode.NegA);
            srcC = context.INegate(srcC, avgMode == AvgMode.NegB);

            Operand res;

            if (high)
            {
                if (signedA && signedB)
                {
                    res = context.MultiplyHighS32(srcA, srcB);
                }
                else
                {
                    res = context.MultiplyHighU32(srcA, srcB);

                    if (signedA)
                    {
                        res = context.IAdd(res, context.IMultiply(srcB, context.ShiftRightS32(srcA, Const(31))));
                    }
                    else if (signedB)
                    {
                        res = context.IAdd(res, context.IMultiply(srcA, context.ShiftRightS32(srcB, Const(31))));
                    }
                }
            }
            else
            {
                res = context.IMultiply(srcA, srcB);
            }

            if (srcC.Type != OperandType.Constant || srcC.Value != 0)
            {
                res = context.IAdd(res, srcC);
            }

            // TODO: CC, X, SAT, and more?

            context.Copy(GetDest(rd), res);
        }
示例#3
0
        private static void EmitIscadd(
            EmitterContext context,
            Operand srcA,
            Operand srcB,
            int rd,
            int shift,
            AvgMode avgMode,
            bool writeCC)
        {
            srcA = context.ShiftLeft(srcA, Const(shift));

            srcA = context.INegate(srcA, avgMode == AvgMode.NegA);
            srcB = context.INegate(srcB, avgMode == AvgMode.NegB);

            Operand res = context.IAdd(srcA, srcB);

            SetIaddFlags(context, res, srcA, srcB, writeCC, false);

            context.Copy(GetDest(rd), res);
        }