comparison doc/disas_examples/sparc64.sparc64.disas @ 497:cb19b2fe2422

- more disas examples to check behaviour of passing C++ non-trivial aggregates by value; they all behave the same, calling the copy ctor first, passing a pointer then
author Tassilo Philipp
date Wed, 23 Mar 2022 15:24:31 +0100
parents c73c59c8b553
children fc614cb865c6
comparison
equal deleted inserted replaced
496:da5232da6270 497:cb19b2fe2422
1607 1f4: 81 cf e0 08 rett %i7 + 8 1607 1f4: 81 cf e0 08 rett %i7 + 8
1608 1f8: 01 00 00 00 nop 1608 1f8: 01 00 00 00 nop
1609 1609
1610 1610
1611 1611
1612 ; ---------- C++ trivial and non-trivial aggrs passed to C funcs ---------->
1613 ;
1614 ; struct Trivial { int a; };
1615 ; struct NonTrivial { int a; NonTrivial() : a(0) {} NonTrivial(const NonTrivial& rhs) : a(rhs.a) { } };
1616 ;
1617 ; extern "C" {
1618 ;
1619 ; void f1(struct Trivial s) { }
1620 ; void f2(struct NonTrivial s) { }
1621 ;
1622 ; void f()
1623 ; {
1624 ; struct Trivial t;
1625 ; struct NonTrivial n;
1626 ; int a=1;
1627 ; a += 123;
1628 ; f1(t);
1629 ; a -= 123;
1630 ; f2(n);
1631 ; a -= 12;
1632 ; }
1633 ; }
1634
1635
1636
1637 ; output from openbsd-6.0-sparc64 w/ gcc 4.2.1
1638
1639 0000000000000d20 <f1>:
1640 d20: 9d e3 bf 30 save %sp, -208, %sp
1641 d24: 82 10 00 18 mov %i0, %g1
1642 d28: 83 38 70 20 srax %g1, 0x20, %g1
1643 d2c: c4 07 a8 7f ld [ %fp + 0x87f ], %g2
1644 d30: 84 08 a0 00 and %g2, 0, %g2
1645 d34: 82 10 80 01 or %g2, %g1, %g1
1646 d38: c2 27 a8 7f st %g1, [ %fp + 0x87f ]
1647 d3c: 81 cf e0 08 rett %i7 + 8
1648 d40: 01 00 00 00 nop
1649
1650 0000000000000d44 <f2>:
1651 d44: 9d e3 bf 30 save %sp, -208, %sp
1652 d48: f0 77 a8 7f stx %i0, [ %fp + 0x87f ]
1653 d4c: 81 cf e0 08 rett %i7 + 8
1654 d50: 01 00 00 00 nop
1655 d54: ae 03 c0 17 add %o7, %l7, %l7
1656 d58: 81 c3 e0 08 retl
1657 d5c: 01 00 00 00 nop
1658
1659 0000000000000d60 <f>:
1660 d60: 9d e3 bf 20 save %sp, -224, %sp ;
1661 d64: 2f 00 0c 00 sethi %hi(0x300000), %l7 ;
1662 d68: ae 05 e2 ac add %l7, 0x2ac, %l7 ;
1663 d6c: 7f ff ff fa call d54 <f2+0x10> ;
1664 d70: 01 00 00 00 nop ;
1665 d74: 03 00 00 00 sethi %hi(0), %g1 ;
1666 d78: 82 10 60 48 or %g1, 0x48, %g1 ;
1667 d7c: c2 5d c0 01 ldx [ %l7 + %g1 ], %g1 ;
1668 d80: c4 58 40 00 ldx [ %g1 ], %g2 ;
1669 d84: c4 77 a7 e7 stx %g2, [ %fp + 0x7e7 ] ;
1670 d88: 84 10 20 00 clr %g2 ;
1671 d8c: 82 07 a7 df add %fp, 0x7df, %g1 ;
1672 d90: 90 10 00 01 mov %g1, %o0 ;
1673 d94: 40 14 01 13 call 5011e0 <_ZN10NonTrivialC1Ev@plt> ; NonTrivial::NonTrivial() / ctor
1674 d98: 01 00 00 00 nop ;
1675 d9c: 82 10 20 01 mov 1, %g1 ;
1676 da0: c2 27 a7 db st %g1, [ %fp + 0x7db ] ;
1677 da4: c2 07 a7 db ld [ %fp + 0x7db ], %g1 ;
1678 da8: 82 00 60 7b add %g1, 0x7b, %g1 ;
1679 dac: c2 27 a7 db st %g1, [ %fp + 0x7db ] ;
1680 db0: c2 07 a7 e3 ld [ %fp + 0x7e3 ], %g1 ;
1681 db4: 83 30 60 00 srl %g1, 0, %g1 ;
1682 db8: 83 28 70 20 sllx %g1, 0x20, %g1 ;
1683 dbc: 90 10 00 01 mov %g1, %o0 ;
1684 dc0: 40 14 01 30 call 501280 <f1@plt> ; call f1(struct Trivial)
1685 dc4: 01 00 00 00 nop ;
1686 dc8: c2 07 a7 db ld [ %fp + 0x7db ], %g1 ;
1687 dcc: 82 00 7f 85 add %g1, -123, %g1 ;
1688 dd0: c2 27 a7 db st %g1, [ %fp + 0x7db ] ;
1689 dd4: 82 07 a7 d7 add %fp, 0x7d7, %g1 ;
1690 dd8: 84 07 a7 df add %fp, 0x7df, %g2 ;
1691 ddc: 90 10 00 01 mov %g1, %o0 ; | ptr to dest of copy of n
1692 de0: 92 10 00 02 mov %g2, %o1 ; | copy n ptr to n
1693 de4: 40 14 00 e7 call 501180 <_ZN10NonTrivialC1ERKS_@plt> ; | NonTrivial::NonTrivial(const NonTrivial&) / copy ctor
1694 de8: 01 00 00 00 nop ;
1695 dec: 82 07 a7 d7 add %fp, 0x7d7, %g1 ; |
1696 df0: 90 10 00 01 mov %g1, %o0 ; | f2 arg 0 (ptr to copy of struct NonTrivial), via ptr as non-trivial
1697 df4: 40 14 01 03 call 501200 <f2@plt> ; call f2(struct NonTrivial)
1698 df8: 01 00 00 00 nop ;
1699 dfc: c2 07 a7 db ld [ %fp + 0x7db ], %g1 ;
1700 e00: 82 00 7f f4 add %g1, -12, %g1 ;
1701 e04: c2 27 a7 db st %g1, [ %fp + 0x7db ] ;
1702 e08: 03 00 00 00 sethi %hi(0), %g1 ;
1703 e0c: 82 10 60 48 or %g1, 0x48, %g1 ;
1704 e10: c2 5d c0 01 ldx [ %l7 + %g1 ], %g1 ;
1705 e14: c6 5f a7 e7 ldx [ %fp + 0x7e7 ], %g3 ;
1706 e18: c4 58 40 00 ldx [ %g1 ], %g2 ;
1707 e1c: 86 18 c0 02 xor %g3, %g2, %g3 ;
1708 e20: 84 10 20 00 clr %g2 ;
1709 e24: 82 10 00 03 mov %g3, %g1 ;
1710 e28: 02 c8 40 08 brz %g1, e48 <f+0xe8> ;
1711 e2c: 01 00 00 00 nop ;
1712 e30: 03 00 00 00 sethi %hi(0), %g1 ;
1713 e34: 82 10 60 40 or %g1, 0x40, %g1 ;
1714 e38: c2 5d c0 01 ldx [ %l7 + %g1 ], %g1 ;
1715 e3c: 90 10 00 01 mov %g1, %o0 ;
1716 e40: 40 14 00 d8 call 5011a0 <__stack_smash_handler@plt> ;
1717 e44: 01 00 00 00 nop ;
1718 e48: 81 cf e0 08 rett %i7 + 8 ;
1719 e4c: 01 00 00 00 nop ;
1720
1721 ; ... snip, removed code of ctor and copy ctor ...
1722
1723
1724
1612 ; vim: ft=asm 1725 ; vim: ft=asm
1613 1726