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)