aarch64.isa revision 14174
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) { 39514128Sgiacomo.travaglini@arm.com case 0x4: 39614128Sgiacomo.travaglini@arm.com // PAN 39714128Sgiacomo.travaglini@arm.com return new MsrImm64( 39814128Sgiacomo.travaglini@arm.com machInst, MISCREG_PAN, crm); 39910037SARM gem5 Developers case 0x5: 40010037SARM gem5 Developers // SP 40114127Sgiacomo.travaglini@arm.com return new MsrImm64( 40214127Sgiacomo.travaglini@arm.com machInst, MISCREG_SPSEL, crm); 40310037SARM gem5 Developers case 0x1e: 40410037SARM gem5 Developers // DAIFSet 40514127Sgiacomo.travaglini@arm.com return new MsrImmDAIFSet64( 40614127Sgiacomo.travaglini@arm.com machInst, MISCREG_DAIF, crm); 40710037SARM gem5 Developers case 0x1f: 40810037SARM gem5 Developers // DAIFClr 40914127Sgiacomo.travaglini@arm.com return new MsrImmDAIFClr64( 41014127Sgiacomo.travaglini@arm.com machInst, MISCREG_DAIF, crm); 41110037SARM gem5 Developers default: 41210037SARM gem5 Developers return new Unknown64(machInst); 41310037SARM gem5 Developers } 41410037SARM gem5 Developers } else { 41510037SARM gem5 Developers return new Unknown64(machInst); 41610037SARM gem5 Developers } 41710037SARM gem5 Developers break; 41810037SARM gem5 Developers case 0x1: 41910037SARM gem5 Developers case 0x2: 42010037SARM gem5 Developers case 0x3: 42110037SARM gem5 Developers { 42210037SARM gem5 Developers // bit 31:22=1101010100, 20:19=11 42310037SARM gem5 Developers bool read = l; 42410037SARM gem5 Developers MiscRegIndex miscReg = 42510037SARM gem5 Developers decodeAArch64SysReg(op0, op1, crn, crm, op2); 42610037SARM gem5 Developers if (read) { 42710037SARM gem5 Developers if ((miscReg == MISCREG_DC_CIVAC_Xt) || 42810037SARM gem5 Developers (miscReg == MISCREG_DC_CVAC_Xt) || 42912359Snikos.nikoleris@arm.com (miscReg == MISCREG_DC_IVAC_Xt) || 43010037SARM gem5 Developers (miscReg == MISCREG_DC_ZVA_Xt)) { 43110037SARM gem5 Developers return new Unknown64(machInst); 43210037SARM gem5 Developers } 43310037SARM gem5 Developers } 43410037SARM gem5 Developers // Check for invalid registers 43510037SARM gem5 Developers if (miscReg == MISCREG_UNKNOWN) { 43612673Sgiacomo.travaglini@arm.com auto full_mnemonic = 43712673Sgiacomo.travaglini@arm.com csprintf("%s op0:%d op1:%d crn:%d crm:%d op2:%d", 43812673Sgiacomo.travaglini@arm.com read ? "mrs" : "msr", 43912673Sgiacomo.travaglini@arm.com op0, op1, crn, crm, op2); 44012673Sgiacomo.travaglini@arm.com 44112673Sgiacomo.travaglini@arm.com return new FailUnimplemented(read ? "mrs" : "msr", 44212673Sgiacomo.travaglini@arm.com machInst, full_mnemonic); 44312673Sgiacomo.travaglini@arm.com 44412714Sgiacomo.travaglini@arm.com } else if (miscReg == MISCREG_IMPDEF_UNIMPL) { 44512714Sgiacomo.travaglini@arm.com auto full_mnemonic = 44612714Sgiacomo.travaglini@arm.com csprintf("%s op0:%d op1:%d crn:%d crm:%d op2:%d", 44712714Sgiacomo.travaglini@arm.com read ? "mrs" : "msr", 44812714Sgiacomo.travaglini@arm.com op0, op1, crn, crm, op2); 44912714Sgiacomo.travaglini@arm.com 45013365Sgiacomo.travaglini@arm.com uint32_t iss = msrMrs64IssBuild( 45113365Sgiacomo.travaglini@arm.com read, op0, op1, crn, crm, op2, rt); 45213365Sgiacomo.travaglini@arm.com 45313365Sgiacomo.travaglini@arm.com return new MiscRegImplDefined64( 45413365Sgiacomo.travaglini@arm.com read ? "mrs" : "msr", 45513365Sgiacomo.travaglini@arm.com machInst, miscReg, read, iss, full_mnemonic, 45613365Sgiacomo.travaglini@arm.com miscRegInfo[miscReg][MISCREG_WARN_NOT_FAIL]); 45712714Sgiacomo.travaglini@arm.com 45810037SARM gem5 Developers } else if (miscRegInfo[miscReg][MISCREG_IMPLEMENTED]) { 45910037SARM gem5 Developers if (miscReg == MISCREG_NZCV) { 46010037SARM gem5 Developers if (read) 46110037SARM gem5 Developers return new MrsNZCV64(machInst, rt, (IntRegIndex) miscReg); 46210037SARM gem5 Developers else 46310037SARM gem5 Developers return new MsrNZCV64(machInst, (IntRegIndex) miscReg, rt); 46410037SARM gem5 Developers } 46510037SARM gem5 Developers uint32_t iss = msrMrs64IssBuild(read, op0, op1, crn, crm, op2, rt); 46610506SAli.Saidi@ARM.com if (read) { 46712280Sgiacomo.travaglini@arm.com StaticInstPtr si = new Mrs64(machInst, rt, miscReg, iss); 46810506SAli.Saidi@ARM.com if (miscRegInfo[miscReg][MISCREG_UNVERIFIABLE]) 46910506SAli.Saidi@ARM.com si->setFlag(StaticInst::IsUnverifiable); 47010506SAli.Saidi@ARM.com return si; 47112280Sgiacomo.travaglini@arm.com } else { 47212359Snikos.nikoleris@arm.com switch (miscReg) { 47312359Snikos.nikoleris@arm.com case MISCREG_DC_ZVA_Xt: 47412359Snikos.nikoleris@arm.com return new Dczva(machInst, rt, miscReg, iss); 47512359Snikos.nikoleris@arm.com case MISCREG_DC_CVAU_Xt: 47612359Snikos.nikoleris@arm.com return new Dccvau(machInst, rt, miscReg, iss); 47712359Snikos.nikoleris@arm.com case MISCREG_DC_CVAC_Xt: 47812359Snikos.nikoleris@arm.com return new Dccvac(machInst, rt, miscReg, iss); 47912359Snikos.nikoleris@arm.com case MISCREG_DC_CIVAC_Xt: 48012359Snikos.nikoleris@arm.com return new Dccivac(machInst, rt, miscReg, iss); 48112359Snikos.nikoleris@arm.com case MISCREG_DC_IVAC_Xt: 48212359Snikos.nikoleris@arm.com return new Dcivac(machInst, rt, miscReg, iss); 48312359Snikos.nikoleris@arm.com default: 48412359Snikos.nikoleris@arm.com return new Msr64(machInst, miscReg, rt, iss); 48512359Snikos.nikoleris@arm.com } 48612280Sgiacomo.travaglini@arm.com } 48710037SARM gem5 Developers } else if (miscRegInfo[miscReg][MISCREG_WARN_NOT_FAIL]) { 48810037SARM gem5 Developers std::string full_mnem = csprintf("%s %s", 48910037SARM gem5 Developers read ? "mrs" : "msr", miscRegName[miscReg]); 49010037SARM gem5 Developers return new WarnUnimplemented(read ? "mrs" : "msr", 49110037SARM gem5 Developers machInst, full_mnem); 49210037SARM gem5 Developers } else { 49310173SMitchell.Hayenga@ARM.com return new FailUnimplemented(read ? "mrs" : "msr", 49410173SMitchell.Hayenga@ARM.com machInst, 49510173SMitchell.Hayenga@ARM.com csprintf("%s %s", 49610173SMitchell.Hayenga@ARM.com read ? "mrs" : "msr", 49710173SMitchell.Hayenga@ARM.com miscRegName[miscReg])); 49810037SARM gem5 Developers } 49910037SARM gem5 Developers } 50010037SARM gem5 Developers break; 50112595Ssiddhesh.poyarekar@gmail.com default: 50212595Ssiddhesh.poyarekar@gmail.com M5_UNREACHABLE; 50310037SARM gem5 Developers } 50410037SARM gem5 Developers } else if (bits(machInst, 25) == 0x1) { 50510037SARM gem5 Developers uint8_t opc = bits(machInst, 24, 21); 50610037SARM gem5 Developers uint8_t op2 = bits(machInst, 20, 16); 50710037SARM gem5 Developers uint8_t op3 = bits(machInst, 15, 10); 50810037SARM gem5 Developers IntRegIndex rn = (IntRegIndex)(uint8_t)bits(machInst, 9, 5); 50910037SARM gem5 Developers uint8_t op4 = bits(machInst, 4, 0); 51010037SARM gem5 Developers if (op2 != 0x1f || op3 != 0x0 || op4 != 0x0) 51110037SARM gem5 Developers return new Unknown64(machInst); 51210037SARM gem5 Developers switch (opc) { 51310037SARM gem5 Developers case 0x0: 51410037SARM gem5 Developers return new Br64(machInst, rn); 51510037SARM gem5 Developers case 0x1: 51610037SARM gem5 Developers return new Blr64(machInst, rn); 51710037SARM gem5 Developers case 0x2: 51810037SARM gem5 Developers return new Ret64(machInst, rn); 51910037SARM gem5 Developers case 0x4: 52010037SARM gem5 Developers if (rn != 0x1f) 52110037SARM gem5 Developers return new Unknown64(machInst); 52210037SARM gem5 Developers return new Eret64(machInst); 52310037SARM gem5 Developers case 0x5: 52410037SARM gem5 Developers if (rn != 0x1f) 52510037SARM gem5 Developers return new Unknown64(machInst); 52610037SARM gem5 Developers return new FailUnimplemented("dret", machInst); 52712595Ssiddhesh.poyarekar@gmail.com default: 52812595Ssiddhesh.poyarekar@gmail.com return new Unknown64(machInst); 52910037SARM gem5 Developers } 53010037SARM gem5 Developers } 53112595Ssiddhesh.poyarekar@gmail.com M5_FALLTHROUGH; 53210037SARM gem5 Developers default: 53310037SARM gem5 Developers return new Unknown64(machInst); 53410037SARM gem5 Developers } 53510037SARM gem5 Developers return new FailUnimplemented("Unhandled Case7", machInst); 53610037SARM gem5 Developers } 53710037SARM gem5 Developers} 53810037SARM gem5 Developers}}; 53910037SARM gem5 Developers 54010037SARM gem5 Developersoutput decoder {{ 54110037SARM gem5 Developersnamespace Aarch64 54210037SARM gem5 Developers{ 54310037SARM gem5 Developers StaticInstPtr 54414157Sjordi.vaquero@metempsy.com decodeAtomicArithOp(ExtMachInst machInst) 54514157Sjordi.vaquero@metempsy.com { 54614157Sjordi.vaquero@metempsy.com uint8_t opc = bits(machInst, 14, 12); 54714157Sjordi.vaquero@metempsy.com uint8_t o3 = bits(machInst, 15); 54814157Sjordi.vaquero@metempsy.com uint8_t size_ar = bits(machInst, 23, 22)<<0 | bits(machInst, 31, 30)<<2; 54914157Sjordi.vaquero@metempsy.com IntRegIndex rt = (IntRegIndex)(uint8_t)bits(machInst, 4, 0); 55014157Sjordi.vaquero@metempsy.com IntRegIndex rn = (IntRegIndex)(uint8_t)bits(machInst, 9, 5); 55114157Sjordi.vaquero@metempsy.com IntRegIndex rnsp = makeSP(rn); 55214157Sjordi.vaquero@metempsy.com IntRegIndex rs = (IntRegIndex)(uint8_t)bits(machInst, 20, 16); 55314157Sjordi.vaquero@metempsy.com uint8_t A_rt = bits(machInst, 4, 0)<<0 | bits(machInst, 23)<<5; 55414157Sjordi.vaquero@metempsy.com 55514157Sjordi.vaquero@metempsy.com switch(opc) { 55614157Sjordi.vaquero@metempsy.com case 0x0: 55714157Sjordi.vaquero@metempsy.com switch(size_ar){ 55814157Sjordi.vaquero@metempsy.com case 0x0: 55914157Sjordi.vaquero@metempsy.com if (o3 == 1) 56014157Sjordi.vaquero@metempsy.com return new SWPB(machInst, rt, rnsp, rs); 56114157Sjordi.vaquero@metempsy.com else if (A_rt == 0x1f) 56214157Sjordi.vaquero@metempsy.com return new STADDB(machInst, rt, rnsp, rs); 56314157Sjordi.vaquero@metempsy.com else 56414157Sjordi.vaquero@metempsy.com return new LDADDB(machInst, rt, rnsp, rs); 56514157Sjordi.vaquero@metempsy.com case 0x1 : 56614157Sjordi.vaquero@metempsy.com if (o3 == 1) 56714157Sjordi.vaquero@metempsy.com return new SWPLB(machInst, rt, rnsp, rs); 56814157Sjordi.vaquero@metempsy.com else if (A_rt == 0x1f) 56914157Sjordi.vaquero@metempsy.com return new STADDLB(machInst, rt, rnsp, rs); 57014157Sjordi.vaquero@metempsy.com else 57114157Sjordi.vaquero@metempsy.com return new LDADDLB(machInst, rt, rnsp, rs); 57214157Sjordi.vaquero@metempsy.com case 0x2: 57314157Sjordi.vaquero@metempsy.com if (o3 == 1) 57414157Sjordi.vaquero@metempsy.com return new SWPAB(machInst, rt, rnsp, rs); 57514157Sjordi.vaquero@metempsy.com else 57614157Sjordi.vaquero@metempsy.com return new LDADDAB(machInst, rt, rnsp, rs); 57714157Sjordi.vaquero@metempsy.com case 0x3: 57814157Sjordi.vaquero@metempsy.com if (o3 == 1) 57914157Sjordi.vaquero@metempsy.com return new SWPLAB(machInst, rt, rnsp, rs); 58014157Sjordi.vaquero@metempsy.com else 58114157Sjordi.vaquero@metempsy.com return new LDADDLAB(machInst, rt, rnsp, rs); 58214157Sjordi.vaquero@metempsy.com case 0x4: 58314157Sjordi.vaquero@metempsy.com if (o3 == 1) 58414157Sjordi.vaquero@metempsy.com return new SWPH(machInst, rt, rnsp, rs); 58514157Sjordi.vaquero@metempsy.com else if (A_rt == 0x1f) 58614157Sjordi.vaquero@metempsy.com return new STADDH(machInst, rt, rnsp, rs); 58714157Sjordi.vaquero@metempsy.com else 58814157Sjordi.vaquero@metempsy.com return new LDADDH(machInst, rt, rnsp, rs); 58914157Sjordi.vaquero@metempsy.com case 0x5 : 59014157Sjordi.vaquero@metempsy.com if (o3 == 1) 59114157Sjordi.vaquero@metempsy.com return new SWPLH(machInst, rt, rnsp, rs); 59214157Sjordi.vaquero@metempsy.com else if (A_rt == 0x1f) 59314157Sjordi.vaquero@metempsy.com return new STADDLH(machInst, rt, rnsp, rs); 59414157Sjordi.vaquero@metempsy.com else 59514157Sjordi.vaquero@metempsy.com return new LDADDLH(machInst, rt, rnsp, rs); 59614157Sjordi.vaquero@metempsy.com case 0x6: 59714157Sjordi.vaquero@metempsy.com if (o3 == 1) 59814157Sjordi.vaquero@metempsy.com return new SWPAH(machInst, rt, rnsp, rs); 59914157Sjordi.vaquero@metempsy.com else 60014157Sjordi.vaquero@metempsy.com return new LDADDAH(machInst, rt, rnsp, rs); 60114157Sjordi.vaquero@metempsy.com case 0x7: 60214157Sjordi.vaquero@metempsy.com if (o3 == 1) 60314157Sjordi.vaquero@metempsy.com return new SWPLAH(machInst, rt, rnsp, rs); 60414157Sjordi.vaquero@metempsy.com else 60514157Sjordi.vaquero@metempsy.com return new LDADDLAH(machInst, rt, rnsp, rs); 60614157Sjordi.vaquero@metempsy.com case 0x8: 60714157Sjordi.vaquero@metempsy.com if (o3 == 1) 60814157Sjordi.vaquero@metempsy.com return new SWP(machInst, rt, rnsp, rs); 60914157Sjordi.vaquero@metempsy.com else if (A_rt == 0x1f) 61014157Sjordi.vaquero@metempsy.com return new STADD(machInst, rt, rnsp, rs); 61114157Sjordi.vaquero@metempsy.com else 61214157Sjordi.vaquero@metempsy.com return new LDADD(machInst, rt, rnsp, rs); 61314157Sjordi.vaquero@metempsy.com case 0x9 : 61414157Sjordi.vaquero@metempsy.com if (o3 == 1) 61514157Sjordi.vaquero@metempsy.com return new SWPL(machInst, rt, rnsp, rs); 61614157Sjordi.vaquero@metempsy.com else if (A_rt == 0x1f) 61714157Sjordi.vaquero@metempsy.com return new STADDL(machInst, rt, rnsp, rs); 61814157Sjordi.vaquero@metempsy.com else 61914157Sjordi.vaquero@metempsy.com return new LDADDL(machInst, rt, rnsp, rs); 62014157Sjordi.vaquero@metempsy.com case 0xa: 62114157Sjordi.vaquero@metempsy.com if (o3 == 1) 62214157Sjordi.vaquero@metempsy.com return new SWPA(machInst, rt, rnsp, rs); 62314157Sjordi.vaquero@metempsy.com else 62414157Sjordi.vaquero@metempsy.com return new LDADDA(machInst, rt, rnsp, rs); 62514157Sjordi.vaquero@metempsy.com case 0xb: 62614157Sjordi.vaquero@metempsy.com if (o3 == 1) 62714157Sjordi.vaquero@metempsy.com return new SWPLA(machInst, rt, rnsp, rs); 62814157Sjordi.vaquero@metempsy.com else 62914157Sjordi.vaquero@metempsy.com return new LDADDLA(machInst, rt, rnsp, rs); 63014157Sjordi.vaquero@metempsy.com case 0xc: 63114157Sjordi.vaquero@metempsy.com if (o3 == 1) 63214157Sjordi.vaquero@metempsy.com return new SWP64(machInst, rt, rnsp, rs); 63314157Sjordi.vaquero@metempsy.com 63414157Sjordi.vaquero@metempsy.com else if (A_rt == 0x1f) 63514157Sjordi.vaquero@metempsy.com return new STADD64(machInst, rt, rnsp, rs); 63614157Sjordi.vaquero@metempsy.com else 63714157Sjordi.vaquero@metempsy.com return new LDADD64(machInst, rt, rnsp, rs); 63814157Sjordi.vaquero@metempsy.com case 0xd : 63914157Sjordi.vaquero@metempsy.com if (o3 == 1) 64014157Sjordi.vaquero@metempsy.com return new SWPL64(machInst, rt, rnsp, rs); 64114157Sjordi.vaquero@metempsy.com else if (A_rt == 0x1f) 64214157Sjordi.vaquero@metempsy.com return new STADDL64(machInst, rt, rnsp, rs); 64314157Sjordi.vaquero@metempsy.com else 64414157Sjordi.vaquero@metempsy.com return new LDADDL64(machInst, rt, rnsp, rs); 64514157Sjordi.vaquero@metempsy.com case 0xe: 64614157Sjordi.vaquero@metempsy.com if (o3 == 1) 64714157Sjordi.vaquero@metempsy.com return new SWPA64(machInst, rt, rnsp, rs); 64814157Sjordi.vaquero@metempsy.com else 64914157Sjordi.vaquero@metempsy.com return new LDADDA64(machInst, rt, rnsp, rs); 65014157Sjordi.vaquero@metempsy.com case 0xf: 65114157Sjordi.vaquero@metempsy.com if (o3 == 1) 65214157Sjordi.vaquero@metempsy.com return new SWPLA64(machInst, rt, rnsp, rs); 65314157Sjordi.vaquero@metempsy.com else 65414157Sjordi.vaquero@metempsy.com return new LDADDLA64(machInst, rt, rnsp, rs); 65514174Schunchenhsu@google.com default: 65614174Schunchenhsu@google.com M5_UNREACHABLE; 65714157Sjordi.vaquero@metempsy.com } 65814157Sjordi.vaquero@metempsy.com case 0x1: 65914157Sjordi.vaquero@metempsy.com switch(size_ar){ 66014157Sjordi.vaquero@metempsy.com case 0x0: 66114157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 66214157Sjordi.vaquero@metempsy.com return new STCLRB(machInst, rt, rnsp, rs); 66314157Sjordi.vaquero@metempsy.com else 66414157Sjordi.vaquero@metempsy.com return new LDCLRB(machInst, rt, rnsp, rs); 66514157Sjordi.vaquero@metempsy.com case 0x1 : 66614157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 66714157Sjordi.vaquero@metempsy.com return new STCLRLB(machInst, rt, rnsp, rs); 66814157Sjordi.vaquero@metempsy.com else 66914157Sjordi.vaquero@metempsy.com return new LDCLRLB(machInst, rt, rnsp, rs); 67014157Sjordi.vaquero@metempsy.com case 0x2: 67114157Sjordi.vaquero@metempsy.com return new LDCLRAB(machInst, rt, rnsp, rs); 67214157Sjordi.vaquero@metempsy.com case 0x3: 67314157Sjordi.vaquero@metempsy.com return new LDCLRLAB(machInst, rt, rnsp, rs); 67414157Sjordi.vaquero@metempsy.com case 0x4: 67514157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 67614157Sjordi.vaquero@metempsy.com return new STCLRH(machInst, rt, rnsp, rs); 67714157Sjordi.vaquero@metempsy.com else 67814157Sjordi.vaquero@metempsy.com return new LDCLRH(machInst, rt, rnsp, rs); 67914157Sjordi.vaquero@metempsy.com case 0x5 : 68014157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 68114157Sjordi.vaquero@metempsy.com return new STCLRLH(machInst, rt, rnsp, rs); 68214157Sjordi.vaquero@metempsy.com else 68314157Sjordi.vaquero@metempsy.com return new LDCLRLH(machInst, rt, rnsp, rs); 68414157Sjordi.vaquero@metempsy.com case 0x6: 68514157Sjordi.vaquero@metempsy.com return new LDCLRAH(machInst, rt, rnsp, rs); 68614157Sjordi.vaquero@metempsy.com case 0x7: 68714157Sjordi.vaquero@metempsy.com return new LDCLRLAH(machInst, rt, rnsp, rs); 68814157Sjordi.vaquero@metempsy.com case 0x8: 68914157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 69014157Sjordi.vaquero@metempsy.com return new STCLR(machInst, rt, rnsp, rs); 69114157Sjordi.vaquero@metempsy.com else 69214157Sjordi.vaquero@metempsy.com return new LDCLR(machInst, rt, rnsp, rs); 69314157Sjordi.vaquero@metempsy.com case 0x9 : 69414157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 69514157Sjordi.vaquero@metempsy.com return new STCLRL(machInst, rt, rnsp, rs); 69614157Sjordi.vaquero@metempsy.com else 69714157Sjordi.vaquero@metempsy.com return new LDCLRL(machInst, rt, rnsp, rs); 69814157Sjordi.vaquero@metempsy.com case 0xa: 69914157Sjordi.vaquero@metempsy.com return new LDCLRA(machInst, rt, rnsp, rs); 70014157Sjordi.vaquero@metempsy.com case 0xb: 70114157Sjordi.vaquero@metempsy.com return new LDCLRLA(machInst, rt, rnsp, rs); 70214157Sjordi.vaquero@metempsy.com case 0xc: 70314157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 70414157Sjordi.vaquero@metempsy.com return new STCLR64(machInst, rt, rnsp, rs); 70514157Sjordi.vaquero@metempsy.com else 70614157Sjordi.vaquero@metempsy.com return new LDCLR64(machInst, rt, rnsp, rs); 70714157Sjordi.vaquero@metempsy.com case 0xd : 70814157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 70914157Sjordi.vaquero@metempsy.com return new STCLRL64(machInst, rt, rnsp, rs); 71014157Sjordi.vaquero@metempsy.com else 71114157Sjordi.vaquero@metempsy.com return new LDCLRL64(machInst, rt, rnsp, rs); 71214157Sjordi.vaquero@metempsy.com case 0xe: 71314157Sjordi.vaquero@metempsy.com return new LDCLRA64(machInst, rt, rnsp, rs); 71414157Sjordi.vaquero@metempsy.com case 0xf: 71514157Sjordi.vaquero@metempsy.com return new LDCLRLA64(machInst, rt, rnsp, rs); 71614174Schunchenhsu@google.com default: 71714174Schunchenhsu@google.com M5_UNREACHABLE; 71814157Sjordi.vaquero@metempsy.com } 71914157Sjordi.vaquero@metempsy.com case 0x2: 72014157Sjordi.vaquero@metempsy.com switch(size_ar){ 72114157Sjordi.vaquero@metempsy.com case 0x0: 72214157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 72314157Sjordi.vaquero@metempsy.com return new STEORB(machInst, rt, rnsp, rs); 72414157Sjordi.vaquero@metempsy.com else 72514157Sjordi.vaquero@metempsy.com return new LDEORB(machInst, rt, rnsp, rs); 72614157Sjordi.vaquero@metempsy.com case 0x1 : 72714157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 72814157Sjordi.vaquero@metempsy.com return new STEORLB(machInst, rt, rnsp, rs); 72914157Sjordi.vaquero@metempsy.com else 73014157Sjordi.vaquero@metempsy.com return new LDEORLB(machInst, rt, rnsp, rs); 73114157Sjordi.vaquero@metempsy.com case 0x2: 73214157Sjordi.vaquero@metempsy.com return new LDEORAB(machInst, rt, rnsp, rs); 73314157Sjordi.vaquero@metempsy.com case 0x3: 73414157Sjordi.vaquero@metempsy.com return new LDEORLAB(machInst, rt, rnsp, rs); 73514157Sjordi.vaquero@metempsy.com case 0x4: 73614157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 73714157Sjordi.vaquero@metempsy.com return new STEORH(machInst, rt, rnsp, rs); 73814157Sjordi.vaquero@metempsy.com else 73914157Sjordi.vaquero@metempsy.com return new LDEORH(machInst, rt, rnsp, rs); 74014157Sjordi.vaquero@metempsy.com case 0x5 : 74114157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 74214157Sjordi.vaquero@metempsy.com return new STEORLH(machInst, rt, rnsp, rs); 74314157Sjordi.vaquero@metempsy.com else 74414157Sjordi.vaquero@metempsy.com return new LDEORLH(machInst, rt, rnsp, rs); 74514157Sjordi.vaquero@metempsy.com case 0x6: 74614157Sjordi.vaquero@metempsy.com return new LDEORAH(machInst, rt, rnsp, rs); 74714157Sjordi.vaquero@metempsy.com case 0x7: 74814157Sjordi.vaquero@metempsy.com return new LDEORLAH(machInst, rt, rnsp, rs); 74914157Sjordi.vaquero@metempsy.com case 0x8: 75014157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 75114157Sjordi.vaquero@metempsy.com return new STEOR(machInst, rt, rnsp, rs); 75214157Sjordi.vaquero@metempsy.com else 75314157Sjordi.vaquero@metempsy.com return new LDEOR(machInst, rt, rnsp, rs); 75414157Sjordi.vaquero@metempsy.com case 0x9 : 75514157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 75614157Sjordi.vaquero@metempsy.com return new STEORL(machInst, rt, rnsp, rs); 75714157Sjordi.vaquero@metempsy.com else 75814157Sjordi.vaquero@metempsy.com return new LDEORL(machInst, rt, rnsp, rs); 75914157Sjordi.vaquero@metempsy.com case 0xa: 76014157Sjordi.vaquero@metempsy.com return new LDEORA(machInst, rt, rnsp, rs); 76114157Sjordi.vaquero@metempsy.com case 0xb: 76214157Sjordi.vaquero@metempsy.com return new LDEORLA(machInst, rt, rnsp, rs); 76314157Sjordi.vaquero@metempsy.com case 0xc: 76414157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 76514157Sjordi.vaquero@metempsy.com return new STEOR64(machInst, rt, rnsp, rs); 76614157Sjordi.vaquero@metempsy.com else 76714157Sjordi.vaquero@metempsy.com return new LDEOR64(machInst, rt, rnsp, rs); 76814157Sjordi.vaquero@metempsy.com case 0xd : 76914157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 77014157Sjordi.vaquero@metempsy.com return new STEORL64(machInst, rt, rnsp, rs); 77114157Sjordi.vaquero@metempsy.com else 77214157Sjordi.vaquero@metempsy.com return new LDEORL64(machInst, rt, rnsp, rs); 77314157Sjordi.vaquero@metempsy.com case 0xe: 77414157Sjordi.vaquero@metempsy.com return new LDEORA64(machInst, rt, rnsp, rs); 77514157Sjordi.vaquero@metempsy.com case 0xf: 77614157Sjordi.vaquero@metempsy.com return new LDEORLA64(machInst, rt, rnsp, rs); 77714174Schunchenhsu@google.com default: 77814174Schunchenhsu@google.com M5_UNREACHABLE; 77914157Sjordi.vaquero@metempsy.com } 78014157Sjordi.vaquero@metempsy.com case 0x3: 78114157Sjordi.vaquero@metempsy.com switch(size_ar){ 78214157Sjordi.vaquero@metempsy.com case 0x0: 78314157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 78414157Sjordi.vaquero@metempsy.com return new STSETB(machInst, rt, rnsp, rs); 78514157Sjordi.vaquero@metempsy.com else 78614157Sjordi.vaquero@metempsy.com return new LDSETB(machInst, rt, rnsp, rs); 78714157Sjordi.vaquero@metempsy.com case 0x1 : 78814157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 78914157Sjordi.vaquero@metempsy.com return new STSETLB(machInst, rt, rnsp, rs); 79014157Sjordi.vaquero@metempsy.com else 79114157Sjordi.vaquero@metempsy.com return new LDSETLB(machInst, rt, rnsp, rs); 79214157Sjordi.vaquero@metempsy.com case 0x2: 79314157Sjordi.vaquero@metempsy.com return new LDSETAB(machInst, rt, rnsp, rs); 79414157Sjordi.vaquero@metempsy.com case 0x3: 79514157Sjordi.vaquero@metempsy.com return new LDSETLAB(machInst, rt, rnsp, rs); 79614157Sjordi.vaquero@metempsy.com case 0x4: 79714157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 79814157Sjordi.vaquero@metempsy.com return new STSETH(machInst, rt, rnsp, rs); 79914157Sjordi.vaquero@metempsy.com else 80014157Sjordi.vaquero@metempsy.com return new LDSETH(machInst, rt, rnsp, rs); 80114157Sjordi.vaquero@metempsy.com case 0x5 : 80214157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 80314157Sjordi.vaquero@metempsy.com return new STSETLH(machInst, rt, rnsp, rs); 80414157Sjordi.vaquero@metempsy.com else 80514157Sjordi.vaquero@metempsy.com return new LDSETLH(machInst, rt, rnsp, rs); 80614157Sjordi.vaquero@metempsy.com case 0x6: 80714157Sjordi.vaquero@metempsy.com return new LDSETAH(machInst, rt, rnsp, rs); 80814157Sjordi.vaquero@metempsy.com case 0x7: 80914157Sjordi.vaquero@metempsy.com return new LDSETLAH(machInst, rt, rnsp, rs); 81014157Sjordi.vaquero@metempsy.com case 0x8: 81114157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 81214157Sjordi.vaquero@metempsy.com return new STSET(machInst, rt, rnsp, rs); 81314157Sjordi.vaquero@metempsy.com else 81414157Sjordi.vaquero@metempsy.com return new LDSET(machInst, rt, rnsp, rs); 81514157Sjordi.vaquero@metempsy.com case 0x9 : 81614157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 81714157Sjordi.vaquero@metempsy.com return new STSETL(machInst, rt, rnsp, rs); 81814157Sjordi.vaquero@metempsy.com else 81914157Sjordi.vaquero@metempsy.com return new LDSETL(machInst, rt, rnsp, rs); 82014157Sjordi.vaquero@metempsy.com case 0xa: 82114157Sjordi.vaquero@metempsy.com return new LDSETA(machInst, rt, rnsp, rs); 82214157Sjordi.vaquero@metempsy.com case 0xb: 82314157Sjordi.vaquero@metempsy.com return new LDSETLA(machInst, rt, rnsp, rs); 82414157Sjordi.vaquero@metempsy.com case 0xc: 82514157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 82614157Sjordi.vaquero@metempsy.com return new STSET64(machInst, rt, rnsp, rs); 82714157Sjordi.vaquero@metempsy.com else 82814157Sjordi.vaquero@metempsy.com return new LDSET64(machInst, rt, rnsp, rs); 82914157Sjordi.vaquero@metempsy.com case 0xd : 83014157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 83114157Sjordi.vaquero@metempsy.com return new STSETL64(machInst, rt, rnsp, rs); 83214157Sjordi.vaquero@metempsy.com else 83314157Sjordi.vaquero@metempsy.com return new LDSETL64(machInst, rt, rnsp, rs); 83414157Sjordi.vaquero@metempsy.com case 0xe: 83514157Sjordi.vaquero@metempsy.com return new LDSETA64(machInst, rt, rnsp, rs); 83614157Sjordi.vaquero@metempsy.com case 0xf: 83714157Sjordi.vaquero@metempsy.com return new LDSETLA64(machInst, rt, rnsp, rs); 83814174Schunchenhsu@google.com default: 83914174Schunchenhsu@google.com M5_UNREACHABLE; 84014157Sjordi.vaquero@metempsy.com } 84114157Sjordi.vaquero@metempsy.com case 0x4: 84214157Sjordi.vaquero@metempsy.com switch(size_ar){ 84314157Sjordi.vaquero@metempsy.com case 0x0: 84414157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 84514157Sjordi.vaquero@metempsy.com return new STSMAXB(machInst, rt, rnsp, rs); 84614157Sjordi.vaquero@metempsy.com else 84714157Sjordi.vaquero@metempsy.com return new LDSMAXB(machInst, rt, rnsp, rs); 84814157Sjordi.vaquero@metempsy.com case 0x1 : 84914157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 85014157Sjordi.vaquero@metempsy.com return new STSMAXLB(machInst, rt, rnsp, rs); 85114157Sjordi.vaquero@metempsy.com else 85214157Sjordi.vaquero@metempsy.com return new LDSMAXLB(machInst, rt, rnsp, rs); 85314157Sjordi.vaquero@metempsy.com case 0x2: 85414157Sjordi.vaquero@metempsy.com return new LDSMAXAB(machInst, rt, rnsp, rs); 85514157Sjordi.vaquero@metempsy.com case 0x3: 85614157Sjordi.vaquero@metempsy.com return new LDSMAXLAB(machInst, rt, rnsp, rs); 85714157Sjordi.vaquero@metempsy.com case 0x4: 85814157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 85914157Sjordi.vaquero@metempsy.com return new STSMAXH(machInst, rt, rnsp, rs); 86014157Sjordi.vaquero@metempsy.com else 86114157Sjordi.vaquero@metempsy.com return new LDSMAXH(machInst, rt, rnsp, rs); 86214157Sjordi.vaquero@metempsy.com case 0x5 : 86314157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 86414157Sjordi.vaquero@metempsy.com return new STSMAXLH(machInst, rt, rnsp, rs); 86514157Sjordi.vaquero@metempsy.com else 86614157Sjordi.vaquero@metempsy.com return new LDSMAXLH(machInst, rt, rnsp, rs); 86714157Sjordi.vaquero@metempsy.com case 0x6: 86814157Sjordi.vaquero@metempsy.com return new LDSMAXAH(machInst, rt, rnsp, rs); 86914157Sjordi.vaquero@metempsy.com case 0x7: 87014157Sjordi.vaquero@metempsy.com return new LDSMAXLAH(machInst, rt, rnsp, rs); 87114157Sjordi.vaquero@metempsy.com case 0x8: 87214157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 87314157Sjordi.vaquero@metempsy.com return new STSMAX(machInst, rt, rnsp, rs); 87414157Sjordi.vaquero@metempsy.com else 87514157Sjordi.vaquero@metempsy.com return new LDSMAX(machInst, rt, rnsp, rs); 87614157Sjordi.vaquero@metempsy.com case 0x9 : 87714157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 87814157Sjordi.vaquero@metempsy.com return new STSMAXL(machInst, rt, rnsp, rs); 87914157Sjordi.vaquero@metempsy.com else 88014157Sjordi.vaquero@metempsy.com return new LDSMAXL(machInst, rt, rnsp, rs); 88114157Sjordi.vaquero@metempsy.com case 0xa: 88214157Sjordi.vaquero@metempsy.com return new LDSMAXA(machInst, rt, rnsp, rs); 88314157Sjordi.vaquero@metempsy.com case 0xb: 88414157Sjordi.vaquero@metempsy.com return new LDSMAXLA(machInst, rt, rnsp, rs); 88514157Sjordi.vaquero@metempsy.com case 0xc: 88614157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 88714157Sjordi.vaquero@metempsy.com return new STSMAX64(machInst, rt, rnsp, rs); 88814157Sjordi.vaquero@metempsy.com else 88914157Sjordi.vaquero@metempsy.com return new LDSMAX64(machInst, rt, rnsp, rs); 89014157Sjordi.vaquero@metempsy.com case 0xd : 89114157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 89214157Sjordi.vaquero@metempsy.com return new STSMAXL64(machInst, rt, rnsp, rs); 89314157Sjordi.vaquero@metempsy.com else 89414157Sjordi.vaquero@metempsy.com return new LDSMAXL64(machInst, rt, rnsp, rs); 89514157Sjordi.vaquero@metempsy.com case 0xe: 89614157Sjordi.vaquero@metempsy.com return new LDSMAXA64(machInst, rt, rnsp, rs); 89714157Sjordi.vaquero@metempsy.com case 0xf: 89814157Sjordi.vaquero@metempsy.com return new LDSMAXLA64(machInst, rt, rnsp, rs); 89914174Schunchenhsu@google.com default: 90014174Schunchenhsu@google.com M5_UNREACHABLE; 90114157Sjordi.vaquero@metempsy.com } 90214157Sjordi.vaquero@metempsy.com case 0x5: 90314157Sjordi.vaquero@metempsy.com switch(size_ar){ 90414157Sjordi.vaquero@metempsy.com case 0x0: 90514157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 90614157Sjordi.vaquero@metempsy.com return new STSMINB(machInst, rt, rnsp, rs); 90714157Sjordi.vaquero@metempsy.com else 90814157Sjordi.vaquero@metempsy.com return new LDSMINB(machInst, rt, rnsp, rs); 90914157Sjordi.vaquero@metempsy.com case 0x1 : 91014157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 91114157Sjordi.vaquero@metempsy.com return new STSMINLB(machInst, rt, rnsp, rs); 91214157Sjordi.vaquero@metempsy.com else 91314157Sjordi.vaquero@metempsy.com return new LDSMINLB(machInst, rt, rnsp, rs); 91414157Sjordi.vaquero@metempsy.com case 0x2: 91514157Sjordi.vaquero@metempsy.com return new LDSMINAB(machInst, rt, rnsp, rs); 91614157Sjordi.vaquero@metempsy.com case 0x3: 91714157Sjordi.vaquero@metempsy.com return new LDSMINLAB(machInst, rt, rnsp, rs); 91814157Sjordi.vaquero@metempsy.com case 0x4: 91914157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 92014157Sjordi.vaquero@metempsy.com return new STSMINH(machInst, rt, rnsp, rs); 92114157Sjordi.vaquero@metempsy.com else 92214157Sjordi.vaquero@metempsy.com return new LDSMINH(machInst, rt, rnsp, rs); 92314157Sjordi.vaquero@metempsy.com case 0x5 : 92414157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 92514157Sjordi.vaquero@metempsy.com return new STSMINLH(machInst, rt, rnsp, rs); 92614157Sjordi.vaquero@metempsy.com else 92714157Sjordi.vaquero@metempsy.com return new LDSMINLH(machInst, rt, rnsp, rs); 92814157Sjordi.vaquero@metempsy.com case 0x6: 92914157Sjordi.vaquero@metempsy.com return new LDSMINAH(machInst, rt, rnsp, rs); 93014157Sjordi.vaquero@metempsy.com case 0x7: 93114157Sjordi.vaquero@metempsy.com return new LDSMINLAH(machInst, rt, rnsp, rs); 93214157Sjordi.vaquero@metempsy.com case 0x8: 93314157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 93414157Sjordi.vaquero@metempsy.com return new STSMIN(machInst, rt, rnsp, rs); 93514157Sjordi.vaquero@metempsy.com else 93614157Sjordi.vaquero@metempsy.com return new LDSMIN(machInst, rt, rnsp, rs); 93714157Sjordi.vaquero@metempsy.com case 0x9 : 93814157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 93914157Sjordi.vaquero@metempsy.com return new STSMINL(machInst, rt, rnsp, rs); 94014157Sjordi.vaquero@metempsy.com else 94114157Sjordi.vaquero@metempsy.com return new LDSMINL(machInst, rt, rnsp, rs); 94214157Sjordi.vaquero@metempsy.com case 0xa: 94314157Sjordi.vaquero@metempsy.com return new LDSMINA(machInst, rt, rnsp, rs); 94414157Sjordi.vaquero@metempsy.com case 0xb: 94514157Sjordi.vaquero@metempsy.com return new LDSMINLA(machInst, rt, rnsp, rs); 94614157Sjordi.vaquero@metempsy.com case 0xc: 94714157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 94814157Sjordi.vaquero@metempsy.com return new STSMIN64(machInst, rt, rnsp, rs); 94914157Sjordi.vaquero@metempsy.com else 95014157Sjordi.vaquero@metempsy.com return new LDSMIN64(machInst, rt, rnsp, rs); 95114157Sjordi.vaquero@metempsy.com case 0xd : 95214157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 95314157Sjordi.vaquero@metempsy.com return new STSMINL64(machInst, rt, rnsp, rs); 95414157Sjordi.vaquero@metempsy.com else 95514157Sjordi.vaquero@metempsy.com return new LDSMINL64(machInst, rt, rnsp, rs); 95614157Sjordi.vaquero@metempsy.com case 0xe: 95714157Sjordi.vaquero@metempsy.com return new LDSMINA64(machInst, rt, rnsp, rs); 95814157Sjordi.vaquero@metempsy.com case 0xf: 95914157Sjordi.vaquero@metempsy.com return new LDSMINLA64(machInst, rt, rnsp, rs); 96014174Schunchenhsu@google.com default: 96114174Schunchenhsu@google.com M5_UNREACHABLE; 96214157Sjordi.vaquero@metempsy.com } 96314157Sjordi.vaquero@metempsy.com case 0x6: 96414157Sjordi.vaquero@metempsy.com switch(size_ar){ 96514157Sjordi.vaquero@metempsy.com case 0x0: 96614157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 96714157Sjordi.vaquero@metempsy.com return new STUMAXB(machInst, rt, rnsp, rs); 96814157Sjordi.vaquero@metempsy.com else 96914157Sjordi.vaquero@metempsy.com return new LDUMAXB(machInst, rt, rnsp, rs); 97014157Sjordi.vaquero@metempsy.com case 0x1 : 97114157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 97214157Sjordi.vaquero@metempsy.com return new STUMAXLB(machInst, rt, rnsp, rs); 97314157Sjordi.vaquero@metempsy.com else 97414157Sjordi.vaquero@metempsy.com return new LDUMAXLB(machInst, rt, rnsp, rs); 97514157Sjordi.vaquero@metempsy.com case 0x2: 97614157Sjordi.vaquero@metempsy.com return new LDUMAXAB(machInst, rt, rnsp, rs); 97714157Sjordi.vaquero@metempsy.com case 0x3: 97814157Sjordi.vaquero@metempsy.com return new LDUMAXLAB(machInst, rt, rnsp, rs); 97914157Sjordi.vaquero@metempsy.com case 0x4: 98014157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 98114157Sjordi.vaquero@metempsy.com return new STUMAXH(machInst, rt, rnsp, rs); 98214157Sjordi.vaquero@metempsy.com else 98314157Sjordi.vaquero@metempsy.com return new LDUMAXH(machInst, rt, rnsp, rs); 98414157Sjordi.vaquero@metempsy.com case 0x5 : 98514157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 98614157Sjordi.vaquero@metempsy.com return new STUMAXLH(machInst, rt, rnsp, rs); 98714157Sjordi.vaquero@metempsy.com else 98814157Sjordi.vaquero@metempsy.com return new LDUMAXLH(machInst, rt, rnsp, rs); 98914157Sjordi.vaquero@metempsy.com case 0x6: 99014157Sjordi.vaquero@metempsy.com return new LDUMAXAH(machInst, rt, rnsp, rs); 99114157Sjordi.vaquero@metempsy.com case 0x7: 99214157Sjordi.vaquero@metempsy.com return new LDUMAXLAH(machInst, rt, rnsp, rs); 99314157Sjordi.vaquero@metempsy.com case 0x8: 99414157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 99514157Sjordi.vaquero@metempsy.com return new STUMAX(machInst, rt, rnsp, rs); 99614157Sjordi.vaquero@metempsy.com else 99714157Sjordi.vaquero@metempsy.com return new LDUMAX(machInst, rt, rnsp, rs); 99814157Sjordi.vaquero@metempsy.com case 0x9 : 99914157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 100014157Sjordi.vaquero@metempsy.com return new STUMAXL(machInst, rt, rnsp, rs); 100114157Sjordi.vaquero@metempsy.com else 100214157Sjordi.vaquero@metempsy.com return new LDUMAXL(machInst, rt, rnsp, rs); 100314157Sjordi.vaquero@metempsy.com case 0xa: 100414157Sjordi.vaquero@metempsy.com return new LDUMAXA(machInst, rt, rnsp, rs); 100514157Sjordi.vaquero@metempsy.com case 0xb: 100614157Sjordi.vaquero@metempsy.com return new LDUMAXLA(machInst, rt, rnsp, rs); 100714157Sjordi.vaquero@metempsy.com case 0xc: 100814157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 100914157Sjordi.vaquero@metempsy.com return new STUMAX64(machInst, rt, rnsp, rs); 101014157Sjordi.vaquero@metempsy.com else 101114157Sjordi.vaquero@metempsy.com return new LDUMAX64(machInst, rt, rnsp, rs); 101214157Sjordi.vaquero@metempsy.com case 0xd : 101314157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 101414157Sjordi.vaquero@metempsy.com return new STUMAXL64(machInst, rt, rnsp, rs); 101514157Sjordi.vaquero@metempsy.com else 101614157Sjordi.vaquero@metempsy.com return new LDUMAXL64(machInst, rt, rnsp, rs); 101714157Sjordi.vaquero@metempsy.com case 0xe: 101814157Sjordi.vaquero@metempsy.com return new LDUMAXA64(machInst, rt, rnsp, rs); 101914157Sjordi.vaquero@metempsy.com case 0xf: 102014157Sjordi.vaquero@metempsy.com return new LDUMAXLA64(machInst, rt, rnsp, rs); 102114174Schunchenhsu@google.com default: 102214174Schunchenhsu@google.com M5_UNREACHABLE; 102314157Sjordi.vaquero@metempsy.com } 102414157Sjordi.vaquero@metempsy.com case 0x7: 102514157Sjordi.vaquero@metempsy.com switch(size_ar){ 102614157Sjordi.vaquero@metempsy.com case 0x0: 102714157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 102814157Sjordi.vaquero@metempsy.com return new STUMINB(machInst, rt, rnsp, rs); 102914157Sjordi.vaquero@metempsy.com else 103014157Sjordi.vaquero@metempsy.com return new LDUMINB(machInst, rt, rnsp, rs); 103114157Sjordi.vaquero@metempsy.com case 0x1 : 103214157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 103314157Sjordi.vaquero@metempsy.com return new STUMINLB(machInst, rt, rnsp, rs); 103414157Sjordi.vaquero@metempsy.com else 103514157Sjordi.vaquero@metempsy.com return new LDUMINLB(machInst, rt, rnsp, rs); 103614157Sjordi.vaquero@metempsy.com case 0x2: 103714157Sjordi.vaquero@metempsy.com return new LDUMINAB(machInst, rt, rnsp, rs); 103814157Sjordi.vaquero@metempsy.com case 0x3: 103914157Sjordi.vaquero@metempsy.com return new LDUMINLAB(machInst, rt, rnsp, rs); 104014157Sjordi.vaquero@metempsy.com case 0x4: 104114157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 104214157Sjordi.vaquero@metempsy.com return new STUMINH(machInst, rt, rnsp, rs); 104314157Sjordi.vaquero@metempsy.com else 104414157Sjordi.vaquero@metempsy.com return new LDUMINH(machInst, rt, rnsp, rs); 104514157Sjordi.vaquero@metempsy.com case 0x5 : 104614157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 104714157Sjordi.vaquero@metempsy.com return new STUMINLH(machInst, rt, rnsp, rs); 104814157Sjordi.vaquero@metempsy.com else 104914157Sjordi.vaquero@metempsy.com return new LDUMINLH(machInst, rt, rnsp, rs); 105014157Sjordi.vaquero@metempsy.com case 0x6: 105114157Sjordi.vaquero@metempsy.com return new LDUMINAH(machInst, rt, rnsp, rs); 105214157Sjordi.vaquero@metempsy.com case 0x7: 105314157Sjordi.vaquero@metempsy.com return new LDUMINLAH(machInst, rt, rnsp, rs); 105414157Sjordi.vaquero@metempsy.com case 0x8: 105514157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 105614157Sjordi.vaquero@metempsy.com return new STUMIN(machInst, rt, rnsp, rs); 105714157Sjordi.vaquero@metempsy.com else 105814157Sjordi.vaquero@metempsy.com return new LDUMIN(machInst, rt, rnsp, rs); 105914157Sjordi.vaquero@metempsy.com case 0x9 : 106014157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 106114157Sjordi.vaquero@metempsy.com return new STUMINL(machInst, rt, rnsp, rs); 106214157Sjordi.vaquero@metempsy.com else 106314157Sjordi.vaquero@metempsy.com return new LDUMINL(machInst, rt, rnsp, rs); 106414157Sjordi.vaquero@metempsy.com case 0xa: 106514157Sjordi.vaquero@metempsy.com return new LDUMINA(machInst, rt, rnsp, rs); 106614157Sjordi.vaquero@metempsy.com case 0xb: 106714157Sjordi.vaquero@metempsy.com return new LDUMINLA(machInst, rt, rnsp, rs); 106814157Sjordi.vaquero@metempsy.com case 0xc: 106914157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 107014157Sjordi.vaquero@metempsy.com return new STUMIN64(machInst, rt, rnsp, rs); 107114157Sjordi.vaquero@metempsy.com else 107214157Sjordi.vaquero@metempsy.com return new LDUMIN64(machInst, rt, rnsp, rs); 107314157Sjordi.vaquero@metempsy.com case 0xd : 107414157Sjordi.vaquero@metempsy.com if (A_rt == 0x1f) 107514157Sjordi.vaquero@metempsy.com return new STUMINL64(machInst, rt, rnsp, rs); 107614157Sjordi.vaquero@metempsy.com else 107714157Sjordi.vaquero@metempsy.com return new LDUMINL64(machInst, rt, rnsp, rs); 107814157Sjordi.vaquero@metempsy.com case 0xe: 107914157Sjordi.vaquero@metempsy.com return new LDUMINA64(machInst, rt, rnsp, rs); 108014157Sjordi.vaquero@metempsy.com case 0xf: 108114157Sjordi.vaquero@metempsy.com return new LDUMINLA64(machInst, rt, rnsp, rs); 108214174Schunchenhsu@google.com default: 108314174Schunchenhsu@google.com M5_UNREACHABLE; 108414157Sjordi.vaquero@metempsy.com } 108514157Sjordi.vaquero@metempsy.com default: 108614157Sjordi.vaquero@metempsy.com return new Unknown64(machInst); 108714157Sjordi.vaquero@metempsy.com } 108814157Sjordi.vaquero@metempsy.com } 108914157Sjordi.vaquero@metempsy.com} 109014157Sjordi.vaquero@metempsy.com}}; 109114157Sjordi.vaquero@metempsy.com 109214157Sjordi.vaquero@metempsy.com 109314157Sjordi.vaquero@metempsy.comoutput decoder {{ 109414157Sjordi.vaquero@metempsy.comnamespace Aarch64 109514157Sjordi.vaquero@metempsy.com{ 109614157Sjordi.vaquero@metempsy.com 109714157Sjordi.vaquero@metempsy.com StaticInstPtr 109810037SARM gem5 Developers decodeLoadsStores(ExtMachInst machInst) 109910037SARM gem5 Developers { 110010037SARM gem5 Developers // bit 27,25=10 110110037SARM gem5 Developers switch (bits(machInst, 29, 28)) { 110210037SARM gem5 Developers case 0x0: 110310037SARM gem5 Developers if (bits(machInst, 26) == 0) { 110410037SARM gem5 Developers if (bits(machInst, 24) != 0) 110510037SARM gem5 Developers return new Unknown64(machInst); 110610037SARM gem5 Developers IntRegIndex rt = (IntRegIndex)(uint8_t)bits(machInst, 4, 0); 110710037SARM gem5 Developers IntRegIndex rn = (IntRegIndex)(uint8_t)bits(machInst, 9, 5); 110810037SARM gem5 Developers IntRegIndex rnsp = makeSP(rn); 110910037SARM gem5 Developers IntRegIndex rt2 = (IntRegIndex)(uint8_t)bits(machInst, 14, 10); 111010037SARM gem5 Developers IntRegIndex rs = (IntRegIndex)(uint8_t)bits(machInst, 20, 16); 111110037SARM gem5 Developers uint8_t opc = (bits(machInst, 15) << 0) | 111210037SARM gem5 Developers (bits(machInst, 23, 21) << 1); 111310037SARM gem5 Developers uint8_t size = bits(machInst, 31, 30); 111410037SARM gem5 Developers switch (opc) { 111510037SARM gem5 Developers case 0x0: 111610037SARM gem5 Developers switch (size) { 111710037SARM gem5 Developers case 0x0: 111810037SARM gem5 Developers return new STXRB64(machInst, rt, rnsp, rs); 111910037SARM gem5 Developers case 0x1: 112010037SARM gem5 Developers return new STXRH64(machInst, rt, rnsp, rs); 112110037SARM gem5 Developers case 0x2: 112210037SARM gem5 Developers return new STXRW64(machInst, rt, rnsp, rs); 112310037SARM gem5 Developers case 0x3: 112410037SARM gem5 Developers return new STXRX64(machInst, rt, rnsp, rs); 112512595Ssiddhesh.poyarekar@gmail.com default: 112612595Ssiddhesh.poyarekar@gmail.com M5_UNREACHABLE; 112710037SARM gem5 Developers } 112810037SARM gem5 Developers case 0x1: 112910037SARM gem5 Developers switch (size) { 113010037SARM gem5 Developers case 0x0: 113110037SARM gem5 Developers return new STLXRB64(machInst, rt, rnsp, rs); 113210037SARM gem5 Developers case 0x1: 113310037SARM gem5 Developers return new STLXRH64(machInst, rt, rnsp, rs); 113410037SARM gem5 Developers case 0x2: 113510037SARM gem5 Developers return new STLXRW64(machInst, rt, rnsp, rs); 113610037SARM gem5 Developers case 0x3: 113710037SARM gem5 Developers return new STLXRX64(machInst, rt, rnsp, rs); 113812595Ssiddhesh.poyarekar@gmail.com default: 113912595Ssiddhesh.poyarekar@gmail.com M5_UNREACHABLE; 114010037SARM gem5 Developers } 114110037SARM gem5 Developers case 0x2: 114210037SARM gem5 Developers switch (size) { 114310037SARM gem5 Developers case 0x0: 114414150Sjordi.vaquero@metempsy.com return new CASP32(machInst, rt, rnsp, rs); 114510037SARM gem5 Developers case 0x1: 114614150Sjordi.vaquero@metempsy.com return new CASP64(machInst, rt, rnsp, rs); 114710037SARM gem5 Developers case 0x2: 114810037SARM gem5 Developers return new STXPW64(machInst, rs, rt, rt2, rnsp); 114910037SARM gem5 Developers case 0x3: 115010037SARM gem5 Developers return new STXPX64(machInst, rs, rt, rt2, rnsp); 115112595Ssiddhesh.poyarekar@gmail.com default: 115212595Ssiddhesh.poyarekar@gmail.com M5_UNREACHABLE; 115310037SARM gem5 Developers } 115410037SARM gem5 Developers 115510037SARM gem5 Developers case 0x3: 115610037SARM gem5 Developers switch (size) { 115710037SARM gem5 Developers case 0x0: 115814150Sjordi.vaquero@metempsy.com return new CASPL32(machInst, rt, rnsp, rs); 115910037SARM gem5 Developers case 0x1: 116014150Sjordi.vaquero@metempsy.com return new CASPL64(machInst, rt, rnsp, rs); 116110037SARM gem5 Developers case 0x2: 116210037SARM gem5 Developers return new STLXPW64(machInst, rs, rt, rt2, rnsp); 116310037SARM gem5 Developers case 0x3: 116410037SARM gem5 Developers return new STLXPX64(machInst, rs, rt, rt2, rnsp); 116512595Ssiddhesh.poyarekar@gmail.com default: 116612595Ssiddhesh.poyarekar@gmail.com M5_UNREACHABLE; 116710037SARM gem5 Developers } 116810037SARM gem5 Developers 116910037SARM gem5 Developers case 0x4: 117010037SARM gem5 Developers switch (size) { 117110037SARM gem5 Developers case 0x0: 117210037SARM gem5 Developers return new LDXRB64(machInst, rt, rnsp, rs); 117310037SARM gem5 Developers case 0x1: 117410037SARM gem5 Developers return new LDXRH64(machInst, rt, rnsp, rs); 117510037SARM gem5 Developers case 0x2: 117610037SARM gem5 Developers return new LDXRW64(machInst, rt, rnsp, rs); 117710037SARM gem5 Developers case 0x3: 117810037SARM gem5 Developers return new LDXRX64(machInst, rt, rnsp, rs); 117912595Ssiddhesh.poyarekar@gmail.com default: 118012595Ssiddhesh.poyarekar@gmail.com M5_UNREACHABLE; 118110037SARM gem5 Developers } 118210037SARM gem5 Developers case 0x5: 118310037SARM gem5 Developers switch (size) { 118410037SARM gem5 Developers case 0x0: 118510037SARM gem5 Developers return new LDAXRB64(machInst, rt, rnsp, rs); 118610037SARM gem5 Developers case 0x1: 118710037SARM gem5 Developers return new LDAXRH64(machInst, rt, rnsp, rs); 118810037SARM gem5 Developers case 0x2: 118910037SARM gem5 Developers return new LDAXRW64(machInst, rt, rnsp, rs); 119010037SARM gem5 Developers case 0x3: 119110037SARM gem5 Developers return new LDAXRX64(machInst, rt, rnsp, rs); 119212595Ssiddhesh.poyarekar@gmail.com default: 119312595Ssiddhesh.poyarekar@gmail.com M5_UNREACHABLE; 119410037SARM gem5 Developers } 119510037SARM gem5 Developers case 0x6: 119610037SARM gem5 Developers switch (size) { 119710037SARM gem5 Developers case 0x0: 119814150Sjordi.vaquero@metempsy.com return new CASPA32(machInst, rt, rnsp, rs); 119910037SARM gem5 Developers case 0x1: 120014150Sjordi.vaquero@metempsy.com return new CASPA64(machInst, rt, rnsp, rs); 120110037SARM gem5 Developers case 0x2: 120210037SARM gem5 Developers return new LDXPW64(machInst, rt, rt2, rnsp); 120310037SARM gem5 Developers case 0x3: 120410037SARM gem5 Developers return new LDXPX64(machInst, rt, rt2, rnsp); 120512595Ssiddhesh.poyarekar@gmail.com default: 120612595Ssiddhesh.poyarekar@gmail.com M5_UNREACHABLE; 120710037SARM gem5 Developers } 120810037SARM gem5 Developers case 0x7: 120910037SARM gem5 Developers switch (size) { 121010037SARM gem5 Developers case 0x0: 121114150Sjordi.vaquero@metempsy.com return new CASPAL32(machInst, rt, rnsp, rs); 121210037SARM gem5 Developers case 0x1: 121314150Sjordi.vaquero@metempsy.com return new CASPAL64(machInst, rt, rnsp, rs); 121410037SARM gem5 Developers case 0x2: 121510037SARM gem5 Developers return new LDAXPW64(machInst, rt, rt2, rnsp); 121610037SARM gem5 Developers case 0x3: 121710037SARM gem5 Developers return new LDAXPX64(machInst, rt, rt2, rnsp); 121812595Ssiddhesh.poyarekar@gmail.com default: 121912595Ssiddhesh.poyarekar@gmail.com M5_UNREACHABLE; 122010037SARM gem5 Developers } 122110037SARM gem5 Developers case 0x9: 122210037SARM gem5 Developers switch (size) { 122310037SARM gem5 Developers case 0x0: 122410037SARM gem5 Developers return new STLRB64(machInst, rt, rnsp); 122510037SARM gem5 Developers case 0x1: 122610037SARM gem5 Developers return new STLRH64(machInst, rt, rnsp); 122710037SARM gem5 Developers case 0x2: 122810037SARM gem5 Developers return new STLRW64(machInst, rt, rnsp); 122910037SARM gem5 Developers case 0x3: 123010037SARM gem5 Developers return new STLRX64(machInst, rt, rnsp); 123112595Ssiddhesh.poyarekar@gmail.com default: 123212595Ssiddhesh.poyarekar@gmail.com M5_UNREACHABLE; 123310037SARM gem5 Developers } 123414150Sjordi.vaquero@metempsy.com case 0xa: 123514150Sjordi.vaquero@metempsy.com switch (size) { 123614150Sjordi.vaquero@metempsy.com case 0x0: 123714150Sjordi.vaquero@metempsy.com return new CASB(machInst, rt, rnsp, rs); 123814150Sjordi.vaquero@metempsy.com case 0x1: 123914150Sjordi.vaquero@metempsy.com return new CASH(machInst, rt, rnsp, rs); 124014150Sjordi.vaquero@metempsy.com case 0x2: 124114150Sjordi.vaquero@metempsy.com return new CAS32(machInst, rt, rnsp, rs); 124214150Sjordi.vaquero@metempsy.com case 0x3: 124314150Sjordi.vaquero@metempsy.com return new CAS64(machInst, rt, rnsp, rs); 124414150Sjordi.vaquero@metempsy.com default: 124514150Sjordi.vaquero@metempsy.com M5_UNREACHABLE; 124614150Sjordi.vaquero@metempsy.com } 124714150Sjordi.vaquero@metempsy.com case 0xb: 124814150Sjordi.vaquero@metempsy.com switch (size) { 124914150Sjordi.vaquero@metempsy.com case 0x0: 125014150Sjordi.vaquero@metempsy.com return new CASLB(machInst, rt, rnsp, rs); 125114150Sjordi.vaquero@metempsy.com case 0x1: 125214150Sjordi.vaquero@metempsy.com return new CASLH(machInst, rt, rnsp, rs); 125314150Sjordi.vaquero@metempsy.com case 0x2: 125414150Sjordi.vaquero@metempsy.com return new CASL32(machInst, rt, rnsp, rs); 125514150Sjordi.vaquero@metempsy.com case 0x3: 125614150Sjordi.vaquero@metempsy.com return new CASL64(machInst, rt, rnsp, rs); 125714150Sjordi.vaquero@metempsy.com default: 125814150Sjordi.vaquero@metempsy.com M5_UNREACHABLE; 125914150Sjordi.vaquero@metempsy.com } 126010037SARM gem5 Developers case 0xd: 126110037SARM gem5 Developers switch (size) { 126210037SARM gem5 Developers case 0x0: 126310037SARM gem5 Developers return new LDARB64(machInst, rt, rnsp); 126410037SARM gem5 Developers case 0x1: 126510037SARM gem5 Developers return new LDARH64(machInst, rt, rnsp); 126610037SARM gem5 Developers case 0x2: 126710037SARM gem5 Developers return new LDARW64(machInst, rt, rnsp); 126810037SARM gem5 Developers case 0x3: 126910037SARM gem5 Developers return new LDARX64(machInst, rt, rnsp); 127012595Ssiddhesh.poyarekar@gmail.com default: 127112595Ssiddhesh.poyarekar@gmail.com M5_UNREACHABLE; 127210037SARM gem5 Developers } 127314150Sjordi.vaquero@metempsy.com case 0xe: 127414150Sjordi.vaquero@metempsy.com switch (size) { 127514150Sjordi.vaquero@metempsy.com case 0x0: 127614150Sjordi.vaquero@metempsy.com return new CASAB(machInst, rt, rnsp, rs); 127714150Sjordi.vaquero@metempsy.com case 0x1: 127814150Sjordi.vaquero@metempsy.com return new CASAH(machInst, rt, rnsp, rs); 127914150Sjordi.vaquero@metempsy.com case 0x2: 128014150Sjordi.vaquero@metempsy.com return new CASA32(machInst, rt, rnsp, rs); 128114150Sjordi.vaquero@metempsy.com case 0x3: 128214150Sjordi.vaquero@metempsy.com return new CASA64(machInst, rt, rnsp, rs); 128314150Sjordi.vaquero@metempsy.com default: 128414150Sjordi.vaquero@metempsy.com M5_UNREACHABLE; 128514150Sjordi.vaquero@metempsy.com } 128614150Sjordi.vaquero@metempsy.com case 0xf: 128714150Sjordi.vaquero@metempsy.com switch (size) { 128814150Sjordi.vaquero@metempsy.com case 0x0: 128914150Sjordi.vaquero@metempsy.com return new CASALB(machInst, rt, rnsp, rs); 129014150Sjordi.vaquero@metempsy.com case 0x1: 129114150Sjordi.vaquero@metempsy.com return new CASALH(machInst, rt, rnsp, rs); 129214150Sjordi.vaquero@metempsy.com case 0x2: 129314150Sjordi.vaquero@metempsy.com return new CASAL32(machInst, rt, rnsp, rs); 129414150Sjordi.vaquero@metempsy.com case 0x3: 129514150Sjordi.vaquero@metempsy.com return new CASAL64(machInst, rt, rnsp, rs); 129614150Sjordi.vaquero@metempsy.com default: 129714150Sjordi.vaquero@metempsy.com M5_UNREACHABLE; 129814150Sjordi.vaquero@metempsy.com } 129910037SARM gem5 Developers default: 130010037SARM gem5 Developers return new Unknown64(machInst); 130110037SARM gem5 Developers } 130210037SARM gem5 Developers } else if (bits(machInst, 31)) { 130310037SARM gem5 Developers return new Unknown64(machInst); 130410037SARM gem5 Developers } else { 130510037SARM gem5 Developers return decodeNeonMem(machInst); 130610037SARM gem5 Developers } 130710037SARM gem5 Developers case 0x1: 130810037SARM gem5 Developers { 130910037SARM gem5 Developers if (bits(machInst, 24) != 0) 131010037SARM gem5 Developers return new Unknown64(machInst); 131110037SARM gem5 Developers uint8_t switchVal = (bits(machInst, 26) << 0) | 131210037SARM gem5 Developers (bits(machInst, 31, 30) << 1); 131310037SARM gem5 Developers int64_t imm = sext<19>(bits(machInst, 23, 5)) << 2; 131410037SARM gem5 Developers IntRegIndex rt = (IntRegIndex)(uint32_t)bits(machInst, 4, 0); 131510037SARM gem5 Developers switch (switchVal) { 131610037SARM gem5 Developers case 0x0: 131710037SARM gem5 Developers return new LDRWL64_LIT(machInst, rt, imm); 131810037SARM gem5 Developers case 0x1: 131910037SARM gem5 Developers return new LDRSFP64_LIT(machInst, rt, imm); 132010037SARM gem5 Developers case 0x2: 132110037SARM gem5 Developers return new LDRXL64_LIT(machInst, rt, imm); 132210037SARM gem5 Developers case 0x3: 132310037SARM gem5 Developers return new LDRDFP64_LIT(machInst, rt, imm); 132410037SARM gem5 Developers case 0x4: 132510037SARM gem5 Developers return new LDRSWL64_LIT(machInst, rt, imm); 132610037SARM gem5 Developers case 0x5: 132710037SARM gem5 Developers return new BigFpMemLit("ldr", machInst, rt, imm); 132810037SARM gem5 Developers case 0x6: 132910037SARM gem5 Developers return new PRFM64_LIT(machInst, rt, imm); 133010037SARM gem5 Developers default: 133110037SARM gem5 Developers return new Unknown64(machInst); 133210037SARM gem5 Developers } 133310037SARM gem5 Developers } 133410037SARM gem5 Developers case 0x2: 133510037SARM gem5 Developers { 133610037SARM gem5 Developers uint8_t opc = bits(machInst, 31, 30); 133710037SARM gem5 Developers if (opc >= 3) 133810037SARM gem5 Developers return new Unknown64(machInst); 133910037SARM gem5 Developers uint32_t size = 0; 134010037SARM gem5 Developers bool fp = bits(machInst, 26); 134110037SARM gem5 Developers bool load = bits(machInst, 22); 134210037SARM gem5 Developers if (fp) { 134310037SARM gem5 Developers size = 4 << opc; 134410037SARM gem5 Developers } else { 134510037SARM gem5 Developers if ((opc == 1) && !load) 134610037SARM gem5 Developers return new Unknown64(machInst); 134710037SARM gem5 Developers size = (opc == 0 || opc == 1) ? 4 : 8; 134810037SARM gem5 Developers } 134910037SARM gem5 Developers uint8_t type = bits(machInst, 24, 23); 135010037SARM gem5 Developers int64_t imm = sext<7>(bits(machInst, 21, 15)) * size; 135110037SARM gem5 Developers 135210037SARM gem5 Developers IntRegIndex rn = (IntRegIndex)(uint8_t)bits(machInst, 9, 5); 135310037SARM gem5 Developers IntRegIndex rt = (IntRegIndex)(uint8_t)bits(machInst, 4, 0); 135410037SARM gem5 Developers IntRegIndex rt2 = (IntRegIndex)(uint8_t)bits(machInst, 14, 10); 135510037SARM gem5 Developers 135610037SARM gem5 Developers bool noAlloc = (type == 0); 135710037SARM gem5 Developers bool signExt = !noAlloc && !fp && opc == 1; 135810037SARM gem5 Developers PairMemOp::AddrMode mode; 135910037SARM gem5 Developers const char *mnemonic = NULL; 136010037SARM gem5 Developers switch (type) { 136110037SARM gem5 Developers case 0x0: 136210037SARM gem5 Developers case 0x2: 136310037SARM gem5 Developers mode = PairMemOp::AddrMd_Offset; 136410037SARM gem5 Developers break; 136510037SARM gem5 Developers case 0x1: 136610037SARM gem5 Developers mode = PairMemOp::AddrMd_PostIndex; 136710037SARM gem5 Developers break; 136810037SARM gem5 Developers case 0x3: 136910037SARM gem5 Developers mode = PairMemOp::AddrMd_PreIndex; 137010037SARM gem5 Developers break; 137110037SARM gem5 Developers default: 137210037SARM gem5 Developers return new Unknown64(machInst); 137310037SARM gem5 Developers } 137410037SARM gem5 Developers if (load) { 137510037SARM gem5 Developers if (noAlloc) 137610037SARM gem5 Developers mnemonic = "ldnp"; 137710037SARM gem5 Developers else if (signExt) 137810037SARM gem5 Developers mnemonic = "ldpsw"; 137910037SARM gem5 Developers else 138010037SARM gem5 Developers mnemonic = "ldp"; 138110037SARM gem5 Developers } else { 138210037SARM gem5 Developers if (noAlloc) 138310037SARM gem5 Developers mnemonic = "stnp"; 138410037SARM gem5 Developers else 138510037SARM gem5 Developers mnemonic = "stp"; 138610037SARM gem5 Developers } 138710037SARM gem5 Developers 138810037SARM gem5 Developers return new LdpStp(mnemonic, machInst, size, fp, load, noAlloc, 138910037SARM gem5 Developers signExt, false, false, imm, mode, rn, rt, rt2); 139010037SARM gem5 Developers } 139110037SARM gem5 Developers // bit 29:27=111, 25=0 139210037SARM gem5 Developers case 0x3: 139310037SARM gem5 Developers { 139410037SARM gem5 Developers uint8_t switchVal = (bits(machInst, 23, 22) << 0) | 139510037SARM gem5 Developers (bits(machInst, 26) << 2) | 139610037SARM gem5 Developers (bits(machInst, 31, 30) << 3); 139710037SARM gem5 Developers if (bits(machInst, 24) == 1) { 139810037SARM gem5 Developers uint64_t imm12 = bits(machInst, 21, 10); 139910037SARM gem5 Developers IntRegIndex rt = (IntRegIndex)(uint32_t)bits(machInst, 4, 0); 140010037SARM gem5 Developers IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 9, 5); 140110037SARM gem5 Developers IntRegIndex rnsp = makeSP(rn); 140210037SARM gem5 Developers switch (switchVal) { 140310037SARM gem5 Developers case 0x00: 140410037SARM gem5 Developers return new STRB64_IMM(machInst, rt, rnsp, imm12); 140510037SARM gem5 Developers case 0x01: 140610037SARM gem5 Developers return new LDRB64_IMM(machInst, rt, rnsp, imm12); 140710037SARM gem5 Developers case 0x02: 140810037SARM gem5 Developers return new LDRSBX64_IMM(machInst, rt, rnsp, imm12); 140910037SARM gem5 Developers case 0x03: 141010037SARM gem5 Developers return new LDRSBW64_IMM(machInst, rt, rnsp, imm12); 141110037SARM gem5 Developers case 0x04: 141210037SARM gem5 Developers return new STRBFP64_IMM(machInst, rt, rnsp, imm12); 141310037SARM gem5 Developers case 0x05: 141410037SARM gem5 Developers return new LDRBFP64_IMM(machInst, rt, rnsp, imm12); 141510037SARM gem5 Developers case 0x06: 141610037SARM gem5 Developers return new BigFpMemImm("str", machInst, false, 141710037SARM gem5 Developers rt, rnsp, imm12 << 4); 141810037SARM gem5 Developers case 0x07: 141910037SARM gem5 Developers return new BigFpMemImm("ldr", machInst, true, 142010037SARM gem5 Developers rt, rnsp, imm12 << 4); 142110037SARM gem5 Developers case 0x08: 142210037SARM gem5 Developers return new STRH64_IMM(machInst, rt, rnsp, imm12 << 1); 142310037SARM gem5 Developers case 0x09: 142410037SARM gem5 Developers return new LDRH64_IMM(machInst, rt, rnsp, imm12 << 1); 142510037SARM gem5 Developers case 0x0a: 142610037SARM gem5 Developers return new LDRSHX64_IMM(machInst, rt, rnsp, imm12 << 1); 142710037SARM gem5 Developers case 0x0b: 142810037SARM gem5 Developers return new LDRSHW64_IMM(machInst, rt, rnsp, imm12 << 1); 142910037SARM gem5 Developers case 0x0c: 143010037SARM gem5 Developers return new STRHFP64_IMM(machInst, rt, rnsp, imm12 << 1); 143110037SARM gem5 Developers case 0x0d: 143210037SARM gem5 Developers return new LDRHFP64_IMM(machInst, rt, rnsp, imm12 << 1); 143310037SARM gem5 Developers case 0x10: 143410037SARM gem5 Developers return new STRW64_IMM(machInst, rt, rnsp, imm12 << 2); 143510037SARM gem5 Developers case 0x11: 143610037SARM gem5 Developers return new LDRW64_IMM(machInst, rt, rnsp, imm12 << 2); 143710037SARM gem5 Developers case 0x12: 143810037SARM gem5 Developers return new LDRSW64_IMM(machInst, rt, rnsp, imm12 << 2); 143910037SARM gem5 Developers case 0x14: 144010037SARM gem5 Developers return new STRSFP64_IMM(machInst, rt, rnsp, imm12 << 2); 144110037SARM gem5 Developers case 0x15: 144210037SARM gem5 Developers return new LDRSFP64_IMM(machInst, rt, rnsp, imm12 << 2); 144310037SARM gem5 Developers case 0x18: 144410037SARM gem5 Developers return new STRX64_IMM(machInst, rt, rnsp, imm12 << 3); 144510037SARM gem5 Developers case 0x19: 144610037SARM gem5 Developers return new LDRX64_IMM(machInst, rt, rnsp, imm12 << 3); 144710037SARM gem5 Developers case 0x1a: 144810037SARM gem5 Developers return new PRFM64_IMM(machInst, rt, rnsp, imm12 << 3); 144910037SARM gem5 Developers case 0x1c: 145010037SARM gem5 Developers return new STRDFP64_IMM(machInst, rt, rnsp, imm12 << 3); 145110037SARM gem5 Developers case 0x1d: 145210037SARM gem5 Developers return new LDRDFP64_IMM(machInst, rt, rnsp, imm12 << 3); 145310037SARM gem5 Developers default: 145410037SARM gem5 Developers return new Unknown64(machInst); 145510037SARM gem5 Developers } 145610037SARM gem5 Developers } else if (bits(machInst, 21) == 1) { 145712856Sgiacomo.gabrielli@arm.com uint8_t group = bits(machInst, 11, 10); 145812856Sgiacomo.gabrielli@arm.com switch (group) { 145912856Sgiacomo.gabrielli@arm.com case 0x0: 146012856Sgiacomo.gabrielli@arm.com { 146112856Sgiacomo.gabrielli@arm.com if ((switchVal & 0x7) == 0x2 && 146212856Sgiacomo.gabrielli@arm.com bits(machInst, 20, 12) == 0x1fc) { 146312856Sgiacomo.gabrielli@arm.com IntRegIndex rt = (IntRegIndex)(uint32_t) 146412856Sgiacomo.gabrielli@arm.com bits(machInst, 4, 0); 146512856Sgiacomo.gabrielli@arm.com IntRegIndex rn = (IntRegIndex)(uint32_t) 146612856Sgiacomo.gabrielli@arm.com bits(machInst, 9, 5); 146712856Sgiacomo.gabrielli@arm.com IntRegIndex rnsp = makeSP(rn); 146812856Sgiacomo.gabrielli@arm.com uint8_t size = bits(machInst, 31, 30); 146912856Sgiacomo.gabrielli@arm.com switch (size) { 147012856Sgiacomo.gabrielli@arm.com case 0x0: 147112856Sgiacomo.gabrielli@arm.com return new LDAPRB64(machInst, rt, rnsp); 147212856Sgiacomo.gabrielli@arm.com case 0x1: 147312856Sgiacomo.gabrielli@arm.com return new LDAPRH64(machInst, rt, rnsp); 147412856Sgiacomo.gabrielli@arm.com case 0x2: 147512856Sgiacomo.gabrielli@arm.com return new LDAPRW64(machInst, rt, rnsp); 147612856Sgiacomo.gabrielli@arm.com case 0x3: 147712856Sgiacomo.gabrielli@arm.com return new LDAPRX64(machInst, rt, rnsp); 147812856Sgiacomo.gabrielli@arm.com default: 147912856Sgiacomo.gabrielli@arm.com M5_UNREACHABLE; 148012856Sgiacomo.gabrielli@arm.com } 148112856Sgiacomo.gabrielli@arm.com } else { 148214157Sjordi.vaquero@metempsy.com return decodeAtomicArithOp(machInst); 148312856Sgiacomo.gabrielli@arm.com } 148412856Sgiacomo.gabrielli@arm.com } 148512856Sgiacomo.gabrielli@arm.com case 0x2: 148612856Sgiacomo.gabrielli@arm.com { 148712856Sgiacomo.gabrielli@arm.com if (!bits(machInst, 14)) 148812856Sgiacomo.gabrielli@arm.com return new Unknown64(machInst); 148912856Sgiacomo.gabrielli@arm.com IntRegIndex rt = (IntRegIndex)(uint32_t) 149012856Sgiacomo.gabrielli@arm.com bits(machInst, 4, 0); 149112856Sgiacomo.gabrielli@arm.com IntRegIndex rn = (IntRegIndex)(uint32_t) 149212856Sgiacomo.gabrielli@arm.com bits(machInst, 9, 5); 149312856Sgiacomo.gabrielli@arm.com IntRegIndex rnsp = makeSP(rn); 149412856Sgiacomo.gabrielli@arm.com IntRegIndex rm = (IntRegIndex)(uint32_t) 149512856Sgiacomo.gabrielli@arm.com bits(machInst, 20, 16); 149612856Sgiacomo.gabrielli@arm.com ArmExtendType type = 149712856Sgiacomo.gabrielli@arm.com (ArmExtendType)(uint32_t)bits(machInst, 15, 13); 149812856Sgiacomo.gabrielli@arm.com uint8_t s = bits(machInst, 12); 149912856Sgiacomo.gabrielli@arm.com switch (switchVal) { 150012856Sgiacomo.gabrielli@arm.com case 0x00: 150112856Sgiacomo.gabrielli@arm.com return new STRB64_REG(machInst, rt, rnsp, rm, 150212856Sgiacomo.gabrielli@arm.com type, 0); 150312856Sgiacomo.gabrielli@arm.com case 0x01: 150412856Sgiacomo.gabrielli@arm.com return new LDRB64_REG(machInst, rt, rnsp, rm, 150512856Sgiacomo.gabrielli@arm.com type, 0); 150612856Sgiacomo.gabrielli@arm.com case 0x02: 150712856Sgiacomo.gabrielli@arm.com return new LDRSBX64_REG(machInst, rt, rnsp, rm, 150812856Sgiacomo.gabrielli@arm.com type, 0); 150912856Sgiacomo.gabrielli@arm.com case 0x03: 151012856Sgiacomo.gabrielli@arm.com return new LDRSBW64_REG(machInst, rt, rnsp, rm, 151112856Sgiacomo.gabrielli@arm.com type, 0); 151212856Sgiacomo.gabrielli@arm.com case 0x04: 151312856Sgiacomo.gabrielli@arm.com return new STRBFP64_REG(machInst, rt, rnsp, rm, 151412856Sgiacomo.gabrielli@arm.com type, 0); 151512856Sgiacomo.gabrielli@arm.com case 0x05: 151612856Sgiacomo.gabrielli@arm.com return new LDRBFP64_REG(machInst, rt, rnsp, rm, 151712856Sgiacomo.gabrielli@arm.com type, 0); 151812856Sgiacomo.gabrielli@arm.com case 0x6: 151912856Sgiacomo.gabrielli@arm.com return new BigFpMemReg("str", machInst, false, 152012856Sgiacomo.gabrielli@arm.com rt, rnsp, rm, type, s * 4); 152112856Sgiacomo.gabrielli@arm.com case 0x7: 152212856Sgiacomo.gabrielli@arm.com return new BigFpMemReg("ldr", machInst, true, 152312856Sgiacomo.gabrielli@arm.com rt, rnsp, rm, type, s * 4); 152412856Sgiacomo.gabrielli@arm.com case 0x08: 152512856Sgiacomo.gabrielli@arm.com return new STRH64_REG(machInst, rt, rnsp, rm, 152612856Sgiacomo.gabrielli@arm.com type, s); 152712856Sgiacomo.gabrielli@arm.com case 0x09: 152812856Sgiacomo.gabrielli@arm.com return new LDRH64_REG(machInst, rt, rnsp, rm, 152912856Sgiacomo.gabrielli@arm.com type, s); 153012856Sgiacomo.gabrielli@arm.com case 0x0a: 153112856Sgiacomo.gabrielli@arm.com return new LDRSHX64_REG(machInst, rt, rnsp, rm, 153212856Sgiacomo.gabrielli@arm.com type, s); 153312856Sgiacomo.gabrielli@arm.com case 0x0b: 153412856Sgiacomo.gabrielli@arm.com return new LDRSHW64_REG(machInst, rt, rnsp, rm, 153512856Sgiacomo.gabrielli@arm.com type, s); 153612856Sgiacomo.gabrielli@arm.com case 0x0c: 153712856Sgiacomo.gabrielli@arm.com return new STRHFP64_REG(machInst, rt, rnsp, rm, 153812856Sgiacomo.gabrielli@arm.com type, s); 153912856Sgiacomo.gabrielli@arm.com case 0x0d: 154012856Sgiacomo.gabrielli@arm.com return new LDRHFP64_REG(machInst, rt, rnsp, rm, 154112856Sgiacomo.gabrielli@arm.com type, s); 154212856Sgiacomo.gabrielli@arm.com case 0x10: 154312856Sgiacomo.gabrielli@arm.com return new STRW64_REG(machInst, rt, rnsp, rm, 154412856Sgiacomo.gabrielli@arm.com type, s * 2); 154512856Sgiacomo.gabrielli@arm.com case 0x11: 154612856Sgiacomo.gabrielli@arm.com return new LDRW64_REG(machInst, rt, rnsp, rm, 154712856Sgiacomo.gabrielli@arm.com type, s * 2); 154812856Sgiacomo.gabrielli@arm.com case 0x12: 154912856Sgiacomo.gabrielli@arm.com return new LDRSW64_REG(machInst, rt, rnsp, rm, 155012856Sgiacomo.gabrielli@arm.com type, s * 2); 155112856Sgiacomo.gabrielli@arm.com case 0x14: 155212856Sgiacomo.gabrielli@arm.com return new STRSFP64_REG(machInst, rt, rnsp, rm, 155312856Sgiacomo.gabrielli@arm.com type, s * 2); 155412856Sgiacomo.gabrielli@arm.com case 0x15: 155512856Sgiacomo.gabrielli@arm.com return new LDRSFP64_REG(machInst, rt, rnsp, rm, 155612856Sgiacomo.gabrielli@arm.com type, s * 2); 155712856Sgiacomo.gabrielli@arm.com case 0x18: 155812856Sgiacomo.gabrielli@arm.com return new STRX64_REG(machInst, rt, rnsp, rm, 155912856Sgiacomo.gabrielli@arm.com type, s * 3); 156012856Sgiacomo.gabrielli@arm.com case 0x19: 156112856Sgiacomo.gabrielli@arm.com return new LDRX64_REG(machInst, rt, rnsp, rm, 156212856Sgiacomo.gabrielli@arm.com type, s * 3); 156312856Sgiacomo.gabrielli@arm.com case 0x1a: 156412856Sgiacomo.gabrielli@arm.com return new PRFM64_REG(machInst, rt, rnsp, rm, 156512856Sgiacomo.gabrielli@arm.com type, s * 3); 156612856Sgiacomo.gabrielli@arm.com case 0x1c: 156712856Sgiacomo.gabrielli@arm.com return new STRDFP64_REG(machInst, rt, rnsp, rm, 156812856Sgiacomo.gabrielli@arm.com type, s * 3); 156912856Sgiacomo.gabrielli@arm.com case 0x1d: 157012856Sgiacomo.gabrielli@arm.com return new LDRDFP64_REG(machInst, rt, rnsp, rm, 157112856Sgiacomo.gabrielli@arm.com type, s * 3); 157212856Sgiacomo.gabrielli@arm.com default: 157312856Sgiacomo.gabrielli@arm.com return new Unknown64(machInst); 157412856Sgiacomo.gabrielli@arm.com 157512856Sgiacomo.gabrielli@arm.com } 157612856Sgiacomo.gabrielli@arm.com } 157710037SARM gem5 Developers default: 157810037SARM gem5 Developers return new Unknown64(machInst); 157910037SARM gem5 Developers } 158010037SARM gem5 Developers } else { 158110037SARM gem5 Developers // bit 29:27=111, 25:24=00, 21=0 158210037SARM gem5 Developers switch (bits(machInst, 11, 10)) { 158310037SARM gem5 Developers case 0x0: 158410037SARM gem5 Developers { 158510037SARM gem5 Developers IntRegIndex rt = 158610037SARM gem5 Developers (IntRegIndex)(uint32_t)bits(machInst, 4, 0); 158710037SARM gem5 Developers IntRegIndex rn = 158810037SARM gem5 Developers (IntRegIndex)(uint32_t)bits(machInst, 9, 5); 158910037SARM gem5 Developers IntRegIndex rnsp = makeSP(rn); 159010037SARM gem5 Developers uint64_t imm = sext<9>(bits(machInst, 20, 12)); 159110037SARM gem5 Developers switch (switchVal) { 159210037SARM gem5 Developers case 0x00: 159310037SARM gem5 Developers return new STURB64_IMM(machInst, rt, rnsp, imm); 159410037SARM gem5 Developers case 0x01: 159510037SARM gem5 Developers return new LDURB64_IMM(machInst, rt, rnsp, imm); 159610037SARM gem5 Developers case 0x02: 159710037SARM gem5 Developers return new LDURSBX64_IMM(machInst, rt, rnsp, imm); 159810037SARM gem5 Developers case 0x03: 159910037SARM gem5 Developers return new LDURSBW64_IMM(machInst, rt, rnsp, imm); 160010037SARM gem5 Developers case 0x04: 160110037SARM gem5 Developers return new STURBFP64_IMM(machInst, rt, rnsp, imm); 160210037SARM gem5 Developers case 0x05: 160310037SARM gem5 Developers return new LDURBFP64_IMM(machInst, rt, rnsp, imm); 160410037SARM gem5 Developers case 0x06: 160510037SARM gem5 Developers return new BigFpMemImm("stur", machInst, false, 160610037SARM gem5 Developers rt, rnsp, imm); 160710037SARM gem5 Developers case 0x07: 160810037SARM gem5 Developers return new BigFpMemImm("ldur", machInst, true, 160910037SARM gem5 Developers rt, rnsp, imm); 161010037SARM gem5 Developers case 0x08: 161110037SARM gem5 Developers return new STURH64_IMM(machInst, rt, rnsp, imm); 161210037SARM gem5 Developers case 0x09: 161310037SARM gem5 Developers return new LDURH64_IMM(machInst, rt, rnsp, imm); 161410037SARM gem5 Developers case 0x0a: 161510037SARM gem5 Developers return new LDURSHX64_IMM(machInst, rt, rnsp, imm); 161610037SARM gem5 Developers case 0x0b: 161710037SARM gem5 Developers return new LDURSHW64_IMM(machInst, rt, rnsp, imm); 161810037SARM gem5 Developers case 0x0c: 161910037SARM gem5 Developers return new STURHFP64_IMM(machInst, rt, rnsp, imm); 162010037SARM gem5 Developers case 0x0d: 162110037SARM gem5 Developers return new LDURHFP64_IMM(machInst, rt, rnsp, imm); 162210037SARM gem5 Developers case 0x10: 162310037SARM gem5 Developers return new STURW64_IMM(machInst, rt, rnsp, imm); 162410037SARM gem5 Developers case 0x11: 162510037SARM gem5 Developers return new LDURW64_IMM(machInst, rt, rnsp, imm); 162610037SARM gem5 Developers case 0x12: 162710037SARM gem5 Developers return new LDURSW64_IMM(machInst, rt, rnsp, imm); 162810037SARM gem5 Developers case 0x14: 162910037SARM gem5 Developers return new STURSFP64_IMM(machInst, rt, rnsp, imm); 163010037SARM gem5 Developers case 0x15: 163110037SARM gem5 Developers return new LDURSFP64_IMM(machInst, rt, rnsp, imm); 163210037SARM gem5 Developers case 0x18: 163310037SARM gem5 Developers return new STURX64_IMM(machInst, rt, rnsp, imm); 163410037SARM gem5 Developers case 0x19: 163510037SARM gem5 Developers return new LDURX64_IMM(machInst, rt, rnsp, imm); 163610037SARM gem5 Developers case 0x1a: 163710037SARM gem5 Developers return new PRFUM64_IMM(machInst, rt, rnsp, imm); 163810037SARM gem5 Developers case 0x1c: 163910037SARM gem5 Developers return new STURDFP64_IMM(machInst, rt, rnsp, imm); 164010037SARM gem5 Developers case 0x1d: 164110037SARM gem5 Developers return new LDURDFP64_IMM(machInst, rt, rnsp, imm); 164210037SARM gem5 Developers default: 164310037SARM gem5 Developers return new Unknown64(machInst); 164410037SARM gem5 Developers } 164510037SARM gem5 Developers } 164610037SARM gem5 Developers // bit 29:27=111, 25:24=00, 21=0, 11:10=01 164710037SARM gem5 Developers case 0x1: 164810037SARM gem5 Developers { 164910037SARM gem5 Developers IntRegIndex rt = 165010037SARM gem5 Developers (IntRegIndex)(uint32_t)bits(machInst, 4, 0); 165110037SARM gem5 Developers IntRegIndex rn = 165210037SARM gem5 Developers (IntRegIndex)(uint32_t)bits(machInst, 9, 5); 165310037SARM gem5 Developers IntRegIndex rnsp = makeSP(rn); 165410037SARM gem5 Developers uint64_t imm = sext<9>(bits(machInst, 20, 12)); 165510037SARM gem5 Developers switch (switchVal) { 165610037SARM gem5 Developers case 0x00: 165710037SARM gem5 Developers return new STRB64_POST(machInst, rt, rnsp, imm); 165810037SARM gem5 Developers case 0x01: 165910037SARM gem5 Developers return new LDRB64_POST(machInst, rt, rnsp, imm); 166010037SARM gem5 Developers case 0x02: 166110037SARM gem5 Developers return new LDRSBX64_POST(machInst, rt, rnsp, imm); 166210037SARM gem5 Developers case 0x03: 166310037SARM gem5 Developers return new LDRSBW64_POST(machInst, rt, rnsp, imm); 166410037SARM gem5 Developers case 0x04: 166510037SARM gem5 Developers return new STRBFP64_POST(machInst, rt, rnsp, imm); 166610037SARM gem5 Developers case 0x05: 166710037SARM gem5 Developers return new LDRBFP64_POST(machInst, rt, rnsp, imm); 166810037SARM gem5 Developers case 0x06: 166910037SARM gem5 Developers return new BigFpMemPost("str", machInst, false, 167010037SARM gem5 Developers rt, rnsp, imm); 167110037SARM gem5 Developers case 0x07: 167210037SARM gem5 Developers return new BigFpMemPost("ldr", machInst, true, 167310037SARM gem5 Developers rt, rnsp, imm); 167410037SARM gem5 Developers case 0x08: 167510037SARM gem5 Developers return new STRH64_POST(machInst, rt, rnsp, imm); 167610037SARM gem5 Developers case 0x09: 167710037SARM gem5 Developers return new LDRH64_POST(machInst, rt, rnsp, imm); 167810037SARM gem5 Developers case 0x0a: 167910037SARM gem5 Developers return new LDRSHX64_POST(machInst, rt, rnsp, imm); 168010037SARM gem5 Developers case 0x0b: 168110037SARM gem5 Developers return new LDRSHW64_POST(machInst, rt, rnsp, imm); 168210037SARM gem5 Developers case 0x0c: 168310037SARM gem5 Developers return new STRHFP64_POST(machInst, rt, rnsp, imm); 168410037SARM gem5 Developers case 0x0d: 168510037SARM gem5 Developers return new LDRHFP64_POST(machInst, rt, rnsp, imm); 168610037SARM gem5 Developers case 0x10: 168710037SARM gem5 Developers return new STRW64_POST(machInst, rt, rnsp, imm); 168810037SARM gem5 Developers case 0x11: 168910037SARM gem5 Developers return new LDRW64_POST(machInst, rt, rnsp, imm); 169010037SARM gem5 Developers case 0x12: 169110037SARM gem5 Developers return new LDRSW64_POST(machInst, rt, rnsp, imm); 169210037SARM gem5 Developers case 0x14: 169310037SARM gem5 Developers return new STRSFP64_POST(machInst, rt, rnsp, imm); 169410037SARM gem5 Developers case 0x15: 169510037SARM gem5 Developers return new LDRSFP64_POST(machInst, rt, rnsp, imm); 169610037SARM gem5 Developers case 0x18: 169710037SARM gem5 Developers return new STRX64_POST(machInst, rt, rnsp, imm); 169810037SARM gem5 Developers case 0x19: 169910037SARM gem5 Developers return new LDRX64_POST(machInst, rt, rnsp, imm); 170010037SARM gem5 Developers case 0x1c: 170110037SARM gem5 Developers return new STRDFP64_POST(machInst, rt, rnsp, imm); 170210037SARM gem5 Developers case 0x1d: 170310037SARM gem5 Developers return new LDRDFP64_POST(machInst, rt, rnsp, imm); 170410037SARM gem5 Developers default: 170510037SARM gem5 Developers return new Unknown64(machInst); 170610037SARM gem5 Developers } 170710037SARM gem5 Developers } 170810037SARM gem5 Developers case 0x2: 170910037SARM gem5 Developers { 171010037SARM gem5 Developers IntRegIndex rt = 171110037SARM gem5 Developers (IntRegIndex)(uint32_t)bits(machInst, 4, 0); 171210037SARM gem5 Developers IntRegIndex rn = 171310037SARM gem5 Developers (IntRegIndex)(uint32_t)bits(machInst, 9, 5); 171410037SARM gem5 Developers IntRegIndex rnsp = makeSP(rn); 171510037SARM gem5 Developers uint64_t imm = sext<9>(bits(machInst, 20, 12)); 171610037SARM gem5 Developers switch (switchVal) { 171710037SARM gem5 Developers case 0x00: 171810037SARM gem5 Developers return new STTRB64_IMM(machInst, rt, rnsp, imm); 171910037SARM gem5 Developers case 0x01: 172010037SARM gem5 Developers return new LDTRB64_IMM(machInst, rt, rnsp, imm); 172110037SARM gem5 Developers case 0x02: 172210037SARM gem5 Developers return new LDTRSBX64_IMM(machInst, rt, rnsp, imm); 172310037SARM gem5 Developers case 0x03: 172410037SARM gem5 Developers return new LDTRSBW64_IMM(machInst, rt, rnsp, imm); 172510037SARM gem5 Developers case 0x08: 172610037SARM gem5 Developers return new STTRH64_IMM(machInst, rt, rnsp, imm); 172710037SARM gem5 Developers case 0x09: 172810037SARM gem5 Developers return new LDTRH64_IMM(machInst, rt, rnsp, imm); 172910037SARM gem5 Developers case 0x0a: 173010037SARM gem5 Developers return new LDTRSHX64_IMM(machInst, rt, rnsp, imm); 173110037SARM gem5 Developers case 0x0b: 173210037SARM gem5 Developers return new LDTRSHW64_IMM(machInst, rt, rnsp, imm); 173310037SARM gem5 Developers case 0x10: 173410037SARM gem5 Developers return new STTRW64_IMM(machInst, rt, rnsp, imm); 173510037SARM gem5 Developers case 0x11: 173610037SARM gem5 Developers return new LDTRW64_IMM(machInst, rt, rnsp, imm); 173710037SARM gem5 Developers case 0x12: 173810037SARM gem5 Developers return new LDTRSW64_IMM(machInst, rt, rnsp, imm); 173910037SARM gem5 Developers case 0x18: 174010037SARM gem5 Developers return new STTRX64_IMM(machInst, rt, rnsp, imm); 174110037SARM gem5 Developers case 0x19: 174210037SARM gem5 Developers return new LDTRX64_IMM(machInst, rt, rnsp, imm); 174310037SARM gem5 Developers default: 174410037SARM gem5 Developers return new Unknown64(machInst); 174510037SARM gem5 Developers } 174610037SARM gem5 Developers } 174710037SARM gem5 Developers case 0x3: 174810037SARM gem5 Developers { 174910037SARM gem5 Developers IntRegIndex rt = 175010037SARM gem5 Developers (IntRegIndex)(uint32_t)bits(machInst, 4, 0); 175110037SARM gem5 Developers IntRegIndex rn = 175210037SARM gem5 Developers (IntRegIndex)(uint32_t)bits(machInst, 9, 5); 175310037SARM gem5 Developers IntRegIndex rnsp = makeSP(rn); 175410037SARM gem5 Developers uint64_t imm = sext<9>(bits(machInst, 20, 12)); 175510037SARM gem5 Developers switch (switchVal) { 175610037SARM gem5 Developers case 0x00: 175710037SARM gem5 Developers return new STRB64_PRE(machInst, rt, rnsp, imm); 175810037SARM gem5 Developers case 0x01: 175910037SARM gem5 Developers return new LDRB64_PRE(machInst, rt, rnsp, imm); 176010037SARM gem5 Developers case 0x02: 176110037SARM gem5 Developers return new LDRSBX64_PRE(machInst, rt, rnsp, imm); 176210037SARM gem5 Developers case 0x03: 176310037SARM gem5 Developers return new LDRSBW64_PRE(machInst, rt, rnsp, imm); 176410037SARM gem5 Developers case 0x04: 176510037SARM gem5 Developers return new STRBFP64_PRE(machInst, rt, rnsp, imm); 176610037SARM gem5 Developers case 0x05: 176710037SARM gem5 Developers return new LDRBFP64_PRE(machInst, rt, rnsp, imm); 176810037SARM gem5 Developers case 0x06: 176910037SARM gem5 Developers return new BigFpMemPre("str", machInst, false, 177010037SARM gem5 Developers rt, rnsp, imm); 177110037SARM gem5 Developers case 0x07: 177210037SARM gem5 Developers return new BigFpMemPre("ldr", machInst, true, 177310037SARM gem5 Developers rt, rnsp, imm); 177410037SARM gem5 Developers case 0x08: 177510037SARM gem5 Developers return new STRH64_PRE(machInst, rt, rnsp, imm); 177610037SARM gem5 Developers case 0x09: 177710037SARM gem5 Developers return new LDRH64_PRE(machInst, rt, rnsp, imm); 177810037SARM gem5 Developers case 0x0a: 177910037SARM gem5 Developers return new LDRSHX64_PRE(machInst, rt, rnsp, imm); 178010037SARM gem5 Developers case 0x0b: 178110037SARM gem5 Developers return new LDRSHW64_PRE(machInst, rt, rnsp, imm); 178210037SARM gem5 Developers case 0x0c: 178310037SARM gem5 Developers return new STRHFP64_PRE(machInst, rt, rnsp, imm); 178410037SARM gem5 Developers case 0x0d: 178510037SARM gem5 Developers return new LDRHFP64_PRE(machInst, rt, rnsp, imm); 178610037SARM gem5 Developers case 0x10: 178710037SARM gem5 Developers return new STRW64_PRE(machInst, rt, rnsp, imm); 178810037SARM gem5 Developers case 0x11: 178910037SARM gem5 Developers return new LDRW64_PRE(machInst, rt, rnsp, imm); 179010037SARM gem5 Developers case 0x12: 179110037SARM gem5 Developers return new LDRSW64_PRE(machInst, rt, rnsp, imm); 179210037SARM gem5 Developers case 0x14: 179310037SARM gem5 Developers return new STRSFP64_PRE(machInst, rt, rnsp, imm); 179410037SARM gem5 Developers case 0x15: 179510037SARM gem5 Developers return new LDRSFP64_PRE(machInst, rt, rnsp, imm); 179610037SARM gem5 Developers case 0x18: 179710037SARM gem5 Developers return new STRX64_PRE(machInst, rt, rnsp, imm); 179810037SARM gem5 Developers case 0x19: 179910037SARM gem5 Developers return new LDRX64_PRE(machInst, rt, rnsp, imm); 180010037SARM gem5 Developers case 0x1c: 180110037SARM gem5 Developers return new STRDFP64_PRE(machInst, rt, rnsp, imm); 180210037SARM gem5 Developers case 0x1d: 180310037SARM gem5 Developers return new LDRDFP64_PRE(machInst, rt, rnsp, imm); 180410037SARM gem5 Developers default: 180510037SARM gem5 Developers return new Unknown64(machInst); 180610037SARM gem5 Developers } 180710037SARM gem5 Developers } 180812595Ssiddhesh.poyarekar@gmail.com default: 180912595Ssiddhesh.poyarekar@gmail.com M5_UNREACHABLE; 181010037SARM gem5 Developers } 181110037SARM gem5 Developers } 181210037SARM gem5 Developers } 181312595Ssiddhesh.poyarekar@gmail.com default: 181412595Ssiddhesh.poyarekar@gmail.com M5_UNREACHABLE; 181510037SARM gem5 Developers } 181610037SARM gem5 Developers return new FailUnimplemented("Unhandled Case1", machInst); 181710037SARM gem5 Developers } 181810037SARM gem5 Developers} 181910037SARM gem5 Developers}}; 182010037SARM gem5 Developers 182110037SARM gem5 Developersoutput decoder {{ 182210037SARM gem5 Developersnamespace Aarch64 182310037SARM gem5 Developers{ 182410037SARM gem5 Developers StaticInstPtr 182510037SARM gem5 Developers decodeDataProcReg(ExtMachInst machInst) 182610037SARM gem5 Developers { 182710037SARM gem5 Developers uint8_t switchVal = (bits(machInst, 28) << 1) | 182810037SARM gem5 Developers (bits(machInst, 24) << 0); 182910037SARM gem5 Developers switch (switchVal) { 183010037SARM gem5 Developers case 0x0: 183110037SARM gem5 Developers { 183210037SARM gem5 Developers uint8_t switchVal = (bits(machInst, 21) << 0) | 183310037SARM gem5 Developers (bits(machInst, 30, 29) << 1); 183410037SARM gem5 Developers ArmShiftType type = (ArmShiftType)(uint8_t)bits(machInst, 23, 22); 183510037SARM gem5 Developers uint8_t imm6 = bits(machInst, 15, 10); 183610037SARM gem5 Developers bool sf = bits(machInst, 31); 183710037SARM gem5 Developers if (!sf && (imm6 & 0x20)) 183810037SARM gem5 Developers return new Unknown64(machInst); 183910037SARM gem5 Developers IntRegIndex rd = (IntRegIndex)(uint8_t)bits(machInst, 4, 0); 184010337SAndrew.Bardsley@arm.com IntRegIndex rdzr = makeZero(rd); 184110037SARM gem5 Developers IntRegIndex rn = (IntRegIndex)(uint8_t)bits(machInst, 9, 5); 184210037SARM gem5 Developers IntRegIndex rm = (IntRegIndex)(uint8_t)bits(machInst, 20, 16); 184310037SARM gem5 Developers 184410037SARM gem5 Developers switch (switchVal) { 184510037SARM gem5 Developers case 0x0: 184610337SAndrew.Bardsley@arm.com return new AndXSReg(machInst, rdzr, rn, rm, imm6, type); 184710037SARM gem5 Developers case 0x1: 184810337SAndrew.Bardsley@arm.com return new BicXSReg(machInst, rdzr, rn, rm, imm6, type); 184910037SARM gem5 Developers case 0x2: 185010337SAndrew.Bardsley@arm.com return new OrrXSReg(machInst, rdzr, rn, rm, imm6, type); 185110037SARM gem5 Developers case 0x3: 185210337SAndrew.Bardsley@arm.com return new OrnXSReg(machInst, rdzr, rn, rm, imm6, type); 185310037SARM gem5 Developers case 0x4: 185410337SAndrew.Bardsley@arm.com return new EorXSReg(machInst, rdzr, rn, rm, imm6, type); 185510037SARM gem5 Developers case 0x5: 185610337SAndrew.Bardsley@arm.com return new EonXSReg(machInst, rdzr, rn, rm, imm6, type); 185710037SARM gem5 Developers case 0x6: 185810337SAndrew.Bardsley@arm.com return new AndXSRegCc(machInst, rdzr, rn, rm, imm6, type); 185910037SARM gem5 Developers case 0x7: 186010337SAndrew.Bardsley@arm.com return new BicXSRegCc(machInst, rdzr, rn, rm, imm6, type); 186112595Ssiddhesh.poyarekar@gmail.com default: 186212595Ssiddhesh.poyarekar@gmail.com M5_UNREACHABLE; 186310037SARM gem5 Developers } 186410037SARM gem5 Developers } 186510037SARM gem5 Developers case 0x1: 186610037SARM gem5 Developers { 186710037SARM gem5 Developers uint8_t switchVal = bits(machInst, 30, 29); 186810037SARM gem5 Developers if (bits(machInst, 21) == 0) { 186910037SARM gem5 Developers ArmShiftType type = 187010037SARM gem5 Developers (ArmShiftType)(uint8_t)bits(machInst, 23, 22); 187110037SARM gem5 Developers if (type == ROR) 187210037SARM gem5 Developers return new Unknown64(machInst); 187310037SARM gem5 Developers uint8_t imm6 = bits(machInst, 15, 10); 187410037SARM gem5 Developers if (!bits(machInst, 31) && bits(imm6, 5)) 187510037SARM gem5 Developers return new Unknown64(machInst); 187610037SARM gem5 Developers IntRegIndex rd = (IntRegIndex)(uint8_t)bits(machInst, 4, 0); 187710337SAndrew.Bardsley@arm.com IntRegIndex rdzr = makeZero(rd); 187810037SARM gem5 Developers IntRegIndex rn = (IntRegIndex)(uint8_t)bits(machInst, 9, 5); 187910037SARM gem5 Developers IntRegIndex rm = (IntRegIndex)(uint8_t)bits(machInst, 20, 16); 188010037SARM gem5 Developers switch (switchVal) { 188110037SARM gem5 Developers case 0x0: 188210337SAndrew.Bardsley@arm.com return new AddXSReg(machInst, rdzr, rn, rm, imm6, type); 188310037SARM gem5 Developers case 0x1: 188410337SAndrew.Bardsley@arm.com return new AddXSRegCc(machInst, rdzr, rn, rm, imm6, type); 188510037SARM gem5 Developers case 0x2: 188610337SAndrew.Bardsley@arm.com return new SubXSReg(machInst, rdzr, rn, rm, imm6, type); 188710037SARM gem5 Developers case 0x3: 188810337SAndrew.Bardsley@arm.com return new SubXSRegCc(machInst, rdzr, rn, rm, imm6, type); 188912595Ssiddhesh.poyarekar@gmail.com default: 189012595Ssiddhesh.poyarekar@gmail.com M5_UNREACHABLE; 189110037SARM gem5 Developers } 189210037SARM gem5 Developers } else { 189310037SARM gem5 Developers if (bits(machInst, 23, 22) != 0 || bits(machInst, 12, 10) > 0x4) 189410037SARM gem5 Developers return new Unknown64(machInst); 189510037SARM gem5 Developers ArmExtendType type = 189610037SARM gem5 Developers (ArmExtendType)(uint8_t)bits(machInst, 15, 13); 189710037SARM gem5 Developers uint8_t imm3 = bits(machInst, 12, 10); 189810037SARM gem5 Developers IntRegIndex rd = (IntRegIndex)(uint8_t)bits(machInst, 4, 0); 189910037SARM gem5 Developers IntRegIndex rdsp = makeSP(rd); 190010337SAndrew.Bardsley@arm.com IntRegIndex rdzr = makeZero(rd); 190110037SARM gem5 Developers IntRegIndex rn = (IntRegIndex)(uint8_t)bits(machInst, 9, 5); 190210037SARM gem5 Developers IntRegIndex rnsp = makeSP(rn); 190310037SARM gem5 Developers IntRegIndex rm = (IntRegIndex)(uint8_t)bits(machInst, 20, 16); 190410037SARM gem5 Developers 190510037SARM gem5 Developers switch (switchVal) { 190610037SARM gem5 Developers case 0x0: 190710037SARM gem5 Developers return new AddXEReg(machInst, rdsp, rnsp, rm, type, imm3); 190810037SARM gem5 Developers case 0x1: 190910337SAndrew.Bardsley@arm.com return new AddXERegCc(machInst, rdzr, rnsp, rm, type, imm3); 191010037SARM gem5 Developers case 0x2: 191110037SARM gem5 Developers return new SubXEReg(machInst, rdsp, rnsp, rm, type, imm3); 191210037SARM gem5 Developers case 0x3: 191310337SAndrew.Bardsley@arm.com return new SubXERegCc(machInst, rdzr, rnsp, rm, type, imm3); 191412595Ssiddhesh.poyarekar@gmail.com default: 191512595Ssiddhesh.poyarekar@gmail.com M5_UNREACHABLE; 191610037SARM gem5 Developers } 191710037SARM gem5 Developers } 191810037SARM gem5 Developers } 191910037SARM gem5 Developers case 0x2: 192010037SARM gem5 Developers { 192110037SARM gem5 Developers if (bits(machInst, 21) == 1) 192210037SARM gem5 Developers return new Unknown64(machInst); 192310037SARM gem5 Developers IntRegIndex rd = (IntRegIndex)(uint8_t)bits(machInst, 4, 0); 192410337SAndrew.Bardsley@arm.com IntRegIndex rdzr = makeZero(rd); 192510037SARM gem5 Developers IntRegIndex rn = (IntRegIndex)(uint8_t)bits(machInst, 9, 5); 192610037SARM gem5 Developers IntRegIndex rm = (IntRegIndex)(uint8_t)bits(machInst, 20, 16); 192710037SARM gem5 Developers switch (bits(machInst, 23, 22)) { 192810037SARM gem5 Developers case 0x0: 192910037SARM gem5 Developers { 193010037SARM gem5 Developers if (bits(machInst, 15, 10)) 193110037SARM gem5 Developers return new Unknown64(machInst); 193210037SARM gem5 Developers uint8_t switchVal = bits(machInst, 30, 29); 193310037SARM gem5 Developers switch (switchVal) { 193410037SARM gem5 Developers case 0x0: 193510337SAndrew.Bardsley@arm.com return new AdcXSReg(machInst, rdzr, rn, rm, 0, LSL); 193610037SARM gem5 Developers case 0x1: 193710337SAndrew.Bardsley@arm.com return new AdcXSRegCc(machInst, rdzr, rn, rm, 0, LSL); 193810037SARM gem5 Developers case 0x2: 193910337SAndrew.Bardsley@arm.com return new SbcXSReg(machInst, rdzr, rn, rm, 0, LSL); 194010037SARM gem5 Developers case 0x3: 194110337SAndrew.Bardsley@arm.com return new SbcXSRegCc(machInst, rdzr, rn, rm, 0, LSL); 194212595Ssiddhesh.poyarekar@gmail.com default: 194312595Ssiddhesh.poyarekar@gmail.com M5_UNREACHABLE; 194410037SARM gem5 Developers } 194510037SARM gem5 Developers } 194610037SARM gem5 Developers case 0x1: 194710037SARM gem5 Developers { 194810037SARM gem5 Developers if ((bits(machInst, 4) == 1) || 194910037SARM gem5 Developers (bits(machInst, 10) == 1) || 195010037SARM gem5 Developers (bits(machInst, 29) == 0)) { 195110037SARM gem5 Developers return new Unknown64(machInst); 195210037SARM gem5 Developers } 195310037SARM gem5 Developers ConditionCode cond = 195410037SARM gem5 Developers (ConditionCode)(uint8_t)bits(machInst, 15, 12); 195510037SARM gem5 Developers uint8_t flags = bits(machInst, 3, 0); 195610037SARM gem5 Developers IntRegIndex rn = (IntRegIndex)(uint8_t)bits(machInst, 9, 5); 195710037SARM gem5 Developers if (bits(machInst, 11) == 0) { 195810037SARM gem5 Developers IntRegIndex rm = 195910037SARM gem5 Developers (IntRegIndex)(uint8_t)bits(machInst, 20, 16); 196010037SARM gem5 Developers if (bits(machInst, 30) == 0) { 196110037SARM gem5 Developers return new CcmnReg64(machInst, rn, rm, cond, flags); 196210037SARM gem5 Developers } else { 196310037SARM gem5 Developers return new CcmpReg64(machInst, rn, rm, cond, flags); 196410037SARM gem5 Developers } 196510037SARM gem5 Developers } else { 196610037SARM gem5 Developers uint8_t imm5 = bits(machInst, 20, 16); 196710037SARM gem5 Developers if (bits(machInst, 30) == 0) { 196810037SARM gem5 Developers return new CcmnImm64(machInst, rn, imm5, cond, flags); 196910037SARM gem5 Developers } else { 197010037SARM gem5 Developers return new CcmpImm64(machInst, rn, imm5, cond, flags); 197110037SARM gem5 Developers } 197210037SARM gem5 Developers } 197310037SARM gem5 Developers } 197410037SARM gem5 Developers case 0x2: 197510037SARM gem5 Developers { 197610037SARM gem5 Developers if (bits(machInst, 29) == 1 || 197710037SARM gem5 Developers bits(machInst, 11) == 1) { 197810037SARM gem5 Developers return new Unknown64(machInst); 197910037SARM gem5 Developers } 198010037SARM gem5 Developers uint8_t switchVal = (bits(machInst, 10) << 0) | 198110037SARM gem5 Developers (bits(machInst, 30) << 1); 198210037SARM gem5 Developers IntRegIndex rd = (IntRegIndex)(uint8_t)bits(machInst, 4, 0); 198310337SAndrew.Bardsley@arm.com IntRegIndex rdzr = makeZero(rd); 198410037SARM gem5 Developers IntRegIndex rn = (IntRegIndex)(uint8_t)bits(machInst, 9, 5); 198510037SARM gem5 Developers IntRegIndex rm = (IntRegIndex)(uint8_t)bits(machInst, 20, 16); 198610037SARM gem5 Developers ConditionCode cond = 198710037SARM gem5 Developers (ConditionCode)(uint8_t)bits(machInst, 15, 12); 198810037SARM gem5 Developers switch (switchVal) { 198910037SARM gem5 Developers case 0x0: 199010337SAndrew.Bardsley@arm.com return new Csel64(machInst, rdzr, rn, rm, cond); 199110037SARM gem5 Developers case 0x1: 199210337SAndrew.Bardsley@arm.com return new Csinc64(machInst, rdzr, rn, rm, cond); 199310037SARM gem5 Developers case 0x2: 199410337SAndrew.Bardsley@arm.com return new Csinv64(machInst, rdzr, rn, rm, cond); 199510037SARM gem5 Developers case 0x3: 199610337SAndrew.Bardsley@arm.com return new Csneg64(machInst, rdzr, rn, rm, cond); 199712595Ssiddhesh.poyarekar@gmail.com default: 199812595Ssiddhesh.poyarekar@gmail.com M5_UNREACHABLE; 199910037SARM gem5 Developers } 200010037SARM gem5 Developers } 200110037SARM gem5 Developers case 0x3: 200210037SARM gem5 Developers if (bits(machInst, 30) == 0) { 200310037SARM gem5 Developers if (bits(machInst, 29) != 0) 200410037SARM gem5 Developers return new Unknown64(machInst); 200510037SARM gem5 Developers uint8_t switchVal = bits(machInst, 15, 10); 200610037SARM gem5 Developers switch (switchVal) { 200710037SARM gem5 Developers case 0x2: 200810337SAndrew.Bardsley@arm.com return new Udiv64(machInst, rdzr, rn, rm); 200910037SARM gem5 Developers case 0x3: 201010337SAndrew.Bardsley@arm.com return new Sdiv64(machInst, rdzr, rn, rm); 201110037SARM gem5 Developers case 0x8: 201210337SAndrew.Bardsley@arm.com return new Lslv64(machInst, rdzr, rn, rm); 201310037SARM gem5 Developers case 0x9: 201410337SAndrew.Bardsley@arm.com return new Lsrv64(machInst, rdzr, rn, rm); 201510037SARM gem5 Developers case 0xa: 201610337SAndrew.Bardsley@arm.com return new Asrv64(machInst, rdzr, rn, rm); 201710037SARM gem5 Developers case 0xb: 201810337SAndrew.Bardsley@arm.com return new Rorv64(machInst, rdzr, rn, rm); 201912258Sgiacomo.travaglini@arm.com case 0x10: 202012258Sgiacomo.travaglini@arm.com return new Crc32b64(machInst, rdzr, rn, rm); 202112258Sgiacomo.travaglini@arm.com case 0x11: 202212258Sgiacomo.travaglini@arm.com return new Crc32h64(machInst, rdzr, rn, rm); 202312258Sgiacomo.travaglini@arm.com case 0x12: 202412258Sgiacomo.travaglini@arm.com return new Crc32w64(machInst, rdzr, rn, rm); 202512258Sgiacomo.travaglini@arm.com case 0x13: 202612258Sgiacomo.travaglini@arm.com return new Crc32x64(machInst, rdzr, rn, rm); 202712258Sgiacomo.travaglini@arm.com case 0x14: 202812258Sgiacomo.travaglini@arm.com return new Crc32cb64(machInst, rdzr, rn, rm); 202912258Sgiacomo.travaglini@arm.com case 0x15: 203012258Sgiacomo.travaglini@arm.com return new Crc32ch64(machInst, rdzr, rn, rm); 203112258Sgiacomo.travaglini@arm.com case 0x16: 203212258Sgiacomo.travaglini@arm.com return new Crc32cw64(machInst, rdzr, rn, rm); 203312258Sgiacomo.travaglini@arm.com case 0x17: 203412258Sgiacomo.travaglini@arm.com return new Crc32cx64(machInst, rdzr, rn, rm); 203510037SARM gem5 Developers default: 203610037SARM gem5 Developers return new Unknown64(machInst); 203710037SARM gem5 Developers } 203810037SARM gem5 Developers } else { 203910037SARM gem5 Developers if (bits(machInst, 20, 16) != 0 || 204010037SARM gem5 Developers bits(machInst, 29) != 0) { 204110037SARM gem5 Developers return new Unknown64(machInst); 204210037SARM gem5 Developers } 204310037SARM gem5 Developers uint8_t switchVal = bits(machInst, 15, 10); 204410037SARM gem5 Developers switch (switchVal) { 204510037SARM gem5 Developers case 0x0: 204610337SAndrew.Bardsley@arm.com return new Rbit64(machInst, rdzr, rn); 204710037SARM gem5 Developers case 0x1: 204810337SAndrew.Bardsley@arm.com return new Rev1664(machInst, rdzr, rn); 204910037SARM gem5 Developers case 0x2: 205010037SARM gem5 Developers if (bits(machInst, 31) == 0) 205110337SAndrew.Bardsley@arm.com return new Rev64(machInst, rdzr, rn); 205210037SARM gem5 Developers else 205310337SAndrew.Bardsley@arm.com return new Rev3264(machInst, rdzr, rn); 205410037SARM gem5 Developers case 0x3: 205510037SARM gem5 Developers if (bits(machInst, 31) != 1) 205610037SARM gem5 Developers return new Unknown64(machInst); 205710337SAndrew.Bardsley@arm.com return new Rev64(machInst, rdzr, rn); 205810037SARM gem5 Developers case 0x4: 205910337SAndrew.Bardsley@arm.com return new Clz64(machInst, rdzr, rn); 206010037SARM gem5 Developers case 0x5: 206110337SAndrew.Bardsley@arm.com return new Cls64(machInst, rdzr, rn); 206212595Ssiddhesh.poyarekar@gmail.com default: 206312595Ssiddhesh.poyarekar@gmail.com return new Unknown64(machInst); 206410037SARM gem5 Developers } 206510037SARM gem5 Developers } 206612595Ssiddhesh.poyarekar@gmail.com default: 206712595Ssiddhesh.poyarekar@gmail.com M5_UNREACHABLE; 206810037SARM gem5 Developers } 206910037SARM gem5 Developers } 207010037SARM gem5 Developers case 0x3: 207110037SARM gem5 Developers { 207210037SARM gem5 Developers if (bits(machInst, 30, 29) != 0x0 || 207310037SARM gem5 Developers (bits(machInst, 23, 21) != 0 && bits(machInst, 31) == 0)) 207410037SARM gem5 Developers return new Unknown64(machInst); 207510037SARM gem5 Developers IntRegIndex rd = (IntRegIndex)(uint8_t)bits(machInst, 4, 0); 207610337SAndrew.Bardsley@arm.com IntRegIndex rdzr = makeZero(rd); 207710037SARM gem5 Developers IntRegIndex rn = (IntRegIndex)(uint8_t)bits(machInst, 9, 5); 207810037SARM gem5 Developers IntRegIndex ra = (IntRegIndex)(uint8_t)bits(machInst, 14, 10); 207910037SARM gem5 Developers IntRegIndex rm = (IntRegIndex)(uint8_t)bits(machInst, 20, 16); 208010037SARM gem5 Developers switch (bits(machInst, 23, 21)) { 208110037SARM gem5 Developers case 0x0: 208210037SARM gem5 Developers if (bits(machInst, 15) == 0) 208310337SAndrew.Bardsley@arm.com return new Madd64(machInst, rdzr, ra, rn, rm); 208410037SARM gem5 Developers else 208510337SAndrew.Bardsley@arm.com return new Msub64(machInst, rdzr, ra, rn, rm); 208610037SARM gem5 Developers case 0x1: 208710037SARM gem5 Developers if (bits(machInst, 15) == 0) 208810337SAndrew.Bardsley@arm.com return new Smaddl64(machInst, rdzr, ra, rn, rm); 208910037SARM gem5 Developers else 209010337SAndrew.Bardsley@arm.com return new Smsubl64(machInst, rdzr, ra, rn, rm); 209110037SARM gem5 Developers case 0x2: 209210037SARM gem5 Developers if (bits(machInst, 15) != 0) 209310037SARM gem5 Developers return new Unknown64(machInst); 209410337SAndrew.Bardsley@arm.com return new Smulh64(machInst, rdzr, rn, rm); 209510037SARM gem5 Developers case 0x5: 209610037SARM gem5 Developers if (bits(machInst, 15) == 0) 209710337SAndrew.Bardsley@arm.com return new Umaddl64(machInst, rdzr, ra, rn, rm); 209810037SARM gem5 Developers else 209910337SAndrew.Bardsley@arm.com return new Umsubl64(machInst, rdzr, ra, rn, rm); 210010037SARM gem5 Developers case 0x6: 210110037SARM gem5 Developers if (bits(machInst, 15) != 0) 210210037SARM gem5 Developers return new Unknown64(machInst); 210310337SAndrew.Bardsley@arm.com return new Umulh64(machInst, rdzr, rn, rm); 210410037SARM gem5 Developers default: 210510037SARM gem5 Developers return new Unknown64(machInst); 210610037SARM gem5 Developers } 210710037SARM gem5 Developers } 210812595Ssiddhesh.poyarekar@gmail.com default: 210912595Ssiddhesh.poyarekar@gmail.com M5_UNREACHABLE; 211010037SARM gem5 Developers } 211110037SARM gem5 Developers return new FailUnimplemented("Unhandled Case2", machInst); 211210037SARM gem5 Developers } 211310037SARM gem5 Developers} 211410037SARM gem5 Developers}}; 211510037SARM gem5 Developers 211610037SARM gem5 Developersoutput decoder {{ 211710037SARM gem5 Developersnamespace Aarch64 211810037SARM gem5 Developers{ 211911165SRekai.GonzalezAlberquilla@arm.com template <typename DecoderFeatures> 212010037SARM gem5 Developers StaticInstPtr 212110037SARM gem5 Developers decodeAdvSIMD(ExtMachInst machInst) 212210037SARM gem5 Developers { 212310037SARM gem5 Developers if (bits(machInst, 24) == 1) { 212410037SARM gem5 Developers if (bits(machInst, 10) == 0) { 212511165SRekai.GonzalezAlberquilla@arm.com return decodeNeonIndexedElem<DecoderFeatures>(machInst); 212610037SARM gem5 Developers } else if (bits(machInst, 23) == 1) { 212710037SARM gem5 Developers return new Unknown64(machInst); 212810037SARM gem5 Developers } else { 212910037SARM gem5 Developers if (bits(machInst, 22, 19)) { 213010037SARM gem5 Developers return decodeNeonShiftByImm(machInst); 213110037SARM gem5 Developers } else { 213210037SARM gem5 Developers return decodeNeonModImm(machInst); 213310037SARM gem5 Developers } 213410037SARM gem5 Developers } 213510037SARM gem5 Developers } else if (bits(machInst, 21) == 1) { 213610037SARM gem5 Developers if (bits(machInst, 10) == 1) { 213711165SRekai.GonzalezAlberquilla@arm.com return decodeNeon3Same<DecoderFeatures>(machInst); 213810037SARM gem5 Developers } else if (bits(machInst, 11) == 0) { 213910037SARM gem5 Developers return decodeNeon3Diff(machInst); 214010037SARM gem5 Developers } else if (bits(machInst, 20, 17) == 0x0) { 214110037SARM gem5 Developers return decodeNeon2RegMisc(machInst); 214213171Sgiacomo.travaglini@arm.com } else if (bits(machInst, 20, 17) == 0x4) { 214313171Sgiacomo.travaglini@arm.com return decodeCryptoAES(machInst); 214410037SARM gem5 Developers } else if (bits(machInst, 20, 17) == 0x8) { 214510037SARM gem5 Developers return decodeNeonAcrossLanes(machInst); 214610037SARM gem5 Developers } else { 214710037SARM gem5 Developers return new Unknown64(machInst); 214810037SARM gem5 Developers } 214910037SARM gem5 Developers } else if (bits(machInst, 24) || 215010037SARM gem5 Developers bits(machInst, 21) || 215110037SARM gem5 Developers bits(machInst, 15)) { 215210037SARM gem5 Developers return new Unknown64(machInst); 215310037SARM gem5 Developers } else if (bits(machInst, 10) == 1) { 215410037SARM gem5 Developers if (bits(machInst, 23, 22)) 215510037SARM gem5 Developers return new Unknown64(machInst); 215610037SARM gem5 Developers return decodeNeonCopy(machInst); 215710037SARM gem5 Developers } else if (bits(machInst, 29) == 1) { 215810037SARM gem5 Developers return decodeNeonExt(machInst); 215910037SARM gem5 Developers } else if (bits(machInst, 11) == 1) { 216010037SARM gem5 Developers return decodeNeonZipUzpTrn(machInst); 216110037SARM gem5 Developers } else if (bits(machInst, 23, 22) == 0x0) { 216210037SARM gem5 Developers return decodeNeonTblTbx(machInst); 216310037SARM gem5 Developers } else { 216410037SARM gem5 Developers return new Unknown64(machInst); 216510037SARM gem5 Developers } 216610037SARM gem5 Developers return new FailUnimplemented("Unhandled Case3", machInst); 216710037SARM gem5 Developers } 216810037SARM gem5 Developers} 216910037SARM gem5 Developers}}; 217010037SARM gem5 Developers 217110037SARM gem5 Developers 217210037SARM gem5 Developersoutput decoder {{ 217310037SARM gem5 Developersnamespace Aarch64 217410037SARM gem5 Developers{ 217510037SARM gem5 Developers StaticInstPtr 217610037SARM gem5 Developers // bit 30=0, 28:25=1111 217710037SARM gem5 Developers decodeFp(ExtMachInst machInst) 217810037SARM gem5 Developers { 217910037SARM gem5 Developers if (bits(machInst, 24) == 1) { 218010037SARM gem5 Developers if (bits(machInst, 31) || bits(machInst, 29)) 218110037SARM gem5 Developers return new Unknown64(machInst); 218210037SARM gem5 Developers IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 4, 0); 218310037SARM gem5 Developers IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 9, 5); 218410037SARM gem5 Developers IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 20, 16); 218510037SARM gem5 Developers IntRegIndex ra = (IntRegIndex)(uint32_t)bits(machInst, 14, 10); 218610037SARM gem5 Developers uint8_t switchVal = (bits(machInst, 23, 21) << 1) | 218710037SARM gem5 Developers (bits(machInst, 15) << 0); 218810037SARM gem5 Developers switch (switchVal) { 218910037SARM gem5 Developers case 0x0: // FMADD Sd = Sa + Sn*Sm 219010037SARM gem5 Developers return new FMAddS(machInst, rd, rn, rm, ra); 219110037SARM gem5 Developers case 0x1: // FMSUB Sd = Sa + (-Sn)*Sm 219210037SARM gem5 Developers return new FMSubS(machInst, rd, rn, rm, ra); 219310037SARM gem5 Developers case 0x2: // FNMADD Sd = (-Sa) + (-Sn)*Sm 219410037SARM gem5 Developers return new FNMAddS(machInst, rd, rn, rm, ra); 219510037SARM gem5 Developers case 0x3: // FNMSUB Sd = (-Sa) + Sn*Sm 219610037SARM gem5 Developers return new FNMSubS(machInst, rd, rn, rm, ra); 219710037SARM gem5 Developers case 0x4: // FMADD Dd = Da + Dn*Dm 219810037SARM gem5 Developers return new FMAddD(machInst, rd, rn, rm, ra); 219910037SARM gem5 Developers case 0x5: // FMSUB Dd = Da + (-Dn)*Dm 220010037SARM gem5 Developers return new FMSubD(machInst, rd, rn, rm, ra); 220110037SARM gem5 Developers case 0x6: // FNMADD Dd = (-Da) + (-Dn)*Dm 220210037SARM gem5 Developers return new FNMAddD(machInst, rd, rn, rm, ra); 220310037SARM gem5 Developers case 0x7: // FNMSUB Dd = (-Da) + Dn*Dm 220410037SARM gem5 Developers return new FNMSubD(machInst, rd, rn, rm, ra); 220510037SARM gem5 Developers default: 220610037SARM gem5 Developers return new Unknown64(machInst); 220710037SARM gem5 Developers } 220810037SARM gem5 Developers } else if (bits(machInst, 21) == 0) { 220910037SARM gem5 Developers bool s = bits(machInst, 29); 221010037SARM gem5 Developers if (s) 221110037SARM gem5 Developers return new Unknown64(machInst); 221210037SARM gem5 Developers uint8_t switchVal = bits(machInst, 20, 16); 221310037SARM gem5 Developers uint8_t type = bits(machInst, 23, 22); 221410037SARM gem5 Developers uint8_t scale = bits(machInst, 15, 10); 221510037SARM gem5 Developers IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 4, 0); 221610037SARM gem5 Developers IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 9, 5); 221710037SARM gem5 Developers if (bits(machInst, 18, 17) == 3 && scale != 0) 221810037SARM gem5 Developers return new Unknown64(machInst); 221910037SARM gem5 Developers // 30:24=0011110, 21=0 222010037SARM gem5 Developers switch (switchVal) { 222110037SARM gem5 Developers case 0x00: 222210037SARM gem5 Developers return new FailUnimplemented("fcvtns", machInst); 222310037SARM gem5 Developers case 0x01: 222410037SARM gem5 Developers return new FailUnimplemented("fcvtnu", machInst); 222510037SARM gem5 Developers case 0x02: 222610037SARM gem5 Developers switch ( (bits(machInst, 31) << 2) | type ) { 222710037SARM gem5 Developers case 0: // SCVTF Sd = convertFromInt(Wn/(2^fbits)) 222810037SARM gem5 Developers return new FcvtSFixedFpSW(machInst, rd, rn, scale); 222910037SARM gem5 Developers case 1: // SCVTF Dd = convertFromInt(Wn/(2^fbits)) 223010037SARM gem5 Developers return new FcvtSFixedFpDW(machInst, rd, rn, scale); 223110037SARM gem5 Developers case 4: // SCVTF Sd = convertFromInt(Xn/(2^fbits)) 223210037SARM gem5 Developers return new FcvtSFixedFpSX(machInst, rd, rn, scale); 223310037SARM gem5 Developers case 5: // SCVTF Dd = convertFromInt(Xn/(2^fbits)) 223410037SARM gem5 Developers return new FcvtSFixedFpDX(machInst, rd, rn, scale); 223510037SARM gem5 Developers default: 223610037SARM gem5 Developers return new Unknown64(machInst); 223710037SARM gem5 Developers } 223810037SARM gem5 Developers case 0x03: 223910037SARM gem5 Developers switch ( (bits(machInst, 31) << 2) | type ) { 224010037SARM gem5 Developers case 0: // UCVTF Sd = convertFromInt(Wn/(2^fbits)) 224110037SARM gem5 Developers return new FcvtUFixedFpSW(machInst, rd, rn, scale); 224210037SARM gem5 Developers case 1: // UCVTF Dd = convertFromInt(Wn/(2^fbits)) 224310037SARM gem5 Developers return new FcvtUFixedFpDW(machInst, rd, rn, scale); 224410037SARM gem5 Developers case 4: // UCVTF Sd = convertFromInt(Xn/(2^fbits)) 224510037SARM gem5 Developers return new FcvtUFixedFpSX(machInst, rd, rn, scale); 224610037SARM gem5 Developers case 5: // UCVTF Dd = convertFromInt(Xn/(2^fbits)) 224710037SARM gem5 Developers return new FcvtUFixedFpDX(machInst, rd, rn, scale); 224810037SARM gem5 Developers default: 224910037SARM gem5 Developers return new Unknown64(machInst); 225010037SARM gem5 Developers } 225110037SARM gem5 Developers case 0x04: 225210037SARM gem5 Developers return new FailUnimplemented("fcvtas", machInst); 225310037SARM gem5 Developers case 0x05: 225410037SARM gem5 Developers return new FailUnimplemented("fcvtau", machInst); 225510037SARM gem5 Developers case 0x08: 225610037SARM gem5 Developers return new FailUnimplemented("fcvtps", machInst); 225710037SARM gem5 Developers case 0x09: 225810037SARM gem5 Developers return new FailUnimplemented("fcvtpu", machInst); 225910037SARM gem5 Developers case 0x0e: 226010037SARM gem5 Developers return new FailUnimplemented("fmov elem. to 64", machInst); 226110037SARM gem5 Developers case 0x0f: 226210037SARM gem5 Developers return new FailUnimplemented("fmov 64 bit", machInst); 226310037SARM gem5 Developers case 0x10: 226410037SARM gem5 Developers return new FailUnimplemented("fcvtms", machInst); 226510037SARM gem5 Developers case 0x11: 226610037SARM gem5 Developers return new FailUnimplemented("fcvtmu", machInst); 226710037SARM gem5 Developers case 0x18: 226810037SARM gem5 Developers switch ( (bits(machInst, 31) << 2) | type ) { 226910037SARM gem5 Developers case 0: // FCVTZS Wd = convertToIntExactTowardZero(Sn*(2^fbits)) 227010037SARM gem5 Developers return new FcvtFpSFixedSW(machInst, rd, rn, scale); 227110037SARM gem5 Developers case 1: // FCVTZS Wd = convertToIntExactTowardZero(Dn*(2^fbits)) 227210037SARM gem5 Developers return new FcvtFpSFixedDW(machInst, rd, rn, scale); 227310037SARM gem5 Developers case 4: // FCVTZS Xd = convertToIntExactTowardZero(Sn*(2^fbits)) 227410037SARM gem5 Developers return new FcvtFpSFixedSX(machInst, rd, rn, scale); 227510037SARM gem5 Developers case 5: // FCVTZS Xd = convertToIntExactTowardZero(Dn*(2^fbits)) 227610037SARM gem5 Developers return new FcvtFpSFixedDX(machInst, rd, rn, scale); 227710037SARM gem5 Developers default: 227810037SARM gem5 Developers return new Unknown64(machInst); 227910037SARM gem5 Developers } 228010037SARM gem5 Developers case 0x19: 228110037SARM gem5 Developers switch ( (bits(machInst, 31) << 2) | type ) { 228210037SARM gem5 Developers case 0: // FCVTZU Wd = convertToIntExactTowardZero(Sn*(2^fbits)) 228310037SARM gem5 Developers return new FcvtFpUFixedSW(machInst, rd, rn, scale); 228410037SARM gem5 Developers case 1: // FCVTZU Wd = convertToIntExactTowardZero(Dn*(2^fbits)) 228510037SARM gem5 Developers return new FcvtFpUFixedDW(machInst, rd, rn, scale); 228610037SARM gem5 Developers case 4: // FCVTZU Xd = convertToIntExactTowardZero(Sn*(2^fbits)) 228710037SARM gem5 Developers return new FcvtFpUFixedSX(machInst, rd, rn, scale); 228810037SARM gem5 Developers case 5: // FCVTZU Xd = convertToIntExactTowardZero(Dn*(2^fbits)) 228910037SARM gem5 Developers return new FcvtFpUFixedDX(machInst, rd, rn, scale); 229010037SARM gem5 Developers default: 229110037SARM gem5 Developers return new Unknown64(machInst); 229210037SARM gem5 Developers } 229312595Ssiddhesh.poyarekar@gmail.com default: 229412595Ssiddhesh.poyarekar@gmail.com return new Unknown64(machInst); 229510037SARM gem5 Developers } 229610037SARM gem5 Developers } else { 229710037SARM gem5 Developers // 30=0, 28:24=11110, 21=1 229810037SARM gem5 Developers uint8_t type = bits(machInst, 23, 22); 229910037SARM gem5 Developers uint8_t imm8 = bits(machInst, 20, 13); 230010037SARM gem5 Developers IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 4, 0); 230110037SARM gem5 Developers IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 9, 5); 230210037SARM gem5 Developers switch (bits(machInst, 11, 10)) { 230310037SARM gem5 Developers case 0x0: 230410037SARM gem5 Developers if (bits(machInst, 12) == 1) { 230510037SARM gem5 Developers if (bits(machInst, 31) || 230610037SARM gem5 Developers bits(machInst, 29) || 230710037SARM gem5 Developers bits(machInst, 9, 5)) { 230810037SARM gem5 Developers return new Unknown64(machInst); 230910037SARM gem5 Developers } 231010037SARM gem5 Developers // 31:29=000, 28:24=11110, 21=1, 12:10=100 231110037SARM gem5 Developers if (type == 0) { 231210037SARM gem5 Developers // FMOV S[d] = imm8<7>:NOT(imm8<6>):Replicate(imm8<6>,5) 231310037SARM gem5 Developers // :imm8<5:0>:Zeros(19) 231413120SEdmund.Grimley-Evans@arm.com uint32_t imm = vfp_modified_imm(imm8, 231513120SEdmund.Grimley-Evans@arm.com FpDataType::Fp32); 231610037SARM gem5 Developers return new FmovImmS(machInst, rd, imm); 231710037SARM gem5 Developers } else if (type == 1) { 231810037SARM gem5 Developers // FMOV D[d] = imm8<7>:NOT(imm8<6>):Replicate(imm8<6>,8) 231910037SARM gem5 Developers // :imm8<5:0>:Zeros(48) 232013120SEdmund.Grimley-Evans@arm.com uint64_t imm = vfp_modified_imm(imm8, 232113120SEdmund.Grimley-Evans@arm.com FpDataType::Fp64); 232210037SARM gem5 Developers return new FmovImmD(machInst, rd, imm); 232310037SARM gem5 Developers } else { 232410037SARM gem5 Developers return new Unknown64(machInst); 232510037SARM gem5 Developers } 232610037SARM gem5 Developers } else if (bits(machInst, 13) == 1) { 232710037SARM gem5 Developers if (bits(machInst, 31) || 232810037SARM gem5 Developers bits(machInst, 29) || 232910037SARM gem5 Developers bits(machInst, 15, 14) || 233010037SARM gem5 Developers bits(machInst, 23) || 233110037SARM gem5 Developers bits(machInst, 2, 0)) { 233210037SARM gem5 Developers return new Unknown64(machInst); 233310037SARM gem5 Developers } 233410037SARM gem5 Developers uint8_t switchVal = (bits(machInst, 4, 3) << 0) | 233510037SARM gem5 Developers (bits(machInst, 22) << 2); 233610037SARM gem5 Developers IntRegIndex rm = (IntRegIndex)(uint32_t) 233710037SARM gem5 Developers bits(machInst, 20, 16); 233810037SARM gem5 Developers // 28:23=000111100, 21=1, 15:10=001000, 2:0=000 233910037SARM gem5 Developers switch (switchVal) { 234010037SARM gem5 Developers case 0x0: 234110037SARM gem5 Developers // FCMP flags = compareQuiet(Sn,Sm) 234210037SARM gem5 Developers return new FCmpRegS(machInst, rn, rm); 234310037SARM gem5 Developers case 0x1: 234410037SARM gem5 Developers // FCMP flags = compareQuiet(Sn,0.0) 234510037SARM gem5 Developers return new FCmpImmS(machInst, rn, 0); 234610037SARM gem5 Developers case 0x2: 234710037SARM gem5 Developers // FCMPE flags = compareSignaling(Sn,Sm) 234810037SARM gem5 Developers return new FCmpERegS(machInst, rn, rm); 234910037SARM gem5 Developers case 0x3: 235010037SARM gem5 Developers // FCMPE flags = compareSignaling(Sn,0.0) 235110037SARM gem5 Developers return new FCmpEImmS(machInst, rn, 0); 235210037SARM gem5 Developers case 0x4: 235310037SARM gem5 Developers // FCMP flags = compareQuiet(Dn,Dm) 235410037SARM gem5 Developers return new FCmpRegD(machInst, rn, rm); 235510037SARM gem5 Developers case 0x5: 235610037SARM gem5 Developers // FCMP flags = compareQuiet(Dn,0.0) 235710037SARM gem5 Developers return new FCmpImmD(machInst, rn, 0); 235810037SARM gem5 Developers case 0x6: 235910037SARM gem5 Developers // FCMPE flags = compareSignaling(Dn,Dm) 236010037SARM gem5 Developers return new FCmpERegD(machInst, rn, rm); 236110037SARM gem5 Developers case 0x7: 236210037SARM gem5 Developers // FCMPE flags = compareSignaling(Dn,0.0) 236310037SARM gem5 Developers return new FCmpEImmD(machInst, rn, 0); 236410037SARM gem5 Developers default: 236510037SARM gem5 Developers return new Unknown64(machInst); 236610037SARM gem5 Developers } 236710037SARM gem5 Developers } else if (bits(machInst, 14) == 1) { 236810037SARM gem5 Developers if (bits(machInst, 31) || bits(machInst, 29)) 236910037SARM gem5 Developers return new Unknown64(machInst); 237010037SARM gem5 Developers uint8_t opcode = bits(machInst, 20, 15); 237110037SARM gem5 Developers // Bits 31:24=00011110, 21=1, 14:10=10000 237210037SARM gem5 Developers switch (opcode) { 237310037SARM gem5 Developers case 0x0: 237410037SARM gem5 Developers if (type == 0) 237510037SARM gem5 Developers // FMOV Sd = Sn 237610037SARM gem5 Developers return new FmovRegS(machInst, rd, rn); 237710037SARM gem5 Developers else if (type == 1) 237810037SARM gem5 Developers // FMOV Dd = Dn 237910037SARM gem5 Developers return new FmovRegD(machInst, rd, rn); 238010037SARM gem5 Developers break; 238110037SARM gem5 Developers case 0x1: 238210037SARM gem5 Developers if (type == 0) 238310037SARM gem5 Developers // FABS Sd = abs(Sn) 238410037SARM gem5 Developers return new FAbsS(machInst, rd, rn); 238510037SARM gem5 Developers else if (type == 1) 238610037SARM gem5 Developers // FABS Dd = abs(Dn) 238710037SARM gem5 Developers return new FAbsD(machInst, rd, rn); 238810037SARM gem5 Developers break; 238910037SARM gem5 Developers case 0x2: 239010037SARM gem5 Developers if (type == 0) 239110037SARM gem5 Developers // FNEG Sd = -Sn 239210037SARM gem5 Developers return new FNegS(machInst, rd, rn); 239310037SARM gem5 Developers else if (type == 1) 239410037SARM gem5 Developers // FNEG Dd = -Dn 239510037SARM gem5 Developers return new FNegD(machInst, rd, rn); 239610037SARM gem5 Developers break; 239710037SARM gem5 Developers case 0x3: 239810037SARM gem5 Developers if (type == 0) 239910037SARM gem5 Developers // FSQRT Sd = sqrt(Sn) 240010037SARM gem5 Developers return new FSqrtS(machInst, rd, rn); 240110037SARM gem5 Developers else if (type == 1) 240210037SARM gem5 Developers // FSQRT Dd = sqrt(Dn) 240310037SARM gem5 Developers return new FSqrtD(machInst, rd, rn); 240410037SARM gem5 Developers break; 240510037SARM gem5 Developers case 0x4: 240610037SARM gem5 Developers if (type == 1) 240710037SARM gem5 Developers // FCVT Sd = convertFormat(Dn) 240810037SARM gem5 Developers return new FcvtFpDFpS(machInst, rd, rn); 240910037SARM gem5 Developers else if (type == 3) 241010037SARM gem5 Developers // FCVT Sd = convertFormat(Hn) 241110037SARM gem5 Developers return new FcvtFpHFpS(machInst, rd, rn); 241210037SARM gem5 Developers break; 241310037SARM gem5 Developers case 0x5: 241410037SARM gem5 Developers if (type == 0) 241510037SARM gem5 Developers // FCVT Dd = convertFormat(Sn) 241610037SARM gem5 Developers return new FCvtFpSFpD(machInst, rd, rn); 241710037SARM gem5 Developers else if (type == 3) 241810037SARM gem5 Developers // FCVT Dd = convertFormat(Hn) 241910037SARM gem5 Developers return new FcvtFpHFpD(machInst, rd, rn); 242010037SARM gem5 Developers break; 242110037SARM gem5 Developers case 0x7: 242210037SARM gem5 Developers if (type == 0) 242310037SARM gem5 Developers // FCVT Hd = convertFormat(Sn) 242410037SARM gem5 Developers return new FcvtFpSFpH(machInst, rd, rn); 242510037SARM gem5 Developers else if (type == 1) 242610037SARM gem5 Developers // FCVT Hd = convertFormat(Dn) 242710037SARM gem5 Developers return new FcvtFpDFpH(machInst, rd, rn); 242810037SARM gem5 Developers break; 242910037SARM gem5 Developers case 0x8: 243010037SARM gem5 Developers if (type == 0) // FRINTN Sd = roundToIntegralTiesToEven(Sn) 243110037SARM gem5 Developers return new FRIntNS(machInst, rd, rn); 243210037SARM gem5 Developers else if (type == 1) // FRINTN Dd = roundToIntegralTiesToEven(Dn) 243310037SARM gem5 Developers return new FRIntND(machInst, rd, rn); 243410037SARM gem5 Developers break; 243510037SARM gem5 Developers case 0x9: 243610037SARM gem5 Developers if (type == 0) // FRINTP Sd = roundToIntegralTowardPlusInf(Sn) 243710037SARM gem5 Developers return new FRIntPS(machInst, rd, rn); 243810037SARM gem5 Developers else if (type == 1) // FRINTP Dd = roundToIntegralTowardPlusInf(Dn) 243910037SARM gem5 Developers return new FRIntPD(machInst, rd, rn); 244010037SARM gem5 Developers break; 244110037SARM gem5 Developers case 0xa: 244210037SARM gem5 Developers if (type == 0) // FRINTM Sd = roundToIntegralTowardMinusInf(Sn) 244310037SARM gem5 Developers return new FRIntMS(machInst, rd, rn); 244410037SARM gem5 Developers else if (type == 1) // FRINTM Dd = roundToIntegralTowardMinusInf(Dn) 244510037SARM gem5 Developers return new FRIntMD(machInst, rd, rn); 244610037SARM gem5 Developers break; 244710037SARM gem5 Developers case 0xb: 244810037SARM gem5 Developers if (type == 0) // FRINTZ Sd = roundToIntegralTowardZero(Sn) 244910037SARM gem5 Developers return new FRIntZS(machInst, rd, rn); 245010037SARM gem5 Developers else if (type == 1) // FRINTZ Dd = roundToIntegralTowardZero(Dn) 245110037SARM gem5 Developers return new FRIntZD(machInst, rd, rn); 245210037SARM gem5 Developers break; 245310037SARM gem5 Developers case 0xc: 245410037SARM gem5 Developers if (type == 0) // FRINTA Sd = roundToIntegralTiesToAway(Sn) 245510037SARM gem5 Developers return new FRIntAS(machInst, rd, rn); 245610037SARM gem5 Developers else if (type == 1) // FRINTA Dd = roundToIntegralTiesToAway(Dn) 245710037SARM gem5 Developers return new FRIntAD(machInst, rd, rn); 245810037SARM gem5 Developers break; 245910037SARM gem5 Developers case 0xe: 246010037SARM gem5 Developers if (type == 0) // FRINTX Sd = roundToIntegralExact(Sn) 246110037SARM gem5 Developers return new FRIntXS(machInst, rd, rn); 246210037SARM gem5 Developers else if (type == 1) // FRINTX Dd = roundToIntegralExact(Dn) 246310037SARM gem5 Developers return new FRIntXD(machInst, rd, rn); 246410037SARM gem5 Developers break; 246510037SARM gem5 Developers case 0xf: 246610037SARM gem5 Developers if (type == 0) // FRINTI Sd = roundToIntegral(Sn) 246710037SARM gem5 Developers return new FRIntIS(machInst, rd, rn); 246810037SARM gem5 Developers else if (type == 1) // FRINTI Dd = roundToIntegral(Dn) 246910037SARM gem5 Developers return new FRIntID(machInst, rd, rn); 247010037SARM gem5 Developers break; 247110037SARM gem5 Developers default: 247210037SARM gem5 Developers return new Unknown64(machInst); 247310037SARM gem5 Developers } 247410037SARM gem5 Developers return new Unknown64(machInst); 247510037SARM gem5 Developers } else if (bits(machInst, 15) == 1) { 247610037SARM gem5 Developers return new Unknown64(machInst); 247710037SARM gem5 Developers } else { 247810037SARM gem5 Developers if (bits(machInst, 29)) 247910037SARM gem5 Developers return new Unknown64(machInst); 248010037SARM gem5 Developers uint8_t rmode = bits(machInst, 20, 19); 248110037SARM gem5 Developers uint8_t switchVal1 = bits(machInst, 18, 16); 248210037SARM gem5 Developers uint8_t switchVal2 = (type << 1) | bits(machInst, 31); 248310037SARM gem5 Developers // 30:24=0011110, 21=1, 15:10=000000 248410037SARM gem5 Developers switch (switchVal1) { 248510037SARM gem5 Developers case 0x0: 248610037SARM gem5 Developers switch ((switchVal2 << 2) | rmode) { 248710037SARM gem5 Developers case 0x0: //FCVTNS Wd = convertToIntExactTiesToEven(Sn) 248810037SARM gem5 Developers return new FcvtFpSIntWSN(machInst, rd, rn); 248910037SARM gem5 Developers case 0x1: //FCVTPS Wd = convertToIntExactTowardPlusInf(Sn) 249010037SARM gem5 Developers return new FcvtFpSIntWSP(machInst, rd, rn); 249110037SARM gem5 Developers case 0x2: //FCVTMS Wd = convertToIntExactTowardMinusInf(Sn) 249210037SARM gem5 Developers return new FcvtFpSIntWSM(machInst, rd, rn); 249310037SARM gem5 Developers case 0x3: //FCVTZS Wd = convertToIntExactTowardZero(Sn) 249410037SARM gem5 Developers return new FcvtFpSIntWSZ(machInst, rd, rn); 249510037SARM gem5 Developers case 0x4: //FCVTNS Xd = convertToIntExactTiesToEven(Sn) 249610037SARM gem5 Developers return new FcvtFpSIntXSN(machInst, rd, rn); 249710037SARM gem5 Developers case 0x5: //FCVTPS Xd = convertToIntExactTowardPlusInf(Sn) 249810037SARM gem5 Developers return new FcvtFpSIntXSP(machInst, rd, rn); 249910037SARM gem5 Developers case 0x6: //FCVTMS Xd = convertToIntExactTowardMinusInf(Sn) 250010037SARM gem5 Developers return new FcvtFpSIntXSM(machInst, rd, rn); 250110037SARM gem5 Developers case 0x7: //FCVTZS Xd = convertToIntExactTowardZero(Sn) 250210037SARM gem5 Developers return new FcvtFpSIntXSZ(machInst, rd, rn); 250310037SARM gem5 Developers case 0x8: //FCVTNS Wd = convertToIntExactTiesToEven(Dn) 250410037SARM gem5 Developers return new FcvtFpSIntWDN(machInst, rd, rn); 250510037SARM gem5 Developers case 0x9: //FCVTPS Wd = convertToIntExactTowardPlusInf(Dn) 250610037SARM gem5 Developers return new FcvtFpSIntWDP(machInst, rd, rn); 250710037SARM gem5 Developers case 0xA: //FCVTMS Wd = convertToIntExactTowardMinusInf(Dn) 250810037SARM gem5 Developers return new FcvtFpSIntWDM(machInst, rd, rn); 250910037SARM gem5 Developers case 0xB: //FCVTZS Wd = convertToIntExactTowardZero(Dn) 251010037SARM gem5 Developers return new FcvtFpSIntWDZ(machInst, rd, rn); 251110037SARM gem5 Developers case 0xC: //FCVTNS Xd = convertToIntExactTiesToEven(Dn) 251210037SARM gem5 Developers return new FcvtFpSIntXDN(machInst, rd, rn); 251310037SARM gem5 Developers case 0xD: //FCVTPS Xd = convertToIntExactTowardPlusInf(Dn) 251410037SARM gem5 Developers return new FcvtFpSIntXDP(machInst, rd, rn); 251510037SARM gem5 Developers case 0xE: //FCVTMS Xd = convertToIntExactTowardMinusInf(Dn) 251610037SARM gem5 Developers return new FcvtFpSIntXDM(machInst, rd, rn); 251710037SARM gem5 Developers case 0xF: //FCVTZS Xd = convertToIntExactTowardZero(Dn) 251810037SARM gem5 Developers return new FcvtFpSIntXDZ(machInst, rd, rn); 251910037SARM gem5 Developers default: 252010037SARM gem5 Developers return new Unknown64(machInst); 252110037SARM gem5 Developers } 252210037SARM gem5 Developers case 0x1: 252310037SARM gem5 Developers switch ((switchVal2 << 2) | rmode) { 252410037SARM gem5 Developers case 0x0: //FCVTNU Wd = convertToIntExactTiesToEven(Sn) 252510037SARM gem5 Developers return new FcvtFpUIntWSN(machInst, rd, rn); 252610037SARM gem5 Developers case 0x1: //FCVTPU Wd = convertToIntExactTowardPlusInf(Sn) 252710037SARM gem5 Developers return new FcvtFpUIntWSP(machInst, rd, rn); 252810037SARM gem5 Developers case 0x2: //FCVTMU Wd = convertToIntExactTowardMinusInf(Sn) 252910037SARM gem5 Developers return new FcvtFpUIntWSM(machInst, rd, rn); 253010037SARM gem5 Developers case 0x3: //FCVTZU Wd = convertToIntExactTowardZero(Sn) 253110037SARM gem5 Developers return new FcvtFpUIntWSZ(machInst, rd, rn); 253210037SARM gem5 Developers case 0x4: //FCVTNU Xd = convertToIntExactTiesToEven(Sn) 253310037SARM gem5 Developers return new FcvtFpUIntXSN(machInst, rd, rn); 253410037SARM gem5 Developers case 0x5: //FCVTPU Xd = convertToIntExactTowardPlusInf(Sn) 253510037SARM gem5 Developers return new FcvtFpUIntXSP(machInst, rd, rn); 253610037SARM gem5 Developers case 0x6: //FCVTMU Xd = convertToIntExactTowardMinusInf(Sn) 253710037SARM gem5 Developers return new FcvtFpUIntXSM(machInst, rd, rn); 253810037SARM gem5 Developers case 0x7: //FCVTZU Xd = convertToIntExactTowardZero(Sn) 253910037SARM gem5 Developers return new FcvtFpUIntXSZ(machInst, rd, rn); 254010037SARM gem5 Developers case 0x8: //FCVTNU Wd = convertToIntExactTiesToEven(Dn) 254110037SARM gem5 Developers return new FcvtFpUIntWDN(machInst, rd, rn); 254210037SARM gem5 Developers case 0x9: //FCVTPU Wd = convertToIntExactTowardPlusInf(Dn) 254310037SARM gem5 Developers return new FcvtFpUIntWDP(machInst, rd, rn); 254410037SARM gem5 Developers case 0xA: //FCVTMU Wd = convertToIntExactTowardMinusInf(Dn) 254510037SARM gem5 Developers return new FcvtFpUIntWDM(machInst, rd, rn); 254610037SARM gem5 Developers case 0xB: //FCVTZU Wd = convertToIntExactTowardZero(Dn) 254710037SARM gem5 Developers return new FcvtFpUIntWDZ(machInst, rd, rn); 254810037SARM gem5 Developers case 0xC: //FCVTNU Xd = convertToIntExactTiesToEven(Dn) 254910037SARM gem5 Developers return new FcvtFpUIntXDN(machInst, rd, rn); 255010037SARM gem5 Developers case 0xD: //FCVTPU Xd = convertToIntExactTowardPlusInf(Dn) 255110037SARM gem5 Developers return new FcvtFpUIntXDP(machInst, rd, rn); 255210037SARM gem5 Developers case 0xE: //FCVTMU Xd = convertToIntExactTowardMinusInf(Dn) 255310037SARM gem5 Developers return new FcvtFpUIntXDM(machInst, rd, rn); 255410037SARM gem5 Developers case 0xF: //FCVTZU Xd = convertToIntExactTowardZero(Dn) 255510037SARM gem5 Developers return new FcvtFpUIntXDZ(machInst, rd, rn); 255610037SARM gem5 Developers default: 255710037SARM gem5 Developers return new Unknown64(machInst); 255810037SARM gem5 Developers } 255910037SARM gem5 Developers case 0x2: 256010037SARM gem5 Developers if (rmode != 0) 256110037SARM gem5 Developers return new Unknown64(machInst); 256210037SARM gem5 Developers switch (switchVal2) { 256310037SARM gem5 Developers case 0: // SCVTF Sd = convertFromInt(Wn) 256410037SARM gem5 Developers return new FcvtWSIntFpS(machInst, rd, rn); 256510037SARM gem5 Developers case 1: // SCVTF Sd = convertFromInt(Xn) 256610037SARM gem5 Developers return new FcvtXSIntFpS(machInst, rd, rn); 256710037SARM gem5 Developers case 2: // SCVTF Dd = convertFromInt(Wn) 256810037SARM gem5 Developers return new FcvtWSIntFpD(machInst, rd, rn); 256910037SARM gem5 Developers case 3: // SCVTF Dd = convertFromInt(Xn) 257010037SARM gem5 Developers return new FcvtXSIntFpD(machInst, rd, rn); 257110037SARM gem5 Developers default: 257210037SARM gem5 Developers return new Unknown64(machInst); 257310037SARM gem5 Developers } 257410037SARM gem5 Developers case 0x3: 257510037SARM gem5 Developers switch (switchVal2) { 257610037SARM gem5 Developers case 0: // UCVTF Sd = convertFromInt(Wn) 257710037SARM gem5 Developers return new FcvtWUIntFpS(machInst, rd, rn); 257810037SARM gem5 Developers case 1: // UCVTF Sd = convertFromInt(Xn) 257910037SARM gem5 Developers return new FcvtXUIntFpS(machInst, rd, rn); 258010037SARM gem5 Developers case 2: // UCVTF Dd = convertFromInt(Wn) 258110037SARM gem5 Developers return new FcvtWUIntFpD(machInst, rd, rn); 258210037SARM gem5 Developers case 3: // UCVTF Dd = convertFromInt(Xn) 258310037SARM gem5 Developers return new FcvtXUIntFpD(machInst, rd, rn); 258410037SARM gem5 Developers default: 258510037SARM gem5 Developers return new Unknown64(machInst); 258610037SARM gem5 Developers } 258710037SARM gem5 Developers case 0x4: 258810037SARM gem5 Developers if (rmode != 0) 258910037SARM gem5 Developers return new Unknown64(machInst); 259010037SARM gem5 Developers switch (switchVal2) { 259110037SARM gem5 Developers case 0: // FCVTAS Wd = convertToIntExactTiesToAway(Sn) 259210037SARM gem5 Developers return new FcvtFpSIntWSA(machInst, rd, rn); 259310037SARM gem5 Developers case 1: // FCVTAS Xd = convertToIntExactTiesToAway(Sn) 259410037SARM gem5 Developers return new FcvtFpSIntXSA(machInst, rd, rn); 259510037SARM gem5 Developers case 2: // FCVTAS Wd = convertToIntExactTiesToAway(Dn) 259610037SARM gem5 Developers return new FcvtFpSIntWDA(machInst, rd, rn); 259710037SARM gem5 Developers case 3: // FCVTAS Wd = convertToIntExactTiesToAway(Dn) 259810037SARM gem5 Developers return new FcvtFpSIntXDA(machInst, rd, rn); 259910037SARM gem5 Developers default: 260010037SARM gem5 Developers return new Unknown64(machInst); 260110037SARM gem5 Developers } 260210037SARM gem5 Developers case 0x5: 260310037SARM gem5 Developers switch (switchVal2) { 260410037SARM gem5 Developers case 0: // FCVTAU Wd = convertToIntExactTiesToAway(Sn) 260510037SARM gem5 Developers return new FcvtFpUIntWSA(machInst, rd, rn); 260610037SARM gem5 Developers case 1: // FCVTAU Xd = convertToIntExactTiesToAway(Sn) 260710037SARM gem5 Developers return new FcvtFpUIntXSA(machInst, rd, rn); 260810037SARM gem5 Developers case 2: // FCVTAU Wd = convertToIntExactTiesToAway(Dn) 260910037SARM gem5 Developers return new FcvtFpUIntWDA(machInst, rd, rn); 261010037SARM gem5 Developers case 3: // FCVTAU Xd = convertToIntExactTiesToAway(Dn) 261110037SARM gem5 Developers return new FcvtFpUIntXDA(machInst, rd, rn); 261210037SARM gem5 Developers default: 261310037SARM gem5 Developers return new Unknown64(machInst); 261410037SARM gem5 Developers } 261510037SARM gem5 Developers case 0x06: 261610037SARM gem5 Developers switch (switchVal2) { 261710037SARM gem5 Developers case 0: // FMOV Wd = Sn 261810037SARM gem5 Developers if (rmode != 0) 261910037SARM gem5 Developers return new Unknown64(machInst); 262010037SARM gem5 Developers return new FmovRegCoreW(machInst, rd, rn); 262110037SARM gem5 Developers case 3: // FMOV Xd = Dn 262210037SARM gem5 Developers if (rmode != 0) 262310037SARM gem5 Developers return new Unknown64(machInst); 262410037SARM gem5 Developers return new FmovRegCoreX(machInst, rd, rn); 262510037SARM gem5 Developers case 5: // FMOV Xd = Vn<127:64> 262610037SARM gem5 Developers if (rmode != 1) 262710037SARM gem5 Developers return new Unknown64(machInst); 262810037SARM gem5 Developers return new FmovURegCoreX(machInst, rd, rn); 262910037SARM gem5 Developers default: 263010037SARM gem5 Developers return new Unknown64(machInst); 263110037SARM gem5 Developers } 263210037SARM gem5 Developers break; 263310037SARM gem5 Developers case 0x07: 263410037SARM gem5 Developers switch (switchVal2) { 263510037SARM gem5 Developers case 0: // FMOV Sd = Wn 263610037SARM gem5 Developers if (rmode != 0) 263710037SARM gem5 Developers return new Unknown64(machInst); 263810037SARM gem5 Developers return new FmovCoreRegW(machInst, rd, rn); 263910037SARM gem5 Developers case 3: // FMOV Xd = Dn 264010037SARM gem5 Developers if (rmode != 0) 264110037SARM gem5 Developers return new Unknown64(machInst); 264210037SARM gem5 Developers return new FmovCoreRegX(machInst, rd, rn); 264310037SARM gem5 Developers case 5: // FMOV Xd = Vn<127:64> 264410037SARM gem5 Developers if (rmode != 1) 264510037SARM gem5 Developers return new Unknown64(machInst); 264610037SARM gem5 Developers return new FmovUCoreRegX(machInst, rd, rn); 264710037SARM gem5 Developers default: 264810037SARM gem5 Developers return new Unknown64(machInst); 264910037SARM gem5 Developers } 265010037SARM gem5 Developers break; 265110037SARM gem5 Developers default: // Warning! missing cases in switch statement above, that still need to be added 265210037SARM gem5 Developers return new Unknown64(machInst); 265310037SARM gem5 Developers } 265410037SARM gem5 Developers } 265512597Schunchenhsu@google.com M5_UNREACHABLE; 265610037SARM gem5 Developers case 0x1: 265710037SARM gem5 Developers { 265810037SARM gem5 Developers if (bits(machInst, 31) || 265910037SARM gem5 Developers bits(machInst, 29) || 266010037SARM gem5 Developers bits(machInst, 23)) { 266110037SARM gem5 Developers return new Unknown64(machInst); 266210037SARM gem5 Developers } 266310037SARM gem5 Developers IntRegIndex rm = (IntRegIndex)(uint32_t) bits(machInst, 20, 16); 266410037SARM gem5 Developers IntRegIndex rn = (IntRegIndex)(uint32_t) bits(machInst, 9, 5); 266510037SARM gem5 Developers uint8_t imm = (IntRegIndex)(uint32_t) bits(machInst, 3, 0); 266610037SARM gem5 Developers ConditionCode cond = 266710037SARM gem5 Developers (ConditionCode)(uint8_t)(bits(machInst, 15, 12)); 266810037SARM gem5 Developers uint8_t switchVal = (bits(machInst, 4) << 0) | 266910037SARM gem5 Developers (bits(machInst, 22) << 1); 267010037SARM gem5 Developers // 31:23=000111100, 21=1, 11:10=01 267110037SARM gem5 Developers switch (switchVal) { 267210037SARM gem5 Developers case 0x0: 267310037SARM gem5 Developers // FCCMP flags = if cond the compareQuiet(Sn,Sm) else #nzcv 267410037SARM gem5 Developers return new FCCmpRegS(machInst, rn, rm, cond, imm); 267510037SARM gem5 Developers case 0x1: 267610037SARM gem5 Developers // FCCMP flags = if cond then compareSignaling(Sn,Sm) 267710037SARM gem5 Developers // else #nzcv 267810037SARM gem5 Developers return new FCCmpERegS(machInst, rn, rm, cond, imm); 267910037SARM gem5 Developers case 0x2: 268010037SARM gem5 Developers // FCCMP flags = if cond then compareQuiet(Dn,Dm) else #nzcv 268110037SARM gem5 Developers return new FCCmpRegD(machInst, rn, rm, cond, imm); 268210037SARM gem5 Developers case 0x3: 268310037SARM gem5 Developers // FCCMP flags = if cond then compareSignaling(Dn,Dm) 268410037SARM gem5 Developers // else #nzcv 268510037SARM gem5 Developers return new FCCmpERegD(machInst, rn, rm, cond, imm); 268610037SARM gem5 Developers default: 268710037SARM gem5 Developers return new Unknown64(machInst); 268810037SARM gem5 Developers } 268910037SARM gem5 Developers } 269010037SARM gem5 Developers case 0x2: 269110037SARM gem5 Developers { 269210037SARM gem5 Developers if (bits(machInst, 31) || 269310037SARM gem5 Developers bits(machInst, 29) || 269410037SARM gem5 Developers bits(machInst, 23)) { 269510037SARM gem5 Developers return new Unknown64(machInst); 269610037SARM gem5 Developers } 269710037SARM gem5 Developers IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 4, 0); 269810037SARM gem5 Developers IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 9, 5); 269910037SARM gem5 Developers IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 20, 16); 270010037SARM gem5 Developers uint8_t switchVal = (bits(machInst, 15, 12) << 0) | 270110037SARM gem5 Developers (bits(machInst, 22) << 4); 270210037SARM gem5 Developers switch (switchVal) { 270310037SARM gem5 Developers case 0x00: // FMUL Sd = Sn * Sm 270410037SARM gem5 Developers return new FMulS(machInst, rd, rn, rm); 270510037SARM gem5 Developers case 0x10: // FMUL Dd = Dn * Dm 270610037SARM gem5 Developers return new FMulD(machInst, rd, rn, rm); 270710037SARM gem5 Developers case 0x01: // FDIV Sd = Sn / Sm 270810037SARM gem5 Developers return new FDivS(machInst, rd, rn, rm); 270910037SARM gem5 Developers case 0x11: // FDIV Dd = Dn / Dm 271010037SARM gem5 Developers return new FDivD(machInst, rd, rn, rm); 271110037SARM gem5 Developers case 0x02: // FADD Sd = Sn + Sm 271210037SARM gem5 Developers return new FAddS(machInst, rd, rn, rm); 271310037SARM gem5 Developers case 0x12: // FADD Dd = Dn + Dm 271410037SARM gem5 Developers return new FAddD(machInst, rd, rn, rm); 271510037SARM gem5 Developers case 0x03: // FSUB Sd = Sn - Sm 271610037SARM gem5 Developers return new FSubS(machInst, rd, rn, rm); 271710037SARM gem5 Developers case 0x13: // FSUB Dd = Dn - Dm 271810037SARM gem5 Developers return new FSubD(machInst, rd, rn, rm); 271910037SARM gem5 Developers case 0x04: // FMAX Sd = max(Sn, Sm) 272010037SARM gem5 Developers return new FMaxS(machInst, rd, rn, rm); 272110037SARM gem5 Developers case 0x14: // FMAX Dd = max(Dn, Dm) 272210037SARM gem5 Developers return new FMaxD(machInst, rd, rn, rm); 272310037SARM gem5 Developers case 0x05: // FMIN Sd = min(Sn, Sm) 272410037SARM gem5 Developers return new FMinS(machInst, rd, rn, rm); 272510037SARM gem5 Developers case 0x15: // FMIN Dd = min(Dn, Dm) 272610037SARM gem5 Developers return new FMinD(machInst, rd, rn, rm); 272710037SARM gem5 Developers case 0x06: // FMAXNM Sd = maxNum(Sn, Sm) 272810037SARM gem5 Developers return new FMaxNMS(machInst, rd, rn, rm); 272910037SARM gem5 Developers case 0x16: // FMAXNM Dd = maxNum(Dn, Dm) 273010037SARM gem5 Developers return new FMaxNMD(machInst, rd, rn, rm); 273110037SARM gem5 Developers case 0x07: // FMINNM Sd = minNum(Sn, Sm) 273210037SARM gem5 Developers return new FMinNMS(machInst, rd, rn, rm); 273310037SARM gem5 Developers case 0x17: // FMINNM Dd = minNum(Dn, Dm) 273410037SARM gem5 Developers return new FMinNMD(machInst, rd, rn, rm); 273510037SARM gem5 Developers case 0x08: // FNMUL Sd = -(Sn * Sm) 273610037SARM gem5 Developers return new FNMulS(machInst, rd, rn, rm); 273710037SARM gem5 Developers case 0x18: // FNMUL Dd = -(Dn * Dm) 273810037SARM gem5 Developers return new FNMulD(machInst, rd, rn, rm); 273910037SARM gem5 Developers default: 274010037SARM gem5 Developers return new Unknown64(machInst); 274110037SARM gem5 Developers } 274210037SARM gem5 Developers } 274310037SARM gem5 Developers case 0x3: 274410037SARM gem5 Developers { 274510037SARM gem5 Developers if (bits(machInst, 31) || bits(machInst, 29)) 274610037SARM gem5 Developers return new Unknown64(machInst); 274710037SARM gem5 Developers uint8_t type = bits(machInst, 23, 22); 274810037SARM gem5 Developers IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 4, 0); 274910037SARM gem5 Developers IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 9, 5); 275010037SARM gem5 Developers IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 20, 16); 275110037SARM gem5 Developers ConditionCode cond = 275210037SARM gem5 Developers (ConditionCode)(uint8_t)(bits(machInst, 15, 12)); 275310037SARM gem5 Developers if (type == 0) // FCSEL Sd = if cond then Sn else Sm 275410037SARM gem5 Developers return new FCSelS(machInst, rd, rn, rm, cond); 275510037SARM gem5 Developers else if (type == 1) // FCSEL Dd = if cond then Dn else Dm 275610037SARM gem5 Developers return new FCSelD(machInst, rd, rn, rm, cond); 275710037SARM gem5 Developers else 275810037SARM gem5 Developers return new Unknown64(machInst); 275910037SARM gem5 Developers } 276012595Ssiddhesh.poyarekar@gmail.com default: 276112595Ssiddhesh.poyarekar@gmail.com M5_UNREACHABLE; 276210037SARM gem5 Developers } 276310037SARM gem5 Developers } 276412597Schunchenhsu@google.com M5_UNREACHABLE; 276510037SARM gem5 Developers } 276610037SARM gem5 Developers} 276710037SARM gem5 Developers}}; 276810037SARM gem5 Developers 276910037SARM gem5 Developersoutput decoder {{ 277010037SARM gem5 Developersnamespace Aarch64 277110037SARM gem5 Developers{ 277210037SARM gem5 Developers StaticInstPtr 277310037SARM gem5 Developers decodeAdvSIMDScalar(ExtMachInst machInst) 277410037SARM gem5 Developers { 277510037SARM gem5 Developers if (bits(machInst, 24) == 1) { 277610037SARM gem5 Developers if (bits(machInst, 10) == 0) { 277710037SARM gem5 Developers return decodeNeonScIndexedElem(machInst); 277810037SARM gem5 Developers } else if (bits(machInst, 23) == 0) { 277910037SARM gem5 Developers return decodeNeonScShiftByImm(machInst); 278010037SARM gem5 Developers } 278110037SARM gem5 Developers } else if (bits(machInst, 21) == 1) { 278210037SARM gem5 Developers if (bits(machInst, 10) == 1) { 278310037SARM gem5 Developers return decodeNeonSc3Same(machInst); 278410037SARM gem5 Developers } else if (bits(machInst, 11) == 0) { 278510037SARM gem5 Developers return decodeNeonSc3Diff(machInst); 278610037SARM gem5 Developers } else if (bits(machInst, 20, 17) == 0x0) { 278710037SARM gem5 Developers return decodeNeonSc2RegMisc(machInst); 278813170Sgiacomo.travaglini@arm.com } else if (bits(machInst, 20, 17) == 0x4) { 278913170Sgiacomo.travaglini@arm.com return decodeCryptoTwoRegSHA(machInst); 279010037SARM gem5 Developers } else if (bits(machInst, 20, 17) == 0x8) { 279110037SARM gem5 Developers return decodeNeonScPwise(machInst); 279210037SARM gem5 Developers } else { 279310037SARM gem5 Developers return new Unknown64(machInst); 279410037SARM gem5 Developers } 279510037SARM gem5 Developers } else if (bits(machInst, 23, 22) == 0 && 279613170Sgiacomo.travaglini@arm.com bits(machInst, 15) == 0) { 279713170Sgiacomo.travaglini@arm.com if (bits(machInst, 10) == 1) { 279813170Sgiacomo.travaglini@arm.com return decodeNeonScCopy(machInst); 279913170Sgiacomo.travaglini@arm.com } else { 280013170Sgiacomo.travaglini@arm.com return decodeCryptoThreeRegSHA(machInst); 280113170Sgiacomo.travaglini@arm.com } 280210037SARM gem5 Developers } else { 280310037SARM gem5 Developers return new Unknown64(machInst); 280410037SARM gem5 Developers } 280510037SARM gem5 Developers return new FailUnimplemented("Unhandled Case6", machInst); 280610037SARM gem5 Developers } 280710037SARM gem5 Developers} 280810037SARM gem5 Developers}}; 280910037SARM gem5 Developers 281010037SARM gem5 Developersoutput decoder {{ 281110037SARM gem5 Developersnamespace Aarch64 281210037SARM gem5 Developers{ 281311165SRekai.GonzalezAlberquilla@arm.com template <typename DecoderFeatures> 281410037SARM gem5 Developers StaticInstPtr 281510037SARM gem5 Developers decodeFpAdvSIMD(ExtMachInst machInst) 281610037SARM gem5 Developers { 281710037SARM gem5 Developers 281810037SARM gem5 Developers if (bits(machInst, 28) == 0) { 281910037SARM gem5 Developers if (bits(machInst, 31) == 0) { 282011165SRekai.GonzalezAlberquilla@arm.com return decodeAdvSIMD<DecoderFeatures>(machInst); 282110037SARM gem5 Developers } else { 282210037SARM gem5 Developers return new Unknown64(machInst); 282310037SARM gem5 Developers } 282410037SARM gem5 Developers } else if (bits(machInst, 30) == 0) { 282510037SARM gem5 Developers return decodeFp(machInst); 282610037SARM gem5 Developers } else if (bits(machInst, 31) == 0) { 282710037SARM gem5 Developers return decodeAdvSIMDScalar(machInst); 282810037SARM gem5 Developers } else { 282910037SARM gem5 Developers return new Unknown64(machInst); 283010037SARM gem5 Developers } 283110037SARM gem5 Developers } 283210037SARM gem5 Developers} 283310037SARM gem5 Developers}}; 283410037SARM gem5 Developers 283511165SRekai.GonzalezAlberquilla@arm.comlet {{ 283611165SRekai.GonzalezAlberquilla@arm.com decoder_output =''' 283711165SRekai.GonzalezAlberquilla@arm.comnamespace Aarch64 283811165SRekai.GonzalezAlberquilla@arm.com{''' 283911165SRekai.GonzalezAlberquilla@arm.com for decoderFlavour, type_dict in decoders.iteritems(): 284011165SRekai.GonzalezAlberquilla@arm.com decoder_output +=''' 284111165SRekai.GonzalezAlberquilla@arm.comtemplate StaticInstPtr decodeFpAdvSIMD<%(df)sDecoder>(ExtMachInst machInst); 284211165SRekai.GonzalezAlberquilla@arm.com''' % { "df" : decoderFlavour } 284311165SRekai.GonzalezAlberquilla@arm.com decoder_output +=''' 284411165SRekai.GonzalezAlberquilla@arm.com}''' 284511165SRekai.GonzalezAlberquilla@arm.com}}; 284611165SRekai.GonzalezAlberquilla@arm.com 284710037SARM gem5 Developersoutput decoder {{ 284810037SARM gem5 Developersnamespace Aarch64 284910037SARM gem5 Developers{ 285010037SARM gem5 Developers StaticInstPtr 285110037SARM gem5 Developers decodeGem5Ops(ExtMachInst machInst) 285210037SARM gem5 Developers { 285310037SARM gem5 Developers const uint32_t m5func = bits(machInst, 23, 16); 285410037SARM gem5 Developers switch (m5func) { 285512159Sandreas.sandberg@arm.com case M5OP_ARM: return new Arm(machInst); 285612159Sandreas.sandberg@arm.com case M5OP_QUIESCE: return new Quiesce(machInst); 285712159Sandreas.sandberg@arm.com case M5OP_QUIESCE_NS: return new QuiesceNs64(machInst); 285812159Sandreas.sandberg@arm.com case M5OP_QUIESCE_CYCLE: return new QuiesceCycles64(machInst); 285912159Sandreas.sandberg@arm.com case M5OP_QUIESCE_TIME: return new QuiesceTime64(machInst); 286012159Sandreas.sandberg@arm.com case M5OP_RPNS: return new Rpns64(machInst); 286112159Sandreas.sandberg@arm.com case M5OP_WAKE_CPU: return new WakeCPU64(machInst); 286212159Sandreas.sandberg@arm.com case M5OP_DEPRECATED1: return new Deprecated_ivlb(machInst); 286312159Sandreas.sandberg@arm.com case M5OP_DEPRECATED2: return new Deprecated_ivle(machInst); 286412159Sandreas.sandberg@arm.com case M5OP_DEPRECATED3: return new Deprecated_exit (machInst); 286512159Sandreas.sandberg@arm.com case M5OP_EXIT: return new M5exit64(machInst); 286612159Sandreas.sandberg@arm.com case M5OP_FAIL: return new M5fail64(machInst); 286712159Sandreas.sandberg@arm.com case M5OP_LOAD_SYMBOL: return new Loadsymbol(machInst); 286812159Sandreas.sandberg@arm.com case M5OP_INIT_PARAM: return new Initparam64(machInst); 286912159Sandreas.sandberg@arm.com case M5OP_RESET_STATS: return new Resetstats64(machInst); 287012159Sandreas.sandberg@arm.com case M5OP_DUMP_STATS: return new Dumpstats64(machInst); 287112159Sandreas.sandberg@arm.com case M5OP_DUMP_RESET_STATS: return new Dumpresetstats64(machInst); 287212159Sandreas.sandberg@arm.com case M5OP_CHECKPOINT: return new M5checkpoint64(machInst); 287312159Sandreas.sandberg@arm.com case M5OP_WRITE_FILE: return new M5writefile64(machInst); 287412159Sandreas.sandberg@arm.com case M5OP_READ_FILE: return new M5readfile64(machInst); 287512159Sandreas.sandberg@arm.com case M5OP_DEBUG_BREAK: return new M5break(machInst); 287612159Sandreas.sandberg@arm.com case M5OP_SWITCH_CPU: return new M5switchcpu(machInst); 287712159Sandreas.sandberg@arm.com case M5OP_ADD_SYMBOL: return new M5addsymbol64(machInst); 287812159Sandreas.sandberg@arm.com case M5OP_PANIC: return new M5panic(machInst); 287912159Sandreas.sandberg@arm.com case M5OP_WORK_BEGIN: return new M5workbegin64(machInst); 288012159Sandreas.sandberg@arm.com case M5OP_WORK_END: return new M5workend64(machInst); 288110037SARM gem5 Developers default: return new Unknown64(machInst); 288210037SARM gem5 Developers } 288310037SARM gem5 Developers } 288410037SARM gem5 Developers} 288510037SARM gem5 Developers}}; 288610037SARM gem5 Developers 288710037SARM gem5 Developersdef format Aarch64() {{ 288810037SARM gem5 Developers decode_block = ''' 288910037SARM gem5 Developers { 289010037SARM gem5 Developers using namespace Aarch64; 289110037SARM gem5 Developers if (bits(machInst, 27) == 0x0) { 289213759Sgiacomo.gabrielli@arm.com if (bits(machInst, 28) == 0x0) { 289313759Sgiacomo.gabrielli@arm.com if (bits(machInst, 26, 25) != 0x2) { 289413759Sgiacomo.gabrielli@arm.com return new Unknown64(machInst); 289513759Sgiacomo.gabrielli@arm.com } 289613759Sgiacomo.gabrielli@arm.com if (bits(machInst, 31) == 0x0) { 289713759Sgiacomo.gabrielli@arm.com switch (bits(machInst, 30, 29)) { 289813759Sgiacomo.gabrielli@arm.com case 0x0: 289913759Sgiacomo.gabrielli@arm.com case 0x1: 290013759Sgiacomo.gabrielli@arm.com case 0x2: 290113759Sgiacomo.gabrielli@arm.com return decodeSveInt(machInst); 290213759Sgiacomo.gabrielli@arm.com case 0x3: 290313759Sgiacomo.gabrielli@arm.com return decodeSveFp(machInst); 290413759Sgiacomo.gabrielli@arm.com } 290513759Sgiacomo.gabrielli@arm.com } else { 290613759Sgiacomo.gabrielli@arm.com return decodeSveMem(machInst); 290713759Sgiacomo.gabrielli@arm.com } 290813759Sgiacomo.gabrielli@arm.com } else if (bits(machInst, 26) == 0) 290910037SARM gem5 Developers // bit 28:26=100 291010037SARM gem5 Developers return decodeDataProcImm(machInst); 291110037SARM gem5 Developers else 291210037SARM gem5 Developers // bit 28:26=101 291310037SARM gem5 Developers return decodeBranchExcSys(machInst); 291410037SARM gem5 Developers } else if (bits(machInst, 25) == 0) { 291510037SARM gem5 Developers // bit 27=1, 25=0 291610037SARM gem5 Developers return decodeLoadsStores(machInst); 291710037SARM gem5 Developers } else if (bits(machInst, 26) == 0) { 291810037SARM gem5 Developers // bit 27:25=101 291910037SARM gem5 Developers return decodeDataProcReg(machInst); 292010037SARM gem5 Developers } else if (bits(machInst, 24) == 1 && 292110037SARM gem5 Developers bits(machInst, 31, 28) == 0xF) { 292210037SARM gem5 Developers return decodeGem5Ops(machInst); 292310037SARM gem5 Developers } else { 292410037SARM gem5 Developers // bit 27:25=111 292511165SRekai.GonzalezAlberquilla@arm.com switch(decoderFlavour){ 292611165SRekai.GonzalezAlberquilla@arm.com default: 292711165SRekai.GonzalezAlberquilla@arm.com return decodeFpAdvSIMD<GenericDecoder>(machInst); 292811165SRekai.GonzalezAlberquilla@arm.com } 292910037SARM gem5 Developers } 293010037SARM gem5 Developers } 293110037SARM gem5 Developers ''' 293210037SARM gem5 Developers}}; 2933