636 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 32; RUN: llc < %s -mtriple=riscv32 -mattr=+v,+zvfh -verify-machineinstrs | FileCheck %s -check-prefixes=CHECK,RV323; RUN: llc < %s -mtriple=riscv64 -mattr=+v,+zvfh -verify-machineinstrs | FileCheck %s -check-prefixes=CHECK,RV644 5define <1 x i1> @v1i1(i1 %x, i1 %y) {6; CHECK-LABEL: v1i1:7; CHECK: # %bb.0:8; CHECK-NEXT: andi a0, a0, 19; CHECK-NEXT: andi a1, a1, 110; CHECK-NEXT: vsetivli zero, 1, e8, mf8, ta, ma11; CHECK-NEXT: vmv.s.x v8, a012; CHECK-NEXT: vmv.s.x v9, a113; CHECK-NEXT: vmsne.vi v8, v8, 014; CHECK-NEXT: vmsne.vi v9, v9, 015; CHECK-NEXT: vmxor.mm v0, v8, v916; CHECK-NEXT: ret17 %head.x = insertelement <1 x i1> poison, i1 %x, i32 018 %splat.x = shufflevector <1 x i1> %head.x, <1 x i1> poison, <1 x i32> zeroinitializer19 %head.y = insertelement <1 x i1> poison, i1 %y, i32 020 %splat.y = shufflevector <1 x i1> %head.y, <1 x i1> poison, <1 x i32> zeroinitializer21 %v = add <1 x i1> %splat.x, %splat.y22 ret <1 x i1> %v23}24 25define <2 x i1> @v2i1(i1 %x, i1 %y) {26; CHECK-LABEL: v2i1:27; CHECK: # %bb.0:28; CHECK-NEXT: andi a0, a0, 129; CHECK-NEXT: andi a1, a1, 130; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma31; CHECK-NEXT: vmv.v.x v8, a032; CHECK-NEXT: vmv.v.x v9, a133; CHECK-NEXT: vmsne.vi v8, v8, 034; CHECK-NEXT: vmsne.vi v9, v9, 035; CHECK-NEXT: vmxor.mm v0, v8, v936; CHECK-NEXT: vmv.v.i v8, 037; CHECK-NEXT: vmerge.vim v8, v8, 1, v038; CHECK-NEXT: vrgather.vi v9, v8, 039; CHECK-NEXT: vmsne.vi v0, v9, 040; CHECK-NEXT: ret41 %head.x = insertelement <2 x i1> poison, i1 %x, i32 042 %splat.x = shufflevector <2 x i1> %head.x, <2 x i1> poison, <2 x i32> zeroinitializer43 %head.y = insertelement <2 x i1> poison, i1 %y, i32 044 %splat.y = shufflevector <2 x i1> %head.y, <2 x i1> poison, <2 x i32> zeroinitializer45 %v = add <2 x i1> %splat.x, %splat.y46 ret <2 x i1> %v47}48 49define <4 x i1> @v4i1(i1 %x, i1 %y) {50; CHECK-LABEL: v4i1:51; CHECK: # %bb.0:52; CHECK-NEXT: andi a0, a0, 153; CHECK-NEXT: andi a1, a1, 154; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma55; CHECK-NEXT: vmv.v.x v8, a056; CHECK-NEXT: vmv.v.x v9, a157; CHECK-NEXT: vmsne.vi v8, v8, 058; CHECK-NEXT: vmsne.vi v9, v9, 059; CHECK-NEXT: vmxor.mm v0, v8, v960; CHECK-NEXT: vmv.v.i v8, 061; CHECK-NEXT: vmerge.vim v8, v8, 1, v062; CHECK-NEXT: vrgather.vi v9, v8, 063; CHECK-NEXT: vmsne.vi v0, v9, 064; CHECK-NEXT: ret65 %head.x = insertelement <4 x i1> poison, i1 %x, i32 066 %splat.x = shufflevector <4 x i1> %head.x, <4 x i1> poison, <4 x i32> zeroinitializer67 %head.y = insertelement <4 x i1> poison, i1 %y, i32 068 %splat.y = shufflevector <4 x i1> %head.y, <4 x i1> poison, <4 x i32> zeroinitializer69 %v = add <4 x i1> %splat.x, %splat.y70 ret <4 x i1> %v71}72 73define <8 x i1> @v8i1(i1 %x, i1 %y) {74; CHECK-LABEL: v8i1:75; CHECK: # %bb.0:76; CHECK-NEXT: andi a0, a0, 177; CHECK-NEXT: andi a1, a1, 178; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma79; CHECK-NEXT: vmv.v.x v8, a080; CHECK-NEXT: vmv.v.x v9, a181; CHECK-NEXT: vmsne.vi v8, v8, 082; CHECK-NEXT: vmsne.vi v9, v9, 083; CHECK-NEXT: vmxor.mm v0, v8, v984; CHECK-NEXT: vmv.v.i v8, 085; CHECK-NEXT: vmerge.vim v8, v8, 1, v086; CHECK-NEXT: vrgather.vi v9, v8, 087; CHECK-NEXT: vmsne.vi v0, v9, 088; CHECK-NEXT: ret89 %head.x = insertelement <8 x i1> poison, i1 %x, i32 090 %splat.x = shufflevector <8 x i1> %head.x, <8 x i1> poison, <8 x i32> zeroinitializer91 %head.y = insertelement <8 x i1> poison, i1 %y, i32 092 %splat.y = shufflevector <8 x i1> %head.y, <8 x i1> poison, <8 x i32> zeroinitializer93 %v = add <8 x i1> %splat.x, %splat.y94 ret <8 x i1> %v95}96 97define <16 x i1> @v16i1(i1 %x, i1 %y) {98; CHECK-LABEL: v16i1:99; CHECK: # %bb.0:100; CHECK-NEXT: andi a0, a0, 1101; CHECK-NEXT: andi a1, a1, 1102; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma103; CHECK-NEXT: vmv.v.x v8, a0104; CHECK-NEXT: vmv.v.x v9, a1105; CHECK-NEXT: vmsne.vi v8, v8, 0106; CHECK-NEXT: vmsne.vi v9, v9, 0107; CHECK-NEXT: vmxor.mm v0, v8, v9108; CHECK-NEXT: vmv.v.i v8, 0109; CHECK-NEXT: vmerge.vim v8, v8, 1, v0110; CHECK-NEXT: vrgather.vi v9, v8, 0111; CHECK-NEXT: vmsne.vi v0, v9, 0112; CHECK-NEXT: ret113 %head.x = insertelement <16 x i1> poison, i1 %x, i32 0114 %splat.x = shufflevector <16 x i1> %head.x, <16 x i1> poison, <16 x i32> zeroinitializer115 %head.y = insertelement <16 x i1> poison, i1 %y, i32 0116 %splat.y = shufflevector <16 x i1> %head.y, <16 x i1> poison, <16 x i32> zeroinitializer117 %v = add <16 x i1> %splat.x, %splat.y118 ret <16 x i1> %v119}120 121define <32 x i1> @v32i1(i1 %x, i1 %y) {122; CHECK-LABEL: v32i1:123; CHECK: # %bb.0:124; CHECK-NEXT: andi a0, a0, 1125; CHECK-NEXT: li a2, 32126; CHECK-NEXT: andi a1, a1, 1127; CHECK-NEXT: vsetvli zero, a2, e8, m2, ta, ma128; CHECK-NEXT: vmv.v.x v8, a0129; CHECK-NEXT: vmsne.vi v10, v8, 0130; CHECK-NEXT: vmv.v.x v8, a1131; CHECK-NEXT: vmsne.vi v11, v8, 0132; CHECK-NEXT: vmxor.mm v0, v10, v11133; CHECK-NEXT: vmv.v.i v8, 0134; CHECK-NEXT: vmerge.vim v8, v8, 1, v0135; CHECK-NEXT: vrgather.vi v10, v8, 0136; CHECK-NEXT: vmsne.vi v0, v10, 0137; CHECK-NEXT: ret138 %head.x = insertelement <32 x i1> poison, i1 %x, i32 0139 %splat.x = shufflevector <32 x i1> %head.x, <32 x i1> poison, <32 x i32> zeroinitializer140 %head.y = insertelement <32 x i1> poison, i1 %y, i32 0141 %splat.y = shufflevector <32 x i1> %head.y, <32 x i1> poison, <32 x i32> zeroinitializer142 %v = add <32 x i1> %splat.x, %splat.y143 ret <32 x i1> %v144}145 146define <64 x i1> @v64i1(i1 %x, i1 %y) {147; CHECK-LABEL: v64i1:148; CHECK: # %bb.0:149; CHECK-NEXT: andi a0, a0, 1150; CHECK-NEXT: li a2, 64151; CHECK-NEXT: andi a1, a1, 1152; CHECK-NEXT: vsetvli zero, a2, e8, m4, ta, ma153; CHECK-NEXT: vmv.v.x v8, a0154; CHECK-NEXT: vmsne.vi v12, v8, 0155; CHECK-NEXT: vmv.v.x v8, a1156; CHECK-NEXT: vmsne.vi v13, v8, 0157; CHECK-NEXT: vmxor.mm v0, v12, v13158; CHECK-NEXT: vmv.v.i v8, 0159; CHECK-NEXT: vmerge.vim v8, v8, 1, v0160; CHECK-NEXT: vrgather.vi v12, v8, 0161; CHECK-NEXT: vmsne.vi v0, v12, 0162; CHECK-NEXT: ret163 %head.x = insertelement <64 x i1> poison, i1 %x, i32 0164 %splat.x = shufflevector <64 x i1> %head.x, <64 x i1> poison, <64 x i32> zeroinitializer165 %head.y = insertelement <64 x i1> poison, i1 %y, i32 0166 %splat.y = shufflevector <64 x i1> %head.y, <64 x i1> poison, <64 x i32> zeroinitializer167 %v = add <64 x i1> %splat.x, %splat.y168 ret <64 x i1> %v169}170 171define <1 x i8> @v1i8(i8 %x, i8 %y) {172; CHECK-LABEL: v1i8:173; CHECK: # %bb.0:174; CHECK-NEXT: vsetivli zero, 1, e8, mf8, ta, ma175; CHECK-NEXT: vmv.s.x v8, a0176; CHECK-NEXT: vadd.vx v8, v8, a1177; CHECK-NEXT: ret178 %head.x = insertelement <1 x i8> poison, i8 %x, i32 0179 %splat.x = shufflevector <1 x i8> %head.x, <1 x i8> poison, <1 x i32> zeroinitializer180 %head.y = insertelement <1 x i8> poison, i8 %y, i32 0181 %splat.y = shufflevector <1 x i8> %head.y, <1 x i8> poison, <1 x i32> zeroinitializer182 %v = add <1 x i8> %splat.x, %splat.y183 ret <1 x i8> %v184}185 186define <2 x i8> @v2i8(i8 %x, i8 %y) {187; CHECK-LABEL: v2i8:188; CHECK: # %bb.0:189; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, ma190; CHECK-NEXT: vmv.s.x v8, a0191; CHECK-NEXT: vadd.vx v9, v8, a1192; CHECK-NEXT: vrgather.vi v8, v9, 0193; CHECK-NEXT: ret194 %head.x = insertelement <2 x i8> poison, i8 %x, i32 0195 %splat.x = shufflevector <2 x i8> %head.x, <2 x i8> poison, <2 x i32> zeroinitializer196 %head.y = insertelement <2 x i8> poison, i8 %y, i32 0197 %splat.y = shufflevector <2 x i8> %head.y, <2 x i8> poison, <2 x i32> zeroinitializer198 %v = add <2 x i8> %splat.x, %splat.y199 ret <2 x i8> %v200}201 202define <4 x i8> @v4i8(i8 %x, i8 %y) {203; CHECK-LABEL: v4i8:204; CHECK: # %bb.0:205; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, ma206; CHECK-NEXT: vmv.s.x v8, a0207; CHECK-NEXT: vadd.vx v9, v8, a1208; CHECK-NEXT: vrgather.vi v8, v9, 0209; CHECK-NEXT: ret210 %head.x = insertelement <4 x i8> poison, i8 %x, i32 0211 %splat.x = shufflevector <4 x i8> %head.x, <4 x i8> poison, <4 x i32> zeroinitializer212 %head.y = insertelement <4 x i8> poison, i8 %y, i32 0213 %splat.y = shufflevector <4 x i8> %head.y, <4 x i8> poison, <4 x i32> zeroinitializer214 %v = add <4 x i8> %splat.x, %splat.y215 ret <4 x i8> %v216}217 218define <8 x i8> @v8i8(i8 %x, i8 %y) {219; CHECK-LABEL: v8i8:220; CHECK: # %bb.0:221; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, ma222; CHECK-NEXT: vmv.s.x v8, a0223; CHECK-NEXT: vadd.vx v9, v8, a1224; CHECK-NEXT: vrgather.vi v8, v9, 0225; CHECK-NEXT: ret226 %head.x = insertelement <8 x i8> poison, i8 %x, i32 0227 %splat.x = shufflevector <8 x i8> %head.x, <8 x i8> poison, <8 x i32> zeroinitializer228 %head.y = insertelement <8 x i8> poison, i8 %y, i32 0229 %splat.y = shufflevector <8 x i8> %head.y, <8 x i8> poison, <8 x i32> zeroinitializer230 %v = add <8 x i8> %splat.x, %splat.y231 ret <8 x i8> %v232}233 234define <16 x i8> @v16i8(i8 %x, i8 %y) {235; CHECK-LABEL: v16i8:236; CHECK: # %bb.0:237; CHECK-NEXT: vsetivli zero, 16, e8, m1, ta, ma238; CHECK-NEXT: vmv.s.x v8, a0239; CHECK-NEXT: vadd.vx v9, v8, a1240; CHECK-NEXT: vrgather.vi v8, v9, 0241; CHECK-NEXT: ret242 %head.x = insertelement <16 x i8> poison, i8 %x, i32 0243 %splat.x = shufflevector <16 x i8> %head.x, <16 x i8> poison, <16 x i32> zeroinitializer244 %head.y = insertelement <16 x i8> poison, i8 %y, i32 0245 %splat.y = shufflevector <16 x i8> %head.y, <16 x i8> poison, <16 x i32> zeroinitializer246 %v = add <16 x i8> %splat.x, %splat.y247 ret <16 x i8> %v248}249 250define <32 x i8> @v32i8(i8 %x, i8 %y) {251; CHECK-LABEL: v32i8:252; CHECK: # %bb.0:253; CHECK-NEXT: li a2, 32254; CHECK-NEXT: vsetvli zero, a2, e8, m2, ta, ma255; CHECK-NEXT: vmv.s.x v8, a0256; CHECK-NEXT: vadd.vx v10, v8, a1257; CHECK-NEXT: vrgather.vi v8, v10, 0258; CHECK-NEXT: ret259 %head.x = insertelement <32 x i8> poison, i8 %x, i32 0260 %splat.x = shufflevector <32 x i8> %head.x, <32 x i8> poison, <32 x i32> zeroinitializer261 %head.y = insertelement <32 x i8> poison, i8 %y, i32 0262 %splat.y = shufflevector <32 x i8> %head.y, <32 x i8> poison, <32 x i32> zeroinitializer263 %v = add <32 x i8> %splat.x, %splat.y264 ret <32 x i8> %v265}266 267define <64 x i8> @v64i8(i8 %x, i8 %y) {268; CHECK-LABEL: v64i8:269; CHECK: # %bb.0:270; CHECK-NEXT: li a2, 64271; CHECK-NEXT: vsetvli zero, a2, e8, m4, ta, ma272; CHECK-NEXT: vmv.s.x v8, a0273; CHECK-NEXT: vadd.vx v12, v8, a1274; CHECK-NEXT: vrgather.vi v8, v12, 0275; CHECK-NEXT: ret276 %head.x = insertelement <64 x i8> poison, i8 %x, i32 0277 %splat.x = shufflevector <64 x i8> %head.x, <64 x i8> poison, <64 x i32> zeroinitializer278 %head.y = insertelement <64 x i8> poison, i8 %y, i32 0279 %splat.y = shufflevector <64 x i8> %head.y, <64 x i8> poison, <64 x i32> zeroinitializer280 %v = add <64 x i8> %splat.x, %splat.y281 ret <64 x i8> %v282}283 284define <1 x i16> @v1i16(i16 %x, i16 %y) {285; CHECK-LABEL: v1i16:286; CHECK: # %bb.0:287; CHECK-NEXT: vsetivli zero, 1, e16, mf4, ta, ma288; CHECK-NEXT: vmv.s.x v8, a0289; CHECK-NEXT: vadd.vx v8, v8, a1290; CHECK-NEXT: ret291 %head.x = insertelement <1 x i16> poison, i16 %x, i32 0292 %splat.x = shufflevector <1 x i16> %head.x, <1 x i16> poison, <1 x i32> zeroinitializer293 %head.y = insertelement <1 x i16> poison, i16 %y, i32 0294 %splat.y = shufflevector <1 x i16> %head.y, <1 x i16> poison, <1 x i32> zeroinitializer295 %v = add <1 x i16> %splat.x, %splat.y296 ret <1 x i16> %v297}298 299define <2 x i16> @v2i16(i16 %x, i16 %y) {300; CHECK-LABEL: v2i16:301; CHECK: # %bb.0:302; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma303; CHECK-NEXT: vmv.s.x v8, a0304; CHECK-NEXT: vadd.vx v9, v8, a1305; CHECK-NEXT: vrgather.vi v8, v9, 0306; CHECK-NEXT: ret307 %head.x = insertelement <2 x i16> poison, i16 %x, i32 0308 %splat.x = shufflevector <2 x i16> %head.x, <2 x i16> poison, <2 x i32> zeroinitializer309 %head.y = insertelement <2 x i16> poison, i16 %y, i32 0310 %splat.y = shufflevector <2 x i16> %head.y, <2 x i16> poison, <2 x i32> zeroinitializer311 %v = add <2 x i16> %splat.x, %splat.y312 ret <2 x i16> %v313}314 315define <4 x i16> @v4i16(i16 %x, i16 %y) {316; CHECK-LABEL: v4i16:317; CHECK: # %bb.0:318; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma319; CHECK-NEXT: vmv.s.x v8, a0320; CHECK-NEXT: vadd.vx v9, v8, a1321; CHECK-NEXT: vrgather.vi v8, v9, 0322; CHECK-NEXT: ret323 %head.x = insertelement <4 x i16> poison, i16 %x, i32 0324 %splat.x = shufflevector <4 x i16> %head.x, <4 x i16> poison, <4 x i32> zeroinitializer325 %head.y = insertelement <4 x i16> poison, i16 %y, i32 0326 %splat.y = shufflevector <4 x i16> %head.y, <4 x i16> poison, <4 x i32> zeroinitializer327 %v = add <4 x i16> %splat.x, %splat.y328 ret <4 x i16> %v329}330 331define <8 x i16> @v8i16(i16 %x, i16 %y) {332; CHECK-LABEL: v8i16:333; CHECK: # %bb.0:334; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma335; CHECK-NEXT: vmv.s.x v8, a0336; CHECK-NEXT: vadd.vx v9, v8, a1337; CHECK-NEXT: vrgather.vi v8, v9, 0338; CHECK-NEXT: ret339 %head.x = insertelement <8 x i16> poison, i16 %x, i32 0340 %splat.x = shufflevector <8 x i16> %head.x, <8 x i16> poison, <8 x i32> zeroinitializer341 %head.y = insertelement <8 x i16> poison, i16 %y, i32 0342 %splat.y = shufflevector <8 x i16> %head.y, <8 x i16> poison, <8 x i32> zeroinitializer343 %v = add <8 x i16> %splat.x, %splat.y344 ret <8 x i16> %v345}346 347define <16 x i16> @v16i16(i16 %x, i16 %y) {348; CHECK-LABEL: v16i16:349; CHECK: # %bb.0:350; CHECK-NEXT: vsetivli zero, 16, e16, m2, ta, ma351; CHECK-NEXT: vmv.s.x v8, a0352; CHECK-NEXT: vadd.vx v10, v8, a1353; CHECK-NEXT: vrgather.vi v8, v10, 0354; CHECK-NEXT: ret355 %head.x = insertelement <16 x i16> poison, i16 %x, i32 0356 %splat.x = shufflevector <16 x i16> %head.x, <16 x i16> poison, <16 x i32> zeroinitializer357 %head.y = insertelement <16 x i16> poison, i16 %y, i32 0358 %splat.y = shufflevector <16 x i16> %head.y, <16 x i16> poison, <16 x i32> zeroinitializer359 %v = add <16 x i16> %splat.x, %splat.y360 ret <16 x i16> %v361}362 363define <32 x i16> @v32i16(i16 %x, i16 %y) {364; CHECK-LABEL: v32i16:365; CHECK: # %bb.0:366; CHECK-NEXT: li a2, 32367; CHECK-NEXT: vsetvli zero, a2, e16, m4, ta, ma368; CHECK-NEXT: vmv.s.x v8, a0369; CHECK-NEXT: vadd.vx v12, v8, a1370; CHECK-NEXT: vrgather.vi v8, v12, 0371; CHECK-NEXT: ret372 %head.x = insertelement <32 x i16> poison, i16 %x, i32 0373 %splat.x = shufflevector <32 x i16> %head.x, <32 x i16> poison, <32 x i32> zeroinitializer374 %head.y = insertelement <32 x i16> poison, i16 %y, i32 0375 %splat.y = shufflevector <32 x i16> %head.y, <32 x i16> poison, <32 x i32> zeroinitializer376 %v = add <32 x i16> %splat.x, %splat.y377 ret <32 x i16> %v378}379 380define <1 x i32> @v1i32(i32 %x, i32 %y) {381; CHECK-LABEL: v1i32:382; CHECK: # %bb.0:383; CHECK-NEXT: vsetivli zero, 1, e32, mf2, ta, ma384; CHECK-NEXT: vmv.s.x v8, a0385; CHECK-NEXT: vadd.vx v8, v8, a1386; CHECK-NEXT: ret387 %head.x = insertelement <1 x i32> poison, i32 %x, i32 0388 %splat.x = shufflevector <1 x i32> %head.x, <1 x i32> poison, <1 x i32> zeroinitializer389 %head.y = insertelement <1 x i32> poison, i32 %y, i32 0390 %splat.y = shufflevector <1 x i32> %head.y, <1 x i32> poison, <1 x i32> zeroinitializer391 %v = add <1 x i32> %splat.x, %splat.y392 ret <1 x i32> %v393}394 395define <2 x i32> @v2i32(i32 %x, i32 %y) {396; CHECK-LABEL: v2i32:397; CHECK: # %bb.0:398; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma399; CHECK-NEXT: vmv.s.x v8, a0400; CHECK-NEXT: vadd.vx v9, v8, a1401; CHECK-NEXT: vrgather.vi v8, v9, 0402; CHECK-NEXT: ret403 %head.x = insertelement <2 x i32> poison, i32 %x, i32 0404 %splat.x = shufflevector <2 x i32> %head.x, <2 x i32> poison, <2 x i32> zeroinitializer405 %head.y = insertelement <2 x i32> poison, i32 %y, i32 0406 %splat.y = shufflevector <2 x i32> %head.y, <2 x i32> poison, <2 x i32> zeroinitializer407 %v = add <2 x i32> %splat.x, %splat.y408 ret <2 x i32> %v409}410 411define <4 x i32> @v4i32(i32 %x, i32 %y) {412; CHECK-LABEL: v4i32:413; CHECK: # %bb.0:414; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma415; CHECK-NEXT: vmv.s.x v8, a0416; CHECK-NEXT: vadd.vx v9, v8, a1417; CHECK-NEXT: vrgather.vi v8, v9, 0418; CHECK-NEXT: ret419 %head.x = insertelement <4 x i32> poison, i32 %x, i32 0420 %splat.x = shufflevector <4 x i32> %head.x, <4 x i32> poison, <4 x i32> zeroinitializer421 %head.y = insertelement <4 x i32> poison, i32 %y, i32 0422 %splat.y = shufflevector <4 x i32> %head.y, <4 x i32> poison, <4 x i32> zeroinitializer423 %v = add <4 x i32> %splat.x, %splat.y424 ret <4 x i32> %v425}426 427define <8 x i32> @v8i32(i32 %x, i32 %y) {428; CHECK-LABEL: v8i32:429; CHECK: # %bb.0:430; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma431; CHECK-NEXT: vmv.s.x v8, a0432; CHECK-NEXT: vadd.vx v10, v8, a1433; CHECK-NEXT: vrgather.vi v8, v10, 0434; CHECK-NEXT: ret435 %head.x = insertelement <8 x i32> poison, i32 %x, i32 0436 %splat.x = shufflevector <8 x i32> %head.x, <8 x i32> poison, <8 x i32> zeroinitializer437 %head.y = insertelement <8 x i32> poison, i32 %y, i32 0438 %splat.y = shufflevector <8 x i32> %head.y, <8 x i32> poison, <8 x i32> zeroinitializer439 %v = add <8 x i32> %splat.x, %splat.y440 ret <8 x i32> %v441}442 443define <16 x i32> @v16i32(i32 %x, i32 %y) {444; CHECK-LABEL: v16i32:445; CHECK: # %bb.0:446; CHECK-NEXT: vsetivli zero, 16, e32, m4, ta, ma447; CHECK-NEXT: vmv.s.x v8, a0448; CHECK-NEXT: vadd.vx v12, v8, a1449; CHECK-NEXT: vrgather.vi v8, v12, 0450; CHECK-NEXT: ret451 %head.x = insertelement <16 x i32> poison, i32 %x, i32 0452 %splat.x = shufflevector <16 x i32> %head.x, <16 x i32> poison, <16 x i32> zeroinitializer453 %head.y = insertelement <16 x i32> poison, i32 %y, i32 0454 %splat.y = shufflevector <16 x i32> %head.y, <16 x i32> poison, <16 x i32> zeroinitializer455 %v = add <16 x i32> %splat.x, %splat.y456 ret <16 x i32> %v457}458 459define <1 x i64> @v1i64(i64 %x, i64 %y) {460; RV32-LABEL: v1i64:461; RV32: # %bb.0:462; RV32-NEXT: addi sp, sp, -16463; RV32-NEXT: .cfi_def_cfa_offset 16464; RV32-NEXT: add a2, a0, a2465; RV32-NEXT: add a1, a1, a3466; RV32-NEXT: sltu a0, a2, a0467; RV32-NEXT: add a0, a1, a0468; RV32-NEXT: sw a2, 8(sp)469; RV32-NEXT: sw a0, 12(sp)470; RV32-NEXT: addi a0, sp, 8471; RV32-NEXT: vsetvli a1, zero, e64, m1, ta, ma472; RV32-NEXT: vlse64.v v8, (a0), zero473; RV32-NEXT: addi sp, sp, 16474; RV32-NEXT: .cfi_def_cfa_offset 0475; RV32-NEXT: ret476;477; RV64-LABEL: v1i64:478; RV64: # %bb.0:479; RV64-NEXT: vsetivli zero, 1, e64, m1, ta, ma480; RV64-NEXT: vmv.s.x v8, a0481; RV64-NEXT: vadd.vx v8, v8, a1482; RV64-NEXT: ret483 %head.x = insertelement <1 x i64> poison, i64 %x, i32 0484 %splat.x = shufflevector <1 x i64> %head.x, <1 x i64> poison, <1 x i32> zeroinitializer485 %head.y = insertelement <1 x i64> poison, i64 %y, i32 0486 %splat.y = shufflevector <1 x i64> %head.y, <1 x i64> poison, <1 x i32> zeroinitializer487 %v = add <1 x i64> %splat.x, %splat.y488 ret <1 x i64> %v489}490 491define <2 x i64> @v2i64(i64 %x, i64 %y) {492; RV32-LABEL: v2i64:493; RV32: # %bb.0:494; RV32-NEXT: addi sp, sp, -16495; RV32-NEXT: .cfi_def_cfa_offset 16496; RV32-NEXT: add a2, a0, a2497; RV32-NEXT: add a1, a1, a3498; RV32-NEXT: sltu a0, a2, a0499; RV32-NEXT: add a0, a1, a0500; RV32-NEXT: sw a2, 8(sp)501; RV32-NEXT: sw a0, 12(sp)502; RV32-NEXT: addi a0, sp, 8503; RV32-NEXT: vsetvli a1, zero, e64, m1, ta, ma504; RV32-NEXT: vlse64.v v8, (a0), zero505; RV32-NEXT: addi sp, sp, 16506; RV32-NEXT: .cfi_def_cfa_offset 0507; RV32-NEXT: ret508;509; RV64-LABEL: v2i64:510; RV64: # %bb.0:511; RV64-NEXT: vsetivli zero, 2, e64, m1, ta, ma512; RV64-NEXT: vmv.s.x v8, a0513; RV64-NEXT: vadd.vx v9, v8, a1514; RV64-NEXT: vrgather.vi v8, v9, 0515; RV64-NEXT: ret516 %head.x = insertelement <2 x i64> poison, i64 %x, i32 0517 %splat.x = shufflevector <2 x i64> %head.x, <2 x i64> poison, <2 x i32> zeroinitializer518 %head.y = insertelement <2 x i64> poison, i64 %y, i32 0519 %splat.y = shufflevector <2 x i64> %head.y, <2 x i64> poison, <2 x i32> zeroinitializer520 %v = add <2 x i64> %splat.x, %splat.y521 ret <2 x i64> %v522}523 524define <4 x i64> @v4i64(i64 %x, i64 %y) {525; RV32-LABEL: v4i64:526; RV32: # %bb.0:527; RV32-NEXT: addi sp, sp, -16528; RV32-NEXT: .cfi_def_cfa_offset 16529; RV32-NEXT: add a2, a0, a2530; RV32-NEXT: add a1, a1, a3531; RV32-NEXT: sltu a0, a2, a0532; RV32-NEXT: add a0, a1, a0533; RV32-NEXT: sw a2, 8(sp)534; RV32-NEXT: sw a0, 12(sp)535; RV32-NEXT: addi a0, sp, 8536; RV32-NEXT: vsetvli a1, zero, e64, m2, ta, ma537; RV32-NEXT: vlse64.v v8, (a0), zero538; RV32-NEXT: addi sp, sp, 16539; RV32-NEXT: .cfi_def_cfa_offset 0540; RV32-NEXT: ret541;542; RV64-LABEL: v4i64:543; RV64: # %bb.0:544; RV64-NEXT: vsetivli zero, 4, e64, m2, ta, ma545; RV64-NEXT: vmv.s.x v8, a0546; RV64-NEXT: vadd.vx v10, v8, a1547; RV64-NEXT: vrgather.vi v8, v10, 0548; RV64-NEXT: ret549 %head.x = insertelement <4 x i64> poison, i64 %x, i32 0550 %splat.x = shufflevector <4 x i64> %head.x, <4 x i64> poison, <4 x i32> zeroinitializer551 %head.y = insertelement <4 x i64> poison, i64 %y, i32 0552 %splat.y = shufflevector <4 x i64> %head.y, <4 x i64> poison, <4 x i32> zeroinitializer553 %v = add <4 x i64> %splat.x, %splat.y554 ret <4 x i64> %v555}556 557define <8 x i64> @v8i64(i64 %x, i64 %y) {558; RV32-LABEL: v8i64:559; RV32: # %bb.0:560; RV32-NEXT: addi sp, sp, -16561; RV32-NEXT: .cfi_def_cfa_offset 16562; RV32-NEXT: add a2, a0, a2563; RV32-NEXT: add a1, a1, a3564; RV32-NEXT: sltu a0, a2, a0565; RV32-NEXT: add a0, a1, a0566; RV32-NEXT: sw a2, 8(sp)567; RV32-NEXT: sw a0, 12(sp)568; RV32-NEXT: addi a0, sp, 8569; RV32-NEXT: vsetvli a1, zero, e64, m4, ta, ma570; RV32-NEXT: vlse64.v v8, (a0), zero571; RV32-NEXT: addi sp, sp, 16572; RV32-NEXT: .cfi_def_cfa_offset 0573; RV32-NEXT: ret574;575; RV64-LABEL: v8i64:576; RV64: # %bb.0:577; RV64-NEXT: vsetivli zero, 8, e64, m4, ta, ma578; RV64-NEXT: vmv.s.x v8, a0579; RV64-NEXT: vadd.vx v12, v8, a1580; RV64-NEXT: vrgather.vi v8, v12, 0581; RV64-NEXT: ret582 %head.x = insertelement <8 x i64> poison, i64 %x, i32 0583 %splat.x = shufflevector <8 x i64> %head.x, <8 x i64> poison, <8 x i32> zeroinitializer584 %head.y = insertelement <8 x i64> poison, i64 %y, i32 0585 %splat.y = shufflevector <8 x i64> %head.y, <8 x i64> poison, <8 x i32> zeroinitializer586 %v = add <8 x i64> %splat.x, %splat.y587 ret <8 x i64> %v588}589 590define <4 x half> @v4f16(half %x, half %y) {591; CHECK-LABEL: v4f16:592; CHECK: # %bb.0:593; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma594; CHECK-NEXT: vfmv.s.f v8, fa0595; CHECK-NEXT: vfadd.vf v9, v8, fa1596; CHECK-NEXT: vrgather.vi v8, v9, 0597; CHECK-NEXT: ret598 %head.x = insertelement <4 x half> poison, half %x, i32 0599 %splat.x = shufflevector <4 x half> %head.x, <4 x half> poison, <4 x i32> zeroinitializer600 %head.y = insertelement <4 x half> poison, half %y, i32 0601 %splat.y = shufflevector <4 x half> %head.y, <4 x half> poison, <4 x i32> zeroinitializer602 %v = fadd <4 x half> %splat.x, %splat.y603 ret <4 x half> %v604}605 606define <2 x float> @v2f32(float %x, float %y) {607; CHECK-LABEL: v2f32:608; CHECK: # %bb.0:609; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma610; CHECK-NEXT: vfmv.s.f v8, fa0611; CHECK-NEXT: vfadd.vf v9, v8, fa1612; CHECK-NEXT: vrgather.vi v8, v9, 0613; CHECK-NEXT: ret614 %head.x = insertelement <2 x float> poison, float %x, i32 0615 %splat.x = shufflevector <2 x float> %head.x, <2 x float> poison, <2 x i32> zeroinitializer616 %head.y = insertelement <2 x float> poison, float %y, i32 0617 %splat.y = shufflevector <2 x float> %head.y, <2 x float> poison, <2 x i32> zeroinitializer618 %v = fadd <2 x float> %splat.x, %splat.y619 ret <2 x float> %v620}621 622define <1 x double> @v2f64(double %x, double %y) {623; CHECK-LABEL: v2f64:624; CHECK: # %bb.0:625; CHECK-NEXT: vsetivli zero, 1, e64, m1, ta, ma626; CHECK-NEXT: vfmv.s.f v8, fa0627; CHECK-NEXT: vfadd.vf v8, v8, fa1628; CHECK-NEXT: ret629 %head.x = insertelement <1 x double> poison, double %x, i32 0630 %splat.x = shufflevector <1 x double> %head.x, <1 x double> poison, <1 x i32> zeroinitializer631 %head.y = insertelement <1 x double> poison, double %y, i32 0632 %splat.y = shufflevector <1 x double> %head.y, <1 x double> poison, <1 x i32> zeroinitializer633 %v = fadd <1 x double> %splat.x, %splat.y634 ret <1 x double> %v635}636