diff options
author | Mattias EngdegÄrd <mattiase@acm.org> | 2023-01-29 13:34:48 +0100 |
---|---|---|
committer | Mattias EngdegÄrd <mattiase@acm.org> | 2023-01-29 13:48:23 +0100 |
commit | 254c75fc2935e7edef079166d90b231278115a2f (patch) | |
tree | e0255c78283d649134a5c0723929a8b736410649 /lisp/emacs-lisp | |
parent | e55855c5a1e85e230d2860c973358a34eb72da64 (diff) | |
download | emacs-254c75fc2935e7edef079166d90b231278115a2f.tar.gz emacs-254c75fc2935e7edef079166d90b231278115a2f.tar.bz2 emacs-254c75fc2935e7edef079166d90b231278115a2f.zip |
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.
Diffstat (limited to 'lisp/emacs-lisp')
-rw-r--r-- | lisp/emacs-lisp/bytecomp.el | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el index bfb9be4712b..e8a8fe37756 100644 --- a/lisp/emacs-lisp/bytecomp.el +++ b/lisp/emacs-lisp/bytecomp.el @@ -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)))) |