diff --git a/hw-simd.cabal b/hw-simd.cabal
--- a/hw-simd.cabal
+++ b/hw-simd.cabal
@@ -1,11 +1,9 @@
--- This file has been generated from package.yaml by hpack version 0.20.0.
+-- This file has been generated from package.yaml by hpack version 0.18.1.
 --
 -- see: https://github.com/sol/hpack
---
--- hash: d4e6b647bff1de25a793f93a5adb597bbbc16d00285948adf0c1aa4f8e3c542f
 
 name:           hw-simd
-version:        0.0.0.2
+version:        0.0.0.3
 synopsis:       SIMD library
 description:    Please see the README on Github at <https://github.com/haskell-works/hw-simd#readme>
 category:       Text, Web, CSV
@@ -53,15 +51,15 @@
   c-sources:
       cbits/simd.c
   build-depends:
-      base >=4.7 && <5
-    , bits-extra >=0.0.1.2 && <0.1
-    , bytestring >=0.10 && <0.11
-    , deepseq >=1.4 && <1.5
-    , hw-bits >=0.7.0.2 && <0.8
-    , hw-prim >=0.6.2.0 && <0.7
-    , hw-rankselect >=0.12.0.2 && <0.13
-    , hw-rankselect-base >=0.3.2.0 && <0.4
-    , vector >=0.12.0.1 && <0.13
+      base                  >= 4.7      && < 5
+    , bits-extra            >= 0.0.1.2  && < 0.1
+    , bytestring            >= 0.10     && < 0.11
+    , deepseq               >= 1.4      && < 1.5
+    , hw-bits               >= 0.7.0.2  && < 0.8
+    , hw-rankselect         >= 0.12.0.2 && < 0.13
+    , hw-rankselect-base    >= 0.3.2.0  && < 0.4
+    , hw-prim               >= 0.6.2.0  && < 0.7
+    , vector                >= 0.12.0.1 && < 0.13
   build-tools:
       c2hs
   if flag(sse42)
@@ -80,8 +78,8 @@
     ghc-options: -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints
   if (!impl(ghc >=8.0.1))
     build-depends:
-        semigroups >=0.8.4 && <0.19
-      , transformers >=0.4 && <0.6
+        transformers          >= 0.4        && < 0.6
+      , semigroups            >= 0.8.4      && < 0.19
   exposed-modules:
       HaskellWorks.Data.Simd.Capabilities
       HaskellWorks.Data.Simd.Comparison
@@ -103,21 +101,21 @@
       test
   ghc-options: -O2 -Wall -threaded -rtsopts -with-rtsopts=-N
   build-depends:
-      base >=4.7 && <5
-    , bits-extra >=0.0.1.2 && <0.1
-    , bytestring >=0.10 && <0.11
-    , deepseq >=1.4 && <1.5
-    , directory >=1.2.2 && <1.4
-    , hedgehog >=0.5 && <0.7
-    , hspec >=2.4 && <3
-    , hw-bits >=0.7.0.2 && <0.8
-    , hw-hspec-hedgehog >=0.1.0.4 && <0.2
-    , hw-prim >=0.6.2.0 && <0.7
-    , hw-rankselect >=0.12.0.2 && <0.13
-    , hw-rankselect-base >=0.3.2.0 && <0.4
+      base                  >= 4.7      && < 5
+    , bits-extra            >= 0.0.1.2  && < 0.1
+    , bytestring            >= 0.10     && < 0.11
+    , deepseq               >= 1.4      && < 1.5
+    , hw-bits               >= 0.7.0.2  && < 0.8
+    , hw-rankselect         >= 0.12.0.2 && < 0.13
+    , hw-rankselect-base    >= 0.3.2.0  && < 0.4
+    , hw-prim               >= 0.6.2.0  && < 0.7
+    , vector                >= 0.12.0.1 && < 0.13
+    , directory               >= 1.2.2      && < 1.4
     , hw-simd
-    , text >=1.2.2 && <2.0
-    , vector >=0.12.0.1 && <0.13
+    , hedgehog                >= 0.5        && < 0.7
+    , hspec                   >= 2.4        && < 3
+    , hw-hspec-hedgehog       >= 0.1.0.4    && < 0.2
+    , text                    >= 1.2.2      && < 2.0
   if flag(sse42)
     ghc-options: -msse4.2
     cc-options: -msse4.2
@@ -134,11 +132,10 @@
     ghc-options: -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints
   if (!impl(ghc >=8.0.1))
     build-depends:
-        semigroups >=0.8.4 && <0.19
-      , transformers >=0.4 && <0.6
+        transformers          >= 0.4        && < 0.6
+      , semigroups            >= 0.8.4      && < 0.19
   other-modules:
       HaskellWorks.Data.Simd.BroadwordSpec
-      Paths_hw_simd
   default-language: Haskell2010
 
 benchmark bench
@@ -148,21 +145,21 @@
       bench
   ghc-options: -O2 -Wall -msse4.2
   build-depends:
-      base >=4.7 && <5
-    , bits-extra >=0.0.1.2 && <0.1
-    , bytestring >=0.10 && <0.11
-    , cassava >=0.5.1.0 && <0.6
+      base                  >= 4.7      && < 5
+    , bits-extra            >= 0.0.1.2  && < 0.1
+    , bytestring            >= 0.10     && < 0.11
+    , deepseq               >= 1.4      && < 1.5
+    , hw-bits               >= 0.7.0.2  && < 0.8
+    , hw-rankselect         >= 0.12.0.2 && < 0.13
+    , hw-rankselect-base    >= 0.3.2.0  && < 0.4
+    , hw-prim               >= 0.6.2.0  && < 0.7
+    , vector                >= 0.12.0.1 && < 0.13
+    , cassava               >= 0.5.1.0    && < 0.6
     , containers
-    , criterion >=1.4.1.0 && <1.5
-    , deepseq >=1.4 && <1.5
-    , directory >=1.3.1.5 && <1.4
-    , hw-bits >=0.7.0.2 && <0.8
-    , hw-prim >=0.6.2.0 && <0.7
-    , hw-rankselect >=0.12.0.2 && <0.13
-    , hw-rankselect-base >=0.3.2.0 && <0.4
+    , criterion             >= 1.4.1.0    && < 1.5
+    , directory             >= 1.3.1.5    && < 1.4
     , hw-simd
-    , mmap >=0.5.9 && <0.6
-    , vector >=0.12.0.1 && <0.13
+    , mmap                  >= 0.5.9      && < 0.6
   if flag(sse42)
     ghc-options: -msse4.2
     cc-options: -msse4.2
@@ -179,8 +176,6 @@
     ghc-options: -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints
   if (!impl(ghc >=8.0.1))
     build-depends:
-        semigroups >=0.8.4 && <0.19
-      , transformers >=0.4 && <0.6
-  other-modules:
-      Paths_hw_simd
+        transformers          >= 0.4        && < 0.6
+      , semigroups            >= 0.8.4      && < 0.19
   default-language: Haskell2010
diff --git a/src/HaskellWorks/Data/Simd/Comparison/Stock.hs b/src/HaskellWorks/Data/Simd/Comparison/Stock.hs
--- a/src/HaskellWorks/Data/Simd/Comparison/Stock.hs
+++ b/src/HaskellWorks/Data/Simd/Comparison/Stock.hs
@@ -2,38 +2,54 @@
   ( cmpeq8s
   ) where
 
-import Data.Monoid                          ((<>))
 import Data.Word
 import HaskellWorks.Data.AtIndex
 import HaskellWorks.Data.Bits.BitWise
 import HaskellWorks.Data.Simd.Internal.Bits
+import HaskellWorks.Data.Simd.Internal.Broadword
 
 import qualified Data.Vector.Storable as DVS
 
 cmpeq8s :: Word8 -> DVS.Vector Word64 -> DVS.Vector Word64
-cmpeq8s w8 v = if disalignment == 0
-  then DVS.constructN (DVS.length v) go
-  else error $ "Unaligned byte string: " <> show disalignment <> ", vLen: " <> show vLen
-  where vLen          = DVS.length v
-        disalignment  = vLen - (vLen `div` 8) * 8
-        w64           = fromIntegral w8 * 0x0101010101010101 :: Word64
+cmpeq8s w8 v = DVS.constructN ((DVS.length v + 7) `div` 8) go
+  where iw = fillWord64 w8
         go :: DVS.Vector Word64 -> Word64
-        go u = comp w
-          where ui = fromIntegral $ DVS.length u
-                w0 = testWord8s ((u !!! (ui + 0)) .^. w64)
-                w1 = testWord8s ((u !!! (ui + 1)) .^. w64)
-                w2 = testWord8s ((u !!! (ui + 2)) .^. w64)
-                w3 = testWord8s ((u !!! (ui + 3)) .^. w64)
-                w4 = testWord8s ((u !!! (ui + 4)) .^. w64)
-                w5 = testWord8s ((u !!! (ui + 5)) .^. w64)
-                w6 = testWord8s ((u !!! (ui + 6)) .^. w64)
-                w7 = testWord8s ((u !!! (ui + 7)) .^. w64)
-                w   = (w7 .<. 56) .|.
-                      (w6 .<. 48) .|.
-                      (w5 .<. 40) .|.
-                      (w4 .<. 32) .|.
-                      (w3 .<. 24) .|.
-                      (w2 .<. 16) .|.
-                      (w1 .<.  8) .|.
-                       w0
+        go u = let ui = end u in
+          if ui * 8 + 8 < end v
+            then  let vi  = ui * 8
+                      w0  = testWord8s ((v !!! (vi + 0)) .^. iw)
+                      w1  = testWord8s ((v !!! (vi + 1)) .^. iw)
+                      w2  = testWord8s ((v !!! (vi + 2)) .^. iw)
+                      w3  = testWord8s ((v !!! (vi + 3)) .^. iw)
+                      w4  = testWord8s ((v !!! (vi + 4)) .^. iw)
+                      w5  = testWord8s ((v !!! (vi + 5)) .^. iw)
+                      w6  = testWord8s ((v !!! (vi + 6)) .^. iw)
+                      w7  = testWord8s ((v !!! (vi + 7)) .^. iw)
+                      w   = (w7 .<. 56) .|.
+                            (w6 .<. 48) .|.
+                            (w5 .<. 40) .|.
+                            (w4 .<. 32) .|.
+                            (w3 .<. 24) .|.
+                            (w2 .<. 16) .|.
+                            (w1 .<.  8) .|.
+                              w0
+                  in comp w
+            else  let vi  = ui * 8
+                      w0  = testWord8s (atIndexOr 0 v (vi + 0) .^. iw)
+                      w1  = testWord8s (atIndexOr 0 v (vi + 1) .^. iw)
+                      w2  = testWord8s (atIndexOr 0 v (vi + 2) .^. iw)
+                      w3  = testWord8s (atIndexOr 0 v (vi + 3) .^. iw)
+                      w4  = testWord8s (atIndexOr 0 v (vi + 4) .^. iw)
+                      w5  = testWord8s (atIndexOr 0 v (vi + 5) .^. iw)
+                      w6  = testWord8s (atIndexOr 0 v (vi + 6) .^. iw)
+                      w7  = testWord8s (atIndexOr 0 v (vi + 7) .^. iw)
+                      w   = (w7 .<. 56) .|.
+                            (w6 .<. 48) .|.
+                            (w5 .<. 40) .|.
+                            (w4 .<. 32) .|.
+                            (w3 .<. 24) .|.
+                            (w2 .<. 16) .|.
+                            (w1 .<.  8) .|.
+                            w0
+                  in comp w
 {-# INLINE cmpeq8s #-}
