diff doc/disas_examples/ppc.darwin.disas @ 473:ead041d93e36

- ppc doc and disas examples related to aggregates
author Tassilo Philipp
date Wed, 16 Feb 2022 16:44:11 +0100
parents 74c056b597b7
children cb19b2fe2422
line wrap: on
line diff
--- a/doc/disas_examples/ppc.darwin.disas	Thu Feb 10 17:32:05 2022 +0100
+++ b/doc/disas_examples/ppc.darwin.disas	Wed Feb 16 16:44:11 2022 +0100
@@ -405,5 +405,552 @@
      260:       bb c1 ff f8     lmw 30, -8(1)   ; |
      264:       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 darwin-8.0.1-ppc w/ gcc 3.3
+
+_leaf_call:
+00000000	stmw	r30,0xfff8(r1)
+00000004	stwu	r1,0xffd0(r1)
+00000008	or	r30,r1,r1
+0000000c	stw	r3,0x48(r30)
+00000010	stw	r4,0x4c(r30)
+00000014	stw	r5,0x50(r30)
+00000018	stw	r6,0x54(r30)
+0000001c	stw	r7,0x58(r30)
+00000020	stw	r8,0x5c(r30)
+00000024	stw	r9,0x60(r30)
+00000028	stw	r10,0x64(r30)
+0000002c	lwz	r1,0x0(r1)
+00000030	lmw	r30,0xfff8(r1)
+00000034	blr
+_nonleaf_call:
+00000038	mfspr	r0,lr
+0000003c	stmw	r30,0xfff8(r1)
+00000040	stw	r0,0x8(r1)
+00000044	stwu	r1,0xff30(r1)
+00000048	or	r30,r1,r1
+0000004c	bcl	20,31,0x50
+00000050	mfspr	r31,lr
+00000054	stw	r3,0xe8(r30)
+00000058	stw	r4,0xec(r30)
+0000005c	stw	r5,0xf0(r30)
+00000060	stw	r6,0xf4(r30)
+00000064	stw	r7,0xf8(r30)
+00000068	stw	r8,0xfc(r30)
+0000006c	stw	r9,0x100(r30)
+00000070	stw	r10,0x104(r30)
+00000074	addis	r2,r31,0x0
+00000078	addi	r2,r2,0x148
+0000007c	addi	r0,r30,0x50
+00000080	li	r9,0x64
+00000084	or	r3,r0,r0
+00000088	or	r4,r2,r2
+0000008c	or	r5,r9,r9
+00000090	bl	0x178
+00000094	lwz	r0,0x10c(r30)
+00000098	stw	r0,0x38(r1)
+0000009c	lwz	r0,0x110(r30)
+000000a0	stw	r0,0x3c(r1)
+000000a4	lwz	r3,0xec(r30)
+000000a8	lwz	r4,0xf0(r30)
+000000ac	lwz	r5,0xf4(r30)
+000000b0	lwz	r6,0xf8(r30)
+000000b4	lwz	r7,0xfc(r30)
+000000b8	lwz	r8,0x100(r30)
+000000bc	lwz	r9,0x104(r30)
+000000c0	lwz	r10,0x108(r30)
+000000c4	bl	0x0
+000000c8	lwz	r1,0x0(r1)
+000000cc	lwz	r0,0x8(r1)
+000000d0	mtspr	lr,r0
+000000d4	lmw	r30,0xfff8(r1)
+000000d8	blr
+_main:
+000000dc	mfspr	r0,lr          ;
+000000e0	stmw	r30,0xfff8(r1) ;
+000000e4	stw	r0,0x8(r1)         ;
+000000e8	stwu	r1,0xff90(r1)  ;
+000000ec	or	r30,r1,r1          ;
+000000f0	bcl	20,31,0xf4         ;
+000000f4	mfspr	r31,lr         ;
+000000f8	addis	r2,r31,0x0     ;
+000000fc	addi	r2,r2,0x108    ;
+00000100	lwz	r0,0x0(r2)         ;
+00000104	lwz	r9,0x4(r2)         ;
+00000108	lwz	r11,0x8(r2)        ;
+0000010c	lwz	r2,0xc(r2)         ;
+00000110	stw	r0,0x50(r30)       ;
+00000114	stw	r9,0x54(r30)       ;
+00000118	stw	r11,0x58(r30)      ;
+0000011c	stw	r2,0x5c(r30)       ;
+00000120	li	r0,0x8             ; arg 6, ...
+00000124	stw	r0,0x3c(r1)        ; ... "pushed" onto stack
+00000128	li	r0,0x9             ; arg 7, ...
+0000012c	stw	r0,0x40(r1)        ; ... "pushed" onto stack
+00000130	lwz	r0,0x5c(r30)       ; |                                       | last word of struct "pushed" onto stack
+00000134	stw	r0,0x38(r1)        ; |                                       /
+00000138	lwz	r8,0x50(r30)       ; | arg 5 (struct, passed as 4 words)     \
+0000013c	lwz	r9,0x54(r30)       ; |                                       | first 3 words of struct passed in remaining regs
+00000140	lwz	r10,0x58(r30)      ; |                                       |
+00000144	li	r3,0x0             ; arg 0
+00000148	li	r4,0x1             ; arg 1
+0000014c	li	r5,0x2             ; arg 2
+00000150	li	r6,0x3             ; arg 3
+00000154	li	r7,0x4             ; arg 4
+00000158	bl	0x38               ; call and put return address -> lr
+0000015c	li	r0,0x0             ; return value (pointlessly) via gpr0 ...
+00000160	or	r3,r0,r0           ; ... to gpr3
+00000164	lwz	r1,0x0(r1)         ; |
+00000168	lwz	r0,0x8(r1)         ; |
+0000016c	mtspr	lr,r0          ; | epilog
+00000170	lmw	r30,0xfff8(r1)     ; |
+00000174	blr                    ; |
+
+
+
+; ---------- single-field structs by value (of different sizes) ---------->
+;
+; struct C { char c;   }; // <= 2 bytes, but normal alignment as passed like a char
+; struct S { short s;  }; // <= 2 bytes, but normal alignment as passed like a short
+; struct I { int i;    };
+; struct F { float f;  };
+; struct D { double d; };
+;
+; struct C2 { char c[2]; }; // <= 2 bytes, special alignment
+; struct C3 { char c[3]; }; //  > 2 bytes, normal alignment
+;
+; void leaf_call(struct C2 a, struct C b, struct S c, struct I d, struct F e, struct D f, struct C3 g)
+; {
+; }
+;
+; int main()
+; {
+;     leaf_call((struct C2){{0,1}}, (struct C){2}, (struct S){3}, (struct I){4}, (struct F){5.f}, (struct D){6.}, (struct C3){{7,8,9}});
+;     return 0;
+; }
+
+
+
+; output from darwin-8.0.1-ppc w/ gcc 3.3
+
+_leaf_call:
+00000000	stmw	r30,0xfff8(r1)
+00000004	stwu	r1,0xffc0(r1)
+00000008	or	r30,r1,r1
+0000000c	sth	r3,0x58(r30)
+00000010	stb	r4,0x5c(r30)
+00000014	sth	r5,0x60(r30)
+00000018	stw	r6,0x64(r30)
+0000001c	stfs	f1,0x68(r30)
+00000020	stfd	f2,0x20(r30)
+00000024	lwz	r1,0x0(r1)
+00000028	lmw	r30,0xfff8(r1)
+0000002c	blr
+_main:
+00000030	mfspr	r0,lr          ; |
+00000034	stmw	r30,0xfff8(r1) ; |
+00000038	stw	r0,0x8(r1)         ; | prolog
+0000003c	stwu	r1,0xff80(r1)  ; |
+00000040	or	r30,r1,r1          ; |
+00000044	bcl	20,31,0x48         ; ppc way to get PC in ...
+00000048	mfspr	r31,lr         ; ... gpr31
+0000004c	li	r0,0x0             ; |                          \
+00000050	stb	r0,0x40(r30)       ; |                          |
+00000054	li	r0,0x1             ; |                          | C2
+00000058	stb	r0,0x41(r30)       ; |                          /
+0000005c	li	r0,0x2             ; | local area struct init   \ C
+00000060	stb	r0,0x42(r30)       ; |                          /
+00000064	li	r0,0x3             ; |                          \ S
+00000068	sth	r0,0x44(r30)       ; |                          /
+0000006c	li	r0,0x4             ; |                          \ I
+00000070	stw	r0,0x48(r30)       ; |                          /
+00000074	lis	r0,0x40a0          ; |                          \ F
+00000078	stw	r0,0x4c(r30)       ; |                          /
+0000007c	addis	r2,r31,0x0     ; |                          \
+00000080	addi	r2,r2,0xa8     ; |                          | D
+00000084	lfd	f0,0x0(r2)         ; |                          |
+00000088	stfd	f0,0x50(r30)   ; |                          /
+0000008c	addis	r2,r31,0x0     ; |                          \
+00000090	addi	r2,r2,0xb0     ; |                          |
+00000094	lhz	r0,0x0(r2)         ; |                          | C3
+00000098	lbz	r2,0x2(r2)         ; |                          |
+0000009c	sth	r0,0x60(r30)       ; |                          |
+000000a0	stb	r2,0x62(r30)       ; /                          /
+000000a4	lhz	r0,0x60(r30)       ; \
+000000a8	lbz	r2,0x62(r30)       ; |
+000000ac	sth	r0,0x34(r1)        ; | prep arg 6 (struct C3), zero-extended, right justified -> local area on stack
+000000b0	stb	r2,0x36(r1)        ; /
+000000b4	lhz	r3,0x40(r30)       ; arg 0 (struct C2)
+000000b8	lbz	r4,0x42(r30)       ; arg 1 (struct C)
+000000bc	lhz	r5,0x44(r30)       ; arg 2 (struct S)
+000000c0	lwz	r6,0x48(r30)       ; arg 3 (struct I)
+000000c4	lfs	f1,0x4c(r30)       ; arg 4 (struct F, int arg reg r7 then skipped)
+000000c8	lfd	f2,0x50(r30)       ; arg 5 (struct D, int arg regs r8 and r9 then skipped)
+000000cc	lwz	r10,0x34(r1)       ; arg 6 (struct C3, fetched from local area)
+000000d0	bl	0x0                ; call and put return address -> lr
+000000d4	li	r0,0x0             ; return value (pointlessly) via gpr0 ...
+000000d8	or	r3,r0,r0           ; ... to gpr3
+000000dc	lwz	r1,0x0(r1)         ; |
+000000e0	lwz	r0,0x8(r1)         ; |
+000000e4	mtspr	lr,r0          ; | epilog
+000000e8	lmw	r30,0xfff8(r1)     ; |
+000000ec	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 darwin-8.0.1-ppc w/ gcc 3.3
+
+_leaf_call:
+00000000	stmw	r30,0xfff8(r1)
+00000004	stwu	r1,0xffd0(r1)
+00000008	or	r30,r1,r1
+0000000c	stw	r3,0x48(r30)
+00000010	stw	r4,0x4c(r30)
+00000014	stw	r5,0x50(r30)
+00000018	stw	r6,0x54(r30)
+0000001c	stw	r7,0x58(r30)
+00000020	stw	r8,0x5c(r30)
+00000024	stw	r9,0x60(r30)
+00000028	stw	r10,0x64(r30)
+0000002c	lwz	r1,0x0(r1)
+00000030	lmw	r30,0xfff8(r1)
+00000034	blr
+_nonleaf_call:
+00000038	mfspr	r0,lr
+0000003c	stmw	r30,0xfff8(r1)
+00000040	stw	r0,0x8(r1)
+00000044	stwu	r1,0xff10(r1)
+00000048	or	r30,r1,r1
+0000004c	bcl	20,31,0x50
+00000050	mfspr	r31,lr
+00000054	stw	r3,0x108(r30)
+00000058	stw	r4,0x10c(r30)
+0000005c	stw	r5,0x110(r30)
+00000060	stw	r6,0x114(r30)
+00000064	stw	r7,0x118(r30)
+00000068	stw	r8,0x11c(r30)
+0000006c	stw	r9,0x120(r30)
+00000070	stw	r10,0x124(r30)
+00000074	addis	r2,r31,0x0
+00000078	addi	r2,r2,0x240
+0000007c	addi	r0,r30,0x70
+00000080	li	r9,0x64
+00000084	or	r3,r0,r0
+00000088	or	r4,r2,r2
+0000008c	or	r5,r9,r9
+00000090	bl	0x270
+00000094	lwz	r0,0x12c(r30)
+00000098	stw	r0,0x38(r1)
+0000009c	lwz	r0,0x130(r30)
+000000a0	stw	r0,0x3c(r1)
+000000a4	lwz	r0,0x134(r30)
+000000a8	lwz	r2,0x138(r30)
+000000ac	lwz	r9,0x13c(r30)
+000000b0	stw	r0,0x40(r1)
+000000b4	stw	r2,0x44(r1)
+000000b8	stw	r9,0x48(r1)
+000000bc	lwz	r0,0x140(r30)
+000000c0	lwz	r2,0x144(r30)
+000000c4	lwz	r9,0x148(r30)
+000000c8	lwz	r11,0x14c(r30)
+000000cc	stw	r0,0x4c(r1)
+000000d0	stw	r2,0x50(r1)
+000000d4	stw	r9,0x54(r1)
+000000d8	stw	r11,0x58(r1)
+000000dc	lwz	r0,0x150(r30)
+000000e0	stw	r0,0x5c(r1)
+000000e4	lwz	r0,0x154(r30)
+000000e8	stw	r0,0x60(r1)
+000000ec	lwz	r3,0x10c(r30)
+000000f0	lwz	r4,0x110(r30)
+000000f4	lwz	r5,0x114(r30)
+000000f8	lwz	r6,0x118(r30)
+000000fc	lwz	r7,0x11c(r30)
+00000100	lwz	r8,0x120(r30)
+00000104	lwz	r9,0x124(r30)
+00000108	lwz	r10,0x128(r30)
+0000010c	bl	0x0
+00000110	lwz	r1,0x0(r1)
+00000114	lwz	r0,0x8(r1)
+00000118	mtspr	lr,r0
+0000011c	lmw	r30,0xfff8(r1)
+00000120	blr
+_main:
+00000124	mfspr	r0,lr
+00000128	stmw	r30,0xfff8(r1)
+0000012c	stw	r0,0x8(r1)
+00000130	stwu	r1,0xff40(r1)
+00000134	or	r30,r1,r1
+00000138	bcl	20,31,0x13c
+0000013c	mfspr	r31,lr
+00000140	addis	r2,r31,0x0
+00000144	addi	r2,r2,0x1b8
+00000148	lwz	r0,0x0(r2)
+0000014c	lwz	r9,0x4(r2)
+00000150	lwz	r2,0x8(r2)
+00000154	stw	r0,0x70(r30)
+00000158	stw	r9,0x74(r30)
+0000015c	stw	r2,0x78(r30)
+00000160	addis	r2,r31,0x0
+00000164	addi	r2,r2,0x1c4
+00000168	lwz	r0,0x0(r2)
+0000016c	lwz	r9,0x4(r2)
+00000170	lwz	r11,0x8(r2)
+00000174	lwz	r2,0xc(r2)
+00000178	stw	r0,0x80(r30)
+0000017c	stw	r9,0x84(r30)
+00000180	stw	r11,0x88(r30)
+00000184	stw	r2,0x8c(r30)
+00000188	addis	r2,r31,0x0
+0000018c	addi	r2,r2,0x1d4
+00000190	lwz	r0,0x0(r2)
+00000194	lwz	r9,0x4(r2)
+00000198	lwz	r2,0x8(r2)
+0000019c	stw	r0,0x90(r30)
+000001a0	stw	r9,0x94(r30)
+000001a4	stw	r2,0x98(r30)
+000001a8	addis	r2,r31,0x0
+000001ac	addi	r2,r2,0x1e4
+000001b0	lwz	r0,0x0(r2)
+000001b4	lwz	r9,0x4(r2)
+000001b8	lwz	r11,0x8(r2)
+000001bc	lwz	r2,0xc(r2)
+000001c0	stw	r0,0xa0(r30)
+000001c4	stw	r9,0xa4(r30)
+000001c8	stw	r11,0xa8(r30)
+000001cc	stw	r2,0xac(r30)
+000001d0	li	r0,0x7
+000001d4	stw	r0,0x3c(r1)
+000001d8	li	r0,0x8
+000001dc	stw	r0,0x40(r1)
+000001e0	lwz	r0,0x90(r30)
+000001e4	lwz	r2,0x94(r30)
+000001e8	lwz	r9,0x98(r30)
+000001ec	stw	r0,0x44(r1)
+000001f0	stw	r2,0x48(r1)
+000001f4	stw	r9,0x4c(r1)
+000001f8	lwz	r0,0xa0(r30)
+000001fc	lwz	r2,0xa4(r30)
+00000200	lwz	r9,0xa8(r30)
+00000204	lwz	r11,0xac(r30)
+00000208	stw	r0,0x50(r1)
+0000020c	stw	r2,0x54(r1)
+00000210	stw	r9,0x58(r1)
+00000214	stw	r11,0x5c(r1)
+00000218	li	r0,0xe
+0000021c	stw	r0,0x60(r1)
+00000220	li	r0,0xf
+00000224	stw	r0,0x64(r1)
+00000228	lwz	r0,0x8c(r30)
+0000022c	stw	r0,0x38(r1)
+00000230	lwz	r8,0x80(r30)
+00000234	lwz	r9,0x84(r30)
+00000238	lwz	r10,0x88(r30)
+0000023c	li	r3,0x0
+00000240	li	r4,0x1
+00000244	lwz	r5,0x70(r30)
+00000248	lwz	r6,0x74(r30)
+0000024c	lwz	r7,0x78(r30)
+00000250	bl	0x38
+00000254	li	r0,0x0
+00000258	or	r3,r0,r0
+0000025c	lwz	r1,0x0(r1)
+00000260	lwz	r0,0x8(r1)
+00000264	mtspr	lr,r0
+00000268	lmw	r30,0xfff8(r1)
+0000026c	blr
+
+
+
+; ---------- returning qwords ---------->
+;
+; long long f()
+; {
+;     return 7171LL;
+; }
+;
+; int main()
+; {
+;     return (int)f();
+; }
+
+
+
+; output from darwin-8.0.1-ppc w/ gcc 3.3
+
+_f:
+00000000	stmw	r30,0xfff8(r1)
+00000004	stwu	r1,0xffd0(r1)
+00000008	or	r30,r1,r1
+0000000c	li	r2,0x0
+00000010	li	r3,0x1c03
+00000014	or	r4,r3,r3
+00000018	or	r3,r2,r2
+0000001c	lwz	r1,0x0(r1)
+00000020	lmw	r30,0xfff8(r1)
+00000024	blr
+_main:
+00000028	mfspr	r0,lr
+0000002c	stmw	r30,0xfff8(r1)
+00000030	stw	r0,0x8(r1)
+00000034	stwu	r1,0xffb0(r1)
+00000038	or	r30,r1,r1
+0000003c	bl	0x0
+00000040	or	r2,r3,r3
+00000044	or	r3,r4,r4
+00000048	or	r0,r3,r3
+0000004c	or	r3,r0,r0
+00000050	lwz	r1,0x0(r1)
+00000054	lwz	r0,0x8(r1)
+00000058	mtspr	lr,r0
+0000005c	lmw	r30,0xfff8(r1)
+00000060	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 darwin-8.0.1-ppc w/ gcc 3.3
+
+_f0:
+00000000	stmw	r30,0xfff8(r1)
+00000004	stwu	r1,0xffc0(r1)
+00000008	or	r30,r1,r1
+0000000c	or	r2,r3,r3
+00000010	li	r0,0xff84
+00000014	stb	r0,0x20(r30)
+00000018	lbz	r0,0x20(r30)
+0000001c	stb	r0,0x0(r2)
+00000020	or	r3,r2,r2
+00000024	lwz	r1,0x0(r1)
+00000028	lmw	r30,0xfff8(r1)
+0000002c	blr
+_f1:
+00000030	stmw	r30,0xfff8(r1)
+00000034	stwu	r1,0xffc0(r1)
+00000038	or	r30,r1,r1
+0000003c	mfspr	r0,lr
+00000040	bcl	20,31,0x44
+00000044	mfspr	r8,lr
+00000048	mtspr	lr,r0
+0000004c	or	r9,r3,r3
+00000050	addis	r2,r8,0x0
+00000054	addi	r2,r2,0xb4
+00000058	lwz	r0,0x0(r2)
+0000005c	lwz	r11,0x4(r2)
+00000060	lwz	r10,0x8(r2)
+00000064	lwz	r2,0xc(r2)
+00000068	stw	r0,0x20(r30)
+0000006c	stw	r11,0x24(r30)
+00000070	stw	r10,0x28(r30)
+00000074	stw	r2,0x2c(r30)
+00000078	lwz	r0,0x20(r30)
+0000007c	lwz	r2,0x24(r30)
+00000080	lwz	r11,0x28(r30)
+00000084	lwz	r10,0x2c(r30)
+00000088	stw	r0,0x0(r9)
+0000008c	stw	r2,0x4(r9)
+00000090	stw	r11,0x8(r9)
+00000094	stw	r10,0xc(r9)
+00000098	or	r3,r9,r9
+0000009c	lwz	r1,0x0(r1)
+000000a0	lmw	r30,0xfff8(r1)
+000000a4	blr
+_main:
+000000a8	mfspr	r0,lr
+000000ac	stmw	r30,0xfff8(r1)
+000000b0	stw	r0,0x8(r1)
+000000b4	stwu	r1,0xff90(r1)
+000000b8	or	r30,r1,r1
+000000bc	addi	r3,r30,0x40
+000000c0	bl	0x0
+000000c4	addi	r0,r30,0x50
+000000c8	or	r3,r0,r0
+000000cc	bl	0x30
+000000d0	lbz	r0,0x40(r30)
+000000d4	extsb	r2,r0
+000000d8	lwz	r0,0x58(r30)
+000000dc	add	r0,r2,r0
+000000e0	or	r3,r0,r0
+000000e4	lwz	r1,0x0(r1)
+000000e8	lwz	r0,0x8(r1)
+000000ec	mtspr	lr,r0
+000000f0	lmw	r30,0xfff8(r1)
+000000f4	blr
+
+
+
 ; vim: ft=asm