fp.isa revision 7639
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 = ''' 2857639Sgblack@eecs.umich.edu FpDest.uw = insertBits(FpDest.uw, imm * 8 + 7, imm * 8, 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 = ''' 2957639Sgblack@eecs.umich.edu FpDest.uw = insertBits(FpDest.uw, imm * 16 + 15, imm * 16, 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 = ''' 3157639Sgblack@eecs.umich.edu assert(imm < 4); 3167639Sgblack@eecs.umich.edu Dest = bits(FpOp1.uw, imm * 8 + 7, imm * 8); 3177333Sgblack@eecs.umich.edu ''' 3187396Sgblack@eecs.umich.edu vmovRegCoreUBIop = InstObjParams("vmov", "VmovRegCoreUB", "FpRegRegImmOp", 3197333Sgblack@eecs.umich.edu { "code": vmovRegCoreUBCode, 3207333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 3217396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vmovRegCoreUBIop); 3227396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vmovRegCoreUBIop); 3237333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovRegCoreUBIop); 3247333Sgblack@eecs.umich.edu 3257333Sgblack@eecs.umich.edu vmovRegCoreUHCode = ''' 3267639Sgblack@eecs.umich.edu assert(imm < 2); 3277639Sgblack@eecs.umich.edu Dest = bits(FpOp1.uw, imm * 16 + 15, imm * 16); 3287333Sgblack@eecs.umich.edu ''' 3297396Sgblack@eecs.umich.edu vmovRegCoreUHIop = InstObjParams("vmov", "VmovRegCoreUH", "FpRegRegImmOp", 3307333Sgblack@eecs.umich.edu { "code": vmovRegCoreUHCode, 3317333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 3327396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vmovRegCoreUHIop); 3337396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vmovRegCoreUHIop); 3347333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovRegCoreUHIop); 3357333Sgblack@eecs.umich.edu 3367333Sgblack@eecs.umich.edu vmovRegCoreSBCode = ''' 3377639Sgblack@eecs.umich.edu assert(imm < 4); 3387639Sgblack@eecs.umich.edu Dest = sext<8>(bits(FpOp1.uw, imm * 8 + 7, imm * 8)); 3397333Sgblack@eecs.umich.edu ''' 3407396Sgblack@eecs.umich.edu vmovRegCoreSBIop = InstObjParams("vmov", "VmovRegCoreSB", "FpRegRegImmOp", 3417333Sgblack@eecs.umich.edu { "code": vmovRegCoreSBCode, 3427333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 3437396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vmovRegCoreSBIop); 3447396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vmovRegCoreSBIop); 3457333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovRegCoreSBIop); 3467333Sgblack@eecs.umich.edu 3477333Sgblack@eecs.umich.edu vmovRegCoreSHCode = ''' 3487639Sgblack@eecs.umich.edu assert(imm < 2); 3497639Sgblack@eecs.umich.edu Dest = sext<16>(bits(FpOp1.uw, imm * 16 + 15, imm * 16)); 3507333Sgblack@eecs.umich.edu ''' 3517396Sgblack@eecs.umich.edu vmovRegCoreSHIop = InstObjParams("vmov", "VmovRegCoreSH", "FpRegRegImmOp", 3527333Sgblack@eecs.umich.edu { "code": vmovRegCoreSHCode, 3537333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 3547396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vmovRegCoreSHIop); 3557396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vmovRegCoreSHIop); 3567333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovRegCoreSHIop); 3577333Sgblack@eecs.umich.edu 3587333Sgblack@eecs.umich.edu vmovRegCoreWCode = ''' 3597333Sgblack@eecs.umich.edu Dest = FpOp1.uw; 3607333Sgblack@eecs.umich.edu ''' 3617396Sgblack@eecs.umich.edu vmovRegCoreWIop = InstObjParams("vmov", "VmovRegCoreW", "FpRegRegOp", 3627333Sgblack@eecs.umich.edu { "code": vmovRegCoreWCode, 3637333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 3647396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vmovRegCoreWIop); 3657396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vmovRegCoreWIop); 3667333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmovRegCoreWIop); 3677333Sgblack@eecs.umich.edu 3687333Sgblack@eecs.umich.edu vmov2Reg2CoreCode = ''' 3697333Sgblack@eecs.umich.edu FpDestP0.uw = Op1.uw; 3707333Sgblack@eecs.umich.edu FpDestP1.uw = Op2.uw; 3717333Sgblack@eecs.umich.edu ''' 3727396Sgblack@eecs.umich.edu vmov2Reg2CoreIop = InstObjParams("vmov", "Vmov2Reg2Core", "FpRegRegRegOp", 3737333Sgblack@eecs.umich.edu { "code": vmov2Reg2CoreCode, 3747333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 3757396Sgblack@eecs.umich.edu header_output += FpRegRegRegOpDeclare.subst(vmov2Reg2CoreIop); 3767396Sgblack@eecs.umich.edu decoder_output += FpRegRegRegOpConstructor.subst(vmov2Reg2CoreIop); 3777333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmov2Reg2CoreIop); 3787333Sgblack@eecs.umich.edu 3797333Sgblack@eecs.umich.edu vmov2Core2RegCode = ''' 3807333Sgblack@eecs.umich.edu Dest.uw = FpOp2P0.uw; 3817333Sgblack@eecs.umich.edu Op1.uw = FpOp2P1.uw; 3827333Sgblack@eecs.umich.edu ''' 3837396Sgblack@eecs.umich.edu vmov2Core2RegIop = InstObjParams("vmov", "Vmov2Core2Reg", "FpRegRegRegOp", 3847333Sgblack@eecs.umich.edu { "code": vmov2Core2RegCode, 3857333Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 3867396Sgblack@eecs.umich.edu header_output += FpRegRegRegOpDeclare.subst(vmov2Core2RegIop); 3877396Sgblack@eecs.umich.edu decoder_output += FpRegRegRegOpConstructor.subst(vmov2Core2RegIop); 3887333Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmov2Core2RegIop); 3897381Sgblack@eecs.umich.edu}}; 3907381Sgblack@eecs.umich.edu 3917381Sgblack@eecs.umich.edulet {{ 3927381Sgblack@eecs.umich.edu 3937381Sgblack@eecs.umich.edu header_output = "" 3947381Sgblack@eecs.umich.edu decoder_output = "" 3957381Sgblack@eecs.umich.edu exec_output = "" 3967364Sgblack@eecs.umich.edu 3977396Sgblack@eecs.umich.edu singleCode = ''' 3987396Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 3997396Sgblack@eecs.umich.edu FpDest = %(op)s; 4007396Sgblack@eecs.umich.edu Fpscr = fpscr; 4017364Sgblack@eecs.umich.edu ''' 4027396Sgblack@eecs.umich.edu singleBinOp = "binaryOp(fpscr, FpOp1, FpOp2," + \ 4037639Sgblack@eecs.umich.edu "%(func)s, fpscr.fz, fpscr.dn, fpscr.rMode)" 4047396Sgblack@eecs.umich.edu singleUnaryOp = "unaryOp(fpscr, FpOp1, %(func)s, fpscr.fz, fpscr.rMode)" 4057396Sgblack@eecs.umich.edu doubleCode = ''' 4067396Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 4077396Sgblack@eecs.umich.edu double dest = %(op)s; 4087396Sgblack@eecs.umich.edu Fpscr = fpscr; 4097396Sgblack@eecs.umich.edu FpDestP0.uw = dblLow(dest); 4107396Sgblack@eecs.umich.edu FpDestP1.uw = dblHi(dest); 4117396Sgblack@eecs.umich.edu ''' 4127396Sgblack@eecs.umich.edu doubleBinOp = ''' 4137396Sgblack@eecs.umich.edu binaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw), 4147396Sgblack@eecs.umich.edu dbl(FpOp2P0.uw, FpOp2P1.uw), 4157639Sgblack@eecs.umich.edu %(func)s, fpscr.fz, fpscr.dn, fpscr.rMode); 4167396Sgblack@eecs.umich.edu ''' 4177396Sgblack@eecs.umich.edu doubleUnaryOp = ''' 4187396Sgblack@eecs.umich.edu unaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw), %(func)s, 4197396Sgblack@eecs.umich.edu fpscr.fz, fpscr.rMode) 4207396Sgblack@eecs.umich.edu ''' 4217364Sgblack@eecs.umich.edu 4227396Sgblack@eecs.umich.edu def buildBinFpOp(name, Name, base, singleOp, doubleOp): 4237396Sgblack@eecs.umich.edu global header_output, decoder_output, exec_output 4247365Sgblack@eecs.umich.edu 4257396Sgblack@eecs.umich.edu code = singleCode % { "op": singleBinOp } 4267396Sgblack@eecs.umich.edu code = code % { "func": singleOp } 4277396Sgblack@eecs.umich.edu sIop = InstObjParams(name + "s", Name + "S", base, 4287396Sgblack@eecs.umich.edu { "code": code, "predicate_test": predicateTest }, []) 4297396Sgblack@eecs.umich.edu code = doubleCode % { "op": doubleBinOp } 4307396Sgblack@eecs.umich.edu code = code % { "func": doubleOp } 4317396Sgblack@eecs.umich.edu dIop = InstObjParams(name + "d", Name + "D", base, 4327396Sgblack@eecs.umich.edu { "code": code, "predicate_test": predicateTest }, []) 4337365Sgblack@eecs.umich.edu 4347396Sgblack@eecs.umich.edu declareTempl = eval(base + "Declare"); 4357396Sgblack@eecs.umich.edu constructorTempl = eval(base + "Constructor"); 4367366Sgblack@eecs.umich.edu 4377396Sgblack@eecs.umich.edu for iop in sIop, dIop: 4387396Sgblack@eecs.umich.edu header_output += declareTempl.subst(iop) 4397396Sgblack@eecs.umich.edu decoder_output += constructorTempl.subst(iop) 4407396Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(iop) 4417366Sgblack@eecs.umich.edu 4427396Sgblack@eecs.umich.edu buildBinFpOp("vadd", "Vadd", "FpRegRegRegOp", "fpAddS", "fpAddD") 4437396Sgblack@eecs.umich.edu buildBinFpOp("vsub", "Vsub", "FpRegRegRegOp", "fpSubS", "fpSubD") 4447396Sgblack@eecs.umich.edu buildBinFpOp("vdiv", "Vdiv", "FpRegRegRegOp", "fpDivS", "fpDivD") 4457396Sgblack@eecs.umich.edu buildBinFpOp("vmul", "Vmul", "FpRegRegRegOp", "fpMulS", "fpMulD") 4467367Sgblack@eecs.umich.edu 4477396Sgblack@eecs.umich.edu def buildUnaryFpOp(name, Name, base, singleOp, doubleOp = None): 4487396Sgblack@eecs.umich.edu if doubleOp is None: 4497396Sgblack@eecs.umich.edu doubleOp = singleOp 4507396Sgblack@eecs.umich.edu global header_output, decoder_output, exec_output 4517367Sgblack@eecs.umich.edu 4527396Sgblack@eecs.umich.edu code = singleCode % { "op": singleUnaryOp } 4537396Sgblack@eecs.umich.edu code = code % { "func": singleOp } 4547396Sgblack@eecs.umich.edu sIop = InstObjParams(name + "s", Name + "S", base, 4557396Sgblack@eecs.umich.edu { "code": code, "predicate_test": predicateTest }, []) 4567396Sgblack@eecs.umich.edu code = doubleCode % { "op": doubleUnaryOp } 4577396Sgblack@eecs.umich.edu code = code % { "func": doubleOp } 4587396Sgblack@eecs.umich.edu dIop = InstObjParams(name + "d", Name + "D", base, 4597396Sgblack@eecs.umich.edu { "code": code, "predicate_test": predicateTest }, []) 4607368Sgblack@eecs.umich.edu 4617396Sgblack@eecs.umich.edu declareTempl = eval(base + "Declare"); 4627396Sgblack@eecs.umich.edu constructorTempl = eval(base + "Constructor"); 4637368Sgblack@eecs.umich.edu 4647396Sgblack@eecs.umich.edu for iop in sIop, dIop: 4657396Sgblack@eecs.umich.edu header_output += declareTempl.subst(iop) 4667396Sgblack@eecs.umich.edu decoder_output += constructorTempl.subst(iop) 4677396Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(iop) 4687369Sgblack@eecs.umich.edu 4697396Sgblack@eecs.umich.edu buildUnaryFpOp("vsqrt", "Vsqrt", "FpRegRegOp", "sqrtf", "sqrt") 4707369Sgblack@eecs.umich.edu 4717396Sgblack@eecs.umich.edu def buildSimpleUnaryFpOp(name, Name, base, singleOp, doubleOp = None): 4727396Sgblack@eecs.umich.edu if doubleOp is None: 4737396Sgblack@eecs.umich.edu doubleOp = singleOp 4747396Sgblack@eecs.umich.edu global header_output, decoder_output, exec_output 4757369Sgblack@eecs.umich.edu 4767396Sgblack@eecs.umich.edu sIop = InstObjParams(name + "s", Name + "S", base, 4777396Sgblack@eecs.umich.edu { "code": singleCode % { "op": singleOp }, 4787396Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 4797396Sgblack@eecs.umich.edu dIop = InstObjParams(name + "d", Name + "D", base, 4807396Sgblack@eecs.umich.edu { "code": doubleCode % { "op": doubleOp }, 4817396Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 4827369Sgblack@eecs.umich.edu 4837396Sgblack@eecs.umich.edu declareTempl = eval(base + "Declare"); 4847396Sgblack@eecs.umich.edu constructorTempl = eval(base + "Constructor"); 4857396Sgblack@eecs.umich.edu 4867396Sgblack@eecs.umich.edu for iop in sIop, dIop: 4877396Sgblack@eecs.umich.edu header_output += declareTempl.subst(iop) 4887396Sgblack@eecs.umich.edu decoder_output += constructorTempl.subst(iop) 4897396Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(iop) 4907396Sgblack@eecs.umich.edu 4917396Sgblack@eecs.umich.edu buildSimpleUnaryFpOp("vneg", "Vneg", "FpRegRegOp", 4927396Sgblack@eecs.umich.edu "-FpOp1", "-dbl(FpOp1P0.uw, FpOp1P1.uw)") 4937396Sgblack@eecs.umich.edu buildSimpleUnaryFpOp("vabs", "Vabs", "FpRegRegOp", 4947396Sgblack@eecs.umich.edu "fabsf(FpOp1)", "fabs(dbl(FpOp1P0.uw, FpOp1P1.uw))") 4957381Sgblack@eecs.umich.edu}}; 4967381Sgblack@eecs.umich.edu 4977381Sgblack@eecs.umich.edulet {{ 4987381Sgblack@eecs.umich.edu 4997381Sgblack@eecs.umich.edu header_output = "" 5007381Sgblack@eecs.umich.edu decoder_output = "" 5017381Sgblack@eecs.umich.edu exec_output = "" 5027370Sgblack@eecs.umich.edu 5037370Sgblack@eecs.umich.edu vmlaSCode = ''' 5047396Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 5057396Sgblack@eecs.umich.edu float mid = binaryOp(fpscr, FpOp1, FpOp2, 5067639Sgblack@eecs.umich.edu fpMulS, fpscr.fz, fpscr.dn, fpscr.rMode); 5077639Sgblack@eecs.umich.edu FpDest = binaryOp(fpscr, FpDest, mid, fpAddS, 5087639Sgblack@eecs.umich.edu fpscr.fz, fpscr.dn, fpscr.rMode); 5097396Sgblack@eecs.umich.edu Fpscr = fpscr; 5107370Sgblack@eecs.umich.edu ''' 5117396Sgblack@eecs.umich.edu vmlaSIop = InstObjParams("vmlas", "VmlaS", "FpRegRegRegOp", 5127370Sgblack@eecs.umich.edu { "code": vmlaSCode, 5137370Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 5147396Sgblack@eecs.umich.edu header_output += FpRegRegRegOpDeclare.subst(vmlaSIop); 5157396Sgblack@eecs.umich.edu decoder_output += FpRegRegRegOpConstructor.subst(vmlaSIop); 5167370Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmlaSIop); 5177370Sgblack@eecs.umich.edu 5187370Sgblack@eecs.umich.edu vmlaDCode = ''' 5197396Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 5207396Sgblack@eecs.umich.edu double mid = binaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw), 5217396Sgblack@eecs.umich.edu dbl(FpOp2P0.uw, FpOp2P1.uw), 5227639Sgblack@eecs.umich.edu fpMulD, fpscr.fz, fpscr.dn, fpscr.rMode); 5237396Sgblack@eecs.umich.edu double dest = binaryOp(fpscr, dbl(FpDestP0.uw, FpDestP1.uw), 5247639Sgblack@eecs.umich.edu mid, fpAddD, fpscr.fz, 5257639Sgblack@eecs.umich.edu fpscr.dn, fpscr.rMode); 5267396Sgblack@eecs.umich.edu Fpscr = fpscr; 5277396Sgblack@eecs.umich.edu FpDestP0.uw = dblLow(dest); 5287396Sgblack@eecs.umich.edu FpDestP1.uw = dblHi(dest); 5297370Sgblack@eecs.umich.edu ''' 5307396Sgblack@eecs.umich.edu vmlaDIop = InstObjParams("vmlad", "VmlaD", "FpRegRegRegOp", 5317370Sgblack@eecs.umich.edu { "code": vmlaDCode, 5327370Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 5337396Sgblack@eecs.umich.edu header_output += FpRegRegRegOpDeclare.subst(vmlaDIop); 5347396Sgblack@eecs.umich.edu decoder_output += FpRegRegRegOpConstructor.subst(vmlaDIop); 5357370Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmlaDIop); 5367370Sgblack@eecs.umich.edu 5377370Sgblack@eecs.umich.edu vmlsSCode = ''' 5387396Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 5397396Sgblack@eecs.umich.edu float mid = binaryOp(fpscr, FpOp1, FpOp2, 5407639Sgblack@eecs.umich.edu fpMulS, fpscr.fz, fpscr.dn, fpscr.rMode); 5417639Sgblack@eecs.umich.edu FpDest = binaryOp(fpscr, FpDest, -mid, fpAddS, 5427639Sgblack@eecs.umich.edu fpscr.fz, fpscr.dn, fpscr.rMode); 5437396Sgblack@eecs.umich.edu Fpscr = fpscr; 5447370Sgblack@eecs.umich.edu ''' 5457396Sgblack@eecs.umich.edu vmlsSIop = InstObjParams("vmlss", "VmlsS", "FpRegRegRegOp", 5467370Sgblack@eecs.umich.edu { "code": vmlsSCode, 5477370Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 5487396Sgblack@eecs.umich.edu header_output += FpRegRegRegOpDeclare.subst(vmlsSIop); 5497396Sgblack@eecs.umich.edu decoder_output += FpRegRegRegOpConstructor.subst(vmlsSIop); 5507370Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmlsSIop); 5517370Sgblack@eecs.umich.edu 5527370Sgblack@eecs.umich.edu vmlsDCode = ''' 5537396Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 5547396Sgblack@eecs.umich.edu double mid = binaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw), 5557396Sgblack@eecs.umich.edu dbl(FpOp2P0.uw, FpOp2P1.uw), 5567639Sgblack@eecs.umich.edu fpMulD, fpscr.fz, fpscr.dn, fpscr.rMode); 5577396Sgblack@eecs.umich.edu double dest = binaryOp(fpscr, dbl(FpDestP0.uw, FpDestP1.uw), 5587639Sgblack@eecs.umich.edu -mid, fpAddD, fpscr.fz, 5597639Sgblack@eecs.umich.edu fpscr.dn, fpscr.rMode); 5607396Sgblack@eecs.umich.edu Fpscr = fpscr; 5617396Sgblack@eecs.umich.edu FpDestP0.uw = dblLow(dest); 5627396Sgblack@eecs.umich.edu FpDestP1.uw = dblHi(dest); 5637370Sgblack@eecs.umich.edu ''' 5647396Sgblack@eecs.umich.edu vmlsDIop = InstObjParams("vmlsd", "VmlsD", "FpRegRegRegOp", 5657370Sgblack@eecs.umich.edu { "code": vmlsDCode, 5667370Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 5677396Sgblack@eecs.umich.edu header_output += FpRegRegRegOpDeclare.subst(vmlsDIop); 5687396Sgblack@eecs.umich.edu decoder_output += FpRegRegRegOpConstructor.subst(vmlsDIop); 5697370Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vmlsDIop); 5707371Sgblack@eecs.umich.edu 5717371Sgblack@eecs.umich.edu vnmlaSCode = ''' 5727396Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 5737396Sgblack@eecs.umich.edu float mid = binaryOp(fpscr, FpOp1, FpOp2, 5747639Sgblack@eecs.umich.edu fpMulS, fpscr.fz, fpscr.dn, fpscr.rMode); 5757639Sgblack@eecs.umich.edu FpDest = binaryOp(fpscr, -FpDest, -mid, fpAddS, 5767639Sgblack@eecs.umich.edu fpscr.fz, fpscr.dn, fpscr.rMode); 5777396Sgblack@eecs.umich.edu Fpscr = fpscr; 5787371Sgblack@eecs.umich.edu ''' 5797396Sgblack@eecs.umich.edu vnmlaSIop = InstObjParams("vnmlas", "VnmlaS", "FpRegRegRegOp", 5807371Sgblack@eecs.umich.edu { "code": vnmlaSCode, 5817371Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 5827396Sgblack@eecs.umich.edu header_output += FpRegRegRegOpDeclare.subst(vnmlaSIop); 5837396Sgblack@eecs.umich.edu decoder_output += FpRegRegRegOpConstructor.subst(vnmlaSIop); 5847371Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vnmlaSIop); 5857371Sgblack@eecs.umich.edu 5867371Sgblack@eecs.umich.edu vnmlaDCode = ''' 5877396Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 5887396Sgblack@eecs.umich.edu double mid = binaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw), 5897396Sgblack@eecs.umich.edu dbl(FpOp2P0.uw, FpOp2P1.uw), 5907639Sgblack@eecs.umich.edu fpMulD, fpscr.fz, fpscr.dn, fpscr.rMode); 5917396Sgblack@eecs.umich.edu double dest = binaryOp(fpscr, -dbl(FpDestP0.uw, FpDestP1.uw), 5927639Sgblack@eecs.umich.edu -mid, fpAddD, fpscr.fz, 5937639Sgblack@eecs.umich.edu fpscr.dn, fpscr.rMode); 5947396Sgblack@eecs.umich.edu Fpscr = fpscr; 5957396Sgblack@eecs.umich.edu FpDestP0.uw = dblLow(dest); 5967396Sgblack@eecs.umich.edu FpDestP1.uw = dblHi(dest); 5977371Sgblack@eecs.umich.edu ''' 5987396Sgblack@eecs.umich.edu vnmlaDIop = InstObjParams("vnmlad", "VnmlaD", "FpRegRegRegOp", 5997371Sgblack@eecs.umich.edu { "code": vnmlaDCode, 6007371Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 6017396Sgblack@eecs.umich.edu header_output += FpRegRegRegOpDeclare.subst(vnmlaDIop); 6027396Sgblack@eecs.umich.edu decoder_output += FpRegRegRegOpConstructor.subst(vnmlaDIop); 6037371Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vnmlaDIop); 6047371Sgblack@eecs.umich.edu 6057371Sgblack@eecs.umich.edu vnmlsSCode = ''' 6067396Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 6077396Sgblack@eecs.umich.edu float mid = binaryOp(fpscr, FpOp1, FpOp2, 6087639Sgblack@eecs.umich.edu fpMulS, fpscr.fz, fpscr.dn, fpscr.rMode); 6097639Sgblack@eecs.umich.edu FpDest = binaryOp(fpscr, -FpDest, mid, fpAddS, 6107639Sgblack@eecs.umich.edu fpscr.fz, fpscr.dn, fpscr.rMode); 6117396Sgblack@eecs.umich.edu Fpscr = fpscr; 6127371Sgblack@eecs.umich.edu ''' 6137396Sgblack@eecs.umich.edu vnmlsSIop = InstObjParams("vnmlss", "VnmlsS", "FpRegRegRegOp", 6147371Sgblack@eecs.umich.edu { "code": vnmlsSCode, 6157371Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 6167396Sgblack@eecs.umich.edu header_output += FpRegRegRegOpDeclare.subst(vnmlsSIop); 6177396Sgblack@eecs.umich.edu decoder_output += FpRegRegRegOpConstructor.subst(vnmlsSIop); 6187371Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vnmlsSIop); 6197371Sgblack@eecs.umich.edu 6207371Sgblack@eecs.umich.edu vnmlsDCode = ''' 6217396Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 6227396Sgblack@eecs.umich.edu double mid = binaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw), 6237396Sgblack@eecs.umich.edu dbl(FpOp2P0.uw, FpOp2P1.uw), 6247639Sgblack@eecs.umich.edu fpMulD, fpscr.fz, fpscr.dn, fpscr.rMode); 6257396Sgblack@eecs.umich.edu double dest = binaryOp(fpscr, -dbl(FpDestP0.uw, FpDestP1.uw), 6267639Sgblack@eecs.umich.edu mid, fpAddD, fpscr.fz, 6277639Sgblack@eecs.umich.edu fpscr.dn, fpscr.rMode); 6287396Sgblack@eecs.umich.edu Fpscr = fpscr; 6297396Sgblack@eecs.umich.edu FpDestP0.uw = dblLow(dest); 6307396Sgblack@eecs.umich.edu FpDestP1.uw = dblHi(dest); 6317371Sgblack@eecs.umich.edu ''' 6327396Sgblack@eecs.umich.edu vnmlsDIop = InstObjParams("vnmlsd", "VnmlsD", "FpRegRegRegOp", 6337371Sgblack@eecs.umich.edu { "code": vnmlsDCode, 6347371Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 6357396Sgblack@eecs.umich.edu header_output += FpRegRegRegOpDeclare.subst(vnmlsDIop); 6367396Sgblack@eecs.umich.edu decoder_output += FpRegRegRegOpConstructor.subst(vnmlsDIop); 6377371Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vnmlsDIop); 6387371Sgblack@eecs.umich.edu 6397371Sgblack@eecs.umich.edu vnmulSCode = ''' 6407396Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 6417639Sgblack@eecs.umich.edu FpDest = -binaryOp(fpscr, FpOp1, FpOp2, fpMulS, 6427639Sgblack@eecs.umich.edu fpscr.fz, fpscr.dn, fpscr.rMode); 6437396Sgblack@eecs.umich.edu Fpscr = fpscr; 6447371Sgblack@eecs.umich.edu ''' 6457396Sgblack@eecs.umich.edu vnmulSIop = InstObjParams("vnmuls", "VnmulS", "FpRegRegRegOp", 6467371Sgblack@eecs.umich.edu { "code": vnmulSCode, 6477371Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 6487396Sgblack@eecs.umich.edu header_output += FpRegRegRegOpDeclare.subst(vnmulSIop); 6497396Sgblack@eecs.umich.edu decoder_output += FpRegRegRegOpConstructor.subst(vnmulSIop); 6507371Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vnmulSIop); 6517371Sgblack@eecs.umich.edu 6527371Sgblack@eecs.umich.edu vnmulDCode = ''' 6537396Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 6547396Sgblack@eecs.umich.edu double dest = -binaryOp(fpscr, dbl(FpOp1P0.uw, FpOp1P1.uw), 6557396Sgblack@eecs.umich.edu dbl(FpOp2P0.uw, FpOp2P1.uw), 6567639Sgblack@eecs.umich.edu fpMulD, fpscr.fz, fpscr.dn, 6577639Sgblack@eecs.umich.edu fpscr.rMode); 6587396Sgblack@eecs.umich.edu Fpscr = fpscr; 6597396Sgblack@eecs.umich.edu FpDestP0.uw = dblLow(dest); 6607396Sgblack@eecs.umich.edu FpDestP1.uw = dblHi(dest); 6617371Sgblack@eecs.umich.edu ''' 6627396Sgblack@eecs.umich.edu vnmulDIop = InstObjParams("vnmuld", "VnmulD", "FpRegRegRegOp", 6637371Sgblack@eecs.umich.edu { "code": vnmulDCode, 6647371Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 6657396Sgblack@eecs.umich.edu header_output += FpRegRegRegOpDeclare.subst(vnmulDIop); 6667396Sgblack@eecs.umich.edu decoder_output += FpRegRegRegOpConstructor.subst(vnmulDIop); 6677371Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vnmulDIop); 6687381Sgblack@eecs.umich.edu}}; 6697381Sgblack@eecs.umich.edu 6707381Sgblack@eecs.umich.edulet {{ 6717381Sgblack@eecs.umich.edu 6727381Sgblack@eecs.umich.edu header_output = "" 6737381Sgblack@eecs.umich.edu decoder_output = "" 6747381Sgblack@eecs.umich.edu exec_output = "" 6757373Sgblack@eecs.umich.edu 6767373Sgblack@eecs.umich.edu vcvtUIntFpSCode = ''' 6777397Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 6787397Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 6797381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1.uw) : "m" (FpOp1.uw)); 6807373Sgblack@eecs.umich.edu FpDest = FpOp1.uw; 6817381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest)); 6827639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 6837397Sgblack@eecs.umich.edu Fpscr = fpscr; 6847373Sgblack@eecs.umich.edu ''' 6857396Sgblack@eecs.umich.edu vcvtUIntFpSIop = InstObjParams("vcvt", "VcvtUIntFpS", "FpRegRegOp", 6867373Sgblack@eecs.umich.edu { "code": vcvtUIntFpSCode, 6877373Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 6887396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcvtUIntFpSIop); 6897396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcvtUIntFpSIop); 6907373Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtUIntFpSIop); 6917373Sgblack@eecs.umich.edu 6927373Sgblack@eecs.umich.edu vcvtUIntFpDCode = ''' 6937397Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 6947397Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 6957381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1P0.uw) : "m" (FpOp1P0.uw)); 6967397Sgblack@eecs.umich.edu double cDest = (uint64_t)FpOp1P0.uw; 6977397Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (cDest)); 6987639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 6997397Sgblack@eecs.umich.edu Fpscr = fpscr; 7007397Sgblack@eecs.umich.edu FpDestP0.uw = dblLow(cDest); 7017397Sgblack@eecs.umich.edu FpDestP1.uw = dblHi(cDest); 7027373Sgblack@eecs.umich.edu ''' 7037396Sgblack@eecs.umich.edu vcvtUIntFpDIop = InstObjParams("vcvt", "VcvtUIntFpD", "FpRegRegOp", 7047373Sgblack@eecs.umich.edu { "code": vcvtUIntFpDCode, 7057373Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 7067396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcvtUIntFpDIop); 7077396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcvtUIntFpDIop); 7087373Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtUIntFpDIop); 7097373Sgblack@eecs.umich.edu 7107373Sgblack@eecs.umich.edu vcvtSIntFpSCode = ''' 7117397Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 7127397Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 7137381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1.sw) : "m" (FpOp1.sw)); 7147373Sgblack@eecs.umich.edu FpDest = FpOp1.sw; 7157381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest)); 7167639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 7177397Sgblack@eecs.umich.edu Fpscr = fpscr; 7187373Sgblack@eecs.umich.edu ''' 7197396Sgblack@eecs.umich.edu vcvtSIntFpSIop = InstObjParams("vcvt", "VcvtSIntFpS", "FpRegRegOp", 7207373Sgblack@eecs.umich.edu { "code": vcvtSIntFpSCode, 7217373Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 7227396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcvtSIntFpSIop); 7237396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcvtSIntFpSIop); 7247373Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtSIntFpSIop); 7257373Sgblack@eecs.umich.edu 7267373Sgblack@eecs.umich.edu vcvtSIntFpDCode = ''' 7277397Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 7287397Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 7297381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1P0.sw) : "m" (FpOp1P0.sw)); 7307397Sgblack@eecs.umich.edu double cDest = FpOp1P0.sw; 7317397Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (cDest)); 7327639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 7337397Sgblack@eecs.umich.edu Fpscr = fpscr; 7347397Sgblack@eecs.umich.edu FpDestP0.uw = dblLow(cDest); 7357397Sgblack@eecs.umich.edu FpDestP1.uw = dblHi(cDest); 7367373Sgblack@eecs.umich.edu ''' 7377396Sgblack@eecs.umich.edu vcvtSIntFpDIop = InstObjParams("vcvt", "VcvtSIntFpD", "FpRegRegOp", 7387373Sgblack@eecs.umich.edu { "code": vcvtSIntFpDCode, 7397373Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 7407396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcvtSIntFpDIop); 7417396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcvtSIntFpDIop); 7427373Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtSIntFpDIop); 7437373Sgblack@eecs.umich.edu 7447380Sgblack@eecs.umich.edu vcvtFpUIntSRCode = ''' 7457397Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 7467397Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 7477397Sgblack@eecs.umich.edu vfpFlushToZero(fpscr, FpOp1); 7487381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1)); 7497388Sgblack@eecs.umich.edu FpDest.uw = vfpFpSToFixed(FpOp1, false, false, 0, false); 7507381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest.uw)); 7517639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 7527397Sgblack@eecs.umich.edu Fpscr = fpscr; 7537380Sgblack@eecs.umich.edu ''' 7547396Sgblack@eecs.umich.edu vcvtFpUIntSRIop = InstObjParams("vcvt", "VcvtFpUIntSR", "FpRegRegOp", 7557380Sgblack@eecs.umich.edu { "code": vcvtFpUIntSRCode, 7567380Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 7577396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcvtFpUIntSRIop); 7587396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcvtFpUIntSRIop); 7597380Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpUIntSRIop); 7607380Sgblack@eecs.umich.edu 7617380Sgblack@eecs.umich.edu vcvtFpUIntDRCode = ''' 7627397Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 7637397Sgblack@eecs.umich.edu double cOp1 = dbl(FpOp1P0.uw, FpOp1P1.uw); 7647397Sgblack@eecs.umich.edu vfpFlushToZero(fpscr, cOp1); 7657397Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 7667397Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (cOp1) : "m" (cOp1)); 7677397Sgblack@eecs.umich.edu uint64_t result = vfpFpDToFixed(cOp1, false, false, 0, false); 7687381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (result)); 7697639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 7707397Sgblack@eecs.umich.edu Fpscr = fpscr; 7717380Sgblack@eecs.umich.edu FpDestP0.uw = result; 7727380Sgblack@eecs.umich.edu ''' 7737396Sgblack@eecs.umich.edu vcvtFpUIntDRIop = InstObjParams("vcvtr", "VcvtFpUIntDR", "FpRegRegOp", 7747380Sgblack@eecs.umich.edu { "code": vcvtFpUIntDRCode, 7757380Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 7767396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcvtFpUIntDRIop); 7777396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcvtFpUIntDRIop); 7787380Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpUIntDRIop); 7797380Sgblack@eecs.umich.edu 7807380Sgblack@eecs.umich.edu vcvtFpSIntSRCode = ''' 7817397Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 7827397Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 7837397Sgblack@eecs.umich.edu vfpFlushToZero(fpscr, FpOp1); 7847381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1)); 7857388Sgblack@eecs.umich.edu FpDest.sw = vfpFpSToFixed(FpOp1, true, false, 0, false); 7867381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest.sw)); 7877639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 7887397Sgblack@eecs.umich.edu Fpscr = fpscr; 7897380Sgblack@eecs.umich.edu ''' 7907396Sgblack@eecs.umich.edu vcvtFpSIntSRIop = InstObjParams("vcvtr", "VcvtFpSIntSR", "FpRegRegOp", 7917380Sgblack@eecs.umich.edu { "code": vcvtFpSIntSRCode, 7927380Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 7937396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcvtFpSIntSRIop); 7947396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcvtFpSIntSRIop); 7957380Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpSIntSRIop); 7967380Sgblack@eecs.umich.edu 7977380Sgblack@eecs.umich.edu vcvtFpSIntDRCode = ''' 7987397Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 7997397Sgblack@eecs.umich.edu double cOp1 = dbl(FpOp1P0.uw, FpOp1P1.uw); 8007397Sgblack@eecs.umich.edu vfpFlushToZero(fpscr, cOp1); 8017397Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 8027397Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (cOp1) : "m" (cOp1)); 8037397Sgblack@eecs.umich.edu int64_t result = vfpFpDToFixed(cOp1, true, false, 0, false); 8047381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (result)); 8057639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 8067397Sgblack@eecs.umich.edu Fpscr = fpscr; 8077380Sgblack@eecs.umich.edu FpDestP0.uw = result; 8087380Sgblack@eecs.umich.edu ''' 8097396Sgblack@eecs.umich.edu vcvtFpSIntDRIop = InstObjParams("vcvtr", "VcvtFpSIntDR", "FpRegRegOp", 8107380Sgblack@eecs.umich.edu { "code": vcvtFpSIntDRCode, 8117380Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 8127396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcvtFpSIntDRIop); 8137396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcvtFpSIntDRIop); 8147380Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpSIntDRIop); 8157380Sgblack@eecs.umich.edu 8167373Sgblack@eecs.umich.edu vcvtFpUIntSCode = ''' 8177397Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 8187397Sgblack@eecs.umich.edu vfpFlushToZero(fpscr, FpOp1); 8197397Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 8207380Sgblack@eecs.umich.edu fesetround(FeRoundZero); 8217381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1)); 8227387Sgblack@eecs.umich.edu FpDest.uw = vfpFpSToFixed(FpOp1, false, false, 0); 8237381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest.uw)); 8247639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 8257397Sgblack@eecs.umich.edu Fpscr = fpscr; 8267373Sgblack@eecs.umich.edu ''' 8277396Sgblack@eecs.umich.edu vcvtFpUIntSIop = InstObjParams("vcvt", "VcvtFpUIntS", "FpRegRegOp", 8287373Sgblack@eecs.umich.edu { "code": vcvtFpUIntSCode, 8297373Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 8307396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcvtFpUIntSIop); 8317396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcvtFpUIntSIop); 8327373Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpUIntSIop); 8337373Sgblack@eecs.umich.edu 8347373Sgblack@eecs.umich.edu vcvtFpUIntDCode = ''' 8357397Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 8367397Sgblack@eecs.umich.edu double cOp1 = dbl(FpOp1P0.uw, FpOp1P1.uw); 8377397Sgblack@eecs.umich.edu vfpFlushToZero(fpscr, cOp1); 8387397Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 8397380Sgblack@eecs.umich.edu fesetround(FeRoundZero); 8407397Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (cOp1) : "m" (cOp1)); 8417397Sgblack@eecs.umich.edu uint64_t result = vfpFpDToFixed(cOp1, false, false, 0); 8427381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (result)); 8437639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 8447397Sgblack@eecs.umich.edu Fpscr = fpscr; 8457373Sgblack@eecs.umich.edu FpDestP0.uw = result; 8467373Sgblack@eecs.umich.edu ''' 8477396Sgblack@eecs.umich.edu vcvtFpUIntDIop = InstObjParams("vcvt", "VcvtFpUIntD", "FpRegRegOp", 8487373Sgblack@eecs.umich.edu { "code": vcvtFpUIntDCode, 8497373Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 8507396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcvtFpUIntDIop); 8517396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcvtFpUIntDIop); 8527373Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpUIntDIop); 8537373Sgblack@eecs.umich.edu 8547373Sgblack@eecs.umich.edu vcvtFpSIntSCode = ''' 8557397Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 8567397Sgblack@eecs.umich.edu vfpFlushToZero(fpscr, FpOp1); 8577397Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 8587380Sgblack@eecs.umich.edu fesetround(FeRoundZero); 8597381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1)); 8607387Sgblack@eecs.umich.edu FpDest.sw = vfpFpSToFixed(FpOp1, true, false, 0); 8617381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest.sw)); 8627639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 8637397Sgblack@eecs.umich.edu Fpscr = fpscr; 8647373Sgblack@eecs.umich.edu ''' 8657396Sgblack@eecs.umich.edu vcvtFpSIntSIop = InstObjParams("vcvt", "VcvtFpSIntS", "FpRegRegOp", 8667373Sgblack@eecs.umich.edu { "code": vcvtFpSIntSCode, 8677373Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 8687396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcvtFpSIntSIop); 8697396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcvtFpSIntSIop); 8707373Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpSIntSIop); 8717373Sgblack@eecs.umich.edu 8727373Sgblack@eecs.umich.edu vcvtFpSIntDCode = ''' 8737397Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 8747397Sgblack@eecs.umich.edu double cOp1 = dbl(FpOp1P0.uw, FpOp1P1.uw); 8757397Sgblack@eecs.umich.edu vfpFlushToZero(fpscr, cOp1); 8767397Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 8777380Sgblack@eecs.umich.edu fesetround(FeRoundZero); 8787397Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (cOp1) : "m" (cOp1)); 8797397Sgblack@eecs.umich.edu int64_t result = vfpFpDToFixed(cOp1, true, false, 0); 8807381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (result)); 8817639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 8827397Sgblack@eecs.umich.edu Fpscr = fpscr; 8837373Sgblack@eecs.umich.edu FpDestP0.uw = result; 8847373Sgblack@eecs.umich.edu ''' 8857396Sgblack@eecs.umich.edu vcvtFpSIntDIop = InstObjParams("vcvt", "VcvtFpSIntD", "FpRegRegOp", 8867373Sgblack@eecs.umich.edu { "code": vcvtFpSIntDCode, 8877373Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 8887396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcvtFpSIntDIop); 8897396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcvtFpSIntDIop); 8907373Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpSIntDIop); 8917374Sgblack@eecs.umich.edu 8927374Sgblack@eecs.umich.edu vcvtFpSFpDCode = ''' 8937397Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 8947397Sgblack@eecs.umich.edu vfpFlushToZero(fpscr, FpOp1); 8957397Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 8967381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1)); 8977397Sgblack@eecs.umich.edu double cDest = fixFpSFpDDest(Fpscr, FpOp1); 8987397Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (cDest)); 8997639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 9007397Sgblack@eecs.umich.edu Fpscr = fpscr; 9017397Sgblack@eecs.umich.edu FpDestP0.uw = dblLow(cDest); 9027397Sgblack@eecs.umich.edu FpDestP1.uw = dblHi(cDest); 9037374Sgblack@eecs.umich.edu ''' 9047396Sgblack@eecs.umich.edu vcvtFpSFpDIop = InstObjParams("vcvt", "VcvtFpSFpD", "FpRegRegOp", 9057374Sgblack@eecs.umich.edu { "code": vcvtFpSFpDCode, 9067374Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 9077396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcvtFpSFpDIop); 9087396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcvtFpSFpDIop); 9097374Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpSFpDIop); 9107374Sgblack@eecs.umich.edu 9117374Sgblack@eecs.umich.edu vcvtFpDFpSCode = ''' 9127397Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 9137397Sgblack@eecs.umich.edu double cOp1 = dbl(FpOp1P0.uw, FpOp1P1.uw); 9147397Sgblack@eecs.umich.edu vfpFlushToZero(fpscr, cOp1); 9157397Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 9167397Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (cOp1) : "m" (cOp1)); 9177397Sgblack@eecs.umich.edu FpDest = fixFpDFpSDest(Fpscr, cOp1); 9187381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest)); 9197639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 9207397Sgblack@eecs.umich.edu Fpscr = fpscr; 9217374Sgblack@eecs.umich.edu ''' 9227396Sgblack@eecs.umich.edu vcvtFpDFpSIop = InstObjParams("vcvt", "VcvtFpDFpS", "FpRegRegOp", 9237374Sgblack@eecs.umich.edu { "code": vcvtFpDFpSCode, 9247374Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 9257396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcvtFpDFpSIop); 9267396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcvtFpDFpSIop); 9277374Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpDFpSIop); 9287377Sgblack@eecs.umich.edu 9297398Sgblack@eecs.umich.edu vcvtFpHTFpSCode = ''' 9307398Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 9317398Sgblack@eecs.umich.edu vfpFlushToZero(fpscr, FpOp1); 9327398Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 9337398Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1)); 9347639Sgblack@eecs.umich.edu FpDest = vcvtFpHFpS(fpscr, fpscr.dn, fpscr.ahp, 9357639Sgblack@eecs.umich.edu bits(fpToBits(FpOp1), 31, 16)); 9367398Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest)); 9377639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 9387398Sgblack@eecs.umich.edu Fpscr = fpscr; 9397398Sgblack@eecs.umich.edu ''' 9407398Sgblack@eecs.umich.edu vcvtFpHTFpSIop = InstObjParams("vcvtt", "VcvtFpHTFpS", "FpRegRegOp", 9417398Sgblack@eecs.umich.edu { "code": vcvtFpHTFpSCode, 9427398Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 9437398Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcvtFpHTFpSIop); 9447398Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcvtFpHTFpSIop); 9457398Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpHTFpSIop); 9467398Sgblack@eecs.umich.edu 9477398Sgblack@eecs.umich.edu vcvtFpHBFpSCode = ''' 9487398Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 9497398Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 9507398Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1)); 9517639Sgblack@eecs.umich.edu FpDest = vcvtFpHFpS(fpscr, fpscr.dn, fpscr.ahp, 9527639Sgblack@eecs.umich.edu bits(fpToBits(FpOp1), 15, 0)); 9537398Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest)); 9547639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 9557398Sgblack@eecs.umich.edu Fpscr = fpscr; 9567398Sgblack@eecs.umich.edu ''' 9577398Sgblack@eecs.umich.edu vcvtFpHBFpSIop = InstObjParams("vcvtb", "VcvtFpHBFpS", "FpRegRegOp", 9587398Sgblack@eecs.umich.edu { "code": vcvtFpHBFpSCode, 9597398Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 9607398Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcvtFpHBFpSIop); 9617398Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcvtFpHBFpSIop); 9627398Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpHBFpSIop); 9637398Sgblack@eecs.umich.edu 9647398Sgblack@eecs.umich.edu vcvtFpSFpHTCode = ''' 9657398Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 9667398Sgblack@eecs.umich.edu vfpFlushToZero(fpscr, FpOp1); 9677398Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 9687639Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1), "=m" (FpDest.uw) 9697639Sgblack@eecs.umich.edu : "m" (FpOp1), "m" (FpDest.uw)); 9707639Sgblack@eecs.umich.edu FpDest.uw = insertBits(FpDest.uw, 31, 16,, 9717639Sgblack@eecs.umich.edu vcvtFpSFpH(fpscr, fpscr.fz, fpscr.dn, 9727639Sgblack@eecs.umich.edu fpscr.rMode, fpscr.ahp, FpOp1)); 9737639Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest.uw)); 9747639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 9757398Sgblack@eecs.umich.edu Fpscr = fpscr; 9767398Sgblack@eecs.umich.edu ''' 9777398Sgblack@eecs.umich.edu vcvtFpSFpHTIop = InstObjParams("vcvtt", "VcvtFpSFpHT", "FpRegRegOp", 9787398Sgblack@eecs.umich.edu { "code": vcvtFpHTFpSCode, 9797398Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 9807398Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcvtFpSFpHTIop); 9817398Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcvtFpSFpHTIop); 9827398Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpSFpHTIop); 9837398Sgblack@eecs.umich.edu 9847398Sgblack@eecs.umich.edu vcvtFpSFpHBCode = ''' 9857398Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 9867398Sgblack@eecs.umich.edu vfpFlushToZero(fpscr, FpOp1); 9877398Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 9887639Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1), "=m" (FpDest.uw) 9897639Sgblack@eecs.umich.edu : "m" (FpOp1), "m" (FpDest.uw)); 9907639Sgblack@eecs.umich.edu FpDest.uw = insertBits(FpDest.uw, 15, 0, 9917639Sgblack@eecs.umich.edu vcvtFpSFpH(fpscr, fpscr.fz, fpscr.dn, 9927639Sgblack@eecs.umich.edu fpscr.rMode, fpscr.ahp, FpOp1)); 9937639Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest.uw)); 9947639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 9957398Sgblack@eecs.umich.edu Fpscr = fpscr; 9967398Sgblack@eecs.umich.edu ''' 9977398Sgblack@eecs.umich.edu vcvtFpSFpHBIop = InstObjParams("vcvtb", "VcvtFpSFpHB", "FpRegRegOp", 9987398Sgblack@eecs.umich.edu { "code": vcvtFpSFpHBCode, 9997398Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 10007398Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcvtFpSFpHBIop); 10017398Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcvtFpSFpHBIop); 10027398Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpSFpHBIop); 10037398Sgblack@eecs.umich.edu 10047377Sgblack@eecs.umich.edu vcmpSCode = ''' 10057377Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 10067397Sgblack@eecs.umich.edu vfpFlushToZero(fpscr, FpDest, FpOp1); 10077377Sgblack@eecs.umich.edu if (FpDest == FpOp1) { 10087377Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0; 10097377Sgblack@eecs.umich.edu } else if (FpDest < FpOp1) { 10107377Sgblack@eecs.umich.edu fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0; 10117377Sgblack@eecs.umich.edu } else if (FpDest > FpOp1) { 10127377Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0; 10137377Sgblack@eecs.umich.edu } else { 10147389Sgblack@eecs.umich.edu const uint32_t qnan = 0x7fc00000; 10157389Sgblack@eecs.umich.edu const bool nan1 = std::isnan(FpDest); 10167396Sgblack@eecs.umich.edu const bool signal1 = nan1 && ((fpToBits(FpDest) & qnan) != qnan); 10177389Sgblack@eecs.umich.edu const bool nan2 = std::isnan(FpOp1); 10187396Sgblack@eecs.umich.edu const bool signal2 = nan2 && ((fpToBits(FpOp1) & qnan) != qnan); 10197389Sgblack@eecs.umich.edu if (signal1 || signal2) 10207389Sgblack@eecs.umich.edu fpscr.ioc = 1; 10217377Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1; 10227377Sgblack@eecs.umich.edu } 10237377Sgblack@eecs.umich.edu Fpscr = fpscr; 10247377Sgblack@eecs.umich.edu ''' 10257396Sgblack@eecs.umich.edu vcmpSIop = InstObjParams("vcmps", "VcmpS", "FpRegRegOp", 10267377Sgblack@eecs.umich.edu { "code": vcmpSCode, 10277377Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 10287396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcmpSIop); 10297396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcmpSIop); 10307377Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcmpSIop); 10317377Sgblack@eecs.umich.edu 10327377Sgblack@eecs.umich.edu vcmpDCode = ''' 10337397Sgblack@eecs.umich.edu double cOp1 = dbl(FpOp1P0.uw, FpOp1P1.uw); 10347397Sgblack@eecs.umich.edu double cDest = dbl(FpDestP0.uw, FpDestP1.uw); 10357377Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 10367397Sgblack@eecs.umich.edu vfpFlushToZero(fpscr, cDest, cOp1); 10377397Sgblack@eecs.umich.edu if (cDest == cOp1) { 10387377Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0; 10397397Sgblack@eecs.umich.edu } else if (cDest < cOp1) { 10407377Sgblack@eecs.umich.edu fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0; 10417397Sgblack@eecs.umich.edu } else if (cDest > cOp1) { 10427377Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0; 10437377Sgblack@eecs.umich.edu } else { 10447389Sgblack@eecs.umich.edu const uint64_t qnan = ULL(0x7ff8000000000000); 10457397Sgblack@eecs.umich.edu const bool nan1 = std::isnan(cDest); 10467397Sgblack@eecs.umich.edu const bool signal1 = nan1 && ((fpToBits(cDest) & qnan) != qnan); 10477397Sgblack@eecs.umich.edu const bool nan2 = std::isnan(cOp1); 10487397Sgblack@eecs.umich.edu const bool signal2 = nan2 && ((fpToBits(cOp1) & qnan) != qnan); 10497389Sgblack@eecs.umich.edu if (signal1 || signal2) 10507389Sgblack@eecs.umich.edu fpscr.ioc = 1; 10517377Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1; 10527377Sgblack@eecs.umich.edu } 10537377Sgblack@eecs.umich.edu Fpscr = fpscr; 10547377Sgblack@eecs.umich.edu ''' 10557396Sgblack@eecs.umich.edu vcmpDIop = InstObjParams("vcmpd", "VcmpD", "FpRegRegOp", 10567377Sgblack@eecs.umich.edu { "code": vcmpDCode, 10577377Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 10587396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcmpDIop); 10597396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcmpDIop); 10607377Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcmpDIop); 10617377Sgblack@eecs.umich.edu 10627377Sgblack@eecs.umich.edu vcmpZeroSCode = ''' 10637377Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 10647397Sgblack@eecs.umich.edu vfpFlushToZero(fpscr, FpDest); 10657389Sgblack@eecs.umich.edu // This only handles imm == 0 for now. 10667389Sgblack@eecs.umich.edu assert(imm == 0); 10677377Sgblack@eecs.umich.edu if (FpDest == imm) { 10687377Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0; 10697377Sgblack@eecs.umich.edu } else if (FpDest < imm) { 10707377Sgblack@eecs.umich.edu fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0; 10717377Sgblack@eecs.umich.edu } else if (FpDest > imm) { 10727377Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0; 10737377Sgblack@eecs.umich.edu } else { 10747389Sgblack@eecs.umich.edu const uint32_t qnan = 0x7fc00000; 10757389Sgblack@eecs.umich.edu const bool nan = std::isnan(FpDest); 10767396Sgblack@eecs.umich.edu const bool signal = nan && ((fpToBits(FpDest) & qnan) != qnan); 10777389Sgblack@eecs.umich.edu if (signal) 10787389Sgblack@eecs.umich.edu fpscr.ioc = 1; 10797377Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1; 10807377Sgblack@eecs.umich.edu } 10817377Sgblack@eecs.umich.edu Fpscr = fpscr; 10827377Sgblack@eecs.umich.edu ''' 10837396Sgblack@eecs.umich.edu vcmpZeroSIop = InstObjParams("vcmpZeros", "VcmpZeroS", "FpRegImmOp", 10847377Sgblack@eecs.umich.edu { "code": vcmpZeroSCode, 10857377Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 10867396Sgblack@eecs.umich.edu header_output += FpRegImmOpDeclare.subst(vcmpZeroSIop); 10877396Sgblack@eecs.umich.edu decoder_output += FpRegImmOpConstructor.subst(vcmpZeroSIop); 10887377Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcmpZeroSIop); 10897377Sgblack@eecs.umich.edu 10907377Sgblack@eecs.umich.edu vcmpZeroDCode = ''' 10917389Sgblack@eecs.umich.edu // This only handles imm == 0 for now. 10927389Sgblack@eecs.umich.edu assert(imm == 0); 10937397Sgblack@eecs.umich.edu double cDest = dbl(FpDestP0.uw, FpDestP1.uw); 10947377Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 10957397Sgblack@eecs.umich.edu vfpFlushToZero(fpscr, cDest); 10967397Sgblack@eecs.umich.edu if (cDest == imm) { 10977377Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0; 10987397Sgblack@eecs.umich.edu } else if (cDest < imm) { 10997377Sgblack@eecs.umich.edu fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0; 11007397Sgblack@eecs.umich.edu } else if (cDest > imm) { 11017377Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0; 11027377Sgblack@eecs.umich.edu } else { 11037389Sgblack@eecs.umich.edu const uint64_t qnan = ULL(0x7ff8000000000000); 11047397Sgblack@eecs.umich.edu const bool nan = std::isnan(cDest); 11057397Sgblack@eecs.umich.edu const bool signal = nan && ((fpToBits(cDest) & qnan) != qnan); 11067389Sgblack@eecs.umich.edu if (signal) 11077389Sgblack@eecs.umich.edu fpscr.ioc = 1; 11087377Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1; 11097377Sgblack@eecs.umich.edu } 11107377Sgblack@eecs.umich.edu Fpscr = fpscr; 11117377Sgblack@eecs.umich.edu ''' 11127396Sgblack@eecs.umich.edu vcmpZeroDIop = InstObjParams("vcmpZerod", "VcmpZeroD", "FpRegImmOp", 11137377Sgblack@eecs.umich.edu { "code": vcmpZeroDCode, 11147377Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 11157396Sgblack@eecs.umich.edu header_output += FpRegImmOpDeclare.subst(vcmpZeroDIop); 11167396Sgblack@eecs.umich.edu decoder_output += FpRegImmOpConstructor.subst(vcmpZeroDIop); 11177377Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcmpZeroDIop); 11187389Sgblack@eecs.umich.edu 11197389Sgblack@eecs.umich.edu vcmpeSCode = ''' 11207389Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 11217397Sgblack@eecs.umich.edu vfpFlushToZero(fpscr, FpDest, FpOp1); 11227389Sgblack@eecs.umich.edu if (FpDest == FpOp1) { 11237389Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0; 11247389Sgblack@eecs.umich.edu } else if (FpDest < FpOp1) { 11257389Sgblack@eecs.umich.edu fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0; 11267389Sgblack@eecs.umich.edu } else if (FpDest > FpOp1) { 11277389Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0; 11287389Sgblack@eecs.umich.edu } else { 11297389Sgblack@eecs.umich.edu fpscr.ioc = 1; 11307389Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1; 11317389Sgblack@eecs.umich.edu } 11327389Sgblack@eecs.umich.edu Fpscr = fpscr; 11337389Sgblack@eecs.umich.edu ''' 11347396Sgblack@eecs.umich.edu vcmpeSIop = InstObjParams("vcmpes", "VcmpeS", "FpRegRegOp", 11357389Sgblack@eecs.umich.edu { "code": vcmpeSCode, 11367389Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 11377396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcmpeSIop); 11387396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcmpeSIop); 11397389Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcmpeSIop); 11407389Sgblack@eecs.umich.edu 11417389Sgblack@eecs.umich.edu vcmpeDCode = ''' 11427397Sgblack@eecs.umich.edu double cOp1 = dbl(FpOp1P0.uw, FpOp1P1.uw); 11437397Sgblack@eecs.umich.edu double cDest = dbl(FpDestP0.uw, FpDestP1.uw); 11447389Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 11457397Sgblack@eecs.umich.edu vfpFlushToZero(fpscr, cDest, cOp1); 11467397Sgblack@eecs.umich.edu if (cDest == cOp1) { 11477389Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0; 11487397Sgblack@eecs.umich.edu } else if (cDest < cOp1) { 11497389Sgblack@eecs.umich.edu fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0; 11507397Sgblack@eecs.umich.edu } else if (cDest > cOp1) { 11517389Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0; 11527389Sgblack@eecs.umich.edu } else { 11537389Sgblack@eecs.umich.edu fpscr.ioc = 1; 11547389Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1; 11557389Sgblack@eecs.umich.edu } 11567389Sgblack@eecs.umich.edu Fpscr = fpscr; 11577389Sgblack@eecs.umich.edu ''' 11587396Sgblack@eecs.umich.edu vcmpeDIop = InstObjParams("vcmped", "VcmpeD", "FpRegRegOp", 11597389Sgblack@eecs.umich.edu { "code": vcmpeDCode, 11607389Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 11617396Sgblack@eecs.umich.edu header_output += FpRegRegOpDeclare.subst(vcmpeDIop); 11627396Sgblack@eecs.umich.edu decoder_output += FpRegRegOpConstructor.subst(vcmpeDIop); 11637389Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcmpeDIop); 11647389Sgblack@eecs.umich.edu 11657389Sgblack@eecs.umich.edu vcmpeZeroSCode = ''' 11667389Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 11677397Sgblack@eecs.umich.edu vfpFlushToZero(fpscr, FpDest); 11687389Sgblack@eecs.umich.edu if (FpDest == imm) { 11697389Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0; 11707389Sgblack@eecs.umich.edu } else if (FpDest < imm) { 11717389Sgblack@eecs.umich.edu fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0; 11727389Sgblack@eecs.umich.edu } else if (FpDest > imm) { 11737389Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0; 11747389Sgblack@eecs.umich.edu } else { 11757389Sgblack@eecs.umich.edu fpscr.ioc = 1; 11767389Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1; 11777389Sgblack@eecs.umich.edu } 11787389Sgblack@eecs.umich.edu Fpscr = fpscr; 11797389Sgblack@eecs.umich.edu ''' 11807396Sgblack@eecs.umich.edu vcmpeZeroSIop = InstObjParams("vcmpeZeros", "VcmpeZeroS", "FpRegImmOp", 11817389Sgblack@eecs.umich.edu { "code": vcmpeZeroSCode, 11827389Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 11837396Sgblack@eecs.umich.edu header_output += FpRegImmOpDeclare.subst(vcmpeZeroSIop); 11847396Sgblack@eecs.umich.edu decoder_output += FpRegImmOpConstructor.subst(vcmpeZeroSIop); 11857389Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcmpeZeroSIop); 11867389Sgblack@eecs.umich.edu 11877389Sgblack@eecs.umich.edu vcmpeZeroDCode = ''' 11887397Sgblack@eecs.umich.edu double cDest = dbl(FpDestP0.uw, FpDestP1.uw); 11897389Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 11907397Sgblack@eecs.umich.edu vfpFlushToZero(fpscr, cDest); 11917397Sgblack@eecs.umich.edu if (cDest == imm) { 11927389Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 1; fpscr.c = 1; fpscr.v = 0; 11937397Sgblack@eecs.umich.edu } else if (cDest < imm) { 11947389Sgblack@eecs.umich.edu fpscr.n = 1; fpscr.z = 0; fpscr.c = 0; fpscr.v = 0; 11957397Sgblack@eecs.umich.edu } else if (cDest > imm) { 11967389Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 0; 11977389Sgblack@eecs.umich.edu } else { 11987389Sgblack@eecs.umich.edu fpscr.ioc = 1; 11997389Sgblack@eecs.umich.edu fpscr.n = 0; fpscr.z = 0; fpscr.c = 1; fpscr.v = 1; 12007389Sgblack@eecs.umich.edu } 12017389Sgblack@eecs.umich.edu Fpscr = fpscr; 12027389Sgblack@eecs.umich.edu ''' 12037396Sgblack@eecs.umich.edu vcmpeZeroDIop = InstObjParams("vcmpeZerod", "VcmpeZeroD", "FpRegImmOp", 12047389Sgblack@eecs.umich.edu { "code": vcmpeZeroDCode, 12057389Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 12067396Sgblack@eecs.umich.edu header_output += FpRegImmOpDeclare.subst(vcmpeZeroDIop); 12077396Sgblack@eecs.umich.edu decoder_output += FpRegImmOpConstructor.subst(vcmpeZeroDIop); 12087389Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcmpeZeroDIop); 12097322Sgblack@eecs.umich.edu}}; 12107379Sgblack@eecs.umich.edu 12117379Sgblack@eecs.umich.edulet {{ 12127379Sgblack@eecs.umich.edu 12137379Sgblack@eecs.umich.edu header_output = "" 12147379Sgblack@eecs.umich.edu decoder_output = "" 12157379Sgblack@eecs.umich.edu exec_output = "" 12167379Sgblack@eecs.umich.edu 12177379Sgblack@eecs.umich.edu vcvtFpSFixedSCode = ''' 12187397Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 12197397Sgblack@eecs.umich.edu vfpFlushToZero(fpscr, FpOp1); 12207397Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 12217381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1)); 12227379Sgblack@eecs.umich.edu FpDest.sw = vfpFpSToFixed(FpOp1, true, false, imm); 12237381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest.sw)); 12247639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 12257397Sgblack@eecs.umich.edu Fpscr = fpscr; 12267379Sgblack@eecs.umich.edu ''' 12277396Sgblack@eecs.umich.edu vcvtFpSFixedSIop = InstObjParams("vcvt", "VcvtFpSFixedS", "FpRegRegImmOp", 12287379Sgblack@eecs.umich.edu { "code": vcvtFpSFixedSCode, 12297379Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 12307396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vcvtFpSFixedSIop); 12317396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpSFixedSIop); 12327379Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpSFixedSIop); 12337379Sgblack@eecs.umich.edu 12347379Sgblack@eecs.umich.edu vcvtFpSFixedDCode = ''' 12357397Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 12367397Sgblack@eecs.umich.edu double cOp1 = dbl(FpOp1P0.uw, FpOp1P1.uw); 12377397Sgblack@eecs.umich.edu vfpFlushToZero(fpscr, cOp1); 12387397Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 12397397Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (cOp1) : "m" (cOp1)); 12407397Sgblack@eecs.umich.edu uint64_t mid = vfpFpDToFixed(cOp1, true, false, imm); 12417381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (mid)); 12427639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 12437397Sgblack@eecs.umich.edu Fpscr = fpscr; 12447379Sgblack@eecs.umich.edu FpDestP0.uw = mid; 12457379Sgblack@eecs.umich.edu FpDestP1.uw = mid >> 32; 12467379Sgblack@eecs.umich.edu ''' 12477396Sgblack@eecs.umich.edu vcvtFpSFixedDIop = InstObjParams("vcvt", "VcvtFpSFixedD", "FpRegRegImmOp", 12487379Sgblack@eecs.umich.edu { "code": vcvtFpSFixedDCode, 12497379Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 12507396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vcvtFpSFixedDIop); 12517396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpSFixedDIop); 12527379Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpSFixedDIop); 12537379Sgblack@eecs.umich.edu 12547379Sgblack@eecs.umich.edu vcvtFpUFixedSCode = ''' 12557397Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 12567397Sgblack@eecs.umich.edu vfpFlushToZero(fpscr, FpOp1); 12577397Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 12587381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1)); 12597379Sgblack@eecs.umich.edu FpDest.uw = vfpFpSToFixed(FpOp1, false, false, imm); 12607381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest.uw)); 12617639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 12627397Sgblack@eecs.umich.edu Fpscr = fpscr; 12637379Sgblack@eecs.umich.edu ''' 12647396Sgblack@eecs.umich.edu vcvtFpUFixedSIop = InstObjParams("vcvt", "VcvtFpUFixedS", "FpRegRegImmOp", 12657379Sgblack@eecs.umich.edu { "code": vcvtFpUFixedSCode, 12667379Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 12677396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vcvtFpUFixedSIop); 12687396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpUFixedSIop); 12697379Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpUFixedSIop); 12707379Sgblack@eecs.umich.edu 12717379Sgblack@eecs.umich.edu vcvtFpUFixedDCode = ''' 12727397Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 12737397Sgblack@eecs.umich.edu double cOp1 = dbl(FpOp1P0.uw, FpOp1P1.uw); 12747397Sgblack@eecs.umich.edu vfpFlushToZero(fpscr, cOp1); 12757397Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 12767397Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (cOp1) : "m" (cOp1)); 12777397Sgblack@eecs.umich.edu uint64_t mid = vfpFpDToFixed(cOp1, false, false, imm); 12787381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (mid)); 12797639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 12807397Sgblack@eecs.umich.edu Fpscr = fpscr; 12817379Sgblack@eecs.umich.edu FpDestP0.uw = mid; 12827379Sgblack@eecs.umich.edu FpDestP1.uw = mid >> 32; 12837379Sgblack@eecs.umich.edu ''' 12847396Sgblack@eecs.umich.edu vcvtFpUFixedDIop = InstObjParams("vcvt", "VcvtFpUFixedD", "FpRegRegImmOp", 12857379Sgblack@eecs.umich.edu { "code": vcvtFpUFixedDCode, 12867379Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 12877396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vcvtFpUFixedDIop); 12887396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpUFixedDIop); 12897379Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpUFixedDIop); 12907379Sgblack@eecs.umich.edu 12917379Sgblack@eecs.umich.edu vcvtSFixedFpSCode = ''' 12927397Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 12937397Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 12947381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1.sw) : "m" (FpOp1.sw)); 12957639Sgblack@eecs.umich.edu FpDest = vfpSFixedToFpS(fpscr.fz, fpscr.dn, FpOp1.sw, false, imm); 12967381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest)); 12977639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 12987397Sgblack@eecs.umich.edu Fpscr = fpscr; 12997379Sgblack@eecs.umich.edu ''' 13007396Sgblack@eecs.umich.edu vcvtSFixedFpSIop = InstObjParams("vcvt", "VcvtSFixedFpS", "FpRegRegImmOp", 13017379Sgblack@eecs.umich.edu { "code": vcvtSFixedFpSCode, 13027379Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 13037396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vcvtSFixedFpSIop); 13047396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vcvtSFixedFpSIop); 13057379Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtSFixedFpSIop); 13067379Sgblack@eecs.umich.edu 13077379Sgblack@eecs.umich.edu vcvtSFixedFpDCode = ''' 13087397Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 13097379Sgblack@eecs.umich.edu uint64_t mid = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 13107397Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 13117381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (mid) : "m" (mid)); 13127639Sgblack@eecs.umich.edu double cDest = vfpSFixedToFpD(fpscr.fz, fpscr.dn, mid, false, imm); 13137397Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (cDest)); 13147639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 13157397Sgblack@eecs.umich.edu Fpscr = fpscr; 13167397Sgblack@eecs.umich.edu FpDestP0.uw = dblLow(cDest); 13177397Sgblack@eecs.umich.edu FpDestP1.uw = dblHi(cDest); 13187379Sgblack@eecs.umich.edu ''' 13197396Sgblack@eecs.umich.edu vcvtSFixedFpDIop = InstObjParams("vcvt", "VcvtSFixedFpD", "FpRegRegImmOp", 13207379Sgblack@eecs.umich.edu { "code": vcvtSFixedFpDCode, 13217379Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 13227396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vcvtSFixedFpDIop); 13237396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vcvtSFixedFpDIop); 13247379Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtSFixedFpDIop); 13257379Sgblack@eecs.umich.edu 13267379Sgblack@eecs.umich.edu vcvtUFixedFpSCode = ''' 13277397Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 13287397Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 13297381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1.uw) : "m" (FpOp1.uw)); 13307639Sgblack@eecs.umich.edu FpDest = vfpUFixedToFpS(fpscr.fz, fpscr.dn, FpOp1.uw, false, imm); 13317381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest)); 13327639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 13337397Sgblack@eecs.umich.edu Fpscr = fpscr; 13347379Sgblack@eecs.umich.edu ''' 13357396Sgblack@eecs.umich.edu vcvtUFixedFpSIop = InstObjParams("vcvt", "VcvtUFixedFpS", "FpRegRegImmOp", 13367379Sgblack@eecs.umich.edu { "code": vcvtUFixedFpSCode, 13377379Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 13387396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vcvtUFixedFpSIop); 13397396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vcvtUFixedFpSIop); 13407379Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtUFixedFpSIop); 13417379Sgblack@eecs.umich.edu 13427379Sgblack@eecs.umich.edu vcvtUFixedFpDCode = ''' 13437397Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 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 = vfpUFixedToFpD(fpscr.fz, fpscr.dn, mid, false, imm); 13487397Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (cDest)); 13497639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 13507397Sgblack@eecs.umich.edu Fpscr = fpscr; 13517397Sgblack@eecs.umich.edu FpDestP0.uw = dblLow(cDest); 13527397Sgblack@eecs.umich.edu FpDestP1.uw = dblHi(cDest); 13537379Sgblack@eecs.umich.edu ''' 13547396Sgblack@eecs.umich.edu vcvtUFixedFpDIop = InstObjParams("vcvt", "VcvtUFixedFpD", "FpRegRegImmOp", 13557379Sgblack@eecs.umich.edu { "code": vcvtUFixedFpDCode, 13567379Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 13577396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vcvtUFixedFpDIop); 13587396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vcvtUFixedFpDIop); 13597379Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtUFixedFpDIop); 13607379Sgblack@eecs.umich.edu 13617379Sgblack@eecs.umich.edu vcvtFpSHFixedSCode = ''' 13627397Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 13637397Sgblack@eecs.umich.edu vfpFlushToZero(fpscr, FpOp1); 13647397Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 13657381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1)); 13667379Sgblack@eecs.umich.edu FpDest.sh = vfpFpSToFixed(FpOp1, true, true, imm); 13677381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest.sh)); 13687639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 13697397Sgblack@eecs.umich.edu Fpscr = fpscr; 13707379Sgblack@eecs.umich.edu ''' 13717379Sgblack@eecs.umich.edu vcvtFpSHFixedSIop = InstObjParams("vcvt", "VcvtFpSHFixedS", 13727396Sgblack@eecs.umich.edu "FpRegRegImmOp", 13737379Sgblack@eecs.umich.edu { "code": vcvtFpSHFixedSCode, 13747379Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 13757396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vcvtFpSHFixedSIop); 13767396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpSHFixedSIop); 13777379Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpSHFixedSIop); 13787379Sgblack@eecs.umich.edu 13797379Sgblack@eecs.umich.edu vcvtFpSHFixedDCode = ''' 13807397Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 13817397Sgblack@eecs.umich.edu double cOp1 = dbl(FpOp1P0.uw, FpOp1P1.uw); 13827397Sgblack@eecs.umich.edu vfpFlushToZero(fpscr, cOp1); 13837397Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 13847397Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (cOp1) : "m" (cOp1)); 13857397Sgblack@eecs.umich.edu uint64_t result = vfpFpDToFixed(cOp1, true, true, imm); 13867381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (result)); 13877639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 13887397Sgblack@eecs.umich.edu Fpscr = fpscr; 13897379Sgblack@eecs.umich.edu FpDestP0.uw = result; 13907379Sgblack@eecs.umich.edu FpDestP1.uw = result >> 32; 13917379Sgblack@eecs.umich.edu ''' 13927379Sgblack@eecs.umich.edu vcvtFpSHFixedDIop = InstObjParams("vcvt", "VcvtFpSHFixedD", 13937396Sgblack@eecs.umich.edu "FpRegRegImmOp", 13947379Sgblack@eecs.umich.edu { "code": vcvtFpSHFixedDCode, 13957379Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 13967396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vcvtFpSHFixedDIop); 13977396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpSHFixedDIop); 13987379Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpSHFixedDIop); 13997379Sgblack@eecs.umich.edu 14007379Sgblack@eecs.umich.edu vcvtFpUHFixedSCode = ''' 14017397Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 14027397Sgblack@eecs.umich.edu vfpFlushToZero(fpscr, FpOp1); 14037397Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 14047381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1) : "m" (FpOp1)); 14057379Sgblack@eecs.umich.edu FpDest.uh = vfpFpSToFixed(FpOp1, false, true, imm); 14067381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest.uh)); 14077639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 14087397Sgblack@eecs.umich.edu Fpscr = fpscr; 14097379Sgblack@eecs.umich.edu ''' 14107379Sgblack@eecs.umich.edu vcvtFpUHFixedSIop = InstObjParams("vcvt", "VcvtFpUHFixedS", 14117396Sgblack@eecs.umich.edu "FpRegRegImmOp", 14127379Sgblack@eecs.umich.edu { "code": vcvtFpUHFixedSCode, 14137379Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 14147396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vcvtFpUHFixedSIop); 14157396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpUHFixedSIop); 14167379Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpUHFixedSIop); 14177379Sgblack@eecs.umich.edu 14187379Sgblack@eecs.umich.edu vcvtFpUHFixedDCode = ''' 14197397Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 14207397Sgblack@eecs.umich.edu double cOp1 = dbl(FpOp1P0.uw, FpOp1P1.uw); 14217397Sgblack@eecs.umich.edu vfpFlushToZero(fpscr, cOp1); 14227397Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 14237397Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (cOp1) : "m" (cOp1)); 14247397Sgblack@eecs.umich.edu uint64_t mid = vfpFpDToFixed(cOp1, false, true, imm); 14257381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (mid)); 14267639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 14277397Sgblack@eecs.umich.edu Fpscr = fpscr; 14287379Sgblack@eecs.umich.edu FpDestP0.uw = mid; 14297379Sgblack@eecs.umich.edu FpDestP1.uw = mid >> 32; 14307379Sgblack@eecs.umich.edu ''' 14317379Sgblack@eecs.umich.edu vcvtFpUHFixedDIop = InstObjParams("vcvt", "VcvtFpUHFixedD", 14327396Sgblack@eecs.umich.edu "FpRegRegImmOp", 14337379Sgblack@eecs.umich.edu { "code": vcvtFpUHFixedDCode, 14347379Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 14357396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vcvtFpUHFixedDIop); 14367396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vcvtFpUHFixedDIop); 14377379Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtFpUHFixedDIop); 14387379Sgblack@eecs.umich.edu 14397379Sgblack@eecs.umich.edu vcvtSHFixedFpSCode = ''' 14407397Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 14417397Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 14427381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1.sh) : "m" (FpOp1.sh)); 14437639Sgblack@eecs.umich.edu FpDest = vfpSFixedToFpS(fpscr.fz, fpscr.dn, FpOp1.sh, true, imm); 14447381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest)); 14457639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 14467397Sgblack@eecs.umich.edu Fpscr = fpscr; 14477379Sgblack@eecs.umich.edu ''' 14487379Sgblack@eecs.umich.edu vcvtSHFixedFpSIop = InstObjParams("vcvt", "VcvtSHFixedFpS", 14497396Sgblack@eecs.umich.edu "FpRegRegImmOp", 14507379Sgblack@eecs.umich.edu { "code": vcvtSHFixedFpSCode, 14517379Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 14527396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vcvtSHFixedFpSIop); 14537396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vcvtSHFixedFpSIop); 14547379Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtSHFixedFpSIop); 14557379Sgblack@eecs.umich.edu 14567379Sgblack@eecs.umich.edu vcvtSHFixedFpDCode = ''' 14577397Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 14587379Sgblack@eecs.umich.edu uint64_t mid = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 14597397Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 14607381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (mid) : "m" (mid)); 14617639Sgblack@eecs.umich.edu double cDest = vfpSFixedToFpD(fpscr.fz, fpscr.dn, mid, true, imm); 14627397Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (cDest)); 14637639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 14647397Sgblack@eecs.umich.edu Fpscr = fpscr; 14657397Sgblack@eecs.umich.edu FpDestP0.uw = dblLow(cDest); 14667397Sgblack@eecs.umich.edu FpDestP1.uw = dblHi(cDest); 14677379Sgblack@eecs.umich.edu ''' 14687379Sgblack@eecs.umich.edu vcvtSHFixedFpDIop = InstObjParams("vcvt", "VcvtSHFixedFpD", 14697396Sgblack@eecs.umich.edu "FpRegRegImmOp", 14707379Sgblack@eecs.umich.edu { "code": vcvtSHFixedFpDCode, 14717379Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 14727396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vcvtSHFixedFpDIop); 14737396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vcvtSHFixedFpDIop); 14747379Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtSHFixedFpDIop); 14757379Sgblack@eecs.umich.edu 14767379Sgblack@eecs.umich.edu vcvtUHFixedFpSCode = ''' 14777397Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 14787397Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 14797381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (FpOp1.uh) : "m" (FpOp1.uh)); 14807639Sgblack@eecs.umich.edu FpDest = vfpUFixedToFpS(fpscr.fz, fpscr.dn, FpOp1.uh, true, imm); 14817381Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (FpDest)); 14827639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 14837397Sgblack@eecs.umich.edu Fpscr = fpscr; 14847379Sgblack@eecs.umich.edu ''' 14857379Sgblack@eecs.umich.edu vcvtUHFixedFpSIop = InstObjParams("vcvt", "VcvtUHFixedFpS", 14867396Sgblack@eecs.umich.edu "FpRegRegImmOp", 14877379Sgblack@eecs.umich.edu { "code": vcvtUHFixedFpSCode, 14887379Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 14897396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vcvtUHFixedFpSIop); 14907396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vcvtUHFixedFpSIop); 14917379Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtUHFixedFpSIop); 14927379Sgblack@eecs.umich.edu 14937379Sgblack@eecs.umich.edu vcvtUHFixedFpDCode = ''' 14947397Sgblack@eecs.umich.edu FPSCR fpscr = Fpscr; 14957379Sgblack@eecs.umich.edu uint64_t mid = ((uint64_t)FpOp1P0.uw | ((uint64_t)FpOp1P1.uw << 32)); 14967397Sgblack@eecs.umich.edu VfpSavedState state = prepFpState(fpscr.rMode); 14977381Sgblack@eecs.umich.edu __asm__ __volatile__("" : "=m" (mid) : "m" (mid)); 14987639Sgblack@eecs.umich.edu double cDest = vfpUFixedToFpD(fpscr.fz, fpscr.dn, mid, true, imm); 14997397Sgblack@eecs.umich.edu __asm__ __volatile__("" :: "m" (cDest)); 15007639Sgblack@eecs.umich.edu finishVfp(fpscr, state, fpscr.fz); 15017397Sgblack@eecs.umich.edu Fpscr = fpscr; 15027397Sgblack@eecs.umich.edu FpDestP0.uw = dblLow(cDest); 15037397Sgblack@eecs.umich.edu FpDestP1.uw = dblHi(cDest); 15047379Sgblack@eecs.umich.edu ''' 15057379Sgblack@eecs.umich.edu vcvtUHFixedFpDIop = InstObjParams("vcvt", "VcvtUHFixedFpD", 15067396Sgblack@eecs.umich.edu "FpRegRegImmOp", 15077379Sgblack@eecs.umich.edu { "code": vcvtUHFixedFpDCode, 15087379Sgblack@eecs.umich.edu "predicate_test": predicateTest }, []) 15097396Sgblack@eecs.umich.edu header_output += FpRegRegImmOpDeclare.subst(vcvtUHFixedFpDIop); 15107396Sgblack@eecs.umich.edu decoder_output += FpRegRegImmOpConstructor.subst(vcvtUHFixedFpDIop); 15117379Sgblack@eecs.umich.edu exec_output += PredOpExecute.subst(vcvtUHFixedFpDIop); 15127379Sgblack@eecs.umich.edu}}; 1513