diff options
author | Gabe Black <gabeblack@google.com> | 2017-08-24 17:05:20 -0700 |
---|---|---|
committer | Gabe Black <gabeblack@google.com> | 2017-08-28 20:56:25 +0000 |
commit | 544eba88b94b693319eca6a2569f38449465b678 (patch) | |
tree | 5e3cfb1dee9b1b7310e6e4606c4901273d23da37 /src/arch | |
parent | 5ac888b8bf1c4a2f3cf699c75f6df304246c96a4 (diff) | |
download | gem5-544eba88b94b693319eca6a2569f38449465b678.tar.xz |
x86: Add a "CondInst" format for conditionally decoded instructions.
A condition can be specified which will tell the decoder whether to return
the instruction being requested, or, if the condition fails, UD2.
Change-Id: I0f1c075deb10754ce1dd88be1726a196294e41fd
Reviewed-on: https://gem5-review.googlesource.com/4580
Reviewed-by: Michael LeBeane <Michael.Lebeane@amd.com>
Maintainer: Gabe Black <gabeblack@google.com>
Diffstat (limited to 'src/arch')
-rw-r--r-- | src/arch/x86/isa/formats/cond.isa | 51 | ||||
-rw-r--r-- | src/arch/x86/isa/formats/formats.isa | 4 |
2 files changed, 55 insertions, 0 deletions
diff --git a/src/arch/x86/isa/formats/cond.isa b/src/arch/x86/isa/formats/cond.isa new file mode 100644 index 000000000..ab9232b20 --- /dev/null +++ b/src/arch/x86/isa/formats/cond.isa @@ -0,0 +1,51 @@ +// -*- mode:c++ -*- + +// Copyright 2017 Google, Inc. +// +// The license below extends only to copyright in the software and shall +// not be construed as granting a license to any other intellectual +// property including but not limited to intellectual property relating +// to a hardware implementation of the functionality of the software +// licensed hereunder. You may use the software subject to the license +// terms below provided that you ensure that this notice is replicated +// unmodified and in its entirety in all distributions of the software, +// modified or unmodified, in source code or in binary form. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer; +// redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution; +// neither the name of the copyright holders nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Authors: Gabe Black + +def format CondInst(cond, *opTypeSet) {{ + blocks = OutputBlocks() + + if_blocks = specializeInst(Name, list(opTypeSet), EmulEnv()) + blocks.append(if_blocks) + else_blocks = specializeInst('UD2', [], EmulEnv()) + blocks.append(else_blocks) + + (header_output, decoder_output, + decode_block, exec_output) = blocks.makeList() + decode_block = '\tif (%s) {\n%s\n\t} else {\n%s\n}\n' % \ + (cond, if_blocks.decode_block, else_blocks.decode_block) +}}; diff --git a/src/arch/x86/isa/formats/formats.isa b/src/arch/x86/isa/formats/formats.isa index b5ffd4d59..6aed37faf 100644 --- a/src/arch/x86/isa/formats/formats.isa +++ b/src/arch/x86/isa/formats/formats.isa @@ -72,3 +72,7 @@ //Include a format which makes instructions who's sole purpose is to generate //a syscall. ##include "syscall.isa" + +//Include a format which is like Inst, except it conditionally decodes to the +//specified instruction, or if the condition fails decodes to UD2. +##include "cond.isa" |