619 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve,+bf16 < %s | FileCheck %s3 4define <vscale x 16 x i8> @test_lane0_16xi8(<vscale x 16 x i8> %a) {5; CHECK-LABEL: test_lane0_16xi8:6; CHECK: // %bb.0:7; CHECK-NEXT: ptrue p0.b, vl18; CHECK-NEXT: mov w8, #30 // =0x1e9; CHECK-NEXT: mov z0.b, p0/m, w810; CHECK-NEXT: ret11 %b = insertelement <vscale x 16 x i8> %a, i8 30, i32 012 ret <vscale x 16 x i8> %b13}14 15define <vscale x 8 x i16> @test_lane0_8xi16(<vscale x 8 x i16> %a) {16; CHECK-LABEL: test_lane0_8xi16:17; CHECK: // %bb.0:18; CHECK-NEXT: ptrue p0.h, vl119; CHECK-NEXT: mov w8, #30 // =0x1e20; CHECK-NEXT: mov z0.h, p0/m, w821; CHECK-NEXT: ret22 %b = insertelement <vscale x 8 x i16> %a, i16 30, i32 023 ret <vscale x 8 x i16> %b24}25 26define <vscale x 4 x i32> @test_lane0_4xi32(<vscale x 4 x i32> %a) {27; CHECK-LABEL: test_lane0_4xi32:28; CHECK: // %bb.0:29; CHECK-NEXT: ptrue p0.s, vl130; CHECK-NEXT: mov w8, #30 // =0x1e31; CHECK-NEXT: mov z0.s, p0/m, w832; CHECK-NEXT: ret33 %b = insertelement <vscale x 4 x i32> %a, i32 30, i32 034 ret <vscale x 4 x i32> %b35}36 37define <vscale x 2 x i64> @test_lane0_2xi64(<vscale x 2 x i64> %a) {38; CHECK-LABEL: test_lane0_2xi64:39; CHECK: // %bb.0:40; CHECK-NEXT: ptrue p0.d, vl141; CHECK-NEXT: mov w8, #30 // =0x1e42; CHECK-NEXT: mov z0.d, p0/m, x843; CHECK-NEXT: ret44 %b = insertelement <vscale x 2 x i64> %a, i64 30, i32 045 ret <vscale x 2 x i64> %b46}47 48define <vscale x 2 x double> @test_lane0_2xf64(<vscale x 2 x double> %a) {49; CHECK-LABEL: test_lane0_2xf64:50; CHECK: // %bb.0:51; CHECK-NEXT: fmov d1, #1.0000000052; CHECK-NEXT: ptrue p0.d, vl153; CHECK-NEXT: mov z0.d, p0/m, z1.d54; CHECK-NEXT: ret55 %b = insertelement <vscale x 2 x double> %a, double 1.0, i32 056 ret <vscale x 2 x double> %b57}58 59define <vscale x 4 x float> @test_lane0_4xf32(<vscale x 4 x float> %a) {60; CHECK-LABEL: test_lane0_4xf32:61; CHECK: // %bb.0:62; CHECK-NEXT: fmov s1, #1.0000000063; CHECK-NEXT: ptrue p0.s, vl164; CHECK-NEXT: mov z0.s, p0/m, z1.s65; CHECK-NEXT: ret66 %b = insertelement <vscale x 4 x float> %a, float 1.0, i32 067 ret <vscale x 4 x float> %b68}69 70define <vscale x 8 x half> @test_lane0_8xf16(<vscale x 8 x half> %a) {71; CHECK-LABEL: test_lane0_8xf16:72; CHECK: // %bb.0:73; CHECK-NEXT: fmov h1, #1.0000000074; CHECK-NEXT: ptrue p0.h, vl175; CHECK-NEXT: mov z0.h, p0/m, z1.h76; CHECK-NEXT: ret77 %b = insertelement <vscale x 8 x half> %a, half 1.0, i32 078 ret <vscale x 8 x half> %b79}80 81define <vscale x 8 x bfloat> @test_lane0_8xbf16(<vscale x 8 x bfloat> %a, bfloat %x) {82; CHECK-LABEL: test_lane0_8xbf16:83; CHECK: // %bb.0:84; CHECK-NEXT: ptrue p0.h, vl185; CHECK-NEXT: // kill: def $h1 killed $h1 def $z186; CHECK-NEXT: mov z0.h, p0/m, z1.h87; CHECK-NEXT: ret88 %b = insertelement <vscale x 8 x bfloat> %a, bfloat %x, i32 089 ret <vscale x 8 x bfloat> %b90}91 92; Undefined lane insert93define <vscale x 2 x i64> @test_lane4_2xi64(<vscale x 2 x i64> %a) {94; CHECK-LABEL: test_lane4_2xi64:95; CHECK: // %bb.0:96; CHECK-NEXT: mov w8, #4 // =0x497; CHECK-NEXT: index z1.d, #0, #198; CHECK-NEXT: ptrue p0.d99; CHECK-NEXT: mov z2.d, x8100; CHECK-NEXT: mov w8, #30 // =0x1e101; CHECK-NEXT: cmpeq p0.d, p0/z, z1.d, z2.d102; CHECK-NEXT: mov z0.d, p0/m, x8103; CHECK-NEXT: ret104 %b = insertelement <vscale x 2 x i64> %a, i64 30, i32 4105 ret <vscale x 2 x i64> %b106}107 108; Undefined lane insert109define <vscale x 8 x half> @test_lane9_8xf16(<vscale x 8 x half> %a) {110; CHECK-LABEL: test_lane9_8xf16:111; CHECK: // %bb.0:112; CHECK-NEXT: mov w8, #9 // =0x9113; CHECK-NEXT: index z1.h, #0, #1114; CHECK-NEXT: ptrue p0.h115; CHECK-NEXT: mov z2.h, w8116; CHECK-NEXT: cmpeq p0.h, p0/z, z1.h, z2.h117; CHECK-NEXT: fmov h1, #1.00000000118; CHECK-NEXT: mov z0.h, p0/m, h1119; CHECK-NEXT: ret120 %b = insertelement <vscale x 8 x half> %a, half 1.0, i32 9121 ret <vscale x 8 x half> %b122}123 124define <vscale x 8 x bfloat> @test_lane9_8xbf16(<vscale x 8 x bfloat> %a, bfloat %x) {125; CHECK-LABEL: test_lane9_8xbf16:126; CHECK: // %bb.0:127; CHECK-NEXT: mov w8, #9 // =0x9128; CHECK-NEXT: index z2.h, #0, #1129; CHECK-NEXT: ptrue p0.h130; CHECK-NEXT: mov z3.h, w8131; CHECK-NEXT: cmpeq p0.h, p0/z, z2.h, z3.h132; CHECK-NEXT: mov z0.h, p0/m, h1133; CHECK-NEXT: ret134 %b = insertelement <vscale x 8 x bfloat> %a, bfloat %x, i32 9135 ret <vscale x 8 x bfloat> %b136}137 138define <vscale x 16 x i8> @test_lane1_16xi8(<vscale x 16 x i8> %a) {139; CHECK-LABEL: test_lane1_16xi8:140; CHECK: // %bb.0:141; CHECK-NEXT: mov w8, #1 // =0x1142; CHECK-NEXT: index z1.b, #0, #1143; CHECK-NEXT: ptrue p0.b144; CHECK-NEXT: mov z2.b, w8145; CHECK-NEXT: mov w8, #30 // =0x1e146; CHECK-NEXT: cmpeq p0.b, p0/z, z1.b, z2.b147; CHECK-NEXT: mov z0.b, p0/m, w8148; CHECK-NEXT: ret149 %b = insertelement <vscale x 16 x i8> %a, i8 30, i32 1150 ret <vscale x 16 x i8> %b151}152 153define <vscale x 16 x i8> @test_lanex_16xi8(<vscale x 16 x i8> %a, i32 %x) {154; CHECK-LABEL: test_lanex_16xi8:155; CHECK: // %bb.0:156; CHECK-NEXT: index z1.b, #0, #1157; CHECK-NEXT: mov w8, w0158; CHECK-NEXT: ptrue p0.b159; CHECK-NEXT: mov z2.b, w8160; CHECK-NEXT: mov w8, #30 // =0x1e161; CHECK-NEXT: cmpeq p0.b, p0/z, z1.b, z2.b162; CHECK-NEXT: mov z0.b, p0/m, w8163; CHECK-NEXT: ret164 %b = insertelement <vscale x 16 x i8> %a, i8 30, i32 %x165 ret <vscale x 16 x i8> %b166}167 168 169; Redundant lane insert170define <vscale x 4 x i32> @extract_insert_4xi32(<vscale x 4 x i32> %a) {171; CHECK-LABEL: extract_insert_4xi32:172; CHECK: // %bb.0:173; CHECK-NEXT: ret174 %b = extractelement <vscale x 4 x i32> %a, i32 2175 %c = insertelement <vscale x 4 x i32> %a, i32 %b, i32 2176 ret <vscale x 4 x i32> %c177}178 179define <vscale x 8 x i16> @test_lane6_undef_8xi16(i16 %a) {180; CHECK-LABEL: test_lane6_undef_8xi16:181; CHECK: // %bb.0:182; CHECK-NEXT: mov w8, #6 // =0x6183; CHECK-NEXT: index z0.h, #0, #1184; CHECK-NEXT: ptrue p0.h185; CHECK-NEXT: mov z1.h, w8186; CHECK-NEXT: cmpeq p0.h, p0/z, z0.h, z1.h187; CHECK-NEXT: mov z0.h, p0/m, w0188; CHECK-NEXT: ret189 %b = insertelement <vscale x 8 x i16> poison, i16 %a, i32 6190 ret <vscale x 8 x i16> %b191}192 193define <vscale x 16 x i8> @test_lane0_undef_16xi8(i8 %a) {194; CHECK-LABEL: test_lane0_undef_16xi8:195; CHECK: // %bb.0:196; CHECK-NEXT: fmov s0, w0197; CHECK-NEXT: ret198 %b = insertelement <vscale x 16 x i8> poison, i8 %a, i32 0199 ret <vscale x 16 x i8> %b200}201 202define <vscale x 16 x i8> @test_insert0_of_extract0_16xi8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) {203; CHECK-LABEL: test_insert0_of_extract0_16xi8:204; CHECK: // %bb.0:205; CHECK-NEXT: fmov w8, s1206; CHECK-NEXT: ptrue p0.b, vl1207; CHECK-NEXT: mov z0.b, p0/m, w8208; CHECK-NEXT: ret209 %c = extractelement <vscale x 16 x i8> %b, i32 0210 %d = insertelement <vscale x 16 x i8> %a, i8 %c, i32 0211 ret <vscale x 16 x i8> %d212}213 214define <vscale x 16 x i8> @test_insert64_of_extract64_16xi8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) {215; CHECK-LABEL: test_insert64_of_extract64_16xi8:216; CHECK: // %bb.0:217; CHECK-NEXT: mov w8, #64 // =0x40218; CHECK-NEXT: whilels p0.b, xzr, x8219; CHECK-NEXT: mov z2.b, w8220; CHECK-NEXT: lastb w9, p0, z1.b221; CHECK-NEXT: index z1.b, #0, #1222; CHECK-NEXT: ptrue p0.b223; CHECK-NEXT: cmpeq p0.b, p0/z, z1.b, z2.b224; CHECK-NEXT: mov z0.b, p0/m, w9225; CHECK-NEXT: ret226 %c = extractelement <vscale x 16 x i8> %b, i32 64227 %d = insertelement <vscale x 16 x i8> %a, i8 %c, i32 64228 ret <vscale x 16 x i8> %d229}230 231define <vscale x 16 x i8> @test_insert3_of_extract1_16xi8(<vscale x 16 x i8> %a, <vscale x 16 x i8> %b) {232; CHECK-LABEL: test_insert3_of_extract1_16xi8:233; CHECK: // %bb.0:234; CHECK-NEXT: mov w8, #3 // =0x3235; CHECK-NEXT: index z2.b, #0, #1236; CHECK-NEXT: ptrue p0.b237; CHECK-NEXT: mov z3.b, w8238; CHECK-NEXT: umov w8, v1.b[1]239; CHECK-NEXT: cmpeq p0.b, p0/z, z2.b, z3.b240; CHECK-NEXT: mov z0.b, p0/m, w8241; CHECK-NEXT: ret242 %c = extractelement <vscale x 16 x i8> %b, i32 1243 %d = insertelement <vscale x 16 x i8> %a, i8 %c, i32 3244 ret <vscale x 16 x i8> %d245}246 247define <vscale x 8 x half> @test_insert_into_undef_nxv8f16(half %a) {248; CHECK-LABEL: test_insert_into_undef_nxv8f16:249; CHECK: // %bb.0:250; CHECK-NEXT: // kill: def $h0 killed $h0 def $z0251; CHECK-NEXT: ret252 %b = insertelement <vscale x 8 x half> poison, half %a, i32 0253 ret <vscale x 8 x half> %b254}255 256define <vscale x 4 x half> @test_insert_into_undef_nxv4f16(half %a) {257; CHECK-LABEL: test_insert_into_undef_nxv4f16:258; CHECK: // %bb.0:259; CHECK-NEXT: // kill: def $h0 killed $h0 def $z0260; CHECK-NEXT: ret261 %b = insertelement <vscale x 4 x half> poison, half %a, i32 0262 ret <vscale x 4 x half> %b263}264 265define <vscale x 2 x half> @test_insert_into_undef_nxv2f16(half %a) {266; CHECK-LABEL: test_insert_into_undef_nxv2f16:267; CHECK: // %bb.0:268; CHECK-NEXT: // kill: def $h0 killed $h0 def $z0269; CHECK-NEXT: ret270 %b = insertelement <vscale x 2 x half> poison, half %a, i32 0271 ret <vscale x 2 x half> %b272}273 274define <vscale x 8 x bfloat> @test_insert_into_undef_nxv8bf16(bfloat %a) {275; CHECK-LABEL: test_insert_into_undef_nxv8bf16:276; CHECK: // %bb.0:277; CHECK-NEXT: // kill: def $h0 killed $h0 def $z0278; CHECK-NEXT: ret279 %b = insertelement <vscale x 8 x bfloat> poison, bfloat %a, i32 0280 ret <vscale x 8 x bfloat> %b281}282 283define <vscale x 4 x bfloat> @test_insert_into_undef_nxv4bf16(bfloat %a) {284; CHECK-LABEL: test_insert_into_undef_nxv4bf16:285; CHECK: // %bb.0:286; CHECK-NEXT: // kill: def $h0 killed $h0 def $z0287; CHECK-NEXT: ret288 %b = insertelement <vscale x 4 x bfloat> poison, bfloat %a, i32 0289 ret <vscale x 4 x bfloat> %b290}291 292define <vscale x 2 x bfloat> @test_insert_into_undef_nxv2bf16(bfloat %a) {293; CHECK-LABEL: test_insert_into_undef_nxv2bf16:294; CHECK: // %bb.0:295; CHECK-NEXT: // kill: def $h0 killed $h0 def $z0296; CHECK-NEXT: ret297 %b = insertelement <vscale x 2 x bfloat> poison, bfloat %a, i32 0298 ret <vscale x 2 x bfloat> %b299}300 301define <vscale x 4 x float> @test_insert_into_undef_nxv4f32(float %a) {302; CHECK-LABEL: test_insert_into_undef_nxv4f32:303; CHECK: // %bb.0:304; CHECK-NEXT: // kill: def $s0 killed $s0 def $z0305; CHECK-NEXT: ret306 %b = insertelement <vscale x 4 x float> poison, float %a, i32 0307 ret <vscale x 4 x float> %b308}309 310define <vscale x 2 x float> @test_insert_into_undef_nxv2f32(float %a) {311; CHECK-LABEL: test_insert_into_undef_nxv2f32:312; CHECK: // %bb.0:313; CHECK-NEXT: // kill: def $s0 killed $s0 def $z0314; CHECK-NEXT: ret315 %b = insertelement <vscale x 2 x float> poison, float %a, i32 0316 ret <vscale x 2 x float> %b317}318 319define <vscale x 2 x double> @test_insert_into_undef_nxv2f64(double %a) {320; CHECK-LABEL: test_insert_into_undef_nxv2f64:321; CHECK: // %bb.0:322; CHECK-NEXT: // kill: def $d0 killed $d0 def $z0323; CHECK-NEXT: ret324 %b = insertelement <vscale x 2 x double> poison, double %a, i32 0325 ret <vscale x 2 x double> %b326}327 328; Insert scalar at index329define <vscale x 2 x half> @test_insert_with_index_nxv2f16(half %h, i64 %idx) {330; CHECK-LABEL: test_insert_with_index_nxv2f16:331; CHECK: // %bb.0:332; CHECK-NEXT: index z1.d, #0, #1333; CHECK-NEXT: mov z2.d, x0334; CHECK-NEXT: ptrue p0.d335; CHECK-NEXT: cmpeq p0.d, p0/z, z1.d, z2.d336; CHECK-NEXT: mov z0.h, p0/m, h0337; CHECK-NEXT: ret338 %res = insertelement <vscale x 2 x half> poison, half %h, i64 %idx339 ret <vscale x 2 x half> %res340}341 342define <vscale x 4 x half> @test_insert_with_index_nxv4f16(half %h, i64 %idx) {343; CHECK-LABEL: test_insert_with_index_nxv4f16:344; CHECK: // %bb.0:345; CHECK-NEXT: index z1.s, #0, #1346; CHECK-NEXT: mov z2.s, w0347; CHECK-NEXT: ptrue p0.s348; CHECK-NEXT: cmpeq p0.s, p0/z, z1.s, z2.s349; CHECK-NEXT: mov z0.h, p0/m, h0350; CHECK-NEXT: ret351 %res = insertelement <vscale x 4 x half> poison, half %h, i64 %idx352 ret <vscale x 4 x half> %res353}354 355define <vscale x 8 x half> @test_insert_with_index_nxv8f16(half %h, i64 %idx) {356; CHECK-LABEL: test_insert_with_index_nxv8f16:357; CHECK: // %bb.0:358; CHECK-NEXT: index z1.h, #0, #1359; CHECK-NEXT: mov z2.h, w0360; CHECK-NEXT: ptrue p0.h361; CHECK-NEXT: cmpeq p0.h, p0/z, z1.h, z2.h362; CHECK-NEXT: mov z0.h, p0/m, h0363; CHECK-NEXT: ret364 %res = insertelement <vscale x 8 x half> poison, half %h, i64 %idx365 ret <vscale x 8 x half> %res366}367 368define <vscale x 2 x bfloat> @test_insert_with_index_nxv2bf16(bfloat %h, i64 %idx) {369; CHECK-LABEL: test_insert_with_index_nxv2bf16:370; CHECK: // %bb.0:371; CHECK-NEXT: index z1.d, #0, #1372; CHECK-NEXT: mov z2.d, x0373; CHECK-NEXT: ptrue p0.d374; CHECK-NEXT: cmpeq p0.d, p0/z, z1.d, z2.d375; CHECK-NEXT: mov z0.h, p0/m, h0376; CHECK-NEXT: ret377 %res = insertelement <vscale x 2 x bfloat> poison, bfloat %h, i64 %idx378 ret <vscale x 2 x bfloat> %res379}380 381define <vscale x 4 x bfloat> @test_insert_with_index_nxv4bf16(bfloat %h, i64 %idx) {382; CHECK-LABEL: test_insert_with_index_nxv4bf16:383; CHECK: // %bb.0:384; CHECK-NEXT: index z1.s, #0, #1385; CHECK-NEXT: mov z2.s, w0386; CHECK-NEXT: ptrue p0.s387; CHECK-NEXT: cmpeq p0.s, p0/z, z1.s, z2.s388; CHECK-NEXT: mov z0.h, p0/m, h0389; CHECK-NEXT: ret390 %res = insertelement <vscale x 4 x bfloat> poison, bfloat %h, i64 %idx391 ret <vscale x 4 x bfloat> %res392}393 394define <vscale x 8 x bfloat> @test_insert_with_index_nxv8bf16(bfloat %h, i64 %idx) {395; CHECK-LABEL: test_insert_with_index_nxv8bf16:396; CHECK: // %bb.0:397; CHECK-NEXT: index z1.h, #0, #1398; CHECK-NEXT: mov z2.h, w0399; CHECK-NEXT: ptrue p0.h400; CHECK-NEXT: cmpeq p0.h, p0/z, z1.h, z2.h401; CHECK-NEXT: mov z0.h, p0/m, h0402; CHECK-NEXT: ret403 %res = insertelement <vscale x 8 x bfloat> poison, bfloat %h, i64 %idx404 ret <vscale x 8 x bfloat> %res405}406 407define <vscale x 2 x float> @test_insert_with_index_nxv2f32(float %f, i64 %idx) {408; CHECK-LABEL: test_insert_with_index_nxv2f32:409; CHECK: // %bb.0:410; CHECK-NEXT: index z1.d, #0, #1411; CHECK-NEXT: mov z2.d, x0412; CHECK-NEXT: ptrue p0.d413; CHECK-NEXT: cmpeq p0.d, p0/z, z1.d, z2.d414; CHECK-NEXT: mov z0.s, p0/m, s0415; CHECK-NEXT: ret416 %res = insertelement <vscale x 2 x float> poison, float %f, i64 %idx417 ret <vscale x 2 x float> %res418}419 420define <vscale x 4 x float> @test_insert_with_index_nxv4f32(float %f, i64 %idx) {421; CHECK-LABEL: test_insert_with_index_nxv4f32:422; CHECK: // %bb.0:423; CHECK-NEXT: index z1.s, #0, #1424; CHECK-NEXT: mov z2.s, w0425; CHECK-NEXT: ptrue p0.s426; CHECK-NEXT: cmpeq p0.s, p0/z, z1.s, z2.s427; CHECK-NEXT: mov z0.s, p0/m, s0428; CHECK-NEXT: ret429 %res = insertelement <vscale x 4 x float> poison, float %f, i64 %idx430 ret <vscale x 4 x float> %res431}432 433define <vscale x 2 x double> @test_insert_with_index_nxv2f64(double %d, i64 %idx) {434; CHECK-LABEL: test_insert_with_index_nxv2f64:435; CHECK: // %bb.0:436; CHECK-NEXT: index z1.d, #0, #1437; CHECK-NEXT: mov z2.d, x0438; CHECK-NEXT: ptrue p0.d439; CHECK-NEXT: cmpeq p0.d, p0/z, z1.d, z2.d440; CHECK-NEXT: mov z0.d, p0/m, d0441; CHECK-NEXT: ret442 %res = insertelement <vscale x 2 x double> poison, double %d, i64 %idx443 ret <vscale x 2 x double> %res444}445 446;Predicate insert447define <vscale x 2 x i1> @test_predicate_insert_2xi1_immediate (<vscale x 2 x i1> %val, i1 %elt) {448; CHECK-LABEL: test_predicate_insert_2xi1_immediate:449; CHECK: // %bb.0:450; CHECK-NEXT: mov z0.d, p0/z, #1 // =0x1451; CHECK-NEXT: ptrue p0.d, vl1452; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0453; CHECK-NEXT: mov z0.d, p0/m, x0454; CHECK-NEXT: ptrue p0.d455; CHECK-NEXT: and z0.d, z0.d, #0x1456; CHECK-NEXT: cmpne p0.d, p0/z, z0.d, #0457; CHECK-NEXT: ret458 %res = insertelement <vscale x 2 x i1> %val, i1 %elt, i32 0459 ret <vscale x 2 x i1> %res460}461 462define <vscale x 4 x i1> @test_predicate_insert_4xi1_immediate (<vscale x 4 x i1> %val, i1 %elt) {463; CHECK-LABEL: test_predicate_insert_4xi1_immediate:464; CHECK: // %bb.0:465; CHECK-NEXT: mov w8, #2 // =0x2466; CHECK-NEXT: index z0.s, #0, #1467; CHECK-NEXT: ptrue p1.s468; CHECK-NEXT: mov z1.s, w8469; CHECK-NEXT: cmpeq p2.s, p1/z, z0.s, z1.s470; CHECK-NEXT: mov z0.s, p0/z, #1 // =0x1471; CHECK-NEXT: mov z0.s, p2/m, w0472; CHECK-NEXT: and z0.s, z0.s, #0x1473; CHECK-NEXT: cmpne p0.s, p1/z, z0.s, #0474; CHECK-NEXT: ret475 %res = insertelement <vscale x 4 x i1> %val, i1 %elt, i32 2476 ret <vscale x 4 x i1> %res477}478 479define <vscale x 8 x i1> @test_predicate_insert_8xi1_immediate (<vscale x 8 x i1> %val, i32 %idx) {480; CHECK-LABEL: test_predicate_insert_8xi1_immediate:481; CHECK: // %bb.0:482; CHECK-NEXT: index z0.h, #0, #1483; CHECK-NEXT: mov w8, w0484; CHECK-NEXT: ptrue p1.h485; CHECK-NEXT: mov z1.h, w8486; CHECK-NEXT: mov w8, #1 // =0x1487; CHECK-NEXT: cmpeq p2.h, p1/z, z0.h, z1.h488; CHECK-NEXT: mov z0.h, p0/z, #1 // =0x1489; CHECK-NEXT: mov z0.h, p2/m, w8490; CHECK-NEXT: and z0.h, z0.h, #0x1491; CHECK-NEXT: cmpne p0.h, p1/z, z0.h, #0492; CHECK-NEXT: ret493 %res = insertelement <vscale x 8 x i1> %val, i1 1, i32 %idx494 ret <vscale x 8 x i1> %res495}496 497define <vscale x 16 x i1> @test_predicate_insert_16xi1_immediate (<vscale x 16 x i1> %val) {498; CHECK-LABEL: test_predicate_insert_16xi1_immediate:499; CHECK: // %bb.0:500; CHECK-NEXT: mov w8, #4 // =0x4501; CHECK-NEXT: index z0.b, #0, #1502; CHECK-NEXT: ptrue p1.b503; CHECK-NEXT: mov z1.b, w8504; CHECK-NEXT: mov w8, wzr505; CHECK-NEXT: cmpeq p2.b, p1/z, z0.b, z1.b506; CHECK-NEXT: mov z0.b, p0/z, #1 // =0x1507; CHECK-NEXT: mov z0.b, p2/m, w8508; CHECK-NEXT: and z0.b, z0.b, #0x1509; CHECK-NEXT: cmpne p0.b, p1/z, z0.b, #0510; CHECK-NEXT: ret511 %res = insertelement <vscale x 16 x i1> %val, i1 0, i32 4512 ret <vscale x 16 x i1> %res513}514 515 516define <vscale x 2 x i1> @test_predicate_insert_2xi1(<vscale x 2 x i1> %val, i1 %elt, i32 %idx) {517; CHECK-LABEL: test_predicate_insert_2xi1:518; CHECK: // %bb.0:519; CHECK-NEXT: index z0.d, #0, #1520; CHECK-NEXT: mov w8, w1521; CHECK-NEXT: ptrue p1.d522; CHECK-NEXT: mov z1.d, x8523; CHECK-NEXT: // kill: def $w0 killed $w0 def $x0524; CHECK-NEXT: cmpeq p2.d, p1/z, z0.d, z1.d525; CHECK-NEXT: mov z0.d, p0/z, #1 // =0x1526; CHECK-NEXT: mov z0.d, p2/m, x0527; CHECK-NEXT: and z0.d, z0.d, #0x1528; CHECK-NEXT: cmpne p0.d, p1/z, z0.d, #0529; CHECK-NEXT: ret530 %res = insertelement <vscale x 2 x i1> %val, i1 %elt, i32 %idx531 ret <vscale x 2 x i1> %res532}533 534define <vscale x 4 x i1> @test_predicate_insert_4xi1(<vscale x 4 x i1> %val, i1 %elt, i32 %idx) {535; CHECK-LABEL: test_predicate_insert_4xi1:536; CHECK: // %bb.0:537; CHECK-NEXT: index z0.s, #0, #1538; CHECK-NEXT: mov w8, w1539; CHECK-NEXT: ptrue p1.s540; CHECK-NEXT: mov z1.s, w8541; CHECK-NEXT: cmpeq p2.s, p1/z, z0.s, z1.s542; CHECK-NEXT: mov z0.s, p0/z, #1 // =0x1543; CHECK-NEXT: mov z0.s, p2/m, w0544; CHECK-NEXT: and z0.s, z0.s, #0x1545; CHECK-NEXT: cmpne p0.s, p1/z, z0.s, #0546; CHECK-NEXT: ret547 %res = insertelement <vscale x 4 x i1> %val, i1 %elt, i32 %idx548 ret <vscale x 4 x i1> %res549}550define <vscale x 8 x i1> @test_predicate_insert_8xi1(<vscale x 8 x i1> %val, i1 %elt, i32 %idx) {551; CHECK-LABEL: test_predicate_insert_8xi1:552; CHECK: // %bb.0:553; CHECK-NEXT: index z0.h, #0, #1554; CHECK-NEXT: mov w8, w1555; CHECK-NEXT: ptrue p1.h556; CHECK-NEXT: mov z1.h, w8557; CHECK-NEXT: cmpeq p2.h, p1/z, z0.h, z1.h558; CHECK-NEXT: mov z0.h, p0/z, #1 // =0x1559; CHECK-NEXT: mov z0.h, p2/m, w0560; CHECK-NEXT: and z0.h, z0.h, #0x1561; CHECK-NEXT: cmpne p0.h, p1/z, z0.h, #0562; CHECK-NEXT: ret563 %res = insertelement <vscale x 8 x i1> %val, i1 %elt, i32 %idx564 ret <vscale x 8 x i1> %res565}566 567define <vscale x 16 x i1> @test_predicate_insert_16xi1(<vscale x 16 x i1> %val, i1 %elt, i32 %idx) {568; CHECK-LABEL: test_predicate_insert_16xi1:569; CHECK: // %bb.0:570; CHECK-NEXT: index z0.b, #0, #1571; CHECK-NEXT: mov w8, w1572; CHECK-NEXT: ptrue p1.b573; CHECK-NEXT: mov z1.b, w8574; CHECK-NEXT: cmpeq p2.b, p1/z, z0.b, z1.b575; CHECK-NEXT: mov z0.b, p0/z, #1 // =0x1576; CHECK-NEXT: mov z0.b, p2/m, w0577; CHECK-NEXT: and z0.b, z0.b, #0x1578; CHECK-NEXT: cmpne p0.b, p1/z, z0.b, #0579; CHECK-NEXT: ret580 %res = insertelement <vscale x 16 x i1> %val, i1 %elt, i32 %idx581 ret <vscale x 16 x i1> %res582}583 584define <vscale x 32 x i1> @test_predicate_insert_32xi1(<vscale x 32 x i1> %val, i1 %elt, i32 %idx) uwtable {585; CHECK-LABEL: test_predicate_insert_32xi1:586; CHECK: // %bb.0:587; CHECK-NEXT: str x29, [sp, #-16]! // 8-byte Folded Spill588; CHECK-NEXT: .cfi_def_cfa_offset 16589; CHECK-NEXT: .cfi_offset w29, -16590; CHECK-NEXT: addvl sp, sp, #-2591; CHECK-NEXT: .cfi_escape 0x0f, 0x08, 0x8f, 0x10, 0x92, 0x2e, 0x00, 0x40, 0x1e, 0x22 // sp + 16 + 16 * VG592; CHECK-NEXT: rdvl x8, #2593; CHECK-NEXT: mov z0.b, p1/z, #1 // =0x1594; CHECK-NEXT: mov z1.b, p0/z, #1 // =0x1595; CHECK-NEXT: sub x8, x8, #1596; CHECK-NEXT: mov w9, w1597; CHECK-NEXT: ptrue p1.b598; CHECK-NEXT: cmp x9, x8599; CHECK-NEXT: csel x8, x9, x8, lo600; CHECK-NEXT: mov x9, sp601; CHECK-NEXT: str z0, [sp, #1, mul vl]602; CHECK-NEXT: str z1, [sp]603; CHECK-NEXT: strb w0, [x9, x8]604; CHECK-NEXT: ldr z0, [sp]605; CHECK-NEXT: ldr z1, [sp, #1, mul vl]606; CHECK-NEXT: and z0.b, z0.b, #0x1607; CHECK-NEXT: and z1.b, z1.b, #0x1608; CHECK-NEXT: cmpne p0.b, p1/z, z0.b, #0609; CHECK-NEXT: cmpne p1.b, p1/z, z1.b, #0610; CHECK-NEXT: addvl sp, sp, #2611; CHECK-NEXT: .cfi_def_cfa wsp, 16612; CHECK-NEXT: ldr x29, [sp], #16 // 8-byte Folded Reload613; CHECK-NEXT: .cfi_def_cfa_offset 0614; CHECK-NEXT: .cfi_restore w29615; CHECK-NEXT: ret616 %res = insertelement <vscale x 32 x i1> %val, i1 %elt, i32 %idx617 ret <vscale x 32 x i1> %res618}619