diff options
Diffstat (limited to 'src/arch/arm/isa/formats')
-rw-r--r-- | src/arch/arm/isa/formats/aarch64.isa | 29 | ||||
-rw-r--r-- | src/arch/arm/isa/formats/neon64.isa | 38 |
2 files changed, 45 insertions, 22 deletions
diff --git a/src/arch/arm/isa/formats/aarch64.isa b/src/arch/arm/isa/formats/aarch64.isa index b5a4dfa21..2d94aff51 100644 --- a/src/arch/arm/isa/formats/aarch64.isa +++ b/src/arch/arm/isa/formats/aarch64.isa @@ -1,4 +1,4 @@ -// Copyright (c) 2011-2014 ARM Limited +// Copyright (c) 2011-2015 ARM Limited // All rights reserved // // The license below extends only to copyright in the software and shall @@ -46,8 +46,10 @@ namespace Aarch64 StaticInstPtr decodeLoadsStores(ExtMachInst machInst); StaticInstPtr decodeDataProcReg(ExtMachInst machInst); + template <typename DecoderFeatures> StaticInstPtr decodeFpAdvSIMD(ExtMachInst machInst); StaticInstPtr decodeFp(ExtMachInst machInst); + template <typename DecoderFeatures> StaticInstPtr decodeAdvSIMD(ExtMachInst machInst); StaticInstPtr decodeAdvSIMDScalar(ExtMachInst machInst); @@ -1278,12 +1280,13 @@ namespace Aarch64 output decoder {{ namespace Aarch64 { + template <typename DecoderFeatures> StaticInstPtr decodeAdvSIMD(ExtMachInst machInst) { if (bits(machInst, 24) == 1) { if (bits(machInst, 10) == 0) { - return decodeNeonIndexedElem(machInst); + return decodeNeonIndexedElem<DecoderFeatures>(machInst); } else if (bits(machInst, 23) == 1) { return new Unknown64(machInst); } else { @@ -1295,7 +1298,7 @@ namespace Aarch64 } } else if (bits(machInst, 21) == 1) { if (bits(machInst, 10) == 1) { - return decodeNeon3Same(machInst); + return decodeNeon3Same<DecoderFeatures>(machInst); } else if (bits(machInst, 11) == 0) { return decodeNeon3Diff(machInst); } else if (bits(machInst, 20, 17) == 0x0) { @@ -1957,13 +1960,14 @@ namespace Aarch64 output decoder {{ namespace Aarch64 { + template <typename DecoderFeatures> StaticInstPtr decodeFpAdvSIMD(ExtMachInst machInst) { if (bits(machInst, 28) == 0) { if (bits(machInst, 31) == 0) { - return decodeAdvSIMD(machInst); + return decodeAdvSIMD<DecoderFeatures>(machInst); } else { return new Unknown64(machInst); } @@ -1978,6 +1982,18 @@ namespace Aarch64 } }}; +let {{ + decoder_output =''' +namespace Aarch64 +{''' + for decoderFlavour, type_dict in decoders.iteritems(): + decoder_output +=''' +template StaticInstPtr decodeFpAdvSIMD<%(df)sDecoder>(ExtMachInst machInst); +''' % { "df" : decoderFlavour } + decoder_output +=''' +}''' +}}; + output decoder {{ namespace Aarch64 { @@ -2041,7 +2057,10 @@ def format Aarch64() {{ return decodeGem5Ops(machInst); } else { // bit 27:25=111 - return decodeFpAdvSIMD(machInst); + switch(decoderFlavour){ + default: + return decodeFpAdvSIMD<GenericDecoder>(machInst); + } } } ''' diff --git a/src/arch/arm/isa/formats/neon64.isa b/src/arch/arm/isa/formats/neon64.isa index 72bbd0c60..e0a913a6b 100644 --- a/src/arch/arm/isa/formats/neon64.isa +++ b/src/arch/arm/isa/formats/neon64.isa @@ -40,51 +40,54 @@ output header {{ namespace Aarch64 { // AdvSIMD three same + template <typename DecoderFeatures> StaticInstPtr decodeNeon3Same(ExtMachInst machInst); // AdvSIMD three different - StaticInstPtr decodeNeon3Diff(ExtMachInst machInst); + inline StaticInstPtr decodeNeon3Diff(ExtMachInst machInst); // AdvSIMD two-reg misc - StaticInstPtr decodeNeon2RegMisc(ExtMachInst machInst); + inline StaticInstPtr decodeNeon2RegMisc(ExtMachInst machInst); // AdvSIMD across lanes - StaticInstPtr decodeNeonAcrossLanes(ExtMachInst machInst); + inline StaticInstPtr decodeNeonAcrossLanes(ExtMachInst machInst); // AdvSIMD copy - StaticInstPtr decodeNeonCopy(ExtMachInst machInst); + inline StaticInstPtr decodeNeonCopy(ExtMachInst machInst); // AdvSIMD vector x indexed element + template <typename DecoderFeatures> StaticInstPtr decodeNeonIndexedElem(ExtMachInst machInst); // AdvSIMD modified immediate - StaticInstPtr decodeNeonModImm(ExtMachInst machInst); + inline StaticInstPtr decodeNeonModImm(ExtMachInst machInst); // AdvSIMD shift by immediate - StaticInstPtr decodeNeonShiftByImm(ExtMachInst machInst); + inline StaticInstPtr decodeNeonShiftByImm(ExtMachInst machInst); // AdvSIMD TBL/TBX - StaticInstPtr decodeNeonTblTbx(ExtMachInst machInst); + inline StaticInstPtr decodeNeonTblTbx(ExtMachInst machInst); // AdvSIMD ZIP/UZP/TRN - StaticInstPtr decodeNeonZipUzpTrn(ExtMachInst machInst); + inline StaticInstPtr decodeNeonZipUzpTrn(ExtMachInst machInst); // AdvSIMD EXT - StaticInstPtr decodeNeonExt(ExtMachInst machInst); + inline StaticInstPtr decodeNeonExt(ExtMachInst machInst); // AdvSIMD scalar three same - StaticInstPtr decodeNeonSc3Same(ExtMachInst machInst); + inline StaticInstPtr decodeNeonSc3Same(ExtMachInst machInst); // AdvSIMD scalar three different - StaticInstPtr decodeNeonSc3Diff(ExtMachInst machInst); + inline StaticInstPtr decodeNeonSc3Diff(ExtMachInst machInst); // AdvSIMD scalar two-reg misc - StaticInstPtr decodeNeonSc2RegMisc(ExtMachInst machInst); + inline StaticInstPtr decodeNeonSc2RegMisc(ExtMachInst machInst); // AdvSIMD scalar pairwise - StaticInstPtr decodeNeonScPwise(ExtMachInst machInst); + inline StaticInstPtr decodeNeonScPwise(ExtMachInst machInst); // AdvSIMD scalar copy - StaticInstPtr decodeNeonScCopy(ExtMachInst machInst); + inline StaticInstPtr decodeNeonScCopy(ExtMachInst machInst); // AdvSIMD scalar x indexed element - StaticInstPtr decodeNeonScIndexedElem(ExtMachInst machInst); + inline StaticInstPtr decodeNeonScIndexedElem(ExtMachInst machInst); // AdvSIMD scalar shift by immediate - StaticInstPtr decodeNeonScShiftByImm(ExtMachInst machInst); + inline StaticInstPtr decodeNeonScShiftByImm(ExtMachInst machInst); // AdvSIMD load/store - StaticInstPtr decodeNeonMem(ExtMachInst machInst); + inline StaticInstPtr decodeNeonMem(ExtMachInst machInst); } }}; output decoder {{ namespace Aarch64 { + template <typename DecoderFeatures> StaticInstPtr decodeNeon3Same(ExtMachInst machInst) { @@ -1267,6 +1270,7 @@ namespace Aarch64 } } + template <typename DecoderFeatures> StaticInstPtr decodeNeonIndexedElem(ExtMachInst machInst) { |