Better commutative binary numerical op codegen

* lisp/emacs-lisp/bytecomp.el (byte-compile-variadic-numeric):
Put a constant argument last for better LAP code opportunities.
This applies to commutative binary operations (+ and *).
`min` and `max` are not included being not quite commutative.
This commit is contained in:
Mattias Engdegård 2023-01-29 13:34:48 +01:00
parent e55855c5a1
commit 254c75fc29

View file

@ -4063,9 +4063,15 @@ This function is never called when `lexical-binding' is nil."
(byte-compile-constant 1)
(byte-compile-out (get '* 'byte-opcode) 0))
(3
(byte-compile-form (nth 1 form))
(byte-compile-form (nth 2 form))
(byte-compile-out (get (car form) 'byte-opcode) 0))
(let ((arg1 (nth 1 form))
(arg2 (nth 2 form)))
(when (and (memq (car form) '(+ *))
(macroexp-const-p arg1))
;; Put constant argument last for better LAP optimisation.
(cl-rotatef arg1 arg2))
(byte-compile-form arg1)
(byte-compile-form arg2)
(byte-compile-out (get (car form) 'byte-opcode) 0)))
(_
;; >2 args: compile as a single function call.
(byte-compile-normal-call form))))