comparison doc/disas_examples/ppc.darwin.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 ead041d93e36
children fc614cb865c6
comparison
equal deleted inserted replaced
496:da5232da6270 497:cb19b2fe2422
950 000000f0 lmw r30,0xfff8(r1) 950 000000f0 lmw r30,0xfff8(r1)
951 000000f4 blr 951 000000f4 blr
952 952
953 953
954 954
955 ; ---------- C++ trivial and non-trivial aggrs passed to C funcs ---------->
956 ;
957 ; struct Trivial { int a; };
958 ; struct NonTrivial { int a; NonTrivial() : a(0) {} NonTrivial(const NonTrivial& rhs) : a(rhs.a) { } };
959 ;
960 ; extern "C" {
961 ;
962 ; void f1(struct Trivial s) { }
963 ; void f2(struct NonTrivial s) { }
964 ;
965 ; void f()
966 ; {
967 ; struct Trivial t;
968 ; struct NonTrivial n;
969 ; int a=1;
970 ; a += 123;
971 ; f1(t);
972 ; a -= 123;
973 ; f2(n);
974 ; a -= 12;
975 ; }
976 ; }
977
978
979
980 ; output from darwin-8.0.1-ppc w/ gcc 3.3
981
982 _f1:
983 00000000 stmw r30,0xfff8(r1)
984 00000004 stwu r1,0xffd0(r1)
985 00000008 or r30,r1,r1
986 0000000c stw r3,0x48(r30)
987 00000010 lwz r1,_f1(r1)
988 00000014 lmw r30,0xfff8(r1)
989 00000018 blr
990 _f2:
991 0000001c stmw r30,0xfff8(r1)
992 00000020 stwu r1,0xffd0(r1)
993 00000024 or r30,r1,r1
994 00000028 lwz r1,_f1(r1)
995 0000002c lmw r30,0xfff8(r1)
996 00000030 blr
997 _f:
998 00000034 mfspr r0,lr ;
999 00000038 stmw r30,0xfff8(r1) ;
1000 0000003c stw r0,0x8(r1) ;
1001 00000040 stwu r1,0xff70(r1) ;
1002 00000044 or r30,r1,r1 ;
1003 00000048 addi r0,r30,0x50 ;
1004 0000004c or r3,r0,r0 ;
1005 00000050 bl 0x140 ; __ZN10NonTrivialC1Ev ; NonTrivial::NonTrivial() / ctor
1006 00000054 li r0,0x1 ;
1007 00000058 stw r0,0x60(r30) ;
1008 0000005c lwz r2,0x60(r30) ;
1009 00000060 addi r0,r2,0x7b ;
1010 00000064 stw r0,0x60(r30) ;
1011 00000068 lwz r0,0x40(r30) ;
1012 0000006c or r3,r0,r0 ;
1013 00000070 bl _f1 ; call f1(struct Trivial)
1014 00000074 lwz r2,0x60(r30) ;
1015 00000078 addi r0,r2,0xff85 ;
1016 0000007c stw r0,0x60(r30) ;
1017 00000080 addi r0,r30,0x70 ;
1018 00000084 addi r2,r30,0x50 ;
1019 00000088 or r3,r0,r0 ; | ptr to dest of copy of n
1020 0000008c or r4,r2,r2 ; | copy n ptr to n
1021 00000090 bl 0x120 ; __ZN10NonTrivialC1ERKS_ ; / NonTrivial::NonTrivial(const NonTrivial&) / copy ctor
1022 00000094 addi r0,r30,0x70 ; \
1023 00000098 or r3,r0,r0 ; | f2 arg 0 (ptr to copy of struct NonTrivial), via ptr as non-trivial
1024 0000009c bl _f2 ; call f2(struct NonTrivial)
1025 000000a0 lwz r2,0x60(r30) ;
1026 000000a4 addi r0,r2,0xfff4 ;
1027 000000a8 stw r0,0x60(r30) ;
1028 000000ac lwz r1,_f1(r1) ;
1029 000000b0 lwz r0,0x8(r1) ;
1030 000000b4 mtspr lr,r0 ;
1031 000000b8 lmw r30,0xfff8(r1) ;
1032 000000bc blr ;
1033
1034 ; ... snip, removed code of ctor and copy ctor ...
1035
1036
1037
955 ; vim: ft=asm 1038 ; vim: ft=asm
956 1039