There's currently a fair amount of overhead in the way we currently treat TARGET_PAGE_{BITS,SIZE,MASK} with TARGET_PAGE_BITS_VARY.
We have assertions that TARGET_PAGE_BITS has been finalized. Which is fine, but the variable that controls the assertion may be assumed to be modified by any function call, which means that we have lots of duplicate assertions. This re-arranges things using a const symbol, which allows the compiler to assume that the variable is not modified across calls. In order to allow initialization of the variable during startup, use an alias that is non-const and controls the allocation into a read-write section. Remove the assertion for release builds. Precompute TARGET_PAGE_MASK. This removes a runtime shift and allows the variable to be used as a direct memory operand on x86. Size reductions vs master for qemu-system-aarch64 for various hosts: PPC64LE: debug-tcg: -32264 release: -44360 AARCH64: debug-tcg: -33304 relase: -77080 X86_64: debug-tcg: -6685 relase: -15597 r~ Richard Henderson (7): exec: Use TARGET_PAGE_BITS_MIN for TLB flags exec: Split out variable page size support to exec-vary.c exec: Use const alias for TARGET_PAGE_BITS_VARY exec: Restrict TARGET_PAGE_BITS_VARY assert to CONFIG_DEBUG_TCG exec: Promote TARGET_PAGE_MASK to target_long exec: Tidy TARGET_PAGE_ALIGN exec: Cache TARGET_PAGE_MASK for TARGET_PAGE_BITS_VARY Makefile.target | 2 +- include/exec/cpu-all.h | 41 +++++++++++++------- include/qemu-common.h | 6 +++ exec-vary.c | 88 ++++++++++++++++++++++++++++++++++++++++++ exec.c | 34 ---------------- 5 files changed, 123 insertions(+), 48 deletions(-) create mode 100644 exec-vary.c -- 2.17.1