comparison doc/disas_examples/sparc.sparc.disas @ 476:c73c59c8b553

- sparc32 doc clarifications w/ respect to aggregate passing and returning
author Tassilo Philipp
date Sat, 19 Feb 2022 19:54:20 +0100
parents c0390dc85a07
children cb19b2fe2422
comparison
equal deleted inserted replaced
475:5be9f5ccdd35 476:c73c59c8b553
368 140: b0 10 00 01 mov %g1, %i0 ; / return value 368 140: b0 10 00 01 mov %g1, %i0 ; / return value
369 144: 81 e8 00 00 restore ; \ 369 144: 81 e8 00 00 restore ; \
370 148: 81 c3 e0 08 retl ; | epilog 370 148: 81 c3 e0 08 retl ; | epilog
371 14c: 01 00 00 00 nop ; | branch delay slot 371 14c: 01 00 00 00 nop ; | branch delay slot
372 372
373
374
375
376 ; ---------- structs by value ---------->
377 ;
378 ; struct A { int i, j; long long l; };
379 ;
380 ; void leaf_call(int b, int c, int d, int e, struct A f, int g, int h)
381 ; {
382 ; }
383 ;
384 ; void nonleaf_call(int a, int b, int c, int d, int e, struct A f, int g, int h)
385 ; {
386 ; /* use some local data */
387 ; char l[100] ={ 'L'};
388 ; leaf_call(b, c, d, e, f, g, h);
389 ; }
390 ;
391 ; int main()
392 ; {
393 ; nonleaf_call(0, 1, 2, 3, 4, (struct A){5, 6, 7ll}, 8, 9);
394 ; return 0;
395 ; }
396
397
398 ; output from debian-4.0_r3-sparc w/ gcc 4.1.2
399
400 00000000 <leaf_call>:
401 0: 9d e3 bf 98 save %sp, -104, %sp
402 4: f0 27 a0 44 st %i0, [ %fp + 0x44 ]
403 8: f2 27 a0 48 st %i1, [ %fp + 0x48 ]
404 c: f4 27 a0 4c st %i2, [ %fp + 0x4c ]
405 10: f6 27 a0 50 st %i3, [ %fp + 0x50 ]
406 14: fa 27 a0 58 st %i5, [ %fp + 0x58 ]
407 18: 81 e8 00 00 restore
408 1c: 81 c3 e0 08 retl
409 20: 01 00 00 00 nop
410
411 00000024 <nonleaf_call>:
412 24: 9d e3 bf 18 save %sp, -232, %sp
413 28: f0 27 a0 44 st %i0, [ %fp + 0x44 ]
414 2c: f2 27 a0 48 st %i1, [ %fp + 0x48 ]
415 30: f4 27 a0 4c st %i2, [ %fp + 0x4c ]
416 34: f6 27 a0 50 st %i3, [ %fp + 0x50 ]
417 38: f8 27 a0 54 st %i4, [ %fp + 0x54 ]
418 3c: a0 10 00 1d mov %i5, %l0
419 40: 82 07 bf 94 add %fp, -108, %g1
420 44: 84 10 20 64 mov 0x64, %g2
421 48: 90 10 00 01 mov %g1, %o0
422 4c: 92 10 20 00 clr %o1
423 50: 94 10 00 02 mov %g2, %o2
424 54: 40 00 00 00 call 54 <nonleaf_call+0x30>
425 58: 01 00 00 00 nop
426 5c: 82 10 20 4c mov 0x4c, %g1 ! 4c <nonleaf_call+0x28>
427 60: c2 2f bf 94 stb %g1, [ %fp + -108 ]
428 64: c4 1c 00 00 ldd [ %l0 ], %g2
429 68: c4 3f bf 80 std %g2, [ %fp + -128 ]
430 6c: c4 1c 20 08 ldd [ %l0 + 8 ], %g2
431 70: c4 3f bf 88 std %g2, [ %fp + -120 ]
432 74: 84 07 bf 80 add %fp, -128, %g2
433 78: c2 07 a0 60 ld [ %fp + 0x60 ], %g1
434 7c: c2 23 a0 5c st %g1, [ %sp + 0x5c ]
435 80: d0 07 a0 48 ld [ %fp + 0x48 ], %o0
436 84: d2 07 a0 4c ld [ %fp + 0x4c ], %o1
437 88: d4 07 a0 50 ld [ %fp + 0x50 ], %o2
438 8c: d6 07 a0 54 ld [ %fp + 0x54 ], %o3
439 90: 98 10 00 02 mov %g2, %o4
440 94: da 07 a0 5c ld [ %fp + 0x5c ], %o5
441 98: 40 00 00 00 call 98 <nonleaf_call+0x74>
442 9c: 01 00 00 00 nop
443 a0: 81 e8 00 00 restore
444 a4: 81 c3 e0 08 retl
445 a8: 01 00 00 00 nop
446
447 000000ac <main>:
448 ac: 9d e3 bf 70 save %sp, -144, %sp
449 b0: 82 10 20 05 mov 5, %g1
450 b4: c2 27 bf e8 st %g1, [ %fp + -24 ]
451 b8: 82 10 20 06 mov 6, %g1
452 bc: c2 27 bf ec st %g1, [ %fp + -20 ]
453 c0: 84 10 20 00 clr %g2
454 c4: 86 10 20 07 mov 7, %g3
455 c8: c4 3f bf f0 std %g2, [ %fp + -16 ]
456 cc: c4 1f bf e8 ldd [ %fp + -24 ], %g2
457 d0: c4 3f bf d8 std %g2, [ %fp + -40 ]
458 d4: c4 1f bf f0 ldd [ %fp + -16 ], %g2
459 d8: c4 3f bf e0 std %g2, [ %fp + -32 ]
460 dc: 84 07 bf d8 add %fp, -40, %g2
461 e0: 82 10 20 08 mov 8, %g1
462 e4: c2 23 a0 5c st %g1, [ %sp + 0x5c ]
463 e8: 82 10 20 09 mov 9, %g1
464 ec: c2 23 a0 60 st %g1, [ %sp + 0x60 ]
465 f0: 90 10 20 00 clr %o0
466 f4: 92 10 20 01 mov 1, %o1
467 f8: 94 10 20 02 mov 2, %o2
468 fc: 96 10 20 03 mov 3, %o3
469 100: 98 10 20 04 mov 4, %o4
470 104: 9a 10 00 02 mov %g2, %o5
471 108: 40 00 00 00 call 108 <main+0x5c>
472 10c: 01 00 00 00 nop
473 110: 82 10 20 00 clr %g1 ! 0 <leaf_call>
474 114: b0 10 00 01 mov %g1, %i0
475 118: 81 e8 00 00 restore
476 11c: 81 c3 e0 08 retl
477 120: 01 00 00 00 nop
478
479
480
481 ; ---------- structs by value, complex example (multiple structs) ---------->
482 ;
483 ; struct A { int i, j; float f; };
484 ; struct B { double d; long long l; };
485 ;
486 ; 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)
487 ; {
488 ; }
489 ;
490 ; 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)
491 ; {
492 ; /* use some local data */
493 ; char l[100] ={ 'L'};
494 ; leaf_call(b, c, d, e, f, g, h, i, j);
495 ; }
496 ;
497 ; int main()
498 ; {
499 ; 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);
500 ; return 0;
501 ; }
502
503
504
505 ; output from debian-4.0_r3-sparc w/ gcc 4.1.2
506
507 00000000 <leaf_call>:
508 0: 9d e3 bf 98 save %sp, -104, %sp
509 4: f0 27 a0 44 st %i0, [ %fp + 0x44 ]
510 8: f6 27 a0 50 st %i3, [ %fp + 0x50 ]
511 c: f8 27 a0 54 st %i4, [ %fp + 0x54 ]
512 10: 81 e8 00 00 restore
513 14: 81 c3 e0 08 retl
514 18: 01 00 00 00 nop
515
516 0000001c <nonleaf_call>:
517 1c: 9d e3 be e0 save %sp, -288, %sp
518 20: f0 27 a0 44 st %i0, [ %fp + 0x44 ]
519 24: f2 27 a0 48 st %i1, [ %fp + 0x48 ]
520 28: a0 10 00 1a mov %i2, %l0
521 2c: a4 10 00 1b mov %i3, %l2
522 30: f8 27 a0 54 st %i4, [ %fp + 0x54 ]
523 34: fa 27 a0 58 st %i5, [ %fp + 0x58 ]
524 38: e2 07 a0 5c ld [ %fp + 0x5c ], %l1
525 3c: e6 07 a0 60 ld [ %fp + 0x60 ], %l3
526 40: 82 07 bf 94 add %fp, -108, %g1
527 44: 84 10 20 64 mov 0x64, %g2
528 48: 90 10 00 01 mov %g1, %o0
529 4c: 92 10 20 00 clr %o1
530 50: 94 10 00 02 mov %g2, %o2
531 54: 40 00 00 00 call 54 <nonleaf_call+0x38>
532 58: 01 00 00 00 nop
533 5c: 82 10 20 4c mov 0x4c, %g1 ! 4c <nonleaf_call+0x30>
534 60: c2 2f bf 94 stb %g1, [ %fp + -108 ]
535 64: c2 04 00 00 ld [ %l0 ], %g1
536 68: c2 27 bf 80 st %g1, [ %fp + -128 ]
537 6c: c2 04 20 04 ld [ %l0 + 4 ], %g1
538 70: c2 27 bf 84 st %g1, [ %fp + -124 ]
539 74: c2 04 20 08 ld [ %l0 + 8 ], %g1
540 78: c2 27 bf 88 st %g1, [ %fp + -120 ]
541 7c: c4 1c 80 00 ldd [ %l2 ], %g2
542 80: c4 3f bf 70 std %g2, [ %fp + -144 ]
543 84: c4 1c a0 08 ldd [ %l2 + 8 ], %g2
544 88: c4 3f bf 78 std %g2, [ %fp + -136 ]
545 8c: c2 04 40 00 ld [ %l1 ], %g1
546 90: c2 27 bf 60 st %g1, [ %fp + -160 ]
547 94: c2 04 60 04 ld [ %l1 + 4 ], %g1
548 98: c2 27 bf 64 st %g1, [ %fp + -156 ]
549 9c: c2 04 60 08 ld [ %l1 + 8 ], %g1
550 a0: c2 27 bf 68 st %g1, [ %fp + -152 ]
551 a4: c4 1c c0 00 ldd [ %l3 ], %g2
552 a8: c4 3f bf 50 std %g2, [ %fp + -176 ]
553 ac: c4 1c e0 08 ldd [ %l3 + 8 ], %g2
554 b0: c4 3f bf 58 std %g2, [ %fp + -168 ]
555 b4: 84 07 bf 80 add %fp, -128, %g2
556 b8: 86 07 bf 70 add %fp, -144, %g3
557 bc: 88 07 bf 60 add %fp, -160, %g4
558 c0: 82 07 bf 50 add %fp, -176, %g1
559 c4: c2 23 a0 5c st %g1, [ %sp + 0x5c ]
560 c8: c2 07 a0 64 ld [ %fp + 0x64 ], %g1
561 cc: c2 23 a0 60 st %g1, [ %sp + 0x60 ]
562 d0: c2 07 a0 68 ld [ %fp + 0x68 ], %g1
563 d4: c2 23 a0 64 st %g1, [ %sp + 0x64 ]
564 d8: d0 07 a0 48 ld [ %fp + 0x48 ], %o0
565 dc: 92 10 00 02 mov %g2, %o1
566 e0: 94 10 00 03 mov %g3, %o2
567 e4: d6 07 a0 54 ld [ %fp + 0x54 ], %o3
568 e8: d8 07 a0 58 ld [ %fp + 0x58 ], %o4
569 ec: 9a 10 00 04 mov %g4, %o5
570 f0: 40 00 00 00 call f0 <nonleaf_call+0xd4>
571 f4: 01 00 00 00 nop
572 f8: 81 e8 00 00 restore
573 fc: 81 c3 e0 08 retl
574 100: 01 00 00 00 nop
575
576 00000104 <main>:
577 104: 9d e3 bf 08 save %sp, -248, %sp
578 108: 82 10 20 02 mov 2, %g1
579 10c: c2 27 bf bc st %g1, [ %fp + -68 ]
580 110: 82 10 20 03 mov 3, %g1
581 114: c2 27 bf c0 st %g1, [ %fp + -64 ]
582 118: 03 00 00 00 sethi %hi(0), %g1
583 11c: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call>
584 120: d1 00 40 00 ld [ %g1 ], %f8
585 124: d1 27 bf c4 st %f8, [ %fp + -60 ]
586 128: 03 00 00 00 sethi %hi(0), %g1
587 12c: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call>
588 130: d1 18 40 00 ldd [ %g1 ], %f8
589 134: d1 3f bf c8 std %f8, [ %fp + -56 ]
590 138: 84 10 20 00 clr %g2
591 13c: 86 10 20 06 mov 6, %g3
592 140: c4 3f bf d0 std %g2, [ %fp + -48 ]
593 144: 82 10 20 09 mov 9, %g1
594 148: c2 27 bf dc st %g1, [ %fp + -36 ]
595 14c: 82 10 20 0a mov 0xa, %g1
596 150: c2 27 bf e0 st %g1, [ %fp + -32 ]
597 154: 03 00 00 00 sethi %hi(0), %g1
598 158: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call>
599 15c: d1 00 40 00 ld [ %g1 ], %f8
600 160: d1 27 bf e4 st %f8, [ %fp + -28 ]
601 164: 03 00 00 00 sethi %hi(0), %g1
602 168: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call>
603 16c: d1 18 40 00 ldd [ %g1 ], %f8
604 170: d1 3f bf e8 std %f8, [ %fp + -24 ]
605 174: 84 10 20 00 clr %g2
606 178: 86 10 20 0d mov 0xd, %g3
607 17c: c4 3f bf f0 std %g2, [ %fp + -16 ]
608 180: c2 07 bf bc ld [ %fp + -68 ], %g1
609 184: c2 27 bf a8 st %g1, [ %fp + -88 ]
610 188: c2 07 bf c0 ld [ %fp + -64 ], %g1
611 18c: c2 27 bf ac st %g1, [ %fp + -84 ]
612 190: c2 07 bf c4 ld [ %fp + -60 ], %g1
613 194: c2 27 bf b0 st %g1, [ %fp + -80 ]
614 198: c4 1f bf c8 ldd [ %fp + -56 ], %g2
615 19c: c4 3f bf 98 std %g2, [ %fp + -104 ]
616 1a0: c4 1f bf d0 ldd [ %fp + -48 ], %g2
617 1a4: c4 3f bf a0 std %g2, [ %fp + -96 ]
618 1a8: c2 07 bf dc ld [ %fp + -36 ], %g1
619 1ac: c2 27 bf 88 st %g1, [ %fp + -120 ]
620 1b0: c2 07 bf e0 ld [ %fp + -32 ], %g1
621 1b4: c2 27 bf 8c st %g1, [ %fp + -116 ]
622 1b8: c2 07 bf e4 ld [ %fp + -28 ], %g1
623 1bc: c2 27 bf 90 st %g1, [ %fp + -112 ]
624 1c0: c4 1f bf e8 ldd [ %fp + -24 ], %g2
625 1c4: c4 3f bf 78 std %g2, [ %fp + -136 ]
626 1c8: c4 1f bf f0 ldd [ %fp + -16 ], %g2
627 1cc: c4 3f bf 80 std %g2, [ %fp + -128 ]
628 1d0: 84 07 bf a8 add %fp, -88, %g2
629 1d4: 86 07 bf 98 add %fp, -104, %g3
630 1d8: 82 07 bf 88 add %fp, -120, %g1
631 1dc: c2 23 a0 5c st %g1, [ %sp + 0x5c ]
632 1e0: 82 07 bf 78 add %fp, -136, %g1
633 1e4: c2 23 a0 60 st %g1, [ %sp + 0x60 ]
634 1e8: 82 10 20 0e mov 0xe, %g1
635 1ec: c2 23 a0 64 st %g1, [ %sp + 0x64 ]
636 1f0: 82 10 20 0f mov 0xf, %g1
637 1f4: c2 23 a0 68 st %g1, [ %sp + 0x68 ]
638 1f8: 90 10 20 00 clr %o0
639 1fc: 92 10 20 01 mov 1, %o1
640 200: 94 10 00 02 mov %g2, %o2
641 204: 96 10 00 03 mov %g3, %o3
642 208: 98 10 20 07 mov 7, %o4
643 20c: 9a 10 20 08 mov 8, %o5
644 210: 40 00 00 00 call 210 <main+0x10c>
645 214: 01 00 00 00 nop
646 218: 82 10 20 00 clr %g1 ! 0 <leaf_call>
647 21c: b0 10 00 01 mov %g1, %i0
648 220: 81 e8 00 00 restore
649 224: 81 c3 e0 08 retl
650 228: 01 00 00 00 nop
651
652
653
654 ; ---------- returning 64 bit value ---------->
655
656 ; long long f()
657 ; {
658 ; return 7171LL;
659 ; }
660 ;
661 ; int main()
662 ; {
663 ; return (int)f();
664 ; }
665
666
667
668 ; output from debian-4.0_r3-sparc w/ gcc 4.1.2
669
670 00000000 <f>:
671 0: 9d e3 bf 98 save %sp, -104, %sp
672 4: 84 10 20 00 clr %g2
673 8: 07 00 00 07 sethi %hi(0x1c00), %g3
674 c: 86 10 e0 03 or %g3, 3, %g3 ! 1c03 <main+0x1bdf>
675 10: b0 10 00 02 mov %g2, %i0
676 14: b2 10 00 03 mov %g3, %i1
677 18: 81 e8 00 00 restore
678 1c: 81 c3 e0 08 retl
679 20: 01 00 00 00 nop
680
681 00000024 <main>:
682 24: 9d e3 bf 98 save %sp, -104, %sp
683 28: 40 00 00 00 call 28 <main+0x4>
684 2c: 01 00 00 00 nop
685 30: 84 10 00 08 mov %o0, %g2
686 34: 86 10 00 09 mov %o1, %g3
687 38: 82 10 00 03 mov %g3, %g1
688 3c: b0 10 00 01 mov %g1, %i0
689 40: 81 e8 00 00 restore
690 44: 81 c3 e0 08 retl
691 48: 01 00 00 00 nop
692
693
694
695 ; ---------- returning structs by value ---------->
696 ;
697 ; struct Small { char x; };
698 ; struct Big { long long i; long j; };
699 ;
700 ; struct Small f0()
701 ; {
702 ; struct Small s = { 132 };
703 ; return s;
704 ; }
705 ;
706 ; struct Big f1()
707 ; {
708 ; struct Big b = { 7171LL, 232 };
709 ; return b;
710 ; }
711 ;
712 ; int main()
713 ; {
714 ; struct Small s = f0();
715 ; struct Big b = f1();
716 ; return b.j + s.x;
717 ; }
718
719
720
721 ; output from debian-4.0_r3-sparc w/ gcc 4.1.2
722
723 00000000 <f0>:
724 0: 9d e3 bf 90 save %sp, -112, %sp
725 4: c2 07 a0 40 ld [ %fp + 0x40 ], %g1
726 8: 84 10 3f 84 mov -124, %g2
727 c: c4 2f bf f7 stb %g2, [ %fp + -9 ]
728 10: c4 0f bf f7 ldub [ %fp + -9 ], %g2
729 14: c4 28 40 00 stb %g2, [ %g1 ]
730 18: b0 10 00 01 mov %g1, %i0
731 1c: 81 e8 00 00 restore
732 20: 81 c3 e0 0c jmp %o7 + 0xc
733 24: 01 00 00 00 nop
734
735 00000028 <f1>:
736 28: 9d e3 bf 88 save %sp, -120, %sp
737 2c: c8 07 a0 40 ld [ %fp + 0x40 ], %g4
738 30: 84 10 20 00 clr %g2
739 34: 07 00 00 07 sethi %hi(0x1c00), %g3
740 38: 86 10 e0 03 or %g3, 3, %g3 ! 1c03 <main+0x1b9b>
741 3c: c4 3f bf e8 std %g2, [ %fp + -24 ]
742 40: 82 10 20 e8 mov 0xe8, %g1
743 44: c2 27 bf f0 st %g1, [ %fp + -16 ]
744 48: c4 1f bf e8 ldd [ %fp + -24 ], %g2
745 4c: c4 39 00 00 std %g2, [ %g4 ]
746 50: c4 1f bf f0 ldd [ %fp + -16 ], %g2
747 54: c4 39 20 08 std %g2, [ %g4 + 8 ]
748 58: b0 10 00 04 mov %g4, %i0
749 5c: 81 e8 00 00 restore
750 60: 81 c3 e0 0c jmp %o7 + 0xc
751 64: 01 00 00 00 nop
752
753 00000068 <main>:
754 68: 9d e3 bf 78 save %sp, -136, %sp
755 6c: 82 07 bf df add %fp, -33, %g1
756 70: c2 23 a0 40 st %g1, [ %sp + 0x40 ]
757 74: 40 00 00 00 call 74 <main+0xc>
758 78: 01 00 00 00 nop
759 7c: 00 00 00 01 unimp 0x1
760 80: c2 0f bf df ldub [ %fp + -33 ], %g1
761 84: c2 2f bf f7 stb %g1, [ %fp + -9 ]
762 88: 82 07 bf e0 add %fp, -32, %g1
763 8c: c2 23 a0 40 st %g1, [ %sp + 0x40 ]
764 90: 40 00 00 00 call 90 <main+0x28>
765 94: 01 00 00 00 nop
766 98: 00 00 00 10 unimp 0x10
767 9c: c4 07 bf e8 ld [ %fp + -24 ], %g2
768 a0: c2 0f bf f7 ldub [ %fp + -9 ], %g1
769 a4: 83 28 60 18 sll %g1, 0x18, %g1
770 a8: 83 38 60 18 sra %g1, 0x18, %g1
771 ac: 82 00 80 01 add %g2, %g1, %g1
772 b0: b0 10 00 01 mov %g1, %i0
773 b4: 81 e8 00 00 restore
774 b8: 81 c3 e0 08 retl
775 bc: 01 00 00 00 nop
776
777
778
779 ; ---------- passing structs with only fp parts ---------->
780 ;
781 ; struct A { float a; };
782 ; struct B { float a, b; };
783 ; struct C { float a, b, c; };
784 ; struct D { double a; };
785 ; struct E { double a, b; };
786 ; struct F { double a, b, c; };
787 ;
788 ; void leaf_call(struct A a, struct B b, struct C c, struct D d, struct E e, struct F f)
789 ; {
790 ; }
791 ;
792 ; int main()
793 ; {
794 ; 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.});
795 ; return 0;
796 ; }
797
798
799
800 ; output from debian-4.0_r3-sparc w/ gcc 4.1.2
801
802 00000000 <leaf_call>:
803 0: 9d e3 bf 98 save %sp, -104, %sp
804 4: 81 e8 00 00 restore
805 8: 81 c3 e0 08 retl
806 c: 01 00 00 00 nop
807
808 00000010 <main>:
809 10: 9d e3 bf 00 save %sp, -256, %sp
810 14: 03 00 00 00 sethi %hi(0), %g1
811 18: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call>
812 1c: d1 00 40 00 ld [ %g1 ], %f8
813 20: d1 27 bf b0 st %f8, [ %fp + -80 ]
814 24: 03 00 00 00 sethi %hi(0), %g1
815 28: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call>
816 2c: d1 00 40 00 ld [ %g1 ], %f8
817 30: d1 27 bf b4 st %f8, [ %fp + -76 ]
818 34: 03 00 00 00 sethi %hi(0), %g1
819 38: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call>
820 3c: d1 00 40 00 ld [ %g1 ], %f8
821 40: d1 27 bf b8 st %f8, [ %fp + -72 ]
822 44: 03 00 00 00 sethi %hi(0), %g1
823 48: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call>
824 4c: d1 00 40 00 ld [ %g1 ], %f8
825 50: d1 27 bf bc st %f8, [ %fp + -68 ]
826 54: 03 00 00 00 sethi %hi(0), %g1
827 58: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call>
828 5c: d1 00 40 00 ld [ %g1 ], %f8
829 60: d1 27 bf c0 st %f8, [ %fp + -64 ]
830 64: 03 00 00 00 sethi %hi(0), %g1
831 68: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call>
832 6c: d1 00 40 00 ld [ %g1 ], %f8
833 70: d1 27 bf c4 st %f8, [ %fp + -60 ]
834 74: 03 00 00 00 sethi %hi(0), %g1
835 78: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call>
836 7c: d1 18 40 00 ldd [ %g1 ], %f8
837 80: d1 3f bf c8 std %f8, [ %fp + -56 ]
838 84: 03 00 00 00 sethi %hi(0), %g1
839 88: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call>
840 8c: d1 18 40 00 ldd [ %g1 ], %f8
841 90: d1 3f bf d0 std %f8, [ %fp + -48 ]
842 94: 03 00 00 00 sethi %hi(0), %g1
843 98: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call>
844 9c: d1 18 40 00 ldd [ %g1 ], %f8
845 a0: d1 3f bf d8 std %f8, [ %fp + -40 ]
846 a4: 03 00 00 00 sethi %hi(0), %g1
847 a8: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call>
848 ac: d1 18 40 00 ldd [ %g1 ], %f8
849 b0: d1 3f bf e0 std %f8, [ %fp + -32 ]
850 b4: 03 00 00 00 sethi %hi(0), %g1
851 b8: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call>
852 bc: d1 18 40 00 ldd [ %g1 ], %f8
853 c0: d1 3f bf e8 std %f8, [ %fp + -24 ]
854 c4: 03 00 00 00 sethi %hi(0), %g1
855 c8: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call>
856 cc: d1 18 40 00 ldd [ %g1 ], %f8
857 d0: d1 3f bf f0 std %f8, [ %fp + -16 ]
858 d4: d1 07 bf b0 ld [ %fp + -80 ], %f8
859 d8: d1 27 bf ac st %f8, [ %fp + -84 ]
860 dc: c2 07 bf b4 ld [ %fp + -76 ], %g1
861 e0: c2 27 bf a0 st %g1, [ %fp + -96 ]
862 e4: c2 07 bf b8 ld [ %fp + -72 ], %g1
863 e8: c2 27 bf a4 st %g1, [ %fp + -92 ]
864 ec: c2 07 bf bc ld [ %fp + -68 ], %g1
865 f0: c2 27 bf 90 st %g1, [ %fp + -112 ]
866 f4: c2 07 bf c0 ld [ %fp + -64 ], %g1
867 f8: c2 27 bf 94 st %g1, [ %fp + -108 ]
868 fc: c2 07 bf c4 ld [ %fp + -60 ], %g1
869 100: c2 27 bf 98 st %g1, [ %fp + -104 ]
870 104: d1 1f bf c8 ldd [ %fp + -56 ], %f8
871 108: d1 3f bf 88 std %f8, [ %fp + -120 ]
872 10c: c4 1f bf d0 ldd [ %fp + -48 ], %g2
873 110: c4 3f bf 78 std %g2, [ %fp + -136 ]
874 114: c4 1f bf d8 ldd [ %fp + -40 ], %g2
875 118: c4 3f bf 80 std %g2, [ %fp + -128 ]
876 11c: c4 1f bf e0 ldd [ %fp + -32 ], %g2
877 120: c4 3f bf 60 std %g2, [ %fp + -160 ]
878 124: c4 1f bf e8 ldd [ %fp + -24 ], %g2
879 128: c4 3f bf 68 std %g2, [ %fp + -152 ]
880 12c: c4 1f bf f0 ldd [ %fp + -16 ], %g2
881 130: c4 3f bf 70 std %g2, [ %fp + -144 ]
882 134: 82 07 bf ac add %fp, -84, %g1
883 138: 84 07 bf a0 add %fp, -96, %g2
884 13c: 86 07 bf 90 add %fp, -112, %g3
885 140: 88 07 bf 88 add %fp, -120, %g4
886 144: 9a 07 bf 78 add %fp, -136, %o5
887 148: 9e 07 bf 60 add %fp, -160, %o7
888 14c: 90 10 00 01 mov %g1, %o0
889 150: 92 10 00 02 mov %g2, %o1
890 154: 94 10 00 03 mov %g3, %o2
891 158: 96 10 00 04 mov %g4, %o3
892 15c: 98 10 00 0d mov %o5, %o4
893 160: 9a 10 00 0f mov %o7, %o5
894 164: 40 00 00 00 call 164 <main+0x154>
895 168: 01 00 00 00 nop
896 16c: 82 10 20 00 clr %g1 ! 0 <leaf_call>
897 170: b0 10 00 01 mov %g1, %i0
898 174: 81 e8 00 00 restore
899 178: 81 c3 e0 08 retl
900 17c: 01 00 00 00 nop
901
902
903
904 ; ---------- single-field structs by values (and small array fields) ---------->
905 ;
906 ; struct C { char c; };
907 ; struct S { short s; };
908 ; struct I { int i; };
909 ; struct F { float f; };
910 ; struct D { double d; };
911 ;
912 ; struct C2 { char c[2]; };
913 ; struct C3 { char c[3]; };
914 ;
915 ; void leaf_call(struct C2 a, struct C b, struct S c, struct I d, struct F e, struct D f, struct C3 g)
916 ; {
917 ; }
918 ;
919 ; int main()
920 ; {
921 ; 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}});
922 ; return 0;
923 ; }
924
925
926
927 ; output from debian-4.0_r3-sparc w/ gcc 4.1.2
928
929 00000000 <leaf_call>:
930 0: 9d e3 bf 98 save %sp, -104, %sp
931 4: 81 e8 00 00 restore
932 8: 81 c3 e0 08 retl
933 c: 01 00 00 00 nop
934
935 00000010 <main>:
936 10: 9d e3 bf 48 save %sp, -184, %sp
937 14: c0 2f bf db clrb [ %fp + -37 ]
938 18: 82 10 20 01 mov 1, %g1
939 1c: c2 2f bf dc stb %g1, [ %fp + -36 ]
940 20: 82 10 20 02 mov 2, %g1
941 24: c2 2f bf dd stb %g1, [ %fp + -35 ]
942 28: 82 10 20 03 mov 3, %g1
943 2c: c2 37 bf de sth %g1, [ %fp + -34 ]
944 30: 82 10 20 04 mov 4, %g1
945 34: c2 27 bf e0 st %g1, [ %fp + -32 ]
946 38: 03 00 00 00 sethi %hi(0), %g1
947 3c: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call>
948 40: d1 00 40 00 ld [ %g1 ], %f8
949 44: d1 27 bf e4 st %f8, [ %fp + -28 ]
950 48: 03 00 00 00 sethi %hi(0), %g1
951 4c: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call>
952 50: d1 18 40 00 ldd [ %g1 ], %f8
953 54: d1 3f bf e8 std %f8, [ %fp + -24 ]
954 58: 82 10 20 07 mov 7, %g1
955 5c: c2 2f bf f5 stb %g1, [ %fp + -11 ]
956 60: 82 10 20 08 mov 8, %g1
957 64: c2 2f bf f6 stb %g1, [ %fp + -10 ]
958 68: 82 10 20 09 mov 9, %g1
959 6c: c2 2f bf f7 stb %g1, [ %fp + -9 ]
960 70: c2 0f bf db ldub [ %fp + -37 ], %g1
961 74: c2 2f bf d0 stb %g1, [ %fp + -48 ]
962 78: c2 0f bf dc ldub [ %fp + -36 ], %g1
963 7c: c2 2f bf d1 stb %g1, [ %fp + -47 ]
964 80: c2 0f bf dd ldub [ %fp + -35 ], %g1
965 84: c2 2f bf cf stb %g1, [ %fp + -49 ]
966 88: c2 17 bf de lduh [ %fp + -34 ], %g1
967 8c: c2 37 bf cc sth %g1, [ %fp + -52 ]
968 90: c2 07 bf e0 ld [ %fp + -32 ], %g1
969 94: c2 27 bf c8 st %g1, [ %fp + -56 ]
970 98: d1 07 bf e4 ld [ %fp + -28 ], %f8
971 9c: d1 27 bf c4 st %f8, [ %fp + -60 ]
972 a0: d1 1f bf e8 ldd [ %fp + -24 ], %f8
973 a4: d1 3f bf b8 std %f8, [ %fp + -72 ]
974 a8: c2 0f bf f5 ldub [ %fp + -11 ], %g1
975 ac: c2 2f bf b0 stb %g1, [ %fp + -80 ]
976 b0: c2 0f bf f6 ldub [ %fp + -10 ], %g1
977 b4: c2 2f bf b1 stb %g1, [ %fp + -79 ]
978 b8: c2 0f bf f7 ldub [ %fp + -9 ], %g1
979 bc: c2 2f bf b2 stb %g1, [ %fp + -78 ]
980 c0: 84 07 bf d0 add %fp, -48, %g2
981 c4: 86 07 bf cf add %fp, -49, %g3
982 c8: 88 07 bf cc add %fp, -52, %g4
983 cc: 9a 07 bf c8 add %fp, -56, %o5
984 d0: 98 07 bf c4 add %fp, -60, %o4
985 d4: 9e 07 bf b8 add %fp, -72, %o7
986 d8: 82 07 bf b0 add %fp, -80, %g1
987 dc: c2 23 a0 5c st %g1, [ %sp + 0x5c ]
988 e0: 90 10 00 02 mov %g2, %o0
989 e4: 92 10 00 03 mov %g3, %o1
990 e8: 94 10 00 04 mov %g4, %o2
991 ec: 96 10 00 0d mov %o5, %o3
992 f0: 9a 10 00 0f mov %o7, %o5
993 f4: 40 00 00 00 call f4 <main+0xe4>
994 f8: 01 00 00 00 nop
995 fc: 82 10 20 00 clr %g1 ! 0 <leaf_call>
996 100: b0 10 00 01 mov %g1, %i0
997 104: 81 e8 00 00 restore
998 108: 81 c3 e0 08 retl
999 10c: 01 00 00 00 nop
1000
1001
1002
373 ; vim: ft=asm 1003 ; vim: ft=asm
374 1004