mediaop.isa revision 6594
16516Sgblack@eecs.umich.edu/// Copyright (c) 2009 The Regents of The University of Michigan
26516Sgblack@eecs.umich.edu// All rights reserved.
36516Sgblack@eecs.umich.edu//
46516Sgblack@eecs.umich.edu// Redistribution and use in source and binary forms, with or without
56516Sgblack@eecs.umich.edu// modification, are permitted provided that the following conditions are
66516Sgblack@eecs.umich.edu// met: redistributions of source code must retain the above copyright
76516Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer;
86516Sgblack@eecs.umich.edu// redistributions in binary form must reproduce the above copyright
96516Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer in the
106516Sgblack@eecs.umich.edu// documentation and/or other materials provided with the distribution;
116516Sgblack@eecs.umich.edu// neither the name of the copyright holders nor the names of its
126516Sgblack@eecs.umich.edu// contributors may be used to endorse or promote products derived from
136516Sgblack@eecs.umich.edu// this software without specific prior written permission.
146516Sgblack@eecs.umich.edu//
156516Sgblack@eecs.umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
166516Sgblack@eecs.umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
176516Sgblack@eecs.umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
186516Sgblack@eecs.umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
196516Sgblack@eecs.umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
206516Sgblack@eecs.umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
216516Sgblack@eecs.umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
226516Sgblack@eecs.umich.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
236516Sgblack@eecs.umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
246516Sgblack@eecs.umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
256516Sgblack@eecs.umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
266516Sgblack@eecs.umich.edu//
276516Sgblack@eecs.umich.edu// Authors: Gabe Black
286516Sgblack@eecs.umich.edu
296516Sgblack@eecs.umich.edudef template MediaOpExecute {{
306516Sgblack@eecs.umich.edu        Fault %(class_name)s::execute(%(CPU_exec_context)s *xc,
316516Sgblack@eecs.umich.edu                Trace::InstRecord *traceData) const
326516Sgblack@eecs.umich.edu        {
336516Sgblack@eecs.umich.edu            Fault fault = NoFault;
346516Sgblack@eecs.umich.edu
356516Sgblack@eecs.umich.edu            %(op_decl)s;
366516Sgblack@eecs.umich.edu            %(op_rd)s;
376516Sgblack@eecs.umich.edu
386516Sgblack@eecs.umich.edu            %(code)s;
396516Sgblack@eecs.umich.edu
406516Sgblack@eecs.umich.edu            //Write the resulting state to the execution context
416516Sgblack@eecs.umich.edu            if(fault == NoFault)
426516Sgblack@eecs.umich.edu            {
436516Sgblack@eecs.umich.edu                %(op_wb)s;
446516Sgblack@eecs.umich.edu            }
456516Sgblack@eecs.umich.edu            return fault;
466516Sgblack@eecs.umich.edu        }
476516Sgblack@eecs.umich.edu}};
486516Sgblack@eecs.umich.edu
496516Sgblack@eecs.umich.edudef template MediaOpRegDeclare {{
506516Sgblack@eecs.umich.edu    class %(class_name)s : public %(base_class)s
516516Sgblack@eecs.umich.edu    {
526516Sgblack@eecs.umich.edu      protected:
536516Sgblack@eecs.umich.edu        void buildMe();
546516Sgblack@eecs.umich.edu
556516Sgblack@eecs.umich.edu      public:
566516Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst _machInst,
576516Sgblack@eecs.umich.edu                const char * instMnem,
586516Sgblack@eecs.umich.edu                bool isMicro, bool isDelayed, bool isFirst, bool isLast,
596516Sgblack@eecs.umich.edu                InstRegIndex _src1, InstRegIndex _src2, InstRegIndex _dest,
606545Sgblack@eecs.umich.edu                uint8_t _srcSize, uint8_t _destSize, uint16_t _ext);
616516Sgblack@eecs.umich.edu
626516Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst _machInst,
636516Sgblack@eecs.umich.edu                const char * instMnem,
646516Sgblack@eecs.umich.edu                InstRegIndex _src1, InstRegIndex _src2, InstRegIndex _dest,
656545Sgblack@eecs.umich.edu                uint8_t _srcSize, uint8_t _destSize, uint16_t _ext);
666516Sgblack@eecs.umich.edu
676516Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
686516Sgblack@eecs.umich.edu    };
696516Sgblack@eecs.umich.edu}};
706516Sgblack@eecs.umich.edu
716516Sgblack@eecs.umich.edudef template MediaOpImmDeclare {{
726516Sgblack@eecs.umich.edu
736516Sgblack@eecs.umich.edu    class %(class_name)s : public %(base_class)s
746516Sgblack@eecs.umich.edu    {
756516Sgblack@eecs.umich.edu      protected:
766516Sgblack@eecs.umich.edu        void buildMe();
776516Sgblack@eecs.umich.edu
786516Sgblack@eecs.umich.edu      public:
796516Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst _machInst,
806516Sgblack@eecs.umich.edu                const char * instMnem,
816516Sgblack@eecs.umich.edu                bool isMicro, bool isDelayed, bool isFirst, bool isLast,
826516Sgblack@eecs.umich.edu                InstRegIndex _src1, uint16_t _imm8, InstRegIndex _dest,
836545Sgblack@eecs.umich.edu                uint8_t _srcSize, uint8_t _destSize, uint16_t _ext);
846516Sgblack@eecs.umich.edu
856516Sgblack@eecs.umich.edu        %(class_name)s(ExtMachInst _machInst,
866516Sgblack@eecs.umich.edu                const char * instMnem,
876516Sgblack@eecs.umich.edu                InstRegIndex _src1, uint16_t _imm8, InstRegIndex _dest,
886545Sgblack@eecs.umich.edu                uint8_t _srcSize, uint8_t _destSize, uint16_t _ext);
896516Sgblack@eecs.umich.edu
906516Sgblack@eecs.umich.edu        %(BasicExecDeclare)s
916516Sgblack@eecs.umich.edu    };
926516Sgblack@eecs.umich.edu}};
936516Sgblack@eecs.umich.edu
946516Sgblack@eecs.umich.edudef template MediaOpRegConstructor {{
956516Sgblack@eecs.umich.edu
966516Sgblack@eecs.umich.edu    inline void %(class_name)s::buildMe()
976516Sgblack@eecs.umich.edu    {
986516Sgblack@eecs.umich.edu        %(constructor)s;
996516Sgblack@eecs.umich.edu    }
1006516Sgblack@eecs.umich.edu
1016516Sgblack@eecs.umich.edu    inline %(class_name)s::%(class_name)s(
1026516Sgblack@eecs.umich.edu            ExtMachInst machInst, const char * instMnem,
1036516Sgblack@eecs.umich.edu            InstRegIndex _src1, InstRegIndex _src2, InstRegIndex _dest,
1046545Sgblack@eecs.umich.edu            uint8_t _srcSize, uint8_t _destSize, uint16_t _ext) :
1056516Sgblack@eecs.umich.edu        %(base_class)s(machInst, "%(mnemonic)s", instMnem,
1066516Sgblack@eecs.umich.edu                false, false, false, false,
1076545Sgblack@eecs.umich.edu                _src1, _src2, _dest, _srcSize, _destSize, _ext,
1086516Sgblack@eecs.umich.edu                %(op_class)s)
1096516Sgblack@eecs.umich.edu    {
1106516Sgblack@eecs.umich.edu        buildMe();
1116516Sgblack@eecs.umich.edu    }
1126516Sgblack@eecs.umich.edu
1136516Sgblack@eecs.umich.edu    inline %(class_name)s::%(class_name)s(
1146516Sgblack@eecs.umich.edu            ExtMachInst machInst, const char * instMnem,
1156516Sgblack@eecs.umich.edu            bool isMicro, bool isDelayed, bool isFirst, bool isLast,
1166516Sgblack@eecs.umich.edu            InstRegIndex _src1, InstRegIndex _src2, InstRegIndex _dest,
1176545Sgblack@eecs.umich.edu            uint8_t _srcSize, uint8_t _destSize, uint16_t _ext) :
1186516Sgblack@eecs.umich.edu        %(base_class)s(machInst, "%(mnemonic)s", instMnem,
1196516Sgblack@eecs.umich.edu                isMicro, isDelayed, isFirst, isLast,
1206545Sgblack@eecs.umich.edu                _src1, _src2, _dest, _srcSize, _destSize, _ext,
1216516Sgblack@eecs.umich.edu                %(op_class)s)
1226516Sgblack@eecs.umich.edu    {
1236516Sgblack@eecs.umich.edu        buildMe();
1246516Sgblack@eecs.umich.edu    }
1256516Sgblack@eecs.umich.edu}};
1266516Sgblack@eecs.umich.edu
1276516Sgblack@eecs.umich.edudef template MediaOpImmConstructor {{
1286516Sgblack@eecs.umich.edu
1296516Sgblack@eecs.umich.edu    inline void %(class_name)s::buildMe()
1306516Sgblack@eecs.umich.edu    {
1316516Sgblack@eecs.umich.edu        %(constructor)s;
1326516Sgblack@eecs.umich.edu    }
1336516Sgblack@eecs.umich.edu
1346516Sgblack@eecs.umich.edu    inline %(class_name)s::%(class_name)s(
1356516Sgblack@eecs.umich.edu            ExtMachInst machInst, const char * instMnem,
1366516Sgblack@eecs.umich.edu            InstRegIndex _src1, uint16_t _imm8, InstRegIndex _dest,
1376545Sgblack@eecs.umich.edu            uint8_t _srcSize, uint8_t _destSize, uint16_t _ext) :
1386516Sgblack@eecs.umich.edu        %(base_class)s(machInst, "%(mnemonic)s", instMnem,
1396516Sgblack@eecs.umich.edu                false, false, false, false,
1406545Sgblack@eecs.umich.edu                _src1, _imm8, _dest, _srcSize, _destSize, _ext,
1416516Sgblack@eecs.umich.edu                %(op_class)s)
1426516Sgblack@eecs.umich.edu    {
1436516Sgblack@eecs.umich.edu        buildMe();
1446516Sgblack@eecs.umich.edu    }
1456516Sgblack@eecs.umich.edu
1466516Sgblack@eecs.umich.edu    inline %(class_name)s::%(class_name)s(
1476516Sgblack@eecs.umich.edu            ExtMachInst machInst, const char * instMnem,
1486516Sgblack@eecs.umich.edu            bool isMicro, bool isDelayed, bool isFirst, bool isLast,
1496516Sgblack@eecs.umich.edu            InstRegIndex _src1, uint16_t _imm8, InstRegIndex _dest,
1506545Sgblack@eecs.umich.edu            uint8_t _srcSize, uint8_t _destSize, uint16_t _ext) :
1516516Sgblack@eecs.umich.edu        %(base_class)s(machInst, "%(mnemonic)s", instMnem,
1526516Sgblack@eecs.umich.edu                isMicro, isDelayed, isFirst, isLast,
1536545Sgblack@eecs.umich.edu                _src1, _imm8, _dest, _srcSize, _destSize, _ext,
1546516Sgblack@eecs.umich.edu                %(op_class)s)
1556516Sgblack@eecs.umich.edu    {
1566516Sgblack@eecs.umich.edu        buildMe();
1576516Sgblack@eecs.umich.edu    }
1586516Sgblack@eecs.umich.edu}};
1596516Sgblack@eecs.umich.edu
1606516Sgblack@eecs.umich.edulet {{
1616516Sgblack@eecs.umich.edu    # Make these empty strings so that concatenating onto
1626516Sgblack@eecs.umich.edu    # them will always work.
1636516Sgblack@eecs.umich.edu    header_output = ""
1646516Sgblack@eecs.umich.edu    decoder_output = ""
1656516Sgblack@eecs.umich.edu    exec_output = ""
1666516Sgblack@eecs.umich.edu
1676516Sgblack@eecs.umich.edu    immTemplates = (
1686516Sgblack@eecs.umich.edu            MediaOpImmDeclare,
1696516Sgblack@eecs.umich.edu            MediaOpImmConstructor,
1706516Sgblack@eecs.umich.edu            MediaOpExecute)
1716516Sgblack@eecs.umich.edu
1726516Sgblack@eecs.umich.edu    regTemplates = (
1736516Sgblack@eecs.umich.edu            MediaOpRegDeclare,
1746516Sgblack@eecs.umich.edu            MediaOpRegConstructor,
1756516Sgblack@eecs.umich.edu            MediaOpExecute)
1766516Sgblack@eecs.umich.edu
1776516Sgblack@eecs.umich.edu    class MediaOpMeta(type):
1786516Sgblack@eecs.umich.edu        def buildCppClasses(self, name, Name, suffix, code):
1796516Sgblack@eecs.umich.edu
1806516Sgblack@eecs.umich.edu            # Globals to stick the output in
1816516Sgblack@eecs.umich.edu            global header_output
1826516Sgblack@eecs.umich.edu            global decoder_output
1836516Sgblack@eecs.umich.edu            global exec_output
1846516Sgblack@eecs.umich.edu
1856516Sgblack@eecs.umich.edu            # If op2 is used anywhere, make register and immediate versions
1866516Sgblack@eecs.umich.edu            # of this code.
1876516Sgblack@eecs.umich.edu            matcher = re.compile("(?<!\\w)(?P<prefix>s?)op2(?P<typeQual>\\.\\w+)?")
1886516Sgblack@eecs.umich.edu            match = matcher.search(code)
1896516Sgblack@eecs.umich.edu            if match:
1906516Sgblack@eecs.umich.edu                typeQual = ""
1916516Sgblack@eecs.umich.edu                if match.group("typeQual"):
1926516Sgblack@eecs.umich.edu                    typeQual = match.group("typeQual")
1936583Sgblack@eecs.umich.edu                src2_name = "%sFpSrcReg2%s" % (match.group("prefix"), typeQual)
1946516Sgblack@eecs.umich.edu                self.buildCppClasses(name, Name, suffix,
1956516Sgblack@eecs.umich.edu                        matcher.sub(src2_name, code))
1966516Sgblack@eecs.umich.edu                self.buildCppClasses(name + "i", Name, suffix + "Imm",
1976516Sgblack@eecs.umich.edu                        matcher.sub("imm8", code))
1986516Sgblack@eecs.umich.edu                return
1996516Sgblack@eecs.umich.edu
2006516Sgblack@eecs.umich.edu            base = "X86ISA::MediaOp"
2016516Sgblack@eecs.umich.edu
2026516Sgblack@eecs.umich.edu            # If imm8 shows up in the code, use the immediate templates, if
2036516Sgblack@eecs.umich.edu            # not, hopefully the register ones will be correct.
2046516Sgblack@eecs.umich.edu            matcher = re.compile("(?<!\w)imm8(?!\w)")
2056516Sgblack@eecs.umich.edu            if matcher.search(code):
2066516Sgblack@eecs.umich.edu                base += "Imm"
2076516Sgblack@eecs.umich.edu                templates = immTemplates
2086516Sgblack@eecs.umich.edu            else:
2096516Sgblack@eecs.umich.edu                base += "Reg"
2106516Sgblack@eecs.umich.edu                templates = regTemplates
2116516Sgblack@eecs.umich.edu
2126516Sgblack@eecs.umich.edu            # Get everything ready for the substitution
2136516Sgblack@eecs.umich.edu            iop = InstObjParams(name, Name + suffix, base, {"code" : code})
2146516Sgblack@eecs.umich.edu
2156516Sgblack@eecs.umich.edu            # Generate the actual code (finally!)
2166516Sgblack@eecs.umich.edu            header_output += templates[0].subst(iop)
2176516Sgblack@eecs.umich.edu            decoder_output += templates[1].subst(iop)
2186516Sgblack@eecs.umich.edu            exec_output += templates[2].subst(iop)
2196516Sgblack@eecs.umich.edu
2206516Sgblack@eecs.umich.edu
2216516Sgblack@eecs.umich.edu        def __new__(mcls, Name, bases, dict):
2226516Sgblack@eecs.umich.edu            abstract = False
2236516Sgblack@eecs.umich.edu            name = Name.lower()
2246516Sgblack@eecs.umich.edu            if "abstract" in dict:
2256516Sgblack@eecs.umich.edu                abstract = dict['abstract']
2266516Sgblack@eecs.umich.edu                del dict['abstract']
2276516Sgblack@eecs.umich.edu
2286516Sgblack@eecs.umich.edu            cls = super(MediaOpMeta, mcls).__new__(mcls, Name, bases, dict)
2296516Sgblack@eecs.umich.edu            if not abstract:
2306516Sgblack@eecs.umich.edu                cls.className = Name
2316516Sgblack@eecs.umich.edu                cls.base_mnemonic = name
2326516Sgblack@eecs.umich.edu                code = cls.code
2336516Sgblack@eecs.umich.edu
2346516Sgblack@eecs.umich.edu                # Set up the C++ classes
2356516Sgblack@eecs.umich.edu                mcls.buildCppClasses(cls, name, Name, "", code)
2366516Sgblack@eecs.umich.edu
2376516Sgblack@eecs.umich.edu                # Hook into the microassembler dict
2386516Sgblack@eecs.umich.edu                global microopClasses
2396516Sgblack@eecs.umich.edu                microopClasses[name] = cls
2406516Sgblack@eecs.umich.edu
2416516Sgblack@eecs.umich.edu                # If op2 is used anywhere, make register and immediate versions
2426516Sgblack@eecs.umich.edu                # of this code.
2436516Sgblack@eecs.umich.edu                matcher = re.compile("op2(?P<typeQual>\\.\\w+)?")
2446516Sgblack@eecs.umich.edu                if matcher.search(code):
2456516Sgblack@eecs.umich.edu                    microopClasses[name + 'i'] = cls
2466516Sgblack@eecs.umich.edu            return cls
2476516Sgblack@eecs.umich.edu
2486516Sgblack@eecs.umich.edu
2496516Sgblack@eecs.umich.edu    class MediaOp(X86Microop):
2506516Sgblack@eecs.umich.edu        __metaclass__ = MediaOpMeta
2516516Sgblack@eecs.umich.edu        # This class itself doesn't act as a microop
2526516Sgblack@eecs.umich.edu        abstract = True
2536516Sgblack@eecs.umich.edu
2546516Sgblack@eecs.umich.edu        def __init__(self, dest, src1, op2,
2556545Sgblack@eecs.umich.edu                size = None, destSize = None, srcSize = None, ext = None):
2566516Sgblack@eecs.umich.edu            self.dest = dest
2576516Sgblack@eecs.umich.edu            self.src1 = src1
2586516Sgblack@eecs.umich.edu            self.op2 = op2
2596516Sgblack@eecs.umich.edu            if size is not None:
2606516Sgblack@eecs.umich.edu                self.srcSize = size
2616516Sgblack@eecs.umich.edu                self.destSize = size
2626516Sgblack@eecs.umich.edu            if srcSize is not None:
2636516Sgblack@eecs.umich.edu                self.srcSize = srcSize
2646516Sgblack@eecs.umich.edu            if destSize is not None:
2656516Sgblack@eecs.umich.edu                self.destSize = destSize
2666516Sgblack@eecs.umich.edu            if self.srcSize is None:
2676516Sgblack@eecs.umich.edu                raise Exception, "Source size not set."
2686516Sgblack@eecs.umich.edu            if self.destSize is None:
2696516Sgblack@eecs.umich.edu                raise Exception, "Dest size not set."
2706545Sgblack@eecs.umich.edu            if ext is None:
2716545Sgblack@eecs.umich.edu                self.ext = 0
2726516Sgblack@eecs.umich.edu            else:
2736545Sgblack@eecs.umich.edu                self.ext = ext 
2746516Sgblack@eecs.umich.edu
2756516Sgblack@eecs.umich.edu        def getAllocator(self, *microFlags):
2766516Sgblack@eecs.umich.edu            className = self.className
2776516Sgblack@eecs.umich.edu            if self.mnemonic == self.base_mnemonic + 'i':
2786516Sgblack@eecs.umich.edu                className += "Imm"
2796516Sgblack@eecs.umich.edu            allocator = '''new %(class_name)s(machInst, macrocodeBlock
2806516Sgblack@eecs.umich.edu                    %(flags)s, %(src1)s, %(op2)s, %(dest)s,
2816545Sgblack@eecs.umich.edu                    %(srcSize)s, %(destSize)s, %(ext)s)''' % {
2826516Sgblack@eecs.umich.edu                "class_name" : className,
2836516Sgblack@eecs.umich.edu                "flags" : self.microFlagsText(microFlags),
2846516Sgblack@eecs.umich.edu                "src1" : self.src1, "op2" : self.op2,
2856516Sgblack@eecs.umich.edu                "dest" : self.dest,
2866516Sgblack@eecs.umich.edu                "srcSize" : self.srcSize,
2876516Sgblack@eecs.umich.edu                "destSize" : self.destSize,
2886545Sgblack@eecs.umich.edu                "ext" : self.ext}
2896516Sgblack@eecs.umich.edu            return allocator
2906516Sgblack@eecs.umich.edu
2916516Sgblack@eecs.umich.edu    class Mov2int(MediaOp):
2926589Sgblack@eecs.umich.edu        def __init__(self, dest, src1, src2 = 0, \
2936545Sgblack@eecs.umich.edu                size = None, destSize = None, srcSize = None, ext = None):
2946589Sgblack@eecs.umich.edu            super(Mov2int, self).__init__(dest, src1,\
2956589Sgblack@eecs.umich.edu                    src2, size, destSize, srcSize, ext)
2966516Sgblack@eecs.umich.edu        code = '''
2976589Sgblack@eecs.umich.edu            int items = sizeof(FloatRegBits) / srcSize;
2986589Sgblack@eecs.umich.edu            int offset = imm8;
2996589Sgblack@eecs.umich.edu            if (bits(src1, 0) && (ext & 0x1))
3006589Sgblack@eecs.umich.edu                offset -= items;
3016589Sgblack@eecs.umich.edu            if (offset >= 0 && offset < items) {
3026589Sgblack@eecs.umich.edu                uint64_t fpSrcReg1 =
3036589Sgblack@eecs.umich.edu                    bits(FpSrcReg1.uqw,
3046589Sgblack@eecs.umich.edu                            (offset + 1) * srcSize * 8 - 1,
3056589Sgblack@eecs.umich.edu                            (offset + 0) * srcSize * 8);
3066589Sgblack@eecs.umich.edu                DestReg = merge(0, fpSrcReg1, destSize);
3076589Sgblack@eecs.umich.edu            } else {
3086589Sgblack@eecs.umich.edu                DestReg = DestReg;
3096589Sgblack@eecs.umich.edu            }
3106516Sgblack@eecs.umich.edu        '''
3116516Sgblack@eecs.umich.edu
3126516Sgblack@eecs.umich.edu    class Mov2fp(MediaOp):
3136589Sgblack@eecs.umich.edu        def __init__(self, dest, src1, src2 = 0, \
3146545Sgblack@eecs.umich.edu                size = None, destSize = None, srcSize = None, ext = None):
3156589Sgblack@eecs.umich.edu            super(Mov2fp, self).__init__(dest, src1,\
3166589Sgblack@eecs.umich.edu                    src2, size, destSize, srcSize, ext)
3176516Sgblack@eecs.umich.edu        code = '''
3186589Sgblack@eecs.umich.edu            int items = sizeof(FloatRegBits) / destSize;
3196589Sgblack@eecs.umich.edu            int offset = imm8;
3206589Sgblack@eecs.umich.edu            if (bits(dest, 0) && (ext & 0x1))
3216589Sgblack@eecs.umich.edu                offset -= items;
3226589Sgblack@eecs.umich.edu            if (offset >= 0 && offset < items) {
3236589Sgblack@eecs.umich.edu                uint64_t srcReg1 = pick(SrcReg1, 0, srcSize);
3246589Sgblack@eecs.umich.edu                FpDestReg.uqw =
3256589Sgblack@eecs.umich.edu                    insertBits(FpDestReg.uqw,
3266589Sgblack@eecs.umich.edu                            (offset + 1) * destSize * 8 - 1,
3276589Sgblack@eecs.umich.edu                            (offset + 0) * destSize * 8, srcReg1);
3286589Sgblack@eecs.umich.edu            } else {
3296589Sgblack@eecs.umich.edu                FpDestReg.uqw = FpDestReg.uqw;
3306589Sgblack@eecs.umich.edu            }
3316516Sgblack@eecs.umich.edu        '''
3326521Sgblack@eecs.umich.edu
3336592Sgblack@eecs.umich.edu    class Movsign(MediaOp):
3346592Sgblack@eecs.umich.edu        def __init__(self, dest, src, \
3356592Sgblack@eecs.umich.edu                size = None, destSize = None, srcSize = None, ext = None):
3366592Sgblack@eecs.umich.edu            super(Movsign, self).__init__(dest, src,\
3376592Sgblack@eecs.umich.edu                    "InstRegIndex(0)", size, destSize, srcSize, ext)
3386592Sgblack@eecs.umich.edu        code = '''
3396592Sgblack@eecs.umich.edu            int items = sizeof(FloatRegBits) / srcSize;
3406592Sgblack@eecs.umich.edu            uint64_t result = 0;
3416592Sgblack@eecs.umich.edu            int offset = (ext & 0x1) ? items : 0;
3426592Sgblack@eecs.umich.edu            for (int i = 0; i < items; i++) {
3436592Sgblack@eecs.umich.edu                uint64_t picked =
3446592Sgblack@eecs.umich.edu                    bits(FpSrcReg1.uqw, (i + 1) * 8 * srcSize - 1);
3456592Sgblack@eecs.umich.edu                result = insertBits(result, i + offset, i + offset, picked);
3466592Sgblack@eecs.umich.edu            }
3476592Sgblack@eecs.umich.edu            DestReg = DestReg | result;
3486592Sgblack@eecs.umich.edu        '''
3496592Sgblack@eecs.umich.edu
3506594Sgblack@eecs.umich.edu    class Maskmov(MediaOp):
3516594Sgblack@eecs.umich.edu        code = '''
3526594Sgblack@eecs.umich.edu            assert(srcSize == destSize);
3536594Sgblack@eecs.umich.edu            int size = srcSize;
3546594Sgblack@eecs.umich.edu            int sizeBits = size * 8;
3556594Sgblack@eecs.umich.edu            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
3566594Sgblack@eecs.umich.edu            uint64_t result = FpDestReg.uqw;
3576594Sgblack@eecs.umich.edu
3586594Sgblack@eecs.umich.edu            for (int i = 0; i < items; i++) {
3596594Sgblack@eecs.umich.edu                int hiIndex = (i + 1) * sizeBits - 1;
3606594Sgblack@eecs.umich.edu                int loIndex = (i + 0) * sizeBits;
3616594Sgblack@eecs.umich.edu                uint64_t arg1Bits = bits(FpSrcReg1.uqw, hiIndex, loIndex);
3626594Sgblack@eecs.umich.edu                if (bits(FpSrcReg2.uqw, hiIndex))
3636594Sgblack@eecs.umich.edu                    result = insertBits(result, hiIndex, loIndex, arg1Bits);
3646594Sgblack@eecs.umich.edu            }
3656594Sgblack@eecs.umich.edu            FpDestReg.uqw = result;
3666594Sgblack@eecs.umich.edu        '''
3676594Sgblack@eecs.umich.edu
3686521Sgblack@eecs.umich.edu    class Unpack(MediaOp):
3696521Sgblack@eecs.umich.edu        code = '''
3706521Sgblack@eecs.umich.edu            assert(srcSize == destSize);
3716521Sgblack@eecs.umich.edu            int size = destSize;
3726521Sgblack@eecs.umich.edu            int items = (sizeof(FloatRegBits) / size) / 2;
3736545Sgblack@eecs.umich.edu            int offset = ext ? items : 0;
3746521Sgblack@eecs.umich.edu            uint64_t result = 0;
3756521Sgblack@eecs.umich.edu            for (int i = 0; i < items; i++) {
3766521Sgblack@eecs.umich.edu                uint64_t pickedLow =
3776521Sgblack@eecs.umich.edu                    bits(FpSrcReg1.uqw, (i + offset + 1) * 8 * size - 1,
3786521Sgblack@eecs.umich.edu                                        (i + offset) * 8 * size);
3796521Sgblack@eecs.umich.edu                result = insertBits(result,
3806521Sgblack@eecs.umich.edu                                    (2 * i + 1) * 8 * size - 1,
3816521Sgblack@eecs.umich.edu                                    (2 * i + 0) * 8 * size,
3826521Sgblack@eecs.umich.edu                                    pickedLow);
3836521Sgblack@eecs.umich.edu                uint64_t pickedHigh =
3846521Sgblack@eecs.umich.edu                    bits(FpSrcReg2.uqw, (i + offset + 1) * 8 * size - 1,
3856521Sgblack@eecs.umich.edu                                        (i + offset) * 8 * size);
3866521Sgblack@eecs.umich.edu                result = insertBits(result,
3876521Sgblack@eecs.umich.edu                                    (2 * i + 2) * 8 * size - 1,
3886521Sgblack@eecs.umich.edu                                    (2 * i + 1) * 8 * size,
3896521Sgblack@eecs.umich.edu                                    pickedHigh);
3906521Sgblack@eecs.umich.edu            }
3916521Sgblack@eecs.umich.edu            FpDestReg.uqw = result;
3926521Sgblack@eecs.umich.edu        '''
3936534Sgblack@eecs.umich.edu
3946546Sgblack@eecs.umich.edu    class Pack(MediaOp):
3956546Sgblack@eecs.umich.edu        code = '''
3966546Sgblack@eecs.umich.edu            assert(srcSize == destSize * 2);
3976546Sgblack@eecs.umich.edu            int items = (sizeof(FloatRegBits) / destSize);
3986546Sgblack@eecs.umich.edu            int destBits = destSize * 8;
3996546Sgblack@eecs.umich.edu            int srcBits = srcSize * 8;
4006546Sgblack@eecs.umich.edu            uint64_t result = 0;
4016546Sgblack@eecs.umich.edu            int i;
4026546Sgblack@eecs.umich.edu            for (i = 0; i < items / 2; i++) {
4036546Sgblack@eecs.umich.edu                uint64_t picked =
4046546Sgblack@eecs.umich.edu                    bits(FpSrcReg1.uqw, (i + 1) * srcBits - 1,
4056546Sgblack@eecs.umich.edu                                        (i + 0) * srcBits);
4066546Sgblack@eecs.umich.edu                unsigned signBit = bits(picked, srcBits - 1);
4076546Sgblack@eecs.umich.edu                uint64_t overflow = bits(picked, srcBits - 1, destBits - 1);
4086546Sgblack@eecs.umich.edu
4096546Sgblack@eecs.umich.edu                // Handle saturation.
4106546Sgblack@eecs.umich.edu                if (signBit) {
4116546Sgblack@eecs.umich.edu                    if (overflow != mask(destBits - srcBits + 1)) {
4126546Sgblack@eecs.umich.edu                        if (ext & 0x1)
4136546Sgblack@eecs.umich.edu                            picked = (1 << (destBits - 1));
4146546Sgblack@eecs.umich.edu                        else
4156546Sgblack@eecs.umich.edu                            picked = 0;
4166546Sgblack@eecs.umich.edu                    }
4176546Sgblack@eecs.umich.edu                } else {
4186546Sgblack@eecs.umich.edu                    if (overflow != 0) {
4196546Sgblack@eecs.umich.edu                        if (ext & 0x1)
4206546Sgblack@eecs.umich.edu                            picked = mask(destBits - 1);
4216546Sgblack@eecs.umich.edu                        else
4226546Sgblack@eecs.umich.edu                            picked = mask(destBits);
4236546Sgblack@eecs.umich.edu                    }
4246546Sgblack@eecs.umich.edu                }
4256546Sgblack@eecs.umich.edu                result = insertBits(result,
4266546Sgblack@eecs.umich.edu                                    (i + 1) * destBits - 1,
4276546Sgblack@eecs.umich.edu                                    (i + 0) * destBits,
4286546Sgblack@eecs.umich.edu                                    picked);
4296546Sgblack@eecs.umich.edu            }
4306546Sgblack@eecs.umich.edu            for (;i < items; i++) {
4316546Sgblack@eecs.umich.edu                uint64_t picked =
4326546Sgblack@eecs.umich.edu                    bits(FpSrcReg2.uqw, (i - items + 1) * srcBits - 1,
4336546Sgblack@eecs.umich.edu                                        (i - items + 0) * srcBits);
4346546Sgblack@eecs.umich.edu                unsigned signBit = bits(picked, srcBits - 1);
4356546Sgblack@eecs.umich.edu                uint64_t overflow = bits(picked, srcBits - 1, destBits - 1);
4366546Sgblack@eecs.umich.edu
4376546Sgblack@eecs.umich.edu                // Handle saturation.
4386546Sgblack@eecs.umich.edu                if (signBit) {
4396546Sgblack@eecs.umich.edu                    if (overflow != mask(destBits - srcBits + 1)) {
4406546Sgblack@eecs.umich.edu                        if (ext & 0x1)
4416546Sgblack@eecs.umich.edu                            picked = (1 << (destBits - 1));
4426546Sgblack@eecs.umich.edu                        else
4436546Sgblack@eecs.umich.edu                            picked = 0;
4446546Sgblack@eecs.umich.edu                    }
4456546Sgblack@eecs.umich.edu                } else {
4466546Sgblack@eecs.umich.edu                    if (overflow != 0) {
4476546Sgblack@eecs.umich.edu                        if (ext & 0x1)
4486546Sgblack@eecs.umich.edu                            picked = mask(destBits - 1);
4496546Sgblack@eecs.umich.edu                        else
4506546Sgblack@eecs.umich.edu                            picked = mask(destBits);
4516546Sgblack@eecs.umich.edu                    }
4526546Sgblack@eecs.umich.edu                }
4536546Sgblack@eecs.umich.edu                result = insertBits(result,
4546546Sgblack@eecs.umich.edu                                    (i + 1) * destBits - 1,
4556546Sgblack@eecs.umich.edu                                    (i + 0) * destBits,
4566546Sgblack@eecs.umich.edu                                    picked);
4576546Sgblack@eecs.umich.edu            }
4586546Sgblack@eecs.umich.edu            FpDestReg.uqw = result;
4596546Sgblack@eecs.umich.edu        '''
4606546Sgblack@eecs.umich.edu
4616534Sgblack@eecs.umich.edu    class Mxor(MediaOp):
4626534Sgblack@eecs.umich.edu        def __init__(self, dest, src1, src2):
4636534Sgblack@eecs.umich.edu            super(Mxor, self).__init__(dest, src1, src2, 1)
4646534Sgblack@eecs.umich.edu        code = '''
4656534Sgblack@eecs.umich.edu            FpDestReg.uqw = FpSrcReg1.uqw ^ FpSrcReg2.uqw;
4666534Sgblack@eecs.umich.edu        '''
4676537Sgblack@eecs.umich.edu
4686537Sgblack@eecs.umich.edu    class Mor(MediaOp):
4696537Sgblack@eecs.umich.edu        def __init__(self, dest, src1, src2):
4706537Sgblack@eecs.umich.edu            super(Mor, self).__init__(dest, src1, src2, 1)
4716537Sgblack@eecs.umich.edu        code = '''
4726537Sgblack@eecs.umich.edu            FpDestReg.uqw = FpSrcReg1.uqw | FpSrcReg2.uqw;
4736537Sgblack@eecs.umich.edu        '''
4746539Sgblack@eecs.umich.edu
4756539Sgblack@eecs.umich.edu    class Mand(MediaOp):
4766539Sgblack@eecs.umich.edu        def __init__(self, dest, src1, src2):
4776539Sgblack@eecs.umich.edu            super(Mand, self).__init__(dest, src1, src2, 1)
4786539Sgblack@eecs.umich.edu        code = '''
4796539Sgblack@eecs.umich.edu            FpDestReg.uqw = FpSrcReg1.uqw & FpSrcReg2.uqw;
4806539Sgblack@eecs.umich.edu        '''
4816541Sgblack@eecs.umich.edu
4826541Sgblack@eecs.umich.edu    class Mandn(MediaOp):
4836541Sgblack@eecs.umich.edu        def __init__(self, dest, src1, src2):
4846541Sgblack@eecs.umich.edu            super(Mandn, self).__init__(dest, src1, src2, 1)
4856541Sgblack@eecs.umich.edu        code = '''
4866541Sgblack@eecs.umich.edu            FpDestReg.uqw = ~FpSrcReg1.uqw & FpSrcReg2.uqw;
4876541Sgblack@eecs.umich.edu        '''
4886548Sgblack@eecs.umich.edu
4896548Sgblack@eecs.umich.edu    class Mminf(MediaOp):
4906548Sgblack@eecs.umich.edu        code = '''
4916548Sgblack@eecs.umich.edu            union floatInt
4926548Sgblack@eecs.umich.edu            {
4936548Sgblack@eecs.umich.edu                float f;
4946548Sgblack@eecs.umich.edu                uint32_t i;
4956548Sgblack@eecs.umich.edu            };
4966548Sgblack@eecs.umich.edu            union doubleInt
4976548Sgblack@eecs.umich.edu            {
4986548Sgblack@eecs.umich.edu                double d;
4996548Sgblack@eecs.umich.edu                uint64_t i;
5006548Sgblack@eecs.umich.edu            };
5016548Sgblack@eecs.umich.edu
5026548Sgblack@eecs.umich.edu            assert(srcSize == destSize);
5036548Sgblack@eecs.umich.edu            int size = srcSize;
5046548Sgblack@eecs.umich.edu            int sizeBits = size * 8;
5056548Sgblack@eecs.umich.edu            assert(srcSize == 4 || srcSize == 8);
5066548Sgblack@eecs.umich.edu            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
5076548Sgblack@eecs.umich.edu            uint64_t result = FpDestReg.uqw;
5086548Sgblack@eecs.umich.edu
5096548Sgblack@eecs.umich.edu            for (int i = 0; i < items; i++) {
5106548Sgblack@eecs.umich.edu                double arg1, arg2;
5116548Sgblack@eecs.umich.edu                int hiIndex = (i + 1) * sizeBits - 1;
5126548Sgblack@eecs.umich.edu                int loIndex = (i + 0) * sizeBits;
5136548Sgblack@eecs.umich.edu                uint64_t arg1Bits = bits(FpSrcReg1.uqw, hiIndex, loIndex);
5146548Sgblack@eecs.umich.edu                uint64_t arg2Bits = bits(FpSrcReg2.uqw, hiIndex, loIndex);
5156548Sgblack@eecs.umich.edu
5166548Sgblack@eecs.umich.edu                if (size == 4) {
5176548Sgblack@eecs.umich.edu                    floatInt fi;
5186548Sgblack@eecs.umich.edu                    fi.i = arg1Bits;
5196548Sgblack@eecs.umich.edu                    arg1 = fi.f;
5206548Sgblack@eecs.umich.edu                    fi.i = arg2Bits;
5216548Sgblack@eecs.umich.edu                    arg2 = fi.f;
5226548Sgblack@eecs.umich.edu                } else {
5236548Sgblack@eecs.umich.edu                    doubleInt di;
5246548Sgblack@eecs.umich.edu                    di.i = arg1Bits;
5256548Sgblack@eecs.umich.edu                    arg1 = di.d;
5266548Sgblack@eecs.umich.edu                    di.i = arg2Bits;
5276548Sgblack@eecs.umich.edu                    arg2 = di.d;
5286548Sgblack@eecs.umich.edu                }
5296548Sgblack@eecs.umich.edu
5306548Sgblack@eecs.umich.edu                if (arg1 < arg2) {
5316548Sgblack@eecs.umich.edu                    result = insertBits(result, hiIndex, loIndex, arg1Bits);
5326548Sgblack@eecs.umich.edu                } else {
5336548Sgblack@eecs.umich.edu                    result = insertBits(result, hiIndex, loIndex, arg2Bits);
5346548Sgblack@eecs.umich.edu                }
5356548Sgblack@eecs.umich.edu            }
5366548Sgblack@eecs.umich.edu            FpDestReg.uqw = result;
5376548Sgblack@eecs.umich.edu        '''
5386550Sgblack@eecs.umich.edu
5396550Sgblack@eecs.umich.edu    class Mmaxf(MediaOp):
5406550Sgblack@eecs.umich.edu        code = '''
5416550Sgblack@eecs.umich.edu            union floatInt
5426550Sgblack@eecs.umich.edu            {
5436550Sgblack@eecs.umich.edu                float f;
5446550Sgblack@eecs.umich.edu                uint32_t i;
5456550Sgblack@eecs.umich.edu            };
5466550Sgblack@eecs.umich.edu            union doubleInt
5476550Sgblack@eecs.umich.edu            {
5486550Sgblack@eecs.umich.edu                double d;
5496550Sgblack@eecs.umich.edu                uint64_t i;
5506550Sgblack@eecs.umich.edu            };
5516550Sgblack@eecs.umich.edu
5526550Sgblack@eecs.umich.edu            assert(srcSize == destSize);
5536550Sgblack@eecs.umich.edu            int size = srcSize;
5546550Sgblack@eecs.umich.edu            int sizeBits = size * 8;
5556550Sgblack@eecs.umich.edu            assert(srcSize == 4 || srcSize == 8);
5566550Sgblack@eecs.umich.edu            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
5576550Sgblack@eecs.umich.edu            uint64_t result = FpDestReg.uqw;
5586550Sgblack@eecs.umich.edu
5596550Sgblack@eecs.umich.edu            for (int i = 0; i < items; i++) {
5606550Sgblack@eecs.umich.edu                double arg1, arg2;
5616550Sgblack@eecs.umich.edu                int hiIndex = (i + 1) * sizeBits - 1;
5626550Sgblack@eecs.umich.edu                int loIndex = (i + 0) * sizeBits;
5636550Sgblack@eecs.umich.edu                uint64_t arg1Bits = bits(FpSrcReg1.uqw, hiIndex, loIndex);
5646550Sgblack@eecs.umich.edu                uint64_t arg2Bits = bits(FpSrcReg2.uqw, hiIndex, loIndex);
5656550Sgblack@eecs.umich.edu
5666550Sgblack@eecs.umich.edu                if (size == 4) {
5676550Sgblack@eecs.umich.edu                    floatInt fi;
5686550Sgblack@eecs.umich.edu                    fi.i = arg1Bits;
5696550Sgblack@eecs.umich.edu                    arg1 = fi.f;
5706550Sgblack@eecs.umich.edu                    fi.i = arg2Bits;
5716550Sgblack@eecs.umich.edu                    arg2 = fi.f;
5726550Sgblack@eecs.umich.edu                } else {
5736550Sgblack@eecs.umich.edu                    doubleInt di;
5746550Sgblack@eecs.umich.edu                    di.i = arg1Bits;
5756550Sgblack@eecs.umich.edu                    arg1 = di.d;
5766550Sgblack@eecs.umich.edu                    di.i = arg2Bits;
5776550Sgblack@eecs.umich.edu                    arg2 = di.d;
5786550Sgblack@eecs.umich.edu                }
5796550Sgblack@eecs.umich.edu
5806550Sgblack@eecs.umich.edu                if (arg1 > arg2) {
5816550Sgblack@eecs.umich.edu                    result = insertBits(result, hiIndex, loIndex, arg1Bits);
5826550Sgblack@eecs.umich.edu                } else {
5836550Sgblack@eecs.umich.edu                    result = insertBits(result, hiIndex, loIndex, arg2Bits);
5846550Sgblack@eecs.umich.edu                }
5856550Sgblack@eecs.umich.edu            }
5866550Sgblack@eecs.umich.edu            FpDestReg.uqw = result;
5876550Sgblack@eecs.umich.edu        '''
5886552Sgblack@eecs.umich.edu
5896572Sgblack@eecs.umich.edu    class Mmini(MediaOp):
5906572Sgblack@eecs.umich.edu        code = '''
5916572Sgblack@eecs.umich.edu
5926572Sgblack@eecs.umich.edu            assert(srcSize == destSize);
5936572Sgblack@eecs.umich.edu            int size = srcSize;
5946572Sgblack@eecs.umich.edu            int sizeBits = size * 8;
5956572Sgblack@eecs.umich.edu            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
5966572Sgblack@eecs.umich.edu            uint64_t result = FpDestReg.uqw;
5976572Sgblack@eecs.umich.edu
5986572Sgblack@eecs.umich.edu            for (int i = 0; i < items; i++) {
5996572Sgblack@eecs.umich.edu                int hiIndex = (i + 1) * sizeBits - 1;
6006572Sgblack@eecs.umich.edu                int loIndex = (i + 0) * sizeBits;
6016572Sgblack@eecs.umich.edu                uint64_t arg1Bits = bits(FpSrcReg1.uqw, hiIndex, loIndex);
6026572Sgblack@eecs.umich.edu                int64_t arg1 = arg1Bits |
6036572Sgblack@eecs.umich.edu                    (0 - (arg1Bits & (1 << (sizeBits - 1))));
6046572Sgblack@eecs.umich.edu                uint64_t arg2Bits = bits(FpSrcReg2.uqw, hiIndex, loIndex);
6056572Sgblack@eecs.umich.edu                int64_t arg2 = arg2Bits |
6066572Sgblack@eecs.umich.edu                    (0 - (arg2Bits & (1 << (sizeBits - 1))));
6076572Sgblack@eecs.umich.edu                uint64_t resBits;
6086572Sgblack@eecs.umich.edu
6096572Sgblack@eecs.umich.edu                if (ext & 0x2) {
6106572Sgblack@eecs.umich.edu                    if (arg1 < arg2) {
6116572Sgblack@eecs.umich.edu                        resBits = arg1Bits;
6126572Sgblack@eecs.umich.edu                    } else {
6136572Sgblack@eecs.umich.edu                        resBits = arg2Bits;
6146572Sgblack@eecs.umich.edu                    }
6156572Sgblack@eecs.umich.edu                } else {
6166572Sgblack@eecs.umich.edu                    if (arg1Bits < arg2Bits) {
6176572Sgblack@eecs.umich.edu                        resBits = arg1Bits;
6186572Sgblack@eecs.umich.edu                    } else {
6196572Sgblack@eecs.umich.edu                        resBits = arg2Bits;
6206572Sgblack@eecs.umich.edu                    }
6216572Sgblack@eecs.umich.edu                }
6226572Sgblack@eecs.umich.edu                result = insertBits(result, hiIndex, loIndex, resBits);
6236572Sgblack@eecs.umich.edu            }
6246572Sgblack@eecs.umich.edu            FpDestReg.uqw = result;
6256572Sgblack@eecs.umich.edu        '''
6266572Sgblack@eecs.umich.edu
6276574Sgblack@eecs.umich.edu    class Mmaxi(MediaOp):
6286574Sgblack@eecs.umich.edu        code = '''
6296574Sgblack@eecs.umich.edu
6306574Sgblack@eecs.umich.edu            assert(srcSize == destSize);
6316574Sgblack@eecs.umich.edu            int size = srcSize;
6326574Sgblack@eecs.umich.edu            int sizeBits = size * 8;
6336574Sgblack@eecs.umich.edu            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
6346574Sgblack@eecs.umich.edu            uint64_t result = FpDestReg.uqw;
6356574Sgblack@eecs.umich.edu
6366574Sgblack@eecs.umich.edu            for (int i = 0; i < items; i++) {
6376574Sgblack@eecs.umich.edu                int hiIndex = (i + 1) * sizeBits - 1;
6386574Sgblack@eecs.umich.edu                int loIndex = (i + 0) * sizeBits;
6396574Sgblack@eecs.umich.edu                uint64_t arg1Bits = bits(FpSrcReg1.uqw, hiIndex, loIndex);
6406574Sgblack@eecs.umich.edu                int64_t arg1 = arg1Bits |
6416574Sgblack@eecs.umich.edu                    (0 - (arg1Bits & (1 << (sizeBits - 1))));
6426574Sgblack@eecs.umich.edu                uint64_t arg2Bits = bits(FpSrcReg2.uqw, hiIndex, loIndex);
6436574Sgblack@eecs.umich.edu                int64_t arg2 = arg2Bits |
6446574Sgblack@eecs.umich.edu                    (0 - (arg2Bits & (1 << (sizeBits - 1))));
6456574Sgblack@eecs.umich.edu                uint64_t resBits;
6466574Sgblack@eecs.umich.edu
6476574Sgblack@eecs.umich.edu                if (ext & 0x2) {
6486574Sgblack@eecs.umich.edu                    if (arg1 > arg2) {
6496574Sgblack@eecs.umich.edu                        resBits = arg1Bits;
6506574Sgblack@eecs.umich.edu                    } else {
6516574Sgblack@eecs.umich.edu                        resBits = arg2Bits;
6526574Sgblack@eecs.umich.edu                    }
6536574Sgblack@eecs.umich.edu                } else {
6546574Sgblack@eecs.umich.edu                    if (arg1Bits > arg2Bits) {
6556574Sgblack@eecs.umich.edu                        resBits = arg1Bits;
6566574Sgblack@eecs.umich.edu                    } else {
6576574Sgblack@eecs.umich.edu                        resBits = arg2Bits;
6586574Sgblack@eecs.umich.edu                    }
6596574Sgblack@eecs.umich.edu                }
6606574Sgblack@eecs.umich.edu                result = insertBits(result, hiIndex, loIndex, resBits);
6616574Sgblack@eecs.umich.edu            }
6626574Sgblack@eecs.umich.edu            FpDestReg.uqw = result;
6636574Sgblack@eecs.umich.edu        '''
6646574Sgblack@eecs.umich.edu
6656552Sgblack@eecs.umich.edu    class Msqrt(MediaOp):
6666552Sgblack@eecs.umich.edu        def __init__(self, dest, src, \
6676552Sgblack@eecs.umich.edu                size = None, destSize = None, srcSize = None, ext = None):
6686552Sgblack@eecs.umich.edu            super(Msqrt, self).__init__(dest, src,\
6696552Sgblack@eecs.umich.edu                    "InstRegIndex(0)", size, destSize, srcSize, ext)
6706552Sgblack@eecs.umich.edu        code = '''
6716552Sgblack@eecs.umich.edu            union floatInt
6726552Sgblack@eecs.umich.edu            {
6736552Sgblack@eecs.umich.edu                float f;
6746552Sgblack@eecs.umich.edu                uint32_t i;
6756552Sgblack@eecs.umich.edu            };
6766552Sgblack@eecs.umich.edu            union doubleInt
6776552Sgblack@eecs.umich.edu            {
6786552Sgblack@eecs.umich.edu                double d;
6796552Sgblack@eecs.umich.edu                uint64_t i;
6806552Sgblack@eecs.umich.edu            };
6816552Sgblack@eecs.umich.edu
6826552Sgblack@eecs.umich.edu            assert(srcSize == destSize);
6836552Sgblack@eecs.umich.edu            int size = srcSize;
6846552Sgblack@eecs.umich.edu            int sizeBits = size * 8;
6856552Sgblack@eecs.umich.edu            assert(srcSize == 4 || srcSize == 8);
6866552Sgblack@eecs.umich.edu            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
6876552Sgblack@eecs.umich.edu            uint64_t result = FpDestReg.uqw;
6886552Sgblack@eecs.umich.edu
6896552Sgblack@eecs.umich.edu            for (int i = 0; i < items; i++) {
6906552Sgblack@eecs.umich.edu                int hiIndex = (i + 1) * sizeBits - 1;
6916552Sgblack@eecs.umich.edu                int loIndex = (i + 0) * sizeBits;
6926552Sgblack@eecs.umich.edu                uint64_t argBits = bits(FpSrcReg1.uqw, hiIndex, loIndex);
6936552Sgblack@eecs.umich.edu
6946552Sgblack@eecs.umich.edu                if (size == 4) {
6956552Sgblack@eecs.umich.edu                    floatInt fi;
6966552Sgblack@eecs.umich.edu                    fi.i = argBits;
6976552Sgblack@eecs.umich.edu                    fi.f = sqrt(fi.f);
6986552Sgblack@eecs.umich.edu                    argBits = fi.i;
6996552Sgblack@eecs.umich.edu                } else {
7006552Sgblack@eecs.umich.edu                    doubleInt di;
7016552Sgblack@eecs.umich.edu                    di.i = argBits;
7026552Sgblack@eecs.umich.edu                    di.d = sqrt(di.d);
7036552Sgblack@eecs.umich.edu                    argBits = di.i;
7046552Sgblack@eecs.umich.edu                }
7056552Sgblack@eecs.umich.edu                result = insertBits(result, hiIndex, loIndex, argBits);
7066552Sgblack@eecs.umich.edu            }
7076552Sgblack@eecs.umich.edu            FpDestReg.uqw = result;
7086552Sgblack@eecs.umich.edu        '''
7096554Sgblack@eecs.umich.edu
7106554Sgblack@eecs.umich.edu    class Maddf(MediaOp):
7116554Sgblack@eecs.umich.edu        code = '''
7126554Sgblack@eecs.umich.edu            union floatInt
7136554Sgblack@eecs.umich.edu            {
7146554Sgblack@eecs.umich.edu                float f;
7156554Sgblack@eecs.umich.edu                uint32_t i;
7166554Sgblack@eecs.umich.edu            };
7176554Sgblack@eecs.umich.edu            union doubleInt
7186554Sgblack@eecs.umich.edu            {
7196554Sgblack@eecs.umich.edu                double d;
7206554Sgblack@eecs.umich.edu                uint64_t i;
7216554Sgblack@eecs.umich.edu            };
7226554Sgblack@eecs.umich.edu
7236554Sgblack@eecs.umich.edu            assert(srcSize == destSize);
7246554Sgblack@eecs.umich.edu            int size = srcSize;
7256554Sgblack@eecs.umich.edu            int sizeBits = size * 8;
7266554Sgblack@eecs.umich.edu            assert(srcSize == 4 || srcSize == 8);
7276554Sgblack@eecs.umich.edu            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
7286554Sgblack@eecs.umich.edu            uint64_t result = FpDestReg.uqw;
7296554Sgblack@eecs.umich.edu
7306554Sgblack@eecs.umich.edu            for (int i = 0; i < items; i++) {
7316554Sgblack@eecs.umich.edu                int hiIndex = (i + 1) * sizeBits - 1;
7326554Sgblack@eecs.umich.edu                int loIndex = (i + 0) * sizeBits;
7336554Sgblack@eecs.umich.edu                uint64_t arg1Bits = bits(FpSrcReg1.uqw, hiIndex, loIndex);
7346554Sgblack@eecs.umich.edu                uint64_t arg2Bits = bits(FpSrcReg2.uqw, hiIndex, loIndex);
7356554Sgblack@eecs.umich.edu                uint64_t resBits;
7366554Sgblack@eecs.umich.edu
7376554Sgblack@eecs.umich.edu                if (size == 4) {
7386554Sgblack@eecs.umich.edu                    floatInt arg1, arg2, res;
7396554Sgblack@eecs.umich.edu                    arg1.i = arg1Bits;
7406554Sgblack@eecs.umich.edu                    arg2.i = arg2Bits;
7416554Sgblack@eecs.umich.edu                    res.f = arg1.f + arg2.f;
7426554Sgblack@eecs.umich.edu                    resBits = res.i;
7436554Sgblack@eecs.umich.edu                } else {
7446554Sgblack@eecs.umich.edu                    doubleInt arg1, arg2, res;
7456554Sgblack@eecs.umich.edu                    arg1.i = arg1Bits;
7466554Sgblack@eecs.umich.edu                    arg2.i = arg2Bits;
7476554Sgblack@eecs.umich.edu                    res.d = arg1.d + arg2.d;
7486554Sgblack@eecs.umich.edu                    resBits = res.i;
7496554Sgblack@eecs.umich.edu                }
7506554Sgblack@eecs.umich.edu
7516554Sgblack@eecs.umich.edu                result = insertBits(result, hiIndex, loIndex, resBits);
7526554Sgblack@eecs.umich.edu            }
7536554Sgblack@eecs.umich.edu            FpDestReg.uqw = result;
7546554Sgblack@eecs.umich.edu        '''
7556556Sgblack@eecs.umich.edu
7566556Sgblack@eecs.umich.edu    class Msubf(MediaOp):
7576556Sgblack@eecs.umich.edu        code = '''
7586556Sgblack@eecs.umich.edu            union floatInt
7596556Sgblack@eecs.umich.edu            {
7606556Sgblack@eecs.umich.edu                float f;
7616556Sgblack@eecs.umich.edu                uint32_t i;
7626556Sgblack@eecs.umich.edu            };
7636556Sgblack@eecs.umich.edu            union doubleInt
7646556Sgblack@eecs.umich.edu            {
7656556Sgblack@eecs.umich.edu                double d;
7666556Sgblack@eecs.umich.edu                uint64_t i;
7676556Sgblack@eecs.umich.edu            };
7686556Sgblack@eecs.umich.edu
7696556Sgblack@eecs.umich.edu            assert(srcSize == destSize);
7706556Sgblack@eecs.umich.edu            int size = srcSize;
7716556Sgblack@eecs.umich.edu            int sizeBits = size * 8;
7726556Sgblack@eecs.umich.edu            assert(srcSize == 4 || srcSize == 8);
7736556Sgblack@eecs.umich.edu            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
7746556Sgblack@eecs.umich.edu            uint64_t result = FpDestReg.uqw;
7756556Sgblack@eecs.umich.edu
7766556Sgblack@eecs.umich.edu            for (int i = 0; i < items; i++) {
7776556Sgblack@eecs.umich.edu                int hiIndex = (i + 1) * sizeBits - 1;
7786556Sgblack@eecs.umich.edu                int loIndex = (i + 0) * sizeBits;
7796556Sgblack@eecs.umich.edu                uint64_t arg1Bits = bits(FpSrcReg1.uqw, hiIndex, loIndex);
7806556Sgblack@eecs.umich.edu                uint64_t arg2Bits = bits(FpSrcReg2.uqw, hiIndex, loIndex);
7816556Sgblack@eecs.umich.edu                uint64_t resBits;
7826556Sgblack@eecs.umich.edu
7836556Sgblack@eecs.umich.edu                if (size == 4) {
7846556Sgblack@eecs.umich.edu                    floatInt arg1, arg2, res;
7856556Sgblack@eecs.umich.edu                    arg1.i = arg1Bits;
7866556Sgblack@eecs.umich.edu                    arg2.i = arg2Bits;
7876556Sgblack@eecs.umich.edu                    res.f = arg1.f - arg2.f;
7886556Sgblack@eecs.umich.edu                    resBits = res.i;
7896556Sgblack@eecs.umich.edu                } else {
7906556Sgblack@eecs.umich.edu                    doubleInt arg1, arg2, res;
7916556Sgblack@eecs.umich.edu                    arg1.i = arg1Bits;
7926556Sgblack@eecs.umich.edu                    arg2.i = arg2Bits;
7936556Sgblack@eecs.umich.edu                    res.d = arg1.d - arg2.d;
7946556Sgblack@eecs.umich.edu                    resBits = res.i;
7956556Sgblack@eecs.umich.edu                }
7966556Sgblack@eecs.umich.edu
7976556Sgblack@eecs.umich.edu                result = insertBits(result, hiIndex, loIndex, resBits);
7986556Sgblack@eecs.umich.edu            }
7996556Sgblack@eecs.umich.edu            FpDestReg.uqw = result;
8006556Sgblack@eecs.umich.edu        '''
8016558Sgblack@eecs.umich.edu
8026558Sgblack@eecs.umich.edu    class Mmulf(MediaOp):
8036558Sgblack@eecs.umich.edu        code = '''
8046558Sgblack@eecs.umich.edu            union floatInt
8056558Sgblack@eecs.umich.edu            {
8066558Sgblack@eecs.umich.edu                float f;
8076558Sgblack@eecs.umich.edu                uint32_t i;
8086558Sgblack@eecs.umich.edu            };
8096558Sgblack@eecs.umich.edu            union doubleInt
8106558Sgblack@eecs.umich.edu            {
8116558Sgblack@eecs.umich.edu                double d;
8126558Sgblack@eecs.umich.edu                uint64_t i;
8136558Sgblack@eecs.umich.edu            };
8146558Sgblack@eecs.umich.edu
8156558Sgblack@eecs.umich.edu            assert(srcSize == destSize);
8166558Sgblack@eecs.umich.edu            int size = srcSize;
8176558Sgblack@eecs.umich.edu            int sizeBits = size * 8;
8186558Sgblack@eecs.umich.edu            assert(srcSize == 4 || srcSize == 8);
8196558Sgblack@eecs.umich.edu            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
8206558Sgblack@eecs.umich.edu            uint64_t result = FpDestReg.uqw;
8216558Sgblack@eecs.umich.edu
8226558Sgblack@eecs.umich.edu            for (int i = 0; i < items; i++) {
8236558Sgblack@eecs.umich.edu                int hiIndex = (i + 1) * sizeBits - 1;
8246558Sgblack@eecs.umich.edu                int loIndex = (i + 0) * sizeBits;
8256558Sgblack@eecs.umich.edu                uint64_t arg1Bits = bits(FpSrcReg1.uqw, hiIndex, loIndex);
8266558Sgblack@eecs.umich.edu                uint64_t arg2Bits = bits(FpSrcReg2.uqw, hiIndex, loIndex);
8276558Sgblack@eecs.umich.edu                uint64_t resBits;
8286558Sgblack@eecs.umich.edu
8296558Sgblack@eecs.umich.edu                if (size == 4) {
8306558Sgblack@eecs.umich.edu                    floatInt arg1, arg2, res;
8316558Sgblack@eecs.umich.edu                    arg1.i = arg1Bits;
8326558Sgblack@eecs.umich.edu                    arg2.i = arg2Bits;
8336558Sgblack@eecs.umich.edu                    res.f = arg1.f * arg2.f;
8346558Sgblack@eecs.umich.edu                    resBits = res.i;
8356558Sgblack@eecs.umich.edu                } else {
8366558Sgblack@eecs.umich.edu                    doubleInt arg1, arg2, res;
8376558Sgblack@eecs.umich.edu                    arg1.i = arg1Bits;
8386558Sgblack@eecs.umich.edu                    arg2.i = arg2Bits;
8396558Sgblack@eecs.umich.edu                    res.d = arg1.d * arg2.d;
8406558Sgblack@eecs.umich.edu                    resBits = res.i;
8416558Sgblack@eecs.umich.edu                }
8426558Sgblack@eecs.umich.edu
8436558Sgblack@eecs.umich.edu                result = insertBits(result, hiIndex, loIndex, resBits);
8446558Sgblack@eecs.umich.edu            }
8456558Sgblack@eecs.umich.edu            FpDestReg.uqw = result;
8466558Sgblack@eecs.umich.edu        '''
8476560Sgblack@eecs.umich.edu
8486560Sgblack@eecs.umich.edu    class Mdivf(MediaOp):
8496560Sgblack@eecs.umich.edu        code = '''
8506560Sgblack@eecs.umich.edu            union floatInt
8516560Sgblack@eecs.umich.edu            {
8526560Sgblack@eecs.umich.edu                float f;
8536560Sgblack@eecs.umich.edu                uint32_t i;
8546560Sgblack@eecs.umich.edu            };
8556560Sgblack@eecs.umich.edu            union doubleInt
8566560Sgblack@eecs.umich.edu            {
8576560Sgblack@eecs.umich.edu                double d;
8586560Sgblack@eecs.umich.edu                uint64_t i;
8596560Sgblack@eecs.umich.edu            };
8606560Sgblack@eecs.umich.edu
8616560Sgblack@eecs.umich.edu            assert(srcSize == destSize);
8626560Sgblack@eecs.umich.edu            int size = srcSize;
8636560Sgblack@eecs.umich.edu            int sizeBits = size * 8;
8646560Sgblack@eecs.umich.edu            assert(srcSize == 4 || srcSize == 8);
8656560Sgblack@eecs.umich.edu            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
8666560Sgblack@eecs.umich.edu            uint64_t result = FpDestReg.uqw;
8676560Sgblack@eecs.umich.edu
8686560Sgblack@eecs.umich.edu            for (int i = 0; i < items; i++) {
8696560Sgblack@eecs.umich.edu                int hiIndex = (i + 1) * sizeBits - 1;
8706560Sgblack@eecs.umich.edu                int loIndex = (i + 0) * sizeBits;
8716560Sgblack@eecs.umich.edu                uint64_t arg1Bits = bits(FpSrcReg1.uqw, hiIndex, loIndex);
8726560Sgblack@eecs.umich.edu                uint64_t arg2Bits = bits(FpSrcReg2.uqw, hiIndex, loIndex);
8736560Sgblack@eecs.umich.edu                uint64_t resBits;
8746560Sgblack@eecs.umich.edu
8756560Sgblack@eecs.umich.edu                if (size == 4) {
8766560Sgblack@eecs.umich.edu                    floatInt arg1, arg2, res;
8776560Sgblack@eecs.umich.edu                    arg1.i = arg1Bits;
8786560Sgblack@eecs.umich.edu                    arg2.i = arg2Bits;
8796560Sgblack@eecs.umich.edu                    res.f = arg1.f / arg2.f;
8806560Sgblack@eecs.umich.edu                    resBits = res.i;
8816560Sgblack@eecs.umich.edu                } else {
8826560Sgblack@eecs.umich.edu                    doubleInt arg1, arg2, res;
8836560Sgblack@eecs.umich.edu                    arg1.i = arg1Bits;
8846560Sgblack@eecs.umich.edu                    arg2.i = arg2Bits;
8856560Sgblack@eecs.umich.edu                    res.d = arg1.d / arg2.d;
8866560Sgblack@eecs.umich.edu                    resBits = res.i;
8876560Sgblack@eecs.umich.edu                }
8886560Sgblack@eecs.umich.edu
8896560Sgblack@eecs.umich.edu                result = insertBits(result, hiIndex, loIndex, resBits);
8906560Sgblack@eecs.umich.edu            }
8916560Sgblack@eecs.umich.edu            FpDestReg.uqw = result;
8926560Sgblack@eecs.umich.edu        '''
8936562Sgblack@eecs.umich.edu
8946570Sgblack@eecs.umich.edu    class Maddi(MediaOp):
8956570Sgblack@eecs.umich.edu        code = '''
8966570Sgblack@eecs.umich.edu            assert(srcSize == destSize);
8976570Sgblack@eecs.umich.edu            int size = srcSize;
8986570Sgblack@eecs.umich.edu            int sizeBits = size * 8;
8996570Sgblack@eecs.umich.edu            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
9006570Sgblack@eecs.umich.edu            uint64_t result = FpDestReg.uqw;
9016570Sgblack@eecs.umich.edu
9026570Sgblack@eecs.umich.edu            for (int i = 0; i < items; i++) {
9036570Sgblack@eecs.umich.edu                int hiIndex = (i + 1) * sizeBits - 1;
9046570Sgblack@eecs.umich.edu                int loIndex = (i + 0) * sizeBits;
9056570Sgblack@eecs.umich.edu                uint64_t arg1Bits = bits(FpSrcReg1.uqw, hiIndex, loIndex);
9066570Sgblack@eecs.umich.edu                uint64_t arg2Bits = bits(FpSrcReg2.uqw, hiIndex, loIndex);
9076570Sgblack@eecs.umich.edu                uint64_t resBits = arg1Bits + arg2Bits;
9086570Sgblack@eecs.umich.edu                
9096570Sgblack@eecs.umich.edu                if (ext & 0x2) {
9106570Sgblack@eecs.umich.edu                    if (findCarry(sizeBits, resBits, arg1Bits, arg2Bits))
9116570Sgblack@eecs.umich.edu                        resBits = mask(sizeBits);
9126570Sgblack@eecs.umich.edu                } else if (ext & 0x4) {
9136570Sgblack@eecs.umich.edu                    int arg1Sign = bits(arg1Bits, sizeBits - 1);
9146570Sgblack@eecs.umich.edu                    int arg2Sign = bits(arg2Bits, sizeBits - 1);
9156570Sgblack@eecs.umich.edu                    int resSign = bits(resBits, sizeBits - 1);
9166570Sgblack@eecs.umich.edu                    if ((arg1Sign == arg2Sign) && (arg1Sign != resSign)) {
9176570Sgblack@eecs.umich.edu                        if (resSign == 0)
9186570Sgblack@eecs.umich.edu                            resBits = (1 << (sizeBits - 1));
9196570Sgblack@eecs.umich.edu                        else
9206570Sgblack@eecs.umich.edu                            resBits = mask(sizeBits - 1);
9216570Sgblack@eecs.umich.edu                    }
9226570Sgblack@eecs.umich.edu                }
9236570Sgblack@eecs.umich.edu
9246570Sgblack@eecs.umich.edu                result = insertBits(result, hiIndex, loIndex, resBits);
9256570Sgblack@eecs.umich.edu            }
9266570Sgblack@eecs.umich.edu            FpDestReg.uqw = result;
9276570Sgblack@eecs.umich.edu        '''
9286570Sgblack@eecs.umich.edu
9296579Sgblack@eecs.umich.edu    class Msubi(MediaOp):
9306579Sgblack@eecs.umich.edu        code = '''
9316579Sgblack@eecs.umich.edu            assert(srcSize == destSize);
9326579Sgblack@eecs.umich.edu            int size = srcSize;
9336579Sgblack@eecs.umich.edu            int sizeBits = size * 8;
9346579Sgblack@eecs.umich.edu            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
9356579Sgblack@eecs.umich.edu            uint64_t result = FpDestReg.uqw;
9366579Sgblack@eecs.umich.edu
9376579Sgblack@eecs.umich.edu            for (int i = 0; i < items; i++) {
9386579Sgblack@eecs.umich.edu                int hiIndex = (i + 1) * sizeBits - 1;
9396579Sgblack@eecs.umich.edu                int loIndex = (i + 0) * sizeBits;
9406579Sgblack@eecs.umich.edu                uint64_t arg1Bits = bits(FpSrcReg1.uqw, hiIndex, loIndex);
9416579Sgblack@eecs.umich.edu                uint64_t arg2Bits = bits(FpSrcReg2.uqw, hiIndex, loIndex);
9426579Sgblack@eecs.umich.edu                uint64_t resBits = arg1Bits - arg2Bits;
9436579Sgblack@eecs.umich.edu                
9446579Sgblack@eecs.umich.edu                if (ext & 0x2) {
9456579Sgblack@eecs.umich.edu                    if (arg2Bits > arg1Bits) {
9466579Sgblack@eecs.umich.edu                        resBits = 0;
9476579Sgblack@eecs.umich.edu                    } else if (!findCarry(sizeBits, resBits,
9486579Sgblack@eecs.umich.edu                                         arg1Bits, ~arg2Bits)) {
9496579Sgblack@eecs.umich.edu                        resBits = mask(sizeBits);
9506579Sgblack@eecs.umich.edu                    }
9516579Sgblack@eecs.umich.edu                } else if (ext & 0x4) {
9526579Sgblack@eecs.umich.edu                    int arg1Sign = bits(arg1Bits, sizeBits - 1);
9536579Sgblack@eecs.umich.edu                    int arg2Sign = !bits(arg2Bits, sizeBits - 1);
9546579Sgblack@eecs.umich.edu                    int resSign = bits(resBits, sizeBits - 1);
9556579Sgblack@eecs.umich.edu                    if ((arg1Sign == arg2Sign) && (arg1Sign != resSign)) {
9566579Sgblack@eecs.umich.edu                        if (resSign == 0)
9576579Sgblack@eecs.umich.edu                            resBits = (1 << (sizeBits - 1));
9586579Sgblack@eecs.umich.edu                        else
9596579Sgblack@eecs.umich.edu                            resBits = mask(sizeBits - 1);
9606579Sgblack@eecs.umich.edu                    }
9616579Sgblack@eecs.umich.edu                }
9626579Sgblack@eecs.umich.edu
9636579Sgblack@eecs.umich.edu                result = insertBits(result, hiIndex, loIndex, resBits);
9646579Sgblack@eecs.umich.edu            }
9656579Sgblack@eecs.umich.edu            FpDestReg.uqw = result;
9666579Sgblack@eecs.umich.edu        '''
9676579Sgblack@eecs.umich.edu
9686577Sgblack@eecs.umich.edu    class Mmuli(MediaOp):
9696577Sgblack@eecs.umich.edu        code = '''
9706577Sgblack@eecs.umich.edu            int srcBits = srcSize * 8;
9716577Sgblack@eecs.umich.edu            int destBits = destSize * 8;
9726577Sgblack@eecs.umich.edu            assert(destBits <= 64);
9736577Sgblack@eecs.umich.edu            assert(destSize >= srcSize);
9746577Sgblack@eecs.umich.edu            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / destSize);
9756577Sgblack@eecs.umich.edu            uint64_t result = FpDestReg.uqw;
9766577Sgblack@eecs.umich.edu
9776577Sgblack@eecs.umich.edu            for (int i = 0; i < items; i++) {
9786585Sgblack@eecs.umich.edu                int offset = 0;
9796585Sgblack@eecs.umich.edu                if (ext & 16) {
9806585Sgblack@eecs.umich.edu                    if (ext & 32)
9816585Sgblack@eecs.umich.edu                        offset = i * (destBits - srcBits);
9826585Sgblack@eecs.umich.edu                    else
9836585Sgblack@eecs.umich.edu                        offset = i * (destBits - srcBits) + srcBits;
9846585Sgblack@eecs.umich.edu                }
9856585Sgblack@eecs.umich.edu                int srcHiIndex = (i + 1) * srcBits - 1 + offset;
9866585Sgblack@eecs.umich.edu                int srcLoIndex = (i + 0) * srcBits + offset;
9876577Sgblack@eecs.umich.edu                uint64_t arg1Bits = bits(FpSrcReg1.uqw, srcHiIndex, srcLoIndex);
9886577Sgblack@eecs.umich.edu                uint64_t arg2Bits = bits(FpSrcReg2.uqw, srcHiIndex, srcLoIndex);
9896577Sgblack@eecs.umich.edu                uint64_t resBits;
9906577Sgblack@eecs.umich.edu
9916577Sgblack@eecs.umich.edu                if (ext & 0x2) {
9926577Sgblack@eecs.umich.edu                    int64_t arg1 = arg1Bits |
9936577Sgblack@eecs.umich.edu                        (0 - (arg1Bits & (1 << (srcBits - 1))));
9946577Sgblack@eecs.umich.edu                    int64_t arg2 = arg2Bits |
9956577Sgblack@eecs.umich.edu                        (0 - (arg2Bits & (1 << (srcBits - 1))));
9966577Sgblack@eecs.umich.edu                    resBits = (uint64_t)(arg1 * arg2);
9976577Sgblack@eecs.umich.edu                } else {
9986577Sgblack@eecs.umich.edu                    resBits = arg1Bits * arg2Bits;
9996577Sgblack@eecs.umich.edu                }
10006577Sgblack@eecs.umich.edu
10016577Sgblack@eecs.umich.edu                if (ext & 0x4)
10026577Sgblack@eecs.umich.edu                    resBits += (1 << (destBits - 1));
10036577Sgblack@eecs.umich.edu                
10046577Sgblack@eecs.umich.edu                if (ext & 0x8)
10056577Sgblack@eecs.umich.edu                    resBits >>= destBits;
10066577Sgblack@eecs.umich.edu
10076577Sgblack@eecs.umich.edu                int destHiIndex = (i + 1) * destBits - 1;
10086577Sgblack@eecs.umich.edu                int destLoIndex = (i + 0) * destBits;
10096577Sgblack@eecs.umich.edu                result = insertBits(result, destHiIndex, destLoIndex, resBits);
10106577Sgblack@eecs.umich.edu            }
10116577Sgblack@eecs.umich.edu            FpDestReg.uqw = result;
10126577Sgblack@eecs.umich.edu        '''
10136577Sgblack@eecs.umich.edu
10146587Sgblack@eecs.umich.edu    class Mavg(MediaOp):
10156587Sgblack@eecs.umich.edu        code = '''
10166587Sgblack@eecs.umich.edu            assert(srcSize == destSize);
10176587Sgblack@eecs.umich.edu            int size = srcSize;
10186587Sgblack@eecs.umich.edu            int sizeBits = size * 8;
10196587Sgblack@eecs.umich.edu            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
10206587Sgblack@eecs.umich.edu            uint64_t result = FpDestReg.uqw;
10216587Sgblack@eecs.umich.edu
10226587Sgblack@eecs.umich.edu            for (int i = 0; i < items; i++) {
10236587Sgblack@eecs.umich.edu                int hiIndex = (i + 1) * sizeBits - 1;
10246587Sgblack@eecs.umich.edu                int loIndex = (i + 0) * sizeBits;
10256587Sgblack@eecs.umich.edu                uint64_t arg1Bits = bits(FpSrcReg1.uqw, hiIndex, loIndex);
10266587Sgblack@eecs.umich.edu                uint64_t arg2Bits = bits(FpSrcReg2.uqw, hiIndex, loIndex);
10276587Sgblack@eecs.umich.edu                uint64_t resBits = (arg1Bits + arg2Bits + 1) / 2;
10286587Sgblack@eecs.umich.edu                
10296587Sgblack@eecs.umich.edu                result = insertBits(result, hiIndex, loIndex, resBits);
10306587Sgblack@eecs.umich.edu            }
10316587Sgblack@eecs.umich.edu            FpDestReg.uqw = result;
10326587Sgblack@eecs.umich.edu        '''
10336587Sgblack@eecs.umich.edu
10346581Sgblack@eecs.umich.edu    class Msad(MediaOp):
10356581Sgblack@eecs.umich.edu        code = '''
10366581Sgblack@eecs.umich.edu            int srcBits = srcSize * 8;
10376581Sgblack@eecs.umich.edu            int items = sizeof(FloatRegBits) / srcSize;
10386581Sgblack@eecs.umich.edu
10396581Sgblack@eecs.umich.edu            uint64_t sum = 0;
10406581Sgblack@eecs.umich.edu            for (int i = 0; i < items; i++) {
10416581Sgblack@eecs.umich.edu                int hiIndex = (i + 1) * srcBits - 1;
10426581Sgblack@eecs.umich.edu                int loIndex = (i + 0) * srcBits;
10436581Sgblack@eecs.umich.edu                uint64_t arg1Bits = bits(FpSrcReg1.uqw, hiIndex, loIndex);
10446581Sgblack@eecs.umich.edu                uint64_t arg2Bits = bits(FpSrcReg2.uqw, hiIndex, loIndex);
10456581Sgblack@eecs.umich.edu                int64_t resBits = arg1Bits - arg2Bits;
10466581Sgblack@eecs.umich.edu                if (resBits < 0)
10476581Sgblack@eecs.umich.edu                    resBits = -resBits;
10486581Sgblack@eecs.umich.edu                sum += resBits;
10496581Sgblack@eecs.umich.edu            }
10506581Sgblack@eecs.umich.edu            FpDestReg.uqw = sum & mask(destSize * 8);
10516581Sgblack@eecs.umich.edu        '''
10526581Sgblack@eecs.umich.edu
10536583Sgblack@eecs.umich.edu    class Msrl(MediaOp):
10546583Sgblack@eecs.umich.edu        code = '''
10556583Sgblack@eecs.umich.edu
10566583Sgblack@eecs.umich.edu            assert(srcSize == destSize);
10576583Sgblack@eecs.umich.edu            int size = srcSize;
10586583Sgblack@eecs.umich.edu            int sizeBits = size * 8;
10596583Sgblack@eecs.umich.edu            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
10606583Sgblack@eecs.umich.edu            uint64_t shiftAmt = op2.uqw;
10616583Sgblack@eecs.umich.edu            uint64_t result = FpDestReg.uqw;
10626583Sgblack@eecs.umich.edu
10636583Sgblack@eecs.umich.edu            for (int i = 0; i < items; i++) {
10646583Sgblack@eecs.umich.edu                int hiIndex = (i + 1) * sizeBits - 1;
10656583Sgblack@eecs.umich.edu                int loIndex = (i + 0) * sizeBits;
10666583Sgblack@eecs.umich.edu                uint64_t arg1Bits = bits(FpSrcReg1.uqw, hiIndex, loIndex);
10676583Sgblack@eecs.umich.edu                uint64_t resBits;
10686583Sgblack@eecs.umich.edu                if (shiftAmt >= sizeBits) {
10696583Sgblack@eecs.umich.edu                    resBits = 0;
10706583Sgblack@eecs.umich.edu                } else {
10716583Sgblack@eecs.umich.edu                    resBits = (arg1Bits >> shiftAmt) &
10726583Sgblack@eecs.umich.edu                        mask(sizeBits - shiftAmt);
10736583Sgblack@eecs.umich.edu                }
10746583Sgblack@eecs.umich.edu
10756583Sgblack@eecs.umich.edu                result = insertBits(result, hiIndex, loIndex, resBits);
10766583Sgblack@eecs.umich.edu            }
10776583Sgblack@eecs.umich.edu            FpDestReg.uqw = result;
10786583Sgblack@eecs.umich.edu        '''
10796583Sgblack@eecs.umich.edu
10806583Sgblack@eecs.umich.edu    class Msra(MediaOp):
10816583Sgblack@eecs.umich.edu        code = '''
10826583Sgblack@eecs.umich.edu
10836583Sgblack@eecs.umich.edu            assert(srcSize == destSize);
10846583Sgblack@eecs.umich.edu            int size = srcSize;
10856583Sgblack@eecs.umich.edu            int sizeBits = size * 8;
10866583Sgblack@eecs.umich.edu            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
10876583Sgblack@eecs.umich.edu            uint64_t shiftAmt = op2.uqw;
10886583Sgblack@eecs.umich.edu            uint64_t result = FpDestReg.uqw;
10896583Sgblack@eecs.umich.edu
10906583Sgblack@eecs.umich.edu            for (int i = 0; i < items; i++) {
10916583Sgblack@eecs.umich.edu                int hiIndex = (i + 1) * sizeBits - 1;
10926583Sgblack@eecs.umich.edu                int loIndex = (i + 0) * sizeBits;
10936583Sgblack@eecs.umich.edu                uint64_t arg1Bits = bits(FpSrcReg1.uqw, hiIndex, loIndex);
10946583Sgblack@eecs.umich.edu                uint64_t resBits;
10956583Sgblack@eecs.umich.edu                if (shiftAmt >= sizeBits) {
10966583Sgblack@eecs.umich.edu                    if (bits(arg1Bits, sizeBits - 1))
10976583Sgblack@eecs.umich.edu                        resBits = mask(sizeBits);
10986583Sgblack@eecs.umich.edu                    else
10996583Sgblack@eecs.umich.edu                        resBits = 0;
11006583Sgblack@eecs.umich.edu                } else {
11016583Sgblack@eecs.umich.edu                    resBits = (arg1Bits >> shiftAmt);
11026583Sgblack@eecs.umich.edu                    resBits = resBits |
11036583Sgblack@eecs.umich.edu                        (0 - (resBits & (1 << (sizeBits - 1 - shiftAmt))));
11046583Sgblack@eecs.umich.edu                }
11056583Sgblack@eecs.umich.edu
11066583Sgblack@eecs.umich.edu                result = insertBits(result, hiIndex, loIndex, resBits);
11076583Sgblack@eecs.umich.edu            }
11086583Sgblack@eecs.umich.edu            FpDestReg.uqw = result;
11096583Sgblack@eecs.umich.edu        '''
11106583Sgblack@eecs.umich.edu
11116583Sgblack@eecs.umich.edu    class Msll(MediaOp):
11126583Sgblack@eecs.umich.edu        code = '''
11136583Sgblack@eecs.umich.edu
11146583Sgblack@eecs.umich.edu            assert(srcSize == destSize);
11156583Sgblack@eecs.umich.edu            int size = srcSize;
11166583Sgblack@eecs.umich.edu            int sizeBits = size * 8;
11176583Sgblack@eecs.umich.edu            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
11186583Sgblack@eecs.umich.edu            uint64_t shiftAmt = op2.uqw;
11196583Sgblack@eecs.umich.edu            uint64_t result = FpDestReg.uqw;
11206583Sgblack@eecs.umich.edu
11216583Sgblack@eecs.umich.edu            for (int i = 0; i < items; i++) {
11226583Sgblack@eecs.umich.edu                int hiIndex = (i + 1) * sizeBits - 1;
11236583Sgblack@eecs.umich.edu                int loIndex = (i + 0) * sizeBits;
11246583Sgblack@eecs.umich.edu                uint64_t arg1Bits = bits(FpSrcReg1.uqw, hiIndex, loIndex);
11256583Sgblack@eecs.umich.edu                uint64_t resBits;
11266583Sgblack@eecs.umich.edu                if (shiftAmt >= sizeBits) {
11276583Sgblack@eecs.umich.edu                    resBits = 0;
11286583Sgblack@eecs.umich.edu                } else {
11296583Sgblack@eecs.umich.edu                    resBits = (arg1Bits << shiftAmt);
11306583Sgblack@eecs.umich.edu                }
11316583Sgblack@eecs.umich.edu
11326583Sgblack@eecs.umich.edu                result = insertBits(result, hiIndex, loIndex, resBits);
11336583Sgblack@eecs.umich.edu            }
11346583Sgblack@eecs.umich.edu            FpDestReg.uqw = result;
11356583Sgblack@eecs.umich.edu        '''
11366583Sgblack@eecs.umich.edu
11376562Sgblack@eecs.umich.edu    class Cvti2f(MediaOp):
11386562Sgblack@eecs.umich.edu        def __init__(self, dest, src, \
11396562Sgblack@eecs.umich.edu                size = None, destSize = None, srcSize = None, ext = None):
11406562Sgblack@eecs.umich.edu            super(Cvti2f, self).__init__(dest, src,\
11416562Sgblack@eecs.umich.edu                    "InstRegIndex(0)", size, destSize, srcSize, ext)
11426562Sgblack@eecs.umich.edu        code = '''
11436562Sgblack@eecs.umich.edu            union floatInt
11446562Sgblack@eecs.umich.edu            {
11456562Sgblack@eecs.umich.edu                float f;
11466562Sgblack@eecs.umich.edu                uint32_t i;
11476562Sgblack@eecs.umich.edu            };
11486562Sgblack@eecs.umich.edu            union doubleInt
11496562Sgblack@eecs.umich.edu            {
11506562Sgblack@eecs.umich.edu                double d;
11516562Sgblack@eecs.umich.edu                uint64_t i;
11526562Sgblack@eecs.umich.edu            };
11536562Sgblack@eecs.umich.edu
11546562Sgblack@eecs.umich.edu            assert(destSize == 4 || destSize == 8);
11556562Sgblack@eecs.umich.edu            assert(srcSize == 4 || srcSize == 8);
11566562Sgblack@eecs.umich.edu            int srcSizeBits = srcSize * 8;
11576562Sgblack@eecs.umich.edu            int destSizeBits = destSize * 8;
11586562Sgblack@eecs.umich.edu            int items;
11596562Sgblack@eecs.umich.edu            int srcStart = 0;
11606562Sgblack@eecs.umich.edu            int destStart = 0;
11616562Sgblack@eecs.umich.edu            if (srcSize == 2 * destSize) {
11626562Sgblack@eecs.umich.edu                items = (ext & 0x1) ? 1: sizeof(FloatRegBits) / srcSize;
11636562Sgblack@eecs.umich.edu                if (ext & 0x2)
11646562Sgblack@eecs.umich.edu                    destStart = destSizeBits * items;
11656562Sgblack@eecs.umich.edu            } else if (destSize == 2 * srcSize) {
11666562Sgblack@eecs.umich.edu                items = (ext & 0x1) ? 1: sizeof(FloatRegBits) / destSize;
11676562Sgblack@eecs.umich.edu                if (ext & 0x2)
11686562Sgblack@eecs.umich.edu                    srcStart = srcSizeBits * items;
11696562Sgblack@eecs.umich.edu            } else {
11706562Sgblack@eecs.umich.edu                items = (ext & 0x1) ? 1: sizeof(FloatRegBits) / destSize;
11716562Sgblack@eecs.umich.edu            }
11726562Sgblack@eecs.umich.edu            uint64_t result = FpDestReg.uqw;
11736562Sgblack@eecs.umich.edu
11746562Sgblack@eecs.umich.edu            for (int i = 0; i < items; i++) {
11756562Sgblack@eecs.umich.edu                int srcHiIndex = srcStart + (i + 1) * srcSizeBits - 1;
11766562Sgblack@eecs.umich.edu                int srcLoIndex = srcStart + (i + 0) * srcSizeBits;
11776562Sgblack@eecs.umich.edu                uint64_t argBits = bits(FpSrcReg1.uqw, srcHiIndex, srcLoIndex);
11786562Sgblack@eecs.umich.edu                int64_t sArg = argBits | (0 - (argBits & (1 << srcHiIndex)));
11796562Sgblack@eecs.umich.edu                double arg = sArg;
11806562Sgblack@eecs.umich.edu
11816562Sgblack@eecs.umich.edu                if (destSize == 4) {
11826562Sgblack@eecs.umich.edu                    floatInt fi;
11836562Sgblack@eecs.umich.edu                    fi.f = arg;
11846562Sgblack@eecs.umich.edu                    argBits = fi.i;
11856562Sgblack@eecs.umich.edu                } else {
11866562Sgblack@eecs.umich.edu                    doubleInt di;
11876562Sgblack@eecs.umich.edu                    di.d = arg;
11886562Sgblack@eecs.umich.edu                    argBits = di.i;
11896562Sgblack@eecs.umich.edu                }
11906562Sgblack@eecs.umich.edu                int destHiIndex = destStart + (i + 1) * destSizeBits - 1;
11916562Sgblack@eecs.umich.edu                int destLoIndex = destStart + (i + 0) * destSizeBits;
11926562Sgblack@eecs.umich.edu                result = insertBits(result, destHiIndex, destLoIndex, argBits);
11936562Sgblack@eecs.umich.edu            }
11946562Sgblack@eecs.umich.edu            FpDestReg.uqw = result;
11956562Sgblack@eecs.umich.edu        '''
11966566Sgblack@eecs.umich.edu
11976568Sgblack@eecs.umich.edu    class Cvtf2f(MediaOp):
11986568Sgblack@eecs.umich.edu        def __init__(self, dest, src, \
11996568Sgblack@eecs.umich.edu                size = None, destSize = None, srcSize = None, ext = None):
12006568Sgblack@eecs.umich.edu            super(Cvtf2f, self).__init__(dest, src,\
12016568Sgblack@eecs.umich.edu                    "InstRegIndex(0)", size, destSize, srcSize, ext)
12026568Sgblack@eecs.umich.edu        code = '''
12036568Sgblack@eecs.umich.edu            union floatInt
12046568Sgblack@eecs.umich.edu            {
12056568Sgblack@eecs.umich.edu                float f;
12066568Sgblack@eecs.umich.edu                uint32_t i;
12076568Sgblack@eecs.umich.edu            };
12086568Sgblack@eecs.umich.edu            union doubleInt
12096568Sgblack@eecs.umich.edu            {
12106568Sgblack@eecs.umich.edu                double d;
12116568Sgblack@eecs.umich.edu                uint64_t i;
12126568Sgblack@eecs.umich.edu            };
12136568Sgblack@eecs.umich.edu
12146568Sgblack@eecs.umich.edu            assert(destSize == 4 || destSize == 8);
12156568Sgblack@eecs.umich.edu            assert(srcSize == 4 || srcSize == 8);
12166568Sgblack@eecs.umich.edu            int srcSizeBits = srcSize * 8;
12176568Sgblack@eecs.umich.edu            int destSizeBits = destSize * 8;
12186568Sgblack@eecs.umich.edu            int items;
12196568Sgblack@eecs.umich.edu            int srcStart = 0;
12206568Sgblack@eecs.umich.edu            int destStart = 0;
12216568Sgblack@eecs.umich.edu            if (srcSize == 2 * destSize) {
12226568Sgblack@eecs.umich.edu                items = (ext & 0x1) ? 1: sizeof(FloatRegBits) / srcSize;
12236568Sgblack@eecs.umich.edu                if (ext & 0x2)
12246568Sgblack@eecs.umich.edu                    destStart = destSizeBits * items;
12256568Sgblack@eecs.umich.edu            } else if (destSize == 2 * srcSize) {
12266568Sgblack@eecs.umich.edu                items = (ext & 0x1) ? 1: sizeof(FloatRegBits) / destSize;
12276568Sgblack@eecs.umich.edu                if (ext & 0x2)
12286568Sgblack@eecs.umich.edu                    srcStart = srcSizeBits * items;
12296568Sgblack@eecs.umich.edu            } else {
12306568Sgblack@eecs.umich.edu                items = (ext & 0x1) ? 1: sizeof(FloatRegBits) / destSize;
12316568Sgblack@eecs.umich.edu            }
12326568Sgblack@eecs.umich.edu            uint64_t result = FpDestReg.uqw;
12336568Sgblack@eecs.umich.edu
12346568Sgblack@eecs.umich.edu            for (int i = 0; i < items; i++) {
12356568Sgblack@eecs.umich.edu                int srcHiIndex = srcStart + (i + 1) * srcSizeBits - 1;
12366568Sgblack@eecs.umich.edu                int srcLoIndex = srcStart + (i + 0) * srcSizeBits;
12376568Sgblack@eecs.umich.edu                uint64_t argBits = bits(FpSrcReg1.uqw, srcHiIndex, srcLoIndex);
12386568Sgblack@eecs.umich.edu                double arg;
12396568Sgblack@eecs.umich.edu
12406568Sgblack@eecs.umich.edu                if (srcSize == 4) {
12416568Sgblack@eecs.umich.edu                    floatInt fi;
12426568Sgblack@eecs.umich.edu                    fi.i = argBits;
12436568Sgblack@eecs.umich.edu                    arg = fi.f;
12446568Sgblack@eecs.umich.edu                } else {
12456568Sgblack@eecs.umich.edu                    doubleInt di;
12466568Sgblack@eecs.umich.edu                    di.i = argBits;
12476568Sgblack@eecs.umich.edu                    arg = di.d;
12486568Sgblack@eecs.umich.edu                }
12496568Sgblack@eecs.umich.edu                if (destSize == 4) {
12506568Sgblack@eecs.umich.edu                    floatInt fi;
12516568Sgblack@eecs.umich.edu                    fi.f = arg;
12526568Sgblack@eecs.umich.edu                    argBits = fi.i;
12536568Sgblack@eecs.umich.edu                } else {
12546568Sgblack@eecs.umich.edu                    doubleInt di;
12556568Sgblack@eecs.umich.edu                    di.d = arg;
12566568Sgblack@eecs.umich.edu                    argBits = di.i;
12576568Sgblack@eecs.umich.edu                }
12586568Sgblack@eecs.umich.edu                int destHiIndex = destStart + (i + 1) * destSizeBits - 1;
12596568Sgblack@eecs.umich.edu                int destLoIndex = destStart + (i + 0) * destSizeBits;
12606568Sgblack@eecs.umich.edu                result = insertBits(result, destHiIndex, destLoIndex, argBits);
12616568Sgblack@eecs.umich.edu            }
12626568Sgblack@eecs.umich.edu            FpDestReg.uqw = result;
12636568Sgblack@eecs.umich.edu        '''
12646568Sgblack@eecs.umich.edu
12656566Sgblack@eecs.umich.edu    class Mcmpi2r(MediaOp):
12666566Sgblack@eecs.umich.edu        code = '''
12676566Sgblack@eecs.umich.edu            union floatInt
12686566Sgblack@eecs.umich.edu            {
12696566Sgblack@eecs.umich.edu                float f;
12706566Sgblack@eecs.umich.edu                uint32_t i;
12716566Sgblack@eecs.umich.edu            };
12726566Sgblack@eecs.umich.edu            union doubleInt
12736566Sgblack@eecs.umich.edu            {
12746566Sgblack@eecs.umich.edu                double d;
12756566Sgblack@eecs.umich.edu                uint64_t i;
12766566Sgblack@eecs.umich.edu            };
12776566Sgblack@eecs.umich.edu
12786566Sgblack@eecs.umich.edu            assert(srcSize == destSize);
12796566Sgblack@eecs.umich.edu            int size = srcSize;
12806566Sgblack@eecs.umich.edu            int sizeBits = size * 8;
12816566Sgblack@eecs.umich.edu            int items = (ext & 0x1) ? 1: (sizeof(FloatRegBits) / size);
12826566Sgblack@eecs.umich.edu            uint64_t result = FpDestReg.uqw;
12836566Sgblack@eecs.umich.edu
12846566Sgblack@eecs.umich.edu            for (int i = 0; i < items; i++) {
12856566Sgblack@eecs.umich.edu                int hiIndex = (i + 1) * sizeBits - 1;
12866566Sgblack@eecs.umich.edu                int loIndex = (i + 0) * sizeBits;
12876566Sgblack@eecs.umich.edu                uint64_t arg1Bits = bits(FpSrcReg1.uqw, hiIndex, loIndex);
12886566Sgblack@eecs.umich.edu                int64_t arg1 = arg1Bits |
12896566Sgblack@eecs.umich.edu                    (0 - (arg1Bits & (1 << (sizeBits - 1))));
12906566Sgblack@eecs.umich.edu                uint64_t arg2Bits = bits(FpSrcReg2.uqw, hiIndex, loIndex);
12916566Sgblack@eecs.umich.edu                int64_t arg2 = arg2Bits |
12926566Sgblack@eecs.umich.edu                    (0 - (arg2Bits & (1 << (sizeBits - 1))));
12936566Sgblack@eecs.umich.edu
12946566Sgblack@eecs.umich.edu                uint64_t resBits = 0;
12956566Sgblack@eecs.umich.edu                if ((ext & 0x2) == 0 && arg1 == arg2 ||
12966566Sgblack@eecs.umich.edu                        (ext & 0x2) == 0x2 && arg1 > arg2)
12976566Sgblack@eecs.umich.edu                    resBits = mask(sizeBits);
12986566Sgblack@eecs.umich.edu
12996566Sgblack@eecs.umich.edu                result = insertBits(result, hiIndex, loIndex, resBits);
13006566Sgblack@eecs.umich.edu            }
13016566Sgblack@eecs.umich.edu            FpDestReg.uqw = result;
13026566Sgblack@eecs.umich.edu        '''
13036516Sgblack@eecs.umich.edu}};
1304