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:
parent
e55855c5a1
commit
254c75fc29
1 changed files with 9 additions and 3 deletions
|
@ -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))))
|
||||
|
|
Loading…
Add table
Reference in a new issue