diff doc/disas_examples/sparc64.sparc64.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 c73c59c8b553
children fc614cb865c6
line wrap: on
line diff
--- a/doc/disas_examples/sparc64.sparc64.disas	Mon Mar 21 18:11:38 2022 +0100
+++ b/doc/disas_examples/sparc64.sparc64.disas	Wed Mar 23 15:24:31 2022 +0100
@@ -1609,5 +1609,118 @@
 
 
 
+; ---------- 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 openbsd-6.0-sparc64 w/ gcc 4.2.1
+
+0000000000000d20 <f1>:
+ d20:   9d e3 bf 30     save  %sp, -208, %sp
+ d24:   82 10 00 18     mov  %i0, %g1
+ d28:   83 38 70 20     srax  %g1, 0x20, %g1
+ d2c:   c4 07 a8 7f     ld  [ %fp + 0x87f ], %g2
+ d30:   84 08 a0 00     and  %g2, 0, %g2
+ d34:   82 10 80 01     or  %g2, %g1, %g1
+ d38:   c2 27 a8 7f     st  %g1, [ %fp + 0x87f ]
+ d3c:   81 cf e0 08     rett  %i7 + 8
+ d40:   01 00 00 00     nop
+
+0000000000000d44 <f2>:
+ d44:   9d e3 bf 30     save  %sp, -208, %sp
+ d48:   f0 77 a8 7f     stx  %i0, [ %fp + 0x87f ]
+ d4c:   81 cf e0 08     rett  %i7 + 8
+ d50:   01 00 00 00     nop
+ d54:   ae 03 c0 17     add  %o7, %l7, %l7
+ d58:   81 c3 e0 08     retl
+ d5c:   01 00 00 00     nop
+
+0000000000000d60 <f>:
+ d60:   9d e3 bf 20     save  %sp, -224, %sp                      ;
+ d64:   2f 00 0c 00     sethi  %hi(0x300000), %l7                 ;
+ d68:   ae 05 e2 ac     add  %l7, 0x2ac, %l7                      ;
+ d6c:   7f ff ff fa     call  d54 <f2+0x10>                       ;
+ d70:   01 00 00 00     nop                                       ;
+ d74:   03 00 00 00     sethi  %hi(0), %g1                        ;
+ d78:   82 10 60 48     or  %g1, 0x48, %g1                        ;
+ d7c:   c2 5d c0 01     ldx  [ %l7 + %g1 ], %g1                   ;
+ d80:   c4 58 40 00     ldx  [ %g1 ], %g2                         ;
+ d84:   c4 77 a7 e7     stx  %g2, [ %fp + 0x7e7 ]                 ;
+ d88:   84 10 20 00     clr  %g2                                  ;
+ d8c:   82 07 a7 df     add  %fp, 0x7df, %g1                      ;
+ d90:   90 10 00 01     mov  %g1, %o0                             ;
+ d94:   40 14 01 13     call  5011e0 <_ZN10NonTrivialC1Ev@plt>    ; NonTrivial::NonTrivial() / ctor
+ d98:   01 00 00 00     nop                                       ;
+ d9c:   82 10 20 01     mov  1, %g1                               ;
+ da0:   c2 27 a7 db     st  %g1, [ %fp + 0x7db ]                  ;
+ da4:   c2 07 a7 db     ld  [ %fp + 0x7db ], %g1                  ;
+ da8:   82 00 60 7b     add  %g1, 0x7b, %g1                       ;
+ dac:   c2 27 a7 db     st  %g1, [ %fp + 0x7db ]                  ;
+ db0:   c2 07 a7 e3     ld  [ %fp + 0x7e3 ], %g1                  ;
+ db4:   83 30 60 00     srl  %g1, 0, %g1                          ;
+ db8:   83 28 70 20     sllx  %g1, 0x20, %g1                      ;
+ dbc:   90 10 00 01     mov  %g1, %o0                             ;
+ dc0:   40 14 01 30     call  501280 <f1@plt>                     ; call f1(struct Trivial)
+ dc4:   01 00 00 00     nop                                       ;
+ dc8:   c2 07 a7 db     ld  [ %fp + 0x7db ], %g1                  ;
+ dcc:   82 00 7f 85     add  %g1, -123, %g1                       ;
+ dd0:   c2 27 a7 db     st  %g1, [ %fp + 0x7db ]                  ;
+ dd4:   82 07 a7 d7     add  %fp, 0x7d7, %g1                      ;
+ dd8:   84 07 a7 df     add  %fp, 0x7df, %g2                      ;
+ ddc:   90 10 00 01     mov  %g1, %o0                             ; |               ptr to dest of copy of n
+ de0:   92 10 00 02     mov  %g2, %o1                             ; | copy n        ptr to n
+ de4:   40 14 00 e7     call  501180 <_ZN10NonTrivialC1ERKS_@plt> ; |               NonTrivial::NonTrivial(const NonTrivial&) / copy ctor
+ de8:   01 00 00 00     nop                                       ;
+ dec:   82 07 a7 d7     add  %fp, 0x7d7, %g1                      ; |
+ df0:   90 10 00 01     mov  %g1, %o0                             ; | f2 arg 0 (ptr to copy of struct NonTrivial), via ptr as non-trivial
+ df4:   40 14 01 03     call  501200 <f2@plt>                     ; call f2(struct NonTrivial)
+ df8:   01 00 00 00     nop                                       ;
+ dfc:   c2 07 a7 db     ld  [ %fp + 0x7db ], %g1                  ;
+ e00:   82 00 7f f4     add  %g1, -12, %g1                        ;
+ e04:   c2 27 a7 db     st  %g1, [ %fp + 0x7db ]                  ;
+ e08:   03 00 00 00     sethi  %hi(0), %g1                        ;
+ e0c:   82 10 60 48     or  %g1, 0x48, %g1                        ;
+ e10:   c2 5d c0 01     ldx  [ %l7 + %g1 ], %g1                   ;
+ e14:   c6 5f a7 e7     ldx  [ %fp + 0x7e7 ], %g3                 ;
+ e18:   c4 58 40 00     ldx  [ %g1 ], %g2                         ;
+ e1c:   86 18 c0 02     xor  %g3, %g2, %g3                        ;
+ e20:   84 10 20 00     clr  %g2                                  ;
+ e24:   82 10 00 03     mov  %g3, %g1                             ;
+ e28:   02 c8 40 08     brz  %g1, e48 <f+0xe8>                    ;
+ e2c:   01 00 00 00     nop                                       ;
+ e30:   03 00 00 00     sethi  %hi(0), %g1                        ;
+ e34:   82 10 60 40     or  %g1, 0x40, %g1                        ;
+ e38:   c2 5d c0 01     ldx  [ %l7 + %g1 ], %g1                   ;
+ e3c:   90 10 00 01     mov  %g1, %o0                             ;
+ e40:   40 14 00 d8     call  5011a0 <__stack_smash_handler@plt>  ;
+ e44:   01 00 00 00     nop                                       ;
+ e48:   81 cf e0 08     rett  %i7 + 8                             ;
+ e4c:   01 00 00 00     nop                                       ;
+
+  ; ... snip, removed code of ctor and copy ctor ...
+
+
+
 ; vim: ft=asm