1079 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=aarch64 -mattr=+fullfp16,+bf16,+sve | FileCheck %s3 4define <8 x i8> @loadv8i8(ptr %p) {5; CHECK-LABEL: loadv8i8:6; CHECK: // %bb.0:7; CHECK-NEXT: ldr b0, [x0]8; CHECK-NEXT: ret9 %l = load i8, ptr %p10 %v = insertelement <8 x i8> poison, i8 %l, i32 011 ret <8 x i8> %v12}13 14define <16 x i8> @loadv16i8(ptr %p) {15; CHECK-LABEL: loadv16i8:16; CHECK: // %bb.0:17; CHECK-NEXT: ldr b0, [x0]18; CHECK-NEXT: ret19 %l = load i8, ptr %p20 %v = insertelement <16 x i8> poison, i8 %l, i32 021 ret <16 x i8> %v22}23 24define <4 x i16> @loadv4i16(ptr %p) {25; CHECK-LABEL: loadv4i16:26; CHECK: // %bb.0:27; CHECK-NEXT: ldr h0, [x0]28; CHECK-NEXT: ret29 %l = load i16, ptr %p30 %v = insertelement <4 x i16> poison, i16 %l, i32 031 ret <4 x i16> %v32}33 34define <8 x i16> @loadv8i16(ptr %p) {35; CHECK-LABEL: loadv8i16:36; CHECK: // %bb.0:37; CHECK-NEXT: ldr h0, [x0]38; CHECK-NEXT: ret39 %l = load i16, ptr %p40 %v = insertelement <8 x i16> poison, i16 %l, i32 041 ret <8 x i16> %v42}43 44define <2 x i32> @loadv2i32(ptr %p) {45; CHECK-LABEL: loadv2i32:46; CHECK: // %bb.0:47; CHECK-NEXT: ldr s0, [x0]48; CHECK-NEXT: ret49 %l = load i32, ptr %p50 %v = insertelement <2 x i32> poison, i32 %l, i32 051 ret <2 x i32> %v52}53 54define <4 x i32> @loadv4i32(ptr %p) {55; CHECK-LABEL: loadv4i32:56; CHECK: // %bb.0:57; CHECK-NEXT: ldr s0, [x0]58; CHECK-NEXT: ret59 %l = load i32, ptr %p60 %v = insertelement <4 x i32> poison, i32 %l, i32 061 ret <4 x i32> %v62}63 64define <2 x i64> @loadv2i64(ptr %p) {65; CHECK-LABEL: loadv2i64:66; CHECK: // %bb.0:67; CHECK-NEXT: ldr d0, [x0]68; CHECK-NEXT: ret69 %l = load i64, ptr %p70 %v = insertelement <2 x i64> poison, i64 %l, i32 071 ret <2 x i64> %v72}73 74 75define <4 x half> @loadv4f16(ptr %p) {76; CHECK-LABEL: loadv4f16:77; CHECK: // %bb.0:78; CHECK-NEXT: ldr h0, [x0]79; CHECK-NEXT: ret80 %l = load half, ptr %p81 %v = insertelement <4 x half> poison, half %l, i32 082 ret <4 x half> %v83}84 85define <8 x half> @loadv8f16(ptr %p) {86; CHECK-LABEL: loadv8f16:87; CHECK: // %bb.0:88; CHECK-NEXT: ldr h0, [x0]89; CHECK-NEXT: ret90 %l = load half, ptr %p91 %v = insertelement <8 x half> poison, half %l, i32 092 ret <8 x half> %v93}94 95define <4 x bfloat> @loadv4bf16(ptr %p) {96; CHECK-LABEL: loadv4bf16:97; CHECK: // %bb.0:98; CHECK-NEXT: ldr h0, [x0]99; CHECK-NEXT: ret100 %l = load bfloat, ptr %p101 %v = insertelement <4 x bfloat> poison, bfloat %l, i32 0102 ret <4 x bfloat> %v103}104 105define <8 x bfloat> @loadv8bf16(ptr %p) {106; CHECK-LABEL: loadv8bf16:107; CHECK: // %bb.0:108; CHECK-NEXT: ldr h0, [x0]109; CHECK-NEXT: ret110 %l = load bfloat, ptr %p111 %v = insertelement <8 x bfloat> poison, bfloat %l, i32 0112 ret <8 x bfloat> %v113}114 115define <2 x float> @loadv2f32(ptr %p) {116; CHECK-LABEL: loadv2f32:117; CHECK: // %bb.0:118; CHECK-NEXT: ldr s0, [x0]119; CHECK-NEXT: ret120 %l = load float, ptr %p121 %v = insertelement <2 x float> poison, float %l, i32 0122 ret <2 x float> %v123}124 125define <4 x float> @loadv4f32(ptr %p) {126; CHECK-LABEL: loadv4f32:127; CHECK: // %bb.0:128; CHECK-NEXT: ldr s0, [x0]129; CHECK-NEXT: ret130 %l = load float, ptr %p131 %v = insertelement <4 x float> poison, float %l, i32 0132 ret <4 x float> %v133}134 135define <2 x double> @loadv2f64(ptr %p) {136; CHECK-LABEL: loadv2f64:137; CHECK: // %bb.0:138; CHECK-NEXT: ldr d0, [x0]139; CHECK-NEXT: ret140 %l = load double, ptr %p141 %v = insertelement <2 x double> poison, double %l, i32 0142 ret <2 x double> %v143}144 145 146; Unscaled147 148define <8 x i8> @loadv8i8_offset(ptr %p) {149; CHECK-LABEL: loadv8i8_offset:150; CHECK: // %bb.0:151; CHECK-NEXT: ldr b0, [x0, #1]152; CHECK-NEXT: ret153 %g = getelementptr inbounds i8, ptr %p, i64 1154 %l = load i8, ptr %g155 %v = insertelement <8 x i8> poison, i8 %l, i32 0156 ret <8 x i8> %v157}158 159define <16 x i8> @loadv16i8_offset(ptr %p) {160; CHECK-LABEL: loadv16i8_offset:161; CHECK: // %bb.0:162; CHECK-NEXT: ldr b0, [x0, #1]163; CHECK-NEXT: ret164 %g = getelementptr inbounds i8, ptr %p, i64 1165 %l = load i8, ptr %g166 %v = insertelement <16 x i8> poison, i8 %l, i32 0167 ret <16 x i8> %v168}169 170define <4 x i16> @loadv4i16_offset(ptr %p) {171; CHECK-LABEL: loadv4i16_offset:172; CHECK: // %bb.0:173; CHECK-NEXT: ldur h0, [x0, #1]174; CHECK-NEXT: ret175 %g = getelementptr inbounds i8, ptr %p, i64 1176 %l = load i16, ptr %g177 %v = insertelement <4 x i16> poison, i16 %l, i32 0178 ret <4 x i16> %v179}180 181define <8 x i16> @loadv8i16_offset(ptr %p) {182; CHECK-LABEL: loadv8i16_offset:183; CHECK: // %bb.0:184; CHECK-NEXT: ldur h0, [x0, #1]185; CHECK-NEXT: ret186 %g = getelementptr inbounds i8, ptr %p, i64 1187 %l = load i16, ptr %g188 %v = insertelement <8 x i16> poison, i16 %l, i32 0189 ret <8 x i16> %v190}191 192define <2 x i32> @loadv2i32_offset(ptr %p) {193; CHECK-LABEL: loadv2i32_offset:194; CHECK: // %bb.0:195; CHECK-NEXT: ldur s0, [x0, #1]196; CHECK-NEXT: ret197 %g = getelementptr inbounds i8, ptr %p, i64 1198 %l = load i32, ptr %g199 %v = insertelement <2 x i32> poison, i32 %l, i32 0200 ret <2 x i32> %v201}202 203define <4 x i32> @loadv4i32_offset(ptr %p) {204; CHECK-LABEL: loadv4i32_offset:205; CHECK: // %bb.0:206; CHECK-NEXT: ldur s0, [x0, #1]207; CHECK-NEXT: ret208 %g = getelementptr inbounds i8, ptr %p, i64 1209 %l = load i32, ptr %g210 %v = insertelement <4 x i32> poison, i32 %l, i32 0211 ret <4 x i32> %v212}213 214define <2 x i64> @loadv2i64_offset(ptr %p) {215; CHECK-LABEL: loadv2i64_offset:216; CHECK: // %bb.0:217; CHECK-NEXT: ldur d0, [x0, #1]218; CHECK-NEXT: ret219 %g = getelementptr inbounds i8, ptr %p, i64 1220 %l = load i64, ptr %g221 %v = insertelement <2 x i64> poison, i64 %l, i32 0222 ret <2 x i64> %v223}224 225 226define <4 x half> @loadv4f16_offset(ptr %p) {227; CHECK-LABEL: loadv4f16_offset:228; CHECK: // %bb.0:229; CHECK-NEXT: ldur h0, [x0, #1]230; CHECK-NEXT: ret231 %g = getelementptr inbounds i8, ptr %p, i64 1232 %l = load half, ptr %g233 %v = insertelement <4 x half> poison, half %l, i32 0234 ret <4 x half> %v235}236 237define <8 x half> @loadv8f16_offset(ptr %p) {238; CHECK-LABEL: loadv8f16_offset:239; CHECK: // %bb.0:240; CHECK-NEXT: ldur h0, [x0, #1]241; CHECK-NEXT: ret242 %g = getelementptr inbounds i8, ptr %p, i64 1243 %l = load half, ptr %g244 %v = insertelement <8 x half> poison, half %l, i32 0245 ret <8 x half> %v246}247 248define <4 x bfloat> @loadv4bf16_offset(ptr %p) {249; CHECK-LABEL: loadv4bf16_offset:250; CHECK: // %bb.0:251; CHECK-NEXT: ldur h0, [x0, #1]252; CHECK-NEXT: ret253 %g = getelementptr inbounds i8, ptr %p, i64 1254 %l = load bfloat, ptr %g255 %v = insertelement <4 x bfloat> poison, bfloat %l, i32 0256 ret <4 x bfloat> %v257}258 259define <8 x bfloat> @loadv8bf16_offset(ptr %p) {260; CHECK-LABEL: loadv8bf16_offset:261; CHECK: // %bb.0:262; CHECK-NEXT: ldur h0, [x0, #1]263; CHECK-NEXT: ret264 %g = getelementptr inbounds i8, ptr %p, i64 1265 %l = load bfloat, ptr %g266 %v = insertelement <8 x bfloat> poison, bfloat %l, i32 0267 ret <8 x bfloat> %v268}269 270define <2 x float> @loadv2f32_offset(ptr %p) {271; CHECK-LABEL: loadv2f32_offset:272; CHECK: // %bb.0:273; CHECK-NEXT: ldur s0, [x0, #1]274; CHECK-NEXT: ret275 %g = getelementptr inbounds i8, ptr %p, i64 1276 %l = load float, ptr %g277 %v = insertelement <2 x float> poison, float %l, i32 0278 ret <2 x float> %v279}280 281define <4 x float> @loadv4f32_offset(ptr %p) {282; CHECK-LABEL: loadv4f32_offset:283; CHECK: // %bb.0:284; CHECK-NEXT: ldur s0, [x0, #1]285; CHECK-NEXT: ret286 %g = getelementptr inbounds i8, ptr %p, i64 1287 %l = load float, ptr %g288 %v = insertelement <4 x float> poison, float %l, i32 0289 ret <4 x float> %v290}291 292define <2 x double> @loadv2f64_offset(ptr %p) {293; CHECK-LABEL: loadv2f64_offset:294; CHECK: // %bb.0:295; CHECK-NEXT: ldur d0, [x0, #1]296; CHECK-NEXT: ret297 %g = getelementptr inbounds i8, ptr %p, i64 1298 %l = load double, ptr %g299 %v = insertelement <2 x double> poison, double %l, i32 0300 ret <2 x double> %v301}302 303 304define <8 x i8> @loadv8i8_noffset(ptr %p) {305; CHECK-LABEL: loadv8i8_noffset:306; CHECK: // %bb.0:307; CHECK-NEXT: ldur b0, [x0, #-1]308; CHECK-NEXT: ret309 %g = getelementptr inbounds i8, ptr %p, i64 -1310 %l = load i8, ptr %g311 %v = insertelement <8 x i8> poison, i8 %l, i32 0312 ret <8 x i8> %v313}314 315define <16 x i8> @loadv16i8_noffset(ptr %p) {316; CHECK-LABEL: loadv16i8_noffset:317; CHECK: // %bb.0:318; CHECK-NEXT: ldur b0, [x0, #-1]319; CHECK-NEXT: ret320 %g = getelementptr inbounds i8, ptr %p, i64 -1321 %l = load i8, ptr %g322 %v = insertelement <16 x i8> poison, i8 %l, i32 0323 ret <16 x i8> %v324}325 326define <4 x i16> @loadv4i16_noffset(ptr %p) {327; CHECK-LABEL: loadv4i16_noffset:328; CHECK: // %bb.0:329; CHECK-NEXT: ldur h0, [x0, #-1]330; CHECK-NEXT: ret331 %g = getelementptr inbounds i8, ptr %p, i64 -1332 %l = load i16, ptr %g333 %v = insertelement <4 x i16> poison, i16 %l, i32 0334 ret <4 x i16> %v335}336 337define <8 x i16> @loadv8i16_noffset(ptr %p) {338; CHECK-LABEL: loadv8i16_noffset:339; CHECK: // %bb.0:340; CHECK-NEXT: ldur h0, [x0, #-1]341; CHECK-NEXT: ret342 %g = getelementptr inbounds i8, ptr %p, i64 -1343 %l = load i16, ptr %g344 %v = insertelement <8 x i16> poison, i16 %l, i32 0345 ret <8 x i16> %v346}347 348define <2 x i32> @loadv2i32_noffset(ptr %p) {349; CHECK-LABEL: loadv2i32_noffset:350; CHECK: // %bb.0:351; CHECK-NEXT: ldur s0, [x0, #-1]352; CHECK-NEXT: ret353 %g = getelementptr inbounds i8, ptr %p, i64 -1354 %l = load i32, ptr %g355 %v = insertelement <2 x i32> poison, i32 %l, i32 0356 ret <2 x i32> %v357}358 359define <4 x i32> @loadv4i32_noffset(ptr %p) {360; CHECK-LABEL: loadv4i32_noffset:361; CHECK: // %bb.0:362; CHECK-NEXT: ldur s0, [x0, #-1]363; CHECK-NEXT: ret364 %g = getelementptr inbounds i8, ptr %p, i64 -1365 %l = load i32, ptr %g366 %v = insertelement <4 x i32> poison, i32 %l, i32 0367 ret <4 x i32> %v368}369 370define <2 x i64> @loadv2i64_noffset(ptr %p) {371; CHECK-LABEL: loadv2i64_noffset:372; CHECK: // %bb.0:373; CHECK-NEXT: ldur d0, [x0, #-1]374; CHECK-NEXT: ret375 %g = getelementptr inbounds i8, ptr %p, i64 -1376 %l = load i64, ptr %g377 %v = insertelement <2 x i64> poison, i64 %l, i32 0378 ret <2 x i64> %v379}380 381 382define <4 x half> @loadv4f16_noffset(ptr %p) {383; CHECK-LABEL: loadv4f16_noffset:384; CHECK: // %bb.0:385; CHECK-NEXT: ldur h0, [x0, #-1]386; CHECK-NEXT: ret387 %g = getelementptr inbounds i8, ptr %p, i64 -1388 %l = load half, ptr %g389 %v = insertelement <4 x half> poison, half %l, i32 0390 ret <4 x half> %v391}392 393define <8 x half> @loadv8f16_noffset(ptr %p) {394; CHECK-LABEL: loadv8f16_noffset:395; CHECK: // %bb.0:396; CHECK-NEXT: ldur h0, [x0, #-1]397; CHECK-NEXT: ret398 %g = getelementptr inbounds i8, ptr %p, i64 -1399 %l = load half, ptr %g400 %v = insertelement <8 x half> poison, half %l, i32 0401 ret <8 x half> %v402}403 404define <4 x bfloat> @loadv4bf16_noffset(ptr %p) {405; CHECK-LABEL: loadv4bf16_noffset:406; CHECK: // %bb.0:407; CHECK-NEXT: ldur h0, [x0, #-1]408; CHECK-NEXT: ret409 %g = getelementptr inbounds i8, ptr %p, i64 -1410 %l = load bfloat, ptr %g411 %v = insertelement <4 x bfloat> poison, bfloat %l, i32 0412 ret <4 x bfloat> %v413}414 415define <8 x bfloat> @loadv8bf16_noffset(ptr %p) {416; CHECK-LABEL: loadv8bf16_noffset:417; CHECK: // %bb.0:418; CHECK-NEXT: ldur h0, [x0, #-1]419; CHECK-NEXT: ret420 %g = getelementptr inbounds i8, ptr %p, i64 -1421 %l = load bfloat, ptr %g422 %v = insertelement <8 x bfloat> poison, bfloat %l, i32 0423 ret <8 x bfloat> %v424}425 426define <2 x float> @loadv2f32_noffset(ptr %p) {427; CHECK-LABEL: loadv2f32_noffset:428; CHECK: // %bb.0:429; CHECK-NEXT: ldur s0, [x0, #-1]430; CHECK-NEXT: ret431 %g = getelementptr inbounds i8, ptr %p, i64 -1432 %l = load float, ptr %g433 %v = insertelement <2 x float> poison, float %l, i32 0434 ret <2 x float> %v435}436 437define <4 x float> @loadv4f32_noffset(ptr %p) {438; CHECK-LABEL: loadv4f32_noffset:439; CHECK: // %bb.0:440; CHECK-NEXT: ldur s0, [x0, #-1]441; CHECK-NEXT: ret442 %g = getelementptr inbounds i8, ptr %p, i64 -1443 %l = load float, ptr %g444 %v = insertelement <4 x float> poison, float %l, i32 0445 ret <4 x float> %v446}447 448define <2 x double> @loadv2f64_noffset(ptr %p) {449; CHECK-LABEL: loadv2f64_noffset:450; CHECK: // %bb.0:451; CHECK-NEXT: ldur d0, [x0, #-1]452; CHECK-NEXT: ret453 %g = getelementptr inbounds i8, ptr %p, i64 -1454 %l = load double, ptr %g455 %v = insertelement <2 x double> poison, double %l, i32 0456 ret <2 x double> %v457}458 459 460; ROW addressing modes461 462define <8 x i8> @loadv8i8_roW(ptr %p, i32 %o) {463; CHECK-LABEL: loadv8i8_roW:464; CHECK: // %bb.0:465; CHECK-NEXT: ldr b0, [x0, w1, sxtw]466; CHECK-NEXT: ret467 %g = getelementptr inbounds i8, ptr %p, i32 %o468 %l = load i8, ptr %g469 %v = insertelement <8 x i8> poison, i8 %l, i32 0470 ret <8 x i8> %v471}472 473define <16 x i8> @loadv16i8_roW(ptr %p, i32 %o) {474; CHECK-LABEL: loadv16i8_roW:475; CHECK: // %bb.0:476; CHECK-NEXT: ldr b0, [x0, w1, sxtw]477; CHECK-NEXT: ret478 %g = getelementptr inbounds i8, ptr %p, i32 %o479 %l = load i8, ptr %g480 %v = insertelement <16 x i8> poison, i8 %l, i32 0481 ret <16 x i8> %v482}483 484define <4 x i16> @loadv4i16_roW(ptr %p, i32 %o) {485; CHECK-LABEL: loadv4i16_roW:486; CHECK: // %bb.0:487; CHECK-NEXT: ldr h0, [x0, w1, sxtw #1]488; CHECK-NEXT: ret489 %g = getelementptr inbounds i16, ptr %p, i32 %o490 %l = load i16, ptr %g491 %v = insertelement <4 x i16> poison, i16 %l, i32 0492 ret <4 x i16> %v493}494 495define <8 x i16> @loadv8i16_roW(ptr %p, i32 %o) {496; CHECK-LABEL: loadv8i16_roW:497; CHECK: // %bb.0:498; CHECK-NEXT: ldr h0, [x0, w1, sxtw #1]499; CHECK-NEXT: ret500 %g = getelementptr inbounds i16, ptr %p, i32 %o501 %l = load i16, ptr %g502 %v = insertelement <8 x i16> poison, i16 %l, i32 0503 ret <8 x i16> %v504}505 506define <2 x i32> @loadv2i32_roW(ptr %p, i32 %o) {507; CHECK-LABEL: loadv2i32_roW:508; CHECK: // %bb.0:509; CHECK-NEXT: ldr s0, [x0, w1, sxtw #2]510; CHECK-NEXT: ret511 %g = getelementptr inbounds i32, ptr %p, i32 %o512 %l = load i32, ptr %g513 %v = insertelement <2 x i32> poison, i32 %l, i32 0514 ret <2 x i32> %v515}516 517define <4 x i32> @loadv4i32_roW(ptr %p, i32 %o) {518; CHECK-LABEL: loadv4i32_roW:519; CHECK: // %bb.0:520; CHECK-NEXT: ldr s0, [x0, w1, sxtw #2]521; CHECK-NEXT: ret522 %g = getelementptr inbounds i32, ptr %p, i32 %o523 %l = load i32, ptr %g524 %v = insertelement <4 x i32> poison, i32 %l, i32 0525 ret <4 x i32> %v526}527 528define <2 x i64> @loadv2i64_roW(ptr %p, i32 %o) {529; CHECK-LABEL: loadv2i64_roW:530; CHECK: // %bb.0:531; CHECK-NEXT: ldr d0, [x0, w1, sxtw #3]532; CHECK-NEXT: ret533 %g = getelementptr inbounds i64, ptr %p, i32 %o534 %l = load i64, ptr %g535 %v = insertelement <2 x i64> poison, i64 %l, i32 0536 ret <2 x i64> %v537}538 539define <4 x half> @loadv4f16_roW(ptr %p, i32 %o) {540; CHECK-LABEL: loadv4f16_roW:541; CHECK: // %bb.0:542; CHECK-NEXT: ldr h0, [x0, w1, sxtw #1]543; CHECK-NEXT: ret544 %g = getelementptr inbounds half, ptr %p, i32 %o545 %l = load half, ptr %g546 %v = insertelement <4 x half> poison, half %l, i32 0547 ret <4 x half> %v548}549 550define <8 x half> @loadv8f16_roW(ptr %p, i32 %o) {551; CHECK-LABEL: loadv8f16_roW:552; CHECK: // %bb.0:553; CHECK-NEXT: ldr h0, [x0, w1, sxtw #1]554; CHECK-NEXT: ret555 %g = getelementptr inbounds half, ptr %p, i32 %o556 %l = load half, ptr %g557 %v = insertelement <8 x half> poison, half %l, i32 0558 ret <8 x half> %v559}560 561define <4 x bfloat> @loadv4bf16_roW(ptr %p, i32 %o) {562; CHECK-LABEL: loadv4bf16_roW:563; CHECK: // %bb.0:564; CHECK-NEXT: ldr h0, [x0, w1, sxtw #1]565; CHECK-NEXT: ret566 %g = getelementptr inbounds bfloat, ptr %p, i32 %o567 %l = load bfloat, ptr %g568 %v = insertelement <4 x bfloat> poison, bfloat %l, i32 0569 ret <4 x bfloat> %v570}571 572define <8 x bfloat> @loadv8bf16_roW(ptr %p, i32 %o) {573; CHECK-LABEL: loadv8bf16_roW:574; CHECK: // %bb.0:575; CHECK-NEXT: ldr h0, [x0, w1, sxtw #1]576; CHECK-NEXT: ret577 %g = getelementptr inbounds bfloat, ptr %p, i32 %o578 %l = load bfloat, ptr %g579 %v = insertelement <8 x bfloat> poison, bfloat %l, i32 0580 ret <8 x bfloat> %v581}582 583define <2 x float> @loadv2f32_roW(ptr %p, i32 %o) {584; CHECK-LABEL: loadv2f32_roW:585; CHECK: // %bb.0:586; CHECK-NEXT: ldr s0, [x0, w1, sxtw #2]587; CHECK-NEXT: ret588 %g = getelementptr inbounds float, ptr %p, i32 %o589 %l = load float, ptr %g590 %v = insertelement <2 x float> poison, float %l, i32 0591 ret <2 x float> %v592}593 594define <4 x float> @loadv4f32_roW(ptr %p, i32 %o) {595; CHECK-LABEL: loadv4f32_roW:596; CHECK: // %bb.0:597; CHECK-NEXT: ldr s0, [x0, w1, sxtw #2]598; CHECK-NEXT: ret599 %g = getelementptr inbounds float, ptr %p, i32 %o600 %l = load float, ptr %g601 %v = insertelement <4 x float> poison, float %l, i32 0602 ret <4 x float> %v603}604 605define <2 x double> @loadv2f64_roW(ptr %p, i32 %o) {606; CHECK-LABEL: loadv2f64_roW:607; CHECK: // %bb.0:608; CHECK-NEXT: ldr d0, [x0, w1, sxtw #3]609; CHECK-NEXT: ret610 %g = getelementptr inbounds double, ptr %p, i32 %o611 %l = load double, ptr %g612 %v = insertelement <2 x double> poison, double %l, i32 0613 ret <2 x double> %v614}615 616; roX617 618define <8 x i8> @loadv8i8_roX(ptr %p, i64 %o) {619; CHECK-LABEL: loadv8i8_roX:620; CHECK: // %bb.0:621; CHECK-NEXT: ldr b0, [x0, x1]622; CHECK-NEXT: ret623 %g = getelementptr inbounds i8, ptr %p, i64 %o624 %l = load i8, ptr %g625 %v = insertelement <8 x i8> poison, i8 %l, i32 0626 ret <8 x i8> %v627}628 629define <16 x i8> @loadv16i8_roX(ptr %p, i64 %o) {630; CHECK-LABEL: loadv16i8_roX:631; CHECK: // %bb.0:632; CHECK-NEXT: ldr b0, [x0, x1]633; CHECK-NEXT: ret634 %g = getelementptr inbounds i8, ptr %p, i64 %o635 %l = load i8, ptr %g636 %v = insertelement <16 x i8> poison, i8 %l, i32 0637 ret <16 x i8> %v638}639 640define <4 x i16> @loadv4i16_roX(ptr %p, i64 %o) {641; CHECK-LABEL: loadv4i16_roX:642; CHECK: // %bb.0:643; CHECK-NEXT: ldr h0, [x0, x1, lsl #1]644; CHECK-NEXT: ret645 %g = getelementptr inbounds i16, ptr %p, i64 %o646 %l = load i16, ptr %g647 %v = insertelement <4 x i16> poison, i16 %l, i32 0648 ret <4 x i16> %v649}650 651define <8 x i16> @loadv8i16_roX(ptr %p, i64 %o) {652; CHECK-LABEL: loadv8i16_roX:653; CHECK: // %bb.0:654; CHECK-NEXT: ldr h0, [x0, x1, lsl #1]655; CHECK-NEXT: ret656 %g = getelementptr inbounds i16, ptr %p, i64 %o657 %l = load i16, ptr %g658 %v = insertelement <8 x i16> poison, i16 %l, i32 0659 ret <8 x i16> %v660}661 662define <2 x i32> @loadv2i32_roX(ptr %p, i64 %o) {663; CHECK-LABEL: loadv2i32_roX:664; CHECK: // %bb.0:665; CHECK-NEXT: ldr s0, [x0, x1, lsl #2]666; CHECK-NEXT: ret667 %g = getelementptr inbounds i32, ptr %p, i64 %o668 %l = load i32, ptr %g669 %v = insertelement <2 x i32> poison, i32 %l, i32 0670 ret <2 x i32> %v671}672 673define <4 x i32> @loadv4i32_roX(ptr %p, i64 %o) {674; CHECK-LABEL: loadv4i32_roX:675; CHECK: // %bb.0:676; CHECK-NEXT: ldr s0, [x0, x1, lsl #2]677; CHECK-NEXT: ret678 %g = getelementptr inbounds i32, ptr %p, i64 %o679 %l = load i32, ptr %g680 %v = insertelement <4 x i32> poison, i32 %l, i32 0681 ret <4 x i32> %v682}683 684define <2 x i64> @loadv2i64_roX(ptr %p, i64 %o) {685; CHECK-LABEL: loadv2i64_roX:686; CHECK: // %bb.0:687; CHECK-NEXT: ldr d0, [x0, x1, lsl #3]688; CHECK-NEXT: ret689 %g = getelementptr inbounds i64, ptr %p, i64 %o690 %l = load i64, ptr %g691 %v = insertelement <2 x i64> poison, i64 %l, i32 0692 ret <2 x i64> %v693}694 695define <4 x half> @loadv4f16_roX(ptr %p, i64 %o) {696; CHECK-LABEL: loadv4f16_roX:697; CHECK: // %bb.0:698; CHECK-NEXT: ldr h0, [x0, x1, lsl #1]699; CHECK-NEXT: ret700 %g = getelementptr inbounds half, ptr %p, i64 %o701 %l = load half, ptr %g702 %v = insertelement <4 x half> poison, half %l, i32 0703 ret <4 x half> %v704}705 706define <8 x half> @loadv8f16_roX(ptr %p, i64 %o) {707; CHECK-LABEL: loadv8f16_roX:708; CHECK: // %bb.0:709; CHECK-NEXT: ldr h0, [x0, x1, lsl #1]710; CHECK-NEXT: ret711 %g = getelementptr inbounds half, ptr %p, i64 %o712 %l = load half, ptr %g713 %v = insertelement <8 x half> poison, half %l, i32 0714 ret <8 x half> %v715}716 717define <4 x bfloat> @loadv4bf16_roX(ptr %p, i64 %o) {718; CHECK-LABEL: loadv4bf16_roX:719; CHECK: // %bb.0:720; CHECK-NEXT: ldr h0, [x0, x1, lsl #1]721; CHECK-NEXT: ret722 %g = getelementptr inbounds bfloat, ptr %p, i64 %o723 %l = load bfloat, ptr %g724 %v = insertelement <4 x bfloat> poison, bfloat %l, i32 0725 ret <4 x bfloat> %v726}727 728define <8 x bfloat> @loadv8bf16_roX(ptr %p, i64 %o) {729; CHECK-LABEL: loadv8bf16_roX:730; CHECK: // %bb.0:731; CHECK-NEXT: ldr h0, [x0, x1, lsl #1]732; CHECK-NEXT: ret733 %g = getelementptr inbounds bfloat, ptr %p, i64 %o734 %l = load bfloat, ptr %g735 %v = insertelement <8 x bfloat> poison, bfloat %l, i32 0736 ret <8 x bfloat> %v737}738 739define <2 x float> @loadv2f32_roX(ptr %p, i64 %o) {740; CHECK-LABEL: loadv2f32_roX:741; CHECK: // %bb.0:742; CHECK-NEXT: ldr s0, [x0, x1, lsl #2]743; CHECK-NEXT: ret744 %g = getelementptr inbounds float, ptr %p, i64 %o745 %l = load float, ptr %g746 %v = insertelement <2 x float> poison, float %l, i32 0747 ret <2 x float> %v748}749 750define <4 x float> @loadv4f32_roX(ptr %p, i64 %o) {751; CHECK-LABEL: loadv4f32_roX:752; CHECK: // %bb.0:753; CHECK-NEXT: ldr s0, [x0, x1, lsl #2]754; CHECK-NEXT: ret755 %g = getelementptr inbounds float, ptr %p, i64 %o756 %l = load float, ptr %g757 %v = insertelement <4 x float> poison, float %l, i32 0758 ret <4 x float> %v759}760 761define <2 x double> @loadv2f64_roX(ptr %p, i64 %o) {762; CHECK-LABEL: loadv2f64_roX:763; CHECK: // %bb.0:764; CHECK-NEXT: ldr d0, [x0, x1, lsl #3]765; CHECK-NEXT: ret766 %g = getelementptr inbounds double, ptr %p, i64 %o767 %l = load double, ptr %g768 %v = insertelement <2 x double> poison, double %l, i32 0769 ret <2 x double> %v770}771 772 773; SVE774 775define <vscale x 8 x i8> @loadnxv8i8(ptr %p) {776; CHECK-LABEL: loadnxv8i8:777; CHECK: // %bb.0:778; CHECK-NEXT: ldrb w8, [x0]779; CHECK-NEXT: fmov s0, w8780; CHECK-NEXT: ret781 %l = load i8, ptr %p782 %v = insertelement <vscale x 8 x i8> poison, i8 %l, i32 0783 ret <vscale x 8 x i8> %v784}785 786define <vscale x 16 x i8> @loadnxv16i8(ptr %p) {787; CHECK-LABEL: loadnxv16i8:788; CHECK: // %bb.0:789; CHECK-NEXT: ldr b0, [x0]790; CHECK-NEXT: ret791 %l = load i8, ptr %p792 %v = insertelement <vscale x 16 x i8> poison, i8 %l, i32 0793 ret <vscale x 16 x i8> %v794}795 796define <vscale x 4 x i16> @loadnxv4i16(ptr %p) {797; CHECK-LABEL: loadnxv4i16:798; CHECK: // %bb.0:799; CHECK-NEXT: ldrh w8, [x0]800; CHECK-NEXT: fmov s0, w8801; CHECK-NEXT: ret802 %l = load i16, ptr %p803 %v = insertelement <vscale x 4 x i16> poison, i16 %l, i32 0804 ret <vscale x 4 x i16> %v805}806 807define <vscale x 8 x i16> @loadnxv8i16(ptr %p) {808; CHECK-LABEL: loadnxv8i16:809; CHECK: // %bb.0:810; CHECK-NEXT: ldr h0, [x0]811; CHECK-NEXT: ret812 %l = load i16, ptr %p813 %v = insertelement <vscale x 8 x i16> poison, i16 %l, i32 0814 ret <vscale x 8 x i16> %v815}816 817define <vscale x 2 x i32> @loadnxv2i32(ptr %p) {818; CHECK-LABEL: loadnxv2i32:819; CHECK: // %bb.0:820; CHECK-NEXT: ldr w8, [x0]821; CHECK-NEXT: fmov d0, x8822; CHECK-NEXT: ret823 %l = load i32, ptr %p824 %v = insertelement <vscale x 2 x i32> poison, i32 %l, i32 0825 ret <vscale x 2 x i32> %v826}827 828define <vscale x 4 x i32> @loadnxv4i32(ptr %p) {829; CHECK-LABEL: loadnxv4i32:830; CHECK: // %bb.0:831; CHECK-NEXT: ldr s0, [x0]832; CHECK-NEXT: ret833 %l = load i32, ptr %p834 %v = insertelement <vscale x 4 x i32> poison, i32 %l, i32 0835 ret <vscale x 4 x i32> %v836}837 838define <vscale x 2 x i64> @loadnxv2i64(ptr %p) {839; CHECK-LABEL: loadnxv2i64:840; CHECK: // %bb.0:841; CHECK-NEXT: ldr d0, [x0]842; CHECK-NEXT: ret843 %l = load i64, ptr %p844 %v = insertelement <vscale x 2 x i64> poison, i64 %l, i32 0845 ret <vscale x 2 x i64> %v846}847 848 849define <vscale x 4 x half> @loadnxv4f16(ptr %p) {850; CHECK-LABEL: loadnxv4f16:851; CHECK: // %bb.0:852; CHECK-NEXT: ldr h0, [x0]853; CHECK-NEXT: ret854 %l = load half, ptr %p855 %v = insertelement <vscale x 4 x half> poison, half %l, i32 0856 ret <vscale x 4 x half> %v857}858 859define <vscale x 8 x half> @loadnxv8f16(ptr %p) {860; CHECK-LABEL: loadnxv8f16:861; CHECK: // %bb.0:862; CHECK-NEXT: ldr h0, [x0]863; CHECK-NEXT: ret864 %l = load half, ptr %p865 %v = insertelement <vscale x 8 x half> poison, half %l, i32 0866 ret <vscale x 8 x half> %v867}868 869define <vscale x 4 x bfloat> @loadnxv4bf16(ptr %p) {870; CHECK-LABEL: loadnxv4bf16:871; CHECK: // %bb.0:872; CHECK-NEXT: ldr h0, [x0]873; CHECK-NEXT: ret874 %l = load bfloat, ptr %p875 %v = insertelement <vscale x 4 x bfloat> poison, bfloat %l, i32 0876 ret <vscale x 4 x bfloat> %v877}878 879define <vscale x 8 x bfloat> @loadnxv8bf16(ptr %p) {880; CHECK-LABEL: loadnxv8bf16:881; CHECK: // %bb.0:882; CHECK-NEXT: ldr h0, [x0]883; CHECK-NEXT: ret884 %l = load bfloat, ptr %p885 %v = insertelement <vscale x 8 x bfloat> poison, bfloat %l, i32 0886 ret <vscale x 8 x bfloat> %v887}888 889define <vscale x 2 x float> @loadnxv2f32(ptr %p) {890; CHECK-LABEL: loadnxv2f32:891; CHECK: // %bb.0:892; CHECK-NEXT: ldr s0, [x0]893; CHECK-NEXT: ret894 %l = load float, ptr %p895 %v = insertelement <vscale x 2 x float> poison, float %l, i32 0896 ret <vscale x 2 x float> %v897}898 899define <vscale x 4 x float> @loadnxv4f32(ptr %p) {900; CHECK-LABEL: loadnxv4f32:901; CHECK: // %bb.0:902; CHECK-NEXT: ldr s0, [x0]903; CHECK-NEXT: ret904 %l = load float, ptr %p905 %v = insertelement <vscale x 4 x float> poison, float %l, i32 0906 ret <vscale x 4 x float> %v907}908 909define <vscale x 2 x double> @loadnxv2f64(ptr %p) {910; CHECK-LABEL: loadnxv2f64:911; CHECK: // %bb.0:912; CHECK-NEXT: ldr d0, [x0]913; CHECK-NEXT: ret914 %l = load double, ptr %p915 %v = insertelement <vscale x 2 x double> poison, double %l, i32 0916 ret <vscale x 2 x double> %v917}918 919 920; Unscaled921 922define <vscale x 8 x i8> @loadnxv8i8_offset(ptr %p) {923; CHECK-LABEL: loadnxv8i8_offset:924; CHECK: // %bb.0:925; CHECK-NEXT: ldrb w8, [x0, #1]926; CHECK-NEXT: fmov s0, w8927; CHECK-NEXT: ret928 %g = getelementptr inbounds i8, ptr %p, i64 1929 %l = load i8, ptr %g930 %v = insertelement <vscale x 8 x i8> poison, i8 %l, i32 0931 ret <vscale x 8 x i8> %v932}933 934define <vscale x 16 x i8> @loadnxv16i8_offset(ptr %p) {935; CHECK-LABEL: loadnxv16i8_offset:936; CHECK: // %bb.0:937; CHECK-NEXT: ldr b0, [x0, #1]938; CHECK-NEXT: ret939 %g = getelementptr inbounds i8, ptr %p, i64 1940 %l = load i8, ptr %g941 %v = insertelement <vscale x 16 x i8> poison, i8 %l, i32 0942 ret <vscale x 16 x i8> %v943}944 945define <vscale x 4 x i16> @loadnxv4i16_offset(ptr %p) {946; CHECK-LABEL: loadnxv4i16_offset:947; CHECK: // %bb.0:948; CHECK-NEXT: ldurh w8, [x0, #1]949; CHECK-NEXT: fmov s0, w8950; CHECK-NEXT: ret951 %g = getelementptr inbounds i8, ptr %p, i64 1952 %l = load i16, ptr %g953 %v = insertelement <vscale x 4 x i16> poison, i16 %l, i32 0954 ret <vscale x 4 x i16> %v955}956 957define <vscale x 8 x i16> @loadnxv8i16_offset(ptr %p) {958; CHECK-LABEL: loadnxv8i16_offset:959; CHECK: // %bb.0:960; CHECK-NEXT: ldur h0, [x0, #1]961; CHECK-NEXT: ret962 %g = getelementptr inbounds i8, ptr %p, i64 1963 %l = load i16, ptr %g964 %v = insertelement <vscale x 8 x i16> poison, i16 %l, i32 0965 ret <vscale x 8 x i16> %v966}967 968define <vscale x 2 x i32> @loadnxv2i32_offset(ptr %p) {969; CHECK-LABEL: loadnxv2i32_offset:970; CHECK: // %bb.0:971; CHECK-NEXT: ldur w8, [x0, #1]972; CHECK-NEXT: fmov d0, x8973; CHECK-NEXT: ret974 %g = getelementptr inbounds i8, ptr %p, i64 1975 %l = load i32, ptr %g976 %v = insertelement <vscale x 2 x i32> poison, i32 %l, i32 0977 ret <vscale x 2 x i32> %v978}979 980define <vscale x 4 x i32> @loadnxv4i32_offset(ptr %p) {981; CHECK-LABEL: loadnxv4i32_offset:982; CHECK: // %bb.0:983; CHECK-NEXT: ldur s0, [x0, #1]984; CHECK-NEXT: ret985 %g = getelementptr inbounds i8, ptr %p, i64 1986 %l = load i32, ptr %g987 %v = insertelement <vscale x 4 x i32> poison, i32 %l, i32 0988 ret <vscale x 4 x i32> %v989}990 991define <vscale x 2 x i64> @loadnxv2i64_offset(ptr %p) {992; CHECK-LABEL: loadnxv2i64_offset:993; CHECK: // %bb.0:994; CHECK-NEXT: ldur d0, [x0, #1]995; CHECK-NEXT: ret996 %g = getelementptr inbounds i8, ptr %p, i64 1997 %l = load i64, ptr %g998 %v = insertelement <vscale x 2 x i64> poison, i64 %l, i32 0999 ret <vscale x 2 x i64> %v1000}1001 1002 1003define <vscale x 4 x half> @loadnxv4f16_offset(ptr %p) {1004; CHECK-LABEL: loadnxv4f16_offset:1005; CHECK: // %bb.0:1006; CHECK-NEXT: ldur h0, [x0, #1]1007; CHECK-NEXT: ret1008 %g = getelementptr inbounds i8, ptr %p, i64 11009 %l = load half, ptr %g1010 %v = insertelement <vscale x 4 x half> poison, half %l, i32 01011 ret <vscale x 4 x half> %v1012}1013 1014define <vscale x 8 x half> @loadnxv8f16_offset(ptr %p) {1015; CHECK-LABEL: loadnxv8f16_offset:1016; CHECK: // %bb.0:1017; CHECK-NEXT: ldur h0, [x0, #1]1018; CHECK-NEXT: ret1019 %g = getelementptr inbounds i8, ptr %p, i64 11020 %l = load half, ptr %g1021 %v = insertelement <vscale x 8 x half> poison, half %l, i32 01022 ret <vscale x 8 x half> %v1023}1024 1025define <vscale x 4 x bfloat> @loadnxv4bf16_offset(ptr %p) {1026; CHECK-LABEL: loadnxv4bf16_offset:1027; CHECK: // %bb.0:1028; CHECK-NEXT: ldur h0, [x0, #1]1029; CHECK-NEXT: ret1030 %g = getelementptr inbounds i8, ptr %p, i64 11031 %l = load bfloat, ptr %g1032 %v = insertelement <vscale x 4 x bfloat> poison, bfloat %l, i32 01033 ret <vscale x 4 x bfloat> %v1034}1035 1036define <vscale x 8 x bfloat> @loadnxv8bf16_offset(ptr %p) {1037; CHECK-LABEL: loadnxv8bf16_offset:1038; CHECK: // %bb.0:1039; CHECK-NEXT: ldur h0, [x0, #1]1040; CHECK-NEXT: ret1041 %g = getelementptr inbounds i8, ptr %p, i64 11042 %l = load bfloat, ptr %g1043 %v = insertelement <vscale x 8 x bfloat> poison, bfloat %l, i32 01044 ret <vscale x 8 x bfloat> %v1045}1046 1047define <vscale x 2 x float> @loadnxv2f32_offset(ptr %p) {1048; CHECK-LABEL: loadnxv2f32_offset:1049; CHECK: // %bb.0:1050; CHECK-NEXT: ldur s0, [x0, #1]1051; CHECK-NEXT: ret1052 %g = getelementptr inbounds i8, ptr %p, i64 11053 %l = load float, ptr %g1054 %v = insertelement <vscale x 2 x float> poison, float %l, i32 01055 ret <vscale x 2 x float> %v1056}1057 1058define <vscale x 4 x float> @loadnxv4f32_offset(ptr %p) {1059; CHECK-LABEL: loadnxv4f32_offset:1060; CHECK: // %bb.0:1061; CHECK-NEXT: ldur s0, [x0, #1]1062; CHECK-NEXT: ret1063 %g = getelementptr inbounds i8, ptr %p, i64 11064 %l = load float, ptr %g1065 %v = insertelement <vscale x 4 x float> poison, float %l, i32 01066 ret <vscale x 4 x float> %v1067}1068 1069define <vscale x 2 x double> @loadnxv2f64_offset(ptr %p) {1070; CHECK-LABEL: loadnxv2f64_offset:1071; CHECK: // %bb.0:1072; CHECK-NEXT: ldur d0, [x0, #1]1073; CHECK-NEXT: ret1074 %g = getelementptr inbounds i8, ptr %p, i64 11075 %l = load double, ptr %g1076 %v = insertelement <vscale x 2 x double> poison, double %l, i32 01077 ret <vscale x 2 x double> %v1078}1079