From a33887fed422ca7ab7676d128f745544af2c65b5 Mon Sep 17 00:00:00 2001 From: TomAwezome Date: Thu, 23 Jul 2020 18:32:59 -0500 Subject: [PATCH] Reformat BackFA.CC --- ...o => Zenith-latest-2020-07-23-18_32_29.iso | Bin 34330624 -> 34332672 bytes src/Compiler/BackFA.CC | 1090 ++++++++++------- src/Home/FilesRefactored.DD | 1 + 3 files changed, 618 insertions(+), 473 deletions(-) rename Zenith-latest-2020-07-23-18_26_51.iso => Zenith-latest-2020-07-23-18_32_29.iso (99%) diff --git a/Zenith-latest-2020-07-23-18_26_51.iso b/Zenith-latest-2020-07-23-18_32_29.iso similarity index 99% rename from Zenith-latest-2020-07-23-18_26_51.iso rename to Zenith-latest-2020-07-23-18_32_29.iso index d5296f13f5286c43134cfdbaee791bcd8ca7c409..edb02f126d1824fe26b21651fce5d7ad23656a67 100644 GIT binary patch delta 54714 zcmeFa30PCt);FG$KoZ6rWD4LAP=N?Sa9|ceKtW|FgF~&wiE5lc#A=mR?4-35*4CwV zh#fT@>EyB2R_&;5wboXvowRzbq}A5idvBfj);jx~ki>ww8swL4^2;UpCG$XhP>L^wiH|=6 z(QyMB1b1f|if{*mZD_Eur(~dXFt~&Uy?RLo9u5YX2jhd{43dEq77GIn_C>pKu?-D= z?I#&Hg@FdAWCJa;z|#6{Ja^-2^S48}sjIEXt5@5QPhV|3G?X*1HY1<8+KPP6Y8&#} z)yBg^x!+ft4}a;JRo`WLyg&8LkKf$(-6Bri^z<7a@3!ai7S)@+M+-^w^`%ks} zaiz6&;)e=_P@TxdhH$S459M=L{5&``7n;hsseT^j13}!H5z0`(e=;|R<2FLW6mBfH z3BH-am3X|!4E4g$sa!oL>2eDMk7_R1iz^qx=W@e+l=Wtqa#(e%aOgJfu>>vy_$pP1 zaQ7zea}8H1ls0p7e7Owa{cT*CmRkn_A9EuR#(&JchT!!HHc@sC zmut8@p+~+l+K-zk8BCKtyWI;J1s$88`@iW$Zq+%@NmGgO0OAoIQE_|u#riG}nst6(G4(@d>N-=jebF+&fx$#2#vHW^bza>Dp za9DN3&v4~oW^Y`Rli#vEy>R}diVs>^$c$SG7-mbjb_7$O8P2dk!VURMeJ+n-sf3$y znOY&?xM57)oWpQZHp4AL8S)Zl@>xuyNx~UJn7SpCVS$7jGMHK`dDuK*RmkIIJ+UU#(C-z_URIs-F~l>+3ja291DQ)|UO4aN(W>J%2vV2v&$uQ7Bft_NW+}Nw2{pQ69s+&OQC0sLq3*qdfFcCm#@1a)HRM4!z1M z!8B?* zJu#=Yc7EcBx}utC)wAa(4x2oC_K51a3AwonV+K_mxX|0AeJ=V1 zHFK)Tti?rNA?YigclIYya?rS*<%aCPtZ!oWmnviflcIJ$1>_L6PJPPjFQ9m@XwY7C7H{-8=qkYLK{A)iqD{E~K^JoT(pJEHg)H@QSW+v%# zXA}yf^iGh9G)n<{ebxO^S|lIkOxU1hew>r^)uKDh1d46j1KW3~(nN{xC|vt_O!T{E z8wbuu9Rz-<9uu|AD6V~|=GUcqB*sb2wowXYTop^jrrFM^*)q8)1bzb zqgviz&C9^d70!)Yp=fG`V^to*v(`p1VI!B(uI^0jT1F}?qjbqHf<8#^i)9p-CpnS5 zF!gZuqV!%?WD3a(R+~_wh+dFq3WYDs@m2TE+T!BXS{JXFWre~uHq?e$Z2Ao`NN(il zD0(_ar#(NY*1Zo;uJw*jcJX0_iw`>*+$IQGudZ{;8>V;&4O2WPZj5|%u_(tCBO64d z4q1yq%F>}l2N%55#Y;_Et#lb|k=yzUt!eW*74_PUbzqESao}_{c zv(zbJ+gQ%at;z5nQ)97>oUJa2axq?EH)hg$#tRR?yR+59!z6v#n=^KM5I#p;;%YqZ zeS0V~AMox88|J8!T=v-9g5b+JpufrhziHjNRs%~dz3B;z_+v!PCXS~X=F%L8iq z?3u5K>eJ_@QWt%31Xh`G%7tXRjg#U5X2$jHBStJpkbeHMNO z4Lya6PpW?k4k~4xp2Bf_FPwf;ZSi{i-rdR~uMjr*Q50K_eXCN&S)RJfTj>M(_tl4% z9vaU^YcmQN>hld#Oi`iJeN zC7x+y#|sy>tH0J+{z zdKqt%)|X~VHoI?Y{;8ih{9%!dmGpBVyCO9t-5#P{KRq$8dQMH^h{oWTVSrM zr%qMwjP3Sd?+ikzua>+=^)o>M!!T5_cjF3;DD(Lkb?`kokB zPcd?mTm*A}Kuvp53F06Cw(oQ^Hg3>7p^7?p>PFG!49P2AQp=t8qEnFGs2LtU>9n)G z4R(95zEM*gzRSg2E2&YOqIpj+EYq06O}{&PQrl)}<}&nTt&91gHgnOFGs`s1;p0qf zEM||fg{et!-=*ovX~BG#1|Z>hdN`c=Kpj~rrc5qpgOtuY5-aA^CgkNQ6f?xZm8&@p z!t!dSCJw8qsTXa@=5nZO?$*TiJ{LT}Df1MPTF$%~!4qKA-J1OHNg>V_H`p!0i+5A* zxtMDuHKqy8aiDPzC$(*s7T-g;=VE@S&73^he6J>7E9Bq7t>$8{y;j7s36egI ziG)Aa^@$KNn>0^)8uT}d33jM&;<}Vv-%P^!$21ED!m{(Gcv%0XdLWZ1j#4=65*ICK zKhvyLDfQ36GkY{^TskGecwsQ5E1GU} z(Z?kobnmrx{9>4}U(pjNE4z0v}3t&m$kXl>sw{Rb+c+*ACgzuMs;D8ZM~BWSrNmQ@nTD0WuUf% z#-E{al#6kT-I(RAe*A-w z(OWw_EZ*6hQpp{9v%a^sq??QJmbgZ^*jwAbx9jX_mo!n5+v(Ab55TBC+Wf0#PzCGc z=^DJ)M_ZEi8EemSJ-VHi^~Ci_=bV%MZI+zZ4uX+=v{6veSKC)!ft8z{9E5&7Jkl3) zN~#31vFt_T`sEk;YK04Zy^cH`y`D|u70H!irqghTTBcmhTUeuq?N?VlXxQZ?kJ)#5 z*~jc($eImbcqNCyBadpLqZ9?qcSW;3l)28U_;BHbSM-p^FP&$dP5b0LbCyQ5(iSH* zP=Z3FIM~xi8$U#HA*cCVJ3f#!ig)mVUgMcG%4&4+W71ddW8vxt<(uS3ev6AAyIlMj zw_6(GOYxA!xmNUpVxv&#L~%Z}RB|dO$+X{nbSP6ClSD!T)k5n@uOwyGj?bKDhMS~0 zx?I1+5Rs8DSPktD)z1JGyx*va%lq8fiy4xavKRc@EMl}2Lte;f;zci*k6P%zOw(tG zi%7`i1fw%YlT>yswDBW zNixn|P&dD(t_C`Wi`uCn&Z_M!a%2}{Oa!_9#TT+Z#w|jdh zCf-)o(4#D;^REI~p}c*QTYFnu%-KlKi6>%MaDVky6l2E-k#aBR_=8 z4}1UM8GWr`I12}ce&}Wtw8r}cmuF^Os+{Xb>zG=O_atdansPlDJ(F{t;{84IToDX& z)_eC!t#S5g#w=%_TBJ{AFj!+-8C#;>)n&<2WGUDC+W(uO`Yu= z#=b|HaB>ZUL_E!g>G6dh*LjbM+R(zPlkC-|lT0lqoPQohuJ;}uuC+PaE0EmLglxTc zaa65~d9&S|b-yi@5dJv&bI8S>UQ(k!iy!wc4$uD8Ih;njxp3@p@4vzD)<{S_V>!ziN-8wm;1kac7OXe;1V?#Jo?36dRrqke&lC?e ze!s#pBF34h+^b4sfkydV`f?&zWUP9F`l-suyqMjgx{h`Y<@WiAz( z(v(5Msk?kO1ab;6DTQR^lN?09-N18=Mz468g=t*p%YCfxaBp z8=)xGH&=RnEYE(A*NS89Y)R^L1QxGLcP z?Gr5AE%*+d>XDu}s#^Fo+;4g?*D55M{NC~w9SJAX{bG7@a{=SkLx>;mw_b_ciawp- zw=@bfyQIOdr%-)|U#mgcM*%nAtQbM ztrwmS_pahLpYlH(5Y}$rj5|C0Plmza2=AE9dfnlYcGoHE$BQAR3g@Tmj+PtVXKT%h zaktqc!eb=lsb#Ei{#{+mgn*Sy*wD=L8#3nMY$(3~3RdXCm*R5KY{Rsgx%E}G3+B(D z?l#`wpjT7NvSaFhmY9z|CQNG@SV}yE{A;#`kvBQ-$+={mEYaoLaLHU7}l4INuA7gz;*N?NKkK zFWeN)n>;9Dup)ww4mM-V>Z<1_)KyO>hh_OAs>)I!=R~(q$a+Vog%ja?0{99#FM12| zpv1zwzp{hCzt%q-#%~V9!j0hdiR5EpdDVcboU##4DYK^-6GI{77FXpY8DZXY-Gc2Q z1j5M(KFl6Wphn75=+&LiO(Cx-LG62s7SP+m;_?cXXfH9Em`x#InAk_FB_)}F(49{R zH5BIFQk7RyTv1h8Qd%{9bV*Ky$q;8)(}N!ZBZB#0DDA;_M`^_!4-8VF0W9mm$FscCiQFm%T;y0s(5)BWx0hIhFzQq*T!MxXX;Xsib>~*`h z7p-r!>vULsY&7L+|19%V40H1I`52~SlJ#(|7ay2tK;PZjb(e`!X6fMu10PGN>seG& z8!y&F18Yk)x7<>Ng0-rydTLGGG^YmEiAD#d7Ct;%YNXhR#JUx4m^`~48(w9qp7!))|@p_&ze+esxSvA1zvTO0(~v5f zPa|_`m}qr=ZPk49;%d}LwcK!6qYQ$(V)!8J1LZ2~U;|7sd@$x=ehlA>H`EV^H`F0b zL&E%kSEuSCU_}hC3q;3abRC^8yOj?@r(0wAgdnLMQC_W!y8uh=7W^pUSLV&dwUsVui?*;xZOw6YZS*cvd4Q=H^ zIR@*(;Kk!QZ-7FbKb(%`^-fjI*RiU>ELnw=ItDOW@&eblu}Hb)r^VOTi+avcNpM-aMBC2&(E) z#MB`H7te=dEsu!DV(Ix?fCkQlchhOeUkdH#Ouk=di5GTU5I5IHdsH{yM8D21yI6>;%49gr<#B^>&S{IJqk$z(ld>;;D%fHV7-AwY?^s~ZS3&mK}I7wr<8(W zqpqiqW0jlyi7pnh2I$n4ZJ|1rF!Q@DH1|@Ah0VlPo7|$F;l2dEALjZW5AuDWCPo+H zIec^;7RKoWJ}#Y!*lX5Ek_A|Y3v(-zlBH@2MTvZ$KqpznBo;I#@;y5eMfr}2>#+K^ zNr3W-QdgmrU8qZj@g__Z_IiE5V&V;$%I&6WRiYSJnxg9^4z8ejfUY0xJEj{952xxp z!Dk(cxaP7b6QdHp>Y}xnz!LVU4j>x>Q zvTPa5M{-_p`@8;qq2~udnl;HdWZL?!e=kT$#;6{>Gr$vW_tJT((Npvob_53pLrpU8 z1N)}n`0#;bUf;)H68jDoDyB(ndG>~d8B~qI-Z0xg2p-Y|1;gI?0X`)dc40pD(M3h} ze%ebM=2YY4&s>Yf$gv4g{)+PfHuC8&_1Sj2bE_BCQ#vN5^1a15&cqbHyVhV@ls9nr za3dQs>aZTCO4Zo3C_fdFw0z)@{;_UDh%;c@WlfMWv2)20vob7|?`~>8;%qR|e#Doh z^1+tOVP3eO?8#J=c4F4|`Y6Z`cBS&Y29m&`lEqxcx*`^4|Eyal&&DBldkFzu8crP{ zNf)4%iv)6>3hGgwn1~b3wx(@bG;G+QR4LJ3%rJS7lwoZlIa{y`2A0*({DprAY=1$g zxhl80O}ZeZ*$4qI;vC&P)!%1ur&BOk43mj(XiC!Qu@^JtVZFN{oe%EqkP9qs&WWNL z07+T8(0)#(Z?`&dfRseDsD<+Gc5k@6S*I7LtMEacZUz)&@ZG4r;*O&xoriZ@w+MG; z;3~wc+i*QX$lyaJv@-*|R#z$YN#Y2!t>c`AooCy45`O+h*MsDj4wq0(?_rmBX&cU| ze>CaF!aJF~u1j5O41DlC`eexGy~KVMmgMl>@Wh+C?r`@(G?;c+*9}e{)afnbu~+p4 z^+z4|s$!3hy=o}*AI9sPyHqu}9)^J$KgH2@_F$cQ zj90sZxogh^yxInI4s!wQQ&D78=)(M{BH~P(8q*SQ*!hVrTvuL^lRHYBl8CJn-j7H5 zNdpxf8xPdqR$DDjV%8L6443Z2`eOM&r$Jfn1(DC=oMqn!x@c-QK4AU;dx;I->O3{9 zwR%Bo4j=3x4l!uFQX;l~Sqh*a=){=C?Wo0Z+!Ew&+ye9J`5@S_#$ONXZo%cHDWB+K z#1Tt@W2lbZIun?Vp|vw=k;6{P!J#JQlUVUQ+p`Mom1`jZ17@#DNH_#+6DVfE@UIDL8YUhTp zYy#drr9GK+dM* z{@>VEgWa}Ocwi)-)VEVJQTS;jn_FH+#K|ig0kg&MNCZ&~l`ouJi{mW(c7VgC=z5e? z)KS`X#g&MXQG9R@Tq<`pl-C4srnPhwpWtTNd~y^Y9V3SdOccaqJ>Jdo!O9J2t4bB1gC{%#eBr}eb>YgqagbDi6dL5$4j*-{}k*DS@!>Mt&I9`D-k;q)*`cu_%>{ z;ltaa(2ZI1pl+!>)dQe;zi!l;!I*;Y zhwI|kj790okLyapKZMd#IFTxT66aNhF}PskChPti3CB;cmoO0(OL z9S$b8Wd_~gW+Fe~!b^P52^K4QzB}yZn`K*bU5|fh0uFh_J|{lcK1w272naZ$3;Rym zKHYXKb1v--iRFc}kpU+k@5ubUfCII{>PIyJT%_XAEHPG!9dqQ^&3D|TfhSNByS4nm z-6$OE6^Q$%+B>7xw)aB_jJS>+qaOzL483;#d>?q^zHsSSoFaauQ%nnvHVJ=K2Yq`d z3?=m{=2PY7UQi#m?>0_8xZA3%L^B5K}UKR*51uhKhwSm#VPd$;k+jJ==}!% zE@n-#PTm>NFa7UqcN)L^{OVxg{OXXS0YQ7s%<8e3_K5VF-0iOD9M4(`JA>^IG z9Tm>^A!C%vK_+43Pa*Xx)c{kHu=D4T16tJ}(_mrUuOY8?!(CVfmqX@ws*;lj2wRk) zfhuL%U}2AE=n$o9U{VVBX+w{zlG6qVe`!OryD3vm!r+L|t?1Rjfx_9Ip~G}bY5yT* z%L7QekhXJ5k!*;L&nZ;@g>=qA{|db;l?qQJdVCOx=;?vj2Ps{mBE)i}@klozNsmb} zMN&*doP{(`QZGRylAnj!JG_|?Y7G2JGB|{IlD!MZ6GHd&9Z2b*^z24zL5fi+MY;iz zo^r$+ktRuM)PnCTLc=0fqQ;X*&mvioUPh80;bKLonTw+hyW}+;e9A`p`w}Nougjbw z3W=Vv4B_E1p?$@zb8kr+0&37!Ek(C0oFWK*9uqo{n=1s54Sn3(kH@{ALk+dNdKbiq}T%|Cx;pb)B6B#rD6yYJvShZN17t3NpGg~UW2#*=}zcB zB{Xy?88xHwZKSJov?1>a3smWfV^gakN1E~P1 zNYb0g5FVZq>UjfMu0xG_qz926LwXYFc_ezQh(z?fhxjqlUP(=Q2c`G#5r0Pd9d=^c zXhW@{yRT9aiIk2s3~40%I3+Yf%zQH{=K?o1G;sXq`1&={_ejT)enX8P9yJ28E^yYclaq{B!*BiWGX`4dql zQeQ^3O2^Fn5Q+3m4Hu_|4mOje6R1J-7t+5ZB7GH)jwSL%3_+5g-uOO5Qje0b46#~z zmvK6(??qZ6%$pYa?&N_v=s^imXe%cY`Im(68AwBsa*^bx0N+QpazfQ7p@Rc^uff3S zHjcm1HzIn10~p3Igx3y-1{-HdnuL!??}U#^@0%t382&sQ8YpPL3vKqupN76s$T7$= zkxqJI^F*SjRl)!@Q|l$nL9CYE38w>hBs4-W90|=+`OQX8$ipGX9))?wLIX_x1F9x&5KAuD3Od34MNOvkWe+pL&Jmz zj)zWC#!(6>k#Av`XOL35DMg|fl;Ar(lNo~Um(U*K#Xh^C|1Y7VlE~~-AhYu);yI-7 zAg0bhyh(Z|oQ!lASbqtP5q%ga{P;`gz>$8J&KhMjbZa}0I*pQ+*NYBvs6NUe353B}A^t^$%8R=a~O?um<_nnBJ zB7FnPGW1M1gttY{IU%V!kzy$syUq+c6w6DU(}{!&RPeiA)~R zGrLZ4%bbBG8{L^SkjYVZCfms5oNU4hlf~^4nOt^fl4(X0k1#0)j&2&rWS%&7KvT!u z*+wRJ$|jC(E|H1Fok`|QeLS}f%ro^vx%a_J@FCa;J_h3~gipXs@F`dcc7u)JGce9Z z_yWuXd%;TZ71#*A2ICxr17IdN23CS!z(&vl#<>VKFcbU=R)XKaMsOO8H3)xzncy$5 z68sZv1n0n5i*NzV1ed`|& z_yBAKAA<2#1k6r?&%sJiB-jXo-1&~jPaN8ZQ-l^_nGFN$B6OMyHi7~$-i9y%%mlN* zN-$rr-KM`&sgbW_`|fsq4|upi-_7-2wllZ0X^r6#=d-WcW%3Pb#~Sp}v8QubEE=We zCEuVn?oQ?`Rf;6+dnP1m0G_9xpJ6}T+bEeCmbwqBAaIp*1>E}E_0i!!N|mYZ{k8Ua7|j`CCH)qahj4MZ{`owZ zF(-`oDk>~5EUw5e&VzY-^r7C`-3xHunFMgpn#*o?Q(S;-Oi*xhs2N%>SSW=8WNSD0GmibY5(<(aJ#Vk*x4f14J^vTuonJ;b=E$d&c6H)G0 z?F$e7$3=aTzb4FXz5jesT`Gw+n7l$CEClb>f7Ib}!H@bo7IGtD+02MAbpdY9D=vo} zd-VFSeLl=PMS^qiBVp(6D1GEOww|Hb+}obRCQOF?{C1Uap)%}9=qg^@(bC79u%$|k z4|{~h+OROsm^Y+DFuo;rj}7Fpl$CP5vNTn+a(zjP$tGlrp8RQ}&Gps8&6{rxJKUK& zHkO1P)pX)2j=REUcCDr@zxZI7aPh(LJu1wMenll^CAqmc+LaH$XR&klREpxlkaRkg z?gd&Eo>1n#?`vN^{UbackA7MI5k8b_02{$FFrGlT6U+qnfR*4Oun{~A#$OOt3+7+K zr+P(G-7J$Y+_`rit9Fkv#0btMc}Gi3e}sp7!K#3O5Qqv0XugiMtMlRCaw-hPlDWfM z*hWY=phl{WLQ`-=rnb`=*CWF8Ur1}^e=4o4YRY#p zwBDjOwlm;rx4Y~U5znm!Yo7?bNgHegPk^y6!c$--cp9t(&kDA_5ouokPgR4&2-E*t z5l)MEM;Xf+n9N_c-)=qkPSmqYZxx3UE37}aIV)li=TA*fes(C~LR!T8kUd==>wb*g zzHG|I%CHfv*;wE&fsNo*FyuoAolHiE5S9EN}cD1x0}CHM$z1fPI07hxBe z2|fcW!Ct|Z8*#kzQmp8|(ipocc(Q8c-rX*C%OjSmJZ?gLVZqpl?>*t|S916y>`?xT z;?Pa3CPw_taaF>vRS|c1hc(S&Bb*&~JIm7>M9Hlwspwx&IC?bvyeU$zU%-Z0{5|fh z4kfEOqesUZic09Uq_R98>!94(%kq2IyDYpJZaqmX5rzX~Plblt+&X~ABA#icT zkpEkXcxl9Uft~K-R!5w4IzqoOVz~P$cl&~3Q$&2wkMb_f;nJp zMp!7AnXZ*+6e{cVwIzF$|xt~ zhCPlH_$<=1P#WF3&BEDDS!rPo%9PT4Oe!hx&Pta#+PV1IV)%#L`r#=$gIb&+MH%jq zVtAB&JykdeMLbI3WDuYW|bG@3@aR6STP=>Ek{8XYWjaLk7tBB zX907YP*{!@WjAsLH}y1&(QbC@Cb_UYw}etFK3BONCWWJS4G*V!hA@X@1yF3|8A_yZ z!5Vqw$xa;g9}yME!_kZW!9wIE|1Dfcw+)Psx~0ae6l-Bg#rV?k;)FbGUpcFI`+DQG z3zPz>;_ZfcyQ9K1%r0&}LV4Y<@iAt{&_}W>rWo1czvTJk+{LJ*!r2{li{C2EvdDJ+ z!=vC$`MzA?!naZJp%A@9(_g$Qw72Z3!_|#*>2ee~XIlhr`Ncn?go}Ul#=3C`ZorD2 zIy$F#RR8jV{Cu(Q+U?4vzTsCE<8%M0c1k64Z6enWA;{&vV<&T!eZrk93KI{H7EpDk zILq;qUB`aGO1$YBuBq$2+O;B#g?-em>ohU!g2LhvqT{Q=R&srXO8>nr<&C5|3jh#|P9Y}_H{`>r$7oN|*n(u^L1 zSyG(O`uKvqEFJnko$amU_5)M})x4GpPw)eq{l>2I)<#VPw72$aZm>M0PTvjq7r=oC7exAEL ziap2NZ0Oi6IlZc64GUP|oN?^NFGX+9M4HSo)B8-;2e9eHowHq7M;6R zF#S~K-98uZd_?cO$cOQxS5+1m7oc1 z1gpWg0bxCu37!Be!Lwi^cnyqCBfJG>g0I0!Z~$xshrsv@!Vh33_z|oGKY@+lC>Wnb z_!-OuIL0UV3v2`z!T1~k-nm8K3049%*a&oBd>%m$W`Z7ICFl({f@mV6-Nr`(D)=JNL!p?Szk& zeu`!`D%wZ$GU4|k^+0a()`T~e8u9+EL(#(4Z3$yN=#xuFM8+N4#>3b9Q2X$#R`gp>Y|3qYL3Gx`V?k|693`fX-7j6kA}kGIblXYIVKTLwz_I$ zCH-&UiVcYon*Uh(Hzw}aB(xm-2tARSf%M_ z{L4yjmFdfF9d*XRrjs4sN*81LRx9kT=RCLsu|J}J6dhBbXqK+2eWq<;+Y?i5@1499 z!o?)h0Uzk!lI#`MZW@HMLrkxG{>Q3vu1WALbXjNkpNNJ+)9~srttab=*S6lsdStA6 zqO_%vir!R7-^kizguFyjDzHJpQMazrDhrB6m6Q!19#d|}Eh(gx9PyDQjjUEkqXVjv z-=ii~$=6JOD{ z@I2TEUJ#5ulddRz#QnxpCQbNNW=`1N%~45*@vg=>VX*?2nRFkgW<9OYG$d)Z>hTr3 zmA-;DC&{eTRj_VHPxS>KaBif+rrf06+%+u0ru?Kv_q(6kAK?whWLm*G9MgbbfC!qw zI06AzM+vrpm0%ax2=;=p0AU}P3BCaqK7{BhC& zO{a?sF6>D^%lDrB24)8Y*LGF|IW5j zmiVD&4At#+&Gr)iSi^vL&hs(r0NkDUm<@S1FmedNf|(moW#~dPU49{Q0MbCDK}dsz z3z5kQTikCIZ7){P@Lh5|Hy^CuCDV-BMz9c!-y`6}nqUc732>tk!R=uD0ijVa|Bzgz z=|ZH13&)f9aa#N;QkXlscDAtpMDmSF5854u_dX|AdWe5czT#A}NvYIZg{{9Qf1*@1 zHQgiJ^=ERvx=Z2xogA<9%vxmfUk7m)k`H*sK9Ap`As};5=p!3Ez;H3SSvf8X_FqgM z<9;t~`&oAhvkrHsU&0Kz2W$lQg7GrK6N342^2;i9L4Mv^ZM6`=r98%kW`D;18)1pHB&hzq?S&P;So?!nLLgxTezWg7w zLuwK3w;Z?I4wF;jxeZ`VP8rI*BiNEt&I}0OC;fqhG#w^cNU_wP9V`50PC3vuIaib7 zTm`Z%ZmNK=e}2lUu5JGlF5aGUP>G*-_cx}5a~vm}UY63Gqbbl`DNB{y?ZV1?Qhrye zR`Aurk`*bn9N=kfPt{t#YT>W@Qam~3rYGRS$`tk&OZTU2QK_&q6MlRs<$aY#EKt5l zc;=CmXiaJtWwp5702f%-r)0K2b8d8*Ip5CyJ?yHPvuV*laXG%rGv^H{s@|RMWrYhL zru^YJ=lC?`1nw?`GoPijdMNf;=fPi}r@St1P;Oc#y!b^*8Rh@wJt+^XJ&N)x%7mtG zQige5M{qx;;7Q%ib_T+QlPQlWISl33l+>FT8ij6uQO#kQnSgfpc56%K#-5S1FwMS(Rcm3Efc2;#ul8zB+Q1OvfJ zFc@qE>0s=GkPl{p2XOZz0xmuiti#=p2(;Pjl!cH&~d;nI0Pr*j8 z3yd)cyTMF=8{P=M1{=XaFvcRB05icq!AkHiuo3(lj79_lmHh12e&Tuo65DHUbM6`y;#pW`ftiO7I5Q z2yjDR0>XAM6MP6(f=|Fk@F^G*5%8c0!6C2`90nV~4`4JQ904=IQLqx=pJWjH1B^)s zEnp_VLnH)vh=kyGFb+UC2WEl`U?sQ+HUy=rC-fVbnnnL_IS_Sy!Ajr{HUb`ugAjUw znE?MKgCGiQ1iisH7@;qi38KMDU<4aMKQJaE#DkfjKXzUS31B102V)9CDVPb$!Aej8 zHiEHWOhp(6W&->ILV#aD2PA-EJDLNGNbTYrpeXgw z^|Zmt>$5&Fm5IkmsfCg4{Ppm%)Dw?ghrkU@JJR8zp)qY<*E(^yI56#>)UymqV?B%T z*Wk2YaynYTT$lzNu7j<-Ev?1pdRKq%N&5r0RKl;z(=6o0inJjd2EOaQwC3*#T(R+heA8{xr_Y1Q9CTT*s<;psU=lTKc1GN(`g7XD93I7Ad_1kHq7%E9Qqm7!Pb(Ojo|D{-*6GEE`e1tcihrt?rJu_F zpk)TrRcyJB-5#QF`Og>S8HK{g?1*07f$y`}|ChzoFfZg1GAuODo^8O*Z~F_x5^s{c zhF`wOTr3`G#RIA z`jND-1~ySrNJ~q!4o;suX&wCM^m&C{T9$;1aT!l(Z(@s8P4Ly7nku{oR}-t+VZ!NY z|BQ#Y`-H9iGxXZ)kcfjbvU)1%BWXp(LtRVmgbciHrh_k0voad5`|H+%jO*%GZqMlA zQsrG4dwX|5?!bkO85UecT)!zJk>lDuJ-wXVke?Tmw*YR5D4gs+8+hn4V) zF3n%4-J0V+BlyM~#<5Rw)+H<)JwMUbAUA0G-8LDb;J3>(A z;mDx2eTMeM4<1f0OAQm$$(cT$?YYg&jO6g2$fAa1-l$@WRE^o0EgXNwpUL4xOhPI^ z7?3#`50)Dh^Ai*bS3}j%%;^D&wZ1NH{`@v$QmO*4z9UZ>b<9+j_;{neL1BtgtaZ^Z z%NZyB1M23y%w1ipuZ5Xkdf=+-XT_QKdZ;G7JP*ptGappNstbhU<(dD^ZD*7QncsIU zxF<8WbKDwXt0mLFYjeuyGZVO_I}Sf07920(q(e;I{4GPRgyRk}^`-+16%v+y!_*tT zW_V^l!)ytgzGCX5`xx?>?AUTFD`42TF*7_++7#W$^c310c3L{fqh*Nnws}+LWRB}E zOtEH;RZ^;7%G76GhbTXpdE|z63LtGrhHubD`j1n3q=x7+haEm7K4_C0E3gesxbA{& z_z*mN?#_mI0>SP(3q!h2p#YuY_q+mhil1o+a6(pya6&K_4yiiT)ei`(TX9m}tCtj( zwDrs-LCIP1L6Nc*hcv@BG8rnHI5>t&XhQ$1n35&V?g(&pM-YiKv8k$yb@Op%-?QTOBBWtffPKCJ`1I`8OV)S4**a!;2xC8-@3=!Ze3c(FvBbWfj z284-VCYU5x8?wAK|AFmqcV%^PLVsUY0;e2TE%duTYlZ)RAR_Cs9JkC0$6m>bRw`p# z1@GppBb@TtI^nn1vwrMa-ypE4Lce#iuDGoQ9hA~mETySn-HMq$9c%Zzu62O`qQ=NNxg@j>~JtX zaOlbQ{(`%3Xcs%_lA+f%+!{Odi1c@%bwl@G&jyFvhaTz7zl-h}dUS%pz&1iE#@%Qi zvNd8mb(nS`_Yfu*p+r4bOqp(b@Y0*|$G&*VZDb=UTHRh9(6HEu=1cZ7p6D$TR0e&GS zSOvzL5HNoTo(C%d?vo$-f+OEISx?C0%q7dq-OY#0nnH)QTS%(i#&ld7u#f z^=$TA258=yr%5W$DK0K4ZHq|(`Hs)p(d-n9Axzo_gsWTlQ|yPGA7zIn7LO_z-*&u9 zc679XS)S3ZBaFP9C$gjL`&Q?%GKbFn$xk}7Obbq8Cg6h8 z$JuQEd7_{_n!W4Voyc$5?RFAe&MEA!z7LEOJi>DhNOF8o&a0i@h@O*k)Y$e1>cX*E zIe$B?8!XLP*0m*g;o^Nc2NJKjZ}**?J$`gXGpsYa=0DB3?Yh^lzREe$qn#y#IeEBb za3<%A>sc-SJLkxB!;S2^VEH;`ry7n0kJ~S*h9zdZmF^t~pAEy}QR-MX3==;l5!{5w zTM!oD@fL(z@pucu9bh9^E*PH~c3q>OmxlFMd6-wMohQV-Htf}ow`cr3?3aL!)`9*S z*70_4&s@iWCL9aP9qzVE>mWPAbK|*3z#5(_%2a}v!5D$?j$n?+t?elO@K;gpoNW11 ziY%~l(-U)QYv(79s4J?OhJWpxIJ#!?w1nJTh061*=+@Q({R8Y?XMA1E5a=cFm7 z4ZzJeirRGc9p{{6xHg5U8zp_}{XG?}t%|3ag;+EE8tqX4pQ)60^q7(1?07{QQ!gTY z;c`jt4^q>enY(>pr(465xeI%yp%BffC@CwfERw=?*|xrmXXnCNQkfu*YkFdS$E8JR5Db5)-8uwfpUWw~S&V7~FZr^({uZt73(|JeQ%QRK~DM=Fa%s*eFlAj^c&IfDnXAC>%>2?C^lS@hSo0s zVWEE`PaKNlUmMICA)KF8uyN0g_}{K#l;kXuBi?vrxR^EkA%=2?a6+CuMCY@tYm4ao zCNDX43dOkY!iBWLje>lh{BL+VtuS=Jn4Hp*G7|feO*vS*Ln$~)_hHneqv?MZB8@~E zC7k_p^ugylz4|<9Gs_19^L_QwgT|nJ(Na(jQ)wJsWO}ff-P)q~p#5&Fur+26u&phk zTZN445CXwWfa5KKxq=Nr>DIM4e6fctMSunPL{U5)fq4Rb_#O{OBOJlQ(Fp&*!_f$M zB7)#gJRFVi7aopA_%|MoM!>yK1efq|G{O};9E}m+Vqm7FC`+k|5ni+u1^bKRgxG7I zHI*U-e{LxXgGs*>-Zk?TTzfoSv^PK|0pU_sc;l1OgdXMqw^ox+bW%K;e1hz(yO?jq-0cnUhOHU zyHu3LAKk*XJ7>!|zUpLATrlq3#^K`*7o*7Y$zhM*5uwyV&AB39YI)74V8G>~ER}xk zXqbN)N1oZIS^JdREqwA(QJSYB;ikD!!j;QKMlQhNG#LwWO;+Zvw~DW88>XhX-M*+t z@%()6EqLc+xI`w2S0ocDaiU2k zU3y+An@9nQCJkSqn>peF3c7PN*+wQIbiFG*Qt`2H$Yif<;uwR>{gv^!glFDgNuN-x z1o-WQU>q2~Mz|5o1h;^dU=G*_@D$272zaF}0bb!iun%kmcoo9|gyUc)I0aS&{KFdf z^+077Ub|pCh`MoLCctgG1Sw!67zV~~5z4^)ZRK{iIVnnKdnvGFN+0c1 zSI`ll>_3d)4`u?q+JT@a*a)Tx#_uYdab$*v1wreh_7nX6S^0(2I*De?@7G?*2^@2> zy|sw3d3~YVfHAkEXTQqs!d@Z8w{629JA-!qW>)TJC9EC$8e9JxYfR>t&`j#5j` z71AZ#vQn|H@|f6;cDytXR0GGX?@^fcfjm<_D%+w>hWI{d*7B_b#~_VG8izC<=|-dp zNH-x(M7kNN3TYD3WTYubQ<0`2RU_SkG#zOMk{M|x68SqDX%5m{q#C4Jqq(-D=NOvOLg>*O4JxKQ=Ek{~`bRW`6r2CN` zKzb1AA*6?qnvhl@J%Y3v=~1M|kk%jp(psc-Nb8XvM|uM3Nu;NcEJz!Wo<@2G=~<-b zke)|+0cj)BCL}A;i%2gay^Qn<(yK_XAvGhtj`Rl7n@DdVy^XXPNkH0y^bXQiq<4|F zA-#w6KGJri9Y{NoK0x{q=_90%kv>8C6loXIZluqUK1ccjX%Es~q%V>7A$^6kAL(nP zZ;%ck9Yp#T=@8Okr0^u?fU(A~uoO&BUsRO(Hg# z*c4(@iA^I`P3#t8(}~R>W+pb1*eqhRiOnH4mskz4T4M8v)e)Odte)5cVz&}oNNf?Y z+lVbDwuD#%vD=B=L2N0pMq^@>EiQP}^0b&mldx+S> z#F~h$BK8Qe)x;hp_874>#DLgZV(W;lC-yk8Cx|^s>?vXvVjGA(P3#$B&k}o%*z?3* zAhwa%CSq1%FA{r+*vrITA@(Y<*N8O}d!5)D#NH(K7O}U9Z6+oV+d}LeVq1y5OKcml z_lUhuY&)?X#C8(?dMJh#e*NGqGdDjuZO_u@l68A$F2j3o#q9 zUy1!j>=d!n#C|9C2eC86{v>vm*k8o{N$g+5{!Q#}V&{mRCw76`j*^d?+w695=ytF} zqd7~%KQ40d+&POC5vP$?EWhFl&Lgi_`klZRPHQnE;-MOgRm1>`O~g=(@fXrJSj-~! zwpc|>*lt5S)4_Ex+s~fA$j$TX(yr?57d4l-Z#(}4zYunblkP`o|47dEvwbgd9ewcFel`UyM7Z7VXE|MdiMv}XZ8%JYd9fbd z;po9MAIpY{OPrTH_G*;IUQP9E*WwOfC=ba@urt;p)Y5`(V#7aUXGs;qq_KIQqmM8A z6#vmCmbdh)yu>BC{z=THx^_HW_z3&w7R!2c79IY%$o{QV9s6uX^# zbWrogT*8`XvRDyu1D3@m;z)~eEU7EDn-TF(g0FR&dHeahE^$XA+ExWE$1In)=RNZH zraH_08!mC1l^g3Uxldo>PPm-|br8X4D1zfHRz$qL&SDesZj13*Qm?d_MSRg>74db8 zO~m&t#^=aWIB0E<~f{8LsD(SH#WEk-Muo41=0 zr%w^T!gl%wC_HB#v^~i8GWSxExW*Lhc8$q$dV&Z3P3rqk7HTXf1C`2)BR(A@4ox}-aYrcd(OG% z{*5n2#-yQ!qQW@Xi|u*GwnQ$=-M1zrF52%Lme0qn#AvT)SiYE8bWZzgFmZ+_>Fx-l z@(e+9M&*l#<$_=SuPra;vL=-obHUUsFUY4ONZMrcix!woTB5^p2A$V8EU*55)`xiv zeV8fZj#Cn9_z)xS-_K=JT0ov|b&VUt>WF;L%IkLvSyRw>;C+Vd$;5$e7hHjloQiAO z{X>^sa^P}F+N{8tV%d6w-^hUwH?%im(46P{E{Y^@e%oF+g2I5N`F4S-UB}| zWL`#mvT*6Y>_XPo(Q`XX>fa^M$R-K#yWD=)p)*K>Qj?6M0*fnVwfXge!-X$ARlopoS=qn$Msj;ym`XBxbnm@>ot zx$t)(Kbg`r6?Tz@dj2Wa?1{PTl(+ zLXPfZkgJCn6zWk13v};Eg!^Y{JsgTaS)BBXpb;)8;j9?c_2h27I6Q)a+P=PDy*e_o8tO8B z*XXGGZXfz9dGi7+FExi?JUJ|kA0h1`1wl7LkVV1|%8)^e-j$)H04=>(oT*8w6A7h> z?XRXp`Me``(s2hmsG&FF0ouDKcdf#w4DtqYJeB6S0X~=G4XEk4SpX;H+K$$CKF~Cy z(aW2ct@E|`R!Hj}k=CO~&VS$m9&b+R-z={z)0W~nXl-rH8U~EV5&VKxlRq2aw>D3T z8XM6-{)%W8ns;XkqaXS;FTmbRPlMrtsFKcV#zBn-I6 z9TxcU)ulf=_>Kh{Av4K_#5ewAfkXD{D_hjXJ-_SdbrB2f`QGx*m;t4KV2`j*UuDwm|Jf^00ZBCp6L zAw*P2kSNDO;w@(3a^mAShlDuZMWP&+5^o8Me}MQnK1@O!n@E&nEAe_*{95AU_yh@Y ze40c#zDc~LEdC(zaqK1`j)!R!@w9ry%k2s)M5Z>C(e!F7bn$~cawl4f(Dc<-I5H>6 z3;MMc&dy9(TTF*uwZcO(_$z6{YgX9g9#j3$^rKc-`riuhR9te?OYd7@QfIa_cGe2< z=99E{&VnHWAbf@12hL@j-$m16_IF-87vN3%;??GUMeTF4cT24S) z&)bl;j*<`}x~e2mjswKIorT@R#}R3dV=;+xET`TVY|uF`RaVN^k>(mXVuRmIzHNpK zdK3sawpqkR;wIih{G>Xzb)hqGXZylAE_TO#D39|zGn#y-#s=SJpXcr!0GHmC7pkV0^7${>oaJ^g9>yCbBsyIOu72Z;aLUVPNgk773dP_Cbu7_ zgS!+c2ix4aH_dOZ^3(E{6u3uL3yW0dybt~K(Pwunuz2iIrPK67qvcQhOpYrMuMeiZ zXB9{)g}9`^`HHNBd!kGRTxN$OE3*>Xnd_g{fJSHRu*3KBuXv%F=f_cE{NiX>EL3Ui zH9Jyb%6B-;XL%%Z|Szn7|@#{5=&NQHe<eYfW?5WSM}Pm03g|`YNA#t`D$GvZy+HinJEp=E zJdecZ>``Inkb^&=18IUo%F;F4*Vwb*FF?qN>5xtQ_+Om2rcp3P6YEZ#=Gkg5oEEHi zPScI!S#R0DMGE(zKqgz~TLsKl@Pa0$@j&~%w^T!PGqi5lTxHo41v+815OpH73S$e c`wYvNk7eBL&@PO(J0qXnY6oramYp*E2d5b@U;qFB delta 52446 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 && cc->last_float_op_ic && - cc->last_dont_popable && dont_pushable) { - switch [pos] { + Bool link = FALSE; + if (cc->pass == 7 && cc->last_float_op_ic && cc->last_dont_popable && dont_pushable) + { + switch [pos] + { case CN_A2: - if (cc->last_float_op_ic!=tmpi && cc->dont_push_float) - link=TRUE; + if (cc->last_float_op_ic != tmpi && cc->dont_push_float) + link = TRUE; break; case CN_A1: - if (cc->last_float_op_ic!=tmpi && cc->dont_push_float) - link=TRUE; + if (cc->last_float_op_ic != tmpi && cc->dont_push_float) + link = TRUE; break; case CN_INST: - if (cc->last_float_op_ic!=tmpi) { - if (cc->dont_push_float) { - if (intermediate_code_table[tmpi->ic_code].arg_count==IS_2_ARG && - cc->last_float_op_ic->res.reg!=REG_R8) - tmpi->ic_flags|=ICF_ALT_TEMPLATE; + if (cc->last_float_op_ic != tmpi) + { + if (cc->dont_push_float) + { + if (intermediate_code_table[tmpi->ic_code].arg_count == IS_2_ARG && + cc->last_float_op_ic->res.reg != REG_R8) + tmpi->ic_flags |= ICF_ALT_TEMPLATE; else - tmpi->ic_flags&=~ICF_ALT_TEMPLATE; - link=TRUE; + tmpi->ic_flags &= ~ICF_ALT_TEMPLATE; + link = TRUE; } - } else { - if (intermediate_code_table[tmpi->ic_code].arg_count==IS_2_ARG && - cc->last_float_op_pos!=CN_A1) - tmpi->ic_flags|=ICF_ALT_TEMPLATE; + } + else + { + if (intermediate_code_table[tmpi->ic_code].arg_count == IS_2_ARG && cc->last_float_op_pos != CN_A1) + tmpi->ic_flags |= ICF_ALT_TEMPLATE; else - tmpi->ic_flags&=~ICF_ALT_TEMPLATE; - link=TRUE; + tmpi->ic_flags &= ~ICF_ALT_TEMPLATE; + link = TRUE; } break; case CN_RES: - if (cc->last_float_op_ic==tmpi && cc->last_float_op_pos==CN_INST) - link=TRUE; + if (cc->last_float_op_ic == tmpi && cc->last_float_op_pos == CN_INST) + link = TRUE; break; } - if (link) { - if (!Bts(&cc->last_float_op_ic->ic_flags, - ICf_DONT_POP_FLOAT0+cc->last_ic_float_op_num)) - cc->last_float_op_ic->ic_flags&=~ICF_CODE_FINAL; - if (!Bts(&tmpi->ic_flags,ICf_DONT_PUSH_FLOAT0+cc->cur_ic_float_op_num)) - tmpi->ic_flags&=~ICF_CODE_FINAL; + if (link) + { + if (!Bts(&cc->last_float_op_ic->ic_flags, ICf_DONT_POP_FLOAT0 + cc->last_ic_float_op_num)) + cc->last_float_op_ic->ic_flags &= ~ICF_CODE_FINAL; + if (!Bts(&tmpi->ic_flags, ICf_DONT_PUSH_FLOAT0 + cc->cur_ic_float_op_num)) + tmpi->ic_flags &= ~ICF_CODE_FINAL; } } - cc->last_float_op_ic=tmpi; - cc->last_dont_pushable=dont_pushable; - cc->last_dont_popable=dont_popable; - cc->last_ic_float_op_num=cc->cur_ic_float_op_num++; - cc->last_float_op_pos=pos; - if (cc->cur_ic_float_op_num>4) + cc->last_float_op_ic = tmpi; + cc->last_dont_pushable = dont_pushable; + cc->last_dont_popable = dont_popable; + cc->last_ic_float_op_num = cc->cur_ic_float_op_num++; + cc->last_float_op_pos = pos; + if (cc->cur_ic_float_op_num > 4) throw('Compiler'); } -U0 CompSetFloatOpPushPop(CCompCtrl *cc,CIntermediateCode *tmpi, - Bool *dont_push_float,Bool *dont_pop_float) +U0 CompSetFloatOpPushPop(CCompCtrl *cc, CIntermediateCode *tmpi, Bool *dont_push_float, Bool *dont_pop_float) { - if (cc->pass==7) { - *dont_push_float=FALSE; - *dont_pop_float =FALSE; - tmpi->ic_flags&=~ICF_CODE_FINAL; - } else { - *dont_push_float=Bt(&tmpi->ic_flags, - ICf_DONT_PUSH_FLOAT0+cc->cur_ic_float_op_num); - *dont_pop_float=Bt(&tmpi->ic_flags, - ICf_DONT_POP_FLOAT0+cc->cur_ic_float_op_num); + if (cc->pass == 7) + { + *dont_push_float = FALSE; + *dont_pop_float = FALSE; + tmpi->ic_flags &= ~ICF_CODE_FINAL; + } + else + { + *dont_push_float = Bt(&tmpi->ic_flags, ICf_DONT_PUSH_FLOAT0 + cc->cur_ic_float_op_num); + *dont_pop_float = Bt(&tmpi->ic_flags, ICf_DONT_POP_FLOAT0 + cc->cur_ic_float_op_num); } } -U0 ICCopyTemplate(CCompCtrl *cc,CIntermediateCode *tmpi,I64 op, - Bool off_the_record,Bool dont_pushable,Bool dont_popable,I64 pos) +U0 ICCopyTemplate(CCompCtrl *cc, CIntermediateCode *tmpi, I64 op, + Bool off_the_record, Bool dont_pushable, Bool dont_popable, I64 pos) { - Bool dont_push_float,dont_pop_float,alt; + Bool dont_push_float, dont_pop_float, alt; U8 *ptr; - I64 i=0; - if (!off_the_record) { - if (tmpi->ic_flags&ICF_ALT_TEMPLATE) - alt=TRUE; + I64 i = 0; + if (!off_the_record) + { + if (tmpi->ic_flags & ICF_ALT_TEMPLATE) + alt = TRUE; else - alt=FALSE; - CompSetFloatOpPushPop(cc,tmpi,&dont_push_float,&dont_pop_float); - } else { - dont_push_float=FALSE; - dont_pop_float=FALSE; - alt=FALSE; + alt = FALSE; + CompSetFloatOpPushPop(cc, tmpi, &dont_push_float, &dont_pop_float); } - if (alt && dont_push_float && !dont_pop_float) { - ptr=comp_templates_dont_push2[op]; - i=comp_templates_dont_push2[op+1]-ptr; + else + { + dont_push_float = FALSE; + dont_pop_float = FALSE; + alt = FALSE; } - if (!i) { - if (dont_push_float) { - if (dont_pop_float) { - ptr=comp_templates_dont_push_pop[op]; - i=comp_templates_dont_push_pop[op+1]-ptr; - } else { - ptr=comp_templates_dont_push[op]; - i=comp_templates_dont_push[op+1]-ptr; + if (alt && dont_push_float && !dont_pop_float) + { + ptr = comp_templates_dont_push2[op]; + i = comp_templates_dont_push2[op + 1] - ptr; + } + if (!i) + { + if (dont_push_float) + { + if (dont_pop_float) + { + ptr = comp_templates_dont_push_pop[op]; + i = comp_templates_dont_push_pop[op + 1] - ptr; } - } else { - if (dont_pop_float) { - ptr=comp_templates_dont_pop[op]; - i=comp_templates_dont_pop[op+1]-ptr; - } else { - ptr=comp_templates[op]; - i=comp_templates[op+1]-ptr; + else + { + ptr = comp_templates_dont_push[op]; + i = comp_templates_dont_push[op + 1] - ptr; + } + } + else + { + if (dont_pop_float) + { + ptr = comp_templates_dont_pop[op]; + i = comp_templates_dont_pop[op + 1] - ptr; + } + else + { + ptr = comp_templates[op]; + i = comp_templates[op + 1] - ptr; } } } - MemCopy(&tmpi->ic_body[tmpi->ic_count],ptr,i); + MemCopy(&tmpi->ic_body[tmpi->ic_count], ptr, i); if (!off_the_record) - CompNoteFloatOp(cc,tmpi,dont_pushable,dont_popable,pos); - tmpi->ic_count+=i; + CompNoteFloatOp(cc, tmpi, dont_pushable, dont_popable, pos); + tmpi->ic_count += i; } -U0 ICFConvert(CCompCtrl *cc,CIntermediateCode *tmpi,I64 r1, - CICType t2,I64 r2,I64 d2,Bool to_int,I64 pos,I64 rip) +U0 ICFConvert(CCompCtrl *cc, CIntermediateCode *tmpi, I64 r1, CICType t2, I64 r2, I64 d2, Bool to_int, I64 pos, I64 rip) { - I64 rsp_size=0,op1,op2; - Bool dont_push_float,dont_pop_float; + I64 rsp_size = 0, op1, op2; + Bool dont_push_float, dont_pop_float; - if (to_int) { - op1=SLASH_OP_FLD; - op2=SLASH_OP_FISTTP; - } else { - op1=SLASH_OP_FILD; - op2=SLASH_OP_FSTP; + if (to_int) + { + op1 = SLASH_OP_FLD; + op2 = SLASH_OP_FISTTP; + } + else + { + op1 = SLASH_OP_FILD; + op2 = SLASH_OP_FSTP; } - CompSetFloatOpPushPop(cc,tmpi,&dont_push_float,&dont_pop_float); - if (!dont_push_float) { - if (!(t2.raw_type>=RT_I64 && t2&MDG_DISP_SIB_RIP)) { - ICPush(tmpi,t2,r2,d2,rip); - t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0; - rsp_size=8; - } else { - if (!dont_pop_float) { - rsp_size=8; - ICAddRSP(tmpi,-8); + CompSetFloatOpPushPop(cc, tmpi, &dont_push_float, &dont_pop_float); + if (!dont_push_float) + { + if (!(t2.raw_type >= RT_I64 && t2 & MDG_DISP_SIB_RIP)) + { + ICPush(tmpi, t2, r2, d2, rip); + t2 = MDF_SIB + RT_I64; + r2 = REG_RSP + REG_RSP << 8; + d2 = 0; + rsp_size = 8; + } + else + { + if (!dont_pop_float) + { + rsp_size = 8; + ICAddRSP(tmpi, -8); } } - ICSlashOp(tmpi,t2,r2,d2,op1,rip); - } else { - if (!dont_pop_float) { - rsp_size=8; - ICAddRSP(tmpi,-8); + ICSlashOp(tmpi, t2, r2, d2, op1, rip); + } + else + { + if (!dont_pop_float) + { + rsp_size = 8; + ICAddRSP(tmpi, -8); } } if (to_int) - CompNoteFloatOp(cc,tmpi,TRUE,FALSE,pos); + CompNoteFloatOp(cc, tmpi, TRUE, FALSE, pos); else - CompNoteFloatOp(cc,tmpi,FALSE,TRUE,pos); - if (dont_pop_float) { + CompNoteFloatOp(cc, tmpi, FALSE, TRUE, pos); + if (dont_pop_float) + { if (rsp_size) - ICAddRSP(tmpi,rsp_size); - } else { - ICSlashOp(tmpi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,op2,rip); - ICPop(tmpi,MDF_REG+RT_I64,r1,0,rip); + ICAddRSP(tmpi, rsp_size); + } + else + { + ICSlashOp(tmpi, MDF_SIB + RT_I64, REG_RSP + REG_RSP << 8, 0, op2, rip); + ICPop(tmpi, MDF_REG + RT_I64, r1, 0, rip); } } -U0 ICFConvert2(CCompCtrl *cc,CIntermediateCode *tmpi,I64 r1, - CICType t2,I64 r2,I64 d2,Bool to_int,I64 rip) +U0 ICFConvert2(CCompCtrl *cc, CIntermediateCode *tmpi, I64 r1, CICType t2, I64 r2, I64 d2, Bool to_int, I64 rip) { - I64 rsp_size=0,op1,op2; - if (to_int) { - op1=SLASH_OP_FLD; - op2=SLASH_OP_FISTTP; - } else { - op1=SLASH_OP_FILD; - op2=SLASH_OP_FSTP; + I64 rsp_size = 0, op1, op2; + if (to_int) + { + op1 = SLASH_OP_FLD; + op2 = SLASH_OP_FISTTP; } - if (!(t2.raw_type>=RT_I64 && t2&MDG_DISP_SIB_RIP)) { - ICPush(tmpi,t2,r2,d2,rip); - t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0; - rsp_size=8; - } else { - rsp_size=8; - ICAddRSP(tmpi,-8); + else + { + op1 = SLASH_OP_FILD; + op2 = SLASH_OP_FSTP; } - ICSlashOp(tmpi,t2,r2,d2,op1,rip); - ICSlashOp(tmpi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,op2,rip); - ICPop(tmpi,MDF_REG+RT_I64,r1,0,rip); - cc->last_dont_pushable=cc->last_dont_popable=FALSE; //TODO: improve this + if (!(t2.raw_type >= RT_I64 && t2 & MDG_DISP_SIB_RIP)) + { + ICPush(tmpi, t2, r2, d2, rip); + t2 = MDF_SIB + RT_I64; + r2 = REG_RSP + REG_RSP << 8; + d2 = 0; + rsp_size = 8; + } + else + { + rsp_size = 8; + ICAddRSP(tmpi, -8); + } + ICSlashOp(tmpi, t2, r2, d2, op1, rip); + ICSlashOp(tmpi, MDF_SIB + RT_I64, REG_RSP + REG_RSP << 8, 0, op2, rip); + ICPop(tmpi, MDF_REG + RT_I64, r1, 0, rip); + cc->last_dont_pushable = cc->last_dont_popable = FALSE; //TODO: improve this } -U0 ICFUnaryMinus(CCompCtrl *cc,CIntermediateCode *tmpi,U8 *buf2,I64 rip) +U0 ICFUnaryMinus(CCompCtrl *cc, CIntermediateCode *tmpi, U8 *buf2, I64 rip) { - CICArg *arg1=&tmpi->arg1; - I64 rsp_size=0,builtin1=0,t1,r1,d1; - Bool dont_push_float,dont_pop_float; + CICArg *arg1 = &tmpi->arg1; + I64 rsp_size = 0, builtin1 = 0, t1, r1, d1; + Bool dont_push_float, dont_pop_float; - if (cc->flags&CCF_AOT_COMPILE) - buf2=cc->aotc->rip; + if (cc->flags & CCF_AOT_COMPILE) + buf2 = cc->aotc->rip; - CompSetFloatOpPushPop(cc,tmpi,&dont_push_float,&dont_pop_float); - if (!dont_push_float) { - if (arg1->type.raw_type>=RT_I64 && arg1->type&MDG_DISP_SIB_RIP) { - t1=arg1->type; - r1=arg1->reg; - d1=arg1->disp; - } else { - if (arg1->type&MDF_IMM) { - if (!(builtin1=ICBuiltInFloatConst(arg1->disp(F64)))) { - t1=MDF_RIP_DISP32+RT_I64; - r1=REG_RIP; - d1=COCFloatConstFind(cc,arg1->disp(F64))+buf2; + CompSetFloatOpPushPop(cc, tmpi, &dont_push_float, &dont_pop_float); + if (!dont_push_float) + { + if (arg1->type.raw_type >= RT_I64 && arg1->type & MDG_DISP_SIB_RIP) + { + t1 = arg1->type; + r1 = arg1->reg; + d1 = arg1->disp; + } + else + { + if (arg1->type & MDF_IMM) + { + if (!(builtin1 = ICBuiltInFloatConst(arg1->disp(F64)))) + { + t1 = MDF_RIP_DISP32 + RT_I64; + r1 = REG_RIP; + d1 = COCFloatConstFind(cc, arg1->disp(F64)) + buf2; } - } else { - ICPush(tmpi,arg1->type,arg1->reg,arg1->disp,rip); - t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0; - rsp_size+=8; + } + else + { + ICPush(tmpi, arg1->type, arg1->reg, arg1->disp, rip); + t1 = MDF_SIB + RT_I64; + r1 = REG_RSP + REG_RSP << 8; + d1 = 0; + rsp_size += 8; } } if (builtin1) - ICU16(tmpi,builtin1); + ICU16(tmpi, builtin1); else - ICSlashOp(tmpi,t1,r1,d1,SLASH_OP_FLD,rip); + ICSlashOp(tmpi, t1, r1, d1, SLASH_OP_FLD, rip); } - if (!dont_pop_float && !rsp_size) { - rsp_size=8; - ICAddRSP(tmpi,-8); + if (!dont_pop_float && !rsp_size) + { + rsp_size = 8; + ICAddRSP(tmpi, -8); } - ICU16(tmpi,0xE0D9); //FCHS - CompNoteFloatOp(cc,tmpi,TRUE,TRUE,CN_INST); - if (dont_pop_float) { + ICU16(tmpi, 0xE0D9); //FCHS + CompNoteFloatOp(cc, tmpi, TRUE, TRUE, CN_INST); + if (dont_pop_float) + { if (rsp_size) - ICAddRSP(tmpi,rsp_size); - } else { - ICSlashOp(tmpi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,SLASH_OP_FSTP,rip); - ICPop(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,rip); + ICAddRSP(tmpi, rsp_size); + } + else + { + ICSlashOp(tmpi, MDF_SIB + RT_I64, REG_RSP + REG_RSP << 8, 0, SLASH_OP_FSTP, rip); + ICPop(tmpi, tmpi->res.type, tmpi->res.reg, tmpi->res.disp, rip); } } -U0 ICFMod(CCompCtrl *cc,CIntermediateCode *tmpi,I64 rip) +U0 ICFMod(CCompCtrl *cc, CIntermediateCode *tmpi, I64 rip) {//for MOD - Bool dont_push_float,dont_pop_float; - CompSetFloatOpPushPop(cc,tmpi,&dont_push_float,&dont_pop_float); - if (dont_push_float) { - if (tmpi->ic_flags&ICF_ALT_TEMPLATE) - ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0, - tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip); + Bool dont_push_float, dont_pop_float; + CompSetFloatOpPushPop(cc, tmpi, &dont_push_float, &dont_pop_float); + if (dont_push_float) + { + if (tmpi->ic_flags & ICF_ALT_TEMPLATE) + ICMov(tmpi, MDF_REG + RT_I64, REG_RAX, 0, tmpi->arg1.type, tmpi->arg1.reg, tmpi->arg1.disp, rip); else - ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0, - tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip); - } else { - ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0, - tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip); - ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0, - tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip); + ICMov(tmpi, MDF_REG + RT_I64, REG_RAX, 0, tmpi->arg2.type, tmpi->arg2.reg, tmpi->arg2.disp, rip); + } + else + { + ICMov(tmpi, MDF_REG + RT_I64, REG_RAX, 0, tmpi->arg2.type, tmpi->arg2.reg, tmpi->arg2.disp, rip); + ICMov(tmpi, MDF_REG + RT_I64, REG_RDX, 0, tmpi->arg1.type, tmpi->arg1.reg, tmpi->arg1.disp, rip); } //TODO: unpushable,unpop? Not sure - ICCopyTemplate(cc,tmpi,CMP_TEMPLATE_MOD,FALSE,FALSE,FALSE,CN_INST); + ICCopyTemplate(cc, tmpi, CMP_TEMPLATE_MOD, FALSE, FALSE, FALSE, CN_INST); if (!dont_pop_float) - ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp, - MDF_REG+RT_I64,REG_RAX,0,rip); + ICMov(tmpi, tmpi->res.type, tmpi->res.reg, tmpi->res.disp, MDF_REG + RT_I64, REG_RAX, 0, rip); } -U0 ICFPow(CCompCtrl *cc,CIntermediateCode *tmpi,U8 *buf,I64 rip) +U0 ICFPow(CCompCtrl *cc, CIntermediateCode *tmpi, U8 *buf, I64 rip) {//for POW I64 i; CAOTImportExport *tmpie; - CHashExport *tmpex=HashFind("SYS_POW", - cc->htc.hash_table_list,HTT_EXPORT_SYS_SYM); + CHashExport *tmpex = HashFind("SYS_POW", cc->htc.hash_table_list, HTT_EXPORT_SYS_SYM); - ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0, - tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip); - ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0, - tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip); - if (cc->flags&CCF_AOT_COMPILE) { - if (!tmpex) { - tmpex=CAlloc(sizeof(CHashExport)); - tmpex->str=StrNew("SYS_POW"); - tmpex->type=HTT_EXPORT_SYS_SYM|HTF_UNRESOLVED|HTF_IMPORT; - HashAdd(tmpex,cc->htc.global_hash_table); + ICMov(tmpi, MDF_REG + RT_I64, REG_RAX, 0, tmpi->arg2.type, tmpi->arg2.reg, tmpi->arg2.disp, rip); + ICMov(tmpi, MDF_REG + RT_I64, REG_RDX, 0, tmpi->arg1.type, tmpi->arg1.reg, tmpi->arg1.disp, rip); + if (cc->flags & CCF_AOT_COMPILE) + { + if (!tmpex) + { + tmpex = CAlloc(sizeof(CHashExport)); + tmpex->str = StrNew("SYS_POW"); + tmpex->type = HTT_EXPORT_SYS_SYM | HTF_UNRESOLVED | HTF_IMPORT; + HashAdd(tmpex, cc->htc.global_hash_table); } - if (tmpex->type&HTF_IMPORT) { - if (OptionGet(OPTf_USE_IMM64)) { - ICU16(tmpi,0xBB48); - ICU64(tmpi,0); - if (buf) { - tmpie=CAlloc(sizeof(CAOTImportExport)); - tmpie->type=IET_IMM_I64; - tmpie->rip=rip+tmpi->ic_count-8; - tmpie->next=tmpex->ie_list; - tmpex->ie_list=tmpie; + if (tmpex->type & HTF_IMPORT) + { + if (OptionGet(OPTf_USE_IMM64)) + { + ICU16(tmpi, 0xBB48); + ICU64(tmpi, 0); + if (buf) + { + tmpie = CAlloc(sizeof(CAOTImportExport)); + tmpie->type = IET_IMM_I64; + tmpie->rip = rip + tmpi->ic_count - 8; + tmpie->next = tmpex->ie_list; + tmpex->ie_list = tmpie; } - ICU16(tmpi,0xD3FF); - } else { - ICU8(tmpi,0xE8); - ICU32(tmpi,-(rip+tmpi->ic_count+4)); - if (buf) { - tmpie=CAlloc(sizeof(CAOTImportExport)); - tmpie->type=IET_REL_I32; - tmpie->rip=rip+tmpi->ic_count-4; - tmpie->next=tmpex->ie_list; - tmpex->ie_list=tmpie; + ICU16(tmpi, 0xD3FF); + } + else + { + ICU8(tmpi, 0xE8); + ICU32(tmpi, -(rip + tmpi->ic_count + 4)); + if (buf) + { + tmpie = CAlloc(sizeof(CAOTImportExport)); + tmpie->type = IET_REL_I32; + tmpie->rip = rip + tmpi->ic_count - 4; + tmpie->next = tmpex->ie_list; + tmpex->ie_list = tmpie; } } - } else {//Kernel - if (tmpex->type&HTF_UNRESOLVED) + } + else + {//Kernel + if (tmpex->type & HTF_UNRESOLVED) throw('Compiler'); - else { - i=tmpex->val-(rip+tmpi->ic_count+5); - if (!(I32_MIN<=i<=I32_MAX)) { + else + { + i = tmpex->val - (rip + tmpi->ic_count + 5); + if (!(I32_MIN <= i <= I32_MAX)) + { throw('Compiler'); -// ICU16(tmpi,0xBB48); - // ICU64(tmpi,tmpex->val); - // ICU16(tmpi,0xD3FF); - } else { - ICU8(tmpi,0xE8); - ICU32(tmpi,i); + // ICU16(tmpi, 0xBB48); + // ICU64(tmpi, tmpex->val); + // ICU16(tmpi, 0xD3FF); + } + else + { + ICU8(tmpi, 0xE8); + ICU32(tmpi, i); } } } - } else { - i=tmpex->val-(rip+tmpi->ic_count+5); - if (!(I32_MIN<=i<=I32_MAX)) { - ICU16(tmpi,0xBB48); - ICU64(tmpi,tmpex->val); - ICU16(tmpi,0xD3FF); - } else { - ICU8(tmpi,0xE8); - ICU32(tmpi,i); - } } - tmpi->ic_flags&=~ICF_CODE_FINAL; - ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp, - MDF_REG+RT_I64,REG_RAX,0,rip); + else + { + i = tmpex->val - (rip + tmpi->ic_count + 5); + if (!(I32_MIN <= i <= I32_MAX)) + { + ICU16(tmpi, 0xBB48); + ICU64(tmpi, tmpex->val); + ICU16(tmpi, 0xD3FF); + } + else + { + ICU8(tmpi, 0xE8); + ICU32(tmpi, i); + } + } + tmpi->ic_flags &= ~ICF_CODE_FINAL; + ICMov(tmpi, tmpi->res.type, tmpi->res.reg, tmpi->res.disp, MDF_REG + RT_I64, REG_RAX, 0, rip); } -U0 ICFOp(CCompCtrl *cc,CIntermediateCode *tmpi,I64 op,U8 *buf2,I64 rip) +U0 ICFOp(CCompCtrl *cc, CIntermediateCode *tmpi, I64 op, U8 *buf2, I64 rip) {//for ADD,SUB,DIV,MUL - CICArg *arg1,*arg2; - Bool dont_push_float,dont_pop_float,alt; - I64 rsp_size=0,builtin1=0,builtin2=0,t1,r1,d1,t2,r2,d2; + CICArg *arg1, *arg2; + Bool dont_push_float, dont_pop_float, alt; + I64 rsp_size = 0, builtin1 = 0, builtin2 = 0, t1, r1, d1, t2, r2, d2; - if (tmpi->ic_flags&ICF_ALT_TEMPLATE) { - arg1=&tmpi->arg2; - arg2=&tmpi->arg1; - alt=TRUE; - } else { - arg1=&tmpi->arg1; - arg2=&tmpi->arg2; - alt=FALSE; + if (tmpi->ic_flags & ICF_ALT_TEMPLATE) + { + arg1 = &tmpi->arg2; + arg2 = &tmpi->arg1; + alt = TRUE; + } + else + { + arg1 = &tmpi->arg1; + arg2 = &tmpi->arg2; + alt = FALSE; } - if (cc->flags&CCF_AOT_COMPILE) - buf2=cc->aotc->rip; + if (cc->flags & CCF_AOT_COMPILE) + buf2 = cc->aotc->rip; - CompSetFloatOpPushPop(cc,tmpi,&dont_push_float,&dont_pop_float); - if (dont_push_float) { - if (arg2->type.raw_type>=RT_I64 && arg2->type&MDG_DISP_SIB_RIP) { - t2=arg2->type; - r2=arg2->reg; - d2=arg2->disp; - } else { - if (arg2->type&MDF_IMM) { - if (!(builtin2=ICBuiltInFloatConst(arg2->disp(F64)))) { - t2=MDF_RIP_DISP32+RT_I64; - r2=REG_RIP; - d2=COCFloatConstFind(cc,arg2->disp(F64))+buf2; - } - } else { - ICPush(tmpi,arg2->type,arg2->reg,arg2->disp,rip); - t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0; - rsp_size+=8; - } + CompSetFloatOpPushPop(cc, tmpi, &dont_push_float, &dont_pop_float); + if (dont_push_float) + { + if (arg2->type.raw_type >= RT_I64 && arg2->type & MDG_DISP_SIB_RIP) + { + t2 = arg2->type; + r2 = arg2->reg; + d2 = arg2->disp; } - } else { - if (alt) { - if (!(arg2->type&MDF_STACK)) { - if (arg1->type.raw_type>=RT_I64 && arg1->type&MDG_DISP_SIB_RIP) { - t1=arg1->type; - r1=arg1->reg; - d1=arg1->disp; - } else { - if (arg1->type&MDF_IMM) { - if (!(builtin1=ICBuiltInFloatConst(arg1->disp(F64)))) { - t1=MDF_RIP_DISP32+RT_I64; - r1=REG_RIP; - d1=COCFloatConstFind(cc,arg1->disp(F64))+buf2; - } - } else { - ICPush(tmpi,arg1->type,arg1->reg,arg1->disp,rip); - t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0; - rsp_size+=8; - } + else + { + if (arg2->type & MDF_IMM) + { + if (!(builtin2 = ICBuiltInFloatConst(arg2->disp(F64)))) + { + t2 = MDF_RIP_DISP32 + RT_I64; + r2 = REG_RIP; + d2 = COCFloatConstFind(cc, arg2->disp(F64)) + buf2; } - if (arg2->type.raw_type>=RT_I64 && arg2->type&MDG_DISP_SIB_RIP) { - t2=arg2->type; - r2=arg2->reg; - d2=arg2->disp; - } else { - if (arg2->type&MDF_IMM) { - if (!(builtin2=ICBuiltInFloatConst(arg2->disp(F64)))) { - t2=MDF_RIP_DISP32+RT_I64; - r2=REG_RIP; - d2=COCFloatConstFind(cc,arg2->disp(F64))+buf2; - } - } else { - ICPush(tmpi,arg2->type,arg2->reg,arg2->disp,rip); - t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0; - rsp_size+=8; - if (r1==REG_RSP+REG_RSP<<8) - d1+=8; - } - } - } else { - ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,arg1->type, - arg1->reg,arg1->disp,rip); - ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,arg2->type, - arg2->reg,arg2->disp,rip); - ICU16(tmpi,0x5052); //PUSH EDX PUSH EAX - rsp_size=16; - t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=8; - t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0; } - } else { - if (!(arg1->type&MDF_STACK)) { - if (arg2->type.raw_type>=RT_I64 && arg2->type&MDG_DISP_SIB_RIP) { - t2=arg2->type; - r2=arg2->reg; - d2=arg2->disp; - } else { - if (arg2->type&MDF_IMM) { - if (!(builtin2=ICBuiltInFloatConst(arg2->disp(F64)))) { - t2=MDF_RIP_DISP32+RT_I64; - r2=REG_RIP; - d2=COCFloatConstFind(cc,arg2->disp(F64))+buf2; - } - } else { - ICPush(tmpi,arg2->type,arg2->reg,arg2->disp,rip); - t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0; - rsp_size+=8; - } - } - if (arg1->type.raw_type>=RT_I64 && arg1->type&MDG_DISP_SIB_RIP) { - t1=arg1->type; - r1=arg1->reg; - d1=arg1->disp; - } else { - if (arg1->type&MDF_IMM) { - if (!(builtin1=ICBuiltInFloatConst(arg1->disp(F64)))) { - t1=MDF_RIP_DISP32+RT_I64; - r1=REG_RIP; - d1=COCFloatConstFind(cc,arg1->disp(F64))+buf2; - } - } else { - ICPush(tmpi,arg1->type,arg1->reg,arg1->disp,rip); - t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=0; - rsp_size+=8; - if (r2==REG_RSP+REG_RSP<<8) - d2+=8; - } - } - } else { - ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0,arg2->type, - arg2->reg,arg2->disp,rip); - ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0,arg1->type, - arg1->reg,arg1->disp,rip); - ICU16(tmpi,0x5052); //PUSH EDX PUSH EAX - rsp_size=16; - t1=MDF_SIB+RT_I64; r1=REG_RSP+REG_RSP<<8; d1=8; - t2=MDF_SIB+RT_I64; r2=REG_RSP+REG_RSP<<8; d2=0; + else + { + ICPush(tmpi,arg2->type, arg2->reg, arg2->disp, rip); + t2 = MDF_SIB + RT_I64; + r2 = REG_RSP + REG_RSP << 8; + d2 = 0; + rsp_size += 8; } } } - if (!dont_pop_float && !rsp_size) { - rsp_size=8; - ICAddRSP(tmpi,-8); + else + { + if (alt) + { + if (!(arg2->type & MDF_STACK)) + { + if (arg1->type.raw_type >= RT_I64 && arg1->type & MDG_DISP_SIB_RIP) + { + t1 = arg1->type; + r1 = arg1->reg; + d1 = arg1->disp; + } + else + { + if (arg1->type & MDF_IMM) + { + if (!(builtin1 = ICBuiltInFloatConst(arg1->disp(F64)))) + { + t1 = MDF_RIP_DISP32 + RT_I64; + r1 = REG_RIP; + d1 = COCFloatConstFind(cc, arg1->disp(F64)) + buf2; + } + } + else + { + ICPush(tmpi, arg1->type, arg1->reg, arg1->disp, rip); + t1 = MDF_SIB + RT_I64; + r1 = REG_RSP + REG_RSP << 8; + d1 = 0; + rsp_size+=8; + } + } + if (arg2->type.raw_type >= RT_I64 && arg2->type & MDG_DISP_SIB_RIP) + { + t2 = arg2->type; + r2 = arg2->reg; + d2 = arg2->disp; + } + else + { + if (arg2->type & MDF_IMM) + { + if (!(builtin2 = ICBuiltInFloatConst(arg2->disp(F64)))) + { + t2 = MDF_RIP_DISP32 + RT_I64; + r2 = REG_RIP; + d2 = COCFloatConstFind(cc, arg2->disp(F64)) + buf2; + } + } + else + { + ICPush(tmpi, arg2->type, arg2->reg, arg2->disp, rip); + t2 = MDF_SIB + RT_I64; + r2 = REG_RSP + REG_RSP << 8; + d2 = 0; + rsp_size += 8; + if (r1 == REG_RSP + REG_RSP << 8) + d1 += 8; + } + } + } + else + { + ICMov(tmpi, MDF_REG +RT_I64, REG_RDX, 0, arg1->type, arg1->reg, arg1->disp, rip); + ICMov(tmpi, MDF_REG +RT_I64, REG_RAX, 0, arg2->type, arg2->reg, arg2->disp, rip); + ICU16(tmpi, 0x5052); //PUSH EDX PUSH EAX + rsp_size = 16; + t1 = MDF_SIB + RT_I64; + r1 = REG_RSP + REG_RSP << 8; + d1 = 8; + t2 = MDF_SIB + RT_I64; + r2 = REG_RSP + REG_RSP << 8; + d2 = 0; + } + } + else + { + if (!(arg1->type & MDF_STACK)) + { + if (arg2->type.raw_type >= RT_I64 && arg2->type & MDG_DISP_SIB_RIP) + { + t2 = arg2->type; + r2 = arg2->reg; + d2 = arg2->disp; + } + else + { + if (arg2->type & MDF_IMM) + { + if (!(builtin2 = ICBuiltInFloatConst(arg2->disp(F64)))) + { + t2 = MDF_RIP_DISP32 + RT_I64; + r2 = REG_RIP; + d2 = COCFloatConstFind(cc, arg2->disp(F64)) + buf2; + } + } + else + { + ICPush(tmpi, arg2->type, arg2->reg, arg2->disp, rip); + t2 = MDF_SIB + RT_I64; + r2 = REG_RSP + REG_RSP << 8; + d2 = 0; + rsp_size += 8; + } + } + if (arg1->type.raw_type >= RT_I64 && arg1->type & MDG_DISP_SIB_RIP) + { + t1 = arg1->type; + r1 = arg1->reg; + d1 = arg1->disp; + } + else + { + if (arg1->type & MDF_IMM) + { + if (!(builtin1 = ICBuiltInFloatConst(arg1->disp(F64)))) + { + t1 = MDF_RIP_DISP32 + RT_I64; + r1 = REG_RIP; + d1 = COCFloatConstFind(cc, arg1->disp(F64)) + buf2; + } + } + else + { + ICPush(tmpi, arg1->type, arg1->reg, arg1->disp, rip); + t1 = MDF_SIB + RT_I64; + r1 = REG_RSP + REG_RSP << 8; + d1 = 0; + rsp_size += 8; + if (r2 == REG_RSP + REG_RSP << 8) + d2 += 8; + } + } + } + else + { + ICMov(tmpi, MDF_REG + RT_I64, REG_RAX, 0, arg2->type, arg2->reg, arg2->disp, rip); + ICMov(tmpi, MDF_REG + RT_I64, REG_RDX, 0, arg1->type, arg1->reg, arg1->disp, rip); + ICU16(tmpi, 0x5052); //PUSH EDX PUSH EAX + rsp_size = 16; + t1 = MDF_SIB + RT_I64; + r1 = REG_RSP + REG_RSP << 8; + d1 = 8; + t2 = MDF_SIB + RT_I64; + r2 = REG_RSP + REG_RSP << 8; + d2 = 0; + } + } } - if (!dont_push_float) { - if (builtin2 && !builtin1) { - alt=!alt; - SwapI64(&t1,&t2); - SwapI64(&r1,&r2); - SwapI64(&d1,&d2); - SwapI64(&builtin1,&builtin2); + if (!dont_pop_float && !rsp_size) + { + rsp_size = 8; + ICAddRSP(tmpi, -8); + } + if (!dont_push_float) + { + if (builtin2 && !builtin1) + { + alt = !alt; + SwapI64(&t1, &t2); + SwapI64(&r1, &r2); + SwapI64(&d1, &d2); + SwapI64(&builtin1, &builtin2); } if (builtin1) - ICU16(tmpi,builtin1); + ICU16(tmpi, builtin1); else - ICSlashOp(tmpi,t1,r1,d1,SLASH_OP_FLD,rip); + ICSlashOp(tmpi, t1, r1, d1, SLASH_OP_FLD, rip); } if (alt) - switch (op.u8[0]) { - case 4: op=SLASH_OP_FSUBR; break; - case 6: op=SLASH_OP_FDIVR; break; + switch (op.u8[0]) + { + case 4: + op = SLASH_OP_FSUBR; + break; + case 6: + op = SLASH_OP_FDIVR; + break; } - if (builtin2) { - ICU16(tmpi,builtin2); - ICU16(tmpi,op.u16[2]); - } else - ICSlashOp(tmpi,t2,r2,d2,op,rip); - CompNoteFloatOp(cc,tmpi,TRUE,TRUE,CN_INST); - if (dont_pop_float) { + if (builtin2) + { + ICU16(tmpi, builtin2); + ICU16(tmpi, op.u16[2]); + } + else + ICSlashOp(tmpi, t2, r2, d2, op, rip); + CompNoteFloatOp(cc, tmpi, TRUE, TRUE, CN_INST); + if (dont_pop_float) + { if (rsp_size) - ICAddRSP(tmpi,rsp_size); - } else { - if (rsp_size==8) - ICSlashOp(tmpi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,0,SLASH_OP_FSTP,rip); - else if (rsp_size>8) { - ICSlashOp(tmpi,MDF_SIB+RT_I64,REG_RSP+REG_RSP<<8,rsp_size-8, - SLASH_OP_FSTP,rip); - ICAddRSP(tmpi,rsp_size-8); + ICAddRSP(tmpi, rsp_size); + } + else + { + if (rsp_size == 8) + ICSlashOp(tmpi, MDF_SIB + RT_I64, REG_RSP + REG_RSP << 8, 0, SLASH_OP_FSTP, rip); + else if (rsp_size > 8) + { + ICSlashOp(tmpi, MDF_SIB + RT_I64, REG_RSP + REG_RSP << 8, rsp_size - 8, SLASH_OP_FSTP, rip); + ICAddRSP(tmpi, rsp_size - 8); } - ICPop(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp,rip); + ICPop(tmpi, tmpi->res.type, tmpi->res.reg, tmpi->res.disp, rip); } } -U0 ICFCmp(CCompCtrl *cc,CIntermediateCode *tmpi,I64 op,I64 rip) +U0 ICFCmp(CCompCtrl *cc, CIntermediateCode *tmpi, I64 op, I64 rip) { - Bool dont_push_float,dont_pop_float; - CompSetFloatOpPushPop(cc,tmpi,&dont_push_float,&dont_pop_float); - if (dont_push_float) { - if (tmpi->ic_flags&ICF_ALT_TEMPLATE) { - if (tmpi->ic_flags&ICF_POP_CMP) - ICPopRegs(tmpi,1<ic_flags & ICF_ALT_TEMPLATE) + { + if (tmpi->ic_flags & ICF_POP_CMP) + ICPopRegs(tmpi, 1 << REG_RAX); else - ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0, - tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip); - } else - ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0, - tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip); - } else { - ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0, - tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip); - if (tmpi->ic_flags&ICF_POP_CMP) - ICPopRegs(tmpi,1<arg1.type, tmpi->arg1.reg, tmpi->arg1.disp, rip); + } else - ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0, - tmpi->arg1.type,tmpi->arg1.reg,tmpi->arg1.disp,rip); + ICMov(tmpi, MDF_REG + RT_I64, REG_RAX, 0, tmpi->arg2.type, tmpi->arg2.reg, tmpi->arg2.disp, rip); } - if (tmpi->ic_flags&ICF_PUSH_CMP) - ICPushRegs(tmpi,1<res.type,tmpi->res.reg,tmpi->res.disp, - MDF_REG+RT_I64,REG_RAX,0,rip); + else + { + ICMov(tmpi, MDF_REG + RT_I64, REG_RAX, 0, tmpi->arg2.type, tmpi->arg2.reg, tmpi->arg2.disp, rip); + if (tmpi->ic_flags & ICF_POP_CMP) + ICPopRegs(tmpi, 1 << REG_RDX); + else + ICMov(tmpi, MDF_REG + RT_I64, REG_RDX, 0, tmpi->arg1.type, tmpi->arg1.reg, tmpi->arg1.disp, rip); + } + if (tmpi->ic_flags & ICF_PUSH_CMP) + ICPushRegs(tmpi, 1 << REG_RAX); + ICCopyTemplate(cc, tmpi, op, FALSE, TRUE, FALSE, CN_INST); + ICMov(tmpi, tmpi->res.type, tmpi->res.reg, tmpi->res.disp, MDF_REG + RT_I64, REG_RAX, 0, rip); } -U0 ICFModEqu(CCompCtrl *cc,CIntermediateCode *tmpi,I64 rip) +U0 ICFModEqu(CCompCtrl *cc, CIntermediateCode *tmpi, I64 rip) { - Bool dont_push_float,dont_pop_float; - CompSetFloatOpPushPop(cc,tmpi,&dont_push_float,&dont_pop_float); - if (tmpi->ic_flags & ICF_BY_VAL) { - if (dont_push_float) { - ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0, - tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to, - tmpi->arg1.reg,tmpi->arg1.disp,rip); - if (tmpi->arg1_type_pointed_to!=RT_F64) - ICFConvert2(cc,tmpi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,FALSE,rip); - } else { - ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0, - tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip); - ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0, - tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to, - tmpi->arg1.reg,tmpi->arg1.disp,rip); - if (tmpi->arg1_type_pointed_to!=RT_F64) - ICFConvert2(cc,tmpi,REG_RDX,MDF_REG+RT_I64,REG_RDX,0,FALSE,rip); + Bool dont_push_float, dont_pop_float; + CompSetFloatOpPushPop(cc, tmpi, &dont_push_float, &dont_pop_float); + if (tmpi->ic_flags & ICF_BY_VAL) + { + if (dont_push_float) + { + ICMov(tmpi, MDF_REG + RT_I64, REG_RAX, 0, + tmpi->arg1.type & MDG_MASK + tmpi->arg1_type_pointed_to, + tmpi->arg1.reg, tmpi->arg1.disp, rip); + if (tmpi->arg1_type_pointed_to != RT_F64) + ICFConvert2(cc, tmpi, REG_RAX, MDF_REG + RT_I64, REG_RAX, 0, FALSE, rip); + } + else + { + ICMov(tmpi, MDF_REG + RT_I64, REG_RAX, 0, tmpi->arg2.type, tmpi->arg2.reg, tmpi->arg2.disp, rip); + ICMov(tmpi, MDF_REG + RT_I64, REG_RDX, 0, + tmpi->arg1.type & MDG_MASK + tmpi->arg1_type_pointed_to, + tmpi->arg1.reg, tmpi->arg1.disp, rip); + if (tmpi->arg1_type_pointed_to != RT_F64) + ICFConvert2(cc, tmpi, REG_RDX, MDF_REG + RT_I64, REG_RDX, 0, FALSE, rip); } //TODO: unpushable,unpop? Not sure - ICCopyTemplate(cc,tmpi,CMP_TEMPLATE_MOD,FALSE,FALSE,FALSE,CN_INST); - if (tmpi->arg1_type_pointed_to!=RT_F64) - ICFConvert2(cc,tmpi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,TRUE,rip); - ICMov(tmpi,tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to, - tmpi->arg1.reg,tmpi->arg1.disp,MDF_REG+RT_I64,REG_RAX,0,rip); + ICCopyTemplate(cc, tmpi, CMP_TEMPLATE_MOD, FALSE, FALSE, FALSE, CN_INST); + if (tmpi->arg1_type_pointed_to != RT_F64) + ICFConvert2(cc, tmpi, REG_RAX, MDF_REG + RT_I64, REG_RAX, 0, TRUE, rip); + ICMov(tmpi, tmpi->arg1.type & MDG_MASK + tmpi->arg1_type_pointed_to, + tmpi->arg1.reg, tmpi->arg1.disp, MDF_REG + RT_I64, REG_RAX, 0, rip); if (tmpi->res.type.mode) - ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp, - tmpi->arg1.type&MDG_MASK+tmpi->arg1_type_pointed_to, - tmpi->arg1.reg,tmpi->arg1.disp,rip); - } else { - if (dont_push_float) { - ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,tmpi->arg1.type, - tmpi->arg1.reg,tmpi->arg1.disp,rip); - ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0, - MDF_DISP+tmpi->arg1_type_pointed_to,REG_RCX,0,rip); - if (tmpi->arg1_type_pointed_to!=RT_F64) - ICFConvert2(cc,tmpi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,FALSE,rip); - } else { - ICMov(tmpi,MDF_REG+RT_I64,REG_RAX,0, - tmpi->arg2.type,tmpi->arg2.reg,tmpi->arg2.disp,rip); - ICMov(tmpi,MDF_REG+RT_I64,REG_RCX,0,tmpi->arg1.type, - tmpi->arg1.reg,tmpi->arg1.disp,rip); - ICMov(tmpi,MDF_REG+RT_I64,REG_RDX,0, - MDF_DISP+tmpi->arg1_type_pointed_to,REG_RCX,0,rip); - if (tmpi->arg1_type_pointed_to!=RT_F64) - ICFConvert2(cc,tmpi,REG_RDX,MDF_REG+RT_I64,REG_RDX,0,FALSE,rip); + ICMov(tmpi, tmpi->res.type, tmpi->res.reg, tmpi->res.disp, + tmpi->arg1.type & MDG_MASK + tmpi->arg1_type_pointed_to, + tmpi->arg1.reg, tmpi->arg1.disp, rip); + } + else + { + if (dont_push_float) + { + ICMov(tmpi, MDF_REG + RT_I64, REG_RCX, 0, tmpi->arg1.type, tmpi->arg1.reg, tmpi->arg1.disp, rip); + ICMov(tmpi, MDF_REG + RT_I64, REG_RAX, 0, MDF_DISP + tmpi->arg1_type_pointed_to, REG_RCX, 0, rip); + if (tmpi->arg1_type_pointed_to != RT_F64) + ICFConvert2(cc, tmpi, REG_RAX, MDF_REG + RT_I64, REG_RAX, 0, FALSE, rip); + } + else + { + ICMov(tmpi, MDF_REG + RT_I64, REG_RAX, 0, tmpi->arg2.type, tmpi->arg2.reg, tmpi->arg2.disp, rip); + ICMov(tmpi, MDF_REG + RT_I64, REG_RCX, 0, tmpi->arg1.type, tmpi->arg1.reg, tmpi->arg1.disp, rip); + ICMov(tmpi, MDF_REG + RT_I64, REG_RDX, 0, MDF_DISP + tmpi->arg1_type_pointed_to, REG_RCX, 0, rip); + if (tmpi->arg1_type_pointed_to != RT_F64) + ICFConvert2(cc, tmpi, REG_RDX, MDF_REG + RT_I64, REG_RDX, 0, FALSE, rip); } //TODO: unpushable,unpop? Not sure - ICCopyTemplate(cc,tmpi,CMP_TEMPLATE_MOD,FALSE,FALSE,FALSE,CN_INST); - if (tmpi->arg1_type_pointed_to!=RT_F64) - ICFConvert2(cc,tmpi,REG_RAX,MDF_REG+RT_I64,REG_RAX,0,TRUE,rip); - ICMov(tmpi,MDF_DISP+tmpi->arg1_type_pointed_to,REG_RCX,0, - MDF_REG+RT_I64,REG_RAX,0,rip); + ICCopyTemplate(cc, tmpi, CMP_TEMPLATE_MOD, FALSE, FALSE, FALSE, CN_INST); + if (tmpi->arg1_type_pointed_to != RT_F64) + ICFConvert2(cc, tmpi, REG_RAX, MDF_REG + RT_I64, REG_RAX, 0, TRUE, rip); + ICMov(tmpi, MDF_DISP + tmpi->arg1_type_pointed_to, REG_RCX, 0, MDF_REG + RT_I64, REG_RAX, 0, rip); if (tmpi->res.type.mode) - ICMov(tmpi,tmpi->res.type,tmpi->res.reg,tmpi->res.disp, - MDF_REG+RT_I64,REG_RAX,0,rip); + ICMov(tmpi, tmpi->res.type, tmpi->res.reg, tmpi->res.disp, MDF_REG + RT_I64, REG_RAX, 0, rip); } } diff --git a/src/Home/FilesRefactored.DD b/src/Home/FilesRefactored.DD index b9c4ebfe..809dccc8 100755 --- a/src/Home/FilesRefactored.DD +++ b/src/Home/FilesRefactored.DD @@ -44,6 +44,7 @@ StartOS.CC BackA.CC BackB.CC BackC.CC + BackFA.CC CExterns.CC CInit.CC CompilerA.HH