From aff4a0f5ab7c298d9025838e175084d1e514c008 Mon Sep 17 00:00:00 2001 From: Stas Boukarev Date: Thu, 11 Feb 2016 17:00:52 +0300 Subject: [PATCH] Add LOGTEST VOPs on ARM64. --- src/compiler/arm64/arith.lisp | 51 +++++++++++++++++++++++++------------------ src/compiler/arm64/vm.lisp | 13 +++++------ 2 files changed, 35 insertions(+), 29 deletions(-) diff --git a/src/compiler/arm64/arith.lisp b/src/compiler/arm64/arith.lisp index 884c009f2..11c2f8283 100644 --- a/src/compiler/arm64/arith.lisp +++ b/src/compiler/arm64/arith.lisp @@ -835,27 +835,36 @@ (:arg-types * (:constant (satisfies fixnum-add-sub-immediate-p))) (:variant-cost 6)) -;; (macrolet ((define-logtest-vops () -;; `(progn -;; ,@(loop for suffix in '(/fixnum -c/fixnum -;; /signed -c/signed -;; /unsigned -c/unsigned) -;; for cost in '(4 3 6 5 6 5) -;; collect -;; `(define-vop (,(symbolicate "FAST-LOGTEST" suffix) -;; ,(symbolicate "FAST-CONDITIONAL" suffix)) -;; (:translate logtest) -;; (:conditional :ne) -;; (:generator ,cost -;; (inst tst x -;; ,(case suffix -;; (-c/fixnum -;; `(fixnumize y)) -;; ((-c/signed -c/unsigned) -;; `y) -;; (t -;; 'y))))))))) -;; (define-logtest-vops)) +(macrolet ((define-logtest-vops () + `(progn + ,@(loop for suffix in '(/fixnum -c/fixnum + /signed -c/signed + /unsigned -c/unsigned) + for cost in '(4 3 6 5 6 5) + for arg-types in '(nil + (fixnum + (:constant + (satisfies fixnum-encode-logical-immediate))) + nil + (signed-num + (:constant + (satisfies encode-logical-immediate))) + nil + (unsigned-num + (:constant (satisfies encode-logical-immediate)))) + collect + `(define-vop (,(symbolicate "FAST-LOGTEST" suffix) + ,(symbolicate "FAST-CONDITIONAL" suffix)) + (:translate logtest) + (:conditional :ne) + ,@(and arg-types + `((:arg-types ,@arg-types))) + (:generator ,cost + (inst tst x + ,(if (eq suffix '-c/fixnum) + '(fixnumize y) + 'y)))))))) + (define-logtest-vops)) (define-source-transform lognand (x y) `(lognot (logand ,x ,y))) diff --git a/src/compiler/arm64/vm.lisp b/src/compiler/arm64/vm.lisp index 84ff75b57..7af5aeac6 100644 --- a/src/compiler/arm64/vm.lisp +++ b/src/compiler/arm64/vm.lisp @@ -331,14 +331,11 @@ `(function ,args ,result))))) (case (sb!c::combination-fun-source-name node) (logtest - (cond - ((valid-funtype '(fixnum fixnum) '*) - (values :maybe nil)) - ((valid-funtype '(signed-word signed-word) '*) - (values :maybe nil)) - ((valid-funtype '(word word) '*) - (values :maybe nil)) - (t (values :default nil)))) + (if (or (valid-funtype '(fixnum fixnum) '*) + (valid-funtype '(signed-word signed-word) '*) + (valid-funtype '(word word) '*)) + (values :maybe nil) + (values :default nil))) (logbitp (cond ((or (valid-funtype '((constant-arg (integer 0 #.(1- n-fixnum-bits))) fixnum) '*) -- 2.11.4.GIT