diff doc/disas_examples/ppc.darwin.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/ppc.darwin.disas	Mon Mar 21 18:11:38 2022 +0100
+++ b/doc/disas_examples/ppc.darwin.disas	Wed Mar 23 15:24:31 2022 +0100
@@ -952,5 +952,88 @@
 
 
 
+; ---------- 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 darwin-8.0.1-ppc w/ gcc 3.3
+
+_f1:
+00000000    stmw    r30,0xfff8(r1)
+00000004    stwu    r1,0xffd0(r1)
+00000008    or  r30,r1,r1
+0000000c    stw r3,0x48(r30)
+00000010    lwz r1,_f1(r1)
+00000014    lmw r30,0xfff8(r1)
+00000018    blr
+_f2:
+0000001c    stmw    r30,0xfff8(r1)
+00000020    stwu    r1,0xffd0(r1)
+00000024    or  r30,r1,r1
+00000028    lwz r1,_f1(r1)
+0000002c    lmw r30,0xfff8(r1)
+00000030    blr
+_f:
+00000034    mfspr   r0,lr                       ;
+00000038    stmw    r30,0xfff8(r1)              ;
+0000003c    stw r0,0x8(r1)                      ;
+00000040    stwu    r1,0xff70(r1)               ;
+00000044    or  r30,r1,r1                       ;
+00000048    addi    r0,r30,0x50                 ;
+0000004c    or  r3,r0,r0                        ;
+00000050    bl  0x140 ; __ZN10NonTrivialC1Ev    ; NonTrivial::NonTrivial() / ctor
+00000054    li  r0,0x1                          ;
+00000058    stw r0,0x60(r30)                    ;
+0000005c    lwz r2,0x60(r30)                    ;
+00000060    addi    r0,r2,0x7b                  ;
+00000064    stw r0,0x60(r30)                    ;
+00000068    lwz r0,0x40(r30)                    ;
+0000006c    or  r3,r0,r0                        ;
+00000070    bl  _f1                             ; call f1(struct Trivial)
+00000074    lwz r2,0x60(r30)                    ;
+00000078    addi    r0,r2,0xff85                ;
+0000007c    stw r0,0x60(r30)                    ;
+00000080    addi    r0,r30,0x70                 ;
+00000084    addi    r2,r30,0x50                 ;
+00000088    or  r3,r0,r0                        ; |               ptr to dest of copy of n
+0000008c    or  r4,r2,r2                        ; | copy n        ptr to n
+00000090    bl  0x120 ; __ZN10NonTrivialC1ERKS_ ; /               NonTrivial::NonTrivial(const NonTrivial&) / copy ctor
+00000094    addi    r0,r30,0x70                 ; \
+00000098    or  r3,r0,r0                        ; | f2 arg 0 (ptr to copy of struct NonTrivial), via ptr as non-trivial
+0000009c    bl  _f2                             ; call f2(struct NonTrivial)
+000000a0    lwz r2,0x60(r30)                    ;
+000000a4    addi    r0,r2,0xfff4                ;
+000000a8    stw r0,0x60(r30)                    ;
+000000ac    lwz r1,_f1(r1)                      ;
+000000b0    lwz r0,0x8(r1)                      ;
+000000b4    mtspr   lr,r0                       ;
+000000b8    lmw r30,0xfff8(r1)                  ;
+000000bc    blr                                 ;
+
+  ; ... snip, removed code of ctor and copy ctor ...
+
+
+
 ; vim: ft=asm