diff 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
line wrap: on
line diff
--- a/doc/disas_examples/ppc64.elfabi.disas	Mon Mar 21 18:11:38 2022 +0100
+++ b/doc/disas_examples/ppc64.elfabi.disas	Wed Mar 23 15:24:31 2022 +0100
@@ -734,5 +734,101 @@
 
 
 
+; ---------- C++ trivial and non-trivial aggrs passed to C funcs ---------->
+;
+; struct Trivial { int a; };
+; struct NonTrivial { int a; NonTrivial() : a(0) {} NonTrivial(const NonTrivial& rhs) : a(rhs.a) { } };
+;
+; extern "C" {
+; 
+;     void f1(struct Trivial s)    { }
+;     void f2(struct NonTrivial s) { }
+;
+;     void f()
+;     {
+;         struct Trivial t;
+;         struct NonTrivial n;
+;         int a=1;
+;         a += 123;
+;         f1(t);
+;         a -= 123;
+;         f2(n);
+;         a -= 12;
+;     }
+; }
+
+
+
+; output from freebsd-11.0-ppc64 w/ gcc 4.2.1
+
+0000000010000828 <.f1>:
+    10000828:   fb e1 ff f8     std     r31,-8(r1)
+    1000082c:   f8 21 ff c1     stdu    r1,-64(r1)
+    10000830:   7c 3f 0b 78     mr      r31,r1
+    10000834:   90 7f 00 70     stw     r3,112(r31)
+    10000838:   e8 21 00 00     ld      r1,0(r1)
+    1000083c:   eb e1 ff f8     ld      r31,-8(r1)
+    10000840:   4e 80 00 20     blr
+    10000844:   00 00 00 00     .long 0x0
+    10000848:   00 09 00 00     .long 0x90000
+    1000084c:   80 01 00 01     lwz     r0,1(r1)
+
+0000000010000850 <.f2>:
+    10000850:   fb e1 ff f8     std     r31,-8(r1)
+    10000854:   f8 21 ff c1     stdu    r1,-64(r1)
+    10000858:   7c 3f 0b 78     mr      r31,r1
+    1000085c:   f8 7f 00 70     std     r3,112(r31)
+    10000860:   e8 21 00 00     ld      r1,0(r1)
+    10000864:   eb e1 ff f8     ld      r31,-8(r1)
+    10000868:   4e 80 00 20     blr
+    1000086c:   00 00 00 00     .long 0x0
+    10000870:   00 09 00 00     .long 0x90000
+    10000874:   80 01 00 01     lwz     r0,1(r1)
+
+0000000010000878 <.f>:
+    10000878:   7c 08 02 a6     mflr    r0                                 ;
+    1000087c:   fb e1 ff f8     std     r31,-8(r1)                         ;
+    10000880:   f8 01 00 10     std     r0,16(r1)                          ;
+    10000884:   f8 21 ff 71     stdu    r1,-144(r1)                        ;
+    10000888:   7c 3f 0b 78     mr      r31,r1                             ;
+    1000088c:   38 1f 00 7c     addi    r0,r31,124                         ;
+    10000890:   7c 03 03 78     mr      r3,r0                              ;
+    10000894:   48 00 00 ad     bl      10000940 <._ZN10NonTrivialC1Ev>    ; NonTrivial::NonTrivial() / ctor
+    10000898:   4f ff fb 82     crmove  4*cr7+so,4*cr7+so                  ;
+    1000089c:   38 00 00 01     li      r0,1                               ;
+    100008a0:   90 1f 00 70     stw     r0,112(r31)                        ;
+    100008a4:   81 3f 00 70     lwz     r9,112(r31)                        ;
+    100008a8:   38 09 00 7b     addi    r0,r9,123                          ;
+    100008ac:   90 1f 00 70     stw     r0,112(r31)                        ;
+    100008b0:   80 7f 00 78     lwz     r3,120(r31)                        ;
+    100008b4:   4b ff ff 75     bl      10000828 <.f1>                     ; call f1(struct Trivial)
+    100008b8:   81 3f 00 70     lwz     r9,112(r31)                        ;
+    100008bc:   38 09 ff 85     addi    r0,r9,-123                         ;
+    100008c0:   90 1f 00 70     stw     r0,112(r31)                        ;
+    100008c4:   38 1f 00 74     addi    r0,r31,116                         ;
+    100008c8:   39 3f 00 7c     addi    r9,r31,124                         ;
+    100008cc:   7c 03 03 78     mr      r3,r0                              ; |               ptr to dest of copy of n
+    100008d0:   7d 24 4b 78     mr      r4,r9                              ; | copy n        ptr to n
+    100008d4:   48 00 00 a1     bl      10000974 <._ZN10NonTrivialC1ERKS_> ; |               NonTrivial::NonTrivial(const NonTrivial&) / copy ctor
+    100008d8:   4f ff fb 82     crmove  4*cr7+so,4*cr7+so                  ;
+    100008dc:   38 1f 00 74     addi    r0,r31,116                         ; |
+    100008e0:   7c 03 03 78     mr      r3,r0                              ; | f2 arg 0 (ptr to copy of struct NonTrivial), via ptr as non-trivial
+    100008e4:   4b ff ff 6d     bl      10000850 <.f2>                     ; call f2(struct NonTrivial)
+    100008e8:   81 3f 00 70     lwz     r9,112(r31)                        ;
+    100008ec:   38 09 ff f4     addi    r0,r9,-12                          ;
+    100008f0:   90 1f 00 70     stw     r0,112(r31)                        ;
+    100008f4:   e8 21 00 00     ld      r1,0(r1)                           ;
+    100008f8:   e8 01 00 10     ld      r0,16(r1)                          ;
+    100008fc:   7c 08 03 a6     mtlr    r0                                 ;
+    10000900:   eb e1 ff f8     ld      r31,-8(r1)                         ;
+    10000904:   4e 80 00 20     blr                                        ;
+    10000908:   00 00 00 00     .long 0x0                                  ;
+    1000090c:   00 09 00 01     .long 0x90001                              ;
+    10000910:   80 01 00 01     lwz     r0,1(r1)                           ;
+
+  ; ... snip, removed code of ctor and copy ctor ...
+
+
+
 ; vim: ft=asm