Mercurial > pub > dyncall > dyncall
comparison doc/disas_examples/ppc.darwin.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 | cb19b2fe2422 |
children |
comparison
equal
deleted
inserted
replaced
498:fd9ba3a6d348 | 499:fc614cb865c6 |
---|---|
1033 | 1033 |
1034 ; ... snip, removed code of ctor and copy ctor ... | 1034 ; ... snip, removed code of ctor and copy ctor ... |
1035 | 1035 |
1036 | 1036 |
1037 | 1037 |
1038 ; ---------- C++ trivial and non-trivial aggrs as return values ----------> | |
1039 ; | |
1040 ; struct Trivial { int a; }; | |
1041 ; struct NonTrivial { int a; NonTrivial() : a(0) {} NonTrivial(const NonTrivial& rhs) : a(rhs.a) { } }; | |
1042 ; | |
1043 ; extern "C" { | |
1044 ; struct Trivial f1() { return Trivial(); } | |
1045 ; } | |
1046 ; | |
1047 ; struct NonTrivial f2() { return NonTrivial(); } | |
1048 ; | |
1049 ; extern "C" { | |
1050 ; void f() | |
1051 ; { | |
1052 ; int a=1; | |
1053 ; a += 123; | |
1054 ; struct Trivial t = f1(); | |
1055 ; a -= 123; | |
1056 ; struct NonTrivial n = f2(); | |
1057 ; a -= 12; | |
1058 ; } | |
1059 ; } | |
1060 | |
1061 | |
1062 | |
1063 ; output from darwin-8.0.1-ppc w/ gcc 3.3 | |
1064 | |
1065 _f1: | |
1066 0000211c stmw r30,0xfff8(r1) | |
1067 00002120 stwu r1,0xffd0(r1) | |
1068 00002124 or r30,r1,r1 | |
1069 00002128 or r2,r3,r3 | |
1070 0000212c li r0,0x0 | |
1071 00002130 stw r0,0x0(r2) | |
1072 00002134 or r3,r2,r2 | |
1073 00002138 lwz r1,0x0(r1) | |
1074 0000213c lmw r30,0xfff8(r1) | |
1075 00002140 blr | |
1076 __Z2f2v: | |
1077 00002144 mfspr r0,lr | |
1078 00002148 stmw r29,0xfff4(r1) | |
1079 0000214c stw r0,0x8(r1) | |
1080 00002150 stwu r1,0xffb0(r1) | |
1081 00002154 or r30,r1,r1 | |
1082 00002158 or r29,r3,r3 | |
1083 0000215c or r3,r29,r29 | |
1084 00002160 bl 0x83cc | |
1085 00002164 or r3,r29,r29 | |
1086 00002168 lwz r1,0x0(r1) | |
1087 0000216c lwz r0,0x8(r1) | |
1088 00002170 mtspr lr,r0 | |
1089 00002174 lmw r29,0xfff4(r1) | |
1090 00002178 blr | |
1091 _f: | |
1092 0000217c mfspr r0,lr ; | |
1093 00002180 stmw r30,0xfff8(r1) ; | |
1094 00002184 stw r0,0x8(r1) ; | |
1095 00002188 stwu r1,0xff90(r1) ; | |
1096 0000218c or r30,r1,r1 ; | |
1097 00002190 li r0,0x1 ; | |
1098 00002194 stw r0,0x40(r30) ; | |
1099 00002198 lwz r2,0x40(r30) ; | |
1100 0000219c addi r0,r2,0x7b ; | |
1101 000021a0 stw r0,0x40(r30) ; | |
1102 000021a4 addi r0,r30,0x44 ; | | |
1103 000021a8 or r3,r0,r0 ; | ptr to space for retval is passed as hidden first arg | |
1104 000021ac bl 0x211c ; call f1() | |
1105 000021b0 lwz r2,0x40(r30) ; | |
1106 000021b4 addi r0,r2,0xff85 ; | |
1107 000021b8 stw r0,0x40(r30) ; | |
1108 000021bc addi r0,r30,0x50 ; | | |
1109 000021c0 or r3,r0,r0 ; | ptr to space for retval is passed as hidden first arg | |
1110 000021c4 bl 0x2144 ; call f2() | |
1111 000021c8 lwz r2,0x40(r30) ; | |
1112 000021cc addi r0,r2,0xfff4 ; | |
1113 000021d0 stw r0,0x40(r30) ; | |
1114 000021d4 lwz r1,0x0(r1) ; | |
1115 000021d8 lwz r0,0x8(r1) ; | |
1116 000021dc mtspr lr,r0 ; | |
1117 000021e0 lmw r30,0xfff8(r1) ; | |
1118 000021e4 blr ; | |
1119 | |
1120 | |
1121 | |
1038 ; vim: ft=asm | 1122 ; vim: ft=asm |
1039 | 1123 |