diff doc/disas_examples/ppc.darwin.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/ppc.darwin.disas	Wed Mar 23 15:33:09 2022 +0100
+++ b/doc/disas_examples/ppc.darwin.disas	Mon Apr 04 15:50:52 2022 +0200
@@ -1035,5 +1035,89 @@
 
 
 
+; ---------- 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 darwin-8.0.1-ppc w/ gcc 3.3
+
+_f1:
+0000211c	stmw	r30,0xfff8(r1)
+00002120	stwu	r1,0xffd0(r1)
+00002124	or	r30,r1,r1
+00002128	or	r2,r3,r3
+0000212c	li	r0,0x0
+00002130	stw	r0,0x0(r2)
+00002134	or	r3,r2,r2
+00002138	lwz	r1,0x0(r1)
+0000213c	lmw	r30,0xfff8(r1)
+00002140	blr
+__Z2f2v:
+00002144	mfspr	r0,lr
+00002148	stmw	r29,0xfff4(r1)
+0000214c	stw	r0,0x8(r1)
+00002150	stwu	r1,0xffb0(r1)
+00002154	or	r30,r1,r1
+00002158	or	r29,r3,r3
+0000215c	or	r3,r29,r29
+00002160	bl	0x83cc
+00002164	or	r3,r29,r29
+00002168	lwz	r1,0x0(r1)
+0000216c	lwz	r0,0x8(r1)
+00002170	mtspr	lr,r0
+00002174	lmw	r29,0xfff4(r1)
+00002178	blr
+_f:
+0000217c	mfspr	r0,lr          ;
+00002180	stmw	r30,0xfff8(r1) ;
+00002184	stw	r0,0x8(r1)         ;
+00002188	stwu	r1,0xff90(r1)  ;
+0000218c	or	r30,r1,r1          ;
+00002190	li	r0,0x1             ;
+00002194	stw	r0,0x40(r30)       ;
+00002198	lwz	r2,0x40(r30)       ;
+0000219c	addi	r0,r2,0x7b     ;
+000021a0	stw	r0,0x40(r30)       ;
+000021a4	addi	r0,r30,0x44    ; |
+000021a8	or	r3,r0,r0           ; | ptr to space for retval is passed as hidden first arg
+000021ac	bl	0x211c             ; call f1()
+000021b0	lwz	r2,0x40(r30)       ;
+000021b4	addi	r0,r2,0xff85   ;
+000021b8	stw	r0,0x40(r30)       ;
+000021bc	addi	r0,r30,0x50    ; |
+000021c0	or	r3,r0,r0           ; | ptr to space for retval is passed as hidden first arg
+000021c4	bl	0x2144             ; call f2()
+000021c8	lwz	r2,0x40(r30)       ;
+000021cc	addi	r0,r2,0xfff4   ;
+000021d0	stw	r0,0x40(r30)       ;
+000021d4	lwz	r1,0x0(r1)         ;
+000021d8	lwz	r0,0x8(r1)         ;
+000021dc	mtspr	lr,r0          ;
+000021e0	lmw	r30,0xfff8(r1)     ;
+000021e4	blr                    ;
+
+
+
 ; vim: ft=asm