aarch64.isa revision 14127
114127Sgiacomo.travaglini@arm.com// Copyright (c) 2011-2019 ARM Limited
210037SARM gem5 Developers// All rights reserved
310037SARM gem5 Developers//
410037SARM gem5 Developers// The license below extends only to copyright in the software and shall
510037SARM gem5 Developers// not be construed as granting a license to any other intellectual
610037SARM gem5 Developers// property including but not limited to intellectual property relating
710037SARM gem5 Developers// to a hardware implementation of the functionality of the software
810037SARM gem5 Developers// licensed hereunder.  You may use the software subject to the license
910037SARM gem5 Developers// terms below provided that you ensure that this notice is replicated
1010037SARM gem5 Developers// unmodified and in its entirety in all distributions of the software,
1110037SARM gem5 Developers// modified or unmodified, in source code or in binary form.
1210037SARM gem5 Developers//
1310037SARM gem5 Developers// Redistribution and use in source and binary forms, with or without
1410037SARM gem5 Developers// modification, are permitted provided that the following conditions are
1510037SARM gem5 Developers// met: redistributions of source code must retain the above copyright
1610037SARM gem5 Developers// notice, this list of conditions and the following disclaimer;
1710037SARM gem5 Developers// redistributions in binary form must reproduce the above copyright
1810037SARM gem5 Developers// notice, this list of conditions and the following disclaimer in the
1910037SARM gem5 Developers// documentation and/or other materials provided with the distribution;
2010037SARM gem5 Developers// neither the name of the copyright holders nor the names of its
2110037SARM gem5 Developers// contributors may be used to endorse or promote products derived from
2210037SARM gem5 Developers// this software without specific prior written permission.
2310037SARM gem5 Developers//
2410037SARM gem5 Developers// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2510037SARM gem5 Developers// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2610037SARM gem5 Developers// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2710037SARM gem5 Developers// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2810037SARM gem5 Developers// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2910037SARM gem5 Developers// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3010037SARM gem5 Developers// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3110037SARM gem5 Developers// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3210037SARM gem5 Developers// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3310037SARM gem5 Developers// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3410037SARM gem5 Developers// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3510037SARM gem5 Developers//
3610037SARM gem5 Developers// Authors: Gabe Black
3710037SARM gem5 Developers//          Thomas Grocutt
3810037SARM gem5 Developers//          Mbou Eyole
3910037SARM gem5 Developers//          Giacomo Gabrielli
4010037SARM gem5 Developers
4110037SARM gem5 Developersoutput header {{
4210037SARM gem5 Developersnamespace Aarch64
4310037SARM gem5 Developers{
4410037SARM gem5 Developers    StaticInstPtr decodeDataProcImm(ExtMachInst machInst);
4510037SARM gem5 Developers    StaticInstPtr decodeBranchExcSys(ExtMachInst machInst);
4610037SARM gem5 Developers    StaticInstPtr decodeLoadsStores(ExtMachInst machInst);
4710037SARM gem5 Developers    StaticInstPtr decodeDataProcReg(ExtMachInst machInst);
4810037SARM gem5 Developers
4911165SRekai.GonzalezAlberquilla@arm.com    template <typename DecoderFeatures>
5010037SARM gem5 Developers    StaticInstPtr decodeFpAdvSIMD(ExtMachInst machInst);
5110037SARM gem5 Developers    StaticInstPtr decodeFp(ExtMachInst machInst);
5211165SRekai.GonzalezAlberquilla@arm.com    template <typename DecoderFeatures>
5310037SARM gem5 Developers    StaticInstPtr decodeAdvSIMD(ExtMachInst machInst);
5410037SARM gem5 Developers    StaticInstPtr decodeAdvSIMDScalar(ExtMachInst machInst);
5510037SARM gem5 Developers
5613759Sgiacomo.gabrielli@arm.com    StaticInstPtr decodeSveInt(ExtMachInst machInst);
5713759Sgiacomo.gabrielli@arm.com    StaticInstPtr decodeSveFp(ExtMachInst machInst);
5813759Sgiacomo.gabrielli@arm.com    StaticInstPtr decodeSveMem(ExtMachInst machInst);
5913759Sgiacomo.gabrielli@arm.com
6010037SARM gem5 Developers    StaticInstPtr decodeGem5Ops(ExtMachInst machInst);
6110037SARM gem5 Developers}
6210037SARM gem5 Developers}};
6310037SARM gem5 Developers
6410037SARM gem5 Developersoutput decoder {{
6510037SARM gem5 Developersnamespace Aarch64
6610037SARM gem5 Developers{
6710037SARM gem5 Developers    StaticInstPtr
6810037SARM gem5 Developers    decodeDataProcImm(ExtMachInst machInst)
6910037SARM gem5 Developers    {
7010037SARM gem5 Developers        IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 4, 0);
7110037SARM gem5 Developers        IntRegIndex rdsp = makeSP(rd);
7210337SAndrew.Bardsley@arm.com        IntRegIndex rdzr = makeZero(rd);
7310037SARM gem5 Developers        IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 9, 5);
7410037SARM gem5 Developers        IntRegIndex rnsp = makeSP(rn);
7510037SARM gem5 Developers
7610037SARM gem5 Developers        uint8_t opc = bits(machInst, 30, 29);
7710037SARM gem5 Developers        bool sf = bits(machInst, 31);
7810037SARM gem5 Developers        bool n = bits(machInst, 22);
7910037SARM gem5 Developers        uint8_t immr = bits(machInst, 21, 16);
8010037SARM gem5 Developers        uint8_t imms = bits(machInst, 15, 10);
8110037SARM gem5 Developers        switch (bits(machInst, 25, 23)) {
8210037SARM gem5 Developers          case 0x0:
8310037SARM gem5 Developers          case 0x1:
8410037SARM gem5 Developers          {
8510037SARM gem5 Developers            uint64_t immlo = bits(machInst, 30, 29);
8610037SARM gem5 Developers            uint64_t immhi = bits(machInst, 23, 5);
8710037SARM gem5 Developers            uint64_t imm = (immlo << 0) | (immhi << 2);
8810037SARM gem5 Developers            if (bits(machInst, 31) == 0)
8910337SAndrew.Bardsley@arm.com                return new AdrXImm(machInst, rdzr, INTREG_ZERO, sext<21>(imm));
9010037SARM gem5 Developers            else
9110337SAndrew.Bardsley@arm.com                return new AdrpXImm(machInst, rdzr, INTREG_ZERO,
9210037SARM gem5 Developers                                    sext<33>(imm << 12));
9310037SARM gem5 Developers          }
9410037SARM gem5 Developers          case 0x2:
9510037SARM gem5 Developers          case 0x3:
9610037SARM gem5 Developers          {
9710037SARM gem5 Developers            uint32_t imm12 = bits(machInst, 21, 10);
9810037SARM gem5 Developers            uint8_t shift = bits(machInst, 23, 22);
9910037SARM gem5 Developers            uint32_t imm;
10010037SARM gem5 Developers            if (shift == 0x0)
10110037SARM gem5 Developers                imm = imm12 << 0;
10210037SARM gem5 Developers            else if (shift == 0x1)
10310037SARM gem5 Developers                imm = imm12 << 12;
10410037SARM gem5 Developers            else
10510037SARM gem5 Developers                return new Unknown64(machInst);
10610037SARM gem5 Developers            switch (opc) {
10710037SARM gem5 Developers              case 0x0:
10810037SARM gem5 Developers                return new AddXImm(machInst, rdsp, rnsp, imm);
10910037SARM gem5 Developers              case 0x1:
11010337SAndrew.Bardsley@arm.com                return new AddXImmCc(machInst, rdzr, rnsp, imm);
11110037SARM gem5 Developers              case 0x2:
11210037SARM gem5 Developers                return new SubXImm(machInst, rdsp, rnsp, imm);
11310037SARM gem5 Developers              case 0x3:
11410337SAndrew.Bardsley@arm.com                return new SubXImmCc(machInst, rdzr, rnsp, imm);
11512595Ssiddhesh.poyarekar@gmail.com              default:
11612595Ssiddhesh.poyarekar@gmail.com                M5_UNREACHABLE;
11710037SARM gem5 Developers            }
11810037SARM gem5 Developers          }
11910037SARM gem5 Developers          case 0x4:
12010037SARM gem5 Developers          {
12110037SARM gem5 Developers            if (!sf && n)
12210037SARM gem5 Developers                return new Unknown64(machInst);
12310037SARM gem5 Developers            // len = MSB(n:NOT(imms)), len < 1 is undefined.
12410037SARM gem5 Developers            uint8_t len = 0;
12510037SARM gem5 Developers            if (n) {
12610037SARM gem5 Developers                len = 6;
12710037SARM gem5 Developers            } else if (imms == 0x3f || imms == 0x3e) {
12810037SARM gem5 Developers                return new Unknown64(machInst);
12910037SARM gem5 Developers            } else {
13010037SARM gem5 Developers                len = findMsbSet(imms ^ 0x3f);
13110037SARM gem5 Developers            }
13210037SARM gem5 Developers            // Generate r, s, and size.
13310037SARM gem5 Developers            uint64_t r = bits(immr, len - 1, 0);
13410037SARM gem5 Developers            uint64_t s = bits(imms, len - 1, 0);
13510037SARM gem5 Developers            uint8_t size = 1 << len;
13610037SARM gem5 Developers            if (s == size - 1)
13710037SARM gem5 Developers                return new Unknown64(machInst);
13810037SARM gem5 Developers            // Generate the pattern with s 1s, rotated by r, with size bits.
13910037SARM gem5 Developers            uint64_t pattern = mask(s + 1);
14010037SARM gem5 Developers            if (r) {
14110037SARM gem5 Developers                pattern = (pattern >> r) | (pattern << (size - r));
14210037SARM gem5 Developers                pattern &= mask(size);
14310037SARM gem5 Developers            }
14410037SARM gem5 Developers            uint8_t width = sf ? 64 : 32;
14510037SARM gem5 Developers            // Replicate that to fill up the immediate.
14610037SARM gem5 Developers            for (unsigned i = 1; i < (width / size); i *= 2)
14710037SARM gem5 Developers                pattern |= (pattern << (i * size));
14810037SARM gem5 Developers            uint64_t imm = pattern;
14910037SARM gem5 Developers
15010037SARM gem5 Developers            switch (opc) {
15110037SARM gem5 Developers              case 0x0:
15210037SARM gem5 Developers                return new AndXImm(machInst, rdsp, rn, imm);
15310037SARM gem5 Developers              case 0x1:
15410037SARM gem5 Developers                return new OrrXImm(machInst, rdsp, rn, imm);
15510037SARM gem5 Developers              case 0x2:
15610037SARM gem5 Developers                return new EorXImm(machInst, rdsp, rn, imm);
15710037SARM gem5 Developers              case 0x3:
15810337SAndrew.Bardsley@arm.com                return new AndXImmCc(machInst, rdzr, rn, imm);
15912595Ssiddhesh.poyarekar@gmail.com              default:
16012595Ssiddhesh.poyarekar@gmail.com                M5_UNREACHABLE;
16110037SARM gem5 Developers            }
16210037SARM gem5 Developers          }
16310037SARM gem5 Developers          case 0x5:
16410037SARM gem5 Developers          {
16510037SARM gem5 Developers            IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 4, 0);
16610337SAndrew.Bardsley@arm.com            IntRegIndex rdzr = makeZero(rd);
16710037SARM gem5 Developers            uint32_t imm16 = bits(machInst, 20, 5);
16810037SARM gem5 Developers            uint32_t hw = bits(machInst, 22, 21);
16910037SARM gem5 Developers            switch (opc) {
17010037SARM gem5 Developers              case 0x0:
17110337SAndrew.Bardsley@arm.com                return new Movn(machInst, rdzr, imm16, hw * 16);
17210037SARM gem5 Developers              case 0x1:
17310037SARM gem5 Developers                return new Unknown64(machInst);
17410037SARM gem5 Developers              case 0x2:
17510337SAndrew.Bardsley@arm.com                return new Movz(machInst, rdzr, imm16, hw * 16);
17610037SARM gem5 Developers              case 0x3:
17710337SAndrew.Bardsley@arm.com                return new Movk(machInst, rdzr, imm16, hw * 16);
17812595Ssiddhesh.poyarekar@gmail.com              default:
17912595Ssiddhesh.poyarekar@gmail.com                M5_UNREACHABLE;
18010037SARM gem5 Developers            }
18110037SARM gem5 Developers          }
18210037SARM gem5 Developers          case 0x6:
18310037SARM gem5 Developers            if ((sf != n) || (!sf && (bits(immr, 5) || bits(imms, 5))))
18410037SARM gem5 Developers                return new Unknown64(machInst);
18510037SARM gem5 Developers            switch (opc) {
18610037SARM gem5 Developers              case 0x0:
18710337SAndrew.Bardsley@arm.com                return new Sbfm64(machInst, rdzr, rn, immr, imms);
18810037SARM gem5 Developers              case 0x1:
18910337SAndrew.Bardsley@arm.com                return new Bfm64(machInst, rdzr, rn, immr, imms);
19010037SARM gem5 Developers              case 0x2:
19110337SAndrew.Bardsley@arm.com                return new Ubfm64(machInst, rdzr, rn, immr, imms);
19210037SARM gem5 Developers              case 0x3:
19310037SARM gem5 Developers                return new Unknown64(machInst);
19412595Ssiddhesh.poyarekar@gmail.com              default:
19512595Ssiddhesh.poyarekar@gmail.com                M5_UNREACHABLE;
19610037SARM gem5 Developers            }
19710037SARM gem5 Developers          case 0x7:
19810037SARM gem5 Developers          {
19910037SARM gem5 Developers            IntRegIndex rm = (IntRegIndex)(uint8_t)bits(machInst, 20, 16);
20010037SARM gem5 Developers            if (opc || bits(machInst, 21))
20110037SARM gem5 Developers                return new Unknown64(machInst);
20210037SARM gem5 Developers            else
20310337SAndrew.Bardsley@arm.com                return new Extr64(machInst, rdzr, rn, rm, imms);
20410037SARM gem5 Developers          }
20510037SARM gem5 Developers        }
20610037SARM gem5 Developers        return new FailUnimplemented("Unhandled Case8", machInst);
20710037SARM gem5 Developers    }
20810037SARM gem5 Developers}
20910037SARM gem5 Developers}};
21010037SARM gem5 Developers
21110037SARM gem5 Developersoutput decoder {{
21210037SARM gem5 Developersnamespace Aarch64
21310037SARM gem5 Developers{
21410037SARM gem5 Developers    StaticInstPtr
21510037SARM gem5 Developers    decodeBranchExcSys(ExtMachInst machInst)
21610037SARM gem5 Developers    {
21710037SARM gem5 Developers        switch (bits(machInst, 30, 29)) {
21810037SARM gem5 Developers          case 0x0:
21910037SARM gem5 Developers          {
22010037SARM gem5 Developers            int64_t imm = sext<26>(bits(machInst, 25, 0)) << 2;
22110037SARM gem5 Developers            if (bits(machInst, 31) == 0)
22210037SARM gem5 Developers                return new B64(machInst, imm);
22310037SARM gem5 Developers            else
22410037SARM gem5 Developers                return new Bl64(machInst, imm);
22510037SARM gem5 Developers          }
22610037SARM gem5 Developers          case 0x1:
22710037SARM gem5 Developers          {
22810037SARM gem5 Developers            IntRegIndex rt = (IntRegIndex)(uint8_t)bits(machInst, 4, 0);
22910037SARM gem5 Developers            if (bits(machInst, 25) == 0) {
23010037SARM gem5 Developers                int64_t imm = sext<19>(bits(machInst, 23, 5)) << 2;
23110037SARM gem5 Developers                if (bits(machInst, 24) == 0)
23210037SARM gem5 Developers                    return new Cbz64(machInst, imm, rt);
23310037SARM gem5 Developers                else
23410037SARM gem5 Developers                    return new Cbnz64(machInst, imm, rt);
23510037SARM gem5 Developers            } else {
23610037SARM gem5 Developers                uint64_t bitmask = 0x1;
23710037SARM gem5 Developers                bitmask <<= bits(machInst, 23, 19);
23810037SARM gem5 Developers                int64_t imm = sext<14>(bits(machInst, 18, 5)) << 2;
23910037SARM gem5 Developers                if (bits(machInst, 31))
24010037SARM gem5 Developers                    bitmask <<= 32;
24110037SARM gem5 Developers                if (bits(machInst, 24) == 0)
24210037SARM gem5 Developers                    return new Tbz64(machInst, bitmask, imm, rt);
24310037SARM gem5 Developers                else
24410037SARM gem5 Developers                    return new Tbnz64(machInst, bitmask, imm, rt);
24510037SARM gem5 Developers            }
24610037SARM gem5 Developers          }
24710037SARM gem5 Developers          case 0x2:
24810037SARM gem5 Developers            // bit 30:26=10101
24910037SARM gem5 Developers            if (bits(machInst, 31) == 0) {
25010037SARM gem5 Developers                if (bits(machInst, 25, 24) || bits(machInst, 4))
25110037SARM gem5 Developers                    return new Unknown64(machInst);
25210037SARM gem5 Developers                int64_t imm = sext<19>(bits(machInst, 23, 5)) << 2;
25310037SARM gem5 Developers                ConditionCode condCode =
25410037SARM gem5 Developers                    (ConditionCode)(uint8_t)(bits(machInst, 3, 0));
25510037SARM gem5 Developers                return new BCond64(machInst, imm, condCode);
25610037SARM gem5 Developers            } else if (bits(machInst, 25, 24) == 0x0) {
25712538Sgiacomo.travaglini@arm.com
25810037SARM gem5 Developers                if (bits(machInst, 4, 2))
25910037SARM gem5 Developers                    return new Unknown64(machInst);
26012538Sgiacomo.travaglini@arm.com
26112538Sgiacomo.travaglini@arm.com                auto imm16 = bits(machInst, 20, 5);
26210037SARM gem5 Developers                uint8_t decVal = (bits(machInst, 1, 0) << 0) |
26310037SARM gem5 Developers                                 (bits(machInst, 23, 21) << 2);
26412538Sgiacomo.travaglini@arm.com
26510037SARM gem5 Developers                switch (decVal) {
26610037SARM gem5 Developers                  case 0x01:
26712538Sgiacomo.travaglini@arm.com                    return new Svc64(machInst, imm16);
26810037SARM gem5 Developers                  case 0x02:
26912538Sgiacomo.travaglini@arm.com                    return new Hvc64(machInst, imm16);
27010037SARM gem5 Developers                  case 0x03:
27112538Sgiacomo.travaglini@arm.com                    return new Smc64(machInst, imm16);
27210037SARM gem5 Developers                  case 0x04:
27312538Sgiacomo.travaglini@arm.com                    return new Brk64(machInst, imm16);
27410037SARM gem5 Developers                  case 0x08:
27512538Sgiacomo.travaglini@arm.com                    return new Hlt64(machInst, imm16);
27610037SARM gem5 Developers                  case 0x15:
27710037SARM gem5 Developers                    return new FailUnimplemented("dcps1", machInst);
27810037SARM gem5 Developers                  case 0x16:
27910037SARM gem5 Developers                    return new FailUnimplemented("dcps2", machInst);
28010037SARM gem5 Developers                  case 0x17:
28110037SARM gem5 Developers                    return new FailUnimplemented("dcps3", machInst);
28210037SARM gem5 Developers                  default:
28310037SARM gem5 Developers                    return new Unknown64(machInst);
28410037SARM gem5 Developers                }
28510037SARM gem5 Developers            } else if (bits(machInst, 25, 22) == 0x4) {
28610037SARM gem5 Developers                // bit 31:22=1101010100
28710037SARM gem5 Developers                bool l = bits(machInst, 21);
28810037SARM gem5 Developers                uint8_t op0 = bits(machInst, 20, 19);
28910037SARM gem5 Developers                uint8_t op1 = bits(machInst, 18, 16);
29010037SARM gem5 Developers                uint8_t crn = bits(machInst, 15, 12);
29110037SARM gem5 Developers                uint8_t crm = bits(machInst, 11, 8);
29210037SARM gem5 Developers                uint8_t op2 = bits(machInst, 7, 5);
29310037SARM gem5 Developers                IntRegIndex rt = (IntRegIndex)(uint8_t)bits(machInst, 4, 0);
29410037SARM gem5 Developers                switch (op0) {
29510037SARM gem5 Developers                  case 0x0:
29610037SARM gem5 Developers                    if (rt != 0x1f || l)
29710037SARM gem5 Developers                        return new Unknown64(machInst);
29810037SARM gem5 Developers                    if (crn == 0x2 && op1 == 0x3) {
29913354Sciro.santilli@arm.com                        switch (crm) {
30010037SARM gem5 Developers                          case 0x0:
30113354Sciro.santilli@arm.com                            switch (op2) {
30213354Sciro.santilli@arm.com                              case 0x0:
30313354Sciro.santilli@arm.com                                return new NopInst(machInst);
30413354Sciro.santilli@arm.com                              case 0x1:
30513354Sciro.santilli@arm.com                                return new YieldInst(machInst);
30613354Sciro.santilli@arm.com                              case 0x2:
30713354Sciro.santilli@arm.com                                return new WfeInst(machInst);
30813354Sciro.santilli@arm.com                              case 0x3:
30913354Sciro.santilli@arm.com                                return new WfiInst(machInst);
31013354Sciro.santilli@arm.com                              case 0x4:
31113354Sciro.santilli@arm.com                                return new SevInst(machInst);
31213354Sciro.santilli@arm.com                              case 0x5:
31313354Sciro.santilli@arm.com                                return new SevlInst(machInst);
31413354Sciro.santilli@arm.com                            }
31513354Sciro.santilli@arm.com                            break;
31610037SARM gem5 Developers                          case 0x1:
31713354Sciro.santilli@arm.com                            switch (op2) {
31813354Sciro.santilli@arm.com                              case 0x0:
31913354Sciro.santilli@arm.com                                return new WarnUnimplemented(
32013354Sciro.santilli@arm.com                                        "pacia", machInst);
32113354Sciro.santilli@arm.com                              case 0x2:
32213354Sciro.santilli@arm.com                                return new WarnUnimplemented(
32313354Sciro.santilli@arm.com                                        "pacib", machInst);
32413354Sciro.santilli@arm.com                              case 0x4:
32513354Sciro.santilli@arm.com                                return new WarnUnimplemented(
32613354Sciro.santilli@arm.com                                        "autia", machInst);
32713354Sciro.santilli@arm.com                              case 0x6:
32813354Sciro.santilli@arm.com                                return new WarnUnimplemented(
32913354Sciro.santilli@arm.com                                        "autib", machInst);
33013354Sciro.santilli@arm.com                            }
33113354Sciro.santilli@arm.com                            break;
33210037SARM gem5 Developers                          case 0x2:
33313354Sciro.santilli@arm.com                            switch (op2) {
33413354Sciro.santilli@arm.com                              case 0x0:
33513354Sciro.santilli@arm.com                                return new WarnUnimplemented(
33613354Sciro.santilli@arm.com                                        "esb", machInst);
33713354Sciro.santilli@arm.com                              case 0x1:
33813354Sciro.santilli@arm.com                                return new WarnUnimplemented(
33913354Sciro.santilli@arm.com                                        "psb csync", machInst);
34013354Sciro.santilli@arm.com                              case 0x2:
34113354Sciro.santilli@arm.com                                return new WarnUnimplemented(
34213354Sciro.santilli@arm.com                                        "tsb csync", machInst);
34313354Sciro.santilli@arm.com                              case 0x4:
34413354Sciro.santilli@arm.com                                return new WarnUnimplemented(
34513354Sciro.santilli@arm.com                                        "csdb", machInst);
34613354Sciro.santilli@arm.com                            }
34713354Sciro.santilli@arm.com                            break;
34810037SARM gem5 Developers                          case 0x3:
34913354Sciro.santilli@arm.com                            switch (op2) {
35013354Sciro.santilli@arm.com                              case 0x0:
35113354Sciro.santilli@arm.com                              case 0x1:
35213354Sciro.santilli@arm.com                                return new WarnUnimplemented(
35313354Sciro.santilli@arm.com                                        "pacia", machInst);
35413354Sciro.santilli@arm.com                              case 0x2:
35513354Sciro.santilli@arm.com                              case 0x3:
35613354Sciro.santilli@arm.com                                return new WarnUnimplemented(
35713354Sciro.santilli@arm.com                                        "pacib", machInst);
35813354Sciro.santilli@arm.com                              case 0x4:
35913354Sciro.santilli@arm.com                              case 0x5:
36013354Sciro.santilli@arm.com                                return new WarnUnimplemented(
36113354Sciro.santilli@arm.com                                        "autia", machInst);
36213354Sciro.santilli@arm.com                              case 0x6:
36313354Sciro.santilli@arm.com                              case 0x7:
36413354Sciro.santilli@arm.com                                return new WarnUnimplemented(
36513354Sciro.santilli@arm.com                                        "autib", machInst);
36613354Sciro.santilli@arm.com                            }
36713354Sciro.santilli@arm.com                            break;
36810037SARM gem5 Developers                          case 0x4:
36913354Sciro.santilli@arm.com                            switch (op2 & 0x1) {
37013354Sciro.santilli@arm.com                              case 0x0:
37113354Sciro.santilli@arm.com                                return new WarnUnimplemented(
37213354Sciro.santilli@arm.com                                        "bti", machInst);
37313354Sciro.santilli@arm.com                            }
37413354Sciro.santilli@arm.com                            break;
37510037SARM gem5 Developers                        }
37613355Sciro.santilli@arm.com                        return new WarnUnimplemented(
37713355Sciro.santilli@arm.com                                "unallocated_hint", machInst);
37810037SARM gem5 Developers                    } else if (crn == 0x3 && op1 == 0x3) {
37910037SARM gem5 Developers                        switch (op2) {
38010037SARM gem5 Developers                          case 0x2:
38110037SARM gem5 Developers                            return new Clrex64(machInst);
38210037SARM gem5 Developers                          case 0x4:
38310037SARM gem5 Developers                            return new Dsb64(machInst);
38410037SARM gem5 Developers                          case 0x5:
38510037SARM gem5 Developers                            return new Dmb64(machInst);
38610037SARM gem5 Developers                          case 0x6:
38710037SARM gem5 Developers                            return new Isb64(machInst);
38810037SARM gem5 Developers                          default:
38910037SARM gem5 Developers                            return new Unknown64(machInst);
39010037SARM gem5 Developers                        }
39110037SARM gem5 Developers                    } else if (crn == 0x4) {
39214127Sgiacomo.travaglini@arm.com                        // MSR immediate: moving immediate value to selected
39314127Sgiacomo.travaglini@arm.com                        // bits of the PSTATE
39410037SARM gem5 Developers                        switch (op1 << 3 | op2) {
39510037SARM gem5 Developers                          case 0x5:
39610037SARM gem5 Developers                            // SP
39714127Sgiacomo.travaglini@arm.com                            return new MsrImm64(
39814127Sgiacomo.travaglini@arm.com                                machInst, MISCREG_SPSEL, crm);
39910037SARM gem5 Developers                          case 0x1e:
40010037SARM gem5 Developers                            // DAIFSet
40114127Sgiacomo.travaglini@arm.com                            return new MsrImmDAIFSet64(
40214127Sgiacomo.travaglini@arm.com                                machInst, MISCREG_DAIF, crm);
40310037SARM gem5 Developers                          case 0x1f:
40410037SARM gem5 Developers                            // DAIFClr
40514127Sgiacomo.travaglini@arm.com                            return new MsrImmDAIFClr64(
40614127Sgiacomo.travaglini@arm.com                                machInst, MISCREG_DAIF, crm);
40710037SARM gem5 Developers                          default:
40810037SARM gem5 Developers                            return new Unknown64(machInst);
40910037SARM gem5 Developers                        }
41010037SARM gem5 Developers                    } else {
41110037SARM gem5 Developers                        return new Unknown64(machInst);
41210037SARM gem5 Developers                    }
41310037SARM gem5 Developers                    break;
41410037SARM gem5 Developers                  case 0x1:
41510037SARM gem5 Developers                  case 0x2:
41610037SARM gem5 Developers                  case 0x3:
41710037SARM gem5 Developers                  {
41810037SARM gem5 Developers                    // bit 31:22=1101010100, 20:19=11
41910037SARM gem5 Developers                    bool read = l;
42010037SARM gem5 Developers                    MiscRegIndex miscReg =
42110037SARM gem5 Developers                        decodeAArch64SysReg(op0, op1, crn, crm, op2);
42210037SARM gem5 Developers                    if (read) {
42310037SARM gem5 Developers                        if ((miscReg == MISCREG_DC_CIVAC_Xt) ||
42410037SARM gem5 Developers                            (miscReg == MISCREG_DC_CVAC_Xt) ||
42512359Snikos.nikoleris@arm.com                            (miscReg == MISCREG_DC_IVAC_Xt)  ||
42610037SARM gem5 Developers                            (miscReg == MISCREG_DC_ZVA_Xt)) {
42710037SARM gem5 Developers                            return new Unknown64(machInst);
42810037SARM gem5 Developers                        }
42910037SARM gem5 Developers                    }
43010037SARM gem5 Developers                    // Check for invalid registers
43110037SARM gem5 Developers                    if (miscReg == MISCREG_UNKNOWN) {
43212673Sgiacomo.travaglini@arm.com                        auto full_mnemonic =
43312673Sgiacomo.travaglini@arm.com                            csprintf("%s op0:%d op1:%d crn:%d crm:%d op2:%d",
43412673Sgiacomo.travaglini@arm.com                                     read ? "mrs" : "msr",
43512673Sgiacomo.travaglini@arm.com                                     op0, op1, crn, crm, op2);
43612673Sgiacomo.travaglini@arm.com
43712673Sgiacomo.travaglini@arm.com                        return new FailUnimplemented(read ? "mrs" : "msr",
43812673Sgiacomo.travaglini@arm.com                            machInst, full_mnemonic);
43912673Sgiacomo.travaglini@arm.com
44012714Sgiacomo.travaglini@arm.com                    } else if (miscReg == MISCREG_IMPDEF_UNIMPL) {
44112714Sgiacomo.travaglini@arm.com                        auto full_mnemonic =
44212714Sgiacomo.travaglini@arm.com                            csprintf("%s op0:%d op1:%d crn:%d crm:%d op2:%d",
44312714Sgiacomo.travaglini@arm.com                                     read ? "mrs" : "msr",
44412714Sgiacomo.travaglini@arm.com                                     op0, op1, crn, crm, op2);
44512714Sgiacomo.travaglini@arm.com
44613365Sgiacomo.travaglini@arm.com                        uint32_t iss = msrMrs64IssBuild(
44713365Sgiacomo.travaglini@arm.com                            read, op0, op1, crn, crm, op2, rt);
44813365Sgiacomo.travaglini@arm.com
44913365Sgiacomo.travaglini@arm.com                        return new MiscRegImplDefined64(
45013365Sgiacomo.travaglini@arm.com                            read ? "mrs" : "msr",
45113365Sgiacomo.travaglini@arm.com                            machInst, miscReg, read, iss, full_mnemonic,
45213365Sgiacomo.travaglini@arm.com                            miscRegInfo[miscReg][MISCREG_WARN_NOT_FAIL]);
45312714Sgiacomo.travaglini@arm.com
45410037SARM gem5 Developers                    } else if (miscRegInfo[miscReg][MISCREG_IMPLEMENTED]) {
45510037SARM gem5 Developers                        if (miscReg == MISCREG_NZCV) {
45610037SARM gem5 Developers                            if (read)
45710037SARM gem5 Developers                                return new MrsNZCV64(machInst, rt, (IntRegIndex) miscReg);
45810037SARM gem5 Developers                            else
45910037SARM gem5 Developers                                return new MsrNZCV64(machInst, (IntRegIndex) miscReg, rt);
46010037SARM gem5 Developers                        }
46110037SARM gem5 Developers                        uint32_t iss = msrMrs64IssBuild(read, op0, op1, crn, crm, op2, rt);
46210506SAli.Saidi@ARM.com                        if (read) {
46312280Sgiacomo.travaglini@arm.com                            StaticInstPtr si = new Mrs64(machInst, rt, miscReg, iss);
46410506SAli.Saidi@ARM.com                            if (miscRegInfo[miscReg][MISCREG_UNVERIFIABLE])
46510506SAli.Saidi@ARM.com                                si->setFlag(StaticInst::IsUnverifiable);
46610506SAli.Saidi@ARM.com                            return si;
46712280Sgiacomo.travaglini@arm.com                        } else {
46812359Snikos.nikoleris@arm.com                            switch (miscReg) {
46912359Snikos.nikoleris@arm.com                              case MISCREG_DC_ZVA_Xt:
47012359Snikos.nikoleris@arm.com                                return new Dczva(machInst, rt, miscReg, iss);
47112359Snikos.nikoleris@arm.com                              case MISCREG_DC_CVAU_Xt:
47212359Snikos.nikoleris@arm.com                                return new Dccvau(machInst, rt, miscReg, iss);
47312359Snikos.nikoleris@arm.com                              case MISCREG_DC_CVAC_Xt:
47412359Snikos.nikoleris@arm.com                                return new Dccvac(machInst, rt, miscReg, iss);
47512359Snikos.nikoleris@arm.com                              case MISCREG_DC_CIVAC_Xt:
47612359Snikos.nikoleris@arm.com                                return new Dccivac(machInst, rt, miscReg, iss);
47712359Snikos.nikoleris@arm.com                              case MISCREG_DC_IVAC_Xt:
47812359Snikos.nikoleris@arm.com                                return new Dcivac(machInst, rt, miscReg, iss);
47912359Snikos.nikoleris@arm.com                              default:
48012359Snikos.nikoleris@arm.com                                return new Msr64(machInst, miscReg, rt, iss);
48112359Snikos.nikoleris@arm.com                            }
48212280Sgiacomo.travaglini@arm.com                        }
48310037SARM gem5 Developers                    } else if (miscRegInfo[miscReg][MISCREG_WARN_NOT_FAIL]) {
48410037SARM gem5 Developers                        std::string full_mnem = csprintf("%s %s",
48510037SARM gem5 Developers                            read ? "mrs" : "msr", miscRegName[miscReg]);
48610037SARM gem5 Developers                        return new WarnUnimplemented(read ? "mrs" : "msr",
48710037SARM gem5 Developers                                                     machInst, full_mnem);
48810037SARM gem5 Developers                    } else {
48910173SMitchell.Hayenga@ARM.com                        return new FailUnimplemented(read ? "mrs" : "msr",
49010173SMitchell.Hayenga@ARM.com                                    machInst,
49110173SMitchell.Hayenga@ARM.com                                    csprintf("%s %s",
49210173SMitchell.Hayenga@ARM.com                                      read ? "mrs" : "msr",
49310173SMitchell.Hayenga@ARM.com                                      miscRegName[miscReg]));
49410037SARM gem5 Developers                    }
49510037SARM gem5 Developers                  }
49610037SARM gem5 Developers                  break;
49712595Ssiddhesh.poyarekar@gmail.com                  default:
49812595Ssiddhesh.poyarekar@gmail.com                    M5_UNREACHABLE;
49910037SARM gem5 Developers                }
50010037SARM gem5 Developers            } else if (bits(machInst, 25) == 0x1) {
50110037SARM gem5 Developers                uint8_t opc = bits(machInst, 24, 21);
50210037SARM gem5 Developers                uint8_t op2 = bits(machInst, 20, 16);
50310037SARM gem5 Developers                uint8_t op3 = bits(machInst, 15, 10);
50410037SARM gem5 Developers                IntRegIndex rn = (IntRegIndex)(uint8_t)bits(machInst, 9, 5);
50510037SARM gem5 Developers                uint8_t op4 = bits(machInst, 4, 0);
50610037SARM gem5 Developers                if (op2 != 0x1f || op3 != 0x0 || op4 != 0x0)
50710037SARM gem5 Developers                    return new Unknown64(machInst);
50810037SARM gem5 Developers                switch (opc) {
50910037SARM gem5 Developers                  case 0x0:
51010037SARM gem5 Developers                    return new Br64(machInst, rn);
51110037SARM gem5 Developers                  case 0x1:
51210037SARM gem5 Developers                    return new Blr64(machInst, rn);
51310037SARM gem5 Developers                  case 0x2:
51410037SARM gem5 Developers                    return new Ret64(machInst, rn);
51510037SARM gem5 Developers                  case 0x4:
51610037SARM gem5 Developers                    if (rn != 0x1f)
51710037SARM gem5 Developers                        return new Unknown64(machInst);
51810037SARM gem5 Developers                    return new Eret64(machInst);
51910037SARM gem5 Developers                  case 0x5:
52010037SARM gem5 Developers                    if (rn != 0x1f)
52110037SARM gem5 Developers                        return new Unknown64(machInst);
52210037SARM gem5 Developers                    return new FailUnimplemented("dret", machInst);
52312595Ssiddhesh.poyarekar@gmail.com                  default:
52412595Ssiddhesh.poyarekar@gmail.com                    return new Unknown64(machInst);
52510037SARM gem5 Developers                }
52610037SARM gem5 Developers            }
52712595Ssiddhesh.poyarekar@gmail.com          M5_FALLTHROUGH;
52810037SARM gem5 Developers          default:
52910037SARM gem5 Developers            return new Unknown64(machInst);
53010037SARM gem5 Developers        }
53110037SARM gem5 Developers        return new FailUnimplemented("Unhandled Case7", machInst);
53210037SARM gem5 Developers    }
53310037SARM gem5 Developers}
53410037SARM gem5 Developers}};
53510037SARM gem5 Developers
53610037SARM gem5 Developersoutput decoder {{
53710037SARM gem5 Developersnamespace Aarch64
53810037SARM gem5 Developers{
53910037SARM gem5 Developers    StaticInstPtr
54010037SARM gem5 Developers    decodeLoadsStores(ExtMachInst machInst)
54110037SARM gem5 Developers    {
54210037SARM gem5 Developers        // bit 27,25=10
54310037SARM gem5 Developers        switch (bits(machInst, 29, 28)) {
54410037SARM gem5 Developers          case 0x0:
54510037SARM gem5 Developers            if (bits(machInst, 26) == 0) {
54610037SARM gem5 Developers                if (bits(machInst, 24) != 0)
54710037SARM gem5 Developers                    return new Unknown64(machInst);
54810037SARM gem5 Developers                IntRegIndex rt = (IntRegIndex)(uint8_t)bits(machInst, 4, 0);
54910037SARM gem5 Developers                IntRegIndex rn = (IntRegIndex)(uint8_t)bits(machInst, 9, 5);
55010037SARM gem5 Developers                IntRegIndex rnsp = makeSP(rn);
55110037SARM gem5 Developers                IntRegIndex rt2 = (IntRegIndex)(uint8_t)bits(machInst, 14, 10);
55210037SARM gem5 Developers                IntRegIndex rs = (IntRegIndex)(uint8_t)bits(machInst, 20, 16);
55310037SARM gem5 Developers                uint8_t opc = (bits(machInst, 15) << 0) |
55410037SARM gem5 Developers                              (bits(machInst, 23, 21) << 1);
55510037SARM gem5 Developers                uint8_t size = bits(machInst, 31, 30);
55610037SARM gem5 Developers                switch (opc) {
55710037SARM gem5 Developers                  case 0x0:
55810037SARM gem5 Developers                    switch (size) {
55910037SARM gem5 Developers                      case 0x0:
56010037SARM gem5 Developers                        return new STXRB64(machInst, rt, rnsp, rs);
56110037SARM gem5 Developers                      case 0x1:
56210037SARM gem5 Developers                        return new STXRH64(machInst, rt, rnsp, rs);
56310037SARM gem5 Developers                      case 0x2:
56410037SARM gem5 Developers                        return new STXRW64(machInst, rt, rnsp, rs);
56510037SARM gem5 Developers                      case 0x3:
56610037SARM gem5 Developers                        return new STXRX64(machInst, rt, rnsp, rs);
56712595Ssiddhesh.poyarekar@gmail.com                      default:
56812595Ssiddhesh.poyarekar@gmail.com                        M5_UNREACHABLE;
56910037SARM gem5 Developers                    }
57010037SARM gem5 Developers                  case 0x1:
57110037SARM gem5 Developers                    switch (size) {
57210037SARM gem5 Developers                      case 0x0:
57310037SARM gem5 Developers                        return new STLXRB64(machInst, rt, rnsp, rs);
57410037SARM gem5 Developers                      case 0x1:
57510037SARM gem5 Developers                        return new STLXRH64(machInst, rt, rnsp, rs);
57610037SARM gem5 Developers                      case 0x2:
57710037SARM gem5 Developers                        return new STLXRW64(machInst, rt, rnsp, rs);
57810037SARM gem5 Developers                      case 0x3:
57910037SARM gem5 Developers                        return new STLXRX64(machInst, rt, rnsp, rs);
58012595Ssiddhesh.poyarekar@gmail.com                      default:
58112595Ssiddhesh.poyarekar@gmail.com                        M5_UNREACHABLE;
58210037SARM gem5 Developers                    }
58310037SARM gem5 Developers                  case 0x2:
58410037SARM gem5 Developers                    switch (size) {
58510037SARM gem5 Developers                      case 0x0:
58610037SARM gem5 Developers                      case 0x1:
58710037SARM gem5 Developers                        return new Unknown64(machInst);
58810037SARM gem5 Developers                      case 0x2:
58910037SARM gem5 Developers                        return new STXPW64(machInst, rs, rt, rt2, rnsp);
59010037SARM gem5 Developers                      case 0x3:
59110037SARM gem5 Developers                        return new STXPX64(machInst, rs, rt, rt2, rnsp);
59212595Ssiddhesh.poyarekar@gmail.com                      default:
59312595Ssiddhesh.poyarekar@gmail.com                        M5_UNREACHABLE;
59410037SARM gem5 Developers                    }
59510037SARM gem5 Developers
59610037SARM gem5 Developers                  case 0x3:
59710037SARM gem5 Developers                    switch (size) {
59810037SARM gem5 Developers                      case 0x0:
59910037SARM gem5 Developers                      case 0x1:
60010037SARM gem5 Developers                        return new Unknown64(machInst);
60110037SARM gem5 Developers                      case 0x2:
60210037SARM gem5 Developers                        return new STLXPW64(machInst, rs, rt, rt2, rnsp);
60310037SARM gem5 Developers                      case 0x3:
60410037SARM gem5 Developers                        return new STLXPX64(machInst, rs, rt, rt2, rnsp);
60512595Ssiddhesh.poyarekar@gmail.com                      default:
60612595Ssiddhesh.poyarekar@gmail.com                        M5_UNREACHABLE;
60710037SARM gem5 Developers                    }
60810037SARM gem5 Developers
60910037SARM gem5 Developers                  case 0x4:
61010037SARM gem5 Developers                    switch (size) {
61110037SARM gem5 Developers                      case 0x0:
61210037SARM gem5 Developers                        return new LDXRB64(machInst, rt, rnsp, rs);
61310037SARM gem5 Developers                      case 0x1:
61410037SARM gem5 Developers                        return new LDXRH64(machInst, rt, rnsp, rs);
61510037SARM gem5 Developers                      case 0x2:
61610037SARM gem5 Developers                        return new LDXRW64(machInst, rt, rnsp, rs);
61710037SARM gem5 Developers                      case 0x3:
61810037SARM gem5 Developers                        return new LDXRX64(machInst, rt, rnsp, rs);
61912595Ssiddhesh.poyarekar@gmail.com                      default:
62012595Ssiddhesh.poyarekar@gmail.com                        M5_UNREACHABLE;
62110037SARM gem5 Developers                    }
62210037SARM gem5 Developers                  case 0x5:
62310037SARM gem5 Developers                    switch (size) {
62410037SARM gem5 Developers                      case 0x0:
62510037SARM gem5 Developers                        return new LDAXRB64(machInst, rt, rnsp, rs);
62610037SARM gem5 Developers                      case 0x1:
62710037SARM gem5 Developers                        return new LDAXRH64(machInst, rt, rnsp, rs);
62810037SARM gem5 Developers                      case 0x2:
62910037SARM gem5 Developers                        return new LDAXRW64(machInst, rt, rnsp, rs);
63010037SARM gem5 Developers                      case 0x3:
63110037SARM gem5 Developers                        return new LDAXRX64(machInst, rt, rnsp, rs);
63212595Ssiddhesh.poyarekar@gmail.com                      default:
63312595Ssiddhesh.poyarekar@gmail.com                        M5_UNREACHABLE;
63410037SARM gem5 Developers                    }
63510037SARM gem5 Developers                  case 0x6:
63610037SARM gem5 Developers                    switch (size) {
63710037SARM gem5 Developers                      case 0x0:
63810037SARM gem5 Developers                      case 0x1:
63910037SARM gem5 Developers                        return new Unknown64(machInst);
64010037SARM gem5 Developers                      case 0x2:
64110037SARM gem5 Developers                        return new LDXPW64(machInst, rt, rt2, rnsp);
64210037SARM gem5 Developers                      case 0x3:
64310037SARM gem5 Developers                        return new LDXPX64(machInst, rt, rt2, rnsp);
64412595Ssiddhesh.poyarekar@gmail.com                      default:
64512595Ssiddhesh.poyarekar@gmail.com                        M5_UNREACHABLE;
64610037SARM gem5 Developers                    }
64710037SARM gem5 Developers
64810037SARM gem5 Developers                  case 0x7:
64910037SARM gem5 Developers                    switch (size) {
65010037SARM gem5 Developers                      case 0x0:
65110037SARM gem5 Developers                      case 0x1:
65210037SARM gem5 Developers                        return new Unknown64(machInst);
65310037SARM gem5 Developers                      case 0x2:
65410037SARM gem5 Developers                        return new LDAXPW64(machInst, rt, rt2, rnsp);
65510037SARM gem5 Developers                      case 0x3:
65610037SARM gem5 Developers                        return new LDAXPX64(machInst, rt, rt2, rnsp);
65712595Ssiddhesh.poyarekar@gmail.com                      default:
65812595Ssiddhesh.poyarekar@gmail.com                        M5_UNREACHABLE;
65910037SARM gem5 Developers                    }
66010037SARM gem5 Developers
66110037SARM gem5 Developers                  case 0x9:
66210037SARM gem5 Developers                    switch (size) {
66310037SARM gem5 Developers                      case 0x0:
66410037SARM gem5 Developers                        return new STLRB64(machInst, rt, rnsp);
66510037SARM gem5 Developers                      case 0x1:
66610037SARM gem5 Developers                        return new STLRH64(machInst, rt, rnsp);
66710037SARM gem5 Developers                      case 0x2:
66810037SARM gem5 Developers                        return new STLRW64(machInst, rt, rnsp);
66910037SARM gem5 Developers                      case 0x3:
67010037SARM gem5 Developers                        return new STLRX64(machInst, rt, rnsp);
67112595Ssiddhesh.poyarekar@gmail.com                      default:
67212595Ssiddhesh.poyarekar@gmail.com                        M5_UNREACHABLE;
67310037SARM gem5 Developers                    }
67410037SARM gem5 Developers                  case 0xd:
67510037SARM gem5 Developers                    switch (size) {
67610037SARM gem5 Developers                      case 0x0:
67710037SARM gem5 Developers                        return new LDARB64(machInst, rt, rnsp);
67810037SARM gem5 Developers                      case 0x1:
67910037SARM gem5 Developers                        return new LDARH64(machInst, rt, rnsp);
68010037SARM gem5 Developers                      case 0x2:
68110037SARM gem5 Developers                        return new LDARW64(machInst, rt, rnsp);
68210037SARM gem5 Developers                      case 0x3:
68310037SARM gem5 Developers                        return new LDARX64(machInst, rt, rnsp);
68412595Ssiddhesh.poyarekar@gmail.com                      default:
68512595Ssiddhesh.poyarekar@gmail.com                        M5_UNREACHABLE;
68610037SARM gem5 Developers                    }
68710037SARM gem5 Developers                  default:
68810037SARM gem5 Developers                    return new Unknown64(machInst);
68910037SARM gem5 Developers                }
69010037SARM gem5 Developers            } else if (bits(machInst, 31)) {
69110037SARM gem5 Developers                return new Unknown64(machInst);
69210037SARM gem5 Developers            } else {
69310037SARM gem5 Developers                return decodeNeonMem(machInst);
69410037SARM gem5 Developers            }
69510037SARM gem5 Developers          case 0x1:
69610037SARM gem5 Developers          {
69710037SARM gem5 Developers            if (bits(machInst, 24) != 0)
69810037SARM gem5 Developers                return new Unknown64(machInst);
69910037SARM gem5 Developers            uint8_t switchVal = (bits(machInst, 26) << 0) |
70010037SARM gem5 Developers                                (bits(machInst, 31, 30) << 1);
70110037SARM gem5 Developers            int64_t imm = sext<19>(bits(machInst, 23, 5)) << 2;
70210037SARM gem5 Developers            IntRegIndex rt = (IntRegIndex)(uint32_t)bits(machInst, 4, 0);
70310037SARM gem5 Developers            switch (switchVal) {
70410037SARM gem5 Developers              case 0x0:
70510037SARM gem5 Developers                return new LDRWL64_LIT(machInst, rt, imm);
70610037SARM gem5 Developers              case 0x1:
70710037SARM gem5 Developers                return new LDRSFP64_LIT(machInst, rt, imm);
70810037SARM gem5 Developers              case 0x2:
70910037SARM gem5 Developers                return new LDRXL64_LIT(machInst, rt, imm);
71010037SARM gem5 Developers              case 0x3:
71110037SARM gem5 Developers                return new LDRDFP64_LIT(machInst, rt, imm);
71210037SARM gem5 Developers              case 0x4:
71310037SARM gem5 Developers                return new LDRSWL64_LIT(machInst, rt, imm);
71410037SARM gem5 Developers              case 0x5:
71510037SARM gem5 Developers                return new BigFpMemLit("ldr", machInst, rt, imm);
71610037SARM gem5 Developers              case 0x6:
71710037SARM gem5 Developers                return new PRFM64_LIT(machInst, rt, imm);
71810037SARM gem5 Developers              default:
71910037SARM gem5 Developers                return new Unknown64(machInst);
72010037SARM gem5 Developers            }
72110037SARM gem5 Developers          }
72210037SARM gem5 Developers          case 0x2:
72310037SARM gem5 Developers          {
72410037SARM gem5 Developers            uint8_t opc = bits(machInst, 31, 30);
72510037SARM gem5 Developers            if (opc >= 3)
72610037SARM gem5 Developers                return new Unknown64(machInst);
72710037SARM gem5 Developers            uint32_t size = 0;
72810037SARM gem5 Developers            bool fp = bits(machInst, 26);
72910037SARM gem5 Developers            bool load = bits(machInst, 22);
73010037SARM gem5 Developers            if (fp) {
73110037SARM gem5 Developers                size = 4 << opc;
73210037SARM gem5 Developers            } else {
73310037SARM gem5 Developers                if ((opc == 1) && !load)
73410037SARM gem5 Developers                    return new Unknown64(machInst);
73510037SARM gem5 Developers                size = (opc == 0 || opc == 1) ? 4 : 8;
73610037SARM gem5 Developers            }
73710037SARM gem5 Developers            uint8_t type = bits(machInst, 24, 23);
73810037SARM gem5 Developers            int64_t imm = sext<7>(bits(machInst, 21, 15)) * size;
73910037SARM gem5 Developers
74010037SARM gem5 Developers            IntRegIndex rn = (IntRegIndex)(uint8_t)bits(machInst, 9, 5);
74110037SARM gem5 Developers            IntRegIndex rt = (IntRegIndex)(uint8_t)bits(machInst, 4, 0);
74210037SARM gem5 Developers            IntRegIndex rt2 = (IntRegIndex)(uint8_t)bits(machInst, 14, 10);
74310037SARM gem5 Developers
74410037SARM gem5 Developers            bool noAlloc = (type == 0);
74510037SARM gem5 Developers            bool signExt = !noAlloc && !fp && opc == 1;
74610037SARM gem5 Developers            PairMemOp::AddrMode mode;
74710037SARM gem5 Developers            const char *mnemonic = NULL;
74810037SARM gem5 Developers            switch (type) {
74910037SARM gem5 Developers              case 0x0:
75010037SARM gem5 Developers              case 0x2:
75110037SARM gem5 Developers                mode = PairMemOp::AddrMd_Offset;
75210037SARM gem5 Developers                break;
75310037SARM gem5 Developers              case 0x1:
75410037SARM gem5 Developers                mode = PairMemOp::AddrMd_PostIndex;
75510037SARM gem5 Developers                break;
75610037SARM gem5 Developers              case 0x3:
75710037SARM gem5 Developers                mode = PairMemOp::AddrMd_PreIndex;
75810037SARM gem5 Developers                break;
75910037SARM gem5 Developers              default:
76010037SARM gem5 Developers                return new Unknown64(machInst);
76110037SARM gem5 Developers            }
76210037SARM gem5 Developers            if (load) {
76310037SARM gem5 Developers                if (noAlloc)
76410037SARM gem5 Developers                    mnemonic = "ldnp";
76510037SARM gem5 Developers                else if (signExt)
76610037SARM gem5 Developers                    mnemonic = "ldpsw";
76710037SARM gem5 Developers                else
76810037SARM gem5 Developers                    mnemonic = "ldp";
76910037SARM gem5 Developers            } else {
77010037SARM gem5 Developers                if (noAlloc)
77110037SARM gem5 Developers                    mnemonic = "stnp";
77210037SARM gem5 Developers                else
77310037SARM gem5 Developers                    mnemonic = "stp";
77410037SARM gem5 Developers            }
77510037SARM gem5 Developers
77610037SARM gem5 Developers            return new LdpStp(mnemonic, machInst, size, fp, load, noAlloc,
77710037SARM gem5 Developers                    signExt, false, false, imm, mode, rn, rt, rt2);
77810037SARM gem5 Developers          }
77910037SARM gem5 Developers          // bit 29:27=111, 25=0
78010037SARM gem5 Developers          case 0x3:
78110037SARM gem5 Developers          {
78210037SARM gem5 Developers            uint8_t switchVal = (bits(machInst, 23, 22) << 0) |
78310037SARM gem5 Developers                                (bits(machInst, 26) << 2) |
78410037SARM gem5 Developers                                (bits(machInst, 31, 30) << 3);
78510037SARM gem5 Developers            if (bits(machInst, 24) == 1) {
78610037SARM gem5 Developers                uint64_t imm12 = bits(machInst, 21, 10);
78710037SARM gem5 Developers                IntRegIndex rt = (IntRegIndex)(uint32_t)bits(machInst, 4, 0);
78810037SARM gem5 Developers                IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 9, 5);
78910037SARM gem5 Developers                IntRegIndex rnsp = makeSP(rn);
79010037SARM gem5 Developers                switch (switchVal) {
79110037SARM gem5 Developers                  case 0x00:
79210037SARM gem5 Developers                    return new STRB64_IMM(machInst, rt, rnsp, imm12);
79310037SARM gem5 Developers                  case 0x01:
79410037SARM gem5 Developers                    return new LDRB64_IMM(machInst, rt, rnsp, imm12);
79510037SARM gem5 Developers                  case 0x02:
79610037SARM gem5 Developers                    return new LDRSBX64_IMM(machInst, rt, rnsp, imm12);
79710037SARM gem5 Developers                  case 0x03:
79810037SARM gem5 Developers                    return new LDRSBW64_IMM(machInst, rt, rnsp, imm12);
79910037SARM gem5 Developers                  case 0x04:
80010037SARM gem5 Developers                    return new STRBFP64_IMM(machInst, rt, rnsp, imm12);
80110037SARM gem5 Developers                  case 0x05:
80210037SARM gem5 Developers                    return new LDRBFP64_IMM(machInst, rt, rnsp, imm12);
80310037SARM gem5 Developers                  case 0x06:
80410037SARM gem5 Developers                    return new BigFpMemImm("str", machInst, false,
80510037SARM gem5 Developers                                           rt, rnsp, imm12 << 4);
80610037SARM gem5 Developers                  case 0x07:
80710037SARM gem5 Developers                    return new BigFpMemImm("ldr", machInst, true,
80810037SARM gem5 Developers                                           rt, rnsp, imm12 << 4);
80910037SARM gem5 Developers                  case 0x08:
81010037SARM gem5 Developers                    return new STRH64_IMM(machInst, rt, rnsp, imm12 << 1);
81110037SARM gem5 Developers                  case 0x09:
81210037SARM gem5 Developers                    return new LDRH64_IMM(machInst, rt, rnsp, imm12 << 1);
81310037SARM gem5 Developers                  case 0x0a:
81410037SARM gem5 Developers                    return new LDRSHX64_IMM(machInst, rt, rnsp, imm12 << 1);
81510037SARM gem5 Developers                  case 0x0b:
81610037SARM gem5 Developers                    return new LDRSHW64_IMM(machInst, rt, rnsp, imm12 << 1);
81710037SARM gem5 Developers                  case 0x0c:
81810037SARM gem5 Developers                    return new STRHFP64_IMM(machInst, rt, rnsp, imm12 << 1);
81910037SARM gem5 Developers                  case 0x0d:
82010037SARM gem5 Developers                    return new LDRHFP64_IMM(machInst, rt, rnsp, imm12 << 1);
82110037SARM gem5 Developers                  case 0x10:
82210037SARM gem5 Developers                    return new STRW64_IMM(machInst, rt, rnsp, imm12 << 2);
82310037SARM gem5 Developers                  case 0x11:
82410037SARM gem5 Developers                    return new LDRW64_IMM(machInst, rt, rnsp, imm12 << 2);
82510037SARM gem5 Developers                  case 0x12:
82610037SARM gem5 Developers                    return new LDRSW64_IMM(machInst, rt, rnsp, imm12 << 2);
82710037SARM gem5 Developers                  case 0x14:
82810037SARM gem5 Developers                    return new STRSFP64_IMM(machInst, rt, rnsp, imm12 << 2);
82910037SARM gem5 Developers                  case 0x15:
83010037SARM gem5 Developers                    return new LDRSFP64_IMM(machInst, rt, rnsp, imm12 << 2);
83110037SARM gem5 Developers                  case 0x18:
83210037SARM gem5 Developers                    return new STRX64_IMM(machInst, rt, rnsp, imm12 << 3);
83310037SARM gem5 Developers                  case 0x19:
83410037SARM gem5 Developers                    return new LDRX64_IMM(machInst, rt, rnsp, imm12 << 3);
83510037SARM gem5 Developers                  case 0x1a:
83610037SARM gem5 Developers                    return new PRFM64_IMM(machInst, rt, rnsp, imm12 << 3);
83710037SARM gem5 Developers                  case 0x1c:
83810037SARM gem5 Developers                    return new STRDFP64_IMM(machInst, rt, rnsp, imm12 << 3);
83910037SARM gem5 Developers                  case 0x1d:
84010037SARM gem5 Developers                    return new LDRDFP64_IMM(machInst, rt, rnsp, imm12 << 3);
84110037SARM gem5 Developers                  default:
84210037SARM gem5 Developers                    return new Unknown64(machInst);
84310037SARM gem5 Developers                }
84410037SARM gem5 Developers            } else if (bits(machInst, 21) == 1) {
84512856Sgiacomo.gabrielli@arm.com                uint8_t group = bits(machInst, 11, 10);
84612856Sgiacomo.gabrielli@arm.com                switch (group) {
84712856Sgiacomo.gabrielli@arm.com                  case 0x0:
84812856Sgiacomo.gabrielli@arm.com                    {
84912856Sgiacomo.gabrielli@arm.com                        if ((switchVal & 0x7) == 0x2 &&
85012856Sgiacomo.gabrielli@arm.com                                bits(machInst, 20, 12) == 0x1fc) {
85112856Sgiacomo.gabrielli@arm.com                            IntRegIndex rt = (IntRegIndex)(uint32_t)
85212856Sgiacomo.gabrielli@arm.com                                bits(machInst, 4, 0);
85312856Sgiacomo.gabrielli@arm.com                            IntRegIndex rn = (IntRegIndex)(uint32_t)
85412856Sgiacomo.gabrielli@arm.com                                bits(machInst, 9, 5);
85512856Sgiacomo.gabrielli@arm.com                            IntRegIndex rnsp = makeSP(rn);
85612856Sgiacomo.gabrielli@arm.com                            uint8_t size = bits(machInst, 31, 30);
85712856Sgiacomo.gabrielli@arm.com                            switch (size) {
85812856Sgiacomo.gabrielli@arm.com                              case 0x0:
85912856Sgiacomo.gabrielli@arm.com                                return new LDAPRB64(machInst, rt, rnsp);
86012856Sgiacomo.gabrielli@arm.com                              case 0x1:
86112856Sgiacomo.gabrielli@arm.com                                return new LDAPRH64(machInst, rt, rnsp);
86212856Sgiacomo.gabrielli@arm.com                              case 0x2:
86312856Sgiacomo.gabrielli@arm.com                                return new LDAPRW64(machInst, rt, rnsp);
86412856Sgiacomo.gabrielli@arm.com                              case 0x3:
86512856Sgiacomo.gabrielli@arm.com                                return new LDAPRX64(machInst, rt, rnsp);
86612856Sgiacomo.gabrielli@arm.com                              default:
86712856Sgiacomo.gabrielli@arm.com                                M5_UNREACHABLE;
86812856Sgiacomo.gabrielli@arm.com                            }
86912856Sgiacomo.gabrielli@arm.com                        } else {
87012856Sgiacomo.gabrielli@arm.com                            return new Unknown64(machInst);
87112856Sgiacomo.gabrielli@arm.com                        }
87212856Sgiacomo.gabrielli@arm.com                    }
87312856Sgiacomo.gabrielli@arm.com                  case 0x2:
87412856Sgiacomo.gabrielli@arm.com                    {
87512856Sgiacomo.gabrielli@arm.com                        if (!bits(machInst, 14))
87612856Sgiacomo.gabrielli@arm.com                            return new Unknown64(machInst);
87712856Sgiacomo.gabrielli@arm.com                        IntRegIndex rt = (IntRegIndex)(uint32_t)
87812856Sgiacomo.gabrielli@arm.com                            bits(machInst, 4, 0);
87912856Sgiacomo.gabrielli@arm.com                        IntRegIndex rn = (IntRegIndex)(uint32_t)
88012856Sgiacomo.gabrielli@arm.com                            bits(machInst, 9, 5);
88112856Sgiacomo.gabrielli@arm.com                        IntRegIndex rnsp = makeSP(rn);
88212856Sgiacomo.gabrielli@arm.com                        IntRegIndex rm = (IntRegIndex)(uint32_t)
88312856Sgiacomo.gabrielli@arm.com                            bits(machInst, 20, 16);
88412856Sgiacomo.gabrielli@arm.com                        ArmExtendType type =
88512856Sgiacomo.gabrielli@arm.com                            (ArmExtendType)(uint32_t)bits(machInst, 15, 13);
88612856Sgiacomo.gabrielli@arm.com                        uint8_t s = bits(machInst, 12);
88712856Sgiacomo.gabrielli@arm.com                        switch (switchVal) {
88812856Sgiacomo.gabrielli@arm.com                          case 0x00:
88912856Sgiacomo.gabrielli@arm.com                            return new STRB64_REG(machInst, rt, rnsp, rm,
89012856Sgiacomo.gabrielli@arm.com                                                  type, 0);
89112856Sgiacomo.gabrielli@arm.com                          case 0x01:
89212856Sgiacomo.gabrielli@arm.com                            return new LDRB64_REG(machInst, rt, rnsp, rm,
89312856Sgiacomo.gabrielli@arm.com                                                  type, 0);
89412856Sgiacomo.gabrielli@arm.com                          case 0x02:
89512856Sgiacomo.gabrielli@arm.com                            return new LDRSBX64_REG(machInst, rt, rnsp, rm,
89612856Sgiacomo.gabrielli@arm.com                                                    type, 0);
89712856Sgiacomo.gabrielli@arm.com                          case 0x03:
89812856Sgiacomo.gabrielli@arm.com                            return new LDRSBW64_REG(machInst, rt, rnsp, rm,
89912856Sgiacomo.gabrielli@arm.com                                                    type, 0);
90012856Sgiacomo.gabrielli@arm.com                          case 0x04:
90112856Sgiacomo.gabrielli@arm.com                            return new STRBFP64_REG(machInst, rt, rnsp, rm,
90212856Sgiacomo.gabrielli@arm.com                                                    type, 0);
90312856Sgiacomo.gabrielli@arm.com                          case 0x05:
90412856Sgiacomo.gabrielli@arm.com                            return new LDRBFP64_REG(machInst, rt, rnsp, rm,
90512856Sgiacomo.gabrielli@arm.com                                                    type, 0);
90612856Sgiacomo.gabrielli@arm.com                          case 0x6:
90712856Sgiacomo.gabrielli@arm.com                            return new BigFpMemReg("str", machInst, false,
90812856Sgiacomo.gabrielli@arm.com                                                   rt, rnsp, rm, type, s * 4);
90912856Sgiacomo.gabrielli@arm.com                          case 0x7:
91012856Sgiacomo.gabrielli@arm.com                            return new BigFpMemReg("ldr", machInst, true,
91112856Sgiacomo.gabrielli@arm.com                                                   rt, rnsp, rm, type, s * 4);
91212856Sgiacomo.gabrielli@arm.com                          case 0x08:
91312856Sgiacomo.gabrielli@arm.com                            return new STRH64_REG(machInst, rt, rnsp, rm,
91412856Sgiacomo.gabrielli@arm.com                                                  type, s);
91512856Sgiacomo.gabrielli@arm.com                          case 0x09:
91612856Sgiacomo.gabrielli@arm.com                            return new LDRH64_REG(machInst, rt, rnsp, rm,
91712856Sgiacomo.gabrielli@arm.com                                                  type, s);
91812856Sgiacomo.gabrielli@arm.com                          case 0x0a:
91912856Sgiacomo.gabrielli@arm.com                            return new LDRSHX64_REG(machInst, rt, rnsp, rm,
92012856Sgiacomo.gabrielli@arm.com                                                    type, s);
92112856Sgiacomo.gabrielli@arm.com                          case 0x0b:
92212856Sgiacomo.gabrielli@arm.com                            return new LDRSHW64_REG(machInst, rt, rnsp, rm,
92312856Sgiacomo.gabrielli@arm.com                                                    type, s);
92412856Sgiacomo.gabrielli@arm.com                          case 0x0c:
92512856Sgiacomo.gabrielli@arm.com                            return new STRHFP64_REG(machInst, rt, rnsp, rm,
92612856Sgiacomo.gabrielli@arm.com                                                    type, s);
92712856Sgiacomo.gabrielli@arm.com                          case 0x0d:
92812856Sgiacomo.gabrielli@arm.com                            return new LDRHFP64_REG(machInst, rt, rnsp, rm,
92912856Sgiacomo.gabrielli@arm.com                                                    type, s);
93012856Sgiacomo.gabrielli@arm.com                          case 0x10:
93112856Sgiacomo.gabrielli@arm.com                            return new STRW64_REG(machInst, rt, rnsp, rm,
93212856Sgiacomo.gabrielli@arm.com                                                  type, s * 2);
93312856Sgiacomo.gabrielli@arm.com                          case 0x11:
93412856Sgiacomo.gabrielli@arm.com                            return new LDRW64_REG(machInst, rt, rnsp, rm,
93512856Sgiacomo.gabrielli@arm.com                                                  type, s * 2);
93612856Sgiacomo.gabrielli@arm.com                          case 0x12:
93712856Sgiacomo.gabrielli@arm.com                            return new LDRSW64_REG(machInst, rt, rnsp, rm,
93812856Sgiacomo.gabrielli@arm.com                                                   type, s * 2);
93912856Sgiacomo.gabrielli@arm.com                          case 0x14:
94012856Sgiacomo.gabrielli@arm.com                            return new STRSFP64_REG(machInst, rt, rnsp, rm,
94112856Sgiacomo.gabrielli@arm.com                                                    type, s * 2);
94212856Sgiacomo.gabrielli@arm.com                          case 0x15:
94312856Sgiacomo.gabrielli@arm.com                            return new LDRSFP64_REG(machInst, rt, rnsp, rm,
94412856Sgiacomo.gabrielli@arm.com                                                    type, s * 2);
94512856Sgiacomo.gabrielli@arm.com                          case 0x18:
94612856Sgiacomo.gabrielli@arm.com                            return new STRX64_REG(machInst, rt, rnsp, rm,
94712856Sgiacomo.gabrielli@arm.com                                                  type, s * 3);
94812856Sgiacomo.gabrielli@arm.com                          case 0x19:
94912856Sgiacomo.gabrielli@arm.com                            return new LDRX64_REG(machInst, rt, rnsp, rm,
95012856Sgiacomo.gabrielli@arm.com                                                  type, s * 3);
95112856Sgiacomo.gabrielli@arm.com                          case 0x1a:
95212856Sgiacomo.gabrielli@arm.com                            return new PRFM64_REG(machInst, rt, rnsp, rm,
95312856Sgiacomo.gabrielli@arm.com                                                  type, s * 3);
95412856Sgiacomo.gabrielli@arm.com                          case 0x1c:
95512856Sgiacomo.gabrielli@arm.com                            return new STRDFP64_REG(machInst, rt, rnsp, rm,
95612856Sgiacomo.gabrielli@arm.com                                                    type, s * 3);
95712856Sgiacomo.gabrielli@arm.com                          case 0x1d:
95812856Sgiacomo.gabrielli@arm.com                            return new LDRDFP64_REG(machInst, rt, rnsp, rm,
95912856Sgiacomo.gabrielli@arm.com                                                    type, s * 3);
96012856Sgiacomo.gabrielli@arm.com                          default:
96112856Sgiacomo.gabrielli@arm.com                            return new Unknown64(machInst);
96212856Sgiacomo.gabrielli@arm.com
96312856Sgiacomo.gabrielli@arm.com                        }
96412856Sgiacomo.gabrielli@arm.com                    }
96510037SARM gem5 Developers                  default:
96610037SARM gem5 Developers                    return new Unknown64(machInst);
96710037SARM gem5 Developers                }
96810037SARM gem5 Developers            } else {
96910037SARM gem5 Developers                // bit 29:27=111, 25:24=00, 21=0
97010037SARM gem5 Developers                switch (bits(machInst, 11, 10)) {
97110037SARM gem5 Developers                  case 0x0:
97210037SARM gem5 Developers                  {
97310037SARM gem5 Developers                    IntRegIndex rt =
97410037SARM gem5 Developers                        (IntRegIndex)(uint32_t)bits(machInst, 4, 0);
97510037SARM gem5 Developers                    IntRegIndex rn =
97610037SARM gem5 Developers                        (IntRegIndex)(uint32_t)bits(machInst, 9, 5);
97710037SARM gem5 Developers                    IntRegIndex rnsp = makeSP(rn);
97810037SARM gem5 Developers                    uint64_t imm = sext<9>(bits(machInst, 20, 12));
97910037SARM gem5 Developers                    switch (switchVal) {
98010037SARM gem5 Developers                      case 0x00:
98110037SARM gem5 Developers                        return new STURB64_IMM(machInst, rt, rnsp, imm);
98210037SARM gem5 Developers                      case 0x01:
98310037SARM gem5 Developers                        return new LDURB64_IMM(machInst, rt, rnsp, imm);
98410037SARM gem5 Developers                      case 0x02:
98510037SARM gem5 Developers                        return new LDURSBX64_IMM(machInst, rt, rnsp, imm);
98610037SARM gem5 Developers                      case 0x03:
98710037SARM gem5 Developers                        return new LDURSBW64_IMM(machInst, rt, rnsp, imm);
98810037SARM gem5 Developers                      case 0x04:
98910037SARM gem5 Developers                        return new STURBFP64_IMM(machInst, rt, rnsp, imm);
99010037SARM gem5 Developers                      case 0x05:
99110037SARM gem5 Developers                        return new LDURBFP64_IMM(machInst, rt, rnsp, imm);
99210037SARM gem5 Developers                      case 0x06:
99310037SARM gem5 Developers                        return new BigFpMemImm("stur", machInst, false,
99410037SARM gem5 Developers                                               rt, rnsp, imm);
99510037SARM gem5 Developers                      case 0x07:
99610037SARM gem5 Developers                        return new BigFpMemImm("ldur", machInst, true,
99710037SARM gem5 Developers                                               rt, rnsp, imm);
99810037SARM gem5 Developers                      case 0x08:
99910037SARM gem5 Developers                        return new STURH64_IMM(machInst, rt, rnsp, imm);
100010037SARM gem5 Developers                      case 0x09:
100110037SARM gem5 Developers                        return new LDURH64_IMM(machInst, rt, rnsp, imm);
100210037SARM gem5 Developers                      case 0x0a:
100310037SARM gem5 Developers                        return new LDURSHX64_IMM(machInst, rt, rnsp, imm);
100410037SARM gem5 Developers                      case 0x0b:
100510037SARM gem5 Developers                        return new LDURSHW64_IMM(machInst, rt, rnsp, imm);
100610037SARM gem5 Developers                      case 0x0c:
100710037SARM gem5 Developers                        return new STURHFP64_IMM(machInst, rt, rnsp, imm);
100810037SARM gem5 Developers                      case 0x0d:
100910037SARM gem5 Developers                        return new LDURHFP64_IMM(machInst, rt, rnsp, imm);
101010037SARM gem5 Developers                      case 0x10:
101110037SARM gem5 Developers                        return new STURW64_IMM(machInst, rt, rnsp, imm);
101210037SARM gem5 Developers                      case 0x11:
101310037SARM gem5 Developers                        return new LDURW64_IMM(machInst, rt, rnsp, imm);
101410037SARM gem5 Developers                      case 0x12:
101510037SARM gem5 Developers                        return new LDURSW64_IMM(machInst, rt, rnsp, imm);
101610037SARM gem5 Developers                      case 0x14:
101710037SARM gem5 Developers                        return new STURSFP64_IMM(machInst, rt, rnsp, imm);
101810037SARM gem5 Developers                      case 0x15:
101910037SARM gem5 Developers                        return new LDURSFP64_IMM(machInst, rt, rnsp, imm);
102010037SARM gem5 Developers                      case 0x18:
102110037SARM gem5 Developers                        return new STURX64_IMM(machInst, rt, rnsp, imm);
102210037SARM gem5 Developers                      case 0x19:
102310037SARM gem5 Developers                        return new LDURX64_IMM(machInst, rt, rnsp, imm);
102410037SARM gem5 Developers                      case 0x1a:
102510037SARM gem5 Developers                        return new PRFUM64_IMM(machInst, rt, rnsp, imm);
102610037SARM gem5 Developers                      case 0x1c:
102710037SARM gem5 Developers                        return new STURDFP64_IMM(machInst, rt, rnsp, imm);
102810037SARM gem5 Developers                      case 0x1d:
102910037SARM gem5 Developers                        return new LDURDFP64_IMM(machInst, rt, rnsp, imm);
103010037SARM gem5 Developers                      default:
103110037SARM gem5 Developers                        return new Unknown64(machInst);
103210037SARM gem5 Developers                    }
103310037SARM gem5 Developers                  }
103410037SARM gem5 Developers                  // bit 29:27=111, 25:24=00, 21=0, 11:10=01
103510037SARM gem5 Developers                  case 0x1:
103610037SARM gem5 Developers                  {
103710037SARM gem5 Developers                    IntRegIndex rt =
103810037SARM gem5 Developers                        (IntRegIndex)(uint32_t)bits(machInst, 4, 0);
103910037SARM gem5 Developers                    IntRegIndex rn =
104010037SARM gem5 Developers                        (IntRegIndex)(uint32_t)bits(machInst, 9, 5);
104110037SARM gem5 Developers                    IntRegIndex rnsp = makeSP(rn);
104210037SARM gem5 Developers                    uint64_t imm = sext<9>(bits(machInst, 20, 12));
104310037SARM gem5 Developers                    switch (switchVal) {
104410037SARM gem5 Developers                      case 0x00:
104510037SARM gem5 Developers                        return new STRB64_POST(machInst, rt, rnsp, imm);
104610037SARM gem5 Developers                      case 0x01:
104710037SARM gem5 Developers                        return new LDRB64_POST(machInst, rt, rnsp, imm);
104810037SARM gem5 Developers                      case 0x02:
104910037SARM gem5 Developers                        return new LDRSBX64_POST(machInst, rt, rnsp, imm);
105010037SARM gem5 Developers                      case 0x03:
105110037SARM gem5 Developers                        return new LDRSBW64_POST(machInst, rt, rnsp, imm);
105210037SARM gem5 Developers                      case 0x04:
105310037SARM gem5 Developers                        return new STRBFP64_POST(machInst, rt, rnsp, imm);
105410037SARM gem5 Developers                      case 0x05:
105510037SARM gem5 Developers                        return new LDRBFP64_POST(machInst, rt, rnsp, imm);
105610037SARM gem5 Developers                      case 0x06:
105710037SARM gem5 Developers                        return new BigFpMemPost("str", machInst, false,
105810037SARM gem5 Developers                                                rt, rnsp, imm);
105910037SARM gem5 Developers                      case 0x07:
106010037SARM gem5 Developers                        return new BigFpMemPost("ldr", machInst, true,
106110037SARM gem5 Developers                                                rt, rnsp, imm);
106210037SARM gem5 Developers                      case 0x08:
106310037SARM gem5 Developers                        return new STRH64_POST(machInst, rt, rnsp, imm);
106410037SARM gem5 Developers                      case 0x09:
106510037SARM gem5 Developers                        return new LDRH64_POST(machInst, rt, rnsp, imm);
106610037SARM gem5 Developers                      case 0x0a:
106710037SARM gem5 Developers                        return new LDRSHX64_POST(machInst, rt, rnsp, imm);
106810037SARM gem5 Developers                      case 0x0b:
106910037SARM gem5 Developers                        return new LDRSHW64_POST(machInst, rt, rnsp, imm);
107010037SARM gem5 Developers                      case 0x0c:
107110037SARM gem5 Developers                        return new STRHFP64_POST(machInst, rt, rnsp, imm);
107210037SARM gem5 Developers                      case 0x0d:
107310037SARM gem5 Developers                        return new LDRHFP64_POST(machInst, rt, rnsp, imm);
107410037SARM gem5 Developers                      case 0x10:
107510037SARM gem5 Developers                        return new STRW64_POST(machInst, rt, rnsp, imm);
107610037SARM gem5 Developers                      case 0x11:
107710037SARM gem5 Developers                        return new LDRW64_POST(machInst, rt, rnsp, imm);
107810037SARM gem5 Developers                      case 0x12:
107910037SARM gem5 Developers                        return new LDRSW64_POST(machInst, rt, rnsp, imm);
108010037SARM gem5 Developers                      case 0x14:
108110037SARM gem5 Developers                        return new STRSFP64_POST(machInst, rt, rnsp, imm);
108210037SARM gem5 Developers                      case 0x15:
108310037SARM gem5 Developers                        return new LDRSFP64_POST(machInst, rt, rnsp, imm);
108410037SARM gem5 Developers                      case 0x18:
108510037SARM gem5 Developers                        return new STRX64_POST(machInst, rt, rnsp, imm);
108610037SARM gem5 Developers                      case 0x19:
108710037SARM gem5 Developers                        return new LDRX64_POST(machInst, rt, rnsp, imm);
108810037SARM gem5 Developers                      case 0x1c:
108910037SARM gem5 Developers                        return new STRDFP64_POST(machInst, rt, rnsp, imm);
109010037SARM gem5 Developers                      case 0x1d:
109110037SARM gem5 Developers                        return new LDRDFP64_POST(machInst, rt, rnsp, imm);
109210037SARM gem5 Developers                      default:
109310037SARM gem5 Developers                        return new Unknown64(machInst);
109410037SARM gem5 Developers                    }
109510037SARM gem5 Developers                  }
109610037SARM gem5 Developers                  case 0x2:
109710037SARM gem5 Developers                  {
109810037SARM gem5 Developers                    IntRegIndex rt =
109910037SARM gem5 Developers                        (IntRegIndex)(uint32_t)bits(machInst, 4, 0);
110010037SARM gem5 Developers                    IntRegIndex rn =
110110037SARM gem5 Developers                        (IntRegIndex)(uint32_t)bits(machInst, 9, 5);
110210037SARM gem5 Developers                    IntRegIndex rnsp = makeSP(rn);
110310037SARM gem5 Developers                    uint64_t imm = sext<9>(bits(machInst, 20, 12));
110410037SARM gem5 Developers                    switch (switchVal) {
110510037SARM gem5 Developers                      case 0x00:
110610037SARM gem5 Developers                        return new STTRB64_IMM(machInst, rt, rnsp, imm);
110710037SARM gem5 Developers                      case 0x01:
110810037SARM gem5 Developers                        return new LDTRB64_IMM(machInst, rt, rnsp, imm);
110910037SARM gem5 Developers                      case 0x02:
111010037SARM gem5 Developers                        return new LDTRSBX64_IMM(machInst, rt, rnsp, imm);
111110037SARM gem5 Developers                      case 0x03:
111210037SARM gem5 Developers                        return new LDTRSBW64_IMM(machInst, rt, rnsp, imm);
111310037SARM gem5 Developers                      case 0x08:
111410037SARM gem5 Developers                        return new STTRH64_IMM(machInst, rt, rnsp, imm);
111510037SARM gem5 Developers                      case 0x09:
111610037SARM gem5 Developers                        return new LDTRH64_IMM(machInst, rt, rnsp, imm);
111710037SARM gem5 Developers                      case 0x0a:
111810037SARM gem5 Developers                        return new LDTRSHX64_IMM(machInst, rt, rnsp, imm);
111910037SARM gem5 Developers                      case 0x0b:
112010037SARM gem5 Developers                        return new LDTRSHW64_IMM(machInst, rt, rnsp, imm);
112110037SARM gem5 Developers                      case 0x10:
112210037SARM gem5 Developers                        return new STTRW64_IMM(machInst, rt, rnsp, imm);
112310037SARM gem5 Developers                      case 0x11:
112410037SARM gem5 Developers                        return new LDTRW64_IMM(machInst, rt, rnsp, imm);
112510037SARM gem5 Developers                      case 0x12:
112610037SARM gem5 Developers                        return new LDTRSW64_IMM(machInst, rt, rnsp, imm);
112710037SARM gem5 Developers                      case 0x18:
112810037SARM gem5 Developers                        return new STTRX64_IMM(machInst, rt, rnsp, imm);
112910037SARM gem5 Developers                      case 0x19:
113010037SARM gem5 Developers                        return new LDTRX64_IMM(machInst, rt, rnsp, imm);
113110037SARM gem5 Developers                      default:
113210037SARM gem5 Developers                        return new Unknown64(machInst);
113310037SARM gem5 Developers                    }
113410037SARM gem5 Developers                  }
113510037SARM gem5 Developers                  case 0x3:
113610037SARM gem5 Developers                  {
113710037SARM gem5 Developers                    IntRegIndex rt =
113810037SARM gem5 Developers                        (IntRegIndex)(uint32_t)bits(machInst, 4, 0);
113910037SARM gem5 Developers                    IntRegIndex rn =
114010037SARM gem5 Developers                        (IntRegIndex)(uint32_t)bits(machInst, 9, 5);
114110037SARM gem5 Developers                    IntRegIndex rnsp = makeSP(rn);
114210037SARM gem5 Developers                    uint64_t imm = sext<9>(bits(machInst, 20, 12));
114310037SARM gem5 Developers                    switch (switchVal) {
114410037SARM gem5 Developers                      case 0x00:
114510037SARM gem5 Developers                        return new STRB64_PRE(machInst, rt, rnsp, imm);
114610037SARM gem5 Developers                      case 0x01:
114710037SARM gem5 Developers                        return new LDRB64_PRE(machInst, rt, rnsp, imm);
114810037SARM gem5 Developers                      case 0x02:
114910037SARM gem5 Developers                        return new LDRSBX64_PRE(machInst, rt, rnsp, imm);
115010037SARM gem5 Developers                      case 0x03:
115110037SARM gem5 Developers                        return new LDRSBW64_PRE(machInst, rt, rnsp, imm);
115210037SARM gem5 Developers                      case 0x04:
115310037SARM gem5 Developers                        return new STRBFP64_PRE(machInst, rt, rnsp, imm);
115410037SARM gem5 Developers                      case 0x05:
115510037SARM gem5 Developers                        return new LDRBFP64_PRE(machInst, rt, rnsp, imm);
115610037SARM gem5 Developers                      case 0x06:
115710037SARM gem5 Developers                        return new BigFpMemPre("str", machInst, false,
115810037SARM gem5 Developers                                               rt, rnsp, imm);
115910037SARM gem5 Developers                      case 0x07:
116010037SARM gem5 Developers                        return new BigFpMemPre("ldr", machInst, true,
116110037SARM gem5 Developers                                               rt, rnsp, imm);
116210037SARM gem5 Developers                      case 0x08:
116310037SARM gem5 Developers                        return new STRH64_PRE(machInst, rt, rnsp, imm);
116410037SARM gem5 Developers                      case 0x09:
116510037SARM gem5 Developers                        return new LDRH64_PRE(machInst, rt, rnsp, imm);
116610037SARM gem5 Developers                      case 0x0a:
116710037SARM gem5 Developers                        return new LDRSHX64_PRE(machInst, rt, rnsp, imm);
116810037SARM gem5 Developers                      case 0x0b:
116910037SARM gem5 Developers                        return new LDRSHW64_PRE(machInst, rt, rnsp, imm);
117010037SARM gem5 Developers                      case 0x0c:
117110037SARM gem5 Developers                        return new STRHFP64_PRE(machInst, rt, rnsp, imm);
117210037SARM gem5 Developers                      case 0x0d:
117310037SARM gem5 Developers                        return new LDRHFP64_PRE(machInst, rt, rnsp, imm);
117410037SARM gem5 Developers                      case 0x10:
117510037SARM gem5 Developers                        return new STRW64_PRE(machInst, rt, rnsp, imm);
117610037SARM gem5 Developers                      case 0x11:
117710037SARM gem5 Developers                        return new LDRW64_PRE(machInst, rt, rnsp, imm);
117810037SARM gem5 Developers                      case 0x12:
117910037SARM gem5 Developers                        return new LDRSW64_PRE(machInst, rt, rnsp, imm);
118010037SARM gem5 Developers                      case 0x14:
118110037SARM gem5 Developers                        return new STRSFP64_PRE(machInst, rt, rnsp, imm);
118210037SARM gem5 Developers                      case 0x15:
118310037SARM gem5 Developers                        return new LDRSFP64_PRE(machInst, rt, rnsp, imm);
118410037SARM gem5 Developers                      case 0x18:
118510037SARM gem5 Developers                        return new STRX64_PRE(machInst, rt, rnsp, imm);
118610037SARM gem5 Developers                      case 0x19:
118710037SARM gem5 Developers                        return new LDRX64_PRE(machInst, rt, rnsp, imm);
118810037SARM gem5 Developers                      case 0x1c:
118910037SARM gem5 Developers                        return new STRDFP64_PRE(machInst, rt, rnsp, imm);
119010037SARM gem5 Developers                      case 0x1d:
119110037SARM gem5 Developers                        return new LDRDFP64_PRE(machInst, rt, rnsp, imm);
119210037SARM gem5 Developers                      default:
119310037SARM gem5 Developers                        return new Unknown64(machInst);
119410037SARM gem5 Developers                    }
119510037SARM gem5 Developers                  }
119612595Ssiddhesh.poyarekar@gmail.com                  default:
119712595Ssiddhesh.poyarekar@gmail.com                    M5_UNREACHABLE;
119810037SARM gem5 Developers                }
119910037SARM gem5 Developers            }
120010037SARM gem5 Developers          }
120112595Ssiddhesh.poyarekar@gmail.com          default:
120212595Ssiddhesh.poyarekar@gmail.com            M5_UNREACHABLE;
120310037SARM gem5 Developers        }
120410037SARM gem5 Developers        return new FailUnimplemented("Unhandled Case1", machInst);
120510037SARM gem5 Developers    }
120610037SARM gem5 Developers}
120710037SARM gem5 Developers}};
120810037SARM gem5 Developers
120910037SARM gem5 Developersoutput decoder {{
121010037SARM gem5 Developersnamespace Aarch64
121110037SARM gem5 Developers{
121210037SARM gem5 Developers    StaticInstPtr
121310037SARM gem5 Developers    decodeDataProcReg(ExtMachInst machInst)
121410037SARM gem5 Developers    {
121510037SARM gem5 Developers        uint8_t switchVal = (bits(machInst, 28) << 1) |
121610037SARM gem5 Developers                            (bits(machInst, 24) << 0);
121710037SARM gem5 Developers        switch (switchVal) {
121810037SARM gem5 Developers          case 0x0:
121910037SARM gem5 Developers          {
122010037SARM gem5 Developers            uint8_t switchVal = (bits(machInst, 21) << 0) |
122110037SARM gem5 Developers                                (bits(machInst, 30, 29) << 1);
122210037SARM gem5 Developers            ArmShiftType type = (ArmShiftType)(uint8_t)bits(machInst, 23, 22);
122310037SARM gem5 Developers            uint8_t imm6 = bits(machInst, 15, 10);
122410037SARM gem5 Developers            bool sf = bits(machInst, 31);
122510037SARM gem5 Developers            if (!sf && (imm6 & 0x20))
122610037SARM gem5 Developers                return new Unknown64(machInst);
122710037SARM gem5 Developers            IntRegIndex rd = (IntRegIndex)(uint8_t)bits(machInst, 4, 0);
122810337SAndrew.Bardsley@arm.com            IntRegIndex rdzr = makeZero(rd);
122910037SARM gem5 Developers            IntRegIndex rn = (IntRegIndex)(uint8_t)bits(machInst, 9, 5);
123010037SARM gem5 Developers            IntRegIndex rm = (IntRegIndex)(uint8_t)bits(machInst, 20, 16);
123110037SARM gem5 Developers
123210037SARM gem5 Developers            switch (switchVal) {
123310037SARM gem5 Developers              case 0x0:
123410337SAndrew.Bardsley@arm.com                return new AndXSReg(machInst, rdzr, rn, rm, imm6, type);
123510037SARM gem5 Developers              case 0x1:
123610337SAndrew.Bardsley@arm.com                return new BicXSReg(machInst, rdzr, rn, rm, imm6, type);
123710037SARM gem5 Developers              case 0x2:
123810337SAndrew.Bardsley@arm.com                return new OrrXSReg(machInst, rdzr, rn, rm, imm6, type);
123910037SARM gem5 Developers              case 0x3:
124010337SAndrew.Bardsley@arm.com                return new OrnXSReg(machInst, rdzr, rn, rm, imm6, type);
124110037SARM gem5 Developers              case 0x4:
124210337SAndrew.Bardsley@arm.com                return new EorXSReg(machInst, rdzr, rn, rm, imm6, type);
124310037SARM gem5 Developers              case 0x5:
124410337SAndrew.Bardsley@arm.com                return new EonXSReg(machInst, rdzr, rn, rm, imm6, type);
124510037SARM gem5 Developers              case 0x6:
124610337SAndrew.Bardsley@arm.com                return new AndXSRegCc(machInst, rdzr, rn, rm, imm6, type);
124710037SARM gem5 Developers              case 0x7:
124810337SAndrew.Bardsley@arm.com                return new BicXSRegCc(machInst, rdzr, rn, rm, imm6, type);
124912595Ssiddhesh.poyarekar@gmail.com              default:
125012595Ssiddhesh.poyarekar@gmail.com                M5_UNREACHABLE;
125110037SARM gem5 Developers            }
125210037SARM gem5 Developers          }
125310037SARM gem5 Developers          case 0x1:
125410037SARM gem5 Developers          {
125510037SARM gem5 Developers            uint8_t switchVal = bits(machInst, 30, 29);
125610037SARM gem5 Developers            if (bits(machInst, 21) == 0) {
125710037SARM gem5 Developers                ArmShiftType type =
125810037SARM gem5 Developers                    (ArmShiftType)(uint8_t)bits(machInst, 23, 22);
125910037SARM gem5 Developers                if (type == ROR)
126010037SARM gem5 Developers                    return new Unknown64(machInst);
126110037SARM gem5 Developers                uint8_t imm6 = bits(machInst, 15, 10);
126210037SARM gem5 Developers                if (!bits(machInst, 31) && bits(imm6, 5))
126310037SARM gem5 Developers                    return new Unknown64(machInst);
126410037SARM gem5 Developers                IntRegIndex rd = (IntRegIndex)(uint8_t)bits(machInst, 4, 0);
126510337SAndrew.Bardsley@arm.com                IntRegIndex rdzr = makeZero(rd);
126610037SARM gem5 Developers                IntRegIndex rn = (IntRegIndex)(uint8_t)bits(machInst, 9, 5);
126710037SARM gem5 Developers                IntRegIndex rm = (IntRegIndex)(uint8_t)bits(machInst, 20, 16);
126810037SARM gem5 Developers                switch (switchVal) {
126910037SARM gem5 Developers                  case 0x0:
127010337SAndrew.Bardsley@arm.com                    return new AddXSReg(machInst, rdzr, rn, rm, imm6, type);
127110037SARM gem5 Developers                  case 0x1:
127210337SAndrew.Bardsley@arm.com                    return new AddXSRegCc(machInst, rdzr, rn, rm, imm6, type);
127310037SARM gem5 Developers                  case 0x2:
127410337SAndrew.Bardsley@arm.com                    return new SubXSReg(machInst, rdzr, rn, rm, imm6, type);
127510037SARM gem5 Developers                  case 0x3:
127610337SAndrew.Bardsley@arm.com                    return new SubXSRegCc(machInst, rdzr, rn, rm, imm6, type);
127712595Ssiddhesh.poyarekar@gmail.com                  default:
127812595Ssiddhesh.poyarekar@gmail.com                    M5_UNREACHABLE;
127910037SARM gem5 Developers                }
128010037SARM gem5 Developers            } else {
128110037SARM gem5 Developers                if (bits(machInst, 23, 22) != 0 || bits(machInst, 12, 10) > 0x4)
128210037SARM gem5 Developers                   return new Unknown64(machInst);
128310037SARM gem5 Developers                ArmExtendType type =
128410037SARM gem5 Developers                    (ArmExtendType)(uint8_t)bits(machInst, 15, 13);
128510037SARM gem5 Developers                uint8_t imm3 = bits(machInst, 12, 10);
128610037SARM gem5 Developers                IntRegIndex rd = (IntRegIndex)(uint8_t)bits(machInst, 4, 0);
128710037SARM gem5 Developers                IntRegIndex rdsp = makeSP(rd);
128810337SAndrew.Bardsley@arm.com                IntRegIndex rdzr = makeZero(rd);
128910037SARM gem5 Developers                IntRegIndex rn = (IntRegIndex)(uint8_t)bits(machInst, 9, 5);
129010037SARM gem5 Developers                IntRegIndex rnsp = makeSP(rn);
129110037SARM gem5 Developers                IntRegIndex rm = (IntRegIndex)(uint8_t)bits(machInst, 20, 16);
129210037SARM gem5 Developers
129310037SARM gem5 Developers                switch (switchVal) {
129410037SARM gem5 Developers                  case 0x0:
129510037SARM gem5 Developers                    return new AddXEReg(machInst, rdsp, rnsp, rm, type, imm3);
129610037SARM gem5 Developers                  case 0x1:
129710337SAndrew.Bardsley@arm.com                    return new AddXERegCc(machInst, rdzr, rnsp, rm, type, imm3);
129810037SARM gem5 Developers                  case 0x2:
129910037SARM gem5 Developers                    return new SubXEReg(machInst, rdsp, rnsp, rm, type, imm3);
130010037SARM gem5 Developers                  case 0x3:
130110337SAndrew.Bardsley@arm.com                    return new SubXERegCc(machInst, rdzr, rnsp, rm, type, imm3);
130212595Ssiddhesh.poyarekar@gmail.com                  default:
130312595Ssiddhesh.poyarekar@gmail.com                    M5_UNREACHABLE;
130410037SARM gem5 Developers                }
130510037SARM gem5 Developers            }
130610037SARM gem5 Developers          }
130710037SARM gem5 Developers          case 0x2:
130810037SARM gem5 Developers          {
130910037SARM gem5 Developers            if (bits(machInst, 21) == 1)
131010037SARM gem5 Developers                return new Unknown64(machInst);
131110037SARM gem5 Developers            IntRegIndex rd = (IntRegIndex)(uint8_t)bits(machInst, 4, 0);
131210337SAndrew.Bardsley@arm.com            IntRegIndex rdzr = makeZero(rd);
131310037SARM gem5 Developers            IntRegIndex rn = (IntRegIndex)(uint8_t)bits(machInst, 9, 5);
131410037SARM gem5 Developers            IntRegIndex rm = (IntRegIndex)(uint8_t)bits(machInst, 20, 16);
131510037SARM gem5 Developers            switch (bits(machInst, 23, 22)) {
131610037SARM gem5 Developers              case 0x0:
131710037SARM gem5 Developers              {
131810037SARM gem5 Developers                if (bits(machInst, 15, 10))
131910037SARM gem5 Developers                    return new Unknown64(machInst);
132010037SARM gem5 Developers                uint8_t switchVal = bits(machInst, 30, 29);
132110037SARM gem5 Developers                switch (switchVal) {
132210037SARM gem5 Developers                  case 0x0:
132310337SAndrew.Bardsley@arm.com                    return new AdcXSReg(machInst, rdzr, rn, rm, 0, LSL);
132410037SARM gem5 Developers                  case 0x1:
132510337SAndrew.Bardsley@arm.com                    return new AdcXSRegCc(machInst, rdzr, rn, rm, 0, LSL);
132610037SARM gem5 Developers                  case 0x2:
132710337SAndrew.Bardsley@arm.com                    return new SbcXSReg(machInst, rdzr, rn, rm, 0, LSL);
132810037SARM gem5 Developers                  case 0x3:
132910337SAndrew.Bardsley@arm.com                    return new SbcXSRegCc(machInst, rdzr, rn, rm, 0, LSL);
133012595Ssiddhesh.poyarekar@gmail.com                  default:
133112595Ssiddhesh.poyarekar@gmail.com                    M5_UNREACHABLE;
133210037SARM gem5 Developers                }
133310037SARM gem5 Developers              }
133410037SARM gem5 Developers              case 0x1:
133510037SARM gem5 Developers              {
133610037SARM gem5 Developers                if ((bits(machInst, 4) == 1) ||
133710037SARM gem5 Developers                        (bits(machInst, 10) == 1) ||
133810037SARM gem5 Developers                        (bits(machInst, 29) == 0)) {
133910037SARM gem5 Developers                    return new Unknown64(machInst);
134010037SARM gem5 Developers                }
134110037SARM gem5 Developers                ConditionCode cond =
134210037SARM gem5 Developers                    (ConditionCode)(uint8_t)bits(machInst, 15, 12);
134310037SARM gem5 Developers                uint8_t flags = bits(machInst, 3, 0);
134410037SARM gem5 Developers                IntRegIndex rn = (IntRegIndex)(uint8_t)bits(machInst, 9, 5);
134510037SARM gem5 Developers                if (bits(machInst, 11) == 0) {
134610037SARM gem5 Developers                    IntRegIndex rm =
134710037SARM gem5 Developers                        (IntRegIndex)(uint8_t)bits(machInst, 20, 16);
134810037SARM gem5 Developers                    if (bits(machInst, 30) == 0) {
134910037SARM gem5 Developers                        return new CcmnReg64(machInst, rn, rm, cond, flags);
135010037SARM gem5 Developers                    } else {
135110037SARM gem5 Developers                        return new CcmpReg64(machInst, rn, rm, cond, flags);
135210037SARM gem5 Developers                    }
135310037SARM gem5 Developers                } else {
135410037SARM gem5 Developers                    uint8_t imm5 = bits(machInst, 20, 16);
135510037SARM gem5 Developers                    if (bits(machInst, 30) == 0) {
135610037SARM gem5 Developers                        return new CcmnImm64(machInst, rn, imm5, cond, flags);
135710037SARM gem5 Developers                    } else {
135810037SARM gem5 Developers                        return new CcmpImm64(machInst, rn, imm5, cond, flags);
135910037SARM gem5 Developers                    }
136010037SARM gem5 Developers                }
136110037SARM gem5 Developers              }
136210037SARM gem5 Developers              case 0x2:
136310037SARM gem5 Developers              {
136410037SARM gem5 Developers                if (bits(machInst, 29) == 1 ||
136510037SARM gem5 Developers                        bits(machInst, 11) == 1) {
136610037SARM gem5 Developers                    return new Unknown64(machInst);
136710037SARM gem5 Developers                }
136810037SARM gem5 Developers                uint8_t switchVal = (bits(machInst, 10) << 0) |
136910037SARM gem5 Developers                                    (bits(machInst, 30) << 1);
137010037SARM gem5 Developers                IntRegIndex rd = (IntRegIndex)(uint8_t)bits(machInst, 4, 0);
137110337SAndrew.Bardsley@arm.com                IntRegIndex rdzr = makeZero(rd);
137210037SARM gem5 Developers                IntRegIndex rn = (IntRegIndex)(uint8_t)bits(machInst, 9, 5);
137310037SARM gem5 Developers                IntRegIndex rm = (IntRegIndex)(uint8_t)bits(machInst, 20, 16);
137410037SARM gem5 Developers                ConditionCode cond =
137510037SARM gem5 Developers                    (ConditionCode)(uint8_t)bits(machInst, 15, 12);
137610037SARM gem5 Developers                switch (switchVal) {
137710037SARM gem5 Developers                  case 0x0:
137810337SAndrew.Bardsley@arm.com                    return new Csel64(machInst, rdzr, rn, rm, cond);
137910037SARM gem5 Developers                  case 0x1:
138010337SAndrew.Bardsley@arm.com                    return new Csinc64(machInst, rdzr, rn, rm, cond);
138110037SARM gem5 Developers                  case 0x2:
138210337SAndrew.Bardsley@arm.com                    return new Csinv64(machInst, rdzr, rn, rm, cond);
138310037SARM gem5 Developers                  case 0x3:
138410337SAndrew.Bardsley@arm.com                    return new Csneg64(machInst, rdzr, rn, rm, cond);
138512595Ssiddhesh.poyarekar@gmail.com                  default:
138612595Ssiddhesh.poyarekar@gmail.com                    M5_UNREACHABLE;
138710037SARM gem5 Developers                }
138810037SARM gem5 Developers              }
138910037SARM gem5 Developers              case 0x3:
139010037SARM gem5 Developers                if (bits(machInst, 30) == 0) {
139110037SARM gem5 Developers                    if (bits(machInst, 29) != 0)
139210037SARM gem5 Developers                        return new Unknown64(machInst);
139310037SARM gem5 Developers                    uint8_t switchVal = bits(machInst, 15, 10);
139410037SARM gem5 Developers                    switch (switchVal) {
139510037SARM gem5 Developers                      case 0x2:
139610337SAndrew.Bardsley@arm.com                        return new Udiv64(machInst, rdzr, rn, rm);
139710037SARM gem5 Developers                      case 0x3:
139810337SAndrew.Bardsley@arm.com                        return new Sdiv64(machInst, rdzr, rn, rm);
139910037SARM gem5 Developers                      case 0x8:
140010337SAndrew.Bardsley@arm.com                        return new Lslv64(machInst, rdzr, rn, rm);
140110037SARM gem5 Developers                      case 0x9:
140210337SAndrew.Bardsley@arm.com                        return new Lsrv64(machInst, rdzr, rn, rm);
140310037SARM gem5 Developers                      case 0xa:
140410337SAndrew.Bardsley@arm.com                        return new Asrv64(machInst, rdzr, rn, rm);
140510037SARM gem5 Developers                      case 0xb:
140610337SAndrew.Bardsley@arm.com                        return new Rorv64(machInst, rdzr, rn, rm);
140712258Sgiacomo.travaglini@arm.com                      case 0x10:
140812258Sgiacomo.travaglini@arm.com                        return new Crc32b64(machInst, rdzr, rn, rm);
140912258Sgiacomo.travaglini@arm.com                      case 0x11:
141012258Sgiacomo.travaglini@arm.com                        return new Crc32h64(machInst, rdzr, rn, rm);
141112258Sgiacomo.travaglini@arm.com                      case 0x12:
141212258Sgiacomo.travaglini@arm.com                        return new Crc32w64(machInst, rdzr, rn, rm);
141312258Sgiacomo.travaglini@arm.com                      case 0x13:
141412258Sgiacomo.travaglini@arm.com                        return new Crc32x64(machInst, rdzr, rn, rm);
141512258Sgiacomo.travaglini@arm.com                      case 0x14:
141612258Sgiacomo.travaglini@arm.com                        return new Crc32cb64(machInst, rdzr, rn, rm);
141712258Sgiacomo.travaglini@arm.com                      case 0x15:
141812258Sgiacomo.travaglini@arm.com                        return new Crc32ch64(machInst, rdzr, rn, rm);
141912258Sgiacomo.travaglini@arm.com                      case 0x16:
142012258Sgiacomo.travaglini@arm.com                        return new Crc32cw64(machInst, rdzr, rn, rm);
142112258Sgiacomo.travaglini@arm.com                      case 0x17:
142212258Sgiacomo.travaglini@arm.com                        return new Crc32cx64(machInst, rdzr, rn, rm);
142310037SARM gem5 Developers                      default:
142410037SARM gem5 Developers                        return new Unknown64(machInst);
142510037SARM gem5 Developers                    }
142610037SARM gem5 Developers                } else {
142710037SARM gem5 Developers                    if (bits(machInst, 20, 16) != 0 ||
142810037SARM gem5 Developers                            bits(machInst, 29) != 0) {
142910037SARM gem5 Developers                        return new Unknown64(machInst);
143010037SARM gem5 Developers                    }
143110037SARM gem5 Developers                    uint8_t switchVal = bits(machInst, 15, 10);
143210037SARM gem5 Developers                    switch (switchVal) {
143310037SARM gem5 Developers                      case 0x0:
143410337SAndrew.Bardsley@arm.com                        return new Rbit64(machInst, rdzr, rn);
143510037SARM gem5 Developers                      case 0x1:
143610337SAndrew.Bardsley@arm.com                        return new Rev1664(machInst, rdzr, rn);
143710037SARM gem5 Developers                      case 0x2:
143810037SARM gem5 Developers                        if (bits(machInst, 31) == 0)
143910337SAndrew.Bardsley@arm.com                            return new Rev64(machInst, rdzr, rn);
144010037SARM gem5 Developers                        else
144110337SAndrew.Bardsley@arm.com                            return new Rev3264(machInst, rdzr, rn);
144210037SARM gem5 Developers                      case 0x3:
144310037SARM gem5 Developers                        if (bits(machInst, 31) != 1)
144410037SARM gem5 Developers                            return new Unknown64(machInst);
144510337SAndrew.Bardsley@arm.com                        return new Rev64(machInst, rdzr, rn);
144610037SARM gem5 Developers                      case 0x4:
144710337SAndrew.Bardsley@arm.com                        return new Clz64(machInst, rdzr, rn);
144810037SARM gem5 Developers                      case 0x5:
144910337SAndrew.Bardsley@arm.com                        return new Cls64(machInst, rdzr, rn);
145012595Ssiddhesh.poyarekar@gmail.com                      default:
145112595Ssiddhesh.poyarekar@gmail.com                        return new Unknown64(machInst);
145210037SARM gem5 Developers                    }
145310037SARM gem5 Developers                }
145412595Ssiddhesh.poyarekar@gmail.com              default:
145512595Ssiddhesh.poyarekar@gmail.com                M5_UNREACHABLE;
145610037SARM gem5 Developers            }
145710037SARM gem5 Developers          }
145810037SARM gem5 Developers          case 0x3:
145910037SARM gem5 Developers          {
146010037SARM gem5 Developers            if (bits(machInst, 30, 29) != 0x0 ||
146110037SARM gem5 Developers                    (bits(machInst, 23, 21) != 0 && bits(machInst, 31) == 0))
146210037SARM gem5 Developers                return new Unknown64(machInst);
146310037SARM gem5 Developers            IntRegIndex rd = (IntRegIndex)(uint8_t)bits(machInst, 4, 0);
146410337SAndrew.Bardsley@arm.com            IntRegIndex rdzr = makeZero(rd);
146510037SARM gem5 Developers            IntRegIndex rn = (IntRegIndex)(uint8_t)bits(machInst, 9, 5);
146610037SARM gem5 Developers            IntRegIndex ra = (IntRegIndex)(uint8_t)bits(machInst, 14, 10);
146710037SARM gem5 Developers            IntRegIndex rm = (IntRegIndex)(uint8_t)bits(machInst, 20, 16);
146810037SARM gem5 Developers            switch (bits(machInst, 23, 21)) {
146910037SARM gem5 Developers              case 0x0:
147010037SARM gem5 Developers                if (bits(machInst, 15) == 0)
147110337SAndrew.Bardsley@arm.com                    return new Madd64(machInst, rdzr, ra, rn, rm);
147210037SARM gem5 Developers                else
147310337SAndrew.Bardsley@arm.com                    return new Msub64(machInst, rdzr, ra, rn, rm);
147410037SARM gem5 Developers              case 0x1:
147510037SARM gem5 Developers                if (bits(machInst, 15) == 0)
147610337SAndrew.Bardsley@arm.com                    return new Smaddl64(machInst, rdzr, ra, rn, rm);
147710037SARM gem5 Developers                else
147810337SAndrew.Bardsley@arm.com                    return new Smsubl64(machInst, rdzr, ra, rn, rm);
147910037SARM gem5 Developers              case 0x2:
148010037SARM gem5 Developers                if (bits(machInst, 15) != 0)
148110037SARM gem5 Developers                    return new Unknown64(machInst);
148210337SAndrew.Bardsley@arm.com                return new Smulh64(machInst, rdzr, rn, rm);
148310037SARM gem5 Developers              case 0x5:
148410037SARM gem5 Developers                if (bits(machInst, 15) == 0)
148510337SAndrew.Bardsley@arm.com                    return new Umaddl64(machInst, rdzr, ra, rn, rm);
148610037SARM gem5 Developers                else
148710337SAndrew.Bardsley@arm.com                    return new Umsubl64(machInst, rdzr, ra, rn, rm);
148810037SARM gem5 Developers              case 0x6:
148910037SARM gem5 Developers                if (bits(machInst, 15) != 0)
149010037SARM gem5 Developers                    return new Unknown64(machInst);
149110337SAndrew.Bardsley@arm.com                return new Umulh64(machInst, rdzr, rn, rm);
149210037SARM gem5 Developers              default:
149310037SARM gem5 Developers                return new Unknown64(machInst);
149410037SARM gem5 Developers            }
149510037SARM gem5 Developers          }
149612595Ssiddhesh.poyarekar@gmail.com          default:
149712595Ssiddhesh.poyarekar@gmail.com            M5_UNREACHABLE;
149810037SARM gem5 Developers        }
149910037SARM gem5 Developers        return new FailUnimplemented("Unhandled Case2", machInst);
150010037SARM gem5 Developers    }
150110037SARM gem5 Developers}
150210037SARM gem5 Developers}};
150310037SARM gem5 Developers
150410037SARM gem5 Developersoutput decoder {{
150510037SARM gem5 Developersnamespace Aarch64
150610037SARM gem5 Developers{
150711165SRekai.GonzalezAlberquilla@arm.com    template <typename DecoderFeatures>
150810037SARM gem5 Developers    StaticInstPtr
150910037SARM gem5 Developers    decodeAdvSIMD(ExtMachInst machInst)
151010037SARM gem5 Developers    {
151110037SARM gem5 Developers        if (bits(machInst, 24) == 1) {
151210037SARM gem5 Developers            if (bits(machInst, 10) == 0) {
151311165SRekai.GonzalezAlberquilla@arm.com                return decodeNeonIndexedElem<DecoderFeatures>(machInst);
151410037SARM gem5 Developers            } else if (bits(machInst, 23) == 1) {
151510037SARM gem5 Developers                return new Unknown64(machInst);
151610037SARM gem5 Developers            } else {
151710037SARM gem5 Developers                if (bits(machInst, 22, 19)) {
151810037SARM gem5 Developers                    return decodeNeonShiftByImm(machInst);
151910037SARM gem5 Developers                } else {
152010037SARM gem5 Developers                    return decodeNeonModImm(machInst);
152110037SARM gem5 Developers                }
152210037SARM gem5 Developers            }
152310037SARM gem5 Developers        } else if (bits(machInst, 21) == 1) {
152410037SARM gem5 Developers            if (bits(machInst, 10) == 1) {
152511165SRekai.GonzalezAlberquilla@arm.com                return decodeNeon3Same<DecoderFeatures>(machInst);
152610037SARM gem5 Developers            } else if (bits(machInst, 11) == 0) {
152710037SARM gem5 Developers                return decodeNeon3Diff(machInst);
152810037SARM gem5 Developers            } else if (bits(machInst, 20, 17) == 0x0) {
152910037SARM gem5 Developers                return decodeNeon2RegMisc(machInst);
153013171Sgiacomo.travaglini@arm.com            } else if (bits(machInst, 20, 17) == 0x4) {
153113171Sgiacomo.travaglini@arm.com                return decodeCryptoAES(machInst);
153210037SARM gem5 Developers            } else if (bits(machInst, 20, 17) == 0x8) {
153310037SARM gem5 Developers                return decodeNeonAcrossLanes(machInst);
153410037SARM gem5 Developers            } else {
153510037SARM gem5 Developers                return new Unknown64(machInst);
153610037SARM gem5 Developers            }
153710037SARM gem5 Developers        } else if (bits(machInst, 24) ||
153810037SARM gem5 Developers                   bits(machInst, 21) ||
153910037SARM gem5 Developers                   bits(machInst, 15)) {
154010037SARM gem5 Developers            return new Unknown64(machInst);
154110037SARM gem5 Developers        } else if (bits(machInst, 10) == 1) {
154210037SARM gem5 Developers            if (bits(machInst, 23, 22))
154310037SARM gem5 Developers                return new Unknown64(machInst);
154410037SARM gem5 Developers            return decodeNeonCopy(machInst);
154510037SARM gem5 Developers        } else if (bits(machInst, 29) == 1) {
154610037SARM gem5 Developers            return decodeNeonExt(machInst);
154710037SARM gem5 Developers        } else if (bits(machInst, 11) == 1) {
154810037SARM gem5 Developers            return decodeNeonZipUzpTrn(machInst);
154910037SARM gem5 Developers        } else if (bits(machInst, 23, 22) == 0x0) {
155010037SARM gem5 Developers            return decodeNeonTblTbx(machInst);
155110037SARM gem5 Developers        } else {
155210037SARM gem5 Developers            return new Unknown64(machInst);
155310037SARM gem5 Developers        }
155410037SARM gem5 Developers        return new FailUnimplemented("Unhandled Case3", machInst);
155510037SARM gem5 Developers    }
155610037SARM gem5 Developers}
155710037SARM gem5 Developers}};
155810037SARM gem5 Developers
155910037SARM gem5 Developers
156010037SARM gem5 Developersoutput decoder {{
156110037SARM gem5 Developersnamespace Aarch64
156210037SARM gem5 Developers{
156310037SARM gem5 Developers    StaticInstPtr
156410037SARM gem5 Developers    // bit 30=0, 28:25=1111
156510037SARM gem5 Developers    decodeFp(ExtMachInst machInst)
156610037SARM gem5 Developers    {
156710037SARM gem5 Developers        if (bits(machInst, 24) == 1) {
156810037SARM gem5 Developers            if (bits(machInst, 31) || bits(machInst, 29))
156910037SARM gem5 Developers                return new Unknown64(machInst);
157010037SARM gem5 Developers            IntRegIndex rd    = (IntRegIndex)(uint32_t)bits(machInst, 4, 0);
157110037SARM gem5 Developers            IntRegIndex rn    = (IntRegIndex)(uint32_t)bits(machInst, 9, 5);
157210037SARM gem5 Developers            IntRegIndex rm    = (IntRegIndex)(uint32_t)bits(machInst, 20, 16);
157310037SARM gem5 Developers            IntRegIndex ra    = (IntRegIndex)(uint32_t)bits(machInst, 14, 10);
157410037SARM gem5 Developers            uint8_t switchVal = (bits(machInst, 23, 21) << 1) |
157510037SARM gem5 Developers                                (bits(machInst, 15)     << 0);
157610037SARM gem5 Developers            switch (switchVal) {
157710037SARM gem5 Developers              case 0x0: // FMADD Sd = Sa + Sn*Sm
157810037SARM gem5 Developers                return new FMAddS(machInst, rd, rn, rm, ra);
157910037SARM gem5 Developers              case 0x1: // FMSUB Sd = Sa + (-Sn)*Sm
158010037SARM gem5 Developers                return new FMSubS(machInst, rd, rn, rm, ra);
158110037SARM gem5 Developers              case 0x2: // FNMADD Sd = (-Sa) + (-Sn)*Sm
158210037SARM gem5 Developers                return new FNMAddS(machInst, rd, rn, rm, ra);
158310037SARM gem5 Developers              case 0x3: // FNMSUB Sd = (-Sa) + Sn*Sm
158410037SARM gem5 Developers                return new FNMSubS(machInst, rd, rn, rm, ra);
158510037SARM gem5 Developers              case 0x4: // FMADD Dd = Da + Dn*Dm
158610037SARM gem5 Developers                return new FMAddD(machInst, rd, rn, rm, ra);
158710037SARM gem5 Developers              case 0x5: // FMSUB Dd = Da + (-Dn)*Dm
158810037SARM gem5 Developers                return new FMSubD(machInst, rd, rn, rm, ra);
158910037SARM gem5 Developers              case 0x6: // FNMADD Dd = (-Da) + (-Dn)*Dm
159010037SARM gem5 Developers                return new FNMAddD(machInst, rd, rn, rm, ra);
159110037SARM gem5 Developers              case 0x7: // FNMSUB Dd = (-Da) + Dn*Dm
159210037SARM gem5 Developers                return new FNMSubD(machInst, rd, rn, rm, ra);
159310037SARM gem5 Developers              default:
159410037SARM gem5 Developers                return new Unknown64(machInst);
159510037SARM gem5 Developers            }
159610037SARM gem5 Developers        } else if (bits(machInst, 21) == 0) {
159710037SARM gem5 Developers            bool s = bits(machInst, 29);
159810037SARM gem5 Developers            if (s)
159910037SARM gem5 Developers                return new Unknown64(machInst);
160010037SARM gem5 Developers            uint8_t switchVal = bits(machInst, 20, 16);
160110037SARM gem5 Developers            uint8_t type      = bits(machInst, 23, 22);
160210037SARM gem5 Developers            uint8_t scale     = bits(machInst, 15, 10);
160310037SARM gem5 Developers            IntRegIndex rd    = (IntRegIndex)(uint32_t)bits(machInst, 4, 0);
160410037SARM gem5 Developers            IntRegIndex rn    = (IntRegIndex)(uint32_t)bits(machInst, 9, 5);
160510037SARM gem5 Developers            if (bits(machInst, 18, 17) == 3 && scale != 0)
160610037SARM gem5 Developers                return new Unknown64(machInst);
160710037SARM gem5 Developers            // 30:24=0011110, 21=0
160810037SARM gem5 Developers            switch (switchVal) {
160910037SARM gem5 Developers              case 0x00:
161010037SARM gem5 Developers                return new FailUnimplemented("fcvtns", machInst);
161110037SARM gem5 Developers              case 0x01:
161210037SARM gem5 Developers                return new FailUnimplemented("fcvtnu", machInst);
161310037SARM gem5 Developers              case 0x02:
161410037SARM gem5 Developers                switch ( (bits(machInst, 31) << 2) | type ) {
161510037SARM gem5 Developers                  case 0: // SCVTF Sd = convertFromInt(Wn/(2^fbits))
161610037SARM gem5 Developers                    return new FcvtSFixedFpSW(machInst, rd, rn, scale);
161710037SARM gem5 Developers                  case 1: // SCVTF Dd = convertFromInt(Wn/(2^fbits))
161810037SARM gem5 Developers                    return new FcvtSFixedFpDW(machInst, rd, rn, scale);
161910037SARM gem5 Developers                  case 4: // SCVTF Sd = convertFromInt(Xn/(2^fbits))
162010037SARM gem5 Developers                    return new FcvtSFixedFpSX(machInst, rd, rn, scale);
162110037SARM gem5 Developers                  case 5: // SCVTF Dd = convertFromInt(Xn/(2^fbits))
162210037SARM gem5 Developers                    return new FcvtSFixedFpDX(machInst, rd, rn, scale);
162310037SARM gem5 Developers                  default:
162410037SARM gem5 Developers                    return new Unknown64(machInst);
162510037SARM gem5 Developers                }
162610037SARM gem5 Developers              case 0x03:
162710037SARM gem5 Developers                switch ( (bits(machInst, 31) << 2) | type ) {
162810037SARM gem5 Developers                  case 0: // UCVTF Sd = convertFromInt(Wn/(2^fbits))
162910037SARM gem5 Developers                    return new FcvtUFixedFpSW(machInst, rd, rn, scale);
163010037SARM gem5 Developers                  case 1: // UCVTF Dd = convertFromInt(Wn/(2^fbits))
163110037SARM gem5 Developers                    return new FcvtUFixedFpDW(machInst, rd, rn, scale);
163210037SARM gem5 Developers                  case 4: // UCVTF Sd = convertFromInt(Xn/(2^fbits))
163310037SARM gem5 Developers                    return new FcvtUFixedFpSX(machInst, rd, rn, scale);
163410037SARM gem5 Developers                  case 5: // UCVTF Dd = convertFromInt(Xn/(2^fbits))
163510037SARM gem5 Developers                    return new FcvtUFixedFpDX(machInst, rd, rn, scale);
163610037SARM gem5 Developers                  default:
163710037SARM gem5 Developers                    return new Unknown64(machInst);
163810037SARM gem5 Developers                }
163910037SARM gem5 Developers              case 0x04:
164010037SARM gem5 Developers                return new FailUnimplemented("fcvtas", machInst);
164110037SARM gem5 Developers              case 0x05:
164210037SARM gem5 Developers                return new FailUnimplemented("fcvtau", machInst);
164310037SARM gem5 Developers              case 0x08:
164410037SARM gem5 Developers                return new FailUnimplemented("fcvtps", machInst);
164510037SARM gem5 Developers              case 0x09:
164610037SARM gem5 Developers                return new FailUnimplemented("fcvtpu", machInst);
164710037SARM gem5 Developers              case 0x0e:
164810037SARM gem5 Developers                return new FailUnimplemented("fmov elem. to 64", machInst);
164910037SARM gem5 Developers              case 0x0f:
165010037SARM gem5 Developers                return new FailUnimplemented("fmov 64 bit", machInst);
165110037SARM gem5 Developers              case 0x10:
165210037SARM gem5 Developers                return new FailUnimplemented("fcvtms", machInst);
165310037SARM gem5 Developers              case 0x11:
165410037SARM gem5 Developers                return new FailUnimplemented("fcvtmu", machInst);
165510037SARM gem5 Developers              case 0x18:
165610037SARM gem5 Developers                switch ( (bits(machInst, 31) << 2) | type ) {
165710037SARM gem5 Developers                  case 0: // FCVTZS Wd = convertToIntExactTowardZero(Sn*(2^fbits))
165810037SARM gem5 Developers                    return new FcvtFpSFixedSW(machInst, rd, rn, scale);
165910037SARM gem5 Developers                  case 1: // FCVTZS Wd = convertToIntExactTowardZero(Dn*(2^fbits))
166010037SARM gem5 Developers                    return new FcvtFpSFixedDW(machInst, rd, rn, scale);
166110037SARM gem5 Developers                  case 4: // FCVTZS Xd = convertToIntExactTowardZero(Sn*(2^fbits))
166210037SARM gem5 Developers                    return new FcvtFpSFixedSX(machInst, rd, rn, scale);
166310037SARM gem5 Developers                  case 5: // FCVTZS Xd = convertToIntExactTowardZero(Dn*(2^fbits))
166410037SARM gem5 Developers                    return new FcvtFpSFixedDX(machInst, rd, rn, scale);
166510037SARM gem5 Developers                  default:
166610037SARM gem5 Developers                    return new Unknown64(machInst);
166710037SARM gem5 Developers                }
166810037SARM gem5 Developers              case 0x19:
166910037SARM gem5 Developers                switch ( (bits(machInst, 31) << 2) | type ) {
167010037SARM gem5 Developers                  case 0: // FCVTZU Wd = convertToIntExactTowardZero(Sn*(2^fbits))
167110037SARM gem5 Developers                    return new FcvtFpUFixedSW(machInst, rd, rn, scale);
167210037SARM gem5 Developers                  case 1: // FCVTZU Wd = convertToIntExactTowardZero(Dn*(2^fbits))
167310037SARM gem5 Developers                    return new FcvtFpUFixedDW(machInst, rd, rn, scale);
167410037SARM gem5 Developers                  case 4: // FCVTZU Xd = convertToIntExactTowardZero(Sn*(2^fbits))
167510037SARM gem5 Developers                    return new FcvtFpUFixedSX(machInst, rd, rn, scale);
167610037SARM gem5 Developers                  case 5: // FCVTZU Xd = convertToIntExactTowardZero(Dn*(2^fbits))
167710037SARM gem5 Developers                    return new FcvtFpUFixedDX(machInst, rd, rn, scale);
167810037SARM gem5 Developers                  default:
167910037SARM gem5 Developers                    return new Unknown64(machInst);
168010037SARM gem5 Developers                }
168112595Ssiddhesh.poyarekar@gmail.com              default:
168212595Ssiddhesh.poyarekar@gmail.com                return new Unknown64(machInst);
168310037SARM gem5 Developers            }
168410037SARM gem5 Developers        } else {
168510037SARM gem5 Developers            // 30=0, 28:24=11110, 21=1
168610037SARM gem5 Developers            uint8_t type   = bits(machInst, 23, 22);
168710037SARM gem5 Developers            uint8_t imm8   = bits(machInst, 20, 13);
168810037SARM gem5 Developers            IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 4, 0);
168910037SARM gem5 Developers            IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 9, 5);
169010037SARM gem5 Developers            switch (bits(machInst, 11, 10)) {
169110037SARM gem5 Developers              case 0x0:
169210037SARM gem5 Developers                if (bits(machInst, 12) == 1) {
169310037SARM gem5 Developers                    if (bits(machInst, 31) ||
169410037SARM gem5 Developers                            bits(machInst, 29) ||
169510037SARM gem5 Developers                            bits(machInst, 9, 5)) {
169610037SARM gem5 Developers                        return new Unknown64(machInst);
169710037SARM gem5 Developers                    }
169810037SARM gem5 Developers                    // 31:29=000, 28:24=11110, 21=1, 12:10=100
169910037SARM gem5 Developers                    if (type == 0) {
170010037SARM gem5 Developers                        // FMOV S[d] = imm8<7>:NOT(imm8<6>):Replicate(imm8<6>,5)
170110037SARM gem5 Developers                        //             :imm8<5:0>:Zeros(19)
170213120SEdmund.Grimley-Evans@arm.com                        uint32_t imm = vfp_modified_imm(imm8,
170313120SEdmund.Grimley-Evans@arm.com                                                        FpDataType::Fp32);
170410037SARM gem5 Developers                        return new FmovImmS(machInst, rd, imm);
170510037SARM gem5 Developers                    } else if (type == 1) {
170610037SARM gem5 Developers                        // FMOV D[d] = imm8<7>:NOT(imm8<6>):Replicate(imm8<6>,8)
170710037SARM gem5 Developers                        //             :imm8<5:0>:Zeros(48)
170813120SEdmund.Grimley-Evans@arm.com                        uint64_t imm = vfp_modified_imm(imm8,
170913120SEdmund.Grimley-Evans@arm.com                                                        FpDataType::Fp64);
171010037SARM gem5 Developers                        return new FmovImmD(machInst, rd, imm);
171110037SARM gem5 Developers                    } else {
171210037SARM gem5 Developers                        return new Unknown64(machInst);
171310037SARM gem5 Developers                    }
171410037SARM gem5 Developers                } else if (bits(machInst, 13) == 1) {
171510037SARM gem5 Developers                    if (bits(machInst, 31) ||
171610037SARM gem5 Developers                            bits(machInst, 29) ||
171710037SARM gem5 Developers                            bits(machInst, 15, 14) ||
171810037SARM gem5 Developers                            bits(machInst, 23) ||
171910037SARM gem5 Developers                            bits(machInst, 2, 0)) {
172010037SARM gem5 Developers                        return new Unknown64(machInst);
172110037SARM gem5 Developers                    }
172210037SARM gem5 Developers                    uint8_t switchVal = (bits(machInst, 4, 3) << 0) |
172310037SARM gem5 Developers                                        (bits(machInst, 22) << 2);
172410037SARM gem5 Developers                    IntRegIndex rm = (IntRegIndex)(uint32_t)
172510037SARM gem5 Developers                                        bits(machInst, 20, 16);
172610037SARM gem5 Developers                    // 28:23=000111100, 21=1, 15:10=001000, 2:0=000
172710037SARM gem5 Developers                    switch (switchVal) {
172810037SARM gem5 Developers                      case 0x0:
172910037SARM gem5 Developers                        // FCMP flags = compareQuiet(Sn,Sm)
173010037SARM gem5 Developers                        return new FCmpRegS(machInst, rn, rm);
173110037SARM gem5 Developers                      case 0x1:
173210037SARM gem5 Developers                        // FCMP flags = compareQuiet(Sn,0.0)
173310037SARM gem5 Developers                        return new FCmpImmS(machInst, rn, 0);
173410037SARM gem5 Developers                      case 0x2:
173510037SARM gem5 Developers                        // FCMPE flags = compareSignaling(Sn,Sm)
173610037SARM gem5 Developers                        return new FCmpERegS(machInst, rn, rm);
173710037SARM gem5 Developers                      case 0x3:
173810037SARM gem5 Developers                        // FCMPE flags = compareSignaling(Sn,0.0)
173910037SARM gem5 Developers                        return new FCmpEImmS(machInst, rn, 0);
174010037SARM gem5 Developers                      case 0x4:
174110037SARM gem5 Developers                        // FCMP flags = compareQuiet(Dn,Dm)
174210037SARM gem5 Developers                        return new FCmpRegD(machInst, rn, rm);
174310037SARM gem5 Developers                      case 0x5:
174410037SARM gem5 Developers                        // FCMP flags = compareQuiet(Dn,0.0)
174510037SARM gem5 Developers                        return new FCmpImmD(machInst, rn, 0);
174610037SARM gem5 Developers                      case 0x6:
174710037SARM gem5 Developers                        // FCMPE flags = compareSignaling(Dn,Dm)
174810037SARM gem5 Developers                        return new FCmpERegD(machInst, rn, rm);
174910037SARM gem5 Developers                      case 0x7:
175010037SARM gem5 Developers                        // FCMPE flags = compareSignaling(Dn,0.0)
175110037SARM gem5 Developers                        return new FCmpEImmD(machInst, rn, 0);
175210037SARM gem5 Developers                      default:
175310037SARM gem5 Developers                        return new Unknown64(machInst);
175410037SARM gem5 Developers                    }
175510037SARM gem5 Developers                } else if (bits(machInst, 14) == 1) {
175610037SARM gem5 Developers                    if (bits(machInst, 31) || bits(machInst, 29))
175710037SARM gem5 Developers                        return new Unknown64(machInst);
175810037SARM gem5 Developers                    uint8_t opcode = bits(machInst, 20, 15);
175910037SARM gem5 Developers                    // Bits 31:24=00011110, 21=1, 14:10=10000
176010037SARM gem5 Developers                    switch (opcode) {
176110037SARM gem5 Developers                      case 0x0:
176210037SARM gem5 Developers                        if (type == 0)
176310037SARM gem5 Developers                            // FMOV Sd = Sn
176410037SARM gem5 Developers                            return new FmovRegS(machInst, rd, rn);
176510037SARM gem5 Developers                        else if (type == 1)
176610037SARM gem5 Developers                            // FMOV Dd = Dn
176710037SARM gem5 Developers                            return new FmovRegD(machInst, rd, rn);
176810037SARM gem5 Developers                        break;
176910037SARM gem5 Developers                      case 0x1:
177010037SARM gem5 Developers                        if (type == 0)
177110037SARM gem5 Developers                            // FABS Sd = abs(Sn)
177210037SARM gem5 Developers                            return new FAbsS(machInst, rd, rn);
177310037SARM gem5 Developers                        else if (type == 1)
177410037SARM gem5 Developers                            // FABS Dd = abs(Dn)
177510037SARM gem5 Developers                            return new FAbsD(machInst, rd, rn);
177610037SARM gem5 Developers                        break;
177710037SARM gem5 Developers                      case 0x2:
177810037SARM gem5 Developers                        if (type == 0)
177910037SARM gem5 Developers                            // FNEG Sd = -Sn
178010037SARM gem5 Developers                            return new FNegS(machInst, rd, rn);
178110037SARM gem5 Developers                        else if (type == 1)
178210037SARM gem5 Developers                            // FNEG Dd = -Dn
178310037SARM gem5 Developers                            return new FNegD(machInst, rd, rn);
178410037SARM gem5 Developers                        break;
178510037SARM gem5 Developers                      case 0x3:
178610037SARM gem5 Developers                        if (type == 0)
178710037SARM gem5 Developers                            // FSQRT Sd = sqrt(Sn)
178810037SARM gem5 Developers                            return new FSqrtS(machInst, rd, rn);
178910037SARM gem5 Developers                        else if (type == 1)
179010037SARM gem5 Developers                            // FSQRT Dd = sqrt(Dn)
179110037SARM gem5 Developers                            return new FSqrtD(machInst, rd, rn);
179210037SARM gem5 Developers                        break;
179310037SARM gem5 Developers                      case 0x4:
179410037SARM gem5 Developers                        if (type == 1)
179510037SARM gem5 Developers                            // FCVT Sd = convertFormat(Dn)
179610037SARM gem5 Developers                            return new FcvtFpDFpS(machInst, rd, rn);
179710037SARM gem5 Developers                        else if (type == 3)
179810037SARM gem5 Developers                            // FCVT Sd = convertFormat(Hn)
179910037SARM gem5 Developers                            return new FcvtFpHFpS(machInst, rd, rn);
180010037SARM gem5 Developers                        break;
180110037SARM gem5 Developers                      case 0x5:
180210037SARM gem5 Developers                        if (type == 0)
180310037SARM gem5 Developers                            // FCVT Dd = convertFormat(Sn)
180410037SARM gem5 Developers                            return new FCvtFpSFpD(machInst, rd, rn);
180510037SARM gem5 Developers                        else if (type == 3)
180610037SARM gem5 Developers                            // FCVT Dd = convertFormat(Hn)
180710037SARM gem5 Developers                            return new FcvtFpHFpD(machInst, rd, rn);
180810037SARM gem5 Developers                        break;
180910037SARM gem5 Developers                      case 0x7:
181010037SARM gem5 Developers                        if (type == 0)
181110037SARM gem5 Developers                            // FCVT Hd = convertFormat(Sn)
181210037SARM gem5 Developers                            return new FcvtFpSFpH(machInst, rd, rn);
181310037SARM gem5 Developers                        else if (type == 1)
181410037SARM gem5 Developers                            // FCVT Hd = convertFormat(Dn)
181510037SARM gem5 Developers                            return new FcvtFpDFpH(machInst, rd, rn);
181610037SARM gem5 Developers                        break;
181710037SARM gem5 Developers                      case 0x8:
181810037SARM gem5 Developers                        if (type == 0) // FRINTN Sd = roundToIntegralTiesToEven(Sn)
181910037SARM gem5 Developers                            return new FRIntNS(machInst, rd, rn);
182010037SARM gem5 Developers                        else if (type == 1) // FRINTN Dd = roundToIntegralTiesToEven(Dn)
182110037SARM gem5 Developers                            return new FRIntND(machInst, rd, rn);
182210037SARM gem5 Developers                        break;
182310037SARM gem5 Developers                      case 0x9:
182410037SARM gem5 Developers                        if (type == 0) // FRINTP Sd = roundToIntegralTowardPlusInf(Sn)
182510037SARM gem5 Developers                            return new FRIntPS(machInst, rd, rn);
182610037SARM gem5 Developers                        else if (type == 1) // FRINTP Dd = roundToIntegralTowardPlusInf(Dn)
182710037SARM gem5 Developers                            return new FRIntPD(machInst, rd, rn);
182810037SARM gem5 Developers                        break;
182910037SARM gem5 Developers                      case 0xa:
183010037SARM gem5 Developers                        if (type == 0) // FRINTM Sd = roundToIntegralTowardMinusInf(Sn)
183110037SARM gem5 Developers                            return new FRIntMS(machInst, rd, rn);
183210037SARM gem5 Developers                        else if (type == 1) // FRINTM Dd = roundToIntegralTowardMinusInf(Dn)
183310037SARM gem5 Developers                            return new FRIntMD(machInst, rd, rn);
183410037SARM gem5 Developers                        break;
183510037SARM gem5 Developers                      case 0xb:
183610037SARM gem5 Developers                        if (type == 0) // FRINTZ Sd = roundToIntegralTowardZero(Sn)
183710037SARM gem5 Developers                            return new FRIntZS(machInst, rd, rn);
183810037SARM gem5 Developers                        else if (type == 1) // FRINTZ Dd = roundToIntegralTowardZero(Dn)
183910037SARM gem5 Developers                            return new FRIntZD(machInst, rd, rn);
184010037SARM gem5 Developers                        break;
184110037SARM gem5 Developers                      case 0xc:
184210037SARM gem5 Developers                        if (type == 0) // FRINTA Sd = roundToIntegralTiesToAway(Sn)
184310037SARM gem5 Developers                            return new FRIntAS(machInst, rd, rn);
184410037SARM gem5 Developers                        else if (type == 1) // FRINTA Dd = roundToIntegralTiesToAway(Dn)
184510037SARM gem5 Developers                            return new FRIntAD(machInst, rd, rn);
184610037SARM gem5 Developers                        break;
184710037SARM gem5 Developers                      case 0xe:
184810037SARM gem5 Developers                        if (type == 0) // FRINTX Sd = roundToIntegralExact(Sn)
184910037SARM gem5 Developers                            return new FRIntXS(machInst, rd, rn);
185010037SARM gem5 Developers                        else if (type == 1) // FRINTX Dd = roundToIntegralExact(Dn)
185110037SARM gem5 Developers                            return new FRIntXD(machInst, rd, rn);
185210037SARM gem5 Developers                        break;
185310037SARM gem5 Developers                      case 0xf:
185410037SARM gem5 Developers                        if (type == 0) // FRINTI Sd = roundToIntegral(Sn)
185510037SARM gem5 Developers                            return new FRIntIS(machInst, rd, rn);
185610037SARM gem5 Developers                        else if (type == 1) // FRINTI Dd = roundToIntegral(Dn)
185710037SARM gem5 Developers                            return new FRIntID(machInst, rd, rn);
185810037SARM gem5 Developers                        break;
185910037SARM gem5 Developers                      default:
186010037SARM gem5 Developers                        return new Unknown64(machInst);
186110037SARM gem5 Developers                    }
186210037SARM gem5 Developers                    return new Unknown64(machInst);
186310037SARM gem5 Developers                } else if (bits(machInst, 15) == 1) {
186410037SARM gem5 Developers                    return new Unknown64(machInst);
186510037SARM gem5 Developers                } else {
186610037SARM gem5 Developers                    if (bits(machInst, 29))
186710037SARM gem5 Developers                        return new Unknown64(machInst);
186810037SARM gem5 Developers                    uint8_t rmode      = bits(machInst, 20, 19);
186910037SARM gem5 Developers                    uint8_t switchVal1 = bits(machInst, 18, 16);
187010037SARM gem5 Developers                    uint8_t switchVal2 = (type << 1) | bits(machInst, 31);
187110037SARM gem5 Developers                    // 30:24=0011110, 21=1, 15:10=000000
187210037SARM gem5 Developers                    switch (switchVal1) {
187310037SARM gem5 Developers                      case 0x0:
187410037SARM gem5 Developers                        switch ((switchVal2 << 2) | rmode) {
187510037SARM gem5 Developers                          case 0x0: //FCVTNS Wd = convertToIntExactTiesToEven(Sn)
187610037SARM gem5 Developers                            return new FcvtFpSIntWSN(machInst, rd, rn);
187710037SARM gem5 Developers                          case 0x1: //FCVTPS Wd = convertToIntExactTowardPlusInf(Sn)
187810037SARM gem5 Developers                            return new FcvtFpSIntWSP(machInst, rd, rn);
187910037SARM gem5 Developers                          case 0x2: //FCVTMS Wd = convertToIntExactTowardMinusInf(Sn)
188010037SARM gem5 Developers                            return new FcvtFpSIntWSM(machInst, rd, rn);
188110037SARM gem5 Developers                          case 0x3: //FCVTZS Wd = convertToIntExactTowardZero(Sn)
188210037SARM gem5 Developers                            return new FcvtFpSIntWSZ(machInst, rd, rn);
188310037SARM gem5 Developers                          case 0x4: //FCVTNS Xd = convertToIntExactTiesToEven(Sn)
188410037SARM gem5 Developers                            return new FcvtFpSIntXSN(machInst, rd, rn);
188510037SARM gem5 Developers                          case 0x5: //FCVTPS Xd = convertToIntExactTowardPlusInf(Sn)
188610037SARM gem5 Developers                            return new FcvtFpSIntXSP(machInst, rd, rn);
188710037SARM gem5 Developers                          case 0x6: //FCVTMS Xd = convertToIntExactTowardMinusInf(Sn)
188810037SARM gem5 Developers                            return new FcvtFpSIntXSM(machInst, rd, rn);
188910037SARM gem5 Developers                          case 0x7: //FCVTZS Xd = convertToIntExactTowardZero(Sn)
189010037SARM gem5 Developers                            return new FcvtFpSIntXSZ(machInst, rd, rn);
189110037SARM gem5 Developers                          case 0x8: //FCVTNS Wd = convertToIntExactTiesToEven(Dn)
189210037SARM gem5 Developers                            return new FcvtFpSIntWDN(machInst, rd, rn);
189310037SARM gem5 Developers                          case 0x9: //FCVTPS Wd = convertToIntExactTowardPlusInf(Dn)
189410037SARM gem5 Developers                            return new FcvtFpSIntWDP(machInst, rd, rn);
189510037SARM gem5 Developers                          case 0xA: //FCVTMS Wd = convertToIntExactTowardMinusInf(Dn)
189610037SARM gem5 Developers                            return new FcvtFpSIntWDM(machInst, rd, rn);
189710037SARM gem5 Developers                          case 0xB: //FCVTZS Wd = convertToIntExactTowardZero(Dn)
189810037SARM gem5 Developers                            return new FcvtFpSIntWDZ(machInst, rd, rn);
189910037SARM gem5 Developers                          case 0xC: //FCVTNS Xd = convertToIntExactTiesToEven(Dn)
190010037SARM gem5 Developers                            return new FcvtFpSIntXDN(machInst, rd, rn);
190110037SARM gem5 Developers                          case 0xD: //FCVTPS Xd = convertToIntExactTowardPlusInf(Dn)
190210037SARM gem5 Developers                            return new FcvtFpSIntXDP(machInst, rd, rn);
190310037SARM gem5 Developers                          case 0xE: //FCVTMS Xd = convertToIntExactTowardMinusInf(Dn)
190410037SARM gem5 Developers                            return new FcvtFpSIntXDM(machInst, rd, rn);
190510037SARM gem5 Developers                          case 0xF: //FCVTZS Xd = convertToIntExactTowardZero(Dn)
190610037SARM gem5 Developers                            return new FcvtFpSIntXDZ(machInst, rd, rn);
190710037SARM gem5 Developers                          default:
190810037SARM gem5 Developers                            return new Unknown64(machInst);
190910037SARM gem5 Developers                        }
191010037SARM gem5 Developers                      case 0x1:
191110037SARM gem5 Developers                        switch ((switchVal2 << 2) | rmode) {
191210037SARM gem5 Developers                          case 0x0: //FCVTNU Wd = convertToIntExactTiesToEven(Sn)
191310037SARM gem5 Developers                            return new FcvtFpUIntWSN(machInst, rd, rn);
191410037SARM gem5 Developers                          case 0x1: //FCVTPU Wd = convertToIntExactTowardPlusInf(Sn)
191510037SARM gem5 Developers                            return new FcvtFpUIntWSP(machInst, rd, rn);
191610037SARM gem5 Developers                          case 0x2: //FCVTMU Wd = convertToIntExactTowardMinusInf(Sn)
191710037SARM gem5 Developers                            return new FcvtFpUIntWSM(machInst, rd, rn);
191810037SARM gem5 Developers                          case 0x3: //FCVTZU Wd = convertToIntExactTowardZero(Sn)
191910037SARM gem5 Developers                            return new FcvtFpUIntWSZ(machInst, rd, rn);
192010037SARM gem5 Developers                          case 0x4: //FCVTNU Xd = convertToIntExactTiesToEven(Sn)
192110037SARM gem5 Developers                            return new FcvtFpUIntXSN(machInst, rd, rn);
192210037SARM gem5 Developers                          case 0x5: //FCVTPU Xd = convertToIntExactTowardPlusInf(Sn)
192310037SARM gem5 Developers                            return new FcvtFpUIntXSP(machInst, rd, rn);
192410037SARM gem5 Developers                          case 0x6: //FCVTMU Xd = convertToIntExactTowardMinusInf(Sn)
192510037SARM gem5 Developers                            return new FcvtFpUIntXSM(machInst, rd, rn);
192610037SARM gem5 Developers                          case 0x7: //FCVTZU Xd = convertToIntExactTowardZero(Sn)
192710037SARM gem5 Developers                            return new FcvtFpUIntXSZ(machInst, rd, rn);
192810037SARM gem5 Developers                          case 0x8: //FCVTNU Wd = convertToIntExactTiesToEven(Dn)
192910037SARM gem5 Developers                            return new FcvtFpUIntWDN(machInst, rd, rn);
193010037SARM gem5 Developers                          case 0x9: //FCVTPU Wd = convertToIntExactTowardPlusInf(Dn)
193110037SARM gem5 Developers                            return new FcvtFpUIntWDP(machInst, rd, rn);
193210037SARM gem5 Developers                          case 0xA: //FCVTMU Wd = convertToIntExactTowardMinusInf(Dn)
193310037SARM gem5 Developers                            return new FcvtFpUIntWDM(machInst, rd, rn);
193410037SARM gem5 Developers                          case 0xB: //FCVTZU Wd = convertToIntExactTowardZero(Dn)
193510037SARM gem5 Developers                            return new FcvtFpUIntWDZ(machInst, rd, rn);
193610037SARM gem5 Developers                          case 0xC: //FCVTNU Xd = convertToIntExactTiesToEven(Dn)
193710037SARM gem5 Developers                            return new FcvtFpUIntXDN(machInst, rd, rn);
193810037SARM gem5 Developers                          case 0xD: //FCVTPU Xd = convertToIntExactTowardPlusInf(Dn)
193910037SARM gem5 Developers                            return new FcvtFpUIntXDP(machInst, rd, rn);
194010037SARM gem5 Developers                          case 0xE: //FCVTMU Xd = convertToIntExactTowardMinusInf(Dn)
194110037SARM gem5 Developers                            return new FcvtFpUIntXDM(machInst, rd, rn);
194210037SARM gem5 Developers                          case 0xF: //FCVTZU Xd = convertToIntExactTowardZero(Dn)
194310037SARM gem5 Developers                            return new FcvtFpUIntXDZ(machInst, rd, rn);
194410037SARM gem5 Developers                          default:
194510037SARM gem5 Developers                            return new Unknown64(machInst);
194610037SARM gem5 Developers                        }
194710037SARM gem5 Developers                      case 0x2:
194810037SARM gem5 Developers                        if (rmode != 0)
194910037SARM gem5 Developers                            return new Unknown64(machInst);
195010037SARM gem5 Developers                        switch (switchVal2) {
195110037SARM gem5 Developers                          case 0: // SCVTF Sd = convertFromInt(Wn)
195210037SARM gem5 Developers                            return new FcvtWSIntFpS(machInst, rd, rn);
195310037SARM gem5 Developers                          case 1: // SCVTF Sd = convertFromInt(Xn)
195410037SARM gem5 Developers                            return new FcvtXSIntFpS(machInst, rd, rn);
195510037SARM gem5 Developers                          case 2: // SCVTF Dd = convertFromInt(Wn)
195610037SARM gem5 Developers                            return new FcvtWSIntFpD(machInst, rd, rn);
195710037SARM gem5 Developers                          case 3: // SCVTF Dd = convertFromInt(Xn)
195810037SARM gem5 Developers                            return new FcvtXSIntFpD(machInst, rd, rn);
195910037SARM gem5 Developers                          default:
196010037SARM gem5 Developers                            return new Unknown64(machInst);
196110037SARM gem5 Developers                        }
196210037SARM gem5 Developers                      case 0x3:
196310037SARM gem5 Developers                        switch (switchVal2) {
196410037SARM gem5 Developers                          case 0: // UCVTF Sd = convertFromInt(Wn)
196510037SARM gem5 Developers                            return new FcvtWUIntFpS(machInst, rd, rn);
196610037SARM gem5 Developers                          case 1: // UCVTF Sd = convertFromInt(Xn)
196710037SARM gem5 Developers                            return new FcvtXUIntFpS(machInst, rd, rn);
196810037SARM gem5 Developers                          case 2: // UCVTF Dd = convertFromInt(Wn)
196910037SARM gem5 Developers                            return new FcvtWUIntFpD(machInst, rd, rn);
197010037SARM gem5 Developers                          case 3: // UCVTF Dd = convertFromInt(Xn)
197110037SARM gem5 Developers                            return new FcvtXUIntFpD(machInst, rd, rn);
197210037SARM gem5 Developers                          default:
197310037SARM gem5 Developers                            return new Unknown64(machInst);
197410037SARM gem5 Developers                        }
197510037SARM gem5 Developers                      case 0x4:
197610037SARM gem5 Developers                        if (rmode != 0)
197710037SARM gem5 Developers                            return new Unknown64(machInst);
197810037SARM gem5 Developers                        switch (switchVal2) {
197910037SARM gem5 Developers                          case 0: // FCVTAS Wd = convertToIntExactTiesToAway(Sn)
198010037SARM gem5 Developers                            return new FcvtFpSIntWSA(machInst, rd, rn);
198110037SARM gem5 Developers                          case 1: // FCVTAS Xd = convertToIntExactTiesToAway(Sn)
198210037SARM gem5 Developers                            return new FcvtFpSIntXSA(machInst, rd, rn);
198310037SARM gem5 Developers                          case 2: // FCVTAS Wd = convertToIntExactTiesToAway(Dn)
198410037SARM gem5 Developers                            return new FcvtFpSIntWDA(machInst, rd, rn);
198510037SARM gem5 Developers                          case 3: // FCVTAS Wd = convertToIntExactTiesToAway(Dn)
198610037SARM gem5 Developers                            return new FcvtFpSIntXDA(machInst, rd, rn);
198710037SARM gem5 Developers                          default:
198810037SARM gem5 Developers                            return new Unknown64(machInst);
198910037SARM gem5 Developers                        }
199010037SARM gem5 Developers                      case 0x5:
199110037SARM gem5 Developers                        switch (switchVal2) {
199210037SARM gem5 Developers                          case 0: // FCVTAU Wd = convertToIntExactTiesToAway(Sn)
199310037SARM gem5 Developers                            return new FcvtFpUIntWSA(machInst, rd, rn);
199410037SARM gem5 Developers                          case 1: // FCVTAU Xd = convertToIntExactTiesToAway(Sn)
199510037SARM gem5 Developers                            return new FcvtFpUIntXSA(machInst, rd, rn);
199610037SARM gem5 Developers                          case 2: // FCVTAU Wd = convertToIntExactTiesToAway(Dn)
199710037SARM gem5 Developers                            return new FcvtFpUIntWDA(machInst, rd, rn);
199810037SARM gem5 Developers                          case 3: // FCVTAU Xd = convertToIntExactTiesToAway(Dn)
199910037SARM gem5 Developers                            return new FcvtFpUIntXDA(machInst, rd, rn);
200010037SARM gem5 Developers                          default:
200110037SARM gem5 Developers                            return new Unknown64(machInst);
200210037SARM gem5 Developers                        }
200310037SARM gem5 Developers                      case 0x06:
200410037SARM gem5 Developers                        switch (switchVal2) {
200510037SARM gem5 Developers                          case 0: // FMOV Wd = Sn
200610037SARM gem5 Developers                            if (rmode != 0)
200710037SARM gem5 Developers                                return new Unknown64(machInst);
200810037SARM gem5 Developers                            return new FmovRegCoreW(machInst, rd, rn);
200910037SARM gem5 Developers                          case 3: // FMOV Xd = Dn
201010037SARM gem5 Developers                            if (rmode != 0)
201110037SARM gem5 Developers                                return new Unknown64(machInst);
201210037SARM gem5 Developers                            return new FmovRegCoreX(machInst, rd, rn);
201310037SARM gem5 Developers                          case 5: // FMOV Xd = Vn<127:64>
201410037SARM gem5 Developers                            if (rmode != 1)
201510037SARM gem5 Developers                                return new Unknown64(machInst);
201610037SARM gem5 Developers                            return new FmovURegCoreX(machInst, rd, rn);
201710037SARM gem5 Developers                          default:
201810037SARM gem5 Developers                            return new Unknown64(machInst);
201910037SARM gem5 Developers                        }
202010037SARM gem5 Developers                        break;
202110037SARM gem5 Developers                      case 0x07:
202210037SARM gem5 Developers                        switch (switchVal2) {
202310037SARM gem5 Developers                          case 0: // FMOV Sd = Wn
202410037SARM gem5 Developers                            if (rmode != 0)
202510037SARM gem5 Developers                                return new Unknown64(machInst);
202610037SARM gem5 Developers                            return new FmovCoreRegW(machInst, rd, rn);
202710037SARM gem5 Developers                          case 3: // FMOV Xd = Dn
202810037SARM gem5 Developers                            if (rmode != 0)
202910037SARM gem5 Developers                                return new Unknown64(machInst);
203010037SARM gem5 Developers                            return new FmovCoreRegX(machInst, rd, rn);
203110037SARM gem5 Developers                          case 5: // FMOV Xd = Vn<127:64>
203210037SARM gem5 Developers                            if (rmode != 1)
203310037SARM gem5 Developers                                return new Unknown64(machInst);
203410037SARM gem5 Developers                            return new FmovUCoreRegX(machInst, rd, rn);
203510037SARM gem5 Developers                          default:
203610037SARM gem5 Developers                            return new Unknown64(machInst);
203710037SARM gem5 Developers                        }
203810037SARM gem5 Developers                        break;
203910037SARM gem5 Developers                      default: // Warning! missing cases in switch statement above, that still need to be added
204010037SARM gem5 Developers                        return new Unknown64(machInst);
204110037SARM gem5 Developers                    }
204210037SARM gem5 Developers                }
204312597Schunchenhsu@google.com                M5_UNREACHABLE;
204410037SARM gem5 Developers              case 0x1:
204510037SARM gem5 Developers              {
204610037SARM gem5 Developers                if (bits(machInst, 31) ||
204710037SARM gem5 Developers                    bits(machInst, 29) ||
204810037SARM gem5 Developers                    bits(machInst, 23)) {
204910037SARM gem5 Developers                    return new Unknown64(machInst);
205010037SARM gem5 Developers                }
205110037SARM gem5 Developers                IntRegIndex rm = (IntRegIndex)(uint32_t) bits(machInst, 20, 16);
205210037SARM gem5 Developers                IntRegIndex rn = (IntRegIndex)(uint32_t) bits(machInst, 9, 5);
205310037SARM gem5 Developers                uint8_t    imm = (IntRegIndex)(uint32_t) bits(machInst, 3, 0);
205410037SARM gem5 Developers                ConditionCode cond =
205510037SARM gem5 Developers                    (ConditionCode)(uint8_t)(bits(machInst, 15, 12));
205610037SARM gem5 Developers                uint8_t switchVal = (bits(machInst, 4) << 0) |
205710037SARM gem5 Developers                                    (bits(machInst, 22) << 1);
205810037SARM gem5 Developers                // 31:23=000111100, 21=1, 11:10=01
205910037SARM gem5 Developers                switch (switchVal) {
206010037SARM gem5 Developers                  case 0x0:
206110037SARM gem5 Developers                    // FCCMP flags = if cond the compareQuiet(Sn,Sm) else #nzcv
206210037SARM gem5 Developers                    return new FCCmpRegS(machInst, rn, rm, cond, imm);
206310037SARM gem5 Developers                  case 0x1:
206410037SARM gem5 Developers                    // FCCMP flags = if cond then compareSignaling(Sn,Sm)
206510037SARM gem5 Developers                    //               else #nzcv
206610037SARM gem5 Developers                    return new FCCmpERegS(machInst, rn, rm, cond, imm);
206710037SARM gem5 Developers                  case 0x2:
206810037SARM gem5 Developers                    // FCCMP flags = if cond then compareQuiet(Dn,Dm) else #nzcv
206910037SARM gem5 Developers                    return new FCCmpRegD(machInst, rn, rm, cond, imm);
207010037SARM gem5 Developers                  case 0x3:
207110037SARM gem5 Developers                    // FCCMP flags = if cond then compareSignaling(Dn,Dm)
207210037SARM gem5 Developers                    //               else #nzcv
207310037SARM gem5 Developers                    return new FCCmpERegD(machInst, rn, rm, cond, imm);
207410037SARM gem5 Developers                  default:
207510037SARM gem5 Developers                    return new Unknown64(machInst);
207610037SARM gem5 Developers                }
207710037SARM gem5 Developers              }
207810037SARM gem5 Developers              case 0x2:
207910037SARM gem5 Developers              {
208010037SARM gem5 Developers                if (bits(machInst, 31) ||
208110037SARM gem5 Developers                        bits(machInst, 29) ||
208210037SARM gem5 Developers                        bits(machInst, 23)) {
208310037SARM gem5 Developers                    return new Unknown64(machInst);
208410037SARM gem5 Developers                }
208510037SARM gem5 Developers                IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst,  4,  0);
208610037SARM gem5 Developers                IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst,  9,  5);
208710037SARM gem5 Developers                IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 20, 16);
208810037SARM gem5 Developers                uint8_t switchVal = (bits(machInst, 15, 12) << 0) |
208910037SARM gem5 Developers                                    (bits(machInst, 22) << 4);
209010037SARM gem5 Developers                switch (switchVal) {
209110037SARM gem5 Developers                  case 0x00: // FMUL Sd = Sn * Sm
209210037SARM gem5 Developers                    return new FMulS(machInst, rd, rn, rm);
209310037SARM gem5 Developers                  case 0x10: // FMUL Dd = Dn * Dm
209410037SARM gem5 Developers                    return new FMulD(machInst, rd, rn, rm);
209510037SARM gem5 Developers                  case 0x01: // FDIV Sd = Sn / Sm
209610037SARM gem5 Developers                    return new FDivS(machInst, rd, rn, rm);
209710037SARM gem5 Developers                  case 0x11: // FDIV Dd = Dn / Dm
209810037SARM gem5 Developers                    return new FDivD(machInst, rd, rn, rm);
209910037SARM gem5 Developers                  case 0x02: // FADD Sd = Sn + Sm
210010037SARM gem5 Developers                    return new FAddS(machInst, rd, rn, rm);
210110037SARM gem5 Developers                  case 0x12: // FADD Dd = Dn + Dm
210210037SARM gem5 Developers                    return new FAddD(machInst, rd, rn, rm);
210310037SARM gem5 Developers                  case 0x03: // FSUB Sd = Sn - Sm
210410037SARM gem5 Developers                    return new FSubS(machInst, rd, rn, rm);
210510037SARM gem5 Developers                  case 0x13: // FSUB Dd = Dn - Dm
210610037SARM gem5 Developers                    return new FSubD(machInst, rd, rn, rm);
210710037SARM gem5 Developers                  case 0x04: // FMAX Sd = max(Sn, Sm)
210810037SARM gem5 Developers                    return new FMaxS(machInst, rd, rn, rm);
210910037SARM gem5 Developers                  case 0x14: // FMAX Dd = max(Dn, Dm)
211010037SARM gem5 Developers                    return new FMaxD(machInst, rd, rn, rm);
211110037SARM gem5 Developers                  case 0x05: // FMIN Sd = min(Sn, Sm)
211210037SARM gem5 Developers                    return new FMinS(machInst, rd, rn, rm);
211310037SARM gem5 Developers                  case 0x15: // FMIN Dd = min(Dn, Dm)
211410037SARM gem5 Developers                    return new FMinD(machInst, rd, rn, rm);
211510037SARM gem5 Developers                  case 0x06: // FMAXNM Sd = maxNum(Sn, Sm)
211610037SARM gem5 Developers                    return new FMaxNMS(machInst, rd, rn, rm);
211710037SARM gem5 Developers                  case 0x16: // FMAXNM Dd = maxNum(Dn, Dm)
211810037SARM gem5 Developers                    return new FMaxNMD(machInst, rd, rn, rm);
211910037SARM gem5 Developers                  case 0x07: // FMINNM Sd = minNum(Sn, Sm)
212010037SARM gem5 Developers                    return new FMinNMS(machInst, rd, rn, rm);
212110037SARM gem5 Developers                  case 0x17: // FMINNM Dd = minNum(Dn, Dm)
212210037SARM gem5 Developers                    return new FMinNMD(machInst, rd, rn, rm);
212310037SARM gem5 Developers                  case 0x08: // FNMUL Sd = -(Sn * Sm)
212410037SARM gem5 Developers                    return new FNMulS(machInst, rd, rn, rm);
212510037SARM gem5 Developers                  case 0x18: // FNMUL Dd = -(Dn * Dm)
212610037SARM gem5 Developers                    return new FNMulD(machInst, rd, rn, rm);
212710037SARM gem5 Developers                  default:
212810037SARM gem5 Developers                    return new Unknown64(machInst);
212910037SARM gem5 Developers                }
213010037SARM gem5 Developers              }
213110037SARM gem5 Developers              case 0x3:
213210037SARM gem5 Developers              {
213310037SARM gem5 Developers                if (bits(machInst, 31) || bits(machInst, 29))
213410037SARM gem5 Developers                    return new Unknown64(machInst);
213510037SARM gem5 Developers                uint8_t type = bits(machInst, 23, 22);
213610037SARM gem5 Developers                IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst,  4,  0);
213710037SARM gem5 Developers                IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst,  9,  5);
213810037SARM gem5 Developers                IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 20, 16);
213910037SARM gem5 Developers                ConditionCode cond =
214010037SARM gem5 Developers                    (ConditionCode)(uint8_t)(bits(machInst, 15, 12));
214110037SARM gem5 Developers                if (type == 0) // FCSEL Sd = if cond then Sn else Sm
214210037SARM gem5 Developers                    return new FCSelS(machInst, rd, rn, rm, cond);
214310037SARM gem5 Developers                else if (type == 1) // FCSEL Dd = if cond then Dn else Dm
214410037SARM gem5 Developers                    return new FCSelD(machInst, rd, rn, rm, cond);
214510037SARM gem5 Developers                else
214610037SARM gem5 Developers                    return new Unknown64(machInst);
214710037SARM gem5 Developers              }
214812595Ssiddhesh.poyarekar@gmail.com              default:
214912595Ssiddhesh.poyarekar@gmail.com                M5_UNREACHABLE;
215010037SARM gem5 Developers            }
215110037SARM gem5 Developers        }
215212597Schunchenhsu@google.com        M5_UNREACHABLE;
215310037SARM gem5 Developers    }
215410037SARM gem5 Developers}
215510037SARM gem5 Developers}};
215610037SARM gem5 Developers
215710037SARM gem5 Developersoutput decoder {{
215810037SARM gem5 Developersnamespace Aarch64
215910037SARM gem5 Developers{
216010037SARM gem5 Developers    StaticInstPtr
216110037SARM gem5 Developers    decodeAdvSIMDScalar(ExtMachInst machInst)
216210037SARM gem5 Developers    {
216310037SARM gem5 Developers        if (bits(machInst, 24) == 1) {
216410037SARM gem5 Developers            if (bits(machInst, 10) == 0) {
216510037SARM gem5 Developers                return decodeNeonScIndexedElem(machInst);
216610037SARM gem5 Developers            } else if (bits(machInst, 23) == 0) {
216710037SARM gem5 Developers                return decodeNeonScShiftByImm(machInst);
216810037SARM gem5 Developers            }
216910037SARM gem5 Developers        } else if (bits(machInst, 21) == 1) {
217010037SARM gem5 Developers            if (bits(machInst, 10) == 1) {
217110037SARM gem5 Developers                return decodeNeonSc3Same(machInst);
217210037SARM gem5 Developers            } else if (bits(machInst, 11) == 0) {
217310037SARM gem5 Developers                return decodeNeonSc3Diff(machInst);
217410037SARM gem5 Developers            } else if (bits(machInst, 20, 17) == 0x0) {
217510037SARM gem5 Developers                return decodeNeonSc2RegMisc(machInst);
217613170Sgiacomo.travaglini@arm.com            } else if (bits(machInst, 20, 17) == 0x4) {
217713170Sgiacomo.travaglini@arm.com                return decodeCryptoTwoRegSHA(machInst);
217810037SARM gem5 Developers            } else if (bits(machInst, 20, 17) == 0x8) {
217910037SARM gem5 Developers                return decodeNeonScPwise(machInst);
218010037SARM gem5 Developers            } else {
218110037SARM gem5 Developers                return new Unknown64(machInst);
218210037SARM gem5 Developers            }
218310037SARM gem5 Developers        } else if (bits(machInst, 23, 22) == 0 &&
218413170Sgiacomo.travaglini@arm.com                   bits(machInst, 15) == 0) {
218513170Sgiacomo.travaglini@arm.com            if (bits(machInst, 10) == 1) {
218613170Sgiacomo.travaglini@arm.com                return decodeNeonScCopy(machInst);
218713170Sgiacomo.travaglini@arm.com            } else {
218813170Sgiacomo.travaglini@arm.com                return decodeCryptoThreeRegSHA(machInst);
218913170Sgiacomo.travaglini@arm.com            }
219010037SARM gem5 Developers        } else {
219110037SARM gem5 Developers            return new Unknown64(machInst);
219210037SARM gem5 Developers        }
219310037SARM gem5 Developers        return new FailUnimplemented("Unhandled Case6", machInst);
219410037SARM gem5 Developers    }
219510037SARM gem5 Developers}
219610037SARM gem5 Developers}};
219710037SARM gem5 Developers
219810037SARM gem5 Developersoutput decoder {{
219910037SARM gem5 Developersnamespace Aarch64
220010037SARM gem5 Developers{
220111165SRekai.GonzalezAlberquilla@arm.com    template <typename DecoderFeatures>
220210037SARM gem5 Developers    StaticInstPtr
220310037SARM gem5 Developers    decodeFpAdvSIMD(ExtMachInst machInst)
220410037SARM gem5 Developers    {
220510037SARM gem5 Developers
220610037SARM gem5 Developers        if (bits(machInst, 28) == 0) {
220710037SARM gem5 Developers            if (bits(machInst, 31) == 0) {
220811165SRekai.GonzalezAlberquilla@arm.com                return decodeAdvSIMD<DecoderFeatures>(machInst);
220910037SARM gem5 Developers            } else {
221010037SARM gem5 Developers                return new Unknown64(machInst);
221110037SARM gem5 Developers            }
221210037SARM gem5 Developers        } else if (bits(machInst, 30) == 0) {
221310037SARM gem5 Developers            return decodeFp(machInst);
221410037SARM gem5 Developers        } else if (bits(machInst, 31) == 0) {
221510037SARM gem5 Developers            return decodeAdvSIMDScalar(machInst);
221610037SARM gem5 Developers        } else {
221710037SARM gem5 Developers            return new Unknown64(machInst);
221810037SARM gem5 Developers        }
221910037SARM gem5 Developers    }
222010037SARM gem5 Developers}
222110037SARM gem5 Developers}};
222210037SARM gem5 Developers
222311165SRekai.GonzalezAlberquilla@arm.comlet {{
222411165SRekai.GonzalezAlberquilla@arm.com    decoder_output ='''
222511165SRekai.GonzalezAlberquilla@arm.comnamespace Aarch64
222611165SRekai.GonzalezAlberquilla@arm.com{'''
222711165SRekai.GonzalezAlberquilla@arm.com    for decoderFlavour, type_dict in decoders.iteritems():
222811165SRekai.GonzalezAlberquilla@arm.com        decoder_output +='''
222911165SRekai.GonzalezAlberquilla@arm.comtemplate StaticInstPtr decodeFpAdvSIMD<%(df)sDecoder>(ExtMachInst machInst);
223011165SRekai.GonzalezAlberquilla@arm.com''' % { "df" : decoderFlavour }
223111165SRekai.GonzalezAlberquilla@arm.com    decoder_output +='''
223211165SRekai.GonzalezAlberquilla@arm.com}'''
223311165SRekai.GonzalezAlberquilla@arm.com}};
223411165SRekai.GonzalezAlberquilla@arm.com
223510037SARM gem5 Developersoutput decoder {{
223610037SARM gem5 Developersnamespace Aarch64
223710037SARM gem5 Developers{
223810037SARM gem5 Developers    StaticInstPtr
223910037SARM gem5 Developers    decodeGem5Ops(ExtMachInst machInst)
224010037SARM gem5 Developers    {
224110037SARM gem5 Developers        const uint32_t m5func = bits(machInst, 23, 16);
224210037SARM gem5 Developers        switch (m5func) {
224312159Sandreas.sandberg@arm.com          case M5OP_ARM: return new Arm(machInst);
224412159Sandreas.sandberg@arm.com          case M5OP_QUIESCE: return new Quiesce(machInst);
224512159Sandreas.sandberg@arm.com          case M5OP_QUIESCE_NS: return new QuiesceNs64(machInst);
224612159Sandreas.sandberg@arm.com          case M5OP_QUIESCE_CYCLE: return new QuiesceCycles64(machInst);
224712159Sandreas.sandberg@arm.com          case M5OP_QUIESCE_TIME: return new QuiesceTime64(machInst);
224812159Sandreas.sandberg@arm.com          case M5OP_RPNS: return new Rpns64(machInst);
224912159Sandreas.sandberg@arm.com          case M5OP_WAKE_CPU: return new WakeCPU64(machInst);
225012159Sandreas.sandberg@arm.com          case M5OP_DEPRECATED1: return new Deprecated_ivlb(machInst);
225112159Sandreas.sandberg@arm.com          case M5OP_DEPRECATED2: return new Deprecated_ivle(machInst);
225212159Sandreas.sandberg@arm.com          case M5OP_DEPRECATED3: return new Deprecated_exit (machInst);
225312159Sandreas.sandberg@arm.com          case M5OP_EXIT: return new M5exit64(machInst);
225412159Sandreas.sandberg@arm.com          case M5OP_FAIL: return new M5fail64(machInst);
225512159Sandreas.sandberg@arm.com          case M5OP_LOAD_SYMBOL: return new Loadsymbol(machInst);
225612159Sandreas.sandberg@arm.com          case M5OP_INIT_PARAM: return new Initparam64(machInst);
225712159Sandreas.sandberg@arm.com          case M5OP_RESET_STATS: return new Resetstats64(machInst);
225812159Sandreas.sandberg@arm.com          case M5OP_DUMP_STATS: return new Dumpstats64(machInst);
225912159Sandreas.sandberg@arm.com          case M5OP_DUMP_RESET_STATS: return new Dumpresetstats64(machInst);
226012159Sandreas.sandberg@arm.com          case M5OP_CHECKPOINT: return new M5checkpoint64(machInst);
226112159Sandreas.sandberg@arm.com          case M5OP_WRITE_FILE: return new M5writefile64(machInst);
226212159Sandreas.sandberg@arm.com          case M5OP_READ_FILE: return new M5readfile64(machInst);
226312159Sandreas.sandberg@arm.com          case M5OP_DEBUG_BREAK: return new M5break(machInst);
226412159Sandreas.sandberg@arm.com          case M5OP_SWITCH_CPU: return new M5switchcpu(machInst);
226512159Sandreas.sandberg@arm.com          case M5OP_ADD_SYMBOL: return new M5addsymbol64(machInst);
226612159Sandreas.sandberg@arm.com          case M5OP_PANIC: return new M5panic(machInst);
226712159Sandreas.sandberg@arm.com          case M5OP_WORK_BEGIN: return new M5workbegin64(machInst);
226812159Sandreas.sandberg@arm.com          case M5OP_WORK_END: return new M5workend64(machInst);
226910037SARM gem5 Developers          default: return new Unknown64(machInst);
227010037SARM gem5 Developers        }
227110037SARM gem5 Developers    }
227210037SARM gem5 Developers}
227310037SARM gem5 Developers}};
227410037SARM gem5 Developers
227510037SARM gem5 Developersdef format Aarch64() {{
227610037SARM gem5 Developers    decode_block = '''
227710037SARM gem5 Developers    {
227810037SARM gem5 Developers        using namespace Aarch64;
227910037SARM gem5 Developers        if (bits(machInst, 27) == 0x0) {
228013759Sgiacomo.gabrielli@arm.com            if (bits(machInst, 28) == 0x0) {
228113759Sgiacomo.gabrielli@arm.com                if (bits(machInst, 26, 25) != 0x2) {
228213759Sgiacomo.gabrielli@arm.com                    return new Unknown64(machInst);
228313759Sgiacomo.gabrielli@arm.com                }
228413759Sgiacomo.gabrielli@arm.com                if (bits(machInst, 31) == 0x0) {
228513759Sgiacomo.gabrielli@arm.com                    switch (bits(machInst, 30, 29)) {
228613759Sgiacomo.gabrielli@arm.com                      case 0x0:
228713759Sgiacomo.gabrielli@arm.com                      case 0x1:
228813759Sgiacomo.gabrielli@arm.com                      case 0x2:
228913759Sgiacomo.gabrielli@arm.com                        return decodeSveInt(machInst);
229013759Sgiacomo.gabrielli@arm.com                      case 0x3:
229113759Sgiacomo.gabrielli@arm.com                        return decodeSveFp(machInst);
229213759Sgiacomo.gabrielli@arm.com                    }
229313759Sgiacomo.gabrielli@arm.com                } else {
229413759Sgiacomo.gabrielli@arm.com                    return decodeSveMem(machInst);
229513759Sgiacomo.gabrielli@arm.com                }
229613759Sgiacomo.gabrielli@arm.com            } else if (bits(machInst, 26) == 0)
229710037SARM gem5 Developers                // bit 28:26=100
229810037SARM gem5 Developers                return decodeDataProcImm(machInst);
229910037SARM gem5 Developers            else
230010037SARM gem5 Developers                // bit 28:26=101
230110037SARM gem5 Developers                return decodeBranchExcSys(machInst);
230210037SARM gem5 Developers        } else if (bits(machInst, 25) == 0) {
230310037SARM gem5 Developers            // bit 27=1, 25=0
230410037SARM gem5 Developers            return decodeLoadsStores(machInst);
230510037SARM gem5 Developers        } else if (bits(machInst, 26) == 0) {
230610037SARM gem5 Developers            // bit 27:25=101
230710037SARM gem5 Developers            return decodeDataProcReg(machInst);
230810037SARM gem5 Developers        } else if (bits(machInst, 24) == 1 &&
230910037SARM gem5 Developers                   bits(machInst, 31, 28) == 0xF) {
231010037SARM gem5 Developers            return decodeGem5Ops(machInst);
231110037SARM gem5 Developers        } else {
231210037SARM gem5 Developers            // bit 27:25=111
231311165SRekai.GonzalezAlberquilla@arm.com            switch(decoderFlavour){
231411165SRekai.GonzalezAlberquilla@arm.com            default:
231511165SRekai.GonzalezAlberquilla@arm.com                return decodeFpAdvSIMD<GenericDecoder>(machInst);
231611165SRekai.GonzalezAlberquilla@arm.com            }
231710037SARM gem5 Developers        }
231810037SARM gem5 Developers    }
231910037SARM gem5 Developers    '''
232010037SARM gem5 Developers}};
2321