From 0600f5b87229c856d38326066980c25be2f65787 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 16 Apr 2026 17:00:07 +0000 Subject: [PATCH] codegen: fuse compare-then-branch to drop boolean materialization MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Every NEScript condition (`if x < N`, `while i < end`, etc.) lowers in two IR ops: `CmpX(d, a, b)` materializes a 0/1 boolean into temp `d`, and the block's terminator `Branch(d, t, f)` reads `d` and branches on it. The codegen faithfully emitted both halves — `LDA / CMP / branch-to-true / LDA #0 / JMP done / true: LDA #1 / done:`, then later `LDA d_slot / BNE branch_t / JMP branch_f` — about 14 cycles + 13 bytes per condition. The 6502's natural pattern is one `CMP` + one branch on the flags it just set: 8 cycles, no register-clobber, no temp slot. Detect the canonical pattern in `gen_block` (last op is an 8-bit `CmpX` whose dest temp is what the terminator branches on, with no other uses) and emit the fused form directly via a new `gen_cmp_branch` helper. The temp's allocation, store, load, and the terminator's branch fall away. Bookkeeping subtlety: the source temps `a`/`b` must be retired *after* the fused emit, not before — the original `gen_op` order is "emit body of op, then `retire_op_sources`". Decrementing their use counts before the CMP would free their slots while they were still live; `load_temp(a)` would then re-allocate `a` to whatever stale slot the free list popped next. Got hit by this on the first attempt — the SHA-256 example dutifully returned all-zero hashes until the order was fixed. Updated `ir_codegen_local_label_suffix_is_bank_namespaced`: the test was relying on `if x == 0` to emit `__ir_cmp_*` labels for its bank-namespacing check, which the fusion now collapses into direct branches. Switched the test source to a shift-by-variable pattern (`x = x << n`), which always emits `__ir_shift_loop_*` labels regardless of future cmp/branch optimizations. Cycle savings: ~6 cycles per condition. The SHA-256 rotate loops alone account for ~9K cycles per block. Across all examples the cycle drift shows up as audio-tick phase shifts in five timing-sensitive ROMs (`audio_demo`, `friendly_assets`, `noise_triangle_sfx`, `platformer`, `sfx_pitch_envelope`); the goldens for those are refreshed in this commit, plus `platformer.gif` (the only demo gif whose bytes actually moved). Verified: cargo test/clippy/fmt clean on rustc 1.95.0; emulator harness 34/34; reproducibility diff clean; SHA-256 of "NES" still computes to AE9145DB…4E0D. https://claude.ai/code/session_01FRmSBruVWCufm3LsUVMs8v --- docs/platformer.gif | Bin 456615 -> 456147 bytes docs/pong.gif | Bin 131999 -> 132852 bytes examples/arrays_and_functions.nes | Bin 24592 -> 24592 bytes examples/audio_demo.nes | Bin 24592 -> 24592 bytes examples/bitwise_ops.nes | Bin 24592 -> 24592 bytes examples/bouncing_ball.nes | Bin 24592 -> 24592 bytes examples/coin_cavern.nes | Bin 24592 -> 24592 bytes examples/comparisons.nes | Bin 24592 -> 24592 bytes examples/friendly_assets.nes | Bin 24592 -> 24592 bytes examples/function_chain.nes | Bin 24592 -> 24592 bytes examples/logic_ops.nes | Bin 24592 -> 24592 bytes examples/loop_break_continue.nes | Bin 24592 -> 24592 bytes examples/match_demo.nes | Bin 24592 -> 24592 bytes examples/metasprite_demo.nes | Bin 24592 -> 24592 bytes examples/mmc1_banked.nes | Bin 57360 -> 57360 bytes examples/mmc3_per_state_split.nes | Bin 24592 -> 24592 bytes examples/noise_triangle_sfx.nes | Bin 24592 -> 24592 bytes examples/palette_and_background.nes | Bin 24592 -> 24592 bytes examples/platformer.nes | Bin 24592 -> 24592 bytes examples/pong.nes | Bin 24592 -> 24592 bytes examples/sfx_pitch_envelope.nes | Bin 24592 -> 24592 bytes examples/sha256.nes | Bin 24592 -> 24592 bytes examples/state_machine.nes | Bin 24592 -> 24592 bytes examples/structs_enums_for.nes | Bin 24592 -> 24592 bytes examples/two_player.nes | Bin 24592 -> 24592 bytes examples/uxrom_banked.nes | Bin 90128 -> 90128 bytes examples/uxrom_banked_to_banked.nes | Bin 57360 -> 57360 bytes examples/uxrom_user_banked.nes | Bin 40976 -> 40976 bytes examples/war.nes | Bin 24592 -> 24592 bytes src/codegen/ir_codegen.rs | 190 ++++++++++++++++-- tests/emulator/goldens/audio_demo.audio.hash | 2 +- .../goldens/friendly_assets.audio.hash | 2 +- .../goldens/noise_triangle_sfx.audio.hash | 2 +- tests/emulator/goldens/platformer.audio.hash | 2 +- tests/emulator/goldens/pong.audio.hash | 2 +- tests/emulator/goldens/pong.png | Bin 1010 -> 1012 bytes .../goldens/sfx_pitch_envelope.audio.hash | 2 +- tests/emulator/goldens/war.audio.hash | 2 +- 38 files changed, 184 insertions(+), 20 deletions(-) diff --git a/docs/platformer.gif b/docs/platformer.gif index 80e19ed242a0e6ffe68222ffa7aa58318807a4bf..4b982f75ddaa11817e99141780a4bc6a2c09314b 100644 GIT binary patch delta 86352 zcmeI*`9Bo;8V7K@u8J1Q5_M1K7|9YXL}W>pte3JSn#vTZlPwu$rm`F<(M1$OS!(46ly%#N#S_2oD0 z=d~UD5!qstacB0w=N^}y;avA^xWcoo`(o5<)2wey{j#QOGFseaAwRI#Pm?!T8lZV+ z8nwl2r_?q_85(#ENH4im3@5Ax_~%L{Jh(QZdfD~GaL$m6>Zl4?%WNzol||~$vhRx> z@$g(9J660li8)b|?Yb-|$rGD(QrL&c6SnrR%u#kLmHSpw zwPJAKwVqbEZ1(&n1jj~j;{W)batiX~oF}zG-E&t_a8MBn0(cLf;@9V@oOWXMM67Fk1w*Mh3xn+6#>_%^Bp`Ag?+ zsNYlPn=P?>_qgAvFb|TIKJ!X8_-^7l$sI&z>Q_Upsn%rik`(bj2|9*9v08r<+7Oxd z&Kqc_wWbW*Al5u7)Ym=LdaLsdv9j{3o`FGYYLnENig!AC#^RRS4Mb;2g`j);tN(fD zU*Tswh8>j66dTj77`3TS*4mpY}?b`(KD}mY!}ozm>!t%pdYdNnNa62 zsFO~WxS=PZy}roNTDv&oLGRBy?ZzDb;g^0Y>)o*SFOCw&nMRop&noMAA8hrmHojjq zx3j^$?x?rZ3r5b$IfBuyV?moD=&U2bdomr{qEntRij@WWm;dJCLkYkC>9)3Um2bO$ z?u$gTb?Y{6baV|EDR|(w@ev`hs5Od7%9*;Suwg587wzyuMXpe+Ct=xt&5b;DCC_hW z2T^?&?dUl7p{!ukVq=JF;nLk)*+d=d%}lKnr+v;+7Psw0Y946^ln-hAAlOMOxW3<3 z`B2BA$jS58r>id_^9haTZPz(*v;LTSYT91pdbNd{`+cs!YJIW$ghqZn=Y~8o zv%F55MNx~~!gRd~ba}&jKfPectPSeqwXB@Vv`2KYq*SYG!6B z=}w`CLv`G@hc!azX?|IIkBoMKlJq;jn5t=WMJdceiA8f&{- zoT^`J`2AV%BGdOnbah$YWC_V+t>33xTk;?2mj)kaysncoldNN`)X9Zvt_&*P?0WNy zqEU*Q9x-;@vwnSU`E8Q(kUF8OF^3_3BB@T*8`e%e(d-@_em76=+zx-W_g%b-J2h|HrGlTXyAYhL5?DzjGB7_h#GP9`dMH zqqaw+y)5!?a6ibt#w&mN@|lOl*eFr0b02GeSy+j{Ca{i|d?K=3;|uA?R{sv>!hHGG z_>08dJsrLuX3Gj(CPPL|Ifa)Zp7Kp6JjwMv0|(}-MI|A=@0q<{U8^Kw!!AyyWp{Hf z9cburxopKIcP}MXvjjP!zdkeT7ONL-N>dGfRXA2Zu*R*HVHY-)RItnw>Q}wxt)EUN zWp|cZnlxUB|22`lrAy1cyiB~i{nBZXd7lnJzv)~2Ossj2fSokg;PPR{a@Bm;lv5X} zc4_)@=*ga5)+ontYBt3?u3n@S+j02h41;?};1(G6aeqKWq4|&Ty-NFDm*z&r^lzgM z%J2_HzI7dYp87+0o?yT+VMSIa_k2AW2ExKkypiCEfFO7L} zVna>DGZBn9p^@P-lPg{rI~6~1l}Zn7PZiHnSAUEo8?OABL79{JXdz-y$N2u@Z;{XA z=1yN;?)GPYpO`Y8rl%{de2kzjzg}fczs-xA+`GEMJ7M{q&k4O~%U<}De0Y9{P8M|C&O!OjIc7cBI#(8od_3we=1u delta 7747 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 MxF`s;KM#`sACF?*761SM diff --git a/docs/pong.gif b/docs/pong.gif index 652cd7e84bbafd0978a95be2368ba7deeb019043..5ec8fe0a13031cc8f991d739b17b4be1cf3dfe0e 100644 GIT binary patch literal 132852 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 delta 254 zcmbPmfN{bB#tq4gy0;GcxEx%{a+LK0=LXi53_j@xS2BKJUdo!Vlm&?3!gU~Fw#hAw zs`~i{TV<9?wz4dhZe>*fa%7jvoaC4Q(t8-BNNA}nlzRzm)Z{aaQ9K}7vqLKxFEIPu zn5@Yp8wRl~5h(P5W2w-pl?-!Pn1S?O2IkfV5Y58e+OkvtXo+Ae>(Yi+wxunt>x zTZK`OA6PP4~8fG#xJ>!JHm5k4Xd^9)jVp6tcH9X94pl~z41ET@}lEq-# diff --git a/examples/audio_demo.nes b/examples/audio_demo.nes index b72ed1002d25cf8107c45d103b66eb5aaa9d94db..a8dee483c405cee1edaaa924ae0ce701e1eb6ce9 100644 GIT binary patch delta 189 zcmbPmfN{bB#tqGkvfZsbD-XBwuKeH1wUklQ;e*&pg{HcC;xwN_1QA{Jd+rs@Z@JqT0%mHm$GXze&Alp+RC?-t(D(r{$wTQ cos4Ch?=b7xOg3QQVcUF|;lQ`Uiv=7M0P;~u@Bjb+ delta 197 zcmbPmfN{bB#tqGkveR36RvvEUUHQM2Ybm3q!w0dI3cXAYD>-_Z9ab)yyns=ZapUA| zjB5Igz_Rz`yA6$J799p%MUGqRI3y`$&@?vG-H0Wh>v~&6%+#wt_6qU)WRE-u1-S1|3QQ#<#lmrAX9eV@FoMD z+>#e44KBKglOSZ2x4W3+Stxh8_s2Q+aN-=sIn1u%3Cb{;6l;e;KaehSDj;&Go^gly5C{n`c&+D%YNbD))ZaJzGzY+ z7DyIVKUsu)$dVhiZgsp(-aYWR&LL1`*p26FUtQdjJu82^0IusHh-t z2yBbwA)qY{OB+6jE)_b-KLKRF7EtB`(_{lCQ6*Q1B0rEKkW<8giWojXT%QP0mdGT` z1=3Xq;>t~4$fU^UaFXEyNN6ogNENK&4upG(3Bu(*4A$_ONyiPO*b&6FU8wFSDskHx$?wJ2Bwt^GZ~p?GBGV}oXO1ej1vM^GCmXWG1(l? STy4X;`!K_S-<$az7!?2noQ;+M diff --git a/examples/bouncing_ball.nes b/examples/bouncing_ball.nes index 0c92f5751e916a6a364412ae7afb1842411c5712..9959992e77d3dc8f65b6ffa81259ca0538074701 100644 GIT binary patch delta 105 zcmbPmfN{bB#tq?&-poF+2cHQn6*&1}1G7)m!IccHLOwYMkAXxOJ}?8BD;ZmbmI|L_ z1ajIBJ`-Fjc=7>IWeZ59u+OxE$3P+=mD3JxKE~)`H@SgHh4uYGh6DPW`5hP)08@4> A3IG5A delta 153 zcmbPmfN{bB#tq?&^{guyeEbitWc(oUOkkxLOyi|kAcJ)K7hn4 zAmWUzLQ92DGJ=J=A$kRu3Z8rb);kBLSJ-FQ!DAqCh~6zQy~0ZcmvAl>oXNnnl40iN UO^haXtip#F4g_!JcVJWi07{WPv;Y7A diff --git a/examples/coin_cavern.nes b/examples/coin_cavern.nes index 3e72b7f8293cbbc3ae9dce5888d315a613694370..8fcf88a589f1ad9e455d1364b00864bed6ab4579 100644 GIT binary patch delta 212 zcmbPmfN{bB#toi~vPvfzFEIP8KX{S}NX`=+!|1>`Z}M73 zy?T+Q0uq@_tpZTFTL)KuXcbt>sLAv}e5t@mkn+z5mkLyaQAwb775wt-?S>LO>H5J_rJpG6Izv9|8&quVeuV3!K~n uR2vD@dol&Y;5+n8VmI_Lw3bhJ86FPYZtVIVT%CquLtKdq;R$-t9A)uKJAH;#$ z7{S_n?LaCxfHJ}>S%9(vC%1q#rhtSsmkORt0dtE%T&ZUw$3&NkLM?0q39)ZZVk)v_ Pbv?{*pmj691ET@}`Y&mJ diff --git a/examples/comparisons.nes b/examples/comparisons.nes index c09cb40be32728546dadc2c3fceae201752accf5..84044f6270c6fa061645e05cd76d75c768ab96ef 100644 GIT binary patch delta 83 zcmbPmfN{bB#tqqwEX+Q&2Pc;@Dgzly4o+SKW}H4a`8=aC8`B0wpKAvv{{u6bePj?@^P`C3_lD)?L3Rx-A7w@L$5RREx8b+DPj*QY_GOau-54ZBJ{NKv8RO%$x2iBDg zJ}C!RGJcRKTiI4JwsN;h1Jzc5)lLAZm0HQrDz(y~ zm&suzM=!I(N}0*a7%LgoCMz&0$QKFTm<^53YOx6t)Hmi$ZCZR%M04O(Q^FBr^J65Yh3o z;|JlTf*;s{Y(bw6piHaaN|9EO76&9P^C4PRfV4C%ZJK<5QPT7{MC=007!IIb0kB?> zWr9%4-a=G;gQ}X$$E59Uc4(;pRNCke$SoiK5zhO0jRnLBz0#Y>h!L` z%;o?Z2vG=ffgsccpCQWrKvhlVVA2k@IkZ#&Ds6EHhd zXtn54k&_=Lfc%mS5@LELvJ~0)3b1~k#>rJoI$R)C8$hb$Ca+>r26OL1xEG;ZuESv2 bA5gA2n7dh?`JfH!q{9pcE^X#_U{nAA!smzL diff --git a/examples/loop_break_continue.nes b/examples/loop_break_continue.nes index fe55a6c0877a85601ede3ce7fff417d989b07cc7..f2d50c615daf75f13bac38e386c15041b7d2ed5d 100644 GIT binary patch delta 312 zcmbPmfN{bB#to&6{8By<2bZ!OW&Oakf!U|(;N&hwk9uaG!v}p-4=oj0wU>eUB*O=0 zpX&!#GCmXW*?tft#=_j%xKyB(Woct8t3u|%R#A{32XkxFQbC|#6GTvKspv_b3Cuon zhn9*#87moEg_er63ImOXnzoVwYy%_EhPXo@4$$bPm6P+CbljPJrUO+$MSwKW{Dvi* zOB-e~Fs)>m$;dR5iD_xmOlGEMoDjH@32xMdLm&>=D5l8;Ov<{;KWqhZ`ZTe0JDN|%?jWJ z=a?3PuY=|^|JVKF;_8E+A5&Xz;ikl<&Hk-zYG0go$bU!v;rmEDU$j;WR&~B!x}*3H DaBhev diff --git a/examples/match_demo.nes b/examples/match_demo.nes index 65f247f9b5526b82428e8f6649d925f6c9690f30..9343b055b93ba7e01bc2c7a6a4bc81a2824675ee 100644 GIT binary patch delta 224 zcmbPmfN{bB#to5-f=nBjeF6_26J9EClHmih&*FoV%NTW4x(}{oYvaX35QMn1K8{Haapi1GxlYcYmO8rAOX+GS&X{6(}7G*2A>57 zS2DCVEN%F}v68V>V5LZ_u#d%Ipn68I`aM8J7npt0ChulU;#WHa)}en0qGPfSlccsE zL@XR6*0i(S4GY3@|%3D={CpVJ$w)aA5Oheg{Sc0HdH}0ssI2 diff --git a/examples/metasprite_demo.nes b/examples/metasprite_demo.nes index c445d4d1e3f2ce2db0d9a5b6a656c8cd4d4c2246..50f684ded1b10f7b8cdd7c179de3a5c436334b17 100644 GIT binary patch delta 63 zcmbPmfN{bB#tos2ip)OI2cHQn6*zg~1G7)W!Ig}yLOxjskAXxKfFfB3H+L{L*-gH{ RB*Yqfh~dE8&HN6G3II+38Fl~w delta 77 zcmbPmfN{bB#tos2#;hwDe0&eCWc(oUOkkHN?0m8 z)|CuC?FUyfeo%NOv{XD zslZ9551e3S-$BaQmkLVlGHbDd@^D)Z`Ya9kj@vWTS%W$BV5r`i6XiTa3Avd4?-sy zF9Eii}km4nWmBOPNnHT;N;j-^*~Iml22__?R39YT;WsA4z1g b5wkB7>*39f%(XVGRfic4oZQUsz^DKKNK;wp diff --git a/examples/noise_triangle_sfx.nes b/examples/noise_triangle_sfx.nes index d96c03a3b2ec81742fb21e8cd3c2c422eec250d0..8bfe2177b27432a22ba96c0fbfdb41f717cefa9a 100644 GIT binary patch delta 237 zcmbPmfN{bB#tos2QOrKk2cHQn6*$@Rf!QbG;7Z0;A)l;+$3P-^K#{D2D;ZjamI|Jf z19GMvTxrnDxC!b}M zWSlbjIb)TB-JxCvhi5z&n4a-2W!Gf-P=1X2Lh%BIjeHk4fF`my_;ejQ`Tv8fPwb&p zK=}i$EI`u6%ZrtT6C}G*c=AFfEur0qfTD~axRBXVR+|1gH hLX*vzmoUn2zQe3%GuePej&0##h67IyFBWi6000vLUR(eG delta 243 zcmbPmfN{bB#tos2^{guye0&eCWc(oUOkk)EWLaVD>-`k9ai%9iaM-Z+53Tg<>B6s>?{BGeqsme zumS7X4bq{$lA%=)C_Z@`qY&e!$tM}B7-J^8Fe%8dICS#=2Unl!L#vjuYaVE20g^Ue zUaTyf2E8l}D-9<%GieFkJOmVF{J_1GwUuuvTPwd$+T{IAI!tVbC%A$-IQo WcJn@FJsYl#52jIk|$X{K)I4jB~CH|IVTPR zMHzq$_k$}nT7^~~Y8758$jR6$xH6+v1jrKwii)i~)+)}))G7#63er<_aHR(kN|}I4 z=N?SQV(c-fv8Uk1GJ~Ch#aMKu5)zpUI56i)oj2|RdGPFuOlUyo!lH~(PP!c4_ z0u+>7Dshq#ETjVzy1?x7^&n6Y16afkq)2IHXsgi5L#@I~1vwd81y@dO6#?=@fudq7 zkF|<(GPMcF)eM_{E6|kE$h@%3a7Zg6OHx8W_Y# zAZ0`pJj5TPouagoKfr8~Z8B16sNhNQpaiPWEeD9n0X0io2 z3;%?+L=;|~zTI|o%>e{GRddoCCF3=!1-tf>Df*aA6o$qmg5K4>@j1v^oUR`4eNbeQ zy}>0SF(jlK!gEC-gBd9a1?4a`7?Q3k90_CTU8tkdSO;9^p}w z=>h?`0$^YT5glJOfmP@7LI|f}Q@VztFT7Q2yvRKy1mxkm!TT~wg8MQk!T-|5<%Tkc3i3L5Zaa(bsOM4=g6;ez z@%nh41c=6~R7R0QB&CnZTo!{MYPrZ#A_4+_7wK6P3n3gRahV_^T5>ug$AflL!>4!A z5$_I78~upROd?z>ZM6?Tml(AXE|iR*S&y=q>(v~O%k`*n+GO409MoJb0Z3*wF5wj@ z=9ln#36!Q-%8oj1gU+;Kxy+62Q$61~73*<1`pW>4BQ8mA*(Ety{*Pp6H!z>aHy7yzEOxv{!D#A-;dP_SGV8Eh6ivhT1(O)h|TeQdH?Bp$a*%ON*{MIt= znXE0N8C-&eb-*kU{$z0lTKUDIGoIIwKD$6|??HOQyC0knuG2F92q|@c<70+<$2QzZ z>(svy6*?EM@F|i4l4vC5j&HEC%dk%PE-5c6H0|r?T(5{tdk9;VS>}xwhzjfA@UW)( z`!Z^RcRBBgF8aC;bXFlE+k2Qs0?b49;rU8l^M6&9JC*$RW}~0x0-rr=i&EkK`)9#~ F@dua1dkp{p delta 1130 zcmZ`(O=uHA6rTOdwrN^Z|JXMD+0vwGBSI|-6@uiTsAZ*y2meqiR-p$K@gx+IRz?&| zP1%d|Ahj~IQ!P{q_Go@IW~9~NQ9%$TP!!#h2NCML*);J`VcFU5d++<^y*I0KKh=XOKj3BJMDSoB*c-HD6%mLTU3 zMHmrRtw|~|dK3Hj zw)J!!dxuCfLr(1?C)QSB7xAIs}S_c(9euVx6XN1J)?B&nhipDj6dZ zjp78ASX8vtnd44~Bv_j$t`DGTf0IKdOyL4RFO{%jCUS5VQjdQF+Yu$ASIy7FLEwAI z1^X*U762F_L3YuBXat~U`ZJ{t5-M{CfYUigrBa6(%aAU1L{xSX0$VwBhkKdBT4Y^& z$r~Fd<4zb(#?eL9 z!tb6?16X_j7^DfDu$%ObV4{3i>I=eo^V@JrKOx^L*b91l=eq)1cMe%Ig?Xa)q_N81 z(SZR?t?f;!F@Bl&FT(z*cWpzAMxje=c diff --git a/examples/pong.nes b/examples/pong.nes index 0c1ac7ce8a8bd686cf26856838d02fd5f955ef8b..c8b76a0917e43dfc0b1a76c8dd010b25029e0073 100644 GIT binary patch literal 24592 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 Um$L-}|2zfm!T`WAvkyQ4Ao<-Zm;e9( diff --git a/examples/sha256.nes b/examples/sha256.nes index 542f205c061d07a8aa6a6d9c7d564f8f028ea029..89e4d45577be29ee0912774a2a9497ce353fcfac 100644 GIT binary patch delta 1916 zcmZ8iZERCj81C)8Wp#AWA(-2)9cP0sn~XWhh&3Uw0prI!%8*S#ffQVEokV`&eu#Dy zPY5Drdi`OD3&e3^?tT!KB_;-D7C*M$&a%7P0%A=3Ba2H+ydg#tqrvCgw)m0xR{(V zf7K5|b#FBN!HODYahLtC?qV)38!l6(A6tfmV{hJY;8P<7vH-DZG<;Nbi(@w z$=|dVU(MrY!L)DDv{mc%g`|kaz& z3*o$jf}e#mcq$XL(PgV&2>?KR*1TJx6umG^I6_KqPvDV1=&rvW((Z+ zL2wtc+9wrHN&B?#D%y`f$nZna`4Bs!6Fl}Abg^z)M7FU3eIp_Rh&;#$Ncw&d8g%6$ z^HW0OWoI4D*+tEbHd$ad}Is%!0mr5t(Y){<;a@xxGlI=ukbO`~Upq^CsNr6|AL?MgXJpZR(+fB-m!K&k6Qfhu!J0&1#}bki?eh%cdR?xC!_*Q?C=) z3w+Yl8w4%~e%sWajOmTepMx^JXlnoY)eYEnGsXku_+lyjfErJUX&>XN2n^^kH9nwi zuWXFUv}cz0baZsEIPYmFW5)};A3S@V#|w4>JL|<<61>M*fTme(v~rzPsZCYZZJsy9 z$ohDn;YIy=i}#_#8wj1?C!A1?#ZPpg3psi}r8TZmSIhLvS^g%9cCeH5=B##b%}(iE z?Xxv?$ zD59Hw-f#HP&49)G3sK1XX|Dw?CKG3fFM!L|WHLNg&8v-iRJtal)%aQO z2xR(8j!O-0yM_mf`kaNEB0%q2dKnAoUKZ9Rw!R>f?BHAgLN5~iEfPJ#dyz&hrU~Yd zMy1s`tXooDo<~6*6-p2CY|n|dm-7R5J87^OahBp}j_kGQ`5Y(CUZir)aKvqxL%&Xnt8=_Fw_u9Ut0gZ<&**MU_Gd9!^orl`R_kk7IOc59 zw(BzeGcRHbYbM>E3>Q~w$8D@stBsq7h6N<`kGXIkrJP8Ui1>?v3Nc{(t0c@4mEvP( YpE%brcBN{Iv|{L==_veG*%aRuL zX8*Igm$<~ls5AG&Wy!?3Y)dwbA13gq2yLNR+~)kC&Di|#mTYEAT--VLwTKeoo%=h# z^SkHVbMB3?D{>6}z3sR_Z9IKq)c^Dx8r1%oa#p%%`^ZVAubA`qm`xorsg2o(Bx;|T zzs)}e){TqPALiApO)<&5&m}4`yCKcnwP#a?44?i*!v-Hm`qB|+K;G=&l6G>M%Vr6C zhAL#wG}{F4R&WU>Wk4-dVz5B7=ZU+>zUrWqky$Z-h<6OxZuAJe? z8Qz>xnlsd#;m;Z{1xC9Vz8&+hUpXxInh~csq?ZxNXG(CXT^*8<*({hNIp${5BEGv! zY*vRVkVs4{;Vj~IUXRFnfqZEp4T!h|@`Hs05OE76J-=6ktqt)efyPkl59H$}cvMe%oA#mJ0bs)g{WZY` zy1Ke(m<^U6Kt$DzAa>5IdCh6(&U{UnSY0F38dzyfdnwDN)NX%U1B2 z1?+W5v5UT;?M&*ECC|$@_54*0jS~1W!`kgcNEE1see}rKM9dLl<%V}0qkqI`S?^i3 zI*7}^#WFNm&dTv-5CwA_VIziDjT~Pca|hmd5)S;Dooyr+u2@PU_<>TFGTvZINY@ zWPCt(3H5KX>XFB3F3?n$HGj!zs@m@IbpM0OBBs-NY zNXsL?CAGr~EJCuAxgF6eINn@2{Rp@re>-_$QQJO+YuNKLK61WG$Q^ixGqu_XI5HL5y+x4n3+e@=23bXL z$>WZ=X&va)v-+$~+|sF2!}YX5==^&f1nRZRIUVxP9JfJN?qgS=6!;4YRlJl|hQ$1~ zj^jy`rePN`zhZW+84Vx^bG|&zTb@H?6AW{k2@kNgGYuxmm*Cb%1rS2On*|E7QSko+ avNnZ#-@4RO_D&#g?uK;bt)I?&+sOZFWMw4) diff --git a/examples/state_machine.nes b/examples/state_machine.nes index 9d5856f37a78c1146f84319a12a7063ce3e162b7..97bbefacfc1c7d56f4505054d9dca03198fe4feb 100644 GIT binary patch delta 167 zcmbPmfN{bB#tk-%oQDpcWV*oYlXGZt2b1jNBt``eW}g`cSEjT!OrF3fFV=9<<^$6P zW}n3emojP!eBfHi*vhQ1ZSrZxJUfuE$)TkJ5}91B0xOw-;+cnhBoD4sXl($hRcLJj zs%8L+S{ww5F5z6-G?Rg8CBsZcrkPAkOB*KFGI_9pjM#i=@mNP=N0qo%+Iu9b|f%nFAl?`O<&fk+x30!j)l6_Ci}Y86alk?q@jo=Mr3 PRqQasfw0Z|4vY!_$9G3j diff --git a/examples/structs_enums_for.nes b/examples/structs_enums_for.nes index 16185999fc3c3bc4b7efa0bd27f0cc861486ad60..5ba42639ba1cada47f6560491b62a5673e40c537 100644 GIT binary patch delta 61 zcmV-D0K)%}zyXlJ0kGi#9|KGR!leb delta 62 zcmV-E0Kxx|zyXlJ0kGi#B?YMfOxeMy0q`xQ5vsih1BHO45TpsE5Sai1sQ{S)0+|8= UrGT;m1U>~z!T`XFvkyQ4Ao_F`5C8xG diff --git a/examples/two_player.nes b/examples/two_player.nes index 4e5c36ecd1e70caff98c275676ba99429ec6e8aa..455be483bc8e76c9b03564d3987794bca3b45894 100644 GIT binary patch delta 54 zcmV-60LlN5zyXlJ0k9te1OrSq!jmZiC=UZnV#1{pIOzz5gQN+igR^D=q&<@m0}KV7 M!T`YCvkyQ4Apg}8w*UYD delta 62 zcmbPmfN{bB#trgJT&yb@e8dl}Wc;8!S(!;g6vXuebC(KRyyR$YTEe-sX>%0Q5?j`l OhZqjL+|2L5r~m-7mlmx6 diff --git a/examples/uxrom_banked.nes b/examples/uxrom_banked.nes index 3b3aac32330dc3ca5208bb85fe0e63377fb505ef..a5e60309fe7998c0ffa042807ff41178777c0e2b 100644 GIT binary patch delta 102 zcmbPmfOWzF)`l&N(TsLX8<>4U53Xcr68lwT)fqQ$zs$&JZZ}aui1qa$h6CE$`5hP;6#!%CBf|gy delta 117 zcmbPmfOWzF)`l&N(To9{8(3E|_=Fx@$@qa~B}1#wQbtY24@}PlfHczw;iUp689zXj zRDhH)9Ro?Q02K%VX%3(QLAZjMUGBT<&9^HPBkWEp;ahhqv1{a#R3fp0Qt@v82|tP diff --git a/examples/uxrom_user_banked.nes b/examples/uxrom_user_banked.nes index 552aa1a0132a8f2d1a107b02a83241aa97d9061a..a71fe7eb0e97d0afda4072d1d720e923e61b3610 100644 GIT binary patch delta 58 zcmbPmfN25{iK;RCNH;taTq<~S+6QJIiH4PotwKIp4aYztc|Z}ZhLsGhLJ1oK_uEfQ K5L+zZkN^OX*A^Q9 delta 73 zcmbPmfN25{iCVC(Wbol_SjqT7;+f!5!IRTIfCS_~0xT;TTZMdV8jgX)^T6U}5OIc9 Pp@fZ&hwT>&I3xf75|TWY_~CSX3D??nHfIa);8HD8ycE6owl3ZY`PozoO3V3 z0Gbk#d(U&;=ly=qxzm5&-jDy+T(2^RczEk-N%foZg^?dS-?shI(dW@d?x$0qaEHGq z%^aNc*ccg2eI$-U>d~!{P^B@-ZRyX2joCOcY$-ywjv015PK+B4JWeGHg2yXU`eAzk zCG;B+-gNLi*2J3(Tbj_b5pi2C*sc(FD&(p}c2O4LP7@5?A@mKb8s~$M3GpH&_S1-- zv=@H;dlBZ37x6vVVa?p{KUu__8o<2+y!kB~5%#&F5HD7Yzea>TBy1rb7`PWCtc3^s zJ$6$%5HIE}QpG-iCyOPhw>qlAgnl*3TL*WUqcrQGjI{*zG z^!rj#xSd{!N=t|MA!7uTr()XvNY!4}X+9|LG=hMAF-{j>ItT9A2K>n%?$BV{vNM|oKZ+flGY*%0Tsi(TO7fnR{OLR0d*X%R?Rcr%bR zDTVSfh%_mY4HcT8b*AJ+Q=LRi!yJgzCK1ayAX1w|Ol?v|W6xznAzq;x z{heW6?(cE3a{6<;HO}LWZ&N$J8|GW(&Q=;7*7tk29hc?$&#*uyM2jktniYxWjEGbQ zRRWDDNfA8$?~vM&%VM<*X}2TnRZK`}G^G74!oDkC2UFgU?YpF=%cF9CBdZj4R<&qK z7KVAW*s!SVbF>I=A88REu{B~=|J+v+l(dmisjJkYS-wDp8`Q@VpUP6(x4G1X+ND;on3;@gFf?SNSI%4)GZVe9+E)Ay-IEHEF4&U77!j($S_@?dTS zExc6aRlF-{L_-78_WB$fyUwqt{d_yy^zM&H)dKqIJPuz*wBzG65aHFvPE_e@w4iX$cTcP4-Ly%ezDUyT-TacPE z8dkD$q+U;|2D^eFHzF!M#y2Z>UQ1@&*^^W`vE1=m?i@~XuPVKCNA|)ulhV~38?HtZ zxF7-99HzssjM5uWsvHjANNQLsF9^ICTIt1O1BfPZx|#tfrV~tCYK8x5NMtyrW;kVr zhSUv7lW(W%w!6yk17YQB^!YBe5a(w4g)(6t|_wDm0IvTWaCbZze=ewm&)0m^YOb&g1=&qfjxavMVo% zPbaj>5$n2i6Y84Op4IE}^LOp;OUvr~3nyaVzdbN1+v@BRZ_nfskI>F1(qxu?wM6S( zM!RLv!mF(LK>N(35jr#Zq#pR^K}l4`YFhG5`Po delta 4020 zcma)9Yiv}<72e&uFRvefW1IDw#|0ZdfH)>Gen1Ltf^9GthZb4_sOqLM#0J_pA(7G- z>ynIwnp%b4AB`$dQK|`y+o(p48vc;tb-nDx3Et8g<4Q??w6cV%wi{^Ehf>k+%*<{U z3~4P(_nz;Z^PMwi&YU}Y{G$6f{=en>Df5V#6W>|1YJy&v@w)f4>zrpWU?wl7Qy+0p zxG&8-+~{*L<8tbc;#F9^e5qkrxwzrDQigSD!g1sA$Q8$f$Novjz~g&U z_I7va0iSSLUm6wew4b+bInP>otK&)&_&kALafTrFaFlyB{$0WYz#q1LILf_B)i_Kp zT=95YZZyI^%FDIO1;P#coV)DHuZ^;BqMUyQdbWXw!~4pa*95q6h;KOMGK71!JjyGy zpFd81!W|W^D31(XXf#+GkA(Z&$|sVj;B7?oS%CX02((R4U5rxMN3O+u)6j)p1Bwrj z!R#jM$vCRA2z0ESw~sG6PL|(SmhIZI2I6eHbyQorSqH2;d52S&4oLf7l6^D4&3v=t zmC#j!7W0k}{@9k7Z!>$DcMkEFv7p&b&~3KHiM7KTj#KO|-sL2vV`vPHJIu#N>o&5j z>S6J%PNP)Tkn$mJX|ah!lW!fm;4;`YZpr5WWIlj6koh)Mz$dz_|HwGqyxWOLs^`cz zB2cAn?bc0hjRvynwtB{pR9HkjFR9$h>Z}P2@qlfvP0965v5B;nE=)LkOY#bcZgSo`@F2miX?ee%MHBo z8m+HU`W2*KVXaHr6M>rjYU_GPl`p_7+T>Qrlc#h8N|(y&q*)6#q#P@GDj`TiVuci= z=J+W422R>z@u*o8XWyjP5i9sNcTDlUa~ZK7Bdf)%R=8PRCM@j{3z+MZqIS^JCW3=T znyMt3?m0WTLk5q=>3g3Xkjr(W^z(qM~1msw>1xS~QgLF)jL)cwC7wM5T@w zuW5CG5>IPU^^(gjzL4IY7Ina_)0nBnCK1f zW6a)DP~AkGt!F=~linTd_W(@FeVX zK}qdBwjcK1bTjNda-h8-t?j=SlrFxv@c_2UZT-PsR#@KhZ47^Am~~gI$S7asJUC35 z6kI{PF!Eda=1HUOHrh4U43_5W_MyUBxy5_Q_7T`V#Ow7m{u)8%Z2hM*T%BS-z%l=a453}vJtzKb0F7BF`Mba zNd&CI0dL~VOXq}@}rCiaCSUyfAB z*M=5*`1eU}YJ`)0E3d4}0KXt0AM?^HlCmGLeQHOpP2zQao{KTg(uVo-%ht_FUg?y` zxPK-$3HD4OoH~V`6u?-m`R_}-3L|g@`1}dD%$F`pNgG6}ayVGhPaV@%XprW+DcP0- zm{f~Vm|J6fna+9-x$e!$`XB-MacBQ3SVjGDScuz6I^RU#P%c$K zQjKM({vW2aV!{$NQ%rSsP*N5C261-&uN|)oI_j)HO6K{}d^-+LJc+h!7^ai_MbZRC zUT(H|GDJT#=!T*x9c5eQ^vqqmYKhZCwMFic`U0LKz%YN7%(+vHE9`CibaBb1-a-6| zm>K*KU-!YA0pz6G`JZMB?LrxSpME^l2O<@OF!?qIc=XU-I%xG zx^p|-ZY{WOr%OwHr||pvx*aO3e&E^bJWz)-!+orX``J9}<7xZxvQ?gw*GKxxI((jy X>5=ml%a;2m-gjN>|KKO{+syw0H*#nq diff --git a/src/codegen/ir_codegen.rs b/src/codegen/ir_codegen.rs index fe01a5b..85fa954 100644 --- a/src/codegen/ir_codegen.rs +++ b/src/codegen/ir_codegen.rs @@ -965,7 +965,48 @@ impl<'a> IrCodeGen<'a> { fn gen_block(&mut self, block: &IrBasicBlock) { self.emit_label(&format!("__ir_blk_{}", block.label)); - for op in &block.ops { + // Look for the canonical "compare-then-branch" fusion + // candidate: the block's last op is an 8-bit `CmpX`, its + // destination temp is the same one the terminator + // branches on, and that temp has no other uses. When + // it's a fit, we can replace the boolean materialization + // (LDA #0 / JMP / LDA #1 + BNE) with a direct branch on + // the flags `CMP` already set — about 6 cycles + 5 bytes + // saved per condition. + let fuse_cmp_branch = block + .ops + .last() + .and_then(|op| match (op, &block.terminator) { + ( + IrOp::CmpEq(d, a, b) + | IrOp::CmpNe(d, a, b) + | IrOp::CmpLt(d, a, b) + | IrOp::CmpGt(d, a, b) + | IrOp::CmpLtEq(d, a, b) + | IrOp::CmpGtEq(d, a, b), + IrTerminator::Branch(cond, true_lbl, false_lbl), + ) if cond == d && self.use_counts.get(d).copied().unwrap_or(0) == 1 => { + let kind = match op { + IrOp::CmpEq(..) => CmpKind::Eq, + IrOp::CmpNe(..) => CmpKind::Ne, + IrOp::CmpLt(..) => CmpKind::Lt, + IrOp::CmpGt(..) => CmpKind::Gt, + IrOp::CmpLtEq(..) => CmpKind::LtEq, + IrOp::CmpGtEq(..) => CmpKind::GtEq, + _ => unreachable!(), + }; + Some((*a, *b, kind, true_lbl.clone(), false_lbl.clone())) + } + _ => None, + }); + + let body_ops = if fuse_cmp_branch.is_some() { + &block.ops[..block.ops.len() - 1] + } else { + &block.ops[..] + }; + + for op in body_ops { self.gen_op(op); // After each op runs, decrement use counts for its // source temps. When a count hits zero the temp's slot @@ -976,6 +1017,32 @@ impl<'a> IrCodeGen<'a> { self.retire_op_sources(op); } + if let Some((a, b, kind, true_lbl, false_lbl)) = fuse_cmp_branch { + // Emit the fused compare + branch *first*. Retiring + // a/b before the emit would free their slots while + // the values are still live — `load_temp(a)` would + // then re-allocate `a` to whatever slot the free + // list pops next, which contains stale data. + self.gen_cmp_branch(a, b, kind, &true_lbl, &false_lbl); + // Now that the CMP has read both operands, drop their + // use counts the same way `retire_op_sources` would + // for a non-fused Cmp op. The destination temp's + // single use was the (skipped) Branch terminator — + // retire it too so its slot returns to the free list. + self.dec_use(a); + self.dec_use(b); + if let IrOp::CmpEq(d, ..) + | IrOp::CmpNe(d, ..) + | IrOp::CmpLt(d, ..) + | IrOp::CmpGt(d, ..) + | IrOp::CmpLtEq(d, ..) + | IrOp::CmpGtEq(d, ..) = block.ops.last().unwrap() + { + self.dec_use(*d); + } + return; + } + // The terminator may also reference a temp (branch // condition, return value). Those temps die after the // terminator runs; retire them here so they don't leak @@ -986,6 +1053,94 @@ impl<'a> IrCodeGen<'a> { } } + /// Emit a fused "compare + direct branch" sequence. Replaces + /// the canonical boolean-materialization-then-branch pattern + /// the IR emits for `if x < N { ... }`-style conditions, when + /// `gen_block` detects the comparison's result feeds straight + /// into the block's terminating branch and isn't read again. + /// + /// 6502 relative branches have a ±128-byte range. The fused + /// branch's destination is the next basic block, which in + /// larger programs is often farther than that. To stay safe + /// regardless of distance we emit the *inverted* predicate + /// as a short branch that skips over a `JMP true_target`, + /// with the false target reached by a fall-through `JMP`. + /// Both `JMP`s are absolute addressing and have no range + /// limit; the relative branches only have to clear the next + /// 3 bytes (the `JMP`), which always fits. + /// + /// For the simple cases (`Eq`, `Ne`, `Lt`, `GtEq`) one + /// inverted branch does it. For `Gt` and `LtEq` the predicate + /// is a disjunction/conjunction of two flag conditions, so + /// the inversion needs two branches. + fn gen_cmp_branch( + &mut self, + a: IrTemp, + b: IrTemp, + kind: CmpKind, + true_label: &str, + false_label: &str, + ) { + self.load_temp(a); + let b_addr = self.temp_addr(b); + self.emit(CMP, AM::ZeroPage(b_addr)); + + let suffix = self.local_label_suffix(); + let skip_label = format!("__ir_cmp_skip_{suffix}"); + let true_blk = format!("__ir_blk_{true_label}"); + let false_blk = format!("__ir_blk_{false_label}"); + + match kind { + CmpKind::Eq => { + // Predicate true ↔ Z set; inverted = BNE. + self.emit(BNE, AM::LabelRelative(skip_label.clone())); + self.emit(JMP, AM::Label(true_blk)); + self.emit_label(&skip_label); + } + CmpKind::Ne => { + self.emit(BEQ, AM::LabelRelative(skip_label.clone())); + self.emit(JMP, AM::Label(true_blk)); + self.emit_label(&skip_label); + } + CmpKind::Lt => { + // Predicate true ↔ C clear; inverted = BCS. + self.emit(BCS, AM::LabelRelative(skip_label.clone())); + self.emit(JMP, AM::Label(true_blk)); + self.emit_label(&skip_label); + } + CmpKind::GtEq => { + self.emit(BCC, AM::LabelRelative(skip_label.clone())); + self.emit(JMP, AM::Label(true_blk)); + self.emit_label(&skip_label); + } + CmpKind::Gt => { + // Predicate true ↔ (C set AND Z clear). On Z + // set, fall through to false. On C clear, fall + // through too. Otherwise jump. + self.emit(BEQ, AM::LabelRelative(skip_label.clone())); + self.emit(BCC, AM::LabelRelative(skip_label.clone())); + self.emit(JMP, AM::Label(true_blk)); + self.emit_label(&skip_label); + } + CmpKind::LtEq => { + // Predicate true ↔ (C clear OR Z set). On + // either, jump to true. Otherwise fall through. + let to_true = format!("__ir_cmp_t_{suffix}"); + self.emit(BEQ, AM::LabelRelative(to_true.clone())); + self.emit(BCC, AM::LabelRelative(to_true.clone())); + self.emit(JMP, AM::Label(false_blk.clone())); + self.emit_label(&to_true); + self.emit(JMP, AM::Label(true_blk)); + self.emit_label(&skip_label); + // Already emitted JMP false_blk in the match + // arm; skip the trailing fall-through one below. + return; + } + } + // Fall-through path lands here for the false case. + self.emit(JMP, AM::Label(false_blk)); + } + #[allow(clippy::too_many_lines)] fn gen_op(&mut self, op: &IrOp) { match op { @@ -3900,21 +4055,30 @@ mod more_tests { #[test] fn ir_codegen_local_label_suffix_is_bank_namespaced() { // When two banked functions in *different* banks both emit - // a local label like `__ir_cmp_e_`, the suffix has to - // include the bank name so the linker's discovery pass - // (which checks for cross-bank label collisions) doesn't - // panic on the second occurrence. Without the namespacing - // step, this exact program used to fail at link time with - // `duplicate label '__ir_cmp_e_8' across switchable banks`. + // a local label, the suffix has to include the bank name + // so the linker's discovery pass (which checks for cross- + // bank label collisions) doesn't panic on the second + // occurrence. Without the namespacing step, this exact + // program used to fail at link time with `duplicate label + // '__ir_shift_loop_8' across switchable banks`. + // + // We use a shift-by-variable here instead of an `if` + // because the cmp/branch fusion in `gen_block` collapses + // most `if` patterns into direct branches without local + // labels. Variable-amount shifts always need a loop label + // (gen_shift_var emits one), which gives the test a + // stable label-emission pattern regardless of future + // codegen optimizations. let (prog, _) = parser::parse( r#" game "T" { mapper: UxROM } var x: u8 = 0 + var n: u8 = 0 bank A { - fun a_fn() { if x == 0 { x = 1 } } + fun a_fn() { x = x << n } } bank B { - fun b_fn() { if x == 0 { x = 2 } } + fun b_fn() { x = x << n } } on frame { a_fn() b_fn() } start Main @@ -3931,7 +4095,7 @@ mod more_tests { .expect("A stream") .iter() .filter_map(|i| match &i.mode { - AM::Label(l) if l.contains("__ir_cmp") => Some(l.clone()), + AM::Label(l) if l.contains("__ir_shift") => Some(l.clone()), _ => None, }) .collect(); @@ -3940,17 +4104,17 @@ mod more_tests { .expect("B stream") .iter() .filter_map(|i| match &i.mode { - AM::Label(l) if l.contains("__ir_cmp") => Some(l.clone()), + AM::Label(l) if l.contains("__ir_shift") => Some(l.clone()), _ => None, }) .collect(); assert!( !a_labels.is_empty(), - "bank A should emit at least one cmp label" + "bank A should emit at least one shift label" ); assert!( !b_labels.is_empty(), - "bank B should emit at least one cmp label" + "bank B should emit at least one shift label" ); for a in &a_labels { assert!( diff --git a/tests/emulator/goldens/audio_demo.audio.hash b/tests/emulator/goldens/audio_demo.audio.hash index 178a8d6..220a846 100644 --- a/tests/emulator/goldens/audio_demo.audio.hash +++ b/tests/emulator/goldens/audio_demo.audio.hash @@ -1 +1 @@ -95b6d6d4 132084 +7b16a9db 132084 diff --git a/tests/emulator/goldens/friendly_assets.audio.hash b/tests/emulator/goldens/friendly_assets.audio.hash index cf37b43..d5069db 100644 --- a/tests/emulator/goldens/friendly_assets.audio.hash +++ b/tests/emulator/goldens/friendly_assets.audio.hash @@ -1 +1 @@ -c49fe29d 132084 +e73a6a73 132084 diff --git a/tests/emulator/goldens/noise_triangle_sfx.audio.hash b/tests/emulator/goldens/noise_triangle_sfx.audio.hash index 5c09402..7efa628 100644 --- a/tests/emulator/goldens/noise_triangle_sfx.audio.hash +++ b/tests/emulator/goldens/noise_triangle_sfx.audio.hash @@ -1 +1 @@ -8fd9f7d2 132084 +ea38044c 132084 diff --git a/tests/emulator/goldens/platformer.audio.hash b/tests/emulator/goldens/platformer.audio.hash index e804230..e30b406 100644 --- a/tests/emulator/goldens/platformer.audio.hash +++ b/tests/emulator/goldens/platformer.audio.hash @@ -1 +1 @@ -f5c17e60 132084 +dded3a6a 132084 diff --git a/tests/emulator/goldens/pong.audio.hash b/tests/emulator/goldens/pong.audio.hash index a2cbdb1..366ceee 100644 --- a/tests/emulator/goldens/pong.audio.hash +++ b/tests/emulator/goldens/pong.audio.hash @@ -1 +1 @@ -9b06b3fc 132084 +a7ce9d12 132084 diff --git a/tests/emulator/goldens/pong.png b/tests/emulator/goldens/pong.png index 1ad74020a4aca0884ba1d58745e59b460c19bca1..cb226caad34dfb5cf6885563a344ef2d21fdc3d0 100644 GIT binary patch literal 1012 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5K5(!B$@kNDon~NQ-tFn)7*fIb_Ta@;vJs*z z2k!a)`#*hpOyUE99)7iphOwdgCs}7)Vc0B{5XO8at09utU^Qc!>47zDGp^zg+}HZQ zYxn8p-{b7=#@g-u{z-l3?wYFiPcPqndbwKvPaW_6yLX?SuGW9Qw`S+=KTqF%db)S| z_qcs`V*iPhPX~(b`ThwgIDPkNpy<8opGD;lzh^_O-K!#Aw;PYqV5b_qepghU7>?=K zxJldwD+#zAzb`kx(<>J*!}R=X)twBJ@oOazYQxvjUv>AN0LT1+^@Zg>zuY^${=y%o z^6BsI#x~3^FaLS(?$hv$x=VMTy1&yqQ2*}TC*|_#^KqptlpwCVCvZgPCem3flX{bwgahEkQDo1{=MqR%YT-9kE?sKSNuo)r+cTr z1Cv>N<@=}ZKsr+Y*r0{;1v!PQT$lro{twJosMm{%LuIr`~}jxU&F? wLow3}C0#M)KAf4X`1>Gbz|KYTa+Q(8Wq|NY)Q-#Gtn& z_o{yul>gLwrzd}}y7K+g!*`#`Bh(zae;sOBm8Tv^^Le21H}5{(tk%DO^6t~k-{b6d z@2>fFkGuZ9cM+qS>6u--@5J7~;=t)on0$!z1a|KpUbFl3-PTylPyjmYz!H3cg55l% zFvaKSnoNkFg{2;N@810f=yi3I1Jg^(e@@+f`aL-wn*R0P>GiBt z{XMSk+r87}UzO`mRO^3`-Sd6ZBF416D&h%2NRfv>LtqP@w7aqI^xj~`-8FCuCdRz~ YjQej+-Wpzz5CY25p00i_>zopr02YzfrT_o{ diff --git a/tests/emulator/goldens/sfx_pitch_envelope.audio.hash b/tests/emulator/goldens/sfx_pitch_envelope.audio.hash index a0cd7b3..f4d7072 100644 --- a/tests/emulator/goldens/sfx_pitch_envelope.audio.hash +++ b/tests/emulator/goldens/sfx_pitch_envelope.audio.hash @@ -1 +1 @@ -61bd9e17 132084 +eec31111 132084 diff --git a/tests/emulator/goldens/war.audio.hash b/tests/emulator/goldens/war.audio.hash index 77ed459..92f256b 100644 --- a/tests/emulator/goldens/war.audio.hash +++ b/tests/emulator/goldens/war.audio.hash @@ -1 +1 @@ -62c8ca6b 132084 +d6cf6f66 132084