Mercurial > pub > dyncall > dyncall
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 |