target/xtensa: rework zero overhead loops implementation
commit5d630cef4f91fd842df3b0b98ae8d3ac6eb2ce4a
authorMax Filippov <jcmvbkbc@gmail.com>
Wed, 3 Oct 2018 22:59:11 +0000 (3 15:59 -0700)
committerMax Filippov <jcmvbkbc@gmail.com>
Sat, 12 Jan 2019 04:52:24 +0000 (11 20:52 -0800)
tree862bf51c3daaa92444b0939d89abda4791406de4
parent32a1a94dd324d33578dca1dc96d7896a0244d768
target/xtensa: rework zero overhead loops implementation

Don't invalidate TB with the end of zero overhead loop when LBEG or LEND
change. Instead encode the distance from the start of the page where the
TB starts to the LEND in the TB cs_base and generate loopback code when
the next PC matches encoded LEND. Distance to a destination within the
same page and up to a maximum instruction length into the next page is
encoded literally, otherwise it's zero. The distance from LEND to LBEG
is also encoded in the cs_base: it's encoded literally when less than
256 or as 0 otherwise. This allows for TB chaining for the loopback
branch at the end of a loop for the most common loop sizes.

With this change the resulting emulation speed is about 10% higher in
softmmu mode on uClibc-ng and LTP tests. Emulation speed in linux
user mode is a few percent lower because there's no direct TB chaining
between different memory pages. Testing with lower limit on direct TB
chaining range shows gradual slowdown to ~15% for the block size of 64
bytes and ~50% for the block size of 32 bytes.

Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
target/xtensa/cpu.h
target/xtensa/helper.h
target/xtensa/op_helper.c
target/xtensa/overlay_tool.h
target/xtensa/translate.c