fp.isa revision 7396
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",
1957322Sgblack@eecs.umich.edu                            { "code": "MiscDest = Op1;",
1967322Sgblack@eecs.umich.edu                              "predicate_test": predicateTest }, [])
1977396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vmsrIop);
1987396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vmsrIop);
1997322Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmsrIop);
2007324Sgblack@eecs.umich.edu
2017396Sgblack@eecs.umich.edu    vmrsIop = InstObjParams("vmrs", "Vmrs", "FpRegRegOp",
2027324Sgblack@eecs.umich.edu                            { "code": "Dest = MiscOp1;",
2037324Sgblack@eecs.umich.edu                              "predicate_test": predicateTest }, [])
2047396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vmrsIop);
2057396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vmrsIop);
2067324Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmrsIop);
2077333Sgblack@eecs.umich.edu
2087392Sgblack@eecs.umich.edu    vmrsApsrCode = "Dest = (MiscOp1 & imm) | (Dest & ~imm);"
2097396Sgblack@eecs.umich.edu    vmrsApsrIop = InstObjParams("vmrs", "VmrsApsr", "FpRegRegImmOp",
2107392Sgblack@eecs.umich.edu                                { "code": vmrsApsrCode,
2117392Sgblack@eecs.umich.edu                                  "predicate_test": predicateTest }, [])
2127396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vmrsApsrIop);
2137396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vmrsApsrIop);
2147392Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmrsApsrIop);
2157392Sgblack@eecs.umich.edu
2167333Sgblack@eecs.umich.edu    vmovImmSCode = '''
2177333Sgblack@eecs.umich.edu        FpDest.uw = bits(imm, 31, 0);
2187333Sgblack@eecs.umich.edu    '''
2197396Sgblack@eecs.umich.edu    vmovImmSIop = InstObjParams("vmov", "VmovImmS", "FpRegImmOp",
2207333Sgblack@eecs.umich.edu                                { "code": vmovImmSCode,
2217333Sgblack@eecs.umich.edu                                  "predicate_test": predicateTest }, [])
2227396Sgblack@eecs.umich.edu    header_output += FpRegImmOpDeclare.subst(vmovImmSIop);
2237396Sgblack@eecs.umich.edu    decoder_output += FpRegImmOpConstructor.subst(vmovImmSIop);
2247333Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmovImmSIop);
2257333Sgblack@eecs.umich.edu
2267333Sgblack@eecs.umich.edu    vmovImmDCode = '''
2277333Sgblack@eecs.umich.edu        FpDestP0.uw = bits(imm, 31, 0);
2287333Sgblack@eecs.umich.edu        FpDestP1.uw = bits(imm, 63, 32);
2297333Sgblack@eecs.umich.edu    '''
2307396Sgblack@eecs.umich.edu    vmovImmDIop = InstObjParams("vmov", "VmovImmD", "FpRegImmOp",
2317333Sgblack@eecs.umich.edu                                { "code": vmovImmDCode,
2327333Sgblack@eecs.umich.edu                                  "predicate_test": predicateTest }, [])
2337396Sgblack@eecs.umich.edu    header_output += FpRegImmOpDeclare.subst(vmovImmDIop);
2347396Sgblack@eecs.umich.edu    decoder_output += FpRegImmOpConstructor.subst(vmovImmDIop);
2357333Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmovImmDIop);
2367333Sgblack@eecs.umich.edu
2377333Sgblack@eecs.umich.edu    vmovImmQCode = '''
2387333Sgblack@eecs.umich.edu        FpDestP0.uw = bits(imm, 31, 0);
2397333Sgblack@eecs.umich.edu        FpDestP1.uw = bits(imm, 63, 32);
2407333Sgblack@eecs.umich.edu        FpDestP2.uw = bits(imm, 31, 0);
2417333Sgblack@eecs.umich.edu        FpDestP3.uw = bits(imm, 63, 32);
2427333Sgblack@eecs.umich.edu    '''
2437396Sgblack@eecs.umich.edu    vmovImmQIop = InstObjParams("vmov", "VmovImmQ", "FpRegImmOp",
2447333Sgblack@eecs.umich.edu                                { "code": vmovImmQCode,
2457333Sgblack@eecs.umich.edu                                  "predicate_test": predicateTest }, [])
2467396Sgblack@eecs.umich.edu    header_output += FpRegImmOpDeclare.subst(vmovImmQIop);
2477396Sgblack@eecs.umich.edu    decoder_output += FpRegImmOpConstructor.subst(vmovImmQIop);
2487333Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmovImmQIop);
2497333Sgblack@eecs.umich.edu
2507333Sgblack@eecs.umich.edu    vmovRegSCode = '''
2517333Sgblack@eecs.umich.edu        FpDest.uw = FpOp1.uw;
2527333Sgblack@eecs.umich.edu    '''
2537396Sgblack@eecs.umich.edu    vmovRegSIop = InstObjParams("vmov", "VmovRegS", "FpRegRegOp",
2547333Sgblack@eecs.umich.edu                                { "code": vmovRegSCode,
2557333Sgblack@eecs.umich.edu                                  "predicate_test": predicateTest }, [])
2567396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vmovRegSIop);
2577396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vmovRegSIop);
2587333Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmovRegSIop);
2597333Sgblack@eecs.umich.edu
2607333Sgblack@eecs.umich.edu    vmovRegDCode = '''
2617333Sgblack@eecs.umich.edu        FpDestP0.uw = FpOp1P0.uw;
2627333Sgblack@eecs.umich.edu        FpDestP1.uw = FpOp1P1.uw;
2637333Sgblack@eecs.umich.edu    '''
2647396Sgblack@eecs.umich.edu    vmovRegDIop = InstObjParams("vmov", "VmovRegD", "FpRegRegOp",
2657333Sgblack@eecs.umich.edu                                { "code": vmovRegDCode,
2667333Sgblack@eecs.umich.edu                                  "predicate_test": predicateTest }, [])
2677396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vmovRegDIop);
2687396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vmovRegDIop);
2697333Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmovRegDIop);
2707333Sgblack@eecs.umich.edu
2717333Sgblack@eecs.umich.edu    vmovRegQCode = '''
2727333Sgblack@eecs.umich.edu        FpDestP0.uw = FpOp1P0.uw;
2737333Sgblack@eecs.umich.edu        FpDestP1.uw = FpOp1P1.uw;
2747333Sgblack@eecs.umich.edu        FpDestP2.uw = FpOp1P2.uw;
2757333Sgblack@eecs.umich.edu        FpDestP3.uw = FpOp1P3.uw;
2767333Sgblack@eecs.umich.edu    '''
2777396Sgblack@eecs.umich.edu    vmovRegQIop = InstObjParams("vmov", "VmovRegQ", "FpRegRegOp",
2787333Sgblack@eecs.umich.edu                                { "code": vmovRegQCode,
2797333Sgblack@eecs.umich.edu                                  "predicate_test": predicateTest }, [])
2807396Sgblack@eecs.umich.edu    header_output  += FpRegRegOpDeclare.subst(vmovRegQIop);
2817396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegOpConstructor.subst(vmovRegQIop);
2827333Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmovRegQIop);
2837333Sgblack@eecs.umich.edu
2847333Sgblack@eecs.umich.edu    vmovCoreRegBCode = '''
2857333Sgblack@eecs.umich.edu        FpDest.uw = insertBits(FpDest.uw, imm * 8, imm * 8 + 7, Op1.ub);
2867333Sgblack@eecs.umich.edu    '''
2877396Sgblack@eecs.umich.edu    vmovCoreRegBIop = InstObjParams("vmov", "VmovCoreRegB", "FpRegRegImmOp",
2887333Sgblack@eecs.umich.edu                                    { "code": vmovCoreRegBCode,
2897333Sgblack@eecs.umich.edu                                      "predicate_test": predicateTest }, [])
2907396Sgblack@eecs.umich.edu    header_output  += FpRegRegImmOpDeclare.subst(vmovCoreRegBIop);
2917396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegImmOpConstructor.subst(vmovCoreRegBIop);
2927333Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmovCoreRegBIop);
2937333Sgblack@eecs.umich.edu
2947333Sgblack@eecs.umich.edu    vmovCoreRegHCode = '''
2957333Sgblack@eecs.umich.edu        FpDest.uw = insertBits(FpDest.uw, imm * 16, imm * 16 + 15, Op1.uh);
2967333Sgblack@eecs.umich.edu    '''
2977396Sgblack@eecs.umich.edu    vmovCoreRegHIop = InstObjParams("vmov", "VmovCoreRegH", "FpRegRegImmOp",
2987333Sgblack@eecs.umich.edu                                    { "code": vmovCoreRegHCode,
2997333Sgblack@eecs.umich.edu                                      "predicate_test": predicateTest }, [])
3007396Sgblack@eecs.umich.edu    header_output  += FpRegRegImmOpDeclare.subst(vmovCoreRegHIop);
3017396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegImmOpConstructor.subst(vmovCoreRegHIop);
3027333Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmovCoreRegHIop);
3037333Sgblack@eecs.umich.edu
3047333Sgblack@eecs.umich.edu    vmovCoreRegWCode = '''
3057333Sgblack@eecs.umich.edu        FpDest.uw = Op1.uw;
3067333Sgblack@eecs.umich.edu    '''
3077396Sgblack@eecs.umich.edu    vmovCoreRegWIop = InstObjParams("vmov", "VmovCoreRegW", "FpRegRegOp",
3087333Sgblack@eecs.umich.edu                                    { "code": vmovCoreRegWCode,
3097333Sgblack@eecs.umich.edu                                      "predicate_test": predicateTest }, [])
3107396Sgblack@eecs.umich.edu    header_output  += FpRegRegOpDeclare.subst(vmovCoreRegWIop);
3117396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegOpConstructor.subst(vmovCoreRegWIop);
3127333Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmovCoreRegWIop);
3137333Sgblack@eecs.umich.edu
3147333Sgblack@eecs.umich.edu    vmovRegCoreUBCode = '''
3157333Sgblack@eecs.umich.edu        Dest = bits(FpOp1.uw, imm * 8, imm * 8 + 7);
3167333Sgblack@eecs.umich.edu    '''
3177396Sgblack@eecs.umich.edu    vmovRegCoreUBIop = InstObjParams("vmov", "VmovRegCoreUB", "FpRegRegImmOp",
3187333Sgblack@eecs.umich.edu                                     { "code": vmovRegCoreUBCode,
3197333Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
3207396Sgblack@eecs.umich.edu    header_output  += FpRegRegImmOpDeclare.subst(vmovRegCoreUBIop);
3217396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegImmOpConstructor.subst(vmovRegCoreUBIop);
3227333Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmovRegCoreUBIop);
3237333Sgblack@eecs.umich.edu
3247333Sgblack@eecs.umich.edu    vmovRegCoreUHCode = '''
3257333Sgblack@eecs.umich.edu        Dest = bits(FpOp1.uw, imm * 16, imm * 16 + 15);
3267333Sgblack@eecs.umich.edu    '''
3277396Sgblack@eecs.umich.edu    vmovRegCoreUHIop = InstObjParams("vmov", "VmovRegCoreUH", "FpRegRegImmOp",
3287333Sgblack@eecs.umich.edu                                     { "code": vmovRegCoreUHCode,
3297333Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
3307396Sgblack@eecs.umich.edu    header_output  += FpRegRegImmOpDeclare.subst(vmovRegCoreUHIop);
3317396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegImmOpConstructor.subst(vmovRegCoreUHIop);
3327333Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmovRegCoreUHIop);
3337333Sgblack@eecs.umich.edu
3347333Sgblack@eecs.umich.edu    vmovRegCoreSBCode = '''
3357333Sgblack@eecs.umich.edu        Dest = sext<8>(bits(FpOp1.uw, imm * 8, imm * 8 + 7));
3367333Sgblack@eecs.umich.edu    '''
3377396Sgblack@eecs.umich.edu    vmovRegCoreSBIop = InstObjParams("vmov", "VmovRegCoreSB", "FpRegRegImmOp",
3387333Sgblack@eecs.umich.edu                                     { "code": vmovRegCoreSBCode,
3397333Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
3407396Sgblack@eecs.umich.edu    header_output  += FpRegRegImmOpDeclare.subst(vmovRegCoreSBIop);
3417396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegImmOpConstructor.subst(vmovRegCoreSBIop);
3427333Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmovRegCoreSBIop);
3437333Sgblack@eecs.umich.edu
3447333Sgblack@eecs.umich.edu    vmovRegCoreSHCode = '''
3457333Sgblack@eecs.umich.edu        Dest = sext<16>(bits(FpOp1.uw, imm * 16, imm * 16 + 15));
3467333Sgblack@eecs.umich.edu    '''
3477396Sgblack@eecs.umich.edu    vmovRegCoreSHIop = InstObjParams("vmov", "VmovRegCoreSH", "FpRegRegImmOp",
3487333Sgblack@eecs.umich.edu                                     { "code": vmovRegCoreSHCode,
3497333Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
3507396Sgblack@eecs.umich.edu    header_output  += FpRegRegImmOpDeclare.subst(vmovRegCoreSHIop);
3517396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegImmOpConstructor.subst(vmovRegCoreSHIop);
3527333Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmovRegCoreSHIop);
3537333Sgblack@eecs.umich.edu
3547333Sgblack@eecs.umich.edu    vmovRegCoreWCode = '''
3557333Sgblack@eecs.umich.edu        Dest = FpOp1.uw;
3567333Sgblack@eecs.umich.edu    '''
3577396Sgblack@eecs.umich.edu    vmovRegCoreWIop = InstObjParams("vmov", "VmovRegCoreW", "FpRegRegOp",
3587333Sgblack@eecs.umich.edu                                     { "code": vmovRegCoreWCode,
3597333Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
3607396Sgblack@eecs.umich.edu    header_output  += FpRegRegOpDeclare.subst(vmovRegCoreWIop);
3617396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegOpConstructor.subst(vmovRegCoreWIop);
3627333Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmovRegCoreWIop);
3637333Sgblack@eecs.umich.edu
3647333Sgblack@eecs.umich.edu    vmov2Reg2CoreCode = '''
3657333Sgblack@eecs.umich.edu        FpDestP0.uw = Op1.uw;
3667333Sgblack@eecs.umich.edu        FpDestP1.uw = Op2.uw;
3677333Sgblack@eecs.umich.edu    '''
3687396Sgblack@eecs.umich.edu    vmov2Reg2CoreIop = InstObjParams("vmov", "Vmov2Reg2Core", "FpRegRegRegOp",
3697333Sgblack@eecs.umich.edu                                     { "code": vmov2Reg2CoreCode,
3707333Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
3717396Sgblack@eecs.umich.edu    header_output  += FpRegRegRegOpDeclare.subst(vmov2Reg2CoreIop);
3727396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegRegOpConstructor.subst(vmov2Reg2CoreIop);
3737333Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmov2Reg2CoreIop);
3747333Sgblack@eecs.umich.edu
3757333Sgblack@eecs.umich.edu    vmov2Core2RegCode = '''
3767333Sgblack@eecs.umich.edu        Dest.uw = FpOp2P0.uw;
3777333Sgblack@eecs.umich.edu        Op1.uw = FpOp2P1.uw;
3787333Sgblack@eecs.umich.edu    '''
3797396Sgblack@eecs.umich.edu    vmov2Core2RegIop = InstObjParams("vmov", "Vmov2Core2Reg", "FpRegRegRegOp",
3807333Sgblack@eecs.umich.edu                                     { "code": vmov2Core2RegCode,
3817333Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
3827396Sgblack@eecs.umich.edu    header_output  += FpRegRegRegOpDeclare.subst(vmov2Core2RegIop);
3837396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegRegOpConstructor.subst(vmov2Core2RegIop);
3847333Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmov2Core2RegIop);
3857381Sgblack@eecs.umich.edu}};
3867381Sgblack@eecs.umich.edu
3877381Sgblack@eecs.umich.edulet {{
3887381Sgblack@eecs.umich.edu
3897381Sgblack@eecs.umich.edu    header_output = ""
3907381Sgblack@eecs.umich.edu    decoder_output = ""
3917381Sgblack@eecs.umich.edu    exec_output = ""
3927364Sgblack@eecs.umich.edu
3937396Sgblack@eecs.umich.edu    singleCode = '''
3947396Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr;
3957396Sgblack@eecs.umich.edu        FpDest = %(op)s;
3967396Sgblack@eecs.umich.edu        Fpscr = fpscr;
3977364Sgblack@eecs.umich.edu    '''
3987396Sgblack@eecs.umich.edu    singleBinOp = "binaryOp(fpscr, FpOp1, FpOp2," + \
3997396Sgblack@eecs.umich.edu                "%(func)s, fpscr.fz, fpscr.rMode)"
4007396Sgblack@eecs.umich.edu    singleUnaryOp = "unaryOp(fpscr, FpOp1, %(func)s, fpscr.fz, fpscr.rMode)"
4017396Sgblack@eecs.umich.edu    doubleCode = '''
4027396Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr;
4037396Sgblack@eecs.umich.edu        double dest = %(op)s;
4047396Sgblack@eecs.umich.edu        Fpscr = fpscr;
4057396Sgblack@eecs.umich.edu        FpDestP0.uw = dblLow(dest);
4067396Sgblack@eecs.umich.edu        FpDestP1.uw = dblHi(dest);
4077396Sgblack@eecs.umich.edu    '''
4087396Sgblack@eecs.umich.edu    doubleBinOp = '''
4097396Sgblack@eecs.umich.edu        binaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw),
4107396Sgblack@eecs.umich.edu                        dbl(FpOp2P0.uw, FpOp2P1.uw),
4117396Sgblack@eecs.umich.edu                        %(func)s, fpscr.fz, fpscr.rMode);
4127396Sgblack@eecs.umich.edu    '''
4137396Sgblack@eecs.umich.edu    doubleUnaryOp = '''
4147396Sgblack@eecs.umich.edu        unaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw), %(func)s,
4157396Sgblack@eecs.umich.edu                fpscr.fz, fpscr.rMode)
4167396Sgblack@eecs.umich.edu    '''
4177364Sgblack@eecs.umich.edu
4187396Sgblack@eecs.umich.edu    def buildBinFpOp(name, Name, base, singleOp, doubleOp):
4197396Sgblack@eecs.umich.edu        global header_output, decoder_output, exec_output
4207365Sgblack@eecs.umich.edu
4217396Sgblack@eecs.umich.edu        code = singleCode % { "op": singleBinOp }
4227396Sgblack@eecs.umich.edu        code = code % { "func": singleOp }
4237396Sgblack@eecs.umich.edu        sIop = InstObjParams(name + "s", Name + "S", base,
4247396Sgblack@eecs.umich.edu                { "code": code, "predicate_test": predicateTest }, [])
4257396Sgblack@eecs.umich.edu        code = doubleCode % { "op": doubleBinOp }
4267396Sgblack@eecs.umich.edu        code = code % { "func": doubleOp }
4277396Sgblack@eecs.umich.edu        dIop = InstObjParams(name + "d", Name + "D", base,
4287396Sgblack@eecs.umich.edu                { "code": code, "predicate_test": predicateTest }, [])
4297365Sgblack@eecs.umich.edu
4307396Sgblack@eecs.umich.edu        declareTempl = eval(base + "Declare");
4317396Sgblack@eecs.umich.edu        constructorTempl = eval(base + "Constructor");
4327366Sgblack@eecs.umich.edu
4337396Sgblack@eecs.umich.edu        for iop in sIop, dIop:
4347396Sgblack@eecs.umich.edu            header_output += declareTempl.subst(iop)
4357396Sgblack@eecs.umich.edu            decoder_output += constructorTempl.subst(iop)
4367396Sgblack@eecs.umich.edu            exec_output += PredOpExecute.subst(iop)
4377366Sgblack@eecs.umich.edu
4387396Sgblack@eecs.umich.edu    buildBinFpOp("vadd", "Vadd", "FpRegRegRegOp", "fpAddS", "fpAddD")
4397396Sgblack@eecs.umich.edu    buildBinFpOp("vsub", "Vsub", "FpRegRegRegOp", "fpSubS", "fpSubD")
4407396Sgblack@eecs.umich.edu    buildBinFpOp("vdiv", "Vdiv", "FpRegRegRegOp", "fpDivS", "fpDivD")
4417396Sgblack@eecs.umich.edu    buildBinFpOp("vmul", "Vmul", "FpRegRegRegOp", "fpMulS", "fpMulD")
4427367Sgblack@eecs.umich.edu
4437396Sgblack@eecs.umich.edu    def buildUnaryFpOp(name, Name, base, singleOp, doubleOp = None):
4447396Sgblack@eecs.umich.edu        if doubleOp is None:
4457396Sgblack@eecs.umich.edu            doubleOp = singleOp
4467396Sgblack@eecs.umich.edu        global header_output, decoder_output, exec_output
4477367Sgblack@eecs.umich.edu
4487396Sgblack@eecs.umich.edu        code = singleCode % { "op": singleUnaryOp }
4497396Sgblack@eecs.umich.edu        code = code % { "func": singleOp }
4507396Sgblack@eecs.umich.edu        sIop = InstObjParams(name + "s", Name + "S", base,
4517396Sgblack@eecs.umich.edu                { "code": code, "predicate_test": predicateTest }, [])
4527396Sgblack@eecs.umich.edu        code = doubleCode % { "op": doubleUnaryOp }
4537396Sgblack@eecs.umich.edu        code = code % { "func": doubleOp }
4547396Sgblack@eecs.umich.edu        dIop = InstObjParams(name + "d", Name + "D", base,
4557396Sgblack@eecs.umich.edu                { "code": code, "predicate_test": predicateTest }, [])
4567368Sgblack@eecs.umich.edu
4577396Sgblack@eecs.umich.edu        declareTempl = eval(base + "Declare");
4587396Sgblack@eecs.umich.edu        constructorTempl = eval(base + "Constructor");
4597368Sgblack@eecs.umich.edu
4607396Sgblack@eecs.umich.edu        for iop in sIop, dIop:
4617396Sgblack@eecs.umich.edu            header_output += declareTempl.subst(iop)
4627396Sgblack@eecs.umich.edu            decoder_output += constructorTempl.subst(iop)
4637396Sgblack@eecs.umich.edu            exec_output += PredOpExecute.subst(iop)
4647369Sgblack@eecs.umich.edu
4657396Sgblack@eecs.umich.edu    buildUnaryFpOp("vsqrt", "Vsqrt", "FpRegRegOp", "sqrtf", "sqrt")
4667369Sgblack@eecs.umich.edu
4677396Sgblack@eecs.umich.edu    def buildSimpleUnaryFpOp(name, Name, base, singleOp, doubleOp = None):
4687396Sgblack@eecs.umich.edu        if doubleOp is None:
4697396Sgblack@eecs.umich.edu            doubleOp = singleOp
4707396Sgblack@eecs.umich.edu        global header_output, decoder_output, exec_output
4717369Sgblack@eecs.umich.edu
4727396Sgblack@eecs.umich.edu        sIop = InstObjParams(name + "s", Name + "S", base,
4737396Sgblack@eecs.umich.edu                { "code": singleCode % { "op": singleOp },
4747396Sgblack@eecs.umich.edu                  "predicate_test": predicateTest }, [])
4757396Sgblack@eecs.umich.edu        dIop = InstObjParams(name + "d", Name + "D", base,
4767396Sgblack@eecs.umich.edu                { "code": doubleCode % { "op": doubleOp },
4777396Sgblack@eecs.umich.edu                  "predicate_test": predicateTest }, [])
4787369Sgblack@eecs.umich.edu
4797396Sgblack@eecs.umich.edu        declareTempl = eval(base + "Declare");
4807396Sgblack@eecs.umich.edu        constructorTempl = eval(base + "Constructor");
4817396Sgblack@eecs.umich.edu
4827396Sgblack@eecs.umich.edu        for iop in sIop, dIop:
4837396Sgblack@eecs.umich.edu            header_output += declareTempl.subst(iop)
4847396Sgblack@eecs.umich.edu            decoder_output += constructorTempl.subst(iop)
4857396Sgblack@eecs.umich.edu            exec_output += PredOpExecute.subst(iop)
4867396Sgblack@eecs.umich.edu
4877396Sgblack@eecs.umich.edu    buildSimpleUnaryFpOp("vneg", "Vneg", "FpRegRegOp",
4887396Sgblack@eecs.umich.edu                         "-FpOp1", "-dbl(FpOp1P0.uw, FpOp1P1.uw)")
4897396Sgblack@eecs.umich.edu    buildSimpleUnaryFpOp("vabs", "Vabs", "FpRegRegOp",
4907396Sgblack@eecs.umich.edu                         "fabsf(FpOp1)", "fabs(dbl(FpOp1P0.uw, FpOp1P1.uw))")
4917381Sgblack@eecs.umich.edu}};
4927381Sgblack@eecs.umich.edu
4937381Sgblack@eecs.umich.edulet {{
4947381Sgblack@eecs.umich.edu
4957381Sgblack@eecs.umich.edu    header_output = ""
4967381Sgblack@eecs.umich.edu    decoder_output = ""
4977381Sgblack@eecs.umich.edu    exec_output = ""
4987370Sgblack@eecs.umich.edu
4997370Sgblack@eecs.umich.edu    vmlaSCode = '''
5007396Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr;
5017396Sgblack@eecs.umich.edu        float mid = binaryOp(fpscr, FpOp1, FpOp2,
5027396Sgblack@eecs.umich.edu                fpMulS, fpscr.fz, fpscr.rMode);
5037396Sgblack@eecs.umich.edu        FpDest = binaryOp(fpscr, FpDest, mid, fpAddS, fpscr.fz, fpscr.rMode);
5047396Sgblack@eecs.umich.edu        Fpscr = fpscr;
5057370Sgblack@eecs.umich.edu    '''
5067396Sgblack@eecs.umich.edu    vmlaSIop = InstObjParams("vmlas", "VmlaS", "FpRegRegRegOp",
5077370Sgblack@eecs.umich.edu                                     { "code": vmlaSCode,
5087370Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
5097396Sgblack@eecs.umich.edu    header_output  += FpRegRegRegOpDeclare.subst(vmlaSIop);
5107396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegRegOpConstructor.subst(vmlaSIop);
5117370Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmlaSIop);
5127370Sgblack@eecs.umich.edu
5137370Sgblack@eecs.umich.edu    vmlaDCode = '''
5147396Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr;
5157396Sgblack@eecs.umich.edu        double mid = binaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw),
5167396Sgblack@eecs.umich.edu                                     dbl(FpOp2P0.uw, FpOp2P1.uw),
5177396Sgblack@eecs.umich.edu                                     fpMulD, fpscr.fz, fpscr.rMode);
5187396Sgblack@eecs.umich.edu        double dest = binaryOp(fpscr, dbl(FpDestP0.uw, FpDestP1.uw),
5197396Sgblack@eecs.umich.edu                                      mid, fpAddD, fpscr.fz, fpscr.rMode);
5207396Sgblack@eecs.umich.edu        Fpscr = fpscr;
5217396Sgblack@eecs.umich.edu        FpDestP0.uw = dblLow(dest);
5227396Sgblack@eecs.umich.edu        FpDestP1.uw = dblHi(dest);
5237370Sgblack@eecs.umich.edu    '''
5247396Sgblack@eecs.umich.edu    vmlaDIop = InstObjParams("vmlad", "VmlaD", "FpRegRegRegOp",
5257370Sgblack@eecs.umich.edu                                     { "code": vmlaDCode,
5267370Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
5277396Sgblack@eecs.umich.edu    header_output  += FpRegRegRegOpDeclare.subst(vmlaDIop);
5287396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegRegOpConstructor.subst(vmlaDIop);
5297370Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmlaDIop);
5307370Sgblack@eecs.umich.edu
5317370Sgblack@eecs.umich.edu    vmlsSCode = '''
5327396Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr;
5337396Sgblack@eecs.umich.edu        float mid = binaryOp(fpscr, FpOp1, FpOp2,
5347396Sgblack@eecs.umich.edu                fpMulS, fpscr.fz, fpscr.rMode);
5357396Sgblack@eecs.umich.edu        FpDest = binaryOp(fpscr, FpDest, -mid, fpAddS, fpscr.fz, fpscr.rMode);
5367396Sgblack@eecs.umich.edu        Fpscr = fpscr;
5377370Sgblack@eecs.umich.edu    '''
5387396Sgblack@eecs.umich.edu    vmlsSIop = InstObjParams("vmlss", "VmlsS", "FpRegRegRegOp",
5397370Sgblack@eecs.umich.edu                                     { "code": vmlsSCode,
5407370Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
5417396Sgblack@eecs.umich.edu    header_output  += FpRegRegRegOpDeclare.subst(vmlsSIop);
5427396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegRegOpConstructor.subst(vmlsSIop);
5437370Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmlsSIop);
5447370Sgblack@eecs.umich.edu
5457370Sgblack@eecs.umich.edu    vmlsDCode = '''
5467396Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr;
5477396Sgblack@eecs.umich.edu        double mid = binaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw),
5487396Sgblack@eecs.umich.edu                                     dbl(FpOp2P0.uw, FpOp2P1.uw),
5497396Sgblack@eecs.umich.edu                                     fpMulD, fpscr.fz, fpscr.rMode);
5507396Sgblack@eecs.umich.edu        double dest = binaryOp(fpscr, dbl(FpDestP0.uw, FpDestP1.uw),
5517396Sgblack@eecs.umich.edu                                      -mid, fpAddD, fpscr.fz, fpscr.rMode);
5527396Sgblack@eecs.umich.edu        Fpscr = fpscr;
5537396Sgblack@eecs.umich.edu        FpDestP0.uw = dblLow(dest);
5547396Sgblack@eecs.umich.edu        FpDestP1.uw = dblHi(dest);
5557370Sgblack@eecs.umich.edu    '''
5567396Sgblack@eecs.umich.edu    vmlsDIop = InstObjParams("vmlsd", "VmlsD", "FpRegRegRegOp",
5577370Sgblack@eecs.umich.edu                                     { "code": vmlsDCode,
5587370Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
5597396Sgblack@eecs.umich.edu    header_output  += FpRegRegRegOpDeclare.subst(vmlsDIop);
5607396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegRegOpConstructor.subst(vmlsDIop);
5617370Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vmlsDIop);
5627371Sgblack@eecs.umich.edu
5637371Sgblack@eecs.umich.edu    vnmlaSCode = '''
5647396Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr;
5657396Sgblack@eecs.umich.edu        float mid = binaryOp(fpscr, FpOp1, FpOp2,
5667396Sgblack@eecs.umich.edu                fpMulS, fpscr.fz, fpscr.rMode);
5677396Sgblack@eecs.umich.edu        FpDest = binaryOp(fpscr, -FpDest, -mid, fpAddS, fpscr.fz, fpscr.rMode);
5687396Sgblack@eecs.umich.edu        Fpscr = fpscr;
5697371Sgblack@eecs.umich.edu    '''
5707396Sgblack@eecs.umich.edu    vnmlaSIop = InstObjParams("vnmlas", "VnmlaS", "FpRegRegRegOp",
5717371Sgblack@eecs.umich.edu                                     { "code": vnmlaSCode,
5727371Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
5737396Sgblack@eecs.umich.edu    header_output  += FpRegRegRegOpDeclare.subst(vnmlaSIop);
5747396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegRegOpConstructor.subst(vnmlaSIop);
5757371Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vnmlaSIop);
5767371Sgblack@eecs.umich.edu
5777371Sgblack@eecs.umich.edu    vnmlaDCode = '''
5787396Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr;
5797396Sgblack@eecs.umich.edu        double mid = binaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw),
5807396Sgblack@eecs.umich.edu                                     dbl(FpOp2P0.uw, FpOp2P1.uw),
5817396Sgblack@eecs.umich.edu                                     fpMulD, fpscr.fz, fpscr.rMode);
5827396Sgblack@eecs.umich.edu        double dest = binaryOp(fpscr, -dbl(FpDestP0.uw, FpDestP1.uw),
5837396Sgblack@eecs.umich.edu                                      -mid, fpAddD, fpscr.fz, fpscr.rMode);
5847396Sgblack@eecs.umich.edu        Fpscr = fpscr;
5857396Sgblack@eecs.umich.edu        FpDestP0.uw = dblLow(dest);
5867396Sgblack@eecs.umich.edu        FpDestP1.uw = dblHi(dest);
5877371Sgblack@eecs.umich.edu    '''
5887396Sgblack@eecs.umich.edu    vnmlaDIop = InstObjParams("vnmlad", "VnmlaD", "FpRegRegRegOp",
5897371Sgblack@eecs.umich.edu                                     { "code": vnmlaDCode,
5907371Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
5917396Sgblack@eecs.umich.edu    header_output  += FpRegRegRegOpDeclare.subst(vnmlaDIop);
5927396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegRegOpConstructor.subst(vnmlaDIop);
5937371Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vnmlaDIop);
5947371Sgblack@eecs.umich.edu
5957371Sgblack@eecs.umich.edu    vnmlsSCode = '''
5967396Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr;
5977396Sgblack@eecs.umich.edu        float mid = binaryOp(fpscr, FpOp1, FpOp2,
5987396Sgblack@eecs.umich.edu                fpMulS, fpscr.fz, fpscr.rMode);
5997396Sgblack@eecs.umich.edu        FpDest = binaryOp(fpscr, -FpDest, mid, fpAddS, fpscr.fz, fpscr.rMode);
6007396Sgblack@eecs.umich.edu        Fpscr = fpscr;
6017371Sgblack@eecs.umich.edu    '''
6027396Sgblack@eecs.umich.edu    vnmlsSIop = InstObjParams("vnmlss", "VnmlsS", "FpRegRegRegOp",
6037371Sgblack@eecs.umich.edu                                     { "code": vnmlsSCode,
6047371Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
6057396Sgblack@eecs.umich.edu    header_output  += FpRegRegRegOpDeclare.subst(vnmlsSIop);
6067396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegRegOpConstructor.subst(vnmlsSIop);
6077371Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vnmlsSIop);
6087371Sgblack@eecs.umich.edu
6097371Sgblack@eecs.umich.edu    vnmlsDCode = '''
6107396Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr;
6117396Sgblack@eecs.umich.edu        double mid = binaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw),
6127396Sgblack@eecs.umich.edu                                     dbl(FpOp2P0.uw, FpOp2P1.uw),
6137396Sgblack@eecs.umich.edu                                     fpMulD, fpscr.fz, fpscr.rMode);
6147396Sgblack@eecs.umich.edu        double dest = binaryOp(fpscr, -dbl(FpDestP0.uw, FpDestP1.uw),
6157396Sgblack@eecs.umich.edu                                      mid, fpAddD, fpscr.fz, fpscr.rMode);
6167396Sgblack@eecs.umich.edu        Fpscr = fpscr;
6177396Sgblack@eecs.umich.edu        FpDestP0.uw = dblLow(dest);
6187396Sgblack@eecs.umich.edu        FpDestP1.uw = dblHi(dest);
6197371Sgblack@eecs.umich.edu    '''
6207396Sgblack@eecs.umich.edu    vnmlsDIop = InstObjParams("vnmlsd", "VnmlsD", "FpRegRegRegOp",
6217371Sgblack@eecs.umich.edu                                     { "code": vnmlsDCode,
6227371Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
6237396Sgblack@eecs.umich.edu    header_output  += FpRegRegRegOpDeclare.subst(vnmlsDIop);
6247396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegRegOpConstructor.subst(vnmlsDIop);
6257371Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vnmlsDIop);
6267371Sgblack@eecs.umich.edu
6277371Sgblack@eecs.umich.edu    vnmulSCode = '''
6287396Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr;
6297396Sgblack@eecs.umich.edu        FpDest = -binaryOp(fpscr, FpOp1, FpOp2, fpMulS, fpscr.fz, fpscr.rMode);
6307396Sgblack@eecs.umich.edu        Fpscr = fpscr;
6317371Sgblack@eecs.umich.edu    '''
6327396Sgblack@eecs.umich.edu    vnmulSIop = InstObjParams("vnmuls", "VnmulS", "FpRegRegRegOp",
6337371Sgblack@eecs.umich.edu                                     { "code": vnmulSCode,
6347371Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
6357396Sgblack@eecs.umich.edu    header_output  += FpRegRegRegOpDeclare.subst(vnmulSIop);
6367396Sgblack@eecs.umich.edu    decoder_output  += FpRegRegRegOpConstructor.subst(vnmulSIop);
6377371Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vnmulSIop);
6387371Sgblack@eecs.umich.edu
6397371Sgblack@eecs.umich.edu    vnmulDCode = '''
6407396Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr;
6417396Sgblack@eecs.umich.edu        double dest = -binaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw),
6427396Sgblack@eecs.umich.edu                                       dbl(FpOp2P0.uw, FpOp2P1.uw),
6437396Sgblack@eecs.umich.edu                                       fpMulD, fpscr.fz, fpscr.rMode);
6447396Sgblack@eecs.umich.edu        Fpscr = fpscr;
6457396Sgblack@eecs.umich.edu        FpDestP0.uw = dblLow(dest);
6467396Sgblack@eecs.umich.edu        FpDestP1.uw = dblHi(dest);
6477371Sgblack@eecs.umich.edu    '''
6487396Sgblack@eecs.umich.edu    vnmulDIop = InstObjParams("vnmuld", "VnmulD", "FpRegRegRegOp",
6497371Sgblack@eecs.umich.edu                                     { "code": vnmulDCode,
6507371Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
6517396Sgblack@eecs.umich.edu    header_output += FpRegRegRegOpDeclare.subst(vnmulDIop);
6527396Sgblack@eecs.umich.edu    decoder_output += FpRegRegRegOpConstructor.subst(vnmulDIop);
6537371Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vnmulDIop);
6547381Sgblack@eecs.umich.edu}};
6557381Sgblack@eecs.umich.edu
6567381Sgblack@eecs.umich.edulet {{
6577381Sgblack@eecs.umich.edu
6587381Sgblack@eecs.umich.edu    header_output = ""
6597381Sgblack@eecs.umich.edu    decoder_output = ""
6607381Sgblack@eecs.umich.edu    exec_output = ""
6617373Sgblack@eecs.umich.edu
6627373Sgblack@eecs.umich.edu    vcvtUIntFpSCode = '''
6637378Sgblack@eecs.umich.edu        VfpSavedState state = prepVfpFpscr(Fpscr);
6647381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1.uw) : "m" (FpOp1.uw));
6657373Sgblack@eecs.umich.edu        FpDest = FpOp1.uw;
6667381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest));
6677378Sgblack@eecs.umich.edu        Fpscr = setVfpFpscr(Fpscr, state);
6687373Sgblack@eecs.umich.edu    '''
6697396Sgblack@eecs.umich.edu    vcvtUIntFpSIop = InstObjParams("vcvt", "VcvtUIntFpS", "FpRegRegOp",
6707373Sgblack@eecs.umich.edu                                     { "code": vcvtUIntFpSCode,
6717373Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
6727396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcvtUIntFpSIop);
6737396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcvtUIntFpSIop);
6747373Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtUIntFpSIop);
6757373Sgblack@eecs.umich.edu
6767373Sgblack@eecs.umich.edu    vcvtUIntFpDCode = '''
6777373Sgblack@eecs.umich.edu        IntDoubleUnion cDest;
6787378Sgblack@eecs.umich.edu        VfpSavedState state = prepVfpFpscr(Fpscr);
6797381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1P0.uw) : "m" (FpOp1P0.uw));
6807373Sgblack@eecs.umich.edu        cDest.fp = (uint64_t)FpOp1P0.uw;
6817381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (cDest.fp));
6827378Sgblack@eecs.umich.edu        Fpscr = setVfpFpscr(Fpscr, state);
6837373Sgblack@eecs.umich.edu        FpDestP0.uw = cDest.bits;
6847373Sgblack@eecs.umich.edu        FpDestP1.uw = cDest.bits >> 32;
6857373Sgblack@eecs.umich.edu    '''
6867396Sgblack@eecs.umich.edu    vcvtUIntFpDIop = InstObjParams("vcvt", "VcvtUIntFpD", "FpRegRegOp",
6877373Sgblack@eecs.umich.edu                                     { "code": vcvtUIntFpDCode,
6887373Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
6897396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcvtUIntFpDIop);
6907396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcvtUIntFpDIop);
6917373Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtUIntFpDIop);
6927373Sgblack@eecs.umich.edu
6937373Sgblack@eecs.umich.edu    vcvtSIntFpSCode = '''
6947378Sgblack@eecs.umich.edu        VfpSavedState state = prepVfpFpscr(Fpscr);
6957381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1.sw) : "m" (FpOp1.sw));
6967373Sgblack@eecs.umich.edu        FpDest = FpOp1.sw;
6977381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest));
6987378Sgblack@eecs.umich.edu        Fpscr = setVfpFpscr(Fpscr, state);
6997373Sgblack@eecs.umich.edu    '''
7007396Sgblack@eecs.umich.edu    vcvtSIntFpSIop = InstObjParams("vcvt", "VcvtSIntFpS", "FpRegRegOp",
7017373Sgblack@eecs.umich.edu                                     { "code": vcvtSIntFpSCode,
7027373Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
7037396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcvtSIntFpSIop);
7047396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcvtSIntFpSIop);
7057373Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtSIntFpSIop);
7067373Sgblack@eecs.umich.edu
7077373Sgblack@eecs.umich.edu    vcvtSIntFpDCode = '''
7087373Sgblack@eecs.umich.edu        IntDoubleUnion cDest;
7097378Sgblack@eecs.umich.edu        VfpSavedState state = prepVfpFpscr(Fpscr);
7107381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1P0.sw) : "m" (FpOp1P0.sw));
7117373Sgblack@eecs.umich.edu        cDest.fp = FpOp1P0.sw;
7127381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (cDest.fp));
7137378Sgblack@eecs.umich.edu        Fpscr = setVfpFpscr(Fpscr, state);
7147373Sgblack@eecs.umich.edu        FpDestP0.uw = cDest.bits;
7157373Sgblack@eecs.umich.edu        FpDestP1.uw = cDest.bits >> 32;
7167373Sgblack@eecs.umich.edu    '''
7177396Sgblack@eecs.umich.edu    vcvtSIntFpDIop = InstObjParams("vcvt", "VcvtSIntFpD", "FpRegRegOp",
7187373Sgblack@eecs.umich.edu                                     { "code": vcvtSIntFpDCode,
7197373Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
7207396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcvtSIntFpDIop);
7217396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcvtSIntFpDIop);
7227373Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtSIntFpDIop);
7237373Sgblack@eecs.umich.edu
7247380Sgblack@eecs.umich.edu    vcvtFpUIntSRCode = '''
7257382Sgblack@eecs.umich.edu        vfpFlushToZero(Fpscr, FpOp1);
7267380Sgblack@eecs.umich.edu        VfpSavedState state = prepVfpFpscr(Fpscr);
7277381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
7287388Sgblack@eecs.umich.edu        FpDest.uw = vfpFpSToFixed(FpOp1, false, false, 0, false);
7297381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest.uw));
7307380Sgblack@eecs.umich.edu        Fpscr = setVfpFpscr(Fpscr, state);
7317380Sgblack@eecs.umich.edu    '''
7327396Sgblack@eecs.umich.edu    vcvtFpUIntSRIop = InstObjParams("vcvt", "VcvtFpUIntSR", "FpRegRegOp",
7337380Sgblack@eecs.umich.edu                                     { "code": vcvtFpUIntSRCode,
7347380Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
7357396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcvtFpUIntSRIop);
7367396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcvtFpUIntSRIop);
7377380Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpUIntSRIop);
7387380Sgblack@eecs.umich.edu
7397380Sgblack@eecs.umich.edu    vcvtFpUIntDRCode = '''
7407380Sgblack@eecs.umich.edu        IntDoubleUnion cOp1;
7417380Sgblack@eecs.umich.edu        cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
7427382Sgblack@eecs.umich.edu        vfpFlushToZero(Fpscr, cOp1.fp);
7437380Sgblack@eecs.umich.edu        VfpSavedState state = prepVfpFpscr(Fpscr);
7447381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
7457388Sgblack@eecs.umich.edu        uint64_t result = vfpFpDToFixed(cOp1.fp, false, false, 0, false);
7467381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (result));
7477380Sgblack@eecs.umich.edu        Fpscr = setVfpFpscr(Fpscr, state);
7487380Sgblack@eecs.umich.edu        FpDestP0.uw = result;
7497380Sgblack@eecs.umich.edu    '''
7507396Sgblack@eecs.umich.edu    vcvtFpUIntDRIop = InstObjParams("vcvtr", "VcvtFpUIntDR", "FpRegRegOp",
7517380Sgblack@eecs.umich.edu                                     { "code": vcvtFpUIntDRCode,
7527380Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
7537396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcvtFpUIntDRIop);
7547396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcvtFpUIntDRIop);
7557380Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpUIntDRIop);
7567380Sgblack@eecs.umich.edu
7577380Sgblack@eecs.umich.edu    vcvtFpSIntSRCode = '''
7587382Sgblack@eecs.umich.edu        vfpFlushToZero(Fpscr, FpOp1);
7597380Sgblack@eecs.umich.edu        VfpSavedState state = prepVfpFpscr(Fpscr);
7607381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
7617388Sgblack@eecs.umich.edu        FpDest.sw = vfpFpSToFixed(FpOp1, true, false, 0, false);
7627381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest.sw));
7637380Sgblack@eecs.umich.edu        Fpscr = setVfpFpscr(Fpscr, state);
7647380Sgblack@eecs.umich.edu    '''
7657396Sgblack@eecs.umich.edu    vcvtFpSIntSRIop = InstObjParams("vcvtr", "VcvtFpSIntSR", "FpRegRegOp",
7667380Sgblack@eecs.umich.edu                                     { "code": vcvtFpSIntSRCode,
7677380Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
7687396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcvtFpSIntSRIop);
7697396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcvtFpSIntSRIop);
7707380Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpSIntSRIop);
7717380Sgblack@eecs.umich.edu
7727380Sgblack@eecs.umich.edu    vcvtFpSIntDRCode = '''
7737380Sgblack@eecs.umich.edu        IntDoubleUnion cOp1;
7747380Sgblack@eecs.umich.edu        cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
7757382Sgblack@eecs.umich.edu        vfpFlushToZero(Fpscr, cOp1.fp);
7767380Sgblack@eecs.umich.edu        VfpSavedState state = prepVfpFpscr(Fpscr);
7777381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
7787388Sgblack@eecs.umich.edu        int64_t result = vfpFpDToFixed(cOp1.fp, true, false, 0, false);
7797381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (result));
7807380Sgblack@eecs.umich.edu        Fpscr = setVfpFpscr(Fpscr, state);
7817380Sgblack@eecs.umich.edu        FpDestP0.uw = result;
7827380Sgblack@eecs.umich.edu    '''
7837396Sgblack@eecs.umich.edu    vcvtFpSIntDRIop = InstObjParams("vcvtr", "VcvtFpSIntDR", "FpRegRegOp",
7847380Sgblack@eecs.umich.edu                                     { "code": vcvtFpSIntDRCode,
7857380Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
7867396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcvtFpSIntDRIop);
7877396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcvtFpSIntDRIop);
7887380Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpSIntDRIop);
7897380Sgblack@eecs.umich.edu
7907373Sgblack@eecs.umich.edu    vcvtFpUIntSCode = '''
7917382Sgblack@eecs.umich.edu        vfpFlushToZero(Fpscr, FpOp1);
7927378Sgblack@eecs.umich.edu        VfpSavedState state = prepVfpFpscr(Fpscr);
7937380Sgblack@eecs.umich.edu        fesetround(FeRoundZero);
7947381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
7957387Sgblack@eecs.umich.edu        FpDest.uw = vfpFpSToFixed(FpOp1, false, false, 0);
7967381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest.uw));
7977378Sgblack@eecs.umich.edu        Fpscr = setVfpFpscr(Fpscr, state);
7987373Sgblack@eecs.umich.edu    '''
7997396Sgblack@eecs.umich.edu    vcvtFpUIntSIop = InstObjParams("vcvt", "VcvtFpUIntS", "FpRegRegOp",
8007373Sgblack@eecs.umich.edu                                     { "code": vcvtFpUIntSCode,
8017373Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
8027396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcvtFpUIntSIop);
8037396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcvtFpUIntSIop);
8047373Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpUIntSIop);
8057373Sgblack@eecs.umich.edu
8067373Sgblack@eecs.umich.edu    vcvtFpUIntDCode = '''
8077373Sgblack@eecs.umich.edu        IntDoubleUnion cOp1;
8087373Sgblack@eecs.umich.edu        cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
8097382Sgblack@eecs.umich.edu        vfpFlushToZero(Fpscr, cOp1.fp);
8107378Sgblack@eecs.umich.edu        VfpSavedState state = prepVfpFpscr(Fpscr);
8117380Sgblack@eecs.umich.edu        fesetround(FeRoundZero);
8127381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
8137387Sgblack@eecs.umich.edu        uint64_t result = vfpFpDToFixed(cOp1.fp, false, false, 0);
8147381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (result));
8157378Sgblack@eecs.umich.edu        Fpscr = setVfpFpscr(Fpscr, state);
8167373Sgblack@eecs.umich.edu        FpDestP0.uw = result;
8177373Sgblack@eecs.umich.edu    '''
8187396Sgblack@eecs.umich.edu    vcvtFpUIntDIop = InstObjParams("vcvt", "VcvtFpUIntD", "FpRegRegOp",
8197373Sgblack@eecs.umich.edu                                     { "code": vcvtFpUIntDCode,
8207373Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
8217396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcvtFpUIntDIop);
8227396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcvtFpUIntDIop);
8237373Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpUIntDIop);
8247373Sgblack@eecs.umich.edu
8257373Sgblack@eecs.umich.edu    vcvtFpSIntSCode = '''
8267382Sgblack@eecs.umich.edu        vfpFlushToZero(Fpscr, FpOp1);
8277378Sgblack@eecs.umich.edu        VfpSavedState state = prepVfpFpscr(Fpscr);
8287380Sgblack@eecs.umich.edu        fesetround(FeRoundZero);
8297381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
8307387Sgblack@eecs.umich.edu        FpDest.sw = vfpFpSToFixed(FpOp1, true, false, 0);
8317381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest.sw));
8327378Sgblack@eecs.umich.edu        Fpscr = setVfpFpscr(Fpscr, state);
8337373Sgblack@eecs.umich.edu    '''
8347396Sgblack@eecs.umich.edu    vcvtFpSIntSIop = InstObjParams("vcvt", "VcvtFpSIntS", "FpRegRegOp",
8357373Sgblack@eecs.umich.edu                                     { "code": vcvtFpSIntSCode,
8367373Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
8377396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcvtFpSIntSIop);
8387396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcvtFpSIntSIop);
8397373Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpSIntSIop);
8407373Sgblack@eecs.umich.edu
8417373Sgblack@eecs.umich.edu    vcvtFpSIntDCode = '''
8427373Sgblack@eecs.umich.edu        IntDoubleUnion cOp1;
8437373Sgblack@eecs.umich.edu        cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
8447382Sgblack@eecs.umich.edu        vfpFlushToZero(Fpscr, cOp1.fp);
8457378Sgblack@eecs.umich.edu        VfpSavedState state = prepVfpFpscr(Fpscr);
8467380Sgblack@eecs.umich.edu        fesetround(FeRoundZero);
8477381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
8487387Sgblack@eecs.umich.edu        int64_t result = vfpFpDToFixed(cOp1.fp, true, false, 0);
8497381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (result));
8507378Sgblack@eecs.umich.edu        Fpscr = setVfpFpscr(Fpscr, state);
8517373Sgblack@eecs.umich.edu        FpDestP0.uw = result;
8527373Sgblack@eecs.umich.edu    '''
8537396Sgblack@eecs.umich.edu    vcvtFpSIntDIop = InstObjParams("vcvt", "VcvtFpSIntD", "FpRegRegOp",
8547373Sgblack@eecs.umich.edu                                     { "code": vcvtFpSIntDCode,
8557373Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
8567396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcvtFpSIntDIop);
8577396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcvtFpSIntDIop);
8587373Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpSIntDIop);
8597374Sgblack@eecs.umich.edu
8607374Sgblack@eecs.umich.edu    vcvtFpSFpDCode = '''
8617374Sgblack@eecs.umich.edu        IntDoubleUnion cDest;
8627382Sgblack@eecs.umich.edu        vfpFlushToZero(Fpscr, FpOp1);
8637378Sgblack@eecs.umich.edu        VfpSavedState state = prepVfpFpscr(Fpscr);
8647381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
8657396Sgblack@eecs.umich.edu        cDest.fp = fixFpSFpDDest(Fpscr, FpOp1);
8667381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (cDest.fp));
8677378Sgblack@eecs.umich.edu        Fpscr = setVfpFpscr(Fpscr, state);
8687374Sgblack@eecs.umich.edu        FpDestP0.uw = cDest.bits;
8697374Sgblack@eecs.umich.edu        FpDestP1.uw = cDest.bits >> 32;
8707374Sgblack@eecs.umich.edu    '''
8717396Sgblack@eecs.umich.edu    vcvtFpSFpDIop = InstObjParams("vcvt", "VcvtFpSFpD", "FpRegRegOp",
8727374Sgblack@eecs.umich.edu                                     { "code": vcvtFpSFpDCode,
8737374Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
8747396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcvtFpSFpDIop);
8757396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcvtFpSFpDIop);
8767374Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpSFpDIop);
8777374Sgblack@eecs.umich.edu
8787374Sgblack@eecs.umich.edu    vcvtFpDFpSCode = '''
8797374Sgblack@eecs.umich.edu        IntDoubleUnion cOp1;
8807374Sgblack@eecs.umich.edu        cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
8817382Sgblack@eecs.umich.edu        vfpFlushToZero(Fpscr, cOp1.fp);
8827378Sgblack@eecs.umich.edu        VfpSavedState state = prepVfpFpscr(Fpscr);
8837381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
8847386Sgblack@eecs.umich.edu        FpDest = fixFpDFpSDest(Fpscr, cOp1.fp);
8857381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest));
8867378Sgblack@eecs.umich.edu        Fpscr = setVfpFpscr(Fpscr, state);
8877374Sgblack@eecs.umich.edu    '''
8887396Sgblack@eecs.umich.edu    vcvtFpDFpSIop = InstObjParams("vcvt", "VcvtFpDFpS", "FpRegRegOp",
8897374Sgblack@eecs.umich.edu                                     { "code": vcvtFpDFpSCode,
8907374Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
8917396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcvtFpDFpSIop);
8927396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcvtFpDFpSIop);
8937374Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpDFpSIop);
8947377Sgblack@eecs.umich.edu
8957377Sgblack@eecs.umich.edu    vcmpSCode = '''
8967389Sgblack@eecs.umich.edu        vfpFlushToZero(Fpscr, FpDest, FpOp1);
8977377Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr;
8987377Sgblack@eecs.umich.edu        if (FpDest == FpOp1) {
8997377Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
9007377Sgblack@eecs.umich.edu        } else if (FpDest < FpOp1) {
9017377Sgblack@eecs.umich.edu            fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
9027377Sgblack@eecs.umich.edu        } else if (FpDest > FpOp1) {
9037377Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
9047377Sgblack@eecs.umich.edu        } else {
9057389Sgblack@eecs.umich.edu            const uint32_t qnan = 0x7fc00000;
9067389Sgblack@eecs.umich.edu            const bool nan1 = std::isnan(FpDest);
9077396Sgblack@eecs.umich.edu            const bool signal1 = nan1 && ((fpToBits(FpDest) & qnan) != qnan);
9087389Sgblack@eecs.umich.edu            const bool nan2 = std::isnan(FpOp1);
9097396Sgblack@eecs.umich.edu            const bool signal2 = nan2 && ((fpToBits(FpOp1) & qnan) != qnan);
9107389Sgblack@eecs.umich.edu            if (signal1 || signal2)
9117389Sgblack@eecs.umich.edu                fpscr.ioc = 1;
9127377Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
9137377Sgblack@eecs.umich.edu        }
9147377Sgblack@eecs.umich.edu        Fpscr = fpscr;
9157377Sgblack@eecs.umich.edu    '''
9167396Sgblack@eecs.umich.edu    vcmpSIop = InstObjParams("vcmps", "VcmpS", "FpRegRegOp",
9177377Sgblack@eecs.umich.edu                                     { "code": vcmpSCode,
9187377Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
9197396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcmpSIop);
9207396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcmpSIop);
9217377Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcmpSIop);
9227377Sgblack@eecs.umich.edu
9237377Sgblack@eecs.umich.edu    vcmpDCode = '''
9247377Sgblack@eecs.umich.edu        IntDoubleUnion cOp1, cDest;
9257377Sgblack@eecs.umich.edu        cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
9267377Sgblack@eecs.umich.edu        cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
9277382Sgblack@eecs.umich.edu        vfpFlushToZero(Fpscr, cDest.fp, cOp1.fp);
9287377Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr;
9297377Sgblack@eecs.umich.edu        if (cDest.fp == cOp1.fp) {
9307377Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
9317377Sgblack@eecs.umich.edu        } else if (cDest.fp < cOp1.fp) {
9327377Sgblack@eecs.umich.edu            fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
9337377Sgblack@eecs.umich.edu        } else if (cDest.fp > cOp1.fp) {
9347377Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
9357377Sgblack@eecs.umich.edu        } else {
9367389Sgblack@eecs.umich.edu            const uint64_t qnan = ULL(0x7ff8000000000000);
9377389Sgblack@eecs.umich.edu            const bool nan1 = std::isnan(cDest.fp);
9387389Sgblack@eecs.umich.edu            const bool signal1 = nan1 && ((cDest.bits & qnan) != qnan);
9397389Sgblack@eecs.umich.edu            const bool nan2 = std::isnan(cOp1.fp);
9407389Sgblack@eecs.umich.edu            const bool signal2 = nan2 && ((cOp1.bits & qnan) != qnan);
9417389Sgblack@eecs.umich.edu            if (signal1 || signal2)
9427389Sgblack@eecs.umich.edu                fpscr.ioc = 1;
9437377Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
9447377Sgblack@eecs.umich.edu        }
9457377Sgblack@eecs.umich.edu        Fpscr = fpscr;
9467377Sgblack@eecs.umich.edu    '''
9477396Sgblack@eecs.umich.edu    vcmpDIop = InstObjParams("vcmpd", "VcmpD", "FpRegRegOp",
9487377Sgblack@eecs.umich.edu                                     { "code": vcmpDCode,
9497377Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
9507396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcmpDIop);
9517396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcmpDIop);
9527377Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcmpDIop);
9537377Sgblack@eecs.umich.edu
9547377Sgblack@eecs.umich.edu    vcmpZeroSCode = '''
9557389Sgblack@eecs.umich.edu        vfpFlushToZero(Fpscr, FpDest);
9567377Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr;
9577389Sgblack@eecs.umich.edu        // This only handles imm == 0 for now.
9587389Sgblack@eecs.umich.edu        assert(imm == 0);
9597377Sgblack@eecs.umich.edu        if (FpDest == imm) {
9607377Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
9617377Sgblack@eecs.umich.edu        } else if (FpDest < imm) {
9627377Sgblack@eecs.umich.edu            fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
9637377Sgblack@eecs.umich.edu        } else if (FpDest > imm) {
9647377Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
9657377Sgblack@eecs.umich.edu        } else {
9667389Sgblack@eecs.umich.edu            const uint32_t qnan = 0x7fc00000;
9677389Sgblack@eecs.umich.edu            const bool nan = std::isnan(FpDest);
9687396Sgblack@eecs.umich.edu            const bool signal = nan && ((fpToBits(FpDest) & qnan) != qnan);
9697389Sgblack@eecs.umich.edu            if (signal)
9707389Sgblack@eecs.umich.edu                fpscr.ioc = 1;
9717377Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
9727377Sgblack@eecs.umich.edu        }
9737377Sgblack@eecs.umich.edu        Fpscr = fpscr;
9747377Sgblack@eecs.umich.edu    '''
9757396Sgblack@eecs.umich.edu    vcmpZeroSIop = InstObjParams("vcmpZeros", "VcmpZeroS", "FpRegImmOp",
9767377Sgblack@eecs.umich.edu                                     { "code": vcmpZeroSCode,
9777377Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
9787396Sgblack@eecs.umich.edu    header_output += FpRegImmOpDeclare.subst(vcmpZeroSIop);
9797396Sgblack@eecs.umich.edu    decoder_output += FpRegImmOpConstructor.subst(vcmpZeroSIop);
9807377Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcmpZeroSIop);
9817377Sgblack@eecs.umich.edu
9827377Sgblack@eecs.umich.edu    vcmpZeroDCode = '''
9837377Sgblack@eecs.umich.edu        IntDoubleUnion cDest;
9847389Sgblack@eecs.umich.edu        // This only handles imm == 0 for now.
9857389Sgblack@eecs.umich.edu        assert(imm == 0);
9867377Sgblack@eecs.umich.edu        cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
9877382Sgblack@eecs.umich.edu        vfpFlushToZero(Fpscr, cDest.fp);
9887377Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr;
9897377Sgblack@eecs.umich.edu        if (cDest.fp == imm) {
9907377Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
9917377Sgblack@eecs.umich.edu        } else if (cDest.fp < imm) {
9927377Sgblack@eecs.umich.edu            fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
9937377Sgblack@eecs.umich.edu        } else if (cDest.fp > imm) {
9947377Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
9957377Sgblack@eecs.umich.edu        } else {
9967389Sgblack@eecs.umich.edu            const uint64_t qnan = ULL(0x7ff8000000000000);
9977389Sgblack@eecs.umich.edu            const bool nan = std::isnan(cDest.fp);
9987389Sgblack@eecs.umich.edu            const bool signal = nan && ((cDest.bits & qnan) != qnan);
9997389Sgblack@eecs.umich.edu            if (signal)
10007389Sgblack@eecs.umich.edu                fpscr.ioc = 1;
10017377Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
10027377Sgblack@eecs.umich.edu        }
10037377Sgblack@eecs.umich.edu        Fpscr = fpscr;
10047377Sgblack@eecs.umich.edu    '''
10057396Sgblack@eecs.umich.edu    vcmpZeroDIop = InstObjParams("vcmpZerod", "VcmpZeroD", "FpRegImmOp",
10067377Sgblack@eecs.umich.edu                                     { "code": vcmpZeroDCode,
10077377Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
10087396Sgblack@eecs.umich.edu    header_output += FpRegImmOpDeclare.subst(vcmpZeroDIop);
10097396Sgblack@eecs.umich.edu    decoder_output += FpRegImmOpConstructor.subst(vcmpZeroDIop);
10107377Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcmpZeroDIop);
10117389Sgblack@eecs.umich.edu
10127389Sgblack@eecs.umich.edu    vcmpeSCode = '''
10137389Sgblack@eecs.umich.edu        vfpFlushToZero(Fpscr, FpDest, FpOp1);
10147389Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr;
10157389Sgblack@eecs.umich.edu        if (FpDest == FpOp1) {
10167389Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
10177389Sgblack@eecs.umich.edu        } else if (FpDest < FpOp1) {
10187389Sgblack@eecs.umich.edu            fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
10197389Sgblack@eecs.umich.edu        } else if (FpDest > FpOp1) {
10207389Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
10217389Sgblack@eecs.umich.edu        } else {
10227389Sgblack@eecs.umich.edu            fpscr.ioc = 1;
10237389Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
10247389Sgblack@eecs.umich.edu        }
10257389Sgblack@eecs.umich.edu        Fpscr = fpscr;
10267389Sgblack@eecs.umich.edu    '''
10277396Sgblack@eecs.umich.edu    vcmpeSIop = InstObjParams("vcmpes", "VcmpeS", "FpRegRegOp",
10287389Sgblack@eecs.umich.edu                                     { "code": vcmpeSCode,
10297389Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
10307396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcmpeSIop);
10317396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcmpeSIop);
10327389Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcmpeSIop);
10337389Sgblack@eecs.umich.edu
10347389Sgblack@eecs.umich.edu    vcmpeDCode = '''
10357389Sgblack@eecs.umich.edu        IntDoubleUnion cOp1, cDest;
10367389Sgblack@eecs.umich.edu        cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
10377389Sgblack@eecs.umich.edu        cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
10387389Sgblack@eecs.umich.edu        vfpFlushToZero(Fpscr, cDest.fp, cOp1.fp);
10397389Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr;
10407389Sgblack@eecs.umich.edu        if (cDest.fp == cOp1.fp) {
10417389Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
10427389Sgblack@eecs.umich.edu        } else if (cDest.fp < cOp1.fp) {
10437389Sgblack@eecs.umich.edu            fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
10447389Sgblack@eecs.umich.edu        } else if (cDest.fp > cOp1.fp) {
10457389Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
10467389Sgblack@eecs.umich.edu        } else {
10477389Sgblack@eecs.umich.edu            fpscr.ioc = 1;
10487389Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
10497389Sgblack@eecs.umich.edu        }
10507389Sgblack@eecs.umich.edu        Fpscr = fpscr;
10517389Sgblack@eecs.umich.edu    '''
10527396Sgblack@eecs.umich.edu    vcmpeDIop = InstObjParams("vcmped", "VcmpeD", "FpRegRegOp",
10537389Sgblack@eecs.umich.edu                                     { "code": vcmpeDCode,
10547389Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
10557396Sgblack@eecs.umich.edu    header_output += FpRegRegOpDeclare.subst(vcmpeDIop);
10567396Sgblack@eecs.umich.edu    decoder_output += FpRegRegOpConstructor.subst(vcmpeDIop);
10577389Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcmpeDIop);
10587389Sgblack@eecs.umich.edu
10597389Sgblack@eecs.umich.edu    vcmpeZeroSCode = '''
10607389Sgblack@eecs.umich.edu        vfpFlushToZero(Fpscr, FpDest);
10617389Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr;
10627389Sgblack@eecs.umich.edu        if (FpDest == imm) {
10637389Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
10647389Sgblack@eecs.umich.edu        } else if (FpDest < imm) {
10657389Sgblack@eecs.umich.edu            fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
10667389Sgblack@eecs.umich.edu        } else if (FpDest > imm) {
10677389Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
10687389Sgblack@eecs.umich.edu        } else {
10697389Sgblack@eecs.umich.edu            fpscr.ioc = 1;
10707389Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
10717389Sgblack@eecs.umich.edu        }
10727389Sgblack@eecs.umich.edu        Fpscr = fpscr;
10737389Sgblack@eecs.umich.edu    '''
10747396Sgblack@eecs.umich.edu    vcmpeZeroSIop = InstObjParams("vcmpeZeros", "VcmpeZeroS", "FpRegImmOp",
10757389Sgblack@eecs.umich.edu                                     { "code": vcmpeZeroSCode,
10767389Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
10777396Sgblack@eecs.umich.edu    header_output += FpRegImmOpDeclare.subst(vcmpeZeroSIop);
10787396Sgblack@eecs.umich.edu    decoder_output += FpRegImmOpConstructor.subst(vcmpeZeroSIop);
10797389Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcmpeZeroSIop);
10807389Sgblack@eecs.umich.edu
10817389Sgblack@eecs.umich.edu    vcmpeZeroDCode = '''
10827389Sgblack@eecs.umich.edu        IntDoubleUnion cDest;
10837389Sgblack@eecs.umich.edu        cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32));
10847389Sgblack@eecs.umich.edu        vfpFlushToZero(Fpscr, cDest.fp);
10857389Sgblack@eecs.umich.edu        FPSCR fpscr = Fpscr;
10867389Sgblack@eecs.umich.edu        if (cDest.fp == imm) {
10877389Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0;
10887389Sgblack@eecs.umich.edu        } else if (cDest.fp < imm) {
10897389Sgblack@eecs.umich.edu            fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0;
10907389Sgblack@eecs.umich.edu        } else if (cDest.fp > imm) {
10917389Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0;
10927389Sgblack@eecs.umich.edu        } else {
10937389Sgblack@eecs.umich.edu            fpscr.ioc = 1;
10947389Sgblack@eecs.umich.edu            fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1;
10957389Sgblack@eecs.umich.edu        }
10967389Sgblack@eecs.umich.edu        Fpscr = fpscr;
10977389Sgblack@eecs.umich.edu    '''
10987396Sgblack@eecs.umich.edu    vcmpeZeroDIop = InstObjParams("vcmpeZerod", "VcmpeZeroD", "FpRegImmOp",
10997389Sgblack@eecs.umich.edu                                     { "code": vcmpeZeroDCode,
11007389Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
11017396Sgblack@eecs.umich.edu    header_output += FpRegImmOpDeclare.subst(vcmpeZeroDIop);
11027396Sgblack@eecs.umich.edu    decoder_output += FpRegImmOpConstructor.subst(vcmpeZeroDIop);
11037389Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcmpeZeroDIop);
11047322Sgblack@eecs.umich.edu}};
11057379Sgblack@eecs.umich.edu
11067379Sgblack@eecs.umich.edulet {{
11077379Sgblack@eecs.umich.edu
11087379Sgblack@eecs.umich.edu    header_output = ""
11097379Sgblack@eecs.umich.edu    decoder_output = ""
11107379Sgblack@eecs.umich.edu    exec_output = ""
11117379Sgblack@eecs.umich.edu
11127379Sgblack@eecs.umich.edu    vcvtFpSFixedSCode = '''
11137382Sgblack@eecs.umich.edu        vfpFlushToZero(Fpscr, FpOp1);
11147379Sgblack@eecs.umich.edu        VfpSavedState state = prepVfpFpscr(Fpscr);
11157381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
11167379Sgblack@eecs.umich.edu        FpDest.sw = vfpFpSToFixed(FpOp1, true, false, imm);
11177381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest.sw));
11187379Sgblack@eecs.umich.edu        Fpscr = setVfpFpscr(Fpscr, state);
11197379Sgblack@eecs.umich.edu    '''
11207396Sgblack@eecs.umich.edu    vcvtFpSFixedSIop = InstObjParams("vcvt", "VcvtFpSFixedS", "FpRegRegImmOp",
11217379Sgblack@eecs.umich.edu                                     { "code": vcvtFpSFixedSCode,
11227379Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
11237396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vcvtFpSFixedSIop);
11247396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpSFixedSIop);
11257379Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpSFixedSIop);
11267379Sgblack@eecs.umich.edu
11277379Sgblack@eecs.umich.edu    vcvtFpSFixedDCode = '''
11287379Sgblack@eecs.umich.edu        IntDoubleUnion cOp1;
11297379Sgblack@eecs.umich.edu        cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
11307382Sgblack@eecs.umich.edu        vfpFlushToZero(Fpscr, cOp1.fp);
11317379Sgblack@eecs.umich.edu        VfpSavedState state = prepVfpFpscr(Fpscr);
11327381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
11337379Sgblack@eecs.umich.edu        uint64_t mid = vfpFpDToFixed(cOp1.fp, true, false, imm);
11347381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (mid));
11357379Sgblack@eecs.umich.edu        Fpscr = setVfpFpscr(Fpscr, state);
11367379Sgblack@eecs.umich.edu        FpDestP0.uw = mid;
11377379Sgblack@eecs.umich.edu        FpDestP1.uw = mid >> 32;
11387379Sgblack@eecs.umich.edu    '''
11397396Sgblack@eecs.umich.edu    vcvtFpSFixedDIop = InstObjParams("vcvt", "VcvtFpSFixedD", "FpRegRegImmOp",
11407379Sgblack@eecs.umich.edu                                     { "code": vcvtFpSFixedDCode,
11417379Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
11427396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vcvtFpSFixedDIop);
11437396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpSFixedDIop);
11447379Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpSFixedDIop);
11457379Sgblack@eecs.umich.edu
11467379Sgblack@eecs.umich.edu    vcvtFpUFixedSCode = '''
11477382Sgblack@eecs.umich.edu        vfpFlushToZero(Fpscr, FpOp1);
11487379Sgblack@eecs.umich.edu        VfpSavedState state = prepVfpFpscr(Fpscr);
11497381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
11507379Sgblack@eecs.umich.edu        FpDest.uw = vfpFpSToFixed(FpOp1, false, false, imm);
11517381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest.uw));
11527379Sgblack@eecs.umich.edu        Fpscr = setVfpFpscr(Fpscr, state);
11537379Sgblack@eecs.umich.edu    '''
11547396Sgblack@eecs.umich.edu    vcvtFpUFixedSIop = InstObjParams("vcvt", "VcvtFpUFixedS", "FpRegRegImmOp",
11557379Sgblack@eecs.umich.edu                                     { "code": vcvtFpUFixedSCode,
11567379Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
11577396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vcvtFpUFixedSIop);
11587396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpUFixedSIop);
11597379Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpUFixedSIop);
11607379Sgblack@eecs.umich.edu
11617379Sgblack@eecs.umich.edu    vcvtFpUFixedDCode = '''
11627379Sgblack@eecs.umich.edu        IntDoubleUnion cOp1;
11637379Sgblack@eecs.umich.edu        cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
11647382Sgblack@eecs.umich.edu        vfpFlushToZero(Fpscr, cOp1.fp);
11657379Sgblack@eecs.umich.edu        VfpSavedState state = prepVfpFpscr(Fpscr);
11667381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
11677379Sgblack@eecs.umich.edu        uint64_t mid = vfpFpDToFixed(cOp1.fp, false, false, imm);
11687381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (mid));
11697379Sgblack@eecs.umich.edu        Fpscr = setVfpFpscr(Fpscr, state);
11707379Sgblack@eecs.umich.edu        FpDestP0.uw = mid;
11717379Sgblack@eecs.umich.edu        FpDestP1.uw = mid >> 32;
11727379Sgblack@eecs.umich.edu    '''
11737396Sgblack@eecs.umich.edu    vcvtFpUFixedDIop = InstObjParams("vcvt", "VcvtFpUFixedD", "FpRegRegImmOp",
11747379Sgblack@eecs.umich.edu                                     { "code": vcvtFpUFixedDCode,
11757379Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
11767396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vcvtFpUFixedDIop);
11777396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpUFixedDIop);
11787379Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpUFixedDIop);
11797379Sgblack@eecs.umich.edu
11807379Sgblack@eecs.umich.edu    vcvtSFixedFpSCode = '''
11817379Sgblack@eecs.umich.edu        VfpSavedState state = prepVfpFpscr(Fpscr);
11827381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1.sw) : "m" (FpOp1.sw));
11837386Sgblack@eecs.umich.edu        FpDest = vfpSFixedToFpS(Fpscr, FpOp1.sw, false, imm);
11847381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest));
11857379Sgblack@eecs.umich.edu        Fpscr = setVfpFpscr(Fpscr, state);
11867379Sgblack@eecs.umich.edu    '''
11877396Sgblack@eecs.umich.edu    vcvtSFixedFpSIop = InstObjParams("vcvt", "VcvtSFixedFpS", "FpRegRegImmOp",
11887379Sgblack@eecs.umich.edu                                     { "code": vcvtSFixedFpSCode,
11897379Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
11907396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vcvtSFixedFpSIop);
11917396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vcvtSFixedFpSIop);
11927379Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtSFixedFpSIop);
11937379Sgblack@eecs.umich.edu
11947379Sgblack@eecs.umich.edu    vcvtSFixedFpDCode = '''
11957379Sgblack@eecs.umich.edu        IntDoubleUnion cDest;
11967379Sgblack@eecs.umich.edu        uint64_t mid = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
11977379Sgblack@eecs.umich.edu        VfpSavedState state = prepVfpFpscr(Fpscr);
11987381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (mid) : "m" (mid));
11997386Sgblack@eecs.umich.edu        cDest.fp = vfpSFixedToFpD(Fpscr, mid, false, imm);
12007381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (cDest.fp));
12017379Sgblack@eecs.umich.edu        Fpscr = setVfpFpscr(Fpscr, state);
12027379Sgblack@eecs.umich.edu        FpDestP0.uw = cDest.bits;
12037379Sgblack@eecs.umich.edu        FpDestP1.uw = cDest.bits >> 32;
12047379Sgblack@eecs.umich.edu    '''
12057396Sgblack@eecs.umich.edu    vcvtSFixedFpDIop = InstObjParams("vcvt", "VcvtSFixedFpD", "FpRegRegImmOp",
12067379Sgblack@eecs.umich.edu                                     { "code": vcvtSFixedFpDCode,
12077379Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
12087396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vcvtSFixedFpDIop);
12097396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vcvtSFixedFpDIop);
12107379Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtSFixedFpDIop);
12117379Sgblack@eecs.umich.edu
12127379Sgblack@eecs.umich.edu    vcvtUFixedFpSCode = '''
12137379Sgblack@eecs.umich.edu        VfpSavedState state = prepVfpFpscr(Fpscr);
12147381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1.uw) : "m" (FpOp1.uw));
12157386Sgblack@eecs.umich.edu        FpDest = vfpUFixedToFpS(Fpscr, FpOp1.uw, false, imm);
12167381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest));
12177379Sgblack@eecs.umich.edu        Fpscr = setVfpFpscr(Fpscr, state);
12187379Sgblack@eecs.umich.edu    '''
12197396Sgblack@eecs.umich.edu    vcvtUFixedFpSIop = InstObjParams("vcvt", "VcvtUFixedFpS", "FpRegRegImmOp",
12207379Sgblack@eecs.umich.edu                                     { "code": vcvtUFixedFpSCode,
12217379Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
12227396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vcvtUFixedFpSIop);
12237396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vcvtUFixedFpSIop);
12247379Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtUFixedFpSIop);
12257379Sgblack@eecs.umich.edu
12267379Sgblack@eecs.umich.edu    vcvtUFixedFpDCode = '''
12277379Sgblack@eecs.umich.edu        IntDoubleUnion cDest;
12287379Sgblack@eecs.umich.edu        uint64_t mid = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
12297379Sgblack@eecs.umich.edu        VfpSavedState state = prepVfpFpscr(Fpscr);
12307381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (mid) : "m" (mid));
12317386Sgblack@eecs.umich.edu        cDest.fp = vfpUFixedToFpD(Fpscr, mid, false, imm);
12327381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (cDest.fp));
12337379Sgblack@eecs.umich.edu        Fpscr = setVfpFpscr(Fpscr, state);
12347379Sgblack@eecs.umich.edu        FpDestP0.uw = cDest.bits;
12357379Sgblack@eecs.umich.edu        FpDestP1.uw = cDest.bits >> 32;
12367379Sgblack@eecs.umich.edu    '''
12377396Sgblack@eecs.umich.edu    vcvtUFixedFpDIop = InstObjParams("vcvt", "VcvtUFixedFpD", "FpRegRegImmOp",
12387379Sgblack@eecs.umich.edu                                     { "code": vcvtUFixedFpDCode,
12397379Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
12407396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vcvtUFixedFpDIop);
12417396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vcvtUFixedFpDIop);
12427379Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtUFixedFpDIop);
12437379Sgblack@eecs.umich.edu
12447379Sgblack@eecs.umich.edu    vcvtFpSHFixedSCode = '''
12457382Sgblack@eecs.umich.edu        vfpFlushToZero(Fpscr, FpOp1);
12467379Sgblack@eecs.umich.edu        VfpSavedState state = prepVfpFpscr(Fpscr);
12477381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
12487379Sgblack@eecs.umich.edu        FpDest.sh = vfpFpSToFixed(FpOp1, true, true, imm);
12497381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest.sh));
12507379Sgblack@eecs.umich.edu        Fpscr = setVfpFpscr(Fpscr, state);
12517379Sgblack@eecs.umich.edu    '''
12527379Sgblack@eecs.umich.edu    vcvtFpSHFixedSIop = InstObjParams("vcvt", "VcvtFpSHFixedS",
12537396Sgblack@eecs.umich.edu                                      "FpRegRegImmOp",
12547379Sgblack@eecs.umich.edu                                     { "code": vcvtFpSHFixedSCode,
12557379Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
12567396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vcvtFpSHFixedSIop);
12577396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpSHFixedSIop);
12587379Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpSHFixedSIop);
12597379Sgblack@eecs.umich.edu
12607379Sgblack@eecs.umich.edu    vcvtFpSHFixedDCode = '''
12617379Sgblack@eecs.umich.edu        IntDoubleUnion cOp1;
12627379Sgblack@eecs.umich.edu        cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
12637382Sgblack@eecs.umich.edu        vfpFlushToZero(Fpscr, cOp1.fp);
12647379Sgblack@eecs.umich.edu        VfpSavedState state = prepVfpFpscr(Fpscr);
12657381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
12667379Sgblack@eecs.umich.edu        uint64_t result = vfpFpDToFixed(cOp1.fp, true, true, imm);
12677381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (result));
12687379Sgblack@eecs.umich.edu        Fpscr = setVfpFpscr(Fpscr, state);
12697379Sgblack@eecs.umich.edu        FpDestP0.uw = result;
12707379Sgblack@eecs.umich.edu        FpDestP1.uw = result >> 32;
12717379Sgblack@eecs.umich.edu    '''
12727379Sgblack@eecs.umich.edu    vcvtFpSHFixedDIop = InstObjParams("vcvt", "VcvtFpSHFixedD",
12737396Sgblack@eecs.umich.edu                                      "FpRegRegImmOp",
12747379Sgblack@eecs.umich.edu                                     { "code": vcvtFpSHFixedDCode,
12757379Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
12767396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vcvtFpSHFixedDIop);
12777396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpSHFixedDIop);
12787379Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpSHFixedDIop);
12797379Sgblack@eecs.umich.edu
12807379Sgblack@eecs.umich.edu    vcvtFpUHFixedSCode = '''
12817382Sgblack@eecs.umich.edu        vfpFlushToZero(Fpscr, FpOp1);
12827379Sgblack@eecs.umich.edu        VfpSavedState state = prepVfpFpscr(Fpscr);
12837381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1));
12847379Sgblack@eecs.umich.edu        FpDest.uh = vfpFpSToFixed(FpOp1, false, true, imm);
12857381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest.uh));
12867379Sgblack@eecs.umich.edu        Fpscr = setVfpFpscr(Fpscr, state);
12877379Sgblack@eecs.umich.edu    '''
12887379Sgblack@eecs.umich.edu    vcvtFpUHFixedSIop = InstObjParams("vcvt", "VcvtFpUHFixedS",
12897396Sgblack@eecs.umich.edu                                      "FpRegRegImmOp",
12907379Sgblack@eecs.umich.edu                                     { "code": vcvtFpUHFixedSCode,
12917379Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
12927396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vcvtFpUHFixedSIop);
12937396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpUHFixedSIop);
12947379Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpUHFixedSIop);
12957379Sgblack@eecs.umich.edu
12967379Sgblack@eecs.umich.edu    vcvtFpUHFixedDCode = '''
12977379Sgblack@eecs.umich.edu        IntDoubleUnion cOp1;
12987379Sgblack@eecs.umich.edu        cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
12997382Sgblack@eecs.umich.edu        vfpFlushToZero(Fpscr, cOp1.fp);
13007379Sgblack@eecs.umich.edu        VfpSavedState state = prepVfpFpscr(Fpscr);
13017381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp));
13027379Sgblack@eecs.umich.edu        uint64_t mid = vfpFpDToFixed(cOp1.fp, false, true, imm);
13037381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (mid));
13047379Sgblack@eecs.umich.edu        Fpscr = setVfpFpscr(Fpscr, state);
13057379Sgblack@eecs.umich.edu        FpDestP0.uw = mid;
13067379Sgblack@eecs.umich.edu        FpDestP1.uw = mid >> 32;
13077379Sgblack@eecs.umich.edu    '''
13087379Sgblack@eecs.umich.edu    vcvtFpUHFixedDIop = InstObjParams("vcvt", "VcvtFpUHFixedD",
13097396Sgblack@eecs.umich.edu                                      "FpRegRegImmOp",
13107379Sgblack@eecs.umich.edu                                     { "code": vcvtFpUHFixedDCode,
13117379Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
13127396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vcvtFpUHFixedDIop);
13137396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpUHFixedDIop);
13147379Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtFpUHFixedDIop);
13157379Sgblack@eecs.umich.edu
13167379Sgblack@eecs.umich.edu    vcvtSHFixedFpSCode = '''
13177379Sgblack@eecs.umich.edu        VfpSavedState state = prepVfpFpscr(Fpscr);
13187381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1.sh) : "m" (FpOp1.sh));
13197386Sgblack@eecs.umich.edu        FpDest = vfpSFixedToFpS(Fpscr, FpOp1.sh, true, imm);
13207381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest));
13217379Sgblack@eecs.umich.edu        Fpscr = setVfpFpscr(Fpscr, state);
13227379Sgblack@eecs.umich.edu    '''
13237379Sgblack@eecs.umich.edu    vcvtSHFixedFpSIop = InstObjParams("vcvt", "VcvtSHFixedFpS",
13247396Sgblack@eecs.umich.edu                                      "FpRegRegImmOp",
13257379Sgblack@eecs.umich.edu                                     { "code": vcvtSHFixedFpSCode,
13267379Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
13277396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vcvtSHFixedFpSIop);
13287396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vcvtSHFixedFpSIop);
13297379Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtSHFixedFpSIop);
13307379Sgblack@eecs.umich.edu
13317379Sgblack@eecs.umich.edu    vcvtSHFixedFpDCode = '''
13327379Sgblack@eecs.umich.edu        IntDoubleUnion cDest;
13337379Sgblack@eecs.umich.edu        uint64_t mid = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
13347379Sgblack@eecs.umich.edu        VfpSavedState state = prepVfpFpscr(Fpscr);
13357381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (mid) : "m" (mid));
13367386Sgblack@eecs.umich.edu        cDest.fp = vfpSFixedToFpD(Fpscr, mid, true, imm);
13377381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (cDest.fp));
13387379Sgblack@eecs.umich.edu        Fpscr = setVfpFpscr(Fpscr, state);
13397379Sgblack@eecs.umich.edu        FpDestP0.uw = cDest.bits;
13407379Sgblack@eecs.umich.edu        FpDestP1.uw = cDest.bits >> 32;
13417379Sgblack@eecs.umich.edu    '''
13427379Sgblack@eecs.umich.edu    vcvtSHFixedFpDIop = InstObjParams("vcvt", "VcvtSHFixedFpD",
13437396Sgblack@eecs.umich.edu                                      "FpRegRegImmOp",
13447379Sgblack@eecs.umich.edu                                     { "code": vcvtSHFixedFpDCode,
13457379Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
13467396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vcvtSHFixedFpDIop);
13477396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vcvtSHFixedFpDIop);
13487379Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtSHFixedFpDIop);
13497379Sgblack@eecs.umich.edu
13507379Sgblack@eecs.umich.edu    vcvtUHFixedFpSCode = '''
13517379Sgblack@eecs.umich.edu        VfpSavedState state = prepVfpFpscr(Fpscr);
13527381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (FpOp1.uh) : "m" (FpOp1.uh));
13537386Sgblack@eecs.umich.edu        FpDest = vfpUFixedToFpS(Fpscr, FpOp1.uh, true, imm);
13547381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (FpDest));
13557379Sgblack@eecs.umich.edu        Fpscr = setVfpFpscr(Fpscr, state);
13567379Sgblack@eecs.umich.edu    '''
13577379Sgblack@eecs.umich.edu    vcvtUHFixedFpSIop = InstObjParams("vcvt", "VcvtUHFixedFpS",
13587396Sgblack@eecs.umich.edu                                      "FpRegRegImmOp",
13597379Sgblack@eecs.umich.edu                                     { "code": vcvtUHFixedFpSCode,
13607379Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
13617396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vcvtUHFixedFpSIop);
13627396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vcvtUHFixedFpSIop);
13637379Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtUHFixedFpSIop);
13647379Sgblack@eecs.umich.edu
13657379Sgblack@eecs.umich.edu    vcvtUHFixedFpDCode = '''
13667379Sgblack@eecs.umich.edu        IntDoubleUnion cDest;
13677379Sgblack@eecs.umich.edu        uint64_t mid = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32));
13687379Sgblack@eecs.umich.edu        VfpSavedState state = prepVfpFpscr(Fpscr);
13697381Sgblack@eecs.umich.edu        __asm__ __volatile__("" : "=m" (mid) : "m" (mid));
13707386Sgblack@eecs.umich.edu        cDest.fp = vfpUFixedToFpD(Fpscr, mid, true, imm);
13717381Sgblack@eecs.umich.edu        __asm__ __volatile__("" :: "m" (cDest.fp));
13727379Sgblack@eecs.umich.edu        Fpscr = setVfpFpscr(Fpscr, state);
13737379Sgblack@eecs.umich.edu        FpDestP0.uw = cDest.bits;
13747379Sgblack@eecs.umich.edu        FpDestP1.uw = cDest.bits >> 32;
13757379Sgblack@eecs.umich.edu    '''
13767379Sgblack@eecs.umich.edu    vcvtUHFixedFpDIop = InstObjParams("vcvt", "VcvtUHFixedFpD",
13777396Sgblack@eecs.umich.edu                                      "FpRegRegImmOp",
13787379Sgblack@eecs.umich.edu                                     { "code": vcvtUHFixedFpDCode,
13797379Sgblack@eecs.umich.edu                                       "predicate_test": predicateTest }, [])
13807396Sgblack@eecs.umich.edu    header_output += FpRegRegImmOpDeclare.subst(vcvtUHFixedFpDIop);
13817396Sgblack@eecs.umich.edu    decoder_output += FpRegRegImmOpConstructor.subst(vcvtUHFixedFpDIop);
13827379Sgblack@eecs.umich.edu    exec_output += PredOpExecute.subst(vcvtUHFixedFpDIop);
13837379Sgblack@eecs.umich.edu}};
1384