comparison doc/disas_examples/ppc.sysv.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
1112 100: 7d 61 5b 78 mr r1,r11 1112 100: 7d 61 5b 78 mr r1,r11
1113 104: 4e 80 00 20 blr 1113 104: 4e 80 00 20 blr
1114 1114
1115 1115
1116 1116
1117 ; ---------- C++ trivial and non-trivial aggrs passed to C funcs ---------->
1118 ;
1119 ; struct Trivial { int a; };
1120 ; struct NonTrivial { int a; NonTrivial() : a(0) {} NonTrivial(const NonTrivial& rhs) : a(rhs.a) { } };
1121 ;
1122 ; extern "C" {
1123 ;
1124 ; void f1(struct Trivial s) { }
1125 ; void f2(struct NonTrivial s) { }
1126 ;
1127 ; void f()
1128 ; {
1129 ; struct Trivial t;
1130 ; struct NonTrivial n;
1131 ; int a=1;
1132 ; a += 123;
1133 ; f1(t);
1134 ; a -= 123;
1135 ; f2(n);
1136 ; a -= 12;
1137 ; }
1138 ; }
1139
1140
1141
1142 ; output from debian-4.1.1-21-ppc w/ gcc 4.1.2
1143
1144 100003e0 <f1>:
1145 100003e0: 94 21 ff f0 stwu r1,-16(r1)
1146 100003e4: 93 e1 00 0c stw r31,12(r1)
1147 100003e8: 7c 3f 0b 78 mr r31,r1
1148 100003ec: 81 61 00 00 lwz r11,0(r1)
1149 100003f0: 83 eb ff fc lwz r31,-4(r11)
1150 100003f4: 7d 61 5b 78 mr r1,r11
1151 100003f8: 4e 80 00 20 blr
1152
1153 100003fc <f2>:
1154 100003fc: 94 21 ff e0 stwu r1,-32(r1)
1155 10000400: 93 e1 00 1c stw r31,28(r1)
1156 10000404: 7c 3f 0b 78 mr r31,r1
1157 10000408: 90 7f 00 08 stw r3,8(r31)
1158 1000040c: 81 61 00 00 lwz r11,0(r1)
1159 10000410: 83 eb ff fc lwz r31,-4(r11)
1160 10000414: 7d 61 5b 78 mr r1,r11
1161 10000418: 4e 80 00 20 blr
1162
1163 1000041c <f>:
1164 1000041c: 94 21 ff d0 stwu r1,-48(r1) ;
1165 10000420: 7c 08 02 a6 mflr r0 ;
1166 10000424: 93 e1 00 2c stw r31,44(r1) ;
1167 10000428: 90 01 00 34 stw r0,52(r1) ;
1168 1000042c: 7c 3f 0b 78 mr r31,r1 ;
1169 10000430: 38 1f 00 14 addi r0,r31,20 ;
1170 10000434: 7c 03 03 78 mr r3,r0 ;
1171 10000438: 48 00 00 a1 bl 100004d8 <_ZN10NonTrivialC1Ev> ; NonTrivial::NonTrivial() / ctor
1172 1000043c: 38 00 00 01 li r0,1 ;
1173 10000440: 90 1f 00 08 stw r0,8(r31) ;
1174 10000444: 81 3f 00 08 lwz r9,8(r31) ;
1175 10000448: 38 09 00 7b addi r0,r9,123 ;
1176 1000044c: 90 1f 00 08 stw r0,8(r31) ;
1177 10000450: 80 1f 00 10 lwz r0,16(r31) ;
1178 10000454: 90 1f 00 18 stw r0,24(r31) ;
1179 10000458: 38 1f 00 18 addi r0,r31,24 ;
1180 1000045c: 7c 03 03 78 mr r3,r0 ;
1181 10000460: 4b ff ff 81 bl 100003e0 <f1> ; call f1(struct Trivial)
1182 10000464: 81 3f 00 08 lwz r9,8(r31) ;
1183 10000468: 38 09 ff 85 addi r0,r9,-123 ;
1184 1000046c: 90 1f 00 08 stw r0,8(r31) ;
1185 10000470: 38 1f 00 0c addi r0,r31,12 ;
1186 10000474: 39 3f 00 14 addi r9,r31,20 ;
1187 10000478: 7c 03 03 78 mr r3,r0 ; | ptr to dest of copy of n
1188 1000047c: 7d 24 4b 78 mr r4,r9 ; | copy n ptr to n
1189 10000480: 48 00 00 85 bl 10000504 <_ZN10NonTrivialC1ERKS_> ; / NonTrivial::NonTrivial(const NonTrivial&) / copy ctor
1190 10000484: 38 1f 00 0c addi r0,r31,12 ; \
1191 10000488: 7c 03 03 78 mr r3,r0 ; | f2 arg 0 (ptr to copy of struct NonTrivial), via ptr as non-trivial
1192 1000048c: 4b ff ff 71 bl 100003fc <f2> ; call f2(struct NonTrivial)
1193 10000490: 81 3f 00 08 lwz r9,8(r31) ;
1194 10000494: 38 09 ff f4 addi r0,r9,-12 ;
1195 10000498: 90 1f 00 08 stw r0,8(r31) ;
1196 1000049c: 81 61 00 00 lwz r11,0(r1) ;
1197 100004a0: 80 0b 00 04 lwz r0,4(r11) ;
1198 100004a4: 7c 08 03 a6 mtlr r0 ;
1199 100004a8: 83 eb ff fc lwz r31,-4(r11) ;
1200 100004ac: 7d 61 5b 78 mr r1,r11 ;
1201 100004b0: 4e 80 00 20 blr ;
1202
1203 ; ... snip, removed code of ctor and copy ctor ...
1204
1205
1206
1117 ; vim: ft=asm68k 1207 ; vim: ft=asm68k
1118 1208