brintos

brintos / llvm-project-archived public Read only

0
0
Text · 23.6 KiB · 6b5ca5f Raw
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