diff --git a/hw-prim.cabal b/hw-prim.cabal
--- a/hw-prim.cabal
+++ b/hw-prim.cabal
@@ -1,7 +1,7 @@
 cabal-version:  2.2
 
 name:           hw-prim
-version:        0.6.2.23
+version:        0.6.2.24
 synopsis:       Primitive functions and data types
 description:    Primitive functions and data types.
 category:       Data
@@ -10,10 +10,10 @@
 bug-reports:    https://github.com/haskell-works/hw-prim/issues
 author:         John Ky
 maintainer:     newhoggy@gmail.com
-copyright:      2016-2018 John Ky
+copyright:      2016-2019 John Ky
 license:        BSD-3-Clause
 license-file:   LICENSE
-tested-with:    GHC == 8.6.3, GHC == 8.4.4, GHC == 8.2.2, GHC == 8.0.2
+tested-with:    GHC == 8.6.5, GHC == 8.4.4, GHC == 8.2.2
 build-type:     Simple
 extra-source-files:
     README.md
@@ -34,11 +34,12 @@
 common criterion            { build-depends: criterion            >= 1.2        && < 1.6    }
 common directory            { build-depends: directory            >= 1.2        && < 1.4    }
 common exceptions           { build-depends: exceptions           >= 0.8        && < 0.11   }
-common hedgehog             { build-depends: hedgehog             >= 0.5        && < 0.7    }
+common ghc-prim             { build-depends: ghc-prim                                       }
+common hedgehog             { build-depends: hedgehog             >= 0.5        && < 1.1    }
 common hspec                { build-depends: hspec                >= 2.4        && < 2.6    }
 common hw-hspec-hedgehog    { build-depends: hw-hspec-hedgehog    >= 0.1        && < 0.2    }
 common mmap                 { build-depends: mmap                 >= 0.5        && < 0.6    }
-common semigroups           { build-depends: semigroups           >= 0.8.4      && < 0.19   }
+common semigroups           { build-depends: semigroups           >= 0.8.4      && < 0.20   }
 common transformers         { build-depends: transformers         >= 0.4        && < 0.6    }
 common vector               { build-depends: vector               >= 0.12       && < 0.13   }
 
@@ -52,47 +53,49 @@
   import:   base
           , common
           , bytestring
+          , ghc-prim
           , mmap
           , semigroups
           , transformers
           , vector
   exposed-modules:
-      HaskellWorks.Data.AtIndex
-      HaskellWorks.Data.ByteString
-      HaskellWorks.Data.ByteString.Builder
-      HaskellWorks.Data.ByteString.Lazy
-      HaskellWorks.Data.Char
-      HaskellWorks.Data.Char.IsChar
-      HaskellWorks.Data.Concat
-      HaskellWorks.Data.Container
-      HaskellWorks.Data.Decode
-      HaskellWorks.Data.Drop
-      HaskellWorks.Data.Empty
-      HaskellWorks.Data.Filter
-      HaskellWorks.Data.FromByteString
-      HaskellWorks.Data.FromForeignRegion
-      HaskellWorks.Data.Generate
-      HaskellWorks.Data.Head
-      HaskellWorks.Data.Length
-      HaskellWorks.Data.Naive
-      HaskellWorks.Data.Positioning
-      HaskellWorks.Data.Product
-      HaskellWorks.Data.Search
-      HaskellWorks.Data.Sign
-      HaskellWorks.Data.Snoc
-      HaskellWorks.Data.Take
-      HaskellWorks.Data.TreeCursor
-      HaskellWorks.Data.Uncons
-      HaskellWorks.Data.Unsign
-      HaskellWorks.Data.Vector.AsVector64
-      HaskellWorks.Data.Vector.AsVector64ns
-      HaskellWorks.Data.Vector.AsVector64s
-      HaskellWorks.Data.Vector.AsVector8
-      HaskellWorks.Data.Vector.AsVector8ns
-      HaskellWorks.Data.Vector.AsVector8s
-      HaskellWorks.Data.Vector.BoxedVectorLike
-      HaskellWorks.Data.Vector.Storable
-      HaskellWorks.Data.Vector.StorableVectorLike
+    HaskellWorks.Data.AtIndex
+    HaskellWorks.Data.Branchless
+    HaskellWorks.Data.ByteString
+    HaskellWorks.Data.ByteString.Builder
+    HaskellWorks.Data.ByteString.Lazy
+    HaskellWorks.Data.Char
+    HaskellWorks.Data.Char.IsChar
+    HaskellWorks.Data.Concat
+    HaskellWorks.Data.Container
+    HaskellWorks.Data.Decode
+    HaskellWorks.Data.Drop
+    HaskellWorks.Data.Empty
+    HaskellWorks.Data.Filter
+    HaskellWorks.Data.FromByteString
+    HaskellWorks.Data.FromForeignRegion
+    HaskellWorks.Data.Generate
+    HaskellWorks.Data.Head
+    HaskellWorks.Data.Length
+    HaskellWorks.Data.Naive
+    HaskellWorks.Data.Positioning
+    HaskellWorks.Data.Product
+    HaskellWorks.Data.Search
+    HaskellWorks.Data.Sign
+    HaskellWorks.Data.Snoc
+    HaskellWorks.Data.Take
+    HaskellWorks.Data.TreeCursor
+    HaskellWorks.Data.Uncons
+    HaskellWorks.Data.Unsign
+    HaskellWorks.Data.Vector.AsVector64
+    HaskellWorks.Data.Vector.AsVector64ns
+    HaskellWorks.Data.Vector.AsVector64s
+    HaskellWorks.Data.Vector.AsVector8
+    HaskellWorks.Data.Vector.AsVector8ns
+    HaskellWorks.Data.Vector.AsVector8s
+    HaskellWorks.Data.Vector.BoxedVectorLike
+    HaskellWorks.Data.Vector.Storable
+    HaskellWorks.Data.Vector.StorableVectorLike
   other-modules:      Paths_hw_prim
   autogen-modules:    Paths_hw_prim
   hs-source-dirs:     src
@@ -115,16 +118,16 @@
   type: exitcode-stdio-1.0
   main-is: Spec.hs
   other-modules:
-      HaskellWorks.Data.ByteStringSpec
-      HaskellWorks.Data.FromByteStringSpec
-      HaskellWorks.Data.FromForeignRegionSpec
-      HaskellWorks.Data.SearchSpec
-      HaskellWorks.Data.Vector.AsVector64nsSpec
-      HaskellWorks.Data.Vector.AsVector64sSpec
-      HaskellWorks.Data.Vector.AsVector8nsSpec
-      HaskellWorks.Data.Vector.AsVector8sSpec
-      HaskellWorks.Data.Vector.StorableSpec
-      Paths_hw_prim
+    HaskellWorks.Data.ByteStringSpec
+    HaskellWorks.Data.FromByteStringSpec
+    HaskellWorks.Data.FromForeignRegionSpec
+    HaskellWorks.Data.SearchSpec
+    HaskellWorks.Data.Vector.AsVector64nsSpec
+    HaskellWorks.Data.Vector.AsVector64sSpec
+    HaskellWorks.Data.Vector.AsVector8nsSpec
+    HaskellWorks.Data.Vector.AsVector8sSpec
+    HaskellWorks.Data.Vector.StorableSpec
+    Paths_hw_prim
   autogen-modules:    Paths_hw_prim
   build-depends:      hw-prim
   hs-source-dirs:     test
diff --git a/src/HaskellWorks/Data/Branchless.hs b/src/HaskellWorks/Data/Branchless.hs
new file mode 100644
--- /dev/null
+++ b/src/HaskellWorks/Data/Branchless.hs
@@ -0,0 +1,91 @@
+{-# LANGUAGE MagicHash #-}
+
+module HaskellWorks.Data.Branchless
+  ( ltWord8
+  , ltWord16
+  , ltWord32
+  , ltWord64
+
+  , leWord8
+  , leWord16
+  , leWord32
+  , leWord64
+
+  , gtWord8
+  , gtWord16
+  , gtWord32
+  , gtWord64
+
+  , geWord8
+  , geWord16
+  , geWord32
+  , geWord64
+  ) where
+
+import GHC.Int
+import GHC.Prim
+import GHC.Word (Word16 (..), Word32 (..), Word64 (..), Word8 (..))
+
+ltWord8 :: Word8 -> Word8 -> Word8
+ltWord8 (W8# a#) (W8# b#) = fromIntegral (I8# (ltWord# a# b#))
+{-# INLINE ltWord8 #-}
+
+ltWord16 :: Word16 -> Word16 -> Word16
+ltWord16 (W16# a#) (W16# b#) = fromIntegral (I16# (ltWord# a# b#))
+{-# INLINE ltWord16 #-}
+
+ltWord32 :: Word32 -> Word32 -> Word32
+ltWord32 (W32# a#) (W32# b#) = fromIntegral (I32# (ltWord# a# b#))
+{-# INLINE ltWord32 #-}
+
+ltWord64 :: Word64 -> Word64 -> Word64
+ltWord64 (W64# a#) (W64# b#) = fromIntegral (I64# (ltWord# a# b#))
+{-# INLINE ltWord64 #-}
+
+leWord8 :: Word8 -> Word8 -> Word8
+leWord8 (W8# a#) (W8# b#) = fromIntegral (I8# (leWord# a# b#))
+{-# INLINE leWord8 #-}
+
+leWord16 :: Word16 -> Word16 -> Word16
+leWord16 (W16# a#) (W16# b#) = fromIntegral (I16# (leWord# a# b#))
+{-# INLINE leWord16 #-}
+
+leWord32 :: Word32 -> Word32 -> Word32
+leWord32 (W32# a#) (W32# b#) = fromIntegral (I32# (leWord# a# b#))
+{-# INLINE leWord32 #-}
+
+leWord64 :: Word64 -> Word64 -> Word64
+leWord64 (W64# a#) (W64# b#) = fromIntegral (I64# (leWord# a# b#))
+{-# INLINE leWord64 #-}
+
+gtWord8 :: Word8 -> Word8 -> Word8
+gtWord8 (W8# a#) (W8# b#) = fromIntegral (I8# (gtWord# a# b#))
+{-# INLINE gtWord8 #-}
+
+gtWord16 :: Word16 -> Word16 -> Word16
+gtWord16 (W16# a#) (W16# b#) = fromIntegral (I16# (gtWord# a# b#))
+{-# INLINE gtWord16 #-}
+
+gtWord32 :: Word32 -> Word32 -> Word32
+gtWord32 (W32# a#) (W32# b#) = fromIntegral (I32# (gtWord# a# b#))
+{-# INLINE gtWord32 #-}
+
+gtWord64 :: Word64 -> Word64 -> Word64
+gtWord64 (W64# a#) (W64# b#) = fromIntegral (I64# (gtWord# a# b#))
+{-# INLINE gtWord64 #-}
+
+geWord8 :: Word8 -> Word8 -> Word8
+geWord8 (W8# a#) (W8# b#) = fromIntegral (I8# (geWord# a# b#))
+{-# INLINE geWord8 #-}
+
+geWord16 :: Word16 -> Word16 -> Word16
+geWord16 (W16# a#) (W16# b#) = fromIntegral (I16# (geWord# a# b#))
+{-# INLINE geWord16 #-}
+
+geWord32 :: Word32 -> Word32 -> Word32
+geWord32 (W32# a#) (W32# b#) = fromIntegral (I32# (geWord# a# b#))
+{-# INLINE geWord32 #-}
+
+geWord64 :: Word64 -> Word64 -> Word64
+geWord64 (W64# a#) (W64# b#) = fromIntegral (I64# (geWord# a# b#))
+{-# INLINE geWord64 #-}
