aboutsummaryrefslogtreecommitdiffstats
path: root/src/bytecode.c
diff options
context:
space:
mode:
authorMattias EngdegÄrd2022-03-03 13:57:26 +0100
committerMattias EngdegÄrd2022-03-12 17:32:31 +0100
commit2fb98486e18f8a3275adc56d2740901ef5cb6e8b (patch)
tree29e1f5e589138f8b201f299bcb2843be4849688f /src/bytecode.c
parentfe65db05f42bcbf755f037575b3c29b74f279bdf (diff)
downloademacs-2fb98486e18f8a3275adc56d2740901ef5cb6e8b.tar.gz
emacs-2fb98486e18f8a3275adc56d2740901ef5cb6e8b.zip
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.
Diffstat (limited to 'src/bytecode.c')
-rw-r--r--src/bytecode.c2
1 files changed, 1 insertions, 1 deletions
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
291/* Fetch two bytes from the bytecode stream and make a 16-bit number 291/* Fetch two bytes from the bytecode stream and make a 16-bit number
292 out of them. */ 292 out of them. */
293 293
294#define FETCH2 (op = FETCH, op + (FETCH << 8)) 294#define FETCH2 (op = FETCH, op | (FETCH << 8))
295 295
296/* Push X onto the execution stack. The expression X should not 296/* Push X onto the execution stack. The expression X should not
297 contain TOP, to avoid competing side effects. */ 297 contain TOP, to avoid competing side effects. */