diff doc/disas_examples/arm.atpcs_arm.disas @ 499:fc614cb865c6

- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
author Tassilo Philipp
date Mon, 04 Apr 2022 15:50:52 +0200
parents cb19b2fe2422
children
line wrap: on
line diff
--- a/doc/disas_examples/arm.atpcs_arm.disas	Wed Mar 23 15:33:09 2022 +0100
+++ b/doc/disas_examples/arm.atpcs_arm.disas	Mon Apr 04 15:50:52 2022 +0200
@@ -830,5 +830,81 @@
 
 
 
+; ---------- C++ trivial and non-trivial aggrs as return values ---------->
+;
+; struct Trivial { int a; };
+; struct NonTrivial { int a; NonTrivial() : a(0) {} NonTrivial(const NonTrivial& rhs) : a(rhs.a) { } };
+; 
+; extern "C" {
+;     struct Trivial    f1() { return Trivial(); }
+; }
+; 
+;     struct NonTrivial f2() { return NonTrivial(); }
+; 
+; extern "C" {
+;     void f()
+;     {
+;         int a=1;
+;         a += 123;
+;         struct Trivial t = f1();
+;         a -= 123;
+;         struct NonTrivial n = f2();
+;         a -= 12;
+;     }
+; }
+
+
+
+; output from debian-6.0.8-armel w/ gcc 4.4.5
+
+00000000 <f1>:
+   0:   e52db004        push    {fp}
+   4:   e28db000        add     fp, sp, #0
+   8:   e3a03000        mov     r3, #0
+   c:   e1a00003        mov     r0, r3
+  10:   e28bd000        add     sp, fp, #0
+  14:   e8bd0800        pop     {fp}
+  18:   e12fff1e        bx      lr
+
+0000001c <_Z2f2v>:
+  1c:   e92d4830        push    {r4, r5, fp, lr}
+  20:   e28db00c        add     fp, sp, #12
+  24:   e1a04000        mov     r4, r0
+  28:   e1a03004        mov     r3, r4
+  2c:   e1a00003        mov     r0, r3
+  30:   ebfffffe        bl      0              ; ctor
+  34:   e1a00004        mov     r0, r4         ; ptr to retval space -> r0
+  38:   e1a00004        mov     r0, r4
+  3c:   e24bd00c        sub     sp, fp, #12
+  40:   e8bd4830        pop     {r4, r5, fp, lr}
+  44:   e12fff1e        bx      lr
+
+00000048 <f>:
+  48:   e92d4800        push    {fp, lr}       ;
+  4c:   e28db004        add     fp, sp, #4     ;
+  50:   e24dd010        sub     sp, sp, #16    ;
+  54:   e3a03001        mov     r3, #1         ;
+  58:   e50b3008        str     r3, [fp, #-8]  ;
+  5c:   e51b3008        ldr     r3, [fp, #-8]  ;
+  60:   e283307b        add     r3, r3, #123   ;
+  64:   e50b3008        str     r3, [fp, #-8]  ;
+  68:   ebfffffe        bl      0 <f1>         ; call f1()
+  6c:   e1a03000        mov     r3, r0         ; retval via r0, as small struct
+  70:   e50b300c        str     r3, [fp, #-12] ;
+  74:   e51b3008        ldr     r3, [fp, #-8]  ;
+  78:   e243307b        sub     r3, r3, #123   ;
+  7c:   e50b3008        str     r3, [fp, #-8]  ;
+  80:   e24b3010        sub     r3, fp, #16    ; space to hold non-triv retval -> eax ...
+  84:   e1a00003        mov     r0, r3         ; ... as hidden first arg (r0)
+  88:   ebfffffe        bl      1c <_Z2f2v>    ; call f2()
+  8c:   e51b3008        ldr     r3, [fp, #-8]  ;
+  90:   e243300c        sub     r3, r3, #12    ;
+  94:   e50b3008        str     r3, [fp, #-8]  ;
+  98:   e24bd004        sub     sp, fp, #4     ;
+  9c:   e8bd4800        pop     {fp, lr}       ;
+  a0:   e12fff1e        bx      lr             ;
+
+
+
 ; vim: ft=asm68k