cs: fix popcount in data/bit-vector for 32-bit mode

Related to #2925
This commit is contained in:
Matthew Flatt 2019-11-25 14:45:49 -07:00
parent b1b8beece5
commit f3cfac8981

View File

@ -6,6 +6,13 @@
;; Count set bits for 30 bit number in 5 steps. ;; Count set bits for 30 bit number in 5 steps.
;; for 62 bit number in 6, for 8 bit numbers in 3 ;; for 62 bit number in 6, for 8 bit numbers in 3
(define-for-syntax lut29
#(#x0AAAAAAA
#x0CCCCCCC
#x10F0F0F0
#x1F00FF00
#x1FFF0000))
(define-for-syntax lut30 (define-for-syntax lut30
#(#x2AAAAAAA #(#x2AAAAAAA
#x0CCCCCCC #x0CCCCCCC
@ -41,9 +48,10 @@
[bits (or bits [bits (or bits
;; for portable bytecode, use a fixnum size tha ;; for portable bytecode, use a fixnum size tha
;; always works: ;; always works:
30)] 29)]
[lut [lut
(cond [(<= bits 8) lut8] (cond [(<= bits 8) lut8]
[(<= bits 29) lut29]
[(<= bits 30) lut30] [(<= bits 30) lut30]
[(<= bits 62) lut62] [(<= bits 62) lut62]
[else (raise-syntax-error "bit width too big" stx #'bits0)])]) [else (raise-syntax-error "bit width too big" stx #'bits0)])])