fp.isa revision 7396
17322Sgblack@eecs.umich.edu// -*- mode:c++ -*- 27322Sgblack@eecs.umich.edu 37322Sgblack@eecs.umich.edu// Copyright (c) 2010 ARM Limited 47322Sgblack@eecs.umich.edu// All rights reserved 57322Sgblack@eecs.umich.edu// 67322Sgblack@eecs.umich.edu// The license below extends only to copyright in the software and shall 77322Sgblack@eecs.umich.edu// not be construed as granting a license to any other intellectual 87322Sgblack@eecs.umich.edu// property including but not limited to intellectual property relating 97322Sgblack@eecs.umich.edu// to a hardware implementation of the functionality of the software 107322Sgblack@eecs.umich.edu// licensed hereunder. You may use the software subject to the license 117322Sgblack@eecs.umich.edu// terms below provided that you ensure that this notice is replicated 127322Sgblack@eecs.umich.edu// unmodified and in its entirety in all distributions of the software, 137322Sgblack@eecs.umich.edu// modified or unmodified, in source code or in binary form. 147322Sgblack@eecs.umich.edu// 157322Sgblack@eecs.umich.edu// Redistribution and use in source and binary forms, with or without 167322Sgblack@eecs.umich.edu// modification, are permitted provided that the following conditions are 177322Sgblack@eecs.umich.edu// met: redistributions of source code must retain the above copyright 187322Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer; 197322Sgblack@eecs.umich.edu// redistributions in binary form must reproduce the above copyright 207322Sgblack@eecs.umich.edu// notice, this list of conditions and the following disclaimer in the 217322Sgblack@eecs.umich.edu// documentation and/or other materials provided with the distribution; 227322Sgblack@eecs.umich.edu// neither the name of the copyright holders nor the names of its 237322Sgblack@eecs.umich.edu// contributors may be used to endorse or promote products derived from 247322Sgblack@eecs.umich.edu// this software without specific prior written permission. 257322Sgblack@eecs.umich.edu// 267322Sgblack@eecs.umich.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 277322Sgblack@eecs.umich.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 287322Sgblack@eecs.umich.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 297322Sgblack@eecs.umich.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 307322Sgblack@eecs.umich.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 317322Sgblack@eecs.umich.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 327322Sgblack@eecs.umich.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 337322Sgblack@eecs.umich.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 347322Sgblack@eecs.umich.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 357322Sgblack@eecs.umich.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 367322Sgblack@eecs.umich.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 377322Sgblack@eecs.umich.edu// 387322Sgblack@eecs.umich.edu// Authors: Gabe Black 397322Sgblack@eecs.umich.edu 407376Sgblack@eecs.umich.eduoutput header {{ 417376Sgblack@eecs.umich.edu 427376Sgblack@eecs.umich.edutemplate <class Micro> 437376Sgblack@eecs.umich.educlass VfpMacroRegRegOp : public VfpMacroOp 447376Sgblack@eecs.umich.edu{ 457376Sgblack@eecs.umich.edu public: 467376Sgblack@eecs.umich.edu VfpMacroRegRegOp(ExtMachInst _machInst, IntRegIndex _dest, 477376Sgblack@eecs.umich.edu IntRegIndex _op1, bool _wide) : 487376Sgblack@eecs.umich.edu VfpMacroOp("VfpMacroRegRegOp", _machInst, No_OpClass, _wide) 497376Sgblack@eecs.umich.edu { 507376Sgblack@eecs.umich.edu numMicroops = machInst.fpscrLen + 1; 517376Sgblack@eecs.umich.edu assert(numMicroops > 1); 527376Sgblack@eecs.umich.edu microOps = new StaticInstPtr[numMicroops]; 537376Sgblack@eecs.umich.edu for (unsigned i = 0; i < numMicroops; i++) { 547376Sgblack@eecs.umich.edu VfpMicroMode mode = VfpMicroop; 557376Sgblack@eecs.umich.edu if (i == 0) 567376Sgblack@eecs.umich.edu mode = VfpFirstMicroop; 577376Sgblack@eecs.umich.edu else if (i == numMicroops - 1) 587376Sgblack@eecs.umich.edu mode = VfpLastMicroop; 597376Sgblack@eecs.umich.edu microOps[i] = new Micro(_machInst, _dest, _op1, mode); 607376Sgblack@eecs.umich.edu nextIdxs(_dest, _op1); 617376Sgblack@eecs.umich.edu } 627376Sgblack@eecs.umich.edu } 637376Sgblack@eecs.umich.edu 647376Sgblack@eecs.umich.edu %(BasicExecPanic)s 657376Sgblack@eecs.umich.edu}; 667376Sgblack@eecs.umich.edu 677376Sgblack@eecs.umich.edutemplate <class VfpOp> 687376Sgblack@eecs.umich.edustatic StaticInstPtr 697376Sgblack@eecs.umich.edudecodeVfpRegRegOp(ExtMachInst machInst, 707376Sgblack@eecs.umich.edu IntRegIndex dest, IntRegIndex op1, bool wide) 717376Sgblack@eecs.umich.edu{ 727376Sgblack@eecs.umich.edu if (machInst.fpscrLen == 0 || VfpMacroOp::inScalarBank(dest)) { 737376Sgblack@eecs.umich.edu return new VfpOp(machInst, dest, op1); 747376Sgblack@eecs.umich.edu } else { 757376Sgblack@eecs.umich.edu return new VfpMacroRegRegOp<VfpOp>(machInst, dest, op1, wide); 767376Sgblack@eecs.umich.edu } 777376Sgblack@eecs.umich.edu} 787376Sgblack@eecs.umich.edu 797376Sgblack@eecs.umich.edutemplate <class Micro> 807376Sgblack@eecs.umich.educlass VfpMacroRegImmOp : public VfpMacroOp 817376Sgblack@eecs.umich.edu{ 827376Sgblack@eecs.umich.edu public: 837376Sgblack@eecs.umich.edu VfpMacroRegImmOp(ExtMachInst _machInst, IntRegIndex _dest, uint64_t _imm, 847376Sgblack@eecs.umich.edu bool _wide) : 857376Sgblack@eecs.umich.edu VfpMacroOp("VfpMacroRegImmOp", _machInst, No_OpClass, _wide) 867376Sgblack@eecs.umich.edu { 877376Sgblack@eecs.umich.edu numMicroops = machInst.fpscrLen + 1; 887376Sgblack@eecs.umich.edu microOps = new StaticInstPtr[numMicroops]; 897376Sgblack@eecs.umich.edu for (unsigned i = 0; i < numMicroops; i++) { 907376Sgblack@eecs.umich.edu VfpMicroMode mode = VfpMicroop; 917376Sgblack@eecs.umich.edu if (i == 0) 927376Sgblack@eecs.umich.edu mode = VfpFirstMicroop; 937376Sgblack@eecs.umich.edu else if (i == numMicroops - 1) 947376Sgblack@eecs.umich.edu mode = VfpLastMicroop; 957376Sgblack@eecs.umich.edu microOps[i] = new Micro(_machInst, _dest, _imm, mode); 967376Sgblack@eecs.umich.edu nextIdxs(_dest); 977376Sgblack@eecs.umich.edu } 987376Sgblack@eecs.umich.edu } 997376Sgblack@eecs.umich.edu 1007376Sgblack@eecs.umich.edu %(BasicExecPanic)s 1017376Sgblack@eecs.umich.edu}; 1027376Sgblack@eecs.umich.edu 1037376Sgblack@eecs.umich.edutemplate <class VfpOp> 1047376Sgblack@eecs.umich.edustatic StaticInstPtr 1057376Sgblack@eecs.umich.edudecodeVfpRegImmOp(ExtMachInst machInst, 1067376Sgblack@eecs.umich.edu IntRegIndex dest, uint64_t imm, bool wide) 1077376Sgblack@eecs.umich.edu{ 1087376Sgblack@eecs.umich.edu if (machInst.fpscrLen == 0 || VfpMacroOp::inScalarBank(dest)) { 1097376Sgblack@eecs.umich.edu return new VfpOp(machInst, dest, imm); 1107376Sgblack@eecs.umich.edu } else { 1117376Sgblack@eecs.umich.edu return new VfpMacroRegImmOp<VfpOp>(machInst, dest, imm, wide); 1127376Sgblack@eecs.umich.edu } 1137376Sgblack@eecs.umich.edu} 1147376Sgblack@eecs.umich.edu 1157376Sgblack@eecs.umich.edutemplate <class Micro> 1167376Sgblack@eecs.umich.educlass VfpMacroRegRegImmOp : public VfpMacroOp 1177376Sgblack@eecs.umich.edu{ 1187376Sgblack@eecs.umich.edu public: 1197376Sgblack@eecs.umich.edu VfpMacroRegRegImmOp(ExtMachInst _machInst, IntRegIndex _dest, 1207376Sgblack@eecs.umich.edu IntRegIndex _op1, uint64_t _imm, bool _wide) : 1217376Sgblack@eecs.umich.edu VfpMacroOp("VfpMacroRegRegImmOp", _machInst, No_OpClass, _wide) 1227376Sgblack@eecs.umich.edu { 1237376Sgblack@eecs.umich.edu numMicroops = machInst.fpscrLen + 1; 1247376Sgblack@eecs.umich.edu microOps = new StaticInstPtr[numMicroops]; 1257376Sgblack@eecs.umich.edu for (unsigned i = 0; i < numMicroops; i++) { 1267376Sgblack@eecs.umich.edu VfpMicroMode mode = VfpMicroop; 1277376Sgblack@eecs.umich.edu if (i == 0) 1287376Sgblack@eecs.umich.edu mode = VfpFirstMicroop; 1297376Sgblack@eecs.umich.edu else if (i == numMicroops - 1) 1307376Sgblack@eecs.umich.edu mode = VfpLastMicroop; 1317376Sgblack@eecs.umich.edu microOps[i] = new Micro(_machInst, _dest, _op1, _imm, mode); 1327376Sgblack@eecs.umich.edu nextIdxs(_dest, _op1); 1337376Sgblack@eecs.umich.edu } 1347376Sgblack@eecs.umich.edu } 1357376Sgblack@eecs.umich.edu 1367376Sgblack@eecs.umich.edu %(BasicExecPanic)s 1377376Sgblack@eecs.umich.edu}; 1387376Sgblack@eecs.umich.edu 1397376Sgblack@eecs.umich.edutemplate <class VfpOp> 1407376Sgblack@eecs.umich.edustatic StaticInstPtr 1417376Sgblack@eecs.umich.edudecodeVfpRegRegImmOp(ExtMachInst machInst, IntRegIndex dest, 1427376Sgblack@eecs.umich.edu IntRegIndex op1, uint64_t imm, bool wide) 1437376Sgblack@eecs.umich.edu{ 1447376Sgblack@eecs.umich.edu if (machInst.fpscrLen == 0 || VfpMacroOp::inScalarBank(dest)) { 1457376Sgblack@eecs.umich.edu return new VfpOp(machInst, dest, op1, imm); 1467376Sgblack@eecs.umich.edu } else { 1477376Sgblack@eecs.umich.edu return new VfpMacroRegRegImmOp<VfpOp>(machInst, dest, op1, imm, wide); 1487376Sgblack@eecs.umich.edu } 1497376Sgblack@eecs.umich.edu} 1507376Sgblack@eecs.umich.edu 1517376Sgblack@eecs.umich.edutemplate <class Micro> 1527376Sgblack@eecs.umich.educlass VfpMacroRegRegRegOp : public VfpMacroOp 1537376Sgblack@eecs.umich.edu{ 1547376Sgblack@eecs.umich.edu public: 1557376Sgblack@eecs.umich.edu VfpMacroRegRegRegOp(ExtMachInst _machInst, IntRegIndex _dest, 1567376Sgblack@eecs.umich.edu IntRegIndex _op1, IntRegIndex _op2, bool _wide) : 1577376Sgblack@eecs.umich.edu VfpMacroOp("VfpMacroRegRegRegOp", _machInst, No_OpClass, _wide) 1587376Sgblack@eecs.umich.edu { 1597376Sgblack@eecs.umich.edu numMicroops = machInst.fpscrLen + 1; 1607376Sgblack@eecs.umich.edu microOps = new StaticInstPtr[numMicroops]; 1617376Sgblack@eecs.umich.edu for (unsigned i = 0; i < numMicroops; i++) { 1627376Sgblack@eecs.umich.edu VfpMicroMode mode = VfpMicroop; 1637376Sgblack@eecs.umich.edu if (i == 0) 1647376Sgblack@eecs.umich.edu mode = VfpFirstMicroop; 1657376Sgblack@eecs.umich.edu else if (i == numMicroops - 1) 1667376Sgblack@eecs.umich.edu mode = VfpLastMicroop; 1677376Sgblack@eecs.umich.edu microOps[i] = new Micro(_machInst, _dest, _op1, _op2, mode); 1687376Sgblack@eecs.umich.edu nextIdxs(_dest, _op1, _op2); 1697376Sgblack@eecs.umich.edu } 1707376Sgblack@eecs.umich.edu } 1717376Sgblack@eecs.umich.edu 1727376Sgblack@eecs.umich.edu %(BasicExecPanic)s 1737376Sgblack@eecs.umich.edu}; 1747376Sgblack@eecs.umich.edu 1757376Sgblack@eecs.umich.edutemplate <class VfpOp> 1767376Sgblack@eecs.umich.edustatic StaticInstPtr 1777376Sgblack@eecs.umich.edudecodeVfpRegRegRegOp(ExtMachInst machInst, IntRegIndex dest, 1787376Sgblack@eecs.umich.edu IntRegIndex op1, IntRegIndex op2, bool wide) 1797376Sgblack@eecs.umich.edu{ 1807376Sgblack@eecs.umich.edu if (machInst.fpscrLen == 0 || VfpMacroOp::inScalarBank(dest)) { 1817376Sgblack@eecs.umich.edu return new VfpOp(machInst, dest, op1, op2); 1827376Sgblack@eecs.umich.edu } else { 1837376Sgblack@eecs.umich.edu return new VfpMacroRegRegRegOp<VfpOp>(machInst, dest, op1, op2, wide); 1847376Sgblack@eecs.umich.edu } 1857376Sgblack@eecs.umich.edu} 1867376Sgblack@eecs.umich.edu}}; 1877376Sgblack@eecs.umich.edu 1887322Sgblack@eecs.umich.edulet {{ 1897322Sgblack@eecs.umich.edu 1907322Sgblack@eecs.umich.edu header_output = "" 1917322Sgblack@eecs.umich.edu decoder_output = "" 1927322Sgblack@eecs.umich.edu exec_output = "" 1937322Sgblack@eecs.umich.edu 1947396Sgblack@eecs.umich.edu vmsrIop = InstObjParams("vmsr", "Vmsr", "FpRegRegOp", 1957322Sgblack@eecs.umich.edu { "code": "MiscDest = Op1;", 1967322Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 1977396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vmsrIop); 1987396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vmsrIop); 1997322Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmsrIop); 2007324Sgblack@eecs.umich.edu 2017396Sgblack@eecs.umich.edu vmrsIop = InstObjParams("vmrs", "Vmrs", "FpRegRegOp", 2027324Sgblack@eecs.umich.edu { "code": "Dest = MiscOp1;", 2037324Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 2047396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vmrsIop); 2057396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vmrsIop); 2067324Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmrsIop); 2077333Sgblack@eecs.umich.edu 2087392Sgblack@eecs.umich.edu vmrsApsrCode = "Dest = (MiscOp1 & imm) | (Dest & ~imm);" 2097396Sgblack@eecs.umich.edu vmrsApsrIop = InstObjParams("vmrs", "VmrsApsr", "FpRegRegImmOp", 2107392Sgblack@eecs.umich.edu { "code": vmrsApsrCode, 2117392Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 2127396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vmrsApsrIop); 2137396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vmrsApsrIop); 2147392Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmrsApsrIop); 2157392Sgblack@eecs.umich.edu 2167333Sgblack@eecs.umich.edu vmovImmSCode = ''' 2177333Sgblack@eecs.umich.edu FpDest.uw = bits(imm, 31, 0); 2187333Sgblack@eecs.umich.edu ''' 2197396Sgblack@eecs.umich.edu vmovImmSIop = InstObjParams("vmov", "VmovImmS", "FpRegImmOp", 2207333Sgblack@eecs.umich.edu { "code": vmovImmSCode, 2217333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 2227396Sgblack@eecs.umich.edu header_output += FpRegImmOpDeclare.subst(vmovImmSIop); 2237396Sgblack@eecs.umich.edu decoder_output += FpRegImmOpConstructor.subst(vmovImmSIop); 2247333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovImmSIop); 2257333Sgblack@eecs.umich.edu 2267333Sgblack@eecs.umich.edu vmovImmDCode = ''' 2277333Sgblack@eecs.umich.edu FpDestP0.uw = bits(imm, 31, 0); 2287333Sgblack@eecs.umich.edu FpDestP1.uw = bits(imm, 63, 32); 2297333Sgblack@eecs.umich.edu ''' 2307396Sgblack@eecs.umich.edu vmovImmDIop = InstObjParams("vmov", "VmovImmD", "FpRegImmOp", 2317333Sgblack@eecs.umich.edu { "code": vmovImmDCode, 2327333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 2337396Sgblack@eecs.umich.edu header_output += FpRegImmOpDeclare.subst(vmovImmDIop); 2347396Sgblack@eecs.umich.edu decoder_output += FpRegImmOpConstructor.subst(vmovImmDIop); 2357333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovImmDIop); 2367333Sgblack@eecs.umich.edu 2377333Sgblack@eecs.umich.edu vmovImmQCode = ''' 2387333Sgblack@eecs.umich.edu FpDestP0.uw = bits(imm, 31, 0); 2397333Sgblack@eecs.umich.edu FpDestP1.uw = bits(imm, 63, 32); 2407333Sgblack@eecs.umich.edu FpDestP2.uw = bits(imm, 31, 0); 2417333Sgblack@eecs.umich.edu FpDestP3.uw = bits(imm, 63, 32); 2427333Sgblack@eecs.umich.edu ''' 2437396Sgblack@eecs.umich.edu vmovImmQIop = InstObjParams("vmov", "VmovImmQ", "FpRegImmOp", 2447333Sgblack@eecs.umich.edu { "code": vmovImmQCode, 2457333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 2467396Sgblack@eecs.umich.edu header_output += FpRegImmOpDeclare.subst(vmovImmQIop); 2477396Sgblack@eecs.umich.edu decoder_output += FpRegImmOpConstructor.subst(vmovImmQIop); 2487333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovImmQIop); 2497333Sgblack@eecs.umich.edu 2507333Sgblack@eecs.umich.edu vmovRegSCode = ''' 2517333Sgblack@eecs.umich.edu FpDest.uw = FpOp1.uw; 2527333Sgblack@eecs.umich.edu ''' 2537396Sgblack@eecs.umich.edu vmovRegSIop = InstObjParams("vmov", "VmovRegS", "FpRegRegOp", 2547333Sgblack@eecs.umich.edu { "code": vmovRegSCode, 2557333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 2567396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vmovRegSIop); 2577396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vmovRegSIop); 2587333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovRegSIop); 2597333Sgblack@eecs.umich.edu 2607333Sgblack@eecs.umich.edu vmovRegDCode = ''' 2617333Sgblack@eecs.umich.edu FpDestP0.uw = FpOp1P0.uw; 2627333Sgblack@eecs.umich.edu FpDestP1.uw = FpOp1P1.uw; 2637333Sgblack@eecs.umich.edu ''' 2647396Sgblack@eecs.umich.edu vmovRegDIop = InstObjParams("vmov", "VmovRegD", "FpRegRegOp", 2657333Sgblack@eecs.umich.edu { "code": vmovRegDCode, 2667333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 2677396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vmovRegDIop); 2687396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vmovRegDIop); 2697333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovRegDIop); 2707333Sgblack@eecs.umich.edu 2717333Sgblack@eecs.umich.edu vmovRegQCode = ''' 2727333Sgblack@eecs.umich.edu FpDestP0.uw = FpOp1P0.uw; 2737333Sgblack@eecs.umich.edu FpDestP1.uw = FpOp1P1.uw; 2747333Sgblack@eecs.umich.edu FpDestP2.uw = FpOp1P2.uw; 2757333Sgblack@eecs.umich.edu FpDestP3.uw = FpOp1P3.uw; 2767333Sgblack@eecs.umich.edu ''' 2777396Sgblack@eecs.umich.edu vmovRegQIop = InstObjParams("vmov", "VmovRegQ", "FpRegRegOp", 2787333Sgblack@eecs.umich.edu { "code": vmovRegQCode, 2797333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 2807396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vmovRegQIop); 2817396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vmovRegQIop); 2827333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovRegQIop); 2837333Sgblack@eecs.umich.edu 2847333Sgblack@eecs.umich.edu vmovCoreRegBCode = ''' 2857333Sgblack@eecs.umich.edu FpDest.uw = insertBits(FpDest.uw, imm * 8, imm * 8 + 7, Op1.ub); 2867333Sgblack@eecs.umich.edu ''' 2877396Sgblack@eecs.umich.edu vmovCoreRegBIop = InstObjParams("vmov", "VmovCoreRegB", "FpRegRegImmOp", 2887333Sgblack@eecs.umich.edu { "code": vmovCoreRegBCode, 2897333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 2907396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vmovCoreRegBIop); 2917396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vmovCoreRegBIop); 2927333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovCoreRegBIop); 2937333Sgblack@eecs.umich.edu 2947333Sgblack@eecs.umich.edu vmovCoreRegHCode = ''' 2957333Sgblack@eecs.umich.edu FpDest.uw = insertBits(FpDest.uw, imm * 16, imm * 16 + 15, Op1.uh); 2967333Sgblack@eecs.umich.edu ''' 2977396Sgblack@eecs.umich.edu vmovCoreRegHIop = InstObjParams("vmov", "VmovCoreRegH", "FpRegRegImmOp", 2987333Sgblack@eecs.umich.edu { "code": vmovCoreRegHCode, 2997333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 3007396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vmovCoreRegHIop); 3017396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vmovCoreRegHIop); 3027333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovCoreRegHIop); 3037333Sgblack@eecs.umich.edu 3047333Sgblack@eecs.umich.edu vmovCoreRegWCode = ''' 3057333Sgblack@eecs.umich.edu FpDest.uw = Op1.uw; 3067333Sgblack@eecs.umich.edu ''' 3077396Sgblack@eecs.umich.edu vmovCoreRegWIop = InstObjParams("vmov", "VmovCoreRegW", "FpRegRegOp", 3087333Sgblack@eecs.umich.edu { "code": vmovCoreRegWCode, 3097333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 3107396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vmovCoreRegWIop); 3117396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vmovCoreRegWIop); 3127333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovCoreRegWIop); 3137333Sgblack@eecs.umich.edu 3147333Sgblack@eecs.umich.edu vmovRegCoreUBCode = ''' 3157333Sgblack@eecs.umich.edu Dest = bits(FpOp1.uw, imm * 8, imm * 8 + 7); 3167333Sgblack@eecs.umich.edu ''' 3177396Sgblack@eecs.umich.edu vmovRegCoreUBIop = InstObjParams("vmov", "VmovRegCoreUB", "FpRegRegImmOp", 3187333Sgblack@eecs.umich.edu { "code": vmovRegCoreUBCode, 3197333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 3207396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vmovRegCoreUBIop); 3217396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vmovRegCoreUBIop); 3227333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovRegCoreUBIop); 3237333Sgblack@eecs.umich.edu 3247333Sgblack@eecs.umich.edu vmovRegCoreUHCode = ''' 3257333Sgblack@eecs.umich.edu Dest = bits(FpOp1.uw, imm * 16, imm * 16 + 15); 3267333Sgblack@eecs.umich.edu ''' 3277396Sgblack@eecs.umich.edu vmovRegCoreUHIop = InstObjParams("vmov", "VmovRegCoreUH", "FpRegRegImmOp", 3287333Sgblack@eecs.umich.edu { "code": vmovRegCoreUHCode, 3297333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 3307396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vmovRegCoreUHIop); 3317396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vmovRegCoreUHIop); 3327333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovRegCoreUHIop); 3337333Sgblack@eecs.umich.edu 3347333Sgblack@eecs.umich.edu vmovRegCoreSBCode = ''' 3357333Sgblack@eecs.umich.edu Dest = sext<8>(bits(FpOp1.uw, imm * 8, imm * 8 + 7)); 3367333Sgblack@eecs.umich.edu ''' 3377396Sgblack@eecs.umich.edu vmovRegCoreSBIop = InstObjParams("vmov", "VmovRegCoreSB", "FpRegRegImmOp", 3387333Sgblack@eecs.umich.edu { "code": vmovRegCoreSBCode, 3397333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 3407396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vmovRegCoreSBIop); 3417396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vmovRegCoreSBIop); 3427333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovRegCoreSBIop); 3437333Sgblack@eecs.umich.edu 3447333Sgblack@eecs.umich.edu vmovRegCoreSHCode = ''' 3457333Sgblack@eecs.umich.edu Dest = sext<16>(bits(FpOp1.uw, imm * 16, imm * 16 + 15)); 3467333Sgblack@eecs.umich.edu ''' 3477396Sgblack@eecs.umich.edu vmovRegCoreSHIop = InstObjParams("vmov", "VmovRegCoreSH", "FpRegRegImmOp", 3487333Sgblack@eecs.umich.edu { "code": vmovRegCoreSHCode, 3497333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 3507396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vmovRegCoreSHIop); 3517396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vmovRegCoreSHIop); 3527333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovRegCoreSHIop); 3537333Sgblack@eecs.umich.edu 3547333Sgblack@eecs.umich.edu vmovRegCoreWCode = ''' 3557333Sgblack@eecs.umich.edu Dest = FpOp1.uw; 3567333Sgblack@eecs.umich.edu ''' 3577396Sgblack@eecs.umich.edu vmovRegCoreWIop = InstObjParams("vmov", "VmovRegCoreW", "FpRegRegOp", 3587333Sgblack@eecs.umich.edu { "code": vmovRegCoreWCode, 3597333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 3607396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vmovRegCoreWIop); 3617396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vmovRegCoreWIop); 3627333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovRegCoreWIop); 3637333Sgblack@eecs.umich.edu 3647333Sgblack@eecs.umich.edu vmov2Reg2CoreCode = ''' 3657333Sgblack@eecs.umich.edu FpDestP0.uw = Op1.uw; 3667333Sgblack@eecs.umich.edu FpDestP1.uw = Op2.uw; 3677333Sgblack@eecs.umich.edu ''' 3687396Sgblack@eecs.umich.edu vmov2Reg2CoreIop = InstObjParams("vmov", "Vmov2Reg2Core", "FpRegRegRegOp", 3697333Sgblack@eecs.umich.edu { "code": vmov2Reg2CoreCode, 3707333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 3717396Sgblack@eecs.umich.edu header_output += FpRegRegRegOpDeclare.subst(vmov2Reg2CoreIop); 3727396Sgblack@eecs.umich.edu decoder_output += FpRegRegRegOpConstructor.subst(vmov2Reg2CoreIop); 3737333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmov2Reg2CoreIop); 3747333Sgblack@eecs.umich.edu 3757333Sgblack@eecs.umich.edu vmov2Core2RegCode = ''' 3767333Sgblack@eecs.umich.edu Dest.uw = FpOp2P0.uw; 3777333Sgblack@eecs.umich.edu Op1.uw = FpOp2P1.uw; 3787333Sgblack@eecs.umich.edu ''' 3797396Sgblack@eecs.umich.edu vmov2Core2RegIop = InstObjParams("vmov", "Vmov2Core2Reg", "FpRegRegRegOp", 3807333Sgblack@eecs.umich.edu { "code": vmov2Core2RegCode, 3817333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 3827396Sgblack@eecs.umich.edu header_output += FpRegRegRegOpDeclare.subst(vmov2Core2RegIop); 3837396Sgblack@eecs.umich.edu decoder_output += FpRegRegRegOpConstructor.subst(vmov2Core2RegIop); 3847333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmov2Core2RegIop); 3857381Sgblack@eecs.umich.edu}}; 3867381Sgblack@eecs.umich.edu 3877381Sgblack@eecs.umich.edulet {{ 3887381Sgblack@eecs.umich.edu 3897381Sgblack@eecs.umich.edu header_output = "" 3907381Sgblack@eecs.umich.edu decoder_output = "" 3917381Sgblack@eecs.umich.edu exec_output = "" 3927364Sgblack@eecs.umich.edu 3937396Sgblack@eecs.umich.edu singleCode = ''' 3947396Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 3957396Sgblack@eecs.umich.edu FpDest = %(op)s; 3967396Sgblack@eecs.umich.edu Fpscr = fpscr; 3977364Sgblack@eecs.umich.edu ''' 3987396Sgblack@eecs.umich.edu singleBinOp = "binaryOp(fpscr, FpOp1, FpOp2," + \ 3997396Sgblack@eecs.umich.edu "%(func)s, fpscr.fz, fpscr.rMode)" 4007396Sgblack@eecs.umich.edu singleUnaryOp = "unaryOp(fpscr, FpOp1, %(func)s, fpscr.fz, fpscr.rMode)" 4017396Sgblack@eecs.umich.edu doubleCode = ''' 4027396Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 4037396Sgblack@eecs.umich.edu double dest = %(op)s; 4047396Sgblack@eecs.umich.edu Fpscr = fpscr; 4057396Sgblack@eecs.umich.edu FpDestP0.uw = dblLow(dest); 4067396Sgblack@eecs.umich.edu FpDestP1.uw = dblHi(dest); 4077396Sgblack@eecs.umich.edu ''' 4087396Sgblack@eecs.umich.edu doubleBinOp = ''' 4097396Sgblack@eecs.umich.edu binaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw), 4107396Sgblack@eecs.umich.edu dbl(FpOp2P0.uw, FpOp2P1.uw), 4117396Sgblack@eecs.umich.edu %(func)s, fpscr.fz, fpscr.rMode); 4127396Sgblack@eecs.umich.edu ''' 4137396Sgblack@eecs.umich.edu doubleUnaryOp = ''' 4147396Sgblack@eecs.umich.edu unaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw), %(func)s, 4157396Sgblack@eecs.umich.edu fpscr.fz, fpscr.rMode) 4167396Sgblack@eecs.umich.edu ''' 4177364Sgblack@eecs.umich.edu 4187396Sgblack@eecs.umich.edu def buildBinFpOp(name, Name, base, singleOp, doubleOp): 4197396Sgblack@eecs.umich.edu global header_output, decoder_output, exec_output 4207365Sgblack@eecs.umich.edu 4217396Sgblack@eecs.umich.edu code = singleCode % { "op": singleBinOp } 4227396Sgblack@eecs.umich.edu code = code % { "func": singleOp } 4237396Sgblack@eecs.umich.edu sIop = InstObjParams(name + "s", Name + "S", base, 4247396Sgblack@eecs.umich.edu { "code": code, "predicate_test": predicateTest }, []) 4257396Sgblack@eecs.umich.edu code = doubleCode % { "op": doubleBinOp } 4267396Sgblack@eecs.umich.edu code = code % { "func": doubleOp } 4277396Sgblack@eecs.umich.edu dIop = InstObjParams(name + "d", Name + "D", base, 4287396Sgblack@eecs.umich.edu { "code": code, "predicate_test": predicateTest }, []) 4297365Sgblack@eecs.umich.edu 4307396Sgblack@eecs.umich.edu declareTempl = eval(base + "Declare"); 4317396Sgblack@eecs.umich.edu constructorTempl = eval(base + "Constructor"); 4327366Sgblack@eecs.umich.edu 4337396Sgblack@eecs.umich.edu for iop in sIop, dIop: 4347396Sgblack@eecs.umich.edu header_output += declareTempl.subst(iop) 4357396Sgblack@eecs.umich.edu decoder_output += constructorTempl.subst(iop) 4367396Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(iop) 4377366Sgblack@eecs.umich.edu 4387396Sgblack@eecs.umich.edu buildBinFpOp("vadd", "Vadd", "FpRegRegRegOp", "fpAddS", "fpAddD") 4397396Sgblack@eecs.umich.edu buildBinFpOp("vsub", "Vsub", "FpRegRegRegOp", "fpSubS", "fpSubD") 4407396Sgblack@eecs.umich.edu buildBinFpOp("vdiv", "Vdiv", "FpRegRegRegOp", "fpDivS", "fpDivD") 4417396Sgblack@eecs.umich.edu buildBinFpOp("vmul", "Vmul", "FpRegRegRegOp", "fpMulS", "fpMulD") 4427367Sgblack@eecs.umich.edu 4437396Sgblack@eecs.umich.edu def buildUnaryFpOp(name, Name, base, singleOp, doubleOp = None): 4447396Sgblack@eecs.umich.edu if doubleOp is None: 4457396Sgblack@eecs.umich.edu doubleOp = singleOp 4467396Sgblack@eecs.umich.edu global header_output, decoder_output, exec_output 4477367Sgblack@eecs.umich.edu 4487396Sgblack@eecs.umich.edu code = singleCode % { "op": singleUnaryOp } 4497396Sgblack@eecs.umich.edu code = code % { "func": singleOp } 4507396Sgblack@eecs.umich.edu sIop = InstObjParams(name + "s", Name + "S", base, 4517396Sgblack@eecs.umich.edu { "code": code, "predicate_test": predicateTest }, []) 4527396Sgblack@eecs.umich.edu code = doubleCode % { "op": doubleUnaryOp } 4537396Sgblack@eecs.umich.edu code = code % { "func": doubleOp } 4547396Sgblack@eecs.umich.edu dIop = InstObjParams(name + "d", Name + "D", base, 4557396Sgblack@eecs.umich.edu { "code": code, "predicate_test": predicateTest }, []) 4567368Sgblack@eecs.umich.edu 4577396Sgblack@eecs.umich.edu declareTempl = eval(base + "Declare"); 4587396Sgblack@eecs.umich.edu constructorTempl = eval(base + "Constructor"); 4597368Sgblack@eecs.umich.edu 4607396Sgblack@eecs.umich.edu for iop in sIop, dIop: 4617396Sgblack@eecs.umich.edu header_output += declareTempl.subst(iop) 4627396Sgblack@eecs.umich.edu decoder_output += constructorTempl.subst(iop) 4637396Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(iop) 4647369Sgblack@eecs.umich.edu 4657396Sgblack@eecs.umich.edu buildUnaryFpOp("vsqrt", "Vsqrt", "FpRegRegOp", "sqrtf", "sqrt") 4667369Sgblack@eecs.umich.edu 4677396Sgblack@eecs.umich.edu def buildSimpleUnaryFpOp(name, Name, base, singleOp, doubleOp = None): 4687396Sgblack@eecs.umich.edu if doubleOp is None: 4697396Sgblack@eecs.umich.edu doubleOp = singleOp 4707396Sgblack@eecs.umich.edu global header_output, decoder_output, exec_output 4717369Sgblack@eecs.umich.edu 4727396Sgblack@eecs.umich.edu sIop = InstObjParams(name + "s", Name + "S", base, 4737396Sgblack@eecs.umich.edu { "code": singleCode % { "op": singleOp }, 4747396Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 4757396Sgblack@eecs.umich.edu dIop = InstObjParams(name + "d", Name + "D", base, 4767396Sgblack@eecs.umich.edu { "code": doubleCode % { "op": doubleOp }, 4777396Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 4787369Sgblack@eecs.umich.edu 4797396Sgblack@eecs.umich.edu declareTempl = eval(base + "Declare"); 4807396Sgblack@eecs.umich.edu constructorTempl = eval(base + "Constructor"); 4817396Sgblack@eecs.umich.edu 4827396Sgblack@eecs.umich.edu for iop in sIop, dIop: 4837396Sgblack@eecs.umich.edu header_output += declareTempl.subst(iop) 4847396Sgblack@eecs.umich.edu decoder_output += constructorTempl.subst(iop) 4857396Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(iop) 4867396Sgblack@eecs.umich.edu 4877396Sgblack@eecs.umich.edu buildSimpleUnaryFpOp("vneg", "Vneg", "FpRegRegOp", 4887396Sgblack@eecs.umich.edu "-FpOp1", "-dbl(FpOp1P0.uw, FpOp1P1.uw)") 4897396Sgblack@eecs.umich.edu buildSimpleUnaryFpOp("vabs", "Vabs", "FpRegRegOp", 4907396Sgblack@eecs.umich.edu "fabsf(FpOp1)", "fabs(dbl(FpOp1P0.uw, FpOp1P1.uw))") 4917381Sgblack@eecs.umich.edu}}; 4927381Sgblack@eecs.umich.edu 4937381Sgblack@eecs.umich.edulet {{ 4947381Sgblack@eecs.umich.edu 4957381Sgblack@eecs.umich.edu header_output = "" 4967381Sgblack@eecs.umich.edu decoder_output = "" 4977381Sgblack@eecs.umich.edu exec_output = "" 4987370Sgblack@eecs.umich.edu 4997370Sgblack@eecs.umich.edu vmlaSCode = ''' 5007396Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 5017396Sgblack@eecs.umich.edu float mid = binaryOp(fpscr, FpOp1, FpOp2, 5027396Sgblack@eecs.umich.edu fpMulS, fpscr.fz, fpscr.rMode); 5037396Sgblack@eecs.umich.edu FpDest = binaryOp(fpscr, FpDest, mid, fpAddS, fpscr.fz, fpscr.rMode); 5047396Sgblack@eecs.umich.edu Fpscr = fpscr; 5057370Sgblack@eecs.umich.edu ''' 5067396Sgblack@eecs.umich.edu vmlaSIop = InstObjParams("vmlas", "VmlaS", "FpRegRegRegOp", 5077370Sgblack@eecs.umich.edu { "code": vmlaSCode, 5087370Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 5097396Sgblack@eecs.umich.edu header_output += FpRegRegRegOpDeclare.subst(vmlaSIop); 5107396Sgblack@eecs.umich.edu decoder_output += FpRegRegRegOpConstructor.subst(vmlaSIop); 5117370Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmlaSIop); 5127370Sgblack@eecs.umich.edu 5137370Sgblack@eecs.umich.edu vmlaDCode = ''' 5147396Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 5157396Sgblack@eecs.umich.edu double mid = binaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw), 5167396Sgblack@eecs.umich.edu dbl(FpOp2P0.uw, FpOp2P1.uw), 5177396Sgblack@eecs.umich.edu fpMulD, fpscr.fz, fpscr.rMode); 5187396Sgblack@eecs.umich.edu double dest = binaryOp(fpscr, dbl(FpDestP0.uw, FpDestP1.uw), 5197396Sgblack@eecs.umich.edu mid, fpAddD, fpscr.fz, fpscr.rMode); 5207396Sgblack@eecs.umich.edu Fpscr = fpscr; 5217396Sgblack@eecs.umich.edu FpDestP0.uw = dblLow(dest); 5227396Sgblack@eecs.umich.edu FpDestP1.uw = dblHi(dest); 5237370Sgblack@eecs.umich.edu ''' 5247396Sgblack@eecs.umich.edu vmlaDIop = InstObjParams("vmlad", "VmlaD", "FpRegRegRegOp", 5257370Sgblack@eecs.umich.edu { "code": vmlaDCode, 5267370Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 5277396Sgblack@eecs.umich.edu header_output += FpRegRegRegOpDeclare.subst(vmlaDIop); 5287396Sgblack@eecs.umich.edu decoder_output += FpRegRegRegOpConstructor.subst(vmlaDIop); 5297370Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmlaDIop); 5307370Sgblack@eecs.umich.edu 5317370Sgblack@eecs.umich.edu vmlsSCode = ''' 5327396Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 5337396Sgblack@eecs.umich.edu float mid = binaryOp(fpscr, FpOp1, FpOp2, 5347396Sgblack@eecs.umich.edu fpMulS, fpscr.fz, fpscr.rMode); 5357396Sgblack@eecs.umich.edu FpDest = binaryOp(fpscr, FpDest, -mid, fpAddS, fpscr.fz, fpscr.rMode); 5367396Sgblack@eecs.umich.edu Fpscr = fpscr; 5377370Sgblack@eecs.umich.edu ''' 5387396Sgblack@eecs.umich.edu vmlsSIop = InstObjParams("vmlss", "VmlsS", "FpRegRegRegOp", 5397370Sgblack@eecs.umich.edu { "code": vmlsSCode, 5407370Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 5417396Sgblack@eecs.umich.edu header_output += FpRegRegRegOpDeclare.subst(vmlsSIop); 5427396Sgblack@eecs.umich.edu decoder_output += FpRegRegRegOpConstructor.subst(vmlsSIop); 5437370Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmlsSIop); 5447370Sgblack@eecs.umich.edu 5457370Sgblack@eecs.umich.edu vmlsDCode = ''' 5467396Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 5477396Sgblack@eecs.umich.edu double mid = binaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw), 5487396Sgblack@eecs.umich.edu dbl(FpOp2P0.uw, FpOp2P1.uw), 5497396Sgblack@eecs.umich.edu fpMulD, fpscr.fz, fpscr.rMode); 5507396Sgblack@eecs.umich.edu double dest = binaryOp(fpscr, dbl(FpDestP0.uw, FpDestP1.uw), 5517396Sgblack@eecs.umich.edu -mid, fpAddD, fpscr.fz, fpscr.rMode); 5527396Sgblack@eecs.umich.edu Fpscr = fpscr; 5537396Sgblack@eecs.umich.edu FpDestP0.uw = dblLow(dest); 5547396Sgblack@eecs.umich.edu FpDestP1.uw = dblHi(dest); 5557370Sgblack@eecs.umich.edu ''' 5567396Sgblack@eecs.umich.edu vmlsDIop = InstObjParams("vmlsd", "VmlsD", "FpRegRegRegOp", 5577370Sgblack@eecs.umich.edu { "code": vmlsDCode, 5587370Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 5597396Sgblack@eecs.umich.edu header_output += FpRegRegRegOpDeclare.subst(vmlsDIop); 5607396Sgblack@eecs.umich.edu decoder_output += FpRegRegRegOpConstructor.subst(vmlsDIop); 5617370Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmlsDIop); 5627371Sgblack@eecs.umich.edu 5637371Sgblack@eecs.umich.edu vnmlaSCode = ''' 5647396Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 5657396Sgblack@eecs.umich.edu float mid = binaryOp(fpscr, FpOp1, FpOp2, 5667396Sgblack@eecs.umich.edu fpMulS, fpscr.fz, fpscr.rMode); 5677396Sgblack@eecs.umich.edu FpDest = binaryOp(fpscr, -FpDest, -mid, fpAddS, fpscr.fz, fpscr.rMode); 5687396Sgblack@eecs.umich.edu Fpscr = fpscr; 5697371Sgblack@eecs.umich.edu ''' 5707396Sgblack@eecs.umich.edu vnmlaSIop = InstObjParams("vnmlas", "VnmlaS", "FpRegRegRegOp", 5717371Sgblack@eecs.umich.edu { "code": vnmlaSCode, 5727371Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 5737396Sgblack@eecs.umich.edu header_output += FpRegRegRegOpDeclare.subst(vnmlaSIop); 5747396Sgblack@eecs.umich.edu decoder_output += FpRegRegRegOpConstructor.subst(vnmlaSIop); 5757371Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vnmlaSIop); 5767371Sgblack@eecs.umich.edu 5777371Sgblack@eecs.umich.edu vnmlaDCode = ''' 5787396Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 5797396Sgblack@eecs.umich.edu double mid = binaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw), 5807396Sgblack@eecs.umich.edu dbl(FpOp2P0.uw, FpOp2P1.uw), 5817396Sgblack@eecs.umich.edu fpMulD, fpscr.fz, fpscr.rMode); 5827396Sgblack@eecs.umich.edu double dest = binaryOp(fpscr, -dbl(FpDestP0.uw, FpDestP1.uw), 5837396Sgblack@eecs.umich.edu -mid, fpAddD, fpscr.fz, fpscr.rMode); 5847396Sgblack@eecs.umich.edu Fpscr = fpscr; 5857396Sgblack@eecs.umich.edu FpDestP0.uw = dblLow(dest); 5867396Sgblack@eecs.umich.edu FpDestP1.uw = dblHi(dest); 5877371Sgblack@eecs.umich.edu ''' 5887396Sgblack@eecs.umich.edu vnmlaDIop = InstObjParams("vnmlad", "VnmlaD", "FpRegRegRegOp", 5897371Sgblack@eecs.umich.edu { "code": vnmlaDCode, 5907371Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 5917396Sgblack@eecs.umich.edu header_output += FpRegRegRegOpDeclare.subst(vnmlaDIop); 5927396Sgblack@eecs.umich.edu decoder_output += FpRegRegRegOpConstructor.subst(vnmlaDIop); 5937371Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vnmlaDIop); 5947371Sgblack@eecs.umich.edu 5957371Sgblack@eecs.umich.edu vnmlsSCode = ''' 5967396Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 5977396Sgblack@eecs.umich.edu float mid = binaryOp(fpscr, FpOp1, FpOp2, 5987396Sgblack@eecs.umich.edu fpMulS, fpscr.fz, fpscr.rMode); 5997396Sgblack@eecs.umich.edu FpDest = binaryOp(fpscr, -FpDest, mid, fpAddS, fpscr.fz, fpscr.rMode); 6007396Sgblack@eecs.umich.edu Fpscr = fpscr; 6017371Sgblack@eecs.umich.edu ''' 6027396Sgblack@eecs.umich.edu vnmlsSIop = InstObjParams("vnmlss", "VnmlsS", "FpRegRegRegOp", 6037371Sgblack@eecs.umich.edu { "code": vnmlsSCode, 6047371Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 6057396Sgblack@eecs.umich.edu header_output += FpRegRegRegOpDeclare.subst(vnmlsSIop); 6067396Sgblack@eecs.umich.edu decoder_output += FpRegRegRegOpConstructor.subst(vnmlsSIop); 6077371Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vnmlsSIop); 6087371Sgblack@eecs.umich.edu 6097371Sgblack@eecs.umich.edu vnmlsDCode = ''' 6107396Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 6117396Sgblack@eecs.umich.edu double mid = binaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw), 6127396Sgblack@eecs.umich.edu dbl(FpOp2P0.uw, FpOp2P1.uw), 6137396Sgblack@eecs.umich.edu fpMulD, fpscr.fz, fpscr.rMode); 6147396Sgblack@eecs.umich.edu double dest = binaryOp(fpscr, -dbl(FpDestP0.uw, FpDestP1.uw), 6157396Sgblack@eecs.umich.edu mid, fpAddD, fpscr.fz, fpscr.rMode); 6167396Sgblack@eecs.umich.edu Fpscr = fpscr; 6177396Sgblack@eecs.umich.edu FpDestP0.uw = dblLow(dest); 6187396Sgblack@eecs.umich.edu FpDestP1.uw = dblHi(dest); 6197371Sgblack@eecs.umich.edu ''' 6207396Sgblack@eecs.umich.edu vnmlsDIop = InstObjParams("vnmlsd", "VnmlsD", "FpRegRegRegOp", 6217371Sgblack@eecs.umich.edu { "code": vnmlsDCode, 6227371Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 6237396Sgblack@eecs.umich.edu header_output += FpRegRegRegOpDeclare.subst(vnmlsDIop); 6247396Sgblack@eecs.umich.edu decoder_output += FpRegRegRegOpConstructor.subst(vnmlsDIop); 6257371Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vnmlsDIop); 6267371Sgblack@eecs.umich.edu 6277371Sgblack@eecs.umich.edu vnmulSCode = ''' 6287396Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 6297396Sgblack@eecs.umich.edu FpDest = -binaryOp(fpscr, FpOp1, FpOp2, fpMulS, fpscr.fz, fpscr.rMode); 6307396Sgblack@eecs.umich.edu Fpscr = fpscr; 6317371Sgblack@eecs.umich.edu ''' 6327396Sgblack@eecs.umich.edu vnmulSIop = InstObjParams("vnmuls", "VnmulS", "FpRegRegRegOp", 6337371Sgblack@eecs.umich.edu { "code": vnmulSCode, 6347371Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 6357396Sgblack@eecs.umich.edu header_output += FpRegRegRegOpDeclare.subst(vnmulSIop); 6367396Sgblack@eecs.umich.edu decoder_output += FpRegRegRegOpConstructor.subst(vnmulSIop); 6377371Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vnmulSIop); 6387371Sgblack@eecs.umich.edu 6397371Sgblack@eecs.umich.edu vnmulDCode = ''' 6407396Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 6417396Sgblack@eecs.umich.edu double dest = -binaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw), 6427396Sgblack@eecs.umich.edu dbl(FpOp2P0.uw, FpOp2P1.uw), 6437396Sgblack@eecs.umich.edu fpMulD, fpscr.fz, fpscr.rMode); 6447396Sgblack@eecs.umich.edu Fpscr = fpscr; 6457396Sgblack@eecs.umich.edu FpDestP0.uw = dblLow(dest); 6467396Sgblack@eecs.umich.edu FpDestP1.uw = dblHi(dest); 6477371Sgblack@eecs.umich.edu ''' 6487396Sgblack@eecs.umich.edu vnmulDIop = InstObjParams("vnmuld", "VnmulD", "FpRegRegRegOp", 6497371Sgblack@eecs.umich.edu { "code": vnmulDCode, 6507371Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 6517396Sgblack@eecs.umich.edu header_output += FpRegRegRegOpDeclare.subst(vnmulDIop); 6527396Sgblack@eecs.umich.edu decoder_output += FpRegRegRegOpConstructor.subst(vnmulDIop); 6537371Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vnmulDIop); 6547381Sgblack@eecs.umich.edu}}; 6557381Sgblack@eecs.umich.edu 6567381Sgblack@eecs.umich.edulet {{ 6577381Sgblack@eecs.umich.edu 6587381Sgblack@eecs.umich.edu header_output = "" 6597381Sgblack@eecs.umich.edu decoder_output = "" 6607381Sgblack@eecs.umich.edu exec_output = "" 6617373Sgblack@eecs.umich.edu 6627373Sgblack@eecs.umich.edu vcvtUIntFpSCode = ''' 6637378Sgblack@eecs.umich.edu VfpSavedState state = prepVfpFpscr(Fpscr); 6647381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1.uw) : "m" (FpOp1.uw)); 6657373Sgblack@eecs.umich.edu FpDest = FpOp1.uw; 6667381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest)); 6677378Sgblack@eecs.umich.edu Fpscr = setVfpFpscr(Fpscr, state); 6687373Sgblack@eecs.umich.edu ''' 6697396Sgblack@eecs.umich.edu vcvtUIntFpSIop = InstObjParams("vcvt", "VcvtUIntFpS", "FpRegRegOp", 6707373Sgblack@eecs.umich.edu { "code": vcvtUIntFpSCode, 6717373Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 6727396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcvtUIntFpSIop); 6737396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcvtUIntFpSIop); 6747373Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtUIntFpSIop); 6757373Sgblack@eecs.umich.edu 6767373Sgblack@eecs.umich.edu vcvtUIntFpDCode = ''' 6777373Sgblack@eecs.umich.edu IntDoubleUnion cDest; 6787378Sgblack@eecs.umich.edu VfpSavedState state = prepVfpFpscr(Fpscr); 6797381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1P0.uw) : "m" (FpOp1P0.uw)); 6807373Sgblack@eecs.umich.edu cDest.fp = (uint64_t)FpOp1P0.uw; 6817381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (cDest.fp)); 6827378Sgblack@eecs.umich.edu Fpscr = setVfpFpscr(Fpscr, state); 6837373Sgblack@eecs.umich.edu FpDestP0.uw = cDest.bits; 6847373Sgblack@eecs.umich.edu FpDestP1.uw = cDest.bits >> 32; 6857373Sgblack@eecs.umich.edu ''' 6867396Sgblack@eecs.umich.edu vcvtUIntFpDIop = InstObjParams("vcvt", "VcvtUIntFpD", "FpRegRegOp", 6877373Sgblack@eecs.umich.edu { "code": vcvtUIntFpDCode, 6887373Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 6897396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcvtUIntFpDIop); 6907396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcvtUIntFpDIop); 6917373Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtUIntFpDIop); 6927373Sgblack@eecs.umich.edu 6937373Sgblack@eecs.umich.edu vcvtSIntFpSCode = ''' 6947378Sgblack@eecs.umich.edu VfpSavedState state = prepVfpFpscr(Fpscr); 6957381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1.sw) : "m" (FpOp1.sw)); 6967373Sgblack@eecs.umich.edu FpDest = FpOp1.sw; 6977381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest)); 6987378Sgblack@eecs.umich.edu Fpscr = setVfpFpscr(Fpscr, state); 6997373Sgblack@eecs.umich.edu ''' 7007396Sgblack@eecs.umich.edu vcvtSIntFpSIop = InstObjParams("vcvt", "VcvtSIntFpS", "FpRegRegOp", 7017373Sgblack@eecs.umich.edu { "code": vcvtSIntFpSCode, 7027373Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 7037396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcvtSIntFpSIop); 7047396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcvtSIntFpSIop); 7057373Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtSIntFpSIop); 7067373Sgblack@eecs.umich.edu 7077373Sgblack@eecs.umich.edu vcvtSIntFpDCode = ''' 7087373Sgblack@eecs.umich.edu IntDoubleUnion cDest; 7097378Sgblack@eecs.umich.edu VfpSavedState state = prepVfpFpscr(Fpscr); 7107381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1P0.sw) : "m" (FpOp1P0.sw)); 7117373Sgblack@eecs.umich.edu cDest.fp = FpOp1P0.sw; 7127381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (cDest.fp)); 7137378Sgblack@eecs.umich.edu Fpscr = setVfpFpscr(Fpscr, state); 7147373Sgblack@eecs.umich.edu FpDestP0.uw = cDest.bits; 7157373Sgblack@eecs.umich.edu FpDestP1.uw = cDest.bits >> 32; 7167373Sgblack@eecs.umich.edu ''' 7177396Sgblack@eecs.umich.edu vcvtSIntFpDIop = InstObjParams("vcvt", "VcvtSIntFpD", "FpRegRegOp", 7187373Sgblack@eecs.umich.edu { "code": vcvtSIntFpDCode, 7197373Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 7207396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcvtSIntFpDIop); 7217396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcvtSIntFpDIop); 7227373Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtSIntFpDIop); 7237373Sgblack@eecs.umich.edu 7247380Sgblack@eecs.umich.edu vcvtFpUIntSRCode = ''' 7257382Sgblack@eecs.umich.edu vfpFlushToZero(Fpscr, FpOp1); 7267380Sgblack@eecs.umich.edu VfpSavedState state = prepVfpFpscr(Fpscr); 7277381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1)); 7287388Sgblack@eecs.umich.edu FpDest.uw = vfpFpSToFixed(FpOp1, false, false, 0, false); 7297381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest.uw)); 7307380Sgblack@eecs.umich.edu Fpscr = setVfpFpscr(Fpscr, state); 7317380Sgblack@eecs.umich.edu ''' 7327396Sgblack@eecs.umich.edu vcvtFpUIntSRIop = InstObjParams("vcvt", "VcvtFpUIntSR", "FpRegRegOp", 7337380Sgblack@eecs.umich.edu { "code": vcvtFpUIntSRCode, 7347380Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 7357396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcvtFpUIntSRIop); 7367396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcvtFpUIntSRIop); 7377380Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpUIntSRIop); 7387380Sgblack@eecs.umich.edu 7397380Sgblack@eecs.umich.edu vcvtFpUIntDRCode = ''' 7407380Sgblack@eecs.umich.edu IntDoubleUnion cOp1; 7417380Sgblack@eecs.umich.edu cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 7427382Sgblack@eecs.umich.edu vfpFlushToZero(Fpscr, cOp1.fp); 7437380Sgblack@eecs.umich.edu VfpSavedState state = prepVfpFpscr(Fpscr); 7447381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp)); 7457388Sgblack@eecs.umich.edu uint64_t result = vfpFpDToFixed(cOp1.fp, false, false, 0, false); 7467381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (result)); 7477380Sgblack@eecs.umich.edu Fpscr = setVfpFpscr(Fpscr, state); 7487380Sgblack@eecs.umich.edu FpDestP0.uw = result; 7497380Sgblack@eecs.umich.edu ''' 7507396Sgblack@eecs.umich.edu vcvtFpUIntDRIop = InstObjParams("vcvtr", "VcvtFpUIntDR", "FpRegRegOp", 7517380Sgblack@eecs.umich.edu { "code": vcvtFpUIntDRCode, 7527380Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 7537396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcvtFpUIntDRIop); 7547396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcvtFpUIntDRIop); 7557380Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpUIntDRIop); 7567380Sgblack@eecs.umich.edu 7577380Sgblack@eecs.umich.edu vcvtFpSIntSRCode = ''' 7587382Sgblack@eecs.umich.edu vfpFlushToZero(Fpscr, FpOp1); 7597380Sgblack@eecs.umich.edu VfpSavedState state = prepVfpFpscr(Fpscr); 7607381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1)); 7617388Sgblack@eecs.umich.edu FpDest.sw = vfpFpSToFixed(FpOp1, true, false, 0, false); 7627381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest.sw)); 7637380Sgblack@eecs.umich.edu Fpscr = setVfpFpscr(Fpscr, state); 7647380Sgblack@eecs.umich.edu ''' 7657396Sgblack@eecs.umich.edu vcvtFpSIntSRIop = InstObjParams("vcvtr", "VcvtFpSIntSR", "FpRegRegOp", 7667380Sgblack@eecs.umich.edu { "code": vcvtFpSIntSRCode, 7677380Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 7687396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcvtFpSIntSRIop); 7697396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcvtFpSIntSRIop); 7707380Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpSIntSRIop); 7717380Sgblack@eecs.umich.edu 7727380Sgblack@eecs.umich.edu vcvtFpSIntDRCode = ''' 7737380Sgblack@eecs.umich.edu IntDoubleUnion cOp1; 7747380Sgblack@eecs.umich.edu cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 7757382Sgblack@eecs.umich.edu vfpFlushToZero(Fpscr, cOp1.fp); 7767380Sgblack@eecs.umich.edu VfpSavedState state = prepVfpFpscr(Fpscr); 7777381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp)); 7787388Sgblack@eecs.umich.edu int64_t result = vfpFpDToFixed(cOp1.fp, true, false, 0, false); 7797381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (result)); 7807380Sgblack@eecs.umich.edu Fpscr = setVfpFpscr(Fpscr, state); 7817380Sgblack@eecs.umich.edu FpDestP0.uw = result; 7827380Sgblack@eecs.umich.edu ''' 7837396Sgblack@eecs.umich.edu vcvtFpSIntDRIop = InstObjParams("vcvtr", "VcvtFpSIntDR", "FpRegRegOp", 7847380Sgblack@eecs.umich.edu { "code": vcvtFpSIntDRCode, 7857380Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 7867396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcvtFpSIntDRIop); 7877396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcvtFpSIntDRIop); 7887380Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpSIntDRIop); 7897380Sgblack@eecs.umich.edu 7907373Sgblack@eecs.umich.edu vcvtFpUIntSCode = ''' 7917382Sgblack@eecs.umich.edu vfpFlushToZero(Fpscr, FpOp1); 7927378Sgblack@eecs.umich.edu VfpSavedState state = prepVfpFpscr(Fpscr); 7937380Sgblack@eecs.umich.edu fesetround(FeRoundZero); 7947381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1)); 7957387Sgblack@eecs.umich.edu FpDest.uw = vfpFpSToFixed(FpOp1, false, false, 0); 7967381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest.uw)); 7977378Sgblack@eecs.umich.edu Fpscr = setVfpFpscr(Fpscr, state); 7987373Sgblack@eecs.umich.edu ''' 7997396Sgblack@eecs.umich.edu vcvtFpUIntSIop = InstObjParams("vcvt", "VcvtFpUIntS", "FpRegRegOp", 8007373Sgblack@eecs.umich.edu { "code": vcvtFpUIntSCode, 8017373Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 8027396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcvtFpUIntSIop); 8037396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcvtFpUIntSIop); 8047373Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpUIntSIop); 8057373Sgblack@eecs.umich.edu 8067373Sgblack@eecs.umich.edu vcvtFpUIntDCode = ''' 8077373Sgblack@eecs.umich.edu IntDoubleUnion cOp1; 8087373Sgblack@eecs.umich.edu cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 8097382Sgblack@eecs.umich.edu vfpFlushToZero(Fpscr, cOp1.fp); 8107378Sgblack@eecs.umich.edu VfpSavedState state = prepVfpFpscr(Fpscr); 8117380Sgblack@eecs.umich.edu fesetround(FeRoundZero); 8127381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp)); 8137387Sgblack@eecs.umich.edu uint64_t result = vfpFpDToFixed(cOp1.fp, false, false, 0); 8147381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (result)); 8157378Sgblack@eecs.umich.edu Fpscr = setVfpFpscr(Fpscr, state); 8167373Sgblack@eecs.umich.edu FpDestP0.uw = result; 8177373Sgblack@eecs.umich.edu ''' 8187396Sgblack@eecs.umich.edu vcvtFpUIntDIop = InstObjParams("vcvt", "VcvtFpUIntD", "FpRegRegOp", 8197373Sgblack@eecs.umich.edu { "code": vcvtFpUIntDCode, 8207373Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 8217396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcvtFpUIntDIop); 8227396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcvtFpUIntDIop); 8237373Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpUIntDIop); 8247373Sgblack@eecs.umich.edu 8257373Sgblack@eecs.umich.edu vcvtFpSIntSCode = ''' 8267382Sgblack@eecs.umich.edu vfpFlushToZero(Fpscr, FpOp1); 8277378Sgblack@eecs.umich.edu VfpSavedState state = prepVfpFpscr(Fpscr); 8287380Sgblack@eecs.umich.edu fesetround(FeRoundZero); 8297381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1)); 8307387Sgblack@eecs.umich.edu FpDest.sw = vfpFpSToFixed(FpOp1, true, false, 0); 8317381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest.sw)); 8327378Sgblack@eecs.umich.edu Fpscr = setVfpFpscr(Fpscr, state); 8337373Sgblack@eecs.umich.edu ''' 8347396Sgblack@eecs.umich.edu vcvtFpSIntSIop = InstObjParams("vcvt", "VcvtFpSIntS", "FpRegRegOp", 8357373Sgblack@eecs.umich.edu { "code": vcvtFpSIntSCode, 8367373Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 8377396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcvtFpSIntSIop); 8387396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcvtFpSIntSIop); 8397373Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpSIntSIop); 8407373Sgblack@eecs.umich.edu 8417373Sgblack@eecs.umich.edu vcvtFpSIntDCode = ''' 8427373Sgblack@eecs.umich.edu IntDoubleUnion cOp1; 8437373Sgblack@eecs.umich.edu cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 8447382Sgblack@eecs.umich.edu vfpFlushToZero(Fpscr, cOp1.fp); 8457378Sgblack@eecs.umich.edu VfpSavedState state = prepVfpFpscr(Fpscr); 8467380Sgblack@eecs.umich.edu fesetround(FeRoundZero); 8477381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp)); 8487387Sgblack@eecs.umich.edu int64_t result = vfpFpDToFixed(cOp1.fp, true, false, 0); 8497381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (result)); 8507378Sgblack@eecs.umich.edu Fpscr = setVfpFpscr(Fpscr, state); 8517373Sgblack@eecs.umich.edu FpDestP0.uw = result; 8527373Sgblack@eecs.umich.edu ''' 8537396Sgblack@eecs.umich.edu vcvtFpSIntDIop = InstObjParams("vcvt", "VcvtFpSIntD", "FpRegRegOp", 8547373Sgblack@eecs.umich.edu { "code": vcvtFpSIntDCode, 8557373Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 8567396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcvtFpSIntDIop); 8577396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcvtFpSIntDIop); 8587373Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpSIntDIop); 8597374Sgblack@eecs.umich.edu 8607374Sgblack@eecs.umich.edu vcvtFpSFpDCode = ''' 8617374Sgblack@eecs.umich.edu IntDoubleUnion cDest; 8627382Sgblack@eecs.umich.edu vfpFlushToZero(Fpscr, FpOp1); 8637378Sgblack@eecs.umich.edu VfpSavedState state = prepVfpFpscr(Fpscr); 8647381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1)); 8657396Sgblack@eecs.umich.edu cDest.fp = fixFpSFpDDest(Fpscr, FpOp1); 8667381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (cDest.fp)); 8677378Sgblack@eecs.umich.edu Fpscr = setVfpFpscr(Fpscr, state); 8687374Sgblack@eecs.umich.edu FpDestP0.uw = cDest.bits; 8697374Sgblack@eecs.umich.edu FpDestP1.uw = cDest.bits >> 32; 8707374Sgblack@eecs.umich.edu ''' 8717396Sgblack@eecs.umich.edu vcvtFpSFpDIop = InstObjParams("vcvt", "VcvtFpSFpD", "FpRegRegOp", 8727374Sgblack@eecs.umich.edu { "code": vcvtFpSFpDCode, 8737374Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 8747396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcvtFpSFpDIop); 8757396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcvtFpSFpDIop); 8767374Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpSFpDIop); 8777374Sgblack@eecs.umich.edu 8787374Sgblack@eecs.umich.edu vcvtFpDFpSCode = ''' 8797374Sgblack@eecs.umich.edu IntDoubleUnion cOp1; 8807374Sgblack@eecs.umich.edu cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 8817382Sgblack@eecs.umich.edu vfpFlushToZero(Fpscr, cOp1.fp); 8827378Sgblack@eecs.umich.edu VfpSavedState state = prepVfpFpscr(Fpscr); 8837381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp)); 8847386Sgblack@eecs.umich.edu FpDest = fixFpDFpSDest(Fpscr, cOp1.fp); 8857381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest)); 8867378Sgblack@eecs.umich.edu Fpscr = setVfpFpscr(Fpscr, state); 8877374Sgblack@eecs.umich.edu ''' 8887396Sgblack@eecs.umich.edu vcvtFpDFpSIop = InstObjParams("vcvt", "VcvtFpDFpS", "FpRegRegOp", 8897374Sgblack@eecs.umich.edu { "code": vcvtFpDFpSCode, 8907374Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 8917396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcvtFpDFpSIop); 8927396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcvtFpDFpSIop); 8937374Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpDFpSIop); 8947377Sgblack@eecs.umich.edu 8957377Sgblack@eecs.umich.edu vcmpSCode = ''' 8967389Sgblack@eecs.umich.edu vfpFlushToZero(Fpscr, FpDest, FpOp1); 8977377Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 8987377Sgblack@eecs.umich.edu if (FpDest == FpOp1) { 8997377Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0; 9007377Sgblack@eecs.umich.edu } else if (FpDest < FpOp1) { 9017377Sgblack@eecs.umich.edu fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0; 9027377Sgblack@eecs.umich.edu } else if (FpDest > FpOp1) { 9037377Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0; 9047377Sgblack@eecs.umich.edu } else { 9057389Sgblack@eecs.umich.edu const uint32_t qnan = 0x7fc00000; 9067389Sgblack@eecs.umich.edu const bool nan1 = std::isnan(FpDest); 9077396Sgblack@eecs.umich.edu const bool signal1 = nan1 && ((fpToBits(FpDest) & qnan) != qnan); 9087389Sgblack@eecs.umich.edu const bool nan2 = std::isnan(FpOp1); 9097396Sgblack@eecs.umich.edu const bool signal2 = nan2 && ((fpToBits(FpOp1) & qnan) != qnan); 9107389Sgblack@eecs.umich.edu if (signal1 || signal2) 9117389Sgblack@eecs.umich.edu fpscr.ioc = 1; 9127377Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1; 9137377Sgblack@eecs.umich.edu } 9147377Sgblack@eecs.umich.edu Fpscr = fpscr; 9157377Sgblack@eecs.umich.edu ''' 9167396Sgblack@eecs.umich.edu vcmpSIop = InstObjParams("vcmps", "VcmpS", "FpRegRegOp", 9177377Sgblack@eecs.umich.edu { "code": vcmpSCode, 9187377Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 9197396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcmpSIop); 9207396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcmpSIop); 9217377Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcmpSIop); 9227377Sgblack@eecs.umich.edu 9237377Sgblack@eecs.umich.edu vcmpDCode = ''' 9247377Sgblack@eecs.umich.edu IntDoubleUnion cOp1, cDest; 9257377Sgblack@eecs.umich.edu cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32)); 9267377Sgblack@eecs.umich.edu cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 9277382Sgblack@eecs.umich.edu vfpFlushToZero(Fpscr, cDest.fp, cOp1.fp); 9287377Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 9297377Sgblack@eecs.umich.edu if (cDest.fp == cOp1.fp) { 9307377Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0; 9317377Sgblack@eecs.umich.edu } else if (cDest.fp < cOp1.fp) { 9327377Sgblack@eecs.umich.edu fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0; 9337377Sgblack@eecs.umich.edu } else if (cDest.fp > cOp1.fp) { 9347377Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0; 9357377Sgblack@eecs.umich.edu } else { 9367389Sgblack@eecs.umich.edu const uint64_t qnan = ULL(0x7ff8000000000000); 9377389Sgblack@eecs.umich.edu const bool nan1 = std::isnan(cDest.fp); 9387389Sgblack@eecs.umich.edu const bool signal1 = nan1 && ((cDest.bits & qnan) != qnan); 9397389Sgblack@eecs.umich.edu const bool nan2 = std::isnan(cOp1.fp); 9407389Sgblack@eecs.umich.edu const bool signal2 = nan2 && ((cOp1.bits & qnan) != qnan); 9417389Sgblack@eecs.umich.edu if (signal1 || signal2) 9427389Sgblack@eecs.umich.edu fpscr.ioc = 1; 9437377Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1; 9447377Sgblack@eecs.umich.edu } 9457377Sgblack@eecs.umich.edu Fpscr = fpscr; 9467377Sgblack@eecs.umich.edu ''' 9477396Sgblack@eecs.umich.edu vcmpDIop = InstObjParams("vcmpd", "VcmpD", "FpRegRegOp", 9487377Sgblack@eecs.umich.edu { "code": vcmpDCode, 9497377Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 9507396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcmpDIop); 9517396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcmpDIop); 9527377Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcmpDIop); 9537377Sgblack@eecs.umich.edu 9547377Sgblack@eecs.umich.edu vcmpZeroSCode = ''' 9557389Sgblack@eecs.umich.edu vfpFlushToZero(Fpscr, FpDest); 9567377Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 9577389Sgblack@eecs.umich.edu // This only handles imm == 0 for now. 9587389Sgblack@eecs.umich.edu assert(imm == 0); 9597377Sgblack@eecs.umich.edu if (FpDest == imm) { 9607377Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0; 9617377Sgblack@eecs.umich.edu } else if (FpDest < imm) { 9627377Sgblack@eecs.umich.edu fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0; 9637377Sgblack@eecs.umich.edu } else if (FpDest > imm) { 9647377Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0; 9657377Sgblack@eecs.umich.edu } else { 9667389Sgblack@eecs.umich.edu const uint32_t qnan = 0x7fc00000; 9677389Sgblack@eecs.umich.edu const bool nan = std::isnan(FpDest); 9687396Sgblack@eecs.umich.edu const bool signal = nan && ((fpToBits(FpDest) & qnan) != qnan); 9697389Sgblack@eecs.umich.edu if (signal) 9707389Sgblack@eecs.umich.edu fpscr.ioc = 1; 9717377Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1; 9727377Sgblack@eecs.umich.edu } 9737377Sgblack@eecs.umich.edu Fpscr = fpscr; 9747377Sgblack@eecs.umich.edu ''' 9757396Sgblack@eecs.umich.edu vcmpZeroSIop = InstObjParams("vcmpZeros", "VcmpZeroS", "FpRegImmOp", 9767377Sgblack@eecs.umich.edu { "code": vcmpZeroSCode, 9777377Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 9787396Sgblack@eecs.umich.edu header_output += FpRegImmOpDeclare.subst(vcmpZeroSIop); 9797396Sgblack@eecs.umich.edu decoder_output += FpRegImmOpConstructor.subst(vcmpZeroSIop); 9807377Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcmpZeroSIop); 9817377Sgblack@eecs.umich.edu 9827377Sgblack@eecs.umich.edu vcmpZeroDCode = ''' 9837377Sgblack@eecs.umich.edu IntDoubleUnion cDest; 9847389Sgblack@eecs.umich.edu // This only handles imm == 0 for now. 9857389Sgblack@eecs.umich.edu assert(imm == 0); 9867377Sgblack@eecs.umich.edu cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32)); 9877382Sgblack@eecs.umich.edu vfpFlushToZero(Fpscr, cDest.fp); 9887377Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 9897377Sgblack@eecs.umich.edu if (cDest.fp == imm) { 9907377Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0; 9917377Sgblack@eecs.umich.edu } else if (cDest.fp < imm) { 9927377Sgblack@eecs.umich.edu fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0; 9937377Sgblack@eecs.umich.edu } else if (cDest.fp > imm) { 9947377Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0; 9957377Sgblack@eecs.umich.edu } else { 9967389Sgblack@eecs.umich.edu const uint64_t qnan = ULL(0x7ff8000000000000); 9977389Sgblack@eecs.umich.edu const bool nan = std::isnan(cDest.fp); 9987389Sgblack@eecs.umich.edu const bool signal = nan && ((cDest.bits & qnan) != qnan); 9997389Sgblack@eecs.umich.edu if (signal) 10007389Sgblack@eecs.umich.edu fpscr.ioc = 1; 10017377Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1; 10027377Sgblack@eecs.umich.edu } 10037377Sgblack@eecs.umich.edu Fpscr = fpscr; 10047377Sgblack@eecs.umich.edu ''' 10057396Sgblack@eecs.umich.edu vcmpZeroDIop = InstObjParams("vcmpZerod", "VcmpZeroD", "FpRegImmOp", 10067377Sgblack@eecs.umich.edu { "code": vcmpZeroDCode, 10077377Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 10087396Sgblack@eecs.umich.edu header_output += FpRegImmOpDeclare.subst(vcmpZeroDIop); 10097396Sgblack@eecs.umich.edu decoder_output += FpRegImmOpConstructor.subst(vcmpZeroDIop); 10107377Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcmpZeroDIop); 10117389Sgblack@eecs.umich.edu 10127389Sgblack@eecs.umich.edu vcmpeSCode = ''' 10137389Sgblack@eecs.umich.edu vfpFlushToZero(Fpscr, FpDest, FpOp1); 10147389Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 10157389Sgblack@eecs.umich.edu if (FpDest == FpOp1) { 10167389Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0; 10177389Sgblack@eecs.umich.edu } else if (FpDest < FpOp1) { 10187389Sgblack@eecs.umich.edu fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0; 10197389Sgblack@eecs.umich.edu } else if (FpDest > FpOp1) { 10207389Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0; 10217389Sgblack@eecs.umich.edu } else { 10227389Sgblack@eecs.umich.edu fpscr.ioc = 1; 10237389Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1; 10247389Sgblack@eecs.umich.edu } 10257389Sgblack@eecs.umich.edu Fpscr = fpscr; 10267389Sgblack@eecs.umich.edu ''' 10277396Sgblack@eecs.umich.edu vcmpeSIop = InstObjParams("vcmpes", "VcmpeS", "FpRegRegOp", 10287389Sgblack@eecs.umich.edu { "code": vcmpeSCode, 10297389Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 10307396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcmpeSIop); 10317396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcmpeSIop); 10327389Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcmpeSIop); 10337389Sgblack@eecs.umich.edu 10347389Sgblack@eecs.umich.edu vcmpeDCode = ''' 10357389Sgblack@eecs.umich.edu IntDoubleUnion cOp1, cDest; 10367389Sgblack@eecs.umich.edu cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32)); 10377389Sgblack@eecs.umich.edu cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 10387389Sgblack@eecs.umich.edu vfpFlushToZero(Fpscr, cDest.fp, cOp1.fp); 10397389Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 10407389Sgblack@eecs.umich.edu if (cDest.fp == cOp1.fp) { 10417389Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0; 10427389Sgblack@eecs.umich.edu } else if (cDest.fp < cOp1.fp) { 10437389Sgblack@eecs.umich.edu fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0; 10447389Sgblack@eecs.umich.edu } else if (cDest.fp > cOp1.fp) { 10457389Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0; 10467389Sgblack@eecs.umich.edu } else { 10477389Sgblack@eecs.umich.edu fpscr.ioc = 1; 10487389Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1; 10497389Sgblack@eecs.umich.edu } 10507389Sgblack@eecs.umich.edu Fpscr = fpscr; 10517389Sgblack@eecs.umich.edu ''' 10527396Sgblack@eecs.umich.edu vcmpeDIop = InstObjParams("vcmped", "VcmpeD", "FpRegRegOp", 10537389Sgblack@eecs.umich.edu { "code": vcmpeDCode, 10547389Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 10557396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcmpeDIop); 10567396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcmpeDIop); 10577389Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcmpeDIop); 10587389Sgblack@eecs.umich.edu 10597389Sgblack@eecs.umich.edu vcmpeZeroSCode = ''' 10607389Sgblack@eecs.umich.edu vfpFlushToZero(Fpscr, FpDest); 10617389Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 10627389Sgblack@eecs.umich.edu if (FpDest == imm) { 10637389Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0; 10647389Sgblack@eecs.umich.edu } else if (FpDest < imm) { 10657389Sgblack@eecs.umich.edu fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0; 10667389Sgblack@eecs.umich.edu } else if (FpDest > imm) { 10677389Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0; 10687389Sgblack@eecs.umich.edu } else { 10697389Sgblack@eecs.umich.edu fpscr.ioc = 1; 10707389Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1; 10717389Sgblack@eecs.umich.edu } 10727389Sgblack@eecs.umich.edu Fpscr = fpscr; 10737389Sgblack@eecs.umich.edu ''' 10747396Sgblack@eecs.umich.edu vcmpeZeroSIop = InstObjParams("vcmpeZeros", "VcmpeZeroS", "FpRegImmOp", 10757389Sgblack@eecs.umich.edu { "code": vcmpeZeroSCode, 10767389Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 10777396Sgblack@eecs.umich.edu header_output += FpRegImmOpDeclare.subst(vcmpeZeroSIop); 10787396Sgblack@eecs.umich.edu decoder_output += FpRegImmOpConstructor.subst(vcmpeZeroSIop); 10797389Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcmpeZeroSIop); 10807389Sgblack@eecs.umich.edu 10817389Sgblack@eecs.umich.edu vcmpeZeroDCode = ''' 10827389Sgblack@eecs.umich.edu IntDoubleUnion cDest; 10837389Sgblack@eecs.umich.edu cDest.bits = ((uint64_t)FpDestP0.uw | ((uint64_t)FpDestP1.uw << 32)); 10847389Sgblack@eecs.umich.edu vfpFlushToZero(Fpscr, cDest.fp); 10857389Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 10867389Sgblack@eecs.umich.edu if (cDest.fp == imm) { 10877389Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0; 10887389Sgblack@eecs.umich.edu } else if (cDest.fp < imm) { 10897389Sgblack@eecs.umich.edu fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0; 10907389Sgblack@eecs.umich.edu } else if (cDest.fp > imm) { 10917389Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0; 10927389Sgblack@eecs.umich.edu } else { 10937389Sgblack@eecs.umich.edu fpscr.ioc = 1; 10947389Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1; 10957389Sgblack@eecs.umich.edu } 10967389Sgblack@eecs.umich.edu Fpscr = fpscr; 10977389Sgblack@eecs.umich.edu ''' 10987396Sgblack@eecs.umich.edu vcmpeZeroDIop = InstObjParams("vcmpeZerod", "VcmpeZeroD", "FpRegImmOp", 10997389Sgblack@eecs.umich.edu { "code": vcmpeZeroDCode, 11007389Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 11017396Sgblack@eecs.umich.edu header_output += FpRegImmOpDeclare.subst(vcmpeZeroDIop); 11027396Sgblack@eecs.umich.edu decoder_output += FpRegImmOpConstructor.subst(vcmpeZeroDIop); 11037389Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcmpeZeroDIop); 11047322Sgblack@eecs.umich.edu}}; 11057379Sgblack@eecs.umich.edu 11067379Sgblack@eecs.umich.edulet {{ 11077379Sgblack@eecs.umich.edu 11087379Sgblack@eecs.umich.edu header_output = "" 11097379Sgblack@eecs.umich.edu decoder_output = "" 11107379Sgblack@eecs.umich.edu exec_output = "" 11117379Sgblack@eecs.umich.edu 11127379Sgblack@eecs.umich.edu vcvtFpSFixedSCode = ''' 11137382Sgblack@eecs.umich.edu vfpFlushToZero(Fpscr, FpOp1); 11147379Sgblack@eecs.umich.edu VfpSavedState state = prepVfpFpscr(Fpscr); 11157381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1)); 11167379Sgblack@eecs.umich.edu FpDest.sw = vfpFpSToFixed(FpOp1, true, false, imm); 11177381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest.sw)); 11187379Sgblack@eecs.umich.edu Fpscr = setVfpFpscr(Fpscr, state); 11197379Sgblack@eecs.umich.edu ''' 11207396Sgblack@eecs.umich.edu vcvtFpSFixedSIop = InstObjParams("vcvt", "VcvtFpSFixedS", "FpRegRegImmOp", 11217379Sgblack@eecs.umich.edu { "code": vcvtFpSFixedSCode, 11227379Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 11237396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vcvtFpSFixedSIop); 11247396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpSFixedSIop); 11257379Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpSFixedSIop); 11267379Sgblack@eecs.umich.edu 11277379Sgblack@eecs.umich.edu vcvtFpSFixedDCode = ''' 11287379Sgblack@eecs.umich.edu IntDoubleUnion cOp1; 11297379Sgblack@eecs.umich.edu cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 11307382Sgblack@eecs.umich.edu vfpFlushToZero(Fpscr, cOp1.fp); 11317379Sgblack@eecs.umich.edu VfpSavedState state = prepVfpFpscr(Fpscr); 11327381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp)); 11337379Sgblack@eecs.umich.edu uint64_t mid = vfpFpDToFixed(cOp1.fp, true, false, imm); 11347381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (mid)); 11357379Sgblack@eecs.umich.edu Fpscr = setVfpFpscr(Fpscr, state); 11367379Sgblack@eecs.umich.edu FpDestP0.uw = mid; 11377379Sgblack@eecs.umich.edu FpDestP1.uw = mid >> 32; 11387379Sgblack@eecs.umich.edu ''' 11397396Sgblack@eecs.umich.edu vcvtFpSFixedDIop = InstObjParams("vcvt", "VcvtFpSFixedD", "FpRegRegImmOp", 11407379Sgblack@eecs.umich.edu { "code": vcvtFpSFixedDCode, 11417379Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 11427396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vcvtFpSFixedDIop); 11437396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpSFixedDIop); 11447379Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpSFixedDIop); 11457379Sgblack@eecs.umich.edu 11467379Sgblack@eecs.umich.edu vcvtFpUFixedSCode = ''' 11477382Sgblack@eecs.umich.edu vfpFlushToZero(Fpscr, FpOp1); 11487379Sgblack@eecs.umich.edu VfpSavedState state = prepVfpFpscr(Fpscr); 11497381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1)); 11507379Sgblack@eecs.umich.edu FpDest.uw = vfpFpSToFixed(FpOp1, false, false, imm); 11517381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest.uw)); 11527379Sgblack@eecs.umich.edu Fpscr = setVfpFpscr(Fpscr, state); 11537379Sgblack@eecs.umich.edu ''' 11547396Sgblack@eecs.umich.edu vcvtFpUFixedSIop = InstObjParams("vcvt", "VcvtFpUFixedS", "FpRegRegImmOp", 11557379Sgblack@eecs.umich.edu { "code": vcvtFpUFixedSCode, 11567379Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 11577396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vcvtFpUFixedSIop); 11587396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpUFixedSIop); 11597379Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpUFixedSIop); 11607379Sgblack@eecs.umich.edu 11617379Sgblack@eecs.umich.edu vcvtFpUFixedDCode = ''' 11627379Sgblack@eecs.umich.edu IntDoubleUnion cOp1; 11637379Sgblack@eecs.umich.edu cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 11647382Sgblack@eecs.umich.edu vfpFlushToZero(Fpscr, cOp1.fp); 11657379Sgblack@eecs.umich.edu VfpSavedState state = prepVfpFpscr(Fpscr); 11667381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp)); 11677379Sgblack@eecs.umich.edu uint64_t mid = vfpFpDToFixed(cOp1.fp, false, false, imm); 11687381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (mid)); 11697379Sgblack@eecs.umich.edu Fpscr = setVfpFpscr(Fpscr, state); 11707379Sgblack@eecs.umich.edu FpDestP0.uw = mid; 11717379Sgblack@eecs.umich.edu FpDestP1.uw = mid >> 32; 11727379Sgblack@eecs.umich.edu ''' 11737396Sgblack@eecs.umich.edu vcvtFpUFixedDIop = InstObjParams("vcvt", "VcvtFpUFixedD", "FpRegRegImmOp", 11747379Sgblack@eecs.umich.edu { "code": vcvtFpUFixedDCode, 11757379Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 11767396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vcvtFpUFixedDIop); 11777396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpUFixedDIop); 11787379Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpUFixedDIop); 11797379Sgblack@eecs.umich.edu 11807379Sgblack@eecs.umich.edu vcvtSFixedFpSCode = ''' 11817379Sgblack@eecs.umich.edu VfpSavedState state = prepVfpFpscr(Fpscr); 11827381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1.sw) : "m" (FpOp1.sw)); 11837386Sgblack@eecs.umich.edu FpDest = vfpSFixedToFpS(Fpscr, FpOp1.sw, false, imm); 11847381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest)); 11857379Sgblack@eecs.umich.edu Fpscr = setVfpFpscr(Fpscr, state); 11867379Sgblack@eecs.umich.edu ''' 11877396Sgblack@eecs.umich.edu vcvtSFixedFpSIop = InstObjParams("vcvt", "VcvtSFixedFpS", "FpRegRegImmOp", 11887379Sgblack@eecs.umich.edu { "code": vcvtSFixedFpSCode, 11897379Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 11907396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vcvtSFixedFpSIop); 11917396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vcvtSFixedFpSIop); 11927379Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtSFixedFpSIop); 11937379Sgblack@eecs.umich.edu 11947379Sgblack@eecs.umich.edu vcvtSFixedFpDCode = ''' 11957379Sgblack@eecs.umich.edu IntDoubleUnion cDest; 11967379Sgblack@eecs.umich.edu uint64_t mid = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 11977379Sgblack@eecs.umich.edu VfpSavedState state = prepVfpFpscr(Fpscr); 11987381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (mid) : "m" (mid)); 11997386Sgblack@eecs.umich.edu cDest.fp = vfpSFixedToFpD(Fpscr, mid, false, imm); 12007381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (cDest.fp)); 12017379Sgblack@eecs.umich.edu Fpscr = setVfpFpscr(Fpscr, state); 12027379Sgblack@eecs.umich.edu FpDestP0.uw = cDest.bits; 12037379Sgblack@eecs.umich.edu FpDestP1.uw = cDest.bits >> 32; 12047379Sgblack@eecs.umich.edu ''' 12057396Sgblack@eecs.umich.edu vcvtSFixedFpDIop = InstObjParams("vcvt", "VcvtSFixedFpD", "FpRegRegImmOp", 12067379Sgblack@eecs.umich.edu { "code": vcvtSFixedFpDCode, 12077379Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 12087396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vcvtSFixedFpDIop); 12097396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vcvtSFixedFpDIop); 12107379Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtSFixedFpDIop); 12117379Sgblack@eecs.umich.edu 12127379Sgblack@eecs.umich.edu vcvtUFixedFpSCode = ''' 12137379Sgblack@eecs.umich.edu VfpSavedState state = prepVfpFpscr(Fpscr); 12147381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1.uw) : "m" (FpOp1.uw)); 12157386Sgblack@eecs.umich.edu FpDest = vfpUFixedToFpS(Fpscr, FpOp1.uw, false, imm); 12167381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest)); 12177379Sgblack@eecs.umich.edu Fpscr = setVfpFpscr(Fpscr, state); 12187379Sgblack@eecs.umich.edu ''' 12197396Sgblack@eecs.umich.edu vcvtUFixedFpSIop = InstObjParams("vcvt", "VcvtUFixedFpS", "FpRegRegImmOp", 12207379Sgblack@eecs.umich.edu { "code": vcvtUFixedFpSCode, 12217379Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 12227396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vcvtUFixedFpSIop); 12237396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vcvtUFixedFpSIop); 12247379Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtUFixedFpSIop); 12257379Sgblack@eecs.umich.edu 12267379Sgblack@eecs.umich.edu vcvtUFixedFpDCode = ''' 12277379Sgblack@eecs.umich.edu IntDoubleUnion cDest; 12287379Sgblack@eecs.umich.edu uint64_t mid = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 12297379Sgblack@eecs.umich.edu VfpSavedState state = prepVfpFpscr(Fpscr); 12307381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (mid) : "m" (mid)); 12317386Sgblack@eecs.umich.edu cDest.fp = vfpUFixedToFpD(Fpscr, mid, false, imm); 12327381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (cDest.fp)); 12337379Sgblack@eecs.umich.edu Fpscr = setVfpFpscr(Fpscr, state); 12347379Sgblack@eecs.umich.edu FpDestP0.uw = cDest.bits; 12357379Sgblack@eecs.umich.edu FpDestP1.uw = cDest.bits >> 32; 12367379Sgblack@eecs.umich.edu ''' 12377396Sgblack@eecs.umich.edu vcvtUFixedFpDIop = InstObjParams("vcvt", "VcvtUFixedFpD", "FpRegRegImmOp", 12387379Sgblack@eecs.umich.edu { "code": vcvtUFixedFpDCode, 12397379Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 12407396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vcvtUFixedFpDIop); 12417396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vcvtUFixedFpDIop); 12427379Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtUFixedFpDIop); 12437379Sgblack@eecs.umich.edu 12447379Sgblack@eecs.umich.edu vcvtFpSHFixedSCode = ''' 12457382Sgblack@eecs.umich.edu vfpFlushToZero(Fpscr, FpOp1); 12467379Sgblack@eecs.umich.edu VfpSavedState state = prepVfpFpscr(Fpscr); 12477381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1)); 12487379Sgblack@eecs.umich.edu FpDest.sh = vfpFpSToFixed(FpOp1, true, true, imm); 12497381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest.sh)); 12507379Sgblack@eecs.umich.edu Fpscr = setVfpFpscr(Fpscr, state); 12517379Sgblack@eecs.umich.edu ''' 12527379Sgblack@eecs.umich.edu vcvtFpSHFixedSIop = InstObjParams("vcvt", "VcvtFpSHFixedS", 12537396Sgblack@eecs.umich.edu "FpRegRegImmOp", 12547379Sgblack@eecs.umich.edu { "code": vcvtFpSHFixedSCode, 12557379Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 12567396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vcvtFpSHFixedSIop); 12577396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpSHFixedSIop); 12587379Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpSHFixedSIop); 12597379Sgblack@eecs.umich.edu 12607379Sgblack@eecs.umich.edu vcvtFpSHFixedDCode = ''' 12617379Sgblack@eecs.umich.edu IntDoubleUnion cOp1; 12627379Sgblack@eecs.umich.edu cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 12637382Sgblack@eecs.umich.edu vfpFlushToZero(Fpscr, cOp1.fp); 12647379Sgblack@eecs.umich.edu VfpSavedState state = prepVfpFpscr(Fpscr); 12657381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp)); 12667379Sgblack@eecs.umich.edu uint64_t result = vfpFpDToFixed(cOp1.fp, true, true, imm); 12677381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (result)); 12687379Sgblack@eecs.umich.edu Fpscr = setVfpFpscr(Fpscr, state); 12697379Sgblack@eecs.umich.edu FpDestP0.uw = result; 12707379Sgblack@eecs.umich.edu FpDestP1.uw = result >> 32; 12717379Sgblack@eecs.umich.edu ''' 12727379Sgblack@eecs.umich.edu vcvtFpSHFixedDIop = InstObjParams("vcvt", "VcvtFpSHFixedD", 12737396Sgblack@eecs.umich.edu "FpRegRegImmOp", 12747379Sgblack@eecs.umich.edu { "code": vcvtFpSHFixedDCode, 12757379Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 12767396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vcvtFpSHFixedDIop); 12777396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpSHFixedDIop); 12787379Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpSHFixedDIop); 12797379Sgblack@eecs.umich.edu 12807379Sgblack@eecs.umich.edu vcvtFpUHFixedSCode = ''' 12817382Sgblack@eecs.umich.edu vfpFlushToZero(Fpscr, FpOp1); 12827379Sgblack@eecs.umich.edu VfpSavedState state = prepVfpFpscr(Fpscr); 12837381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1)); 12847379Sgblack@eecs.umich.edu FpDest.uh = vfpFpSToFixed(FpOp1, false, true, imm); 12857381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest.uh)); 12867379Sgblack@eecs.umich.edu Fpscr = setVfpFpscr(Fpscr, state); 12877379Sgblack@eecs.umich.edu ''' 12887379Sgblack@eecs.umich.edu vcvtFpUHFixedSIop = InstObjParams("vcvt", "VcvtFpUHFixedS", 12897396Sgblack@eecs.umich.edu "FpRegRegImmOp", 12907379Sgblack@eecs.umich.edu { "code": vcvtFpUHFixedSCode, 12917379Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 12927396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vcvtFpUHFixedSIop); 12937396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpUHFixedSIop); 12947379Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpUHFixedSIop); 12957379Sgblack@eecs.umich.edu 12967379Sgblack@eecs.umich.edu vcvtFpUHFixedDCode = ''' 12977379Sgblack@eecs.umich.edu IntDoubleUnion cOp1; 12987379Sgblack@eecs.umich.edu cOp1.bits = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 12997382Sgblack@eecs.umich.edu vfpFlushToZero(Fpscr, cOp1.fp); 13007379Sgblack@eecs.umich.edu VfpSavedState state = prepVfpFpscr(Fpscr); 13017381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (cOp1.fp) : "m" (cOp1.fp)); 13027379Sgblack@eecs.umich.edu uint64_t mid = vfpFpDToFixed(cOp1.fp, false, true, imm); 13037381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (mid)); 13047379Sgblack@eecs.umich.edu Fpscr = setVfpFpscr(Fpscr, state); 13057379Sgblack@eecs.umich.edu FpDestP0.uw = mid; 13067379Sgblack@eecs.umich.edu FpDestP1.uw = mid >> 32; 13077379Sgblack@eecs.umich.edu ''' 13087379Sgblack@eecs.umich.edu vcvtFpUHFixedDIop = InstObjParams("vcvt", "VcvtFpUHFixedD", 13097396Sgblack@eecs.umich.edu "FpRegRegImmOp", 13107379Sgblack@eecs.umich.edu { "code": vcvtFpUHFixedDCode, 13117379Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 13127396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vcvtFpUHFixedDIop); 13137396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpUHFixedDIop); 13147379Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpUHFixedDIop); 13157379Sgblack@eecs.umich.edu 13167379Sgblack@eecs.umich.edu vcvtSHFixedFpSCode = ''' 13177379Sgblack@eecs.umich.edu VfpSavedState state = prepVfpFpscr(Fpscr); 13187381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1.sh) : "m" (FpOp1.sh)); 13197386Sgblack@eecs.umich.edu FpDest = vfpSFixedToFpS(Fpscr, FpOp1.sh, true, imm); 13207381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest)); 13217379Sgblack@eecs.umich.edu Fpscr = setVfpFpscr(Fpscr, state); 13227379Sgblack@eecs.umich.edu ''' 13237379Sgblack@eecs.umich.edu vcvtSHFixedFpSIop = InstObjParams("vcvt", "VcvtSHFixedFpS", 13247396Sgblack@eecs.umich.edu "FpRegRegImmOp", 13257379Sgblack@eecs.umich.edu { "code": vcvtSHFixedFpSCode, 13267379Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 13277396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vcvtSHFixedFpSIop); 13287396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vcvtSHFixedFpSIop); 13297379Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtSHFixedFpSIop); 13307379Sgblack@eecs.umich.edu 13317379Sgblack@eecs.umich.edu vcvtSHFixedFpDCode = ''' 13327379Sgblack@eecs.umich.edu IntDoubleUnion cDest; 13337379Sgblack@eecs.umich.edu uint64_t mid = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 13347379Sgblack@eecs.umich.edu VfpSavedState state = prepVfpFpscr(Fpscr); 13357381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (mid) : "m" (mid)); 13367386Sgblack@eecs.umich.edu cDest.fp = vfpSFixedToFpD(Fpscr, mid, true, imm); 13377381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (cDest.fp)); 13387379Sgblack@eecs.umich.edu Fpscr = setVfpFpscr(Fpscr, state); 13397379Sgblack@eecs.umich.edu FpDestP0.uw = cDest.bits; 13407379Sgblack@eecs.umich.edu FpDestP1.uw = cDest.bits >> 32; 13417379Sgblack@eecs.umich.edu ''' 13427379Sgblack@eecs.umich.edu vcvtSHFixedFpDIop = InstObjParams("vcvt", "VcvtSHFixedFpD", 13437396Sgblack@eecs.umich.edu "FpRegRegImmOp", 13447379Sgblack@eecs.umich.edu { "code": vcvtSHFixedFpDCode, 13457379Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 13467396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vcvtSHFixedFpDIop); 13477396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vcvtSHFixedFpDIop); 13487379Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtSHFixedFpDIop); 13497379Sgblack@eecs.umich.edu 13507379Sgblack@eecs.umich.edu vcvtUHFixedFpSCode = ''' 13517379Sgblack@eecs.umich.edu VfpSavedState state = prepVfpFpscr(Fpscr); 13527381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1.uh) : "m" (FpOp1.uh)); 13537386Sgblack@eecs.umich.edu FpDest = vfpUFixedToFpS(Fpscr, FpOp1.uh, true, imm); 13547381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest)); 13557379Sgblack@eecs.umich.edu Fpscr = setVfpFpscr(Fpscr, state); 13567379Sgblack@eecs.umich.edu ''' 13577379Sgblack@eecs.umich.edu vcvtUHFixedFpSIop = InstObjParams("vcvt", "VcvtUHFixedFpS", 13587396Sgblack@eecs.umich.edu "FpRegRegImmOp", 13597379Sgblack@eecs.umich.edu { "code": vcvtUHFixedFpSCode, 13607379Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 13617396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vcvtUHFixedFpSIop); 13627396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vcvtUHFixedFpSIop); 13637379Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtUHFixedFpSIop); 13647379Sgblack@eecs.umich.edu 13657379Sgblack@eecs.umich.edu vcvtUHFixedFpDCode = ''' 13667379Sgblack@eecs.umich.edu IntDoubleUnion cDest; 13677379Sgblack@eecs.umich.edu uint64_t mid = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 13687379Sgblack@eecs.umich.edu VfpSavedState state = prepVfpFpscr(Fpscr); 13697381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (mid) : "m" (mid)); 13707386Sgblack@eecs.umich.edu cDest.fp = vfpUFixedToFpD(Fpscr, mid, true, imm); 13717381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (cDest.fp)); 13727379Sgblack@eecs.umich.edu Fpscr = setVfpFpscr(Fpscr, state); 13737379Sgblack@eecs.umich.edu FpDestP0.uw = cDest.bits; 13747379Sgblack@eecs.umich.edu FpDestP1.uw = cDest.bits >> 32; 13757379Sgblack@eecs.umich.edu ''' 13767379Sgblack@eecs.umich.edu vcvtUHFixedFpDIop = InstObjParams("vcvt", "VcvtUHFixedFpD", 13777396Sgblack@eecs.umich.edu "FpRegRegImmOp", 13787379Sgblack@eecs.umich.edu { "code": vcvtUHFixedFpDCode, 13797379Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 13807396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vcvtUHFixedFpDIop); 13817396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vcvtUHFixedFpDIop); 13827379Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtUHFixedFpDIop); 13837379Sgblack@eecs.umich.edu}}; 1384