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