comparison doc/disas_examples/mips.o32.disas @ 478:6c72cb768099

callconv doc: - mips o32 update w/ regards to aggregates - mips o32 disas examples - sparc64 doc fixes
author Tassilo Philipp
date Tue, 01 Mar 2022 00:16:50 +0100
parents c0390dc85a07
children cb19b2fe2422
comparison
equal deleted inserted replaced
477:75c19f11b86a 478:6c72cb768099
215 160: 8fbe0028 lw s8,40(sp) 215 160: 8fbe0028 lw s8,40(sp)
216 164: 27bd0030 addiu sp,sp,48 216 164: 27bd0030 addiu sp,sp,48
217 168: 03e00008 jr ra 217 168: 03e00008 jr ra
218 16c: 00000000 nop 218 16c: 00000000 nop
219 219
220
221
222 ; ---------- structs by value ---------->
223 ;
224 ; struct A { int i, j; long long l; };
225 ;
226 ; void leaf_call(int b, int c, int d, int e, struct A f, int g, int h)
227 ; {
228 ; }
229 ;
230 ; void nonleaf_call(int a, int b, int c, int d, int e, struct A f, int g, int h)
231 ; {
232 ; /* use some local data */
233 ; char l[100] ={ 'L'};
234 ; leaf_call(b, c, d, e, f, g, h);
235 ; }
236 ;
237 ; int main()
238 ; {
239 ; nonleaf_call(0, 1, 2, 3, 4, (struct A){5, 6, 7ll}, 8, 9);
240 ; return 0;
241 ; }
242
243
244
245 ; output from freebsd-12.0_r333647-malta_mipsebhf w/ gcc 4.2.1 ----->
246
247 00000000 <leaf_call>:
248 0: 3c1c0000 lui gp,0x0
249 4: 279c0000 addiu gp,gp,0
250 8: 0399e021 addu gp,gp,t9
251 c: 27bdfff8 addiu sp,sp,-8
252 10: afbe0000 sw s8,0(sp)
253 14: 03a0f021 move s8,sp
254 18: afc40008 sw a0,8(s8)
255 1c: afc5000c sw a1,12(s8)
256 20: afc60010 sw a2,16(s8)
257 24: afc70014 sw a3,20(s8)
258 28: 03c0e821 move sp,s8
259 2c: 8fbe0000 lw s8,0(sp)
260 30: 03e00008 jr ra
261 34: 27bd0008 addiu sp,sp,8
262
263 00000038 <nonleaf_call>:
264 38: 3c1c0000 lui gp,0x0
265 3c: 279c0000 addiu gp,gp,0
266 40: 0399e021 addu gp,gp,t9
267 44: 27bdff60 addiu sp,sp,-160
268 48: afbf009c sw ra,156(sp)
269 4c: afbe0098 sw s8,152(sp)
270 50: 03a0f021 move s8,sp
271 54: afbc0028 sw gp,40(sp)
272 58: afc400a0 sw a0,160(s8)
273 5c: afc500a4 sw a1,164(s8)
274 60: afc600a8 sw a2,168(s8)
275 64: afc700ac sw a3,172(s8)
276 68: 27c20030 addiu v0,s8,48
277 6c: 24030064 li v1,100
278 70: 00402021 move a0,v0
279 74: 00002821 move a1,zero
280 78: 00603021 move a2,v1
281 7c: 8f990000 lw t9,0(gp)
282 80: 0320f809 jalr t9
283 84: 00000000 nop
284 88: 8fdc0028 lw gp,40(s8)
285 8c: 2402004c li v0,76
286 90: a3c20030 sb v0,48(s8)
287 94: 8fc200b8 lw v0,184(s8)
288 98: 8fc300bc lw v1,188(s8)
289 9c: 8fc400c0 lw a0,192(s8)
290 a0: 8fc500c4 lw a1,196(s8)
291 a4: afa20010 sw v0,16(sp)
292 a8: afa30014 sw v1,20(sp)
293 ac: afa40018 sw a0,24(sp)
294 b0: afa5001c sw a1,28(sp)
295 b4: 8fc200c8 lw v0,200(s8)
296 b8: afa20020 sw v0,32(sp)
297 bc: 8fc200cc lw v0,204(s8)
298 c0: afa20024 sw v0,36(sp)
299 c4: 8fc400a4 lw a0,164(s8)
300 c8: 8fc500a8 lw a1,168(s8)
301 cc: 8fc600ac lw a2,172(s8)
302 d0: 8fc700b0 lw a3,176(s8)
303 d4: 8f990000 lw t9,0(gp)
304 d8: 0320f809 jalr t9
305 dc: 00000000 nop
306 e0: 8fdc0028 lw gp,40(s8)
307 e4: 03c0e821 move sp,s8
308 e8: 8fbf009c lw ra,156(sp)
309 ec: 8fbe0098 lw s8,152(sp)
310 f0: 03e00008 jr ra
311 f4: 27bd00a0 addiu sp,sp,160
312
313 000000f8 <main>:
314 f8: 3c1c0000 lui gp,0x0 ; |
315 fc: 279c0000 addiu gp,gp,0 ; |
316 100: 0399e021 addu gp,gp,t9 ; |
317 104: 27bdffb0 addiu sp,sp,-80 ; | prolog
318 108: afbf004c sw ra,76(sp) ; |
319 10c: afbe0048 sw s8,72(sp) ; |
320 110: 03a0f021 move s8,sp ; | frame pointer (note: with offset to frame start, but static compared to sp)
321 114: afbc0030 sw gp,48(sp) ; /
322 118: 8f820000 lw v0,0(gp) ; \ \
323 11c: 24420000 addiu v0,v0,0 ; | | field j -> v0
324 120: 8c420000 lw v0,0(v0) ; | /
325 124: 8f830000 lw v1,0(gp) ; | \
326 128: 24630000 addiu v1,v1,0 ; | | field j -> v1
327 12c: 8c630004 lw v1,4(v1) ; | prep local struct A data ... /
328 130: 8f840000 lw a0,0(gp) ; | \
329 134: 24840000 addiu a0,a0,0 ; | |
330 138: 8c840008 lw a0,8(a0) ; | | field l -> a0 & a1
331 13c: 8f850000 lw a1,0(gp) ; | |
332 140: 24a50000 addiu a1,a1,0 ; | |
333 144: 8ca5000c lw a1,12(a1) ; / /
334 148: afc20038 sw v0,56(s8) ; \
335 14c: afc3003c sw v1,60(s8) ; | ... and write to local area
336 150: afc40040 sw a0,64(s8) ; |
337 154: afc50044 sw a1,68(s8) ; /
338 158: 24020004 li v0,4 ; push arg 4 ...
339 15c: afa20010 sw v0,16(sp) ; ... onto stack
340 160: 8fc20038 lw v0,56(s8) ; \
341 164: 8fc3003c lw v1,60(s8) ; |
342 168: 8fc40040 lw a0,64(s8) ; | prep arg 5 (struct A) ...
343 16c: 8fc50044 lw a1,68(s8) ; /
344 170: afa20018 sw v0,24(sp) ; \
345 174: afa3001c sw v1,28(sp) ; | ... and push onto stack
346 178: afa40020 sw a0,32(sp) ; |
347 17c: afa50024 sw a1,36(sp) ; /
348 180: 24020008 li v0,8 ; push arg 6 ...
349 184: afa20028 sw v0,40(sp) ; ... onto stack
350 188: 24020009 li v0,9 ; push arg 7 ...
351 18c: afa2002c sw v0,44(sp) ; ... onto stack
352 190: 00002021 move a0,zero ; arg 0
353 194: 24050001 li a1,1 ; arg 1
354 198: 24060002 li a2,2 ; arg 2
355 19c: 24070003 li a3,3 ; arg 3
356 1a0: 8f990000 lw t9,0(gp) ; func to call -> t9
357 1a4: 0320f809 jalr t9 ; call and ret addr -> ra
358 1a8: 00000000 nop ; branch delay slot
359 1ac: 8fdc0030 lw gp,48(s8) ; |
360 1b0: 00001021 move v0,zero ; : return value: not part of epilog, but unordered (branch delay slot style)
361 1b4: 03c0e821 move sp,s8 ; |
362 1b8: 8fbf004c lw ra,76(sp) ; | epilog
363 1bc: 8fbe0048 lw s8,72(sp) ; |
364 1c0: 03e00008 jr ra ; |
365 1c4: 27bd0050 addiu sp,sp,80 ; |
366 ...
367
368
369
370 ; output from freebsd-12.0_r333647-malta_mipsebhf w/ gcc 4.2.1 *and* -mhard-float ----->
371
372 00000000 <leaf_call>:
373 0: 3c1c0000 lui gp,0x0
374 4: 279c0000 addiu gp,gp,0
375 8: 0399e021 addu gp,gp,t9
376 c: 27bdfff8 addiu sp,sp,-8
377 10: afbe0000 sw s8,0(sp)
378 14: 03a0f021 move s8,sp
379 18: afc40008 sw a0,8(s8)
380 1c: afc5000c sw a1,12(s8)
381 20: afc60010 sw a2,16(s8)
382 24: afc70014 sw a3,20(s8)
383 28: 03c0e821 move sp,s8
384 2c: 8fbe0000 lw s8,0(sp)
385 30: 03e00008 jr ra
386 34: 27bd0008 addiu sp,sp,8
387
388 00000038 <nonleaf_call>:
389 38: 3c1c0000 lui gp,0x0
390 3c: 279c0000 addiu gp,gp,0
391 40: 0399e021 addu gp,gp,t9
392 44: 27bdff60 addiu sp,sp,-160
393 48: afbf009c sw ra,156(sp)
394 4c: afbe0098 sw s8,152(sp)
395 50: 03a0f021 move s8,sp
396 54: afbc0028 sw gp,40(sp)
397 58: afc400a0 sw a0,160(s8)
398 5c: afc500a4 sw a1,164(s8)
399 60: afc600a8 sw a2,168(s8)
400 64: afc700ac sw a3,172(s8)
401 68: 27c20030 addiu v0,s8,48
402 6c: 24030064 li v1,100
403 70: 00402021 move a0,v0
404 74: 00002821 move a1,zero
405 78: 00603021 move a2,v1
406 7c: 8f990000 lw t9,0(gp)
407 80: 0320f809 jalr t9
408 84: 00000000 nop
409 88: 8fdc0028 lw gp,40(s8)
410 8c: 2402004c li v0,76
411 90: a3c20030 sb v0,48(s8)
412 94: 8fc200b8 lw v0,184(s8)
413 98: 8fc300bc lw v1,188(s8)
414 9c: 8fc400c0 lw a0,192(s8)
415 a0: 8fc500c4 lw a1,196(s8)
416 a4: afa20010 sw v0,16(sp)
417 a8: afa30014 sw v1,20(sp)
418 ac: afa40018 sw a0,24(sp)
419 b0: afa5001c sw a1,28(sp)
420 b4: 8fc200c8 lw v0,200(s8)
421 b8: afa20020 sw v0,32(sp)
422 bc: 8fc200cc lw v0,204(s8)
423 c0: afa20024 sw v0,36(sp)
424 c4: 8fc400a4 lw a0,164(s8)
425 c8: 8fc500a8 lw a1,168(s8)
426 cc: 8fc600ac lw a2,172(s8)
427 d0: 8fc700b0 lw a3,176(s8)
428 d4: 8f990000 lw t9,0(gp)
429 d8: 0320f809 jalr t9
430 dc: 00000000 nop
431 e0: 8fdc0028 lw gp,40(s8)
432 e4: 03c0e821 move sp,s8
433 e8: 8fbf009c lw ra,156(sp)
434 ec: 8fbe0098 lw s8,152(sp)
435 f0: 03e00008 jr ra
436 f4: 27bd00a0 addiu sp,sp,160
437
438 000000f8 <main>:
439 f8: 3c1c0000 lui gp,0x0 ; |
440 fc: 279c0000 addiu gp,gp,0 ; |
441 100: 0399e021 addu gp,gp,t9 ; |
442 104: 27bdffb0 addiu sp,sp,-80 ; | prolog
443 108: afbf004c sw ra,76(sp) ; |
444 10c: afbe0048 sw s8,72(sp) ; |
445 110: 03a0f021 move s8,sp ; | frame pointer (note: with offset to frame start, but static compared to sp)
446 114: afbc0030 sw gp,48(sp) ; /
447 118: 8f820000 lw v0,0(gp) ; \ \
448 11c: 24420000 addiu v0,v0,0 ; | | field j -> v0
449 120: 8c420000 lw v0,0(v0) ; | /
450 124: 8f830000 lw v1,0(gp) ; | \
451 128: 24630000 addiu v1,v1,0 ; | | field j -> v1
452 12c: 8c630004 lw v1,4(v1) ; | prep local struct A data ... /
453 130: 8f840000 lw a0,0(gp) ; | \
454 134: 24840000 addiu a0,a0,0 ; | |
455 138: 8c840008 lw a0,8(a0) ; | | field l -> a0 & a1
456 13c: 8f850000 lw a1,0(gp) ; | |
457 140: 24a50000 addiu a1,a1,0 ; | |
458 144: 8ca5000c lw a1,12(a1) ; / /
459 148: afc20038 sw v0,56(s8) ; \
460 14c: afc3003c sw v1,60(s8) ; | ... and write to local area
461 150: afc40040 sw a0,64(s8) ; |
462 154: afc50044 sw a1,68(s8) ; /
463 158: 24020004 li v0,4 ; push arg 4 ...
464 15c: afa20010 sw v0,16(sp) ; ... onto stack
465 160: 8fc20038 lw v0,56(s8) ; \
466 164: 8fc3003c lw v1,60(s8) ; |
467 168: 8fc40040 lw a0,64(s8) ; | prep arg 5 (struct A) ...
468 16c: 8fc50044 lw a1,68(s8) ; /
469 170: afa20018 sw v0,24(sp) ; \
470 174: afa3001c sw v1,28(sp) ; | ... and push onto stack
471 178: afa40020 sw a0,32(sp) ; |
472 17c: afa50024 sw a1,36(sp) ; /
473 180: 24020008 li v0,8 ; push arg 6 ...
474 184: afa20028 sw v0,40(sp) ; ... onto stack
475 188: 24020009 li v0,9 ; push arg 7 ...
476 18c: afa2002c sw v0,44(sp) ; ... onto stack
477 190: 00002021 move a0,zero ; arg 0
478 194: 24050001 li a1,1 ; arg 1
479 198: 24060002 li a2,2 ; arg 2
480 19c: 24070003 li a3,3 ; arg 3
481 1a0: 8f990000 lw t9,0(gp) ; func to call -> t9
482 1a4: 0320f809 jalr t9 ; call and ret addr -> ra
483 1a8: 00000000 nop ; branch delay slot
484 1ac: 8fdc0030 lw gp,48(s8) ; |
485 1b0: 00001021 move v0,zero ; : return value: not part of epilog, but unordered (branch delay slot style)
486 1b4: 03c0e821 move sp,s8 ; |
487 1b8: 8fbf004c lw ra,76(sp) ; | epilog
488 1bc: 8fbe0048 lw s8,72(sp) ; |
489 1c0: 03e00008 jr ra ; |
490 1c4: 27bd0050 addiu sp,sp,80 ; |
491 ...
492
493
494
495 ; ---------- structs by value, complex example (multiple structs) ---------->
496 ;
497 ; struct A { int i, j; float f; };
498 ; struct B { double d; long long l; };
499 ;
500 ; 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)
501 ; {
502 ; }
503 ;
504 ; 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)
505 ; {
506 ; /* use some local data */
507 ; char l[100] ={ 'L'};
508 ; leaf_call(b, c, d, e, f, g, h, i, j);
509 ; }
510 ;
511 ; int main()
512 ; {
513 ; 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);
514 ; return 0;
515 ; }
516
517
518
519 ; output from freebsd-12.0_r333647-malta_mipsebhf w/ gcc 4.2.1 ----->
520
521 00000000 <leaf_call>:
522 0: 3c1c0000 lui gp,0x0
523 4: 279c0000 addiu gp,gp,0
524 8: 0399e021 addu gp,gp,t9
525 c: 27bdfff8 addiu sp,sp,-8
526 10: afbe0000 sw s8,0(sp)
527 14: 03a0f021 move s8,sp
528 18: afc40008 sw a0,8(s8)
529 1c: afc5000c sw a1,12(s8)
530 20: afc60010 sw a2,16(s8)
531 24: afc70014 sw a3,20(s8)
532 28: 03c0e821 move sp,s8
533 2c: 8fbe0000 lw s8,0(sp)
534 30: 03e00008 jr ra
535 34: 27bd0008 addiu sp,sp,8
536
537 00000038 <nonleaf_call>:
538 38: 3c1c0000 lui gp,0x0
539 3c: 279c0000 addiu gp,gp,0
540 40: 0399e021 addu gp,gp,t9
541 44: 27bdff38 addiu sp,sp,-200
542 48: afbf00c4 sw ra,196(sp)
543 4c: afbe00c0 sw s8,192(sp)
544 50: 03a0f021 move s8,sp
545 54: afbc0050 sw gp,80(sp)
546 58: afc400c8 sw a0,200(s8)
547 5c: afc500cc sw a1,204(s8)
548 60: afc600d0 sw a2,208(s8)
549 64: afc700d4 sw a3,212(s8)
550 68: 27c20058 addiu v0,s8,88
551 6c: 24030064 li v1,100
552 70: 00402021 move a0,v0
553 74: 00002821 move a1,zero
554 78: 00603021 move a2,v1
555 7c: 8f990000 lw t9,0(gp)
556 80: 0320f809 jalr t9
557 84: 00000000 nop
558 88: 8fdc0050 lw gp,80(s8)
559 8c: 2402004c li v0,76
560 90: a3c20058 sb v0,88(s8)
561 94: 8fc200e0 lw v0,224(s8)
562 98: 8fc300e4 lw v1,228(s8)
563 9c: 8fc400e8 lw a0,232(s8)
564 a0: 8fc500ec lw a1,236(s8)
565 a4: afa20010 sw v0,16(sp)
566 a8: afa30014 sw v1,20(sp)
567 ac: afa40018 sw a0,24(sp)
568 b0: afa5001c sw a1,28(sp)
569 b4: 8fc200f0 lw v0,240(s8)
570 b8: afa20020 sw v0,32(sp)
571 bc: 8fc200f4 lw v0,244(s8)
572 c0: afa20024 sw v0,36(sp)
573 c4: 8fc200f8 lw v0,248(s8)
574 c8: 8fc300fc lw v1,252(s8)
575 cc: 8fc40100 lw a0,256(s8)
576 d0: afa20028 sw v0,40(sp)
577 d4: afa3002c sw v1,44(sp)
578 d8: afa40030 sw a0,48(sp)
579 dc: 8fc20108 lw v0,264(s8)
580 e0: 8fc3010c lw v1,268(s8)
581 e4: 8fc40110 lw a0,272(s8)
582 e8: 8fc50114 lw a1,276(s8)
583 ec: afa20038 sw v0,56(sp)
584 f0: afa3003c sw v1,60(sp)
585 f4: afa40040 sw a0,64(sp)
586 f8: afa50044 sw a1,68(sp)
587 fc: 8fc20118 lw v0,280(s8)
588 100: afa20048 sw v0,72(sp)
589 104: 8fc2011c lw v0,284(s8)
590 108: afa2004c sw v0,76(sp)
591 10c: 8fc400cc lw a0,204(s8)
592 110: 8fc500d0 lw a1,208(s8)
593 114: 8fc600d4 lw a2,212(s8)
594 118: 8fc700d8 lw a3,216(s8)
595 11c: 8f990000 lw t9,0(gp)
596 120: 0320f809 jalr t9
597 124: 00000000 nop
598 128: 8fdc0050 lw gp,80(s8)
599 12c: 03c0e821 move sp,s8
600 130: 8fbf00c4 lw ra,196(sp)
601 134: 8fbe00c0 lw s8,192(sp)
602 138: 03e00008 jr ra
603 13c: 27bd00c8 addiu sp,sp,200
604
605 00000140 <main>:
606 140: 3c1c0000 lui gp,0x0 ; |
607 144: 279c0000 addiu gp,gp,0 ; |
608 148: 0399e021 addu gp,gp,t9 ; |
609 14c: 27bdff58 addiu sp,sp,-168 ; | prolog
610 150: afbf00a4 sw ra,164(sp) ; |
611 154: afbe00a0 sw s8,160(sp) ; |
612 158: 03a0f021 move s8,sp ; | frame pointer (note: with offset to frame start, but static compared to sp)
613 15c: afbc0058 sw gp,88(sp) ; /
614 160: 8f820000 lw v0,0(gp) ; \ |
615 164: 24420030 addiu v0,v0,48 ; | | field j -> v0
616 168: 8c420000 lw v0,0(v0) ; | /
617 16c: 8f830000 lw v1,0(gp) ; | prep (first) local struct A data ... \
618 170: 24630030 addiu v1,v1,48 ; | | field j -> v1
619 174: 8c630004 lw v1,4(v1) ; | /
620 178: 8f840000 lw a0,0(gp) ; | \
621 17c: 24840030 addiu a0,a0,48 ; | | field f -> a0
622 180: 8c840008 lw a0,8(a0) ; / |
623 184: afc20090 sw v0,144(s8) ; \
624 188: afc30094 sw v1,148(s8) ; | ... and write to local area
625 18c: afc40098 sw a0,152(s8) ; /
626 190: 8f820000 lw v0,0(gp) ; \ |
627 194: 24420020 addiu v0,v0,32 ; | |
628 198: 8c420000 lw v0,0(v0) ; | |
629 19c: 8f830000 lw v1,0(gp) ; | | field d -> v0 & v1
630 1a0: 24630020 addiu v1,v1,32 ; | |
631 1a4: 8c630004 lw v1,4(v1) ; | prep (first) local struct B data ... /
632 1a8: 8f840000 lw a0,0(gp) ; | \
633 1ac: 24840020 addiu a0,a0,32 ; | |
634 1b0: 8c840008 lw a0,8(a0) ; | |
635 1b4: 8f850000 lw a1,0(gp) ; | | field l -> a0 & a1
636 1b8: 24a50020 addiu a1,a1,32 ; | |
637 1bc: 8ca5000c lw a1,12(a1) ; / |
638 1c0: afc20080 sw v0,128(s8) ; \
639 1c4: afc30084 sw v1,132(s8) ; |
640 1c8: afc40088 sw a0,136(s8) ; | ... and write to local area
641 1cc: afc5008c sw a1,140(s8) ; /
642 1d0: 8f820000 lw v0,0(gp) ; \ |
643 1d4: 24420010 addiu v0,v0,16 ; | | field j -> v0
644 1d8: 8c420000 lw v0,0(v0) ; | /
645 1dc: 8f830000 lw v1,0(gp) ; | prep (second) local struct A data ... \
646 1e0: 24630010 addiu v1,v1,16 ; | | field j -> v1
647 1e4: 8c630004 lw v1,4(v1) ; | /
648 1e8: 8f840000 lw a0,0(gp) ; | \
649 1ec: 24840010 addiu a0,a0,16 ; | | field f -> a0
650 1f0: 8c840008 lw a0,8(a0) ; / |
651 1f4: afc20070 sw v0,112(s8) ; \
652 1f8: afc30074 sw v1,116(s8) ; | ... and write to local area
653 1fc: afc40078 sw a0,120(s8) ; /
654 200: 8f820000 lw v0,0(gp) ; \ |
655 204: 24420000 addiu v0,v0,0 ; | |
656 208: 8c420000 lw v0,0(v0) ; | |
657 20c: 8f830000 lw v1,0(gp) ; | | field d -> v0 & v1
658 210: 24630000 addiu v1,v1,0 ; | |
659 214: 8c630004 lw v1,4(v1) ; | prep (second) local struct B data ... /
660 218: 8f840000 lw a0,0(gp) ; | \
661 21c: 24840000 addiu a0,a0,0 ; | |
662 220: 8c840008 lw a0,8(a0) ; | |
663 224: 8f850000 lw a1,0(gp) ; | | field l -> a0 & a1
664 228: 24a50000 addiu a1,a1,0 ; | |
665 22c: 8ca5000c lw a1,12(a1) ; / |
666 230: afc20060 sw v0,96(s8) ; \
667 234: afc30064 sw v1,100(s8) ; |
668 238: afc40068 sw a0,104(s8) ; | ... and write to local area
669 23c: afc5006c sw a1,108(s8) ; /
670 240: 8fc20080 lw v0,128(s8) ; \
671 244: 8fc30084 lw v1,132(s8) ; |
672 248: 8fc40088 lw a0,136(s8) ; |
673 24c: 8fc5008c lw a1,140(s8) ; |
674 250: afa20018 sw v0,24(sp) ; | | d
675 254: afa3001c sw v1,28(sp) ; | arg 3 (first struct B) /
676 258: afa40020 sw a0,32(sp) ; | \
677 25c: afa50024 sw a1,36(sp) ; / | l
678 260: 24020007 li v0,7 ; \
679 264: afa20028 sw v0,40(sp) ; / arg 4
680 268: 24020008 li v0,8 ; \
681 26c: afa2002c sw v0,44(sp) ; / arg 5
682 270: 8fc20070 lw v0,112(s8) ; \
683 274: 8fc30074 lw v1,116(s8) ; |
684 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)
685 27c: afa20030 sw v0,48(sp) ; | i
686 280: afa30034 sw v1,52(sp) ; | j
687 284: afa40038 sw a0,56(sp) ; / f
688 288: 8fc20060 lw v0,96(s8) ; \
689 28c: 8fc30064 lw v1,100(s8) ; |
690 290: 8fc40068 lw a0,104(s8) ; |
691 294: 8fc5006c lw a1,108(s8) ; |
692 298: afa20040 sw v0,64(sp) ; | | d
693 29c: afa30044 sw v1,68(sp) ; | arg 7 (second struct B) /
694 2a0: afa40048 sw a0,72(sp) ; | \
695 2a4: afa5004c sw a1,76(sp) ; | | l
696 2a8: 2402000e li v0,14 ; arg 8 pushed ...
697 2ac: afa20050 sw v0,80(sp) ; ... onto stack
698 2b0: 2402000f li v0,15 ; arg 9 pushed ...
699 2b4: afa20054 sw v0,84(sp) ; ... onto stack
700 2b8: 8fc20098 lw v0,152(s8) ; | | f (via stack, first slot after save area)
701 2bc: afa20010 sw v0,16(sp) ; | | note that 20(sp) isn't used, so sizeof(struct A) is probably a padded 16
702 2c0: 8fc60090 lw a2,144(s8) ; | arg 2 (first struct A) i (via reg)
703 2c4: 8fc70094 lw a3,148(s8) ; | j (via reg)
704 2c8: 00002021 move a0,zero ; arg 0
705 2cc: 24050001 li a1,1 ; arg 1
706 2d0: 8f990000 lw t9,0(gp) ; func to call -> t9
707 2d4: 0320f809 jalr t9 ; call and ret addr -> ra
708 2d8: 00000000 nop ; branch delay slot
709 2dc: 8fdc0058 lw gp,88(s8) ; |
710 2e0: 00001021 move v0,zero ; : return value: not part of epilog, but unordered (branch delay slot style)
711 2e4: 03c0e821 move sp,s8 ; |
712 2e8: 8fbf00a4 lw ra,164(sp) ; | epilog
713 2ec: 8fbe00a0 lw s8,160(sp) ; |
714 2f0: 03e00008 jr ra ; |
715 2f4: 27bd00a8 addiu sp,sp,168 ; |
716 ...
717
718
719
720 ; output from freebsd-12.0_r333647-malta_mipsebhf w/ gcc 4.2.1 *and* -mhard-float ----->
721
722 00000000 <leaf_call>:
723 0: 3c1c0000 lui gp,0x0
724 4: 279c0000 addiu gp,gp,0
725 8: 0399e021 addu gp,gp,t9
726 c: 27bdfff8 addiu sp,sp,-8
727 10: afbe0000 sw s8,0(sp)
728 14: 03a0f021 move s8,sp
729 18: afc40008 sw a0,8(s8)
730 1c: afc5000c sw a1,12(s8)
731 20: afc60010 sw a2,16(s8)
732 24: afc70014 sw a3,20(s8)
733 28: 03c0e821 move sp,s8
734 2c: 8fbe0000 lw s8,0(sp)
735 30: 03e00008 jr ra
736 34: 27bd0008 addiu sp,sp,8
737
738 00000038 <nonleaf_call>:
739 38: 3c1c0000 lui gp,0x0
740 3c: 279c0000 addiu gp,gp,0
741 40: 0399e021 addu gp,gp,t9
742 44: 27bdff38 addiu sp,sp,-200
743 48: afbf00c4 sw ra,196(sp)
744 4c: afbe00c0 sw s8,192(sp)
745 50: 03a0f021 move s8,sp
746 54: afbc0050 sw gp,80(sp)
747 58: afc400c8 sw a0,200(s8)
748 5c: afc500cc sw a1,204(s8)
749 60: afc600d0 sw a2,208(s8)
750 64: afc700d4 sw a3,212(s8)
751 68: 27c20058 addiu v0,s8,88
752 6c: 24030064 li v1,100
753 70: 00402021 move a0,v0
754 74: 00002821 move a1,zero
755 78: 00603021 move a2,v1
756 7c: 8f990000 lw t9,0(gp)
757 80: 0320f809 jalr t9
758 84: 00000000 nop
759 88: 8fdc0050 lw gp,80(s8)
760 8c: 2402004c li v0,76
761 90: a3c20058 sb v0,88(s8)
762 94: 8fc200e0 lw v0,224(s8)
763 98: 8fc300e4 lw v1,228(s8)
764 9c: 8fc400e8 lw a0,232(s8)
765 a0: 8fc500ec lw a1,236(s8)
766 a4: afa20010 sw v0,16(sp)
767 a8: afa30014 sw v1,20(sp)
768 ac: afa40018 sw a0,24(sp)
769 b0: afa5001c sw a1,28(sp)
770 b4: 8fc200f0 lw v0,240(s8)
771 b8: afa20020 sw v0,32(sp)
772 bc: 8fc200f4 lw v0,244(s8)
773 c0: afa20024 sw v0,36(sp)
774 c4: 8fc200f8 lw v0,248(s8)
775 c8: 8fc300fc lw v1,252(s8)
776 cc: 8fc40100 lw a0,256(s8)
777 d0: afa20028 sw v0,40(sp)
778 d4: afa3002c sw v1,44(sp)
779 d8: afa40030 sw a0,48(sp)
780 dc: 8fc20108 lw v0,264(s8)
781 e0: 8fc3010c lw v1,268(s8)
782 e4: 8fc40110 lw a0,272(s8)
783 e8: 8fc50114 lw a1,276(s8)
784 ec: afa20038 sw v0,56(sp)
785 f0: afa3003c sw v1,60(sp)
786 f4: afa40040 sw a0,64(sp)
787 f8: afa50044 sw a1,68(sp)
788 fc: 8fc20118 lw v0,280(s8)
789 100: afa20048 sw v0,72(sp)
790 104: 8fc2011c lw v0,284(s8)
791 108: afa2004c sw v0,76(sp)
792 10c: 8fc400cc lw a0,204(s8)
793 110: 8fc500d0 lw a1,208(s8)
794 114: 8fc600d4 lw a2,212(s8)
795 118: 8fc700d8 lw a3,216(s8)
796 11c: 8f990000 lw t9,0(gp)
797 120: 0320f809 jalr t9
798 124: 00000000 nop
799 128: 8fdc0050 lw gp,80(s8)
800 12c: 03c0e821 move sp,s8
801 130: 8fbf00c4 lw ra,196(sp)
802 134: 8fbe00c0 lw s8,192(sp)
803 138: 03e00008 jr ra
804 13c: 27bd00c8 addiu sp,sp,200
805
806 00000140 <main>:
807 140: 3c1c0000 lui gp,0x0 ; |
808 144: 279c0000 addiu gp,gp,0 ; |
809 148: 0399e021 addu gp,gp,t9 ; |
810 14c: 27bdff58 addiu sp,sp,-168 ; | prolog
811 150: afbf00a4 sw ra,164(sp) ; |
812 154: afbe00a0 sw s8,160(sp) ; |
813 158: 03a0f021 move s8,sp ; | frame pointer (note: with offset to frame start, but static compared to sp)
814 15c: afbc0058 sw gp,88(sp) ; /
815 160: 8f820000 lw v0,0(gp) ; \ |
816 164: 24420030 addiu v0,v0,48 ; | | field j -> v0
817 168: 8c420000 lw v0,0(v0) ; | /
818 16c: 8f830000 lw v1,0(gp) ; | prep (first) local struct A data ... \
819 170: 24630030 addiu v1,v1,48 ; | | field j -> v1
820 174: 8c630004 lw v1,4(v1) ; | /
821 178: 8f840000 lw a0,0(gp) ; | \
822 17c: 24840030 addiu a0,a0,48 ; | | field f -> a0
823 180: 8c840008 lw a0,8(a0) ; / |
824 184: afc20090 sw v0,144(s8) ; \
825 188: afc30094 sw v1,148(s8) ; | ... and write to local area
826 18c: afc40098 sw a0,152(s8) ; /
827 190: 8f820000 lw v0,0(gp) ; \ |
828 194: 24420020 addiu v0,v0,32 ; | |
829 198: 8c420000 lw v0,0(v0) ; | |
830 19c: 8f830000 lw v1,0(gp) ; | | field d -> v0 & v1
831 1a0: 24630020 addiu v1,v1,32 ; | |
832 1a4: 8c630004 lw v1,4(v1) ; | prep (first) local struct B data ... /
833 1a8: 8f840000 lw a0,0(gp) ; | \
834 1ac: 24840020 addiu a0,a0,32 ; | |
835 1b0: 8c840008 lw a0,8(a0) ; | |
836 1b4: 8f850000 lw a1,0(gp) ; | | field l -> a0 & a1
837 1b8: 24a50020 addiu a1,a1,32 ; | |
838 1bc: 8ca5000c lw a1,12(a1) ; / |
839 1c0: afc20080 sw v0,128(s8) ; \
840 1c4: afc30084 sw v1,132(s8) ; |
841 1c8: afc40088 sw a0,136(s8) ; | ... and write to local area
842 1cc: afc5008c sw a1,140(s8) ; /
843 1d0: 8f820000 lw v0,0(gp) ; \ |
844 1d4: 24420010 addiu v0,v0,16 ; | | field j -> v0
845 1d8: 8c420000 lw v0,0(v0) ; | /
846 1dc: 8f830000 lw v1,0(gp) ; | prep (second) local struct A data ... \
847 1e0: 24630010 addiu v1,v1,16 ; | | field j -> v1
848 1e4: 8c630004 lw v1,4(v1) ; | /
849 1e8: 8f840000 lw a0,0(gp) ; | \
850 1ec: 24840010 addiu a0,a0,16 ; | | field f -> a0
851 1f0: 8c840008 lw a0,8(a0) ; / |
852 1f4: afc20070 sw v0,112(s8) ; \
853 1f8: afc30074 sw v1,116(s8) ; | ... and write to local area
854 1fc: afc40078 sw a0,120(s8) ; /
855 200: 8f820000 lw v0,0(gp) ; \ |
856 204: 24420000 addiu v0,v0,0 ; | |
857 208: 8c420000 lw v0,0(v0) ; | |
858 20c: 8f830000 lw v1,0(gp) ; | | field d -> v0 & v1
859 210: 24630000 addiu v1,v1,0 ; | |
860 214: 8c630004 lw v1,4(v1) ; | prep (second) local struct B data ... /
861 218: 8f840000 lw a0,0(gp) ; | \
862 21c: 24840000 addiu a0,a0,0 ; | |
863 220: 8c840008 lw a0,8(a0) ; | |
864 224: 8f850000 lw a1,0(gp) ; | | field l -> a0 & a1
865 228: 24a50000 addiu a1,a1,0 ; | |
866 22c: 8ca5000c lw a1,12(a1) ; / |
867 230: afc20060 sw v0,96(s8) ; \
868 234: afc30064 sw v1,100(s8) ; |
869 238: afc40068 sw a0,104(s8) ; | ... and write to local area
870 23c: afc5006c sw a1,108(s8) ; /
871 240: 8fc20080 lw v0,128(s8) ; \
872 244: 8fc30084 lw v1,132(s8) ; |
873 248: 8fc40088 lw a0,136(s8) ; |
874 24c: 8fc5008c lw a1,140(s8) ; |
875 250: afa20018 sw v0,24(sp) ; | | d
876 254: afa3001c sw v1,28(sp) ; | arg 3 (first struct B) /
877 258: afa40020 sw a0,32(sp) ; | \
878 25c: afa50024 sw a1,36(sp) ; / | l
879 260: 24020007 li v0,7 ; \
880 264: afa20028 sw v0,40(sp) ; / arg 4
881 268: 24020008 li v0,8 ; \
882 26c: afa2002c sw v0,44(sp) ; / arg 5
883 270: 8fc20070 lw v0,112(s8) ; \
884 274: 8fc30074 lw v1,116(s8) ; |
885 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)
886 27c: afa20030 sw v0,48(sp) ; | i
887 280: afa30034 sw v1,52(sp) ; | j
888 284: afa40038 sw a0,56(sp) ; / f
889 288: 8fc20060 lw v0,96(s8) ; \
890 28c: 8fc30064 lw v1,100(s8) ; |
891 290: 8fc40068 lw a0,104(s8) ; |
892 294: 8fc5006c lw a1,108(s8) ; |
893 298: afa20040 sw v0,64(sp) ; | | d
894 29c: afa30044 sw v1,68(sp) ; | arg 7 (second struct B) /
895 2a0: afa40048 sw a0,72(sp) ; | \
896 2a4: afa5004c sw a1,76(sp) ; | | l
897 2a8: 2402000e li v0,14 ; arg 8 pushed ...
898 2ac: afa20050 sw v0,80(sp) ; ... onto stack
899 2b0: 2402000f li v0,15 ; arg 9 pushed ...
900 2b4: afa20054 sw v0,84(sp) ; ... onto stack
901 2b8: 8fc20098 lw v0,152(s8) ; | | f (via stack, first slot after save area)
902 2bc: afa20010 sw v0,16(sp) ; | | note that 20(sp) isn't used, so sizeof(struct A) is probably a padded 16
903 2c0: 8fc60090 lw a2,144(s8) ; | arg 2 (first struct A) i (via reg)
904 2c4: 8fc70094 lw a3,148(s8) ; | j (via reg)
905 2c8: 00002021 move a0,zero ; arg 0
906 2cc: 24050001 li a1,1 ; arg 1
907 2d0: 8f990000 lw t9,0(gp) ; func to call -> t9
908 2d4: 0320f809 jalr t9 ; call and ret addr -> ra
909 2d8: 00000000 nop ; branch delay slot
910 2dc: 8fdc0058 lw gp,88(s8) ; |
911 2e0: 00001021 move v0,zero ; : return value: not part of epilog, but unordered (branch delay slot style)
912 2e4: 03c0e821 move sp,s8 ; |
913 2e8: 8fbf00a4 lw ra,164(sp) ; | epilog
914 2ec: 8fbe00a0 lw s8,160(sp) ; |
915 2f0: 03e00008 jr ra ; |
916 2f4: 27bd00a8 addiu sp,sp,168 ; |
917 ...
918
919
920
921 ; ---------- returning structs by value ---------->
922 ;
923 ; struct Small { char x; };
924 ; struct Big { long long i,j,k,l; long m; }; /* bigger than 16b */
925 ;
926 ; struct Small f0()
927 ; {
928 ; struct Small s = { 132 };
929 ; return s;
930 ; }
931 ;
932 ; struct Big f1()
933 ; {
934 ; struct Big b = { 7171LL, 99LL, -99LL, -3102LL, 32 };
935 ; return b;
936 ; }
937 ;
938 ; int main()
939 ; {
940 ; struct Small s = f0();
941 ; struct Big b = f1();
942 ; return b.j + b.k + b.m + s.x;
943 ; }
944
945
946
947 ; output from freebsd-12.0_r333647-malta_mipsebhf w/ gcc 4.2.1 ----->
948
949 00000000 <f0>:
950 0: 3c1c0000 lui gp,0x0 ; |
951 4: 279c0000 addiu gp,gp,0 ; |
952 8: 0399e021 addu gp,gp,t9 ; | prolog
953 c: 27bdffe8 addiu sp,sp,-24 ; |
954 10: afbe0010 sw s8,16(sp) ; |
955 14: 03a0f021 move s8,sp ; |
956 18: 00801021 move v0,a0 ; hidden first arg (ptr to struct ret) -> v0
957 1c: 2403ff84 li v1,-124 ; | put together local struct
958 20: a3c30008 sb v1,8(s8) ; /
959 24: 93c30008 lbu v1,8(s8) ; read struct data from local area ...
960 28: a0430000 sb v1,0(v0) ; ... and write to return value area
961 2c: 03c0e821 move sp,s8 ; \
962 30: 8fbe0010 lw s8,16(sp) ; |
963 34: 03e00008 jr ra ; | epilog
964 38: 27bd0018 addiu sp,sp,24 ; |
965
966 0000003c <f1>:
967 3c: 3c1c0000 lui gp,0x0 ; |
968 40: 279c0000 addiu gp,gp,0 ; |
969 44: 0399e021 addu gp,gp,t9 ; |
970 48: 27bdffb0 addiu sp,sp,-80 ; |
971 4c: afbf0048 sw ra,72(sp) ; | prolog
972 50: afbe0044 sw s8,68(sp) ; |
973 54: afb00040 sw s0,64(sp) ; |
974 58: 03a0f021 move s8,sp ; |
975 5c: afbc0010 sw gp,16(sp) ; |
976 60: 00808021 move s0,a0 ; hidden first arg (ptr to struct ret) -> s0
977 64: 27c20018 addiu v0,s8,24 ;
978 68: 8f830000 lw v1,0(gp) ;
979 6c: 24630000 addiu v1,v1,0 ;
980 70: 24060028 li a2,40 ;
981 74: 00402021 move a0,v0 ;
982 78: 00602821 move a1,v1 ;
983 7c: 8f990000 lw t9,0(gp) ;
984 80: 0320f809 jalr t9 ;
985 84: 00000000 nop ; @@@ unsure why those two jumps, but seems to put return value data together
986 88: 8fdc0010 lw gp,16(s8) ;
987 8c: 02001021 move v0,s0 ;
988 90: 27c30018 addiu v1,s8,24 ;
989 94: 24060028 li a2,40 ;
990 98: 00402021 move a0,v0 ;
991 9c: 00602821 move a1,v1 ;
992 a0: 8f990000 lw t9,0(gp) ;
993 a4: 0320f809 jalr t9 ;
994 a8: 00000000 nop ;
995 ac: 8fdc0010 lw gp,16(s8) ; |
996 b0: 02001021 move v0,s0 ; : return value (hidden ptr): not part of epilog, but unordered (branch delay slot style)
997 b4: 03c0e821 move sp,s8 ; |
998 b8: 8fbf0048 lw ra,72(sp) ; |
999 bc: 8fbe0044 lw s8,68(sp) ; | epilog
1000 c0: 8fb00040 lw s0,64(sp) ; |
1001 c4: 03e00008 jr ra ; |
1002 c8: 27bd0050 addiu sp,sp,80 ; |
1003
1004 000000cc <main>:
1005 cc: 3c1c0000 lui gp,0x0 ; |
1006 d0: 279c0000 addiu gp,gp,0 ; |
1007 d4: 0399e021 addu gp,gp,t9 ; |
1008 d8: 27bdffb0 addiu sp,sp,-80 ; |
1009 dc: afbf004c sw ra,76(sp) ; | prolog
1010 e0: afbe0048 sw s8,72(sp) ; |
1011 e4: 03a0f021 move s8,sp ; |
1012 e8: afbc0010 sw gp,16(sp) ; /
1013 ec: 27c20018 addiu v0,s8,24 ; \
1014 f0: 00402021 move a0,v0 ; | hidden first arg (ptr to space for ret val)
1015 f4: 8f990000 lw t9,0(gp) ; func to call (f0) -> t9
1016 f8: 0320f809 jalr t9 ; call and ret addr -> ra
1017 fc: 00000000 nop ; branch delay slot
1018 100: 8fdc0010 lw gp,16(s8) ; restore gp @@@ unsure why?
1019 104: 27c20020 addiu v0,s8,32 ; |
1020 108: 00402021 move a0,v0 ; | hidden first arg (ptr to space for ret val)
1021 10c: 8f990000 lw t9,0(gp) ; func to call (f1) -> t9
1022 110: 0320f809 jalr t9 ; call and ret addr -> ra
1023 114: 00000000 nop ; branch delay slot
1024 118: 8fdc0010 lw gp,16(s8) ; restore gp @@@ unsure why?
1025 11c: 8fc3002c lw v1,44(s8) ; | |
1026 120: 8fc20028 lw v0,40(s8) ; | | b.j -> v0 & v1
1027 124: 00602021 move a0,v1 ; | a0 = (int)b.j
1028 128: 8fc30034 lw v1,52(s8) ; | |
1029 12c: 8fc20030 lw v0,48(s8) ; | | b.j -> v0 & v1
1030 130: 00601021 move v0,v1 ; | return value v0 = (int)b.k
1031 134: 00821821 addu v1,a0,v0 ; | (int)b.j + (int)b.k -> v1
1032 138: 8fc20040 lw v0,64(s8) ; | b.m -> v0
1033 13c: 00621821 addu v1,v1,v0 ; | ((int)b.j + (int)b.k) + b.m -> v1
1034 140: 83c20018 lb v0,24(s8) ; | s.x -> v0
1035 144: 00621021 addu v0,v1,v0 ; / (((int)b.j + (int)b.k) + b.m) + s.x -> v0
1036 148: 03c0e821 move sp,s8 ; \
1037 14c: 8fbf004c lw ra,76(sp) ; |
1038 150: 8fbe0048 lw s8,72(sp) ; | epilog
1039 154: 03e00008 jr ra ; |
1040 158: 27bd0050 addiu sp,sp,80 ; |
1041 15c: 00000000 nop ; |
1042
1043
1044
1045 ; output from freebsd-12.0_r333647-malta_mipsebhf w/ gcc 4.2.1 *and* -mhard-float ----->
1046
1047 00000000 <f0>:
1048 0: 3c1c0000 lui gp,0x0
1049 4: 279c0000 addiu gp,gp,0
1050 8: 0399e021 addu gp,gp,t9
1051 c: 27bdffe8 addiu sp,sp,-24
1052 10: afbe0010 sw s8,16(sp)
1053 14: 03a0f021 move s8,sp
1054 18: 00801021 move v0,a0
1055 1c: 2403ff84 li v1,-124
1056 20: a3c30008 sb v1,8(s8)
1057 24: 93c30008 lbu v1,8(s8)
1058 28: a0430000 sb v1,0(v0)
1059 2c: 03c0e821 move sp,s8
1060 30: 8fbe0010 lw s8,16(sp)
1061 34: 03e00008 jr ra
1062 38: 27bd0018 addiu sp,sp,24
1063
1064 0000003c <f1>:
1065 3c: 3c1c0000 lui gp,0x0
1066 40: 279c0000 addiu gp,gp,0
1067 44: 0399e021 addu gp,gp,t9
1068 48: 27bdffb0 addiu sp,sp,-80
1069 4c: afbf0048 sw ra,72(sp)
1070 50: afbe0044 sw s8,68(sp)
1071 54: afb00040 sw s0,64(sp)
1072 58: 03a0f021 move s8,sp
1073 5c: afbc0010 sw gp,16(sp)
1074 60: 00808021 move s0,a0
1075 64: 27c20018 addiu v0,s8,24
1076 68: 8f830000 lw v1,0(gp)
1077 6c: 24630000 addiu v1,v1,0
1078 70: 24060028 li a2,40
1079 74: 00402021 move a0,v0
1080 78: 00602821 move a1,v1
1081 7c: 8f990000 lw t9,0(gp)
1082 80: 0320f809 jalr t9
1083 84: 00000000 nop
1084 88: 8fdc0010 lw gp,16(s8)
1085 8c: 02001021 move v0,s0
1086 90: 27c30018 addiu v1,s8,24
1087 94: 24060028 li a2,40
1088 98: 00402021 move a0,v0
1089 9c: 00602821 move a1,v1
1090 a0: 8f990000 lw t9,0(gp)
1091 a4: 0320f809 jalr t9
1092 a8: 00000000 nop
1093 ac: 8fdc0010 lw gp,16(s8)
1094 b0: 02001021 move v0,s0
1095 b4: 03c0e821 move sp,s8
1096 b8: 8fbf0048 lw ra,72(sp)
1097 bc: 8fbe0044 lw s8,68(sp)
1098 c0: 8fb00040 lw s0,64(sp)
1099 c4: 03e00008 jr ra
1100 c8: 27bd0050 addiu sp,sp,80
1101
1102 000000cc <main>:
1103 cc: 3c1c0000 lui gp,0x0
1104 d0: 279c0000 addiu gp,gp,0
1105 d4: 0399e021 addu gp,gp,t9
1106 d8: 27bdffb0 addiu sp,sp,-80
1107 dc: afbf004c sw ra,76(sp)
1108 e0: afbe0048 sw s8,72(sp)
1109 e4: 03a0f021 move s8,sp
1110 e8: afbc0010 sw gp,16(sp)
1111 ec: 27c20018 addiu v0,s8,24
1112 f0: 00402021 move a0,v0
1113 f4: 8f990000 lw t9,0(gp)
1114 f8: 0320f809 jalr t9
1115 fc: 00000000 nop
1116 100: 8fdc0010 lw gp,16(s8)
1117 104: 27c20020 addiu v0,s8,32
1118 108: 00402021 move a0,v0
1119 10c: 8f990000 lw t9,0(gp)
1120 110: 0320f809 jalr t9
1121 114: 00000000 nop
1122 118: 8fdc0010 lw gp,16(s8)
1123 11c: 8fc3002c lw v1,44(s8)
1124 120: 8fc20028 lw v0,40(s8)
1125 124: 00602021 move a0,v1
1126 128: 8fc30034 lw v1,52(s8)
1127 12c: 8fc20030 lw v0,48(s8)
1128 130: 00601021 move v0,v1
1129 134: 00821821 addu v1,a0,v0
1130 138: 8fc20040 lw v0,64(s8)
1131 13c: 00621821 addu v1,v1,v0
1132 140: 83c20018 lb v0,24(s8)
1133 144: 00621021 addu v0,v1,v0
1134 148: 03c0e821 move sp,s8
1135 14c: 8fbf004c lw ra,76(sp)
1136 150: 8fbe0048 lw s8,72(sp)
1137 154: 03e00008 jr ra
1138 158: 27bd0050 addiu sp,sp,80
1139 15c: 00000000 nop
1140
1141
1142
1143 ; ---------- returning long long ---------->
1144 ;
1145 ; long long f()
1146 ; {
1147 ; return 7171LL;
1148 ; }
1149 ;
1150 ; int main()
1151 ; {
1152 ; return (int)f();
1153 ; }
1154
1155
1156
1157 ; output from freebsd-12.0_r333647-malta_mipsebhf w/ gcc 4.2.1 ----->
1158
1159 00000000 <f>:
1160 0: 3c1c0000 lui gp,0x0 ;
1161 4: 279c0000 addiu gp,gp,0 ;
1162 8: 0399e021 addu gp,gp,t9 ;
1163 c: 27bdfff8 addiu sp,sp,-8 ;
1164 10: afbe0000 sw s8,0(sp) ;
1165 14: 03a0f021 move s8,sp ;
1166 18: 24031c03 li v1,7171 ; | return value
1167 1c: 00001021 move v0,zero ; |
1168 20: 03c0e821 move sp,s8 ;
1169 24: 8fbe0000 lw s8,0(sp) ;
1170 28: 03e00008 jr ra ;
1171 2c: 27bd0008 addiu sp,sp,8 ;
1172
1173 00000030 <main>:
1174 30: 3c1c0000 lui gp,0x0
1175 34: 279c0000 addiu gp,gp,0
1176 38: 0399e021 addu gp,gp,t9
1177 3c: 27bdffe0 addiu sp,sp,-32
1178 40: afbf001c sw ra,28(sp)
1179 44: afbe0018 sw s8,24(sp)
1180 48: 03a0f021 move s8,sp
1181 4c: afbc0010 sw gp,16(sp)
1182 50: 8f990000 lw t9,0(gp)
1183 54: 0320f809 jalr t9
1184 58: 00000000 nop
1185 5c: 8fdc0010 lw gp,16(s8)
1186 60: 00601021 move v0,v1
1187 64: 03c0e821 move sp,s8
1188 68: 8fbf001c lw ra,28(sp)
1189 6c: 8fbe0018 lw s8,24(sp)
1190 70: 03e00008 jr ra
1191 74: 27bd0020 addiu sp,sp,32
1192 ...
1193
1194
1195
1196 ; output from freebsd-12.0_r333647-malta_mipsebhf w/ gcc 4.2.1 *and* -mhard-float ----->
1197
1198 00000000 <f>:
1199 0: 3c1c0000 lui gp,0x0 ;
1200 4: 279c0000 addiu gp,gp,0 ;
1201 8: 0399e021 addu gp,gp,t9 ;
1202 c: 27bdfff8 addiu sp,sp,-8 ;
1203 10: afbe0000 sw s8,0(sp) ;
1204 14: 03a0f021 move s8,sp ;
1205 18: 24031c03 li v1,7171 ; | return value
1206 1c: 00001021 move v0,zero ; |
1207 20: 03c0e821 move sp,s8 ;
1208 24: 8fbe0000 lw s8,0(sp) ;
1209 28: 03e00008 jr ra ;
1210 2c: 27bd0008 addiu sp,sp,8 ;
1211
1212 00000030 <main>:
1213 30: 3c1c0000 lui gp,0x0
1214 34: 279c0000 addiu gp,gp,0
1215 38: 0399e021 addu gp,gp,t9
1216 3c: 27bdffe0 addiu sp,sp,-32
1217 40: afbf001c sw ra,28(sp)
1218 44: afbe0018 sw s8,24(sp)
1219 48: 03a0f021 move s8,sp
1220 4c: afbc0010 sw gp,16(sp)
1221 50: 8f990000 lw t9,0(gp)
1222 54: 0320f809 jalr t9
1223 58: 00000000 nop
1224 5c: 8fdc0010 lw gp,16(s8)
1225 60: 00601021 move v0,v1
1226 64: 03c0e821 move sp,s8
1227 68: 8fbf001c lw ra,28(sp)
1228 6c: 8fbe0018 lw s8,24(sp)
1229 70: 03e00008 jr ra
1230 74: 27bd0020 addiu sp,sp,32
1231 ...
1232
1233
1234
1235 ; ---------- passing structs with only fp parts ---------->
1236 ;
1237 ; struct A { float a; };
1238 ; struct B { float a, b; };
1239 ; struct C { float a, b, c; };
1240 ; struct D { double a; };
1241 ; struct E { double a, b; };
1242 ; struct F { double a, b, c; };
1243 ;
1244 ; void leaf_call(struct A a, struct B b, struct C c, struct D d, struct E e, struct F f)
1245 ; {
1246 ; }
1247 ;
1248 ; int main()
1249 ; {
1250 ; 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.});
1251 ; return 0;
1252 ; }
1253
1254
1255
1256 ; output from freebsd-12.0_r333647-malta_mipsebhf w/ gcc 4.2.1 ----->
1257
1258 00000000 <leaf_call>:
1259 0: 3c1c0000 lui gp,0x0
1260 4: 279c0000 addiu gp,gp,0
1261 8: 0399e021 addu gp,gp,t9
1262 c: 27bdfff8 addiu sp,sp,-8
1263 10: afbe0000 sw s8,0(sp)
1264 14: 03a0f021 move s8,sp
1265 18: afc40008 sw a0,8(s8)
1266 1c: afc5000c sw a1,12(s8)
1267 20: afc60010 sw a2,16(s8)
1268 24: afc70014 sw a3,20(s8)
1269 28: 03c0e821 move sp,s8
1270 2c: 8fbe0000 lw s8,0(sp)
1271 30: 03e00008 jr ra
1272 34: 27bd0008 addiu sp,sp,8
1273
1274 00000038 <main>:
1275 38: 3c1c0000 lui gp,0x0 ; |
1276 3c: 279c0000 addiu gp,gp,0 ; |
1277 40: 0399e021 addu gp,gp,t9 ; |
1278 44: 27bdff60 addiu sp,sp,-160 ; | prolog
1279 48: afbf009c sw ra,156(sp) ; |
1280 4c: afbe0098 sw s8,152(sp) ; |
1281 50: 03a0f021 move s8,sp ; | frame pointer (note: with offset to frame start, but static compared to sp)
1282 54: afbc0048 sw gp,72(sp) ; /
1283 58: 8f820000 lw v0,0(gp) ; \
1284 5c: 24420044 addiu v0,v0,68 ; | prep local struct A data ...
1285 60: 8c420000 lw v0,0(v0) ; /
1286 64: afc20094 sw v0,148(s8) ; ... and write to local area
1287 68: 8f820000 lw v0,0(gp) ; \
1288 6c: 2442003c addiu v0,v0,60 ; |
1289 70: 8c420000 lw v0,0(v0) ; |
1290 74: 8f830000 lw v1,0(gp) ; | prep local struct B data ...
1291 78: 2463003c addiu v1,v1,60 ; |
1292 7c: 8c630004 lw v1,4(v1) ; /
1293 80: afc2008c sw v0,140(s8) ; \ ... and write to local area a
1294 84: afc30090 sw v1,144(s8) ; / b
1295 88: 8f820000 lw v0,0(gp) ; \
1296 8c: 24420030 addiu v0,v0,48 ; |
1297 90: 8c420000 lw v0,0(v0) ; |
1298 94: 8f830000 lw v1,0(gp) ; |
1299 98: 24630030 addiu v1,v1,48 ; | prep local struct C data ...
1300 9c: 8c630004 lw v1,4(v1) ; |
1301 a0: 8f840000 lw a0,0(gp) ; |
1302 a4: 24840030 addiu a0,a0,48 ; |
1303 a8: 8c840008 lw a0,8(a0) ; /
1304 ac: afc20080 sw v0,128(s8) ; \ a
1305 b0: afc30084 sw v1,132(s8) ; | ... and write to local area b
1306 b4: afc40088 sw a0,136(s8) ; / c
1307 b8: 8f830000 lw v1,0(gp) ; \
1308 bc: 24630028 addiu v1,v1,40 ; |
1309 c0: 8c630004 lw v1,4(v1) ; |
1310 c4: 8f820000 lw v0,0(gp) ; | prep local struct D data ...
1311 c8: 24420028 addiu v0,v0,40 ; |
1312 cc: 8c420000 lw v0,0(v0) ; /
1313 d0: afc3007c sw v1,124(s8) ; \ ... and write to local area
1314 d4: afc20078 sw v0,120(s8) ; /
1315 d8: 8f820000 lw v0,0(gp) ; \
1316 dc: 24420018 addiu v0,v0,24 ; |
1317 e0: 8c420000 lw v0,0(v0) ; |
1318 e4: 8f830000 lw v1,0(gp) ; |
1319 e8: 24630018 addiu v1,v1,24 ; |
1320 ec: 8c630004 lw v1,4(v1) ; | prep local struct E data ...
1321 f0: 8f840000 lw a0,0(gp) ; |
1322 f4: 24840018 addiu a0,a0,24 ; |
1323 f8: 8c840008 lw a0,8(a0) ; |
1324 fc: 8f850000 lw a1,0(gp) ; |
1325 100: 24a50018 addiu a1,a1,24 ; |
1326 104: 8ca5000c lw a1,12(a1) ; /
1327 108: afc20068 sw v0,104(s8) ; \ | a
1328 10c: afc3006c sw v1,108(s8) ; | ... and write to local area /
1329 110: afc40070 sw a0,112(s8) ; | \
1330 114: afc50074 sw a1,116(s8) ; / | b
1331 118: 8f820000 lw v0,0(gp) ; \
1332 11c: 24420000 addiu v0,v0,0 ; |
1333 120: 8c420000 lw v0,0(v0) ; |
1334 124: 8f830000 lw v1,0(gp) ; |
1335 128: 24630000 addiu v1,v1,0 ; |
1336 12c: 8c630004 lw v1,4(v1) ; |
1337 130: 8f840000 lw a0,0(gp) ; |
1338 134: 24840000 addiu a0,a0,0 ; |
1339 138: 8c840008 lw a0,8(a0) ; |
1340 13c: 8f850000 lw a1,0(gp) ; | prep local struct F data ...
1341 140: 24a50000 addiu a1,a1,0 ; |
1342 144: 8ca5000c lw a1,12(a1) ; |
1343 148: 8f860000 lw a2,0(gp) ; |
1344 14c: 24c60000 addiu a2,a2,0 ; |
1345 150: 8cc60010 lw a2,16(a2) ; |
1346 154: 8f870000 lw a3,0(gp) ; |
1347 158: 24e70000 addiu a3,a3,0 ; |
1348 15c: 8ce70014 lw a3,20(a3) ; /
1349 160: afc20050 sw v0,80(s8) ; \ | a
1350 164: afc30054 sw v1,84(s8) ; | /
1351 168: afc40058 sw a0,88(s8) ; | \ b
1352 16c: afc5005c sw a1,92(s8) ; | ... and write to local area /
1353 170: afc60060 sw a2,96(s8) ; | \
1354 174: afc70064 sw a3,100(s8) ; / | c
1355 178: 8fc3007c lw v1,124(s8) ; \
1356 17c: 8fc20078 lw v0,120(s8) ; |
1357 180: afa3001c sw v1,28(sp) ; | arg 3 (struct D)
1358 184: afa20018 sw v0,24(sp) ; /
1359 188: 8fc20068 lw v0,104(s8) ; \
1360 18c: 8fc3006c lw v1,108(s8) ; |
1361 190: 8fc40070 lw a0,112(s8) ; |
1362 194: 8fc50074 lw a1,116(s8) ; |
1363 198: afa20020 sw v0,32(sp) ; | arg 4 (struct E)
1364 19c: afa30024 sw v1,36(sp) ; |
1365 1a0: afa40028 sw a0,40(sp) ; |
1366 1a4: afa5002c sw a1,44(sp) ; /
1367 1a8: 8fc20050 lw v0,80(s8) ; \
1368 1ac: 8fc30054 lw v1,84(s8) ; |
1369 1b0: 8fc40058 lw a0,88(s8) ; |
1370 1b4: 8fc5005c lw a1,92(s8) ; |
1371 1b8: 8fc60060 lw a2,96(s8) ; |
1372 1bc: 8fc70064 lw a3,100(s8) ; |
1373 1c0: afa20030 sw v0,48(sp) ; | arg 5 (struct F)
1374 1c4: afa30034 sw v1,52(sp) ; |
1375 1c8: afa40038 sw a0,56(sp) ; |
1376 1cc: afa5003c sw a1,60(sp) ; |
1377 1d0: afa60040 sw a2,64(sp) ; |
1378 1d4: afa70044 sw a3,68(sp) ; /
1379 1d8: 8fc20084 lw v0,132(s8) ; \
1380 1dc: 8fc30088 lw v1,136(s8) ; |
1381 1e0: afa20010 sw v0,16(sp) ; | arg 2 (struct C) b (via stack)
1382 1e4: afa30014 sw v1,20(sp) ; | c (via stack)
1383 1e8: 8fc70080 lw a3,128(s8) ; | a (via reg)
1384 1ec: 8fc40094 lw a0,148(s8) ; arg 0 (struct A, via reg)
1385 1f0: 8fc5008c lw a1,140(s8) ; | arg 1 (struct B, via regs) a
1386 1f4: 8fc60090 lw a2,144(s8) ; | b
1387 1f8: 8f990000 lw t9,0(gp) ; func to call -> t9
1388 1fc: 0320f809 jalr t9 ; call and ret addr -> ra
1389 200: 00000000 nop ; branch delay slot
1390 204: 8fdc0048 lw gp,72(s8) ; |
1391 208: 00001021 move v0,zero ; : return value: not part of epilog, but unordered (branch delay slot style)
1392 20c: 03c0e821 move sp,s8 ; |
1393 210: 8fbf009c lw ra,156(sp) ; | epilog
1394 214: 8fbe0098 lw s8,152(sp) ; |
1395 218: 03e00008 jr ra ; |
1396 21c: 27bd00a0 addiu sp,sp,160 ; |
1397
1398
1399
1400 ; output from freebsd-12.0_r333647-malta_mipsebhf w/ gcc 4.2.1 *and* -mhard-float ----->
1401
1402 00000000 <leaf_call>:
1403 0: 3c1c0000 lui gp,0x0
1404 4: 279c0000 addiu gp,gp,0
1405 8: 0399e021 addu gp,gp,t9
1406 c: 27bdfff8 addiu sp,sp,-8
1407 10: afbe0000 sw s8,0(sp)
1408 14: 03a0f021 move s8,sp
1409 18: afc40008 sw a0,8(s8)
1410 1c: afc5000c sw a1,12(s8)
1411 20: afc60010 sw a2,16(s8)
1412 24: afc70014 sw a3,20(s8)
1413 28: 03c0e821 move sp,s8
1414 2c: 8fbe0000 lw s8,0(sp)
1415 30: 03e00008 jr ra
1416 34: 27bd0008 addiu sp,sp,8
1417
1418 00000038 <main>:
1419 38: 3c1c0000 lui gp,0x0 ; |
1420 3c: 279c0000 addiu gp,gp,0 ; |
1421 40: 0399e021 addu gp,gp,t9 ; |
1422 44: 27bdff60 addiu sp,sp,-160 ; | prolog
1423 48: afbf009c sw ra,156(sp) ; |
1424 4c: afbe0098 sw s8,152(sp) ; |
1425 50: 03a0f021 move s8,sp ; | frame pointer (note: with offset to frame start, but static compared to sp)
1426 54: afbc0048 sw gp,72(sp) ; /
1427 58: 8f810000 lw at,0(gp) ; \
1428 5c: 24210044 addiu at,at,68 ; | prep local struct A (single float field) data ...
1429 60: c4200000 lwc1 $f0,0(at) ; /
1430 64: e7c00094 swc1 $f0,148(s8) ; ... and write to local area
1431 68: 8f820000 lw v0,0(gp) ; \
1432 6c: 2442003c addiu v0,v0,60 ; |
1433 70: 8c420000 lw v0,0(v0) ; |
1434 74: 8f830000 lw v1,0(gp) ; | prep local struct B data ...
1435 78: 2463003c addiu v1,v1,60 ; |
1436 7c: 8c630004 lw v1,4(v1) ; /
1437 80: afc2008c sw v0,140(s8) ; \ ... and write to local area a
1438 84: afc30090 sw v1,144(s8) ; / b
1439 88: 8f820000 lw v0,0(gp) ; \
1440 8c: 24420030 addiu v0,v0,48 ; |
1441 90: 8c420000 lw v0,0(v0) ; |
1442 94: 8f830000 lw v1,0(gp) ; |
1443 98: 24630030 addiu v1,v1,48 ; | prep local struct C data ...
1444 9c: 8c630004 lw v1,4(v1) ; |
1445 a0: 8f840000 lw a0,0(gp) ; |
1446 a4: 24840030 addiu a0,a0,48 ; |
1447 a8: 8c840008 lw a0,8(a0) ; /
1448 ac: afc20080 sw v0,128(s8) ; \ a
1449 b0: afc30084 sw v1,132(s8) ; | ... and write to local area b
1450 b4: afc40088 sw a0,136(s8) ; / c
1451 b8: 8f810000 lw at,0(gp) ; \
1452 bc: 24210028 addiu at,at,40 ; | prep local struct D (single double field) data ...
1453 c0: d4200000 ldc1 $f0,0(at) ; /
1454 c4: f7c00078 sdc1 $f0,120(s8) ; ... and write to local area
1455 c8: 8f820000 lw v0,0(gp) ; \
1456 cc: 24420018 addiu v0,v0,24 ; |
1457 d0: 8c420000 lw v0,0(v0) ; |
1458 d4: 8f830000 lw v1,0(gp) ; |
1459 d8: 24630018 addiu v1,v1,24 ; |
1460 dc: 8c630004 lw v1,4(v1) ; | prep local struct E data ...
1461 e0: 8f840000 lw a0,0(gp) ; |
1462 e4: 24840018 addiu a0,a0,24 ; |
1463 e8: 8c840008 lw a0,8(a0) ; |
1464 ec: 8f850000 lw a1,0(gp) ; |
1465 f0: 24a50018 addiu a1,a1,24 ; |
1466 f4: 8ca5000c lw a1,12(a1) ; /
1467 f8: afc20068 sw v0,104(s8) ; \ | a
1468 fc: afc3006c sw v1,108(s8) ; | ... and write to local area /
1469 100: afc40070 sw a0,112(s8) ; | \
1470 104: afc50074 sw a1,116(s8) ; / | b
1471 108: 8f820000 lw v0,0(gp) ; \
1472 10c: 24420000 addiu v0,v0,0 ; |
1473 110: 8c420000 lw v0,0(v0) ; |
1474 114: 8f830000 lw v1,0(gp) ; |
1475 118: 24630000 addiu v1,v1,0 ; |
1476 11c: 8c630004 lw v1,4(v1) ; |
1477 120: 8f840000 lw a0,0(gp) ; |
1478 124: 24840000 addiu a0,a0,0 ; |
1479 128: 8c840008 lw a0,8(a0) ; |
1480 12c: 8f850000 lw a1,0(gp) ; | prep local struct F data ...
1481 130: 24a50000 addiu a1,a1,0 ; |
1482 134: 8ca5000c lw a1,12(a1) ; |
1483 138: 8f860000 lw a2,0(gp) ; |
1484 13c: 24c60000 addiu a2,a2,0 ; |
1485 140: 8cc60010 lw a2,16(a2) ; |
1486 144: 8f870000 lw a3,0(gp) ; |
1487 148: 24e70000 addiu a3,a3,0 ; |
1488 14c: 8ce70014 lw a3,20(a3) ; /
1489 150: afc20050 sw v0,80(s8) ; \ | a
1490 154: afc30054 sw v1,84(s8) ; | /
1491 158: afc40058 sw a0,88(s8) ; | \ b
1492 15c: afc5005c sw a1,92(s8) ; | ... and write to local area /
1493 160: afc60060 sw a2,96(s8) ; | \
1494 164: afc70064 sw a3,100(s8) ; / | c
1495 168: d7c00078 ldc1 $f0,120(s8) ; \
1496 16c: f7a00018 sdc1 $f0,24(sp) ; / arg 3 (struct D)
1497 170: 8fc20068 lw v0,104(s8) ; \
1498 174: 8fc3006c lw v1,108(s8) ; |
1499 178: 8fc40070 lw a0,112(s8) ; |
1500 17c: 8fc50074 lw a1,116(s8) ; |
1501 180: afa20020 sw v0,32(sp) ; | arg 4 (struct E)
1502 184: afa30024 sw v1,36(sp) ; |
1503 188: afa40028 sw a0,40(sp) ; |
1504 18c: afa5002c sw a1,44(sp) ; /
1505 190: 8fc20050 lw v0,80(s8) ; \
1506 194: 8fc30054 lw v1,84(s8) ; |
1507 198: 8fc40058 lw a0,88(s8) ; |
1508 19c: 8fc5005c lw a1,92(s8) ; |
1509 1a0: 8fc60060 lw a2,96(s8) ; |
1510 1a4: 8fc70064 lw a3,100(s8) ; |
1511 1a8: afa20030 sw v0,48(sp) ; | arg 5 (struct F)
1512 1ac: afa30034 sw v1,52(sp) ; |
1513 1b0: afa40038 sw a0,56(sp) ; |
1514 1b4: afa5003c sw a1,60(sp) ; |
1515 1b8: afa60040 sw a2,64(sp) ; |
1516 1bc: afa70044 sw a3,68(sp) ; /
1517 1c0: 8fc20084 lw v0,132(s8) ; \
1518 1c4: 8fc30088 lw v1,136(s8) ; |
1519 1c8: afa20010 sw v0,16(sp) ; | arg 2 (struct C) b (via stack)
1520 1cc: afa30014 sw v1,20(sp) ; | c (via stack)
1521 1d0: 8fc70080 lw a3,128(s8) ; | a (via reg)
1522 1d4: 8fc40094 lw a0,148(s8) ; arg 0 (struct A, via reg)
1523 1d8: 8fc5008c lw a1,140(s8) ; | arg 1 (struct B, via regs) a
1524 1dc: 8fc60090 lw a2,144(s8) ; | b
1525 1e0: 8f990000 lw t9,0(gp) ; func to call -> t9
1526 1e4: 0320f809 jalr t9 ; call and ret addr -> ra
1527 1e8: 00000000 nop ; branch delay slot
1528 1ec: 8fdc0048 lw gp,72(s8) ; |
1529 1f0: 00001021 move v0,zero ; : return value: not part of epilog, but unordered (branch delay slot style)
1530 1f4: 03c0e821 move sp,s8 ; |
1531 1f8: 8fbf009c lw ra,156(sp) ; | epilog
1532 1fc: 8fbe0098 lw s8,152(sp) ; |
1533 200: 03e00008 jr ra ; |
1534 204: 27bd00a0 addiu sp,sp,160 ; |
1535 ...
1536
1537
1538
1539 ; ---------- single-field structs by values (and small array fields) ---------->
1540 ;
1541 ; struct C { char c; };
1542 ; struct S { short s; };
1543 ; struct I { int i; };
1544 ; struct F { float f; };
1545 ; struct D { double d; };
1546 ;
1547 ; struct C2 { char c[2]; };
1548 ; struct C3 { char c[3]; };
1549 ;
1550 ; void leaf_call(struct C2 a, struct C b, struct S c, struct I d, struct F e, struct D f, struct C3 g)
1551 ; {
1552 ; }
1553 ;
1554 ; int main()
1555 ; {
1556 ; 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}});
1557 ; return 0;
1558 ; }
1559
1560
1561
1562 ; output from freebsd-12.0_r333647-malta_mipsebhf w/ gcc 4.2.1 ----->
1563
1564 00000000 <leaf_call>:
1565 0: 3c1c0000 lui gp,0x0
1566 4: 279c0000 addiu gp,gp,0
1567 8: 0399e021 addu gp,gp,t9
1568 c: 27bdfff8 addiu sp,sp,-8
1569 10: afbe0000 sw s8,0(sp)
1570 14: 03a0f021 move s8,sp
1571 18: afc40008 sw a0,8(s8)
1572 1c: afc5000c sw a1,12(s8)
1573 20: afc60010 sw a2,16(s8)
1574 24: afc70014 sw a3,20(s8)
1575 28: 03c0e821 move sp,s8
1576 2c: 8fbe0000 lw s8,0(sp)
1577 30: 03e00008 jr ra
1578 34: 27bd0008 addiu sp,sp,8
1579
1580 00000038 <main>:
1581 38: 3c1c0000 lui gp,0x0
1582 3c: 279c0000 addiu gp,gp,0
1583 40: 0399e021 addu gp,gp,t9
1584 44: 27bdffa0 addiu sp,sp,-96
1585 48: afbf005c sw ra,92(sp)
1586 4c: afbe0058 sw s8,88(sp)
1587 50: 03a0f021 move s8,sp
1588 54: afbc0028 sw gp,40(sp)
1589 58: 8f820000 lw v0,0(gp)
1590 5c: 24420010 addiu v0,v0,16
1591 60: 90420000 lbu v0,0(v0)
1592 64: a3c2004b sb v0,75(s8)
1593 68: 8f820000 lw v0,0(gp)
1594 6c: 24420010 addiu v0,v0,16
1595 70: 90420001 lbu v0,1(v0)
1596 74: a3c2004c sb v0,76(s8)
1597 78: 24020002 li v0,2
1598 7c: a3c2004a sb v0,74(s8)
1599 80: 24020003 li v0,3
1600 84: a7c20048 sh v0,72(s8)
1601 88: 24020004 li v0,4
1602 8c: afc20044 sw v0,68(s8)
1603 90: 8f820000 lw v0,0(gp)
1604 94: 24420014 addiu v0,v0,20
1605 98: 8c420000 lw v0,0(v0)
1606 9c: afc20040 sw v0,64(s8)
1607 a0: 8f830000 lw v1,0(gp)
1608 a4: 24630008 addiu v1,v1,8
1609 a8: 8c630004 lw v1,4(v1)
1610 ac: 8f820000 lw v0,0(gp)
1611 b0: 24420008 addiu v0,v0,8
1612 b4: 8c420000 lw v0,0(v0)
1613 b8: afc3003c sw v1,60(s8)
1614 bc: afc20038 sw v0,56(s8)
1615 c0: 8f820000 lw v0,0(gp)
1616 c4: 24420000 addiu v0,v0,0
1617 c8: 94420000 lhu v0,0(v0)
1618 cc: a7c20030 sh v0,48(s8)
1619 d0: 8f820000 lw v0,0(gp)
1620 d4: 24420000 addiu v0,v0,0
1621 d8: 90420002 lbu v0,2(v0)
1622 dc: a3c20032 sb v0,50(s8)
1623 e0: 8fc20040 lw v0,64(s8)
1624 e4: afa20010 sw v0,16(sp)
1625 e8: 8fc3003c lw v1,60(s8)
1626 ec: 8fc20038 lw v0,56(s8)
1627 f0: afa3001c sw v1,28(sp)
1628 f4: afa20018 sw v0,24(sp)
1629 f8: 97c20030 lhu v0,48(s8)
1630 fc: a7a20020 sh v0,32(sp)
1631 100: 93c20032 lbu v0,50(s8)
1632 104: a3a20022 sb v0,34(sp)
1633 108: 93c2004b lbu v0,75(s8)
1634 10c: 00021a00 sll v1,v0,0x8
1635 110: 93c2004c lbu v0,76(s8)
1636 114: 00431025 or v0,v0,v1
1637 118: afc00050 sw zero,80(s8)
1638 11c: 00021c00 sll v1,v0,0x10
1639 120: 8fc40050 lw a0,80(s8)
1640 124: 3082ffff andi v0,a0,0xffff
1641 128: 00431025 or v0,v0,v1
1642 12c: afc20050 sw v0,80(s8)
1643 130: 8fc40050 lw a0,80(s8)
1644 134: 93c5004a lbu a1,74(s8)
1645 138: 00052e00 sll a1,a1,0x18
1646 13c: 97c60048 lhu a2,72(s8)
1647 140: 00063400 sll a2,a2,0x10
1648 144: 8fc70044 lw a3,68(s8)
1649 148: 8f990000 lw t9,0(gp)
1650 14c: 0320f809 jalr t9
1651 150: 00000000 nop
1652 154: 8fdc0028 lw gp,40(s8)
1653 158: 00001021 move v0,zero
1654 15c: 03c0e821 move sp,s8
1655 160: 8fbf005c lw ra,92(sp)
1656 164: 8fbe0058 lw s8,88(sp)
1657 168: 03e00008 jr ra
1658 16c: 27bd0060 addiu sp,sp,96
1659
1660
1661
1662 ; output from freebsd-12.0_r333647-malta_mipsebhf w/ gcc 4.2.1 *and* -mhard-float ----->
1663
1664 00000000 <leaf_call>:
1665 0: 3c1c0000 lui gp,0x0
1666 4: 279c0000 addiu gp,gp,0
1667 8: 0399e021 addu gp,gp,t9
1668 c: 27bdfff8 addiu sp,sp,-8
1669 10: afbe0000 sw s8,0(sp)
1670 14: 03a0f021 move s8,sp
1671 18: afc40008 sw a0,8(s8)
1672 1c: afc5000c sw a1,12(s8)
1673 20: afc60010 sw a2,16(s8)
1674 24: afc70014 sw a3,20(s8)
1675 28: 03c0e821 move sp,s8
1676 2c: 8fbe0000 lw s8,0(sp)
1677 30: 03e00008 jr ra
1678 34: 27bd0008 addiu sp,sp,8
1679
1680 00000038 <main>:
1681 38: 3c1c0000 lui gp,0x0
1682 3c: 279c0000 addiu gp,gp,0
1683 40: 0399e021 addu gp,gp,t9
1684 44: 27bdffa0 addiu sp,sp,-96
1685 48: afbf005c sw ra,92(sp)
1686 4c: afbe0058 sw s8,88(sp)
1687 50: 03a0f021 move s8,sp
1688 54: afbc0028 sw gp,40(sp)
1689 58: 8f820000 lw v0,0(gp)
1690 5c: 24420010 addiu v0,v0,16
1691 60: 90420000 lbu v0,0(v0)
1692 64: a3c2004b sb v0,75(s8)
1693 68: 8f820000 lw v0,0(gp)
1694 6c: 24420010 addiu v0,v0,16
1695 70: 90420001 lbu v0,1(v0)
1696 74: a3c2004c sb v0,76(s8)
1697 78: 24020002 li v0,2
1698 7c: a3c2004a sb v0,74(s8)
1699 80: 24020003 li v0,3
1700 84: a7c20048 sh v0,72(s8)
1701 88: 24020004 li v0,4
1702 8c: afc20044 sw v0,68(s8)
1703 90: 8f810000 lw at,0(gp)
1704 94: 24210014 addiu at,at,20
1705 98: c4200000 lwc1 $f0,0(at)
1706 9c: e7c00040 swc1 $f0,64(s8)
1707 a0: 8f810000 lw at,0(gp)
1708 a4: 24210008 addiu at,at,8
1709 a8: d4200000 ldc1 $f0,0(at)
1710 ac: f7c00038 sdc1 $f0,56(s8)
1711 b0: 8f820000 lw v0,0(gp)
1712 b4: 24420000 addiu v0,v0,0
1713 b8: 94420000 lhu v0,0(v0)
1714 bc: a7c20030 sh v0,48(s8)
1715 c0: 8f820000 lw v0,0(gp)
1716 c4: 24420000 addiu v0,v0,0
1717 c8: 90420002 lbu v0,2(v0)
1718 cc: a3c20032 sb v0,50(s8)
1719 d0: c7c00040 lwc1 $f0,64(s8)
1720 d4: e7a00010 swc1 $f0,16(sp)
1721 d8: d7c00038 ldc1 $f0,56(s8)
1722 dc: f7a00018 sdc1 $f0,24(sp)
1723 e0: 97c20030 lhu v0,48(s8)
1724 e4: a7a20020 sh v0,32(sp)
1725 e8: 93c20032 lbu v0,50(s8)
1726 ec: a3a20022 sb v0,34(sp)
1727 f0: 93c2004b lbu v0,75(s8)
1728 f4: 00021a00 sll v1,v0,0x8
1729 f8: 93c2004c lbu v0,76(s8)
1730 fc: 00431025 or v0,v0,v1
1731 100: afc00050 sw zero,80(s8)
1732 104: 00021c00 sll v1,v0,0x10
1733 108: 8fc40050 lw a0,80(s8)
1734 10c: 3082ffff andi v0,a0,0xffff
1735 110: 00431025 or v0,v0,v1
1736 114: afc20050 sw v0,80(s8)
1737 118: 8fc40050 lw a0,80(s8)
1738 11c: 93c5004a lbu a1,74(s8)
1739 120: 00052e00 sll a1,a1,0x18
1740 124: 97c60048 lhu a2,72(s8)
1741 128: 00063400 sll a2,a2,0x10
1742 12c: 8fc70044 lw a3,68(s8)
1743 130: 8f990000 lw t9,0(gp)
1744 134: 0320f809 jalr t9
1745 138: 00000000 nop
1746 13c: 8fdc0028 lw gp,40(s8)
1747 140: 00001021 move v0,zero
1748 144: 03c0e821 move sp,s8
1749 148: 8fbf005c lw ra,92(sp)
1750 14c: 8fbe0058 lw s8,88(sp)
1751 150: 03e00008 jr ra
1752 154: 27bd0060 addiu sp,sp,96
1753 ...
1754
1755
1756
220 ; vim: ft=asm 1757 ; vim: ft=asm
221 1758