fp.isa revision 7374
17322Sgblack@eecs.umich.edu// -*- mode:c++ -*- 27322Sgblack@eecs.umich.edu 37322Sgblack@eecs.umich.edu// Copyright (c) 2010 ARM Limited 47322Sgblack@eecs.umich.edu// All rights reserved 57322Sgblack@eecs.umich.edu// 67322Sgblack@eecs.umich.edu// The license below extends only to copyright in the software and shall 77322Sgblack@eecs.umich.edu// not be construed as granting a license to any other intellectual 87322Sgblack@eecs.umich.edu// property including but not limited to intellectual property relating 97322Sgblack@eecs.umich.edu// to a hardware implementation of the functionality of the software 107322Sgblack@eecs.umich.edu// licensed hereunder. You may use the software subject to the license 117322Sgblack@eecs.umich.edu// terms below provided that you ensure that this notice is replicated 127322Sgblack@eecs.umich.edu// unmodified and in its entirety in all distributions of the software, 137322Sgblack@eecs.umich.edu// modified or unmodified, in source code or in binary form. 147322Sgblack@eecs.umich.edu// 157322Sgblack@eecs.umich.edu// Redistribution and use in source and binary forms, with or without 167322Sgblack@eecs.umich.edu// modification, are permitted provided that the following conditions are 177322Sgblack@eecs.umich.edu// met: redistributions of source code must retain the above copyright 187322Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer; 197322Sgblack@eecs.umich.edu// redistributions in binary form must reproduce the above copyright 207322Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer in the 217322Sgblack@eecs.umich.edu// documentation and/or other materials provided with the distribution; 227322Sgblack@eecs.umich.edu// neither the name of the copyright holders nor the names of its 237322Sgblack@eecs.umich.edu// contributors may be used to endorse or promote products derived from 247322Sgblack@eecs.umich.edu// this software without specific prior written permission. 257322Sgblack@eecs.umich.edu// 267322Sgblack@eecs.umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 277322Sgblack@eecs.umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 287322Sgblack@eecs.umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 297322Sgblack@eecs.umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 307322Sgblack@eecs.umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 317322Sgblack@eecs.umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 327322Sgblack@eecs.umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 337322Sgblack@eecs.umich.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 347322Sgblack@eecs.umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 357322Sgblack@eecs.umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 367322Sgblack@eecs.umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 377322Sgblack@eecs.umich.edu// 387322Sgblack@eecs.umich.edu// Authors: Gabe Black 397322Sgblack@eecs.umich.edu 407322Sgblack@eecs.umich.edulet {{ 417322Sgblack@eecs.umich.edu 427322Sgblack@eecs.umich.edu header_output = "" 437322Sgblack@eecs.umich.edu decoder_output = "" 447322Sgblack@eecs.umich.edu exec_output = "" 457322Sgblack@eecs.umich.edu 467322Sgblack@eecs.umich.edu vmsrIop = InstObjParams("vmsr", "Vmsr", "RegRegOp", 477322Sgblack@eecs.umich.edu { "code": "MiscDest = Op1;", 487322Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 497322Sgblack@eecs.umich.edu header_output += RegRegOpDeclare.subst(vmsrIop); 507322Sgblack@eecs.umich.edu decoder_output += RegRegOpConstructor.subst(vmsrIop); 517322Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmsrIop); 527324Sgblack@eecs.umich.edu 537324Sgblack@eecs.umich.edu vmrsIop = InstObjParams("vmrs", "Vmrs", "RegRegOp", 547324Sgblack@eecs.umich.edu { "code": "Dest = MiscOp1;", 557324Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 567324Sgblack@eecs.umich.edu header_output += RegRegOpDeclare.subst(vmrsIop); 577324Sgblack@eecs.umich.edu decoder_output += RegRegOpConstructor.subst(vmrsIop); 587324Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmrsIop); 597333Sgblack@eecs.umich.edu 607333Sgblack@eecs.umich.edu vmovImmSCode = ''' 617333Sgblack@eecs.umich.edu FpDest.uw = bits(imm, 31, 0); 627333Sgblack@eecs.umich.edu ''' 637333Sgblack@eecs.umich.edu vmovImmSIop = InstObjParams("vmov", "VmovImmS", "RegImmOp", 647333Sgblack@eecs.umich.edu { "code": vmovImmSCode, 657333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 667333Sgblack@eecs.umich.edu header_output += RegImmOpDeclare.subst(vmovImmSIop); 677333Sgblack@eecs.umich.edu decoder_output += RegImmOpConstructor.subst(vmovImmSIop); 687333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovImmSIop); 697333Sgblack@eecs.umich.edu 707333Sgblack@eecs.umich.edu vmovImmDCode = ''' 717333Sgblack@eecs.umich.edu FpDestP0.uw = bits(imm, 31, 0); 727333Sgblack@eecs.umich.edu FpDestP1.uw = bits(imm, 63, 32); 737333Sgblack@eecs.umich.edu ''' 747333Sgblack@eecs.umich.edu vmovImmDIop = InstObjParams("vmov", "VmovImmD", "RegImmOp", 757333Sgblack@eecs.umich.edu { "code": vmovImmDCode, 767333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 777333Sgblack@eecs.umich.edu header_output += RegImmOpDeclare.subst(vmovImmDIop); 787333Sgblack@eecs.umich.edu decoder_output += RegImmOpConstructor.subst(vmovImmDIop); 797333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovImmDIop); 807333Sgblack@eecs.umich.edu 817333Sgblack@eecs.umich.edu vmovImmQCode = ''' 827333Sgblack@eecs.umich.edu FpDestP0.uw = bits(imm, 31, 0); 837333Sgblack@eecs.umich.edu FpDestP1.uw = bits(imm, 63, 32); 847333Sgblack@eecs.umich.edu FpDestP2.uw = bits(imm, 31, 0); 857333Sgblack@eecs.umich.edu FpDestP3.uw = bits(imm, 63, 32); 867333Sgblack@eecs.umich.edu ''' 877333Sgblack@eecs.umich.edu vmovImmQIop = InstObjParams("vmov", "VmovImmQ", "RegImmOp", 887333Sgblack@eecs.umich.edu { "code": vmovImmQCode, 897333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 907333Sgblack@eecs.umich.edu header_output += RegImmOpDeclare.subst(vmovImmQIop); 917333Sgblack@eecs.umich.edu decoder_output += RegImmOpConstructor.subst(vmovImmQIop); 927333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovImmQIop); 937333Sgblack@eecs.umich.edu 947333Sgblack@eecs.umich.edu vmovRegSCode = ''' 957333Sgblack@eecs.umich.edu FpDest.uw = FpOp1.uw; 967333Sgblack@eecs.umich.edu ''' 977333Sgblack@eecs.umich.edu vmovRegSIop = InstObjParams("vmov", "VmovRegS", "RegRegOp", 987333Sgblack@eecs.umich.edu { "code": vmovRegSCode, 997333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 1007333Sgblack@eecs.umich.edu header_output += RegRegOpDeclare.subst(vmovRegSIop); 1017333Sgblack@eecs.umich.edu decoder_output += RegRegOpConstructor.subst(vmovRegSIop); 1027333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovRegSIop); 1037333Sgblack@eecs.umich.edu 1047333Sgblack@eecs.umich.edu vmovRegDCode = ''' 1057333Sgblack@eecs.umich.edu FpDestP0.uw = FpOp1P0.uw; 1067333Sgblack@eecs.umich.edu FpDestP1.uw = FpOp1P1.uw; 1077333Sgblack@eecs.umich.edu ''' 1087333Sgblack@eecs.umich.edu vmovRegDIop = InstObjParams("vmov", "VmovRegD", "RegRegOp", 1097333Sgblack@eecs.umich.edu { "code": vmovRegDCode, 1107333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 1117333Sgblack@eecs.umich.edu header_output += RegRegOpDeclare.subst(vmovRegDIop); 1127333Sgblack@eecs.umich.edu decoder_output += RegRegOpConstructor.subst(vmovRegDIop); 1137333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovRegDIop); 1147333Sgblack@eecs.umich.edu 1157333Sgblack@eecs.umich.edu vmovRegQCode = ''' 1167333Sgblack@eecs.umich.edu FpDestP0.uw = FpOp1P0.uw; 1177333Sgblack@eecs.umich.edu FpDestP1.uw = FpOp1P1.uw; 1187333Sgblack@eecs.umich.edu FpDestP2.uw = FpOp1P2.uw; 1197333Sgblack@eecs.umich.edu FpDestP3.uw = FpOp1P3.uw; 1207333Sgblack@eecs.umich.edu ''' 1217333Sgblack@eecs.umich.edu vmovRegQIop = InstObjParams("vmov", "VmovRegQ", "RegRegOp", 1227333Sgblack@eecs.umich.edu { "code": vmovRegQCode, 1237333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 1247333Sgblack@eecs.umich.edu header_output += RegRegOpDeclare.subst(vmovRegQIop); 1257333Sgblack@eecs.umich.edu decoder_output += RegRegOpConstructor.subst(vmovRegQIop); 1267333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovRegQIop); 1277333Sgblack@eecs.umich.edu 1287333Sgblack@eecs.umich.edu vmovCoreRegBCode = ''' 1297333Sgblack@eecs.umich.edu FpDest.uw = insertBits(FpDest.uw, imm * 8, imm * 8 + 7, Op1.ub); 1307333Sgblack@eecs.umich.edu ''' 1317333Sgblack@eecs.umich.edu vmovCoreRegBIop = InstObjParams("vmov", "VmovCoreRegB", "RegRegImmOp", 1327333Sgblack@eecs.umich.edu { "code": vmovCoreRegBCode, 1337333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 1347333Sgblack@eecs.umich.edu header_output += RegRegImmOpDeclare.subst(vmovCoreRegBIop); 1357333Sgblack@eecs.umich.edu decoder_output += RegRegImmOpConstructor.subst(vmovCoreRegBIop); 1367333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovCoreRegBIop); 1377333Sgblack@eecs.umich.edu 1387333Sgblack@eecs.umich.edu vmovCoreRegHCode = ''' 1397333Sgblack@eecs.umich.edu FpDest.uw = insertBits(FpDest.uw, imm * 16, imm * 16 + 15, Op1.uh); 1407333Sgblack@eecs.umich.edu ''' 1417333Sgblack@eecs.umich.edu vmovCoreRegHIop = InstObjParams("vmov", "VmovCoreRegH", "RegRegImmOp", 1427333Sgblack@eecs.umich.edu { "code": vmovCoreRegHCode, 1437333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 1447333Sgblack@eecs.umich.edu header_output += RegRegImmOpDeclare.subst(vmovCoreRegHIop); 1457333Sgblack@eecs.umich.edu decoder_output += RegRegImmOpConstructor.subst(vmovCoreRegHIop); 1467333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovCoreRegHIop); 1477333Sgblack@eecs.umich.edu 1487333Sgblack@eecs.umich.edu vmovCoreRegWCode = ''' 1497333Sgblack@eecs.umich.edu FpDest.uw = Op1.uw; 1507333Sgblack@eecs.umich.edu ''' 1517333Sgblack@eecs.umich.edu vmovCoreRegWIop = InstObjParams("vmov", "VmovCoreRegW", "RegRegOp", 1527333Sgblack@eecs.umich.edu { "code": vmovCoreRegWCode, 1537333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 1547333Sgblack@eecs.umich.edu header_output += RegRegOpDeclare.subst(vmovCoreRegWIop); 1557333Sgblack@eecs.umich.edu decoder_output += RegRegOpConstructor.subst(vmovCoreRegWIop); 1567333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovCoreRegWIop); 1577333Sgblack@eecs.umich.edu 1587333Sgblack@eecs.umich.edu vmovRegCoreUBCode = ''' 1597333Sgblack@eecs.umich.edu Dest = bits(FpOp1.uw, imm * 8, imm * 8 + 7); 1607333Sgblack@eecs.umich.edu ''' 1617333Sgblack@eecs.umich.edu vmovRegCoreUBIop = InstObjParams("vmov", "VmovRegCoreUB", "RegRegImmOp", 1627333Sgblack@eecs.umich.edu { "code": vmovRegCoreUBCode, 1637333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 1647333Sgblack@eecs.umich.edu header_output += RegRegImmOpDeclare.subst(vmovRegCoreUBIop); 1657333Sgblack@eecs.umich.edu decoder_output += RegRegImmOpConstructor.subst(vmovRegCoreUBIop); 1667333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovRegCoreUBIop); 1677333Sgblack@eecs.umich.edu 1687333Sgblack@eecs.umich.edu vmovRegCoreUHCode = ''' 1697333Sgblack@eecs.umich.edu Dest = bits(FpOp1.uw, imm * 16, imm * 16 + 15); 1707333Sgblack@eecs.umich.edu ''' 1717333Sgblack@eecs.umich.edu vmovRegCoreUHIop = InstObjParams("vmov", "VmovRegCoreUH", "RegRegImmOp", 1727333Sgblack@eecs.umich.edu { "code": vmovRegCoreUHCode, 1737333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 1747333Sgblack@eecs.umich.edu header_output += RegRegImmOpDeclare.subst(vmovRegCoreUHIop); 1757333Sgblack@eecs.umich.edu decoder_output += RegRegImmOpConstructor.subst(vmovRegCoreUHIop); 1767333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovRegCoreUHIop); 1777333Sgblack@eecs.umich.edu 1787333Sgblack@eecs.umich.edu vmovRegCoreSBCode = ''' 1797333Sgblack@eecs.umich.edu Dest = sext<8>(bits(FpOp1.uw, imm * 8, imm * 8 + 7)); 1807333Sgblack@eecs.umich.edu ''' 1817333Sgblack@eecs.umich.edu vmovRegCoreSBIop = InstObjParams("vmov", "VmovRegCoreSB", "RegRegImmOp", 1827333Sgblack@eecs.umich.edu { "code": vmovRegCoreSBCode, 1837333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 1847333Sgblack@eecs.umich.edu header_output += RegRegImmOpDeclare.subst(vmovRegCoreSBIop); 1857333Sgblack@eecs.umich.edu decoder_output += RegRegImmOpConstructor.subst(vmovRegCoreSBIop); 1867333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovRegCoreSBIop); 1877333Sgblack@eecs.umich.edu 1887333Sgblack@eecs.umich.edu vmovRegCoreSHCode = ''' 1897333Sgblack@eecs.umich.edu Dest = sext<16>(bits(FpOp1.uw, imm * 16, imm * 16 + 15)); 1907333Sgblack@eecs.umich.edu ''' 1917333Sgblack@eecs.umich.edu vmovRegCoreSHIop = InstObjParams("vmov", "VmovRegCoreSH", "RegRegImmOp", 1927333Sgblack@eecs.umich.edu { "code": vmovRegCoreSHCode, 1937333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 1947333Sgblack@eecs.umich.edu header_output += RegRegImmOpDeclare.subst(vmovRegCoreSHIop); 1957333Sgblack@eecs.umich.edu decoder_output += RegRegImmOpConstructor.subst(vmovRegCoreSHIop); 1967333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovRegCoreSHIop); 1977333Sgblack@eecs.umich.edu 1987333Sgblack@eecs.umich.edu vmovRegCoreWCode = ''' 1997333Sgblack@eecs.umich.edu Dest = FpOp1.uw; 2007333Sgblack@eecs.umich.edu ''' 2017333Sgblack@eecs.umich.edu vmovRegCoreWIop = InstObjParams("vmov", "VmovRegCoreW", "RegRegOp", 2027333Sgblack@eecs.umich.edu { "code": vmovRegCoreWCode, 2037333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 2047333Sgblack@eecs.umich.edu header_output += RegRegOpDeclare.subst(vmovRegCoreWIop); 2057333Sgblack@eecs.umich.edu decoder_output += RegRegOpConstructor.subst(vmovRegCoreWIop); 2067333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovRegCoreWIop); 2077333Sgblack@eecs.umich.edu 2087333Sgblack@eecs.umich.edu vmov2Reg2CoreCode = ''' 2097333Sgblack@eecs.umich.edu FpDestP0.uw = Op1.uw; 2107333Sgblack@eecs.umich.edu FpDestP1.uw = Op2.uw; 2117333Sgblack@eecs.umich.edu ''' 2127333Sgblack@eecs.umich.edu vmov2Reg2CoreIop = InstObjParams("vmov", "Vmov2Reg2Core", "RegRegRegOp", 2137333Sgblack@eecs.umich.edu { "code": vmov2Reg2CoreCode, 2147333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 2157333Sgblack@eecs.umich.edu header_output += RegRegRegOpDeclare.subst(vmov2Reg2CoreIop); 2167333Sgblack@eecs.umich.edu decoder_output += RegRegRegOpConstructor.subst(vmov2Reg2CoreIop); 2177333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmov2Reg2CoreIop); 2187333Sgblack@eecs.umich.edu 2197333Sgblack@eecs.umich.edu vmov2Core2RegCode = ''' 2207333Sgblack@eecs.umich.edu Dest.uw = FpOp2P0.uw; 2217333Sgblack@eecs.umich.edu Op1.uw = FpOp2P1.uw; 2227333Sgblack@eecs.umich.edu ''' 2237333Sgblack@eecs.umich.edu vmov2Core2RegIop = InstObjParams("vmov", "Vmov2Core2Reg", "RegRegRegOp", 2247333Sgblack@eecs.umich.edu { "code": vmov2Core2RegCode, 2257333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 2267333Sgblack@eecs.umich.edu header_output += RegRegRegOpDeclare.subst(vmov2Core2RegIop); 2277333Sgblack@eecs.umich.edu decoder_output += RegRegRegOpConstructor.subst(vmov2Core2RegIop); 2287333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmov2Core2RegIop); 2297364Sgblack@eecs.umich.edu 2307364Sgblack@eecs.umich.edu vmulSCode = ''' 2317364Sgblack@eecs.umich.edu FpDest = FpOp1 * FpOp2; 2327364Sgblack@eecs.umich.edu if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) { 2337364Sgblack@eecs.umich.edu FpDest = NAN; 2347364Sgblack@eecs.umich.edu } 2357364Sgblack@eecs.umich.edu ''' 2367364Sgblack@eecs.umich.edu vmulSIop = InstObjParams("vmuls", "VmulS", "RegRegRegOp", 2377364Sgblack@eecs.umich.edu { "code": vmulSCode, 2387364Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 2397364Sgblack@eecs.umich.edu header_output += RegRegRegOpDeclare.subst(vmulSIop); 2407364Sgblack@eecs.umich.edu decoder_output += RegRegRegOpConstructor.subst(vmulSIop); 2417364Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmulSIop); 2427364Sgblack@eecs.umich.edu 2437364Sgblack@eecs.umich.edu vmulDCode = ''' 2447364Sgblack@eecs.umich.edu IntDoubleUnion cOp1, cOp2, cDest; 2457364Sgblack@eecs.umich.edu cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 2467364Sgblack@eecs.umich.edu cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32)); 2477364Sgblack@eecs.umich.edu cDest.fp = cOp1.fp * cOp2.fp; 2487364Sgblack@eecs.umich.edu if ((isinf(cOp1.fp) && cOp2.fp == 0) || 2497364Sgblack@eecs.umich.edu (isinf(cOp2.fp) && cOp1.fp == 0)) { 2507364Sgblack@eecs.umich.edu cDest.fp = NAN; 2517364Sgblack@eecs.umich.edu } 2527364Sgblack@eecs.umich.edu FpDestP0.uw = cDest.bits; 2537364Sgblack@eecs.umich.edu FpDestP1.uw = cDest.bits >> 32; 2547364Sgblack@eecs.umich.edu ''' 2557364Sgblack@eecs.umich.edu vmulDIop = InstObjParams("vmuld", "VmulD", "RegRegRegOp", 2567364Sgblack@eecs.umich.edu { "code": vmulDCode, 2577364Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 2587364Sgblack@eecs.umich.edu header_output += RegRegRegOpDeclare.subst(vmulDIop); 2597364Sgblack@eecs.umich.edu decoder_output += RegRegRegOpConstructor.subst(vmulDIop); 2607364Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmulDIop); 2617365Sgblack@eecs.umich.edu 2627365Sgblack@eecs.umich.edu vnegSCode = ''' 2637365Sgblack@eecs.umich.edu FpDest = -FpOp1; 2647365Sgblack@eecs.umich.edu ''' 2657365Sgblack@eecs.umich.edu vnegSIop = InstObjParams("vnegs", "VnegS", "RegRegOp", 2667365Sgblack@eecs.umich.edu { "code": vnegSCode, 2677365Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 2687365Sgblack@eecs.umich.edu header_output += RegRegOpDeclare.subst(vnegSIop); 2697365Sgblack@eecs.umich.edu decoder_output += RegRegOpConstructor.subst(vnegSIop); 2707365Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vnegSIop); 2717365Sgblack@eecs.umich.edu 2727365Sgblack@eecs.umich.edu vnegDCode = ''' 2737365Sgblack@eecs.umich.edu IntDoubleUnion cOp1, cDest; 2747365Sgblack@eecs.umich.edu cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 2757365Sgblack@eecs.umich.edu cDest.fp = -cOp1.fp; 2767365Sgblack@eecs.umich.edu FpDestP0.uw = cDest.bits; 2777365Sgblack@eecs.umich.edu FpDestP1.uw = cDest.bits >> 32; 2787365Sgblack@eecs.umich.edu ''' 2797365Sgblack@eecs.umich.edu vnegDIop = InstObjParams("vnegd", "VnegD", "RegRegOp", 2807365Sgblack@eecs.umich.edu { "code": vnegDCode, 2817365Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 2827365Sgblack@eecs.umich.edu header_output += RegRegOpDeclare.subst(vnegDIop); 2837365Sgblack@eecs.umich.edu decoder_output += RegRegOpConstructor.subst(vnegDIop); 2847365Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vnegDIop); 2857366Sgblack@eecs.umich.edu 2867366Sgblack@eecs.umich.edu vabsSCode = ''' 2877366Sgblack@eecs.umich.edu FpDest = fabsf(FpOp1); 2887366Sgblack@eecs.umich.edu ''' 2897366Sgblack@eecs.umich.edu vabsSIop = InstObjParams("vabss", "VabsS", "RegRegOp", 2907366Sgblack@eecs.umich.edu { "code": vabsSCode, 2917366Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 2927366Sgblack@eecs.umich.edu header_output += RegRegOpDeclare.subst(vabsSIop); 2937366Sgblack@eecs.umich.edu decoder_output += RegRegOpConstructor.subst(vabsSIop); 2947366Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vabsSIop); 2957366Sgblack@eecs.umich.edu 2967366Sgblack@eecs.umich.edu vabsDCode = ''' 2977366Sgblack@eecs.umich.edu IntDoubleUnion cOp1, cDest; 2987366Sgblack@eecs.umich.edu cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 2997366Sgblack@eecs.umich.edu cDest.fp = fabs(cOp1.fp); 3007366Sgblack@eecs.umich.edu FpDestP0.uw = cDest.bits; 3017366Sgblack@eecs.umich.edu FpDestP1.uw = cDest.bits >> 32; 3027366Sgblack@eecs.umich.edu ''' 3037366Sgblack@eecs.umich.edu vabsDIop = InstObjParams("vabsd", "VabsD", "RegRegOp", 3047366Sgblack@eecs.umich.edu { "code": vabsDCode, 3057366Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 3067366Sgblack@eecs.umich.edu header_output += RegRegOpDeclare.subst(vabsDIop); 3077366Sgblack@eecs.umich.edu decoder_output += RegRegOpConstructor.subst(vabsDIop); 3087366Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vabsDIop); 3097367Sgblack@eecs.umich.edu 3107367Sgblack@eecs.umich.edu vaddSCode = ''' 3117367Sgblack@eecs.umich.edu FpDest = FpOp1 + FpOp2; 3127367Sgblack@eecs.umich.edu ''' 3137367Sgblack@eecs.umich.edu vaddSIop = InstObjParams("vadds", "VaddS", "RegRegRegOp", 3147367Sgblack@eecs.umich.edu { "code": vaddSCode, 3157367Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 3167367Sgblack@eecs.umich.edu header_output += RegRegRegOpDeclare.subst(vaddSIop); 3177367Sgblack@eecs.umich.edu decoder_output += RegRegRegOpConstructor.subst(vaddSIop); 3187367Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vaddSIop); 3197367Sgblack@eecs.umich.edu 3207367Sgblack@eecs.umich.edu vaddDCode = ''' 3217367Sgblack@eecs.umich.edu IntDoubleUnion cOp1, cOp2, cDest; 3227367Sgblack@eecs.umich.edu cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 3237367Sgblack@eecs.umich.edu cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32)); 3247367Sgblack@eecs.umich.edu cDest.fp = cOp1.fp + cOp2.fp; 3257367Sgblack@eecs.umich.edu FpDestP0.uw = cDest.bits; 3267367Sgblack@eecs.umich.edu FpDestP1.uw = cDest.bits >> 32; 3277367Sgblack@eecs.umich.edu ''' 3287367Sgblack@eecs.umich.edu vaddDIop = InstObjParams("vaddd", "VaddD", "RegRegRegOp", 3297367Sgblack@eecs.umich.edu { "code": vaddDCode, 3307367Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 3317367Sgblack@eecs.umich.edu header_output += RegRegRegOpDeclare.subst(vaddDIop); 3327367Sgblack@eecs.umich.edu decoder_output += RegRegRegOpConstructor.subst(vaddDIop); 3337367Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vaddDIop); 3347368Sgblack@eecs.umich.edu 3357368Sgblack@eecs.umich.edu vsubSCode = ''' 3367368Sgblack@eecs.umich.edu FpDest = FpOp1 - FpOp2; 3377368Sgblack@eecs.umich.edu ''' 3387368Sgblack@eecs.umich.edu vsubSIop = InstObjParams("vsubs", "VsubS", "RegRegRegOp", 3397368Sgblack@eecs.umich.edu { "code": vsubSCode, 3407368Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 3417368Sgblack@eecs.umich.edu header_output += RegRegRegOpDeclare.subst(vsubSIop); 3427368Sgblack@eecs.umich.edu decoder_output += RegRegRegOpConstructor.subst(vsubSIop); 3437368Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vsubSIop); 3447368Sgblack@eecs.umich.edu 3457368Sgblack@eecs.umich.edu vsubDCode = ''' 3467368Sgblack@eecs.umich.edu IntDoubleUnion cOp1, cOp2, cDest; 3477368Sgblack@eecs.umich.edu cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 3487368Sgblack@eecs.umich.edu cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32)); 3497368Sgblack@eecs.umich.edu cDest.fp = cOp1.fp - cOp2.fp; 3507368Sgblack@eecs.umich.edu FpDestP0.uw = cDest.bits; 3517368Sgblack@eecs.umich.edu FpDestP1.uw = cDest.bits >> 32; 3527368Sgblack@eecs.umich.edu ''' 3537368Sgblack@eecs.umich.edu vsubDIop = InstObjParams("vsubd", "VsubD", "RegRegRegOp", 3547368Sgblack@eecs.umich.edu { "code": vsubDCode, 3557368Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 3567368Sgblack@eecs.umich.edu header_output += RegRegRegOpDeclare.subst(vsubDIop); 3577368Sgblack@eecs.umich.edu decoder_output += RegRegRegOpConstructor.subst(vsubDIop); 3587368Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vsubDIop); 3597369Sgblack@eecs.umich.edu 3607369Sgblack@eecs.umich.edu vdivSCode = ''' 3617369Sgblack@eecs.umich.edu FpDest = FpOp1 / FpOp2; 3627369Sgblack@eecs.umich.edu ''' 3637369Sgblack@eecs.umich.edu vdivSIop = InstObjParams("vdivs", "VdivS", "RegRegRegOp", 3647369Sgblack@eecs.umich.edu { "code": vdivSCode, 3657369Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 3667369Sgblack@eecs.umich.edu header_output += RegRegRegOpDeclare.subst(vdivSIop); 3677369Sgblack@eecs.umich.edu decoder_output += RegRegRegOpConstructor.subst(vdivSIop); 3687369Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vdivSIop); 3697369Sgblack@eecs.umich.edu 3707369Sgblack@eecs.umich.edu vdivDCode = ''' 3717369Sgblack@eecs.umich.edu IntDoubleUnion cOp1, cOp2, cDest; 3727369Sgblack@eecs.umich.edu cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 3737369Sgblack@eecs.umich.edu cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32)); 3747369Sgblack@eecs.umich.edu cDest.fp = cOp1.fp / cOp2.fp; 3757369Sgblack@eecs.umich.edu FpDestP0.uw = cDest.bits; 3767369Sgblack@eecs.umich.edu FpDestP1.uw = cDest.bits >> 32; 3777369Sgblack@eecs.umich.edu ''' 3787369Sgblack@eecs.umich.edu vdivDIop = InstObjParams("vdivd", "VdivD", "RegRegRegOp", 3797369Sgblack@eecs.umich.edu { "code": vdivDCode, 3807369Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 3817369Sgblack@eecs.umich.edu header_output += RegRegRegOpDeclare.subst(vdivDIop); 3827369Sgblack@eecs.umich.edu decoder_output += RegRegRegOpConstructor.subst(vdivDIop); 3837369Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vdivDIop); 3847369Sgblack@eecs.umich.edu 3857369Sgblack@eecs.umich.edu vsqrtSCode = ''' 3867369Sgblack@eecs.umich.edu FpDest = sqrtf(FpOp1); 3877369Sgblack@eecs.umich.edu if (FpOp1 < 0) { 3887369Sgblack@eecs.umich.edu FpDest = NAN; 3897369Sgblack@eecs.umich.edu } 3907369Sgblack@eecs.umich.edu ''' 3917369Sgblack@eecs.umich.edu vsqrtSIop = InstObjParams("vsqrts", "VsqrtS", "RegRegOp", 3927369Sgblack@eecs.umich.edu { "code": vsqrtSCode, 3937369Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 3947369Sgblack@eecs.umich.edu header_output += RegRegOpDeclare.subst(vsqrtSIop); 3957369Sgblack@eecs.umich.edu decoder_output += RegRegOpConstructor.subst(vsqrtSIop); 3967369Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vsqrtSIop); 3977369Sgblack@eecs.umich.edu 3987369Sgblack@eecs.umich.edu vsqrtDCode = ''' 3997369Sgblack@eecs.umich.edu IntDoubleUnion cOp1, cDest; 4007369Sgblack@eecs.umich.edu cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 4017369Sgblack@eecs.umich.edu cDest.fp = sqrt(cOp1.fp); 4027369Sgblack@eecs.umich.edu if (cOp1.fp < 0) { 4037369Sgblack@eecs.umich.edu cDest.fp = NAN; 4047369Sgblack@eecs.umich.edu } 4057369Sgblack@eecs.umich.edu FpDestP0.uw = cDest.bits; 4067369Sgblack@eecs.umich.edu FpDestP1.uw = cDest.bits >> 32; 4077369Sgblack@eecs.umich.edu ''' 4087369Sgblack@eecs.umich.edu vsqrtDIop = InstObjParams("vsqrtd", "VsqrtD", "RegRegOp", 4097369Sgblack@eecs.umich.edu { "code": vsqrtDCode, 4107369Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 4117369Sgblack@eecs.umich.edu header_output += RegRegOpDeclare.subst(vsqrtDIop); 4127369Sgblack@eecs.umich.edu decoder_output += RegRegOpConstructor.subst(vsqrtDIop); 4137369Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vsqrtDIop); 4147370Sgblack@eecs.umich.edu 4157370Sgblack@eecs.umich.edu vmlaSCode = ''' 4167370Sgblack@eecs.umich.edu float mid = FpOp1 * FpOp2; 4177370Sgblack@eecs.umich.edu if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) { 4187370Sgblack@eecs.umich.edu mid = NAN; 4197370Sgblack@eecs.umich.edu } 4207370Sgblack@eecs.umich.edu FpDest = FpDest + mid; 4217370Sgblack@eecs.umich.edu ''' 4227370Sgblack@eecs.umich.edu vmlaSIop = InstObjParams("vmlas", "VmlaS", "RegRegRegOp", 4237370Sgblack@eecs.umich.edu { "code": vmlaSCode, 4247370Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 4257370Sgblack@eecs.umich.edu header_output += RegRegRegOpDeclare.subst(vmlaSIop); 4267370Sgblack@eecs.umich.edu decoder_output += RegRegRegOpConstructor.subst(vmlaSIop); 4277370Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmlaSIop); 4287370Sgblack@eecs.umich.edu 4297370Sgblack@eecs.umich.edu vmlaDCode = ''' 4307370Sgblack@eecs.umich.edu IntDoubleUnion cOp1, cOp2, cDest; 4317370Sgblack@eecs.umich.edu cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 4327370Sgblack@eecs.umich.edu cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32)); 4337370Sgblack@eecs.umich.edu cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32)); 4347370Sgblack@eecs.umich.edu double mid = cOp1.fp * cOp2.fp; 4357370Sgblack@eecs.umich.edu if ((isinf(cOp1.fp) && cOp2.fp == 0) || 4367370Sgblack@eecs.umich.edu (isinf(cOp2.fp) && cOp1.fp == 0)) { 4377370Sgblack@eecs.umich.edu mid = NAN; 4387370Sgblack@eecs.umich.edu } 4397370Sgblack@eecs.umich.edu cDest.fp = cDest.fp + mid; 4407370Sgblack@eecs.umich.edu FpDestP0.uw = cDest.bits; 4417370Sgblack@eecs.umich.edu FpDestP1.uw = cDest.bits >> 32; 4427370Sgblack@eecs.umich.edu ''' 4437370Sgblack@eecs.umich.edu vmlaDIop = InstObjParams("vmlad", "VmlaD", "RegRegRegOp", 4447370Sgblack@eecs.umich.edu { "code": vmlaDCode, 4457370Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 4467370Sgblack@eecs.umich.edu header_output += RegRegRegOpDeclare.subst(vmlaDIop); 4477370Sgblack@eecs.umich.edu decoder_output += RegRegRegOpConstructor.subst(vmlaDIop); 4487370Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmlaDIop); 4497370Sgblack@eecs.umich.edu 4507370Sgblack@eecs.umich.edu vmlsSCode = ''' 4517370Sgblack@eecs.umich.edu float mid = FpOp1 * FpOp2; 4527370Sgblack@eecs.umich.edu if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) { 4537370Sgblack@eecs.umich.edu mid = NAN; 4547370Sgblack@eecs.umich.edu } 4557370Sgblack@eecs.umich.edu FpDest = FpDest - mid; 4567370Sgblack@eecs.umich.edu ''' 4577370Sgblack@eecs.umich.edu vmlsSIop = InstObjParams("vmlss", "VmlsS", "RegRegRegOp", 4587370Sgblack@eecs.umich.edu { "code": vmlsSCode, 4597370Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 4607370Sgblack@eecs.umich.edu header_output += RegRegRegOpDeclare.subst(vmlsSIop); 4617370Sgblack@eecs.umich.edu decoder_output += RegRegRegOpConstructor.subst(vmlsSIop); 4627370Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmlsSIop); 4637370Sgblack@eecs.umich.edu 4647370Sgblack@eecs.umich.edu vmlsDCode = ''' 4657370Sgblack@eecs.umich.edu IntDoubleUnion cOp1, cOp2, cDest; 4667370Sgblack@eecs.umich.edu cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 4677370Sgblack@eecs.umich.edu cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32)); 4687370Sgblack@eecs.umich.edu cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32)); 4697370Sgblack@eecs.umich.edu double mid = cOp1.fp * cOp2.fp; 4707370Sgblack@eecs.umich.edu if ((isinf(cOp1.fp) && cOp2.fp == 0) || 4717370Sgblack@eecs.umich.edu (isinf(cOp2.fp) && cOp1.fp == 0)) { 4727370Sgblack@eecs.umich.edu mid = NAN; 4737370Sgblack@eecs.umich.edu } 4747370Sgblack@eecs.umich.edu cDest.fp = cDest.fp - mid; 4757370Sgblack@eecs.umich.edu FpDestP0.uw = cDest.bits; 4767370Sgblack@eecs.umich.edu FpDestP1.uw = cDest.bits >> 32; 4777370Sgblack@eecs.umich.edu ''' 4787370Sgblack@eecs.umich.edu vmlsDIop = InstObjParams("vmlsd", "VmlsD", "RegRegRegOp", 4797370Sgblack@eecs.umich.edu { "code": vmlsDCode, 4807370Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 4817370Sgblack@eecs.umich.edu header_output += RegRegRegOpDeclare.subst(vmlsDIop); 4827370Sgblack@eecs.umich.edu decoder_output += RegRegRegOpConstructor.subst(vmlsDIop); 4837370Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmlsDIop); 4847371Sgblack@eecs.umich.edu 4857371Sgblack@eecs.umich.edu vnmlaSCode = ''' 4867371Sgblack@eecs.umich.edu float mid = FpOp1 * FpOp2; 4877371Sgblack@eecs.umich.edu if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) { 4887371Sgblack@eecs.umich.edu mid = NAN; 4897371Sgblack@eecs.umich.edu } 4907371Sgblack@eecs.umich.edu FpDest = -FpDest - mid; 4917371Sgblack@eecs.umich.edu ''' 4927371Sgblack@eecs.umich.edu vnmlaSIop = InstObjParams("vnmlas", "VnmlaS", "RegRegRegOp", 4937371Sgblack@eecs.umich.edu { "code": vnmlaSCode, 4947371Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 4957371Sgblack@eecs.umich.edu header_output += RegRegRegOpDeclare.subst(vnmlaSIop); 4967371Sgblack@eecs.umich.edu decoder_output += RegRegRegOpConstructor.subst(vnmlaSIop); 4977371Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vnmlaSIop); 4987371Sgblack@eecs.umich.edu 4997371Sgblack@eecs.umich.edu vnmlaDCode = ''' 5007371Sgblack@eecs.umich.edu IntDoubleUnion cOp1, cOp2, cDest; 5017371Sgblack@eecs.umich.edu cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 5027371Sgblack@eecs.umich.edu cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32)); 5037371Sgblack@eecs.umich.edu cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32)); 5047371Sgblack@eecs.umich.edu double mid = cOp1.fp * cOp2.fp; 5057371Sgblack@eecs.umich.edu if ((isinf(cOp1.fp) && cOp2.fp == 0) || 5067371Sgblack@eecs.umich.edu (isinf(cOp2.fp) && cOp1.fp == 0)) { 5077371Sgblack@eecs.umich.edu mid = NAN; 5087371Sgblack@eecs.umich.edu } 5097371Sgblack@eecs.umich.edu cDest.fp = -cDest.fp - mid; 5107371Sgblack@eecs.umich.edu FpDestP0.uw = cDest.bits; 5117371Sgblack@eecs.umich.edu FpDestP1.uw = cDest.bits >> 32; 5127371Sgblack@eecs.umich.edu ''' 5137371Sgblack@eecs.umich.edu vnmlaDIop = InstObjParams("vnmlad", "VnmlaD", "RegRegRegOp", 5147371Sgblack@eecs.umich.edu { "code": vnmlaDCode, 5157371Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 5167371Sgblack@eecs.umich.edu header_output += RegRegRegOpDeclare.subst(vnmlaDIop); 5177371Sgblack@eecs.umich.edu decoder_output += RegRegRegOpConstructor.subst(vnmlaDIop); 5187371Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vnmlaDIop); 5197371Sgblack@eecs.umich.edu 5207371Sgblack@eecs.umich.edu vnmlsSCode = ''' 5217371Sgblack@eecs.umich.edu float mid = FpOp1 * FpOp2; 5227371Sgblack@eecs.umich.edu if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) { 5237371Sgblack@eecs.umich.edu mid = NAN; 5247371Sgblack@eecs.umich.edu } 5257371Sgblack@eecs.umich.edu FpDest = -FpDest + mid; 5267371Sgblack@eecs.umich.edu ''' 5277371Sgblack@eecs.umich.edu vnmlsSIop = InstObjParams("vnmlss", "VnmlsS", "RegRegRegOp", 5287371Sgblack@eecs.umich.edu { "code": vnmlsSCode, 5297371Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 5307371Sgblack@eecs.umich.edu header_output += RegRegRegOpDeclare.subst(vnmlsSIop); 5317371Sgblack@eecs.umich.edu decoder_output += RegRegRegOpConstructor.subst(vnmlsSIop); 5327371Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vnmlsSIop); 5337371Sgblack@eecs.umich.edu 5347371Sgblack@eecs.umich.edu vnmlsDCode = ''' 5357371Sgblack@eecs.umich.edu IntDoubleUnion cOp1, cOp2, cDest; 5367371Sgblack@eecs.umich.edu cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 5377371Sgblack@eecs.umich.edu cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32)); 5387371Sgblack@eecs.umich.edu cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32)); 5397371Sgblack@eecs.umich.edu double mid = cOp1.fp * cOp2.fp; 5407371Sgblack@eecs.umich.edu if ((isinf(cOp1.fp) && cOp2.fp == 0) || 5417371Sgblack@eecs.umich.edu (isinf(cOp2.fp) && cOp1.fp == 0)) { 5427371Sgblack@eecs.umich.edu mid = NAN; 5437371Sgblack@eecs.umich.edu } 5447371Sgblack@eecs.umich.edu cDest.fp = -cDest.fp + mid; 5457371Sgblack@eecs.umich.edu FpDestP0.uw = cDest.bits; 5467371Sgblack@eecs.umich.edu FpDestP1.uw = cDest.bits >> 32; 5477371Sgblack@eecs.umich.edu ''' 5487371Sgblack@eecs.umich.edu vnmlsDIop = InstObjParams("vnmlsd", "VnmlsD", "RegRegRegOp", 5497371Sgblack@eecs.umich.edu { "code": vnmlsDCode, 5507371Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 5517371Sgblack@eecs.umich.edu header_output += RegRegRegOpDeclare.subst(vnmlsDIop); 5527371Sgblack@eecs.umich.edu decoder_output += RegRegRegOpConstructor.subst(vnmlsDIop); 5537371Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vnmlsDIop); 5547371Sgblack@eecs.umich.edu 5557371Sgblack@eecs.umich.edu vnmulSCode = ''' 5567371Sgblack@eecs.umich.edu float mid = FpOp1 * FpOp2; 5577371Sgblack@eecs.umich.edu if ((isinf(FpOp1) && FpOp2 == 0) || (isinf(FpOp2) && FpOp1 == 0)) { 5587371Sgblack@eecs.umich.edu mid = NAN; 5597371Sgblack@eecs.umich.edu } 5607371Sgblack@eecs.umich.edu FpDest = -mid; 5617371Sgblack@eecs.umich.edu ''' 5627371Sgblack@eecs.umich.edu vnmulSIop = InstObjParams("vnmuls", "VnmulS", "RegRegRegOp", 5637371Sgblack@eecs.umich.edu { "code": vnmulSCode, 5647371Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 5657371Sgblack@eecs.umich.edu header_output += RegRegRegOpDeclare.subst(vnmulSIop); 5667371Sgblack@eecs.umich.edu decoder_output += RegRegRegOpConstructor.subst(vnmulSIop); 5677371Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vnmulSIop); 5687371Sgblack@eecs.umich.edu 5697371Sgblack@eecs.umich.edu vnmulDCode = ''' 5707371Sgblack@eecs.umich.edu IntDoubleUnion cOp1, cOp2, cDest; 5717371Sgblack@eecs.umich.edu cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 5727371Sgblack@eecs.umich.edu cOp2.bits = ((uint64_t)FpOp2P0.uw | ((uint64_t)FpOp2P1.uw << 32)); 5737371Sgblack@eecs.umich.edu cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32)); 5747371Sgblack@eecs.umich.edu double mid = cOp1.fp * cOp2.fp; 5757371Sgblack@eecs.umich.edu if ((isinf(cOp1.fp) && cOp2.fp == 0) || 5767371Sgblack@eecs.umich.edu (isinf(cOp2.fp) && cOp1.fp == 0)) { 5777371Sgblack@eecs.umich.edu mid = NAN; 5787371Sgblack@eecs.umich.edu } 5797371Sgblack@eecs.umich.edu cDest.fp = -mid; 5807371Sgblack@eecs.umich.edu FpDestP0.uw = cDest.bits; 5817371Sgblack@eecs.umich.edu FpDestP1.uw = cDest.bits >> 32; 5827371Sgblack@eecs.umich.edu ''' 5837371Sgblack@eecs.umich.edu vnmulDIop = InstObjParams("vnmuld", "VnmulD", "RegRegRegOp", 5847371Sgblack@eecs.umich.edu { "code": vnmulDCode, 5857371Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 5867371Sgblack@eecs.umich.edu header_output += RegRegRegOpDeclare.subst(vnmulDIop); 5877371Sgblack@eecs.umich.edu decoder_output += RegRegRegOpConstructor.subst(vnmulDIop); 5887371Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vnmulDIop); 5897373Sgblack@eecs.umich.edu 5907373Sgblack@eecs.umich.edu vcvtUIntFpSCode = ''' 5917373Sgblack@eecs.umich.edu FpDest = FpOp1.uw; 5927373Sgblack@eecs.umich.edu ''' 5937373Sgblack@eecs.umich.edu vcvtUIntFpSIop = InstObjParams("vcvt", "VcvtUIntFpS", "RegRegOp", 5947373Sgblack@eecs.umich.edu { "code": vcvtUIntFpSCode, 5957373Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 5967373Sgblack@eecs.umich.edu header_output += RegRegOpDeclare.subst(vcvtUIntFpSIop); 5977373Sgblack@eecs.umich.edu decoder_output += RegRegOpConstructor.subst(vcvtUIntFpSIop); 5987373Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtUIntFpSIop); 5997373Sgblack@eecs.umich.edu 6007373Sgblack@eecs.umich.edu vcvtUIntFpDCode = ''' 6017373Sgblack@eecs.umich.edu IntDoubleUnion cDest; 6027373Sgblack@eecs.umich.edu cDest.fp = (uint64_t)FpOp1P0.uw; 6037373Sgblack@eecs.umich.edu FpDestP0.uw = cDest.bits; 6047373Sgblack@eecs.umich.edu FpDestP1.uw = cDest.bits >> 32; 6057373Sgblack@eecs.umich.edu ''' 6067373Sgblack@eecs.umich.edu vcvtUIntFpDIop = InstObjParams("vcvt", "VcvtUIntFpD", "RegRegOp", 6077373Sgblack@eecs.umich.edu { "code": vcvtUIntFpDCode, 6087373Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 6097373Sgblack@eecs.umich.edu header_output += RegRegOpDeclare.subst(vcvtUIntFpDIop); 6107373Sgblack@eecs.umich.edu decoder_output += RegRegOpConstructor.subst(vcvtUIntFpDIop); 6117373Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtUIntFpDIop); 6127373Sgblack@eecs.umich.edu 6137373Sgblack@eecs.umich.edu vcvtSIntFpSCode = ''' 6147373Sgblack@eecs.umich.edu FpDest = FpOp1.sw; 6157373Sgblack@eecs.umich.edu ''' 6167373Sgblack@eecs.umich.edu vcvtSIntFpSIop = InstObjParams("vcvt", "VcvtSIntFpS", "RegRegOp", 6177373Sgblack@eecs.umich.edu { "code": vcvtSIntFpSCode, 6187373Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 6197373Sgblack@eecs.umich.edu header_output += RegRegOpDeclare.subst(vcvtSIntFpSIop); 6207373Sgblack@eecs.umich.edu decoder_output += RegRegOpConstructor.subst(vcvtSIntFpSIop); 6217373Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtSIntFpSIop); 6227373Sgblack@eecs.umich.edu 6237373Sgblack@eecs.umich.edu vcvtSIntFpDCode = ''' 6247373Sgblack@eecs.umich.edu IntDoubleUnion cDest; 6257373Sgblack@eecs.umich.edu cDest.fp = FpOp1P0.sw; 6267373Sgblack@eecs.umich.edu FpDestP0.uw = cDest.bits; 6277373Sgblack@eecs.umich.edu FpDestP1.uw = cDest.bits >> 32; 6287373Sgblack@eecs.umich.edu ''' 6297373Sgblack@eecs.umich.edu vcvtSIntFpDIop = InstObjParams("vcvt", "VcvtSIntFpD", "RegRegOp", 6307373Sgblack@eecs.umich.edu { "code": vcvtSIntFpDCode, 6317373Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 6327373Sgblack@eecs.umich.edu header_output += RegRegOpDeclare.subst(vcvtSIntFpDIop); 6337373Sgblack@eecs.umich.edu decoder_output += RegRegOpConstructor.subst(vcvtSIntFpDIop); 6347373Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtSIntFpDIop); 6357373Sgblack@eecs.umich.edu 6367373Sgblack@eecs.umich.edu vcvtFpUIntSCode = ''' 6377373Sgblack@eecs.umich.edu FpDest.uw = FpOp1; 6387373Sgblack@eecs.umich.edu ''' 6397373Sgblack@eecs.umich.edu vcvtFpUIntSIop = InstObjParams("vcvt", "VcvtFpUIntS", "RegRegOp", 6407373Sgblack@eecs.umich.edu { "code": vcvtFpUIntSCode, 6417373Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 6427373Sgblack@eecs.umich.edu header_output += RegRegOpDeclare.subst(vcvtFpUIntSIop); 6437373Sgblack@eecs.umich.edu decoder_output += RegRegOpConstructor.subst(vcvtFpUIntSIop); 6447373Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpUIntSIop); 6457373Sgblack@eecs.umich.edu 6467373Sgblack@eecs.umich.edu vcvtFpUIntDCode = ''' 6477373Sgblack@eecs.umich.edu IntDoubleUnion cOp1; 6487373Sgblack@eecs.umich.edu cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 6497373Sgblack@eecs.umich.edu uint64_t result = cOp1.fp; 6507373Sgblack@eecs.umich.edu FpDestP0.uw = result; 6517373Sgblack@eecs.umich.edu ''' 6527373Sgblack@eecs.umich.edu vcvtFpUIntDIop = InstObjParams("vcvt", "VcvtFpUIntD", "RegRegOp", 6537373Sgblack@eecs.umich.edu { "code": vcvtFpUIntDCode, 6547373Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 6557373Sgblack@eecs.umich.edu header_output += RegRegOpDeclare.subst(vcvtFpUIntDIop); 6567373Sgblack@eecs.umich.edu decoder_output += RegRegOpConstructor.subst(vcvtFpUIntDIop); 6577373Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpUIntDIop); 6587373Sgblack@eecs.umich.edu 6597373Sgblack@eecs.umich.edu vcvtFpSIntSCode = ''' 6607373Sgblack@eecs.umich.edu FpDest.sw = FpOp1; 6617373Sgblack@eecs.umich.edu ''' 6627373Sgblack@eecs.umich.edu vcvtFpSIntSIop = InstObjParams("vcvt", "VcvtFpSIntS", "RegRegOp", 6637373Sgblack@eecs.umich.edu { "code": vcvtFpSIntSCode, 6647373Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 6657373Sgblack@eecs.umich.edu header_output += RegRegOpDeclare.subst(vcvtFpSIntSIop); 6667373Sgblack@eecs.umich.edu decoder_output += RegRegOpConstructor.subst(vcvtFpSIntSIop); 6677373Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpSIntSIop); 6687373Sgblack@eecs.umich.edu 6697373Sgblack@eecs.umich.edu vcvtFpSIntDCode = ''' 6707373Sgblack@eecs.umich.edu IntDoubleUnion cOp1; 6717373Sgblack@eecs.umich.edu cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 6727373Sgblack@eecs.umich.edu int64_t result = cOp1.fp; 6737373Sgblack@eecs.umich.edu FpDestP0.uw = result; 6747373Sgblack@eecs.umich.edu ''' 6757373Sgblack@eecs.umich.edu vcvtFpSIntDIop = InstObjParams("vcvt", "VcvtFpSIntD", "RegRegOp", 6767373Sgblack@eecs.umich.edu { "code": vcvtFpSIntDCode, 6777373Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 6787373Sgblack@eecs.umich.edu header_output += RegRegOpDeclare.subst(vcvtFpSIntDIop); 6797373Sgblack@eecs.umich.edu decoder_output += RegRegOpConstructor.subst(vcvtFpSIntDIop); 6807373Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpSIntDIop); 6817374Sgblack@eecs.umich.edu 6827374Sgblack@eecs.umich.edu vcvtFpSFpDCode = ''' 6837374Sgblack@eecs.umich.edu IntDoubleUnion cDest; 6847374Sgblack@eecs.umich.edu cDest.fp = FpOp1; 6857374Sgblack@eecs.umich.edu FpDestP0.uw = cDest.bits; 6867374Sgblack@eecs.umich.edu FpDestP1.uw = cDest.bits >> 32; 6877374Sgblack@eecs.umich.edu ''' 6887374Sgblack@eecs.umich.edu vcvtFpSFpDIop = InstObjParams("vcvt", "VcvtFpSFpD", "RegRegOp", 6897374Sgblack@eecs.umich.edu { "code": vcvtFpSFpDCode, 6907374Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 6917374Sgblack@eecs.umich.edu header_output += RegRegOpDeclare.subst(vcvtFpSFpDIop); 6927374Sgblack@eecs.umich.edu decoder_output += RegRegOpConstructor.subst(vcvtFpSFpDIop); 6937374Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpSFpDIop); 6947374Sgblack@eecs.umich.edu 6957374Sgblack@eecs.umich.edu vcvtFpDFpSCode = ''' 6967374Sgblack@eecs.umich.edu IntDoubleUnion cOp1; 6977374Sgblack@eecs.umich.edu cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 6987374Sgblack@eecs.umich.edu FpDest = cOp1.fp; 6997374Sgblack@eecs.umich.edu ''' 7007374Sgblack@eecs.umich.edu vcvtFpDFpSIop = InstObjParams("vcvt", "VcvtFpDFpS", "RegRegOp", 7017374Sgblack@eecs.umich.edu { "code": vcvtFpDFpSCode, 7027374Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 7037374Sgblack@eecs.umich.edu header_output += RegRegOpDeclare.subst(vcvtFpDFpSIop); 7047374Sgblack@eecs.umich.edu decoder_output += RegRegOpConstructor.subst(vcvtFpDFpSIop); 7057374Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpDFpSIop); 7067322Sgblack@eecs.umich.edu}}; 707