# HG changeset patch # User Tassilo Philipp # Date 1646090210 -3600 # Node ID 6c72cb768099e2844ad8c187acf89ac5dd0f6086 # Parent 75c19f11b86a652e1a28289f86ec30dfed9e244e callconv doc: - mips o32 update w/ regards to aggregates - mips o32 disas examples - sparc64 doc fixes diff -r 75c19f11b86a -r 6c72cb768099 doc/disas_examples/mips.o32.disas --- a/doc/disas_examples/mips.o32.disas Sun Feb 27 13:53:18 2022 +0100 +++ b/doc/disas_examples/mips.o32.disas Tue Mar 01 00:16:50 2022 +0100 @@ -217,5 +217,1542 @@ 168: 03e00008 jr ra 16c: 00000000 nop + + +; ---------- 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 freebsd-12.0_r333647-malta_mipsebhf w/ gcc 4.2.1 -----> + +00000000 : + 0: 3c1c0000 lui gp,0x0 + 4: 279c0000 addiu gp,gp,0 + 8: 0399e021 addu gp,gp,t9 + c: 27bdfff8 addiu sp,sp,-8 + 10: afbe0000 sw s8,0(sp) + 14: 03a0f021 move s8,sp + 18: afc40008 sw a0,8(s8) + 1c: afc5000c sw a1,12(s8) + 20: afc60010 sw a2,16(s8) + 24: afc70014 sw a3,20(s8) + 28: 03c0e821 move sp,s8 + 2c: 8fbe0000 lw s8,0(sp) + 30: 03e00008 jr ra + 34: 27bd0008 addiu sp,sp,8 + +00000038 : + 38: 3c1c0000 lui gp,0x0 + 3c: 279c0000 addiu gp,gp,0 + 40: 0399e021 addu gp,gp,t9 + 44: 27bdff60 addiu sp,sp,-160 + 48: afbf009c sw ra,156(sp) + 4c: afbe0098 sw s8,152(sp) + 50: 03a0f021 move s8,sp + 54: afbc0028 sw gp,40(sp) + 58: afc400a0 sw a0,160(s8) + 5c: afc500a4 sw a1,164(s8) + 60: afc600a8 sw a2,168(s8) + 64: afc700ac sw a3,172(s8) + 68: 27c20030 addiu v0,s8,48 + 6c: 24030064 li v1,100 + 70: 00402021 move a0,v0 + 74: 00002821 move a1,zero + 78: 00603021 move a2,v1 + 7c: 8f990000 lw t9,0(gp) + 80: 0320f809 jalr t9 + 84: 00000000 nop + 88: 8fdc0028 lw gp,40(s8) + 8c: 2402004c li v0,76 + 90: a3c20030 sb v0,48(s8) + 94: 8fc200b8 lw v0,184(s8) + 98: 8fc300bc lw v1,188(s8) + 9c: 8fc400c0 lw a0,192(s8) + a0: 8fc500c4 lw a1,196(s8) + a4: afa20010 sw v0,16(sp) + a8: afa30014 sw v1,20(sp) + ac: afa40018 sw a0,24(sp) + b0: afa5001c sw a1,28(sp) + b4: 8fc200c8 lw v0,200(s8) + b8: afa20020 sw v0,32(sp) + bc: 8fc200cc lw v0,204(s8) + c0: afa20024 sw v0,36(sp) + c4: 8fc400a4 lw a0,164(s8) + c8: 8fc500a8 lw a1,168(s8) + cc: 8fc600ac lw a2,172(s8) + d0: 8fc700b0 lw a3,176(s8) + d4: 8f990000 lw t9,0(gp) + d8: 0320f809 jalr t9 + dc: 00000000 nop + e0: 8fdc0028 lw gp,40(s8) + e4: 03c0e821 move sp,s8 + e8: 8fbf009c lw ra,156(sp) + ec: 8fbe0098 lw s8,152(sp) + f0: 03e00008 jr ra + f4: 27bd00a0 addiu sp,sp,160 + +000000f8
: + f8: 3c1c0000 lui gp,0x0 ; | + fc: 279c0000 addiu gp,gp,0 ; | + 100: 0399e021 addu gp,gp,t9 ; | + 104: 27bdffb0 addiu sp,sp,-80 ; | prolog + 108: afbf004c sw ra,76(sp) ; | + 10c: afbe0048 sw s8,72(sp) ; | + 110: 03a0f021 move s8,sp ; | frame pointer (note: with offset to frame start, but static compared to sp) + 114: afbc0030 sw gp,48(sp) ; / + 118: 8f820000 lw v0,0(gp) ; \ \ + 11c: 24420000 addiu v0,v0,0 ; | | field j -> v0 + 120: 8c420000 lw v0,0(v0) ; | / + 124: 8f830000 lw v1,0(gp) ; | \ + 128: 24630000 addiu v1,v1,0 ; | | field j -> v1 + 12c: 8c630004 lw v1,4(v1) ; | prep local struct A data ... / + 130: 8f840000 lw a0,0(gp) ; | \ + 134: 24840000 addiu a0,a0,0 ; | | + 138: 8c840008 lw a0,8(a0) ; | | field l -> a0 & a1 + 13c: 8f850000 lw a1,0(gp) ; | | + 140: 24a50000 addiu a1,a1,0 ; | | + 144: 8ca5000c lw a1,12(a1) ; / / + 148: afc20038 sw v0,56(s8) ; \ + 14c: afc3003c sw v1,60(s8) ; | ... and write to local area + 150: afc40040 sw a0,64(s8) ; | + 154: afc50044 sw a1,68(s8) ; / + 158: 24020004 li v0,4 ; push arg 4 ... + 15c: afa20010 sw v0,16(sp) ; ... onto stack + 160: 8fc20038 lw v0,56(s8) ; \ + 164: 8fc3003c lw v1,60(s8) ; | + 168: 8fc40040 lw a0,64(s8) ; | prep arg 5 (struct A) ... + 16c: 8fc50044 lw a1,68(s8) ; / + 170: afa20018 sw v0,24(sp) ; \ + 174: afa3001c sw v1,28(sp) ; | ... and push onto stack + 178: afa40020 sw a0,32(sp) ; | + 17c: afa50024 sw a1,36(sp) ; / + 180: 24020008 li v0,8 ; push arg 6 ... + 184: afa20028 sw v0,40(sp) ; ... onto stack + 188: 24020009 li v0,9 ; push arg 7 ... + 18c: afa2002c sw v0,44(sp) ; ... onto stack + 190: 00002021 move a0,zero ; arg 0 + 194: 24050001 li a1,1 ; arg 1 + 198: 24060002 li a2,2 ; arg 2 + 19c: 24070003 li a3,3 ; arg 3 + 1a0: 8f990000 lw t9,0(gp) ; func to call -> t9 + 1a4: 0320f809 jalr t9 ; call and ret addr -> ra + 1a8: 00000000 nop ; branch delay slot + 1ac: 8fdc0030 lw gp,48(s8) ; | + 1b0: 00001021 move v0,zero ; : return value: not part of epilog, but unordered (branch delay slot style) + 1b4: 03c0e821 move sp,s8 ; | + 1b8: 8fbf004c lw ra,76(sp) ; | epilog + 1bc: 8fbe0048 lw s8,72(sp) ; | + 1c0: 03e00008 jr ra ; | + 1c4: 27bd0050 addiu sp,sp,80 ; | + ... + + + +; output from freebsd-12.0_r333647-malta_mipsebhf w/ gcc 4.2.1 *and* -mhard-float -----> + +00000000 : + 0: 3c1c0000 lui gp,0x0 + 4: 279c0000 addiu gp,gp,0 + 8: 0399e021 addu gp,gp,t9 + c: 27bdfff8 addiu sp,sp,-8 + 10: afbe0000 sw s8,0(sp) + 14: 03a0f021 move s8,sp + 18: afc40008 sw a0,8(s8) + 1c: afc5000c sw a1,12(s8) + 20: afc60010 sw a2,16(s8) + 24: afc70014 sw a3,20(s8) + 28: 03c0e821 move sp,s8 + 2c: 8fbe0000 lw s8,0(sp) + 30: 03e00008 jr ra + 34: 27bd0008 addiu sp,sp,8 + +00000038 : + 38: 3c1c0000 lui gp,0x0 + 3c: 279c0000 addiu gp,gp,0 + 40: 0399e021 addu gp,gp,t9 + 44: 27bdff60 addiu sp,sp,-160 + 48: afbf009c sw ra,156(sp) + 4c: afbe0098 sw s8,152(sp) + 50: 03a0f021 move s8,sp + 54: afbc0028 sw gp,40(sp) + 58: afc400a0 sw a0,160(s8) + 5c: afc500a4 sw a1,164(s8) + 60: afc600a8 sw a2,168(s8) + 64: afc700ac sw a3,172(s8) + 68: 27c20030 addiu v0,s8,48 + 6c: 24030064 li v1,100 + 70: 00402021 move a0,v0 + 74: 00002821 move a1,zero + 78: 00603021 move a2,v1 + 7c: 8f990000 lw t9,0(gp) + 80: 0320f809 jalr t9 + 84: 00000000 nop + 88: 8fdc0028 lw gp,40(s8) + 8c: 2402004c li v0,76 + 90: a3c20030 sb v0,48(s8) + 94: 8fc200b8 lw v0,184(s8) + 98: 8fc300bc lw v1,188(s8) + 9c: 8fc400c0 lw a0,192(s8) + a0: 8fc500c4 lw a1,196(s8) + a4: afa20010 sw v0,16(sp) + a8: afa30014 sw v1,20(sp) + ac: afa40018 sw a0,24(sp) + b0: afa5001c sw a1,28(sp) + b4: 8fc200c8 lw v0,200(s8) + b8: afa20020 sw v0,32(sp) + bc: 8fc200cc lw v0,204(s8) + c0: afa20024 sw v0,36(sp) + c4: 8fc400a4 lw a0,164(s8) + c8: 8fc500a8 lw a1,168(s8) + cc: 8fc600ac lw a2,172(s8) + d0: 8fc700b0 lw a3,176(s8) + d4: 8f990000 lw t9,0(gp) + d8: 0320f809 jalr t9 + dc: 00000000 nop + e0: 8fdc0028 lw gp,40(s8) + e4: 03c0e821 move sp,s8 + e8: 8fbf009c lw ra,156(sp) + ec: 8fbe0098 lw s8,152(sp) + f0: 03e00008 jr ra + f4: 27bd00a0 addiu sp,sp,160 + +000000f8
: + f8: 3c1c0000 lui gp,0x0 ; | + fc: 279c0000 addiu gp,gp,0 ; | + 100: 0399e021 addu gp,gp,t9 ; | + 104: 27bdffb0 addiu sp,sp,-80 ; | prolog + 108: afbf004c sw ra,76(sp) ; | + 10c: afbe0048 sw s8,72(sp) ; | + 110: 03a0f021 move s8,sp ; | frame pointer (note: with offset to frame start, but static compared to sp) + 114: afbc0030 sw gp,48(sp) ; / + 118: 8f820000 lw v0,0(gp) ; \ \ + 11c: 24420000 addiu v0,v0,0 ; | | field j -> v0 + 120: 8c420000 lw v0,0(v0) ; | / + 124: 8f830000 lw v1,0(gp) ; | \ + 128: 24630000 addiu v1,v1,0 ; | | field j -> v1 + 12c: 8c630004 lw v1,4(v1) ; | prep local struct A data ... / + 130: 8f840000 lw a0,0(gp) ; | \ + 134: 24840000 addiu a0,a0,0 ; | | + 138: 8c840008 lw a0,8(a0) ; | | field l -> a0 & a1 + 13c: 8f850000 lw a1,0(gp) ; | | + 140: 24a50000 addiu a1,a1,0 ; | | + 144: 8ca5000c lw a1,12(a1) ; / / + 148: afc20038 sw v0,56(s8) ; \ + 14c: afc3003c sw v1,60(s8) ; | ... and write to local area + 150: afc40040 sw a0,64(s8) ; | + 154: afc50044 sw a1,68(s8) ; / + 158: 24020004 li v0,4 ; push arg 4 ... + 15c: afa20010 sw v0,16(sp) ; ... onto stack + 160: 8fc20038 lw v0,56(s8) ; \ + 164: 8fc3003c lw v1,60(s8) ; | + 168: 8fc40040 lw a0,64(s8) ; | prep arg 5 (struct A) ... + 16c: 8fc50044 lw a1,68(s8) ; / + 170: afa20018 sw v0,24(sp) ; \ + 174: afa3001c sw v1,28(sp) ; | ... and push onto stack + 178: afa40020 sw a0,32(sp) ; | + 17c: afa50024 sw a1,36(sp) ; / + 180: 24020008 li v0,8 ; push arg 6 ... + 184: afa20028 sw v0,40(sp) ; ... onto stack + 188: 24020009 li v0,9 ; push arg 7 ... + 18c: afa2002c sw v0,44(sp) ; ... onto stack + 190: 00002021 move a0,zero ; arg 0 + 194: 24050001 li a1,1 ; arg 1 + 198: 24060002 li a2,2 ; arg 2 + 19c: 24070003 li a3,3 ; arg 3 + 1a0: 8f990000 lw t9,0(gp) ; func to call -> t9 + 1a4: 0320f809 jalr t9 ; call and ret addr -> ra + 1a8: 00000000 nop ; branch delay slot + 1ac: 8fdc0030 lw gp,48(s8) ; | + 1b0: 00001021 move v0,zero ; : return value: not part of epilog, but unordered (branch delay slot style) + 1b4: 03c0e821 move sp,s8 ; | + 1b8: 8fbf004c lw ra,76(sp) ; | epilog + 1bc: 8fbe0048 lw s8,72(sp) ; | + 1c0: 03e00008 jr ra ; | + 1c4: 27bd0050 addiu sp,sp,80 ; | + ... + + + +; ---------- 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 freebsd-12.0_r333647-malta_mipsebhf w/ gcc 4.2.1 -----> + +00000000 : + 0: 3c1c0000 lui gp,0x0 + 4: 279c0000 addiu gp,gp,0 + 8: 0399e021 addu gp,gp,t9 + c: 27bdfff8 addiu sp,sp,-8 + 10: afbe0000 sw s8,0(sp) + 14: 03a0f021 move s8,sp + 18: afc40008 sw a0,8(s8) + 1c: afc5000c sw a1,12(s8) + 20: afc60010 sw a2,16(s8) + 24: afc70014 sw a3,20(s8) + 28: 03c0e821 move sp,s8 + 2c: 8fbe0000 lw s8,0(sp) + 30: 03e00008 jr ra + 34: 27bd0008 addiu sp,sp,8 + +00000038 : + 38: 3c1c0000 lui gp,0x0 + 3c: 279c0000 addiu gp,gp,0 + 40: 0399e021 addu gp,gp,t9 + 44: 27bdff38 addiu sp,sp,-200 + 48: afbf00c4 sw ra,196(sp) + 4c: afbe00c0 sw s8,192(sp) + 50: 03a0f021 move s8,sp + 54: afbc0050 sw gp,80(sp) + 58: afc400c8 sw a0,200(s8) + 5c: afc500cc sw a1,204(s8) + 60: afc600d0 sw a2,208(s8) + 64: afc700d4 sw a3,212(s8) + 68: 27c20058 addiu v0,s8,88 + 6c: 24030064 li v1,100 + 70: 00402021 move a0,v0 + 74: 00002821 move a1,zero + 78: 00603021 move a2,v1 + 7c: 8f990000 lw t9,0(gp) + 80: 0320f809 jalr t9 + 84: 00000000 nop + 88: 8fdc0050 lw gp,80(s8) + 8c: 2402004c li v0,76 + 90: a3c20058 sb v0,88(s8) + 94: 8fc200e0 lw v0,224(s8) + 98: 8fc300e4 lw v1,228(s8) + 9c: 8fc400e8 lw a0,232(s8) + a0: 8fc500ec lw a1,236(s8) + a4: afa20010 sw v0,16(sp) + a8: afa30014 sw v1,20(sp) + ac: afa40018 sw a0,24(sp) + b0: afa5001c sw a1,28(sp) + b4: 8fc200f0 lw v0,240(s8) + b8: afa20020 sw v0,32(sp) + bc: 8fc200f4 lw v0,244(s8) + c0: afa20024 sw v0,36(sp) + c4: 8fc200f8 lw v0,248(s8) + c8: 8fc300fc lw v1,252(s8) + cc: 8fc40100 lw a0,256(s8) + d0: afa20028 sw v0,40(sp) + d4: afa3002c sw v1,44(sp) + d8: afa40030 sw a0,48(sp) + dc: 8fc20108 lw v0,264(s8) + e0: 8fc3010c lw v1,268(s8) + e4: 8fc40110 lw a0,272(s8) + e8: 8fc50114 lw a1,276(s8) + ec: afa20038 sw v0,56(sp) + f0: afa3003c sw v1,60(sp) + f4: afa40040 sw a0,64(sp) + f8: afa50044 sw a1,68(sp) + fc: 8fc20118 lw v0,280(s8) + 100: afa20048 sw v0,72(sp) + 104: 8fc2011c lw v0,284(s8) + 108: afa2004c sw v0,76(sp) + 10c: 8fc400cc lw a0,204(s8) + 110: 8fc500d0 lw a1,208(s8) + 114: 8fc600d4 lw a2,212(s8) + 118: 8fc700d8 lw a3,216(s8) + 11c: 8f990000 lw t9,0(gp) + 120: 0320f809 jalr t9 + 124: 00000000 nop + 128: 8fdc0050 lw gp,80(s8) + 12c: 03c0e821 move sp,s8 + 130: 8fbf00c4 lw ra,196(sp) + 134: 8fbe00c0 lw s8,192(sp) + 138: 03e00008 jr ra + 13c: 27bd00c8 addiu sp,sp,200 + +00000140
: + 140: 3c1c0000 lui gp,0x0 ; | + 144: 279c0000 addiu gp,gp,0 ; | + 148: 0399e021 addu gp,gp,t9 ; | + 14c: 27bdff58 addiu sp,sp,-168 ; | prolog + 150: afbf00a4 sw ra,164(sp) ; | + 154: afbe00a0 sw s8,160(sp) ; | + 158: 03a0f021 move s8,sp ; | frame pointer (note: with offset to frame start, but static compared to sp) + 15c: afbc0058 sw gp,88(sp) ; / + 160: 8f820000 lw v0,0(gp) ; \ | + 164: 24420030 addiu v0,v0,48 ; | | field j -> v0 + 168: 8c420000 lw v0,0(v0) ; | / + 16c: 8f830000 lw v1,0(gp) ; | prep (first) local struct A data ... \ + 170: 24630030 addiu v1,v1,48 ; | | field j -> v1 + 174: 8c630004 lw v1,4(v1) ; | / + 178: 8f840000 lw a0,0(gp) ; | \ + 17c: 24840030 addiu a0,a0,48 ; | | field f -> a0 + 180: 8c840008 lw a0,8(a0) ; / | + 184: afc20090 sw v0,144(s8) ; \ + 188: afc30094 sw v1,148(s8) ; | ... and write to local area + 18c: afc40098 sw a0,152(s8) ; / + 190: 8f820000 lw v0,0(gp) ; \ | + 194: 24420020 addiu v0,v0,32 ; | | + 198: 8c420000 lw v0,0(v0) ; | | + 19c: 8f830000 lw v1,0(gp) ; | | field d -> v0 & v1 + 1a0: 24630020 addiu v1,v1,32 ; | | + 1a4: 8c630004 lw v1,4(v1) ; | prep (first) local struct B data ... / + 1a8: 8f840000 lw a0,0(gp) ; | \ + 1ac: 24840020 addiu a0,a0,32 ; | | + 1b0: 8c840008 lw a0,8(a0) ; | | + 1b4: 8f850000 lw a1,0(gp) ; | | field l -> a0 & a1 + 1b8: 24a50020 addiu a1,a1,32 ; | | + 1bc: 8ca5000c lw a1,12(a1) ; / | + 1c0: afc20080 sw v0,128(s8) ; \ + 1c4: afc30084 sw v1,132(s8) ; | + 1c8: afc40088 sw a0,136(s8) ; | ... and write to local area + 1cc: afc5008c sw a1,140(s8) ; / + 1d0: 8f820000 lw v0,0(gp) ; \ | + 1d4: 24420010 addiu v0,v0,16 ; | | field j -> v0 + 1d8: 8c420000 lw v0,0(v0) ; | / + 1dc: 8f830000 lw v1,0(gp) ; | prep (second) local struct A data ... \ + 1e0: 24630010 addiu v1,v1,16 ; | | field j -> v1 + 1e4: 8c630004 lw v1,4(v1) ; | / + 1e8: 8f840000 lw a0,0(gp) ; | \ + 1ec: 24840010 addiu a0,a0,16 ; | | field f -> a0 + 1f0: 8c840008 lw a0,8(a0) ; / | + 1f4: afc20070 sw v0,112(s8) ; \ + 1f8: afc30074 sw v1,116(s8) ; | ... and write to local area + 1fc: afc40078 sw a0,120(s8) ; / + 200: 8f820000 lw v0,0(gp) ; \ | + 204: 24420000 addiu v0,v0,0 ; | | + 208: 8c420000 lw v0,0(v0) ; | | + 20c: 8f830000 lw v1,0(gp) ; | | field d -> v0 & v1 + 210: 24630000 addiu v1,v1,0 ; | | + 214: 8c630004 lw v1,4(v1) ; | prep (second) local struct B data ... / + 218: 8f840000 lw a0,0(gp) ; | \ + 21c: 24840000 addiu a0,a0,0 ; | | + 220: 8c840008 lw a0,8(a0) ; | | + 224: 8f850000 lw a1,0(gp) ; | | field l -> a0 & a1 + 228: 24a50000 addiu a1,a1,0 ; | | + 22c: 8ca5000c lw a1,12(a1) ; / | + 230: afc20060 sw v0,96(s8) ; \ + 234: afc30064 sw v1,100(s8) ; | + 238: afc40068 sw a0,104(s8) ; | ... and write to local area + 23c: afc5006c sw a1,108(s8) ; / + 240: 8fc20080 lw v0,128(s8) ; \ + 244: 8fc30084 lw v1,132(s8) ; | + 248: 8fc40088 lw a0,136(s8) ; | + 24c: 8fc5008c lw a1,140(s8) ; | + 250: afa20018 sw v0,24(sp) ; | | d + 254: afa3001c sw v1,28(sp) ; | arg 3 (first struct B) / + 258: afa40020 sw a0,32(sp) ; | \ + 25c: afa50024 sw a1,36(sp) ; / | l + 260: 24020007 li v0,7 ; \ + 264: afa20028 sw v0,40(sp) ; / arg 4 + 268: 24020008 li v0,8 ; \ + 26c: afa2002c sw v0,44(sp) ; / arg 5 + 270: 8fc20070 lw v0,112(s8) ; \ + 274: 8fc30074 lw v1,116(s8) ; | + 278: 8fc40078 lw a0,120(s8) ; | arg 6 (second struct A, note that 60(sp) isn't used, so sizeof(struct A) is probably a padded 16) + 27c: afa20030 sw v0,48(sp) ; | i + 280: afa30034 sw v1,52(sp) ; | j + 284: afa40038 sw a0,56(sp) ; / f + 288: 8fc20060 lw v0,96(s8) ; \ + 28c: 8fc30064 lw v1,100(s8) ; | + 290: 8fc40068 lw a0,104(s8) ; | + 294: 8fc5006c lw a1,108(s8) ; | + 298: afa20040 sw v0,64(sp) ; | | d + 29c: afa30044 sw v1,68(sp) ; | arg 7 (second struct B) / + 2a0: afa40048 sw a0,72(sp) ; | \ + 2a4: afa5004c sw a1,76(sp) ; | | l + 2a8: 2402000e li v0,14 ; arg 8 pushed ... + 2ac: afa20050 sw v0,80(sp) ; ... onto stack + 2b0: 2402000f li v0,15 ; arg 9 pushed ... + 2b4: afa20054 sw v0,84(sp) ; ... onto stack + 2b8: 8fc20098 lw v0,152(s8) ; | | f (via stack, first slot after save area) + 2bc: afa20010 sw v0,16(sp) ; | | note that 20(sp) isn't used, so sizeof(struct A) is probably a padded 16 + 2c0: 8fc60090 lw a2,144(s8) ; | arg 2 (first struct A) i (via reg) + 2c4: 8fc70094 lw a3,148(s8) ; | j (via reg) + 2c8: 00002021 move a0,zero ; arg 0 + 2cc: 24050001 li a1,1 ; arg 1 + 2d0: 8f990000 lw t9,0(gp) ; func to call -> t9 + 2d4: 0320f809 jalr t9 ; call and ret addr -> ra + 2d8: 00000000 nop ; branch delay slot + 2dc: 8fdc0058 lw gp,88(s8) ; | + 2e0: 00001021 move v0,zero ; : return value: not part of epilog, but unordered (branch delay slot style) + 2e4: 03c0e821 move sp,s8 ; | + 2e8: 8fbf00a4 lw ra,164(sp) ; | epilog + 2ec: 8fbe00a0 lw s8,160(sp) ; | + 2f0: 03e00008 jr ra ; | + 2f4: 27bd00a8 addiu sp,sp,168 ; | + ... + + + +; output from freebsd-12.0_r333647-malta_mipsebhf w/ gcc 4.2.1 *and* -mhard-float -----> + +00000000 : + 0: 3c1c0000 lui gp,0x0 + 4: 279c0000 addiu gp,gp,0 + 8: 0399e021 addu gp,gp,t9 + c: 27bdfff8 addiu sp,sp,-8 + 10: afbe0000 sw s8,0(sp) + 14: 03a0f021 move s8,sp + 18: afc40008 sw a0,8(s8) + 1c: afc5000c sw a1,12(s8) + 20: afc60010 sw a2,16(s8) + 24: afc70014 sw a3,20(s8) + 28: 03c0e821 move sp,s8 + 2c: 8fbe0000 lw s8,0(sp) + 30: 03e00008 jr ra + 34: 27bd0008 addiu sp,sp,8 + +00000038 : + 38: 3c1c0000 lui gp,0x0 + 3c: 279c0000 addiu gp,gp,0 + 40: 0399e021 addu gp,gp,t9 + 44: 27bdff38 addiu sp,sp,-200 + 48: afbf00c4 sw ra,196(sp) + 4c: afbe00c0 sw s8,192(sp) + 50: 03a0f021 move s8,sp + 54: afbc0050 sw gp,80(sp) + 58: afc400c8 sw a0,200(s8) + 5c: afc500cc sw a1,204(s8) + 60: afc600d0 sw a2,208(s8) + 64: afc700d4 sw a3,212(s8) + 68: 27c20058 addiu v0,s8,88 + 6c: 24030064 li v1,100 + 70: 00402021 move a0,v0 + 74: 00002821 move a1,zero + 78: 00603021 move a2,v1 + 7c: 8f990000 lw t9,0(gp) + 80: 0320f809 jalr t9 + 84: 00000000 nop + 88: 8fdc0050 lw gp,80(s8) + 8c: 2402004c li v0,76 + 90: a3c20058 sb v0,88(s8) + 94: 8fc200e0 lw v0,224(s8) + 98: 8fc300e4 lw v1,228(s8) + 9c: 8fc400e8 lw a0,232(s8) + a0: 8fc500ec lw a1,236(s8) + a4: afa20010 sw v0,16(sp) + a8: afa30014 sw v1,20(sp) + ac: afa40018 sw a0,24(sp) + b0: afa5001c sw a1,28(sp) + b4: 8fc200f0 lw v0,240(s8) + b8: afa20020 sw v0,32(sp) + bc: 8fc200f4 lw v0,244(s8) + c0: afa20024 sw v0,36(sp) + c4: 8fc200f8 lw v0,248(s8) + c8: 8fc300fc lw v1,252(s8) + cc: 8fc40100 lw a0,256(s8) + d0: afa20028 sw v0,40(sp) + d4: afa3002c sw v1,44(sp) + d8: afa40030 sw a0,48(sp) + dc: 8fc20108 lw v0,264(s8) + e0: 8fc3010c lw v1,268(s8) + e4: 8fc40110 lw a0,272(s8) + e8: 8fc50114 lw a1,276(s8) + ec: afa20038 sw v0,56(sp) + f0: afa3003c sw v1,60(sp) + f4: afa40040 sw a0,64(sp) + f8: afa50044 sw a1,68(sp) + fc: 8fc20118 lw v0,280(s8) + 100: afa20048 sw v0,72(sp) + 104: 8fc2011c lw v0,284(s8) + 108: afa2004c sw v0,76(sp) + 10c: 8fc400cc lw a0,204(s8) + 110: 8fc500d0 lw a1,208(s8) + 114: 8fc600d4 lw a2,212(s8) + 118: 8fc700d8 lw a3,216(s8) + 11c: 8f990000 lw t9,0(gp) + 120: 0320f809 jalr t9 + 124: 00000000 nop + 128: 8fdc0050 lw gp,80(s8) + 12c: 03c0e821 move sp,s8 + 130: 8fbf00c4 lw ra,196(sp) + 134: 8fbe00c0 lw s8,192(sp) + 138: 03e00008 jr ra + 13c: 27bd00c8 addiu sp,sp,200 + +00000140
: + 140: 3c1c0000 lui gp,0x0 ; | + 144: 279c0000 addiu gp,gp,0 ; | + 148: 0399e021 addu gp,gp,t9 ; | + 14c: 27bdff58 addiu sp,sp,-168 ; | prolog + 150: afbf00a4 sw ra,164(sp) ; | + 154: afbe00a0 sw s8,160(sp) ; | + 158: 03a0f021 move s8,sp ; | frame pointer (note: with offset to frame start, but static compared to sp) + 15c: afbc0058 sw gp,88(sp) ; / + 160: 8f820000 lw v0,0(gp) ; \ | + 164: 24420030 addiu v0,v0,48 ; | | field j -> v0 + 168: 8c420000 lw v0,0(v0) ; | / + 16c: 8f830000 lw v1,0(gp) ; | prep (first) local struct A data ... \ + 170: 24630030 addiu v1,v1,48 ; | | field j -> v1 + 174: 8c630004 lw v1,4(v1) ; | / + 178: 8f840000 lw a0,0(gp) ; | \ + 17c: 24840030 addiu a0,a0,48 ; | | field f -> a0 + 180: 8c840008 lw a0,8(a0) ; / | + 184: afc20090 sw v0,144(s8) ; \ + 188: afc30094 sw v1,148(s8) ; | ... and write to local area + 18c: afc40098 sw a0,152(s8) ; / + 190: 8f820000 lw v0,0(gp) ; \ | + 194: 24420020 addiu v0,v0,32 ; | | + 198: 8c420000 lw v0,0(v0) ; | | + 19c: 8f830000 lw v1,0(gp) ; | | field d -> v0 & v1 + 1a0: 24630020 addiu v1,v1,32 ; | | + 1a4: 8c630004 lw v1,4(v1) ; | prep (first) local struct B data ... / + 1a8: 8f840000 lw a0,0(gp) ; | \ + 1ac: 24840020 addiu a0,a0,32 ; | | + 1b0: 8c840008 lw a0,8(a0) ; | | + 1b4: 8f850000 lw a1,0(gp) ; | | field l -> a0 & a1 + 1b8: 24a50020 addiu a1,a1,32 ; | | + 1bc: 8ca5000c lw a1,12(a1) ; / | + 1c0: afc20080 sw v0,128(s8) ; \ + 1c4: afc30084 sw v1,132(s8) ; | + 1c8: afc40088 sw a0,136(s8) ; | ... and write to local area + 1cc: afc5008c sw a1,140(s8) ; / + 1d0: 8f820000 lw v0,0(gp) ; \ | + 1d4: 24420010 addiu v0,v0,16 ; | | field j -> v0 + 1d8: 8c420000 lw v0,0(v0) ; | / + 1dc: 8f830000 lw v1,0(gp) ; | prep (second) local struct A data ... \ + 1e0: 24630010 addiu v1,v1,16 ; | | field j -> v1 + 1e4: 8c630004 lw v1,4(v1) ; | / + 1e8: 8f840000 lw a0,0(gp) ; | \ + 1ec: 24840010 addiu a0,a0,16 ; | | field f -> a0 + 1f0: 8c840008 lw a0,8(a0) ; / | + 1f4: afc20070 sw v0,112(s8) ; \ + 1f8: afc30074 sw v1,116(s8) ; | ... and write to local area + 1fc: afc40078 sw a0,120(s8) ; / + 200: 8f820000 lw v0,0(gp) ; \ | + 204: 24420000 addiu v0,v0,0 ; | | + 208: 8c420000 lw v0,0(v0) ; | | + 20c: 8f830000 lw v1,0(gp) ; | | field d -> v0 & v1 + 210: 24630000 addiu v1,v1,0 ; | | + 214: 8c630004 lw v1,4(v1) ; | prep (second) local struct B data ... / + 218: 8f840000 lw a0,0(gp) ; | \ + 21c: 24840000 addiu a0,a0,0 ; | | + 220: 8c840008 lw a0,8(a0) ; | | + 224: 8f850000 lw a1,0(gp) ; | | field l -> a0 & a1 + 228: 24a50000 addiu a1,a1,0 ; | | + 22c: 8ca5000c lw a1,12(a1) ; / | + 230: afc20060 sw v0,96(s8) ; \ + 234: afc30064 sw v1,100(s8) ; | + 238: afc40068 sw a0,104(s8) ; | ... and write to local area + 23c: afc5006c sw a1,108(s8) ; / + 240: 8fc20080 lw v0,128(s8) ; \ + 244: 8fc30084 lw v1,132(s8) ; | + 248: 8fc40088 lw a0,136(s8) ; | + 24c: 8fc5008c lw a1,140(s8) ; | + 250: afa20018 sw v0,24(sp) ; | | d + 254: afa3001c sw v1,28(sp) ; | arg 3 (first struct B) / + 258: afa40020 sw a0,32(sp) ; | \ + 25c: afa50024 sw a1,36(sp) ; / | l + 260: 24020007 li v0,7 ; \ + 264: afa20028 sw v0,40(sp) ; / arg 4 + 268: 24020008 li v0,8 ; \ + 26c: afa2002c sw v0,44(sp) ; / arg 5 + 270: 8fc20070 lw v0,112(s8) ; \ + 274: 8fc30074 lw v1,116(s8) ; | + 278: 8fc40078 lw a0,120(s8) ; | arg 6 (second struct A, note that 60(sp) isn't used, so sizeof(struct A) is probably a padded 16) + 27c: afa20030 sw v0,48(sp) ; | i + 280: afa30034 sw v1,52(sp) ; | j + 284: afa40038 sw a0,56(sp) ; / f + 288: 8fc20060 lw v0,96(s8) ; \ + 28c: 8fc30064 lw v1,100(s8) ; | + 290: 8fc40068 lw a0,104(s8) ; | + 294: 8fc5006c lw a1,108(s8) ; | + 298: afa20040 sw v0,64(sp) ; | | d + 29c: afa30044 sw v1,68(sp) ; | arg 7 (second struct B) / + 2a0: afa40048 sw a0,72(sp) ; | \ + 2a4: afa5004c sw a1,76(sp) ; | | l + 2a8: 2402000e li v0,14 ; arg 8 pushed ... + 2ac: afa20050 sw v0,80(sp) ; ... onto stack + 2b0: 2402000f li v0,15 ; arg 9 pushed ... + 2b4: afa20054 sw v0,84(sp) ; ... onto stack + 2b8: 8fc20098 lw v0,152(s8) ; | | f (via stack, first slot after save area) + 2bc: afa20010 sw v0,16(sp) ; | | note that 20(sp) isn't used, so sizeof(struct A) is probably a padded 16 + 2c0: 8fc60090 lw a2,144(s8) ; | arg 2 (first struct A) i (via reg) + 2c4: 8fc70094 lw a3,148(s8) ; | j (via reg) + 2c8: 00002021 move a0,zero ; arg 0 + 2cc: 24050001 li a1,1 ; arg 1 + 2d0: 8f990000 lw t9,0(gp) ; func to call -> t9 + 2d4: 0320f809 jalr t9 ; call and ret addr -> ra + 2d8: 00000000 nop ; branch delay slot + 2dc: 8fdc0058 lw gp,88(s8) ; | + 2e0: 00001021 move v0,zero ; : return value: not part of epilog, but unordered (branch delay slot style) + 2e4: 03c0e821 move sp,s8 ; | + 2e8: 8fbf00a4 lw ra,164(sp) ; | epilog + 2ec: 8fbe00a0 lw s8,160(sp) ; | + 2f0: 03e00008 jr ra ; | + 2f4: 27bd00a8 addiu sp,sp,168 ; | + ... + + + +; ---------- returning structs by value ----------> +; +; struct Small { char x; }; +; struct Big { long long i,j,k,l; long m; }; /* bigger than 16b */ +; +; struct Small f0() +; { +; struct Small s = { 132 }; +; return s; +; } +; +; struct Big f1() +; { +; struct Big b = { 7171LL, 99LL, -99LL, -3102LL, 32 }; +; return b; +; } +; +; int main() +; { +; struct Small s = f0(); +; struct Big b = f1(); +; return b.j + b.k + b.m + s.x; +; } + + + +; output from freebsd-12.0_r333647-malta_mipsebhf w/ gcc 4.2.1 -----> + +00000000 : + 0: 3c1c0000 lui gp,0x0 ; | + 4: 279c0000 addiu gp,gp,0 ; | + 8: 0399e021 addu gp,gp,t9 ; | prolog + c: 27bdffe8 addiu sp,sp,-24 ; | + 10: afbe0010 sw s8,16(sp) ; | + 14: 03a0f021 move s8,sp ; | + 18: 00801021 move v0,a0 ; hidden first arg (ptr to struct ret) -> v0 + 1c: 2403ff84 li v1,-124 ; | put together local struct + 20: a3c30008 sb v1,8(s8) ; / + 24: 93c30008 lbu v1,8(s8) ; read struct data from local area ... + 28: a0430000 sb v1,0(v0) ; ... and write to return value area + 2c: 03c0e821 move sp,s8 ; \ + 30: 8fbe0010 lw s8,16(sp) ; | + 34: 03e00008 jr ra ; | epilog + 38: 27bd0018 addiu sp,sp,24 ; | + +0000003c : + 3c: 3c1c0000 lui gp,0x0 ; | + 40: 279c0000 addiu gp,gp,0 ; | + 44: 0399e021 addu gp,gp,t9 ; | + 48: 27bdffb0 addiu sp,sp,-80 ; | + 4c: afbf0048 sw ra,72(sp) ; | prolog + 50: afbe0044 sw s8,68(sp) ; | + 54: afb00040 sw s0,64(sp) ; | + 58: 03a0f021 move s8,sp ; | + 5c: afbc0010 sw gp,16(sp) ; | + 60: 00808021 move s0,a0 ; hidden first arg (ptr to struct ret) -> s0 + 64: 27c20018 addiu v0,s8,24 ; + 68: 8f830000 lw v1,0(gp) ; + 6c: 24630000 addiu v1,v1,0 ; + 70: 24060028 li a2,40 ; + 74: 00402021 move a0,v0 ; + 78: 00602821 move a1,v1 ; + 7c: 8f990000 lw t9,0(gp) ; + 80: 0320f809 jalr t9 ; + 84: 00000000 nop ; @@@ unsure why those two jumps, but seems to put return value data together + 88: 8fdc0010 lw gp,16(s8) ; + 8c: 02001021 move v0,s0 ; + 90: 27c30018 addiu v1,s8,24 ; + 94: 24060028 li a2,40 ; + 98: 00402021 move a0,v0 ; + 9c: 00602821 move a1,v1 ; + a0: 8f990000 lw t9,0(gp) ; + a4: 0320f809 jalr t9 ; + a8: 00000000 nop ; + ac: 8fdc0010 lw gp,16(s8) ; | + b0: 02001021 move v0,s0 ; : return value (hidden ptr): not part of epilog, but unordered (branch delay slot style) + b4: 03c0e821 move sp,s8 ; | + b8: 8fbf0048 lw ra,72(sp) ; | + bc: 8fbe0044 lw s8,68(sp) ; | epilog + c0: 8fb00040 lw s0,64(sp) ; | + c4: 03e00008 jr ra ; | + c8: 27bd0050 addiu sp,sp,80 ; | + +000000cc
: + cc: 3c1c0000 lui gp,0x0 ; | + d0: 279c0000 addiu gp,gp,0 ; | + d4: 0399e021 addu gp,gp,t9 ; | + d8: 27bdffb0 addiu sp,sp,-80 ; | + dc: afbf004c sw ra,76(sp) ; | prolog + e0: afbe0048 sw s8,72(sp) ; | + e4: 03a0f021 move s8,sp ; | + e8: afbc0010 sw gp,16(sp) ; / + ec: 27c20018 addiu v0,s8,24 ; \ + f0: 00402021 move a0,v0 ; | hidden first arg (ptr to space for ret val) + f4: 8f990000 lw t9,0(gp) ; func to call (f0) -> t9 + f8: 0320f809 jalr t9 ; call and ret addr -> ra + fc: 00000000 nop ; branch delay slot + 100: 8fdc0010 lw gp,16(s8) ; restore gp @@@ unsure why? + 104: 27c20020 addiu v0,s8,32 ; | + 108: 00402021 move a0,v0 ; | hidden first arg (ptr to space for ret val) + 10c: 8f990000 lw t9,0(gp) ; func to call (f1) -> t9 + 110: 0320f809 jalr t9 ; call and ret addr -> ra + 114: 00000000 nop ; branch delay slot + 118: 8fdc0010 lw gp,16(s8) ; restore gp @@@ unsure why? + 11c: 8fc3002c lw v1,44(s8) ; | | + 120: 8fc20028 lw v0,40(s8) ; | | b.j -> v0 & v1 + 124: 00602021 move a0,v1 ; | a0 = (int)b.j + 128: 8fc30034 lw v1,52(s8) ; | | + 12c: 8fc20030 lw v0,48(s8) ; | | b.j -> v0 & v1 + 130: 00601021 move v0,v1 ; | return value v0 = (int)b.k + 134: 00821821 addu v1,a0,v0 ; | (int)b.j + (int)b.k -> v1 + 138: 8fc20040 lw v0,64(s8) ; | b.m -> v0 + 13c: 00621821 addu v1,v1,v0 ; | ((int)b.j + (int)b.k) + b.m -> v1 + 140: 83c20018 lb v0,24(s8) ; | s.x -> v0 + 144: 00621021 addu v0,v1,v0 ; / (((int)b.j + (int)b.k) + b.m) + s.x -> v0 + 148: 03c0e821 move sp,s8 ; \ + 14c: 8fbf004c lw ra,76(sp) ; | + 150: 8fbe0048 lw s8,72(sp) ; | epilog + 154: 03e00008 jr ra ; | + 158: 27bd0050 addiu sp,sp,80 ; | + 15c: 00000000 nop ; | + + + +; output from freebsd-12.0_r333647-malta_mipsebhf w/ gcc 4.2.1 *and* -mhard-float -----> + +00000000 : + 0: 3c1c0000 lui gp,0x0 + 4: 279c0000 addiu gp,gp,0 + 8: 0399e021 addu gp,gp,t9 + c: 27bdffe8 addiu sp,sp,-24 + 10: afbe0010 sw s8,16(sp) + 14: 03a0f021 move s8,sp + 18: 00801021 move v0,a0 + 1c: 2403ff84 li v1,-124 + 20: a3c30008 sb v1,8(s8) + 24: 93c30008 lbu v1,8(s8) + 28: a0430000 sb v1,0(v0) + 2c: 03c0e821 move sp,s8 + 30: 8fbe0010 lw s8,16(sp) + 34: 03e00008 jr ra + 38: 27bd0018 addiu sp,sp,24 + +0000003c : + 3c: 3c1c0000 lui gp,0x0 + 40: 279c0000 addiu gp,gp,0 + 44: 0399e021 addu gp,gp,t9 + 48: 27bdffb0 addiu sp,sp,-80 + 4c: afbf0048 sw ra,72(sp) + 50: afbe0044 sw s8,68(sp) + 54: afb00040 sw s0,64(sp) + 58: 03a0f021 move s8,sp + 5c: afbc0010 sw gp,16(sp) + 60: 00808021 move s0,a0 + 64: 27c20018 addiu v0,s8,24 + 68: 8f830000 lw v1,0(gp) + 6c: 24630000 addiu v1,v1,0 + 70: 24060028 li a2,40 + 74: 00402021 move a0,v0 + 78: 00602821 move a1,v1 + 7c: 8f990000 lw t9,0(gp) + 80: 0320f809 jalr t9 + 84: 00000000 nop + 88: 8fdc0010 lw gp,16(s8) + 8c: 02001021 move v0,s0 + 90: 27c30018 addiu v1,s8,24 + 94: 24060028 li a2,40 + 98: 00402021 move a0,v0 + 9c: 00602821 move a1,v1 + a0: 8f990000 lw t9,0(gp) + a4: 0320f809 jalr t9 + a8: 00000000 nop + ac: 8fdc0010 lw gp,16(s8) + b0: 02001021 move v0,s0 + b4: 03c0e821 move sp,s8 + b8: 8fbf0048 lw ra,72(sp) + bc: 8fbe0044 lw s8,68(sp) + c0: 8fb00040 lw s0,64(sp) + c4: 03e00008 jr ra + c8: 27bd0050 addiu sp,sp,80 + +000000cc
: + cc: 3c1c0000 lui gp,0x0 + d0: 279c0000 addiu gp,gp,0 + d4: 0399e021 addu gp,gp,t9 + d8: 27bdffb0 addiu sp,sp,-80 + dc: afbf004c sw ra,76(sp) + e0: afbe0048 sw s8,72(sp) + e4: 03a0f021 move s8,sp + e8: afbc0010 sw gp,16(sp) + ec: 27c20018 addiu v0,s8,24 + f0: 00402021 move a0,v0 + f4: 8f990000 lw t9,0(gp) + f8: 0320f809 jalr t9 + fc: 00000000 nop + 100: 8fdc0010 lw gp,16(s8) + 104: 27c20020 addiu v0,s8,32 + 108: 00402021 move a0,v0 + 10c: 8f990000 lw t9,0(gp) + 110: 0320f809 jalr t9 + 114: 00000000 nop + 118: 8fdc0010 lw gp,16(s8) + 11c: 8fc3002c lw v1,44(s8) + 120: 8fc20028 lw v0,40(s8) + 124: 00602021 move a0,v1 + 128: 8fc30034 lw v1,52(s8) + 12c: 8fc20030 lw v0,48(s8) + 130: 00601021 move v0,v1 + 134: 00821821 addu v1,a0,v0 + 138: 8fc20040 lw v0,64(s8) + 13c: 00621821 addu v1,v1,v0 + 140: 83c20018 lb v0,24(s8) + 144: 00621021 addu v0,v1,v0 + 148: 03c0e821 move sp,s8 + 14c: 8fbf004c lw ra,76(sp) + 150: 8fbe0048 lw s8,72(sp) + 154: 03e00008 jr ra + 158: 27bd0050 addiu sp,sp,80 + 15c: 00000000 nop + + + +; ---------- returning long long ----------> +; +; long long f() +; { +; return 7171LL; +; } +; +; int main() +; { +; return (int)f(); +; } + + + +; output from freebsd-12.0_r333647-malta_mipsebhf w/ gcc 4.2.1 -----> + +00000000 : + 0: 3c1c0000 lui gp,0x0 ; + 4: 279c0000 addiu gp,gp,0 ; + 8: 0399e021 addu gp,gp,t9 ; + c: 27bdfff8 addiu sp,sp,-8 ; + 10: afbe0000 sw s8,0(sp) ; + 14: 03a0f021 move s8,sp ; + 18: 24031c03 li v1,7171 ; | return value + 1c: 00001021 move v0,zero ; | + 20: 03c0e821 move sp,s8 ; + 24: 8fbe0000 lw s8,0(sp) ; + 28: 03e00008 jr ra ; + 2c: 27bd0008 addiu sp,sp,8 ; + +00000030
: + 30: 3c1c0000 lui gp,0x0 + 34: 279c0000 addiu gp,gp,0 + 38: 0399e021 addu gp,gp,t9 + 3c: 27bdffe0 addiu sp,sp,-32 + 40: afbf001c sw ra,28(sp) + 44: afbe0018 sw s8,24(sp) + 48: 03a0f021 move s8,sp + 4c: afbc0010 sw gp,16(sp) + 50: 8f990000 lw t9,0(gp) + 54: 0320f809 jalr t9 + 58: 00000000 nop + 5c: 8fdc0010 lw gp,16(s8) + 60: 00601021 move v0,v1 + 64: 03c0e821 move sp,s8 + 68: 8fbf001c lw ra,28(sp) + 6c: 8fbe0018 lw s8,24(sp) + 70: 03e00008 jr ra + 74: 27bd0020 addiu sp,sp,32 + ... + + + +; output from freebsd-12.0_r333647-malta_mipsebhf w/ gcc 4.2.1 *and* -mhard-float -----> + +00000000 : + 0: 3c1c0000 lui gp,0x0 ; + 4: 279c0000 addiu gp,gp,0 ; + 8: 0399e021 addu gp,gp,t9 ; + c: 27bdfff8 addiu sp,sp,-8 ; + 10: afbe0000 sw s8,0(sp) ; + 14: 03a0f021 move s8,sp ; + 18: 24031c03 li v1,7171 ; | return value + 1c: 00001021 move v0,zero ; | + 20: 03c0e821 move sp,s8 ; + 24: 8fbe0000 lw s8,0(sp) ; + 28: 03e00008 jr ra ; + 2c: 27bd0008 addiu sp,sp,8 ; + +00000030
: + 30: 3c1c0000 lui gp,0x0 + 34: 279c0000 addiu gp,gp,0 + 38: 0399e021 addu gp,gp,t9 + 3c: 27bdffe0 addiu sp,sp,-32 + 40: afbf001c sw ra,28(sp) + 44: afbe0018 sw s8,24(sp) + 48: 03a0f021 move s8,sp + 4c: afbc0010 sw gp,16(sp) + 50: 8f990000 lw t9,0(gp) + 54: 0320f809 jalr t9 + 58: 00000000 nop + 5c: 8fdc0010 lw gp,16(s8) + 60: 00601021 move v0,v1 + 64: 03c0e821 move sp,s8 + 68: 8fbf001c lw ra,28(sp) + 6c: 8fbe0018 lw s8,24(sp) + 70: 03e00008 jr ra + 74: 27bd0020 addiu sp,sp,32 + ... + + + +; ---------- passing structs with only fp parts ----------> +; +; struct A { float a; }; +; struct B { float a, b; }; +; struct C { float a, b, c; }; +; struct D { double a; }; +; struct E { double a, b; }; +; struct F { double a, b, c; }; +; +; void leaf_call(struct A a, struct B b, struct C c, struct D d, struct E e, struct F f) +; { +; } +; +; int main() +; { +; leaf_call((struct A){1.f}, (struct B){2.f,3.f}, (struct C){4.f,5.f,6.f}, (struct D){1.}, (struct E){2.,3.}, (struct F){4.,5.,6.}); +; return 0; +; } + + + +; output from freebsd-12.0_r333647-malta_mipsebhf w/ gcc 4.2.1 -----> + +00000000 : + 0: 3c1c0000 lui gp,0x0 + 4: 279c0000 addiu gp,gp,0 + 8: 0399e021 addu gp,gp,t9 + c: 27bdfff8 addiu sp,sp,-8 + 10: afbe0000 sw s8,0(sp) + 14: 03a0f021 move s8,sp + 18: afc40008 sw a0,8(s8) + 1c: afc5000c sw a1,12(s8) + 20: afc60010 sw a2,16(s8) + 24: afc70014 sw a3,20(s8) + 28: 03c0e821 move sp,s8 + 2c: 8fbe0000 lw s8,0(sp) + 30: 03e00008 jr ra + 34: 27bd0008 addiu sp,sp,8 + +00000038
: + 38: 3c1c0000 lui gp,0x0 ; | + 3c: 279c0000 addiu gp,gp,0 ; | + 40: 0399e021 addu gp,gp,t9 ; | + 44: 27bdff60 addiu sp,sp,-160 ; | prolog + 48: afbf009c sw ra,156(sp) ; | + 4c: afbe0098 sw s8,152(sp) ; | + 50: 03a0f021 move s8,sp ; | frame pointer (note: with offset to frame start, but static compared to sp) + 54: afbc0048 sw gp,72(sp) ; / + 58: 8f820000 lw v0,0(gp) ; \ + 5c: 24420044 addiu v0,v0,68 ; | prep local struct A data ... + 60: 8c420000 lw v0,0(v0) ; / + 64: afc20094 sw v0,148(s8) ; ... and write to local area + 68: 8f820000 lw v0,0(gp) ; \ + 6c: 2442003c addiu v0,v0,60 ; | + 70: 8c420000 lw v0,0(v0) ; | + 74: 8f830000 lw v1,0(gp) ; | prep local struct B data ... + 78: 2463003c addiu v1,v1,60 ; | + 7c: 8c630004 lw v1,4(v1) ; / + 80: afc2008c sw v0,140(s8) ; \ ... and write to local area a + 84: afc30090 sw v1,144(s8) ; / b + 88: 8f820000 lw v0,0(gp) ; \ + 8c: 24420030 addiu v0,v0,48 ; | + 90: 8c420000 lw v0,0(v0) ; | + 94: 8f830000 lw v1,0(gp) ; | + 98: 24630030 addiu v1,v1,48 ; | prep local struct C data ... + 9c: 8c630004 lw v1,4(v1) ; | + a0: 8f840000 lw a0,0(gp) ; | + a4: 24840030 addiu a0,a0,48 ; | + a8: 8c840008 lw a0,8(a0) ; / + ac: afc20080 sw v0,128(s8) ; \ a + b0: afc30084 sw v1,132(s8) ; | ... and write to local area b + b4: afc40088 sw a0,136(s8) ; / c + b8: 8f830000 lw v1,0(gp) ; \ + bc: 24630028 addiu v1,v1,40 ; | + c0: 8c630004 lw v1,4(v1) ; | + c4: 8f820000 lw v0,0(gp) ; | prep local struct D data ... + c8: 24420028 addiu v0,v0,40 ; | + cc: 8c420000 lw v0,0(v0) ; / + d0: afc3007c sw v1,124(s8) ; \ ... and write to local area + d4: afc20078 sw v0,120(s8) ; / + d8: 8f820000 lw v0,0(gp) ; \ + dc: 24420018 addiu v0,v0,24 ; | + e0: 8c420000 lw v0,0(v0) ; | + e4: 8f830000 lw v1,0(gp) ; | + e8: 24630018 addiu v1,v1,24 ; | + ec: 8c630004 lw v1,4(v1) ; | prep local struct E data ... + f0: 8f840000 lw a0,0(gp) ; | + f4: 24840018 addiu a0,a0,24 ; | + f8: 8c840008 lw a0,8(a0) ; | + fc: 8f850000 lw a1,0(gp) ; | + 100: 24a50018 addiu a1,a1,24 ; | + 104: 8ca5000c lw a1,12(a1) ; / + 108: afc20068 sw v0,104(s8) ; \ | a + 10c: afc3006c sw v1,108(s8) ; | ... and write to local area / + 110: afc40070 sw a0,112(s8) ; | \ + 114: afc50074 sw a1,116(s8) ; / | b + 118: 8f820000 lw v0,0(gp) ; \ + 11c: 24420000 addiu v0,v0,0 ; | + 120: 8c420000 lw v0,0(v0) ; | + 124: 8f830000 lw v1,0(gp) ; | + 128: 24630000 addiu v1,v1,0 ; | + 12c: 8c630004 lw v1,4(v1) ; | + 130: 8f840000 lw a0,0(gp) ; | + 134: 24840000 addiu a0,a0,0 ; | + 138: 8c840008 lw a0,8(a0) ; | + 13c: 8f850000 lw a1,0(gp) ; | prep local struct F data ... + 140: 24a50000 addiu a1,a1,0 ; | + 144: 8ca5000c lw a1,12(a1) ; | + 148: 8f860000 lw a2,0(gp) ; | + 14c: 24c60000 addiu a2,a2,0 ; | + 150: 8cc60010 lw a2,16(a2) ; | + 154: 8f870000 lw a3,0(gp) ; | + 158: 24e70000 addiu a3,a3,0 ; | + 15c: 8ce70014 lw a3,20(a3) ; / + 160: afc20050 sw v0,80(s8) ; \ | a + 164: afc30054 sw v1,84(s8) ; | / + 168: afc40058 sw a0,88(s8) ; | \ b + 16c: afc5005c sw a1,92(s8) ; | ... and write to local area / + 170: afc60060 sw a2,96(s8) ; | \ + 174: afc70064 sw a3,100(s8) ; / | c + 178: 8fc3007c lw v1,124(s8) ; \ + 17c: 8fc20078 lw v0,120(s8) ; | + 180: afa3001c sw v1,28(sp) ; | arg 3 (struct D) + 184: afa20018 sw v0,24(sp) ; / + 188: 8fc20068 lw v0,104(s8) ; \ + 18c: 8fc3006c lw v1,108(s8) ; | + 190: 8fc40070 lw a0,112(s8) ; | + 194: 8fc50074 lw a1,116(s8) ; | + 198: afa20020 sw v0,32(sp) ; | arg 4 (struct E) + 19c: afa30024 sw v1,36(sp) ; | + 1a0: afa40028 sw a0,40(sp) ; | + 1a4: afa5002c sw a1,44(sp) ; / + 1a8: 8fc20050 lw v0,80(s8) ; \ + 1ac: 8fc30054 lw v1,84(s8) ; | + 1b0: 8fc40058 lw a0,88(s8) ; | + 1b4: 8fc5005c lw a1,92(s8) ; | + 1b8: 8fc60060 lw a2,96(s8) ; | + 1bc: 8fc70064 lw a3,100(s8) ; | + 1c0: afa20030 sw v0,48(sp) ; | arg 5 (struct F) + 1c4: afa30034 sw v1,52(sp) ; | + 1c8: afa40038 sw a0,56(sp) ; | + 1cc: afa5003c sw a1,60(sp) ; | + 1d0: afa60040 sw a2,64(sp) ; | + 1d4: afa70044 sw a3,68(sp) ; / + 1d8: 8fc20084 lw v0,132(s8) ; \ + 1dc: 8fc30088 lw v1,136(s8) ; | + 1e0: afa20010 sw v0,16(sp) ; | arg 2 (struct C) b (via stack) + 1e4: afa30014 sw v1,20(sp) ; | c (via stack) + 1e8: 8fc70080 lw a3,128(s8) ; | a (via reg) + 1ec: 8fc40094 lw a0,148(s8) ; arg 0 (struct A, via reg) + 1f0: 8fc5008c lw a1,140(s8) ; | arg 1 (struct B, via regs) a + 1f4: 8fc60090 lw a2,144(s8) ; | b + 1f8: 8f990000 lw t9,0(gp) ; func to call -> t9 + 1fc: 0320f809 jalr t9 ; call and ret addr -> ra + 200: 00000000 nop ; branch delay slot + 204: 8fdc0048 lw gp,72(s8) ; | + 208: 00001021 move v0,zero ; : return value: not part of epilog, but unordered (branch delay slot style) + 20c: 03c0e821 move sp,s8 ; | + 210: 8fbf009c lw ra,156(sp) ; | epilog + 214: 8fbe0098 lw s8,152(sp) ; | + 218: 03e00008 jr ra ; | + 21c: 27bd00a0 addiu sp,sp,160 ; | + + + +; output from freebsd-12.0_r333647-malta_mipsebhf w/ gcc 4.2.1 *and* -mhard-float -----> + +00000000 : + 0: 3c1c0000 lui gp,0x0 + 4: 279c0000 addiu gp,gp,0 + 8: 0399e021 addu gp,gp,t9 + c: 27bdfff8 addiu sp,sp,-8 + 10: afbe0000 sw s8,0(sp) + 14: 03a0f021 move s8,sp + 18: afc40008 sw a0,8(s8) + 1c: afc5000c sw a1,12(s8) + 20: afc60010 sw a2,16(s8) + 24: afc70014 sw a3,20(s8) + 28: 03c0e821 move sp,s8 + 2c: 8fbe0000 lw s8,0(sp) + 30: 03e00008 jr ra + 34: 27bd0008 addiu sp,sp,8 + +00000038
: + 38: 3c1c0000 lui gp,0x0 ; | + 3c: 279c0000 addiu gp,gp,0 ; | + 40: 0399e021 addu gp,gp,t9 ; | + 44: 27bdff60 addiu sp,sp,-160 ; | prolog + 48: afbf009c sw ra,156(sp) ; | + 4c: afbe0098 sw s8,152(sp) ; | + 50: 03a0f021 move s8,sp ; | frame pointer (note: with offset to frame start, but static compared to sp) + 54: afbc0048 sw gp,72(sp) ; / + 58: 8f810000 lw at,0(gp) ; \ + 5c: 24210044 addiu at,at,68 ; | prep local struct A (single float field) data ... + 60: c4200000 lwc1 $f0,0(at) ; / + 64: e7c00094 swc1 $f0,148(s8) ; ... and write to local area + 68: 8f820000 lw v0,0(gp) ; \ + 6c: 2442003c addiu v0,v0,60 ; | + 70: 8c420000 lw v0,0(v0) ; | + 74: 8f830000 lw v1,0(gp) ; | prep local struct B data ... + 78: 2463003c addiu v1,v1,60 ; | + 7c: 8c630004 lw v1,4(v1) ; / + 80: afc2008c sw v0,140(s8) ; \ ... and write to local area a + 84: afc30090 sw v1,144(s8) ; / b + 88: 8f820000 lw v0,0(gp) ; \ + 8c: 24420030 addiu v0,v0,48 ; | + 90: 8c420000 lw v0,0(v0) ; | + 94: 8f830000 lw v1,0(gp) ; | + 98: 24630030 addiu v1,v1,48 ; | prep local struct C data ... + 9c: 8c630004 lw v1,4(v1) ; | + a0: 8f840000 lw a0,0(gp) ; | + a4: 24840030 addiu a0,a0,48 ; | + a8: 8c840008 lw a0,8(a0) ; / + ac: afc20080 sw v0,128(s8) ; \ a + b0: afc30084 sw v1,132(s8) ; | ... and write to local area b + b4: afc40088 sw a0,136(s8) ; / c + b8: 8f810000 lw at,0(gp) ; \ + bc: 24210028 addiu at,at,40 ; | prep local struct D (single double field) data ... + c0: d4200000 ldc1 $f0,0(at) ; / + c4: f7c00078 sdc1 $f0,120(s8) ; ... and write to local area + c8: 8f820000 lw v0,0(gp) ; \ + cc: 24420018 addiu v0,v0,24 ; | + d0: 8c420000 lw v0,0(v0) ; | + d4: 8f830000 lw v1,0(gp) ; | + d8: 24630018 addiu v1,v1,24 ; | + dc: 8c630004 lw v1,4(v1) ; | prep local struct E data ... + e0: 8f840000 lw a0,0(gp) ; | + e4: 24840018 addiu a0,a0,24 ; | + e8: 8c840008 lw a0,8(a0) ; | + ec: 8f850000 lw a1,0(gp) ; | + f0: 24a50018 addiu a1,a1,24 ; | + f4: 8ca5000c lw a1,12(a1) ; / + f8: afc20068 sw v0,104(s8) ; \ | a + fc: afc3006c sw v1,108(s8) ; | ... and write to local area / + 100: afc40070 sw a0,112(s8) ; | \ + 104: afc50074 sw a1,116(s8) ; / | b + 108: 8f820000 lw v0,0(gp) ; \ + 10c: 24420000 addiu v0,v0,0 ; | + 110: 8c420000 lw v0,0(v0) ; | + 114: 8f830000 lw v1,0(gp) ; | + 118: 24630000 addiu v1,v1,0 ; | + 11c: 8c630004 lw v1,4(v1) ; | + 120: 8f840000 lw a0,0(gp) ; | + 124: 24840000 addiu a0,a0,0 ; | + 128: 8c840008 lw a0,8(a0) ; | + 12c: 8f850000 lw a1,0(gp) ; | prep local struct F data ... + 130: 24a50000 addiu a1,a1,0 ; | + 134: 8ca5000c lw a1,12(a1) ; | + 138: 8f860000 lw a2,0(gp) ; | + 13c: 24c60000 addiu a2,a2,0 ; | + 140: 8cc60010 lw a2,16(a2) ; | + 144: 8f870000 lw a3,0(gp) ; | + 148: 24e70000 addiu a3,a3,0 ; | + 14c: 8ce70014 lw a3,20(a3) ; / + 150: afc20050 sw v0,80(s8) ; \ | a + 154: afc30054 sw v1,84(s8) ; | / + 158: afc40058 sw a0,88(s8) ; | \ b + 15c: afc5005c sw a1,92(s8) ; | ... and write to local area / + 160: afc60060 sw a2,96(s8) ; | \ + 164: afc70064 sw a3,100(s8) ; / | c + 168: d7c00078 ldc1 $f0,120(s8) ; \ + 16c: f7a00018 sdc1 $f0,24(sp) ; / arg 3 (struct D) + 170: 8fc20068 lw v0,104(s8) ; \ + 174: 8fc3006c lw v1,108(s8) ; | + 178: 8fc40070 lw a0,112(s8) ; | + 17c: 8fc50074 lw a1,116(s8) ; | + 180: afa20020 sw v0,32(sp) ; | arg 4 (struct E) + 184: afa30024 sw v1,36(sp) ; | + 188: afa40028 sw a0,40(sp) ; | + 18c: afa5002c sw a1,44(sp) ; / + 190: 8fc20050 lw v0,80(s8) ; \ + 194: 8fc30054 lw v1,84(s8) ; | + 198: 8fc40058 lw a0,88(s8) ; | + 19c: 8fc5005c lw a1,92(s8) ; | + 1a0: 8fc60060 lw a2,96(s8) ; | + 1a4: 8fc70064 lw a3,100(s8) ; | + 1a8: afa20030 sw v0,48(sp) ; | arg 5 (struct F) + 1ac: afa30034 sw v1,52(sp) ; | + 1b0: afa40038 sw a0,56(sp) ; | + 1b4: afa5003c sw a1,60(sp) ; | + 1b8: afa60040 sw a2,64(sp) ; | + 1bc: afa70044 sw a3,68(sp) ; / + 1c0: 8fc20084 lw v0,132(s8) ; \ + 1c4: 8fc30088 lw v1,136(s8) ; | + 1c8: afa20010 sw v0,16(sp) ; | arg 2 (struct C) b (via stack) + 1cc: afa30014 sw v1,20(sp) ; | c (via stack) + 1d0: 8fc70080 lw a3,128(s8) ; | a (via reg) + 1d4: 8fc40094 lw a0,148(s8) ; arg 0 (struct A, via reg) + 1d8: 8fc5008c lw a1,140(s8) ; | arg 1 (struct B, via regs) a + 1dc: 8fc60090 lw a2,144(s8) ; | b + 1e0: 8f990000 lw t9,0(gp) ; func to call -> t9 + 1e4: 0320f809 jalr t9 ; call and ret addr -> ra + 1e8: 00000000 nop ; branch delay slot + 1ec: 8fdc0048 lw gp,72(s8) ; | + 1f0: 00001021 move v0,zero ; : return value: not part of epilog, but unordered (branch delay slot style) + 1f4: 03c0e821 move sp,s8 ; | + 1f8: 8fbf009c lw ra,156(sp) ; | epilog + 1fc: 8fbe0098 lw s8,152(sp) ; | + 200: 03e00008 jr ra ; | + 204: 27bd00a0 addiu sp,sp,160 ; | + ... + + + +; ---------- single-field structs by values (and small array fields) ----------> +; +; struct C { char c; }; +; struct S { short s; }; +; struct I { int i; }; +; struct F { float f; }; +; struct D { double d; }; +; +; struct C2 { char c[2]; }; +; struct C3 { char c[3]; }; +; +; 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 freebsd-12.0_r333647-malta_mipsebhf w/ gcc 4.2.1 -----> + +00000000 : + 0: 3c1c0000 lui gp,0x0 + 4: 279c0000 addiu gp,gp,0 + 8: 0399e021 addu gp,gp,t9 + c: 27bdfff8 addiu sp,sp,-8 + 10: afbe0000 sw s8,0(sp) + 14: 03a0f021 move s8,sp + 18: afc40008 sw a0,8(s8) + 1c: afc5000c sw a1,12(s8) + 20: afc60010 sw a2,16(s8) + 24: afc70014 sw a3,20(s8) + 28: 03c0e821 move sp,s8 + 2c: 8fbe0000 lw s8,0(sp) + 30: 03e00008 jr ra + 34: 27bd0008 addiu sp,sp,8 + +00000038
: + 38: 3c1c0000 lui gp,0x0 + 3c: 279c0000 addiu gp,gp,0 + 40: 0399e021 addu gp,gp,t9 + 44: 27bdffa0 addiu sp,sp,-96 + 48: afbf005c sw ra,92(sp) + 4c: afbe0058 sw s8,88(sp) + 50: 03a0f021 move s8,sp + 54: afbc0028 sw gp,40(sp) + 58: 8f820000 lw v0,0(gp) + 5c: 24420010 addiu v0,v0,16 + 60: 90420000 lbu v0,0(v0) + 64: a3c2004b sb v0,75(s8) + 68: 8f820000 lw v0,0(gp) + 6c: 24420010 addiu v0,v0,16 + 70: 90420001 lbu v0,1(v0) + 74: a3c2004c sb v0,76(s8) + 78: 24020002 li v0,2 + 7c: a3c2004a sb v0,74(s8) + 80: 24020003 li v0,3 + 84: a7c20048 sh v0,72(s8) + 88: 24020004 li v0,4 + 8c: afc20044 sw v0,68(s8) + 90: 8f820000 lw v0,0(gp) + 94: 24420014 addiu v0,v0,20 + 98: 8c420000 lw v0,0(v0) + 9c: afc20040 sw v0,64(s8) + a0: 8f830000 lw v1,0(gp) + a4: 24630008 addiu v1,v1,8 + a8: 8c630004 lw v1,4(v1) + ac: 8f820000 lw v0,0(gp) + b0: 24420008 addiu v0,v0,8 + b4: 8c420000 lw v0,0(v0) + b8: afc3003c sw v1,60(s8) + bc: afc20038 sw v0,56(s8) + c0: 8f820000 lw v0,0(gp) + c4: 24420000 addiu v0,v0,0 + c8: 94420000 lhu v0,0(v0) + cc: a7c20030 sh v0,48(s8) + d0: 8f820000 lw v0,0(gp) + d4: 24420000 addiu v0,v0,0 + d8: 90420002 lbu v0,2(v0) + dc: a3c20032 sb v0,50(s8) + e0: 8fc20040 lw v0,64(s8) + e4: afa20010 sw v0,16(sp) + e8: 8fc3003c lw v1,60(s8) + ec: 8fc20038 lw v0,56(s8) + f0: afa3001c sw v1,28(sp) + f4: afa20018 sw v0,24(sp) + f8: 97c20030 lhu v0,48(s8) + fc: a7a20020 sh v0,32(sp) + 100: 93c20032 lbu v0,50(s8) + 104: a3a20022 sb v0,34(sp) + 108: 93c2004b lbu v0,75(s8) + 10c: 00021a00 sll v1,v0,0x8 + 110: 93c2004c lbu v0,76(s8) + 114: 00431025 or v0,v0,v1 + 118: afc00050 sw zero,80(s8) + 11c: 00021c00 sll v1,v0,0x10 + 120: 8fc40050 lw a0,80(s8) + 124: 3082ffff andi v0,a0,0xffff + 128: 00431025 or v0,v0,v1 + 12c: afc20050 sw v0,80(s8) + 130: 8fc40050 lw a0,80(s8) + 134: 93c5004a lbu a1,74(s8) + 138: 00052e00 sll a1,a1,0x18 + 13c: 97c60048 lhu a2,72(s8) + 140: 00063400 sll a2,a2,0x10 + 144: 8fc70044 lw a3,68(s8) + 148: 8f990000 lw t9,0(gp) + 14c: 0320f809 jalr t9 + 150: 00000000 nop + 154: 8fdc0028 lw gp,40(s8) + 158: 00001021 move v0,zero + 15c: 03c0e821 move sp,s8 + 160: 8fbf005c lw ra,92(sp) + 164: 8fbe0058 lw s8,88(sp) + 168: 03e00008 jr ra + 16c: 27bd0060 addiu sp,sp,96 + + + +; output from freebsd-12.0_r333647-malta_mipsebhf w/ gcc 4.2.1 *and* -mhard-float -----> + +00000000 : + 0: 3c1c0000 lui gp,0x0 + 4: 279c0000 addiu gp,gp,0 + 8: 0399e021 addu gp,gp,t9 + c: 27bdfff8 addiu sp,sp,-8 + 10: afbe0000 sw s8,0(sp) + 14: 03a0f021 move s8,sp + 18: afc40008 sw a0,8(s8) + 1c: afc5000c sw a1,12(s8) + 20: afc60010 sw a2,16(s8) + 24: afc70014 sw a3,20(s8) + 28: 03c0e821 move sp,s8 + 2c: 8fbe0000 lw s8,0(sp) + 30: 03e00008 jr ra + 34: 27bd0008 addiu sp,sp,8 + +00000038
: + 38: 3c1c0000 lui gp,0x0 + 3c: 279c0000 addiu gp,gp,0 + 40: 0399e021 addu gp,gp,t9 + 44: 27bdffa0 addiu sp,sp,-96 + 48: afbf005c sw ra,92(sp) + 4c: afbe0058 sw s8,88(sp) + 50: 03a0f021 move s8,sp + 54: afbc0028 sw gp,40(sp) + 58: 8f820000 lw v0,0(gp) + 5c: 24420010 addiu v0,v0,16 + 60: 90420000 lbu v0,0(v0) + 64: a3c2004b sb v0,75(s8) + 68: 8f820000 lw v0,0(gp) + 6c: 24420010 addiu v0,v0,16 + 70: 90420001 lbu v0,1(v0) + 74: a3c2004c sb v0,76(s8) + 78: 24020002 li v0,2 + 7c: a3c2004a sb v0,74(s8) + 80: 24020003 li v0,3 + 84: a7c20048 sh v0,72(s8) + 88: 24020004 li v0,4 + 8c: afc20044 sw v0,68(s8) + 90: 8f810000 lw at,0(gp) + 94: 24210014 addiu at,at,20 + 98: c4200000 lwc1 $f0,0(at) + 9c: e7c00040 swc1 $f0,64(s8) + a0: 8f810000 lw at,0(gp) + a4: 24210008 addiu at,at,8 + a8: d4200000 ldc1 $f0,0(at) + ac: f7c00038 sdc1 $f0,56(s8) + b0: 8f820000 lw v0,0(gp) + b4: 24420000 addiu v0,v0,0 + b8: 94420000 lhu v0,0(v0) + bc: a7c20030 sh v0,48(s8) + c0: 8f820000 lw v0,0(gp) + c4: 24420000 addiu v0,v0,0 + c8: 90420002 lbu v0,2(v0) + cc: a3c20032 sb v0,50(s8) + d0: c7c00040 lwc1 $f0,64(s8) + d4: e7a00010 swc1 $f0,16(sp) + d8: d7c00038 ldc1 $f0,56(s8) + dc: f7a00018 sdc1 $f0,24(sp) + e0: 97c20030 lhu v0,48(s8) + e4: a7a20020 sh v0,32(sp) + e8: 93c20032 lbu v0,50(s8) + ec: a3a20022 sb v0,34(sp) + f0: 93c2004b lbu v0,75(s8) + f4: 00021a00 sll v1,v0,0x8 + f8: 93c2004c lbu v0,76(s8) + fc: 00431025 or v0,v0,v1 + 100: afc00050 sw zero,80(s8) + 104: 00021c00 sll v1,v0,0x10 + 108: 8fc40050 lw a0,80(s8) + 10c: 3082ffff andi v0,a0,0xffff + 110: 00431025 or v0,v0,v1 + 114: afc20050 sw v0,80(s8) + 118: 8fc40050 lw a0,80(s8) + 11c: 93c5004a lbu a1,74(s8) + 120: 00052e00 sll a1,a1,0x18 + 124: 97c60048 lhu a2,72(s8) + 128: 00063400 sll a2,a2,0x10 + 12c: 8fc70044 lw a3,68(s8) + 130: 8f990000 lw t9,0(gp) + 134: 0320f809 jalr t9 + 138: 00000000 nop + 13c: 8fdc0028 lw gp,40(s8) + 140: 00001021 move v0,zero + 144: 03c0e821 move sp,s8 + 148: 8fbf005c lw ra,92(sp) + 14c: 8fbe0058 lw s8,88(sp) + 150: 03e00008 jr ra + 154: 27bd0060 addiu sp,sp,96 + ... + + + ; vim: ft=asm diff -r 75c19f11b86a -r 6c72cb768099 doc/manual/callconvs/callconv_mips32.tex --- a/doc/manual/callconvs/callconv_mips32.tex Sun Feb 27 13:53:18 2022 +0100 +++ b/doc/manual/callconvs/callconv_mips32.tex Tue Mar 01 00:16:50 2022 +0100 @@ -1,6 +1,6 @@ %////////////////////////////////////////////////////////////////////////////// % -% Copyright (c) 2007-2019 Daniel Adler , +% Copyright (c) 2007-2022 Daniel Adler , % Tassilo Philipp % % Permission to use, copy, modify, and distribute this software for any @@ -88,6 +88,11 @@ \item if either integer or float registers are used up, the stack is used \item if the callee takes the address of one of the parameters and uses it to address other unnamed parameters (e.g. varargs) it has to copy - in its prolog - the the argument registers to a reserved stack area adjacent to the other parameters on the stack (only the unnamed integer parameters require saving, though) % @@@ seems to *ONLY* spill with varargs, never for any other reason \item float registers don't seem to ever need to be saved that way, because floats passed to an ellipsis function are promoted to doubles, which in turn are passed in a? register pairs, so only \$a0-\$a7 are need to be spilled +\end{itemize} + +\paragraph{Return values} + +\begin{itemize} \item results are returned in \$v0 (32-bit), \$v0 and \$v1 (64-bit), \$f0 or \$f0 and \$f2 (2 $\times$ 32 bit float e.g. complex) \end{itemize} @@ -168,9 +173,17 @@ \item only on hard-float targets: if the very first call argument is a float, up to 2 floats or doubles can be passed via \$f12 and \$f14, respectively, for first and second argument \item only on hard-float targets: if any arguments are passed via float registers, skip \$a0-\$a3 for subsequent arguments as if the values were passed via them \item only on hard-float targets: note that if the first argument is not a float, but the second, it'll get passed via the \$a? registers +\item single precision float parameters (32 bit) are right-justified in their 8-byte slot on the stack on big endian targets, as they aren't promoted % @@@ verify +\item aggregates (struct, union) are passed as a sequence of words like integers, no matter the fields or if hard-float target (splitting across registers and stack is allowed) +\end{itemize} + +\paragraph{Return values} + +\begin{itemize} \item results are returned in \$v0 and \$v1, with \$v0 for all values \textless\ 64bit (only integer on hard-float targets) \item only on hard-float targets: floating point results are returned in \$f0 (32-bit float), or \$f0 and \$f3 (64bit float) -\item single precision float parameters (32 bit) are right-justified in their 8-byte slot on the stack on big endian targets, as they aren't promoted @@@ +\item aggregates (struct, union) of any size are returned in a space allocated by the caller, with a pointer to it +passed as first parameter to the function called (meaning in \%a0) \end{itemize} \paragraph{Stack layout} diff -r 75c19f11b86a -r 6c72cb768099 doc/manual/callconvs/callconv_ppc32.tex --- a/doc/manual/callconvs/callconv_ppc32.tex Sun Feb 27 13:53:18 2022 +0100 +++ b/doc/manual/callconvs/callconv_ppc32.tex Tue Mar 01 00:16:50 2022 +0100 @@ -1,6 +1,6 @@ %////////////////////////////////////////////////////////////////////////////// % -% Copyright (c) 2007-2019 Daniel Adler , +% Copyright (c) 2007-2022 Daniel Adler , % Tassilo Philipp % % Permission to use, copy, modify, and distribute this software for any diff -r 75c19f11b86a -r 6c72cb768099 doc/manual/callconvs/callconv_sparc64.tex --- a/doc/manual/callconvs/callconv_sparc64.tex Sun Feb 27 13:53:18 2022 +0100 +++ b/doc/manual/callconvs/callconv_sparc64.tex Tue Mar 01 00:16:50 2022 +0100 @@ -112,9 +112,9 @@ \begin{itemize} \item results are expected by caller to be returned in \%o0-\%o3 (after reg window restore, meaning callee writes to \%i0-\%i3) for integers \item \%d0,\%d2,\%d4,\%d6 are used for floating point values -\item the fields of aggregates (struct, union) \textless 32 bytes are returned via registers registers mentioned above (which are +\item the fields of aggregates (struct, union) \textless= 32 bytes are returned via registers mentioned above (which are assigned following the same logic as when passing the aggregate as a first argument to a function) -\item aggregates (struct, union) \textgreater= 32 bytes are returned in a space allocated by the caller, with a pointer to it +\item aggregates (struct, union) \textgreater 32 bytes are returned in a space allocated by the caller, with a pointer to it passed as first parameter to the function called (meaning in \%o0) % from spec: %Structure and union return types up to thirty-two bytes in size are returned in registers. The registers are assigned as if