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