{-# LANGUAGE DeriveFunctor     #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}

-- first IR with for loops and array accesses, inspired by C
module C ( Temp (..), FTemp (..), F2Temp (..), BTemp (..)
         , ArrAcc (..)
         , CE (..), CFE (..), F1E, F2E
         , PE (..)
         , CS (..)
         , (=:)
         , Label, AsmData
         , LSt (..)
         , prettyCS
         , pL
         ) where

import           CF.AL
import           Data.Copointed
import           Data.Int          (Int64)
import qualified Data.IntMap       as IM
import           Data.Void         (Void)
import           Data.Word         (Word64)
import           Op
import           Prettyprinter     (Doc, Pretty (..), brackets, comma, dot, hardline, indent, lbrace, parens, rbrace, tupled, (<+>))
import           Prettyprinter.Ext

type Label=Word; type AsmData = IM.IntMap [Word64]

data Temp = ITemp !Int | ATemp !Int
          | C0 | C1 | C2 | C3 | C4 | C5 | CRet deriving Temp -> Temp -> Bool
(Temp -> Temp -> Bool) -> (Temp -> Temp -> Bool) -> Eq Temp
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Temp -> Temp -> Bool
== :: Temp -> Temp -> Bool
$c/= :: Temp -> Temp -> Bool
/= :: Temp -> Temp -> Bool
Eq

data BTemp = BTemp !Int | CBRet deriving BTemp -> BTemp -> Bool
(BTemp -> BTemp -> Bool) -> (BTemp -> BTemp -> Bool) -> Eq BTemp
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BTemp -> BTemp -> Bool
== :: BTemp -> BTemp -> Bool
$c/= :: BTemp -> BTemp -> Bool
/= :: BTemp -> BTemp -> Bool
Eq

data FTemp = FTemp !Int
           | F0 | F1 | F2 | F3 | F4 | F5 | FRet0 | FRet1 deriving FTemp -> FTemp -> Bool
(FTemp -> FTemp -> Bool) -> (FTemp -> FTemp -> Bool) -> Eq FTemp
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: FTemp -> FTemp -> Bool
== :: FTemp -> FTemp -> Bool
$c/= :: FTemp -> FTemp -> Bool
/= :: FTemp -> FTemp -> Bool
Eq

data F2Temp = F2Temp !Int

instance Pretty BTemp where pretty :: forall ann. BTemp -> Doc ann
pretty (BTemp Int
i) = Doc ann
"P" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Int -> Doc ann
forall ann. Int -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Int
i; pretty BTemp
CBRet = Doc ann
"PRet"

instance Pretty Temp where
    pretty :: forall ann. Temp -> Doc ann
pretty (ITemp Int
i) = Doc ann
"T" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Int -> Doc ann
forall ann. Int -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Int
i
    pretty (ATemp Int
i) = Doc ann
"AT" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Int -> Doc ann
forall ann. Int -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Int
i
    pretty Temp
C0        = Doc ann
"CArg0"
    pretty Temp
C1        = Doc ann
"CArg1"
    pretty Temp
C2        = Doc ann
"CArg2"
    pretty Temp
C3        = Doc ann
"CArg3"
    pretty Temp
C4        = Doc ann
"CArg4"
    pretty Temp
C5        = Doc ann
"CArg5"
    pretty Temp
CRet      = Doc ann
"CRet"

instance Pretty F2Temp where
    pretty :: forall ann. F2Temp -> Doc ann
pretty (F2Temp Int
i) = Doc ann
"Y" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Int -> Doc ann
forall ann. Int -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Int
i

instance Pretty FTemp where
    pretty :: forall ann. FTemp -> Doc ann
pretty (FTemp Int
i) = Doc ann
"X" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Int -> Doc ann
forall ann. Int -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Int
i
    pretty FTemp
F0        = Doc ann
"FArg0"
    pretty FTemp
F1        = Doc ann
"FArg1"
    pretty FTemp
F2        = Doc ann
"FArg2"
    pretty FTemp
F3        = Doc ann
"FArg3"
    pretty FTemp
F4        = Doc ann
"FArg4"
    pretty FTemp
F5        = Doc ann
"FArg5"
    pretty FTemp
FRet0     = Doc ann
"FRet0"
    pretty FTemp
FRet1     = Doc ann
"FRet1"

instance Show Temp where show :: Temp -> String
show=Doc Any -> String
forall a. Show a => a -> String
show(Doc Any -> String) -> (Temp -> Doc Any) -> Temp -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Temp -> Doc Any
forall a ann. Pretty a => a -> Doc ann
forall ann. Temp -> Doc ann
pretty
instance Show FTemp where show :: FTemp -> String
show=Doc Any -> String
forall a. Show a => a -> String
show(Doc Any -> String) -> (FTemp -> Doc Any) -> FTemp -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.FTemp -> Doc Any
forall a ann. Pretty a => a -> Doc ann
forall ann. FTemp -> Doc ann
pretty
instance Show BTemp where show :: BTemp -> String
show=Doc Any -> String
forall a. Show a => a -> String
show(Doc Any -> String) -> (BTemp -> Doc Any) -> BTemp -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.BTemp -> Doc Any
forall a ann. Pretty a => a -> Doc ann
forall ann. BTemp -> Doc ann
pretty

data ArrAcc = AElem Temp CE CE (Maybe AL) Int64 -- pointer, rank, elem., label for tracking liveness, elem. size (bytes)
            -- TODO: more robust way to handle rank (often statically known)
            | ARnk Temp (Maybe AL)
            | ADim Temp CE (Maybe AL) -- pointer, #, label
            | At Temp [CE] [CE] (Maybe AL) Int64 -- pointer to data, strides, indices, label, elem. size (bytes)
            | Raw Temp CE (Maybe AL) Int64 -- pointer to data, offset, label, element size
            | TupM Temp (Maybe AL)

instance Pretty ArrAcc where
    pretty :: forall ann. ArrAcc -> Doc ann
pretty (AElem Temp
t CE
_ CE
e Maybe AL
_ Int64
_) = Temp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Temp -> Doc ann
pretty Temp
t Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets (CE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CE -> Doc ann
pretty CE
e)
    pretty (ADim Temp
t CE
e Maybe AL
_)      = Temp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Temp -> Doc ann
pretty Temp
t Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
forall ann. Doc ann
dot Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"dim" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets (CE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CE -> Doc ann
pretty CE
e)
    pretty (ARnk Temp
t Maybe AL
_)        = Doc ann
"rnk" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Temp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Temp -> Doc ann
pretty Temp
t)
    pretty (At Temp
t [CE]
s [CE]
ix Maybe AL
_ Int64
_)   = Temp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Temp -> Doc ann
pretty Temp
t Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> (CE -> Doc ann) -> [CE] -> Doc ann
forall m a. Monoid m => (a -> m) -> [a] -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets(Doc ann -> Doc ann) -> (CE -> Doc ann) -> CE -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
.CE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CE -> Doc ann
pretty) [CE]
ix Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> (CE -> Doc ann) -> [CE] -> Doc ann
forall m a. Monoid m => (a -> m) -> [a] -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens(Doc ann -> Doc ann) -> (CE -> Doc ann) -> CE -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
.CE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CE -> Doc ann
pretty) [CE]
s
    pretty (Raw Temp
t CE
o Maybe AL
_ Int64
_)     = Temp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Temp -> Doc ann
pretty Temp
t Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"@" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> CE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CE -> Doc ann
pretty CE
o
    pretty (TupM Temp
t Maybe AL
_)        = Doc ann
"tup@" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Temp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Temp -> Doc ann
pretty Temp
t

instance Show ArrAcc where show :: ArrAcc -> String
show=Doc Any -> String
forall a. Show a => a -> String
show(Doc Any -> String) -> (ArrAcc -> Doc Any) -> ArrAcc -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.ArrAcc -> Doc Any
forall a ann. Pretty a => a -> Doc ann
forall ann. ArrAcc -> Doc ann
pretty

bPrec :: BBin -> a
bPrec BBin
AndB=a
3; bPrec BBin
OrB=a
2; bPrec BBin
XorB=a
6

mPrec :: IBin -> Maybe a
mPrec IBin
IPlus=a -> Maybe a
forall a. a -> Maybe a
Just a
6;mPrec IBin
ITimes=a -> Maybe a
forall a. a -> Maybe a
Just a
7;mPrec IBin
IMinus=a -> Maybe a
forall a. a -> Maybe a
Just a
6;mPrec IBin
IDiv=Maybe a
forall a. Maybe a
Nothing;mPrec IBin
IRem=Maybe a
forall a. Maybe a
Nothing;mPrec IBin
IAsl=Maybe a
forall a. Maybe a
Nothing; mPrec IBin
IMax=Maybe a
forall a. Maybe a
Nothing; mPrec IBin
IMin=Maybe a
forall a. Maybe a
Nothing; mPrec IBin
IAsr=Maybe a
forall a. Maybe a
Nothing; mPrec (BI BBin
p) = a -> Maybe a
forall a. a -> Maybe a
Just(a -> Maybe a) -> a -> Maybe a
forall a b. (a -> b) -> a -> b
$BBin -> a
forall {a}. Num a => BBin -> a
bPrec BBin
p
fprec :: FBin -> Maybe a
fprec FBin
FPlus=a -> Maybe a
forall a. a -> Maybe a
Just a
6;fprec FBin
FMinus=a -> Maybe a
forall a. a -> Maybe a
Just a
6;fprec FBin
FTimes=a -> Maybe a
forall a. a -> Maybe a
Just a
7; fprec FBin
FDiv=a -> Maybe a
forall a. a -> Maybe a
Just a
7; fprec FBin
FExp=a -> Maybe a
forall a. a -> Maybe a
Just a
8; fprec FBin
FMax=Maybe a
forall a. Maybe a
Nothing; fprec FBin
FMin=Maybe a
forall a. Maybe a
Nothing

data CE = EAt ArrAcc | Bin IBin CE CE | Tmp Temp | ConstI !Int64 | CFloor (CFE FTemp Double CE)
        | LA !Int -- assembler data
        | DP Temp CE -- pointer, rank

instance Pretty CE where pretty :: forall ann. CE -> Doc ann
pretty=Int -> CE -> Doc ann
forall ann. Int -> CE -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
0

instance PS CE where
    ps :: forall ann. Int -> CE -> Doc ann
ps Int
_ (Tmp Temp
t)        = Temp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Temp -> Doc ann
pretty Temp
t
    ps Int
_ (ConstI Int64
i)     = Int64 -> Doc ann
forall ann. Int64 -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Int64
i
    ps Int
d (Bin IBin
op CE
e0 CE
e1) | Just Int
d' <- IBin -> Maybe Int
forall {a}. Num a => IBin -> Maybe a
mPrec IBin
op = Bool -> Doc ann -> Doc ann
forall {ann}. Bool -> Doc ann -> Doc ann
parensp (Int
dInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>Int
d') (Int -> CE -> Doc ann
forall ann. Int -> CE -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps (Int
d'Int -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) CE
e0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> IBin -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. IBin -> Doc ann
pretty IBin
op Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Int -> CE -> Doc ann
forall ann. Int -> CE -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps (Int
d'Int -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) CE
e1)
                        | Bool
otherwise = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (IBin -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. IBin -> Doc ann
pretty IBin
op Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Int -> CE -> Doc ann
forall ann. Int -> CE -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
11 CE
e0 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Int -> CE -> Doc ann
forall ann. Int -> CE -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
11 CE
e1)
    ps Int
_ (EAt ArrAcc
a)        = ArrAcc -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. ArrAcc -> Doc ann
pretty ArrAcc
a
    ps Int
_ (LA Int
n)         = Doc ann
"A_" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Int -> Doc ann
forall ann. Int -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Int
n
    ps Int
_ (DP Temp
t CE
_)       = Doc ann
"DATA" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Temp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Temp -> Doc ann
pretty Temp
t)
    ps Int
_ (CFloor CFE FTemp Double CE
x)     = Doc ann
"⌊" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> CFE FTemp Double CE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CFE FTemp Double CE -> Doc ann
pretty CFE FTemp Double CE
x

instance Show CE where show :: CE -> String
show=Doc Any -> String
forall a. Show a => a -> String
show(Doc Any -> String) -> (CE -> Doc Any) -> CE -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.CE -> Doc Any
forall a ann. Pretty a => a -> Doc ann
forall ann. CE -> Doc ann
pretty

instance Num CE where
    + :: CE -> CE -> CE
(+) = IBin -> CE -> CE -> CE
Bin IBin
IPlus; * :: CE -> CE -> CE
(*) = IBin -> CE -> CE -> CE
Bin IBin
ITimes; (-) = IBin -> CE -> CE -> CE
Bin IBin
IMinus; fromInteger :: Integer -> CE
fromInteger=Int64 -> CE
ConstI (Int64 -> CE) -> (Integer -> Int64) -> Integer -> CE
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Int64
forall a. Num a => Integer -> a
fromInteger

type F1E=CFE FTemp Double CE; type F2E=CFE F2Temp (Double, Double) Void

data CFE t x e = FAt ArrAcc | FBin FBin (CFE t x e) (CFE t x e) | FUn FUn (CFE t x e) | FTmp t | ConstF !x | IE e

instance Num (CFE t Double e) where
    + :: CFE t Double e -> CFE t Double e -> CFE t Double e
(+) = FBin -> CFE t Double e -> CFE t Double e -> CFE t Double e
forall t x e. FBin -> CFE t x e -> CFE t x e -> CFE t x e
FBin FBin
FPlus; * :: CFE t Double e -> CFE t Double e -> CFE t Double e
(*) = FBin -> CFE t Double e -> CFE t Double e -> CFE t Double e
forall t x e. FBin -> CFE t x e -> CFE t x e -> CFE t x e
FBin FBin
FTimes; (-) = FBin -> CFE t Double e -> CFE t Double e -> CFE t Double e
forall t x e. FBin -> CFE t x e -> CFE t x e -> CFE t x e
FBin FBin
FMinus; fromInteger :: Integer -> CFE t Double e
fromInteger=Double -> CFE t Double e
forall t x e. x -> CFE t x e
ConstF (Double -> CFE t Double e)
-> (Integer -> Double) -> Integer -> CFE t Double e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Double
forall a. Num a => Integer -> a
fromInteger

instance Fractional (CFE t Double e) where
    / :: CFE t Double e -> CFE t Double e -> CFE t Double e
(/) = FBin -> CFE t Double e -> CFE t Double e -> CFE t Double e
forall t x e. FBin -> CFE t x e -> CFE t x e -> CFE t x e
FBin FBin
FDiv; fromRational :: Rational -> CFE t Double e
fromRational=Double -> CFE t Double e
forall t x e. x -> CFE t x e
ConstF (Double -> CFE t Double e)
-> (Rational -> Double) -> Rational -> CFE t Double e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rational -> Double
forall a. Fractional a => Rational -> a
fromRational

instance (Pretty x, PS e, Pretty t, Pretty e) => Pretty (CFE t x e) where pretty :: forall ann. CFE t x e -> Doc ann
pretty=Int -> CFE t x e -> Doc ann
forall ann. Int -> CFE t x e -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
0

data PE = IRel IRel CE CE
        | FRel FRel (CFE FTemp Double CE) (CFE FTemp Double CE)
        | Boo BBin PE PE
        | BConst Bool
        | IUn IUn CE
        | Is BTemp
        | PAt ArrAcc
        | BU BUn PE

instance Pretty PE where
    pretty :: forall ann. PE -> Doc ann
pretty (IRel IRel
rel CE
e0 CE
e1) = CE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CE -> Doc ann
pretty CE
e0 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> IRel -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. IRel -> Doc ann
pretty IRel
rel Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> CE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CE -> Doc ann
pretty CE
e1
    pretty (FRel FRel
rel CFE FTemp Double CE
e0 CFE FTemp Double CE
e1) = CFE FTemp Double CE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CFE FTemp Double CE -> Doc ann
pretty CFE FTemp Double CE
e0 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> FRel -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. FRel -> Doc ann
pretty FRel
rel Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> CFE FTemp Double CE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CFE FTemp Double CE -> Doc ann
pretty CFE FTemp Double CE
e1
    pretty (IUn IUn
p CE
e)        = IUn -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. IUn -> Doc ann
pretty IUn
p Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> CE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CE -> Doc ann
pretty CE
e
    pretty (Is BTemp
t)           = Doc ann
"is?" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> BTemp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. BTemp -> Doc ann
pretty BTemp
t
    pretty (PAt ArrAcc
a)          = Doc ann
"b@" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> ArrAcc -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. ArrAcc -> Doc ann
pretty ArrAcc
a
    pretty (BConst Bool
True)    = Doc ann
"true"
    pretty (BConst Bool
False)   = Doc ann
"false"
    pretty (Boo BBin
op PE
e0 PE
e1)   = PE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. PE -> Doc ann
pretty PE
e0 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> BBin -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. BBin -> Doc ann
pretty BBin
op Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> PE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. PE -> Doc ann
pretty PE
e1
    pretty (BU BUn
op PE
e)        = BUn -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. BUn -> Doc ann
pretty BUn
op Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> PE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. PE -> Doc ann
pretty PE
e

instance (Pretty x, Pretty e, Pretty t, PS e) => PS (CFE t x e) where
    ps :: forall ann. Int -> CFE t x e -> Doc ann
ps Int
_ (FAt ArrAcc
a)         = ArrAcc -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. ArrAcc -> Doc ann
pretty ArrAcc
a
    ps Int
_ (FUn FUn
f CFE t x e
e)       = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (FUn -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. FUn -> Doc ann
pretty FUn
f Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> CFE t x e -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CFE t x e -> Doc ann
pretty CFE t x e
e)
    ps Int
d (FBin FBin
op CFE t x e
x0 CFE t x e
x1) | Just Int
d' <- FBin -> Maybe Int
forall {a}. Num a => FBin -> Maybe a
fprec FBin
op = Bool -> Doc ann -> Doc ann
forall {ann}. Bool -> Doc ann -> Doc ann
parensp (Int
dInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>Int
d') (Int -> CFE t x e -> Doc ann
forall ann. Int -> CFE t x e -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps (Int
d'Int -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) CFE t x e
x0 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> FBin -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. FBin -> Doc ann
pretty FBin
op Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Int -> CFE t x e -> Doc ann
forall ann. Int -> CFE t x e -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps (Int
d'Int -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) CFE t x e
x1)
                         | Bool
otherwise = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (FBin -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. FBin -> Doc ann
pretty FBin
op Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Int -> CFE t x e -> Doc ann
forall ann. Int -> CFE t x e -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
11 CFE t x e
x0 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Int -> CFE t x e -> Doc ann
forall ann. Int -> CFE t x e -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
11 CFE t x e
x1)
    ps Int
_ (FTmp t
t)        = t -> Doc ann
forall ann. t -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty t
t
    ps Int
_ (ConstF x
x)      = x -> Doc ann
forall ann. x -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty x
x
    ps Int
d (IE e
e)          = Bool -> Doc ann -> Doc ann
forall {ann}. Bool -> Doc ann -> Doc ann
parensp (Int
dInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>Int
10) (Doc ann
"itof" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Int -> e -> Doc ann
forall ann. Int -> e -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
11 e
e)

instance (Pretty x, PS e, Pretty t, Pretty e) => Show (CFE t x e) where show :: CFE t x e -> String
show=Doc Any -> String
forall a. Show a => a -> String
show(Doc Any -> String)
-> (CFE t x e -> Doc Any) -> CFE t x e -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.CFE t x e -> Doc Any
forall a ann. Pretty a => a -> Doc ann
forall ann. CFE t x e -> Doc ann
pretty

infix 9 =:

=: :: Temp -> CE -> CS ()
(=:) = () -> Temp -> CE -> CS ()
forall a. a -> Temp -> CE -> CS a
MT ()

data CS a = For { forall a. CS a -> a
lann :: a, forall a. CS a -> Temp
ixVar :: Temp, forall a. CS a -> CE
eLow :: CE, forall a. CS a -> IRel
loopCond :: IRel, forall a. CS a -> CE
eUpper :: CE, forall a. CS a -> [CS a]
body :: [CS a] }
          | For1 { lann :: a, ixVar :: Temp, eLow :: CE, loopCond :: IRel, eUpper :: CE, body :: [CS a] }
          | While { lann :: a, forall a. CS a -> Temp
iVar :: Temp, loopCond :: IRel, forall a. CS a -> CE
eDone :: CE, body :: [CS a] }
          | WT { lann :: a, forall a. CS a -> PE
bE :: PE, body :: [CS a] }
          | MT { lann :: a, forall a. CS a -> Temp
tDest :: Temp, forall a. CS a -> CE
tSrc :: CE }
          | MX { lann :: a, forall a. CS a -> FTemp
ftDest :: FTemp, forall a. CS a -> CFE FTemp Double CE
ftSrc :: CFE FTemp Double CE }
          | MX2 { lann :: a, forall a. CS a -> F2Temp
f2tDest :: F2Temp, forall a. CS a -> CFE F2Temp (Double, Double) Void
f2tSrc :: CFE F2Temp (Double, Double) Void }
          | MB { lann :: a, forall a. CS a -> BTemp
bDest :: BTemp, forall a. CS a -> PE
pSrc :: PE }
          | Wr { lann :: a, forall a. CS a -> ArrAcc
addr :: ArrAcc, forall a. CS a -> CE
wrE :: CE }
          | WrF { lann :: a, addr :: ArrAcc, forall a. CS a -> CFE FTemp Double CE
wrF :: CFE FTemp Double CE }
          | Wr2F { lann :: a, addr :: ArrAcc, forall a. CS a -> CFE F2Temp (Double, Double) Void
wrF2 :: CFE F2Temp (Double, Double) Void }
          | WrP { lann :: a, addr :: ArrAcc , forall a. CS a -> PE
wrB :: PE }
          | Ma { lann :: a, forall a. CS a -> AL
label :: AL, forall a. CS a -> Temp
temp :: Temp, forall a. CS a -> CE
rank :: CE, forall a. CS a -> CE
nElem :: CE, forall a. CS a -> Int64
elemSz :: !Int64 }
          | Free Temp
          | MaΠ { lann :: a, label :: AL, temp :: Temp, forall a. CS a -> CE
aBytes :: CE }
          | RA { lann :: a, label :: !AL } -- return array no-op (takes label)
          | CpyE { lann :: a, forall a. CS a -> ArrAcc
aDest, forall a. CS a -> ArrAcc
aSrc :: ArrAcc, nElem :: CE, elemSz :: !Int64 } -- copy elems
          | CpyD { lann :: a, aDest, aSrc :: ArrAcc, forall a. CS a -> CE
nDims :: CE } -- copy dims
          | Ifn't { lann :: a, forall a. CS a -> PE
scond :: PE, forall a. CS a -> [CS a]
branch :: [CS a] }
          | If { lann :: a, scond :: PE, forall a. CS a -> [CS a]
iBranch, forall a. CS a -> [CS a]
eBranch :: [CS a] }
          | Sa { lann :: a, temp :: Temp, forall a. CS a -> CE
allocBytes :: CE }
          | Pop { lann :: a, aBytes :: CE }
          | Cmov { lann :: a, scond :: PE, forall a. CS a -> Temp
tdest :: Temp, forall a. CS a -> CE
src :: CE }
          | Fcmov { lann :: a, scond :: PE, forall a. CS a -> FTemp
fdest :: FTemp, forall a. CS a -> CFE FTemp Double CE
fsrc :: CFE FTemp Double CE }
          -- TODO: Fcneg?
          | Cset { lann :: a, scond :: PE, forall a. CS a -> BTemp
bdest :: BTemp }
          | SZ { lann :: a, forall a. CS a -> Temp
szDest :: Temp, forall a. CS a -> Temp
arr :: Temp, rank :: CE, forall a. CS a -> Maybe AL
mLabel :: Maybe AL }
          | PlProd { lann :: a, forall a. CS a -> Temp
nDest :: Temp, forall a. CS a -> [CE]
pdims :: [CE] }
          | Rnd { lann :: a, forall a. CS a -> Temp
rndDest :: Temp }
          | FRnd { lann :: a, forall a. CS a -> FTemp
frndDest :: FTemp }
          | Def { lann :: a, forall a. CS a -> Label
fLabel :: Label, body :: [CS a] }
          | G { lann :: a, forall a. CS a -> Label
gt :: Label, forall a. CS a -> Label
retLabel :: Label }
          deriving (forall a b. (a -> b) -> CS a -> CS b)
-> (forall a b. a -> CS b -> CS a) -> Functor CS
forall a b. a -> CS b -> CS a
forall a b. (a -> b) -> CS a -> CS b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall a b. (a -> b) -> CS a -> CS b
fmap :: forall a b. (a -> b) -> CS a -> CS b
$c<$ :: forall a b. a -> CS b -> CS a
<$ :: forall a b. a -> CS b -> CS a
Functor
          -- TODO: PlDims cause we have diml

instance Copointed CS where copoint :: forall a. CS a -> a
copoint=CS a -> a
forall a. CS a -> a
lann

instance Pretty (CS a) where
    pretty :: forall ann. CS a -> Doc ann
pretty = (a -> Doc ann) -> CS a -> Doc ann
forall {a} {ann}. (a -> Doc ann) -> CS a -> Doc ann
pL (Doc ann -> a -> Doc ann
forall a b. a -> b -> a
constDoc ann
"")

pL :: (a -> Doc ann) -> CS a -> Doc ann
pL a -> Doc ann
f (MT a
l Temp
t (Bin IBin
IPlus (Tmp Temp
t') CE
e)) | Temp
tTemp -> Temp -> Bool
forall a. Eq a => a -> a -> Bool
==Temp
t' = Temp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Temp -> Doc ann
pretty Temp
t Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"+=" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> CE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CE -> Doc ann
pretty CE
e Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> a -> Doc ann
f a
l
pL a -> Doc ann
f (MT a
l Temp
t CE
e)             = Temp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Temp -> Doc ann
pretty Temp
t Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"=" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> CE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CE -> Doc ann
pretty CE
e Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> a -> Doc ann
f a
l
pL a -> Doc ann
f (MX a
l FTemp
t (FBin FBin
FPlus (FTmp FTemp
t') CFE FTemp Double CE
e)) | FTemp
tFTemp -> FTemp -> Bool
forall a. Eq a => a -> a -> Bool
==FTemp
t' = FTemp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. FTemp -> Doc ann
pretty FTemp
t Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"+=" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> CFE FTemp Double CE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CFE FTemp Double CE -> Doc ann
pretty CFE FTemp Double CE
e Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> a -> Doc ann
f a
l
pL a -> Doc ann
f (MX a
l FTemp
t CFE FTemp Double CE
e)             = FTemp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. FTemp -> Doc ann
pretty FTemp
t Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"=" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> CFE FTemp Double CE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CFE FTemp Double CE -> Doc ann
pretty CFE FTemp Double CE
e Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> a -> Doc ann
f a
l
pL a -> Doc ann
f (MB a
l BTemp
t PE
e)             = BTemp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. BTemp -> Doc ann
pretty BTemp
t Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"=" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> PE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. PE -> Doc ann
pretty PE
e Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> a -> Doc ann
f a
l
pL a -> Doc ann
f (Wr a
l ArrAcc
a CE
e)             = ArrAcc -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. ArrAcc -> Doc ann
pretty ArrAcc
a Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"=" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> CE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CE -> Doc ann
pretty CE
e Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> a -> Doc ann
f a
l
pL a -> Doc ann
f (WrF a
l ArrAcc
a CFE FTemp Double CE
e)            = ArrAcc -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. ArrAcc -> Doc ann
pretty ArrAcc
a Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"=" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> CFE FTemp Double CE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CFE FTemp Double CE -> Doc ann
pretty CFE FTemp Double CE
e Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> a -> Doc ann
f a
l
pL a -> Doc ann
f (WrP a
l ArrAcc
a PE
e)            = ArrAcc -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. ArrAcc -> Doc ann
pretty ArrAcc
a Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"=" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> PE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. PE -> Doc ann
pretty PE
e Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> a -> Doc ann
f a
l
pL a -> Doc ann
_ (Free Temp
t)               = Doc ann
"free" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Temp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Temp -> Doc ann
pretty Temp
t
pL a -> Doc ann
f (Ma a
l AL
_ Temp
t CE
rnk CE
e Int64
sz)    = Temp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Temp -> Doc ann
pretty Temp
t Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"=" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"malloc" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Doc ann
"rnk=" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> CE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CE -> Doc ann
pretty CE
rnk Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
forall ann. Doc ann
comma Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> CE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CE -> Doc ann
pretty CE
e Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"*" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Int64 -> Doc ann
forall ann. Int64 -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Int64
sz) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> a -> Doc ann
f a
l
pL a -> Doc ann
f (MaΠ a
l AL
_ Temp
t CE
sz)         = Temp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Temp -> Doc ann
pretty Temp
t Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"=" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"malloc" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (CE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CE -> Doc ann
pretty CE
sz) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> a -> Doc ann
f a
l
pL a -> Doc ann
f (For a
l Temp
t CE
el IRel
rel CE
eu [CS a]
ss) = Doc ann
"for" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Temp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Temp -> Doc ann
pretty Temp
t Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
forall ann. Doc ann
comma Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Temp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Temp -> Doc ann
pretty Temp
t Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"≔" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> CE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CE -> Doc ann
pretty CE
el Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
forall ann. Doc ann
comma Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Temp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Temp -> Doc ann
pretty Temp
t Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> IRel -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. IRel -> Doc ann
pretty IRel
rel Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> CE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CE -> Doc ann
pretty CE
eu) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
forall ann. Doc ann
lbrace Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<#> Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
indent Int
4 ((a -> Doc ann) -> [CS a] -> Doc ann
forall a ann. (a -> Doc ann) -> [CS a] -> Doc ann
pCS a -> Doc ann
f [CS a]
ss) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<#> Doc ann
forall ann. Doc ann
rbrace Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> a -> Doc ann
f a
l
pL a -> Doc ann
f (For1 a
l Temp
t CE
el IRel
rel CE
eu [CS a]
ss) = Doc ann
"for-1" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Temp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Temp -> Doc ann
pretty Temp
t Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
forall ann. Doc ann
comma Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Temp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Temp -> Doc ann
pretty Temp
t Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"≔" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> CE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CE -> Doc ann
pretty CE
el Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
forall ann. Doc ann
comma Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Temp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Temp -> Doc ann
pretty Temp
t Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> IRel -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. IRel -> Doc ann
pretty IRel
rel Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> CE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CE -> Doc ann
pretty CE
eu) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
forall ann. Doc ann
lbrace Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<#> Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
indent Int
4 ((a -> Doc ann) -> [CS a] -> Doc ann
forall a ann. (a -> Doc ann) -> [CS a] -> Doc ann
pCS a -> Doc ann
f [CS a]
ss) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<#> Doc ann
forall ann. Doc ann
rbrace Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> a -> Doc ann
f a
l
pL a -> Doc ann
f (While a
l Temp
t IRel
rel CE
eb [CS a]
ss)  = Doc ann
"while" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Temp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Temp -> Doc ann
pretty Temp
t Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> IRel -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. IRel -> Doc ann
pretty IRel
rel Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> CE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CE -> Doc ann
pretty CE
eb) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
forall ann. Doc ann
lbrace Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<#> Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
indent Int
4 ((a -> Doc ann) -> [CS a] -> Doc ann
forall a ann. (a -> Doc ann) -> [CS a] -> Doc ann
pCS a -> Doc ann
f [CS a]
ss) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<#> Doc ann
forall ann. Doc ann
rbrace Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> a -> Doc ann
f a
l
pL a -> Doc ann
f (WT a
l PE
p [CS a]
ss)            = Doc ann
"while" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (PE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. PE -> Doc ann
pretty PE
p) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
forall ann. Doc ann
lbrace Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<#> Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
indent Int
4 ((a -> Doc ann) -> [CS a] -> Doc ann
forall a ann. (a -> Doc ann) -> [CS a] -> Doc ann
pCS a -> Doc ann
f [CS a]
ss) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<#> Doc ann
forall ann. Doc ann
rbrace Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> a -> Doc ann
f a
l
pL a -> Doc ann
f (Ifn't a
l PE
p [CS a]
s)          = Doc ann
"ifn't" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (PE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. PE -> Doc ann
pretty PE
p) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
forall ann. Doc ann
lbrace Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<#> Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
indent Int
4 ((a -> Doc ann) -> [CS a] -> Doc ann
forall a ann. (a -> Doc ann) -> [CS a] -> Doc ann
pCS a -> Doc ann
f [CS a]
s) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<#> Doc ann
forall ann. Doc ann
rbrace Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> a -> Doc ann
f a
l
pL a -> Doc ann
f (If a
l PE
p [CS a]
s0 [CS a]
s1)         = Doc ann
"if" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (PE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. PE -> Doc ann
pretty PE
p) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
forall ann. Doc ann
lbrace Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<#> Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
indent Int
4 ((a -> Doc ann) -> [CS a] -> Doc ann
forall a ann. (a -> Doc ann) -> [CS a] -> Doc ann
pCS a -> Doc ann
f [CS a]
s0) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<#> Doc ann
forall ann. Doc ann
rbrace Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"else" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
forall ann. Doc ann
lbrace Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<#> Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
indent Int
4 ((a -> Doc ann) -> [CS a] -> Doc ann
forall a ann. (a -> Doc ann) -> [CS a] -> Doc ann
pCS a -> Doc ann
f [CS a]
s1) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<#> Doc ann
forall ann. Doc ann
rbrace Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> a -> Doc ann
f a
l
pL a -> Doc ann
_ RA{}                   = Doc ann
forall a. Monoid a => a
mempty
pL a -> Doc ann
f (CpyE a
l ArrAcc
a ArrAcc
a' CE
e Int64
n)      = Doc ann
"cpy" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> ArrAcc -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. ArrAcc -> Doc ann
pretty ArrAcc
a Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
forall ann. Doc ann
comma Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> ArrAcc -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. ArrAcc -> Doc ann
pretty ArrAcc
a' Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (CE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CE -> Doc ann
pretty CE
eDoc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<>Doc ann
"*"Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<>Int64 -> Doc ann
forall ann. Int64 -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Int64
n) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> a -> Doc ann
f a
l
pL a -> Doc ann
f (CpyD a
l ArrAcc
a ArrAcc
a' CE
e)        = Doc ann
"cpydims" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> ArrAcc -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. ArrAcc -> Doc ann
pretty ArrAcc
a Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> ArrAcc -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. ArrAcc -> Doc ann
pretty ArrAcc
a' Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> CE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CE -> Doc ann
pretty CE
e Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> a -> Doc ann
f a
l
pL a -> Doc ann
f (Sa a
l Temp
t CE
e)             = Temp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Temp -> Doc ann
pretty Temp
t Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"=" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"salloc" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (CE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CE -> Doc ann
pretty CE
e) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> a -> Doc ann
f a
l
pL a -> Doc ann
f (Pop a
l CE
e)              = Doc ann
"pop" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> CE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CE -> Doc ann
pretty CE
e Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> a -> Doc ann
f a
l
pL a -> Doc ann
f (Cmov a
l PE
p Temp
t CE
e)         = Doc ann
"if" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (PE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. PE -> Doc ann
pretty PE
p) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
forall ann. Doc ann
lbrace Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<#> Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
indent Int
4 (Temp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Temp -> Doc ann
pretty Temp
t Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"=" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> CE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CE -> Doc ann
pretty CE
e) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<#> Doc ann
forall ann. Doc ann
rbrace Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> a -> Doc ann
f a
l
pL a -> Doc ann
f (Fcmov a
l PE
p FTemp
t CFE FTemp Double CE
e)        = Doc ann
"if" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (PE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. PE -> Doc ann
pretty PE
p) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
forall ann. Doc ann
lbrace Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<#> Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
indent Int
4 (FTemp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. FTemp -> Doc ann
pretty FTemp
t Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"=" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> CFE FTemp Double CE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CFE FTemp Double CE -> Doc ann
pretty CFE FTemp Double CE
e) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<#> Doc ann
forall ann. Doc ann
rbrace Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> a -> Doc ann
f a
l
pL a -> Doc ann
f (Cset a
l PE
p BTemp
t)           = BTemp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. BTemp -> Doc ann
pretty BTemp
t Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"=" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> PE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. PE -> Doc ann
pretty PE
p Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> a -> Doc ann
f a
l
pL a -> Doc ann
f (SZ a
l Temp
td Temp
t CE
_ Maybe AL
_)        = Temp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Temp -> Doc ann
pretty Temp
td Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"=" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"SIZE" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Temp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Temp -> Doc ann
pretty Temp
t) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> a -> Doc ann
f a
l
pL a -> Doc ann
f (PlProd a
l Temp
t [CE]
ts)        = Temp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Temp -> Doc ann
pretty Temp
t Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"=" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"PRODUCT" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
tupled (CE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CE -> Doc ann
pretty(CE -> Doc ann) -> [CE] -> [Doc ann]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>[CE]
ts) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> a -> Doc ann
f a
l
pL a -> Doc ann
f (Rnd a
l Temp
t)              = Temp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Temp -> Doc ann
pretty Temp
t Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"=" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"(rnd)" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> a -> Doc ann
f a
l
pL a -> Doc ann
f (FRnd a
l FTemp
x)             = FTemp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. FTemp -> Doc ann
pretty FTemp
x Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"=" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"(frnd)" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> a -> Doc ann
f a
l
pL a -> Doc ann
f (Def a
la Label
l [CS a]
cs)          = Doc ann
forall ann. Doc ann
hardline Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Label -> Doc ann
forall ann. Label -> Doc ann
pS Label
l Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
":" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<#> Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
indent Int
4 ((a -> Doc ann) -> [CS a] -> Doc ann
forall a ann. (a -> Doc ann) -> [CS a] -> Doc ann
pCS a -> Doc ann
f [CS a]
cs) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> a -> Doc ann
f a
la
pL a -> Doc ann
f (G a
la Label
l Label
_)             = Doc ann
"GOTO" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Label -> Doc ann
forall ann. Label -> Doc ann
pS Label
l Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> a -> Doc ann
f a
la

pS :: Label -> Doc ann
pS :: forall ann. Label -> Doc ann
pS Label
l = Doc ann
"fun_" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Label -> Doc ann
forall ann. Label -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Label
l

instance Show (CS a) where show :: CS a -> String
show=Doc Any -> String
forall a. Show a => a -> String
show(Doc Any -> String) -> (CS a -> Doc Any) -> CS a -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.CS a -> Doc Any
forall a ann. Pretty a => a -> Doc ann
forall ann. CS a -> Doc ann
pretty

prettyCS :: (AsmData, [CS a]) -> Doc ann
prettyCS :: forall a ann. (AsmData, [CS a]) -> Doc ann
prettyCS (AsmData
ds,[CS a]
ss) = (a -> Doc ann) -> [CS a] -> Doc ann
forall a ann. (a -> Doc ann) -> [CS a] -> Doc ann
pCS (Doc ann -> a -> Doc ann
forall a b. a -> b -> a
constDoc ann
"") [CS a]
ss

pCS :: (a -> Doc ann) -> [CS a] -> Doc ann
pCS :: forall a ann. (a -> Doc ann) -> [CS a] -> Doc ann
pCS a -> Doc ann
f=[Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
prettyLines([Doc ann] -> Doc ann)
-> ([CS a] -> [Doc ann]) -> [CS a] -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(CS a -> Doc ann) -> [CS a] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((a -> Doc ann) -> CS a -> Doc ann
forall {a} {ann}. (a -> Doc ann) -> CS a -> Doc ann
pL a -> Doc ann
f)

data LSt = LSt { LSt -> Label
clabel :: !Label, LSt -> Int
ctemps :: !Int }