@@ -318,6 +318,121 @@ fun test24(uns: bool) {
318318 }
319319}
320320
321+ fun builder.my_storeRef(mutate self, value: cell): self
322+ asm(self value) "STREFR";
323+
324+ fun builder.my_storeAddress(mutate self, value: address): self
325+ asm(value self) "STSLICE";
326+
327+ fun builder.my_storeBuilder(mutate self, value: builder): self
328+ asm(value self) "STB";
329+
330+ fun my_PUSHINT_SWAP_STU(mutate b: builder): void
331+ asm "5 PUSHINT" "SWAP" "8 STU";
332+
333+
334+ @noinline
335+ fun demo30(value: cell, dest: builder) {
336+ // SWAP + STREFR => STREF
337+ return dest.my_storeRef(value);
338+ }
339+
340+ @noinline
341+ fun demo31(dest: builder, value: cell) {
342+ // SWAP + STREF => STREFR
343+ return dest.storeRef(value);
344+ }
345+
346+ @noinline
347+ fun demo32(dest: builder, value: builder) {
348+ // SWAP + STB => STBR
349+ return dest.my_storeBuilder(value);
350+ }
351+
352+ @noinline
353+ fun demo33(value: builder, dest: builder) {
354+ // SWAP + STBR => STB
355+ return dest.storeBuilder(value);
356+ }
357+
358+ @noinline
359+ fun demo34(dest: builder, value: address) {
360+ // SWAP + STSLICE => STSLICER
361+ return dest.my_storeAddress(value);
362+ }
363+
364+ @noinline
365+ fun demo35(value: slice, dest: builder) {
366+ // SWAP + STSLICER => STSLICE
367+ return dest.storeSlice(value);
368+ }
369+
370+ @noinline
371+ fun demo36(x: int) {
372+ var b = beginCell();
373+ if (x > 0) {
374+ // inside IF: N PUSHINT + SWAP + L STU => N PUSHINT + L STUR
375+ my_PUSHINT_SWAP_STU(mutate b);
376+ }
377+ return b;
378+ }
379+
380+ @noinline
381+ fun demo37(op: int32, u: int8 | int256) {
382+ var b = beginCell();
383+ // b.storeUint(input.op, 32);
384+ if (u is int8) {
385+ // inside IF: SWAP + 0 PUSHINT + 3 STUR => 0 PUSHINT + 3 STU
386+ b.storeUint(0, 3);
387+ b.storeUint(u, 8);
388+ }
389+ return b;
390+ }
391+
392+ @method_id(130)
393+ fun test30() {
394+ return (demo37(10, 88 as int8), demo36(50));
395+ }
396+
397+ @method_id(131)
398+ fun test31() {
399+ var s = createAddressNone();
400+ var dest = beginCell().storeUint(3, 32);
401+ assert(demo35(s as slice, dest).endCell().hash() == demo34(dest, s).endCell().hash()) throw 300;
402+ var r1 = demo35(s as slice, dest).endCell().hash();
403+ var b = beginCell().storeUint(0xFF, 16);
404+ assert(demo33(b, dest).endCell().hash() == demo32(dest, b).endCell().hash()) throw 301;
405+ var r2 = demo33(b, dest).endCell().hash();
406+ var r = createEmptyCell();
407+ assert(demo30(r, dest).endCell().hash() == demo31(dest, r).endCell().hash()) throw 302;
408+ var r3 = demo30(r, dest).endCell().hash();
409+ return [r1 & 0xFFFFFFFF, r2 & 0xFFFFFFFF, r3 & 0xFFFFFFFF];
410+ }
411+
412+ @method_id(132)
413+ fun test32(p: int) {
414+ var b = beginCell();
415+ var x = p + 10;
416+ b.storeUint(x, 32); // SWAP + n STU => n STUR
417+ return b;
418+ }
419+
420+ @method_id(133)
421+ fun test33(p: int) {
422+ var b = beginCell();
423+ var x = p + 10;
424+ b.storeInt(x, 8); // SWAP + n STI => n STIR
425+ return b;
426+ }
427+
428+ @method_id(134)
429+ fun test34(p: int, n: int) {
430+ var b = beginCell();
431+ var x = p + 10;
432+ b.storeInt(x, n); // no changes, it's STIX
433+ return b;
434+ }
435+
321436fun main(): int {
322437 return 0;
323438}
@@ -347,6 +462,11 @@ fun main(): int {
347462@testcase | 123 | 0 | 255
348463@testcase | 124 | -1 | 8
349464@testcase | 124 | 0 | 10
465+ @testcase | 130 | | BC{00030b10} BC{000205}
466+ @testcase | 131 | | [ 225345949 901620178 1560646286 ]
467+ @testcase | 132 | 0 | BC{00080000000a}
468+ @testcase | 133 | 0 | BC{00020a}
469+ @testcase | 134 | 0 8 | BC{00020a}
350470
351471We test that consequtive storeInt/storeUint with constants are joined into a single number
352472
@@ -378,15 +498,13 @@ We test that consequtive storeInt/storeUint with constants are joined into a sin
378498@fif_codegen
379499"""
380500 test19() PROC:<{
381- NEWC
382501 123 PUSHINT
383- SWAP
502+ NEWC
384503 4 STI
385504 16 PUSHPOW2DEC
386505 16 STUR
387506 -1 PUSHINT
388- SWAP
389- 8 STI
507+ 8 STIR
390508 }>
391509"""
392510
@@ -411,9 +529,9 @@ We test that consequtive storeInt/storeUint with constants are joined into a sin
411529 test22() PROC:<{
412530 NEWC // '2
413531 NEWC // b1 b2
414- SWAP // b2 b1
415532 2056 PUSHINT
416- 24 STUR // b2 b1
533+ ROT
534+ 24 STU // b2 b1
417535 SWAP // b1 b2
418536 10141514286835656557042350424064 PUSHINTX
419537 132 STUR // b1 b2
@@ -437,4 +555,87 @@ We test that consequtive storeInt/storeUint with constants are joined into a sin
437555 }>
438556"""
439557
558+ @fif_codegen
559+ """
560+ demo30() PROC:<{ // value dest
561+ STREF // dest
562+ }>
563+ demo31() PROC:<{ // dest value
564+ STREFR // dest
565+ }>
566+ demo32() PROC:<{ // dest value
567+ STBR // dest
568+ }>
569+ demo33() PROC:<{ // value dest
570+ STB // dest
571+ }>
572+ demo34() PROC:<{ // dest value
573+ STSLICER // dest
574+ }>
575+ demo35() PROC:<{ // value dest
576+ STSLICE // dest
577+ }>
578+ """
579+
580+ @fif_codegen
581+ """
582+ demo36() PROC:<{ // x
583+ NEWC // x b
584+ SWAP // b x
585+ 0 GTINT // b '4
586+ IF:<{ // b
587+ 5 PUSHINT
588+ 8 STUR // b
589+ }> // b
590+ }>
591+ """
592+
593+ @fif_codegen
594+ """
595+ demo37() PROC:<{
596+ NEWC
597+ s3 POP
598+ 42 EQINT
599+ IF:<{
600+ 0 PUSHINT
601+ ROT
602+ 3 STU
603+ 8 STU // b
604+ }>ELSE<{
605+ DROP // b
606+ }>
607+ }>
608+ """
609+
610+ @fif_codegen
611+ """
612+ test32() PROC:<{ // p
613+ NEWC // p b
614+ SWAP // b p
615+ 10 ADDCONST // b x
616+ 32 STUR // b
617+ }>
618+ """
619+
620+ @fif_codegen
621+ """
622+ test33() PROC:<{ // p
623+ NEWC // p b
624+ SWAP // b p
625+ 10 ADDCONST // b x
626+ 8 STIR // b
627+ }>
628+ """
629+
630+ @fif_codegen
631+ """
632+ test34() PROC:<{
633+ NEWC
634+ s0 s2 XCHG
635+ 10 ADDCONST
636+ -ROT
637+ STIX
638+ }>
639+ """
640+
440641 */
0 commit comments