841 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+v -target-abi=ilp32d \3; RUN: -verify-machineinstrs < %s | FileCheck %s4 5define <vscale x 1 x i8> @insertelt_nxv1i8_0(<vscale x 1 x i8> %v, i8 signext %elt) {6; CHECK-LABEL: insertelt_nxv1i8_0:7; CHECK: # %bb.0:8; CHECK-NEXT: vsetvli a1, zero, e8, m1, tu, ma9; CHECK-NEXT: vmv.s.x v8, a010; CHECK-NEXT: ret11 %r = insertelement <vscale x 1 x i8> %v, i8 %elt, i32 012 ret <vscale x 1 x i8> %r13}14 15define <vscale x 1 x i8> @insertelt_nxv1i8_imm(<vscale x 1 x i8> %v, i8 signext %elt) {16; CHECK-LABEL: insertelt_nxv1i8_imm:17; CHECK: # %bb.0:18; CHECK-NEXT: vsetivli zero, 4, e8, mf8, tu, ma19; CHECK-NEXT: vmv.s.x v9, a020; CHECK-NEXT: vslideup.vi v8, v9, 321; CHECK-NEXT: ret22 %r = insertelement <vscale x 1 x i8> %v, i8 %elt, i32 323 ret <vscale x 1 x i8> %r24}25 26define <vscale x 1 x i8> @insertelt_nxv1i8_idx(<vscale x 1 x i8> %v, i8 signext %elt, i32 signext %idx) {27; CHECK-LABEL: insertelt_nxv1i8_idx:28; CHECK: # %bb.0:29; CHECK-NEXT: addi a2, a1, 130; CHECK-NEXT: vsetvli a3, zero, e8, m1, ta, ma31; CHECK-NEXT: vmv.s.x v9, a032; CHECK-NEXT: vsetvli zero, a2, e8, mf8, tu, ma33; CHECK-NEXT: vslideup.vx v8, v9, a134; CHECK-NEXT: ret35 %r = insertelement <vscale x 1 x i8> %v, i8 %elt, i32 %idx36 ret <vscale x 1 x i8> %r37}38 39define <vscale x 2 x i8> @insertelt_nxv2i8_0(<vscale x 2 x i8> %v, i8 signext %elt) {40; CHECK-LABEL: insertelt_nxv2i8_0:41; CHECK: # %bb.0:42; CHECK-NEXT: vsetvli a1, zero, e8, m1, tu, ma43; CHECK-NEXT: vmv.s.x v8, a044; CHECK-NEXT: ret45 %r = insertelement <vscale x 2 x i8> %v, i8 %elt, i32 046 ret <vscale x 2 x i8> %r47}48 49define <vscale x 2 x i8> @insertelt_nxv2i8_imm(<vscale x 2 x i8> %v, i8 signext %elt) {50; CHECK-LABEL: insertelt_nxv2i8_imm:51; CHECK: # %bb.0:52; CHECK-NEXT: vsetivli zero, 4, e8, mf4, tu, ma53; CHECK-NEXT: vmv.s.x v9, a054; CHECK-NEXT: vslideup.vi v8, v9, 355; CHECK-NEXT: ret56 %r = insertelement <vscale x 2 x i8> %v, i8 %elt, i32 357 ret <vscale x 2 x i8> %r58}59 60define <vscale x 2 x i8> @insertelt_nxv2i8_idx(<vscale x 2 x i8> %v, i8 signext %elt, i32 signext %idx) {61; CHECK-LABEL: insertelt_nxv2i8_idx:62; CHECK: # %bb.0:63; CHECK-NEXT: addi a2, a1, 164; CHECK-NEXT: vsetvli a3, zero, e8, m1, ta, ma65; CHECK-NEXT: vmv.s.x v9, a066; CHECK-NEXT: vsetvli zero, a2, e8, mf4, tu, ma67; CHECK-NEXT: vslideup.vx v8, v9, a168; CHECK-NEXT: ret69 %r = insertelement <vscale x 2 x i8> %v, i8 %elt, i32 %idx70 ret <vscale x 2 x i8> %r71}72 73define <vscale x 4 x i8> @insertelt_nxv4i8_0(<vscale x 4 x i8> %v, i8 signext %elt) {74; CHECK-LABEL: insertelt_nxv4i8_0:75; CHECK: # %bb.0:76; CHECK-NEXT: vsetvli a1, zero, e8, m1, tu, ma77; CHECK-NEXT: vmv.s.x v8, a078; CHECK-NEXT: ret79 %r = insertelement <vscale x 4 x i8> %v, i8 %elt, i32 080 ret <vscale x 4 x i8> %r81}82 83define <vscale x 4 x i8> @insertelt_nxv4i8_imm(<vscale x 4 x i8> %v, i8 signext %elt) {84; CHECK-LABEL: insertelt_nxv4i8_imm:85; CHECK: # %bb.0:86; CHECK-NEXT: vsetivli zero, 4, e8, mf2, tu, ma87; CHECK-NEXT: vmv.s.x v9, a088; CHECK-NEXT: vslideup.vi v8, v9, 389; CHECK-NEXT: ret90 %r = insertelement <vscale x 4 x i8> %v, i8 %elt, i32 391 ret <vscale x 4 x i8> %r92}93 94define <vscale x 4 x i8> @insertelt_nxv4i8_idx(<vscale x 4 x i8> %v, i8 signext %elt, i32 signext %idx) {95; CHECK-LABEL: insertelt_nxv4i8_idx:96; CHECK: # %bb.0:97; CHECK-NEXT: addi a2, a1, 198; CHECK-NEXT: vsetvli a3, zero, e8, m1, ta, ma99; CHECK-NEXT: vmv.s.x v9, a0100; CHECK-NEXT: vsetvli zero, a2, e8, mf2, tu, ma101; CHECK-NEXT: vslideup.vx v8, v9, a1102; CHECK-NEXT: ret103 %r = insertelement <vscale x 4 x i8> %v, i8 %elt, i32 %idx104 ret <vscale x 4 x i8> %r105}106 107define <vscale x 8 x i8> @insertelt_nxv8i8_0(<vscale x 8 x i8> %v, i8 signext %elt) {108; CHECK-LABEL: insertelt_nxv8i8_0:109; CHECK: # %bb.0:110; CHECK-NEXT: vsetvli a1, zero, e8, m1, tu, ma111; CHECK-NEXT: vmv.s.x v8, a0112; CHECK-NEXT: ret113 %r = insertelement <vscale x 8 x i8> %v, i8 %elt, i32 0114 ret <vscale x 8 x i8> %r115}116 117define <vscale x 8 x i8> @insertelt_nxv8i8_imm(<vscale x 8 x i8> %v, i8 signext %elt) {118; CHECK-LABEL: insertelt_nxv8i8_imm:119; CHECK: # %bb.0:120; CHECK-NEXT: vsetivli zero, 4, e8, m1, tu, ma121; CHECK-NEXT: vmv.s.x v9, a0122; CHECK-NEXT: vslideup.vi v8, v9, 3123; CHECK-NEXT: ret124 %r = insertelement <vscale x 8 x i8> %v, i8 %elt, i32 3125 ret <vscale x 8 x i8> %r126}127 128define <vscale x 8 x i8> @insertelt_nxv8i8_idx(<vscale x 8 x i8> %v, i8 signext %elt, i32 signext %idx) {129; CHECK-LABEL: insertelt_nxv8i8_idx:130; CHECK: # %bb.0:131; CHECK-NEXT: addi a2, a1, 1132; CHECK-NEXT: vsetvli a3, zero, e8, m1, ta, ma133; CHECK-NEXT: vmv.s.x v9, a0134; CHECK-NEXT: vsetvli zero, a2, e8, m1, tu, ma135; CHECK-NEXT: vslideup.vx v8, v9, a1136; CHECK-NEXT: ret137 %r = insertelement <vscale x 8 x i8> %v, i8 %elt, i32 %idx138 ret <vscale x 8 x i8> %r139}140 141define <vscale x 16 x i8> @insertelt_nxv16i8_0(<vscale x 16 x i8> %v, i8 signext %elt) {142; CHECK-LABEL: insertelt_nxv16i8_0:143; CHECK: # %bb.0:144; CHECK-NEXT: vsetvli a1, zero, e8, m1, tu, ma145; CHECK-NEXT: vmv.s.x v8, a0146; CHECK-NEXT: ret147 %r = insertelement <vscale x 16 x i8> %v, i8 %elt, i32 0148 ret <vscale x 16 x i8> %r149}150 151define <vscale x 16 x i8> @insertelt_nxv16i8_imm(<vscale x 16 x i8> %v, i8 signext %elt) {152; CHECK-LABEL: insertelt_nxv16i8_imm:153; CHECK: # %bb.0:154; CHECK-NEXT: vsetivli zero, 4, e8, m1, tu, ma155; CHECK-NEXT: vmv.s.x v10, a0156; CHECK-NEXT: vslideup.vi v8, v10, 3157; CHECK-NEXT: ret158 %r = insertelement <vscale x 16 x i8> %v, i8 %elt, i32 3159 ret <vscale x 16 x i8> %r160}161 162define <vscale x 16 x i8> @insertelt_nxv16i8_idx(<vscale x 16 x i8> %v, i8 signext %elt, i32 signext %idx) {163; CHECK-LABEL: insertelt_nxv16i8_idx:164; CHECK: # %bb.0:165; CHECK-NEXT: vsetvli a2, zero, e8, m1, ta, ma166; CHECK-NEXT: vmv.s.x v10, a0167; CHECK-NEXT: addi a0, a1, 1168; CHECK-NEXT: vsetvli zero, a0, e8, m2, tu, ma169; CHECK-NEXT: vslideup.vx v8, v10, a1170; CHECK-NEXT: ret171 %r = insertelement <vscale x 16 x i8> %v, i8 %elt, i32 %idx172 ret <vscale x 16 x i8> %r173}174 175define <vscale x 32 x i8> @insertelt_nxv32i8_0(<vscale x 32 x i8> %v, i8 signext %elt) {176; CHECK-LABEL: insertelt_nxv32i8_0:177; CHECK: # %bb.0:178; CHECK-NEXT: vsetvli a1, zero, e8, m1, tu, ma179; CHECK-NEXT: vmv.s.x v8, a0180; CHECK-NEXT: ret181 %r = insertelement <vscale x 32 x i8> %v, i8 %elt, i32 0182 ret <vscale x 32 x i8> %r183}184 185define <vscale x 32 x i8> @insertelt_nxv32i8_imm(<vscale x 32 x i8> %v, i8 signext %elt) {186; CHECK-LABEL: insertelt_nxv32i8_imm:187; CHECK: # %bb.0:188; CHECK-NEXT: vsetivli zero, 4, e8, m1, tu, ma189; CHECK-NEXT: vmv.s.x v12, a0190; CHECK-NEXT: vslideup.vi v8, v12, 3191; CHECK-NEXT: ret192 %r = insertelement <vscale x 32 x i8> %v, i8 %elt, i32 3193 ret <vscale x 32 x i8> %r194}195 196define <vscale x 32 x i8> @insertelt_nxv32i8_idx(<vscale x 32 x i8> %v, i8 signext %elt, i32 signext %idx) {197; CHECK-LABEL: insertelt_nxv32i8_idx:198; CHECK: # %bb.0:199; CHECK-NEXT: vsetvli a2, zero, e8, m1, ta, ma200; CHECK-NEXT: vmv.s.x v12, a0201; CHECK-NEXT: addi a0, a1, 1202; CHECK-NEXT: vsetvli zero, a0, e8, m4, tu, ma203; CHECK-NEXT: vslideup.vx v8, v12, a1204; CHECK-NEXT: ret205 %r = insertelement <vscale x 32 x i8> %v, i8 %elt, i32 %idx206 ret <vscale x 32 x i8> %r207}208 209define <vscale x 64 x i8> @insertelt_nxv64i8_0(<vscale x 64 x i8> %v, i8 signext %elt) {210; CHECK-LABEL: insertelt_nxv64i8_0:211; CHECK: # %bb.0:212; CHECK-NEXT: vsetvli a1, zero, e8, m1, tu, ma213; CHECK-NEXT: vmv.s.x v8, a0214; CHECK-NEXT: ret215 %r = insertelement <vscale x 64 x i8> %v, i8 %elt, i32 0216 ret <vscale x 64 x i8> %r217}218 219define <vscale x 64 x i8> @insertelt_nxv64i8_imm(<vscale x 64 x i8> %v, i8 signext %elt) {220; CHECK-LABEL: insertelt_nxv64i8_imm:221; CHECK: # %bb.0:222; CHECK-NEXT: vsetivli zero, 4, e8, m1, tu, ma223; CHECK-NEXT: vmv.s.x v16, a0224; CHECK-NEXT: vslideup.vi v8, v16, 3225; CHECK-NEXT: ret226 %r = insertelement <vscale x 64 x i8> %v, i8 %elt, i32 3227 ret <vscale x 64 x i8> %r228}229 230define <vscale x 64 x i8> @insertelt_nxv64i8_idx(<vscale x 64 x i8> %v, i8 signext %elt, i32 signext %idx) {231; CHECK-LABEL: insertelt_nxv64i8_idx:232; CHECK: # %bb.0:233; CHECK-NEXT: vsetvli a2, zero, e8, m1, ta, ma234; CHECK-NEXT: vmv.s.x v16, a0235; CHECK-NEXT: addi a0, a1, 1236; CHECK-NEXT: vsetvli zero, a0, e8, m8, tu, ma237; CHECK-NEXT: vslideup.vx v8, v16, a1238; CHECK-NEXT: ret239 %r = insertelement <vscale x 64 x i8> %v, i8 %elt, i32 %idx240 ret <vscale x 64 x i8> %r241}242 243define <vscale x 1 x i16> @insertelt_nxv1i16_0(<vscale x 1 x i16> %v, i16 signext %elt) {244; CHECK-LABEL: insertelt_nxv1i16_0:245; CHECK: # %bb.0:246; CHECK-NEXT: vsetvli a1, zero, e16, m1, tu, ma247; CHECK-NEXT: vmv.s.x v8, a0248; CHECK-NEXT: ret249 %r = insertelement <vscale x 1 x i16> %v, i16 %elt, i32 0250 ret <vscale x 1 x i16> %r251}252 253define <vscale x 1 x i16> @insertelt_nxv1i16_imm(<vscale x 1 x i16> %v, i16 signext %elt) {254; CHECK-LABEL: insertelt_nxv1i16_imm:255; CHECK: # %bb.0:256; CHECK-NEXT: vsetivli zero, 4, e16, mf4, tu, ma257; CHECK-NEXT: vmv.s.x v9, a0258; CHECK-NEXT: vslideup.vi v8, v9, 3259; CHECK-NEXT: ret260 %r = insertelement <vscale x 1 x i16> %v, i16 %elt, i32 3261 ret <vscale x 1 x i16> %r262}263 264define <vscale x 1 x i16> @insertelt_nxv1i16_idx(<vscale x 1 x i16> %v, i16 signext %elt, i32 signext %idx) {265; CHECK-LABEL: insertelt_nxv1i16_idx:266; CHECK: # %bb.0:267; CHECK-NEXT: addi a2, a1, 1268; CHECK-NEXT: vsetvli a3, zero, e16, m1, ta, ma269; CHECK-NEXT: vmv.s.x v9, a0270; CHECK-NEXT: vsetvli zero, a2, e16, mf4, tu, ma271; CHECK-NEXT: vslideup.vx v8, v9, a1272; CHECK-NEXT: ret273 %r = insertelement <vscale x 1 x i16> %v, i16 %elt, i32 %idx274 ret <vscale x 1 x i16> %r275}276 277define <vscale x 2 x i16> @insertelt_nxv2i16_0(<vscale x 2 x i16> %v, i16 signext %elt) {278; CHECK-LABEL: insertelt_nxv2i16_0:279; CHECK: # %bb.0:280; CHECK-NEXT: vsetvli a1, zero, e16, m1, tu, ma281; CHECK-NEXT: vmv.s.x v8, a0282; CHECK-NEXT: ret283 %r = insertelement <vscale x 2 x i16> %v, i16 %elt, i32 0284 ret <vscale x 2 x i16> %r285}286 287define <vscale x 2 x i16> @insertelt_nxv2i16_imm(<vscale x 2 x i16> %v, i16 signext %elt) {288; CHECK-LABEL: insertelt_nxv2i16_imm:289; CHECK: # %bb.0:290; CHECK-NEXT: vsetivli zero, 4, e16, mf2, tu, ma291; CHECK-NEXT: vmv.s.x v9, a0292; CHECK-NEXT: vslideup.vi v8, v9, 3293; CHECK-NEXT: ret294 %r = insertelement <vscale x 2 x i16> %v, i16 %elt, i32 3295 ret <vscale x 2 x i16> %r296}297 298define <vscale x 2 x i16> @insertelt_nxv2i16_idx(<vscale x 2 x i16> %v, i16 signext %elt, i32 signext %idx) {299; CHECK-LABEL: insertelt_nxv2i16_idx:300; CHECK: # %bb.0:301; CHECK-NEXT: addi a2, a1, 1302; CHECK-NEXT: vsetvli a3, zero, e16, m1, ta, ma303; CHECK-NEXT: vmv.s.x v9, a0304; CHECK-NEXT: vsetvli zero, a2, e16, mf2, tu, ma305; CHECK-NEXT: vslideup.vx v8, v9, a1306; CHECK-NEXT: ret307 %r = insertelement <vscale x 2 x i16> %v, i16 %elt, i32 %idx308 ret <vscale x 2 x i16> %r309}310 311define <vscale x 4 x i16> @insertelt_nxv4i16_0(<vscale x 4 x i16> %v, i16 signext %elt) {312; CHECK-LABEL: insertelt_nxv4i16_0:313; CHECK: # %bb.0:314; CHECK-NEXT: vsetvli a1, zero, e16, m1, tu, ma315; CHECK-NEXT: vmv.s.x v8, a0316; CHECK-NEXT: ret317 %r = insertelement <vscale x 4 x i16> %v, i16 %elt, i32 0318 ret <vscale x 4 x i16> %r319}320 321define <vscale x 4 x i16> @insertelt_nxv4i16_imm(<vscale x 4 x i16> %v, i16 signext %elt) {322; CHECK-LABEL: insertelt_nxv4i16_imm:323; CHECK: # %bb.0:324; CHECK-NEXT: vsetivli zero, 4, e16, m1, tu, ma325; CHECK-NEXT: vmv.s.x v9, a0326; CHECK-NEXT: vslideup.vi v8, v9, 3327; CHECK-NEXT: ret328 %r = insertelement <vscale x 4 x i16> %v, i16 %elt, i32 3329 ret <vscale x 4 x i16> %r330}331 332define <vscale x 4 x i16> @insertelt_nxv4i16_idx(<vscale x 4 x i16> %v, i16 signext %elt, i32 signext %idx) {333; CHECK-LABEL: insertelt_nxv4i16_idx:334; CHECK: # %bb.0:335; CHECK-NEXT: addi a2, a1, 1336; CHECK-NEXT: vsetvli a3, zero, e16, m1, ta, ma337; CHECK-NEXT: vmv.s.x v9, a0338; CHECK-NEXT: vsetvli zero, a2, e16, m1, tu, ma339; CHECK-NEXT: vslideup.vx v8, v9, a1340; CHECK-NEXT: ret341 %r = insertelement <vscale x 4 x i16> %v, i16 %elt, i32 %idx342 ret <vscale x 4 x i16> %r343}344 345define <vscale x 8 x i16> @insertelt_nxv8i16_0(<vscale x 8 x i16> %v, i16 signext %elt) {346; CHECK-LABEL: insertelt_nxv8i16_0:347; CHECK: # %bb.0:348; CHECK-NEXT: vsetvli a1, zero, e16, m1, tu, ma349; CHECK-NEXT: vmv.s.x v8, a0350; CHECK-NEXT: ret351 %r = insertelement <vscale x 8 x i16> %v, i16 %elt, i32 0352 ret <vscale x 8 x i16> %r353}354 355define <vscale x 8 x i16> @insertelt_nxv8i16_imm(<vscale x 8 x i16> %v, i16 signext %elt) {356; CHECK-LABEL: insertelt_nxv8i16_imm:357; CHECK: # %bb.0:358; CHECK-NEXT: vsetivli zero, 4, e16, m1, tu, ma359; CHECK-NEXT: vmv.s.x v10, a0360; CHECK-NEXT: vslideup.vi v8, v10, 3361; CHECK-NEXT: ret362 %r = insertelement <vscale x 8 x i16> %v, i16 %elt, i32 3363 ret <vscale x 8 x i16> %r364}365 366define <vscale x 8 x i16> @insertelt_nxv8i16_idx(<vscale x 8 x i16> %v, i16 signext %elt, i32 signext %idx) {367; CHECK-LABEL: insertelt_nxv8i16_idx:368; CHECK: # %bb.0:369; CHECK-NEXT: vsetvli a2, zero, e16, m1, ta, ma370; CHECK-NEXT: vmv.s.x v10, a0371; CHECK-NEXT: addi a0, a1, 1372; CHECK-NEXT: vsetvli zero, a0, e16, m2, tu, ma373; CHECK-NEXT: vslideup.vx v8, v10, a1374; CHECK-NEXT: ret375 %r = insertelement <vscale x 8 x i16> %v, i16 %elt, i32 %idx376 ret <vscale x 8 x i16> %r377}378 379define <vscale x 16 x i16> @insertelt_nxv16i16_0(<vscale x 16 x i16> %v, i16 signext %elt) {380; CHECK-LABEL: insertelt_nxv16i16_0:381; CHECK: # %bb.0:382; CHECK-NEXT: vsetvli a1, zero, e16, m1, tu, ma383; CHECK-NEXT: vmv.s.x v8, a0384; CHECK-NEXT: ret385 %r = insertelement <vscale x 16 x i16> %v, i16 %elt, i32 0386 ret <vscale x 16 x i16> %r387}388 389define <vscale x 16 x i16> @insertelt_nxv16i16_imm(<vscale x 16 x i16> %v, i16 signext %elt) {390; CHECK-LABEL: insertelt_nxv16i16_imm:391; CHECK: # %bb.0:392; CHECK-NEXT: vsetivli zero, 4, e16, m1, tu, ma393; CHECK-NEXT: vmv.s.x v12, a0394; CHECK-NEXT: vslideup.vi v8, v12, 3395; CHECK-NEXT: ret396 %r = insertelement <vscale x 16 x i16> %v, i16 %elt, i32 3397 ret <vscale x 16 x i16> %r398}399 400define <vscale x 16 x i16> @insertelt_nxv16i16_idx(<vscale x 16 x i16> %v, i16 signext %elt, i32 signext %idx) {401; CHECK-LABEL: insertelt_nxv16i16_idx:402; CHECK: # %bb.0:403; CHECK-NEXT: vsetvli a2, zero, e16, m1, ta, ma404; CHECK-NEXT: vmv.s.x v12, a0405; CHECK-NEXT: addi a0, a1, 1406; CHECK-NEXT: vsetvli zero, a0, e16, m4, tu, ma407; CHECK-NEXT: vslideup.vx v8, v12, a1408; CHECK-NEXT: ret409 %r = insertelement <vscale x 16 x i16> %v, i16 %elt, i32 %idx410 ret <vscale x 16 x i16> %r411}412 413define <vscale x 32 x i16> @insertelt_nxv32i16_0(<vscale x 32 x i16> %v, i16 signext %elt) {414; CHECK-LABEL: insertelt_nxv32i16_0:415; CHECK: # %bb.0:416; CHECK-NEXT: vsetvli a1, zero, e16, m1, tu, ma417; CHECK-NEXT: vmv.s.x v8, a0418; CHECK-NEXT: ret419 %r = insertelement <vscale x 32 x i16> %v, i16 %elt, i32 0420 ret <vscale x 32 x i16> %r421}422 423define <vscale x 32 x i16> @insertelt_nxv32i16_imm(<vscale x 32 x i16> %v, i16 signext %elt) {424; CHECK-LABEL: insertelt_nxv32i16_imm:425; CHECK: # %bb.0:426; CHECK-NEXT: vsetivli zero, 4, e16, m1, tu, ma427; CHECK-NEXT: vmv.s.x v16, a0428; CHECK-NEXT: vslideup.vi v8, v16, 3429; CHECK-NEXT: ret430 %r = insertelement <vscale x 32 x i16> %v, i16 %elt, i32 3431 ret <vscale x 32 x i16> %r432}433 434define <vscale x 32 x i16> @insertelt_nxv32i16_idx(<vscale x 32 x i16> %v, i16 signext %elt, i32 signext %idx) {435; CHECK-LABEL: insertelt_nxv32i16_idx:436; CHECK: # %bb.0:437; CHECK-NEXT: vsetvli a2, zero, e16, m1, ta, ma438; CHECK-NEXT: vmv.s.x v16, a0439; CHECK-NEXT: addi a0, a1, 1440; CHECK-NEXT: vsetvli zero, a0, e16, m8, tu, ma441; CHECK-NEXT: vslideup.vx v8, v16, a1442; CHECK-NEXT: ret443 %r = insertelement <vscale x 32 x i16> %v, i16 %elt, i32 %idx444 ret <vscale x 32 x i16> %r445}446 447define <vscale x 1 x i32> @insertelt_nxv1i32_0(<vscale x 1 x i32> %v, i32 %elt) {448; CHECK-LABEL: insertelt_nxv1i32_0:449; CHECK: # %bb.0:450; CHECK-NEXT: vsetvli a1, zero, e32, m1, tu, ma451; CHECK-NEXT: vmv.s.x v8, a0452; CHECK-NEXT: ret453 %r = insertelement <vscale x 1 x i32> %v, i32 %elt, i32 0454 ret <vscale x 1 x i32> %r455}456 457define <vscale x 1 x i32> @insertelt_nxv1i32_imm(<vscale x 1 x i32> %v, i32 %elt) {458; CHECK-LABEL: insertelt_nxv1i32_imm:459; CHECK: # %bb.0:460; CHECK-NEXT: vsetivli zero, 4, e32, mf2, tu, ma461; CHECK-NEXT: vmv.s.x v9, a0462; CHECK-NEXT: vslideup.vi v8, v9, 3463; CHECK-NEXT: ret464 %r = insertelement <vscale x 1 x i32> %v, i32 %elt, i32 3465 ret <vscale x 1 x i32> %r466}467 468define <vscale x 1 x i32> @insertelt_nxv1i32_idx(<vscale x 1 x i32> %v, i32 %elt, i32 %idx) {469; CHECK-LABEL: insertelt_nxv1i32_idx:470; CHECK: # %bb.0:471; CHECK-NEXT: addi a2, a1, 1472; CHECK-NEXT: vsetvli a3, zero, e32, m1, ta, ma473; CHECK-NEXT: vmv.s.x v9, a0474; CHECK-NEXT: vsetvli zero, a2, e32, mf2, tu, ma475; CHECK-NEXT: vslideup.vx v8, v9, a1476; CHECK-NEXT: ret477 %r = insertelement <vscale x 1 x i32> %v, i32 %elt, i32 %idx478 ret <vscale x 1 x i32> %r479}480 481define <vscale x 2 x i32> @insertelt_nxv2i32_0(<vscale x 2 x i32> %v, i32 %elt) {482; CHECK-LABEL: insertelt_nxv2i32_0:483; CHECK: # %bb.0:484; CHECK-NEXT: vsetvli a1, zero, e32, m1, tu, ma485; CHECK-NEXT: vmv.s.x v8, a0486; CHECK-NEXT: ret487 %r = insertelement <vscale x 2 x i32> %v, i32 %elt, i32 0488 ret <vscale x 2 x i32> %r489}490 491define <vscale x 2 x i32> @insertelt_nxv2i32_imm(<vscale x 2 x i32> %v, i32 %elt) {492; CHECK-LABEL: insertelt_nxv2i32_imm:493; CHECK: # %bb.0:494; CHECK-NEXT: vsetivli zero, 4, e32, m1, tu, ma495; CHECK-NEXT: vmv.s.x v9, a0496; CHECK-NEXT: vslideup.vi v8, v9, 3497; CHECK-NEXT: ret498 %r = insertelement <vscale x 2 x i32> %v, i32 %elt, i32 3499 ret <vscale x 2 x i32> %r500}501 502define <vscale x 2 x i32> @insertelt_nxv2i32_idx(<vscale x 2 x i32> %v, i32 %elt, i32 %idx) {503; CHECK-LABEL: insertelt_nxv2i32_idx:504; CHECK: # %bb.0:505; CHECK-NEXT: addi a2, a1, 1506; CHECK-NEXT: vsetvli a3, zero, e32, m1, ta, ma507; CHECK-NEXT: vmv.s.x v9, a0508; CHECK-NEXT: vsetvli zero, a2, e32, m1, tu, ma509; CHECK-NEXT: vslideup.vx v8, v9, a1510; CHECK-NEXT: ret511 %r = insertelement <vscale x 2 x i32> %v, i32 %elt, i32 %idx512 ret <vscale x 2 x i32> %r513}514 515define <vscale x 4 x i32> @insertelt_nxv4i32_0(<vscale x 4 x i32> %v, i32 %elt) {516; CHECK-LABEL: insertelt_nxv4i32_0:517; CHECK: # %bb.0:518; CHECK-NEXT: vsetvli a1, zero, e32, m1, tu, ma519; CHECK-NEXT: vmv.s.x v8, a0520; CHECK-NEXT: ret521 %r = insertelement <vscale x 4 x i32> %v, i32 %elt, i32 0522 ret <vscale x 4 x i32> %r523}524 525define <vscale x 4 x i32> @insertelt_nxv4i32_imm(<vscale x 4 x i32> %v, i32 %elt) {526; CHECK-LABEL: insertelt_nxv4i32_imm:527; CHECK: # %bb.0:528; CHECK-NEXT: vsetivli zero, 4, e32, m1, tu, ma529; CHECK-NEXT: vmv.s.x v10, a0530; CHECK-NEXT: vslideup.vi v8, v10, 3531; CHECK-NEXT: ret532 %r = insertelement <vscale x 4 x i32> %v, i32 %elt, i32 3533 ret <vscale x 4 x i32> %r534}535 536define <vscale x 4 x i32> @insertelt_nxv4i32_idx(<vscale x 4 x i32> %v, i32 %elt, i32 %idx) {537; CHECK-LABEL: insertelt_nxv4i32_idx:538; CHECK: # %bb.0:539; CHECK-NEXT: vsetvli a2, zero, e32, m1, ta, ma540; CHECK-NEXT: vmv.s.x v10, a0541; CHECK-NEXT: addi a0, a1, 1542; CHECK-NEXT: vsetvli zero, a0, e32, m2, tu, ma543; CHECK-NEXT: vslideup.vx v8, v10, a1544; CHECK-NEXT: ret545 %r = insertelement <vscale x 4 x i32> %v, i32 %elt, i32 %idx546 ret <vscale x 4 x i32> %r547}548 549define <vscale x 8 x i32> @insertelt_nxv8i32_0(<vscale x 8 x i32> %v, i32 %elt) {550; CHECK-LABEL: insertelt_nxv8i32_0:551; CHECK: # %bb.0:552; CHECK-NEXT: vsetvli a1, zero, e32, m1, tu, ma553; CHECK-NEXT: vmv.s.x v8, a0554; CHECK-NEXT: ret555 %r = insertelement <vscale x 8 x i32> %v, i32 %elt, i32 0556 ret <vscale x 8 x i32> %r557}558 559define <vscale x 8 x i32> @insertelt_nxv8i32_imm(<vscale x 8 x i32> %v, i32 %elt) {560; CHECK-LABEL: insertelt_nxv8i32_imm:561; CHECK: # %bb.0:562; CHECK-NEXT: vsetivli zero, 4, e32, m1, tu, ma563; CHECK-NEXT: vmv.s.x v12, a0564; CHECK-NEXT: vslideup.vi v8, v12, 3565; CHECK-NEXT: ret566 %r = insertelement <vscale x 8 x i32> %v, i32 %elt, i32 3567 ret <vscale x 8 x i32> %r568}569 570define <vscale x 8 x i32> @insertelt_nxv8i32_idx(<vscale x 8 x i32> %v, i32 %elt, i32 %idx) {571; CHECK-LABEL: insertelt_nxv8i32_idx:572; CHECK: # %bb.0:573; CHECK-NEXT: vsetvli a2, zero, e32, m1, ta, ma574; CHECK-NEXT: vmv.s.x v12, a0575; CHECK-NEXT: addi a0, a1, 1576; CHECK-NEXT: vsetvli zero, a0, e32, m4, tu, ma577; CHECK-NEXT: vslideup.vx v8, v12, a1578; CHECK-NEXT: ret579 %r = insertelement <vscale x 8 x i32> %v, i32 %elt, i32 %idx580 ret <vscale x 8 x i32> %r581}582 583define <vscale x 16 x i32> @insertelt_nxv16i32_0(<vscale x 16 x i32> %v, i32 %elt) {584; CHECK-LABEL: insertelt_nxv16i32_0:585; CHECK: # %bb.0:586; CHECK-NEXT: vsetvli a1, zero, e32, m1, tu, ma587; CHECK-NEXT: vmv.s.x v8, a0588; CHECK-NEXT: ret589 %r = insertelement <vscale x 16 x i32> %v, i32 %elt, i32 0590 ret <vscale x 16 x i32> %r591}592 593define <vscale x 16 x i32> @insertelt_nxv16i32_imm(<vscale x 16 x i32> %v, i32 %elt) {594; CHECK-LABEL: insertelt_nxv16i32_imm:595; CHECK: # %bb.0:596; CHECK-NEXT: vsetivli zero, 4, e32, m1, tu, ma597; CHECK-NEXT: vmv.s.x v16, a0598; CHECK-NEXT: vslideup.vi v8, v16, 3599; CHECK-NEXT: ret600 %r = insertelement <vscale x 16 x i32> %v, i32 %elt, i32 3601 ret <vscale x 16 x i32> %r602}603 604define <vscale x 16 x i32> @insertelt_nxv16i32_idx(<vscale x 16 x i32> %v, i32 %elt, i32 %idx) {605; CHECK-LABEL: insertelt_nxv16i32_idx:606; CHECK: # %bb.0:607; CHECK-NEXT: vsetvli a2, zero, e32, m1, ta, ma608; CHECK-NEXT: vmv.s.x v16, a0609; CHECK-NEXT: addi a0, a1, 1610; CHECK-NEXT: vsetvli zero, a0, e32, m8, tu, ma611; CHECK-NEXT: vslideup.vx v8, v16, a1612; CHECK-NEXT: ret613 %r = insertelement <vscale x 16 x i32> %v, i32 %elt, i32 %idx614 ret <vscale x 16 x i32> %r615}616 617define <vscale x 1 x i64> @insertelt_nxv1i64_0(<vscale x 1 x i64> %v, i64 %elt) {618; CHECK-LABEL: insertelt_nxv1i64_0:619; CHECK: # %bb.0:620; CHECK-NEXT: vsetivli zero, 2, e32, m1, tu, ma621; CHECK-NEXT: vslide1down.vx v8, v8, a0622; CHECK-NEXT: vslide1down.vx v8, v8, a1623; CHECK-NEXT: ret624 %r = insertelement <vscale x 1 x i64> %v, i64 %elt, i32 0625 ret <vscale x 1 x i64> %r626}627 628define <vscale x 1 x i64> @insertelt_nxv1i64_imm(<vscale x 1 x i64> %v, i64 %elt) {629; CHECK-LABEL: insertelt_nxv1i64_imm:630; CHECK: # %bb.0:631; CHECK-NEXT: vsetivli zero, 2, e32, m1, ta, ma632; CHECK-NEXT: vslide1down.vx v9, v8, a0633; CHECK-NEXT: vslide1down.vx v9, v9, a1634; CHECK-NEXT: vsetivli zero, 4, e64, m1, tu, ma635; CHECK-NEXT: vslideup.vi v8, v9, 3636; CHECK-NEXT: ret637 %r = insertelement <vscale x 1 x i64> %v, i64 %elt, i32 3638 ret <vscale x 1 x i64> %r639}640 641define <vscale x 1 x i64> @insertelt_nxv1i64_idx(<vscale x 1 x i64> %v, i64 %elt, i32 %idx) {642; CHECK-LABEL: insertelt_nxv1i64_idx:643; CHECK: # %bb.0:644; CHECK-NEXT: vsetivli zero, 2, e32, m1, ta, ma645; CHECK-NEXT: vslide1down.vx v9, v8, a0646; CHECK-NEXT: vslide1down.vx v9, v9, a1647; CHECK-NEXT: addi a0, a2, 1648; CHECK-NEXT: vsetvli zero, a0, e64, m1, tu, ma649; CHECK-NEXT: vslideup.vx v8, v9, a2650; CHECK-NEXT: ret651 %r = insertelement <vscale x 1 x i64> %v, i64 %elt, i32 %idx652 ret <vscale x 1 x i64> %r653}654 655define <vscale x 2 x i64> @insertelt_nxv2i64_0(<vscale x 2 x i64> %v, i64 %elt) {656; CHECK-LABEL: insertelt_nxv2i64_0:657; CHECK: # %bb.0:658; CHECK-NEXT: vsetivli zero, 2, e32, m1, tu, ma659; CHECK-NEXT: vslide1down.vx v8, v8, a0660; CHECK-NEXT: vslide1down.vx v8, v8, a1661; CHECK-NEXT: ret662 %r = insertelement <vscale x 2 x i64> %v, i64 %elt, i32 0663 ret <vscale x 2 x i64> %r664}665 666define <vscale x 2 x i64> @insertelt_nxv2i64_imm(<vscale x 2 x i64> %v, i64 %elt) {667; CHECK-LABEL: insertelt_nxv2i64_imm:668; CHECK: # %bb.0:669; CHECK-NEXT: vsetivli zero, 2, e32, m2, ta, ma670; CHECK-NEXT: vslide1down.vx v10, v8, a0671; CHECK-NEXT: vslide1down.vx v10, v10, a1672; CHECK-NEXT: vsetivli zero, 4, e64, m2, tu, ma673; CHECK-NEXT: vslideup.vi v8, v10, 3674; CHECK-NEXT: ret675 %r = insertelement <vscale x 2 x i64> %v, i64 %elt, i32 3676 ret <vscale x 2 x i64> %r677}678 679define <vscale x 2 x i64> @insertelt_nxv2i64_idx(<vscale x 2 x i64> %v, i64 %elt, i32 %idx) {680; CHECK-LABEL: insertelt_nxv2i64_idx:681; CHECK: # %bb.0:682; CHECK-NEXT: vsetivli zero, 2, e32, m2, ta, ma683; CHECK-NEXT: vslide1down.vx v10, v8, a0684; CHECK-NEXT: vslide1down.vx v10, v10, a1685; CHECK-NEXT: addi a0, a2, 1686; CHECK-NEXT: vsetvli zero, a0, e64, m2, tu, ma687; CHECK-NEXT: vslideup.vx v8, v10, a2688; CHECK-NEXT: ret689 %r = insertelement <vscale x 2 x i64> %v, i64 %elt, i32 %idx690 ret <vscale x 2 x i64> %r691}692 693define <vscale x 4 x i64> @insertelt_nxv4i64_0(<vscale x 4 x i64> %v, i64 %elt) {694; CHECK-LABEL: insertelt_nxv4i64_0:695; CHECK: # %bb.0:696; CHECK-NEXT: vsetivli zero, 2, e32, m1, tu, ma697; CHECK-NEXT: vslide1down.vx v8, v8, a0698; CHECK-NEXT: vslide1down.vx v8, v8, a1699; CHECK-NEXT: ret700 %r = insertelement <vscale x 4 x i64> %v, i64 %elt, i32 0701 ret <vscale x 4 x i64> %r702}703 704define <vscale x 4 x i64> @insertelt_nxv4i64_imm(<vscale x 4 x i64> %v, i64 %elt) {705; CHECK-LABEL: insertelt_nxv4i64_imm:706; CHECK: # %bb.0:707; CHECK-NEXT: vsetivli zero, 2, e32, m2, ta, ma708; CHECK-NEXT: vslide1down.vx v12, v8, a0709; CHECK-NEXT: vslide1down.vx v12, v12, a1710; CHECK-NEXT: vsetivli zero, 4, e64, m2, tu, ma711; CHECK-NEXT: vslideup.vi v8, v12, 3712; CHECK-NEXT: ret713 %r = insertelement <vscale x 4 x i64> %v, i64 %elt, i32 3714 ret <vscale x 4 x i64> %r715}716 717define <vscale x 4 x i64> @insertelt_nxv4i64_idx(<vscale x 4 x i64> %v, i64 %elt, i32 %idx) {718; CHECK-LABEL: insertelt_nxv4i64_idx:719; CHECK: # %bb.0:720; CHECK-NEXT: vsetivli zero, 2, e32, m4, ta, ma721; CHECK-NEXT: vslide1down.vx v12, v8, a0722; CHECK-NEXT: vslide1down.vx v12, v12, a1723; CHECK-NEXT: addi a0, a2, 1724; CHECK-NEXT: vsetvli zero, a0, e64, m4, tu, ma725; CHECK-NEXT: vslideup.vx v8, v12, a2726; CHECK-NEXT: ret727 %r = insertelement <vscale x 4 x i64> %v, i64 %elt, i32 %idx728 ret <vscale x 4 x i64> %r729}730 731define <vscale x 8 x i64> @insertelt_nxv8i64_0(<vscale x 8 x i64> %v, i64 %elt) {732; CHECK-LABEL: insertelt_nxv8i64_0:733; CHECK: # %bb.0:734; CHECK-NEXT: vsetivli zero, 2, e32, m1, tu, ma735; CHECK-NEXT: vslide1down.vx v8, v8, a0736; CHECK-NEXT: vslide1down.vx v8, v8, a1737; CHECK-NEXT: ret738 %r = insertelement <vscale x 8 x i64> %v, i64 %elt, i32 0739 ret <vscale x 8 x i64> %r740}741 742define <vscale x 8 x i64> @insertelt_nxv8i64_imm(<vscale x 8 x i64> %v, i64 %elt) {743; CHECK-LABEL: insertelt_nxv8i64_imm:744; CHECK: # %bb.0:745; CHECK-NEXT: vsetivli zero, 2, e32, m2, ta, ma746; CHECK-NEXT: vslide1down.vx v16, v8, a0747; CHECK-NEXT: vslide1down.vx v16, v16, a1748; CHECK-NEXT: vsetivli zero, 4, e64, m2, tu, ma749; CHECK-NEXT: vslideup.vi v8, v16, 3750; CHECK-NEXT: ret751 %r = insertelement <vscale x 8 x i64> %v, i64 %elt, i32 3752 ret <vscale x 8 x i64> %r753}754 755define <vscale x 8 x i64> @insertelt_nxv8i64_idx(<vscale x 8 x i64> %v, i64 %elt, i32 %idx) {756; CHECK-LABEL: insertelt_nxv8i64_idx:757; CHECK: # %bb.0:758; CHECK-NEXT: vsetivli zero, 2, e32, m8, ta, ma759; CHECK-NEXT: vslide1down.vx v16, v8, a0760; CHECK-NEXT: vslide1down.vx v16, v16, a1761; CHECK-NEXT: addi a0, a2, 1762; CHECK-NEXT: vsetvli zero, a0, e64, m8, tu, ma763; CHECK-NEXT: vslideup.vx v8, v16, a2764; CHECK-NEXT: ret765 %r = insertelement <vscale x 8 x i64> %v, i64 %elt, i32 %idx766 ret <vscale x 8 x i64> %r767}768 769; Extra tests to check lowering of constant values770define <vscale x 2 x i64> @insertelt_nxv2i64_0_c10(<vscale x 2 x i64> %v) {771; CHECK-LABEL: insertelt_nxv2i64_0_c10:772; CHECK: # %bb.0:773; CHECK-NEXT: li a0, 10774; CHECK-NEXT: vsetvli a1, zero, e64, m1, tu, ma775; CHECK-NEXT: vmv.s.x v8, a0776; CHECK-NEXT: ret777 %r = insertelement <vscale x 2 x i64> %v, i64 10, i32 0778 ret <vscale x 2 x i64> %r779}780 781define <vscale x 2 x i64> @insertelt_nxv2i64_imm_c10(<vscale x 2 x i64> %v) {782; CHECK-LABEL: insertelt_nxv2i64_imm_c10:783; CHECK: # %bb.0:784; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma785; CHECK-NEXT: vmv.v.i v10, 10786; CHECK-NEXT: vsetivli zero, 4, e64, m2, tu, ma787; CHECK-NEXT: vslideup.vi v8, v10, 3788; CHECK-NEXT: ret789 %r = insertelement <vscale x 2 x i64> %v, i64 10, i32 3790 ret <vscale x 2 x i64> %r791}792 793define <vscale x 2 x i64> @insertelt_nxv2i64_idx_c10(<vscale x 2 x i64> %v, i32 %idx) {794; CHECK-LABEL: insertelt_nxv2i64_idx_c10:795; CHECK: # %bb.0:796; CHECK-NEXT: vsetvli a1, zero, e64, m1, ta, ma797; CHECK-NEXT: vmv.v.i v10, 10798; CHECK-NEXT: addi a1, a0, 1799; CHECK-NEXT: vsetvli zero, a1, e64, m2, tu, ma800; CHECK-NEXT: vslideup.vx v8, v10, a0801; CHECK-NEXT: ret802 %r = insertelement <vscale x 2 x i64> %v, i64 10, i32 %idx803 ret <vscale x 2 x i64> %r804}805 806define <vscale x 2 x i64> @insertelt_nxv2i64_0_cn1(<vscale x 2 x i64> %v) {807; CHECK-LABEL: insertelt_nxv2i64_0_cn1:808; CHECK: # %bb.0:809; CHECK-NEXT: li a0, -1810; CHECK-NEXT: vsetvli a1, zero, e64, m1, tu, ma811; CHECK-NEXT: vmv.s.x v8, a0812; CHECK-NEXT: ret813 %r = insertelement <vscale x 2 x i64> %v, i64 -1, i32 0814 ret <vscale x 2 x i64> %r815}816 817define <vscale x 2 x i64> @insertelt_nxv2i64_imm_cn1(<vscale x 2 x i64> %v) {818; CHECK-LABEL: insertelt_nxv2i64_imm_cn1:819; CHECK: # %bb.0:820; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma821; CHECK-NEXT: vmv.v.i v10, -1822; CHECK-NEXT: vsetivli zero, 4, e64, m2, tu, ma823; CHECK-NEXT: vslideup.vi v8, v10, 3824; CHECK-NEXT: ret825 %r = insertelement <vscale x 2 x i64> %v, i64 -1, i32 3826 ret <vscale x 2 x i64> %r827}828 829define <vscale x 2 x i64> @insertelt_nxv2i64_idx_cn1(<vscale x 2 x i64> %v, i32 %idx) {830; CHECK-LABEL: insertelt_nxv2i64_idx_cn1:831; CHECK: # %bb.0:832; CHECK-NEXT: vsetvli a1, zero, e64, m1, ta, ma833; CHECK-NEXT: vmv.v.i v10, -1834; CHECK-NEXT: addi a1, a0, 1835; CHECK-NEXT: vsetvli zero, a1, e64, m2, tu, ma836; CHECK-NEXT: vslideup.vx v8, v10, a0837; CHECK-NEXT: ret838 %r = insertelement <vscale x 2 x i64> %v, i64 -1, i32 %idx839 ret <vscale x 2 x i64> %r840}841