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