{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE OverloadedStrings #-}
module C ( Temp (..), FTemp (..), BTemp (..)
, ArrAcc (..)
, CE (..), CFE (..)
, 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.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
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 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
| 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
x) = Doc ann
"⌊" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> CFE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CFE -> Doc ann
pretty CFE
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
data CFE = FAt ArrAcc | FBin FBin CFE CFE | FUn FUn CFE | FTmp FTemp | ConstF !Double | IE CE
instance Num CFE where
+ :: CFE -> CFE -> CFE
(+) = FBin -> CFE -> CFE -> CFE
FBin FBin
FPlus; * :: CFE -> CFE -> CFE
(*) = FBin -> CFE -> CFE -> CFE
FBin FBin
FTimes; (-) = FBin -> CFE -> CFE -> CFE
FBin FBin
FMinus; fromInteger :: Integer -> CFE
fromInteger=Double -> CFE
ConstF (Double -> CFE) -> (Integer -> Double) -> Integer -> CFE
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> Double
forall a. Num a => Integer -> a
fromInteger
instance Fractional CFE where
/ :: CFE -> CFE -> CFE
(/) = FBin -> CFE -> CFE -> CFE
FBin FBin
FDiv; fromRational :: Rational -> CFE
fromRational=Double -> CFE
ConstF (Double -> CFE) -> (Rational -> Double) -> Rational -> CFE
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rational -> Double
forall a. Fractional a => Rational -> a
fromRational
instance Pretty CFE where pretty :: forall ann. CFE -> Doc ann
pretty=Int -> CFE -> Doc ann
forall ann. Int -> CFE -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
0
data PE = IRel IRel CE CE
| FRel FRel CFE CFE
| 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
e0 CFE
e1) = CFE -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CFE -> Doc ann
pretty CFE
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 -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CFE -> Doc ann
pretty CFE
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 PS CFE where
ps :: forall ann. Int -> CFE -> 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
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 -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CFE -> Doc ann
pretty CFE
e)
ps Int
d (FBin FBin
op CFE
x0 CFE
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 -> Doc ann
forall ann. Int -> CFE -> 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
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 -> Doc ann
forall ann. Int -> CFE -> 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
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 -> Doc ann
forall ann. Int -> CFE -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
11 CFE
x0 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Int -> CFE -> Doc ann
forall ann. Int -> CFE -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
11 CFE
x1)
ps Int
_ (FTmp FTemp
t) = FTemp -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. FTemp -> Doc ann
pretty FTemp
t
ps Int
_ (ConstF Double
x) = Double -> Doc ann
forall ann. Double -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Double
x
ps Int
d (IE CE
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 -> CE -> Doc ann
forall ann. Int -> CE -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
11 CE
e)
instance Show CFE where show :: CFE -> String
show=Doc Any -> String
forall a. Show a => a -> String
show(Doc Any -> String) -> (CFE -> Doc Any) -> CFE -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.CFE -> Doc Any
forall a ann. Pretty a => a -> Doc ann
forall ann. CFE -> 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] }
| 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
ftSrc :: CFE }
| 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
wrF :: CFE }
| 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
fsrc :: CFE }
| 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
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 -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CFE -> Doc ann
pretty CFE
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
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 -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CFE -> Doc ann
pretty CFE
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
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 -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CFE -> Doc ann
pretty CFE
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 (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
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 -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CFE -> Doc ann
pretty CFE
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 }