402 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve < %s | FileCheck %s --check-prefixes=CHECK3 4; LEGAL INTEGER TYPES5 6define <vscale x 2 x i64> @stepvector_nxv2i64() {7; CHECK-LABEL: stepvector_nxv2i64:8; CHECK: // %bb.0:9; CHECK-NEXT: index z0.d, #0, #110; CHECK-NEXT: ret11 %1 = call <vscale x 2 x i64> @llvm.stepvector.nxv2i64()12 ret <vscale x 2 x i64> %113}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, #119; CHECK-NEXT: ret20 %1 = call <vscale x 4 x i32> @llvm.stepvector.nxv4i32()21 ret <vscale x 4 x i32> %122}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, #128; CHECK-NEXT: ret29 %1 = call <vscale x 8 x i16> @llvm.stepvector.nxv8i16()30 ret <vscale x 8 x i16> %131}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, #137; CHECK-NEXT: ret38 %1 = call <vscale x 16 x i8> @llvm.stepvector.nxv16i8()39 ret <vscale x 16 x i8> %140}41 42; ILLEGAL INTEGER TYPES43 44define <vscale x 6 x i64> @stepvector_nxv6i64() {45; CHECK-LABEL: stepvector_nxv6i64:46; CHECK: // %bb.0:47; CHECK-NEXT: index z0.d, #0, #148; CHECK-NEXT: mov z2.d, z0.d49; CHECK-NEXT: mov z1.d, z0.d50; CHECK-NEXT: incd z1.d51; CHECK-NEXT: incd z2.d, all, mul #252; CHECK-NEXT: ret53 %1 = call <vscale x 6 x i64> @llvm.stepvector.nxv6i64()54 ret <vscale x 6 x i64> %155}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, #161; CHECK-NEXT: mov z1.d, z0.d62; CHECK-NEXT: incd z1.d63; CHECK-NEXT: ret64 %1 = call <vscale x 4 x i64> @llvm.stepvector.nxv4i64()65 ret <vscale x 4 x i64> %166}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, #172; CHECK-NEXT: mov z1.d, z0.d73; CHECK-NEXT: mov z2.d, z0.d74; CHECK-NEXT: incw z1.s75; CHECK-NEXT: incw z2.s, all, mul #276; CHECK-NEXT: mov z3.d, z1.d77; CHECK-NEXT: incw z3.s, all, mul #278; CHECK-NEXT: ret79 %1 = call <vscale x 16 x i32> @llvm.stepvector.nxv16i32()80 ret <vscale x 16 x i32> %181}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, #187; CHECK-NEXT: ret88 %1 = call <vscale x 3 x i32> @llvm.stepvector.nxv3i32()89 ret <vscale x 3 x i32> %190}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, #196; CHECK-NEXT: ret97 %1 = call <vscale x 2 x i32> @llvm.stepvector.nxv2i32()98 ret <vscale x 2 x i32> %199}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, #1105; CHECK-NEXT: ret106 %1 = call <vscale x 4 x i16> @llvm.stepvector.nxv4i16()107 ret <vscale x 4 x i16> %1108}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, #1114; CHECK-NEXT: ret115 %1 = call <vscale x 8 x i8> @llvm.stepvector.nxv8i8()116 ret <vscale x 8 x i8> %1117}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, #2123; CHECK-NEXT: ret124 %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, %2127 ret <vscale x 8 x i8> %3128}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, #2134; CHECK-NEXT: add z0.h, z0.h, z1.h135; CHECK-NEXT: ret136 %1 = call <vscale x 8 x i8> @llvm.stepvector.nxv8i8()137 %2 = add <vscale x 8 x i8> %p, %1138 %3 = call <vscale x 8 x i8> @llvm.stepvector.nxv8i8()139 %4 = add <vscale x 8 x i8> %2, %3140 ret <vscale x 8 x i8> %4141}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, #1147; CHECK-NEXT: ret148 %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> %3151}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, #1157; CHECK-NEXT: ret158 %2 = call <vscale x 8 x i8> @llvm.stepvector.nxv8i8()159 %3 = add <vscale x 8 x i8> splat(i8 2), %2160 ret <vscale x 8 x i8> %3161}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, #1167; CHECK-NEXT: ret168 %1 = insertelement <vscale x 8 x i16> poison, i16 %data, i32 0169 %2 = shufflevector <vscale x 8 x i16> %1, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer170 %3 = call <vscale x 8 x i16> @llvm.stepvector.nxv8i16()171 %4 = add <vscale x 8 x i16> %3, %2172 ret <vscale x 8 x i16> %4173}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, #1179; CHECK-NEXT: ret180 %1 = insertelement <vscale x 4 x i32> poison, i32 %data, i32 0181 %2 = shufflevector <vscale x 4 x i32> %1, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer182 %3 = call <vscale x 4 x i32> @llvm.stepvector.nxv4i32()183 %4 = add <vscale x 4 x i32> %3, %2184 ret <vscale x 4 x i32> %4185}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, #1191; CHECK-NEXT: mov z1.s, w0192; CHECK-NEXT: ptrue p0.s193; CHECK-NEXT: mul z1.s, p0/m, z1.s, z0.s194; CHECK-NEXT: sub z0.s, z1.s, z0.s195; CHECK-NEXT: ret196 %1 = insertelement <vscale x 4 x i32> poison, i32 %data, i32 0197 %2 = shufflevector <vscale x 4 x i32> %1, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer198 %3 = call <vscale x 4 x i32> @llvm.stepvector.nxv4i32()199 %4 = add <vscale x 4 x i32> %3, %2200 %5 = mul <vscale x 4 x i32> %2, %4201 %6 = sub <vscale x 4 x i32> %5, %4202 ret <vscale x 4 x i32> %6203}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, #1209; CHECK-NEXT: ret210 %1 = insertelement <vscale x 2 x i64> poison, i64 %data, i32 0211 %2 = shufflevector <vscale x 2 x i64> %1, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer212 %3 = call <vscale x 2 x i64> @llvm.stepvector.nxv2i64()213 %4 = add <vscale x 2 x i64> %2, %3214 ret <vscale x 2 x i64> %4215}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, #1221; CHECK-NEXT: mov z1.d, x0222; CHECK-NEXT: ptrue p0.d223; CHECK-NEXT: add z1.d, z0.d, z1.d224; CHECK-NEXT: mul z0.d, p0/m, z0.d, z1.d225; CHECK-NEXT: ret226 %1 = insertelement <vscale x 2 x i64> poison, i64 %data, i32 0227 %2 = shufflevector <vscale x 2 x i64> %1, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer228 %3 = call <vscale x 2 x i64> @llvm.stepvector.nxv2i64()229 %4 = add <vscale x 2 x i64> %2, %3230 %5 = mul <vscale x 2 x i64> %4, %3231 ret <vscale x 2 x i64> %5232}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, #2238; CHECK-NEXT: ret239 %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> %3242}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 // =0x8ae248; CHECK-NEXT: index z0.d, #0, x8249; CHECK-NEXT: ret250 %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> %3253}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 // =0x2200000000259; CHECK-NEXT: index z0.d, #0, x8260; CHECK-NEXT: ret261 %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> %3264}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 // =0x8ae270; CHECK-NEXT: index z0.d, x0, x8271; CHECK-NEXT: ret272 %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 0275 %5 = shufflevector <vscale x 2 x i64> %4, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer276 %6 = add <vscale x 2 x i64> %3, %5277 ret <vscale x 2 x i64> %6278}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, x1284; CHECK-NEXT: ret285 %1 = insertelement <vscale x 2 x i64> poison, i64 %y, i32 0286 %2 = shufflevector <vscale x 2 x i64> %1, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer287 %3 = call <vscale x 2 x i64> @llvm.stepvector.nxv2i64()288 %4 = mul <vscale x 2 x i64> %2, %3289 %5 = insertelement <vscale x 2 x i64> poison, i64 %x, i32 0290 %6 = shufflevector <vscale x 2 x i64> %5, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer291 %7 = add <vscale x 2 x i64> %6, %4292 ret <vscale x 2 x i64> %7293}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 // =0x2200000000299; CHECK-NEXT: index z0.d, x0, x8300; CHECK-NEXT: ret301 %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 0304 %5 = shufflevector <vscale x 2 x i64> %4, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer305 %6 = add <vscale x 2 x i64> %3, %5306 ret <vscale x 2 x i64> %6307}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 #1313; CHECK-NEXT: index z0.d, x1, x8314; CHECK-NEXT: ret315 %xmul = mul i64 %x, 3316 %1 = insertelement <vscale x 2 x i64> poison, i64 %xmul, i32 0317 %2 = shufflevector <vscale x 2 x i64> %1, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer318 %3 = call <vscale x 2 x i64> @llvm.stepvector.nxv2i64()319 %4 = mul <vscale x 2 x i64> %3, %2320 %5 = insertelement <vscale x 2 x i64> poison, i64 %y, i32 0321 %6 = shufflevector <vscale x 2 x i64> %5, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer322 %7 = add <vscale x 2 x i64> %4, %6323 ret <vscale x 2 x i64> %7324}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, #4330; CHECK-NEXT: ret331 %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> %3334}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, #1340; CHECK-NEXT: ptrue p0.h341; CHECK-NEXT: mov z1.d, z0.d342; CHECK-NEXT: subr z1.h, z1.h, #2 // =0x2343; CHECK-NEXT: lsl z0.h, p0/m, z0.h, z1.h344; CHECK-NEXT: ret345 %2 = call <vscale x 8 x i16> @llvm.stepvector.nxv8i16()346 %3 = sub <vscale x 8 x i16> splat(i16 2), %2347 %4 = shl <vscale x 8 x i16> %2, %3348 ret <vscale x 8 x i16> %4349}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, #-1355; CHECK-NEXT: ret356 %2 = call <vscale x 8 x i16> @llvm.stepvector.nxv8i16()357 %3 = sub <vscale x 8 x i16> splat(i16 2), %2358 ret <vscale x 8 x i16> %3359}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, #-1365; CHECK-NEXT: ret366 %2 = call <vscale x 8 x i8> @llvm.stepvector.nxv8i8()367 %3 = sub <vscale x 8 x i8> splat(i8 2), %2368 ret <vscale x 8 x i8> %3369}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 x8375; CHECK-NEXT: index z0.s, #0, #-1376; CHECK-NEXT: neg x8, x8377; CHECK-NEXT: mov z1.s, w8378; CHECK-NEXT: cnth x8379; CHECK-NEXT: neg x8, x8380; CHECK-NEXT: mov z3.s, w8381; CHECK-NEXT: add z1.s, z0.s, z1.s382; CHECK-NEXT: add z2.s, z0.s, z3.s383; CHECK-NEXT: add z3.s, z1.s, z3.s384; CHECK-NEXT: ret385 %1 = call <vscale x 16 x i32> @llvm.stepvector.nxv16i32()386 %2 = sub <vscale x 16 x i32> zeroinitializer, %1387 ret <vscale x 16 x i32> %2388}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