Implement LOGCOUNT via POPCNT instruction. logcount-popcnt
authorOlof-Joachim Frahm <olof@macrolet.net>
Thu, 7 Nov 2013 00:07:33 +0000 (01:07 +0100)
committerOlof-Joachim Frahm <olof@macrolet.net>
Sun, 5 Jan 2014 19:56:18 +0000 (20:56 +0100)
src/compiler/x86-64/arith.lisp

index f455bff..1026743 100644 (file)
@@ -1197,6 +1197,20 @@ constant shift greater than word length")))
     (inst mov mask #x0101010101010101)
     (inst imul result mask)
     (inst shr result 56)))
+
+;; only marginally faster then the regular one, but shorter
+;; might be unavailable though
+(define-vop (unsigned-byte-64-count/popcnt)
+  (:translate logcount)
+  (:note "inline (unsigned-byte 64) logcount using popcnt instruction")
+  (:policy :fast-safe)
+  (:guard (member :popcnt *backend-subfeatures*))
+  (:args (arg :scs (unsigned-reg) :target result))
+  (:arg-types unsigned-num)
+  (:results (result :scs (unsigned-reg)))
+  (:result-types positive-fixnum)
+  (:generator 1
+    (inst popcnt arg result)))
 \f
 ;;;; binary conditional VOPs