module Asm.X86.B ( bb ) where

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

bb :: [X86 reg freg a] -> [BB X86 reg freg a ()]
bb :: forall reg freg a. [X86 reg freg a] -> [BB X86 reg freg a ()]
bb = (BB X86 reg freg a () -> Bool)
-> [BB X86 reg freg a ()] -> [BB X86 reg freg a ()]
forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not(Bool -> Bool)
-> (BB X86 reg freg a () -> Bool) -> BB X86 reg freg a () -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
.BB X86 reg freg a () -> Bool
forall {arch :: * -> * -> * -> *} {reg} {freg} {a} {b}.
BB arch reg freg a b -> Bool
emptyBB)([BB X86 reg freg a ()] -> [BB X86 reg freg a ()])
-> ([X86 reg freg a] -> [BB X86 reg freg a ()])
-> [X86 reg freg a]
-> [BB X86 reg freg a ()]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.([X86 reg freg a] -> BB X86 reg freg a ())
-> [[X86 reg freg a]] -> [BB X86 reg freg a ()]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [X86 reg freg a] -> BB X86 reg freg a ()
forall {arch :: * -> * -> * -> *} {reg} {freg} {a}.
[arch reg freg a] -> BB arch reg freg a ()
mkBB([[X86 reg freg a]] -> [BB X86 reg freg a ()])
-> ([X86 reg freg a] -> [[X86 reg freg a]])
-> [X86 reg freg a]
-> [BB X86 reg freg a ()]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.([X86 reg freg a] -> [[X86 reg freg a]])
-> [[X86 reg freg a]] -> [[X86 reg freg a]]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (Splitter (X86 reg freg a) -> [X86 reg freg a] -> [[X86 reg freg a]]
forall a. Splitter a -> [a] -> [[a]]
split (Splitter (X86 reg freg a) -> Splitter (X86 reg freg a)
forall a. Splitter a -> Splitter a
keepDelimsL(Splitter (X86 reg freg a) -> Splitter (X86 reg freg a))
-> Splitter (X86 reg freg a) -> Splitter (X86 reg freg a)
forall a b. (a -> b) -> a -> b
$(X86 reg freg a -> Bool) -> Splitter (X86 reg freg a)
forall a. (a -> Bool) -> Splitter a
whenElt X86 reg freg a -> Bool
forall {reg} {freg} {a}. X86 reg freg a -> Bool
isL))([[X86 reg freg a]] -> [[X86 reg freg a]])
-> ([X86 reg freg a] -> [[X86 reg freg a]])
-> [X86 reg freg a]
-> [[X86 reg freg a]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Splitter (X86 reg freg a) -> [X86 reg freg a] -> [[X86 reg freg a]]
forall a. Splitter a -> [a] -> [[a]]
split (Splitter (X86 reg freg a) -> Splitter (X86 reg freg a)
forall a. Splitter a -> Splitter a
keepDelimsR(Splitter (X86 reg freg a) -> Splitter (X86 reg freg a))
-> Splitter (X86 reg freg a) -> Splitter (X86 reg freg a)
forall a b. (a -> b) -> a -> b
$(X86 reg freg a -> Bool) -> Splitter (X86 reg freg a)
forall a. (a -> Bool) -> Splitter a
whenElt X86 reg freg a -> Bool
forall {reg} {freg} {a}. X86 reg freg a -> Bool
cf)
    where cf :: X86 reg freg 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 a
_=Bool
False
          isL :: X86 reg freg a -> Bool
isL Label{}=Bool
True; isL X86 reg freg a
_=Bool
False
          mkBB :: [arch reg freg a] -> BB arch reg freg a ()
mkBB [arch reg freg a]
x = [arch reg freg a] -> () -> BB arch reg freg a ()
forall (arch :: * -> * -> * -> *) reg freg a b.
[arch reg freg a] -> b -> BB arch reg freg a b
BB [arch reg freg a]
x ()
          emptyBB :: BB arch reg freg a b -> Bool
emptyBB (BB [] b
_) = Bool
True
          emptyBB BB arch reg freg a b
_         = Bool
False