Example #1
0
        public static long BinarySignedSatQAcc(ulong op1, long op2, AThreadState State)
        {
            if (op1 <= (ulong)long.MaxValue)
            {
                // op1 from ulong.MinValue to (ulong)long.MaxValue
                // op2 from long.MinValue to long.MaxValue

                long Add = (long)op1 + op2;

                if ((~op2 & Add) < 0L)
                {
                    State.SetFpsrFlag(FPSR.QC);

                    return(long.MaxValue);
                }
                else
                {
                    return(Add);
                }
            }
            else if (op2 >= 0L)
            {
                // op1 from (ulong)long.MaxValue + 1UL to ulong.MaxValue
                // op2 from (long)ulong.MinValue to long.MaxValue

                State.SetFpsrFlag(FPSR.QC);

                return(long.MaxValue);
            }
            else
            {
                // op1 from (ulong)long.MaxValue + 1UL to ulong.MaxValue
                // op2 from long.MinValue to (long)ulong.MinValue - 1L

                ulong Add = op1 + (ulong)op2;

                if (Add > (ulong)long.MaxValue)
                {
                    State.SetFpsrFlag(FPSR.QC);

                    return(long.MaxValue);
                }
                else
                {
                    return((long)Add);
                }
            }
        }
Example #2
0
        public static ulong BinaryUnsignedSatQAcc(long op1, ulong op2, AThreadState State)
        {
            if (op1 >= 0L)
            {
                // op1 from (long)ulong.MinValue to long.MaxValue
                // op2 from ulong.MinValue to ulong.MaxValue

                ulong Add = (ulong)op1 + op2;

                if ((Add < (ulong)op1) && (Add < op2))
                {
                    State.SetFpsrFlag(FPSR.QC);

                    return(ulong.MaxValue);
                }
                else
                {
                    return(Add);
                }
            }
            else if (op2 > (ulong)long.MaxValue)
            {
                // op1 from long.MinValue to (long)ulong.MinValue - 1L
                // op2 from (ulong)long.MaxValue + 1UL to ulong.MaxValue

                return((ulong)op1 + op2);
            }
            else
            {
                // op1 from long.MinValue to (long)ulong.MinValue - 1L
                // op2 from ulong.MinValue to (ulong)long.MaxValue

                long Add = op1 + (long)op2;

                if (Add < (long)ulong.MinValue)
                {
                    State.SetFpsrFlag(FPSR.QC);

                    return(ulong.MinValue);
                }
                else
                {
                    return((ulong)Add);
                }
            }
        }
Example #3
0
        public static long UnarySignedSatQAbsOrNeg(long op, AThreadState State)
        {
            if (op == long.MinValue)
            {
                State.SetFpsrFlag(FPSR.QC);

                return(long.MaxValue);
            }
            else
            {
                return(op);
            }
        }
Example #4
0
        public static ulong BinaryUnsignedSatQSub(ulong op1, ulong op2, AThreadState State)
        {
            ulong Sub = op1 - op2;

            if (op1 < op2)
            {
                State.SetFpsrFlag(FPSR.QC);

                return(ulong.MinValue);
            }
            else
            {
                return(Sub);
            }
        }
Example #5
0
        public static ulong BinaryUnsignedSatQAdd(ulong op1, ulong op2, AThreadState State)
        {
            ulong Add = op1 + op2;

            if ((Add < op1) && (Add < op2))
            {
                State.SetFpsrFlag(FPSR.QC);

                return(ulong.MaxValue);
            }
            else
            {
                return(Add);
            }
        }
Example #6
0
        public static ulong SignedSrcUnsignedDstSatQ(long op, int Size, AThreadState State)
        {
            int ESize = 8 << Size;

            ulong TMaxValue = (1UL << ESize) - 1UL;
            ulong TMinValue = 0UL;

            if (op > (long)TMaxValue)
            {
                State.SetFpsrFlag(FPSR.QC);

                return(TMaxValue);
            }
            else if (op < (long)TMinValue)
            {
                State.SetFpsrFlag(FPSR.QC);

                return(TMinValue);
            }
            else
            {
                return((ulong)op);
            }
        }
Example #7
0
        public static long SignedSrcSignedDstSatQ(long op, int Size, AThreadState State)
        {
            int ESize = 8 << Size;

            long TMaxValue = (1L << (ESize - 1)) - 1L;
            long TMinValue = -(1L << (ESize - 1));

            if (op > TMaxValue)
            {
                State.SetFpsrFlag(FPSR.QC);

                return(TMaxValue);
            }
            else if (op < TMinValue)
            {
                State.SetFpsrFlag(FPSR.QC);

                return(TMinValue);
            }
            else
            {
                return(op);
            }
        }
Example #8
0
        public static long UnsignedSrcSignedDstSatQ(ulong op, int Size, AThreadState State)
        {
            int ESize = 8 << Size;

            long TMaxValue = (1L << (ESize - 1)) - 1L;

            if (op > (ulong)TMaxValue)
            {
                State.SetFpsrFlag(FPSR.QC);

                return(TMaxValue);
            }
            else
            {
                return((long)op);
            }
        }
Example #9
0
        public static long BinarySignedSatQSub(long op1, long op2, AThreadState State)
        {
            long Sub = op1 - op2;

            if (((op1 ^ op2) & (op1 ^ Sub)) < 0L)
            {
                State.SetFpsrFlag(FPSR.QC);

                if (op1 < 0L)
                {
                    return(long.MinValue);
                }
                else
                {
                    return(long.MaxValue);
                }
            }
            else
            {
                return(Sub);
            }
        }
Example #10
0
        public static long BinarySignedSatQAdd(long op1, long op2, AThreadState State)
        {
            long Add = op1 + op2;

            if ((~(op1 ^ op2) & (op1 ^ Add)) < 0L)
            {
                State.SetFpsrFlag(FPSR.QC);

                if (op1 < 0L)
                {
                    return(long.MinValue);
                }
                else
                {
                    return(long.MaxValue);
                }
            }
            else
            {
                return(Add);
            }
        }