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