diff options
author | Peter Maydell <peter.maydell@linaro.org> | 2020-10-19 16:12:52 +0100 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2020-10-20 16:12:01 +0100 |
commit | 514101c0b931f0a11a40d29d26af1cc40482f951 (patch) | |
tree | acef62bcd70271affae73af8e862b0e09fcdea83 | |
parent | b3267ff675dd410b4c2a569e209cb7d468cf1873 (diff) | |
download | qemu-514101c0b931f0a11a40d29d26af1cc40482f951.zip qemu-514101c0b931f0a11a40d29d26af1cc40482f951.tar.gz qemu-514101c0b931f0a11a40d29d26af1cc40482f951.tar.bz2 |
decodetree: Fix codegen for non-overlapping group inside overlapping group
For nested groups like:
{
[
pattern 1
pattern 2
]
pattern 3
}
the intended behaviour is that patterns 1 and 2 must not
overlap with each other; if the insn matches neither then
we fall through to pattern 3 as the next thing in the
outer overlapping group.
Currently we generate incorrect code for this situation,
because in the code path for a failed match inside the
inner non-overlapping group we generate a "return" statement,
which causes decode to stop entirely rather than continuing
to the next thing in the outer group.
Generate a "break" instead, so that decode flow behaves
as required for this nested group case.
Suggested-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Message-id: 20201019151301.2046-2-peter.maydell@linaro.org
-rw-r--r-- | scripts/decodetree.py | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/scripts/decodetree.py b/scripts/decodetree.py index 60fd3b5e..c1bf3cf 100644 --- a/scripts/decodetree.py +++ b/scripts/decodetree.py @@ -548,7 +548,7 @@ class Tree: output(ind, ' /* ', str_match_bits(innerbits, innermask), ' */\n') s.output_code(i + 4, extracted, innerbits, innermask) - output(ind, ' return false;\n') + output(ind, ' break;\n') output(ind, '}\n') # end Tree |