614 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,+zfh,+zvfh -verify-machineinstrs | FileCheck %s -check-prefixes=CHECK,RV323; RUN: llc < %s -mtriple=riscv64 -mattr=+v,+zfh,+zvfh -verify-machineinstrs | FileCheck %s -check-prefixes=CHECK,RV644 5define <vscale x 1 x i1> @nxv1i1(i1 %x, i1 %y) {6; CHECK-LABEL: nxv1i1:7; CHECK: # %bb.0:8; CHECK-NEXT: xor a0, a0, a19; CHECK-NEXT: andi a0, a0, 110; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, ma11; CHECK-NEXT: vmv.v.x v8, a012; CHECK-NEXT: vmsne.vi v0, v8, 013; CHECK-NEXT: ret14 %head.x = insertelement <vscale x 1 x i1> poison, i1 %x, i32 015 %splat.x = shufflevector <vscale x 1 x i1> %head.x, <vscale x 1 x i1> poison, <vscale x 1 x i32> zeroinitializer16 %head.y = insertelement <vscale x 1 x i1> poison, i1 %y, i32 017 %splat.y = shufflevector <vscale x 1 x i1> %head.y, <vscale x 1 x i1> poison, <vscale x 1 x i32> zeroinitializer18 %v = add <vscale x 1 x i1> %splat.x, %splat.y19 ret <vscale x 1 x i1> %v20}21 22define <vscale x 2 x i1> @nxv2i1(i1 %x, i1 %y) {23; CHECK-LABEL: nxv2i1:24; CHECK: # %bb.0:25; CHECK-NEXT: xor a0, a0, a126; CHECK-NEXT: andi a0, a0, 127; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, ma28; CHECK-NEXT: vmv.v.x v8, a029; CHECK-NEXT: vmsne.vi v0, v8, 030; CHECK-NEXT: ret31 %head.x = insertelement <vscale x 2 x i1> poison, i1 %x, i32 032 %splat.x = shufflevector <vscale x 2 x i1> %head.x, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer33 %head.y = insertelement <vscale x 2 x i1> poison, i1 %y, i32 034 %splat.y = shufflevector <vscale x 2 x i1> %head.y, <vscale x 2 x i1> poison, <vscale x 2 x i32> zeroinitializer35 %v = add <vscale x 2 x i1> %splat.x, %splat.y36 ret <vscale x 2 x i1> %v37}38 39define <vscale x 4 x i1> @nxv4i1(i1 %x, i1 %y) {40; CHECK-LABEL: nxv4i1:41; CHECK: # %bb.0:42; CHECK-NEXT: xor a0, a0, a143; CHECK-NEXT: andi a0, a0, 144; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma45; CHECK-NEXT: vmv.v.x v8, a046; CHECK-NEXT: vmsne.vi v0, v8, 047; CHECK-NEXT: ret48 %head.x = insertelement <vscale x 4 x i1> poison, i1 %x, i32 049 %splat.x = shufflevector <vscale x 4 x i1> %head.x, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer50 %head.y = insertelement <vscale x 4 x i1> poison, i1 %y, i32 051 %splat.y = shufflevector <vscale x 4 x i1> %head.y, <vscale x 4 x i1> poison, <vscale x 4 x i32> zeroinitializer52 %v = add <vscale x 4 x i1> %splat.x, %splat.y53 ret <vscale x 4 x i1> %v54}55 56define <vscale x 8 x i1> @nxv8i1(i1 %x, i1 %y) {57; CHECK-LABEL: nxv8i1:58; CHECK: # %bb.0:59; CHECK-NEXT: xor a0, a0, a160; CHECK-NEXT: andi a0, a0, 161; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma62; CHECK-NEXT: vmv.v.x v8, a063; CHECK-NEXT: vmsne.vi v0, v8, 064; CHECK-NEXT: ret65 %head.x = insertelement <vscale x 8 x i1> poison, i1 %x, i32 066 %splat.x = shufflevector <vscale x 8 x i1> %head.x, <vscale x 8 x i1> poison, <vscale x 8 x i32> zeroinitializer67 %head.y = insertelement <vscale x 8 x i1> poison, i1 %y, i32 068 %splat.y = shufflevector <vscale x 8 x i1> %head.y, <vscale x 8 x i1> poison, <vscale x 8 x i32> zeroinitializer69 %v = add <vscale x 8 x i1> %splat.x, %splat.y70 ret <vscale x 8 x i1> %v71}72 73define <vscale x 16 x i1> @nxv16i1(i1 %x, i1 %y) {74; CHECK-LABEL: nxv16i1:75; CHECK: # %bb.0:76; CHECK-NEXT: xor a0, a0, a177; CHECK-NEXT: andi a0, a0, 178; CHECK-NEXT: vsetvli a1, zero, e8, m2, ta, ma79; CHECK-NEXT: vmv.v.x v8, a080; CHECK-NEXT: vmsne.vi v0, v8, 081; CHECK-NEXT: ret82 %head.x = insertelement <vscale x 16 x i1> poison, i1 %x, i32 083 %splat.x = shufflevector <vscale x 16 x i1> %head.x, <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer84 %head.y = insertelement <vscale x 16 x i1> poison, i1 %y, i32 085 %splat.y = shufflevector <vscale x 16 x i1> %head.y, <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer86 %v = add <vscale x 16 x i1> %splat.x, %splat.y87 ret <vscale x 16 x i1> %v88}89 90define <vscale x 32 x i1> @nxv32i1(i1 %x, i1 %y) {91; CHECK-LABEL: nxv32i1:92; CHECK: # %bb.0:93; CHECK-NEXT: xor a0, a0, a194; CHECK-NEXT: andi a0, a0, 195; CHECK-NEXT: vsetvli a1, zero, e8, m4, ta, ma96; CHECK-NEXT: vmv.v.x v8, a097; CHECK-NEXT: vmsne.vi v0, v8, 098; CHECK-NEXT: ret99 %head.x = insertelement <vscale x 32 x i1> poison, i1 %x, i32 0100 %splat.x = shufflevector <vscale x 32 x i1> %head.x, <vscale x 32 x i1> poison, <vscale x 32 x i32> zeroinitializer101 %head.y = insertelement <vscale x 32 x i1> poison, i1 %y, i32 0102 %splat.y = shufflevector <vscale x 32 x i1> %head.y, <vscale x 32 x i1> poison, <vscale x 32 x i32> zeroinitializer103 %v = add <vscale x 32 x i1> %splat.x, %splat.y104 ret <vscale x 32 x i1> %v105}106 107define <vscale x 64 x i1> @nxv64i1(i1 %x, i1 %y) {108; CHECK-LABEL: nxv64i1:109; CHECK: # %bb.0:110; CHECK-NEXT: xor a0, a0, a1111; CHECK-NEXT: andi a0, a0, 1112; CHECK-NEXT: vsetvli a1, zero, e8, m8, ta, ma113; CHECK-NEXT: vmv.v.x v8, a0114; CHECK-NEXT: vmsne.vi v0, v8, 0115; CHECK-NEXT: ret116 %head.x = insertelement <vscale x 64 x i1> poison, i1 %x, i32 0117 %splat.x = shufflevector <vscale x 64 x i1> %head.x, <vscale x 64 x i1> poison, <vscale x 64 x i32> zeroinitializer118 %head.y = insertelement <vscale x 64 x i1> poison, i1 %y, i32 0119 %splat.y = shufflevector <vscale x 64 x i1> %head.y, <vscale x 64 x i1> poison, <vscale x 64 x i32> zeroinitializer120 %v = add <vscale x 64 x i1> %splat.x, %splat.y121 ret <vscale x 64 x i1> %v122}123 124define <vscale x 1 x i8> @nxv1i8(i8 %x, i8 %y) {125; CHECK-LABEL: nxv1i8:126; CHECK: # %bb.0:127; CHECK-NEXT: add a0, a0, a1128; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, ma129; CHECK-NEXT: vmv.v.x v8, a0130; CHECK-NEXT: ret131 %head.x = insertelement <vscale x 1 x i8> poison, i8 %x, i32 0132 %splat.x = shufflevector <vscale x 1 x i8> %head.x, <vscale x 1 x i8> poison, <vscale x 1 x i32> zeroinitializer133 %head.y = insertelement <vscale x 1 x i8> poison, i8 %y, i32 0134 %splat.y = shufflevector <vscale x 1 x i8> %head.y, <vscale x 1 x i8> poison, <vscale x 1 x i32> zeroinitializer135 %v = add <vscale x 1 x i8> %splat.x, %splat.y136 ret <vscale x 1 x i8> %v137}138 139define <vscale x 2 x i8> @nxv2i8(i8 %x, i8 %y) {140; CHECK-LABEL: nxv2i8:141; CHECK: # %bb.0:142; CHECK-NEXT: add a0, a0, a1143; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, ma144; CHECK-NEXT: vmv.v.x v8, a0145; CHECK-NEXT: ret146 %head.x = insertelement <vscale x 2 x i8> poison, i8 %x, i32 0147 %splat.x = shufflevector <vscale x 2 x i8> %head.x, <vscale x 2 x i8> poison, <vscale x 2 x i32> zeroinitializer148 %head.y = insertelement <vscale x 2 x i8> poison, i8 %y, i32 0149 %splat.y = shufflevector <vscale x 2 x i8> %head.y, <vscale x 2 x i8> poison, <vscale x 2 x i32> zeroinitializer150 %v = add <vscale x 2 x i8> %splat.x, %splat.y151 ret <vscale x 2 x i8> %v152}153 154define <vscale x 4 x i8> @nxv4i8(i8 %x, i8 %y) {155; CHECK-LABEL: nxv4i8:156; CHECK: # %bb.0:157; CHECK-NEXT: add a0, a0, a1158; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma159; CHECK-NEXT: vmv.v.x v8, a0160; CHECK-NEXT: ret161 %head.x = insertelement <vscale x 4 x i8> poison, i8 %x, i32 0162 %splat.x = shufflevector <vscale x 4 x i8> %head.x, <vscale x 4 x i8> poison, <vscale x 4 x i32> zeroinitializer163 %head.y = insertelement <vscale x 4 x i8> poison, i8 %y, i32 0164 %splat.y = shufflevector <vscale x 4 x i8> %head.y, <vscale x 4 x i8> poison, <vscale x 4 x i32> zeroinitializer165 %v = add <vscale x 4 x i8> %splat.x, %splat.y166 ret <vscale x 4 x i8> %v167}168 169define <vscale x 8 x i8> @nxv8i8(i8 %x, i8 %y) {170; CHECK-LABEL: nxv8i8:171; CHECK: # %bb.0:172; CHECK-NEXT: add a0, a0, a1173; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma174; CHECK-NEXT: vmv.v.x v8, a0175; CHECK-NEXT: ret176 %head.x = insertelement <vscale x 8 x i8> poison, i8 %x, i32 0177 %splat.x = shufflevector <vscale x 8 x i8> %head.x, <vscale x 8 x i8> poison, <vscale x 8 x i32> zeroinitializer178 %head.y = insertelement <vscale x 8 x i8> poison, i8 %y, i32 0179 %splat.y = shufflevector <vscale x 8 x i8> %head.y, <vscale x 8 x i8> poison, <vscale x 8 x i32> zeroinitializer180 %v = add <vscale x 8 x i8> %splat.x, %splat.y181 ret <vscale x 8 x i8> %v182}183 184define <vscale x 16 x i8> @nxv16i8(i8 %x, i8 %y) {185; CHECK-LABEL: nxv16i8:186; CHECK: # %bb.0:187; CHECK-NEXT: add a0, a0, a1188; CHECK-NEXT: vsetvli a1, zero, e8, m2, ta, ma189; CHECK-NEXT: vmv.v.x v8, a0190; CHECK-NEXT: ret191 %head.x = insertelement <vscale x 16 x i8> poison, i8 %x, i32 0192 %splat.x = shufflevector <vscale x 16 x i8> %head.x, <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer193 %head.y = insertelement <vscale x 16 x i8> poison, i8 %y, i32 0194 %splat.y = shufflevector <vscale x 16 x i8> %head.y, <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer195 %v = add <vscale x 16 x i8> %splat.x, %splat.y196 ret <vscale x 16 x i8> %v197}198 199define <vscale x 32 x i8> @nxv32i8(i8 %x, i8 %y) {200; CHECK-LABEL: nxv32i8:201; CHECK: # %bb.0:202; CHECK-NEXT: add a0, a0, a1203; CHECK-NEXT: vsetvli a1, zero, e8, m4, ta, ma204; CHECK-NEXT: vmv.v.x v8, a0205; CHECK-NEXT: ret206 %head.x = insertelement <vscale x 32 x i8> poison, i8 %x, i32 0207 %splat.x = shufflevector <vscale x 32 x i8> %head.x, <vscale x 32 x i8> poison, <vscale x 32 x i32> zeroinitializer208 %head.y = insertelement <vscale x 32 x i8> poison, i8 %y, i32 0209 %splat.y = shufflevector <vscale x 32 x i8> %head.y, <vscale x 32 x i8> poison, <vscale x 32 x i32> zeroinitializer210 %v = add <vscale x 32 x i8> %splat.x, %splat.y211 ret <vscale x 32 x i8> %v212}213 214define <vscale x 64 x i8> @nxv64i8(i8 %x, i8 %y) {215; CHECK-LABEL: nxv64i8:216; CHECK: # %bb.0:217; CHECK-NEXT: add a0, a0, a1218; CHECK-NEXT: vsetvli a1, zero, e8, m8, ta, ma219; CHECK-NEXT: vmv.v.x v8, a0220; CHECK-NEXT: ret221 %head.x = insertelement <vscale x 64 x i8> poison, i8 %x, i32 0222 %splat.x = shufflevector <vscale x 64 x i8> %head.x, <vscale x 64 x i8> poison, <vscale x 64 x i32> zeroinitializer223 %head.y = insertelement <vscale x 64 x i8> poison, i8 %y, i32 0224 %splat.y = shufflevector <vscale x 64 x i8> %head.y, <vscale x 64 x i8> poison, <vscale x 64 x i32> zeroinitializer225 %v = add <vscale x 64 x i8> %splat.x, %splat.y226 ret <vscale x 64 x i8> %v227}228 229define <vscale x 1 x i16> @nxv1i16(i16 %x, i16 %y) {230; CHECK-LABEL: nxv1i16:231; CHECK: # %bb.0:232; CHECK-NEXT: add a0, a0, a1233; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma234; CHECK-NEXT: vmv.v.x v8, a0235; CHECK-NEXT: ret236 %head.x = insertelement <vscale x 1 x i16> poison, i16 %x, i32 0237 %splat.x = shufflevector <vscale x 1 x i16> %head.x, <vscale x 1 x i16> poison, <vscale x 1 x i32> zeroinitializer238 %head.y = insertelement <vscale x 1 x i16> poison, i16 %y, i32 0239 %splat.y = shufflevector <vscale x 1 x i16> %head.y, <vscale x 1 x i16> poison, <vscale x 1 x i32> zeroinitializer240 %v = add <vscale x 1 x i16> %splat.x, %splat.y241 ret <vscale x 1 x i16> %v242}243 244define <vscale x 2 x i16> @nxv2i16(i16 %x, i16 %y) {245; CHECK-LABEL: nxv2i16:246; CHECK: # %bb.0:247; CHECK-NEXT: add a0, a0, a1248; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma249; CHECK-NEXT: vmv.v.x v8, a0250; CHECK-NEXT: ret251 %head.x = insertelement <vscale x 2 x i16> poison, i16 %x, i32 0252 %splat.x = shufflevector <vscale x 2 x i16> %head.x, <vscale x 2 x i16> poison, <vscale x 2 x i32> zeroinitializer253 %head.y = insertelement <vscale x 2 x i16> poison, i16 %y, i32 0254 %splat.y = shufflevector <vscale x 2 x i16> %head.y, <vscale x 2 x i16> poison, <vscale x 2 x i32> zeroinitializer255 %v = add <vscale x 2 x i16> %splat.x, %splat.y256 ret <vscale x 2 x i16> %v257}258 259define <vscale x 4 x i16> @nxv4i16(i16 %x, i16 %y) {260; CHECK-LABEL: nxv4i16:261; CHECK: # %bb.0:262; CHECK-NEXT: add a0, a0, a1263; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma264; CHECK-NEXT: vmv.v.x v8, a0265; CHECK-NEXT: ret266 %head.x = insertelement <vscale x 4 x i16> poison, i16 %x, i32 0267 %splat.x = shufflevector <vscale x 4 x i16> %head.x, <vscale x 4 x i16> poison, <vscale x 4 x i32> zeroinitializer268 %head.y = insertelement <vscale x 4 x i16> poison, i16 %y, i32 0269 %splat.y = shufflevector <vscale x 4 x i16> %head.y, <vscale x 4 x i16> poison, <vscale x 4 x i32> zeroinitializer270 %v = add <vscale x 4 x i16> %splat.x, %splat.y271 ret <vscale x 4 x i16> %v272}273 274define <vscale x 8 x i16> @nxv8i16(i16 %x, i16 %y) {275; CHECK-LABEL: nxv8i16:276; CHECK: # %bb.0:277; CHECK-NEXT: add a0, a0, a1278; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma279; CHECK-NEXT: vmv.v.x v8, a0280; CHECK-NEXT: ret281 %head.x = insertelement <vscale x 8 x i16> poison, i16 %x, i32 0282 %splat.x = shufflevector <vscale x 8 x i16> %head.x, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer283 %head.y = insertelement <vscale x 8 x i16> poison, i16 %y, i32 0284 %splat.y = shufflevector <vscale x 8 x i16> %head.y, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer285 %v = add <vscale x 8 x i16> %splat.x, %splat.y286 ret <vscale x 8 x i16> %v287}288 289define <vscale x 16 x i16> @nxv16i16(i16 %x, i16 %y) {290; CHECK-LABEL: nxv16i16:291; CHECK: # %bb.0:292; CHECK-NEXT: add a0, a0, a1293; CHECK-NEXT: vsetvli a1, zero, e16, m4, ta, ma294; CHECK-NEXT: vmv.v.x v8, a0295; CHECK-NEXT: ret296 %head.x = insertelement <vscale x 16 x i16> poison, i16 %x, i32 0297 %splat.x = shufflevector <vscale x 16 x i16> %head.x, <vscale x 16 x i16> poison, <vscale x 16 x i32> zeroinitializer298 %head.y = insertelement <vscale x 16 x i16> poison, i16 %y, i32 0299 %splat.y = shufflevector <vscale x 16 x i16> %head.y, <vscale x 16 x i16> poison, <vscale x 16 x i32> zeroinitializer300 %v = add <vscale x 16 x i16> %splat.x, %splat.y301 ret <vscale x 16 x i16> %v302}303 304define <vscale x 32 x i16> @nxv32i16(i16 %x, i16 %y) {305; CHECK-LABEL: nxv32i16:306; CHECK: # %bb.0:307; CHECK-NEXT: add a0, a0, a1308; CHECK-NEXT: vsetvli a1, zero, e16, m8, ta, ma309; CHECK-NEXT: vmv.v.x v8, a0310; CHECK-NEXT: ret311 %head.x = insertelement <vscale x 32 x i16> poison, i16 %x, i32 0312 %splat.x = shufflevector <vscale x 32 x i16> %head.x, <vscale x 32 x i16> poison, <vscale x 32 x i32> zeroinitializer313 %head.y = insertelement <vscale x 32 x i16> poison, i16 %y, i32 0314 %splat.y = shufflevector <vscale x 32 x i16> %head.y, <vscale x 32 x i16> poison, <vscale x 32 x i32> zeroinitializer315 %v = add <vscale x 32 x i16> %splat.x, %splat.y316 ret <vscale x 32 x i16> %v317}318 319define <vscale x 1 x i32> @nxv1i32(i32 %x, i32 %y) {320; CHECK-LABEL: nxv1i32:321; CHECK: # %bb.0:322; CHECK-NEXT: add a0, a0, a1323; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, ma324; CHECK-NEXT: vmv.v.x v8, a0325; CHECK-NEXT: ret326 %head.x = insertelement <vscale x 1 x i32> poison, i32 %x, i32 0327 %splat.x = shufflevector <vscale x 1 x i32> %head.x, <vscale x 1 x i32> poison, <vscale x 1 x i32> zeroinitializer328 %head.y = insertelement <vscale x 1 x i32> poison, i32 %y, i32 0329 %splat.y = shufflevector <vscale x 1 x i32> %head.y, <vscale x 1 x i32> poison, <vscale x 1 x i32> zeroinitializer330 %v = add <vscale x 1 x i32> %splat.x, %splat.y331 ret <vscale x 1 x i32> %v332}333 334define <vscale x 2 x i32> @nxv2i32(i32 %x, i32 %y) {335; CHECK-LABEL: nxv2i32:336; CHECK: # %bb.0:337; CHECK-NEXT: add a0, a0, a1338; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma339; CHECK-NEXT: vmv.v.x v8, a0340; CHECK-NEXT: ret341 %head.x = insertelement <vscale x 2 x i32> poison, i32 %x, i32 0342 %splat.x = shufflevector <vscale x 2 x i32> %head.x, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer343 %head.y = insertelement <vscale x 2 x i32> poison, i32 %y, i32 0344 %splat.y = shufflevector <vscale x 2 x i32> %head.y, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer345 %v = add <vscale x 2 x i32> %splat.x, %splat.y346 ret <vscale x 2 x i32> %v347}348 349define <vscale x 4 x i32> @nxv4i32(i32 %x, i32 %y) {350; CHECK-LABEL: nxv4i32:351; CHECK: # %bb.0:352; CHECK-NEXT: add a0, a0, a1353; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, ma354; CHECK-NEXT: vmv.v.x v8, a0355; CHECK-NEXT: ret356 %head.x = insertelement <vscale x 4 x i32> poison, i32 %x, i32 0357 %splat.x = shufflevector <vscale x 4 x i32> %head.x, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer358 %head.y = insertelement <vscale x 4 x i32> poison, i32 %y, i32 0359 %splat.y = shufflevector <vscale x 4 x i32> %head.y, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer360 %v = add <vscale x 4 x i32> %splat.x, %splat.y361 ret <vscale x 4 x i32> %v362}363 364define <vscale x 8 x i32> @nxv8i32(i32 %x, i32 %y) {365; CHECK-LABEL: nxv8i32:366; CHECK: # %bb.0:367; CHECK-NEXT: add a0, a0, a1368; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma369; CHECK-NEXT: vmv.v.x v8, a0370; CHECK-NEXT: ret371 %head.x = insertelement <vscale x 8 x i32> poison, i32 %x, i32 0372 %splat.x = shufflevector <vscale x 8 x i32> %head.x, <vscale x 8 x i32> poison, <vscale x 8 x i32> zeroinitializer373 %head.y = insertelement <vscale x 8 x i32> poison, i32 %y, i32 0374 %splat.y = shufflevector <vscale x 8 x i32> %head.y, <vscale x 8 x i32> poison, <vscale x 8 x i32> zeroinitializer375 %v = add <vscale x 8 x i32> %splat.x, %splat.y376 ret <vscale x 8 x i32> %v377}378 379define <vscale x 16 x i32> @nxv16i32(i32 %x, i32 %y) {380; CHECK-LABEL: nxv16i32:381; CHECK: # %bb.0:382; CHECK-NEXT: add a0, a0, a1383; CHECK-NEXT: vsetvli a1, zero, e32, m8, ta, ma384; CHECK-NEXT: vmv.v.x v8, a0385; CHECK-NEXT: ret386 %head.x = insertelement <vscale x 16 x i32> poison, i32 %x, i32 0387 %splat.x = shufflevector <vscale x 16 x i32> %head.x, <vscale x 16 x i32> poison, <vscale x 16 x i32> zeroinitializer388 %head.y = insertelement <vscale x 16 x i32> poison, i32 %y, i32 0389 %splat.y = shufflevector <vscale x 16 x i32> %head.y, <vscale x 16 x i32> poison, <vscale x 16 x i32> zeroinitializer390 %v = add <vscale x 16 x i32> %splat.x, %splat.y391 ret <vscale x 16 x i32> %v392}393 394define <vscale x 1 x i64> @nxv1i64(i64 %x, i64 %y) {395; RV32-LABEL: nxv1i64:396; RV32: # %bb.0:397; RV32-NEXT: addi sp, sp, -16398; RV32-NEXT: .cfi_def_cfa_offset 16399; RV32-NEXT: add a2, a0, a2400; RV32-NEXT: add a1, a1, a3401; RV32-NEXT: sltu a0, a2, a0402; RV32-NEXT: add a0, a1, a0403; RV32-NEXT: sw a2, 8(sp)404; RV32-NEXT: sw a0, 12(sp)405; RV32-NEXT: addi a0, sp, 8406; RV32-NEXT: vsetvli a1, zero, e64, m1, ta, ma407; RV32-NEXT: vlse64.v v8, (a0), zero408; RV32-NEXT: addi sp, sp, 16409; RV32-NEXT: .cfi_def_cfa_offset 0410; RV32-NEXT: ret411;412; RV64-LABEL: nxv1i64:413; RV64: # %bb.0:414; RV64-NEXT: add a0, a0, a1415; RV64-NEXT: vsetvli a1, zero, e64, m1, ta, ma416; RV64-NEXT: vmv.v.x v8, a0417; RV64-NEXT: ret418 %head.x = insertelement <vscale x 1 x i64> poison, i64 %x, i32 0419 %splat.x = shufflevector <vscale x 1 x i64> %head.x, <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer420 %head.y = insertelement <vscale x 1 x i64> poison, i64 %y, i32 0421 %splat.y = shufflevector <vscale x 1 x i64> %head.y, <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer422 %v = add <vscale x 1 x i64> %splat.x, %splat.y423 ret <vscale x 1 x i64> %v424}425 426define <vscale x 2 x i64> @nxv2i64(i64 %x, i64 %y) {427; RV32-LABEL: nxv2i64:428; RV32: # %bb.0:429; RV32-NEXT: addi sp, sp, -16430; RV32-NEXT: .cfi_def_cfa_offset 16431; RV32-NEXT: add a2, a0, a2432; RV32-NEXT: add a1, a1, a3433; RV32-NEXT: sltu a0, a2, a0434; RV32-NEXT: add a0, a1, a0435; RV32-NEXT: sw a2, 8(sp)436; RV32-NEXT: sw a0, 12(sp)437; RV32-NEXT: addi a0, sp, 8438; RV32-NEXT: vsetvli a1, zero, e64, m2, ta, ma439; RV32-NEXT: vlse64.v v8, (a0), zero440; RV32-NEXT: addi sp, sp, 16441; RV32-NEXT: .cfi_def_cfa_offset 0442; RV32-NEXT: ret443;444; RV64-LABEL: nxv2i64:445; RV64: # %bb.0:446; RV64-NEXT: add a0, a0, a1447; RV64-NEXT: vsetvli a1, zero, e64, m2, ta, ma448; RV64-NEXT: vmv.v.x v8, a0449; RV64-NEXT: ret450 %head.x = insertelement <vscale x 2 x i64> poison, i64 %x, i32 0451 %splat.x = shufflevector <vscale x 2 x i64> %head.x, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer452 %head.y = insertelement <vscale x 2 x i64> poison, i64 %y, i32 0453 %splat.y = shufflevector <vscale x 2 x i64> %head.y, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer454 %v = add <vscale x 2 x i64> %splat.x, %splat.y455 ret <vscale x 2 x i64> %v456}457 458define <vscale x 4 x i64> @nxv4i64(i64 %x, i64 %y) {459; RV32-LABEL: nxv4i64:460; RV32: # %bb.0:461; RV32-NEXT: addi sp, sp, -16462; RV32-NEXT: .cfi_def_cfa_offset 16463; RV32-NEXT: add a2, a0, a2464; RV32-NEXT: add a1, a1, a3465; RV32-NEXT: sltu a0, a2, a0466; RV32-NEXT: add a0, a1, a0467; RV32-NEXT: sw a2, 8(sp)468; RV32-NEXT: sw a0, 12(sp)469; RV32-NEXT: addi a0, sp, 8470; RV32-NEXT: vsetvli a1, zero, e64, m4, ta, ma471; RV32-NEXT: vlse64.v v8, (a0), zero472; RV32-NEXT: addi sp, sp, 16473; RV32-NEXT: .cfi_def_cfa_offset 0474; RV32-NEXT: ret475;476; RV64-LABEL: nxv4i64:477; RV64: # %bb.0:478; RV64-NEXT: add a0, a0, a1479; RV64-NEXT: vsetvli a1, zero, e64, m4, ta, ma480; RV64-NEXT: vmv.v.x v8, a0481; RV64-NEXT: ret482 %head.x = insertelement <vscale x 4 x i64> poison, i64 %x, i32 0483 %splat.x = shufflevector <vscale x 4 x i64> %head.x, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer484 %head.y = insertelement <vscale x 4 x i64> poison, i64 %y, i32 0485 %splat.y = shufflevector <vscale x 4 x i64> %head.y, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer486 %v = add <vscale x 4 x i64> %splat.x, %splat.y487 ret <vscale x 4 x i64> %v488}489 490define <vscale x 8 x i64> @nxv8i64(i64 %x, i64 %y) {491; RV32-LABEL: nxv8i64:492; RV32: # %bb.0:493; RV32-NEXT: addi sp, sp, -16494; RV32-NEXT: .cfi_def_cfa_offset 16495; RV32-NEXT: add a2, a0, a2496; RV32-NEXT: add a1, a1, a3497; RV32-NEXT: sltu a0, a2, a0498; RV32-NEXT: add a0, a1, a0499; RV32-NEXT: sw a2, 8(sp)500; RV32-NEXT: sw a0, 12(sp)501; RV32-NEXT: addi a0, sp, 8502; RV32-NEXT: vsetvli a1, zero, e64, m8, ta, ma503; RV32-NEXT: vlse64.v v8, (a0), zero504; RV32-NEXT: addi sp, sp, 16505; RV32-NEXT: .cfi_def_cfa_offset 0506; RV32-NEXT: ret507;508; RV64-LABEL: nxv8i64:509; RV64: # %bb.0:510; RV64-NEXT: add a0, a0, a1511; RV64-NEXT: vsetvli a1, zero, e64, m8, ta, ma512; RV64-NEXT: vmv.v.x v8, a0513; RV64-NEXT: ret514 %head.x = insertelement <vscale x 8 x i64> poison, i64 %x, i32 0515 %splat.x = shufflevector <vscale x 8 x i64> %head.x, <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer516 %head.y = insertelement <vscale x 8 x i64> poison, i64 %y, i32 0517 %splat.y = shufflevector <vscale x 8 x i64> %head.y, <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer518 %v = add <vscale x 8 x i64> %splat.x, %splat.y519 ret <vscale x 8 x i64> %v520}521 522define <vscale x 4 x half> @nxv4f16(half %x, half %y) {523; CHECK-LABEL: nxv4f16:524; CHECK: # %bb.0:525; CHECK-NEXT: fadd.h fa5, fa0, fa1526; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma527; CHECK-NEXT: vfmv.v.f v8, fa5528; CHECK-NEXT: ret529 %head.x = insertelement <vscale x 4 x half> poison, half %x, i32 0530 %splat.x = shufflevector <vscale x 4 x half> %head.x, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer531 %head.y = insertelement <vscale x 4 x half> poison, half %y, i32 0532 %splat.y = shufflevector <vscale x 4 x half> %head.y, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer533 %v = fadd <vscale x 4 x half> %splat.x, %splat.y534 ret <vscale x 4 x half> %v535}536 537define <vscale x 2 x float> @nxv2f32(float %x, float %y) {538; CHECK-LABEL: nxv2f32:539; CHECK: # %bb.0:540; CHECK-NEXT: fadd.s fa5, fa0, fa1541; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma542; CHECK-NEXT: vfmv.v.f v8, fa5543; CHECK-NEXT: ret544 %head.x = insertelement <vscale x 2 x float> poison, float %x, i32 0545 %splat.x = shufflevector <vscale x 2 x float> %head.x, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer546 %head.y = insertelement <vscale x 2 x float> poison, float %y, i32 0547 %splat.y = shufflevector <vscale x 2 x float> %head.y, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer548 %v = fadd <vscale x 2 x float> %splat.x, %splat.y549 ret <vscale x 2 x float> %v550}551 552define <vscale x 1 x double> @nxv2f64(double %x, double %y) {553; CHECK-LABEL: nxv2f64:554; CHECK: # %bb.0:555; CHECK-NEXT: fadd.d fa5, fa0, fa1556; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma557; CHECK-NEXT: vfmv.v.f v8, fa5558; CHECK-NEXT: ret559 %head.x = insertelement <vscale x 1 x double> poison, double %x, i32 0560 %splat.x = shufflevector <vscale x 1 x double> %head.x, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer561 %head.y = insertelement <vscale x 1 x double> poison, double %y, i32 0562 %splat.y = shufflevector <vscale x 1 x double> %head.y, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer563 %v = fadd <vscale x 1 x double> %splat.x, %splat.y564 ret <vscale x 1 x double> %v565}566 567define <vscale x 4 x i8> @uaddsatnxv4i8(i8 %x, i8 %y) {568; CHECK-LABEL: uaddsatnxv4i8:569; CHECK: # %bb.0:570; CHECK-NEXT: vsetvli a2, zero, e8, mf2, ta, ma571; CHECK-NEXT: vmv.v.x v8, a0572; CHECK-NEXT: vsaddu.vx v8, v8, a1573; CHECK-NEXT: ret574 %head.x = insertelement <vscale x 4 x i8> poison, i8 %x, i32 0575 %splat.x = shufflevector <vscale x 4 x i8> %head.x, <vscale x 4 x i8> poison, <vscale x 4 x i32> zeroinitializer576 %head.y = insertelement <vscale x 4 x i8> poison, i8 %y, i32 0577 %splat.y = shufflevector <vscale x 4 x i8> %head.y, <vscale x 4 x i8> poison, <vscale x 4 x i32> zeroinitializer578 %v = call <vscale x 4 x i8> @llvm.uadd.sat.nxv4i8(<vscale x 4 x i8> %splat.x, <vscale x 4 x i8> %splat.y)579 ret <vscale x 4 x i8> %v580}581 582define <vscale x 1 x i64> @uaddsatnxv1i64(i64 %x, i64 %y) {583; RV32-LABEL: uaddsatnxv1i64:584; RV32: # %bb.0:585; RV32-NEXT: addi sp, sp, -16586; RV32-NEXT: .cfi_def_cfa_offset 16587; RV32-NEXT: sw a0, 8(sp)588; RV32-NEXT: sw a1, 12(sp)589; RV32-NEXT: addi a0, sp, 8590; RV32-NEXT: vsetvli a1, zero, e64, m1, ta, ma591; RV32-NEXT: vlse64.v v8, (a0), zero592; RV32-NEXT: sw a2, 0(sp)593; RV32-NEXT: sw a3, 4(sp)594; RV32-NEXT: mv a0, sp595; RV32-NEXT: vlse64.v v9, (a0), zero596; RV32-NEXT: vsaddu.vv v8, v8, v9597; RV32-NEXT: addi sp, sp, 16598; RV32-NEXT: .cfi_def_cfa_offset 0599; RV32-NEXT: ret600;601; RV64-LABEL: uaddsatnxv1i64:602; RV64: # %bb.0:603; RV64-NEXT: vsetvli a2, zero, e64, m1, ta, ma604; RV64-NEXT: vmv.v.x v8, a0605; RV64-NEXT: vsaddu.vx v8, v8, a1606; RV64-NEXT: ret607 %head.x = insertelement <vscale x 1 x i64> poison, i64 %x, i32 0608 %splat.x = shufflevector <vscale x 1 x i64> %head.x, <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer609 %head.y = insertelement <vscale x 1 x i64> poison, i64 %y, i32 0610 %splat.y = shufflevector <vscale x 1 x i64> %head.y, <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer611 %v = call <vscale x 1 x i64> @llvm.uadd.sat.nxv4i8(<vscale x 1 x i64> %splat.x, <vscale x 1 x i64> %splat.y)612 ret <vscale x 1 x i64> %v613}614