1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=aarch64 -mattr=+fullfp16,+bf16,+sve | FileCheck %s 3 4define <8 x i8> @loadv8i8(ptr %p) { 5; CHECK-LABEL: loadv8i8: 6; CHECK: // %bb.0: 7; CHECK-NEXT: ldr b0, [x0] 8; CHECK-NEXT: ret 9 %l = load i8, ptr %p 10 %v = insertelement <8 x i8> poison, i8 %l, i32 0 11 ret <8 x i8> %v 12} 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: ret 19 %l = load i8, ptr %p 20 %v = insertelement <16 x i8> poison, i8 %l, i32 0 21 ret <16 x i8> %v 22} 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: ret 29 %l = load i16, ptr %p 30 %v = insertelement <4 x i16> poison, i16 %l, i32 0 31 ret <4 x i16> %v 32} 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: ret 39 %l = load i16, ptr %p 40 %v = insertelement <8 x i16> poison, i16 %l, i32 0 41 ret <8 x i16> %v 42} 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: ret 49 %l = load i32, ptr %p 50 %v = insertelement <2 x i32> poison, i32 %l, i32 0 51 ret <2 x i32> %v 52} 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: ret 59 %l = load i32, ptr %p 60 %v = insertelement <4 x i32> poison, i32 %l, i32 0 61 ret <4 x i32> %v 62} 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: ret 69 %l = load i64, ptr %p 70 %v = insertelement <2 x i64> poison, i64 %l, i32 0 71 ret <2 x i64> %v 72} 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: ret 80 %l = load half, ptr %p 81 %v = insertelement <4 x half> poison, half %l, i32 0 82 ret <4 x half> %v 83} 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: ret 90 %l = load half, ptr %p 91 %v = insertelement <8 x half> poison, half %l, i32 0 92 ret <8 x half> %v 93} 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: ret 100 %l = load bfloat, ptr %p 101 %v = insertelement <4 x bfloat> poison, bfloat %l, i32 0 102 ret <4 x bfloat> %v 103} 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: ret 110 %l = load bfloat, ptr %p 111 %v = insertelement <8 x bfloat> poison, bfloat %l, i32 0 112 ret <8 x bfloat> %v 113} 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: ret 120 %l = load float, ptr %p 121 %v = insertelement <2 x float> poison, float %l, i32 0 122 ret <2 x float> %v 123} 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: ret 130 %l = load float, ptr %p 131 %v = insertelement <4 x float> poison, float %l, i32 0 132 ret <4 x float> %v 133} 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: ret 140 %l = load double, ptr %p 141 %v = insertelement <2 x double> poison, double %l, i32 0 142 ret <2 x double> %v 143} 144 145 146; Unscaled 147 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: ret 153 %g = getelementptr inbounds i8, ptr %p, i64 1 154 %l = load i8, ptr %g 155 %v = insertelement <8 x i8> poison, i8 %l, i32 0 156 ret <8 x i8> %v 157} 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: ret 164 %g = getelementptr inbounds i8, ptr %p, i64 1 165 %l = load i8, ptr %g 166 %v = insertelement <16 x i8> poison, i8 %l, i32 0 167 ret <16 x i8> %v 168} 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: ret 175 %g = getelementptr inbounds i8, ptr %p, i64 1 176 %l = load i16, ptr %g 177 %v = insertelement <4 x i16> poison, i16 %l, i32 0 178 ret <4 x i16> %v 179} 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: ret 186 %g = getelementptr inbounds i8, ptr %p, i64 1 187 %l = load i16, ptr %g 188 %v = insertelement <8 x i16> poison, i16 %l, i32 0 189 ret <8 x i16> %v 190} 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: ret 197 %g = getelementptr inbounds i8, ptr %p, i64 1 198 %l = load i32, ptr %g 199 %v = insertelement <2 x i32> poison, i32 %l, i32 0 200 ret <2 x i32> %v 201} 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: ret 208 %g = getelementptr inbounds i8, ptr %p, i64 1 209 %l = load i32, ptr %g 210 %v = insertelement <4 x i32> poison, i32 %l, i32 0 211 ret <4 x i32> %v 212} 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: ret 219 %g = getelementptr inbounds i8, ptr %p, i64 1 220 %l = load i64, ptr %g 221 %v = insertelement <2 x i64> poison, i64 %l, i32 0 222 ret <2 x i64> %v 223} 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: ret 231 %g = getelementptr inbounds i8, ptr %p, i64 1 232 %l = load half, ptr %g 233 %v = insertelement <4 x half> poison, half %l, i32 0 234 ret <4 x half> %v 235} 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: ret 242 %g = getelementptr inbounds i8, ptr %p, i64 1 243 %l = load half, ptr %g 244 %v = insertelement <8 x half> poison, half %l, i32 0 245 ret <8 x half> %v 246} 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: ret 253 %g = getelementptr inbounds i8, ptr %p, i64 1 254 %l = load bfloat, ptr %g 255 %v = insertelement <4 x bfloat> poison, bfloat %l, i32 0 256 ret <4 x bfloat> %v 257} 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: ret 264 %g = getelementptr inbounds i8, ptr %p, i64 1 265 %l = load bfloat, ptr %g 266 %v = insertelement <8 x bfloat> poison, bfloat %l, i32 0 267 ret <8 x bfloat> %v 268} 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: ret 275 %g = getelementptr inbounds i8, ptr %p, i64 1 276 %l = load float, ptr %g 277 %v = insertelement <2 x float> poison, float %l, i32 0 278 ret <2 x float> %v 279} 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: ret 286 %g = getelementptr inbounds i8, ptr %p, i64 1 287 %l = load float, ptr %g 288 %v = insertelement <4 x float> poison, float %l, i32 0 289 ret <4 x float> %v 290} 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: ret 297 %g = getelementptr inbounds i8, ptr %p, i64 1 298 %l = load double, ptr %g 299 %v = insertelement <2 x double> poison, double %l, i32 0 300 ret <2 x double> %v 301} 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: ret 309 %g = getelementptr inbounds i8, ptr %p, i64 -1 310 %l = load i8, ptr %g 311 %v = insertelement <8 x i8> poison, i8 %l, i32 0 312 ret <8 x i8> %v 313} 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: ret 320 %g = getelementptr inbounds i8, ptr %p, i64 -1 321 %l = load i8, ptr %g 322 %v = insertelement <16 x i8> poison, i8 %l, i32 0 323 ret <16 x i8> %v 324} 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: ret 331 %g = getelementptr inbounds i8, ptr %p, i64 -1 332 %l = load i16, ptr %g 333 %v = insertelement <4 x i16> poison, i16 %l, i32 0 334 ret <4 x i16> %v 335} 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: ret 342 %g = getelementptr inbounds i8, ptr %p, i64 -1 343 %l = load i16, ptr %g 344 %v = insertelement <8 x i16> poison, i16 %l, i32 0 345 ret <8 x i16> %v 346} 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: ret 353 %g = getelementptr inbounds i8, ptr %p, i64 -1 354 %l = load i32, ptr %g 355 %v = insertelement <2 x i32> poison, i32 %l, i32 0 356 ret <2 x i32> %v 357} 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: ret 364 %g = getelementptr inbounds i8, ptr %p, i64 -1 365 %l = load i32, ptr %g 366 %v = insertelement <4 x i32> poison, i32 %l, i32 0 367 ret <4 x i32> %v 368} 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: ret 375 %g = getelementptr inbounds i8, ptr %p, i64 -1 376 %l = load i64, ptr %g 377 %v = insertelement <2 x i64> poison, i64 %l, i32 0 378 ret <2 x i64> %v 379} 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: ret 387 %g = getelementptr inbounds i8, ptr %p, i64 -1 388 %l = load half, ptr %g 389 %v = insertelement <4 x half> poison, half %l, i32 0 390 ret <4 x half> %v 391} 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: ret 398 %g = getelementptr inbounds i8, ptr %p, i64 -1 399 %l = load half, ptr %g 400 %v = insertelement <8 x half> poison, half %l, i32 0 401 ret <8 x half> %v 402} 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: ret 409 %g = getelementptr inbounds i8, ptr %p, i64 -1 410 %l = load bfloat, ptr %g 411 %v = insertelement <4 x bfloat> poison, bfloat %l, i32 0 412 ret <4 x bfloat> %v 413} 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: ret 420 %g = getelementptr inbounds i8, ptr %p, i64 -1 421 %l = load bfloat, ptr %g 422 %v = insertelement <8 x bfloat> poison, bfloat %l, i32 0 423 ret <8 x bfloat> %v 424} 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: ret 431 %g = getelementptr inbounds i8, ptr %p, i64 -1 432 %l = load float, ptr %g 433 %v = insertelement <2 x float> poison, float %l, i32 0 434 ret <2 x float> %v 435} 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: ret 442 %g = getelementptr inbounds i8, ptr %p, i64 -1 443 %l = load float, ptr %g 444 %v = insertelement <4 x float> poison, float %l, i32 0 445 ret <4 x float> %v 446} 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: ret 453 %g = getelementptr inbounds i8, ptr %p, i64 -1 454 %l = load double, ptr %g 455 %v = insertelement <2 x double> poison, double %l, i32 0 456 ret <2 x double> %v 457} 458 459 460; ROW addressing modes 461 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: ret 467 %g = getelementptr inbounds i8, ptr %p, i32 %o 468 %l = load i8, ptr %g 469 %v = insertelement <8 x i8> poison, i8 %l, i32 0 470 ret <8 x i8> %v 471} 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: ret 478 %g = getelementptr inbounds i8, ptr %p, i32 %o 479 %l = load i8, ptr %g 480 %v = insertelement <16 x i8> poison, i8 %l, i32 0 481 ret <16 x i8> %v 482} 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: ret 489 %g = getelementptr inbounds i16, ptr %p, i32 %o 490 %l = load i16, ptr %g 491 %v = insertelement <4 x i16> poison, i16 %l, i32 0 492 ret <4 x i16> %v 493} 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: ret 500 %g = getelementptr inbounds i16, ptr %p, i32 %o 501 %l = load i16, ptr %g 502 %v = insertelement <8 x i16> poison, i16 %l, i32 0 503 ret <8 x i16> %v 504} 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: ret 511 %g = getelementptr inbounds i32, ptr %p, i32 %o 512 %l = load i32, ptr %g 513 %v = insertelement <2 x i32> poison, i32 %l, i32 0 514 ret <2 x i32> %v 515} 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: ret 522 %g = getelementptr inbounds i32, ptr %p, i32 %o 523 %l = load i32, ptr %g 524 %v = insertelement <4 x i32> poison, i32 %l, i32 0 525 ret <4 x i32> %v 526} 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: ret 533 %g = getelementptr inbounds i64, ptr %p, i32 %o 534 %l = load i64, ptr %g 535 %v = insertelement <2 x i64> poison, i64 %l, i32 0 536 ret <2 x i64> %v 537} 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: ret 544 %g = getelementptr inbounds half, ptr %p, i32 %o 545 %l = load half, ptr %g 546 %v = insertelement <4 x half> poison, half %l, i32 0 547 ret <4 x half> %v 548} 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: ret 555 %g = getelementptr inbounds half, ptr %p, i32 %o 556 %l = load half, ptr %g 557 %v = insertelement <8 x half> poison, half %l, i32 0 558 ret <8 x half> %v 559} 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: ret 566 %g = getelementptr inbounds bfloat, ptr %p, i32 %o 567 %l = load bfloat, ptr %g 568 %v = insertelement <4 x bfloat> poison, bfloat %l, i32 0 569 ret <4 x bfloat> %v 570} 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: ret 577 %g = getelementptr inbounds bfloat, ptr %p, i32 %o 578 %l = load bfloat, ptr %g 579 %v = insertelement <8 x bfloat> poison, bfloat %l, i32 0 580 ret <8 x bfloat> %v 581} 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: ret 588 %g = getelementptr inbounds float, ptr %p, i32 %o 589 %l = load float, ptr %g 590 %v = insertelement <2 x float> poison, float %l, i32 0 591 ret <2 x float> %v 592} 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: ret 599 %g = getelementptr inbounds float, ptr %p, i32 %o 600 %l = load float, ptr %g 601 %v = insertelement <4 x float> poison, float %l, i32 0 602 ret <4 x float> %v 603} 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: ret 610 %g = getelementptr inbounds double, ptr %p, i32 %o 611 %l = load double, ptr %g 612 %v = insertelement <2 x double> poison, double %l, i32 0 613 ret <2 x double> %v 614} 615 616; roX 617 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: ret 623 %g = getelementptr inbounds i8, ptr %p, i64 %o 624 %l = load i8, ptr %g 625 %v = insertelement <8 x i8> poison, i8 %l, i32 0 626 ret <8 x i8> %v 627} 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: ret 634 %g = getelementptr inbounds i8, ptr %p, i64 %o 635 %l = load i8, ptr %g 636 %v = insertelement <16 x i8> poison, i8 %l, i32 0 637 ret <16 x i8> %v 638} 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: ret 645 %g = getelementptr inbounds i16, ptr %p, i64 %o 646 %l = load i16, ptr %g 647 %v = insertelement <4 x i16> poison, i16 %l, i32 0 648 ret <4 x i16> %v 649} 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: ret 656 %g = getelementptr inbounds i16, ptr %p, i64 %o 657 %l = load i16, ptr %g 658 %v = insertelement <8 x i16> poison, i16 %l, i32 0 659 ret <8 x i16> %v 660} 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: ret 667 %g = getelementptr inbounds i32, ptr %p, i64 %o 668 %l = load i32, ptr %g 669 %v = insertelement <2 x i32> poison, i32 %l, i32 0 670 ret <2 x i32> %v 671} 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: ret 678 %g = getelementptr inbounds i32, ptr %p, i64 %o 679 %l = load i32, ptr %g 680 %v = insertelement <4 x i32> poison, i32 %l, i32 0 681 ret <4 x i32> %v 682} 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: ret 689 %g = getelementptr inbounds i64, ptr %p, i64 %o 690 %l = load i64, ptr %g 691 %v = insertelement <2 x i64> poison, i64 %l, i32 0 692 ret <2 x i64> %v 693} 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: ret 700 %g = getelementptr inbounds half, ptr %p, i64 %o 701 %l = load half, ptr %g 702 %v = insertelement <4 x half> poison, half %l, i32 0 703 ret <4 x half> %v 704} 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: ret 711 %g = getelementptr inbounds half, ptr %p, i64 %o 712 %l = load half, ptr %g 713 %v = insertelement <8 x half> poison, half %l, i32 0 714 ret <8 x half> %v 715} 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: ret 722 %g = getelementptr inbounds bfloat, ptr %p, i64 %o 723 %l = load bfloat, ptr %g 724 %v = insertelement <4 x bfloat> poison, bfloat %l, i32 0 725 ret <4 x bfloat> %v 726} 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: ret 733 %g = getelementptr inbounds bfloat, ptr %p, i64 %o 734 %l = load bfloat, ptr %g 735 %v = insertelement <8 x bfloat> poison, bfloat %l, i32 0 736 ret <8 x bfloat> %v 737} 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: ret 744 %g = getelementptr inbounds float, ptr %p, i64 %o 745 %l = load float, ptr %g 746 %v = insertelement <2 x float> poison, float %l, i32 0 747 ret <2 x float> %v 748} 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: ret 755 %g = getelementptr inbounds float, ptr %p, i64 %o 756 %l = load float, ptr %g 757 %v = insertelement <4 x float> poison, float %l, i32 0 758 ret <4 x float> %v 759} 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: ret 766 %g = getelementptr inbounds double, ptr %p, i64 %o 767 %l = load double, ptr %g 768 %v = insertelement <2 x double> poison, double %l, i32 0 769 ret <2 x double> %v 770} 771 772 773; SVE 774 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, w8 780; CHECK-NEXT: ret 781 %l = load i8, ptr %p 782 %v = insertelement <vscale x 8 x i8> poison, i8 %l, i32 0 783 ret <vscale x 8 x i8> %v 784} 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: ret 791 %l = load i8, ptr %p 792 %v = insertelement <vscale x 16 x i8> poison, i8 %l, i32 0 793 ret <vscale x 16 x i8> %v 794} 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, w8 801; CHECK-NEXT: ret 802 %l = load i16, ptr %p 803 %v = insertelement <vscale x 4 x i16> poison, i16 %l, i32 0 804 ret <vscale x 4 x i16> %v 805} 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: ret 812 %l = load i16, ptr %p 813 %v = insertelement <vscale x 8 x i16> poison, i16 %l, i32 0 814 ret <vscale x 8 x i16> %v 815} 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, x8 822; CHECK-NEXT: ret 823 %l = load i32, ptr %p 824 %v = insertelement <vscale x 2 x i32> poison, i32 %l, i32 0 825 ret <vscale x 2 x i32> %v 826} 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: ret 833 %l = load i32, ptr %p 834 %v = insertelement <vscale x 4 x i32> poison, i32 %l, i32 0 835 ret <vscale x 4 x i32> %v 836} 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: ret 843 %l = load i64, ptr %p 844 %v = insertelement <vscale x 2 x i64> poison, i64 %l, i32 0 845 ret <vscale x 2 x i64> %v 846} 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: ret 854 %l = load half, ptr %p 855 %v = insertelement <vscale x 4 x half> poison, half %l, i32 0 856 ret <vscale x 4 x half> %v 857} 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: ret 864 %l = load half, ptr %p 865 %v = insertelement <vscale x 8 x half> poison, half %l, i32 0 866 ret <vscale x 8 x half> %v 867} 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: ret 874 %l = load bfloat, ptr %p 875 %v = insertelement <vscale x 4 x bfloat> poison, bfloat %l, i32 0 876 ret <vscale x 4 x bfloat> %v 877} 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: ret 884 %l = load bfloat, ptr %p 885 %v = insertelement <vscale x 8 x bfloat> poison, bfloat %l, i32 0 886 ret <vscale x 8 x bfloat> %v 887} 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: ret 894 %l = load float, ptr %p 895 %v = insertelement <vscale x 2 x float> poison, float %l, i32 0 896 ret <vscale x 2 x float> %v 897} 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: ret 904 %l = load float, ptr %p 905 %v = insertelement <vscale x 4 x float> poison, float %l, i32 0 906 ret <vscale x 4 x float> %v 907} 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: ret 914 %l = load double, ptr %p 915 %v = insertelement <vscale x 2 x double> poison, double %l, i32 0 916 ret <vscale x 2 x double> %v 917} 918 919 920; Unscaled 921 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, w8 927; CHECK-NEXT: ret 928 %g = getelementptr inbounds i8, ptr %p, i64 1 929 %l = load i8, ptr %g 930 %v = insertelement <vscale x 8 x i8> poison, i8 %l, i32 0 931 ret <vscale x 8 x i8> %v 932} 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: ret 939 %g = getelementptr inbounds i8, ptr %p, i64 1 940 %l = load i8, ptr %g 941 %v = insertelement <vscale x 16 x i8> poison, i8 %l, i32 0 942 ret <vscale x 16 x i8> %v 943} 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, w8 950; CHECK-NEXT: ret 951 %g = getelementptr inbounds i8, ptr %p, i64 1 952 %l = load i16, ptr %g 953 %v = insertelement <vscale x 4 x i16> poison, i16 %l, i32 0 954 ret <vscale x 4 x i16> %v 955} 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: ret 962 %g = getelementptr inbounds i8, ptr %p, i64 1 963 %l = load i16, ptr %g 964 %v = insertelement <vscale x 8 x i16> poison, i16 %l, i32 0 965 ret <vscale x 8 x i16> %v 966} 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, x8 973; CHECK-NEXT: ret 974 %g = getelementptr inbounds i8, ptr %p, i64 1 975 %l = load i32, ptr %g 976 %v = insertelement <vscale x 2 x i32> poison, i32 %l, i32 0 977 ret <vscale x 2 x i32> %v 978} 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: ret 985 %g = getelementptr inbounds i8, ptr %p, i64 1 986 %l = load i32, ptr %g 987 %v = insertelement <vscale x 4 x i32> poison, i32 %l, i32 0 988 ret <vscale x 4 x i32> %v 989} 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: ret 996 %g = getelementptr inbounds i8, ptr %p, i64 1 997 %l = load i64, ptr %g 998 %v = insertelement <vscale x 2 x i64> poison, i64 %l, i32 0 999 ret <vscale x 2 x i64> %v 1000} 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: ret 1008 %g = getelementptr inbounds i8, ptr %p, i64 1 1009 %l = load half, ptr %g 1010 %v = insertelement <vscale x 4 x half> poison, half %l, i32 0 1011 ret <vscale x 4 x half> %v 1012} 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: ret 1019 %g = getelementptr inbounds i8, ptr %p, i64 1 1020 %l = load half, ptr %g 1021 %v = insertelement <vscale x 8 x half> poison, half %l, i32 0 1022 ret <vscale x 8 x half> %v 1023} 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: ret 1030 %g = getelementptr inbounds i8, ptr %p, i64 1 1031 %l = load bfloat, ptr %g 1032 %v = insertelement <vscale x 4 x bfloat> poison, bfloat %l, i32 0 1033 ret <vscale x 4 x bfloat> %v 1034} 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: ret 1041 %g = getelementptr inbounds i8, ptr %p, i64 1 1042 %l = load bfloat, ptr %g 1043 %v = insertelement <vscale x 8 x bfloat> poison, bfloat %l, i32 0 1044 ret <vscale x 8 x bfloat> %v 1045} 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: ret 1052 %g = getelementptr inbounds i8, ptr %p, i64 1 1053 %l = load float, ptr %g 1054 %v = insertelement <vscale x 2 x float> poison, float %l, i32 0 1055 ret <vscale x 2 x float> %v 1056} 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: ret 1063 %g = getelementptr inbounds i8, ptr %p, i64 1 1064 %l = load float, ptr %g 1065 %v = insertelement <vscale x 4 x float> poison, float %l, i32 0 1066 ret <vscale x 4 x float> %v 1067} 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: ret 1074 %g = getelementptr inbounds i8, ptr %p, i64 1 1075 %l = load double, ptr %g 1076 %v = insertelement <vscale x 2 x double> poison, double %l, i32 0 1077 ret <vscale x 2 x double> %v 1078} 1079