{-# LANGUAGE FlexibleContexts    #-}
{-# LANGUAGE FlexibleInstances   #-}
{-# LANGUAGE ScopedTypeVariables #-}

module HaskellWorks.Data.BalancedParens.Internal.Broadword.FindUnmatchedCloseFar.Word64
  ( findUnmatchedCloseFar
  ) where

import Data.Int
import Data.Word
import HaskellWorks.Data.Bits.BitWise
import HaskellWorks.Data.Bits.Broadword.Word64

muk1 :: Word64
muk1 :: Word64
muk1 = Word64
0x3333333333333333
{-# INLINE muk1 #-}

muk2 :: Word64
muk2 :: Word64
muk2 = Word64
0x0f0f0f0f0f0f0f0f
{-# INLINE muk2 #-}

muk3 :: Word64
muk3 :: Word64
muk3 = Word64
0x00ff00ff00ff00ff
{-# INLINE muk3 #-}

muk4 :: Word64
muk4 :: Word64
muk4 = Word64
0x0000ffff0000ffff
{-# INLINE muk4 #-}

muk5 :: Word64
muk5 :: Word64
muk5 = Word64
0x00000000ffffffff
{-# INLINE muk5 #-}

-- | Find the position of the first unmatch parenthesis.
--
-- This is the broadword implementation of 'HaskellWorks.Data.BalancedParens.Internal.Slow.Word64.findCloseFor'.
--
-- See [Broadword Implementation of Parenthesis Queries](https://arxiv.org/pdf/1301.5468.pdf), Sebastiano Vigna, 2013
findUnmatchedCloseFar :: Word64 -> Word64 -> Word64 -> Word64
findUnmatchedCloseFar :: Word64 -> Word64 -> Word64 -> Word64
findUnmatchedCloseFar Word64
c Word64
p Word64
w =
  --  Keys:
  --    * k1: Level of sub-words of size 2 = 1 .<. 1
  --    * k2: Level of sub-words of size 4 = 1 .<. 2
  --    * k3: Level of sub-words of size 8 = 1 .<. 3
  --    * o: Open count
  --    * c: Close count
  --    * e: Excess
  --    * L: Left half of sub-word
  --    * R: Right half of sub-word
  --    * b: deficit at position whole-word mask
  --    * m: deficit at position sub-word mask
  --    * pa: position accumulator
  --    * sa: shift accumulator
  --    * f: far sub-block close parens count
  let x :: Word64
x     = Word64
w forall a. Shift a => a -> Word64 -> a
.>. Word64
p                                                                     in
  let wsz :: Int64
wsz   = Int64
64 :: Int64                                                                 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 k6 :: Word64
k6    = Word64
6                                                                           in
  let mask1 :: Word64
mask1 = (Word64
1 forall a. Shift a => a -> Word64 -> a
.<. (Word64
1 forall a. Shift a => a -> Word64 -> a
.<. Word64
k1)) forall a. Num a => a -> a -> a
- Word64
1                                                      in
  let mask2 :: Word64
mask2 = (Word64
1 forall a. Shift a => a -> Word64 -> a
.<. (Word64
1 forall a. Shift a => a -> Word64 -> a
.<. Word64
k2)) forall a. Num a => a -> a -> a
- Word64
1                                                      in
  let mask3 :: Word64
mask3 = (Word64
1 forall a. Shift a => a -> Word64 -> a
.<. (Word64
1 forall a. Shift a => a -> Word64 -> a
.<. Word64
k3)) forall a. Num a => a -> a -> a
- Word64
1                                                      in
  let mask4 :: Word64
mask4 = (Word64
1 forall a. Shift a => a -> Word64 -> a
.<. (Word64
1 forall a. Shift a => a -> Word64 -> a
.<. Word64
k4)) forall a. Num a => a -> a -> a
- Word64
1                                                      in
  let mask5 :: Word64
mask5 = (Word64
1 forall a. Shift a => a -> Word64 -> a
.<. (Word64
1 forall a. Shift a => a -> Word64 -> a
.<. Word64
k5)) forall a. Num a => a -> a -> a
- Word64
1                                                      in
  let mask6 :: Word64
mask6 = (Word64
1 forall a. Shift a => a -> Word64 -> a
.<. (Word64
1 forall a. Shift a => a -> Word64 -> a
.<. Word64
k6)) forall a. Num a => a -> a -> a
- Word64
1                                                      in
  let t64k1 :: Word64
t64k1 = Word64
1 forall a. Shift a => a -> Word64 -> a
.<. Word64
k1 :: Word64                                                          in
  let t64k2 :: Word64
t64k2 = Word64
1 forall a. Shift a => a -> Word64 -> a
.<. Word64
k2 :: Word64                                                          in
  let t64k3 :: Word64
t64k3 = Word64
1 forall a. Shift a => a -> Word64 -> a
.<. Word64
k3 :: Word64                                                          in
  let t64k4 :: Word64
t64k4 = Word64
1 forall a. Shift a => a -> Word64 -> a
.<. Word64
k4 :: Word64                                                          in
  let t64k5 :: Word64
t64k5 = Word64
1 forall a. Shift a => a -> Word64 -> a
.<. Word64
k5 :: Word64                                                          in
  let t8k1 :: Word64
t8k1  = Word64
1 forall a. Shift a => a -> Word64 -> a
.<. Word64
k1 :: Word64                                                          in
  let t8k2 :: Word64
t8k2  = Word64
1 forall a. Shift a => a -> Word64 -> a
.<. Word64
k2 :: Word64                                                          in
  let t8k3 :: Word64
t8k3  = Word64
1 forall a. Shift a => a -> Word64 -> a
.<. Word64
k3 :: Word64                                                          in
  let t8k4 :: Word64
t8k4  = Word64
1 forall a. Shift a => a -> Word64 -> a
.<. Word64
k4 :: Word64                                                          in
  let t8k5 :: Word64
t8k5  = Word64
1 forall a. Shift a => a -> Word64 -> a
.<. Word64
k5 :: Word64                                                          in
  let t8k6 :: Word64
t8k6  = Word64
1 forall a. Shift a => a -> Word64 -> a
.<. Word64
k6 :: Word64                                                          in

  let b0 :: Word64
b0    =      Word64
x forall a. BitWise a => a -> a -> a
.&. Word64
0x5555555555555555                                               in
  let b1 :: Word64
b1    =    ( Word64
x forall a. BitWise a => a -> a -> a
.&. Word64
0xaaaaaaaaaaaaaaaa) forall a. Shift a => a -> Word64 -> a
.>. Word64
1                                        in
  let ll :: Word64
ll    =   (Word64
b0  forall a. BitWise a => a -> a -> a
.^. Word64
b1  ) forall a. BitWise a => a -> a -> a
.&. Word64
b1                                                     in
  let ok1 :: Word64
ok1   = ( (Word64
b0  forall a. BitWise a => a -> a -> a
.&. Word64
b1  )                         forall a. Shift a => a -> Word64 -> a
.<. Word64
1) forall a. BitWise a => a -> a -> a
.|. Word64
ll                      in
  let ck1 :: Word64
ck1   = (((Word64
b0  forall a. BitWise a => a -> a -> a
.|. Word64
b1  ) forall a. BitWise a => a -> a -> a
.^. Word64
0x5555555555555555) forall a. Shift a => a -> Word64 -> a
.<. Word64
1) forall a. BitWise a => a -> a -> a
.|. Word64
ll                      in

  let eok1 :: Word64
eok1 =   Word64
ok1 forall a. BitWise a => a -> a -> a
.&.  Word64
muk1                                                              in
  let eck1 :: Word64
eck1 =  (Word64
ck1 forall a. BitWise a => a -> a -> a
.&. (Word64
muk1 forall a. Shift a => a -> Word64 -> a
.<. Word64
t64k1)) forall a. Shift a => a -> Word64 -> a
.>. Word64
t64k1                                        in
  let ok2L :: Word64
ok2L =  (Word64
ok1 forall a. BitWise a => a -> a -> a
.&. (Word64
muk1 forall a. Shift a => a -> Word64 -> a
.<. Word64
t64k1)) forall a. Shift a => a -> Word64 -> a
.>. Word64
t64k1                                        in
  let ok2R :: Word64
ok2R = Int -> Word64 -> Word64 -> Word64
kBitDiffPos Int
4 Word64
eok1 Word64
eck1                                                      in
  let ok2 :: Word64
ok2  = Word64
ok2L forall a. Num a => a -> a -> a
+ Word64
ok2R                                                                  in
  let ck2 :: Word64
ck2  =  (Word64
ck1 forall a. BitWise a => a -> a -> a
.&.  Word64
muk1) forall a. Num a => a -> a -> a
+ Int -> Word64 -> Word64 -> Word64
kBitDiffPos Int
4 Word64
eck1 Word64
eok1                                   in

  let eok2 :: Word64
eok2 =   Word64
ok2 forall a. BitWise a => a -> a -> a
.&.  Word64
muk2                                                              in
  let eck2 :: Word64
eck2 =  (Word64
ck2 forall a. BitWise a => a -> a -> a
.&. (Word64
muk2 forall a. Shift a => a -> Word64 -> a
.<. Word64
t64k2)) forall a. Shift a => a -> Word64 -> a
.>. Word64
t64k2                                        in
  let ok3L :: Word64
ok3L =  (Word64
ok2 forall a. BitWise a => a -> a -> a
.&. (Word64
muk2 forall a. Shift a => a -> Word64 -> a
.<. Word64
t64k2)) forall a. Shift a => a -> Word64 -> a
.>. Word64
t64k2                                        in
  let ok3R :: Word64
ok3R = Int -> Word64 -> Word64 -> Word64
kBitDiffPos Int
8 Word64
eok2 Word64
eck2                                                      in
  let ok3 :: Word64
ok3  = Word64
ok3L forall a. Num a => a -> a -> a
+ Word64
ok3R                                                                  in
  let ck3 :: Word64
ck3  =  (Word64
ck2 forall a. BitWise a => a -> a -> a
.&.  Word64
muk2) forall a. Num a => a -> a -> a
+ Int -> Word64 -> Word64 -> Word64
kBitDiffPos Int
8 Word64
eck2 Word64
eok2                                   in

  let eok3 :: Word64
eok3 =   Word64
ok3 forall a. BitWise a => a -> a -> a
.&.  Word64
muk3                                                              in
  let eck3 :: Word64
eck3 =  (Word64
ck3 forall a. BitWise a => a -> a -> a
.&. (Word64
muk3 forall a. Shift a => a -> Word64 -> a
.<. Word64
t64k3)) forall a. Shift a => a -> Word64 -> a
.>. Word64
t64k3                                        in
  let ok4L :: Word64
ok4L =  (Word64
ok3 forall a. BitWise a => a -> a -> a
.&. (Word64
muk3 forall a. Shift a => a -> Word64 -> a
.<. Word64
t64k3)) forall a. Shift a => a -> Word64 -> a
.>. Word64
t64k3                                        in
  let ok4R :: Word64
ok4R = Int -> Word64 -> Word64 -> Word64
kBitDiffPos Int
16 Word64
eok3 Word64
eck3                                                     in
  let ok4 :: Word64
ok4  = Word64
ok4L forall a. Num a => a -> a -> a
+ Word64
ok4R                                                                  in
  let ck4 :: Word64
ck4  =  (Word64
ck3 forall a. BitWise a => a -> a -> a
.&.  Word64
muk3) forall a. Num a => a -> a -> a
+ Int -> Word64 -> Word64 -> Word64
kBitDiffPos Int
16 Word64
eck3 Word64
eok3                                  in

  let eok4 :: Word64
eok4 =   Word64
ok4 forall a. BitWise a => a -> a -> a
.&.  Word64
muk4                                                              in
  let eck4 :: Word64
eck4 =  (Word64
ck4 forall a. BitWise a => a -> a -> a
.&. (Word64
muk4 forall a. Shift a => a -> Word64 -> a
.<. Word64
t64k4)) forall a. Shift a => a -> Word64 -> a
.>. Word64
t64k4                                        in
  let ok5L :: Word64
ok5L =  (Word64
ok4 forall a. BitWise a => a -> a -> a
.&. (Word64
muk4 forall a. Shift a => a -> Word64 -> a
.<. Word64
t64k4)) forall a. Shift a => a -> Word64 -> a
.>. Word64
t64k4                                        in
  let ok5R :: Word64
ok5R = Int -> Word64 -> Word64 -> Word64
kBitDiffPos Int
32 Word64
eok4 Word64
eck4                                                     in
  let ok5 :: Word64
ok5  = Word64
ok5L forall a. Num a => a -> a -> a
+ Word64
ok5R                                                                  in
  let ck5 :: Word64
ck5  =  (Word64
ck4 forall a. BitWise a => a -> a -> a
.&.  Word64
muk4) forall a. Num a => a -> a -> a
+ Int -> Word64 -> Word64 -> Word64
kBitDiffPos Int
32 Word64
eck4 Word64
eok4                                  in

  let eok5 :: Word64
eok5 =   Word64
ok5 forall a. BitWise a => a -> a -> a
.&.  Word64
muk5                                                              in
  let eck5 :: Word64
eck5 =  (Word64
ck5 forall a. BitWise a => a -> a -> a
.&. (Word64
muk5 forall a. Shift a => a -> Word64 -> a
.<. Word64
t64k5)) forall a. Shift a => a -> Word64 -> a
.>. Word64
t64k5                                        in
  let ok6L :: Word64
ok6L =  (Word64
ok5 forall a. BitWise a => a -> a -> a
.&. (Word64
muk5 forall a. Shift a => a -> Word64 -> a
.<. Word64
t64k5)) forall a. Shift a => a -> Word64 -> a
.>. Word64
t64k5                                        in
  let ok6R :: Word64
ok6R = Int -> Word64 -> Word64 -> Word64
kBitDiffPos Int
32 Word64
eok5 Word64
eck5                                                     in
  let ok6 :: Word64
ok6  = Word64
ok6L forall a. Num a => a -> a -> a
+ Word64
ok6R                                                                  in
  let ck6 :: Word64
ck6  =  (Word64
ck5 forall a. BitWise a => a -> a -> a
.&.  Word64
muk5) forall a. Num a => a -> a -> a
+ Int -> Word64 -> Word64 -> Word64
kBitDiffPos Int
32 Word64
eck5 Word64
eok5                                  in

  let qak6 :: Word64
qak6  = Word64
c                                                                           in
  let sak6 :: Word64
sak6  = Word64
0                                                                           in

  let hk6 :: Word64
hk6   = Word64
0x0000004000000040 forall a. BitWise a => a -> a -> a
.&. forall a. BitWise a => a -> a
comp (Word64
0xffffffffffffffff forall a. Shift a => a -> Word64 -> a
.>. forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak6)      in
  let fk6 :: Word64
fk6   = ((Word64
ck6 forall a. Shift a => a -> Word64 -> a
.>. forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak6) forall a. BitWise a => a -> a -> a
.|. Word64
hk6) forall a. BitWise a => a -> a -> a
.&. Word64
mask6                             in
  let bk6 :: Word64
bk6   = ((Word64
qak6 forall a. Num a => a -> a -> a
- Word64
fk6) forall a. Shift a => a -> Word64 -> a
.>. forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int64
wsz forall a. Num a => a -> a -> a
- Int64
1)) forall a. Num a => a -> a -> a
- Word64
1                               in
  let mk6 :: Word64
mk6   = Word64
bk6 forall a. BitWise a => a -> a -> a
.&. Word64
mask6                                                               in
  let pbk6 :: Word64
pbk6  = Word64
qak6 forall a. Num a => a -> a -> a
- ((Word64
ck6 forall a. Shift a => a -> Word64 -> a
.>. forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak6) forall a. BitWise a => a -> a -> a
.&. Word64
mk6)                                in
  let pck6 :: Word64
pck6  = Word64
pbk6 forall a. Num a => a -> a -> a
+ ((Word64
ok6 forall a. Shift a => a -> Word64 -> a
.>. forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak6) forall a. BitWise a => a -> a -> a
.&. Word64
mk6)                                in
  let sbk6 :: Word64
sbk6  = Word64
sak6 forall a. Num a => a -> a -> a
+ (Word64
t8k6 forall a. BitWise a => a -> a -> a
.&. Word64
bk6)                                                       in

  let qak5 :: Word64
qak5  = Word64
pck6                                                                        in
  let sak5 :: Word64
sak5  = Word64
sbk6                                                                        in

  let hk5 :: Word64
hk5   = Word64
0x0000002000000020 forall a. BitWise a => a -> a -> a
.&. forall a. BitWise a => a -> a
comp (Word64
0xffffffffffffffff forall a. Shift a => a -> Word64 -> a
.>. forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak5)      in
  let fk5 :: Word64
fk5   = ((Word64
ck5 forall a. Shift a => a -> Word64 -> a
.>. forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak5) forall a. BitWise a => a -> a -> a
.|. Word64
hk5) forall a. BitWise a => a -> a -> a
.&. Word64
mask5                             in
  let bk5 :: Word64
bk5   = ((Word64
qak5 forall a. Num a => a -> a -> a
- Word64
fk5) forall a. Shift a => a -> Word64 -> a
.>. forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int64
wsz forall a. Num a => a -> a -> a
- Int64
1)) forall a. Num a => a -> a -> a
- Word64
1                               in
  let mk5 :: Word64
mk5   = Word64
bk5 forall a. BitWise a => a -> a -> a
.&. Word64
mask5                                                               in
  let pbk5 :: Word64
pbk5  = Word64
qak5 forall a. Num a => a -> a -> a
- (((Word64
ck5 forall a. Shift a => a -> Word64 -> a
.>. forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak5) forall a. BitWise a => a -> a -> a
.|. Word64
hk5) forall a. BitWise a => a -> a -> a
.&. Word64
mk5)                      in
  let pck5 :: Word64
pck5  = Word64
pbk5 forall a. Num a => a -> a -> a
+ ( (Word64
ok5 forall a. Shift a => a -> Word64 -> a
.>. forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak5)          forall a. BitWise a => a -> a -> a
.&. Word64
mk5)                      in
  let sbk5 :: Word64
sbk5  = Word64
sak5 forall a. Num a => a -> a -> a
+ (Word64
t8k5 forall a. BitWise a => a -> a -> a
.&. Word64
bk5)                                                       in

  let qak4 :: Word64
qak4  = Word64
pck5                                                                        in
  let sak4 :: Word64
sak4  = Word64
sbk5                                                                        in

  let hk4 :: Word64
hk4   = Word64
0x0010001000100010 forall a. BitWise a => a -> a -> a
.&. forall a. BitWise a => a -> a
comp (Word64
0xffffffffffffffff forall a. Shift a => a -> Word64 -> a
.>. forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak4)      in
  let fk4 :: Word64
fk4   = ((Word64
ck4 forall a. Shift a => a -> Word64 -> a
.>. forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak4) forall a. BitWise a => a -> a -> a
.|. Word64
hk4) forall a. BitWise a => a -> a -> a
.&. Word64
mask4                             in
  let bk4 :: Word64
bk4   = ((Word64
qak4 forall a. Num a => a -> a -> a
- Word64
fk4) forall a. Shift a => a -> Word64 -> a
.>. forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int64
wsz forall a. Num a => a -> a -> a
- Int64
1)) forall a. Num a => a -> a -> a
- Word64
1                               in
  let mk4 :: Word64
mk4   = Word64
bk4 forall a. BitWise a => a -> a -> a
.&. Word64
mask4                                                               in
  let pbk4 :: Word64
pbk4  = Word64
qak4 forall a. Num a => a -> a -> a
- (((Word64
ck4 forall a. Shift a => a -> Word64 -> a
.>. forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak4) forall a. BitWise a => a -> a -> a
.|. Word64
hk4) forall a. BitWise a => a -> a -> a
.&. Word64
mk4)                      in
  let pck4 :: Word64
pck4  = Word64
pbk4 forall a. Num a => a -> a -> a
+ ( (Word64
ok4 forall a. Shift a => a -> Word64 -> a
.>. forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak4)          forall a. BitWise a => a -> a -> a
.&. Word64
mk4)                      in
  let sbk4 :: Word64
sbk4  = Word64
sak4 forall a. Num a => a -> a -> a
+ (Word64
t8k4 forall a. BitWise a => a -> a -> a
.&. Word64
bk4)                                                       in

  let qak3 :: Word64
qak3  = Word64
pck4                                                                        in
  let sak3 :: Word64
sak3  = Word64
sbk4                                                                        in

  let hk3 :: Word64
hk3   = Word64
0x0808080808080808 forall a. BitWise a => a -> a -> a
.&. forall a. BitWise a => a -> a
comp (Word64
0xffffffffffffffff forall a. Shift a => a -> Word64 -> a
.>. forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak3)      in
  let fk3 :: Word64
fk3   = ((Word64
ck3 forall a. Shift a => a -> Word64 -> a
.>. forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak3) forall a. BitWise a => a -> a -> a
.|. Word64
hk3) forall a. BitWise a => a -> a -> a
.&. Word64
mask3                             in
  let bk3 :: Word64
bk3   = ((Word64
qak3 forall a. Num a => a -> a -> a
- Word64
fk3) forall a. Shift a => a -> Word64 -> a
.>. forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int64
wsz forall a. Num a => a -> a -> a
- Int64
1)) forall a. Num a => a -> a -> a
- Word64
1                               in
  let mk3 :: Word64
mk3   = Word64
bk3 forall a. BitWise a => a -> a -> a
.&. Word64
mask3                                                               in
  let pbk3 :: Word64
pbk3  = Word64
qak3 forall a. Num a => a -> a -> a
- (((Word64
ck3 forall a. Shift a => a -> Word64 -> a
.>. forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak3) forall a. BitWise a => a -> a -> a
.|. Word64
hk3) forall a. BitWise a => a -> a -> a
.&. Word64
mk3)                      in
  let pck3 :: Word64
pck3  = Word64
pbk3 forall a. Num a => a -> a -> a
+ ( (Word64
ok3 forall a. Shift a => a -> Word64 -> a
.>. forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak3)          forall a. BitWise a => a -> a -> a
.&. Word64
mk3)                      in
  let sbk3 :: Word64
sbk3  = Word64
sak3 forall a. Num a => a -> a -> a
+ (Word64
t8k3 forall a. BitWise a => a -> a -> a
.&. Word64
bk3)                                                       in

  let qak2 :: Word64
qak2  = Word64
pck3                                                                        in
  let sak2 :: Word64
sak2  = Word64
sbk3                                                                        in

  let hk2 :: Word64
hk2   = Word64
0x4444444444444444 forall a. BitWise a => a -> a -> a
.&. forall a. BitWise a => a -> a
comp (Word64
0xffffffffffffffff forall a. Shift a => a -> Word64 -> a
.>. forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak2)      in
  let fk2 :: Word64
fk2   = ((Word64
ck2 forall a. Shift a => a -> Word64 -> a
.>. forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak2) forall a. BitWise a => a -> a -> a
.|. Word64
hk2) forall a. BitWise a => a -> a -> a
.&. Word64
mask2                             in
  let bk2 :: Word64
bk2   = ((Word64
qak2 forall a. Num a => a -> a -> a
- Word64
fk2) forall a. Shift a => a -> Word64 -> a
.>. forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int64
wsz forall a. Num a => a -> a -> a
- Int64
1)) forall a. Num a => a -> a -> a
- Word64
1                               in
  let mk2 :: Word64
mk2   = Word64
bk2 forall a. BitWise a => a -> a -> a
.&. Word64
mask2                                                               in
  let pbk2 :: Word64
pbk2  = Word64
qak2 forall a. Num a => a -> a -> a
- (((Word64
ck2 forall a. Shift a => a -> Word64 -> a
.>. forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak2) forall a. BitWise a => a -> a -> a
.|. Word64
hk2) forall a. BitWise a => a -> a -> a
.&. Word64
mk2)                      in
  let pck2 :: Word64
pck2  = Word64
pbk2 forall a. Num a => a -> a -> a
+ ( (Word64
ok2 forall a. Shift a => a -> Word64 -> a
.>. forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak2)          forall a. BitWise a => a -> a -> a
.&. Word64
mk2)                      in
  let sbk2 :: Word64
sbk2  = Word64
sak2 forall a. Num a => a -> a -> a
+ (Word64
t8k2 forall a. BitWise a => a -> a -> a
.&. Word64
bk2)                                                       in

  let qak1 :: Word64
qak1  = Word64
pck2                                                                        in
  let sak1 :: Word64
sak1  = Word64
sbk2                                                                        in

  let hk1 :: Word64
hk1   = Word64
0xaaaaaaaaaaaaaaaa forall a. BitWise a => a -> a -> a
.&. forall a. BitWise a => a -> a
comp (Word64
0xffffffffffffffff forall a. Shift a => a -> Word64 -> a
.>. forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak1)      in
  let fk1 :: Word64
fk1   = ((Word64
ck1 forall a. Shift a => a -> Word64 -> a
.>. forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak1) forall a. BitWise a => a -> a -> a
.|. Word64
hk1) forall a. BitWise a => a -> a -> a
.&. Word64
mask1                             in
  let bk1 :: Word64
bk1   = ((Word64
qak1 forall a. Num a => a -> a -> a
- Word64
fk1) forall a. Shift a => a -> Word64 -> a
.>. forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int64
wsz forall a. Num a => a -> a -> a
- Int64
1)) forall a. Num a => a -> a -> a
- Word64
1                               in
  let mk1 :: Word64
mk1   = Word64
bk1  forall a. BitWise a => a -> a -> a
.&. Word64
mask1                                                              in
  let pbk1 :: Word64
pbk1  = Word64
qak1 forall a. Num a => a -> a -> a
- (((Word64
ck1 forall a. Shift a => a -> Word64 -> a
.>. forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak1) forall a. BitWise a => a -> a -> a
.|. Word64
hk1) forall a. BitWise a => a -> a -> a
.&. Word64
mk1)                      in
  let pck1 :: Word64
pck1  = Word64
pbk1 forall a. Num a => a -> a -> a
+ ( (Word64
ok1 forall a. Shift a => a -> Word64 -> a
.>. forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sak1)          forall a. BitWise a => a -> a -> a
.&. Word64
mk1)                      in
  let sbk1 :: Word64
sbk1  = Word64
sak1 forall a. Num a => a -> a -> a
+ (Word64
t8k1 forall a. BitWise a => a -> a -> a
.&. Word64
bk1)                                                       in

  let rrr :: Word64
rrr   = Word64
sbk1 forall a. Num a => a -> a -> a
+ Word64
pck1 forall a. Num a => a -> a -> a
+ (((Word64
x forall a. Shift a => a -> Word64 -> a
.>. forall a b. (Integral a, Num b) => a -> b
fromIntegral Word64
sbk1) forall a. BitWise a => a -> a -> a
.&. ((Word64
pck1 forall a. Shift a => a -> Word64 -> a
.<. Word64
1) forall a. BitWise a => a -> a -> a
.|. Word64
1)) forall a. Shift a => a -> Word64 -> a
.<. Word64
1)  in

  Word64
rrr forall a. Num a => a -> a -> a
+ Word64
p
{-# INLINE findUnmatchedCloseFar #-}