comparison doc/disas_examples/ppc.darwin.disas @ 473:ead041d93e36

- ppc doc and disas examples related to aggregates
author Tassilo Philipp
date Wed, 16 Feb 2022 16:44:11 +0100
parents 74c056b597b7
children cb19b2fe2422
comparison
equal deleted inserted replaced
472:e5820b7a3fbc 473:ead041d93e36
403 258: 80 01 00 08 lwz 0, 8(1) ; | 403 258: 80 01 00 08 lwz 0, 8(1) ; |
404 25c: 7c 08 03 a6 mtlr 0 ; | epilog 404 25c: 7c 08 03 a6 mtlr 0 ; | epilog
405 260: bb c1 ff f8 lmw 30, -8(1) ; | 405 260: bb c1 ff f8 lmw 30, -8(1) ; |
406 264: 4e 80 00 20 blr ; | 406 264: 4e 80 00 20 blr ; |
407 407
408
409
410 ; ---------- structs by value ---------->
411 ;
412 ; struct A { int i, j; long long l; };
413 ;
414 ; void leaf_call(int b, int c, int d, int e, struct A f, int g, int h)
415 ; {
416 ; }
417 ;
418 ; void nonleaf_call(int a, int b, int c, int d, int e, struct A f, int g, int h)
419 ; {
420 ; /* use some local data */
421 ; char l[100] = { 'L' };
422 ; leaf_call(b, c, d, e, f, g, h);
423 ; }
424 ;
425 ; int main()
426 ; {
427 ; nonleaf_call(0, 1, 2, 3, 4, (struct A){5, 6, 7ll}, 8, 9);
428 ; return 0;
429 ; }
430
431
432
433 ; output from darwin-8.0.1-ppc w/ gcc 3.3
434
435 _leaf_call:
436 00000000 stmw r30,0xfff8(r1)
437 00000004 stwu r1,0xffd0(r1)
438 00000008 or r30,r1,r1
439 0000000c stw r3,0x48(r30)
440 00000010 stw r4,0x4c(r30)
441 00000014 stw r5,0x50(r30)
442 00000018 stw r6,0x54(r30)
443 0000001c stw r7,0x58(r30)
444 00000020 stw r8,0x5c(r30)
445 00000024 stw r9,0x60(r30)
446 00000028 stw r10,0x64(r30)
447 0000002c lwz r1,0x0(r1)
448 00000030 lmw r30,0xfff8(r1)
449 00000034 blr
450 _nonleaf_call:
451 00000038 mfspr r0,lr
452 0000003c stmw r30,0xfff8(r1)
453 00000040 stw r0,0x8(r1)
454 00000044 stwu r1,0xff30(r1)
455 00000048 or r30,r1,r1
456 0000004c bcl 20,31,0x50
457 00000050 mfspr r31,lr
458 00000054 stw r3,0xe8(r30)
459 00000058 stw r4,0xec(r30)
460 0000005c stw r5,0xf0(r30)
461 00000060 stw r6,0xf4(r30)
462 00000064 stw r7,0xf8(r30)
463 00000068 stw r8,0xfc(r30)
464 0000006c stw r9,0x100(r30)
465 00000070 stw r10,0x104(r30)
466 00000074 addis r2,r31,0x0
467 00000078 addi r2,r2,0x148
468 0000007c addi r0,r30,0x50
469 00000080 li r9,0x64
470 00000084 or r3,r0,r0
471 00000088 or r4,r2,r2
472 0000008c or r5,r9,r9
473 00000090 bl 0x178
474 00000094 lwz r0,0x10c(r30)
475 00000098 stw r0,0x38(r1)
476 0000009c lwz r0,0x110(r30)
477 000000a0 stw r0,0x3c(r1)
478 000000a4 lwz r3,0xec(r30)
479 000000a8 lwz r4,0xf0(r30)
480 000000ac lwz r5,0xf4(r30)
481 000000b0 lwz r6,0xf8(r30)
482 000000b4 lwz r7,0xfc(r30)
483 000000b8 lwz r8,0x100(r30)
484 000000bc lwz r9,0x104(r30)
485 000000c0 lwz r10,0x108(r30)
486 000000c4 bl 0x0
487 000000c8 lwz r1,0x0(r1)
488 000000cc lwz r0,0x8(r1)
489 000000d0 mtspr lr,r0
490 000000d4 lmw r30,0xfff8(r1)
491 000000d8 blr
492 _main:
493 000000dc mfspr r0,lr ;
494 000000e0 stmw r30,0xfff8(r1) ;
495 000000e4 stw r0,0x8(r1) ;
496 000000e8 stwu r1,0xff90(r1) ;
497 000000ec or r30,r1,r1 ;
498 000000f0 bcl 20,31,0xf4 ;
499 000000f4 mfspr r31,lr ;
500 000000f8 addis r2,r31,0x0 ;
501 000000fc addi r2,r2,0x108 ;
502 00000100 lwz r0,0x0(r2) ;
503 00000104 lwz r9,0x4(r2) ;
504 00000108 lwz r11,0x8(r2) ;
505 0000010c lwz r2,0xc(r2) ;
506 00000110 stw r0,0x50(r30) ;
507 00000114 stw r9,0x54(r30) ;
508 00000118 stw r11,0x58(r30) ;
509 0000011c stw r2,0x5c(r30) ;
510 00000120 li r0,0x8 ; arg 6, ...
511 00000124 stw r0,0x3c(r1) ; ... "pushed" onto stack
512 00000128 li r0,0x9 ; arg 7, ...
513 0000012c stw r0,0x40(r1) ; ... "pushed" onto stack
514 00000130 lwz r0,0x5c(r30) ; | | last word of struct "pushed" onto stack
515 00000134 stw r0,0x38(r1) ; | /
516 00000138 lwz r8,0x50(r30) ; | arg 5 (struct, passed as 4 words) \
517 0000013c lwz r9,0x54(r30) ; | | first 3 words of struct passed in remaining regs
518 00000140 lwz r10,0x58(r30) ; | |
519 00000144 li r3,0x0 ; arg 0
520 00000148 li r4,0x1 ; arg 1
521 0000014c li r5,0x2 ; arg 2
522 00000150 li r6,0x3 ; arg 3
523 00000154 li r7,0x4 ; arg 4
524 00000158 bl 0x38 ; call and put return address -> lr
525 0000015c li r0,0x0 ; return value (pointlessly) via gpr0 ...
526 00000160 or r3,r0,r0 ; ... to gpr3
527 00000164 lwz r1,0x0(r1) ; |
528 00000168 lwz r0,0x8(r1) ; |
529 0000016c mtspr lr,r0 ; | epilog
530 00000170 lmw r30,0xfff8(r1) ; |
531 00000174 blr ; |
532
533
534
535 ; ---------- single-field structs by value (of different sizes) ---------->
536 ;
537 ; struct C { char c; }; // <= 2 bytes, but normal alignment as passed like a char
538 ; struct S { short s; }; // <= 2 bytes, but normal alignment as passed like a short
539 ; struct I { int i; };
540 ; struct F { float f; };
541 ; struct D { double d; };
542 ;
543 ; struct C2 { char c[2]; }; // <= 2 bytes, special alignment
544 ; struct C3 { char c[3]; }; // > 2 bytes, normal alignment
545 ;
546 ; void leaf_call(struct C2 a, struct C b, struct S c, struct I d, struct F e, struct D f, struct C3 g)
547 ; {
548 ; }
549 ;
550 ; int main()
551 ; {
552 ; leaf_call((struct C2){{0,1}}, (struct C){2}, (struct S){3}, (struct I){4}, (struct F){5.f}, (struct D){6.}, (struct C3){{7,8,9}});
553 ; return 0;
554 ; }
555
556
557
558 ; output from darwin-8.0.1-ppc w/ gcc 3.3
559
560 _leaf_call:
561 00000000 stmw r30,0xfff8(r1)
562 00000004 stwu r1,0xffc0(r1)
563 00000008 or r30,r1,r1
564 0000000c sth r3,0x58(r30)
565 00000010 stb r4,0x5c(r30)
566 00000014 sth r5,0x60(r30)
567 00000018 stw r6,0x64(r30)
568 0000001c stfs f1,0x68(r30)
569 00000020 stfd f2,0x20(r30)
570 00000024 lwz r1,0x0(r1)
571 00000028 lmw r30,0xfff8(r1)
572 0000002c blr
573 _main:
574 00000030 mfspr r0,lr ; |
575 00000034 stmw r30,0xfff8(r1) ; |
576 00000038 stw r0,0x8(r1) ; | prolog
577 0000003c stwu r1,0xff80(r1) ; |
578 00000040 or r30,r1,r1 ; |
579 00000044 bcl 20,31,0x48 ; ppc way to get PC in ...
580 00000048 mfspr r31,lr ; ... gpr31
581 0000004c li r0,0x0 ; | \
582 00000050 stb r0,0x40(r30) ; | |
583 00000054 li r0,0x1 ; | | C2
584 00000058 stb r0,0x41(r30) ; | /
585 0000005c li r0,0x2 ; | local area struct init \ C
586 00000060 stb r0,0x42(r30) ; | /
587 00000064 li r0,0x3 ; | \ S
588 00000068 sth r0,0x44(r30) ; | /
589 0000006c li r0,0x4 ; | \ I
590 00000070 stw r0,0x48(r30) ; | /
591 00000074 lis r0,0x40a0 ; | \ F
592 00000078 stw r0,0x4c(r30) ; | /
593 0000007c addis r2,r31,0x0 ; | \
594 00000080 addi r2,r2,0xa8 ; | | D
595 00000084 lfd f0,0x0(r2) ; | |
596 00000088 stfd f0,0x50(r30) ; | /
597 0000008c addis r2,r31,0x0 ; | \
598 00000090 addi r2,r2,0xb0 ; | |
599 00000094 lhz r0,0x0(r2) ; | | C3
600 00000098 lbz r2,0x2(r2) ; | |
601 0000009c sth r0,0x60(r30) ; | |
602 000000a0 stb r2,0x62(r30) ; / /
603 000000a4 lhz r0,0x60(r30) ; \
604 000000a8 lbz r2,0x62(r30) ; |
605 000000ac sth r0,0x34(r1) ; | prep arg 6 (struct C3), zero-extended, right justified -> local area on stack
606 000000b0 stb r2,0x36(r1) ; /
607 000000b4 lhz r3,0x40(r30) ; arg 0 (struct C2)
608 000000b8 lbz r4,0x42(r30) ; arg 1 (struct C)
609 000000bc lhz r5,0x44(r30) ; arg 2 (struct S)
610 000000c0 lwz r6,0x48(r30) ; arg 3 (struct I)
611 000000c4 lfs f1,0x4c(r30) ; arg 4 (struct F, int arg reg r7 then skipped)
612 000000c8 lfd f2,0x50(r30) ; arg 5 (struct D, int arg regs r8 and r9 then skipped)
613 000000cc lwz r10,0x34(r1) ; arg 6 (struct C3, fetched from local area)
614 000000d0 bl 0x0 ; call and put return address -> lr
615 000000d4 li r0,0x0 ; return value (pointlessly) via gpr0 ...
616 000000d8 or r3,r0,r0 ; ... to gpr3
617 000000dc lwz r1,0x0(r1) ; |
618 000000e0 lwz r0,0x8(r1) ; |
619 000000e4 mtspr lr,r0 ; | epilog
620 000000e8 lmw r30,0xfff8(r1) ; |
621 000000ec blr ; |
622
623
624
625 ; ---------- structs by value, complex example (multiple structs) ---------->
626 ;
627 ; struct A { int i, j; float f; };
628 ; struct B { double d; long long l; };
629 ;
630 ; void leaf_call(int b, struct A c, struct B d, int e, int f, struct A g, struct B h, int i, int j)
631 ; {
632 ; }
633 ;
634 ; void nonleaf_call(int a, int b, struct A c, struct B d, int e, int f, struct A g, struct B h, int i, int j)
635 ; {
636 ; /* use some local data */
637 ; char l[100] = { 'L' };
638 ; leaf_call(b, c, d, e, f, g, h, i, j);
639 ; }
640 ;
641 ; int main()
642 ; {
643 ; nonleaf_call(0, 1, (struct A){2, 3, 4.f}, (struct B){5., 6ll}, 7, 8, (struct A){9, 10, 11.f}, (struct B){12., 13ll}, 14, 15);
644 ; return 0;
645 ; }
646
647
648
649 ; output from darwin-8.0.1-ppc w/ gcc 3.3
650
651 _leaf_call:
652 00000000 stmw r30,0xfff8(r1)
653 00000004 stwu r1,0xffd0(r1)
654 00000008 or r30,r1,r1
655 0000000c stw r3,0x48(r30)
656 00000010 stw r4,0x4c(r30)
657 00000014 stw r5,0x50(r30)
658 00000018 stw r6,0x54(r30)
659 0000001c stw r7,0x58(r30)
660 00000020 stw r8,0x5c(r30)
661 00000024 stw r9,0x60(r30)
662 00000028 stw r10,0x64(r30)
663 0000002c lwz r1,0x0(r1)
664 00000030 lmw r30,0xfff8(r1)
665 00000034 blr
666 _nonleaf_call:
667 00000038 mfspr r0,lr
668 0000003c stmw r30,0xfff8(r1)
669 00000040 stw r0,0x8(r1)
670 00000044 stwu r1,0xff10(r1)
671 00000048 or r30,r1,r1
672 0000004c bcl 20,31,0x50
673 00000050 mfspr r31,lr
674 00000054 stw r3,0x108(r30)
675 00000058 stw r4,0x10c(r30)
676 0000005c stw r5,0x110(r30)
677 00000060 stw r6,0x114(r30)
678 00000064 stw r7,0x118(r30)
679 00000068 stw r8,0x11c(r30)
680 0000006c stw r9,0x120(r30)
681 00000070 stw r10,0x124(r30)
682 00000074 addis r2,r31,0x0
683 00000078 addi r2,r2,0x240
684 0000007c addi r0,r30,0x70
685 00000080 li r9,0x64
686 00000084 or r3,r0,r0
687 00000088 or r4,r2,r2
688 0000008c or r5,r9,r9
689 00000090 bl 0x270
690 00000094 lwz r0,0x12c(r30)
691 00000098 stw r0,0x38(r1)
692 0000009c lwz r0,0x130(r30)
693 000000a0 stw r0,0x3c(r1)
694 000000a4 lwz r0,0x134(r30)
695 000000a8 lwz r2,0x138(r30)
696 000000ac lwz r9,0x13c(r30)
697 000000b0 stw r0,0x40(r1)
698 000000b4 stw r2,0x44(r1)
699 000000b8 stw r9,0x48(r1)
700 000000bc lwz r0,0x140(r30)
701 000000c0 lwz r2,0x144(r30)
702 000000c4 lwz r9,0x148(r30)
703 000000c8 lwz r11,0x14c(r30)
704 000000cc stw r0,0x4c(r1)
705 000000d0 stw r2,0x50(r1)
706 000000d4 stw r9,0x54(r1)
707 000000d8 stw r11,0x58(r1)
708 000000dc lwz r0,0x150(r30)
709 000000e0 stw r0,0x5c(r1)
710 000000e4 lwz r0,0x154(r30)
711 000000e8 stw r0,0x60(r1)
712 000000ec lwz r3,0x10c(r30)
713 000000f0 lwz r4,0x110(r30)
714 000000f4 lwz r5,0x114(r30)
715 000000f8 lwz r6,0x118(r30)
716 000000fc lwz r7,0x11c(r30)
717 00000100 lwz r8,0x120(r30)
718 00000104 lwz r9,0x124(r30)
719 00000108 lwz r10,0x128(r30)
720 0000010c bl 0x0
721 00000110 lwz r1,0x0(r1)
722 00000114 lwz r0,0x8(r1)
723 00000118 mtspr lr,r0
724 0000011c lmw r30,0xfff8(r1)
725 00000120 blr
726 _main:
727 00000124 mfspr r0,lr
728 00000128 stmw r30,0xfff8(r1)
729 0000012c stw r0,0x8(r1)
730 00000130 stwu r1,0xff40(r1)
731 00000134 or r30,r1,r1
732 00000138 bcl 20,31,0x13c
733 0000013c mfspr r31,lr
734 00000140 addis r2,r31,0x0
735 00000144 addi r2,r2,0x1b8
736 00000148 lwz r0,0x0(r2)
737 0000014c lwz r9,0x4(r2)
738 00000150 lwz r2,0x8(r2)
739 00000154 stw r0,0x70(r30)
740 00000158 stw r9,0x74(r30)
741 0000015c stw r2,0x78(r30)
742 00000160 addis r2,r31,0x0
743 00000164 addi r2,r2,0x1c4
744 00000168 lwz r0,0x0(r2)
745 0000016c lwz r9,0x4(r2)
746 00000170 lwz r11,0x8(r2)
747 00000174 lwz r2,0xc(r2)
748 00000178 stw r0,0x80(r30)
749 0000017c stw r9,0x84(r30)
750 00000180 stw r11,0x88(r30)
751 00000184 stw r2,0x8c(r30)
752 00000188 addis r2,r31,0x0
753 0000018c addi r2,r2,0x1d4
754 00000190 lwz r0,0x0(r2)
755 00000194 lwz r9,0x4(r2)
756 00000198 lwz r2,0x8(r2)
757 0000019c stw r0,0x90(r30)
758 000001a0 stw r9,0x94(r30)
759 000001a4 stw r2,0x98(r30)
760 000001a8 addis r2,r31,0x0
761 000001ac addi r2,r2,0x1e4
762 000001b0 lwz r0,0x0(r2)
763 000001b4 lwz r9,0x4(r2)
764 000001b8 lwz r11,0x8(r2)
765 000001bc lwz r2,0xc(r2)
766 000001c0 stw r0,0xa0(r30)
767 000001c4 stw r9,0xa4(r30)
768 000001c8 stw r11,0xa8(r30)
769 000001cc stw r2,0xac(r30)
770 000001d0 li r0,0x7
771 000001d4 stw r0,0x3c(r1)
772 000001d8 li r0,0x8
773 000001dc stw r0,0x40(r1)
774 000001e0 lwz r0,0x90(r30)
775 000001e4 lwz r2,0x94(r30)
776 000001e8 lwz r9,0x98(r30)
777 000001ec stw r0,0x44(r1)
778 000001f0 stw r2,0x48(r1)
779 000001f4 stw r9,0x4c(r1)
780 000001f8 lwz r0,0xa0(r30)
781 000001fc lwz r2,0xa4(r30)
782 00000200 lwz r9,0xa8(r30)
783 00000204 lwz r11,0xac(r30)
784 00000208 stw r0,0x50(r1)
785 0000020c stw r2,0x54(r1)
786 00000210 stw r9,0x58(r1)
787 00000214 stw r11,0x5c(r1)
788 00000218 li r0,0xe
789 0000021c stw r0,0x60(r1)
790 00000220 li r0,0xf
791 00000224 stw r0,0x64(r1)
792 00000228 lwz r0,0x8c(r30)
793 0000022c stw r0,0x38(r1)
794 00000230 lwz r8,0x80(r30)
795 00000234 lwz r9,0x84(r30)
796 00000238 lwz r10,0x88(r30)
797 0000023c li r3,0x0
798 00000240 li r4,0x1
799 00000244 lwz r5,0x70(r30)
800 00000248 lwz r6,0x74(r30)
801 0000024c lwz r7,0x78(r30)
802 00000250 bl 0x38
803 00000254 li r0,0x0
804 00000258 or r3,r0,r0
805 0000025c lwz r1,0x0(r1)
806 00000260 lwz r0,0x8(r1)
807 00000264 mtspr lr,r0
808 00000268 lmw r30,0xfff8(r1)
809 0000026c blr
810
811
812
813 ; ---------- returning qwords ---------->
814 ;
815 ; long long f()
816 ; {
817 ; return 7171LL;
818 ; }
819 ;
820 ; int main()
821 ; {
822 ; return (int)f();
823 ; }
824
825
826
827 ; output from darwin-8.0.1-ppc w/ gcc 3.3
828
829 _f:
830 00000000 stmw r30,0xfff8(r1)
831 00000004 stwu r1,0xffd0(r1)
832 00000008 or r30,r1,r1
833 0000000c li r2,0x0
834 00000010 li r3,0x1c03
835 00000014 or r4,r3,r3
836 00000018 or r3,r2,r2
837 0000001c lwz r1,0x0(r1)
838 00000020 lmw r30,0xfff8(r1)
839 00000024 blr
840 _main:
841 00000028 mfspr r0,lr
842 0000002c stmw r30,0xfff8(r1)
843 00000030 stw r0,0x8(r1)
844 00000034 stwu r1,0xffb0(r1)
845 00000038 or r30,r1,r1
846 0000003c bl 0x0
847 00000040 or r2,r3,r3
848 00000044 or r3,r4,r4
849 00000048 or r0,r3,r3
850 0000004c or r3,r0,r0
851 00000050 lwz r1,0x0(r1)
852 00000054 lwz r0,0x8(r1)
853 00000058 mtspr lr,r0
854 0000005c lmw r30,0xfff8(r1)
855 00000060 blr
856
857
858
859 ; ---------- returning structs by value ---------->
860 ;
861 ; struct Small { char x; };
862 ; struct Big { long long i; long j; };
863 ;
864 ; struct Small f0()
865 ; {
866 ; struct Small s = { 132 };
867 ; return s;
868 ; }
869 ;
870 ; struct Big f1()
871 ; {
872 ; struct Big b = { 7171LL, 232 };
873 ; return b;
874 ; }
875 ;
876 ; int main()
877 ; {
878 ; struct Small s = f0();
879 ; struct Big b = f1();
880 ; return b.j + s.x;
881 ; }
882
883
884
885 ; output from darwin-8.0.1-ppc w/ gcc 3.3
886
887 _f0:
888 00000000 stmw r30,0xfff8(r1)
889 00000004 stwu r1,0xffc0(r1)
890 00000008 or r30,r1,r1
891 0000000c or r2,r3,r3
892 00000010 li r0,0xff84
893 00000014 stb r0,0x20(r30)
894 00000018 lbz r0,0x20(r30)
895 0000001c stb r0,0x0(r2)
896 00000020 or r3,r2,r2
897 00000024 lwz r1,0x0(r1)
898 00000028 lmw r30,0xfff8(r1)
899 0000002c blr
900 _f1:
901 00000030 stmw r30,0xfff8(r1)
902 00000034 stwu r1,0xffc0(r1)
903 00000038 or r30,r1,r1
904 0000003c mfspr r0,lr
905 00000040 bcl 20,31,0x44
906 00000044 mfspr r8,lr
907 00000048 mtspr lr,r0
908 0000004c or r9,r3,r3
909 00000050 addis r2,r8,0x0
910 00000054 addi r2,r2,0xb4
911 00000058 lwz r0,0x0(r2)
912 0000005c lwz r11,0x4(r2)
913 00000060 lwz r10,0x8(r2)
914 00000064 lwz r2,0xc(r2)
915 00000068 stw r0,0x20(r30)
916 0000006c stw r11,0x24(r30)
917 00000070 stw r10,0x28(r30)
918 00000074 stw r2,0x2c(r30)
919 00000078 lwz r0,0x20(r30)
920 0000007c lwz r2,0x24(r30)
921 00000080 lwz r11,0x28(r30)
922 00000084 lwz r10,0x2c(r30)
923 00000088 stw r0,0x0(r9)
924 0000008c stw r2,0x4(r9)
925 00000090 stw r11,0x8(r9)
926 00000094 stw r10,0xc(r9)
927 00000098 or r3,r9,r9
928 0000009c lwz r1,0x0(r1)
929 000000a0 lmw r30,0xfff8(r1)
930 000000a4 blr
931 _main:
932 000000a8 mfspr r0,lr
933 000000ac stmw r30,0xfff8(r1)
934 000000b0 stw r0,0x8(r1)
935 000000b4 stwu r1,0xff90(r1)
936 000000b8 or r30,r1,r1
937 000000bc addi r3,r30,0x40
938 000000c0 bl 0x0
939 000000c4 addi r0,r30,0x50
940 000000c8 or r3,r0,r0
941 000000cc bl 0x30
942 000000d0 lbz r0,0x40(r30)
943 000000d4 extsb r2,r0
944 000000d8 lwz r0,0x58(r30)
945 000000dc add r0,r2,r0
946 000000e0 or r3,r0,r0
947 000000e4 lwz r1,0x0(r1)
948 000000e8 lwz r0,0x8(r1)
949 000000ec mtspr lr,r0
950 000000f0 lmw r30,0xfff8(r1)
951 000000f4 blr
952
953
954
408 ; vim: ft=asm 955 ; vim: ft=asm
409 956