comparison doc/disas_examples/sparc64.sparc64.disas @ 475:5be9f5ccdd35

- doc: ppc64 clarifications
author Tassilo Philipp
date Sat, 19 Feb 2022 19:27:22 +0100
parents c9e19249ecd3
children c73c59c8b553
comparison
equal deleted inserted replaced
474:c9e19249ecd3 475:5be9f5ccdd35
998 58: 9d e3 bf 10 save %sp, -240, %sp ; prolog 998 58: 9d e3 bf 10 save %sp, -240, %sp ; prolog
999 5c: 2f 00 00 00 sethi %hi(0), %l7 ; | 999 5c: 2f 00 00 00 sethi %hi(0), %l7 ; |
1000 60: ae 05 e0 00 add %l7, 0, %l7 ! 0 <leaf_call> ; | @@@ unsure, call to some code stub adding o7 to l7 1000 60: ae 05 e0 00 add %l7, 0, %l7 ! 0 <leaf_call> ; | @@@ unsure, call to some code stub adding o7 to l7
1001 64: 7f ff ff fa call 4c <leaf_call+0x4c> ; | 1001 64: 7f ff ff fa call 4c <leaf_call+0x4c> ; |
1002 68: 01 00 00 00 nop ; / 1002 68: 01 00 00 00 nop ; /
1003 ; leaf_call((struct A){0,1.f}, (struct B){2.f,3}, (struct C){4.f,5,6}, (struct D){7,8.f});
1004 6c: c0 27 a7 df clr [ %fp + 0x7df ] ; \ 1003 6c: c0 27 a7 df clr [ %fp + 0x7df ] ; \
1005 70: 03 00 00 00 sethi %hi(0), %g1 ; | 1004 70: 03 00 00 00 sethi %hi(0), %g1 ; |
1006 74: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call> ; | 1005 74: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call> ; |
1007 78: c2 5d c0 01 ldx [ %l7 + %g1 ], %g1 ; | put together local struct A 1006 78: c2 5d c0 01 ldx [ %l7 + %g1 ], %g1 ; | put together local struct A
1008 7c: d1 00 40 00 ld [ %g1 ], %f8 ; | 1007 7c: d1 00 40 00 ld [ %g1 ], %f8 ; |
1051 128: 82 10 20 00 clr %g1 ! 0 <leaf_call> ; \ 1050 128: 82 10 20 00 clr %g1 ! 0 <leaf_call> ; \
1052 12c: 83 38 60 00 sra %g1, 0, %g1 ; / return value 1051 12c: 83 38 60 00 sra %g1, 0, %g1 ; / return value
1053 130: b0 10 00 01 mov %g1, %i0 ; \ 1052 130: b0 10 00 01 mov %g1, %i0 ; \
1054 134: 81 cf e0 08 rett %i7 + 8 ; | epilog 1053 134: 81 cf e0 08 rett %i7 + 8 ; | epilog
1055 138: 01 00 00 00 nop ; | branch delay slot 1054 138: 01 00 00 00 nop ; | branch delay slot
1055
1056
1057
1058 ; ---------- passing structs with only fp parts ---------->
1059 ;
1060 ; struct A { float a; };
1061 ; struct B { float a, b; };
1062 ; struct C { float a, b, c; };
1063 ; struct D { double a; };
1064 ; struct E { double a, b; };
1065 ; struct F { double a, b, c; };
1066 ;
1067 ; void leaf_call(struct A a, struct B b, struct C c, struct D d, struct E e, struct F f)
1068 ; {
1069 ; }
1070 ;
1071 ; int main()
1072 ; {
1073 ; leaf_call((struct A){1.f}, (struct B){2.f,3.f}, (struct C){4.f,5.f,6.f}, (struct D){1.}, (struct E){2.,3.}, (struct F){4.,5.,6.});
1074 ; return 0;
1075 ; }
1076
1077
1078
1079 ; output from openbsd-6.0-sparc64 w/ gcc 4.2.1
1080
1081 0000000000000000 <leaf_call>:
1082 0: 9d e3 bf 30 save %sp, -208, %sp
1083 4: c1 27 a8 7f st %f0, [ %fp + 0x87f ]
1084 8: 9d a0 00 22 fmovs %f2, %f14
1085 c: 9f a0 00 23 fmovs %f3, %f15
1086 10: a1 a0 00 24 fmovs %f4, %f16
1087 14: a3 a0 00 25 fmovs %f5, %f17
1088 18: a5 a0 00 26 fmovs %f6, %f18
1089 1c: d1 3f a8 9f std %f8, [ %fp + 0x89f ]
1090 20: 91 a0 00 4a fmovd %f10, %f8
1091 24: 95 a0 00 4c fmovd %f12, %f10
1092 28: d1 3f a8 a7 std %f8, [ %fp + 0x8a7 ]
1093 2c: d5 3f a8 af std %f10, [ %fp + 0x8af ]
1094 30: dd 27 a8 87 st %f14, [ %fp + 0x887 ]
1095 34: df 27 a8 8b st %f15, [ %fp + 0x88b ]
1096 38: e1 27 a8 8f st %f16, [ %fp + 0x88f ]
1097 3c: e3 27 a8 93 st %f17, [ %fp + 0x893 ]
1098 40: e5 27 a8 97 st %f18, [ %fp + 0x897 ]
1099 44: 81 cf e0 08 rett %i7 + 8
1100 48: 01 00 00 00 nop
1101 4c: ae 03 c0 17 add %o7, %l7, %l7
1102 50: 81 c3 e0 08 retl
1103 54: 01 00 00 00 nop
1104
1105 0000000000000058 <main>:
1106 58: 9d e3 be b0 save %sp, -336, %sp ; prolog
1107 5c: 2f 00 00 00 sethi %hi(0), %l7 ; |
1108 60: ae 05 e0 00 add %l7, 0, %l7 ! 0 <leaf_call> ; | @@@ unsure, call to some code stub adding o7 to l7
1109 64: 7f ff ff fa call 4c <leaf_call+0x4c> ; |
1110 68: 01 00 00 00 nop ; /
1111 6c: 03 00 00 00 sethi %hi(0), %g1 ; \
1112 70: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call> ; |
1113 74: c2 5d c0 01 ldx [ %l7 + %g1 ], %g1 ; | put together local struct A
1114 78: d1 00 40 00 ld [ %g1 ], %f8 ; |
1115 7c: d1 27 a7 e3 st %f8, [ %fp + 0x7e3 ] ; /
1116 80: 03 00 00 00 sethi %hi(0), %g1 ; \
1117 84: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call> ; |
1118 88: c2 5d c0 01 ldx [ %l7 + %g1 ], %g1 ; |
1119 8c: d1 00 40 00 ld [ %g1 ], %f8 ; |
1120 90: d1 27 a7 db st %f8, [ %fp + 0x7db ] ; |
1121 94: 03 00 00 00 sethi %hi(0), %g1 ; | put together local struct B
1122 98: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call> ; |
1123 9c: c2 5d c0 01 ldx [ %l7 + %g1 ], %g1 ; |
1124 a0: d1 00 40 00 ld [ %g1 ], %f8 ; |
1125 a4: d1 27 a7 df st %f8, [ %fp + 0x7df ] ; /
1126 a8: 03 00 00 00 sethi %hi(0), %g1 ; \
1127 ac: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call> ; |
1128 b0: c2 5d c0 01 ldx [ %l7 + %g1 ], %g1 ; |
1129 b4: d1 00 40 00 ld [ %g1 ], %f8 ; |
1130 b8: d1 27 a7 c3 st %f8, [ %fp + 0x7c3 ] ; |
1131 bc: 03 00 00 00 sethi %hi(0), %g1 ; |
1132 c0: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call> ; |
1133 c4: c2 5d c0 01 ldx [ %l7 + %g1 ], %g1 ; |
1134 c8: d1 00 40 00 ld [ %g1 ], %f8 ; | put together local struct C
1135 cc: d1 27 a7 c7 st %f8, [ %fp + 0x7c7 ] ; |
1136 d0: 03 00 00 00 sethi %hi(0), %g1 ; |
1137 d4: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call> ; |
1138 d8: c2 5d c0 01 ldx [ %l7 + %g1 ], %g1 ; |
1139 dc: d1 00 40 00 ld [ %g1 ], %f8 ; |
1140 e0: d1 27 a7 cb st %f8, [ %fp + 0x7cb ] ; /
1141 e4: 03 00 00 00 sethi %hi(0), %g1 ; \
1142 e8: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call> ; |
1143 ec: c2 5d c0 01 ldx [ %l7 + %g1 ], %g1 ; | put together local struct D
1144 f0: d1 18 40 00 ldd [ %g1 ], %f8 ; |
1145 f4: d1 3f a7 cf std %f8, [ %fp + 0x7cf ] ; /
1146 f8: 03 00 00 00 sethi %hi(0), %g1 ; \
1147 fc: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call> ; |
1148 100: c2 5d c0 01 ldx [ %l7 + %g1 ], %g1 ; |
1149 104: d1 18 40 00 ldd [ %g1 ], %f8 ; |
1150 108: d1 3f a7 af std %f8, [ %fp + 0x7af ] ; |
1151 10c: 03 00 00 00 sethi %hi(0), %g1 ; | put together local struct E
1152 110: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call> ; |
1153 114: c2 5d c0 01 ldx [ %l7 + %g1 ], %g1 ; |
1154 118: d1 18 40 00 ldd [ %g1 ], %f8 ; |
1155 11c: d1 3f a7 b7 std %f8, [ %fp + 0x7b7 ] ; /
1156 120: 03 00 00 00 sethi %hi(0), %g1 ; \
1157 124: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call> ; |
1158 128: c2 5d c0 01 ldx [ %l7 + %g1 ], %g1 ; |
1159 12c: d1 18 40 00 ldd [ %g1 ], %f8 ; |
1160 130: d1 3f a7 97 std %f8, [ %fp + 0x797 ] ; |
1161 134: 03 00 00 00 sethi %hi(0), %g1 ; |
1162 138: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call> ; |
1163 13c: c2 5d c0 01 ldx [ %l7 + %g1 ], %g1 ; |
1164 140: d1 18 40 00 ldd [ %g1 ], %f8 ; | put together local struct F
1165 144: d1 3f a7 9f std %f8, [ %fp + 0x79f ] ; |
1166 148: 03 00 00 00 sethi %hi(0), %g1 ; |
1167 14c: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call> ; |
1168 150: c2 5d c0 01 ldx [ %l7 + %g1 ], %g1 ; |
1169 154: d1 18 40 00 ldd [ %g1 ], %f8 ; |
1170 158: d1 3f a7 a7 std %f8, [ %fp + 0x7a7 ] ; /
1171 15c: c2 5f a7 97 ldx [ %fp + 0x797 ], %g1 ; \
1172 160: c2 77 a7 6f stx %g1, [ %fp + 0x76f ] ; |
1173 164: c2 5f a7 9f ldx [ %fp + 0x79f ], %g1 ; | prep arg 5 (struct F, copied entirely onto stack, as > 16b, to pass indirectly)
1174 168: c2 77 a7 77 stx %g1, [ %fp + 0x777 ] ; |
1175 16c: c2 5f a7 a7 ldx [ %fp + 0x7a7 ], %g1 ; |
1176 170: c2 77 a7 7f stx %g1, [ %fp + 0x77f ] ; /
1177 174: d1 07 a7 e3 ld [ %fp + 0x7e3 ], %f8 ; prep arg 0 (struct A)
1178 178: d3 07 a7 db ld [ %fp + 0x7db ], %f9 ; \
1179 17c: dd 07 a7 df ld [ %fp + 0x7df ], %f14 ; / prep arg 1 (struct B)
1180 180: df 07 a7 c3 ld [ %fp + 0x7c3 ], %f15 ; \
1181 184: e1 07 a7 c7 ld [ %fp + 0x7c7 ], %f16 ; | prep arg 2 (struct C)
1182 188: e3 07 a7 cb ld [ %fp + 0x7cb ], %f17 ; /
1183 18c: e5 1f a7 cf ldd [ %fp + 0x7cf ], %f18 ; prep arg 3 (struct D)
1184 190: 82 07 a7 6f add %fp, 0x76f, %g1 ; \
1185 194: c2 73 a8 b7 stx %g1, [ %sp + 0x8b7 ] ; / arg 5 (struct F, passed indirectly as ptr to copy; via stack as all %o* regs already skipped)
1186 198: c2 5f a7 b7 ldx [ %fp + 0x7b7 ], %g1 ; @@@ unsure ...
1187 19c: c2 73 a8 af stx %g1, [ %sp + 0x8af ] ; @@@ ... last float of struct E pushed onto stack (maybe register save area? maybe for some iteration facilitation?)
1188 1a0: d5 1f a7 af ldd [ %fp + 0x7af ], %f10 ; \ arg 4 (struct E) first double
1189 1a4: d9 1f a7 b7 ldd [ %fp + 0x7b7 ], %f12 ; / second double
1190 1a8: 81 a0 00 28 fmovs %f8, %f0 ; arg 0 (entire struct A, takes full %d0 slot despite not being 64bit, as only field of struct)
1191 1ac: 85 a0 00 29 fmovs %f9, %f2 ; \ arg 1 (struct B) first float
1192 1b0: 87 a0 00 2e fmovs %f14, %f3 ; / second float
1193 1b4: 89 a0 00 2f fmovs %f15, %f4 ; \ first float
1194 1b8: 8b a0 00 30 fmovs %f16, %f5 ; | arg 2 (struct C) second float
1195 1bc: 8d a0 00 31 fmovs %f17, %f6 ; / third float
1196 1c0: 91 a0 00 52 fmovd %f18, %f8 ; arg 3 (entire struct D, single field double)
1197 1c4: 40 00 00 00 call 1c4 <main+0x16c> ; call nonleaf_call (objdump not from final link but .o)
1198 1c8: 01 00 00 00 nop ; branch delay slot
1199 1cc: 82 10 20 00 clr %g1 ! 0 <leaf_call> ; \
1200 1d0: 83 38 60 00 sra %g1, 0, %g1 ; / return value
1201 1d4: b0 10 00 01 mov %g1, %i0 ; \
1202 1d8: 81 cf e0 08 rett %i7 + 8 ; | epilog
1203 1dc: 01 00 00 00 nop ; | branch delay slot
1204
1205
1206
1207 ; ---------- passing only unions with only fp parts ---------->
1208 ;
1209 ; union A { float a; };
1210 ; union B { float a, b; };
1211 ; union C { float a, b, c; };
1212 ; union D { double a; };
1213 ; union E { double a, b; };
1214 ; union F { double a, b, c; };
1215 ;
1216 ; void leaf_call(union A a, union B b, union C c, union D d, union E e, union F f)
1217 ; {
1218 ; }
1219 ;
1220 ; int main()
1221 ; {
1222 ; leaf_call((union A){1.f}, (union B){2.f,3.f}, (union C){4.f,5.f,6.f}, (union D){1.}, (union E){2.,3.}, (union F){4.,5.,6.});
1223 ; return 0;
1224 ; }
1225
1226
1227
1228 ; output from openbsd-6.0-sparc64 w/ gcc 4.2.1
1229
1230 0000000000000000 <leaf_call>:
1231 0: 9d e3 bf 30 save %sp, -208, %sp
1232 4: 84 10 00 18 mov %i0, %g2
1233 8: 86 10 00 19 mov %i1, %g3
1234 c: 88 10 00 1a mov %i2, %g4
1235 10: f6 77 a8 97 stx %i3, [ %fp + 0x897 ]
1236 14: f8 77 a8 9f stx %i4, [ %fp + 0x89f ]
1237 18: fa 77 a8 a7 stx %i5, [ %fp + 0x8a7 ]
1238 1c: 85 38 b0 20 srax %g2, 0x20, %g2
1239 20: c2 07 a8 7f ld [ %fp + 0x87f ], %g1
1240 24: 82 08 60 00 and %g1, 0, %g1
1241 28: 82 10 40 02 or %g1, %g2, %g1
1242 2c: c2 27 a8 7f st %g1, [ %fp + 0x87f ]
1243 30: 87 38 f0 20 srax %g3, 0x20, %g3
1244 34: c2 07 a8 87 ld [ %fp + 0x887 ], %g1
1245 38: 82 08 60 00 and %g1, 0, %g1
1246 3c: 82 10 40 03 or %g1, %g3, %g1
1247 40: c2 27 a8 87 st %g1, [ %fp + 0x887 ]
1248 44: 89 39 30 20 srax %g4, 0x20, %g4
1249 48: c2 07 a8 8f ld [ %fp + 0x88f ], %g1
1250 4c: 82 08 60 00 and %g1, 0, %g1
1251 50: 82 10 40 04 or %g1, %g4, %g1
1252 54: c2 27 a8 8f st %g1, [ %fp + 0x88f ]
1253 58: 81 cf e0 08 rett %i7 + 8
1254 5c: 01 00 00 00 nop
1255 60: ae 03 c0 17 add %o7, %l7, %l7
1256 64: 81 c3 e0 08 retl
1257 68: 01 00 00 00 nop
1258
1259 000000000000006c <main>:
1260 6c: 9d e3 bf 10 save %sp, -240, %sp ; prolog
1261 70: 2f 00 00 00 sethi %hi(0), %l7 ; |
1262 74: ae 05 e0 00 add %l7, 0, %l7 ! 0 <leaf_call> ; | @@@ unsure, call to some code stub adding o7 to l7
1263 78: 7f ff ff fa call 60 <leaf_call+0x60> ; |
1264 7c: 01 00 00 00 nop ; /
1265 80: 03 00 00 00 sethi %hi(0), %g1 ; \
1266 84: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call> ; |
1267 88: c2 5d c0 01 ldx [ %l7 + %g1 ], %g1 ; | put together local union A
1268 8c: d1 00 40 00 ld [ %g1 ], %f8 ; |
1269 90: d1 27 a7 e3 st %f8, [ %fp + 0x7e3 ] ; /
1270 94: 03 00 00 00 sethi %hi(0), %g1 ; \
1271 98: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call> ; |
1272 9c: c2 5d c0 01 ldx [ %l7 + %g1 ], %g1 ; | put together local union B (only writes one val)
1273 a0: d1 00 40 00 ld [ %g1 ], %f8 ; |
1274 a4: d1 27 a7 df st %f8, [ %fp + 0x7df ] ; /
1275 a8: 03 00 00 00 sethi %hi(0), %g1 ; \
1276 ac: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call> ; |
1277 b0: c2 5d c0 01 ldx [ %l7 + %g1 ], %g1 ; | put together local union C (only writes one val)
1278 b4: d1 00 40 00 ld [ %g1 ], %f8 ; |
1279 b8: d1 27 a7 db st %f8, [ %fp + 0x7db ] ; /
1280 bc: 03 00 00 00 sethi %hi(0), %g1 ; \
1281 c0: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call> ; |
1282 c4: c2 5d c0 01 ldx [ %l7 + %g1 ], %g1 ; | put together local union D
1283 c8: d1 18 40 00 ldd [ %g1 ], %f8 ; |
1284 cc: d1 3f a7 cf std %f8, [ %fp + 0x7cf ] ; /
1285 d0: 03 00 00 00 sethi %hi(0), %g1 ; \
1286 d4: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call> ; |
1287 d8: c2 5d c0 01 ldx [ %l7 + %g1 ], %g1 ; | put together local union A (only writes one val)
1288 dc: d1 18 40 00 ldd [ %g1 ], %f8 ; |
1289 e0: d1 3f a7 c7 std %f8, [ %fp + 0x7c7 ] ; /
1290 e4: 03 00 00 00 sethi %hi(0), %g1 ; \
1291 e8: 82 10 60 00 mov %g1, %g1 ! 0 <leaf_call> ; |
1292 ec: c2 5d c0 01 ldx [ %l7 + %g1 ], %g1 ; | put together local union A (only writes one val)
1293 f0: d1 18 40 00 ldd [ %g1 ], %f8 ; |
1294 f4: d1 3f a7 bf std %f8, [ %fp + 0x7bf ] ; /
1295 f8: c2 07 a7 e3 ld [ %fp + 0x7e3 ], %g1 ; \
1296 fc: 87 30 60 00 srl %g1, 0, %g3 ; | prep arg 0
1297 100: 87 28 f0 20 sllx %g3, 0x20, %g3 ; / left-justify
1298 104: c2 5f a7 df ldx [ %fp + 0x7df ], %g1 ; \
1299 108: 85 30 70 20 srlx %g1, 0x20, %g2 ; | prep arg 1
1300 10c: 85 28 b0 20 sllx %g2, 0x20, %g2 ; /
1301 110: c2 07 a7 db ld [ %fp + 0x7db ], %g1 ; \
1302 114: 83 30 60 00 srl %g1, 0, %g1 ; | prep arg 2
1303 118: 83 28 70 20 sllx %g1, 0x20, %g1 ; /
1304 11c: c8 5f a7 cf ldx [ %fp + 0x7cf ], %g4 ; prep arg 3 | a bit pointless, could be written
1305 120: ca 5f a7 c7 ldx [ %fp + 0x7c7 ], %g5 ; prep arg 4 | directly to %o3 and %o4
1306 124: da 5f a7 bf ldx [ %fp + 0x7bf ], %o5 ; arg 5
1307 128: 90 10 00 03 mov %g3, %o0 ; arg 0 |
1308 12c: 92 10 00 02 mov %g2, %o1 ; arg 1 | note: all left-justified
1309 130: 94 10 00 01 mov %g1, %o2 ; arg 2 |
1310 134: 96 10 00 04 mov %g4, %o3 ; arg 3
1311 138: 98 10 00 05 mov %g5, %o4 ; arg 4
1312 13c: 40 00 00 00 call 13c <main+0xd0> ; call nonleaf_call (objdump not from final link but .o)
1313 140: 01 00 00 00 nop ; branch delay slot
1314 144: 82 10 20 00 clr %g1 ! 0 <leaf_call> ; \
1315 148: 83 38 60 00 sra %g1, 0, %g1 ; / return value
1316 14c: b0 10 00 01 mov %g1, %i0 ; \
1317 150: 81 cf e0 08 rett %i7 + 8 ; | epilog
1318 154: 01 00 00 00 nop ; | branch delay slot
1056 1319
1057 1320
1058 1321
1059 ; ---------- returning structs by value ----------> 1322 ; ---------- returning structs by value ---------->
1060 ; 1323 ;