module Asm.X86.B ( bb ) where

import           Asm.BB
import           Asm.X86
import           Data.List.Split (keepDelimsL, keepDelimsR, split, whenElt)

bb :: [X86 reg freg f2reg a] -> [BB X86 reg freg f2reg a ()]
bb :: forall reg freg f2reg a.
[X86 reg freg f2reg a] -> [BB X86 reg freg f2reg a ()]
bb = (BB X86 reg freg f2reg a () -> Bool)
-> [BB X86 reg freg f2reg a ()] -> [BB X86 reg freg f2reg a ()]
forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not(Bool -> Bool)
-> (BB X86 reg freg f2reg a () -> Bool)
-> BB X86 reg freg f2reg a ()
-> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
.BB X86 reg freg f2reg a () -> Bool
forall {arch :: * -> * -> * -> * -> *} {reg} {freg} {f2reg} {a}
       {b}.
BB arch reg freg f2reg a b -> Bool
emptyBB)([BB X86 reg freg f2reg a ()] -> [BB X86 reg freg f2reg a ()])
-> ([X86 reg freg f2reg a] -> [BB X86 reg freg f2reg a ()])
-> [X86 reg freg f2reg a]
-> [BB X86 reg freg f2reg a ()]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.([X86 reg freg f2reg a] -> BB X86 reg freg f2reg a ())
-> [[X86 reg freg f2reg a]] -> [BB X86 reg freg f2reg a ()]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [X86 reg freg f2reg a] -> BB X86 reg freg f2reg a ()
forall {arch :: * -> * -> * -> * -> *} {reg} {freg} {f2reg} {a}.
[arch reg freg f2reg a] -> BB arch reg freg f2reg a ()
mkBB([[X86 reg freg f2reg a]] -> [BB X86 reg freg f2reg a ()])
-> ([X86 reg freg f2reg a] -> [[X86 reg freg f2reg a]])
-> [X86 reg freg f2reg a]
-> [BB X86 reg freg f2reg a ()]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.([X86 reg freg f2reg a] -> [[X86 reg freg f2reg a]])
-> [[X86 reg freg f2reg a]] -> [[X86 reg freg f2reg a]]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (Splitter (X86 reg freg f2reg a)
-> [X86 reg freg f2reg a] -> [[X86 reg freg f2reg a]]
forall a. Splitter a -> [a] -> [[a]]
split (Splitter (X86 reg freg f2reg a) -> Splitter (X86 reg freg f2reg a)
forall a. Splitter a -> Splitter a
keepDelimsL(Splitter (X86 reg freg f2reg a)
 -> Splitter (X86 reg freg f2reg a))
-> Splitter (X86 reg freg f2reg a)
-> Splitter (X86 reg freg f2reg a)
forall a b. (a -> b) -> a -> b
$(X86 reg freg f2reg a -> Bool) -> Splitter (X86 reg freg f2reg a)
forall a. (a -> Bool) -> Splitter a
whenElt X86 reg freg f2reg a -> Bool
forall {reg} {freg} {f2} {a}. X86 reg freg f2 a -> Bool
isL))([[X86 reg freg f2reg a]] -> [[X86 reg freg f2reg a]])
-> ([X86 reg freg f2reg a] -> [[X86 reg freg f2reg a]])
-> [X86 reg freg f2reg a]
-> [[X86 reg freg f2reg a]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Splitter (X86 reg freg f2reg a)
-> [X86 reg freg f2reg a] -> [[X86 reg freg f2reg a]]
forall a. Splitter a -> [a] -> [[a]]
split (Splitter (X86 reg freg f2reg a) -> Splitter (X86 reg freg f2reg a)
forall a. Splitter a -> Splitter a
keepDelimsR(Splitter (X86 reg freg f2reg a)
 -> Splitter (X86 reg freg f2reg a))
-> Splitter (X86 reg freg f2reg a)
-> Splitter (X86 reg freg f2reg a)
forall a b. (a -> b) -> a -> b
$(X86 reg freg f2reg a -> Bool) -> Splitter (X86 reg freg f2reg a)
forall a. (a -> Bool) -> Splitter a
whenElt X86 reg freg f2reg a -> Bool
forall {reg} {freg} {f2} {a}. X86 reg freg f2 a -> Bool
cf)
    where cf :: X86 reg freg f2 a -> Bool
cf J{}=Bool
True; cf Jl{}=Bool
True; cf Jg{}=Bool
True; cf Jge{}=Bool
True; cf Jle{}=Bool
True; cf Jne{}=Bool
True; cf C{}=Bool
True; cf RetL{}=Bool
True; cf X86 reg freg f2 a
_=Bool
False
          isL :: X86 reg freg f2 a -> Bool
isL Label{}=Bool
True; isL X86 reg freg f2 a
_=Bool
False
          mkBB :: [arch reg freg f2reg a] -> BB arch reg freg f2reg a ()
mkBB [arch reg freg f2reg a]
x = [arch reg freg f2reg a] -> () -> BB arch reg freg f2reg a ()
forall (arch :: * -> * -> * -> * -> *) reg freg f2reg a b.
[arch reg freg f2reg a] -> b -> BB arch reg freg f2reg a b
BB [arch reg freg f2reg a]
x ()
          emptyBB :: BB arch reg freg f2reg a b -> Bool
emptyBB (BB [] b
_) = Bool
True
          emptyBB BB arch reg freg f2reg a b
_         = Bool
False