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