view doc/disas_examples/ppc.sysv.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 source

; #include <stdlib.h>
; 
; void leaf_call(int b, int c, int d, int e, int f, int g, int h)
; {
; }
; 
; void nonleaf_call(int a, int b, int c, int d, int e, int f, int g, int h)
; {
; 	/* use some local data */
; 	*(char*)alloca(10) = 'L';
; 	leaf_call(b, c, d, e, f, g, h);
; }
; 
; int main()
; {
; 	nonleaf_call(0, 1, 2, 3, 4, 5, 6, 7);
; 	return 0;
; }



; output from debian-4.1.1-21-ppc w/ gcc 4.1.2

00000000 <leaf_call>:
   0:   94 21 ff d0     stwu    r1,-48(r1)
   4:   93 e1 00 2c     stw     r31,44(r1)
   8:   7c 3f 0b 78     mr      r31,r1
   c:   90 7f 00 08     stw     r3,8(r31)
  10:   90 9f 00 0c     stw     r4,12(r31)
  14:   90 bf 00 10     stw     r5,16(r31)
  18:   90 df 00 14     stw     r6,20(r31)
  1c:   90 ff 00 18     stw     r7,24(r31)
  20:   91 1f 00 1c     stw     r8,28(r31)
  24:   91 3f 00 20     stw     r9,32(r31)
  28:   81 61 00 00     lwz     r11,0(r1)
  2c:   83 eb ff fc     lwz     r31,-4(r11)
  30:   7d 61 5b 78     mr      r1,r11
  34:   4e 80 00 20     blr

00000038 <nonleaf_call>:
  38:   94 21 ff c0     stwu    r1,-64(r1)             ; |           open frame and store sp at top of stack
  3c:   7c 08 02 a6     mflr    r0                     ; |           lr -> gpr0
  40:   93 e1 00 3c     stw     r31,60(r1)             ; | prolog    store gpr31
  44:   90 01 00 44     stw     r0,68(r1)              ; |           store lr
  48:   7c 3f 0b 78     mr      r31,r1                 ; /           sp -> gpr31, latter used for some fixed addressing below
  4c:   90 7f 00 08     stw     r3,8(r31)              ; \
  50:   90 9f 00 0c     stw     r4,12(r31)             ; |
  54:   90 bf 00 10     stw     r5,16(r31)             ; |
  58:   90 df 00 14     stw     r6,20(r31)             ; |
  5c:   90 ff 00 18     stw     r7,24(r31)             ; | all in args -> temp space in local area
  60:   91 1f 00 1c     stw     r8,28(r31)             ; |
  64:   91 3f 00 20     stw     r9,32(r31)             ; |
  68:   91 5f 00 24     stw     r10,36(r31)            ; |
  6c:   80 01 00 00     lwz     r0,0(r1)               ; fetch sp saved on stack of top by prolog -> gpr0, and ...
  70:   94 01 ff 10     stwu    r0,-240(r1)            ; ... update it further up the stack for alloca(220) - with padding to guarantee alignment
  74:   39 21 00 08     addi    r9,r1,8                ; |
  78:   91 3f 00 28     stw     r9,40(r31)             ; |
  7c:   81 3f 00 28     lwz     r9,40(r31)             ; |
  80:   38 09 00 0f     addi    r0,r9,15               ; | start of alloca()'d memory -> gpr9, by ...
  84:   54 00 e1 3e     rlwinm  r0,r0,28,4,31          ; | ... using gpr0 as helper to align to 16b, leaving at least 8b at top of stock
  88:   54 00 20 36     rlwinm  r0,r0,4,0,27           ; |
  8c:   90 1f 00 28     stw     r0,40(r31)             ; |
  90:   81 3f 00 28     lwz     r9,40(r31)             ; |
  94:   38 00 00 4c     li      r0,76                  ; 'L' -> gpr0, and ...
  98:   98 09 00 00     stb     r0,0(r9)               ; ... store in local area (of alloca()'d space)
  9c:   80 7f 00 0c     lwz     r3,12(r31)             ; arg 0
  a0:   80 9f 00 10     lwz     r4,16(r31)             ; arg 1
  a4:   80 bf 00 14     lwz     r5,20(r31)             ; arg 2
  a8:   80 df 00 18     lwz     r6,24(r31)             ; arg 3
  ac:   80 ff 00 1c     lwz     r7,28(r31)             ; arg 4
  b0:   81 1f 00 20     lwz     r8,32(r31)             ; arg 5
  b4:   81 3f 00 24     lwz     r9,36(r31)             ; arg 6
  b8:   48 00 00 01     bl      b8 <nonleaf_call+0x80> ; call and put return address -> lr
  bc:   81 61 00 00     lwz     r11,0(r1)              ; |
  c0:   80 0b 00 04     lwz     r0,4(r11)              ; |
  c4:   7c 08 03 a6     mtlr    r0                     ; |
  c8:   83 eb ff fc     lwz     r31,-4(r11)            ; | epilog
  cc:   7d 61 5b 78     mr      r1,r11                 ; |
  d0:   4e 80 00 20     blr                            ; |

000000d4 <main>:
  d4:   94 21 ff f0     stwu    r1,-16(r1)             ; |
  d8:   7c 08 02 a6     mflr    r0                     ; |
  dc:   93 e1 00 0c     stw     r31,12(r1)             ; | prolog
  e0:   90 01 00 14     stw     r0,20(r1)              ; |
  e4:   7c 3f 0b 78     mr      r31,r1                 ; |
  e8:   38 60 00 00     li      r3,0                   ; arg 0
  ec:   38 80 00 01     li      r4,1                   ; arg 1
  f0:   38 a0 00 02     li      r5,2                   ; arg 2
  f4:   38 c0 00 03     li      r6,3                   ; arg 3
  f8:   38 e0 00 04     li      r7,4                   ; arg 4
  fc:   39 00 00 05     li      r8,5                   ; arg 5
 100:   39 20 00 06     li      r9,6                   ; arg 6
 104:   39 40 00 07     li      r10,7                  ; arg 7
 108:   48 00 00 01     bl      108 <main+0x34>        ; call and put return address -> lr
 10c:   38 00 00 00     li      r0,0                   ; return value (pointlessly) via gpr0 ...
 110:   7c 03 03 78     mr      r3,r0                  ; ... to gpr3
 114:   81 61 00 00     lwz     r11,0(r1)              ; |
 118:   80 0b 00 04     lwz     r0,4(r11)              ; |
 11c:   7c 08 03 a6     mtlr    r0                     ; |
 120:   83 eb ff fc     lwz     r31,-4(r11)            ; | epilog
 124:   7d 61 5b 78     mr      r1,r11                 ; |
 128:   4e 80 00 20     blr                            ; |



; output from netbsd-4.0.1-macppc w/ gcc 4.1.2

00000000 <leaf_call>:
   0:   94 21 ff c0     stwu    r1,-64(r1)
   4:   93 e1 00 3c     stw     r31,60(r1)
   8:   7c 3f 0b 78     mr      r31,r1
   c:   90 7f 00 08     stw     r3,8(r31)
  10:   90 9f 00 0c     stw     r4,12(r31)
  14:   90 bf 00 10     stw     r5,16(r31)
  18:   90 df 00 14     stw     r6,20(r31)
  1c:   90 ff 00 18     stw     r7,24(r31)
  20:   91 1f 00 1c     stw     r8,28(r31)
  24:   91 3f 00 20     stw     r9,32(r31)
  28:   81 61 00 00     lwz     r11,0(r1)
  2c:   83 eb ff fc     lwz     r31,-4(r11)
  30:   7d 61 5b 78     mr      r1,r11
  34:   4e 80 00 20     blr

00000038 <nonleaf_call>:
  38:   94 21 ff c0     stwu    r1,-64(r1)
  3c:   7c 08 02 a6     mflr    r0
  40:   93 e1 00 3c     stw     r31,60(r1)
  44:   90 01 00 44     stw     r0,68(r1)
  48:   7c 3f 0b 78     mr      r31,r1
  4c:   90 7f 00 08     stw     r3,8(r31)
  50:   90 9f 00 0c     stw     r4,12(r31)
  54:   90 bf 00 10     stw     r5,16(r31)
  58:   90 df 00 14     stw     r6,20(r31)
  5c:   90 ff 00 18     stw     r7,24(r31)
  60:   91 1f 00 1c     stw     r8,28(r31)
  64:   91 3f 00 20     stw     r9,32(r31)
  68:   91 5f 00 24     stw     r10,36(r31)
  6c:   80 01 00 00     lwz     r0,0(r1)
  70:   94 01 ff 10     stwu    r0,-240(r1)
  74:   39 21 00 08     addi    r9,r1,8
  78:   91 3f 00 28     stw     r9,40(r31)
  7c:   81 3f 00 28     lwz     r9,40(r31)
  80:   38 09 00 0f     addi    r0,r9,15
  84:   54 00 e1 3e     rlwinm  r0,r0,28,4,31
  88:   54 00 20 36     rlwinm  r0,r0,4,0,27
  8c:   90 1f 00 28     stw     r0,40(r31)
  90:   81 3f 00 28     lwz     r9,40(r31)
  94:   38 00 00 4c     li      r0,76
  98:   98 09 00 00     stb     r0,0(r9)
  9c:   80 7f 00 0c     lwz     r3,12(r31)
  a0:   80 9f 00 10     lwz     r4,16(r31)
  a4:   80 bf 00 14     lwz     r5,20(r31)
  a8:   80 df 00 18     lwz     r6,24(r31)
  ac:   80 ff 00 1c     lwz     r7,28(r31)
  b0:   81 1f 00 20     lwz     r8,32(r31)
  b4:   81 3f 00 24     lwz     r9,36(r31)
  b8:   48 00 00 01     bl      b8 <nonleaf_call+0x80>
  bc:   81 61 00 00     lwz     r11,0(r1)
  c0:   80 0b 00 04     lwz     r0,4(r11)
  c4:   7c 08 03 a6     mtlr    r0
  c8:   83 eb ff fc     lwz     r31,-4(r11)
  cc:   7d 61 5b 78     mr      r1,r11
  d0:   4e 80 00 20     blr

000000d4 <main>:
  d4:   94 21 ff e0     stwu    r1,-32(r1)
  d8:   7c 08 02 a6     mflr    r0
  dc:   93 e1 00 1c     stw     r31,28(r1)
  e0:   90 01 00 24     stw     r0,36(r1)
  e4:   7c 3f 0b 78     mr      r31,r1
  e8:   38 60 00 00     li      r3,0
  ec:   38 80 00 01     li      r4,1
  f0:   38 a0 00 02     li      r5,2
  f4:   38 c0 00 03     li      r6,3
  f8:   38 e0 00 04     li      r7,4
  fc:   39 00 00 05     li      r8,5
 100:   39 20 00 06     li      r9,6
 104:   39 40 00 07     li      r10,7
 108:   48 00 00 01     bl      108 <main+0x34>
 10c:   38 00 00 00     li      r0,0
 110:   7c 03 03 78     mr      r3,r0
 114:   81 61 00 00     lwz     r11,0(r1)
 118:   80 0b 00 04     lwz     r0,4(r11)
 11c:   7c 08 03 a6     mtlr    r0
 120:   83 eb ff fc     lwz     r31,-4(r11)
 124:   7d 61 5b 78     mr      r1,r11
 128:   4e 80 00 20     blr



; ------------- check register skipping for 64bit args ----------->

; void call(int a, long long b, int c, int d, long long e, long long f)
; {
; }
; 
; int main()
; {
; 	call(0,1,2,3,4,5);
; 	return 1;
; }



; output from debian-4.1.1-21-ppc w/ gcc 4.1.2

00000000 <call>:
   0:   94 21 ff d0     stwu    r1,-48(r1)
   4:   93 e1 00 2c     stw     r31,44(r1)
   8:   7c 3f 0b 78     mr      r31,r1
   c:   90 7f 00 08     stw     r3,8(r31)
  10:   90 bf 00 10     stw     r5,16(r31)
  14:   90 df 00 14     stw     r6,20(r31)
  18:   90 ff 00 18     stw     r7,24(r31)
  1c:   91 1f 00 1c     stw     r8,28(r31)
  20:   91 3f 00 20     stw     r9,32(r31)
  24:   91 5f 00 24     stw     r10,36(r31)
  28:   81 61 00 00     lwz     r11,0(r1)
  2c:   83 eb ff fc     lwz     r31,-4(r11)
  30:   7d 61 5b 78     mr      r1,r11
  34:   4e 80 00 20     blr

00000038 <main>:
  38:   94 21 ff e0     stwu    r1,-32(r1)     ; |
  3c:   7c 08 02 a6     mflr    r0             ; |
  40:   93 e1 00 1c     stw     r31,28(r1)     ; | prolog
  44:   90 01 00 24     stw     r0,36(r1)      ; |
  48:   7c 3f 0b 78     mr      r31,r1         ; /
  4c:   39 20 00 00     li      r9,0           ; \
  50:   39 40 00 05     li      r10,5          ; |
  54:   91 21 00 08     stw     r9,8(r1)       ; | arg 5 via stack
  58:   91 41 00 0c     stw     r10,12(r1)     ; |
  5c:   38 60 00 00     li      r3,0           ; arg 0
  60:   38 a0 00 00     li      r5,0           ; |
  64:   38 c0 00 01     li      r6,1           ; | arg 1 (note that r4 is skipped)
  68:   38 e0 00 02     li      r7,2           ; arg 2
  6c:   39 00 00 03     li      r8,3           ; arg 3
  70:   39 20 00 00     li      r9,0           ; |
  74:   39 40 00 04     li      r10,4          ; | arg 4
  78:   48 00 00 01     bl      78 <main+0x40> ; call and put return address -> lr
  7c:   38 00 00 01     li      r0,1           ; return value (pointlessly) via gpr0 ...
  80:   7c 03 03 78     mr      r3,r0          ; ... to gpr3
  84:   81 61 00 00     lwz     r11,0(r1)      ; |
  88:   80 0b 00 04     lwz     r0,4(r11)      ; |
  8c:   7c 08 03 a6     mtlr    r0             ; |
  90:   83 eb ff fc     lwz     r31,-4(r11)    ; | epilog
  94:   7d 61 5b 78     mr      r1,r11         ; |
  98:   4e 80 00 20     blr                    ; |



; ------------- var args with ints and floats to see spilling (which remains only int regs), b/c doubles are passed via them and floats are promoted to doubles in (...) ----------->

; #include <stdlib.h>
; #include <stdarg.h>
; 
; void leaf_call(int b, int c, int d, int e, float f, float g, int h, int i, float j)
; {
; }
; 
; void nonleaf_call(int a, ...)
; {
;     int b, c, d, e, h, i;
;     float f, g, j;
;     va_list ap;
;     va_start(ap, a);
;     b = va_arg(ap, int);
;     c = va_arg(ap, int);
;     d = va_arg(ap, int);
;     e = va_arg(ap, int);
;     f = (float)va_arg(ap, double);
;     g = (float)va_arg(ap, double);
;     h = va_arg(ap, int);
;     i = va_arg(ap, int);
;     j = (float)va_arg(ap, double);
;     /* use some local data */
;     *(char*)alloca(220) = 'L';
;     leaf_call(b, c, d, e, f, g, h, i, j);
; }
; 
; int main()
; {
;     nonleaf_call(0, 1, 2, 3, 4, 5.f, 6.f, 7, 8, 9.f);
;     return 0;
; }



; output from debian-4.1.1-21-ppc w/ gcc 4.1.2

00000000 <leaf_call>:
   0:   94 21 ff c0     stwu    r1,-64(r1)
   4:   93 e1 00 3c     stw     r31,60(r1)
   8:   7c 3f 0b 78     mr      r31,r1
   c:   90 7f 00 08     stw     r3,8(r31)
  10:   90 9f 00 0c     stw     r4,12(r31)
  14:   90 bf 00 10     stw     r5,16(r31)
  18:   90 df 00 14     stw     r6,20(r31)
  1c:   d0 3f 00 18     stfs    f1,24(r31)
  20:   d0 5f 00 1c     stfs    f2,28(r31)
  24:   90 ff 00 20     stw     r7,32(r31)
  28:   91 1f 00 24     stw     r8,36(r31)
  2c:   d0 7f 00 28     stfs    f3,40(r31)
  30:   81 61 00 00     lwz     r11,0(r1)
  34:   83 eb ff fc     lwz     r31,-4(r11)
  38:   7d 61 5b 78     mr      r1,r11
  3c:   4e 80 00 20     blr

00000040 <nonleaf_call>:
  40:   94 21 ff 30     stwu    r1,-208(r1)
  44:   7c 08 02 a6     mflr    r0
  48:   93 e1 00 cc     stw     r31,204(r1)
  4c:   90 01 00 d4     stw     r0,212(r1)
  50:   7c 3f 0b 78     mr      r31,r1
  54:   90 9f 00 3c     stw     r4,60(r31)
  58:   90 bf 00 40     stw     r5,64(r31)
  5c:   90 df 00 44     stw     r6,68(r31)
  60:   90 ff 00 48     stw     r7,72(r31)
  64:   91 1f 00 4c     stw     r8,76(r31)
  68:   91 3f 00 50     stw     r9,80(r31)
  6c:   91 5f 00 54     stw     r10,84(r31)
  70:   40 86 00 24     bne-    cr1,94 <nonleaf_call+0x54>
  74:   d8 3f 00 58     stfd    f1,88(r31)
  78:   d8 5f 00 60     stfd    f2,96(r31)
  7c:   d8 7f 00 68     stfd    f3,104(r31)
  80:   d8 9f 00 70     stfd    f4,112(r31)
  84:   d8 bf 00 78     stfd    f5,120(r31)
  88:   d8 df 00 80     stfd    f6,128(r31)
  8c:   d8 ff 00 88     stfd    f7,136(r31)
  90:   d9 1f 00 90     stfd    f8,144(r31)
  94:   90 7f 00 98     stw     r3,152(r31)
  98:   38 00 00 01     li      r0,1
  9c:   98 1f 00 2c     stb     r0,44(r31)
  a0:   38 00 00 00     li      r0,0
  a4:   98 1f 00 2d     stb     r0,45(r31)
  a8:   38 1f 00 d8     addi    r0,r31,216  ; make r0 point to start of prev frame's param area (would make sense as no spill area to define param area start for iteration)
  ac:   90 1f 00 30     stw     r0,48(r31)
  b0:   38 1f 00 38     addi    r0,r31,56   ; make r0 point to end of prev frame's param area (would make sense as no spill area to define param area end for iteration)
  b4:   90 1f 00 34     stw     r0,52(r31)
  b8:   88 1f 00 2c     lbz     r0,44(r31)
  bc:   54 00 06 3e     clrlwi  r0,r0,24
  c0:   2b 80 00 08     cmplwi  cr7,r0,8
  c4:   40 9c 00 30     bge-    cr7,f4 <nonleaf_call+0xb4>
  c8:   81 7f 00 34     lwz     r11,52(r31)
  cc:   88 1f 00 2c     lbz     r0,44(r31)
  d0:   54 09 06 3e     clrlwi  r9,r0,24
  d4:   7d 20 4b 78     mr      r0,r9
  d8:   54 00 10 3a     rlwinm  r0,r0,2,0,29
  dc:   7d 6b 02 14     add     r11,r11,r0
  e0:   91 7f 00 c0     stw     r11,192(r31)
  e4:   38 09 00 01     addi    r0,r9,1
  e8:   54 00 06 3e     clrlwi  r0,r0,24
  ec:   98 1f 00 2c     stb     r0,44(r31)
  f0:   48 00 00 14     b       104 <nonleaf_call+0xc4>
  f4:   81 3f 00 30     lwz     r9,48(r31)
  f8:   91 3f 00 c0     stw     r9,192(r31)
  fc:   38 09 00 04     addi    r0,r9,4
 100:   90 1f 00 30     stw     r0,48(r31)
 104:   81 3f 00 c0     lwz     r9,192(r31)
 108:   80 09 00 00     lwz     r0,0(r9)
 10c:   90 1f 00 28     stw     r0,40(r31)
 110:   88 1f 00 2c     lbz     r0,44(r31)
 114:   54 00 06 3e     clrlwi  r0,r0,24
 118:   2b 80 00 08     cmplwi  cr7,r0,8
 11c:   40 9c 00 30     bge-    cr7,14c <nonleaf_call+0x10c>
 120:   81 7f 00 34     lwz     r11,52(r31)
 124:   88 1f 00 2c     lbz     r0,44(r31)
 128:   54 09 06 3e     clrlwi  r9,r0,24
 12c:   7d 20 4b 78     mr      r0,r9
 130:   54 00 10 3a     rlwinm  r0,r0,2,0,29
 134:   7d 6b 02 14     add     r11,r11,r0
 138:   91 7f 00 bc     stw     r11,188(r31)
 13c:   38 09 00 01     addi    r0,r9,1
 140:   54 00 06 3e     clrlwi  r0,r0,24
 144:   98 1f 00 2c     stb     r0,44(r31)
 148:   48 00 00 14     b       15c <nonleaf_call+0x11c>
 14c:   81 3f 00 30     lwz     r9,48(r31)
 150:   91 3f 00 bc     stw     r9,188(r31)
 154:   38 09 00 04     addi    r0,r9,4
 158:   90 1f 00 30     stw     r0,48(r31)
 15c:   81 3f 00 bc     lwz     r9,188(r31)
 160:   80 09 00 00     lwz     r0,0(r9)
 164:   90 1f 00 24     stw     r0,36(r31)
 168:   88 1f 00 2c     lbz     r0,44(r31)
 16c:   54 00 06 3e     clrlwi  r0,r0,24
 170:   2b 80 00 08     cmplwi  cr7,r0,8
 174:   40 9c 00 30     bge-    cr7,1a4 <nonleaf_call+0x164>
 178:   81 7f 00 34     lwz     r11,52(r31)
 17c:   88 1f 00 2c     lbz     r0,44(r31)
 180:   54 09 06 3e     clrlwi  r9,r0,24
 184:   7d 20 4b 78     mr      r0,r9
 188:   54 00 10 3a     rlwinm  r0,r0,2,0,29
 18c:   7d 6b 02 14     add     r11,r11,r0
 190:   91 7f 00 b8     stw     r11,184(r31)
 194:   38 09 00 01     addi    r0,r9,1
 198:   54 00 06 3e     clrlwi  r0,r0,24
 19c:   98 1f 00 2c     stb     r0,44(r31)
 1a0:   48 00 00 14     b       1b4 <nonleaf_call+0x174>
 1a4:   81 3f 00 30     lwz     r9,48(r31)
 1a8:   91 3f 00 b8     stw     r9,184(r31)
 1ac:   38 09 00 04     addi    r0,r9,4
 1b0:   90 1f 00 30     stw     r0,48(r31)
 1b4:   81 3f 00 b8     lwz     r9,184(r31)
 1b8:   80 09 00 00     lwz     r0,0(r9)
 1bc:   90 1f 00 20     stw     r0,32(r31)
 1c0:   88 1f 00 2c     lbz     r0,44(r31)
 1c4:   54 00 06 3e     clrlwi  r0,r0,24
 1c8:   2b 80 00 08     cmplwi  cr7,r0,8
 1cc:   40 9c 00 30     bge-    cr7,1fc <nonleaf_call+0x1bc>
 1d0:   81 7f 00 34     lwz     r11,52(r31)
 1d4:   88 1f 00 2c     lbz     r0,44(r31)
 1d8:   54 09 06 3e     clrlwi  r9,r0,24
 1dc:   7d 20 4b 78     mr      r0,r9
 1e0:   54 00 10 3a     rlwinm  r0,r0,2,0,29
 1e4:   7d 6b 02 14     add     r11,r11,r0
 1e8:   91 7f 00 b4     stw     r11,180(r31)
 1ec:   38 09 00 01     addi    r0,r9,1
 1f0:   54 00 06 3e     clrlwi  r0,r0,24
 1f4:   98 1f 00 2c     stb     r0,44(r31)
 1f8:   48 00 00 14     b       20c <nonleaf_call+0x1cc>
 1fc:   81 3f 00 30     lwz     r9,48(r31)
 200:   91 3f 00 b4     stw     r9,180(r31)
 204:   38 09 00 04     addi    r0,r9,4
 208:   90 1f 00 30     stw     r0,48(r31)
 20c:   81 3f 00 b4     lwz     r9,180(r31)
 210:   80 09 00 00     lwz     r0,0(r9)
 214:   90 1f 00 1c     stw     r0,28(r31)
 218:   88 1f 00 2d     lbz     r0,45(r31)
 21c:   54 00 06 3e     clrlwi  r0,r0,24
 220:   2b 80 00 08     cmplwi  cr7,r0,8
 224:   40 9c 00 34     bge-    cr7,258 <nonleaf_call+0x218>
 228:   81 3f 00 34     lwz     r9,52(r31)
 22c:   39 69 00 20     addi    r11,r9,32
 230:   88 1f 00 2d     lbz     r0,45(r31)
 234:   54 09 06 3e     clrlwi  r9,r0,24
 238:   7d 20 4b 78     mr      r0,r9
 23c:   54 00 18 38     rlwinm  r0,r0,3,0,28
 240:   7d 6b 02 14     add     r11,r11,r0
 244:   91 7f 00 b0     stw     r11,176(r31)
 248:   38 09 00 01     addi    r0,r9,1
 24c:   54 00 06 3e     clrlwi  r0,r0,24
 250:   98 1f 00 2d     stb     r0,45(r31)
 254:   48 00 00 1c     b       270 <nonleaf_call+0x230>
 258:   81 3f 00 30     lwz     r9,48(r31)
 25c:   38 09 00 07     addi    r0,r9,7
 260:   54 09 00 38     rlwinm  r9,r0,0,0,28
 264:   91 3f 00 b0     stw     r9,176(r31)
 268:   38 09 00 08     addi    r0,r9,8
 26c:   90 1f 00 30     stw     r0,48(r31)
 270:   81 3f 00 b0     lwz     r9,176(r31)
 274:   c8 09 00 00     lfd     f0,0(r9)
 278:   fc 00 00 18     frsp    f0,f0
 27c:   d0 1f 00 10     stfs    f0,16(r31)
 280:   88 1f 00 2d     lbz     r0,45(r31)
 284:   54 00 06 3e     clrlwi  r0,r0,24
 288:   2b 80 00 08     cmplwi  cr7,r0,8
 28c:   40 9c 00 34     bge-    cr7,2c0 <nonleaf_call+0x280>
 290:   81 3f 00 34     lwz     r9,52(r31)
 294:   39 69 00 20     addi    r11,r9,32
 298:   88 1f 00 2d     lbz     r0,45(r31)
 29c:   54 09 06 3e     clrlwi  r9,r0,24
 2a0:   7d 20 4b 78     mr      r0,r9
 2a4:   54 00 18 38     rlwinm  r0,r0,3,0,28
 2a8:   7d 6b 02 14     add     r11,r11,r0
 2ac:   91 7f 00 ac     stw     r11,172(r31)
 2b0:   38 09 00 01     addi    r0,r9,1
 2b4:   54 00 06 3e     clrlwi  r0,r0,24
 2b8:   98 1f 00 2d     stb     r0,45(r31)
 2bc:   48 00 00 1c     b       2d8 <nonleaf_call+0x298>
 2c0:   81 3f 00 30     lwz     r9,48(r31)
 2c4:   38 09 00 07     addi    r0,r9,7
 2c8:   54 09 00 38     rlwinm  r9,r0,0,0,28
 2cc:   91 3f 00 ac     stw     r9,172(r31)
 2d0:   38 09 00 08     addi    r0,r9,8
 2d4:   90 1f 00 30     stw     r0,48(r31)
 2d8:   81 3f 00 ac     lwz     r9,172(r31)
 2dc:   c8 09 00 00     lfd     f0,0(r9)
 2e0:   fc 00 00 18     frsp    f0,f0
 2e4:   d0 1f 00 0c     stfs    f0,12(r31)
 2e8:   88 1f 00 2c     lbz     r0,44(r31)
 2ec:   54 00 06 3e     clrlwi  r0,r0,24
 2f0:   2b 80 00 08     cmplwi  cr7,r0,8
 2f4:   40 9c 00 30     bge-    cr7,324 <nonleaf_call+0x2e4>
 2f8:   81 7f 00 34     lwz     r11,52(r31)
 2fc:   88 1f 00 2c     lbz     r0,44(r31)
 300:   54 09 06 3e     clrlwi  r9,r0,24
 304:   7d 20 4b 78     mr      r0,r9
 308:   54 00 10 3a     rlwinm  r0,r0,2,0,29
 30c:   7d 6b 02 14     add     r11,r11,r0
 310:   91 7f 00 a8     stw     r11,168(r31)
 314:   38 09 00 01     addi    r0,r9,1
 318:   54 00 06 3e     clrlwi  r0,r0,24
 31c:   98 1f 00 2c     stb     r0,44(r31)
 320:   48 00 00 14     b       334 <nonleaf_call+0x2f4>
 324:   81 3f 00 30     lwz     r9,48(r31)
 328:   91 3f 00 a8     stw     r9,168(r31)
 32c:   38 09 00 04     addi    r0,r9,4
 330:   90 1f 00 30     stw     r0,48(r31)
 334:   81 3f 00 a8     lwz     r9,168(r31)
 338:   80 09 00 00     lwz     r0,0(r9)
 33c:   90 1f 00 18     stw     r0,24(r31)
 340:   88 1f 00 2c     lbz     r0,44(r31)
 344:   54 00 06 3e     clrlwi  r0,r0,24
 348:   2b 80 00 08     cmplwi  cr7,r0,8
 34c:   40 9c 00 30     bge-    cr7,37c <nonleaf_call+0x33c>
 350:   81 7f 00 34     lwz     r11,52(r31)
 354:   88 1f 00 2c     lbz     r0,44(r31)
 358:   54 09 06 3e     clrlwi  r9,r0,24
 35c:   7d 20 4b 78     mr      r0,r9
 360:   54 00 10 3a     rlwinm  r0,r0,2,0,29
 364:   7d 6b 02 14     add     r11,r11,r0
 368:   91 7f 00 a4     stw     r11,164(r31)
 36c:   38 09 00 01     addi    r0,r9,1
 370:   54 00 06 3e     clrlwi  r0,r0,24
 374:   98 1f 00 2c     stb     r0,44(r31)
 378:   48 00 00 14     b       38c <nonleaf_call+0x34c>
 37c:   81 3f 00 30     lwz     r9,48(r31)
 380:   91 3f 00 a4     stw     r9,164(r31)
 384:   38 09 00 04     addi    r0,r9,4
 388:   90 1f 00 30     stw     r0,48(r31)
 38c:   81 3f 00 a4     lwz     r9,164(r31)
 390:   80 09 00 00     lwz     r0,0(r9)
 394:   90 1f 00 14     stw     r0,20(r31)
 398:   88 1f 00 2d     lbz     r0,45(r31)
 39c:   54 00 06 3e     clrlwi  r0,r0,24
 3a0:   2b 80 00 08     cmplwi  cr7,r0,8
 3a4:   40 9c 00 34     bge-    cr7,3d8 <nonleaf_call+0x398>
 3a8:   81 3f 00 34     lwz     r9,52(r31)
 3ac:   39 69 00 20     addi    r11,r9,32
 3b0:   88 1f 00 2d     lbz     r0,45(r31)
 3b4:   54 09 06 3e     clrlwi  r9,r0,24
 3b8:   7d 20 4b 78     mr      r0,r9
 3bc:   54 00 18 38     rlwinm  r0,r0,3,0,28
 3c0:   7d 6b 02 14     add     r11,r11,r0
 3c4:   91 7f 00 a0     stw     r11,160(r31)
 3c8:   38 09 00 01     addi    r0,r9,1
 3cc:   54 00 06 3e     clrlwi  r0,r0,24
 3d0:   98 1f 00 2d     stb     r0,45(r31)
 3d4:   48 00 00 1c     b       3f0 <nonleaf_call+0x3b0>
 3d8:   81 3f 00 30     lwz     r9,48(r31)
 3dc:   38 09 00 07     addi    r0,r9,7
 3e0:   54 09 00 38     rlwinm  r9,r0,0,0,28
 3e4:   91 3f 00 a0     stw     r9,160(r31)
 3e8:   38 09 00 08     addi    r0,r9,8
 3ec:   90 1f 00 30     stw     r0,48(r31)
 3f0:   81 3f 00 a0     lwz     r9,160(r31)
 3f4:   c8 09 00 00     lfd     f0,0(r9)
 3f8:   fc 00 00 18     frsp    f0,f0
 3fc:   d0 1f 00 08     stfs    f0,8(r31)
 400:   80 01 00 00     lwz     r0,0(r1)
 404:   94 01 ff 10     stwu    r0,-240(r1)
 408:   39 21 00 08     addi    r9,r1,8
 40c:   91 3f 00 9c     stw     r9,156(r31)
 410:   81 3f 00 9c     lwz     r9,156(r31)
 414:   38 09 00 0f     addi    r0,r9,15
 418:   54 00 e1 3e     rlwinm  r0,r0,28,4,31
 41c:   54 00 20 36     rlwinm  r0,r0,4,0,27
 420:   90 1f 00 9c     stw     r0,156(r31)
 424:   81 3f 00 9c     lwz     r9,156(r31)
 428:   38 00 00 4c     li      r0,76
 42c:   98 09 00 00     stb     r0,0(r9)
 430:   80 7f 00 28     lwz     r3,40(r31)
 434:   80 9f 00 24     lwz     r4,36(r31)
 438:   80 bf 00 20     lwz     r5,32(r31)
 43c:   80 df 00 1c     lwz     r6,28(r31)
 440:   c0 3f 00 10     lfs     f1,16(r31)
 444:   c0 5f 00 0c     lfs     f2,12(r31)
 448:   80 ff 00 18     lwz     r7,24(r31)
 44c:   81 1f 00 14     lwz     r8,20(r31)
 450:   c0 7f 00 08     lfs     f3,8(r31)
 454:   48 00 00 01     bl      454 <nonleaf_call+0x414>
 458:   81 61 00 00     lwz     r11,0(r1)
 45c:   80 0b 00 04     lwz     r0,4(r11)
 460:   7c 08 03 a6     mtlr    r0
 464:   83 eb ff fc     lwz     r31,-4(r11)
 468:   7d 61 5b 78     mr      r1,r11
 46c:   4e 80 00 20     blr

00000470 <main>:
 470:   94 21 ff f0     stwu    r1,-16(r1)      ; |
 474:   7c 08 02 a6     mflr    r0              ; |
 478:   93 e1 00 0c     stw     r31,12(r1)      ; | prolog
 47c:   90 01 00 14     stw     r0,20(r1)       ; |
 480:   7c 3f 0b 78     mr      r31,r1          ; /
 484:   3d 20 00 00     lis     r9,0            ; \ prep arg 5 (float, but double in reg & ellipsis), load from 0 b/c objdump is from .o, not finally linked exec
 488:   c8 09 00 00     lfd     f0,0(r9)        ; /
 48c:   3d 20 00 00     lis     r9,0            ; \ prep arg 6 (float, but double in reg & ellipsis), load from 0 b/c objdump is from .o, not finally linked exec
 490:   c9 a9 00 08     lfd     f13,8(r9)       ; /
 494:   3d 20 00 00     lis     r9,0            ; \ prep arg 9 (float, but double in reg & ellipsis), load from 0 b/c objdump is from .o, not finally linked exec
 498:   c9 89 00 10     lfd     f12,16(r9)      ; /
 49c:   38 60 00 00     li      r3,0            ; arg 0
 4a0:   38 80 00 01     li      r4,1            ; arg 1
 4a4:   38 a0 00 02     li      r5,2            ; arg 2
 4a8:   38 c0 00 03     li      r6,3            ; arg 3
 4ac:   38 e0 00 04     li      r7,4            ; arg 4
 4b0:   fc 20 00 90     fmr     f1,f0           ; arg 5
 4b4:   fc 40 68 90     fmr     f2,f13          ; arg 6
 4b8:   39 00 00 07     li      r8,7            ; arg 7
 4bc:   39 20 00 08     li      r9,8            ; arg 8
 4c0:   fc 60 60 90     fmr     f3,f12          ; arg 9
 4c4:   4c c6 32 42     crset   4*cr1+eq        ; set CR bit for ellipsis call
 4c8:   48 00 00 01     bl      4c8 <main+0x58> ; call and put return address -> lr
 4cc:   38 00 00 00     li      r0,0            ; return value (pointlessly) via gpr0 ...
 4d0:   7c 03 03 78     mr      r3,r0           ; ... to gpr3
 4d4:   81 61 00 00     lwz     r11,0(r1)       ; |
 4d8:   80 0b 00 04     lwz     r0,4(r11)       ; |
 4dc:   7c 08 03 a6     mtlr    r0              ; |
 4e0:   83 eb ff fc     lwz     r31,-4(r11)     ; | epilog
 4e4:   7d 61 5b 78     mr      r1,r11          ; |
 4e8:   4e 80 00 20     blr                     ; |



; ---------- structs by value ---------->
;
; struct A { int i, j; long long l; };
;
; void leaf_call(int b, int c, int d, int e, struct A f, int g, int h)
; {
; }
;
; void nonleaf_call(int a, int b, int c, int d, int e, struct A f, int g, int h)
; {
;     /* use some local data */
;     char l[100] = { 'L' };
;     leaf_call(b, c, d, e, f, g, h);
; }
;
; int main()
; {
;     nonleaf_call(0, 1, 2, 3, 4, (struct A){5, 6, 7ll}, 8, 9);
;     return 0;
; }



; output from debian-4.1.1-21-ppc w/ gcc 4.1.2

00000000 <leaf_call>:
   0:   94 21 ff d0     stwu    r1,-48(r1)
   4:   93 e1 00 2c     stw     r31,44(r1)
   8:   7c 3f 0b 78     mr      r31,r1
   c:   90 7f 00 08     stw     r3,8(r31)
  10:   90 9f 00 0c     stw     r4,12(r31)
  14:   90 bf 00 10     stw     r5,16(r31)
  18:   90 df 00 14     stw     r6,20(r31)
  1c:   91 1f 00 18     stw     r8,24(r31)
  20:   91 3f 00 1c     stw     r9,28(r31)
  24:   81 61 00 00     lwz     r11,0(r1)
  28:   83 eb ff fc     lwz     r31,-4(r11)
  2c:   7d 61 5b 78     mr      r1,r11
  30:   4e 80 00 20     blr

00000034 <nonleaf_call>:
  34:   94 21 ff 40     stwu    r1,-192(r1)
  38:   7c 08 02 a6     mflr    r0
  3c:   93 a1 00 b4     stw     r29,180(r1)
  40:   93 e1 00 bc     stw     r31,188(r1)
  44:   90 01 00 c4     stw     r0,196(r1)
  48:   7c 3f 0b 78     mr      r31,r1
  4c:   90 7f 00 78     stw     r3,120(r31)
  50:   90 9f 00 7c     stw     r4,124(r31)
  54:   90 bf 00 80     stw     r5,128(r31)
  58:   90 df 00 84     stw     r6,132(r31)
  5c:   90 ff 00 88     stw     r7,136(r31)
  60:   7d 1d 43 78     mr      r29,r8
  64:   91 3f 00 8c     stw     r9,140(r31)
  68:   91 5f 00 90     stw     r10,144(r31)
  6c:   38 1f 00 08     addi    r0,r31,8
  70:   39 20 00 64     li      r9,100
  74:   7c 03 03 78     mr      r3,r0
  78:   38 80 00 00     li      r4,0
  7c:   7d 25 4b 78     mr      r5,r9
  80:   48 00 00 01     bl      80 <nonleaf_call+0x4c>
  84:   38 00 00 4c     li      r0,76
  88:   98 1f 00 08     stb     r0,8(r31)
  8c:   80 1d 00 00     lwz     r0,0(r29)
  90:   81 3d 00 04     lwz     r9,4(r29)
  94:   81 7d 00 08     lwz     r11,8(r29)
  98:   81 5d 00 0c     lwz     r10,12(r29)
  9c:   90 1f 00 a0     stw     r0,160(r31)
  a0:   91 3f 00 a4     stw     r9,164(r31)
  a4:   91 7f 00 a8     stw     r11,168(r31)
  a8:   91 5f 00 ac     stw     r10,172(r31)
  ac:   38 1f 00 a0     addi    r0,r31,160
  b0:   80 7f 00 7c     lwz     r3,124(r31)
  b4:   80 9f 00 80     lwz     r4,128(r31)
  b8:   80 bf 00 84     lwz     r5,132(r31)
  bc:   80 df 00 88     lwz     r6,136(r31)
  c0:   7c 07 03 78     mr      r7,r0
  c4:   81 1f 00 8c     lwz     r8,140(r31)
  c8:   81 3f 00 90     lwz     r9,144(r31)
  cc:   48 00 00 01     bl      cc <nonleaf_call+0x98>
  d0:   81 61 00 00     lwz     r11,0(r1)
  d4:   80 0b 00 04     lwz     r0,4(r11)
  d8:   7c 08 03 a6     mtlr    r0
  dc:   83 ab ff f4     lwz     r29,-12(r11)
  e0:   83 eb ff fc     lwz     r31,-4(r11)
  e4:   7d 61 5b 78     mr      r1,r11
  e8:   4e 80 00 20     blr

000000ec <main>:
  ec:   94 21 ff c0     stwu    r1,-64(r1)      ;
  f0:   7c 08 02 a6     mflr    r0              ;
  f4:   93 e1 00 3c     stw     r31,60(r1)      ;
  f8:   90 01 00 44     stw     r0,68(r1)       ;
  fc:   7c 3f 0b 78     mr      r31,r1          ;
 100:   3d 20 00 00     lis     r9,0            ;
 104:   39 29 00 00     addi    r9,r9,0         ;
 108:   80 09 00 00     lwz     r0,0(r9)        ;
 10c:   81 69 00 04     lwz     r11,4(r9)       ;
 110:   81 49 00 08     lwz     r10,8(r9)       ;
 114:   81 29 00 0c     lwz     r9,12(r9)       ;
 118:   90 1f 00 08     stw     r0,8(r31)       ;
 11c:   91 7f 00 0c     stw     r11,12(r31)     ;
 120:   91 5f 00 10     stw     r10,16(r31)     ;
 124:   91 3f 00 14     stw     r9,20(r31)      ;
 128:   80 1f 00 08     lwz     r0,8(r31)       ;
 12c:   81 3f 00 0c     lwz     r9,12(r31)      ;
 130:   81 7f 00 10     lwz     r11,16(r31)     ;
 134:   81 5f 00 14     lwz     r10,20(r31)     ;
 138:   90 1f 00 20     stw     r0,32(r31)      ;
 13c:   91 3f 00 24     stw     r9,36(r31)      ;
 140:   91 7f 00 28     stw     r11,40(r31)     ;
 144:   91 5f 00 2c     stw     r10,44(r31)     ;
 148:   38 1f 00 20     addi    r0,r31,32       ;
 14c:   38 60 00 00     li      r3,0            ; arg 0
 150:   38 80 00 01     li      r4,1            ; arg 1
 154:   38 a0 00 02     li      r5,2            ; arg 2
 158:   38 c0 00 03     li      r6,3            ; arg 3
 15c:   38 e0 00 04     li      r7,4            ; arg 4
 160:   7c 08 03 78     mr      r8,r0           ; arg 5 (struct, passed as pointer to local copy)
 164:   39 20 00 08     li      r9,8            ; arg 6
 168:   39 40 00 09     li      r10,9           ; arg 7
 16c:   48 00 00 01     bl      16c <main+0x80> ;
 170:   38 00 00 00     li      r0,0            ;
 174:   7c 03 03 78     mr      r3,r0           ;
 178:   81 61 00 00     lwz     r11,0(r1)       ;
 17c:   80 0b 00 04     lwz     r0,4(r11)       ;
 180:   7c 08 03 a6     mtlr    r0              ;
 184:   83 eb ff fc     lwz     r31,-4(r11)     ;
 188:   7d 61 5b 78     mr      r1,r11          ;
 18c:   4e 80 00 20     blr                     ;



; ---------- structs by value, complex example (multiple structs) ---------->
;
; struct A { int i, j; float f; };
; struct B { double d; long long l; };
;
; void leaf_call(int b, struct A c, struct B d, int e, int f, struct A g, struct B h, int i, int j)
; {
; }
;
; void nonleaf_call(int a, int b, struct A c, struct B d, int e, int f, struct A g, struct B h, int i, int j)
; {
;     /* use some local data */
;     char l[100] = { 'L' };
;     leaf_call(b, c, d, e, f, g, h, i, j);
; }
;
; int main()
; {
;     nonleaf_call(0, 1, (struct A){2, 3, 4.f}, (struct B){5., 6ll}, 7, 8, (struct A){9, 10, 11.f}, (struct B){12., 13ll}, 14, 15);
;     return 0;
; }



; output from debian-4.1.1-21-ppc w/ gcc 4.1.2

00000000 <leaf_call>:
   0:   94 21 ff e0     stwu    r1,-32(r1)
   4:   93 e1 00 1c     stw     r31,28(r1)
   8:   7c 3f 0b 78     mr      r31,r1
   c:   90 7f 00 08     stw     r3,8(r31)
  10:   90 df 00 0c     stw     r6,12(r31)
  14:   90 ff 00 10     stw     r7,16(r31)
  18:   91 5f 00 14     stw     r10,20(r31)
  1c:   81 61 00 00     lwz     r11,0(r1)
  20:   83 eb ff fc     lwz     r31,-4(r11)
  24:   7d 61 5b 78     mr      r1,r11
  28:   4e 80 00 20     blr

0000002c <nonleaf_call>:
  2c:   94 21 ff 00     stwu    r1,-256(r1)
  30:   7c 08 02 a6     mflr    r0
  34:   93 41 00 e8     stw     r26,232(r1)
  38:   93 61 00 ec     stw     r27,236(r1)
  3c:   93 81 00 f0     stw     r28,240(r1)
  40:   93 a1 00 f4     stw     r29,244(r1)
  44:   93 e1 00 fc     stw     r31,252(r1)
  48:   90 01 01 04     stw     r0,260(r1)
  4c:   7c 3f 0b 78     mr      r31,r1
  50:   90 7f 00 80     stw     r3,128(r31)
  54:   90 9f 00 84     stw     r4,132(r31)
  58:   7c bd 2b 78     mr      r29,r5
  5c:   7c dc 33 78     mr      r28,r6
  60:   90 ff 00 88     stw     r7,136(r31)
  64:   91 1f 00 8c     stw     r8,140(r31)
  68:   7d 3b 4b 78     mr      r27,r9
  6c:   7d 5a 53 78     mr      r26,r10
  70:   38 1f 00 10     addi    r0,r31,16
  74:   39 20 00 64     li      r9,100
  78:   7c 03 03 78     mr      r3,r0
  7c:   38 80 00 00     li      r4,0
  80:   7d 25 4b 78     mr      r5,r9
  84:   48 00 00 01     bl      84 <nonleaf_call+0x58>
  88:   38 00 00 4c     li      r0,76
  8c:   98 1f 00 10     stb     r0,16(r31)
  90:   80 1d 00 00     lwz     r0,0(r29)
  94:   81 3d 00 04     lwz     r9,4(r29)
  98:   81 7d 00 08     lwz     r11,8(r29)
  9c:   90 1f 00 98     stw     r0,152(r31)
  a0:   91 3f 00 9c     stw     r9,156(r31)
  a4:   91 7f 00 a0     stw     r11,160(r31)
  a8:   80 1c 00 00     lwz     r0,0(r28)
  ac:   81 3c 00 04     lwz     r9,4(r28)
  b0:   81 7c 00 08     lwz     r11,8(r28)
  b4:   81 5c 00 0c     lwz     r10,12(r28)
  b8:   90 1f 00 a8     stw     r0,168(r31)
  bc:   91 3f 00 ac     stw     r9,172(r31)
  c0:   91 7f 00 b0     stw     r11,176(r31)
  c4:   91 5f 00 b4     stw     r10,180(r31)
  c8:   80 1b 00 00     lwz     r0,0(r27)
  cc:   81 3b 00 04     lwz     r9,4(r27)
  d0:   81 7b 00 08     lwz     r11,8(r27)
  d4:   90 1f 00 b8     stw     r0,184(r31)
  d8:   91 3f 00 bc     stw     r9,188(r31)
  dc:   91 7f 00 c0     stw     r11,192(r31)
  e0:   80 1a 00 00     lwz     r0,0(r26)
  e4:   81 3a 00 04     lwz     r9,4(r26)
  e8:   81 7a 00 08     lwz     r11,8(r26)
  ec:   81 5a 00 0c     lwz     r10,12(r26)
  f0:   90 1f 00 c8     stw     r0,200(r31)
  f4:   91 3f 00 cc     stw     r9,204(r31)
  f8:   91 7f 00 d0     stw     r11,208(r31)
  fc:   91 5f 00 d4     stw     r10,212(r31)
 100:   39 3f 00 98     addi    r9,r31,152
 104:   39 7f 00 a8     addi    r11,r31,168
 108:   39 5f 00 b8     addi    r10,r31,184
 10c:   3b bf 00 c8     addi    r29,r31,200
 110:   80 1f 01 0c     lwz     r0,268(r31)
 114:   90 01 00 08     stw     r0,8(r1)
 118:   80 7f 00 84     lwz     r3,132(r31)
 11c:   7d 24 4b 78     mr      r4,r9
 120:   7d 65 5b 78     mr      r5,r11
 124:   80 df 00 88     lwz     r6,136(r31)
 128:   80 ff 00 8c     lwz     r7,140(r31)
 12c:   7d 48 53 78     mr      r8,r10
 130:   7f a9 eb 78     mr      r9,r29
 134:   81 5f 01 08     lwz     r10,264(r31)
 138:   48 00 00 01     bl      138 <nonleaf_call+0x10c>
 13c:   81 61 00 00     lwz     r11,0(r1)
 140:   80 0b 00 04     lwz     r0,4(r11)
 144:   7c 08 03 a6     mtlr    r0
 148:   83 4b ff e8     lwz     r26,-24(r11)
 14c:   83 6b ff ec     lwz     r27,-20(r11)
 150:   83 8b ff f0     lwz     r28,-16(r11)
 154:   83 ab ff f4     lwz     r29,-12(r11)
 158:   83 eb ff fc     lwz     r31,-4(r11)
 15c:   7d 61 5b 78     mr      r1,r11
 160:   4e 80 00 20     blr

00000164 <main>:
 164:   94 21 ff 50     stwu    r1,-176(r1)
 168:   7c 08 02 a6     mflr    r0
 16c:   93 a1 00 a4     stw     r29,164(r1)
 170:   93 e1 00 ac     stw     r31,172(r1)
 174:   90 01 00 b4     stw     r0,180(r1)
 178:   7c 3f 0b 78     mr      r31,r1
 17c:   3d 20 00 00     lis     r9,0
 180:   39 29 00 30     addi    r9,r9,48
 184:   80 09 00 00     lwz     r0,0(r9)
 188:   81 69 00 04     lwz     r11,4(r9)
 18c:   81 29 00 08     lwz     r9,8(r9)
 190:   90 1f 00 40     stw     r0,64(r31)
 194:   91 7f 00 44     stw     r11,68(r31)
 198:   91 3f 00 48     stw     r9,72(r31)
 19c:   3d 20 00 00     lis     r9,0
 1a0:   39 29 00 20     addi    r9,r9,32
 1a4:   80 09 00 00     lwz     r0,0(r9)
 1a8:   81 69 00 04     lwz     r11,4(r9)
 1ac:   81 49 00 08     lwz     r10,8(r9)
 1b0:   81 29 00 0c     lwz     r9,12(r9)
 1b4:   90 1f 00 30     stw     r0,48(r31)
 1b8:   91 7f 00 34     stw     r11,52(r31)
 1bc:   91 5f 00 38     stw     r10,56(r31)
 1c0:   91 3f 00 3c     stw     r9,60(r31)
 1c4:   3d 20 00 00     lis     r9,0
 1c8:   39 29 00 10     addi    r9,r9,16
 1cc:   80 09 00 00     lwz     r0,0(r9)
 1d0:   81 69 00 04     lwz     r11,4(r9)
 1d4:   81 29 00 08     lwz     r9,8(r9)
 1d8:   90 1f 00 20     stw     r0,32(r31)
 1dc:   91 7f 00 24     stw     r11,36(r31)
 1e0:   91 3f 00 28     stw     r9,40(r31)
 1e4:   3d 20 00 00     lis     r9,0
 1e8:   39 29 00 00     addi    r9,r9,0
 1ec:   80 09 00 00     lwz     r0,0(r9)
 1f0:   81 69 00 04     lwz     r11,4(r9)
 1f4:   81 49 00 08     lwz     r10,8(r9)
 1f8:   81 29 00 0c     lwz     r9,12(r9)
 1fc:   90 1f 00 10     stw     r0,16(r31)
 200:   91 7f 00 14     stw     r11,20(r31)
 204:   91 5f 00 18     stw     r10,24(r31)
 208:   91 3f 00 1c     stw     r9,28(r31)
 20c:   80 1f 00 40     lwz     r0,64(r31)
 210:   81 3f 00 44     lwz     r9,68(r31)
 214:   81 7f 00 48     lwz     r11,72(r31)
 218:   90 1f 00 58     stw     r0,88(r31)
 21c:   91 3f 00 5c     stw     r9,92(r31)
 220:   91 7f 00 60     stw     r11,96(r31)
 224:   80 1f 00 30     lwz     r0,48(r31)
 228:   81 3f 00 34     lwz     r9,52(r31)
 22c:   81 7f 00 38     lwz     r11,56(r31)
 230:   81 5f 00 3c     lwz     r10,60(r31)
 234:   90 1f 00 68     stw     r0,104(r31)
 238:   91 3f 00 6c     stw     r9,108(r31)
 23c:   91 7f 00 70     stw     r11,112(r31)
 240:   91 5f 00 74     stw     r10,116(r31)
 244:   80 1f 00 20     lwz     r0,32(r31)
 248:   81 3f 00 24     lwz     r9,36(r31)
 24c:   81 7f 00 28     lwz     r11,40(r31)
 250:   90 1f 00 78     stw     r0,120(r31)
 254:   91 3f 00 7c     stw     r9,124(r31)
 258:   91 7f 00 80     stw     r11,128(r31)
 25c:   80 1f 00 10     lwz     r0,16(r31)
 260:   81 3f 00 14     lwz     r9,20(r31)
 264:   81 7f 00 18     lwz     r11,24(r31)
 268:   81 5f 00 1c     lwz     r10,28(r31)
 26c:   90 1f 00 88     stw     r0,136(r31)
 270:   91 3f 00 8c     stw     r9,140(r31)
 274:   91 7f 00 90     stw     r11,144(r31)
 278:   91 5f 00 94     stw     r10,148(r31)
 27c:   39 3f 00 58     addi    r9,r31,88
 280:   39 7f 00 68     addi    r11,r31,104
 284:   39 5f 00 78     addi    r10,r31,120
 288:   3b bf 00 88     addi    r29,r31,136
 28c:   38 00 00 0e     li      r0,14
 290:   90 01 00 08     stw     r0,8(r1)
 294:   38 00 00 0f     li      r0,15
 298:   90 01 00 0c     stw     r0,12(r1)
 29c:   38 60 00 00     li      r3,0
 2a0:   38 80 00 01     li      r4,1
 2a4:   7d 25 4b 78     mr      r5,r9
 2a8:   7d 66 5b 78     mr      r6,r11
 2ac:   38 e0 00 07     li      r7,7
 2b0:   39 00 00 08     li      r8,8
 2b4:   7d 49 53 78     mr      r9,r10
 2b8:   7f aa eb 78     mr      r10,r29
 2bc:   48 00 00 01     bl      2bc <main+0x158>
 2c0:   38 00 00 00     li      r0,0
 2c4:   7c 03 03 78     mr      r3,r0
 2c8:   81 61 00 00     lwz     r11,0(r1)
 2cc:   80 0b 00 04     lwz     r0,4(r11)
 2d0:   7c 08 03 a6     mtlr    r0
 2d4:   83 ab ff f4     lwz     r29,-12(r11)
 2d8:   83 eb ff fc     lwz     r31,-4(r11)
 2dc:   7d 61 5b 78     mr      r1,r11
 2e0:   4e 80 00 20     blr



; ---------- returning qwords ---------->
;
; long long f()
; {
;     return 7171LL;
; }
;
; int main()
; {
;     return (int)f();
; }



; output from debian-4.1.1-21-ppc w/ gcc 4.1.2

00000000 <f>:
   0:   94 21 ff f0     stwu    r1,-16(r1)
   4:   93 e1 00 0c     stw     r31,12(r1)
   8:   7c 3f 0b 78     mr      r31,r1
   c:   39 20 00 00     li      r9,0
  10:   39 40 1c 03     li      r10,7171
  14:   7d 23 4b 78     mr      r3,r9
  18:   7d 44 53 78     mr      r4,r10
  1c:   81 61 00 00     lwz     r11,0(r1)
  20:   83 eb ff fc     lwz     r31,-4(r11)
  24:   7d 61 5b 78     mr      r1,r11
  28:   4e 80 00 20     blr

0000002c <main>:
  2c:   94 21 ff f0     stwu    r1,-16(r1)
  30:   7c 08 02 a6     mflr    r0
  34:   93 e1 00 0c     stw     r31,12(r1)
  38:   90 01 00 14     stw     r0,20(r1)
  3c:   7c 3f 0b 78     mr      r31,r1
  40:   48 00 00 01     bl      40 <main+0x14>
  44:   7c 8a 23 78     mr      r10,r4
  48:   7c 69 1b 78     mr      r9,r3
  4c:   7d 40 53 78     mr      r0,r10
  50:   7c 03 03 78     mr      r3,r0
  54:   81 61 00 00     lwz     r11,0(r1)
  58:   80 0b 00 04     lwz     r0,4(r11)
  5c:   7c 08 03 a6     mtlr    r0
  60:   83 eb ff fc     lwz     r31,-4(r11)
  64:   7d 61 5b 78     mr      r1,r11
  68:   4e 80 00 20     blr


; ---------- returning structs by value ---------->
;
; struct Small { char x; };
; struct Big { long long i; long j; };
;
; struct Small f0()
; {
;     struct Small s = { 132 };
;     return s;
; }
;
; struct Big f1()
; {
;     struct Big b = { 7171LL, 232 };
;     return b;
; }
;
; int main()
; {
;     struct Small s = f0();
;     struct Big b = f1();
;     return b.j + s.x;
; }



; output from debian-4.1.1-21-ppc w/ gcc 4.1.2 (demonstrates LSB specifics about aggr return values)

00000000 <f0>:
   0:   94 21 ff e0     stwu    r1,-32(r1)     ;
   4:   93 e1 00 1c     stw     r31,28(r1)     ;
   8:   7c 3f 0b 78     mr      r31,r1         ;
   c:   7c 69 1b 78     mr      r9,r3          ;
  10:   38 00 ff 84     li      r0,-124        ;
  14:   98 1f 00 08     stb     r0,8(r31)      ;
  18:   88 1f 00 08     lbz     r0,8(r31)      ;
  1c:   98 09 00 00     stb     r0,0(r9)       ;
  20:   7d 23 4b 78     mr      r3,r9          ;
  24:   81 61 00 00     lwz     r11,0(r1)      ;
  28:   83 eb ff fc     lwz     r31,-4(r11)    ;
  2c:   7d 61 5b 78     mr      r1,r11         ;
  30:   4e 80 00 20     blr                    ;

00000034 <f1>:
  34:   94 21 ff e0     stwu    r1,-32(r1)     ;
  38:   93 e1 00 1c     stw     r31,28(r1)     ;
  3c:   7c 3f 0b 78     mr      r31,r1         ;
  40:   7c 6b 1b 78     mr      r11,r3         ;
  44:   3d 20 00 00     lis     r9,0           ;
  48:   39 29 00 00     addi    r9,r9,0        ;
  4c:   80 09 00 00     lwz     r0,0(r9)       ;
  50:   81 49 00 04     lwz     r10,4(r9)      ;
  54:   81 09 00 08     lwz     r8,8(r9)       ;
  58:   81 29 00 0c     lwz     r9,12(r9)      ;
  5c:   90 1f 00 08     stw     r0,8(r31)      ;
  60:   91 5f 00 0c     stw     r10,12(r31)    ;
  64:   91 1f 00 10     stw     r8,16(r31)     ;
  68:   91 3f 00 14     stw     r9,20(r31)     ;
  6c:   80 1f 00 08     lwz     r0,8(r31)      ;
  70:   81 3f 00 0c     lwz     r9,12(r31)     ;
  74:   81 5f 00 10     lwz     r10,16(r31)    ;
  78:   81 1f 00 14     lwz     r8,20(r31)     ;
  7c:   90 0b 00 00     stw     r0,0(r11)      ;
  80:   91 2b 00 04     stw     r9,4(r11)      ;
  84:   91 4b 00 08     stw     r10,8(r11)     ;
  88:   91 0b 00 0c     stw     r8,12(r11)     ;
  8c:   7d 63 5b 78     mr      r3,r11         ;
  90:   81 61 00 00     lwz     r11,0(r1)      ;
  94:   83 eb ff fc     lwz     r31,-4(r11)    ;
  98:   7d 61 5b 78     mr      r1,r11         ;
  9c:   4e 80 00 20     blr                    ;

000000a0 <main>:
  a0:   94 21 ff c0     stwu    r1,-64(r1)     ; |           open frame and store sp at top of stack
  a4:   7c 08 02 a6     mflr    r0             ; |           lr -> gpr0
  a8:   93 e1 00 3c     stw     r31,60(r1)     ; | prolog    store gpr31
  ac:   90 01 00 44     stw     r0,68(r1)      ; |           store lr
  b0:   7c 3f 0b 78     mr      r31,r1         ; /           sp -> gpr31, latter used for some fixed addressing below
  b4:   38 1f 00 28     addi    r0,r31,40      ; \
  b8:   7c 03 03 78     mr      r3,r0          ; | space to retval -> gpr3 (hidden arg)
  bc:   4c c6 31 82     crclr   4*cr1+eq       ; :
  c0:   48 00 00 01     bl      c0 <main+0x20> ; call f0()
  c4:   88 1f 00 28     lbz     r0,40(r31)     ;
  c8:   98 1f 00 08     stb     r0,8(r31)      ;
  cc:   38 1f 00 10     addi    r0,r31,16      ; |
  d0:   7c 03 03 78     mr      r3,r0          ; | space to retval -> gpr3 (hidden arg)
  d4:   4c c6 31 82     crclr   4*cr1+eq       ; :
  d8:   48 00 00 01     bl      d8 <main+0x38> ; call f1()
  dc:   81 3f 00 18     lwz     r9,24(r31)     ;
  e0:   88 1f 00 08     lbz     r0,8(r31)      ;
  e4:   54 00 06 3e     clrlwi  r0,r0,24       ;
  e8:   7c 09 02 14     add     r0,r9,r0       ;
  ec:   7c 03 03 78     mr      r3,r0          ;
  f0:   81 61 00 00     lwz     r11,0(r1)      ; |
  f4:   80 0b 00 04     lwz     r0,4(r11)      ; |
  f8:   7c 08 03 a6     mtlr    r0             ; |
  fc:   83 eb ff fc     lwz     r31,-4(r11)    ; | epilog
 100:   7d 61 5b 78     mr      r1,r11         ; |
 104:   4e 80 00 20     blr                    ; |



; output from netbsd-4.0.1-macppc w/ gcc 4.1.2 (demonstrates default (non-LSB) aggr return values)

018007a0 <f0>:
 18007a0:       94 21 ff d0     stwu    r1,-48(r1)
 18007a4:       93 e1 00 2c     stw     r31,44(r1)
 18007a8:       7c 3f 0b 78     mr      r31,r1
 18007ac:       38 00 ff 84     li      r0,-124
 18007b0:       98 1f 00 08     stb     r0,8(r31)
 18007b4:       88 1f 00 08     lbz     r0,8(r31)
 18007b8:       7c 03 03 78     mr      r3,r0
 18007bc:       81 61 00 00     lwz     r11,0(r1)
 18007c0:       83 eb ff fc     lwz     r31,-4(r11)
 18007c4:       7d 61 5b 78     mr      r1,r11
 18007c8:       4e 80 00 20     blr

018007cc <f1>:
 18007cc:       94 21 ff d0     stwu    r1,-48(r1)
 18007d0:       93 e1 00 2c     stw     r31,44(r1)
 18007d4:       7c 3f 0b 78     mr      r31,r1
 18007d8:       7c 6b 1b 78     mr      r11,r3
 18007dc:       3d 20 01 80     lis     r9,384
 18007e0:       39 29 09 80     addi    r9,r9,2432
 18007e4:       80 09 00 00     lwz     r0,0(r9)
 18007e8:       81 49 00 04     lwz     r10,4(r9)
 18007ec:       81 09 00 08     lwz     r8,8(r9)
 18007f0:       81 29 00 0c     lwz     r9,12(r9)
 18007f4:       90 1f 00 08     stw     r0,8(r31)
 18007f8:       91 5f 00 0c     stw     r10,12(r31)
 18007fc:       91 1f 00 10     stw     r8,16(r31)
 1800800:       91 3f 00 14     stw     r9,20(r31)
 1800804:       80 1f 00 08     lwz     r0,8(r31)
 1800808:       81 3f 00 0c     lwz     r9,12(r31)
 180080c:       81 5f 00 10     lwz     r10,16(r31)
 1800810:       81 1f 00 14     lwz     r8,20(r31)
 1800814:       90 0b 00 00     stw     r0,0(r11)
 1800818:       91 2b 00 04     stw     r9,4(r11)
 180081c:       91 4b 00 08     stw     r10,8(r11)
 1800820:       91 0b 00 0c     stw     r8,12(r11)
 1800824:       7d 63 5b 78     mr      r3,r11
 1800828:       81 61 00 00     lwz     r11,0(r1)
 180082c:       83 eb ff fc     lwz     r31,-4(r11)
 1800830:       7d 61 5b 78     mr      r1,r11
 1800834:       4e 80 00 20     blr

01800838 <main>:
 1800838:       94 21 ff c0     stwu    r1,-64(r1)   ; |           open frame and store sp at top of stack
 180083c:       7c 08 02 a6     mflr    r0           ; |           lr -> gpr0
 1800840:       93 e1 00 3c     stw     r31,60(r1)   ; | prolog    store gpr31
 1800844:       90 01 00 44     stw     r0,68(r1)    ; |           store lr
 1800848:       7c 3f 0b 78     mr      r31,r1       ; |           sp -> gpr31, latter used for some fixed addressing below
 180084c:       4b ff ff 55     bl      18007a0 <f0> ; call f0()
 1800850:       7c 60 1b 78     mr      r0,r3        ; |           NOTE: ret val is returned via gpr3
 1800854:       98 1f 00 08     stb     r0,8(r31)    ; / ret val
 1800858:       38 1f 00 10     addi    r0,r31,16    ; \
 180085c:       7c 03 03 78     mr      r3,r0        ; | space to retval -> gpr3 (hidden arg)
 1800860:       4c c6 31 82     crclr   4*cr1+eq     ; :
 1800864:       4b ff ff 69     bl      18007cc <f1> ; call f0()
 1800868:       81 3f 00 18     lwz     r9,24(r31)   ;
 180086c:       88 1f 00 08     lbz     r0,8(r31)    ;
 1800870:       54 00 06 3e     clrlwi  r0,r0,24     ;
 1800874:       7c 09 02 14     add     r0,r9,r0     ;
 1800878:       7c 03 03 78     mr      r3,r0        ;
 180087c:       81 61 00 00     lwz     r11,0(r1)    ;
 1800880:       80 0b 00 04     lwz     r0,4(r11)    ;
 1800884:       7c 08 03 a6     mtlr    r0           ;
 1800888:       83 eb ff fc     lwz     r31,-4(r11)  ;
 180088c:       7d 61 5b 78     mr      r1,r11       ;
 1800890:       4e 80 00 20     blr                  ;
 1800894:       00 01 81 48     .long 0x18148        ;



; ---------- 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 debian-4.1.1-21-ppc w/ gcc 4.1.2

100003e0 <f1>:
100003e0:       94 21 ff f0     stwu    r1,-16(r1)
100003e4:       93 e1 00 0c     stw     r31,12(r1)
100003e8:       7c 3f 0b 78     mr      r31,r1
100003ec:       81 61 00 00     lwz     r11,0(r1)
100003f0:       83 eb ff fc     lwz     r31,-4(r11)
100003f4:       7d 61 5b 78     mr      r1,r11
100003f8:       4e 80 00 20     blr

100003fc <f2>:
100003fc:       94 21 ff e0     stwu    r1,-32(r1)
10000400:       93 e1 00 1c     stw     r31,28(r1)
10000404:       7c 3f 0b 78     mr      r31,r1
10000408:       90 7f 00 08     stw     r3,8(r31)
1000040c:       81 61 00 00     lwz     r11,0(r1)
10000410:       83 eb ff fc     lwz     r31,-4(r11)
10000414:       7d 61 5b 78     mr      r1,r11
10000418:       4e 80 00 20     blr

1000041c <f>:
1000041c:       94 21 ff d0     stwu    r1,-48(r1)                        ;
10000420:       7c 08 02 a6     mflr    r0                                ;
10000424:       93 e1 00 2c     stw     r31,44(r1)                        ;
10000428:       90 01 00 34     stw     r0,52(r1)                         ;
1000042c:       7c 3f 0b 78     mr      r31,r1                            ;
10000430:       38 1f 00 14     addi    r0,r31,20                         ;
10000434:       7c 03 03 78     mr      r3,r0                             ;
10000438:       48 00 00 a1     bl      100004d8 <_ZN10NonTrivialC1Ev>    ; NonTrivial::NonTrivial() / ctor
1000043c:       38 00 00 01     li      r0,1                              ;
10000440:       90 1f 00 08     stw     r0,8(r31)                         ;
10000444:       81 3f 00 08     lwz     r9,8(r31)                         ;
10000448:       38 09 00 7b     addi    r0,r9,123                         ;
1000044c:       90 1f 00 08     stw     r0,8(r31)                         ;
10000450:       80 1f 00 10     lwz     r0,16(r31)                        ;
10000454:       90 1f 00 18     stw     r0,24(r31)                        ;
10000458:       38 1f 00 18     addi    r0,r31,24                         ;
1000045c:       7c 03 03 78     mr      r3,r0                             ;
10000460:       4b ff ff 81     bl      100003e0 <f1>                     ; call f1(struct Trivial)
10000464:       81 3f 00 08     lwz     r9,8(r31)                         ;
10000468:       38 09 ff 85     addi    r0,r9,-123                        ;
1000046c:       90 1f 00 08     stw     r0,8(r31)                         ;
10000470:       38 1f 00 0c     addi    r0,r31,12                         ;
10000474:       39 3f 00 14     addi    r9,r31,20                         ;
10000478:       7c 03 03 78     mr      r3,r0                             ; |               ptr to dest of copy of n
1000047c:       7d 24 4b 78     mr      r4,r9                             ; | copy n        ptr to n
10000480:       48 00 00 85     bl      10000504 <_ZN10NonTrivialC1ERKS_> ; /               NonTrivial::NonTrivial(const NonTrivial&) / copy ctor
10000484:       38 1f 00 0c     addi    r0,r31,12                         ; \
10000488:       7c 03 03 78     mr      r3,r0                             ; | f2 arg 0 (ptr to copy of struct NonTrivial), via ptr as non-trivial
1000048c:       4b ff ff 71     bl      100003fc <f2>                     ; call f2(struct NonTrivial)
10000490:       81 3f 00 08     lwz     r9,8(r31)                         ;
10000494:       38 09 ff f4     addi    r0,r9,-12                         ;
10000498:       90 1f 00 08     stw     r0,8(r31)                         ;
1000049c:       81 61 00 00     lwz     r11,0(r1)                         ;
100004a0:       80 0b 00 04     lwz     r0,4(r11)                         ;
100004a4:       7c 08 03 a6     mtlr    r0                                ;
100004a8:       83 eb ff fc     lwz     r31,-4(r11)                       ;
100004ac:       7d 61 5b 78     mr      r1,r11                            ;
100004b0:       4e 80 00 20     blr                                       ;

  ; ... snip, removed code of ctor and copy ctor ...



; ---------- 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-4.1.1-21-ppc w/ gcc 4.1.2 (demonstrates LSB specifics about aggr return values)

100003e0 <f1>:
100003e0:       94 21 ff f0     stwu    r1,-16(r1)
100003e4:       93 e1 00 0c     stw     r31,12(r1)
100003e8:       7c 3f 0b 78     mr      r31,r1
100003ec:       7c 69 1b 78     mr      r9,r3
100003f0:       38 00 00 00     li      r0,0
100003f4:       90 09 00 00     stw     r0,0(r9)
100003f8:       7d 23 4b 78     mr      r3,r9
100003fc:       81 61 00 00     lwz     r11,0(r1)
10000400:       83 eb ff fc     lwz     r31,-4(r11)
10000404:       7d 61 5b 78     mr      r1,r11
10000408:       4e 80 00 20     blr

1000040c <_Z2f2v>:
1000040c:       94 21 ff e0     stwu    r1,-32(r1)
10000410:       7c 08 02 a6     mflr    r0
10000414:       93 a1 00 14     stw     r29,20(r1)
10000418:       93 e1 00 1c     stw     r31,28(r1)
1000041c:       90 01 00 24     stw     r0,36(r1)
10000420:       7c 3f 0b 78     mr      r31,r1
10000424:       7c 7d 1b 78     mr      r29,r3
10000428:       7f a0 eb 78     mr      r0,r29
1000042c:       7c 03 03 78     mr      r3,r0
10000430:       48 00 00 d5     bl      10000504 <_ZN10NonTrivialC1Ev>
10000434:       7f a3 eb 78     mr      r3,r29
10000438:       81 61 00 00     lwz     r11,0(r1)
1000043c:       80 0b 00 04     lwz     r0,4(r11)
10000440:       7c 08 03 a6     mtlr    r0
10000444:       83 ab ff f4     lwz     r29,-12(r11)
10000448:       83 eb ff fc     lwz     r31,-4(r11)
1000044c:       7d 61 5b 78     mr      r1,r11
10000450:       4e 80 00 20     blr

10000454 <f>:
10000454:       94 21 ff d0     stwu    r1,-48(r1)        ; |           open frame and store sp at top of stack
10000458:       7c 08 02 a6     mflr    r0                ; |           lr -> gpr0
1000045c:       93 e1 00 2c     stw     r31,44(r1)        ; | prolog    store gpr31
10000460:       90 01 00 34     stw     r0,52(r1)         ; |           store lr
10000464:       7c 3f 0b 78     mr      r31,r1            ; /           sp -> gpr31, latter used for some fixed addressing below
10000468:       38 00 00 01     li      r0,1              ; \ a = 1
1000046c:       90 1f 00 08     stw     r0,8(r31)         ; /
10000470:       81 3f 00 08     lwz     r9,8(r31)         ; \
10000474:       38 09 00 7b     addi    r0,r9,123         ; | a += 123
10000478:       90 1f 00 08     stw     r0,8(r31)         ; /
1000047c:       38 1f 00 18     addi    r0,r31,24         ; \
10000480:       7c 03 03 78     mr      r3,r0             ; | space to retval -> gpr3 (hidden arg); NOTE: this follows the LSB definition
10000484:       4b ff ff 5d     bl      100003e0 <f1>     ; call f1()
10000488:       80 1f 00 18     lwz     r0,24(r31)        ;
1000048c:       90 1f 00 0c     stw     r0,12(r31)        ;
10000490:       81 3f 00 08     lwz     r9,8(r31)         ;
10000494:       38 09 ff 85     addi    r0,r9,-123        ;
10000498:       90 1f 00 08     stw     r0,8(r31)         ;
1000049c:       38 1f 00 10     addi    r0,r31,16         ; |
100004a0:       7c 03 03 78     mr      r3,r0             ; | hidden first arg (ptr to space to hold NonTrivial retval), via ptr as non-trivial
100004a4:       4b ff ff 69     bl      1000040c <_Z2f2v> ; call f2()
100004a8:       81 3f 00 08     lwz     r9,8(r31)         ;
100004ac:       38 09 ff f4     addi    r0,r9,-12         ;
100004b0:       90 1f 00 08     stw     r0,8(r31)         ;
100004b4:       81 61 00 00     lwz     r11,0(r1)         ;
100004b8:       80 0b 00 04     lwz     r0,4(r11)         ;
100004bc:       7c 08 03 a6     mtlr    r0                ;
100004c0:       83 eb ff fc     lwz     r31,-4(r11)       ;
100004c4:       7d 61 5b 78     mr      r1,r11            ;
100004c8:       4e 80 00 20     blr                       ;



; output from netbsd-4.0.1-macppc w/ gcc 4.1.2 (demonstrates default (non-LSB) aggr return values)

01800840 <f1>:
 1800840:       94 21 ff e0     stwu    r1,-32(r1)
 1800844:       93 e1 00 1c     stw     r31,28(r1)
 1800848:       7c 3f 0b 78     mr      r31,r1
 180084c:       38 00 00 00     li      r0,0
 1800850:       7c 03 03 78     mr      r3,r0
 1800854:       81 61 00 00     lwz     r11,0(r1)
 1800858:       83 eb ff fc     lwz     r31,-4(r11)
 180085c:       7d 61 5b 78     mr      r1,r11
 1800860:       4e 80 00 20     blr

01800864 <_Z2f2v>:
 1800864:       94 21 ff e0     stwu    r1,-32(r1)
 1800868:       7c 08 02 a6     mflr    r0
 180086c:       93 a1 00 14     stw     r29,20(r1)
 1800870:       93 e1 00 1c     stw     r31,28(r1)
 1800874:       90 01 00 24     stw     r0,36(r1)
 1800878:       7c 3f 0b 78     mr      r31,r1
 180087c:       7c 7d 1b 78     mr      r29,r3
 1800880:       7f a0 eb 78     mr      r0,r29
 1800884:       7c 03 03 78     mr      r3,r0
 1800888:       48 00 00 cd     bl      1800954 <_ZN10NonTrivialC1Ev>
 180088c:       7f a3 eb 78     mr      r3,r29
 1800890:       81 61 00 00     lwz     r11,0(r1)
 1800894:       80 0b 00 04     lwz     r0,4(r11)
 1800898:       7c 08 03 a6     mtlr    r0
 180089c:       83 ab ff f4     lwz     r29,-12(r11)
 18008a0:       83 eb ff fc     lwz     r31,-4(r11)
 18008a4:       7d 61 5b 78     mr      r1,r11
 18008a8:       4e 80 00 20     blr

018008ac <f>:
 18008ac:       94 21 ff d0     stwu    r1,-48(r1)       ;
 18008b0:       7c 08 02 a6     mflr    r0               ;
 18008b4:       93 e1 00 2c     stw     r31,44(r1)       ;
 18008b8:       90 01 00 34     stw     r0,52(r1)        ;
 18008bc:       7c 3f 0b 78     mr      r31,r1           ;
 18008c0:       38 00 00 01     li      r0,1             ;
 18008c4:       90 1f 00 08     stw     r0,8(r31)        ;
 18008c8:       81 3f 00 08     lwz     r9,8(r31)        ;
 18008cc:       38 09 00 7b     addi    r0,r9,123        ;
 18008d0:       90 1f 00 08     stw     r0,8(r31)        ; NOTE: no hidden param in contrast to LSB version of callconv
 18008d4:       4b ff ff 6d     bl      1800840 <f1>     ; call f1()
 18008d8:       7c 60 1b 78     mr      r0,r3            ; |           NOTE: ret val is returned via gpr3
 18008dc:       90 1f 00 0c     stw     r0,12(r31)       ; / ret val
 18008e0:       81 3f 00 08     lwz     r9,8(r31)        ;
 18008e4:       38 09 ff 85     addi    r0,r9,-123       ;
 18008e8:       90 1f 00 08     stw     r0,8(r31)        ;
 18008ec:       38 1f 00 10     addi    r0,r31,16        ; |
 18008f0:       7c 03 03 78     mr      r3,r0            ; | hidden first arg (ptr to space to hold NonTrivial retval), via ptr as non-trivial
 18008f4:       4b ff ff 71     bl      1800864 <_Z2f2v> ; call f2()
 18008f8:       81 3f 00 08     lwz     r9,8(r31)        ;
 18008fc:       38 09 ff f4     addi    r0,r9,-12        ;
 1800900:       90 1f 00 08     stw     r0,8(r31)        ;
 1800904:       81 61 00 00     lwz     r11,0(r1)        ;
 1800908:       80 0b 00 04     lwz     r0,4(r11)        ;
 180090c:       7c 08 03 a6     mtlr    r0               ;
 1800910:       83 eb ff fc     lwz     r31,-4(r11)      ;
 1800914:       7d 61 5b 78     mr      r1,r11           ;
 1800918:       4e 80 00 20     blr                      ;



; vim: ft=asm68k