defs.tex 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2. \newcommand{\itm}[1]{\ensuremath{\mathit{#1}}}
  3. \newcommand{\ttm}[1]{\ensuremath{\text{\texttt{#1}}}}
  4. \if\edition\racketEd
  5. \newcommand{\LangInt}{\ensuremath{R_{\mathsf{Int}}}} % R0
  6. \newcommand{\LangVar}{$R_{\mathsf{Var}}$} % R1
  7. \newcommand{\LangVarM}{R_{\mathsf{Var}}}
  8. \newcommand{\LangVarANF}{\ensuremath{R^{\mathsf{ANF}}_{\mathsf{Var}}}}
  9. \newcommand{\LangVarANFM}{R^{\mathsf{ANF}}_{\mathsf{Var}}}
  10. \newcommand{\LangIf}{$R_{\mathsf{If}}$} %R2
  11. \fi
  12. \if\edition\pythonEd
  13. \newcommand{\LangInt}{\ensuremath{P_{\mathsf{Int}}}} % R0
  14. \newcommand{\LangVar}{$P_{\mathsf{Var}}$} % R1
  15. \newcommand{\LangVarM}{P_{\mathsf{Var}}}
  16. \newcommand{\LangVarANF}{\ensuremath{P^{\mathsf{ANF}}_{\mathsf{Var}}}}
  17. \newcommand{\LangVarANFM}{P^{\mathsf{ANF}}_{\mathsf{Var}}}
  18. \newcommand{\LangIf}{$P_{\mathsf{If}}$} %R2
  19. \fi
  20. \newcommand{\LangCVar}{$C_{\mathsf{Var}}$} % C0
  21. \newcommand{\LangCVarM}{C_{\mathsf{Var}}} % C0
  22. \newcommand{\LangIfM}{\ensuremath{R_{\mathsf{If}}}} %R2
  23. \newcommand{\LangCIf}{$C_{\mathsf{If}}$} %C1
  24. \newcommand{\LangCIfM}{\ensuremath{C_{\mathsf{If}}}} %C1
  25. \newcommand{\LangIfANF}{\ensuremath{R^{\mathsf{ANF}}_{\mathsf{if}}}} %R2
  26. \newcommand{\LangVec}{$R_{\mathsf{Vec}}$} %R3
  27. \newcommand{\LangVecM}{R_{\mathsf{Vec}}} %R3
  28. \newcommand{\LangStruct}{\ensuremath{R^{\mathsf{Struct}}_{\mathsf{Vec}}}} %R^s3
  29. \newcommand{\LangCVec}{$C_{\mathsf{Vec}}$} %C2
  30. \newcommand{\LangCVecM}{C_{\mathsf{Vec}}} %C2
  31. \newcommand{\LangVecANF}{\ensuremath{R^{\mathsf{ANF}}_{\mathsf{Vec}}}} %R3
  32. \newcommand{\LangVecANFM}{R^{\mathsf{ANF}}_{\mathsf{Vec}}} %R3
  33. \newcommand{\LangAlloc}{\ensuremath{R_{\mathsf{Alloc}}}} %R3'
  34. \newcommand{\LangFun}{$R_{\mathsf{Fun}}$} %R4
  35. \newcommand{\LangFunM}{R_{\mathsf{Fun}}} %R4
  36. \newcommand{\LangCFun}{$C_{\mathsf{Fun}}$} %C3
  37. \newcommand{\LangCFunM}{C_{\mathsf{Fun}}} %C3
  38. \newcommand{\LangFunANF}{\ensuremath{R^{\mathsf{ANF}}_{\mathsf{Fun}}}} %R4
  39. \newcommand{\LangFunRef}{$R_{\mathsf{FunRef}}$} %F1
  40. \newcommand{\LangFunRefM}{R_{\mathsf{FunRef}}} %F1
  41. \newcommand{\LangFunRefAlloc}{\ensuremath{R^{\mathsf{Alloc}}_{\mathsf{FunRef}}}} %R'4
  42. \newcommand{\LangLam}{$R_\lambda$} %R5
  43. \newcommand{\LangLamM}{\ensuremath{R_\lambda}} %R5
  44. \newcommand{\LangCLam}{$C_{\mathsf{Clos}}$} %C4
  45. \newcommand{\LangCLamM}{C_{\mathsf{Clos}}} %C4
  46. \newcommand{\LangAny}{$R_{\mathsf{Any}}$} %R6
  47. \newcommand{\LangAnyM}{R_{\mathsf{Any}}} %R6
  48. \newcommand{\LangAnyFunRef}{\ensuremath{R^{\mathsf{FunRef}}_{\mathsf{Any}}}} %R'6
  49. \newcommand{\LangAnyAlloc}{\ensuremath{R^{\mathsf{Alloc}}_{\mathsf{Any}}}} %R'6
  50. \newcommand{\LangCAny}{$C_{\mathsf{Any}}$} %C5
  51. \newcommand{\LangCAnyM}{C_{\mathsf{Any}}} %C5
  52. \newcommand{\LangDyn}{$R_{\mathsf{Dyn}}$} %R7
  53. \newcommand{\LangDynM}{R_{\mathsf{Dyn}}} %R7
  54. \newcommand{\LangDynFunRef}{\ensuremath{R^{\mathsf{FunRef}}_{\mathsf{Dyn}}}} %R'7
  55. \newcommand{\LangLoop}{$R_{\mathsf{While}}$} %R8
  56. \newcommand{\LangLoopM}{R_{\mathsf{While}}} %R8
  57. \newcommand{\LangLoopFunRef}{\ensuremath{R^{\mathsf{FunRef}}_{\mathsf{While}}}} %R'8
  58. \newcommand{\LangLoopAlloc}{\ensuremath{R^{\mathsf{Alloc}}_{\mathsf{While}}}} %R'8
  59. \newcommand{\LangCLoop}{$C_{\circlearrowleft}$} %C7
  60. \newcommand{\LangCLoopM}{C_{\circlearrowleft}} %C7
  61. \newcommand{\LangLoopANF}{\ensuremath{R^{\mathsf{ANF}}_{\mathsf{While}}}} %R8
  62. \newcommand{\LangArray}{\ensuremath{R^{\mathsf{Vecof}}_{\mathsf{While}}}} %R^s3
  63. \newcommand{\LangGrad}{$R_{\mathsf{?}}$} %R9
  64. \newcommand{\LangGradM}{R_{\mathsf{?}}} %R9
  65. \newcommand{\LangCast}{$R_{\mathsf{cast}}$} %R9'
  66. \newcommand{\LangCastM}{R_{\mathsf{cast}}} %R9'
  67. \newcommand{\LangProxy}{\ensuremath{R_{\mathsf{proxy}}}} %R8''
  68. \newcommand{\LangPVec}{\ensuremath{R_{\mathsf{PVec}}}} %R8''
  69. \newcommand{\LangPVecFunRef}{\ensuremath{R^{\mathsf{FunRef}}_{\mathsf{PVec}}}} %R8''
  70. \newcommand{\LangPVecAlloc}{\ensuremath{R^{\mathsf{Alloc}}_{\mathsf{PVec}}}} %R8''
  71. \newcommand{\LangPoly}{\ensuremath{R_{\mathsf{Poly}}}} %R10
  72. \newcommand{\LangInst}{\ensuremath{R_{\mathsf{Inst}}}} %R'10
  73. \newcommand{\LangCLoopPVec}{\ensuremath{C^{\mathsf{PVec}}_{\circlearrowleft}}} %Cp7
  74. \newcommand{\LangXVar}{$\mathrm{x86}_{\mathsf{Var}}$} % pseudo x86_0
  75. \newcommand{\LangXASTInt}{\ensuremath{\mathrm{x86}_{\mathsf{Int}}}} % x86_0
  76. \newcommand{\LangXInt}{$\mathrm{x86}_{\mathsf{Int}}$} %x86^{\dagger}_0
  77. \newcommand{\LangXIntM}{\mathrm{x86}_{\mathsf{Int}}} %x86^{\dagger}_0
  78. \newcommand{\LangXASTIf}{\ensuremath{\mathrm{x86}_{\mathsf{If}}}} %x86_1
  79. \newcommand{\LangXIf}{$\mathrm{x86}_{\mathsf{If}}$} %x86^{\dagger}_1
  80. \newcommand{\LangXIfM}{\mathrm{x86}_{\mathsf{If}}} %x86^{\dagger}_1
  81. \newcommand{\LangXIfVar}{\ensuremath{\mathrm{x86}^{\mathsf{Var}}_{\mathsf{If}}}} %x86^{*}_1
  82. \newcommand{\LangXASTGlobal}{\ensuremath{\mathrm{x86}_{\mathsf{Global}}}} %x86_2
  83. \newcommand{\LangXGlobal}{$\mathrm{x86}_{\mathsf{Global}}$} %x86^{\dagger}_2
  84. \newcommand{\LangXGlobalM}{\mathrm{x86}_{\mathsf{Global}}} %x86^{\dagger}_2
  85. \newcommand{\LangXGlobalVar}{\ensuremath{\mathrm{x86}^{\mathsf{Var}}_{\mathsf{Global}}}} %x86^{*}_2
  86. \newcommand{\LangXIndCall}{$\mathrm{x86}_{\mathsf{callq*}}$} %x86_3
  87. \newcommand{\LangXIndCallM}{\mathrm{x86}_{\mathsf{callq*}}} %x86_3
  88. \newcommand{\LangXIndCallVar}{\ensuremath{\mathrm{x86}^{\mathsf{Var}}_{\mathsf{callq*}}}} %x86^*_3
  89. \newcommand{\Stmt}{\itm{stmt}}
  90. \newcommand{\Exp}{\itm{exp}}
  91. \newcommand{\Def}{\itm{def}}
  92. \newcommand{\Type}{\itm{type}}
  93. \newcommand{\FType}{\itm{ftype}}
  94. \newcommand{\Instr}{\itm{instr}}
  95. \newcommand{\Block}{\itm{block}}
  96. \newcommand{\Tail}{\itm{tail}}
  97. \newcommand{\Prog}{\itm{prog}}
  98. \newcommand{\Arg}{\itm{arg}}
  99. \newcommand{\Atm}{\itm{atm}}
  100. \newcommand{\Reg}{\itm{reg}}
  101. \newcommand{\Int}{\itm{int}}
  102. \newcommand{\Var}{\itm{var}}
  103. \newcommand{\Op}{\itm{op}}
  104. \newcommand{\key}[1]{\texttt{#1}}
  105. \newcommand{\code}[1]{\texttt{#1}}
  106. \newcommand{\LP}{\key{(}}
  107. \newcommand{\RP}{\key{)}}
  108. \newcommand{\LS}{\key{[}}
  109. \newcommand{\RS}{\key{]}}
  110. \newcommand{\MID}{\;\;\mid\;\;}
  111. \if\edition\racketEd
  112. \newcommand{\INT}[1]{{\color{olive}\key{(Int}~#1\key{)}}}
  113. \newcommand{\READOP}{{\color{olive}\key{read}}}
  114. \newcommand{\READ}{{\color{olive}\key{(Prim}~\code{read}~\key{())}}}
  115. \newcommand{\NEG}[1]{{\color{olive}\key{(Prim}~\code{-}~\code{(}#1\code{))}}}
  116. \newcommand{\ADD}[2]{{\color{olive}\key{(Prim}~\code{+}~\code{(}#1~#2\code{))}}}
  117. \newcommand{\PROGRAM}[2]{\LP\code{Program}~#1~#2\RP}
  118. \newcommand{\VAR}[1]{\key{(Var}~#1\key{)}}
  119. \fi
  120. \if\edition\pythonEd
  121. \newcommand{\INT}[1]{{\color{purple}\key{Constant(}#1\key{)}}}
  122. \newcommand{\READOP}{{\color{purple}\key{input\_int}}}
  123. \newcommand{\READ}{{\color{purple}\key{Call(Name('input\_int'),[])}}}
  124. \newcommand{\NEG}[1]{{\color{purple}\key{UnaryOp(USub(),} #1\code{)}}}
  125. \newcommand{\ADD}[2]{{\color{purple}\key{BinOp(Add()}\key{,}#1\code{,}#2\code{)}}}
  126. \newcommand{\PRINT}[1]{{\color{purple}\key{Expr}\LP\key{Call}\LP\key{Name}\LP\key{'print'}\RP\key{,}\LS#1\RS\RP\RP}}
  127. \newcommand{\EXPR}[1]{{\color{purple}\key{Expr}\LP #1\RP}}
  128. \newcommand{\PROGRAM}[2]{\code{Module}\LP #2\RP}
  129. \newcommand{\VAR}[1]{\key{Name}\LP #1\RP}
  130. \fi
  131. \newcommand{\BOOL}[1]{\key{(Bool}~#1\key{)}}
  132. \newcommand{\PRIM}[2]{\LP\key{Prim}~#1~\LP #2\RP\RP}
  133. \newcommand{\CREAD}{\key{(read)}}
  134. \newcommand{\CNEG}[1]{\LP\key{-}~#1\RP}
  135. \newcommand{\CPROGRAM}[2]{\LP\code{CProgram}~#1~#2\RP}
  136. \newcommand{\PROGRAMDEFSEXP}[3]{\code{(ProgramDefsExp}~#1~#2~#3\code{)}}
  137. \newcommand{\PROGRAMDEFS}[2]{\code{(ProgramDefs}~#1~#2\code{)}}
  138. \newcommand{\CADD}[2]{\LP\key{+}~#1~#2\RP}
  139. \newcommand{\CMUL}[2]{\LP\key{*}~#1~#2\RP}
  140. \newcommand{\SUB}[2]{\key{(Prim}~\code{-}~\code{(}#1~#2\code{))}}
  141. \newcommand{\CSUB}[2]{\LP\key{-}~#1~#2\RP}
  142. \newcommand{\CWHILE}[2]{\LP\key{while}~#1~#2\RP}
  143. \newcommand{\WHILE}[2]{\LP\key{WhileLoop}~#1~#2\RP}
  144. \newcommand{\CBEGIN}[2]{\LP\key{begin}~#1~#2\RP}
  145. \newcommand{\CMAKEVEC}[2]{\LP\key{make-vector}~#1~#2\RP}
  146. \newcommand{\BEGIN}[2]{\LP\key{Begin}~#1~#2\RP}
  147. \newcommand{\CSETBANG}[2]{\LP\key{set!}~#1~#2\RP}
  148. \newcommand{\SETBANG}[2]{\LP\key{SetBang}~#1~#2\RP}
  149. \newcommand{\AND}[2]{\key{(Prim}~\code{and}~\code{(}#1~#2\code{))}}
  150. \newcommand{\OR}[2]{\key{(Prim}~\code{or}~\code{(}#1~#2\code{))}}
  151. \newcommand{\NOT}[1]{\key{(Prim}~\code{not}~\code{(}#1~\code{))}}
  152. \newcommand{\UNIOP}[2]{\key{(Prim}~#1~\code{(}#2\code{))}}
  153. \newcommand{\CUNIOP}[2]{\LP #1~#2 \RP}
  154. \newcommand{\BINOP}[3]{\key{(Prim}~#1~\code{(}#2~#3\code{))}}
  155. \newcommand{\CBINOP}[3]{\LP #1~#2~#3\RP}
  156. \newcommand{\CLET}[3]{\LP\key{let}~\LP\LS#1~#2\RS\RP~#3\RP}
  157. \newcommand{\CIF}[3]{\LP\key{if}~#1~#2~#3\RP}
  158. \newcommand{\LET}[3]{\key{(Let}~#1~#2~#3\key{)}}
  159. \newcommand{\IF}[3]{\key{(If}\,#1~#2~#3\key{)}}
  160. \newcommand{\CAST}[3]{\LP\key{Cast}~#1~#2~#3\RP}
  161. \newcommand{\VECTOR}[1]{\LP\key{Prim}~\code{vector}~\LP~#1\RP\RP}
  162. \newcommand{\VECREF}[2]{\LP\key{Prim}~\code{vector-ref}~\LP~#1~#2\RP\RP}
  163. \newcommand{\VECSET}[3]{\LP\key{Prim}~\code{vector-set!}~\LP~#1~#2~#3\RP\RP}
  164. \newcommand{\VECLEN}[1]{\LP\key{Prim}~\code{vector-length}~\LP~#1\RP\RP}
  165. \newcommand{\ANYVECREF}[2]{\LP\key{Prim}~\code{any-vector-ref}~\LP~#1~#2\RP\RP}
  166. \newcommand{\ANYVECSET}[3]{\LP\key{Prim}~\code{any-vector-set!}~\LP~#1~#2~#3\RP\RP}
  167. \newcommand{\ANYVECLEN}[1]{\LP\key{Prim}~\code{any-vector-length}~\LP~#1\RP\RP}
  168. \newcommand{\CLOSURE}[2]{\LP\key{Closure}~#1~#2\RP}
  169. \newcommand{\ALLOC}[2]{\LP\key{Allocate}~#1~#2\RP}
  170. \newcommand{\ALLOCCLOS}[3]{\LP\key{AllocateClosure}~#1~#2~#3\RP}
  171. \newcommand{\VOID}[1]{\key{(Void)}}
  172. \newcommand{\APPLY}[2]{\key{(Apply}~#1~#2\code{)}}
  173. \newcommand{\CALL}[2]{\key{(Call}~#1~#2\code{)}}
  174. \newcommand{\TAILCALL}[2]{\key{(TailCall}~#1~#2\code{)}}
  175. \newcommand{\FUNDEF}[5]{\key{(Def}~#1~#2~#3~#4~#5\code{)}}
  176. \newcommand{\FUNREF}[1]{\key{(FunRef}~#1\code{)}}
  177. \newcommand{\CFUNREF}[1]{\key{(fun-ref}~#1\code{)}}
  178. \newcommand{\FUNREFARITY}[2]{\key{(FunRefArity}~#1~#2\code{)}}
  179. \newcommand{\CFUNREFARITY}[2]{\key{(fun-ref-arity}~#1~#2\code{)}}
  180. \newcommand{\LAMBDA}[3]{\key{(Lambda}~#1~#2~#3\code{)}}
  181. \newcommand{\CLAMBDA}[3]{\LP\key{lambda:}\,#1\,\key{:}\,#2~\Exp\RP}
  182. \newcommand{\CGLAMBDA}[3]{\LP\key{lambda:}\,#1\,#2~\Exp\RP}
  183. \newcommand{\INJECT}[2]{\LP\key{Inject}~#1~#2\RP}
  184. \newcommand{\PROJECT}[2]{\LP\key{Project}~#1~#2\RP}
  185. \newcommand{\CINJECT}[2]{\LP\key{inject}~#1~#2\RP}
  186. \newcommand{\CPROJECT}[2]{\LP\key{project}~#1~#2\RP}
  187. \newcommand{\VALUEOF}[2]{\LP\key{ValueOf}~#1~#2\RP}
  188. \if\edition\racketEd
  189. \newcommand{\ASSIGN}[2]{\key{(Assign}~#1~#2\key{)}}
  190. \fi
  191. \if\edition\pythonEd
  192. \newcommand{\ASSIGN}[2]{\key{Assign}\LP\LS #1\RS\key{,}#2\RP}
  193. \fi
  194. \newcommand{\RETURN}[1]{\key{(Return}~#1\key{)}}
  195. \newcommand{\SEQ}[2]{\key{(Seq}~#1~#2\key{)}}
  196. \newcommand{\GOTO}[1]{\key{(Goto}~#1\key{)}}
  197. \newcommand{\IFSTMT}[3]{\key{(IfStmt}\,#1~#2~#3\key{)}}
  198. \if\edition\racketEd
  199. \newcommand{\IMM}[1]{\key{(Imm}~#1\key{)}}
  200. \newcommand{\REG}[1]{\key{(Reg}~#1\key{)}}
  201. \newcommand{\DEREF}[2]{\key{(Deref}~#1~#2\key{)}}
  202. \newcommand{\BININSTR}[3]{\key{(Instr}~#1~\key{(}#2~#3\key{))}}
  203. \newcommand{\UNIINSTR}[2]{\key{(Instr}~#1~\key{(}#2\key{))}}
  204. \newcommand{\CALLQ}[2]{\key{(Callq}~#1~#2\key{)}}
  205. \newcommand{\PUSHQ}[1]{\key{(Pushq}~#1\key{)}}
  206. \newcommand{\POPQ}[1]{\key{(Popq}~#1\key{)}}
  207. \newcommand{\JMP}[1]{\key{(Jmp}~#1\key{)}}
  208. \newcommand{\RETQ}{\key{(Retq)}}
  209. \newcommand{\XPROGRAM}[2]{\LP\code{X86Program}~#1~#2\RP}
  210. \fi
  211. \if\edition\pythonEd
  212. \newcommand{\IMM}[1]{\key{Constant}\LP #1\RP}
  213. \newcommand{\REG}[1]{\key{Reg}\LP #1\RP}
  214. \newcommand{\DEREF}[2]{\key{Deref}\LP #1 \key{,} #2 \RP}
  215. \newcommand{\BININSTR}[3]{\key{Instr}\LP #1 \key{,} \LS #2 \key{,} #3 \RS \RP}
  216. \newcommand{\UNIINSTR}[2]{\key{Instr}\LP #1 \key{,} \LS #2 \RS \RP}
  217. \newcommand{\CALLQ}[2]{\key{Callq}\LP #1 \key{,} #2 \RP}
  218. \newcommand{\PUSHQ}[1]{\key{Pushq}\LP #1 \RP}
  219. \newcommand{\POPQ}[1]{\key{Popq}\LP #1 \RP}
  220. \newcommand{\JMP}[1]{\key{Jump}\LP #1 \RP}
  221. \newcommand{\RETQ}{\key{Retq}\LP\RP}
  222. % TODO: change \XPROGRAM to 1 parameter
  223. \newcommand{\XPROGRAM}[2]{\code{X86Program}\LP #1 \RP}
  224. \fi
  225. \newcommand{\BYTEREG}[1]{\key{(ByteReg}~#1\key{)}}
  226. \newcommand{\DEF}[5]{\LP\key{Def}~#1~#2~#3~#4~#5\RP}
  227. \newcommand{\CDEF}[4]{\LP\key{define}~\LP#1~#2\RP\,\key{:}\,#3~#4\RP}
  228. \newcommand{\CGDEF}[4]{\LP\key{define}~\LP#1~#2\RP\,#3~#4\RP}
  229. \newcommand{\DECL}[2]{\LP\key{Decl}~#1~#2\RP}
  230. \newcommand{\INST}[3]{\LP\key{Inst}~#1~#2~#3\RP}
  231. \newcommand{\CFG}[1]{\key{(CFG}~#1\key{)}}
  232. \newcommand{\BLOCK}[2]{\key{(Block}~#1~#2\key{)}}
  233. \newcommand{\STACKLOC}[1]{(\key{stack}~#1)}
  234. \newcommand{\INDCALLQ}[2]{\key{(IndirectCallq}~#1~#2\key{)}}
  235. \newcommand{\TAILJMP}[2]{\key{(TailJmp}~#1~#2\key{)}}
  236. \newcommand{\JMPIF}[2]{\key{(JmpIf}~#1~#2\key{)}}
  237. \newcommand{\TTKEY}[1]{{\normalfont\tt #1}}
  238. \newenvironment{transformation}{
  239. \newcommand{\compilesto}{%
  240. \end{minipage}&$\Rightarrow$&\begin{minipage}{0.4\textwidth}}
  241. \begin{center}\begin{tabular}{lll}\begin{minipage}{0.4\textwidth}
  242. }{%
  243. \end{minipage}\end{tabular}\end{center}%
  244. }