@@ -1127,3 +1127,268 @@ define ptr @postidx_clobber(ptr %addr) nounwind noinline ssp {
1127
1127
%newaddr = getelementptr i64 , ptr %addr , i32 1
1128
1128
ret ptr %newaddr
1129
1129
}
1130
+
1131
+ define ptr @preidx32_sb (ptr %src , ptr %out ) {
1132
+ ; CHECK64-LABEL: preidx32_sb:
1133
+ ; CHECK64: ; %bb.0:
1134
+ ; CHECK64-NEXT: ldrsb w8, [x0, #1]!
1135
+ ; CHECK64-NEXT: str w8, [x1]
1136
+ ; CHECK64-NEXT: ret
1137
+ ;
1138
+ ; GISEL-LABEL: preidx32_sb:
1139
+ ; GISEL: ; %bb.0:
1140
+ ; GISEL-NEXT: add x8, x0, #1
1141
+ ; GISEL-NEXT: ldrsb w9, [x0, #1]
1142
+ ; GISEL-NEXT: mov x0, x8
1143
+ ; GISEL-NEXT: str w9, [x1]
1144
+ ; GISEL-NEXT: ret
1145
+ ;
1146
+ ; CHECK32-LABEL: preidx32_sb:
1147
+ ; CHECK32: ; %bb.0:
1148
+ ; CHECK32-NEXT: ldrsb w8, [x0, #1]!
1149
+ ; CHECK32-NEXT: str w8, [x1]
1150
+ ; CHECK32-NEXT: ret
1151
+ %ptr = getelementptr inbounds i8 , ptr %src , i64 1
1152
+ %tmp = load i8 , ptr %ptr , align 1
1153
+ %sext = sext i8 %tmp to i32
1154
+ store i32 %sext , ptr %out , align 4
1155
+ ret ptr %ptr
1156
+ }
1157
+
1158
+ define ptr @preidx32_sh (ptr %src , ptr %out ) {
1159
+ ; CHECK64-LABEL: preidx32_sh:
1160
+ ; CHECK64: ; %bb.0:
1161
+ ; CHECK64-NEXT: ldrsh w8, [x0, #2]!
1162
+ ; CHECK64-NEXT: str w8, [x1]
1163
+ ; CHECK64-NEXT: ret
1164
+ ;
1165
+ ; GISEL-LABEL: preidx32_sh:
1166
+ ; GISEL: ; %bb.0:
1167
+ ; GISEL-NEXT: add x8, x0, #2
1168
+ ; GISEL-NEXT: ldrsh w9, [x0, #2]
1169
+ ; GISEL-NEXT: mov x0, x8
1170
+ ; GISEL-NEXT: str w9, [x1]
1171
+ ; GISEL-NEXT: ret
1172
+ ;
1173
+ ; CHECK32-LABEL: preidx32_sh:
1174
+ ; CHECK32: ; %bb.0:
1175
+ ; CHECK32-NEXT: ldrsh w8, [x0, #2]!
1176
+ ; CHECK32-NEXT: str w8, [x1]
1177
+ ; CHECK32-NEXT: ret
1178
+ %ptr = getelementptr inbounds i16 , ptr %src , i64 1
1179
+ %tmp = load i16 , ptr %ptr , align 2
1180
+ %sext = sext i16 %tmp to i32
1181
+ store i32 %sext , ptr %out , align 4
1182
+ ret ptr %ptr
1183
+ }
1184
+
1185
+ define ptr @preidx64_sb (ptr %src , ptr %out ) {
1186
+ ; CHECK64-LABEL: preidx64_sb:
1187
+ ; CHECK64: ; %bb.0:
1188
+ ; CHECK64-NEXT: ldrsb x8, [x0, #1]!
1189
+ ; CHECK64-NEXT: str x8, [x1]
1190
+ ; CHECK64-NEXT: ret
1191
+ ;
1192
+ ; GISEL-LABEL: preidx64_sb:
1193
+ ; GISEL: ; %bb.0:
1194
+ ; GISEL-NEXT: add x8, x0, #1
1195
+ ; GISEL-NEXT: ldrsb x9, [x0, #1]
1196
+ ; GISEL-NEXT: mov x0, x8
1197
+ ; GISEL-NEXT: str x9, [x1]
1198
+ ; GISEL-NEXT: ret
1199
+ ;
1200
+ ; CHECK32-LABEL: preidx64_sb:
1201
+ ; CHECK32: ; %bb.0:
1202
+ ; CHECK32-NEXT: ldrsb x8, [x0, #1]!
1203
+ ; CHECK32-NEXT: str x8, [x1]
1204
+ ; CHECK32-NEXT: ret
1205
+ %ptr = getelementptr inbounds i8 , ptr %src , i64 1
1206
+ %tmp = load i8 , ptr %ptr , align 1
1207
+ %sext = sext i8 %tmp to i64
1208
+ store i64 %sext , ptr %out , align 8
1209
+ ret ptr %ptr
1210
+ }
1211
+
1212
+ define ptr @preidx64_sh (ptr %src , ptr %out ) {
1213
+ ; CHECK64-LABEL: preidx64_sh:
1214
+ ; CHECK64: ; %bb.0:
1215
+ ; CHECK64-NEXT: ldrsh x8, [x0, #2]!
1216
+ ; CHECK64-NEXT: str x8, [x1]
1217
+ ; CHECK64-NEXT: ret
1218
+ ;
1219
+ ; GISEL-LABEL: preidx64_sh:
1220
+ ; GISEL: ; %bb.0:
1221
+ ; GISEL-NEXT: add x8, x0, #2
1222
+ ; GISEL-NEXT: ldrsh x9, [x0, #2]
1223
+ ; GISEL-NEXT: mov x0, x8
1224
+ ; GISEL-NEXT: str x9, [x1]
1225
+ ; GISEL-NEXT: ret
1226
+ ;
1227
+ ; CHECK32-LABEL: preidx64_sh:
1228
+ ; CHECK32: ; %bb.0:
1229
+ ; CHECK32-NEXT: ldrsh x8, [x0, #2]!
1230
+ ; CHECK32-NEXT: str x8, [x1]
1231
+ ; CHECK32-NEXT: ret
1232
+ %ptr = getelementptr inbounds i16 , ptr %src , i64 1
1233
+ %tmp = load i16 , ptr %ptr , align 2
1234
+ %sext = sext i16 %tmp to i64
1235
+ store i64 %sext , ptr %out , align 8
1236
+ ret ptr %ptr
1237
+ }
1238
+
1239
+ define ptr @preidx64_sw (ptr %src , ptr %out ) {
1240
+ ; CHECK64-LABEL: preidx64_sw:
1241
+ ; CHECK64: ; %bb.0:
1242
+ ; CHECK64-NEXT: ldrsw x8, [x0, #4]!
1243
+ ; CHECK64-NEXT: str x8, [x1]
1244
+ ; CHECK64-NEXT: ret
1245
+ ;
1246
+ ; GISEL-LABEL: preidx64_sw:
1247
+ ; GISEL: ; %bb.0:
1248
+ ; GISEL-NEXT: add x8, x0, #4
1249
+ ; GISEL-NEXT: ldrsw x9, [x0, #4]
1250
+ ; GISEL-NEXT: mov x0, x8
1251
+ ; GISEL-NEXT: str x9, [x1]
1252
+ ; GISEL-NEXT: ret
1253
+ ;
1254
+ ; CHECK32-LABEL: preidx64_sw:
1255
+ ; CHECK32: ; %bb.0:
1256
+ ; CHECK32-NEXT: ldrsw x8, [x0, #4]!
1257
+ ; CHECK32-NEXT: str x8, [x1]
1258
+ ; CHECK32-NEXT: ret
1259
+ %ptr = getelementptr inbounds i32 , ptr %src , i64 1
1260
+ %tmp = load i32 , ptr %ptr , align 2
1261
+ %sext = sext i32 %tmp to i64
1262
+ store i64 %sext , ptr %out , align 8
1263
+ ret ptr %ptr
1264
+ }
1265
+
1266
+ define ptr @postidx32_sb (ptr %src , ptr %out ) {
1267
+ ; CHECK64-LABEL: postidx32_sb:
1268
+ ; CHECK64: ; %bb.0:
1269
+ ; CHECK64-NEXT: ldrsb w8, [x0], #1
1270
+ ; CHECK64-NEXT: str w8, [x1]
1271
+ ; CHECK64-NEXT: ret
1272
+ ;
1273
+ ; GISEL-LABEL: postidx32_sb:
1274
+ ; GISEL: ; %bb.0:
1275
+ ; GISEL-NEXT: ldrsb w8, [x0]
1276
+ ; GISEL-NEXT: add x0, x0, #1
1277
+ ; GISEL-NEXT: str w8, [x1]
1278
+ ; GISEL-NEXT: ret
1279
+ ;
1280
+ ; CHECK32-LABEL: postidx32_sb:
1281
+ ; CHECK32: ; %bb.0:
1282
+ ; CHECK32-NEXT: ldrsb w8, [x0], #1
1283
+ ; CHECK32-NEXT: str w8, [x1]
1284
+ ; CHECK32-NEXT: ret
1285
+ %tmp = load i8 , ptr %src , align 1
1286
+ %ptr = getelementptr inbounds i8 , ptr %src , i64 1
1287
+ %sext = sext i8 %tmp to i32
1288
+ store i32 %sext , ptr %out , align 4
1289
+ ret ptr %ptr
1290
+ }
1291
+
1292
+ define ptr @postidx32_sh (ptr %src , ptr %out ) {
1293
+ ; CHECK64-LABEL: postidx32_sh:
1294
+ ; CHECK64: ; %bb.0:
1295
+ ; CHECK64-NEXT: ldrsh w8, [x0], #2
1296
+ ; CHECK64-NEXT: str w8, [x1]
1297
+ ; CHECK64-NEXT: ret
1298
+ ;
1299
+ ; GISEL-LABEL: postidx32_sh:
1300
+ ; GISEL: ; %bb.0:
1301
+ ; GISEL-NEXT: ldrsh w8, [x0]
1302
+ ; GISEL-NEXT: add x0, x0, #2
1303
+ ; GISEL-NEXT: str w8, [x1]
1304
+ ; GISEL-NEXT: ret
1305
+ ;
1306
+ ; CHECK32-LABEL: postidx32_sh:
1307
+ ; CHECK32: ; %bb.0:
1308
+ ; CHECK32-NEXT: ldrsh w8, [x0], #2
1309
+ ; CHECK32-NEXT: str w8, [x1]
1310
+ ; CHECK32-NEXT: ret
1311
+ %tmp = load i16 , ptr %src , align 2
1312
+ %ptr = getelementptr inbounds i16 , ptr %src , i64 1
1313
+ %sext = sext i16 %tmp to i32
1314
+ store i32 %sext , ptr %out , align 4
1315
+ ret ptr %ptr
1316
+ }
1317
+
1318
+ define ptr @postidx64_sb (ptr %src , ptr %out ) {
1319
+ ; CHECK64-LABEL: postidx64_sb:
1320
+ ; CHECK64: ; %bb.0:
1321
+ ; CHECK64-NEXT: ldrsb x8, [x0], #1
1322
+ ; CHECK64-NEXT: str x8, [x1]
1323
+ ; CHECK64-NEXT: ret
1324
+ ;
1325
+ ; GISEL-LABEL: postidx64_sb:
1326
+ ; GISEL: ; %bb.0:
1327
+ ; GISEL-NEXT: ldrsb x8, [x0]
1328
+ ; GISEL-NEXT: add x0, x0, #1
1329
+ ; GISEL-NEXT: str x8, [x1]
1330
+ ; GISEL-NEXT: ret
1331
+ ;
1332
+ ; CHECK32-LABEL: postidx64_sb:
1333
+ ; CHECK32: ; %bb.0:
1334
+ ; CHECK32-NEXT: ldrsb x8, [x0], #1
1335
+ ; CHECK32-NEXT: str x8, [x1]
1336
+ ; CHECK32-NEXT: ret
1337
+ %tmp = load i8 , ptr %src , align 1
1338
+ %ptr = getelementptr inbounds i8 , ptr %src , i64 1
1339
+ %sext = sext i8 %tmp to i64
1340
+ store i64 %sext , ptr %out , align 8
1341
+ ret ptr %ptr
1342
+ }
1343
+
1344
+ define ptr @postidx64_sh (ptr %src , ptr %out ) {
1345
+ ; CHECK64-LABEL: postidx64_sh:
1346
+ ; CHECK64: ; %bb.0:
1347
+ ; CHECK64-NEXT: ldrsh x8, [x0], #2
1348
+ ; CHECK64-NEXT: str x8, [x1]
1349
+ ; CHECK64-NEXT: ret
1350
+ ;
1351
+ ; GISEL-LABEL: postidx64_sh:
1352
+ ; GISEL: ; %bb.0:
1353
+ ; GISEL-NEXT: ldrsh x8, [x0]
1354
+ ; GISEL-NEXT: add x0, x0, #2
1355
+ ; GISEL-NEXT: str x8, [x1]
1356
+ ; GISEL-NEXT: ret
1357
+ ;
1358
+ ; CHECK32-LABEL: postidx64_sh:
1359
+ ; CHECK32: ; %bb.0:
1360
+ ; CHECK32-NEXT: ldrsh x8, [x0], #2
1361
+ ; CHECK32-NEXT: str x8, [x1]
1362
+ ; CHECK32-NEXT: ret
1363
+ %tmp = load i16 , ptr %src , align 2
1364
+ %ptr = getelementptr inbounds i16 , ptr %src , i64 1
1365
+ %sext = sext i16 %tmp to i64
1366
+ store i64 %sext , ptr %out , align 8
1367
+ ret ptr %ptr
1368
+ }
1369
+
1370
+ define ptr @postidx64_sw (ptr %src , ptr %out ) {
1371
+ ; CHECK64-LABEL: postidx64_sw:
1372
+ ; CHECK64: ; %bb.0:
1373
+ ; CHECK64-NEXT: ldrsw x8, [x0], #4
1374
+ ; CHECK64-NEXT: str x8, [x1]
1375
+ ; CHECK64-NEXT: ret
1376
+ ;
1377
+ ; GISEL-LABEL: postidx64_sw:
1378
+ ; GISEL: ; %bb.0:
1379
+ ; GISEL-NEXT: ldrsw x8, [x0]
1380
+ ; GISEL-NEXT: add x0, x0, #4
1381
+ ; GISEL-NEXT: str x8, [x1]
1382
+ ; GISEL-NEXT: ret
1383
+ ;
1384
+ ; CHECK32-LABEL: postidx64_sw:
1385
+ ; CHECK32: ; %bb.0:
1386
+ ; CHECK32-NEXT: ldrsw x8, [x0], #4
1387
+ ; CHECK32-NEXT: str x8, [x1]
1388
+ ; CHECK32-NEXT: ret
1389
+ %tmp = load i32 , ptr %src , align 4
1390
+ %ptr = getelementptr inbounds i32 , ptr %src , i64 1
1391
+ %sext = sext i32 %tmp to i64
1392
+ store i64 %sext , ptr %out , align 8
1393
+ ret ptr %ptr
1394
+ }
0 commit comments