{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
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
| ARnk Temp (Maybe AL)
| ADim Temp CE (Maybe AL)
| At Temp [CE] [CE] (Maybe AL) Int64
| Raw Temp CE (Maybe AL) Int64
| 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
| DP Temp CE
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 }
| CpyE { lann :: a, forall a. CS a -> ArrAcc
aDest, forall a. CS a -> ArrAcc
aSrc :: ArrAcc, nElem :: CE, elemSz :: !Int64 }
| CpyD { lann :: a, aDest, aSrc :: ArrAcc, forall a. CS a -> CE
nDims :: CE }
| 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 }
| 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
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 }