fp.isa revision 7648
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
407376Sgblack@eecs.umich.eduoutput header {{
417376Sgblack@eecs.umich.edu
427376Sgblack@eecs.umich.edutemplate <class Micro>
437376Sgblack@eecs.umich.educlass VfpMacroRegRegOp : public VfpMacroOp
447376Sgblack@eecs.umich.edu{
457376Sgblack@eecs.umich.edu  public:
467376Sgblack@eecs.umich.edu    VfpMacroRegRegOp(ExtMachInst _machInst, IntRegIndex _dest,
477376Sgblack@eecs.umich.edu                     IntRegIndex _op1, bool _wide) :
487376Sgblack@eecs.umich.edu        VfpMacroOp("VfpMacroRegRegOp", _machInst, No_OpClass, _wide)
497376Sgblack@eecs.umich.edu    {
507376Sgblack@eecs.umich.edu        numMicroops = machInst.fpscrLen + 1;
517376Sgblack@eecs.umich.edu        assert(numMicroops > 1);
527376Sgblack@eecs.umich.edu        microOps = new StaticInstPtr[numMicroops];
537376Sgblack@eecs.umich.edu        for (unsigned i = 0; i < numMicroops; i++) {
547376Sgblack@eecs.umich.edu            VfpMicroMode mode = VfpMicroop;
557376Sgblack@eecs.umich.edu            if (i == 0)
567376Sgblack@eecs.umich.edu                mode = VfpFirstMicroop;
577376Sgblack@eecs.umich.edu            else if (i == numMicroops - 1)
587376Sgblack@eecs.umich.edu                mode = VfpLastMicroop;
597376Sgblack@eecs.umich.edu            microOps[i] = new Micro(_machInst, _dest, _op1, mode);
607376Sgblack@eecs.umich.edu            nextIdxs(_dest, _op1);
617376Sgblack@eecs.umich.edu        }
627376Sgblack@eecs.umich.edu    }
637376Sgblack@eecs.umich.edu
647376Sgblack@eecs.umich.edu    %(BasicExecPanic)s
657376Sgblack@eecs.umich.edu};
667376Sgblack@eecs.umich.edu
677376Sgblack@eecs.umich.edutemplate <class VfpOp>
687376Sgblack@eecs.umich.edustatic StaticInstPtr
697376Sgblack@eecs.umich.edudecodeVfpRegRegOp(ExtMachInst machInst,
707376Sgblack@eecs.umich.edu        IntRegIndex dest, IntRegIndex op1, bool wide)
717376Sgblack@eecs.umich.edu{
727376Sgblack@eecs.umich.edu    if (machInst.fpscrLen == 0 || VfpMacroOp::inScalarBank(dest)) {
737376Sgblack@eecs.umich.edu        return new VfpOp(machInst, dest, op1);
747376Sgblack@eecs.umich.edu    } else {
757376Sgblack@eecs.umich.edu        return new VfpMacroRegRegOp<VfpOp>(machInst, dest, op1, wide);
767376Sgblack@eecs.umich.edu    }
777376Sgblack@eecs.umich.edu}
787376Sgblack@eecs.umich.edu
797376Sgblack@eecs.umich.edutemplate <class Micro>
807376Sgblack@eecs.umich.educlass VfpMacroRegImmOp : public VfpMacroOp
817376Sgblack@eecs.umich.edu{
827376Sgblack@eecs.umich.edu  public:
837376Sgblack@eecs.umich.edu    VfpMacroRegImmOp(ExtMachInst _machInst, IntRegIndex _dest, uint64_t _imm,
847376Sgblack@eecs.umich.edu                     bool _wide) :
857376Sgblack@eecs.umich.edu        VfpMacroOp("VfpMacroRegImmOp", _machInst, No_OpClass, _wide)
867376Sgblack@eecs.umich.edu    {
877376Sgblack@eecs.umich.edu        numMicroops = machInst.fpscrLen + 1;
887376Sgblack@eecs.umich.edu        microOps = new StaticInstPtr[numMicroops];
897376Sgblack@eecs.umich.edu        for (unsigned i = 0; i < numMicroops; i++) {
907376Sgblack@eecs.umich.edu            VfpMicroMode mode = VfpMicroop;
917376Sgblack@eecs.umich.edu            if (i == 0)
927376Sgblack@eecs.umich.edu                mode = VfpFirstMicroop;
937376Sgblack@eecs.umich.edu            else if (i == numMicroops - 1)
947376Sgblack@eecs.umich.edu                mode = VfpLastMicroop;
957376Sgblack@eecs.umich.edu            microOps[i] = new Micro(_machInst, _dest, _imm, mode);
967376Sgblack@eecs.umich.edu            nextIdxs(_dest);
977376Sgblack@eecs.umich.edu        }
987376Sgblack@eecs.umich.edu    }
997376Sgblack@eecs.umich.edu
1007376Sgblack@eecs.umich.edu    %(BasicExecPanic)s
1017376Sgblack@eecs.umich.edu};
1027376Sgblack@eecs.umich.edu
1037376Sgblack@eecs.umich.edutemplate <class VfpOp>
1047376Sgblack@eecs.umich.edustatic StaticInstPtr
1057376Sgblack@eecs.umich.edudecodeVfpRegImmOp(ExtMachInst machInst,
1067376Sgblack@eecs.umich.edu        IntRegIndex dest, uint64_t imm, bool wide)
1077376Sgblack@eecs.umich.edu{
1087376Sgblack@eecs.umich.edu    if (machInst.fpscrLen == 0 || VfpMacroOp::inScalarBank(dest)) {
1097376Sgblack@eecs.umich.edu        return new VfpOp(machInst, dest, imm);
1107376Sgblack@eecs.umich.edu    } else {
1117376Sgblack@eecs.umich.edu        return new VfpMacroRegImmOp<VfpOp>(machInst, dest, imm, wide);
1127376Sgblack@eecs.umich.edu    }
1137376Sgblack@eecs.umich.edu}
1147376Sgblack@eecs.umich.edu
1157376Sgblack@eecs.umich.edutemplate <class Micro>
1167376Sgblack@eecs.umich.educlass VfpMacroRegRegImmOp : public VfpMacroOp
1177376Sgblack@eecs.umich.edu{
1187376Sgblack@eecs.umich.edu  public:
1197376Sgblack@eecs.umich.edu    VfpMacroRegRegImmOp(ExtMachInst _machInst, IntRegIndex _dest,
1207376Sgblack@eecs.umich.edu                        IntRegIndex _op1, uint64_t _imm, bool _wide) :
1217376Sgblack@eecs.umich.edu        VfpMacroOp("VfpMacroRegRegImmOp", _machInst, No_OpClass, _wide)
1227376Sgblack@eecs.umich.edu    {
1237376Sgblack@eecs.umich.edu        numMicroops = machInst.fpscrLen + 1;
1247376Sgblack@eecs.umich.edu        microOps = new StaticInstPtr[numMicroops];
1257376Sgblack@eecs.umich.edu        for (unsigned i = 0; i < numMicroops; i++) {
1267376Sgblack@eecs.umich.edu            VfpMicroMode mode = VfpMicroop;
1277376Sgblack@eecs.umich.edu            if (i == 0)
1287376Sgblack@eecs.umich.edu                mode = VfpFirstMicroop;
1297376Sgblack@eecs.umich.edu            else if (i == numMicroops - 1)
1307376Sgblack@eecs.umich.edu                mode = VfpLastMicroop;
1317376Sgblack@eecs.umich.edu            microOps[i] = new Micro(_machInst, _dest, _op1, _imm, mode);
1327376Sgblack@eecs.umich.edu            nextIdxs(_dest, _op1);
1337376Sgblack@eecs.umich.edu        }
1347376Sgblack@eecs.umich.edu    }
1357376Sgblack@eecs.umich.edu
1367376Sgblack@eecs.umich.edu    %(BasicExecPanic)s
1377376Sgblack@eecs.umich.edu};
1387376Sgblack@eecs.umich.edu
1397376Sgblack@eecs.umich.edutemplate <class VfpOp>
1407376Sgblack@eecs.umich.edustatic StaticInstPtr
1417376Sgblack@eecs.umich.edudecodeVfpRegRegImmOp(ExtMachInst machInst, IntRegIndex dest,
1427376Sgblack@eecs.umich.edu                     IntRegIndex op1, uint64_t imm, bool wide)
1437376Sgblack@eecs.umich.edu{
1447376Sgblack@eecs.umich.edu    if (machInst.fpscrLen == 0 || VfpMacroOp::inScalarBank(dest)) {
1457376Sgblack@eecs.umich.edu        return new VfpOp(machInst, dest, op1, imm);
1467376Sgblack@eecs.umich.edu    } else {
1477376Sgblack@eecs.umich.edu        return new VfpMacroRegRegImmOp<VfpOp>(machInst, dest, op1, imm, wide);
1487376Sgblack@eecs.umich.edu    }
1497376Sgblack@eecs.umich.edu}
1507376Sgblack@eecs.umich.edu
1517376Sgblack@eecs.umich.edutemplate <class Micro>
1527376Sgblack@eecs.umich.educlass VfpMacroRegRegRegOp : public VfpMacroOp
1537376Sgblack@eecs.umich.edu{
1547376Sgblack@eecs.umich.edu  public:
1557376Sgblack@eecs.umich.edu    VfpMacroRegRegRegOp(ExtMachInst _machInst, IntRegIndex _dest,
1567376Sgblack@eecs.umich.edu                        IntRegIndex _op1, IntRegIndex _op2, bool _wide) :
1577376Sgblack@eecs.umich.edu        VfpMacroOp("VfpMacroRegRegRegOp", _machInst, No_OpClass, _wide)
1587376Sgblack@eecs.umich.edu    {
1597376Sgblack@eecs.umich.edu        numMicroops = machInst.fpscrLen + 1;
1607376Sgblack@eecs.umich.edu        microOps = new StaticInstPtr[numMicroops];
1617376Sgblack@eecs.umich.edu        for (unsigned i = 0; i < numMicroops; i++) {
1627376Sgblack@eecs.umich.edu            VfpMicroMode mode = VfpMicroop;
1637376Sgblack@eecs.umich.edu            if (i == 0)
1647376Sgblack@eecs.umich.edu                mode = VfpFirstMicroop;
1657376Sgblack@eecs.umich.edu            else if (i == numMicroops - 1)
1667376Sgblack@eecs.umich.edu                mode = VfpLastMicroop;
1677376Sgblack@eecs.umich.edu            microOps[i] = new Micro(_machInst, _dest, _op1, _op2, mode);
1687376Sgblack@eecs.umich.edu            nextIdxs(_dest, _op1, _op2);
1697376Sgblack@eecs.umich.edu        }
1707376Sgblack@eecs.umich.edu    }
1717376Sgblack@eecs.umich.edu
1727376Sgblack@eecs.umich.edu    %(BasicExecPanic)s
1737376Sgblack@eecs.umich.edu};
1747376Sgblack@eecs.umich.edu
1757376Sgblack@eecs.umich.edutemplate <class VfpOp>
1767376Sgblack@eecs.umich.edustatic StaticInstPtr
1777376Sgblack@eecs.umich.edudecodeVfpRegRegRegOp(ExtMachInst machInst, IntRegIndex dest,
1787376Sgblack@eecs.umich.edu                     IntRegIndex op1, IntRegIndex op2, bool wide)
1797376Sgblack@eecs.umich.edu{
1807376Sgblack@eecs.umich.edu    if (machInst.fpscrLen == 0 || VfpMacroOp::inScalarBank(dest)) {
1817376Sgblack@eecs.umich.edu        return new VfpOp(machInst, dest, op1, op2);
1827376Sgblack@eecs.umich.edu    } else {
1837376Sgblack@eecs.umich.edu        return new VfpMacroRegRegRegOp<VfpOp>(machInst, dest, op1, op2, wide);
1847376Sgblack@eecs.umich.edu    }
1857376Sgblack@eecs.umich.edu}
1867376Sgblack@eecs.umich.edu}};
1877376Sgblack@eecs.umich.edu
1887322Sgblack@eecs.umich.edulet {{
1897322Sgblack@eecs.umich.edu
1907322Sgblack@eecs.umich.edu    header_output = ""
1917322Sgblack@eecs.umich.edu    decoder_output = ""
1927322Sgblack@eecs.umich.edu    exec_output = ""
1937322Sgblack@eecs.umich.edu
1947396Sgblack@eecs.umich.edu    vmsrIop = InstObjParams("vmsr", "Vmsr", "FpRegRegOp",
1957644Sali.saidi@arm.com                            { "code": vmsrEnabledCheckCode + \
1967640Sgblack@eecs.umich.edu                                      "MiscDest = Op1;",
1977648SAli.Saidi@ARM.com                              "predicate_test": predicateTest },
1987648SAli.Saidi@ARM.com                             ["IsSerializeAfter","IsNonSpeculative"])
1997396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vmsrIop);
2007396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vmsrIop);
2017322Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmsrIop);
2027324Sgblack@eecs.umich.edu
2037644Sali.saidi@arm.com    vmsrFpscrCode = vmsrEnabledCheckCode + '''
2047643Sgblack@eecs.umich.edu    Fpscr = Op1 & ~FpCondCodesMask;
2057643Sgblack@eecs.umich.edu    FpCondCodes = Op1 & FpCondCodesMask;
2067643Sgblack@eecs.umich.edu    '''
2077643Sgblack@eecs.umich.edu    vmsrFpscrIop = InstObjParams("vmsr", "VmsrFpscr", "FpRegRegOp",
2087643Sgblack@eecs.umich.edu                                 { "code": vmsrFpscrCode,
2097643Sgblack@eecs.umich.edu                                   "predicate_test": predicateTest }, [])
2107643Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vmsrFpscrIop);
2117643Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vmsrFpscrIop);
2127643Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmsrFpscrIop);
2137643Sgblack@eecs.umich.edu
2147396Sgblack@eecs.umich.edu    vmrsIop = InstObjParams("vmrs", "Vmrs", "FpRegRegOp",
2157644Sali.saidi@arm.com                            { "code": vmrsEnabledCheckCode + \
2167640Sgblack@eecs.umich.edu                                      "Dest = MiscOp1;",
2177324Sgblack@eecs.umich.edu                              "predicate_test": predicateTest }, [])
2187396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vmrsIop);
2197396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vmrsIop);
2207324Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmrsIop);
2217333Sgblack@eecs.umich.edu
2227643Sgblack@eecs.umich.edu    vmrsFpscrIop = InstObjParams("vmrs", "VmrsFpscr", "FpRegRegOp",
2237644Sali.saidi@arm.com                                 { "code": vmrsEnabledCheckCode + \
2247643Sgblack@eecs.umich.edu                                           "Dest = Fpscr | FpCondCodes;",
2257643Sgblack@eecs.umich.edu                                   "predicate_test": predicateTest }, [])
2267643Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vmrsFpscrIop);
2277643Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vmrsFpscrIop);
2287643Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmrsFpscrIop);
2297643Sgblack@eecs.umich.edu
2307644Sali.saidi@arm.com    vmrsApsrCode = vmrsEnabledCheckCode + '''
2317643Sgblack@eecs.umich.edu        Dest = (MiscOp1 & imm) | (Dest & ~imm);
2327643Sgblack@eecs.umich.edu    '''
2337396Sgblack@eecs.umich.edu    vmrsApsrIop = InstObjParams("vmrs", "VmrsApsr", "FpRegRegImmOp",
2347392Sgblack@eecs.umich.edu                                { "code": vmrsApsrCode,
2357392Sgblack@eecs.umich.edu                                  "predicate_test": predicateTest }, [])
2367396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vmrsApsrIop);
2377396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vmrsApsrIop);
2387392Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmrsApsrIop);
2397392Sgblack@eecs.umich.edu
2407644Sali.saidi@arm.com    vmrsApsrFpscrCode = vmrsEnabledCheckCode + '''
2417643Sgblack@eecs.umich.edu    assert((imm & ~FpCondCodesMask) == 0);
2427643Sgblack@eecs.umich.edu    Dest = (FpCondCodes & imm) | (Dest & ~imm);
2437643Sgblack@eecs.umich.edu    '''
2447643Sgblack@eecs.umich.edu    vmrsApsrFpscrIop = InstObjParams("vmrs", "VmrsApsrFpscr", "FpRegRegImmOp",
2457643Sgblack@eecs.umich.edu                                     { "code": vmrsApsrFpscrCode,
2467643Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
2477643Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vmrsApsrFpscrIop);
2487643Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vmrsApsrFpscrIop);
2497643Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmrsApsrFpscrIop);
2507643Sgblack@eecs.umich.edu
2517640Sgblack@eecs.umich.edu    vmovImmSCode = vfpEnabledCheckCode + '''
2527333Sgblack@eecs.umich.edu        FpDest.uw = bits(imm, 31, 0);
2537333Sgblack@eecs.umich.edu    '''
2547396Sgblack@eecs.umich.edu    vmovImmSIop = InstObjParams("vmov", "VmovImmS", "FpRegImmOp",
2557333Sgblack@eecs.umich.edu                                { "code": vmovImmSCode,
2567333Sgblack@eecs.umich.edu                                  "predicate_test": predicateTest }, [])
2577396Sgblack@eecs.umich.edu    header_output += FpRegImmOpDeclare.subst(vmovImmSIop);
2587396Sgblack@eecs.umich.edu    decoder_output += FpRegImmOpConstructor.subst(vmovImmSIop);
2597333Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmovImmSIop);
2607333Sgblack@eecs.umich.edu
2617640Sgblack@eecs.umich.edu    vmovImmDCode = vfpEnabledCheckCode + '''
2627333Sgblack@eecs.umich.edu        FpDestP0.uw = bits(imm, 31, 0);
2637333Sgblack@eecs.umich.edu        FpDestP1.uw = bits(imm, 63, 32);
2647333Sgblack@eecs.umich.edu    '''
2657396Sgblack@eecs.umich.edu    vmovImmDIop = InstObjParams("vmov", "VmovImmD", "FpRegImmOp",
2667333Sgblack@eecs.umich.edu                                { "code": vmovImmDCode,
2677333Sgblack@eecs.umich.edu                                  "predicate_test": predicateTest }, [])
2687396Sgblack@eecs.umich.edu    header_output += FpRegImmOpDeclare.subst(vmovImmDIop);
2697396Sgblack@eecs.umich.edu    decoder_output += FpRegImmOpConstructor.subst(vmovImmDIop);
2707333Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmovImmDIop);
2717333Sgblack@eecs.umich.edu
2727640Sgblack@eecs.umich.edu    vmovImmQCode = vfpEnabledCheckCode + '''
2737333Sgblack@eecs.umich.edu        FpDestP0.uw = bits(imm, 31, 0);
2747333Sgblack@eecs.umich.edu        FpDestP1.uw = bits(imm, 63, 32);
2757333Sgblack@eecs.umich.edu        FpDestP2.uw = bits(imm, 31, 0);
2767333Sgblack@eecs.umich.edu        FpDestP3.uw = bits(imm, 63, 32);
2777333Sgblack@eecs.umich.edu    '''
2787396Sgblack@eecs.umich.edu    vmovImmQIop = InstObjParams("vmov", "VmovImmQ", "FpRegImmOp",
2797333Sgblack@eecs.umich.edu                                { "code": vmovImmQCode,
2807333Sgblack@eecs.umich.edu                                  "predicate_test": predicateTest }, [])
2817396Sgblack@eecs.umich.edu    header_output += FpRegImmOpDeclare.subst(vmovImmQIop);
2827396Sgblack@eecs.umich.edu    decoder_output += FpRegImmOpConstructor.subst(vmovImmQIop);
2837333Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmovImmQIop);
2847333Sgblack@eecs.umich.edu
2857640Sgblack@eecs.umich.edu    vmovRegSCode = vfpEnabledCheckCode + '''
2867333Sgblack@eecs.umich.edu        FpDest.uw = FpOp1.uw;
2877333Sgblack@eecs.umich.edu    '''
2887396Sgblack@eecs.umich.edu    vmovRegSIop = InstObjParams("vmov", "VmovRegS", "FpRegRegOp",
2897333Sgblack@eecs.umich.edu                                { "code": vmovRegSCode,
2907333Sgblack@eecs.umich.edu                                  "predicate_test": predicateTest }, [])
2917396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vmovRegSIop);
2927396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vmovRegSIop);
2937333Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmovRegSIop);
2947333Sgblack@eecs.umich.edu
2957640Sgblack@eecs.umich.edu    vmovRegDCode = vfpEnabledCheckCode + '''
2967333Sgblack@eecs.umich.edu        FpDestP0.uw = FpOp1P0.uw;
2977333Sgblack@eecs.umich.edu        FpDestP1.uw = FpOp1P1.uw;
2987333Sgblack@eecs.umich.edu    '''
2997396Sgblack@eecs.umich.edu    vmovRegDIop = InstObjParams("vmov", "VmovRegD", "FpRegRegOp",
3007333Sgblack@eecs.umich.edu                                { "code": vmovRegDCode,
3017333Sgblack@eecs.umich.edu                                  "predicate_test": predicateTest }, [])
3027396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vmovRegDIop);
3037396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vmovRegDIop);
3047333Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmovRegDIop);
3057333Sgblack@eecs.umich.edu
3067640Sgblack@eecs.umich.edu    vmovRegQCode = vfpEnabledCheckCode + '''
3077333Sgblack@eecs.umich.edu        FpDestP0.uw = FpOp1P0.uw;
3087333Sgblack@eecs.umich.edu        FpDestP1.uw = FpOp1P1.uw;
3097333Sgblack@eecs.umich.edu        FpDestP2.uw = FpOp1P2.uw;
3107333Sgblack@eecs.umich.edu        FpDestP3.uw = FpOp1P3.uw;
3117333Sgblack@eecs.umich.edu    '''
3127396Sgblack@eecs.umich.edu    vmovRegQIop = InstObjParams("vmov", "VmovRegQ", "FpRegRegOp",
3137333Sgblack@eecs.umich.edu                                { "code": vmovRegQCode,
3147333Sgblack@eecs.umich.edu                                  "predicate_test": predicateTest }, [])
3157396Sgblack@eecs.umich.edu    header_output  += FpRegRegOpDeclare.subst(vmovRegQIop);
3167396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegOpConstructor.subst(vmovRegQIop);
3177333Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmovRegQIop);
3187333Sgblack@eecs.umich.edu
3197640Sgblack@eecs.umich.edu    vmovCoreRegBCode = vfpEnabledCheckCode + '''
3207639Sgblack@eecs.umich.edu        FpDest.uw = insertBits(FpDest.uw, imm * 8 + 7, imm * 8, Op1.ub);
3217333Sgblack@eecs.umich.edu    '''
3227396Sgblack@eecs.umich.edu    vmovCoreRegBIop = InstObjParams("vmov", "VmovCoreRegB", "FpRegRegImmOp",
3237333Sgblack@eecs.umich.edu                                    { "code": vmovCoreRegBCode,
3247333Sgblack@eecs.umich.edu                                      "predicate_test": predicateTest }, [])
3257396Sgblack@eecs.umich.edu    header_output  += FpRegRegImmOpDeclare.subst(vmovCoreRegBIop);
3267396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegImmOpConstructor.subst(vmovCoreRegBIop);
3277333Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmovCoreRegBIop);
3287333Sgblack@eecs.umich.edu
3297640Sgblack@eecs.umich.edu    vmovCoreRegHCode = vfpEnabledCheckCode + '''
3307639Sgblack@eecs.umich.edu        FpDest.uw = insertBits(FpDest.uw, imm * 16 + 15, imm * 16, Op1.uh);
3317333Sgblack@eecs.umich.edu    '''
3327396Sgblack@eecs.umich.edu    vmovCoreRegHIop = InstObjParams("vmov", "VmovCoreRegH", "FpRegRegImmOp",
3337333Sgblack@eecs.umich.edu                                    { "code": vmovCoreRegHCode,
3347333Sgblack@eecs.umich.edu                                      "predicate_test": predicateTest }, [])
3357396Sgblack@eecs.umich.edu    header_output  += FpRegRegImmOpDeclare.subst(vmovCoreRegHIop);
3367396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegImmOpConstructor.subst(vmovCoreRegHIop);
3377333Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmovCoreRegHIop);
3387333Sgblack@eecs.umich.edu
3397640Sgblack@eecs.umich.edu    vmovCoreRegWCode = vfpEnabledCheckCode + '''
3407333Sgblack@eecs.umich.edu        FpDest.uw = Op1.uw;
3417333Sgblack@eecs.umich.edu    '''
3427396Sgblack@eecs.umich.edu    vmovCoreRegWIop = InstObjParams("vmov", "VmovCoreRegW", "FpRegRegOp",
3437333Sgblack@eecs.umich.edu                                    { "code": vmovCoreRegWCode,
3447333Sgblack@eecs.umich.edu                                      "predicate_test": predicateTest }, [])
3457396Sgblack@eecs.umich.edu    header_output  += FpRegRegOpDeclare.subst(vmovCoreRegWIop);
3467396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegOpConstructor.subst(vmovCoreRegWIop);
3477333Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmovCoreRegWIop);
3487333Sgblack@eecs.umich.edu
3497640Sgblack@eecs.umich.edu    vmovRegCoreUBCode = vfpEnabledCheckCode + '''
3507639Sgblack@eecs.umich.edu        assert(imm < 4);
3517639Sgblack@eecs.umich.edu        Dest = bits(FpOp1.uw, imm * 8 + 7, imm * 8);
3527333Sgblack@eecs.umich.edu    '''
3537396Sgblack@eecs.umich.edu    vmovRegCoreUBIop = InstObjParams("vmov", "VmovRegCoreUB", "FpRegRegImmOp",
3547333Sgblack@eecs.umich.edu                                     { "code": vmovRegCoreUBCode,
3557333Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
3567396Sgblack@eecs.umich.edu    header_output  += FpRegRegImmOpDeclare.subst(vmovRegCoreUBIop);
3577396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegImmOpConstructor.subst(vmovRegCoreUBIop);
3587333Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmovRegCoreUBIop);
3597333Sgblack@eecs.umich.edu
3607640Sgblack@eecs.umich.edu    vmovRegCoreUHCode = vfpEnabledCheckCode + '''
3617639Sgblack@eecs.umich.edu        assert(imm < 2);
3627639Sgblack@eecs.umich.edu        Dest = bits(FpOp1.uw, imm * 16 + 15, imm * 16);
3637333Sgblack@eecs.umich.edu    '''
3647396Sgblack@eecs.umich.edu    vmovRegCoreUHIop = InstObjParams("vmov", "VmovRegCoreUH", "FpRegRegImmOp",
3657333Sgblack@eecs.umich.edu                                     { "code": vmovRegCoreUHCode,
3667333Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
3677396Sgblack@eecs.umich.edu    header_output  += FpRegRegImmOpDeclare.subst(vmovRegCoreUHIop);
3687396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegImmOpConstructor.subst(vmovRegCoreUHIop);
3697333Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmovRegCoreUHIop);
3707333Sgblack@eecs.umich.edu
3717640Sgblack@eecs.umich.edu    vmovRegCoreSBCode = vfpEnabledCheckCode + '''
3727639Sgblack@eecs.umich.edu        assert(imm < 4);
3737639Sgblack@eecs.umich.edu        Dest = sext<8>(bits(FpOp1.uw, imm * 8 + 7, imm * 8));
3747333Sgblack@eecs.umich.edu    '''
3757396Sgblack@eecs.umich.edu    vmovRegCoreSBIop = InstObjParams("vmov", "VmovRegCoreSB", "FpRegRegImmOp",
3767333Sgblack@eecs.umich.edu                                     { "code": vmovRegCoreSBCode,
3777333Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
3787396Sgblack@eecs.umich.edu    header_output  += FpRegRegImmOpDeclare.subst(vmovRegCoreSBIop);
3797396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegImmOpConstructor.subst(vmovRegCoreSBIop);
3807333Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmovRegCoreSBIop);
3817333Sgblack@eecs.umich.edu
3827640Sgblack@eecs.umich.edu    vmovRegCoreSHCode = vfpEnabledCheckCode + '''
3837639Sgblack@eecs.umich.edu        assert(imm < 2);
3847639Sgblack@eecs.umich.edu        Dest = sext<16>(bits(FpOp1.uw, imm * 16 + 15, imm * 16));
3857333Sgblack@eecs.umich.edu    '''
3867396Sgblack@eecs.umich.edu    vmovRegCoreSHIop = InstObjParams("vmov", "VmovRegCoreSH", "FpRegRegImmOp",
3877333Sgblack@eecs.umich.edu                                     { "code": vmovRegCoreSHCode,
3887333Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
3897396Sgblack@eecs.umich.edu    header_output  += FpRegRegImmOpDeclare.subst(vmovRegCoreSHIop);
3907396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegImmOpConstructor.subst(vmovRegCoreSHIop);
3917333Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmovRegCoreSHIop);
3927333Sgblack@eecs.umich.edu
3937640Sgblack@eecs.umich.edu    vmovRegCoreWCode = vfpEnabledCheckCode + '''
3947333Sgblack@eecs.umich.edu        Dest = FpOp1.uw;
3957333Sgblack@eecs.umich.edu    '''
3967396Sgblack@eecs.umich.edu    vmovRegCoreWIop = InstObjParams("vmov", "VmovRegCoreW", "FpRegRegOp",
3977333Sgblack@eecs.umich.edu                                     { "code": vmovRegCoreWCode,
3987333Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
3997396Sgblack@eecs.umich.edu    header_output  += FpRegRegOpDeclare.subst(vmovRegCoreWIop);
4007396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegOpConstructor.subst(vmovRegCoreWIop);
4017333Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmovRegCoreWIop);
4027333Sgblack@eecs.umich.edu
4037640Sgblack@eecs.umich.edu    vmov2Reg2CoreCode = vfpEnabledCheckCode + '''
4047333Sgblack@eecs.umich.edu        FpDestP0.uw = Op1.uw;
4057333Sgblack@eecs.umich.edu        FpDestP1.uw = Op2.uw;
4067333Sgblack@eecs.umich.edu    '''
4077396Sgblack@eecs.umich.edu    vmov2Reg2CoreIop = InstObjParams("vmov", "Vmov2Reg2Core", "FpRegRegRegOp",
4087333Sgblack@eecs.umich.edu                                     { "code": vmov2Reg2CoreCode,
4097333Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
4107396Sgblack@eecs.umich.edu    header_output  += FpRegRegRegOpDeclare.subst(vmov2Reg2CoreIop);
4117396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegRegOpConstructor.subst(vmov2Reg2CoreIop);
4127333Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmov2Reg2CoreIop);
4137333Sgblack@eecs.umich.edu
4147640Sgblack@eecs.umich.edu    vmov2Core2RegCode = vfpEnabledCheckCode + '''
4157333Sgblack@eecs.umich.edu        Dest.uw = FpOp2P0.uw;
4167333Sgblack@eecs.umich.edu        Op1.uw = FpOp2P1.uw;
4177333Sgblack@eecs.umich.edu    '''
4187396Sgblack@eecs.umich.edu    vmov2Core2RegIop = InstObjParams("vmov", "Vmov2Core2Reg", "FpRegRegRegOp",
4197333Sgblack@eecs.umich.edu                                     { "code": vmov2Core2RegCode,
4207333Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
4217396Sgblack@eecs.umich.edu    header_output  += FpRegRegRegOpDeclare.subst(vmov2Core2RegIop);
4227396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegRegOpConstructor.subst(vmov2Core2RegIop);
4237333Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmov2Core2RegIop);
4247381Sgblack@eecs.umich.edu}};
4257381Sgblack@eecs.umich.edu
4267381Sgblack@eecs.umich.edulet {{
4277381Sgblack@eecs.umich.edu
4287381Sgblack@eecs.umich.edu    header_output = ""
4297381Sgblack@eecs.umich.edu    decoder_output = ""
4307381Sgblack@eecs.umich.edu    exec_output = ""
4317364Sgblack@eecs.umich.edu
4327640Sgblack@eecs.umich.edu    singleCode = vfpEnabledCheckCode + '''
4337643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
4347396Sgblack@eecs.umich.edu        FpDest = %(op)s;
4357643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
4367364Sgblack@eecs.umich.edu    '''
4377396Sgblack@eecs.umich.edu    singleBinOp = "binaryOp(fpscr, FpOp1, FpOp2," + \
4387639Sgblack@eecs.umich.edu                "%(func)s, fpscr.fz, fpscr.dn, fpscr.rMode)"
4397396Sgblack@eecs.umich.edu    singleUnaryOp = "unaryOp(fpscr, FpOp1, %(func)s, fpscr.fz, fpscr.rMode)"
4407640Sgblack@eecs.umich.edu    doubleCode = vfpEnabledCheckCode + '''
4417643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
4427396Sgblack@eecs.umich.edu        double dest = %(op)s;
4437643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
4447396Sgblack@eecs.umich.edu        FpDestP0.uw = dblLow(dest);
4457396Sgblack@eecs.umich.edu        FpDestP1.uw = dblHi(dest);
4467396Sgblack@eecs.umich.edu    '''
4477396Sgblack@eecs.umich.edu    doubleBinOp = '''
4487396Sgblack@eecs.umich.edu        binaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw),
4497396Sgblack@eecs.umich.edu                        dbl(FpOp2P0.uw, FpOp2P1.uw),
4507639Sgblack@eecs.umich.edu                        %(func)s, fpscr.fz, fpscr.dn, fpscr.rMode);
4517396Sgblack@eecs.umich.edu    '''
4527396Sgblack@eecs.umich.edu    doubleUnaryOp = '''
4537396Sgblack@eecs.umich.edu        unaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw), %(func)s,
4547396Sgblack@eecs.umich.edu                fpscr.fz, fpscr.rMode)
4557396Sgblack@eecs.umich.edu    '''
4567364Sgblack@eecs.umich.edu
4577396Sgblack@eecs.umich.edu    def buildBinFpOp(name, Name, base, singleOp, doubleOp):
4587396Sgblack@eecs.umich.edu        global header_output, decoder_output, exec_output
4597365Sgblack@eecs.umich.edu
4607396Sgblack@eecs.umich.edu        code = singleCode % { "op": singleBinOp }
4617396Sgblack@eecs.umich.edu        code = code % { "func": singleOp }
4627396Sgblack@eecs.umich.edu        sIop = InstObjParams(name + "s", Name + "S", base,
4637396Sgblack@eecs.umich.edu                { "code": code, "predicate_test": predicateTest }, [])
4647396Sgblack@eecs.umich.edu        code = doubleCode % { "op": doubleBinOp }
4657396Sgblack@eecs.umich.edu        code = code % { "func": doubleOp }
4667396Sgblack@eecs.umich.edu        dIop = InstObjParams(name + "d", Name + "D", base,
4677396Sgblack@eecs.umich.edu                { "code": code, "predicate_test": predicateTest }, [])
4687365Sgblack@eecs.umich.edu
4697396Sgblack@eecs.umich.edu        declareTempl = eval(base + "Declare");
4707396Sgblack@eecs.umich.edu        constructorTempl = eval(base + "Constructor");
4717366Sgblack@eecs.umich.edu
4727396Sgblack@eecs.umich.edu        for iop in sIop, dIop:
4737396Sgblack@eecs.umich.edu            header_output += declareTempl.subst(iop)
4747396Sgblack@eecs.umich.edu            decoder_output += constructorTempl.subst(iop)
4757396Sgblack@eecs.umich.edu            exec_output += PredOpExecute.subst(iop)
4767366Sgblack@eecs.umich.edu
4777396Sgblack@eecs.umich.edu    buildBinFpOp("vadd", "Vadd", "FpRegRegRegOp", "fpAddS", "fpAddD")
4787396Sgblack@eecs.umich.edu    buildBinFpOp("vsub", "Vsub", "FpRegRegRegOp", "fpSubS", "fpSubD")
4797396Sgblack@eecs.umich.edu    buildBinFpOp("vdiv", "Vdiv", "FpRegRegRegOp", "fpDivS", "fpDivD")
4807396Sgblack@eecs.umich.edu    buildBinFpOp("vmul", "Vmul", "FpRegRegRegOp", "fpMulS", "fpMulD")
4817367Sgblack@eecs.umich.edu
4827396Sgblack@eecs.umich.edu    def buildUnaryFpOp(name, Name, base, singleOp, doubleOp = None):
4837396Sgblack@eecs.umich.edu        if doubleOp is None:
4847396Sgblack@eecs.umich.edu            doubleOp = singleOp
4857396Sgblack@eecs.umich.edu        global header_output, decoder_output, exec_output
4867367Sgblack@eecs.umich.edu
4877396Sgblack@eecs.umich.edu        code = singleCode % { "op": singleUnaryOp }
4887396Sgblack@eecs.umich.edu        code = code % { "func": singleOp }
4897396Sgblack@eecs.umich.edu        sIop = InstObjParams(name + "s", Name + "S", base,
4907396Sgblack@eecs.umich.edu                { "code": code, "predicate_test": predicateTest }, [])
4917396Sgblack@eecs.umich.edu        code = doubleCode % { "op": doubleUnaryOp }
4927396Sgblack@eecs.umich.edu        code = code % { "func": doubleOp }
4937396Sgblack@eecs.umich.edu        dIop = InstObjParams(name + "d", Name + "D", base,
4947396Sgblack@eecs.umich.edu                { "code": code, "predicate_test": predicateTest }, [])
4957368Sgblack@eecs.umich.edu
4967396Sgblack@eecs.umich.edu        declareTempl = eval(base + "Declare");
4977396Sgblack@eecs.umich.edu        constructorTempl = eval(base + "Constructor");
4987368Sgblack@eecs.umich.edu
4997396Sgblack@eecs.umich.edu        for iop in sIop, dIop:
5007396Sgblack@eecs.umich.edu            header_output += declareTempl.subst(iop)
5017396Sgblack@eecs.umich.edu            decoder_output += constructorTempl.subst(iop)
5027396Sgblack@eecs.umich.edu            exec_output += PredOpExecute.subst(iop)
5037369Sgblack@eecs.umich.edu
5047396Sgblack@eecs.umich.edu    buildUnaryFpOp("vsqrt", "Vsqrt", "FpRegRegOp", "sqrtf", "sqrt")
5057369Sgblack@eecs.umich.edu
5067396Sgblack@eecs.umich.edu    def buildSimpleUnaryFpOp(name, Name, base, singleOp, doubleOp = None):
5077396Sgblack@eecs.umich.edu        if doubleOp is None:
5087396Sgblack@eecs.umich.edu            doubleOp = singleOp
5097396Sgblack@eecs.umich.edu        global header_output, decoder_output, exec_output
5107369Sgblack@eecs.umich.edu
5117396Sgblack@eecs.umich.edu        sIop = InstObjParams(name + "s", Name + "S", base,
5127396Sgblack@eecs.umich.edu                { "code": singleCode % { "op": singleOp },
5137396Sgblack@eecs.umich.edu                  "predicate_test": predicateTest }, [])
5147396Sgblack@eecs.umich.edu        dIop = InstObjParams(name + "d", Name + "D", base,
5157396Sgblack@eecs.umich.edu                { "code": doubleCode % { "op": doubleOp },
5167396Sgblack@eecs.umich.edu                  "predicate_test": predicateTest }, [])
5177369Sgblack@eecs.umich.edu
5187396Sgblack@eecs.umich.edu        declareTempl = eval(base + "Declare");
5197396Sgblack@eecs.umich.edu        constructorTempl = eval(base + "Constructor");
5207396Sgblack@eecs.umich.edu
5217396Sgblack@eecs.umich.edu        for iop in sIop, dIop:
5227396Sgblack@eecs.umich.edu            header_output += declareTempl.subst(iop)
5237396Sgblack@eecs.umich.edu            decoder_output += constructorTempl.subst(iop)
5247396Sgblack@eecs.umich.edu            exec_output += PredOpExecute.subst(iop)
5257396Sgblack@eecs.umich.edu
5267396Sgblack@eecs.umich.edu    buildSimpleUnaryFpOp("vneg", "Vneg", "FpRegRegOp",
5277396Sgblack@eecs.umich.edu                         "-FpOp1", "-dbl(FpOp1P0.uw, FpOp1P1.uw)")
5287396Sgblack@eecs.umich.edu    buildSimpleUnaryFpOp("vabs", "Vabs", "FpRegRegOp",
5297396Sgblack@eecs.umich.edu                         "fabsf(FpOp1)", "fabs(dbl(FpOp1P0.uw, FpOp1P1.uw))")
5307381Sgblack@eecs.umich.edu}};
5317381Sgblack@eecs.umich.edu
5327381Sgblack@eecs.umich.edulet {{
5337381Sgblack@eecs.umich.edu
5347381Sgblack@eecs.umich.edu    header_output = ""
5357381Sgblack@eecs.umich.edu    decoder_output = ""
5367381Sgblack@eecs.umich.edu    exec_output = ""
5377370Sgblack@eecs.umich.edu
5387640Sgblack@eecs.umich.edu    vmlaSCode = vfpEnabledCheckCode + '''
5397643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
5407396Sgblack@eecs.umich.edu        float mid = binaryOp(fpscr, FpOp1, FpOp2,
5417639Sgblack@eecs.umich.edu                fpMulS, fpscr.fz, fpscr.dn, fpscr.rMode);
5427639Sgblack@eecs.umich.edu        FpDest = binaryOp(fpscr, FpDest, mid, fpAddS,
5437639Sgblack@eecs.umich.edu                fpscr.fz, fpscr.dn, fpscr.rMode);
5447643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
5457370Sgblack@eecs.umich.edu    '''
5467396Sgblack@eecs.umich.edu    vmlaSIop = InstObjParams("vmlas", "VmlaS", "FpRegRegRegOp",
5477370Sgblack@eecs.umich.edu                                     { "code": vmlaSCode,
5487370Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
5497396Sgblack@eecs.umich.edu    header_output  += FpRegRegRegOpDeclare.subst(vmlaSIop);
5507396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegRegOpConstructor.subst(vmlaSIop);
5517370Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmlaSIop);
5527370Sgblack@eecs.umich.edu
5537640Sgblack@eecs.umich.edu    vmlaDCode = vfpEnabledCheckCode + '''
5547643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
5557396Sgblack@eecs.umich.edu        double mid = binaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw),
5567396Sgblack@eecs.umich.edu                                     dbl(FpOp2P0.uw, FpOp2P1.uw),
5577639Sgblack@eecs.umich.edu                                     fpMulD, fpscr.fz, fpscr.dn, fpscr.rMode);
5587396Sgblack@eecs.umich.edu        double dest = binaryOp(fpscr, dbl(FpDestP0.uw, FpDestP1.uw),
5597639Sgblack@eecs.umich.edu                                      mid, fpAddD, fpscr.fz,
5607639Sgblack@eecs.umich.edu                                      fpscr.dn, fpscr.rMode);
5617643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
5627396Sgblack@eecs.umich.edu        FpDestP0.uw = dblLow(dest);
5637396Sgblack@eecs.umich.edu        FpDestP1.uw = dblHi(dest);
5647370Sgblack@eecs.umich.edu    '''
5657396Sgblack@eecs.umich.edu    vmlaDIop = InstObjParams("vmlad", "VmlaD", "FpRegRegRegOp",
5667370Sgblack@eecs.umich.edu                                     { "code": vmlaDCode,
5677370Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
5687396Sgblack@eecs.umich.edu    header_output  += FpRegRegRegOpDeclare.subst(vmlaDIop);
5697396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegRegOpConstructor.subst(vmlaDIop);
5707370Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmlaDIop);
5717370Sgblack@eecs.umich.edu
5727640Sgblack@eecs.umich.edu    vmlsSCode = vfpEnabledCheckCode + '''
5737643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
5747396Sgblack@eecs.umich.edu        float mid = binaryOp(fpscr, FpOp1, FpOp2,
5757639Sgblack@eecs.umich.edu                fpMulS, fpscr.fz, fpscr.dn, fpscr.rMode);
5767639Sgblack@eecs.umich.edu        FpDest = binaryOp(fpscr, FpDest, -mid, fpAddS,
5777639Sgblack@eecs.umich.edu                fpscr.fz, fpscr.dn, fpscr.rMode);
5787643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
5797370Sgblack@eecs.umich.edu    '''
5807396Sgblack@eecs.umich.edu    vmlsSIop = InstObjParams("vmlss", "VmlsS", "FpRegRegRegOp",
5817370Sgblack@eecs.umich.edu                                     { "code": vmlsSCode,
5827370Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
5837396Sgblack@eecs.umich.edu    header_output  += FpRegRegRegOpDeclare.subst(vmlsSIop);
5847396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegRegOpConstructor.subst(vmlsSIop);
5857370Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmlsSIop);
5867370Sgblack@eecs.umich.edu
5877640Sgblack@eecs.umich.edu    vmlsDCode = vfpEnabledCheckCode + '''
5887643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
5897396Sgblack@eecs.umich.edu        double mid = binaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw),
5907396Sgblack@eecs.umich.edu                                     dbl(FpOp2P0.uw, FpOp2P1.uw),
5917639Sgblack@eecs.umich.edu                                     fpMulD, fpscr.fz, fpscr.dn, fpscr.rMode);
5927396Sgblack@eecs.umich.edu        double dest = binaryOp(fpscr, dbl(FpDestP0.uw, FpDestP1.uw),
5937639Sgblack@eecs.umich.edu                                      -mid, fpAddD, fpscr.fz,
5947639Sgblack@eecs.umich.edu                                      fpscr.dn, fpscr.rMode);
5957643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
5967396Sgblack@eecs.umich.edu        FpDestP0.uw = dblLow(dest);
5977396Sgblack@eecs.umich.edu        FpDestP1.uw = dblHi(dest);
5987370Sgblack@eecs.umich.edu    '''
5997396Sgblack@eecs.umich.edu    vmlsDIop = InstObjParams("vmlsd", "VmlsD", "FpRegRegRegOp",
6007370Sgblack@eecs.umich.edu                                     { "code": vmlsDCode,
6017370Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
6027396Sgblack@eecs.umich.edu    header_output  += FpRegRegRegOpDeclare.subst(vmlsDIop);
6037396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegRegOpConstructor.subst(vmlsDIop);
6047370Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmlsDIop);
6057371Sgblack@eecs.umich.edu
6067640Sgblack@eecs.umich.edu    vnmlaSCode = vfpEnabledCheckCode + '''
6077643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
6087396Sgblack@eecs.umich.edu        float mid = binaryOp(fpscr, FpOp1, FpOp2,
6097639Sgblack@eecs.umich.edu                fpMulS, fpscr.fz, fpscr.dn, fpscr.rMode);
6107639Sgblack@eecs.umich.edu        FpDest = binaryOp(fpscr, -FpDest, -mid, fpAddS,
6117639Sgblack@eecs.umich.edu                fpscr.fz, fpscr.dn, fpscr.rMode);
6127643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
6137371Sgblack@eecs.umich.edu    '''
6147396Sgblack@eecs.umich.edu    vnmlaSIop = InstObjParams("vnmlas", "VnmlaS", "FpRegRegRegOp",
6157371Sgblack@eecs.umich.edu                                     { "code": vnmlaSCode,
6167371Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
6177396Sgblack@eecs.umich.edu    header_output  += FpRegRegRegOpDeclare.subst(vnmlaSIop);
6187396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegRegOpConstructor.subst(vnmlaSIop);
6197371Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vnmlaSIop);
6207371Sgblack@eecs.umich.edu
6217640Sgblack@eecs.umich.edu    vnmlaDCode = vfpEnabledCheckCode + '''
6227643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
6237396Sgblack@eecs.umich.edu        double mid = binaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw),
6247396Sgblack@eecs.umich.edu                                     dbl(FpOp2P0.uw, FpOp2P1.uw),
6257639Sgblack@eecs.umich.edu                                     fpMulD, fpscr.fz, fpscr.dn, fpscr.rMode);
6267396Sgblack@eecs.umich.edu        double dest = binaryOp(fpscr, -dbl(FpDestP0.uw, FpDestP1.uw),
6277639Sgblack@eecs.umich.edu                                      -mid, fpAddD, fpscr.fz,
6287639Sgblack@eecs.umich.edu                                      fpscr.dn, fpscr.rMode);
6297643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
6307396Sgblack@eecs.umich.edu        FpDestP0.uw = dblLow(dest);
6317396Sgblack@eecs.umich.edu        FpDestP1.uw = dblHi(dest);
6327371Sgblack@eecs.umich.edu    '''
6337396Sgblack@eecs.umich.edu    vnmlaDIop = InstObjParams("vnmlad", "VnmlaD", "FpRegRegRegOp",
6347371Sgblack@eecs.umich.edu                                     { "code": vnmlaDCode,
6357371Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
6367396Sgblack@eecs.umich.edu    header_output  += FpRegRegRegOpDeclare.subst(vnmlaDIop);
6377396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegRegOpConstructor.subst(vnmlaDIop);
6387371Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vnmlaDIop);
6397371Sgblack@eecs.umich.edu
6407640Sgblack@eecs.umich.edu    vnmlsSCode = vfpEnabledCheckCode + '''
6417643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
6427396Sgblack@eecs.umich.edu        float mid = binaryOp(fpscr, FpOp1, FpOp2,
6437639Sgblack@eecs.umich.edu                fpMulS, fpscr.fz, fpscr.dn, fpscr.rMode);
6447639Sgblack@eecs.umich.edu        FpDest = binaryOp(fpscr, -FpDest, mid, fpAddS,
6457639Sgblack@eecs.umich.edu                fpscr.fz, fpscr.dn, fpscr.rMode);
6467643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
6477371Sgblack@eecs.umich.edu    '''
6487396Sgblack@eecs.umich.edu    vnmlsSIop = InstObjParams("vnmlss", "VnmlsS", "FpRegRegRegOp",
6497371Sgblack@eecs.umich.edu                                     { "code": vnmlsSCode,
6507371Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
6517396Sgblack@eecs.umich.edu    header_output  += FpRegRegRegOpDeclare.subst(vnmlsSIop);
6527396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegRegOpConstructor.subst(vnmlsSIop);
6537371Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vnmlsSIop);
6547371Sgblack@eecs.umich.edu
6557640Sgblack@eecs.umich.edu    vnmlsDCode = vfpEnabledCheckCode + '''
6567643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
6577396Sgblack@eecs.umich.edu        double mid = binaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw),
6587396Sgblack@eecs.umich.edu                                     dbl(FpOp2P0.uw, FpOp2P1.uw),
6597639Sgblack@eecs.umich.edu                                     fpMulD, fpscr.fz, fpscr.dn, fpscr.rMode);
6607396Sgblack@eecs.umich.edu        double dest = binaryOp(fpscr, -dbl(FpDestP0.uw, FpDestP1.uw),
6617639Sgblack@eecs.umich.edu                                      mid, fpAddD, fpscr.fz,
6627639Sgblack@eecs.umich.edu                                      fpscr.dn, fpscr.rMode);
6637643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
6647396Sgblack@eecs.umich.edu        FpDestP0.uw = dblLow(dest);
6657396Sgblack@eecs.umich.edu        FpDestP1.uw = dblHi(dest);
6667371Sgblack@eecs.umich.edu    '''
6677396Sgblack@eecs.umich.edu    vnmlsDIop = InstObjParams("vnmlsd", "VnmlsD", "FpRegRegRegOp",
6687371Sgblack@eecs.umich.edu                                     { "code": vnmlsDCode,
6697371Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
6707396Sgblack@eecs.umich.edu    header_output  += FpRegRegRegOpDeclare.subst(vnmlsDIop);
6717396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegRegOpConstructor.subst(vnmlsDIop);
6727371Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vnmlsDIop);
6737371Sgblack@eecs.umich.edu
6747640Sgblack@eecs.umich.edu    vnmulSCode = vfpEnabledCheckCode + '''
6757643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
6767639Sgblack@eecs.umich.edu        FpDest = -binaryOp(fpscr, FpOp1, FpOp2, fpMulS,
6777639Sgblack@eecs.umich.edu                fpscr.fz, fpscr.dn, fpscr.rMode);
6787643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
6797371Sgblack@eecs.umich.edu    '''
6807396Sgblack@eecs.umich.edu    vnmulSIop = InstObjParams("vnmuls", "VnmulS", "FpRegRegRegOp",
6817371Sgblack@eecs.umich.edu                                     { "code": vnmulSCode,
6827371Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
6837396Sgblack@eecs.umich.edu    header_output  += FpRegRegRegOpDeclare.subst(vnmulSIop);
6847396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegRegOpConstructor.subst(vnmulSIop);
6857371Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vnmulSIop);
6867371Sgblack@eecs.umich.edu
6877640Sgblack@eecs.umich.edu    vnmulDCode = vfpEnabledCheckCode + '''
6887643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
6897396Sgblack@eecs.umich.edu        double dest = -binaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw),
6907396Sgblack@eecs.umich.edu                                       dbl(FpOp2P0.uw, FpOp2P1.uw),
6917639Sgblack@eecs.umich.edu                                       fpMulD, fpscr.fz, fpscr.dn,
6927639Sgblack@eecs.umich.edu                                       fpscr.rMode);
6937643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
6947396Sgblack@eecs.umich.edu        FpDestP0.uw = dblLow(dest);
6957396Sgblack@eecs.umich.edu        FpDestP1.uw = dblHi(dest);
6967371Sgblack@eecs.umich.edu    '''
6977396Sgblack@eecs.umich.edu    vnmulDIop = InstObjParams("vnmuld", "VnmulD", "FpRegRegRegOp",
6987371Sgblack@eecs.umich.edu                                     { "code": vnmulDCode,
6997371Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
7007396Sgblack@eecs.umich.edu    header_output += FpRegRegRegOpDeclare.subst(vnmulDIop);
7017396Sgblack@eecs.umich.edu    decoder_output += FpRegRegRegOpConstructor.subst(vnmulDIop);
7027371Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vnmulDIop);
7037381Sgblack@eecs.umich.edu}};
7047381Sgblack@eecs.umich.edu
7057381Sgblack@eecs.umich.edulet {{
7067381Sgblack@eecs.umich.edu
7077381Sgblack@eecs.umich.edu    header_output = ""
7087381Sgblack@eecs.umich.edu    decoder_output = ""
7097381Sgblack@eecs.umich.edu    exec_output = ""
7107373Sgblack@eecs.umich.edu
7117640Sgblack@eecs.umich.edu    vcvtUIntFpSCode = vfpEnabledCheckCode + '''
7127643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
7137397Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
7147381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1.uw) : "m" (FpOp1.uw));
7157373Sgblack@eecs.umich.edu        FpDest = FpOp1.uw;
7167381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest));
7177639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
7187643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
7197373Sgblack@eecs.umich.edu    '''
7207396Sgblack@eecs.umich.edu    vcvtUIntFpSIop = InstObjParams("vcvt", "VcvtUIntFpS", "FpRegRegOp",
7217373Sgblack@eecs.umich.edu                                     { "code": vcvtUIntFpSCode,
7227373Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
7237396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcvtUIntFpSIop);
7247396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcvtUIntFpSIop);
7257373Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtUIntFpSIop);
7267373Sgblack@eecs.umich.edu
7277640Sgblack@eecs.umich.edu    vcvtUIntFpDCode = vfpEnabledCheckCode + '''
7287643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
7297397Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
7307381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1P0.uw) : "m" (FpOp1P0.uw));
7317397Sgblack@eecs.umich.edu        double cDest = (uint64_t)FpOp1P0.uw;
7327397Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (cDest));
7337639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
7347643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
7357397Sgblack@eecs.umich.edu        FpDestP0.uw = dblLow(cDest);
7367397Sgblack@eecs.umich.edu        FpDestP1.uw = dblHi(cDest);
7377373Sgblack@eecs.umich.edu    '''
7387396Sgblack@eecs.umich.edu    vcvtUIntFpDIop = InstObjParams("vcvt", "VcvtUIntFpD", "FpRegRegOp",
7397373Sgblack@eecs.umich.edu                                     { "code": vcvtUIntFpDCode,
7407373Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
7417396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcvtUIntFpDIop);
7427396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcvtUIntFpDIop);
7437373Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtUIntFpDIop);
7447373Sgblack@eecs.umich.edu
7457640Sgblack@eecs.umich.edu    vcvtSIntFpSCode = vfpEnabledCheckCode + '''
7467643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
7477397Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
7487381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1.sw) : "m" (FpOp1.sw));
7497373Sgblack@eecs.umich.edu        FpDest = FpOp1.sw;
7507381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest));
7517639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
7527643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
7537373Sgblack@eecs.umich.edu    '''
7547396Sgblack@eecs.umich.edu    vcvtSIntFpSIop = InstObjParams("vcvt", "VcvtSIntFpS", "FpRegRegOp",
7557373Sgblack@eecs.umich.edu                                     { "code": vcvtSIntFpSCode,
7567373Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
7577396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcvtSIntFpSIop);
7587396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcvtSIntFpSIop);
7597373Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtSIntFpSIop);
7607373Sgblack@eecs.umich.edu
7617640Sgblack@eecs.umich.edu    vcvtSIntFpDCode = vfpEnabledCheckCode + '''
7627643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
7637397Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
7647381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1P0.sw) : "m" (FpOp1P0.sw));
7657397Sgblack@eecs.umich.edu        double cDest = FpOp1P0.sw;
7667397Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (cDest));
7677639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
7687643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
7697397Sgblack@eecs.umich.edu        FpDestP0.uw = dblLow(cDest);
7707397Sgblack@eecs.umich.edu        FpDestP1.uw = dblHi(cDest);
7717373Sgblack@eecs.umich.edu    '''
7727396Sgblack@eecs.umich.edu    vcvtSIntFpDIop = InstObjParams("vcvt", "VcvtSIntFpD", "FpRegRegOp",
7737373Sgblack@eecs.umich.edu                                     { "code": vcvtSIntFpDCode,
7747373Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
7757396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcvtSIntFpDIop);
7767396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcvtSIntFpDIop);
7777373Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtSIntFpDIop);
7787373Sgblack@eecs.umich.edu
7797640Sgblack@eecs.umich.edu    vcvtFpUIntSRCode = vfpEnabledCheckCode + '''
7807643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
7817397Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
7827397Sgblack@eecs.umich.edu        vfpFlushToZero(fpscr, FpOp1);
7837381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
7847388Sgblack@eecs.umich.edu        FpDest.uw = vfpFpSToFixed(FpOp1, false, false, 0, false);
7857381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest.uw));
7867639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
7877643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
7887380Sgblack@eecs.umich.edu    '''
7897396Sgblack@eecs.umich.edu    vcvtFpUIntSRIop = InstObjParams("vcvt", "VcvtFpUIntSR", "FpRegRegOp",
7907380Sgblack@eecs.umich.edu                                     { "code": vcvtFpUIntSRCode,
7917380Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
7927396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcvtFpUIntSRIop);
7937396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcvtFpUIntSRIop);
7947380Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpUIntSRIop);
7957380Sgblack@eecs.umich.edu
7967640Sgblack@eecs.umich.edu    vcvtFpUIntDRCode = vfpEnabledCheckCode + '''
7977643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
7987397Sgblack@eecs.umich.edu        double cOp1 = dbl(FpOp1P0.uw, FpOp1P1.uw);
7997397Sgblack@eecs.umich.edu        vfpFlushToZero(fpscr, cOp1);
8007397Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
8017397Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (cOp1) : "m" (cOp1));
8027397Sgblack@eecs.umich.edu        uint64_t result = vfpFpDToFixed(cOp1, false, false, 0, false);
8037381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (result));
8047639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
8057643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
8067380Sgblack@eecs.umich.edu        FpDestP0.uw = result;
8077380Sgblack@eecs.umich.edu    '''
8087396Sgblack@eecs.umich.edu    vcvtFpUIntDRIop = InstObjParams("vcvtr", "VcvtFpUIntDR", "FpRegRegOp",
8097380Sgblack@eecs.umich.edu                                     { "code": vcvtFpUIntDRCode,
8107380Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
8117396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcvtFpUIntDRIop);
8127396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcvtFpUIntDRIop);
8137380Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpUIntDRIop);
8147380Sgblack@eecs.umich.edu
8157640Sgblack@eecs.umich.edu    vcvtFpSIntSRCode = vfpEnabledCheckCode + '''
8167643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
8177397Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
8187397Sgblack@eecs.umich.edu        vfpFlushToZero(fpscr, FpOp1);
8197381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
8207388Sgblack@eecs.umich.edu        FpDest.sw = vfpFpSToFixed(FpOp1, true, false, 0, false);
8217381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest.sw));
8227639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
8237643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
8247380Sgblack@eecs.umich.edu    '''
8257396Sgblack@eecs.umich.edu    vcvtFpSIntSRIop = InstObjParams("vcvtr", "VcvtFpSIntSR", "FpRegRegOp",
8267380Sgblack@eecs.umich.edu                                     { "code": vcvtFpSIntSRCode,
8277380Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
8287396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcvtFpSIntSRIop);
8297396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcvtFpSIntSRIop);
8307380Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpSIntSRIop);
8317380Sgblack@eecs.umich.edu
8327640Sgblack@eecs.umich.edu    vcvtFpSIntDRCode = vfpEnabledCheckCode + '''
8337643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
8347397Sgblack@eecs.umich.edu        double cOp1 = dbl(FpOp1P0.uw, FpOp1P1.uw);
8357397Sgblack@eecs.umich.edu        vfpFlushToZero(fpscr, cOp1);
8367397Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
8377397Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (cOp1) : "m" (cOp1));
8387397Sgblack@eecs.umich.edu        int64_t result = vfpFpDToFixed(cOp1, true, false, 0, false);
8397381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (result));
8407639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
8417643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
8427380Sgblack@eecs.umich.edu        FpDestP0.uw = result;
8437380Sgblack@eecs.umich.edu    '''
8447396Sgblack@eecs.umich.edu    vcvtFpSIntDRIop = InstObjParams("vcvtr", "VcvtFpSIntDR", "FpRegRegOp",
8457380Sgblack@eecs.umich.edu                                     { "code": vcvtFpSIntDRCode,
8467380Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
8477396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcvtFpSIntDRIop);
8487396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcvtFpSIntDRIop);
8497380Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpSIntDRIop);
8507380Sgblack@eecs.umich.edu
8517640Sgblack@eecs.umich.edu    vcvtFpUIntSCode = vfpEnabledCheckCode + '''
8527643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
8537397Sgblack@eecs.umich.edu        vfpFlushToZero(fpscr, FpOp1);
8547397Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
8557380Sgblack@eecs.umich.edu        fesetround(FeRoundZero);
8567381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
8577387Sgblack@eecs.umich.edu        FpDest.uw = vfpFpSToFixed(FpOp1, false, false, 0);
8587381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest.uw));
8597639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
8607643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
8617373Sgblack@eecs.umich.edu    '''
8627396Sgblack@eecs.umich.edu    vcvtFpUIntSIop = InstObjParams("vcvt", "VcvtFpUIntS", "FpRegRegOp",
8637373Sgblack@eecs.umich.edu                                     { "code": vcvtFpUIntSCode,
8647373Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
8657396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcvtFpUIntSIop);
8667396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcvtFpUIntSIop);
8677373Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpUIntSIop);
8687373Sgblack@eecs.umich.edu
8697640Sgblack@eecs.umich.edu    vcvtFpUIntDCode = vfpEnabledCheckCode + '''
8707643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
8717397Sgblack@eecs.umich.edu        double cOp1 = dbl(FpOp1P0.uw, FpOp1P1.uw);
8727397Sgblack@eecs.umich.edu        vfpFlushToZero(fpscr, cOp1);
8737397Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
8747380Sgblack@eecs.umich.edu        fesetround(FeRoundZero);
8757397Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (cOp1) : "m" (cOp1));
8767397Sgblack@eecs.umich.edu        uint64_t result = vfpFpDToFixed(cOp1, false, false, 0);
8777381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (result));
8787639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
8797643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
8807373Sgblack@eecs.umich.edu        FpDestP0.uw = result;
8817373Sgblack@eecs.umich.edu    '''
8827396Sgblack@eecs.umich.edu    vcvtFpUIntDIop = InstObjParams("vcvt", "VcvtFpUIntD", "FpRegRegOp",
8837373Sgblack@eecs.umich.edu                                     { "code": vcvtFpUIntDCode,
8847373Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
8857396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcvtFpUIntDIop);
8867396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcvtFpUIntDIop);
8877373Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpUIntDIop);
8887373Sgblack@eecs.umich.edu
8897640Sgblack@eecs.umich.edu    vcvtFpSIntSCode = vfpEnabledCheckCode + '''
8907643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
8917397Sgblack@eecs.umich.edu        vfpFlushToZero(fpscr, FpOp1);
8927397Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
8937380Sgblack@eecs.umich.edu        fesetround(FeRoundZero);
8947381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
8957387Sgblack@eecs.umich.edu        FpDest.sw = vfpFpSToFixed(FpOp1, true, false, 0);
8967381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest.sw));
8977639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
8987643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
8997373Sgblack@eecs.umich.edu    '''
9007396Sgblack@eecs.umich.edu    vcvtFpSIntSIop = InstObjParams("vcvt", "VcvtFpSIntS", "FpRegRegOp",
9017373Sgblack@eecs.umich.edu                                     { "code": vcvtFpSIntSCode,
9027373Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
9037396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcvtFpSIntSIop);
9047396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcvtFpSIntSIop);
9057373Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpSIntSIop);
9067373Sgblack@eecs.umich.edu
9077640Sgblack@eecs.umich.edu    vcvtFpSIntDCode = vfpEnabledCheckCode + '''
9087643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
9097397Sgblack@eecs.umich.edu        double cOp1 = dbl(FpOp1P0.uw, FpOp1P1.uw);
9107397Sgblack@eecs.umich.edu        vfpFlushToZero(fpscr, cOp1);
9117397Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
9127380Sgblack@eecs.umich.edu        fesetround(FeRoundZero);
9137397Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (cOp1) : "m" (cOp1));
9147397Sgblack@eecs.umich.edu        int64_t result = vfpFpDToFixed(cOp1, true, false, 0);
9157381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (result));
9167639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
9177643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
9187373Sgblack@eecs.umich.edu        FpDestP0.uw = result;
9197373Sgblack@eecs.umich.edu    '''
9207396Sgblack@eecs.umich.edu    vcvtFpSIntDIop = InstObjParams("vcvt", "VcvtFpSIntD", "FpRegRegOp",
9217373Sgblack@eecs.umich.edu                                     { "code": vcvtFpSIntDCode,
9227373Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
9237396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcvtFpSIntDIop);
9247396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcvtFpSIntDIop);
9257373Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpSIntDIop);
9267374Sgblack@eecs.umich.edu
9277640Sgblack@eecs.umich.edu    vcvtFpSFpDCode = vfpEnabledCheckCode + '''
9287643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
9297397Sgblack@eecs.umich.edu        vfpFlushToZero(fpscr, FpOp1);
9307397Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
9317381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
9327397Sgblack@eecs.umich.edu        double cDest = fixFpSFpDDest(Fpscr, FpOp1);
9337397Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (cDest));
9347639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
9357643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
9367397Sgblack@eecs.umich.edu        FpDestP0.uw = dblLow(cDest);
9377397Sgblack@eecs.umich.edu        FpDestP1.uw = dblHi(cDest);
9387374Sgblack@eecs.umich.edu    '''
9397396Sgblack@eecs.umich.edu    vcvtFpSFpDIop = InstObjParams("vcvt", "VcvtFpSFpD", "FpRegRegOp",
9407374Sgblack@eecs.umich.edu                                     { "code": vcvtFpSFpDCode,
9417374Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
9427396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcvtFpSFpDIop);
9437396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcvtFpSFpDIop);
9447374Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpSFpDIop);
9457374Sgblack@eecs.umich.edu
9467640Sgblack@eecs.umich.edu    vcvtFpDFpSCode = vfpEnabledCheckCode + '''
9477643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
9487397Sgblack@eecs.umich.edu        double cOp1 = dbl(FpOp1P0.uw, FpOp1P1.uw);
9497397Sgblack@eecs.umich.edu        vfpFlushToZero(fpscr, cOp1);
9507397Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
9517397Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (cOp1) : "m" (cOp1));
9527397Sgblack@eecs.umich.edu        FpDest = fixFpDFpSDest(Fpscr, cOp1);
9537381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest));
9547639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
9557643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
9567374Sgblack@eecs.umich.edu    '''
9577396Sgblack@eecs.umich.edu    vcvtFpDFpSIop = InstObjParams("vcvt", "VcvtFpDFpS", "FpRegRegOp",
9587374Sgblack@eecs.umich.edu                                     { "code": vcvtFpDFpSCode,
9597374Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
9607396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcvtFpDFpSIop);
9617396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcvtFpDFpSIop);
9627374Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpDFpSIop);
9637377Sgblack@eecs.umich.edu
9647640Sgblack@eecs.umich.edu    vcvtFpHTFpSCode = vfpEnabledCheckCode + '''
9657643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
9667398Sgblack@eecs.umich.edu        vfpFlushToZero(fpscr, FpOp1);
9677398Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
9687398Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
9697639Sgblack@eecs.umich.edu        FpDest = vcvtFpHFpS(fpscr, fpscr.dn, fpscr.ahp,
9707639Sgblack@eecs.umich.edu                            bits(fpToBits(FpOp1), 31, 16));
9717398Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest));
9727639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
9737643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
9747398Sgblack@eecs.umich.edu    '''
9757398Sgblack@eecs.umich.edu    vcvtFpHTFpSIop = InstObjParams("vcvtt", "VcvtFpHTFpS", "FpRegRegOp",
9767398Sgblack@eecs.umich.edu                                   { "code": vcvtFpHTFpSCode,
9777398Sgblack@eecs.umich.edu                                     "predicate_test": predicateTest }, [])
9787398Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcvtFpHTFpSIop);
9797398Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcvtFpHTFpSIop);
9807398Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpHTFpSIop);
9817398Sgblack@eecs.umich.edu
9827640Sgblack@eecs.umich.edu    vcvtFpHBFpSCode = vfpEnabledCheckCode + '''
9837643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
9847398Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
9857398Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
9867639Sgblack@eecs.umich.edu        FpDest = vcvtFpHFpS(fpscr, fpscr.dn, fpscr.ahp,
9877639Sgblack@eecs.umich.edu                            bits(fpToBits(FpOp1), 15, 0));
9887398Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest));
9897639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
9907643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
9917398Sgblack@eecs.umich.edu    '''
9927398Sgblack@eecs.umich.edu    vcvtFpHBFpSIop = InstObjParams("vcvtb", "VcvtFpHBFpS", "FpRegRegOp",
9937398Sgblack@eecs.umich.edu                                   { "code": vcvtFpHBFpSCode,
9947398Sgblack@eecs.umich.edu                                     "predicate_test": predicateTest }, [])
9957398Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcvtFpHBFpSIop);
9967398Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcvtFpHBFpSIop);
9977398Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpHBFpSIop);
9987398Sgblack@eecs.umich.edu
9997640Sgblack@eecs.umich.edu    vcvtFpSFpHTCode = vfpEnabledCheckCode + '''
10007643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
10017398Sgblack@eecs.umich.edu        vfpFlushToZero(fpscr, FpOp1);
10027398Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
10037639Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1), "=m" (FpDest.uw)
10047639Sgblack@eecs.umich.edu                                : "m" (FpOp1), "m" (FpDest.uw));
10057639Sgblack@eecs.umich.edu        FpDest.uw = insertBits(FpDest.uw, 31, 16,,
10067639Sgblack@eecs.umich.edu                               vcvtFpSFpH(fpscr, fpscr.fz, fpscr.dn,
10077639Sgblack@eecs.umich.edu                               fpscr.rMode, fpscr.ahp, FpOp1));
10087639Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest.uw));
10097639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
10107643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
10117398Sgblack@eecs.umich.edu    '''
10127398Sgblack@eecs.umich.edu    vcvtFpSFpHTIop = InstObjParams("vcvtt", "VcvtFpSFpHT", "FpRegRegOp",
10137398Sgblack@eecs.umich.edu                                    { "code": vcvtFpHTFpSCode,
10147398Sgblack@eecs.umich.edu                                      "predicate_test": predicateTest }, [])
10157398Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcvtFpSFpHTIop);
10167398Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcvtFpSFpHTIop);
10177398Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpSFpHTIop);
10187398Sgblack@eecs.umich.edu
10197640Sgblack@eecs.umich.edu    vcvtFpSFpHBCode = vfpEnabledCheckCode + '''
10207643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
10217398Sgblack@eecs.umich.edu        vfpFlushToZero(fpscr, FpOp1);
10227398Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
10237639Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1), "=m" (FpDest.uw)
10247639Sgblack@eecs.umich.edu                                : "m" (FpOp1), "m" (FpDest.uw));
10257639Sgblack@eecs.umich.edu        FpDest.uw = insertBits(FpDest.uw, 15, 0,
10267639Sgblack@eecs.umich.edu                               vcvtFpSFpH(fpscr, fpscr.fz, fpscr.dn,
10277639Sgblack@eecs.umich.edu                               fpscr.rMode, fpscr.ahp, FpOp1));
10287639Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest.uw));
10297639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
10307643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
10317398Sgblack@eecs.umich.edu    '''
10327398Sgblack@eecs.umich.edu    vcvtFpSFpHBIop = InstObjParams("vcvtb", "VcvtFpSFpHB", "FpRegRegOp",
10337398Sgblack@eecs.umich.edu                                   { "code": vcvtFpSFpHBCode,
10347398Sgblack@eecs.umich.edu                                     "predicate_test": predicateTest }, [])
10357398Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcvtFpSFpHBIop);
10367398Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcvtFpSFpHBIop);
10377398Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpSFpHBIop);
10387398Sgblack@eecs.umich.edu
10397640Sgblack@eecs.umich.edu    vcmpSCode = vfpEnabledCheckCode + '''
10407643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
10417397Sgblack@eecs.umich.edu        vfpFlushToZero(fpscr, FpDest, FpOp1);
10427377Sgblack@eecs.umich.edu        if (FpDest == FpOp1) {
10437377Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
10447377Sgblack@eecs.umich.edu        } else if (FpDest < FpOp1) {
10457377Sgblack@eecs.umich.edu            fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
10467377Sgblack@eecs.umich.edu        } else if (FpDest > FpOp1) {
10477377Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
10487377Sgblack@eecs.umich.edu        } else {
10497389Sgblack@eecs.umich.edu            const uint32_t qnan = 0x7fc00000;
10507389Sgblack@eecs.umich.edu            const bool nan1 = std::isnan(FpDest);
10517396Sgblack@eecs.umich.edu            const bool signal1 = nan1 && ((fpToBits(FpDest) & qnan) != qnan);
10527389Sgblack@eecs.umich.edu            const bool nan2 = std::isnan(FpOp1);
10537396Sgblack@eecs.umich.edu            const bool signal2 = nan2 && ((fpToBits(FpOp1) & qnan) != qnan);
10547389Sgblack@eecs.umich.edu            if (signal1 || signal2)
10557389Sgblack@eecs.umich.edu                fpscr.ioc = 1;
10567377Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
10577377Sgblack@eecs.umich.edu        }
10587643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
10597377Sgblack@eecs.umich.edu    '''
10607396Sgblack@eecs.umich.edu    vcmpSIop = InstObjParams("vcmps", "VcmpS", "FpRegRegOp",
10617377Sgblack@eecs.umich.edu                                     { "code": vcmpSCode,
10627377Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
10637396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcmpSIop);
10647396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcmpSIop);
10657377Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcmpSIop);
10667377Sgblack@eecs.umich.edu
10677640Sgblack@eecs.umich.edu    vcmpDCode = vfpEnabledCheckCode + '''
10687397Sgblack@eecs.umich.edu        double cOp1 = dbl(FpOp1P0.uw, FpOp1P1.uw);
10697397Sgblack@eecs.umich.edu        double cDest = dbl(FpDestP0.uw, FpDestP1.uw);
10707643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
10717397Sgblack@eecs.umich.edu        vfpFlushToZero(fpscr, cDest, cOp1);
10727397Sgblack@eecs.umich.edu        if (cDest == cOp1) {
10737377Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
10747397Sgblack@eecs.umich.edu        } else if (cDest < cOp1) {
10757377Sgblack@eecs.umich.edu            fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
10767397Sgblack@eecs.umich.edu        } else if (cDest > cOp1) {
10777377Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
10787377Sgblack@eecs.umich.edu        } else {
10797389Sgblack@eecs.umich.edu            const uint64_t qnan = ULL(0x7ff8000000000000);
10807397Sgblack@eecs.umich.edu            const bool nan1 = std::isnan(cDest);
10817397Sgblack@eecs.umich.edu            const bool signal1 = nan1 && ((fpToBits(cDest) & qnan) != qnan);
10827397Sgblack@eecs.umich.edu            const bool nan2 = std::isnan(cOp1);
10837397Sgblack@eecs.umich.edu            const bool signal2 = nan2 && ((fpToBits(cOp1) & qnan) != qnan);
10847389Sgblack@eecs.umich.edu            if (signal1 || signal2)
10857389Sgblack@eecs.umich.edu                fpscr.ioc = 1;
10867377Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
10877377Sgblack@eecs.umich.edu        }
10887643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
10897377Sgblack@eecs.umich.edu    '''
10907396Sgblack@eecs.umich.edu    vcmpDIop = InstObjParams("vcmpd", "VcmpD", "FpRegRegOp",
10917377Sgblack@eecs.umich.edu                                     { "code": vcmpDCode,
10927377Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
10937396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcmpDIop);
10947396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcmpDIop);
10957377Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcmpDIop);
10967377Sgblack@eecs.umich.edu
10977640Sgblack@eecs.umich.edu    vcmpZeroSCode = vfpEnabledCheckCode + '''
10987643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
10997397Sgblack@eecs.umich.edu        vfpFlushToZero(fpscr, FpDest);
11007389Sgblack@eecs.umich.edu        // This only handles imm == 0 for now.
11017389Sgblack@eecs.umich.edu        assert(imm == 0);
11027377Sgblack@eecs.umich.edu        if (FpDest == imm) {
11037377Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
11047377Sgblack@eecs.umich.edu        } else if (FpDest < imm) {
11057377Sgblack@eecs.umich.edu            fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
11067377Sgblack@eecs.umich.edu        } else if (FpDest > imm) {
11077377Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
11087377Sgblack@eecs.umich.edu        } else {
11097389Sgblack@eecs.umich.edu            const uint32_t qnan = 0x7fc00000;
11107389Sgblack@eecs.umich.edu            const bool nan = std::isnan(FpDest);
11117396Sgblack@eecs.umich.edu            const bool signal = nan && ((fpToBits(FpDest) & qnan) != qnan);
11127389Sgblack@eecs.umich.edu            if (signal)
11137389Sgblack@eecs.umich.edu                fpscr.ioc = 1;
11147377Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
11157377Sgblack@eecs.umich.edu        }
11167643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
11177377Sgblack@eecs.umich.edu    '''
11187396Sgblack@eecs.umich.edu    vcmpZeroSIop = InstObjParams("vcmpZeros", "VcmpZeroS", "FpRegImmOp",
11197377Sgblack@eecs.umich.edu                                     { "code": vcmpZeroSCode,
11207377Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
11217396Sgblack@eecs.umich.edu    header_output += FpRegImmOpDeclare.subst(vcmpZeroSIop);
11227396Sgblack@eecs.umich.edu    decoder_output += FpRegImmOpConstructor.subst(vcmpZeroSIop);
11237377Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcmpZeroSIop);
11247377Sgblack@eecs.umich.edu
11257640Sgblack@eecs.umich.edu    vcmpZeroDCode = vfpEnabledCheckCode + '''
11267389Sgblack@eecs.umich.edu        // This only handles imm == 0 for now.
11277389Sgblack@eecs.umich.edu        assert(imm == 0);
11287397Sgblack@eecs.umich.edu        double cDest = dbl(FpDestP0.uw, FpDestP1.uw);
11297643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
11307397Sgblack@eecs.umich.edu        vfpFlushToZero(fpscr, cDest);
11317397Sgblack@eecs.umich.edu        if (cDest == imm) {
11327377Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
11337397Sgblack@eecs.umich.edu        } else if (cDest < imm) {
11347377Sgblack@eecs.umich.edu            fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
11357397Sgblack@eecs.umich.edu        } else if (cDest > imm) {
11367377Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
11377377Sgblack@eecs.umich.edu        } else {
11387389Sgblack@eecs.umich.edu            const uint64_t qnan = ULL(0x7ff8000000000000);
11397397Sgblack@eecs.umich.edu            const bool nan = std::isnan(cDest);
11407397Sgblack@eecs.umich.edu            const bool signal = nan && ((fpToBits(cDest) & qnan) != qnan);
11417389Sgblack@eecs.umich.edu            if (signal)
11427389Sgblack@eecs.umich.edu                fpscr.ioc = 1;
11437377Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
11447377Sgblack@eecs.umich.edu        }
11457643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
11467377Sgblack@eecs.umich.edu    '''
11477396Sgblack@eecs.umich.edu    vcmpZeroDIop = InstObjParams("vcmpZerod", "VcmpZeroD", "FpRegImmOp",
11487377Sgblack@eecs.umich.edu                                     { "code": vcmpZeroDCode,
11497377Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
11507396Sgblack@eecs.umich.edu    header_output += FpRegImmOpDeclare.subst(vcmpZeroDIop);
11517396Sgblack@eecs.umich.edu    decoder_output += FpRegImmOpConstructor.subst(vcmpZeroDIop);
11527377Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcmpZeroDIop);
11537389Sgblack@eecs.umich.edu
11547640Sgblack@eecs.umich.edu    vcmpeSCode = vfpEnabledCheckCode + '''
11557643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
11567397Sgblack@eecs.umich.edu        vfpFlushToZero(fpscr, FpDest, FpOp1);
11577389Sgblack@eecs.umich.edu        if (FpDest == FpOp1) {
11587389Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
11597389Sgblack@eecs.umich.edu        } else if (FpDest < FpOp1) {
11607389Sgblack@eecs.umich.edu            fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
11617389Sgblack@eecs.umich.edu        } else if (FpDest > FpOp1) {
11627389Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
11637389Sgblack@eecs.umich.edu        } else {
11647389Sgblack@eecs.umich.edu            fpscr.ioc = 1;
11657389Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
11667389Sgblack@eecs.umich.edu        }
11677643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
11687389Sgblack@eecs.umich.edu    '''
11697396Sgblack@eecs.umich.edu    vcmpeSIop = InstObjParams("vcmpes", "VcmpeS", "FpRegRegOp",
11707389Sgblack@eecs.umich.edu                                     { "code": vcmpeSCode,
11717389Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
11727396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcmpeSIop);
11737396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcmpeSIop);
11747389Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcmpeSIop);
11757389Sgblack@eecs.umich.edu
11767640Sgblack@eecs.umich.edu    vcmpeDCode = vfpEnabledCheckCode + '''
11777397Sgblack@eecs.umich.edu        double cOp1 = dbl(FpOp1P0.uw, FpOp1P1.uw);
11787397Sgblack@eecs.umich.edu        double cDest = dbl(FpDestP0.uw, FpDestP1.uw);
11797643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
11807397Sgblack@eecs.umich.edu        vfpFlushToZero(fpscr, cDest, cOp1);
11817397Sgblack@eecs.umich.edu        if (cDest == cOp1) {
11827389Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
11837397Sgblack@eecs.umich.edu        } else if (cDest < cOp1) {
11847389Sgblack@eecs.umich.edu            fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
11857397Sgblack@eecs.umich.edu        } else if (cDest > cOp1) {
11867389Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
11877389Sgblack@eecs.umich.edu        } else {
11887389Sgblack@eecs.umich.edu            fpscr.ioc = 1;
11897389Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
11907389Sgblack@eecs.umich.edu        }
11917643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
11927389Sgblack@eecs.umich.edu    '''
11937396Sgblack@eecs.umich.edu    vcmpeDIop = InstObjParams("vcmped", "VcmpeD", "FpRegRegOp",
11947389Sgblack@eecs.umich.edu                                     { "code": vcmpeDCode,
11957389Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
11967396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcmpeDIop);
11977396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcmpeDIop);
11987389Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcmpeDIop);
11997389Sgblack@eecs.umich.edu
12007640Sgblack@eecs.umich.edu    vcmpeZeroSCode = vfpEnabledCheckCode + '''
12017643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
12027397Sgblack@eecs.umich.edu        vfpFlushToZero(fpscr, FpDest);
12037389Sgblack@eecs.umich.edu        if (FpDest == imm) {
12047389Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
12057389Sgblack@eecs.umich.edu        } else if (FpDest < imm) {
12067389Sgblack@eecs.umich.edu            fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
12077389Sgblack@eecs.umich.edu        } else if (FpDest > imm) {
12087389Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
12097389Sgblack@eecs.umich.edu        } else {
12107389Sgblack@eecs.umich.edu            fpscr.ioc = 1;
12117389Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
12127389Sgblack@eecs.umich.edu        }
12137643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
12147389Sgblack@eecs.umich.edu    '''
12157396Sgblack@eecs.umich.edu    vcmpeZeroSIop = InstObjParams("vcmpeZeros", "VcmpeZeroS", "FpRegImmOp",
12167389Sgblack@eecs.umich.edu                                     { "code": vcmpeZeroSCode,
12177389Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
12187396Sgblack@eecs.umich.edu    header_output += FpRegImmOpDeclare.subst(vcmpeZeroSIop);
12197396Sgblack@eecs.umich.edu    decoder_output += FpRegImmOpConstructor.subst(vcmpeZeroSIop);
12207389Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcmpeZeroSIop);
12217389Sgblack@eecs.umich.edu
12227640Sgblack@eecs.umich.edu    vcmpeZeroDCode = vfpEnabledCheckCode + '''
12237397Sgblack@eecs.umich.edu        double cDest = dbl(FpDestP0.uw, FpDestP1.uw);
12247643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
12257397Sgblack@eecs.umich.edu        vfpFlushToZero(fpscr, cDest);
12267397Sgblack@eecs.umich.edu        if (cDest == imm) {
12277389Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
12287397Sgblack@eecs.umich.edu        } else if (cDest < imm) {
12297389Sgblack@eecs.umich.edu            fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
12307397Sgblack@eecs.umich.edu        } else if (cDest > imm) {
12317389Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
12327389Sgblack@eecs.umich.edu        } else {
12337389Sgblack@eecs.umich.edu            fpscr.ioc = 1;
12347389Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
12357389Sgblack@eecs.umich.edu        }
12367643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
12377389Sgblack@eecs.umich.edu    '''
12387396Sgblack@eecs.umich.edu    vcmpeZeroDIop = InstObjParams("vcmpeZerod", "VcmpeZeroD", "FpRegImmOp",
12397389Sgblack@eecs.umich.edu                                     { "code": vcmpeZeroDCode,
12407389Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
12417396Sgblack@eecs.umich.edu    header_output += FpRegImmOpDeclare.subst(vcmpeZeroDIop);
12427396Sgblack@eecs.umich.edu    decoder_output += FpRegImmOpConstructor.subst(vcmpeZeroDIop);
12437389Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcmpeZeroDIop);
12447322Sgblack@eecs.umich.edu}};
12457379Sgblack@eecs.umich.edu
12467379Sgblack@eecs.umich.edulet {{
12477379Sgblack@eecs.umich.edu
12487379Sgblack@eecs.umich.edu    header_output = ""
12497379Sgblack@eecs.umich.edu    decoder_output = ""
12507379Sgblack@eecs.umich.edu    exec_output = ""
12517379Sgblack@eecs.umich.edu
12527640Sgblack@eecs.umich.edu    vcvtFpSFixedSCode = vfpEnabledCheckCode + '''
12537643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
12547397Sgblack@eecs.umich.edu        vfpFlushToZero(fpscr, FpOp1);
12557397Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
12567381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
12577379Sgblack@eecs.umich.edu        FpDest.sw = vfpFpSToFixed(FpOp1, true, false, imm);
12587381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest.sw));
12597639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
12607643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
12617379Sgblack@eecs.umich.edu    '''
12627396Sgblack@eecs.umich.edu    vcvtFpSFixedSIop = InstObjParams("vcvt", "VcvtFpSFixedS", "FpRegRegImmOp",
12637379Sgblack@eecs.umich.edu                                     { "code": vcvtFpSFixedSCode,
12647379Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
12657396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vcvtFpSFixedSIop);
12667396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpSFixedSIop);
12677379Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpSFixedSIop);
12687379Sgblack@eecs.umich.edu
12697640Sgblack@eecs.umich.edu    vcvtFpSFixedDCode = vfpEnabledCheckCode + '''
12707643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
12717397Sgblack@eecs.umich.edu        double cOp1 = dbl(FpOp1P0.uw, FpOp1P1.uw);
12727397Sgblack@eecs.umich.edu        vfpFlushToZero(fpscr, cOp1);
12737397Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
12747397Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (cOp1) : "m" (cOp1));
12757397Sgblack@eecs.umich.edu        uint64_t mid = vfpFpDToFixed(cOp1, true, false, imm);
12767381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (mid));
12777639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
12787643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
12797379Sgblack@eecs.umich.edu        FpDestP0.uw = mid;
12807379Sgblack@eecs.umich.edu        FpDestP1.uw = mid >> 32;
12817379Sgblack@eecs.umich.edu    '''
12827396Sgblack@eecs.umich.edu    vcvtFpSFixedDIop = InstObjParams("vcvt", "VcvtFpSFixedD", "FpRegRegImmOp",
12837379Sgblack@eecs.umich.edu                                     { "code": vcvtFpSFixedDCode,
12847379Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
12857396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vcvtFpSFixedDIop);
12867396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpSFixedDIop);
12877379Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpSFixedDIop);
12887379Sgblack@eecs.umich.edu
12897640Sgblack@eecs.umich.edu    vcvtFpUFixedSCode = vfpEnabledCheckCode + '''
12907643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
12917397Sgblack@eecs.umich.edu        vfpFlushToZero(fpscr, FpOp1);
12927397Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
12937381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
12947379Sgblack@eecs.umich.edu        FpDest.uw = vfpFpSToFixed(FpOp1, false, false, imm);
12957381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest.uw));
12967639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
12977643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
12987379Sgblack@eecs.umich.edu    '''
12997396Sgblack@eecs.umich.edu    vcvtFpUFixedSIop = InstObjParams("vcvt", "VcvtFpUFixedS", "FpRegRegImmOp",
13007379Sgblack@eecs.umich.edu                                     { "code": vcvtFpUFixedSCode,
13017379Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
13027396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vcvtFpUFixedSIop);
13037396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpUFixedSIop);
13047379Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpUFixedSIop);
13057379Sgblack@eecs.umich.edu
13067640Sgblack@eecs.umich.edu    vcvtFpUFixedDCode = vfpEnabledCheckCode + '''
13077643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
13087397Sgblack@eecs.umich.edu        double cOp1 = dbl(FpOp1P0.uw, FpOp1P1.uw);
13097397Sgblack@eecs.umich.edu        vfpFlushToZero(fpscr, cOp1);
13107397Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
13117397Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (cOp1) : "m" (cOp1));
13127397Sgblack@eecs.umich.edu        uint64_t mid = vfpFpDToFixed(cOp1, false, false, imm);
13137381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (mid));
13147639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
13157643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
13167379Sgblack@eecs.umich.edu        FpDestP0.uw = mid;
13177379Sgblack@eecs.umich.edu        FpDestP1.uw = mid >> 32;
13187379Sgblack@eecs.umich.edu    '''
13197396Sgblack@eecs.umich.edu    vcvtFpUFixedDIop = InstObjParams("vcvt", "VcvtFpUFixedD", "FpRegRegImmOp",
13207379Sgblack@eecs.umich.edu                                     { "code": vcvtFpUFixedDCode,
13217379Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
13227396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vcvtFpUFixedDIop);
13237396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpUFixedDIop);
13247379Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpUFixedDIop);
13257379Sgblack@eecs.umich.edu
13267640Sgblack@eecs.umich.edu    vcvtSFixedFpSCode = vfpEnabledCheckCode + '''
13277643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
13287397Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
13297381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1.sw) : "m" (FpOp1.sw));
13307639Sgblack@eecs.umich.edu        FpDest = vfpSFixedToFpS(fpscr.fz, fpscr.dn, FpOp1.sw, false, imm);
13317381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest));
13327639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
13337643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
13347379Sgblack@eecs.umich.edu    '''
13357396Sgblack@eecs.umich.edu    vcvtSFixedFpSIop = InstObjParams("vcvt", "VcvtSFixedFpS", "FpRegRegImmOp",
13367379Sgblack@eecs.umich.edu                                     { "code": vcvtSFixedFpSCode,
13377379Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
13387396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vcvtSFixedFpSIop);
13397396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vcvtSFixedFpSIop);
13407379Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtSFixedFpSIop);
13417379Sgblack@eecs.umich.edu
13427640Sgblack@eecs.umich.edu    vcvtSFixedFpDCode = vfpEnabledCheckCode + '''
13437643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
13447379Sgblack@eecs.umich.edu        uint64_t mid = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
13457397Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
13467381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (mid) : "m" (mid));
13477639Sgblack@eecs.umich.edu        double cDest = vfpSFixedToFpD(fpscr.fz, fpscr.dn, mid, false, imm);
13487397Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (cDest));
13497639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
13507643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
13517397Sgblack@eecs.umich.edu        FpDestP0.uw = dblLow(cDest);
13527397Sgblack@eecs.umich.edu        FpDestP1.uw = dblHi(cDest);
13537379Sgblack@eecs.umich.edu    '''
13547396Sgblack@eecs.umich.edu    vcvtSFixedFpDIop = InstObjParams("vcvt", "VcvtSFixedFpD", "FpRegRegImmOp",
13557379Sgblack@eecs.umich.edu                                     { "code": vcvtSFixedFpDCode,
13567379Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
13577396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vcvtSFixedFpDIop);
13587396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vcvtSFixedFpDIop);
13597379Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtSFixedFpDIop);
13607379Sgblack@eecs.umich.edu
13617640Sgblack@eecs.umich.edu    vcvtUFixedFpSCode = vfpEnabledCheckCode + '''
13627643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
13637397Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
13647381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1.uw) : "m" (FpOp1.uw));
13657639Sgblack@eecs.umich.edu        FpDest = vfpUFixedToFpS(fpscr.fz, fpscr.dn, FpOp1.uw, false, imm);
13667381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest));
13677639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
13687643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
13697379Sgblack@eecs.umich.edu    '''
13707396Sgblack@eecs.umich.edu    vcvtUFixedFpSIop = InstObjParams("vcvt", "VcvtUFixedFpS", "FpRegRegImmOp",
13717379Sgblack@eecs.umich.edu                                     { "code": vcvtUFixedFpSCode,
13727379Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
13737396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vcvtUFixedFpSIop);
13747396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vcvtUFixedFpSIop);
13757379Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtUFixedFpSIop);
13767379Sgblack@eecs.umich.edu
13777640Sgblack@eecs.umich.edu    vcvtUFixedFpDCode = vfpEnabledCheckCode + '''
13787643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
13797379Sgblack@eecs.umich.edu        uint64_t mid = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
13807397Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
13817381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (mid) : "m" (mid));
13827639Sgblack@eecs.umich.edu        double cDest = vfpUFixedToFpD(fpscr.fz, fpscr.dn, mid, false, imm);
13837397Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (cDest));
13847639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
13857643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
13867397Sgblack@eecs.umich.edu        FpDestP0.uw = dblLow(cDest);
13877397Sgblack@eecs.umich.edu        FpDestP1.uw = dblHi(cDest);
13887379Sgblack@eecs.umich.edu    '''
13897396Sgblack@eecs.umich.edu    vcvtUFixedFpDIop = InstObjParams("vcvt", "VcvtUFixedFpD", "FpRegRegImmOp",
13907379Sgblack@eecs.umich.edu                                     { "code": vcvtUFixedFpDCode,
13917379Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
13927396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vcvtUFixedFpDIop);
13937396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vcvtUFixedFpDIop);
13947379Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtUFixedFpDIop);
13957379Sgblack@eecs.umich.edu
13967640Sgblack@eecs.umich.edu    vcvtFpSHFixedSCode = vfpEnabledCheckCode + '''
13977643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
13987397Sgblack@eecs.umich.edu        vfpFlushToZero(fpscr, FpOp1);
13997397Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
14007381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
14017379Sgblack@eecs.umich.edu        FpDest.sh = vfpFpSToFixed(FpOp1, true, true, imm);
14027381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest.sh));
14037639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
14047643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
14057379Sgblack@eecs.umich.edu    '''
14067379Sgblack@eecs.umich.edu    vcvtFpSHFixedSIop = InstObjParams("vcvt", "VcvtFpSHFixedS",
14077396Sgblack@eecs.umich.edu                                      "FpRegRegImmOp",
14087379Sgblack@eecs.umich.edu                                     { "code": vcvtFpSHFixedSCode,
14097379Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
14107396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vcvtFpSHFixedSIop);
14117396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpSHFixedSIop);
14127379Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpSHFixedSIop);
14137379Sgblack@eecs.umich.edu
14147640Sgblack@eecs.umich.edu    vcvtFpSHFixedDCode = vfpEnabledCheckCode + '''
14157643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
14167397Sgblack@eecs.umich.edu        double cOp1 = dbl(FpOp1P0.uw, FpOp1P1.uw);
14177397Sgblack@eecs.umich.edu        vfpFlushToZero(fpscr, cOp1);
14187397Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
14197397Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (cOp1) : "m" (cOp1));
14207397Sgblack@eecs.umich.edu        uint64_t result = vfpFpDToFixed(cOp1, true, true, imm);
14217381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (result));
14227639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
14237643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
14247379Sgblack@eecs.umich.edu        FpDestP0.uw = result;
14257379Sgblack@eecs.umich.edu        FpDestP1.uw = result >> 32;
14267379Sgblack@eecs.umich.edu    '''
14277379Sgblack@eecs.umich.edu    vcvtFpSHFixedDIop = InstObjParams("vcvt", "VcvtFpSHFixedD",
14287396Sgblack@eecs.umich.edu                                      "FpRegRegImmOp",
14297379Sgblack@eecs.umich.edu                                     { "code": vcvtFpSHFixedDCode,
14307379Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
14317396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vcvtFpSHFixedDIop);
14327396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpSHFixedDIop);
14337379Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpSHFixedDIop);
14347379Sgblack@eecs.umich.edu
14357640Sgblack@eecs.umich.edu    vcvtFpUHFixedSCode = vfpEnabledCheckCode + '''
14367643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
14377397Sgblack@eecs.umich.edu        vfpFlushToZero(fpscr, FpOp1);
14387397Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
14397381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
14407379Sgblack@eecs.umich.edu        FpDest.uh = vfpFpSToFixed(FpOp1, false, true, imm);
14417381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest.uh));
14427639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
14437643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
14447379Sgblack@eecs.umich.edu    '''
14457379Sgblack@eecs.umich.edu    vcvtFpUHFixedSIop = InstObjParams("vcvt", "VcvtFpUHFixedS",
14467396Sgblack@eecs.umich.edu                                      "FpRegRegImmOp",
14477379Sgblack@eecs.umich.edu                                     { "code": vcvtFpUHFixedSCode,
14487379Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
14497396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vcvtFpUHFixedSIop);
14507396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpUHFixedSIop);
14517379Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpUHFixedSIop);
14527379Sgblack@eecs.umich.edu
14537640Sgblack@eecs.umich.edu    vcvtFpUHFixedDCode = vfpEnabledCheckCode + '''
14547643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
14557397Sgblack@eecs.umich.edu        double cOp1 = dbl(FpOp1P0.uw, FpOp1P1.uw);
14567397Sgblack@eecs.umich.edu        vfpFlushToZero(fpscr, cOp1);
14577397Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
14587397Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (cOp1) : "m" (cOp1));
14597397Sgblack@eecs.umich.edu        uint64_t mid = vfpFpDToFixed(cOp1, false, true, imm);
14607381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (mid));
14617639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
14627643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
14637379Sgblack@eecs.umich.edu        FpDestP0.uw = mid;
14647379Sgblack@eecs.umich.edu        FpDestP1.uw = mid >> 32;
14657379Sgblack@eecs.umich.edu    '''
14667379Sgblack@eecs.umich.edu    vcvtFpUHFixedDIop = InstObjParams("vcvt", "VcvtFpUHFixedD",
14677396Sgblack@eecs.umich.edu                                      "FpRegRegImmOp",
14687379Sgblack@eecs.umich.edu                                     { "code": vcvtFpUHFixedDCode,
14697379Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
14707396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vcvtFpUHFixedDIop);
14717396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpUHFixedDIop);
14727379Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpUHFixedDIop);
14737379Sgblack@eecs.umich.edu
14747640Sgblack@eecs.umich.edu    vcvtSHFixedFpSCode = vfpEnabledCheckCode + '''
14757643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
14767397Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
14777381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1.sh) : "m" (FpOp1.sh));
14787639Sgblack@eecs.umich.edu        FpDest = vfpSFixedToFpS(fpscr.fz, fpscr.dn, FpOp1.sh, true, imm);
14797381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest));
14807639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
14817643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
14827379Sgblack@eecs.umich.edu    '''
14837379Sgblack@eecs.umich.edu    vcvtSHFixedFpSIop = InstObjParams("vcvt", "VcvtSHFixedFpS",
14847396Sgblack@eecs.umich.edu                                      "FpRegRegImmOp",
14857379Sgblack@eecs.umich.edu                                     { "code": vcvtSHFixedFpSCode,
14867379Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
14877396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vcvtSHFixedFpSIop);
14887396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vcvtSHFixedFpSIop);
14897379Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtSHFixedFpSIop);
14907379Sgblack@eecs.umich.edu
14917640Sgblack@eecs.umich.edu    vcvtSHFixedFpDCode = vfpEnabledCheckCode + '''
14927643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
14937379Sgblack@eecs.umich.edu        uint64_t mid = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
14947397Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
14957381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (mid) : "m" (mid));
14967639Sgblack@eecs.umich.edu        double cDest = vfpSFixedToFpD(fpscr.fz, fpscr.dn, mid, true, imm);
14977397Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (cDest));
14987639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
14997643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
15007397Sgblack@eecs.umich.edu        FpDestP0.uw = dblLow(cDest);
15017397Sgblack@eecs.umich.edu        FpDestP1.uw = dblHi(cDest);
15027379Sgblack@eecs.umich.edu    '''
15037379Sgblack@eecs.umich.edu    vcvtSHFixedFpDIop = InstObjParams("vcvt", "VcvtSHFixedFpD",
15047396Sgblack@eecs.umich.edu                                      "FpRegRegImmOp",
15057379Sgblack@eecs.umich.edu                                     { "code": vcvtSHFixedFpDCode,
15067379Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
15077396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vcvtSHFixedFpDIop);
15087396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vcvtSHFixedFpDIop);
15097379Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtSHFixedFpDIop);
15107379Sgblack@eecs.umich.edu
15117640Sgblack@eecs.umich.edu    vcvtUHFixedFpSCode = vfpEnabledCheckCode + '''
15127643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
15137397Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
15147381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1.uh) : "m" (FpOp1.uh));
15157639Sgblack@eecs.umich.edu        FpDest = vfpUFixedToFpS(fpscr.fz, fpscr.dn, FpOp1.uh, true, imm);
15167381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest));
15177639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
15187643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
15197379Sgblack@eecs.umich.edu    '''
15207379Sgblack@eecs.umich.edu    vcvtUHFixedFpSIop = InstObjParams("vcvt", "VcvtUHFixedFpS",
15217396Sgblack@eecs.umich.edu                                      "FpRegRegImmOp",
15227379Sgblack@eecs.umich.edu                                     { "code": vcvtUHFixedFpSCode,
15237379Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
15247396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vcvtUHFixedFpSIop);
15257396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vcvtUHFixedFpSIop);
15267379Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtUHFixedFpSIop);
15277379Sgblack@eecs.umich.edu
15287640Sgblack@eecs.umich.edu    vcvtUHFixedFpDCode = vfpEnabledCheckCode + '''
15297643Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr | FpCondCodes;
15307379Sgblack@eecs.umich.edu        uint64_t mid = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
15317397Sgblack@eecs.umich.edu        VfpSavedState state = prepFpState(fpscr.rMode);
15327381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (mid) : "m" (mid));
15337639Sgblack@eecs.umich.edu        double cDest = vfpUFixedToFpD(fpscr.fz, fpscr.dn, mid, true, imm);
15347397Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (cDest));
15357639Sgblack@eecs.umich.edu        finishVfp(fpscr, state, fpscr.fz);
15367643Sgblack@eecs.umich.edu        FpCondCodes = fpscr & FpCondCodesMask;
15377397Sgblack@eecs.umich.edu        FpDestP0.uw = dblLow(cDest);
15387397Sgblack@eecs.umich.edu        FpDestP1.uw = dblHi(cDest);
15397379Sgblack@eecs.umich.edu    '''
15407379Sgblack@eecs.umich.edu    vcvtUHFixedFpDIop = InstObjParams("vcvt", "VcvtUHFixedFpD",
15417396Sgblack@eecs.umich.edu                                      "FpRegRegImmOp",
15427379Sgblack@eecs.umich.edu                                     { "code": vcvtUHFixedFpDCode,
15437379Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
15447396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vcvtUHFixedFpDIop);
15457396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vcvtUHFixedFpDIop);
15467379Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtUHFixedFpDIop);
15477379Sgblack@eecs.umich.edu}};
1548