comparison doc/disas_examples/ppc64.elfabi.disas @ 497:cb19b2fe2422

- more disas examples to check behaviour of passing C++ non-trivial aggregates by value; they all behave the same, calling the copy ctor first, passing a pointer then
author Tassilo Philipp
date Wed, 23 Mar 2022 15:24:31 +0100
parents ead041d93e36
children fc614cb865c6
comparison
equal deleted inserted replaced
496:da5232da6270 497:cb19b2fe2422
732 f0: 00 00 00 01 .long 0x1 732 f0: 00 00 00 01 .long 0x1
733 f4: 80 01 00 01 lwz r0,1(r1) 733 f4: 80 01 00 01 lwz r0,1(r1)
734 734
735 735
736 736
737 ; ---------- C++ trivial and non-trivial aggrs passed to C funcs ---------->
738 ;
739 ; struct Trivial { int a; };
740 ; struct NonTrivial { int a; NonTrivial() : a(0) {} NonTrivial(const NonTrivial& rhs) : a(rhs.a) { } };
741 ;
742 ; extern "C" {
743 ;
744 ; void f1(struct Trivial s) { }
745 ; void f2(struct NonTrivial s) { }
746 ;
747 ; void f()
748 ; {
749 ; struct Trivial t;
750 ; struct NonTrivial n;
751 ; int a=1;
752 ; a += 123;
753 ; f1(t);
754 ; a -= 123;
755 ; f2(n);
756 ; a -= 12;
757 ; }
758 ; }
759
760
761
762 ; output from freebsd-11.0-ppc64 w/ gcc 4.2.1
763
764 0000000010000828 <.f1>:
765 10000828: fb e1 ff f8 std r31,-8(r1)
766 1000082c: f8 21 ff c1 stdu r1,-64(r1)
767 10000830: 7c 3f 0b 78 mr r31,r1
768 10000834: 90 7f 00 70 stw r3,112(r31)
769 10000838: e8 21 00 00 ld r1,0(r1)
770 1000083c: eb e1 ff f8 ld r31,-8(r1)
771 10000840: 4e 80 00 20 blr
772 10000844: 00 00 00 00 .long 0x0
773 10000848: 00 09 00 00 .long 0x90000
774 1000084c: 80 01 00 01 lwz r0,1(r1)
775
776 0000000010000850 <.f2>:
777 10000850: fb e1 ff f8 std r31,-8(r1)
778 10000854: f8 21 ff c1 stdu r1,-64(r1)
779 10000858: 7c 3f 0b 78 mr r31,r1
780 1000085c: f8 7f 00 70 std r3,112(r31)
781 10000860: e8 21 00 00 ld r1,0(r1)
782 10000864: eb e1 ff f8 ld r31,-8(r1)
783 10000868: 4e 80 00 20 blr
784 1000086c: 00 00 00 00 .long 0x0
785 10000870: 00 09 00 00 .long 0x90000
786 10000874: 80 01 00 01 lwz r0,1(r1)
787
788 0000000010000878 <.f>:
789 10000878: 7c 08 02 a6 mflr r0 ;
790 1000087c: fb e1 ff f8 std r31,-8(r1) ;
791 10000880: f8 01 00 10 std r0,16(r1) ;
792 10000884: f8 21 ff 71 stdu r1,-144(r1) ;
793 10000888: 7c 3f 0b 78 mr r31,r1 ;
794 1000088c: 38 1f 00 7c addi r0,r31,124 ;
795 10000890: 7c 03 03 78 mr r3,r0 ;
796 10000894: 48 00 00 ad bl 10000940 <._ZN10NonTrivialC1Ev> ; NonTrivial::NonTrivial() / ctor
797 10000898: 4f ff fb 82 crmove 4*cr7+so,4*cr7+so ;
798 1000089c: 38 00 00 01 li r0,1 ;
799 100008a0: 90 1f 00 70 stw r0,112(r31) ;
800 100008a4: 81 3f 00 70 lwz r9,112(r31) ;
801 100008a8: 38 09 00 7b addi r0,r9,123 ;
802 100008ac: 90 1f 00 70 stw r0,112(r31) ;
803 100008b0: 80 7f 00 78 lwz r3,120(r31) ;
804 100008b4: 4b ff ff 75 bl 10000828 <.f1> ; call f1(struct Trivial)
805 100008b8: 81 3f 00 70 lwz r9,112(r31) ;
806 100008bc: 38 09 ff 85 addi r0,r9,-123 ;
807 100008c0: 90 1f 00 70 stw r0,112(r31) ;
808 100008c4: 38 1f 00 74 addi r0,r31,116 ;
809 100008c8: 39 3f 00 7c addi r9,r31,124 ;
810 100008cc: 7c 03 03 78 mr r3,r0 ; | ptr to dest of copy of n
811 100008d0: 7d 24 4b 78 mr r4,r9 ; | copy n ptr to n
812 100008d4: 48 00 00 a1 bl 10000974 <._ZN10NonTrivialC1ERKS_> ; | NonTrivial::NonTrivial(const NonTrivial&) / copy ctor
813 100008d8: 4f ff fb 82 crmove 4*cr7+so,4*cr7+so ;
814 100008dc: 38 1f 00 74 addi r0,r31,116 ; |
815 100008e0: 7c 03 03 78 mr r3,r0 ; | f2 arg 0 (ptr to copy of struct NonTrivial), via ptr as non-trivial
816 100008e4: 4b ff ff 6d bl 10000850 <.f2> ; call f2(struct NonTrivial)
817 100008e8: 81 3f 00 70 lwz r9,112(r31) ;
818 100008ec: 38 09 ff f4 addi r0,r9,-12 ;
819 100008f0: 90 1f 00 70 stw r0,112(r31) ;
820 100008f4: e8 21 00 00 ld r1,0(r1) ;
821 100008f8: e8 01 00 10 ld r0,16(r1) ;
822 100008fc: 7c 08 03 a6 mtlr r0 ;
823 10000900: eb e1 ff f8 ld r31,-8(r1) ;
824 10000904: 4e 80 00 20 blr ;
825 10000908: 00 00 00 00 .long 0x0 ;
826 1000090c: 00 09 00 01 .long 0x90001 ;
827 10000910: 80 01 00 01 lwz r0,1(r1) ;
828
829 ; ... snip, removed code of ctor and copy ctor ...
830
831
832
737 ; vim: ft=asm 833 ; vim: ft=asm
738 834