1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s --check-prefixes=CHECK 3 4; LEGAL INTEGER TYPES 5 6define <vscale x 2 x i64> @stepvector_nxv2i64() { 7; CHECK-LABEL: stepvector_nxv2i64: 8; CHECK: // %bb.0: 9; CHECK-NEXT: index z0.d, #0, #1 10; CHECK-NEXT: ret 11 %1 = call <vscale x 2 x i64> @llvm.stepvector.nxv2i64() 12 ret <vscale x 2 x i64> %1 13} 14 15define <vscale x 4 x i32> @stepvector_nxv4i32() { 16; CHECK-LABEL: stepvector_nxv4i32: 17; CHECK: // %bb.0: 18; CHECK-NEXT: index z0.s, #0, #1 19; CHECK-NEXT: ret 20 %1 = call <vscale x 4 x i32> @llvm.stepvector.nxv4i32() 21 ret <vscale x 4 x i32> %1 22} 23 24define <vscale x 8 x i16> @stepvector_nxv8i16() { 25; CHECK-LABEL: stepvector_nxv8i16: 26; CHECK: // %bb.0: 27; CHECK-NEXT: index z0.h, #0, #1 28; CHECK-NEXT: ret 29 %1 = call <vscale x 8 x i16> @llvm.stepvector.nxv8i16() 30 ret <vscale x 8 x i16> %1 31} 32 33define <vscale x 16 x i8> @stepvector_nxv16i8() { 34; CHECK-LABEL: stepvector_nxv16i8: 35; CHECK: // %bb.0: 36; CHECK-NEXT: index z0.b, #0, #1 37; CHECK-NEXT: ret 38 %1 = call <vscale x 16 x i8> @llvm.stepvector.nxv16i8() 39 ret <vscale x 16 x i8> %1 40} 41 42; ILLEGAL INTEGER TYPES 43 44define <vscale x 6 x i64> @stepvector_nxv6i64() { 45; CHECK-LABEL: stepvector_nxv6i64: 46; CHECK: // %bb.0: 47; CHECK-NEXT: index z0.d, #0, #1 48; CHECK-NEXT: mov z2.d, z0.d 49; CHECK-NEXT: mov z1.d, z0.d 50; CHECK-NEXT: incd z1.d 51; CHECK-NEXT: incd z2.d, all, mul #2 52; CHECK-NEXT: ret 53 %1 = call <vscale x 6 x i64> @llvm.stepvector.nxv6i64() 54 ret <vscale x 6 x i64> %1 55} 56 57define <vscale x 4 x i64> @stepvector_nxv4i64() { 58; CHECK-LABEL: stepvector_nxv4i64: 59; CHECK: // %bb.0: 60; CHECK-NEXT: index z0.d, #0, #1 61; CHECK-NEXT: mov z1.d, z0.d 62; CHECK-NEXT: incd z1.d 63; CHECK-NEXT: ret 64 %1 = call <vscale x 4 x i64> @llvm.stepvector.nxv4i64() 65 ret <vscale x 4 x i64> %1 66} 67 68define <vscale x 16 x i32> @stepvector_nxv16i32() { 69; CHECK-LABEL: stepvector_nxv16i32: 70; CHECK: // %bb.0: 71; CHECK-NEXT: index z0.s, #0, #1 72; CHECK-NEXT: mov z1.d, z0.d 73; CHECK-NEXT: mov z2.d, z0.d 74; CHECK-NEXT: incw z1.s 75; CHECK-NEXT: incw z2.s, all, mul #2 76; CHECK-NEXT: mov z3.d, z1.d 77; CHECK-NEXT: incw z3.s, all, mul #2 78; CHECK-NEXT: ret 79 %1 = call <vscale x 16 x i32> @llvm.stepvector.nxv16i32() 80 ret <vscale x 16 x i32> %1 81} 82 83define <vscale x 3 x i32> @stepvector_nxv3i32() { 84; CHECK-LABEL: stepvector_nxv3i32: 85; CHECK: // %bb.0: 86; CHECK-NEXT: index z0.s, #0, #1 87; CHECK-NEXT: ret 88 %1 = call <vscale x 3 x i32> @llvm.stepvector.nxv3i32() 89 ret <vscale x 3 x i32> %1 90} 91 92define <vscale x 2 x i32> @stepvector_nxv2i32() { 93; CHECK-LABEL: stepvector_nxv2i32: 94; CHECK: // %bb.0: 95; CHECK-NEXT: index z0.d, #0, #1 96; CHECK-NEXT: ret 97 %1 = call <vscale x 2 x i32> @llvm.stepvector.nxv2i32() 98 ret <vscale x 2 x i32> %1 99} 100 101define <vscale x 4 x i16> @stepvector_nxv4i16() { 102; CHECK-LABEL: stepvector_nxv4i16: 103; CHECK: // %bb.0: 104; CHECK-NEXT: index z0.s, #0, #1 105; CHECK-NEXT: ret 106 %1 = call <vscale x 4 x i16> @llvm.stepvector.nxv4i16() 107 ret <vscale x 4 x i16> %1 108} 109 110define <vscale x 8 x i8> @stepvector_nxv8i8() { 111; CHECK-LABEL: stepvector_nxv8i8: 112; CHECK: // %bb.0: 113; CHECK-NEXT: index z0.h, #0, #1 114; CHECK-NEXT: ret 115 %1 = call <vscale x 8 x i8> @llvm.stepvector.nxv8i8() 116 ret <vscale x 8 x i8> %1 117} 118 119define <vscale x 8 x i8> @add_stepvector_nxv8i8() { 120; CHECK-LABEL: add_stepvector_nxv8i8: 121; CHECK: // %bb.0: 122; CHECK-NEXT: index z0.h, #0, #2 123; CHECK-NEXT: ret 124 %1 = call <vscale x 8 x i8> @llvm.stepvector.nxv8i8() 125 %2 = call <vscale x 8 x i8> @llvm.stepvector.nxv8i8() 126 %3 = add <vscale x 8 x i8> %1, %2 127 ret <vscale x 8 x i8> %3 128} 129 130define <vscale x 8 x i8> @add_stepvector_nxv8i8_1(<vscale x 8 x i8> %p) { 131; CHECK-LABEL: add_stepvector_nxv8i8_1: 132; CHECK: // %bb.0: 133; CHECK-NEXT: index z1.h, #0, #2 134; CHECK-NEXT: add z0.h, z0.h, z1.h 135; CHECK-NEXT: ret 136 %1 = call <vscale x 8 x i8> @llvm.stepvector.nxv8i8() 137 %2 = add <vscale x 8 x i8> %p, %1 138 %3 = call <vscale x 8 x i8> @llvm.stepvector.nxv8i8() 139 %4 = add <vscale x 8 x i8> %2, %3 140 ret <vscale x 8 x i8> %4 141} 142 143define <vscale x 8 x i8> @add_stepvector_nxv8i8_2() { 144; CHECK-LABEL: add_stepvector_nxv8i8_2: 145; CHECK: // %bb.0: 146; CHECK-NEXT: index z0.h, #2, #1 147; CHECK-NEXT: ret 148 %2 = call <vscale x 8 x i8> @llvm.stepvector.nxv8i8() 149 %3 = add <vscale x 8 x i8> %2, splat(i8 2) 150 ret <vscale x 8 x i8> %3 151} 152 153define <vscale x 8 x i8> @add_stepvector_nxv8i8_2_commutative() { 154; CHECK-LABEL: add_stepvector_nxv8i8_2_commutative: 155; CHECK: // %bb.0: 156; CHECK-NEXT: index z0.h, #2, #1 157; CHECK-NEXT: ret 158 %2 = call <vscale x 8 x i8> @llvm.stepvector.nxv8i8() 159 %3 = add <vscale x 8 x i8> splat(i8 2), %2 160 ret <vscale x 8 x i8> %3 161} 162 163define <vscale x 8 x i16> @add_stepvector_nxv8i16_1(i16 %data) { 164; CHECK-LABEL: add_stepvector_nxv8i16_1: 165; CHECK: // %bb.0: 166; CHECK-NEXT: index z0.h, w0, #1 167; CHECK-NEXT: ret 168 %1 = insertelement <vscale x 8 x i16> poison, i16 %data, i32 0 169 %2 = shufflevector <vscale x 8 x i16> %1, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer 170 %3 = call <vscale x 8 x i16> @llvm.stepvector.nxv8i16() 171 %4 = add <vscale x 8 x i16> %3, %2 172 ret <vscale x 8 x i16> %4 173} 174 175define <vscale x 4 x i32> @add_stepvector_nxv4i32_1(i32 %data) { 176; CHECK-LABEL: add_stepvector_nxv4i32_1: 177; CHECK: // %bb.0: 178; CHECK-NEXT: index z0.s, w0, #1 179; CHECK-NEXT: ret 180 %1 = insertelement <vscale x 4 x i32> poison, i32 %data, i32 0 181 %2 = shufflevector <vscale x 4 x i32> %1, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer 182 %3 = call <vscale x 4 x i32> @llvm.stepvector.nxv4i32() 183 %4 = add <vscale x 4 x i32> %3, %2 184 ret <vscale x 4 x i32> %4 185} 186 187define <vscale x 4 x i32> @multiple_use_stepvector_nxv4i32_1(i32 %data) { 188; CHECK-LABEL: multiple_use_stepvector_nxv4i32_1: 189; CHECK: // %bb.0: 190; CHECK-NEXT: index z0.s, w0, #1 191; CHECK-NEXT: mov z1.s, w0 192; CHECK-NEXT: ptrue p0.s 193; CHECK-NEXT: mul z1.s, p0/m, z1.s, z0.s 194; CHECK-NEXT: sub z0.s, z1.s, z0.s 195; CHECK-NEXT: ret 196 %1 = insertelement <vscale x 4 x i32> poison, i32 %data, i32 0 197 %2 = shufflevector <vscale x 4 x i32> %1, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer 198 %3 = call <vscale x 4 x i32> @llvm.stepvector.nxv4i32() 199 %4 = add <vscale x 4 x i32> %3, %2 200 %5 = mul <vscale x 4 x i32> %2, %4 201 %6 = sub <vscale x 4 x i32> %5, %4 202 ret <vscale x 4 x i32> %6 203} 204 205define <vscale x 2 x i64> @add_stepvector_nxv2i64_1(i64 %data) { 206; CHECK-LABEL: add_stepvector_nxv2i64_1: 207; CHECK: // %bb.0: 208; CHECK-NEXT: index z0.d, x0, #1 209; CHECK-NEXT: ret 210 %1 = insertelement <vscale x 2 x i64> poison, i64 %data, i32 0 211 %2 = shufflevector <vscale x 2 x i64> %1, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer 212 %3 = call <vscale x 2 x i64> @llvm.stepvector.nxv2i64() 213 %4 = add <vscale x 2 x i64> %2, %3 214 ret <vscale x 2 x i64> %4 215} 216 217define <vscale x 2 x i64> @multiple_use_stepvector_nxv2i64_1(i64 %data) { 218; CHECK-LABEL: multiple_use_stepvector_nxv2i64_1: 219; CHECK: // %bb.0: 220; CHECK-NEXT: index z0.d, #0, #1 221; CHECK-NEXT: mov z1.d, x0 222; CHECK-NEXT: ptrue p0.d 223; CHECK-NEXT: add z1.d, z0.d, z1.d 224; CHECK-NEXT: mul z0.d, p0/m, z0.d, z1.d 225; CHECK-NEXT: ret 226 %1 = insertelement <vscale x 2 x i64> poison, i64 %data, i32 0 227 %2 = shufflevector <vscale x 2 x i64> %1, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer 228 %3 = call <vscale x 2 x i64> @llvm.stepvector.nxv2i64() 229 %4 = add <vscale x 2 x i64> %2, %3 230 %5 = mul <vscale x 2 x i64> %4, %3 231 ret <vscale x 2 x i64> %5 232} 233 234define <vscale x 8 x i8> @mul_stepvector_nxv8i8() { 235; CHECK-LABEL: mul_stepvector_nxv8i8: 236; CHECK: // %bb.0: 237; CHECK-NEXT: index z0.h, #0, #2 238; CHECK-NEXT: ret 239 %2 = call <vscale x 8 x i8> @llvm.stepvector.nxv8i8() 240 %3 = mul <vscale x 8 x i8> %2, splat(i8 2) 241 ret <vscale x 8 x i8> %3 242} 243 244define <vscale x 2 x i64> @mul_stepvector_nxv2i64() { 245; CHECK-LABEL: mul_stepvector_nxv2i64: 246; CHECK: // %bb.0: 247; CHECK-NEXT: mov w8, #2222 // =0x8ae 248; CHECK-NEXT: index z0.d, #0, x8 249; CHECK-NEXT: ret 250 %2 = call <vscale x 2 x i64> @llvm.stepvector.nxv2i64() 251 %3 = mul <vscale x 2 x i64> %2, splat(i64 2222) 252 ret <vscale x 2 x i64> %3 253} 254 255define <vscale x 2 x i64> @mul_stepvector_bigconst_nxv2i64() { 256; CHECK-LABEL: mul_stepvector_bigconst_nxv2i64: 257; CHECK: // %bb.0: 258; CHECK-NEXT: mov x8, #146028888064 // =0x2200000000 259; CHECK-NEXT: index z0.d, #0, x8 260; CHECK-NEXT: ret 261 %2 = call <vscale x 2 x i64> @llvm.stepvector.nxv2i64() 262 %3 = mul <vscale x 2 x i64> %2, splat(i64 146028888064) 263 ret <vscale x 2 x i64> %3 264} 265 266define <vscale x 2 x i64> @mul_add_stepvector_nxv2i64(i64 %x) { 267; CHECK-LABEL: mul_add_stepvector_nxv2i64: 268; CHECK: // %bb.0: 269; CHECK-NEXT: mov w8, #2222 // =0x8ae 270; CHECK-NEXT: index z0.d, x0, x8 271; CHECK-NEXT: ret 272 %2 = call <vscale x 2 x i64> @llvm.stepvector.nxv2i64() 273 %3 = mul <vscale x 2 x i64> %2, splat(i64 2222) 274 %4 = insertelement <vscale x 2 x i64> poison, i64 %x, i32 0 275 %5 = shufflevector <vscale x 2 x i64> %4, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer 276 %6 = add <vscale x 2 x i64> %3, %5 277 ret <vscale x 2 x i64> %6 278} 279 280define <vscale x 2 x i64> @mul_add_stepvector_nxv2i64_commutative(i64 %x, i64 %y) { 281; CHECK-LABEL: mul_add_stepvector_nxv2i64_commutative: 282; CHECK: // %bb.0: 283; CHECK-NEXT: index z0.d, x0, x1 284; CHECK-NEXT: ret 285 %1 = insertelement <vscale x 2 x i64> poison, i64 %y, i32 0 286 %2 = shufflevector <vscale x 2 x i64> %1, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer 287 %3 = call <vscale x 2 x i64> @llvm.stepvector.nxv2i64() 288 %4 = mul <vscale x 2 x i64> %2, %3 289 %5 = insertelement <vscale x 2 x i64> poison, i64 %x, i32 0 290 %6 = shufflevector <vscale x 2 x i64> %5, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer 291 %7 = add <vscale x 2 x i64> %6, %4 292 ret <vscale x 2 x i64> %7 293} 294 295define <vscale x 2 x i64> @mul_add_stepvector_bigconst_nxv2i64(i64 %x) { 296; CHECK-LABEL: mul_add_stepvector_bigconst_nxv2i64: 297; CHECK: // %bb.0: 298; CHECK-NEXT: mov x8, #146028888064 // =0x2200000000 299; CHECK-NEXT: index z0.d, x0, x8 300; CHECK-NEXT: ret 301 %2 = call <vscale x 2 x i64> @llvm.stepvector.nxv2i64() 302 %3 = mul <vscale x 2 x i64> %2, splat(i64 146028888064) 303 %4 = insertelement <vscale x 2 x i64> poison, i64 %x, i32 0 304 %5 = shufflevector <vscale x 2 x i64> %4, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer 305 %6 = add <vscale x 2 x i64> %3, %5 306 ret <vscale x 2 x i64> %6 307} 308 309define <vscale x 2 x i64> @mul_mul_add_stepvector_nxv2i64(i64 %x, i64 %y) { 310; CHECK-LABEL: mul_mul_add_stepvector_nxv2i64: 311; CHECK: // %bb.0: 312; CHECK-NEXT: add x8, x0, x0, lsl #1 313; CHECK-NEXT: index z0.d, x1, x8 314; CHECK-NEXT: ret 315 %xmul = mul i64 %x, 3 316 %1 = insertelement <vscale x 2 x i64> poison, i64 %xmul, i32 0 317 %2 = shufflevector <vscale x 2 x i64> %1, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer 318 %3 = call <vscale x 2 x i64> @llvm.stepvector.nxv2i64() 319 %4 = mul <vscale x 2 x i64> %3, %2 320 %5 = insertelement <vscale x 2 x i64> poison, i64 %y, i32 0 321 %6 = shufflevector <vscale x 2 x i64> %5, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer 322 %7 = add <vscale x 2 x i64> %4, %6 323 ret <vscale x 2 x i64> %7 324} 325 326define <vscale x 8 x i8> @shl_stepvector_nxv8i8() { 327; CHECK-LABEL: shl_stepvector_nxv8i8: 328; CHECK: // %bb.0: 329; CHECK-NEXT: index z0.h, #0, #4 330; CHECK-NEXT: ret 331 %2 = call <vscale x 8 x i8> @llvm.stepvector.nxv8i8() 332 %3 = shl <vscale x 8 x i8> %2, splat(i8 2) 333 ret <vscale x 8 x i8> %3 334} 335 336define <vscale x 8 x i16> @sub_multiple_use_stepvector_nxv8i16() { 337; CHECK-LABEL: sub_multiple_use_stepvector_nxv8i16: 338; CHECK: // %bb.0: 339; CHECK-NEXT: index z0.h, #0, #1 340; CHECK-NEXT: ptrue p0.h 341; CHECK-NEXT: mov z1.d, z0.d 342; CHECK-NEXT: subr z1.h, z1.h, #2 // =0x2 343; CHECK-NEXT: lsl z0.h, p0/m, z0.h, z1.h 344; CHECK-NEXT: ret 345 %2 = call <vscale x 8 x i16> @llvm.stepvector.nxv8i16() 346 %3 = sub <vscale x 8 x i16> splat(i16 2), %2 347 %4 = shl <vscale x 8 x i16> %2, %3 348 ret <vscale x 8 x i16> %4 349} 350 351define <vscale x 8 x i16> @sub_stepvector_nxv8i16() { 352; CHECK-LABEL: sub_stepvector_nxv8i16: 353; CHECK: // %bb.0: 354; CHECK-NEXT: index z0.h, #2, #-1 355; CHECK-NEXT: ret 356 %2 = call <vscale x 8 x i16> @llvm.stepvector.nxv8i16() 357 %3 = sub <vscale x 8 x i16> splat(i16 2), %2 358 ret <vscale x 8 x i16> %3 359} 360 361define <vscale x 8 x i8> @promote_sub_stepvector_nxv8i8() { 362; CHECK-LABEL: promote_sub_stepvector_nxv8i8: 363; CHECK: // %bb.0: 364; CHECK-NEXT: index z0.h, #2, #-1 365; CHECK-NEXT: ret 366 %2 = call <vscale x 8 x i8> @llvm.stepvector.nxv8i8() 367 %3 = sub <vscale x 8 x i8> splat(i8 2), %2 368 ret <vscale x 8 x i8> %3 369} 370 371define <vscale x 16 x i32> @split_sub_stepvector_nxv16i32() { 372; CHECK-LABEL: split_sub_stepvector_nxv16i32: 373; CHECK: // %bb.0: 374; CHECK-NEXT: cntw x8 375; CHECK-NEXT: index z0.s, #0, #-1 376; CHECK-NEXT: neg x8, x8 377; CHECK-NEXT: mov z1.s, w8 378; CHECK-NEXT: cnth x8 379; CHECK-NEXT: neg x8, x8 380; CHECK-NEXT: mov z3.s, w8 381; CHECK-NEXT: add z1.s, z0.s, z1.s 382; CHECK-NEXT: add z2.s, z0.s, z3.s 383; CHECK-NEXT: add z3.s, z1.s, z3.s 384; CHECK-NEXT: ret 385 %1 = call <vscale x 16 x i32> @llvm.stepvector.nxv16i32() 386 %2 = sub <vscale x 16 x i32> zeroinitializer, %1 387 ret <vscale x 16 x i32> %2 388} 389 390declare <vscale x 2 x i64> @llvm.stepvector.nxv2i64() 391declare <vscale x 4 x i32> @llvm.stepvector.nxv4i32() 392declare <vscale x 8 x i16> @llvm.stepvector.nxv8i16() 393declare <vscale x 16 x i8> @llvm.stepvector.nxv16i8() 394 395declare <vscale x 6 x i64> @llvm.stepvector.nxv6i64() 396declare <vscale x 4 x i64> @llvm.stepvector.nxv4i64() 397declare <vscale x 16 x i32> @llvm.stepvector.nxv16i32() 398declare <vscale x 3 x i32> @llvm.stepvector.nxv3i32() 399declare <vscale x 2 x i32> @llvm.stepvector.nxv2i32() 400declare <vscale x 8 x i8> @llvm.stepvector.nxv8i8() 401declare <vscale x 4 x i16> @llvm.stepvector.nxv4i16() 402