From ce27f90f05edc605dd519b0794273233c2951a6b Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Sun, 22 Dec 2019 23:20:44 -0800 Subject: [PATCH] 5821 - now translating function arguments See test-convert-function-with-arg-and-body. --- 018jump_disp32.cc | 2 +- apps/mu | Bin 63183 -> 64712 bytes apps/mu.subx | 266 +++++++++++++++++++++++++++------------------- 3 files changed, 157 insertions(+), 111 deletions(-) diff --git a/018jump_disp32.cc b/018jump_disp32.cc index 13b62b06..1ac4f9ec 100644 --- a/018jump_disp32.cc +++ b/018jump_disp32.cc @@ -293,7 +293,7 @@ case 0x8c: { // jump disp32 if SF and !ZF } break; } -case 0x72: { // jump disp32 if CF +case 0x82: { // jump disp32 if CF const int32_t offset = next32(); if (CF) { trace(Callstack_depth+1, "run") << "jump " << offset << end(); diff --git a/apps/mu b/apps/mu index 0e2717c7d3316792ab3489a06f699f9f6135dcbf..6dcfa90bb394c0651ddc47601f50f20615e81b6f 100755 GIT binary patch literal 64712 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 literal 63183 zcmeIb33yaR);FF&fDprufXdRch=5HJ!j>RPSlz$`6i^WCBpq%fBq7}mK|ze7(lk-r zmr>Cf*Kyn(ZC6$WTt?ARLB$buW-i7BP()nl@BB{Ps=D`fcL=`k^ZftM^L?4Iy6>s8 z*Qu&g%WalVIA>yNYHEu7YnIYH1yA3Vq_iF?f%G{v#go#^dPaRv{MVX3ThG2HB?bSr zKz;iZrhk{7-))XI*%~%UHRV#*sS~0(d7ECdB4%rX$jd4)^OA=?^q%<-n0f^Qq zG}|&1KG#jr*j=ZE3@WwQO>DcaeceH@gxb|-y2!fpTIq&8DBapeO<*KfE?}m<qg*SRG3ROZXWk+1TTLUd$Pe~cm@RR6$pdbPZhgl0Ilhci~b}1P}=3u2vqy-@17AaKL?E$y&8R?ph z=(D3yi`HuwnUOxdes2IakqHfr0rzbUKV= zXefkBFNT6Wp;_T_rs68wv}k&S-56;bTa=bJC2iSgqMdGTr=S%qtzmS!`5ukzb(_IY zl%jWanQp$IDjHtBeqtJrt30O0yR|<}amFwhzni-m8$Sxq3$in@G?05K1#=D`YFoDKbQFJU_F( zCN0veKC>lFruB0(BdzK?H;+t8t3S0ljiEic1@k@%45UHz6HKLfI~Wu?j^@$Na@NyK zijd;~2)gIdE1-vm`lMOUO`1-aM!i(7(0u)%bjBv*d4=oKxG!nkJ8iiCR=C47ZiB|H zwBa6mg4Ch4#_b892&=Igmxnb$^9L6r|N>HVbde+Zkv#mW)khV}s2L z8onj0a8a7fn2e#Y@+FqQ?KKV((Bx6nM8>2Qnmc~d)}8_M)f&AN=*aP+sA2R+G`jBZ zqq);Ug4Ml?A`{w2FqEei)t`}8WQ_vH5JKH%nuJrh^U22Mma}rEQ2WT_&eXzfsBt^4 z>bbJl7@8)(*E!HN(1;>2#eDey^hVpg1efV4ylxqQ>48p`)SDDy!$8hBC#Od`L@r3D z>iXHoVU+Jcqx>Yc8goNxs&e0K_~T;ke(b(GA)SFY>sGrLz=C2@0W}z7uV#rNxnk@d zn#Bu>MUiIlssf&>ftvsvH{QnAtNF6;M7Ghg{=AlyXF?oh9(k=o$E$o}Ti%C(PLyx7 z%i9`C<9vgVQYf*6$L7uv`3A8PHZA7f$cFAx3W@Q8yU14xc)8ZH0YDM6*Zn9X$%+EO z)}z_B?k@dz9uEu5w!H%O*KE522xSY+5sBGu;~v7=j!+za=h2VZo~D5BYFQIC+s}V+ zX)BYM`xLrPVxCdRYF3&mygwz4oSyR@#-UMdmz}U`eA`UX8{3cSN{_RHTUjfCsg6*2EfM;r1C0f=e`x4rG|oPT%x`@EK_l50Wl!OfJHo8z3$;?^n%TXr4%rnMTK+)DjqBW7TQqOM9h%#8At* z8&bEvgdmbEBM$`hn8NL6u2dv40@19XnMtxNn0t&~%k0o(4I|YWs%8E7mYIc-iD}|< zQhNRPR`lG8Kg>KP!DN!!Ds^Jo+&LEO|COnyb^O$0%~rIgkF<PrO=X==_#%e(CN5Py6 z)LLPaVDJQYAT4^We*UWxEiyir=wdDU35EFxkKZoLks9+^U~X6HJgpLVOC66E&-%94 z&mSov;}Z#aU-b){dtTMRT_7jtQ5<*tPPzwyPD=(_$W2KfH6?ASw|*jJIe+5r1fS$= zD~t^{YZVu{l>ra6k(co=OtML)OdMJh1Tl{_D@o9+iv zh_v}iW>RQBSh?I{pE`gtE1Fz`H9jiUw6g0clS zD+3P#v#UqeT%?x+0`*OfcP->4{oDgoEaZF6oLoZg)jhYj!h9_e<|2*RADCw-b^gJP z%Ly)~l_^v~*|fP_aiMt(fJz16{Sts?X^@;3#?UAz2XAiJbJIqho4K^d408ZCI;^ap zM4k9U?mT$R*+w08Lgvcx?b^pCrOlPg2~3gcyx_<-qpF9C8B+M|CdEQ@<*W2FqEN(V zK(_!10VoqYj(aD{TjYut>sOg~ri6FY^E8!F4O;B;jt~Qg0>@x0pY#@7q2ef;&7xsWl`iWF< z%{$zNviY&5q7FGBv%Wfw)_j?5(KlygM&_o`Ixai!{iUAp+_V|yMXJ+tTV^PcIiHZ) zEmw~3)qdQ>hPMb;@1F^A|KiTZ+OhlI(a&w56T8dZX5Vr1Gf`(C4OiNC(Ao?B%QZjd zU!|W%EB>9dH_iYMqnTLnWt+GBR}QpB7nNeu6e^;Y3P)uQedStmBQ5kEYj2`gUs8cMLi*!mE_yS3JDL$f_7 zxDAit7*uU&*Wr9AXTHj=l@58b?p#%8(_xs_fj!wzKeJBUQuSIVejd-9Sn= z$9bG7C>@Jl=nlh^;^b5WOi8@u`~lPECA#9Px%k#4$Da7+XP1f=TkOFWr*&CnC0` zMTa!;y>4P=$^~q#*Ajd8Q4;67iK3@dWt^i5HSr`63r7u(Bd$(F+({GHYT|ugxNW^R z5%Gt5*nC72KkFvOke~C345pl)Xar9k%|X<%;8kc#j~qrFL>Qr3M^U>~spf|?DQ);N zEp-!ZTGky#djy*u{3N_XuA&e`pCr=oavcYsLqiNKl>fUmjJE2Vz_A6IxGmKiXHh5@ znjh?T`(|h&;xtWsDu{7*SZLlJM|^Q2;w`#W{2+$Kh32d{;uVRA#i=THoK+wut%qSmZCghpH1qwWw^*OzziHewWCe za?I@tY|TQ3oguQlBHq9f&19SnQUVgg+Z3g-2vCS2hF2)CT-%T<;hBy~Eirv|4R5I1 z04>Am;SJ3vXVP|^=vGgI8^_1HpC++-DxI_Bym!!_S@#Q+2@MQyYys0a^?8INl{put z(?G@EMEW(8;1J1aHRQ7=ulXdACq+uUSP2r#w0ZiOH?C&r=Uc&$^XSOG zB}1`C#R-}1AY&~sUq!(@T5?7Vr&zmV%`{U^`1Z4ZxhpZj7y5a#651t^(5F>%8*czJ z?PMvmmtKO<#o=7ZT{QH-Aw!IY5jbT67nC; zoLoZoX@5-x=2c3__v~I4LjJbi-mFX*+{EOzXeX=z zJ2|xUfw_G3h=}gcL=S?9>S$Cca1$Zr!mehQ$fC6H-U08@m87~~fg5Tq`a%DOo_Wpb z@NW}$mGwE>^7hl=U-MNNIQ$zomM$9s+nTuTY1U?v>PkV4Hwji`Uai~VJ#Ei}J6!fe zzfQnmA9EO|Is6O`P@&K)jpNW|K)en;307pLY7YGfU~%Xj$6;au4reomb+(4q96tZZ zWd(EQf@Y8)Q(mnpFVmC{x+$Y~P^H_0Ynj71&EYSaL#dmCL-y-T*;-S+0ZI`|1KpI- zAE?qT8(uClxBRYp(IG9{{Lp2$*uKGjdDB2HLni`Q0bLZw zVMGEBr!j{~n!|X_p`Dw9wJ}G#+-+&h;9a@&NUywof%bXtFYAUS8*RE}jw@*RCfv)m z=XMEL^5A~KKV<;f2X~~CJakXuK8VpKdTqR}MFJ_PJ$@Y+KZt_K!zxYJc>p#N?fUXA z;y&9hVpp}J#Jh-_xjXQHhh0P%)Se7-?jkCMZ&lc0g1<&RM;}XM0MF$m+5mpOMQ<5B z3tK)=21Wnn3L`OOXVQ>8CoQ~lz;H;-S;@EAh3Gd#=9 zkOwh7%}tB+q+9iQJD0T)Nh;l;rW zmyY>7V8VIUEv__k-8<5MR;oTj^SwavjU?hbUh|zR4OD#RX};9Rg+(H*qkBX>$+mvN zw$acrc&xZd)RxZ;f~`j5L=rZC#5UVaewlkEo4i7)wwK3eHkqxxj)p6Etr`*+g zA%L~AvQ4Pv@;dGrCh&TmR^fT2!UC-VEQ<5`t8sdqsr3-pySYcP)?X;T$0p)y^ZFiO zl0e;>``%Xe3BF;?x8qU#v9)&2E+Zt%Ss$1Usq2^;6ey}pP=ptfaA8OEA zG`g(gkl~T_aw%lMh9dJXZz*p^A4*KRLX$pbCp9!FIjqRi3~IHzs*-3{b*uXo(u4Gg zz1?8@x?fx4GrjIt(E-LZyg!TAU(rvTqDf)fp3j$dsr%nl3PWl_hXm~o>6&#Uhx8;2 zo)qDb8#Vvv*@;PQ4w(v4Y~q4+hK+PZV$w6UFIRz-D4DdoCXMrDuHBa>SibCJ`SKXy zOIR#@`I1w#)0Z0|6)O-Z{NNjQU(x{0=K$&T=XJ=ON{37QX?{l7A`cj_)ywHZL7JZ0 zj2GL{eqc-P>m295KmY^tRnlp+%C>Bcq6UYlgOq52yp$co98Li;-&K~#hqp;Rk5wA34v)Q5OJVyXAU zNxfY$5*%9U&ao>_>U@Rl2-Dv=dfC=?xzg4gB{e=w#T{)X=m~;W)Bws4E!{%I2qmL5 zlcID0;bZRI8{VoeU`J;VCueM~*D>OU73Es15hr?_cp@ujc9)lbaCF*}x*kMD(o5H3pFLMy!kPLsHUu>ZPsqUWXhnd7WN zKc6s^6ky=JJY2Iycs4qNa7k(#Sj=sw>Nk# zysX*59d{f&RJSpkfKwT?{QJ6PAWT`-!oVpr_ALQIF1 zsdU-?JKC*Qi-I$u0){wqvdZfILl4 zowfKwDVvbvj4cfndi`Qbb5@Y-e zwH=&V^i$=NJv7=mjw$4^-1Ia?<04Gk132!V zN_VJxeh&h;M#2`SnXNU@T=yTT3HQ$swP)rGGyA`QLInYB)v%sVCIrm(R#J2z~IGz_Ox+n}fIy-UuHd-iA#TD`Cy$Pf(_?p$d3Q`UvN2ApaOJCRM_!VM z_+m{Q(8Lqsi0@8B+(#2Xpo!Dth_@vo{tx?}d&#>X7QTP;6}Q?cBi+6yo5jgG6Styz zi}<=Y;*p7nE41V>AQq8VQE)~f^x{1Te(tO{nx2N9zG6>G6g=_jWrk9BlgK*$togE> z8}&1Z`^As+6{ht-W!k$Lr!_pp?TuZ{(6P!V6z=x6nqvub!jR$qMJ}u$wz#k#NE(USGyB>VfD8h#oFp! z>N)yQ85ry-JC`gBKq*t7#;~jgFjc*kIqjtkvr+QzjNP9FVt`&pL8gQk68$m}-U7wd4Sm7(!)=!~>$NJ74XkX^!SPo@g=7ldvdeLcH)ECfu$jv9W zZ}`M|6`bz-iG|YK=On7}07Svp=2;3z+yrQZ0@;2qskZ{!S6O6E-8UFLIGN`0g$pu| zOB))Pgv{!K-Z&E11JT65M%D3?tS^ru;5s`)hcKscLr5W>yq zMr3Ns@Vjh|71l-o8gL9>^UNP{=FLQ3WS*mrVG=EKl?*ceVMQmYbv!h~ugtnWk4n=KkcbdKJmW|-H`-xu`W}B!_;Ht2> z`7_x)uv^%zZX%l&_0(F~pd@B%8} z{=F)?WiR?ryFLU=$=Ihk+-+lgmIl8D@V6G@+Z5yI0RknlqFf969n`X&e|%E4bHCFp zC8(WuY4Bu#LsX!h2P$F7+S!^>(m4v@6I(mGXOvi|oB09fnLsp_K?s31Di95a06e7t z*2|*Z%zHEli-K6FyV+@-Y;;}^y?q6y$$M_f0jPBi6=4@D^M1I3w(2zr)+cbEuMyyz~hd;k%0PBPPVlxEF|| z`a;1bNa@nmq(G7R^3T!=5svi?y<87w zw?I#6^S6If*pC4YC1@DXs27WZnO;nl8lO#TH|90OS$8-MZ7({#)|NNTt#=+8 zHo9JSxEq3bioETwlFmLwinD>0N`|-%S*xGGUj;+n;=YTg26)Q$x`SA1GjIzq zccNe(52%cRf0hHcQ21BDxVwp$Lb0hWOch}vZ`Nb~%lLvg6`9q%^8o(bW%y?rLbHtq zuAG*r@^s?>R}Obo!YQHN#$m2JE>WfUZ7ivTkzPPENddPhk7%9gxsV4zbL}H4d`1H6 z1dTP0vA6}6Xsj||9iU;vTI4QdEU-1FX{?)p^^V56kFhZQnO=?cI)$J94+*3$yBD|>|A z4W40s+#vZDH2m9knNh6#JM%EXp5#51H2s{~ta%C_;Nw*z-sr1mhjLi)^9ipi*Ii61 z8keEq4TUFFm?<^&uOf8DvS56>%(_;PJJ-54w-UtcufRiK3o-G1q?G$D>+35nDYg25 z*6V(7*?@w3$8(%=AT6}64E9Y#KU>rL%jOw^bdm;c1Hb)>sZTSdNr84>O& zY+cLI4Cjcl6Q8Gv2aF?Pa4j?|Xys`nW$8BI`(NcHtfd_{Z{SN6mn#mmcD3m5RP<`!Ip^P&Myl9}^ho$q{e^>ftB&M_iV;=q zP_ais6)lJTs{7RUU`a;HBl%Mkv-=14ggA=_O(be|$xkZnvt-<+Wt<8uT%^St5<=?_ z?o}pVidrmWZGL}FRXdD2Be53GDJ`nqT6EA_Y>L<7TqVY6If=A5)~Q9ds#d)Q>Esz{ z^eeOJTL_oZ$n|LC1iut6-qIXKm13FHnZDtDO-dWAWNfA}2{H*z6V+>Lr9WmGr2vC% zq4~HCyh3B&W&=O0!B;4-(wE=gY)e03eYwa<+NRgFL@Qdivy8Vu%^SlaZ-!X$EH;#Z zYtK z{+Ds0b`<(wr}h6r>p#h%5jC;x7Zfh!pn~RgFZZL8|KX0ybBtezJoaoqRG5pH9$&=< zLnpJ#a4fNaF8;ZShJnW3_T+)pH0qj|97K>X(EPjFu5tZK8j}B?=^mF@!I%?Il#Hno zX^uIHA>2UXhu+12)SWvox6~UX+04|>oWTFac5ywg3%=3MNd1l1K~x));Vjk%$0$vW zW@i#oZxqaKuzT4ew76AsWi77J&rG&RKeHBP`uQaA=CSoo9?RigBUb^h)P}kfC;5JqBvaZ&xgUAy*!jB7xwZo zXG>r&4eX$R85-DA0S|Cm#^ky^M*i+>k2iTkhZXG$%IPRr#fw$^7;^wzqiQDVntK6! zPt}~FYjy+J=^V+eqpleQ;62cnxJT7&)-}HXc*b7$V|C4V02iy8lXcCt0KTYd+UlD3 z0Bmutt|N)N&U?6b+3M&4&EGJ|K!Yy17yAe zuG2srHR8wBR4AEZvzNs$1mzt{-+@YB<30elshak>W+#BDg;cPzKk>l95zrpMk*elX zT~i2Pt*X&$Q)4B7PpX=SHO*E4_o|xfbWLgz)eJzv8U$61!^@Z4>Gbl2`kBej($DPW zeEmEeyxGf@Jj}E2&Q`z+H1Hw?9It`e_1E&=zIOfbdbg+qlsBVbZJyvkfZcc(fN!fB zy*4#=0oZn`q`6Gf^Z;;*s`2TXG5~K=HIsDBT>!qVYP`DUAb=-Nqk?toq-(qY&QUdo z)Z)>o1aPgY`IoMF9zavoyrydo0XXP9Dp<~=s>W(a+GCzk_YL0u=2yTC8fMf2PJjPm z-Km`^dDv&x-Y#1_wolIWbE0y{ti$hErLZ317DKlf?~x)FdjCObP>A%4Jx~e?Im$HQng4^=+Vk_ zzNWRAfQ4JtN0HR;8A>AdV98duxic9qHz1AE;3m#G&r++w*nR=2TPIa9E>>uL6q-P~ zhbKF9dshZtNI$^(GABQF2WuC8#+UCni2X2qpP9wZ0>pCGBeWM`Tp}tvx+_+JP*radxcVKx&V%j8NL?qJ;l^OTDuMJNP~>4g`AE~IiZEdDp7Grg`#D9 zfY=#pMCGUM%IVNSgb8Uk*`^(Ik=pI2HKx=KaG{+QT_#5tT3i?=caCo%ks>ByJh5}r za%f%3lN=~ygigN&_Sqm}%egy`xlFiAaeK(y0-FCBNZF~tHJmCJ$qc9i` z>W8ir-YvQm`9Qy@P65Nnr|W#^066qIpTaZ8JcSv<9g!QrDRR7V64e;fP@QYGQPsvw zfGK!VV$Z-tvwjU!;>NZo|Gl)Pt3biRrzO{P_YN5pQqx=1&YSU9Xpv)Hdy~XbN&eA|12zSBY#4pTUl)WG%SeWb2Kl8Y776 zT=QJ5Y}3qg6Tru?sq@|JkY<7N_NAr&O^6FN%}jE(aFw#l5O zDR1D2JKne!DC-2}eVTH!i}FN8X&gk=;0s9BGuSaS=PN2@$S|rk762vJJV#XI`saCrc^BGQ~Fsp!F5=(_21f##X8O?!|pGD>M?#cpG z9u}1~?#jMG1^k1o!ZYD(;h(s(7Nhxv6e&DUY~hV;m?56W^11_5QsbUHVAvpH-uQ}_ z%1r20+?Kew{iya<H)6_%7z&jGWN>-izGVkWtSCiKjR({rwx6v$HMmlyI;U z|Dy2d0{XtR?dS{XW4YrWyOmz}fMmzF7KK9{WsgFh@rlxJui441U-Y+R98T99n$4CL z?lrex>#{J~pK258@cUtICQ@#No!_l4!sFSTCw43w;v`aWOp=s}o`Q7^oOx?3stE10I&Y-c?z zQRJS$88k}pp1}SMvWiBV4Sf6uT5GcY8}+=zdjb!V(L~Wjt+|;Zm`fTI6K`Rj9CCWA z4oo`%2hDm?R%pEEY^pIH6};Y1hmV%@zmOu4E1`}WnRr*?>VdFME)_|OM_D4~4(9LG z{2Qpt7*7iRmpJ(cPb6JywXV?Y2RNBX*}>~{vA{}mzE(7|6pi5V;q5>InL9h6e;=FvxS(aD+Cb>J zUUDU&-*VflHVrLuwP(<8>{X&aS1TE!JSR@wu3FtbbEJuXQ#3-|{t49;R;nKlv}O(K zqiBZ15LFVXA@Oq)kB4e6)1nsBT8%f)%!t725p@O(6B+U~z}791_023M^1-Oj9g;iiL$H zINhuBrTGeXn8FoEPpW+zS1)mN627l3b(pVo(4O~vDorELKgF9qs_!syyQ@c%(veih zkR)nW^n^JJNkyXljcHZG1n=TBTZ-OG9v9|Y9Ygkn$ZB2y$wgYZ8ehX3#L882xLj?& zhts!Q0Ugmhwp@Y8gH&}NmQ&*?N}jP8E@a@9JXHW$JlE(s?OGr`2uq#>Yx51t;zYzm z)_{PvV4eZW2SCX+A63=T4r>$3+L+tER(jR4FPu(aF!zO5fcn)6j!( zgJrpJ1L~7-yT-g=?6^f|>qD&h6zXGnrUvL{S!$aK*Pzry+^hg-r>8F#${>%zSknE>ZmIlSG&7NnuQnvas z8Xm3j@*41v|8S`l?BYCu8?X&dX2d^k)o#V{;J1&`3WT%h=aDcxy60nJXl+i@jUXGn z)%$aZ=)4=HXN`~1%MO}j6@(rpP!=ghkl0hOlt7SY4b%tCg{oc)vTTg-hL-pzeA=z3 zB`V`{NU%Dq*!+Vz*1z&I)}Zex#xA6s_!b*3QOD2|B|lV(7mq9scks>|JA_3wJZJpJ zCg4(4tsF=U+569O#F+zlDg^_c)q?%`1c}X5h^RG@B8r!>=(wFUQ?+opc@H&~aL5tZ z?BFRK{P*By;U4@@pLOf}8&X`%Fq?R<9Ab^Mxf1xe2J+N6Ky3rLrXl)=4n=p0J!M(S z22?6~sk>-R%ado3G!c2K8s4S{rapnQQ;Q#eJO#sL^>wORC0>QpOMr;KpjR>#;coUK zpcO#s#BQz1cGMz;HVnXm?12)aG4F&jB6WC(q%?T>mul!=g%<#xnh4xwGzJ^sF)jV8 z2JC9?e@2G#=N$GQSkZ|Odvt<|dZUj*8==qy($i``D9-IRgWIiG1jZ^z(BS4k?%a^b z_se2W0&48-MAw(hZL;5sU&pY#{vz*#v5wi&)oWEu8z+;N5`4Wv)h$qD(<3|uj)1&^n9 zy)C5%0Lm**F|-<|+l1VrxM(%3z~RmemgZQ+p^je>qQ{ibAcwOjD?ZxtJOz_6S!l7Y zi=y@L7tAuo+tg{PNJIlm8@}T`G`26Q`bDWjgEtk5ah8qavkENDdJ+sIfVkg!-15#P zJRxraeRImoB?!yI7h5Zkt^`QgL(^-D2zzm4)gTgl`->Xxt)B=d4|!q>9!x^>BiEoc z^Y{QJX#FPQ^tyE_h|e-EK=3>dfO$?xwgg+wJ`0^JDr3(v$^aJ%q|m>AgCSb|bL-;n z$*J5>@Ra!dlvDIGhzwc*$9OMU6mv)oyygW?T+pvh0I!H%_QfX`(+oeMiR%Aou=vK5 zHK+&vG-DMw3gXxgv={Z0xFY)PK^Vy?1+EpDJ9vMT^}G$l8&L4=nFUt>6FtRBBLujF zU7!t{rk@+6bZv&QA8IsW*fgR2A&|lZ`a!$5WFll^)AC|v%{0491U05UqaC4G-1=*5 zyY2gaa@zi>+JP~K5`{4j1>3%Gc|zOg1p(H!&(O~+Kucw#wH#|i zp3pmI2Atl>)6Zi-tCitcokXz4ykluQ1*DC5XBOBr?wwLXu^h6LvE#fGh7jSM`!qkh zcmDpP(>wRBP{uwE;@v3NJHu!>lc3)Ws!;@dJ@5qmd{|1i1$>L*#=T?3P9~vA@34Qd ziqO5CEO7Mpuho`}aU3W|qF}9;FHNX*XrWVUzkWU+w5~RtO|T}kX$eTJHcg=QnJ%q| zYOSk5xe5hqz3sAuTCb~iYW;+Meh9QKtsf^Cy(02lf~r?gC5GauG&F&*C~WoK>BeiI zaNEI1a=5*GKQz(9ZMohkdJDw=MZu;VzBHjJKUO(S`AR>t73oyk!X~wZO=(RZZY$fP zN|`df$TEk~rW@Tr(WoiU>~orO4{u8G_|O}~qfxLaxrt2~pjGD{aGZWF1ufeH6@)$W z31+=QD_(NZRRL5fQ<%`!Dwly-qo$a9ou<6cQyrUfC5Z1v!KN5X61K{mN@uG~(a)Pf z>oVm{f=N?!6@PmlRY^_x1k4&WrH9LubZyEPOk65Wxw|%@DK{-}nsSwXW(Cu!6b-`u z??e2Om@)`e$`p5i8wIz@dy5mAvbDl#N>o3yDV%fh zH#Q{#eG^X4w&ZHMaid#t=76HexD9o8gU^?-AGp=^*n8D?PID@G)?{=346=7ousO{W zn{#Ns)0{o}S*ai*jUT^;8b>x~FT~p0LGdaw4xsK=@QF9)*>9cZtmSEr%}MbS+36_Q zoS~fR+7rjKs7@~2K4mv>RL!!1U(?|EHt^#LER)a`w%RqS*0{w6UZTN|+rY&dyxs;r zTY(|Md}v-QX8r@k0TkU0D#oF>1jP*~D$1$23B`*jcB2@62^Br5h0GEZQ4~*7{F#SQ z%%)CdzKCKCjTGkdC_Y2cg2q5|9*P@K+(i?W`7w%GnrO{8P;{q6!Tc7*>6B2JH=y_# z#azlh%@LG-n|~sYn;j^M%s-)+Nj=?s0!0@ZzRZ~@YG_P0-$T)YW_t5t6dkAu&A*~( zK|U~FM=^mqow*OiG8#$Du{6k=m!fzY#n&i$(;Q|_MX?ISMig^tiZ*XU@eYbslpUF; zqgagM8x(CRpEReVs70|J#rd@QFdtY+MI=ncuPC;!q9P|k#p5VGLoshP75AgqjiP5g z6|+#RLGd<Oxee@2l_7aL3i#cL=QKSagHDDoes;!YITK0?Ls zC<1i2Z|*@c_faZ7K(XL&RE&6xin_EHR6K)X(RwO6Z=m976u+TZwvmbf zo2WR9;O}YhI_K!xk!Pwo>u-8&nK_i;6e4Q&IIE6<57a1^(?-^J^6KJE^$t zV=CT6k^Tu46Hr`Qd((e0 z`V)}&5(BLKli%@KFqZzu%tfuN!;}2Zcm)Lo8T6mPN=cDhCi2<-De3Gme7D2#YcR4N z+yAaV82NwsAI^-W3$%wY!NNJ*CS%8q2Zr5Qb|0gT|L9EN|NZ^n?Ez$B(gQl0B;*SD z<^RJ^{6wV`uQjxXZo=43@uZBg$ng0O%H;6)0ezxhd`h3-@g;p?ocx+T(TDcYC(a&! zrcX$V(I?$AQ-8pLJfy7{>#z*zM*rb2SsixyJwTv8;Mnoxclimv^1B>M<+EKTY#2!Y zDdd)ADH*RED~#+!-+>_iey7czK?K9|9>N((-(j@;>p`$Wf}sxo&9LevkI@9Xh+sSE z6EySaJL+U3Ttx5%1cQ9g2d#Q3V;R9NC0L6tqP~v4%R2D6o9b^O*lzj+|GO=Ee3vp_ zv+AC(>Od#;LmlMe6EgN$xX;^g!D}5ox1oA`-%Q`}DS6=garB?RrlzXKQ(oyQG5jU- zz2%j`fY-k;O{KrW8wl2vSI+Y; zE)N=B|AOk^60fhO#o9Q|BoYq2ZNf`S{s1M(qP*g$1)|*w zigTJs7%-}8g8mwzE8?9TRhr#I;)<%ud6Je$`0r#Y<6I;f!`3dMrL2Yl-6=;P)9v9P zwK(A7S-eng1c4r4#L^NAAK?^-UtY=KW<`+|eBKIw<-DLF=!+%2@G*YwM{x<(_)7fV z0L5R09}zna#dvy`)Q#e+uJ%`!2B?C=-o-$8s)BS8GDL~~;X(|Q_$s|+7s;o?KIr|UOXI0m*pz>fj^}sS;c}1v3xT5xtE7h9RDX#Dt9uz0pb*uE( z2H7Fr1->8+Jb}}_l~v-q7hNc&$=E~K@`5Jg=VG$sWdFn?D8!oeup^-zy;^mS8Algz zA(WL@RQO9Vt5I+8`xbbr7Wr$+DykOqOk7ax2;{{z<-sEavOuu{+3Hf(2kv00NEOn& zrM{p~4CM~oQcTaualJzmSNE~P&%P94iSxg*58oSO?4!uDrM;*V4 zx`!`Fu3ZeUiwiLuVppMwT)ab&wpiNm>`ULF74h>ng&%j?#47y{IFaNOM~_Nkj;~^| zZ%KfABKf8abH#+JGEh6_)1#u!8q$a8ZB1WQ?G(cpYMTBtPM}&9TsAaYUQmFpPyN<0URz2yL%>3WaKcA};o6I0@1o)4 zijro3%>sXEIfbcEp4y0QDD_|z9`i>SgeoNqSRBBjODSQu(eT%zfwFy$cCV(CJjlLM zAuh1EtaWrpflK(gL$E~1uFcLKIWjNL=M%V&_^{zB#_>eCLvc?@sY_j$w8Yv1&dnX_ z>yxSbac1(cTwYk1z+@!MEwO-1e%F1g&;3exE!-tKlB&hVy^99Qn`H_lvA;FOs zH$p(jmMHXIrx$5e7Vt|qTY>K_EuU8|ecqc$REs#Vx#J0B%jlt=0`nZr&X~oNntAiQ!78sW z5u1d-vN%P2%%-d(DNcpwNWwXIf{FYe;yf-&@%`+O3kolq`W%c6DYsbPqSc^r@~h= z&z~{DuB{!f=fv$0$!0NRS0pbMhJy& z*Ta!GD~u+ISBwJ{<+NfK3+`Y|$nRXb*ec6>6#+kn1)7Gf4@Zx)7-72s)ihUIScy3D zrUY}u2#1N?LUzn1;tdPI0i;LL%nGOG{+QV zM-y(;$bz#Y$+4p|B08z1CfnxNwh-8IrvW>9BA4Uo)mK8ZvPBBD9HT-!rBIIgC{4E( zmC(;I-^J6ZJP-pX%XIAnIX1iE>1i-5ryUZ9U?IQMLt48c(QYe7DJhFpE$Q6^0`Cy? zFOe9sHqP|aGTjloHe{>X`f!A!4NE0k79N^dSWa`6u+%BlzT~BFcchOlLi7la$5-s= zH@vb8R?YX*2+S^WaIn|XDyOU6OS%qAR>|BE!Zwt$nyLj}%WEvBPZC~sL=x#}n1uYa zbdTp~uzkgjOqw@!5Qzb?K}Erg(C`(XXje1=7Hw%&`q}&pU$L{RU?a)Nl6LiI|A&_| zXkq%Niakl#S5^g;B0!~vbNJS#i5-=-5sLS10%tEx!$Oe^=lGyicW~G0Cv0$=QoOH* z1iZXbw7XEsG1WGP?r^JPe<=}_)=SB={EOF!^iYt*EUBaAXy?Fn1R9&i9rLD5O@|Am zESu|xHbut-CSvEcx39RQH>H1N@o_4~3&)IgUdVn=VQYrL?|kzf(|rP`d|rg0AB#(x zVuRvgZ)yYxHFT+C%D2)Dj&wdfkXV>K?HfO({*v+qz6w{u;g~fOpr;a-JjY;^0LhC@ z17K!5;x7@VN)vgPBY(XQ1@1)4POSHZL<&*9=kqH32LJa!IqVs>*x_qRQn=^HY4@MAMJ)Z;-nF> zD!SgmT?tJH)f_`xazaHz*CO*Bu}(A+I;^K4`sw2z8#UzDwkB1@`!@r1t#FREqyB26JZvQ!oY~D$w2@x zce%uDq6|kmOfm$ymXxGE2LTN9sv4T~1O6JaD(EY&@O#Pw9y-9R;5&CP!qH|9imdEL z>T(*X8zLPfKO4c#ZKQ5!BXz?hZ+yb#jo=P%q;5nbbt5J30VIP?YvwQUIvgaMGO=U( z5|N6Iq|{m2O~lJ-BA#-76Y+DKh&Qx}cySHWM7rTk#2e8>Jk@yEpb|Zg`T|nVr2QMC z7!7`D^nsq?7&5Jf2Ypty4H2Q26p`D^*6Yz58`VIHwgfn44QL?t%PcNg*%%N5{&`5n z__7QspIjHoTYfr5js?CY#ePJ0R(2A2P7=6^H}HiwlHlb^x$@JIy(#%}d~38er_tIt zjT*(y#Yh>TTV@m&bVL=TqYGR;<71Kltt~3_If-LbXA;inaD;*{oReZsEG-XIt28xd zxCG@4M|)-04nZ0_(nH_X@PNy#Av&^OTwWS9@;wpr+i7x#G=(OYFVYPi=E(V6{D%(noLpJu zk$K1fN3N%`E57>+GqZC%*+V?pxgL!5Vr@wWl&(diW8tKbtV0LHEV74w^r;$6AR*IJ zd*W(wCQ}vMvT^LV!V+9tcAuAs3%HIQ&IG9X7Aza*$Wj%$zIz;SWZV*g4gu{b;=#J+ zia5^k4DsYTh8}U6&LVM*h@8jQR~^ln07n?vG%U1}2a-Lx9*;xqgp6zHwuNn{+R?+s z{c)i!8>fsyGh&gPZ*NAu{^W5LXGB@n*|4?Q#>a}Z=Cw{&`y7GVS`|C`R01LS9{aMp z@CZy3FTfjDH17}bwA6R(3MEiKu|jOr$fn9ou+VQqw6rOTeO?|SwW{4 zHP{m3m1vVyaZ^*`(w>z)cyR7Tp2l&84jw$>B6Kx=RU_Y1O_$^HX`v)8ztJs(vY_MS zUeuFr$J+S{s8Gsbk*LtxB&%dK(7U7>Na<*~W>C*%CGZjnJI0ZUR0E9;2k6SAWBtc) zQZgP{=xCEfSWS_{XhIT39K5dLY@Mn~x_=$C=791_n)(SXg=geST69)s%xq$s^*3KO{5!wo$F!4 zvd~gqe{ppa$#UV^k$G9CdOiJ!$}=>pCU-~{oiR3%eyCK}UtNAQ>JGEZ4ODxE3As(y zdpHK8VWn9VA-Is$bc08rDNAy*#HMM2cC|poz8clkjy+M?)M`H|uFV6w(T|!kuKACe zgF6t8nnBW#IBHID!Ew|al7`7qbBYg`qh{d@9mi&TQ-VSq1W;V%A3bSYSR6eIcU&Aj zhopgV^sM3{inus44 zAx)%nheZ>~lEy+4>Ei;RiF8R@y@~YkP2EJoCbVx`YIF~^bxDmM+diI3D^qYRndC^J zW)0cmUb@!qEv_nEqMQC`3FBhmXc@SJ;b`fTM#a%G8k$PJyzFSHhT-6X4okAL0-<8s z4Af0A@MOvm2H~Xz{u?>qXju=3Ld%YpYJ@vGI$8!Jlch;V%P6l6>F>yw5>9`OL}gC4 zBXep7S65;KH$*GYYP#FZFB?_UYZ;6D6&~8qSU>@t?}6X=z4*&O;XRH0$gSJR^LQ|~ zQfay!?<@7!@SzVa9?Gg}7I^y8*m^3?dQbDrDzBsiqQFI-S>Ds|!Ve|v^l({!kJszz z4-x${&@Yj>>yg-Tz$FFIi4+7`CsZ^9Lx8p0JAhcIWIrhZtCF7$>na`YJrYG$a7ncv z>kz2vZ#|Js5seJ6^uKiU>Uk20!7 zPZwcb>&VuUhP5PVVx%DnQzUrJBw*cZr;zxA+H$v8a#Y$jwO=IHwzT$0qb)|mMYP*(7zMz%urZ7aficE;p}?uf7+}mgBF4o& z$2pvnM=@>O2Fpw4gVkj|#~G0mk>0ASSmG__pBJg3pAG@RGM^)=k`wS9Sx|TzYbj$% zwc)SiE{tLsB9{UOgGhhMa_DDy`Y-D*yKb@HL&u}#^x9d~;!1v{jM4~t33?t~n6WzV zA0~vRr+P(+tW>_dsG~}XXuMW%Kw_-Z^GfI2+2UAfL5Q}{7X-QUAoWz}jyIQ_xVB`6 z8zY~WU~Edfu(OcRMz`vl6;3|8X z+Ffvou;N=vI+E7J*wUK$=c=BZfPXejNWdRga{(rO9SsTntz%eA21e77bPL1UGa&@& zrCh$eqCEt?!B@McG1g=Su1vUCCvugP1AS>dhJlk`NiO5XM42P?Nz`9e#$Q5Lg3!<> zmkm)qQ==b`(z(2`WamDL@EaXy9o$8BD;-F)1TOYKT<*{T*kQ3B++|>nvz^FgV1h|> z)RrMB eax (zero-out %eax *Function-size) + (clear-stack %ebx) (populate-mu-function-header %ecx %eax %ebx) (populate-mu-function-body *(ebp+8) %eax %ebx) - # assert(vars->top == 0) - 81 7/subop/compare *ebx 0/imm32 - 75/jump-if-not-equal $parse-mu:error2/disp8 # *curr-function = new-function 89/<- *edi 0/r32/eax # curr-function = &new-function->next @@ -775,7 +773,7 @@ $parse-mu:error2: # ✓ fn foo x : int { # ✓ fn foo x: int { # ✓ fn foo x: int -> y/eax: int { -populate-mu-function-header: # first-line : (address stream byte), out : (handle function), vars : (address stack (address var)) +populate-mu-function-header: # first-line : (address stream byte), out : (handle function), vars : (address stack (handle var)) # pseudocode: # var name : (ref slice) # next-word(first-line, name) @@ -792,9 +790,9 @@ populate-mu-function-header: # first-line : (address stream byte), out : (handl # var v : (handle var) = parse-var-with-type(name, first-line) # assert(v->register == null) # v->stack-offset = next-offset - # next-offset += size-of(var) - # push(vars, var) + # next-offset += size-of(v) # out->inouts = append(out->inouts, v) + # push(vars, v) # ## outputs # while true # ## name @@ -851,25 +849,26 @@ $populate-mu-function-header:check-for-inout: # if (word-slice == '->') break (slice-equal? %ecx "->") # => eax 3d/compare-eax-and 0/imm32 - 75/jump-if-not-equal break/disp8 + 0f 85/jump-if-not-equal break/disp32 # if (word-slice == '}') abort (slice-equal? %ecx "}") # => eax 3d/compare-eax-and 0/imm32 0f 85/jump-if-not-equal $populate-mu-function-header:error1/disp32 - # var var/ebx : (handle var) = parse-var-with-type(word-slice, first-line) + # var v/ebx : (handle var) = parse-var-with-type(word-slice, first-line) (parse-var-with-type %ecx *(ebp+8)) # => eax 89/<- %ebx 0/r32/eax - # assert(var->register == null) + # assert(v->register == null) 81 7/subop/compare *(ebx+0x10) 0/imm32 # Var-register 0f 85/jump-if-not-equal $populate-mu-function-header:error2/disp32 - # var->stack-offset = next-offset + # v->stack-offset = next-offset 89/<- *(ebx+0xc) 2/r32/edx # Var-stack-offset - # next-offset += size-of(var) + # next-offset += size-of(v) (size-of %ebx) # => eax 01/add %edx 0/r32/eax # (append-list Heap %ebx *(edi+8)) # Function-inouts => eax 89/<- *(edi+8) 0/r32/eax # Function-inouts + (push *(ebp+0x10) %ebx) # e9/jump loop/disp32 } @@ -969,8 +968,13 @@ test-function-header-with-arg: 2b/subtract-> *Function-size 4/r32/esp 89/<- %ecx 4/r32/esp (zero-out %ecx *Function-size) + # var vars/ebx : (ref stack (address var) 16) + 81 5/subop/subtract %esp 0x10/imm32 + 68/push 0x10/imm32/length + 68/push 0/imm32/top + 89/<- %ebx 4/r32/esp # convert - (populate-mu-function-header _test-input-stream %ecx) + (populate-mu-function-header _test-input-stream %ecx %ebx) # check result (check-strings-equal *ecx "foo" "F - test-function-header-with-arg/name") # Function-name # edx : (handle list var) = result->inouts @@ -996,8 +1000,13 @@ test-function-header-with-multiple-args: 2b/subtract-> *Function-size 4/r32/esp 89/<- %ecx 4/r32/esp (zero-out %ecx *Function-size) + # var vars/ebx : (ref stack (address var) 16) + 81 5/subop/subtract %esp 0x10/imm32 + 68/push 0x10/imm32/length + 68/push 0/imm32/top + 89/<- %ebx 4/r32/esp # convert - (populate-mu-function-header _test-input-stream %ecx) + (populate-mu-function-header _test-input-stream %ecx %ebx) # check result (check-strings-equal *ecx "foo") # Function-name # edx : (handle list var) = result->inouts @@ -1038,8 +1047,13 @@ test-function-with-multiple-args-and-outputs: 2b/subtract-> *Function-size 4/r32/esp 89/<- %ecx 4/r32/esp (zero-out %ecx *Function-size) + # var vars/ebx : (ref stack (address var) 16) + 81 5/subop/subtract %esp 0x10/imm32 + 68/push 0x10/imm32/length + 68/push 0/imm32/top + 89/<- %ebx 4/r32/esp # convert - (populate-mu-function-header _test-input-stream %ecx) + (populate-mu-function-header _test-input-stream %ecx %ebx) # check result (check-strings-equal *ecx "foo") # Function-name # edx : (handle list var) = result->inouts @@ -1731,7 +1745,7 @@ test-is-identifier-hyphen: 5d/pop-to-ebp c3/return -populate-mu-function-body: # in : (address buffered-file), out : (handle function) +populate-mu-function-body: # in : (address buffered-file), out : (handle function), vars : (address stack (handle var)) # . prologue 55/push-ebp 89/<- %ebp 4/r32/esp @@ -1743,8 +1757,8 @@ populate-mu-function-body: # in : (address buffered-file), out : (handle functi 8b/-> *(ebp+8) 6/r32/esi # edi = out 8b/-> *(ebp+0xc) 7/r32/edi - # var eax : (handle block) = parse-mu-block(in) - (parse-mu-block %esi) # => eax + # var eax : (handle block) = parse-mu-block(in, vars) + (parse-mu-block %esi *(ebp+0x10)) # => eax # out->body = eax 89/<- *(edi+0x10) 0/r32/eax # Function-body $populate-mu-function-body:end: @@ -1758,7 +1772,7 @@ $populate-mu-function-body:end: c3/return # parses a block, assuming that the leading '{' has already been read by the caller -parse-mu-block: # in : (address buffered-file) -> result/eax : (handle block) +parse-mu-block: # in : (address buffered-file), vars : (address stack (handle var)) -> result/eax : (handle block) # pseudocode: # var line : (ref stream byte 512) # var word-slice : (ref slice) @@ -1775,18 +1789,18 @@ parse-mu-block: # in : (address buffered-file) -> result/eax : (handle block) # continue # else if slice-equal?(word-slice, "{") # assert(no-tokens-in(line)) - # block = parse-mu-block(in) + # block = parse-mu-block(in, vars) # append-to-block(result, block) # else if slice-equal?(word-slice, "}") # break # else if slice-ends-with?(word-slice, ":") - # named-block = parse-mu-named-block(word-slice, line, in) + # named-block = parse-mu-named-block(word-slice, line, in, vars) # append-to-block(result, named-block) # else if slice-equal?(word-slice, "var") - # var-def = parse-mu-var-def(line) + # var-def = parse-mu-var-def(line, vars) # append-to-block(result, var-def) # else - # stmt = parse-mu-stmt(line) + # stmt = parse-mu-stmt(line, vars) # append-to-block(result, stmt) # return result # @@ -1850,7 +1864,7 @@ $parse-mu-block:check-for-block: 74/jump-if-equal break/disp8 (check-no-tokens-left %ecx) # parse new block and append - (parse-mu-block *(ebp+8)) # => eax + (parse-mu-block *(ebp+8) *(ebp+0xc)) # => eax (append-to-block %edi %eax) e9/jump $parse-mu-block:line-loop/disp32 } @@ -1870,7 +1884,7 @@ $parse-mu-block:check-for-named-block: 3d/compare-eax-and 0x23/imm32/hash 0f 85/jump-if-not-equal break/disp32 # - (parse-mu-named-block %edx %ecx *(ebp+8)) # => eax + (parse-mu-named-block %edx %ecx *(ebp+8) *(ebp+0xc)) # => eax (append-to-block %edi %eax) e9/jump $parse-mu-block:line-loop/disp32 } @@ -1881,13 +1895,13 @@ $parse-mu-block:check-for-var: 3d/compare-eax-and 0/imm32 74/jump-if-equal break/disp8 # - (parse-mu-var-def %ecx) # => eax + (parse-mu-var-def %ecx *(ebp+0xc)) # => eax (append-to-block %edi %eax) e9/jump $parse-mu-block:line-loop/disp32 } $parse-mu-block:regular-stmt: # otherwise - (parse-mu-stmt %ecx) # => eax + (parse-mu-stmt %ecx *(ebp+0xc)) # => eax (append-to-block Heap %edi %eax) e9/jump loop/disp32 } # end line loop @@ -1966,7 +1980,7 @@ $check-no-tokens-left:end: 5d/pop-to-ebp c3/return -parse-mu-named-block: # name : (address slice), first-line : (address stream byte), in : (address buffered-file) -> result/eax : (handle stmt) +parse-mu-named-block: # name : (address slice), first-line : (address stream byte), in : (address buffered-file), vars : (address stack (handle var)) -> result/eax : (handle stmt) # pseudocode: # var line : (ref stream byte 512) # var word-slice : (ref slice) @@ -1983,18 +1997,18 @@ parse-mu-named-block: # name : (address slice), first-line : (address stream by # if slice-empty?(word-slice) # end of line # break # else if slice-equal?(word-slice, "{") - # block = parse-mu-block(in) + # block = parse-mu-block(in, vars) # append-to-block(result, block) # else if slice-equal?(word-slice, "}") # break # else if slice-ends-with?(word-slice, ":") - # named-block = parse-mu-named-block(word-slice, in) + # named-block = parse-mu-named-block(word-slice, in, vars) # append-to-block(result, named-block) # else if slice-equal?(word-slice, "var") - # var-def = parse-mu-var-def(line) + # var-def = parse-mu-var-def(line, vars) # append-to-block(result, var-def) # else - # stmt = parse-mu-stmt(line) + # stmt = parse-mu-stmt(line, vars) # append-to-block(result, stmt) # return result # @@ -2010,7 +2024,7 @@ $parse-mu-named-block:end: 5d/pop-to-ebp c3/return -parse-mu-var-def: # line : (address stream byte) -> result/eax : (handle stmt) +parse-mu-var-def: # line : (address stream byte), vars : (address stack (handle var)) -> result/eax : (handle stmt) # pseudocode: # # . prologue @@ -2025,17 +2039,16 @@ $parse-mu-var-def:end: 5d/pop-to-ebp c3/return -parse-mu-stmt: # line : (address stream byte) -> result/eax : (handle stmt) +parse-mu-stmt: # line : (address stream byte), vars : (address stack (handle var)) -> result/eax : (handle stmt) # pseudocode: # var name : (ref slice) - # var v : (ref var) # result = allocate(Heap, Stmt-size) # if stmt-has-outputs?(line) # while true # name = next-word(line) # if (name == '<-') break # assert(is-identifier?(name)) - # v = parse-var(name) + # var v : (handle var) = lookup-var(name, vars) # result->outputs = append(result->outputs, v) # result->name = slice-to-string(next-word(line)) # while true @@ -2080,7 +2093,7 @@ $parse-mu-stmt:read-outputs: 3d/compare-eax-and 0/imm32 0f 84/jump-if-equal $parse-mu-stmt:abort/disp32 # - (parse-var Heap %ecx) # => eax + (lookup-var %ecx *(ebp+0xc)) # => eax (append-list Heap %eax *(edi+0xc)) # Stmt1-outputs => eax 89/<- *(edi+0xc) 0/r32/eax # Stmt1-outputs e9/jump loop/disp32 @@ -2103,7 +2116,7 @@ $parse-mu-stmt:read-inouts: 3d/compare-eax-and 0/imm32 0f 85/jump-if-not-equal $parse-mu-stmt:abort2/disp32 # - (parse-var Heap %ecx) # => eax # TODO: parse-var-or-literal + (lookup-var %ecx *(ebp+0xc)) # => eax # TODO: parse-var-or-literal (append-list Heap %eax *(edi+8)) # Stmt1-inouts => eax 89/<- *(edi+8) 0/r32/eax # Stmt1-inouts e9/jump loop/disp32 @@ -2192,29 +2205,88 @@ $stmt-has-outputs:end: 5d/pop-to-ebp c3/return -parse-var: # ad: allocation-descriptor, name: (address slice) -> result/eax: (handle var) +lookup-var: # name: (address slice), vars : (address stack (handle var)) -> result/eax: (handle var) + # pseudocode: + # var curr : (address handle var) = &vars->data[vars->top - 4] + # var min = vars->data + # while curr >= min + # var v : (handle var) = *curr + # if v->name == name + # return v + # abort + # # . prologue 55/push-ebp 89/<- %ebp 4/r32/esp # . save registers 51/push-ecx - # ecx = slice-to-string(name) - 8b/-> *(ebp+0xc) 1/r32/ecx + 52/push-edx + 53/push-ebx + 56/push-esi + # var target/ecx : (handle array byte) = slice-to-string(name) + 8b/-> *(ebp+8) 1/r32/ecx (slice-to-string Heap %ecx) # => eax 89/<- %ecx 0/r32/eax - (allocate *(ebp+8) *Var-size) # => eax - (zero-out %eax *Var-size) - 89/<- *eax 1/r32/ecx # Var-name - # var->type = int - c7 0/subop/copy *(eax+4) 1/imm32/int-type # Var-type -$parse-var:end: + # esi = vars + 8b/-> *(ebp+0xc) 6/r32/esi + # ebx = vars->top + 8b/-> *esi 3/r32/ebx + # if (vars->top > vars->length) abort + 3b/compare 0/r32/eax *(esi+4) + 0f 8f/jump-if-greater $lookup-var:error1/disp32 + # var min/edx : (address handle var) = vars->data + 8d/copy-address *(esi+8) 2/r32/edx + # var curr/ebx : (address handle var) = &vars->data[vars->top - 4] + 81 5/subop/subtract %ebx 4/imm32 + 8d/copy-address *(esi+ebx+8) 3/r32/ebx + { + # if (curr < min) abort + 39/compare %ebx 2/r32/edx + 0f 82/jump-if-lesser-unsigned $lookup-var:error2/disp32 + # var v/eax : (handle var) = *curr + 8b/-> *ebx 0/r32/eax + # if (v->name == name) break + (string-equal? *eax %ecx) # Var-name Var-name + 3d/compare-eax-and 0/imm32 + 75/jump-if-not-equal break/disp8 + 8b/-> *(ebx+4) 3/r32/ebx # List-next + e9/jump loop/disp32 + } + # return *curr + 8b/-> *ebx 0/r32/eax +$lookup-var:end: # . restore registers + 5e/pop-to-esi + 5b/pop-to-ebx + 5a/pop-to-edx 59/pop-to-ecx # . epilogue 89/<- %esp 5/r32/ebp 5d/pop-to-ebp c3/return +$lookup-var:error1: + (write-buffered Stderr "malformed stack when looking up '") + (write-slice-buffered Stderr *(ebp+8)) + (write-buffered Stderr "'\n") + (flush Stderr) + # . syscall(exit, 1) + bb/copy-to-ebx 1/imm32 + b8/copy-to-eax 1/imm32/exit + cd/syscall 0x80/imm8 + # never gets here + +$lookup-var:error2: + (write-buffered Stderr "unknown variable '") + (write-slice-buffered Stderr *(ebp+8)) + (write-buffered Stderr "'\n") + (flush Stderr) + # . syscall(exit, 1) + bb/copy-to-ebx 1/imm32 + b8/copy-to-eax 1/imm32/exit + cd/syscall 0x80/imm8 + # never gets here + test-parse-mu-stmt: # 'increment n' # . prologue @@ -2223,8 +2295,22 @@ test-parse-mu-stmt: # setup (clear-stream _test-input-stream) (write _test-input-stream "increment n\n") + # var vars/ecx : (ref stack (address var) 4) + 81 5/subop/subtract %esp 0x10/imm32 + 68/push 0x10/imm32/length + 68/push 0/imm32/top + 89/<- %ecx 4/r32/esp + (clear-stack %ecx) + # var v/edx : (ref var) + 81 5/subop/subtract %esp 0x14/imm32 # Var-size + 89/<- %edx 4/r32/esp + (zero-out %edx 0x14) + # v->name = "n" + c7 0/subop/copy *edx "n"/imm32 # Var-name + # + (push %ecx %edx) # convert - (parse-mu-stmt _test-input-stream) + (parse-mu-stmt _test-input-stream %ecx) # check result (check-strings-equal *(eax+4) "increment" "F - test-parse-mu-stmt/name") # Stmt1-operation # edx : (handle list var) = result->inouts @@ -2584,7 +2670,7 @@ $emit-subx-block:check-empty: $emit-subx-block:stmt: 81 7/subop/compare %esi 0/imm32 74/jump-if-equal break/disp8 - (emit-subx-statement *(ebp+8) *esi 0 Primitives 0) # TODO: initialize vars and functions + (emit-subx-statement *(ebp+8) *esi Primitives 0) (write-buffered *(ebp+8) Newline) 8b/-> *(esi+4) 6/r32/esi # List-next eb/jump loop/disp8 @@ -2597,7 +2683,7 @@ $emit-subx-block:end: 5d/pop-to-ebp c3/return -emit-subx-statement: # out : (address buffered-file), stmt : (handle statement), vars : (handle stack var), primitives : (handle primitive), functions : (handle function) +emit-subx-statement: # out : (address buffered-file), stmt : (handle statement), primitives : (handle primitive), functions : (handle function) # . prologue 55/push-ebp 89/<- %ebp 4/r32/esp @@ -2607,19 +2693,19 @@ emit-subx-statement: # out : (address buffered-file), stmt : (handle statement) # if stmt matches a primitive, emit it { $emit-subx-statement:primitive: - (find-matching-primitive *(ebp+0x14) *(ebp+0xc)) # primitives, stmt => curr/eax + (find-matching-primitive *(ebp+0x10) *(ebp+0xc)) # primitives, stmt => curr/eax 3d/compare-eax-and 0/imm32 74/jump-if-equal break/disp8 - (emit-subx-primitive *(ebp+8) *(ebp+0xc) *(ebp+0x10) %eax) # out, stmt, vars, curr + (emit-subx-primitive *(ebp+8) *(ebp+0xc) %eax) # out, stmt, curr e9/jump $emit-subx-statement:end/disp32 } # else if stmt matches a function, emit a call to it { $emit-subx-statement:call: - (find-matching-function *(ebp+0x18) *(ebp+0xc)) # functions, stmt => curr/eax + (find-matching-function *(ebp+0x14) *(ebp+0xc)) # functions, stmt => curr/eax 3d/compare-eax-and 0/imm32 74/jump-if-equal break/disp8 - (emit-subx-call *(ebp+8) *(ebp+0xc) *(ebp+0x10) %eax) # out, stmt, vars, curr + (emit-subx-call *(ebp+8) *(ebp+0xc) %eax) # out, stmt, curr e9/jump $emit-subx-statement:end/disp32 } # else abort @@ -2760,7 +2846,7 @@ Lit-var: 0/imm32/no-register == code -emit-subx-primitive: # out : (address buffered-file), stmt : (handle statement), vars : (handle variable), primitive : (handle function) +emit-subx-primitive: # out : (address buffered-file), stmt : (handle statement), primitive : (handle function) # . prologue 55/push-ebp 89/<- %ebp 4/r32/esp @@ -2768,7 +2854,7 @@ emit-subx-primitive: # out : (address buffered-file), stmt : (handle statement) 50/push-eax 51/push-ecx # ecx = primitive - 8b/-> *(ebp+0x14) 1/r32/ecx + 8b/-> *(ebp+0x10) 1/r32/ecx # emit primitive name (write-buffered *(ebp+8) *(ecx+0xc)) # Primitive-subx-name # emit rm32 if necessary @@ -2915,7 +3001,7 @@ $emit-subx-imm32:end: 5d/pop-to-ebp c3/return -emit-subx-call: # out : (address buffered-file), stmt : (handle statement), vars : (handle variable), callee : (handle function) +emit-subx-call: # out : (address buffered-file), stmt : (handle statement), callee : (handle function) # . prologue 55/push-ebp 89/<- %ebp 4/r32/esp @@ -2925,7 +3011,7 @@ emit-subx-call: # out : (address buffered-file), stmt : (handle statement), var # (write-buffered *(ebp+8) "(") # - emit function name - 8b/-> *(ebp+0x14) 1/r32/ecx + 8b/-> *(ebp+0x10) 1/r32/ecx (write-buffered *(ebp+8) *(ecx+4)) # Function-subx-name # - emit arguments # var curr/ecx : (handle list var) = stmt->inouts @@ -3306,11 +3392,6 @@ test-emit-subx-statement-primitive: 68/push 1/imm32/type-int 68/push "foo"/imm32 89/<- %ecx 4/r32/esp - # var vars/edx : (ref stack 1) - 51/push-ecx/var-foo - 68/push 1/imm32/data-length - 68/push 1/imm32/top - 89/<- %edx 4/r32/esp # var operand/ebx : (ref list var) 68/push 0/imm32/next 51/push-ecx/var-foo @@ -3333,7 +3414,7 @@ test-emit-subx-statement-primitive: 68/push "increment"/imm32/name 89/<- %ebx 4/r32/esp # convert - (emit-subx-statement _test-output-buffered-file %esi %edx %ebx 0) + (emit-subx-statement _test-output-buffered-file %esi %ebx 0) (flush _test-output-buffered-file) #? # dump _test-output-stream {{{ #? (write 2 "^") @@ -3379,11 +3460,6 @@ test-emit-subx-statement-primitive-register: 68/push 1/imm32/type-int 68/push "foo"/imm32 89/<- %ecx 4/r32/esp - # var vars/edx : (ref stack 1) - 51/push-ecx/var-foo - 68/push 1/imm32/data-length - 68/push 1/imm32/top - 89/<- %edx 4/r32/esp # var operand/ebx : (ref list var) 68/push 0/imm32/next 51/push-ecx/var-foo @@ -3417,7 +3493,7 @@ test-emit-subx-statement-primitive-register: 68/push "increment"/imm32/name 89/<- %ebx 4/r32/esp # convert - (emit-subx-statement _test-output-buffered-file %esi %edx %ebx 0) + (emit-subx-statement _test-output-buffered-file %esi %ebx 0) (flush _test-output-buffered-file) #? # dump _test-output-stream {{{ #? (write 2 "^") @@ -3466,11 +3542,6 @@ test-emit-subx-statement-select-primitive: 68/push 1/imm32/type-int 68/push "foo"/imm32 89/<- %ecx 4/r32/esp - # var vars/edx : (ref stack 1) - 51/push-ecx/var-foo - 68/push 1/imm32/data-length - 68/push 1/imm32/top - 89/<- %edx 4/r32/esp # var real-outputs/edi : (ref list var) 68/push 0/imm32/next 51/push-ecx/var-foo @@ -3514,7 +3585,7 @@ test-emit-subx-statement-select-primitive: 68/push "increment"/imm32/name 89/<- %ebx 4/r32/esp # convert - (emit-subx-statement _test-output-buffered-file %esi %edx %ebx 0) + (emit-subx-statement _test-output-buffered-file %esi %ebx 0) (flush _test-output-buffered-file) #? # dump _test-output-stream {{{ #? (write 2 "^") @@ -3563,11 +3634,6 @@ test-emit-subx-statement-select-primitive-2: 68/push 1/imm32/type-int 68/push "foo"/imm32 89/<- %ecx 4/r32/esp - # var vars/edx : (ref stack 1) - 51/push-ecx/var-foo - 68/push 1/imm32/data-length - 68/push 1/imm32/top - 89/<- %edx 4/r32/esp # var inouts/edi : (ref list var) 68/push 0/imm32/next 51/push-ecx/var-foo @@ -3611,7 +3677,7 @@ test-emit-subx-statement-select-primitive-2: 68/push "increment"/imm32/name 89/<- %ebx 4/r32/esp # convert - (emit-subx-statement _test-output-buffered-file %esi %edx %ebx 0) + (emit-subx-statement _test-output-buffered-file %esi %ebx 0) (flush _test-output-buffered-file) #? # dump _test-output-stream {{{ #? (write 2 "^") @@ -3654,11 +3720,6 @@ test-increment-register: 68/push 1/imm32/type-int 68/push "foo"/imm32 89/<- %ecx 4/r32/esp - # var vars/edx : (ref stack 1) - 51/push-ecx/var-foo - 68/push 1/imm32/data-length - 68/push 1/imm32/top - 89/<- %edx 4/r32/esp # var real-outputs/edi : (ref list var) 68/push 0/imm32/next 51/push-ecx/var-foo @@ -3671,7 +3732,7 @@ test-increment-register: 68/push 1/imm32 89/<- %esi 4/r32/esp # convert - (emit-subx-statement _test-output-buffered-file %esi %edx Primitives 0) + (emit-subx-statement _test-output-buffered-file %esi Primitives 0) (flush _test-output-buffered-file) #? # dump _test-output-stream {{{ #? (write 2 "^") @@ -3714,11 +3775,6 @@ test-increment-var: 68/push 1/imm32/type-int 68/push "foo"/imm32 89/<- %ecx 4/r32/esp - # var vars/edx : (ref stack 1) - 51/push-ecx/var-foo - 68/push 1/imm32/data-length - 68/push 1/imm32/top - 89/<- %edx 4/r32/esp # var inouts/edi : (ref list var) 68/push 0/imm32/next 51/push-ecx/var-foo @@ -3731,7 +3787,7 @@ test-increment-var: 68/push 1/imm32 89/<- %esi 4/r32/esp # convert - (emit-subx-statement _test-output-buffered-file %esi %edx Primitives 0) + (emit-subx-statement _test-output-buffered-file %esi Primitives 0) (flush _test-output-buffered-file) #? # dump _test-output-stream {{{ #? (write 2 "^") @@ -3787,7 +3843,7 @@ test-add-reg-to-reg: 68/push 1/imm32 89/<- %esi 4/r32/esp # convert - (emit-subx-statement _test-output-buffered-file %esi 0 Primitives 0) + (emit-subx-statement _test-output-buffered-file %esi Primitives 0) (flush _test-output-buffered-file) #? # dump _test-output-stream {{{ #? (write 2 "^") @@ -3843,7 +3899,7 @@ test-add-reg-to-mem: 68/push 1/imm32 89/<- %esi 4/r32/esp # convert - (emit-subx-statement _test-output-buffered-file %esi 0 Primitives 0) + (emit-subx-statement _test-output-buffered-file %esi Primitives 0) (flush _test-output-buffered-file) #? # dump _test-output-stream {{{ #? (write 2 "^") @@ -3899,7 +3955,7 @@ test-add-mem-to-reg: 68/push 1/imm32 89/<- %esi 4/r32/esp # convert - (emit-subx-statement _test-output-buffered-file %esi 0 Primitives 0) + (emit-subx-statement _test-output-buffered-file %esi Primitives 0) (flush _test-output-buffered-file) #? # dump _test-output-stream {{{ #? (write 2 "^") @@ -3955,7 +4011,7 @@ test-add-literal-to-reg: 68/push 1/imm32 89/<- %esi 4/r32/esp # convert - (emit-subx-statement _test-output-buffered-file %esi 0 Primitives 0) + (emit-subx-statement _test-output-buffered-file %esi Primitives 0) (flush _test-output-buffered-file) #? # dump _test-output-stream {{{ #? (write 2 "^") @@ -4011,7 +4067,7 @@ test-add-literal-to-mem: 68/push 1/imm32 89/<- %esi 4/r32/esp # convert - (emit-subx-statement _test-output-buffered-file %esi 0 Primitives 0) + (emit-subx-statement _test-output-buffered-file %esi Primitives 0) (flush _test-output-buffered-file) #? # dump _test-output-stream {{{ #? (write 2 "^") @@ -4059,11 +4115,6 @@ test-emit-subx-statement-function-call: 68/push 1/imm32/type-int 68/push "foo"/imm32 89/<- %ecx 4/r32/esp - # var vars/edx = (ref stack 1) - 51/push-ecx/var-foo - 68/push 1/imm32/data-length - 68/push 1/imm32/top - 89/<- %edx 4/r32/esp # var operands/esi : (ref list var) 68/push 0/imm32/next 51/push-ecx/var-foo @@ -4084,7 +4135,7 @@ test-emit-subx-statement-function-call: 68/push "f"/imm32/name 89/<- %ebx 4/r32/esp # convert - (emit-subx-statement _test-output-buffered-file %esi %edx 0 %ebx) + (emit-subx-statement _test-output-buffered-file %esi 0 %ebx) (flush _test-output-buffered-file) #? # dump _test-output-stream {{{ #? (write 2 "^") @@ -4118,11 +4169,6 @@ test-emit-subx-statement-function-call-with-literal-arg: 68/push 0/imm32/type-literal 68/push "34"/imm32 89/<- %ecx 4/r32/esp - # var vars/edx = (ref stack 1) - 51/push-ecx/var-foo - 68/push 1/imm32/data-length - 68/push 1/imm32/top - 89/<- %edx 4/r32/esp # var operands/esi : (ref list var) 68/push 0/imm32/next 51/push-ecx/var-foo @@ -4143,7 +4189,7 @@ test-emit-subx-statement-function-call-with-literal-arg: 68/push "f"/imm32/name 89/<- %ebx 4/r32/esp # convert - (emit-subx-statement _test-output-buffered-file %esi %edx 0 %ebx) + (emit-subx-statement _test-output-buffered-file %esi 0 %ebx) (flush _test-output-buffered-file) #? # dump _test-output-stream {{{ #? (write 2 "^")