module Asm.Ar.P ( bundle ) where import Asm.Ar import Asm.L import CF import Class.E import Data.Copointed import Data.Tuple.Extra (both) bundle :: (E reg, E freg, Copointed (arch reg freg f2), Arch arch reg freg f2) => [arch reg freg f2 ()] -> ([arch reg freg f2 (UD, Liveness, Maybe (Int,Int))], [arch reg freg f2 (UD, Liveness, Maybe (Int,Int))]) bundle :: forall reg freg (arch :: * -> * -> * -> * -> *) f2. (E reg, E freg, Copointed (arch reg freg f2), Arch arch reg freg f2) => [arch reg freg f2 ()] -> ([arch reg freg f2 (UD, Liveness, Maybe (Int, Int))], [arch reg freg f2 (UD, Liveness, Maybe (Int, Int))]) bundle [arch reg freg f2 ()] isns = let cfIsns :: [UD] cfIsns = (arch reg freg f2 () -> UD) -> [arch reg freg f2 ()] -> [UD] forall a b. (a -> b) -> [a] -> [b] forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap arch reg freg f2 () -> UD forall a. arch reg freg f2 a -> UD forall (arch :: * -> * -> * -> * -> *) reg freg f2reg a. Arch arch reg freg f2reg => arch reg freg f2reg a -> UD udd [arch reg freg f2 ()] isns; lIsns :: [arch reg freg f2 Liveness] lIsns = [arch reg freg f2 ()] -> [arch reg freg f2 Liveness] forall (arch :: * -> * -> * -> * -> *) reg freg f2. Arch arch reg freg f2 => [arch reg freg f2 ()] -> [arch reg freg f2 Liveness] mkLive [arch reg freg f2 ()] isns mvIsns :: [Maybe (Int, Int)] mvIsns = ((reg, reg) -> (Int, Int)) -> Maybe (reg, reg) -> Maybe (Int, Int) forall a b. (a -> b) -> Maybe a -> Maybe b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap ((reg -> Int) -> (reg, reg) -> (Int, Int) forall a b. (a -> b) -> (a, a) -> (b, b) both reg -> Int forall a. E a => a -> Int toInt)(Maybe (reg, reg) -> Maybe (Int, Int)) -> (arch reg freg f2 () -> Maybe (reg, reg)) -> arch reg freg f2 () -> Maybe (Int, Int) forall b c a. (b -> c) -> (a -> b) -> a -> c .arch reg freg f2 () -> Maybe (reg, reg) forall a. arch reg freg f2 a -> Maybe (reg, reg) forall (arch :: * -> * -> * -> * -> *) reg freg f2reg a. Arch arch reg freg f2reg => arch reg freg f2reg a -> Maybe (reg, reg) mI(arch reg freg f2 () -> Maybe (Int, Int)) -> [arch reg freg f2 ()] -> [Maybe (Int, Int)] forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$>[arch reg freg f2 ()] isns mvFIsns :: [Maybe (Int, Int)] mvFIsns = ((freg, freg) -> (Int, Int)) -> Maybe (freg, freg) -> Maybe (Int, Int) forall a b. (a -> b) -> Maybe a -> Maybe b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap ((freg -> Int) -> (freg, freg) -> (Int, Int) forall a b. (a -> b) -> (a, a) -> (b, b) both freg -> Int forall a. E a => a -> Int toInt)(Maybe (freg, freg) -> Maybe (Int, Int)) -> (arch reg freg f2 () -> Maybe (freg, freg)) -> arch reg freg f2 () -> Maybe (Int, Int) forall b c a. (b -> c) -> (a -> b) -> a -> c .arch reg freg f2 () -> Maybe (freg, freg) forall a. arch reg freg f2 a -> Maybe (freg, freg) forall (arch :: * -> * -> * -> * -> *) reg freg f2reg a. Arch arch reg freg f2reg => arch reg freg f2reg a -> Maybe (freg, freg) mf(arch reg freg f2 () -> Maybe (Int, Int)) -> [arch reg freg f2 ()] -> [Maybe (Int, Int)] forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$>[arch reg freg f2 ()] isns combine :: p -> f b -> p -> f (p, b, p) combine p x f b y p z = let tup :: (p, b, p) tup = (p x, f b -> b forall a. f a -> a forall (p :: * -> *) a. Copointed p => p a -> a copoint f b y, p z) in (p, b, p) tup (p, b, p) -> f b -> f (p, b, p) forall a b. a -> f b -> f a forall (f :: * -> *) a b. Functor f => a -> f b -> f a <$ f b y in ((UD -> arch reg freg f2 Liveness -> Maybe (Int, Int) -> arch reg freg f2 (UD, Liveness, Maybe (Int, Int))) -> [UD] -> [arch reg freg f2 Liveness] -> [Maybe (Int, Int)] -> [arch reg freg f2 (UD, Liveness, Maybe (Int, Int))] forall a b c d. (a -> b -> c -> d) -> [a] -> [b] -> [c] -> [d] zipWith3 UD -> arch reg freg f2 Liveness -> Maybe (Int, Int) -> arch reg freg f2 (UD, Liveness, Maybe (Int, Int)) forall {f :: * -> *} {p} {b} {p}. Copointed f => p -> f b -> p -> f (p, b, p) combine [UD] cfIsns [arch reg freg f2 Liveness] lIsns [Maybe (Int, Int)] mvIsns, (UD -> arch reg freg f2 Liveness -> Maybe (Int, Int) -> arch reg freg f2 (UD, Liveness, Maybe (Int, Int))) -> [UD] -> [arch reg freg f2 Liveness] -> [Maybe (Int, Int)] -> [arch reg freg f2 (UD, Liveness, Maybe (Int, Int))] forall a b c d. (a -> b -> c -> d) -> [a] -> [b] -> [c] -> [d] zipWith3 UD -> arch reg freg f2 Liveness -> Maybe (Int, Int) -> arch reg freg f2 (UD, Liveness, Maybe (Int, Int)) forall {f :: * -> *} {p} {b} {p}. Copointed f => p -> f b -> p -> f (p, b, p) combine [UD] cfIsns [arch reg freg f2 Liveness] lIsns [Maybe (Int, Int)] mvFIsns)