fp.isa revision 7356
16019Shines@cs.fsu.edu// -*- mode:c++ -*- 210338SCurtis.Dunham@arm.com 37091Sgblack@eecs.umich.edu// Copyright (c) 2010 ARM Limited 47091Sgblack@eecs.umich.edu// All rights reserved 57091Sgblack@eecs.umich.edu// 67091Sgblack@eecs.umich.edu// The license below extends only to copyright in the software and shall 77091Sgblack@eecs.umich.edu// not be construed as granting a license to any other intellectual 87091Sgblack@eecs.umich.edu// property including but not limited to intellectual property relating 97091Sgblack@eecs.umich.edu// to a hardware implementation of the functionality of the software 107091Sgblack@eecs.umich.edu// licensed hereunder. You may use the software subject to the license 117091Sgblack@eecs.umich.edu// terms below provided that you ensure that this notice is replicated 127091Sgblack@eecs.umich.edu// unmodified and in its entirety in all distributions of the software, 137091Sgblack@eecs.umich.edu// modified or unmodified, in source code or in binary form. 146019Shines@cs.fsu.edu// 156019Shines@cs.fsu.edu// Copyright (c) 2007-2008 The Florida State University 166019Shines@cs.fsu.edu// All rights reserved. 176019Shines@cs.fsu.edu// 186019Shines@cs.fsu.edu// Redistribution and use in source and binary forms, with or without 196019Shines@cs.fsu.edu// modification, are permitted provided that the following conditions are 206019Shines@cs.fsu.edu// met: redistributions of source code must retain the above copyright 216019Shines@cs.fsu.edu// notice, this list of conditions and the following disclaimer; 226019Shines@cs.fsu.edu// redistributions in binary form must reproduce the above copyright 236019Shines@cs.fsu.edu// notice, this list of conditions and the following disclaimer in the 246019Shines@cs.fsu.edu// documentation and/or other materials provided with the distribution; 256019Shines@cs.fsu.edu// neither the name of the copyright holders nor the names of its 266019Shines@cs.fsu.edu// contributors may be used to endorse or promote products derived from 276019Shines@cs.fsu.edu// this software without specific prior written permission. 286019Shines@cs.fsu.edu// 296019Shines@cs.fsu.edu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 306019Shines@cs.fsu.edu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 316019Shines@cs.fsu.edu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 326019Shines@cs.fsu.edu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 336019Shines@cs.fsu.edu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 346019Shines@cs.fsu.edu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 356019Shines@cs.fsu.edu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 366019Shines@cs.fsu.edu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 376019Shines@cs.fsu.edu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 386019Shines@cs.fsu.edu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 396019Shines@cs.fsu.edu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 406019Shines@cs.fsu.edu// 416019Shines@cs.fsu.edu// Authors: Stephen Hines 426019Shines@cs.fsu.edu 438449Sgblack@eecs.umich.edu//////////////////////////////////////////////////////////////////// 448449Sgblack@eecs.umich.edu// 458449Sgblack@eecs.umich.edu// Floating Point operate instructions 468449Sgblack@eecs.umich.edu// 478449Sgblack@eecs.umich.edu 488449Sgblack@eecs.umich.edudef template FPAExecute {{ 498449Sgblack@eecs.umich.edu Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, Trace::InstRecord *traceData) const 508449Sgblack@eecs.umich.edu { 518449Sgblack@eecs.umich.edu Fault fault = NoFault; 528449Sgblack@eecs.umich.edu 536019Shines@cs.fsu.edu %(fp_enable_check)s; 546019Shines@cs.fsu.edu 556312Sgblack@eecs.umich.edu %(op_decl)s; 566312Sgblack@eecs.umich.edu %(op_rd)s; 577720Sgblack@eecs.umich.edu 586312Sgblack@eecs.umich.edu if (%(predicate_test)s) { 597186Sgblack@eecs.umich.edu %(code)s; 607720Sgblack@eecs.umich.edu if (fault == NoFault) { 617186Sgblack@eecs.umich.edu %(op_wb)s; 627186Sgblack@eecs.umich.edu } 636312Sgblack@eecs.umich.edu } 647093Sgblack@eecs.umich.edu 656312Sgblack@eecs.umich.edu return fault; 666312Sgblack@eecs.umich.edu } 677148Sgblack@eecs.umich.edu}}; 687148Sgblack@eecs.umich.edu 697148Sgblack@eecs.umich.edudef template FloatDoubleDecode {{ 707148Sgblack@eecs.umich.edu { 717184Sgblack@eecs.umich.edu ArmStaticInst *i = NULL; 727184Sgblack@eecs.umich.edu switch (OPCODE_19 << 1 | OPCODE_7) 737289Sgblack@eecs.umich.edu { 747289Sgblack@eecs.umich.edu case 0: 757289Sgblack@eecs.umich.edu i = (ArmStaticInst *)new %(class_name)sS(machInst); 767289Sgblack@eecs.umich.edu break; 777184Sgblack@eecs.umich.edu case 1: 787184Sgblack@eecs.umich.edu i = (ArmStaticInst *)new %(class_name)sD(machInst); 797184Sgblack@eecs.umich.edu break; 807184Sgblack@eecs.umich.edu case 2: 817184Sgblack@eecs.umich.edu case 3: 827184Sgblack@eecs.umich.edu default: 8310037SARM gem5 Developers panic("Cannot decode float/double nature of the instruction"); 8410037SARM gem5 Developers } 8510037SARM gem5 Developers return i; 8610037SARM gem5 Developers } 8710037SARM gem5 Developers}}; 8810037SARM gem5 Developers 8910037SARM gem5 Developers// Primary format for float point operate instructions: 9010037SARM gem5 Developersdef format FloatOp(code, *flags) {{ 9110037SARM gem5 Developers orig_code = code 9210037SARM gem5 Developers 9310037SARM gem5 Developers cblk = code 9410037SARM gem5 Developers iop = InstObjParams(name, Name, 'PredOp', 9510037SARM gem5 Developers {"code": cblk, 9610037SARM gem5 Developers "predicate_test": predicateTest}, 9710037SARM gem5 Developers flags) 9810037SARM gem5 Developers header_output = BasicDeclare.subst(iop) 9910037SARM gem5 Developers decoder_output = BasicConstructor.subst(iop) 10010037SARM gem5 Developers exec_output = FPAExecute.subst(iop) 10110037SARM gem5 Developers 10210037SARM gem5 Developers sng_cblk = code 10310037SARM gem5 Developers sng_iop = InstObjParams(name, Name+'S', 'PredOp', 10410037SARM gem5 Developers {"code": sng_cblk, 10510037SARM gem5 Developers "predicate_test": predicateTest}, 10610037SARM gem5 Developers flags) 10710037SARM gem5 Developers header_output += BasicDeclare.subst(sng_iop) 1087797Sgblack@eecs.umich.edu decoder_output += BasicConstructor.subst(sng_iop) 1097797Sgblack@eecs.umich.edu exec_output += FPAExecute.subst(sng_iop) 1107797Sgblack@eecs.umich.edu 1117797Sgblack@eecs.umich.edu dbl_code = re.sub(r'\.sf', '.df', orig_code) 1127797Sgblack@eecs.umich.edu 1137797Sgblack@eecs.umich.edu dbl_cblk = dbl_code 1147797Sgblack@eecs.umich.edu dbl_iop = InstObjParams(name, Name+'D', 'PredOp', 1157797Sgblack@eecs.umich.edu {"code": dbl_cblk, 1167797Sgblack@eecs.umich.edu "predicate_test": predicateTest}, 1177797Sgblack@eecs.umich.edu flags) 1187797Sgblack@eecs.umich.edu header_output += BasicDeclare.subst(dbl_iop) 1197797Sgblack@eecs.umich.edu decoder_output += BasicConstructor.subst(dbl_iop) 1207797Sgblack@eecs.umich.edu exec_output += FPAExecute.subst(dbl_iop) 1217797Sgblack@eecs.umich.edu 1227797Sgblack@eecs.umich.edu decode_block = FloatDoubleDecode.subst(iop) 1237797Sgblack@eecs.umich.edu}}; 1247797Sgblack@eecs.umich.edu 1257797Sgblack@eecs.umich.edulet {{ 1267797Sgblack@eecs.umich.edu calcFPCcCode = ''' 12710037SARM gem5 Developers uint16_t _in, _iz, _ic, _iv; 12810037SARM gem5 Developers 12910037SARM gem5 Developers _in = %(fReg1)s < %(fReg2)s; 13010037SARM gem5 Developers _iz = %(fReg1)s == %(fReg2)s; 13110037SARM gem5 Developers _ic = %(fReg1)s >= %(fReg2)s; 13210037SARM gem5 Developers _iv = (isnan(%(fReg1)s) || isnan(%(fReg2)s)) & 1; 13310037SARM gem5 Developers 13410037SARM gem5 Developers CondCodes = _in << 31 | _iz << 30 | _ic << 29 | _iv << 28 | 13510037SARM gem5 Developers (CondCodes & 0x0FFFFFFF); 13610037SARM gem5 Developers ''' 13710037SARM gem5 Developers}}; 13810037SARM gem5 Developers 1397797Sgblack@eecs.umich.edudef format FloatCmp(fReg1, fReg2, *flags) {{ 1407797Sgblack@eecs.umich.edu code = calcFPCcCode % vars() 1417797Sgblack@eecs.umich.edu iop = InstObjParams(name, Name, 'PredOp', 1427797Sgblack@eecs.umich.edu {"code": code, 1437797Sgblack@eecs.umich.edu "predicate_test": predicateTest}, 1447797Sgblack@eecs.umich.edu flags) 1457797Sgblack@eecs.umich.edu header_output = BasicDeclare.subst(iop) 1467797Sgblack@eecs.umich.edu decoder_output = BasicConstructor.subst(iop) 1477797Sgblack@eecs.umich.edu decode_block = BasicDecode.subst(iop) 1487797Sgblack@eecs.umich.edu exec_output = FPAExecute.subst(iop) 1497797Sgblack@eecs.umich.edu}}; 1507797Sgblack@eecs.umich.edu 1517797Sgblack@eecs.umich.edulet {{ 1527797Sgblack@eecs.umich.edu header_output = ''' 1537797Sgblack@eecs.umich.edu StaticInstPtr 15410338SCurtis.Dunham@arm.com decodeExtensionRegLoadStore(ExtMachInst machInst); 15510338SCurtis.Dunham@arm.com ''' 1567797Sgblack@eecs.umich.edu decoder_output = ''' 1577797Sgblack@eecs.umich.edu StaticInstPtr 1589251Snathanael.premillieu@irisa.fr decodeExtensionRegLoadStore(ExtMachInst machInst) 1597797Sgblack@eecs.umich.edu { 16010037SARM gem5 Developers const uint32_t opcode = bits(machInst, 24, 20); 16110037SARM gem5 Developers const uint32_t offset = bits(machInst, 7, 0); 16210037SARM gem5 Developers const bool single = (bits(machInst, 8) == 0); 16310037SARM gem5 Developers const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 19, 16); 16410037SARM gem5 Developers RegIndex vd; 16510037SARM gem5 Developers if (single) { 1667797Sgblack@eecs.umich.edu vd = (RegIndex)(uint32_t)((bits(machInst, 15, 12) << 1) | 1677797Sgblack@eecs.umich.edu bits(machInst, 22)); 1687797Sgblack@eecs.umich.edu } else { 1697797Sgblack@eecs.umich.edu vd = (RegIndex)(uint32_t)((bits(machInst, 15, 12) << 1) | 17010037SARM gem5 Developers (bits(machInst, 22) << 5)); 1716312Sgblack@eecs.umich.edu } 1726312Sgblack@eecs.umich.edu switch (bits(opcode, 4, 3)) { 1736019Shines@cs.fsu.edu case 0x0: 1747119Sgblack@eecs.umich.edu if (bits(opcode, 4, 1) == 0x2 && 1757797Sgblack@eecs.umich.edu !(machInst.thumb == 1 && bits(machInst, 28) == 1) && 17610037SARM gem5 Developers !(machInst.thumb == 0 && machInst.condCode == 0xf)) { 17710037SARM gem5 Developers if ((bits(machInst, 7, 4) & 0xd) != 1) { 17810037SARM gem5 Developers break; 1797797Sgblack@eecs.umich.edu } 1807797Sgblack@eecs.umich.edu const IntRegIndex rt = 1817797Sgblack@eecs.umich.edu (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 18210037SARM gem5 Developers const IntRegIndex rt2 = 18310037SARM gem5 Developers (IntRegIndex)(uint32_t)bits(machInst, 19, 16); 1847797Sgblack@eecs.umich.edu const bool op = bits(machInst, 20); 18510037SARM gem5 Developers uint32_t vm; 18610037SARM gem5 Developers if (single) { 1877797Sgblack@eecs.umich.edu vm = (bits(machInst, 3, 0) << 1) | bits(machInst, 5); 18810037SARM gem5 Developers } else { 1897797Sgblack@eecs.umich.edu vm = (bits(machInst, 3, 0) << 1) | 1907797Sgblack@eecs.umich.edu (bits(machInst, 5) << 5); 1917797Sgblack@eecs.umich.edu } 1927797Sgblack@eecs.umich.edu if (op) { 1937797Sgblack@eecs.umich.edu return new Vmov2Core2Reg(machInst, rt, rt2, 19410037SARM gem5 Developers (IntRegIndex)vm); 19510037SARM gem5 Developers } else { 19610037SARM gem5 Developers return new Vmov2Reg2Core(machInst, (IntRegIndex)vm, 19710037SARM gem5 Developers rt, rt2); 19810037SARM gem5 Developers } 19910037SARM gem5 Developers } 20010037SARM gem5 Developers break; 20110037SARM gem5 Developers case 0x1: 20210037SARM gem5 Developers switch (bits(opcode, 1, 0)) { 2037797Sgblack@eecs.umich.edu case 0x0: 2047797Sgblack@eecs.umich.edu return new VLdmStm(machInst, rn, vd, single, 2057797Sgblack@eecs.umich.edu true, false, false, offset); 2067797Sgblack@eecs.umich.edu case 0x1: 2076019Shines@cs.fsu.edu return new VLdmStm(machInst, rn, vd, single, 2087797Sgblack@eecs.umich.edu true, false, true, offset); 2097797Sgblack@eecs.umich.edu case 0x2: 21010037SARM gem5 Developers return new VLdmStm(machInst, rn, vd, single, 2117797Sgblack@eecs.umich.edu true, true, false, offset); 21210037SARM gem5 Developers case 0x3: 2137797Sgblack@eecs.umich.edu // If rn == sp, then this is called vpop. 2148204SAli.Saidi@ARM.com return new VLdmStm(machInst, rn, vd, single, 2157797Sgblack@eecs.umich.edu true, true, true, offset); 2168204SAli.Saidi@ARM.com } 2178204SAli.Saidi@ARM.com case 0x2: 2188204SAli.Saidi@ARM.com if (bits(opcode, 1, 0) == 0x2) { 21910037SARM gem5 Developers // If rn == sp, then this is called vpush. 22010037SARM gem5 Developers return new VLdmStm(machInst, rn, vd, single, 22110037SARM gem5 Developers false, true, false, offset); 22210037SARM gem5 Developers } else if (bits(opcode, 1, 0) == 0x3) { 2237797Sgblack@eecs.umich.edu return new VLdmStm(machInst, rn, vd, single, 22410338SCurtis.Dunham@arm.com false, true, true, offset); 22510338SCurtis.Dunham@arm.com } 22610338SCurtis.Dunham@arm.com // Fall through on purpose 22710338SCurtis.Dunham@arm.com case 0x3: 22810338SCurtis.Dunham@arm.com const bool up = (bits(machInst, 23) == 1); 22910338SCurtis.Dunham@arm.com const uint32_t imm = bits(machInst, 7, 0) << 2; 23010338SCurtis.Dunham@arm.com RegIndex vd; 23110338SCurtis.Dunham@arm.com if (single) { 23210338SCurtis.Dunham@arm.com vd = (RegIndex)(uint32_t)((bits(machInst, 15, 12) << 1) | 23310338SCurtis.Dunham@arm.com (bits(machInst, 22))); 23410338SCurtis.Dunham@arm.com } else { 23510338SCurtis.Dunham@arm.com vd = (RegIndex)(uint32_t)((bits(machInst, 15, 12) << 1) | 2368303SAli.Saidi@ARM.com (bits(machInst, 22) << 5)); 23710338SCurtis.Dunham@arm.com } 23810338SCurtis.Dunham@arm.com if (bits(opcode, 1, 0) == 0x0) { 23910338SCurtis.Dunham@arm.com if (single) { 24010338SCurtis.Dunham@arm.com if (up) { 24110338SCurtis.Dunham@arm.com return new %(vstr_us)s(machInst, vd, rn, up, imm); 24210338SCurtis.Dunham@arm.com } else { 24310338SCurtis.Dunham@arm.com return new %(vstr_s)s(machInst, vd, rn, up, imm); 24410338SCurtis.Dunham@arm.com } 24510338SCurtis.Dunham@arm.com } else { 24610338SCurtis.Dunham@arm.com if (up) { 24710338SCurtis.Dunham@arm.com return new %(vstr_ud)s(machInst, vd, vd + 1, 24810338SCurtis.Dunham@arm.com rn, up, imm); 2497797Sgblack@eecs.umich.edu } else { 2507797Sgblack@eecs.umich.edu return new %(vstr_d)s(machInst, vd, vd + 1, 2517797Sgblack@eecs.umich.edu rn, up, imm); 2527797Sgblack@eecs.umich.edu } 2537797Sgblack@eecs.umich.edu } 2547797Sgblack@eecs.umich.edu } else if (bits(opcode, 1, 0) == 0x1) { 2557797Sgblack@eecs.umich.edu if (single) { 2567797Sgblack@eecs.umich.edu if (up) { 2577797Sgblack@eecs.umich.edu return new %(vldr_us)s(machInst, vd, rn, up, imm); 2587797Sgblack@eecs.umich.edu } else { 2597797Sgblack@eecs.umich.edu return new %(vldr_s)s(machInst, vd, rn, up, imm); 2607797Sgblack@eecs.umich.edu } 2617797Sgblack@eecs.umich.edu } else { 2627797Sgblack@eecs.umich.edu if (up) { 2637797Sgblack@eecs.umich.edu return new %(vldr_ud)s(machInst, vd, vd + 1, 2647797Sgblack@eecs.umich.edu rn, up, imm); 2657797Sgblack@eecs.umich.edu } else { 2667797Sgblack@eecs.umich.edu return new %(vldr_d)s(machInst, vd, vd + 1, 2677797Sgblack@eecs.umich.edu rn, up, imm); 2687797Sgblack@eecs.umich.edu } 2697797Sgblack@eecs.umich.edu } 2707797Sgblack@eecs.umich.edu } 2717797Sgblack@eecs.umich.edu } 2727797Sgblack@eecs.umich.edu return new Unknown(machInst); 2737797Sgblack@eecs.umich.edu } 2747797Sgblack@eecs.umich.edu ''' % { 2757797Sgblack@eecs.umich.edu "vldr_us" : "VLDR_" + loadImmClassName(False, True, False), 2767797Sgblack@eecs.umich.edu "vldr_s" : "VLDR_" + loadImmClassName(False, False, False), 2777797Sgblack@eecs.umich.edu "vldr_ud" : "VLDR_" + loadDoubleImmClassName(False, True, False), 2787797Sgblack@eecs.umich.edu "vldr_d" : "VLDR_" + loadDoubleImmClassName(False, False, False), 2797797Sgblack@eecs.umich.edu "vstr_us" : "VSTR_" + storeImmClassName(False, True, False), 2807797Sgblack@eecs.umich.edu "vstr_s" : "VSTR_" + storeImmClassName(False, False, False), 2817797Sgblack@eecs.umich.edu "vstr_ud" : "VSTR_" + storeDoubleImmClassName(False, True, False), 2827797Sgblack@eecs.umich.edu "vstr_d" : "VSTR_" + storeDoubleImmClassName(False, False, False) 2837797Sgblack@eecs.umich.edu } 2847797Sgblack@eecs.umich.edu}}; 2857797Sgblack@eecs.umich.edu 2867797Sgblack@eecs.umich.edudef format ExtensionRegLoadStore() {{ 2877797Sgblack@eecs.umich.edu decode_block = ''' 2887797Sgblack@eecs.umich.edu return decodeExtensionRegLoadStore(machInst); 2897797Sgblack@eecs.umich.edu ''' 2907797Sgblack@eecs.umich.edu}}; 2917797Sgblack@eecs.umich.edu 2927797Sgblack@eecs.umich.edulet {{ 2937797Sgblack@eecs.umich.edu header_output = ''' 2947797Sgblack@eecs.umich.edu StaticInstPtr 2957797Sgblack@eecs.umich.edu decodeShortFpTransfer(ExtMachInst machInst); 2967797Sgblack@eecs.umich.edu ''' 2977797Sgblack@eecs.umich.edu decoder_output = ''' 2987797Sgblack@eecs.umich.edu StaticInstPtr 29910037SARM gem5 Developers decodeShortFpTransfer(ExtMachInst machInst) 30010037SARM gem5 Developers { 30110037SARM gem5 Developers const uint32_t l = bits(machInst, 20); 30210037SARM gem5 Developers const uint32_t c = bits(machInst, 8); 30310037SARM gem5 Developers const uint32_t a = bits(machInst, 23, 21); 30410037SARM gem5 Developers const uint32_t b = bits(machInst, 6, 5); 30510037SARM gem5 Developers if ((machInst.thumb == 1 && bits(machInst, 28) == 1) || 30610037SARM gem5 Developers (machInst.thumb == 0 && machInst.condCode == 0xf)) { 30710037SARM gem5 Developers return new Unknown(machInst); 30810037SARM gem5 Developers } 30910037SARM gem5 Developers if (l == 0 && c == 0) { 31010037SARM gem5 Developers if (a == 0) { 31110037SARM gem5 Developers const uint32_t vn = (bits(machInst, 19, 16) << 1) | 31210037SARM gem5 Developers bits(machInst, 7); 31310037SARM gem5 Developers const IntRegIndex rt = 31410037SARM gem5 Developers (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 31510037SARM gem5 Developers if (bits(machInst, 20) == 1) { 31610037SARM gem5 Developers return new VmovRegCoreW(machInst, rt, (IntRegIndex)vn); 31710037SARM gem5 Developers } else { 31810037SARM gem5 Developers return new VmovCoreRegW(machInst, (IntRegIndex)vn, rt); 31910037SARM gem5 Developers } 32010037SARM gem5 Developers } else if (a == 0x7) { 32110037SARM gem5 Developers const IntRegIndex rt = 32210037SARM gem5 Developers (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 32310037SARM gem5 Developers uint32_t specReg = bits(machInst, 19, 16); 32410037SARM gem5 Developers switch (specReg) { 32510037SARM gem5 Developers case 0: 32610037SARM gem5 Developers specReg = MISCREG_FPSID; 32710037SARM gem5 Developers break; 32810037SARM gem5 Developers case 1: 32910037SARM gem5 Developers specReg = MISCREG_FPSCR; 33010037SARM gem5 Developers break; 33110037SARM gem5 Developers case 8: 33210037SARM gem5 Developers specReg = MISCREG_FPEXC; 33310037SARM gem5 Developers break; 33410037SARM gem5 Developers default: 33510037SARM gem5 Developers return new Unknown(machInst); 33610037SARM gem5 Developers } 33710037SARM gem5 Developers return new Vmsr(machInst, (IntRegIndex)specReg, rt); 33810037SARM gem5 Developers } 33910037SARM gem5 Developers } else if (l == 0 && c == 1) { 34010037SARM gem5 Developers if (bits(a, 2) == 0) { 34110037SARM gem5 Developers uint32_t vd = (bits(machInst, 7) << 5) | 34210037SARM gem5 Developers (bits(machInst, 19, 16) << 1); 34310037SARM gem5 Developers uint32_t index, size; 34410037SARM gem5 Developers const IntRegIndex rt = 34510037SARM gem5 Developers (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 34610037SARM gem5 Developers if (bits(machInst, 22) == 1) { 34710037SARM gem5 Developers size = 8; 34810037SARM gem5 Developers index = (bits(machInst, 21) << 2) | 34910037SARM gem5 Developers bits(machInst, 6, 5); 35010037SARM gem5 Developers } else if (bits(machInst, 5) == 1) { 35110037SARM gem5 Developers size = 16; 35210037SARM gem5 Developers index = (bits(machInst, 21) << 1) | 35310037SARM gem5 Developers bits(machInst, 6); 35410037SARM gem5 Developers } else if (bits(machInst, 6) == 0) { 35510037SARM gem5 Developers size = 32; 35610037SARM gem5 Developers index = bits(machInst, 21); 35710037SARM gem5 Developers } else { 35810037SARM gem5 Developers return new Unknown(machInst); 35910037SARM gem5 Developers } 36010037SARM gem5 Developers if (index >= (32 / size)) { 36110037SARM gem5 Developers index -= (32 / size); 36210037SARM gem5 Developers vd++; 36310037SARM gem5 Developers } 36410037SARM gem5 Developers switch (size) { 36510037SARM gem5 Developers case 8: 36610037SARM gem5 Developers return new VmovCoreRegB(machInst, (IntRegIndex)vd, 36710037SARM gem5 Developers rt, index); 36810037SARM gem5 Developers case 16: 36910037SARM gem5 Developers return new VmovCoreRegH(machInst, (IntRegIndex)vd, 37010037SARM gem5 Developers rt, index); 37110037SARM gem5 Developers case 32: 37210037SARM gem5 Developers return new VmovCoreRegW(machInst, (IntRegIndex)vd, rt); 37310037SARM gem5 Developers } 37410037SARM gem5 Developers } else if (bits(b, 1) == 0) { 37510037SARM gem5 Developers // A8-594 37610037SARM gem5 Developers return new WarnUnimplemented("vdup", machInst); 37710037SARM gem5 Developers } 37810037SARM gem5 Developers } else if (l == 1 && c == 0) { 37910037SARM gem5 Developers if (a == 0) { 38010037SARM gem5 Developers const uint32_t vn = (bits(machInst, 19, 16) << 1) | 3817797Sgblack@eecs.umich.edu bits(machInst, 7); 3827797Sgblack@eecs.umich.edu const IntRegIndex rt = 3837797Sgblack@eecs.umich.edu (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 38410037SARM gem5 Developers if (bits(machInst, 20) == 1) { 38510037SARM gem5 Developers return new VmovRegCoreW(machInst, rt, (IntRegIndex)vn); 38610037SARM gem5 Developers } else { 38710037SARM gem5 Developers return new VmovCoreRegW(machInst, (IntRegIndex)vn, rt); 3887797Sgblack@eecs.umich.edu } 3897797Sgblack@eecs.umich.edu } else if (a == 7) { 3907797Sgblack@eecs.umich.edu const IntRegIndex rt = 3918302SAli.Saidi@ARM.com (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 3927797Sgblack@eecs.umich.edu uint32_t specReg = bits(machInst, 19, 16); 3937797Sgblack@eecs.umich.edu switch (specReg) { 3947797Sgblack@eecs.umich.edu case 0: 3957797Sgblack@eecs.umich.edu specReg = MISCREG_FPSID; 3967797Sgblack@eecs.umich.edu break; 3977797Sgblack@eecs.umich.edu case 1: 3987797Sgblack@eecs.umich.edu specReg = MISCREG_FPSCR; 39910037SARM gem5 Developers break; 4007797Sgblack@eecs.umich.edu case 6: 40110037SARM gem5 Developers specReg = MISCREG_MVFR1; 40210037SARM gem5 Developers break; 40310037SARM gem5 Developers case 7: 40410037SARM gem5 Developers specReg = MISCREG_MVFR0; 40510037SARM gem5 Developers break; 40610037SARM gem5 Developers case 8: 40710037SARM gem5 Developers specReg = MISCREG_FPEXC; 40810037SARM gem5 Developers break; 40910037SARM gem5 Developers default: 41010037SARM gem5 Developers return new Unknown(machInst); 41110037SARM gem5 Developers } 4127797Sgblack@eecs.umich.edu return new Vmrs(machInst, rt, (IntRegIndex)specReg); 4137797Sgblack@eecs.umich.edu } 4148209SAli.Saidi@ARM.com } else { 41510037SARM gem5 Developers uint32_t vd = (bits(machInst, 7) << 5) | 4166019Shines@cs.fsu.edu (bits(machInst, 19, 16) << 1); 4176308Sgblack@eecs.umich.edu uint32_t index, size; 4188139SMatt.Horsnell@arm.com const IntRegIndex rt = 41910037SARM gem5 Developers (IntRegIndex)(uint32_t)bits(machInst, 15, 12); 42010037SARM gem5 Developers const bool u = (bits(machInst, 23) == 1); 4217797Sgblack@eecs.umich.edu if (bits(machInst, 22) == 1) { 4227797Sgblack@eecs.umich.edu size = 8; 42310037SARM gem5 Developers index = (bits(machInst, 21) << 2) | 4248139SMatt.Horsnell@arm.com bits(machInst, 6, 5); 42510037SARM gem5 Developers } else if (bits(machInst, 5) == 1) { 4268139SMatt.Horsnell@arm.com size = 16; 42710037SARM gem5 Developers index = (bits(machInst, 21) << 1) | 4286308Sgblack@eecs.umich.edu bits(machInst, 6); 4296019Shines@cs.fsu.edu } else if (bits(machInst, 6) == 0 && !u) { 4307797Sgblack@eecs.umich.edu size = 32; 4316019Shines@cs.fsu.edu index = bits(machInst, 21); 4327797Sgblack@eecs.umich.edu } else { 43310037SARM gem5 Developers return new Unknown(machInst); 4347797Sgblack@eecs.umich.edu } 4357797Sgblack@eecs.umich.edu if (index >= (32 / size)) { 4367797Sgblack@eecs.umich.edu index -= (32 / size); 4377797Sgblack@eecs.umich.edu vd++; 4387797Sgblack@eecs.umich.edu } 4397797Sgblack@eecs.umich.edu switch (size) { 4407797Sgblack@eecs.umich.edu case 8: 4418205SAli.Saidi@ARM.com if (u) { 4428205SAli.Saidi@ARM.com return new VmovRegCoreUB(machInst, rt, 44311514Sandreas.sandberg@arm.com (IntRegIndex)vd, index); 4447797Sgblack@eecs.umich.edu } else { 4457797Sgblack@eecs.umich.edu return new VmovRegCoreSB(machInst, rt, 4467797Sgblack@eecs.umich.edu (IntRegIndex)vd, index); 4477797Sgblack@eecs.umich.edu } 4487797Sgblack@eecs.umich.edu case 16: 4497797Sgblack@eecs.umich.edu if (u) { 4507797Sgblack@eecs.umich.edu return new VmovRegCoreUH(machInst, rt, 4517797Sgblack@eecs.umich.edu (IntRegIndex)vd, index); 4527797Sgblack@eecs.umich.edu } else { 4536019Shines@cs.fsu.edu return new VmovRegCoreSH(machInst, rt, 454 (IntRegIndex)vd, index); 455 } 456 case 32: 457 return new VmovRegCoreW(machInst, rt, (IntRegIndex)vd); 458 } 459 } 460 return new Unknown(machInst); 461 } 462 ''' 463}}; 464 465def format ShortFpTransfer() {{ 466 decode_block = ''' 467 return decodeShortFpTransfer(machInst); 468 ''' 469}}; 470