diff options
author | Rekai Gonzalez Alberquilla <Rekai.GonzalezAlberquilla@arm.com> | 2015-10-09 14:50:54 -0500 |
---|---|---|
committer | Rekai Gonzalez Alberquilla <Rekai.GonzalezAlberquilla@arm.com> | 2015-10-09 14:50:54 -0500 |
commit | d3d159749a0a6c3b69a9181fab8db34b6ba0f7a1 (patch) | |
tree | 477a11d57b4428685247f1ad4bb5863b948f9c99 /src/arch/arm/isa/insts/neon64.isa | |
parent | 7624fc1fb461f1dd127763521d85f63e81617d71 (diff) | |
download | gem5-d3d159749a0a6c3b69a9181fab8db34b6ba0f7a1.tar.xz |
isa: Add parameter to pick different decoder inside ISA
The decoder is responsible for splitting instructions in micro
operations (uops). Given that different micro architectures may split
operations differently, this patch allows to specify which micro
architecture each isa implements, so different cores in the system can
split instructions differently, also decoupling uop splitting
(microArch) from ISA (Arch). This is done making the decodification
calls templates that receive a type 'DecoderFlavour' that maps the
name of the operation to the class that implements it. This way there
is only one selection point (converting the command line enum to the
appropriate DecodeFeatures object). In addition, there is no explicit
code replication: template instantiation hides that, and the compiler
should be able to resolve a number of things at compile-time.
Diffstat (limited to 'src/arch/arm/isa/insts/neon64.isa')
-rw-r--r-- | src/arch/arm/isa/insts/neon64.isa | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/src/arch/arm/isa/insts/neon64.isa b/src/arch/arm/isa/insts/neon64.isa index f6565efe5..697ea80e2 100644 --- a/src/arch/arm/isa/insts/neon64.isa +++ b/src/arch/arm/isa/insts/neon64.isa @@ -1,6 +1,6 @@ // -*- mode: c++ -*- -// Copyright (c) 2012-2013 ARM Limited +// Copyright (c) 2012-2013, 2015 ARM Limited // All rights reserved // // The license below extends only to copyright in the software and shall @@ -42,6 +42,7 @@ let {{ header_output = "" exec_output = "" + decoders = { 'Generic' : {} } # FP types (FP operations always work with unsigned representations) floatTypes = ("uint32_t", "uint64_t") @@ -49,9 +50,9 @@ let {{ def threeEqualRegInstX(name, Name, opClass, types, rCount, op, readDest=False, pairwise=False, scalar=False, - byElem=False): + byElem=False, decoder='Generic'): assert (not pairwise) or ((not byElem) and (not scalar)) - global header_output, exec_output + global header_output, exec_output, decoders eWalkCode = simd64EnabledCheckCode + ''' RegVect srcReg1, destReg; ''' @@ -3356,4 +3357,16 @@ let {{ threeRegScrambleInstX("zip2", "Zip2QX", "SimdAluOp", unsignedTypes, 4, zipCode % "eCount / 2") + for decoderFlavour, type_dict in decoders.iteritems(): + header_output += ''' + class %(decoder_flavour)sDecoder { + public: + ''' % { "decoder_flavour" : decoderFlavour } + for type,name in type_dict.iteritems(): + header_output += ''' + template<typename Elem> using %(type)s = %(new_name)s<Elem>;''' % { + "type" : type, "new_name" : name + } + header_output += ''' + };''' }}; |