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), Arch arch reg freg)
       => [arch reg freg ()]
       -> ([arch reg freg (UD, Liveness, Maybe (Int,Int))], [arch reg freg (UD, Liveness, Maybe (Int,Int))])
bundle :: forall reg freg (arch :: * -> * -> * -> *).
(E reg, E freg, Copointed (arch reg freg), Arch arch reg freg) =>
[arch reg freg ()]
-> ([arch reg freg (UD, Liveness, Maybe (Int, Int))],
    [arch reg freg (UD, Liveness, Maybe (Int, Int))])
bundle [arch reg freg ()]
isns =
    let cfIsns :: [UD]
cfIsns = (arch reg freg () -> UD) -> [arch reg freg ()] -> [UD]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap arch reg freg () -> UD
forall a. arch reg freg a -> UD
forall (arch :: * -> * -> * -> *) reg freg a.
Arch arch reg freg =>
arch reg freg a -> UD
udd [arch reg freg ()]
isns; lIsns :: [arch reg freg Liveness]
lIsns = [arch reg freg ()] -> [arch reg freg Liveness]
forall (arch :: * -> * -> * -> *) reg freg.
Arch arch reg freg =>
[arch reg freg ()] -> [arch reg freg Liveness]
mkLive [arch reg freg ()]
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 () -> Maybe (reg, reg))
-> arch reg freg ()
-> Maybe (Int, Int)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.arch reg freg () -> Maybe (reg, reg)
forall a. arch reg freg a -> Maybe (reg, reg)
forall (arch :: * -> * -> * -> *) reg freg a.
Arch arch reg freg =>
arch reg freg a -> Maybe (reg, reg)
mI(arch reg freg () -> Maybe (Int, Int))
-> [arch reg freg ()] -> [Maybe (Int, Int)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>[arch reg freg ()]
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 () -> Maybe (freg, freg))
-> arch reg freg ()
-> Maybe (Int, Int)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.arch reg freg () -> Maybe (freg, freg)
forall a. arch reg freg a -> Maybe (freg, freg)
forall (arch :: * -> * -> * -> *) reg freg a.
Arch arch reg freg =>
arch reg freg a -> Maybe (freg, freg)
mf(arch reg freg () -> Maybe (Int, Int))
-> [arch reg freg ()] -> [Maybe (Int, Int)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>[arch reg freg ()]
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 Liveness
 -> Maybe (Int, Int)
 -> arch reg freg (UD, Liveness, Maybe (Int, Int)))
-> [UD]
-> [arch reg freg Liveness]
-> [Maybe (Int, Int)]
-> [arch reg freg (UD, Liveness, Maybe (Int, Int))]
forall a b c d. (a -> b -> c -> d) -> [a] -> [b] -> [c] -> [d]
zipWith3 UD
-> arch reg freg Liveness
-> Maybe (Int, Int)
-> arch reg freg (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 Liveness]
lIsns [Maybe (Int, Int)]
mvIsns, (UD
 -> arch reg freg Liveness
 -> Maybe (Int, Int)
 -> arch reg freg (UD, Liveness, Maybe (Int, Int)))
-> [UD]
-> [arch reg freg Liveness]
-> [Maybe (Int, Int)]
-> [arch reg freg (UD, Liveness, Maybe (Int, Int))]
forall a b c d. (a -> b -> c -> d) -> [a] -> [b] -> [c] -> [d]
zipWith3 UD
-> arch reg freg Liveness
-> Maybe (Int, Int)
-> arch reg freg (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 Liveness]
lIsns [Maybe (Int, Int)]
mvFIsns)