Clean up and improve compilation of arithmetic (bug#42597)
* lisp/emacs-lisp/byte-opt.el (byte-optimize-associative-math) (byte-optimize-min-max): Transform 3-arg min/max call into two 2-arg calls, which is faster. * lisp/emacs-lisp/bytecomp.el (byte-compile-associative): Rename to... (byte-compile-variadic-numeric): ...this function and simplify, fixing incorrect comments. The 3-arg strength reduction is now always done in the optimisers and is no longer needed here. (byte-compile-min-max): New function. (byte-compile-minus): Simplify, remove incorrect comment, and use byte-compile-variadic-numeric. (byte-compile-quo): Simplify and fix comment.
This commit is contained in:
parent
204273c3b9
commit
0facaeec1a
2 changed files with 62 additions and 60 deletions
|
@ -648,14 +648,23 @@
|
|||
(setq args (cons (car rest) args)))
|
||||
(setq rest (cdr rest)))
|
||||
(if (cdr constants)
|
||||
(if args
|
||||
(list (car form)
|
||||
(apply (car form) constants)
|
||||
(if (cdr args)
|
||||
(cons (car form) (nreverse args))
|
||||
(car args)))
|
||||
(apply (car form) constants))
|
||||
form)))
|
||||
(let ((const (apply (car form) (nreverse constants))))
|
||||
(if args
|
||||
(append (list (car form) const)
|
||||
(nreverse args))
|
||||
const))
|
||||
form)))
|
||||
|
||||
(defun byte-optimize-min-max (form)
|
||||
"Optimize `min' and `max'."
|
||||
(let ((opt (byte-optimize-associative-math form)))
|
||||
(if (and (consp opt) (memq (car opt) '(min max))
|
||||
(= (length opt) 4))
|
||||
;; (OP x y z) -> (OP (OP x y) z), in order to use binary byte ops.
|
||||
(list (car opt)
|
||||
(list (car opt) (nth 1 opt) (nth 2 opt))
|
||||
(nth 3 opt))
|
||||
opt)))
|
||||
|
||||
;; Use OP to reduce any leading prefix of constant numbers in the list
|
||||
;; (cons ACCUM ARGS) down to a single number, and return the
|
||||
|
@ -878,8 +887,8 @@
|
|||
(put '* 'byte-optimizer #'byte-optimize-multiply)
|
||||
(put '- 'byte-optimizer #'byte-optimize-minus)
|
||||
(put '/ 'byte-optimizer #'byte-optimize-divide)
|
||||
(put 'max 'byte-optimizer #'byte-optimize-associative-math)
|
||||
(put 'min 'byte-optimizer #'byte-optimize-associative-math)
|
||||
(put 'max 'byte-optimizer #'byte-optimize-min-max)
|
||||
(put 'min 'byte-optimizer #'byte-optimize-min-max)
|
||||
|
||||
(put '= 'byte-optimizer #'byte-optimize-binary-predicate)
|
||||
(put 'eq 'byte-optimizer #'byte-optimize-binary-predicate)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue