From: Mattias EngdegÄrd Date: Thu, 3 Mar 2022 12:57:26 +0000 (+0100) Subject: Faster bytecode immediate argument fetching X-Git-Tag: emacs-29.0.90~1931^2~1182 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=2fb98486e18f8a3275adc56d2740901ef5cb6e8b;p=emacs.git Faster bytecode immediate argument fetching * src/bytecode.c (FETCH2): Use `|` instead of `+` to combine the bytes forming a 16-bit immediate argument so that GCC (prior to version 12) recognises the idiom and generates a 16-bit load. This applies for little-endian machines with cheap unaligned accesses such as x86[-64], arm64 and power64le. This 1-character change results in a measurable speed gain on many kinds of Lisp code, as 16-bit immediates are used by all jump instructions. Clang performs this optimisation for both `+` and `|` from version 10. --- diff --git a/src/bytecode.c b/src/bytecode.c index 96f1f905812..c5cc6590121 100644 --- a/src/bytecode.c +++ b/src/bytecode.c @@ -291,7 +291,7 @@ enum byte_code_op /* Fetch two bytes from the bytecode stream and make a 16-bit number out of them. */ -#define FETCH2 (op = FETCH, op + (FETCH << 8)) +#define FETCH2 (op = FETCH, op | (FETCH << 8)) /* Push X onto the execution stack. The expression X should not contain TOP, to avoid competing side effects. */