{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE ScopedTypeVariables #-}
module HaskellWorks.Data.BalancedParens.Internal.Broadword.FindUnmatchedCloseFar.Word32
( findUnmatchedCloseFar
) where
import Data.Int
import Data.Word
import HaskellWorks.Data.Bits.BitWise
import HaskellWorks.Data.Bits.Broadword.Word32
import HaskellWorks.Data.Int.Narrow
import HaskellWorks.Data.Int.Widen
muk1 :: Word32
muk1 :: Word32
muk1 = Word32
0x33333333
{-# INLINE muk1 #-}
muk2 :: Word32
muk2 :: Word32
muk2 = Word32
0x0f0f0f0f
{-# INLINE muk2 #-}
muk3 :: Word32
muk3 :: Word32
muk3 = Word32
0x00ff00ff
{-# INLINE muk3 #-}
muk4 :: Word32
muk4 :: Word32
muk4 = Word32
0x0000ffff
{-# INLINE muk4 #-}
findUnmatchedCloseFar :: Word64 -> Word64 -> Word32 -> Word64
findUnmatchedCloseFar :: Word64 -> Word64 -> Word32 -> Word64
findUnmatchedCloseFar Word64
c Word64
p Word32
w =
let x :: Word32
x = Word32
w Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Word64
p in
let wsz :: Int32
wsz = Int32
32 :: Int32 in
let k1 :: Word64
k1 = Word64
1 in
let k2 :: Word64
k2 = Word64
2 in
let k3 :: Word64
k3 = Word64
3 in
let k4 :: Word64
k4 = Word64
4 in
let k5 :: Word64
k5 = Word64
5 in
let mask1 :: Word32
mask1 = (Word32
1 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.<. (Word64
1 Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
k1)) Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
- Word32
1 in
let mask2 :: Word32
mask2 = (Word32
1 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.<. (Word64
1 Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
k2)) Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
- Word32
1 in
let mask3 :: Word32
mask3 = (Word32
1 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.<. (Word64
1 Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
k3)) Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
- Word32
1 in
let mask4 :: Word32
mask4 = (Word32
1 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.<. (Word64
1 Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
k4)) Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
- Word32
1 in
let mask5 :: Word32
mask5 = (Word32
1 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.<. (Word64
1 Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
k5)) Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
- Word32
1 in
let t64k1 :: Word64
t64k1 = Word64
1 Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
k1 :: Word64 in
let t64k2 :: Word64
t64k2 = Word64
1 Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
k2 :: Word64 in
let t64k3 :: Word64
t64k3 = Word64
1 Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
k3 :: Word64 in
let t64k4 :: Word64
t64k4 = Word64
1 Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
k4 :: Word64 in
let t8k1 :: Word32
t8k1 = Word32
1 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.<. Word64
k1 :: Word32 in
let t8k2 :: Word32
t8k2 = Word32
1 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.<. Word64
k2 :: Word32 in
let t8k3 :: Word32
t8k3 = Word32
1 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.<. Word64
k3 :: Word32 in
let t8k4 :: Word32
t8k4 = Word32
1 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.<. Word64
k4 :: Word32 in
let t8k5 :: Word32
t8k5 = Word32
1 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.<. Word64
k5 :: Word32 in
let b0 :: Word32
b0 = Word32
x Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
0x55555555 in
let b1 :: Word32
b1 = ( Word32
x Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
0xaaaaaaaa) Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Word64
1 in
let ll :: Word32
ll = (Word32
b0 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.^. Word32
b1 ) Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
b1 in
let ok1 :: Word32
ok1 = ( (Word32
b0 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
b1 ) Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.<. Word64
1) Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.|. Word32
ll in
let ck1 :: Word32
ck1 = (((Word32
b0 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.|. Word32
b1 ) Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.^. Word32
0x55555555) Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.<. Word64
1) Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.|. Word32
ll in
let eok1 :: Word32
eok1 = Word32
ok1 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
muk1 in
let eck1 :: Word32
eck1 = (Word32
ck1 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. (Word32
muk1 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.<. Word64
t64k1)) Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Word64
t64k1 in
let ok2L :: Word32
ok2L = (Word32
ok1 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. (Word32
muk1 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.<. Word64
t64k1)) Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Word64
t64k1 in
let ok2R :: Word32
ok2R = Int -> Word32 -> Word32 -> Word32
kBitDiffPos Int
4 Word32
eok1 Word32
eck1 in
let ok2 :: Word32
ok2 = Word32
ok2L Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+ Word32
ok2R in
let ck2 :: Word32
ck2 = (Word32
ck1 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
muk1) Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+ Int -> Word32 -> Word32 -> Word32
kBitDiffPos Int
4 Word32
eck1 Word32
eok1 in
let eok2 :: Word32
eok2 = Word32
ok2 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
muk2 in
let eck2 :: Word32
eck2 = (Word32
ck2 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. (Word32
muk2 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.<. Word64
t64k2)) Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Word64
t64k2 in
let ok3L :: Word32
ok3L = ((Word32
ok2 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. (Word32
muk2 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.<. Word64
t64k2)) Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Word64
t64k2) in
let ok3R :: Word32
ok3R = Int -> Word32 -> Word32 -> Word32
kBitDiffPos Int
8 Word32
eok2 Word32
eck2 in
let ok3 :: Word32
ok3 = Word32
ok3L Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+ Word32
ok3R in
let ck3 :: Word32
ck3 = (Word32
ck2 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
muk2) Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+ Int -> Word32 -> Word32 -> Word32
kBitDiffPos Int
8 Word32
eck2 Word32
eok2 in
let eok3 :: Word32
eok3 = Word32
ok3 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
muk3 in
let eck3 :: Word32
eck3 = (Word32
ck3 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. (Word32
muk3 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.<. Word64
t64k3)) Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Word64
t64k3 in
let ok4L :: Word32
ok4L = ((Word32
ok3 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. (Word32
muk3 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.<. Word64
t64k3)) Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Word64
t64k3) in
let ok4R :: Word32
ok4R = Int -> Word32 -> Word32 -> Word32
kBitDiffPos Int
16 Word32
eok3 Word32
eck3 in
let ok4 :: Word32
ok4 = Word32
ok4L Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+ Word32
ok4R in
let ck4 :: Word32
ck4 = (Word32
ck3 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
muk3) Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+ Int -> Word32 -> Word32 -> Word32
kBitDiffPos Int
16 Word32
eck3 Word32
eok3 in
let eok4 :: Word32
eok4 = Word32
ok4 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
muk4 in
let eck4 :: Word32
eck4 = (Word32
ck4 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. (Word32
muk4 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.<. Word64
t64k4)) Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Word64
t64k4 in
let ok5L :: Word32
ok5L = ((Word32
ok4 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. (Word32
muk4 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.<. Word64
t64k4)) Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Word64
t64k4) in
let ok5R :: Word32
ok5R = Int -> Word32 -> Word32 -> Word32
kBitDiffPos Int
32 Word32
eok4 Word32
eck4 in
let ok5 :: Word32
ok5 = Word32
ok5L Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+ Word32
ok5R in
let ck5 :: Word32
ck5 = (Word32
ck4 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
muk4) Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+ Int -> Word32 -> Word32 -> Word32
kBitDiffPos Int
32 Word32
eck4 Word32
eok4 in
let pak5 :: Word64
pak5 = Word64
c in
let sak5 :: Word64
sak5 = Word64
0 in
let hk5 :: Word32
hk5 = Word32
0x00200020 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32 -> Word32
forall a. BitWise a => a -> a
comp (Word32
0xffffffff Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Word64 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak5) in
let fk5 :: Word32
fk5 = ((Word32
ck5 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Word64 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak5) Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.|. Word32
hk5) Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
mask5 in
let bk5 :: Word32
bk5 = ((Word64 -> Word32
forall a b. Narrow a b => a -> b
narrow Word64
pak5 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
- Word32
fk5) Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Int32 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int32
wsz Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
- Int32
1)) Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
- Word32
1 in
let mk5 :: Word32
mk5 = Word32
bk5 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
mask5 in
let pbk5 :: Word64
pbk5 = Word64
pak5 Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
- Word32 -> Word64
forall a b. Widen a b => a -> b
widen ((Word32
ck5 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Word64 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak5) Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
mk5) in
let pck5 :: Word64
pck5 = Word64
pbk5 Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
+ Word32 -> Word64
forall a b. Widen a b => a -> b
widen ((Word32
ok5 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Word64 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak5) Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
mk5) in
let sbk5 :: Word64
sbk5 = Word64
sak5 Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
+ Word32 -> Word64
forall a b. Widen a b => a -> b
widen (Word32
t8k5 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
bk5) in
let pak4 :: Word64
pak4 = Word64
pck5 in
let sak4 :: Word64
sak4 = Word64
sbk5 in
let hk4 :: Word32
hk4 = Word32
0x00100010 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32 -> Word32
forall a. BitWise a => a -> a
comp (Word32
0xffffffff Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Word64 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak4) in
let fk4 :: Word32
fk4 = ((Word32
ck4 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Word64 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak4) Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.|. Word32
hk4) Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
mask4 in
let bk4 :: Word32
bk4 = ((Word64 -> Word32
forall a b. Narrow a b => a -> b
narrow Word64
pak4 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
- Word32
fk4) Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Int32 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int32
wsz Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
- Int32
1)) Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
- Word32
1 in
let mk4 :: Word32
mk4 = Word32
bk4 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
mask4 in
let pbk4 :: Word64
pbk4 = Word64
pak4 Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
- Word32 -> Word64
forall a b. Widen a b => a -> b
widen (((Word32
ck4 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Word64 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak4) Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.|. Word32
hk4) Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
mk4) in
let pck4 :: Word64
pck4 = Word64
pbk4 Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
+ Word32 -> Word64
forall a b. Widen a b => a -> b
widen ( (Word32
ok4 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Word64 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak4) Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
mk4) in
let sbk4 :: Word64
sbk4 = Word64
sak4 Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
+ Word32 -> Word64
forall a b. Widen a b => a -> b
widen (Word32
t8k4 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
bk4) in
let pak3 :: Word64
pak3 = Word64
pck4 in
let sak3 :: Word64
sak3 = Word64
sbk4 in
let hk3 :: Word32
hk3 = Word32
0x08080808 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32 -> Word32
forall a. BitWise a => a -> a
comp (Word32
0xffffffff Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Word64 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak3) in
let fk3 :: Word32
fk3 = ((Word32
ck3 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Word64 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak3) Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.|. Word32
hk3) Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
mask3 in
let bk3 :: Word32
bk3 = ((Word64 -> Word32
forall a b. Narrow a b => a -> b
narrow Word64
pak3 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
- Word32
fk3) Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Int32 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int32
wsz Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
- Int32
1)) Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
- Word32
1 in
let mk3 :: Word32
mk3 = Word32
bk3 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
mask3 in
let pbk3 :: Word64
pbk3 = Word64
pak3 Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
- Word32 -> Word64
forall a b. Widen a b => a -> b
widen (((Word32
ck3 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Word64 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak3) Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.|. Word32
hk3) Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
mk3) in
let pck3 :: Word64
pck3 = Word64
pbk3 Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
+ Word32 -> Word64
forall a b. Widen a b => a -> b
widen ( (Word32
ok3 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Word64 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak3) Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
mk3) in
let sbk3 :: Word64
sbk3 = Word64
sak3 Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
+ Word32 -> Word64
forall a b. Widen a b => a -> b
widen (Word32
t8k3 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
bk3) in
let pak2 :: Word64
pak2 = Word64
pck3 in
let sak2 :: Word64
sak2 = Word64
sbk3 in
let hk2 :: Word32
hk2 = Word32
0x44444444 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32 -> Word32
forall a. BitWise a => a -> a
comp (Word32
0xffffffff Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Word64 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak2) in
let fk2 :: Word32
fk2 = ((Word32
ck2 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Word64 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak2) Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.|. Word32
hk2) Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
mask2 in
let bk2 :: Word32
bk2 = ((Word64 -> Word32
forall a b. Narrow a b => a -> b
narrow Word64
pak2 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
- Word32
fk2) Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Int32 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int32
wsz Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
- Int32
1)) Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
- Word32
1 in
let mk2 :: Word32
mk2 = Word32
bk2 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
mask2 in
let pbk2 :: Word64
pbk2 = Word64
pak2 Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
- Word32 -> Word64
forall a b. Widen a b => a -> b
widen (((Word32
ck2 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Word64 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak2) Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.|. Word32
hk2) Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
mk2) in
let pck2 :: Word64
pck2 = Word64
pbk2 Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
+ Word32 -> Word64
forall a b. Widen a b => a -> b
widen ( (Word32
ok2 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Word64 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak2) Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
mk2) in
let sbk2 :: Word64
sbk2 = Word64
sak2 Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
+ Word32 -> Word64
forall a b. Widen a b => a -> b
widen (Word32
t8k2 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
bk2) in
let pak1 :: Word64
pak1 = Word64
pck2 in
let sak1 :: Word64
sak1 = Word64
sbk2 in
let hk1 :: Word32
hk1 = Word32
0xaaaaaaaa Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32 -> Word32
forall a. BitWise a => a -> a
comp (Word32
0xffffffff Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Word64 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak1) in
let fk1 :: Word32
fk1 = ((Word32
ck1 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Word64 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak1) Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.|. Word32
hk1) Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
mask1 in
let bk1 :: Word32
bk1 = ((Word64 -> Word32
forall a b. Narrow a b => a -> b
narrow Word64
pak1 Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
- Word32
fk1) Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Int32 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int32
wsz Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
- Int32
1)) Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
- Word32
1 in
let mk1 :: Word32
mk1 = Word32
bk1 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
mask1 in
let pbk1 :: Word64
pbk1 = Word64
pak1 Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
- Word32 -> Word64
forall a b. Widen a b => a -> b
widen (((Word32
ck1 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Word64 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak1) Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.|. Word32
hk1) Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
mk1) in
let pck1 :: Word64
pck1 = Word64
pbk1 Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
+ Word32 -> Word64
forall a b. Widen a b => a -> b
widen ( (Word32
ok1 Word32 -> Word64 -> Word32
forall a. Shift a => a -> Word64 -> a
.>. Word64 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak1) Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
mk1) in
let sbk1 :: Word64
sbk1 = Word64
sak1 Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
+ Word32 -> Word64
forall a b. Widen a b => a -> b
widen (Word32
t8k1 Word32 -> Word32 -> Word32
forall a. BitWise a => a -> a -> a
.&. Word32
bk1) in
let rrr :: Word64
rrr = Word64
sbk1 Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
+ Word64
pck1 Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
+ (((Word32 -> Word64
forall a b. Widen a b => a -> b
widen Word32
x Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.>. Word64 -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sbk1) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.&. ((Word64
pck1 Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
1) Word64 -> Word64 -> Word64
forall a. BitWise a => a -> a -> a
.|. Word64
1)) Word64 -> Word64 -> Word64
forall a. Shift a => a -> Word64 -> a
.<. Word64
1) in
Word64
rrr Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
+ Word64
p
{-# INLINE findUnmatchedCloseFar #-}