%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcommand{\itm}[1]{\ensuremath{\mathit{#1}}} \newcommand{\ttm}[1]{\ensuremath{\mathtt{#1}}} \newcommand{\Stmt}{\itm{stmt}} \newcommand{\Exp}{\itm{exp}} \newcommand{\Def}{\itm{def}} \newcommand{\Type}{\itm{type}} \newcommand{\FType}{\itm{ftype}} \newcommand{\Instr}{\itm{instr}} \newcommand{\Block}{\itm{block}} \newcommand{\Tail}{\itm{tail}} \newcommand{\Prog}{\itm{prog}} \newcommand{\Arg}{\itm{arg}} \newcommand{\Atm}{\itm{atm}} \newcommand{\Reg}{\itm{reg}} \newcommand{\Int}{\itm{int}} \newcommand{\Var}{\itm{var}} \newcommand{\Op}{\itm{op}} \newcommand{\key}[1]{\texttt{#1}} \newcommand{\code}[1]{\texttt{#1}} \newcommand{\LP}[0]{\key{(}} \newcommand{\RP}[0]{\key{)}} \newcommand{\LS}[0]{\key{[}} \newcommand{\RS}[0]{\key{]}} \newcommand{\INT}[1]{\key{(Int}\;#1\key{)}} \newcommand{\BOOL}[1]{\key{(Bool}\;#1\key{)}} \newcommand{\PRIM}[2]{\LP\key{Prim}~#1~\LP\key{list}~#2\RP\RP} \newcommand{\READ}{\key{(Prim}\;\code{'read}\;\key{'())}} \newcommand{\CREAD}{\key{(read)}} \newcommand{\NEG}[1]{\key{(Prim}\;\code{'-}\;\code{(list}\;#1\;\code{))}} \newcommand{\CNEG}[1]{\LP\key{-}~#1\RP} \newcommand{\PROGRAM}[2]{\LP\code{Program}\;#1\;#2\RP} \newcommand{\PROGRAMDEFSEXP}[3]{\code{(ProgramDefsExp}~#1~#2~#3\code{)}} \newcommand{\PROGRAMDEFS}[2]{\code{(ProgramDefs}~#1~#2\code{)}} \newcommand{\ADD}[2]{\key{(Prim}\;\code{'+}\;\code{(list}\;#1\;#2\code{))}} \newcommand{\CADD}[2]{\LP\key{+}~#1~#2\RP} \newcommand{\SUB}[2]{\key{(Prim}\;\code{'-}\;\code{(list}\;#1\;#2\code{))}} \newcommand{\CSUB}[2]{\LP\key{-}~#1~#2\RP} \newcommand{\AND}[2]{\key{(Prim}\;\code{'and}\;\code{(list}\;#1\;#2\code{))}} \newcommand{\OR}[2]{\key{(Prim}\;\code{'or}\;\code{(list}\;#1\;#2\code{))}} \newcommand{\NOT}[1]{\key{(Prim}\;\code{'not}\;\code{(list}\;#1\;\code{))}} \newcommand{\UNIOP}[2]{\key{(Prim}\;#1\;\code{(list}\;#2\code{))}} \newcommand{\CUNIOP}[2]{\LP #1\;#2 \RP} \newcommand{\BINOP}[3]{\key{(Prim}\;#1\;\code{(list}\;#2\;#3\code{))}} \newcommand{\CBINOP}[3]{\LP #1\;#2\;#3\RP} \newcommand{\CLET}[3]{\LP\key{let}~\LP\LS\Var~\Exp\RS\RP~\Exp\RP} \newcommand{\CIF}[3]{\LP\key{if}~#1~#2~#3\RP} \newcommand{\VAR}[1]{\key{(Var}\;#1\key{)}} \newcommand{\LET}[3]{\key{(Let}~#1~#2~#3\key{)}} \newcommand{\IF}[3]{\key{(If}\,#1\;#2\;#3\key{)}} \newcommand{\VECTOR}[1]{\key{(Prim}\;\code{'vector}\;\code{(list}\;#1^{*}\code{))}} \newcommand{\VECREF}[2]{\key{(Prim}\;\code{'vector-ref}\;\code{(list}\;#1\;#2\code{))}} \newcommand{\VECSET}[3]{\key{(Prim}\;\code{'vector-set!}\;\code{(list}\;#1\;#2\;#3\code{))}} \newcommand{\VECLEN}[1]{\key{(Prim}\;\code{'vector-length}\;\code{(list}\;#1\code{))}} \newcommand{\VOID}[1]{\key{(Void)}} \newcommand{\APPLY}[2]{\key{(Apply}\;#1\;#2\code{)}} \newcommand{\CALL}[2]{\key{(Call}\;#1\;#2\code{)}} \newcommand{\TAILCALL}[2]{\key{(TailCall}\;#1\;#2\code{)}} \newcommand{\FUNDEF}[5]{\key{(Def}~#1~#2~#3~#4~#5\code{)}} \newcommand{\FUNREF}[1]{\key{(FunRef}\;#1\code{)}} \newcommand{\LAMBDA}[3]{\key{(Lambda}~#1~#2~#3\code{)}} \newcommand{\CLAMBDA}[3]{\LP\key{lambda:}\,#1\,\key{:}\,#2\;\Exp\RP} \newcommand{\INJECT}[2]{\LP\key{Inject}~#1~#2\RP} \newcommand{\PROJECT}[2]{\LP\key{Project}~#1~#2\RP} \newcommand{\CINJECT}[2]{\LP\key{inject}~#1~#2\RP} \newcommand{\CPROJECT}[2]{\LP\key{project}~#1~#2\RP} \newcommand{\ASSIGN}[2]{\key{(Assign}~#1\;#2\key{)}} \newcommand{\RETURN}[1]{\key{(Return}~#1\key{)}} \newcommand{\SEQ}[2]{\key{(Seq}~#1~#2\key{)}} \newcommand{\GOTO}[1]{\key{(Goto}~#1\key{)}} \newcommand{\IFSTMT}[3]{\key{(IfStmt}\,#1\;#2\;#3\key{)}} \newcommand{\IMM}[1]{\key{(Imm}\;#1\key{)}} \newcommand{\REG}[1]{\key{(Reg}\;#1\key{)}} \newcommand{\BYTEREG}[1]{\key{(ByteReg}\;#1\key{)}} \newcommand{\DEREF}[2]{\key{(Deref}~#1~#2\key{)}} \newcommand{\DEF}[5]{\key{(Def}~#1~#2~#3~#4~#5\key{)}} \newcommand{\CDEF}[4]{\LP\key{define}~\LP#1~#2\RP\,\key{:}\,#3~#4\RP} \newcommand{\CFG}[1]{\key{(CFG}\;#1\key{)}} \newcommand{\BLOCK}[2]{\key{(Block}\;#1\;#2\key{)}} \newcommand{\STACKLOC}[1]{(\key{stack}\;#1)} \newcommand{\BININSTR}[3]{\key{(Instr}\;#1\;\key{(list}\;#2\;#3\key{))}} \newcommand{\UNIINSTR}[2]{\key{(Instr}\;#1\;\key{(list}\;#2\key{))}} \newcommand{\CALLQ}[2]{\key{(Callq}~#1~#2\key{)}} \newcommand{\INDCALLQ}[2]{\key{(IndirectCallq}~#1~#2\key{)}} \newcommand{\RETQ}{\key{(Retq)}} \newcommand{\PUSHQ}[1]{\key{(Pushq}~#1\key{)}} \newcommand{\POPQ}[1]{\key{(Popq}~#1\key{)}} \newcommand{\JMP}[1]{\key{(Jmp}~#1\key{)}} \newcommand{\TAILJMP}[2]{\key{(TailJmp}~#1~#2\key{)}} \newcommand{\JMPIF}[2]{\key{(JmpIf}~#1~#2\key{)}} \newcommand{\TTKEY}[1]{{\normalfont\tt #1}}