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