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