comparison doc/disas_examples/x64.sysv.disas @ 499:fc614cb865c6

- doc and disasexample additions specific to non-trivial C++ aggregates as return values (incl. fixes to doc and additional LSB specific PPC32 section)
author Tassilo Philipp
date Mon, 04 Apr 2022 15:50:52 +0200
parents 75cb8f79d725
children f1810b5dbb3b
comparison
equal deleted inserted replaced
498:fd9ba3a6d348 499:fc614cb865c6
586 586
587 ; ... snip, removed code of ctor and copy ctor ... 587 ; ... snip, removed code of ctor and copy ctor ...
588 588
589 589
590 590
591 ; ---------- C++ trivial and non-trivial aggrs as return values ---------->
592 ;
593 ; struct Trivial { int a; };
594 ; struct NonTrivial { int a; NonTrivial() : a(0) {} NonTrivial(const NonTrivial& rhs) : a(rhs.a) { } };
595 ;
596 ; extern "C" {
597 ; struct Trivial f1() { return Trivial(); }
598 ; }
599 ;
600 ; struct NonTrivial f2() { return NonTrivial(); }
601 ;
602 ; extern "C" {
603 ; void f()
604 ; {
605 ; int a=1;
606 ; a += 123;
607 ; struct Trivial t = f1();
608 ; a -= 123;
609 ; struct NonTrivial n = f2();
610 ; a -= 12;
611 ; }
612 ; }
613
614
615
616 ; output from freebsd-12.2-x64 w/ clang 10.0.1
617
618 00000000002019c0 <f1>:
619 2019c0: 55 push %rbp
620 2019c1: 48 89 e5 mov %rsp,%rbp
621 2019c4: 48 83 ec 10 sub $0x10,%rsp
622 2019c8: 31 f6 xor %esi,%esi
623 2019ca: 48 8d 45 f8 lea -0x8(%rbp),%rax
624 2019ce: 48 89 c7 mov %rax,%rdi
625 2019d1: ba 04 00 00 00 mov $0x4,%edx
626 2019d6: e8 75 01 00 00 callq 201b50 <memset@plt>
627 2019db: 8b 45 f8 mov -0x8(%rbp),%eax
628 2019de: 48 83 c4 10 add $0x10,%rsp
629 2019e2: 5d pop %rbp
630 2019e3: c3 retq
631
632 00000000002019f0 <_Z2f2v>:
633 2019f0: 55 push %rbp
634 2019f1: 48 89 e5 mov %rsp,%rbp
635 2019f4: 48 83 ec 10 sub $0x10,%rsp
636 2019f8: 48 89 f8 mov %rdi,%rax
637 2019fb: 48 89 f9 mov %rdi,%rcx
638 2019fe: 48 89 4d f8 mov %rcx,-0x8(%rbp)
639 201a02: 48 89 45 f0 mov %rax,-0x10(%rbp)
640 201a06: e8 85 00 00 00 callq 201a90 <_ZN10NonTrivialC2Ev>
641 201a0b: 48 8b 45 f0 mov -0x10(%rbp),%rax
642 201a0f: 48 83 c4 10 add $0x10,%rsp
643 201a13: 5d pop %rbp
644 201a14: c3 retq
645
646 0000000000201a20 <f>:
647 201a20: 55 push %rbp ; |
648 201a21: 48 89 e5 mov %rsp,%rbp ; | prolog
649 201a24: 48 83 ec 10 sub $0x10,%rsp ; |
650 201a28: c7 45 fc 01 00 00 00 movl $0x1,-0x4(%rbp) ; a = 1
651 201a2f: 8b 45 fc mov -0x4(%rbp),%eax ; |
652 201a32: 83 c0 7b add $0x7b,%eax ; | a += 123
653 201a35: 89 45 fc mov %eax,-0x4(%rbp) ; |
654 201a38: e8 83 ff ff ff callq 2019c0 <f1> ; call f1()
655 201a3d: 89 45 f8 mov %eax,-0x8(%rbp) ; retval via reg, as small struct
656 201a40: 8b 45 fc mov -0x4(%rbp),%eax ; |
657 201a43: 83 e8 7b sub $0x7b,%eax ; | a -= 123
658 201a46: 89 45 fc mov %eax,-0x4(%rbp) ; |
659 201a49: 48 8d 7d f0 lea -0x10(%rbp),%rdi ; ptr to space to hold non-triv retval
660 201a4d: e8 9e ff ff ff callq 2019f0 <_Z2f2v> ; call f2()
661 201a52: 8b 45 fc mov -0x4(%rbp),%eax ; |
662 201a55: 83 e8 0c sub $0xc,%eax ; | a-= 12
663 201a58: 89 45 fc mov %eax,-0x4(%rbp) ; /
664 201a5b: 48 83 c4 10 add $0x10,%rsp ; \
665 201a5f: 5d pop %rbp ; | epilog
666 201a60: c3 retq ; |
667
668
669
591 ; vim: ft=asm 670 ; vim: ft=asm
592 671