@@ -1127,3 +1127,268 @@ define ptr @postidx_clobber(ptr %addr) nounwind noinline ssp {
11271127 %newaddr = getelementptr i64 , ptr %addr , i32 1
11281128 ret ptr %newaddr
11291129}
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