1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s \ 3; RUN: | FileCheck %s --check-prefixes=CHECK,RV32 4; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s \ 5; RUN: | FileCheck %s --check-prefixes=CHECK,RV64 6 7declare <vscale x 1 x i8> @llvm.sadd.sat.nxv1i8(<vscale x 1 x i8>, <vscale x 1 x i8>) 8 9define <vscale x 1 x i8> @sadd_nxv1i8_vv(<vscale x 1 x i8> %va, <vscale x 1 x i8> %b) { 10; CHECK-LABEL: sadd_nxv1i8_vv: 11; CHECK: # %bb.0: 12; CHECK-NEXT: vsetvli a0, zero, e8, mf8, ta, ma 13; CHECK-NEXT: vsadd.vv v8, v8, v9 14; CHECK-NEXT: ret 15 %v = call <vscale x 1 x i8> @llvm.sadd.sat.nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i8> %b) 16 ret <vscale x 1 x i8> %v 17} 18 19define <vscale x 1 x i8> @sadd_nxv1i8_vx(<vscale x 1 x i8> %va, i8 %b) { 20; CHECK-LABEL: sadd_nxv1i8_vx: 21; CHECK: # %bb.0: 22; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, ma 23; CHECK-NEXT: vsadd.vx v8, v8, a0 24; CHECK-NEXT: ret 25 %elt.head = insertelement <vscale x 1 x i8> poison, i8 %b, i32 0 26 %vb = shufflevector <vscale x 1 x i8> %elt.head, <vscale x 1 x i8> poison, <vscale x 1 x i32> zeroinitializer 27 %v = call <vscale x 1 x i8> @llvm.sadd.sat.nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i8> %vb) 28 ret <vscale x 1 x i8> %v 29} 30 31define <vscale x 1 x i8> @sadd_nxv1i8_vi(<vscale x 1 x i8> %va) { 32; CHECK-LABEL: sadd_nxv1i8_vi: 33; CHECK: # %bb.0: 34; CHECK-NEXT: vsetvli a0, zero, e8, mf8, ta, ma 35; CHECK-NEXT: vsadd.vi v8, v8, 5 36; CHECK-NEXT: ret 37 %v = call <vscale x 1 x i8> @llvm.sadd.sat.nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i8> splat (i8 5)) 38 ret <vscale x 1 x i8> %v 39} 40 41declare <vscale x 2 x i8> @llvm.sadd.sat.nxv2i8(<vscale x 2 x i8>, <vscale x 2 x i8>) 42 43define <vscale x 2 x i8> @sadd_nxv2i8_vv(<vscale x 2 x i8> %va, <vscale x 2 x i8> %b) { 44; CHECK-LABEL: sadd_nxv2i8_vv: 45; CHECK: # %bb.0: 46; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma 47; CHECK-NEXT: vsadd.vv v8, v8, v9 48; CHECK-NEXT: ret 49 %v = call <vscale x 2 x i8> @llvm.sadd.sat.nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i8> %b) 50 ret <vscale x 2 x i8> %v 51} 52 53define <vscale x 2 x i8> @sadd_nxv2i8_vx(<vscale x 2 x i8> %va, i8 %b) { 54; CHECK-LABEL: sadd_nxv2i8_vx: 55; CHECK: # %bb.0: 56; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, ma 57; CHECK-NEXT: vsadd.vx v8, v8, a0 58; CHECK-NEXT: ret 59 %elt.head = insertelement <vscale x 2 x i8> poison, i8 %b, i32 0 60 %vb = shufflevector <vscale x 2 x i8> %elt.head, <vscale x 2 x i8> poison, <vscale x 2 x i32> zeroinitializer 61 %v = call <vscale x 2 x i8> @llvm.sadd.sat.nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i8> %vb) 62 ret <vscale x 2 x i8> %v 63} 64 65define <vscale x 2 x i8> @sadd_nxv2i8_vi(<vscale x 2 x i8> %va) { 66; CHECK-LABEL: sadd_nxv2i8_vi: 67; CHECK: # %bb.0: 68; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma 69; CHECK-NEXT: vsadd.vi v8, v8, 5 70; CHECK-NEXT: ret 71 %v = call <vscale x 2 x i8> @llvm.sadd.sat.nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i8> splat (i8 5)) 72 ret <vscale x 2 x i8> %v 73} 74 75declare <vscale x 4 x i8> @llvm.sadd.sat.nxv4i8(<vscale x 4 x i8>, <vscale x 4 x i8>) 76 77define <vscale x 4 x i8> @sadd_nxv4i8_vv(<vscale x 4 x i8> %va, <vscale x 4 x i8> %b) { 78; CHECK-LABEL: sadd_nxv4i8_vv: 79; CHECK: # %bb.0: 80; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, ma 81; CHECK-NEXT: vsadd.vv v8, v8, v9 82; CHECK-NEXT: ret 83 %v = call <vscale x 4 x i8> @llvm.sadd.sat.nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i8> %b) 84 ret <vscale x 4 x i8> %v 85} 86 87define <vscale x 4 x i8> @sadd_nxv4i8_vx(<vscale x 4 x i8> %va, i8 %b) { 88; CHECK-LABEL: sadd_nxv4i8_vx: 89; CHECK: # %bb.0: 90; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma 91; CHECK-NEXT: vsadd.vx v8, v8, a0 92; CHECK-NEXT: ret 93 %elt.head = insertelement <vscale x 4 x i8> poison, i8 %b, i32 0 94 %vb = shufflevector <vscale x 4 x i8> %elt.head, <vscale x 4 x i8> poison, <vscale x 4 x i32> zeroinitializer 95 %v = call <vscale x 4 x i8> @llvm.sadd.sat.nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i8> %vb) 96 ret <vscale x 4 x i8> %v 97} 98 99define <vscale x 4 x i8> @sadd_nxv4i8_vi(<vscale x 4 x i8> %va) { 100; CHECK-LABEL: sadd_nxv4i8_vi: 101; CHECK: # %bb.0: 102; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, ma 103; CHECK-NEXT: vsadd.vi v8, v8, 5 104; CHECK-NEXT: ret 105 %v = call <vscale x 4 x i8> @llvm.sadd.sat.nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i8> splat (i8 5)) 106 ret <vscale x 4 x i8> %v 107} 108 109declare <vscale x 8 x i8> @llvm.sadd.sat.nxv8i8(<vscale x 8 x i8>, <vscale x 8 x i8>) 110 111define <vscale x 8 x i8> @sadd_nxv8i8_vv(<vscale x 8 x i8> %va, <vscale x 8 x i8> %b) { 112; CHECK-LABEL: sadd_nxv8i8_vv: 113; CHECK: # %bb.0: 114; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma 115; CHECK-NEXT: vsadd.vv v8, v8, v9 116; CHECK-NEXT: ret 117 %v = call <vscale x 8 x i8> @llvm.sadd.sat.nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i8> %b) 118 ret <vscale x 8 x i8> %v 119} 120 121define <vscale x 8 x i8> @sadd_nxv8i8_vx(<vscale x 8 x i8> %va, i8 %b) { 122; CHECK-LABEL: sadd_nxv8i8_vx: 123; CHECK: # %bb.0: 124; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma 125; CHECK-NEXT: vsadd.vx v8, v8, a0 126; CHECK-NEXT: ret 127 %elt.head = insertelement <vscale x 8 x i8> poison, i8 %b, i32 0 128 %vb = shufflevector <vscale x 8 x i8> %elt.head, <vscale x 8 x i8> poison, <vscale x 8 x i32> zeroinitializer 129 %v = call <vscale x 8 x i8> @llvm.sadd.sat.nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i8> %vb) 130 ret <vscale x 8 x i8> %v 131} 132 133define <vscale x 8 x i8> @sadd_nxv8i8_vi(<vscale x 8 x i8> %va) { 134; CHECK-LABEL: sadd_nxv8i8_vi: 135; CHECK: # %bb.0: 136; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma 137; CHECK-NEXT: vsadd.vi v8, v8, 5 138; CHECK-NEXT: ret 139 %v = call <vscale x 8 x i8> @llvm.sadd.sat.nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i8> splat (i8 5)) 140 ret <vscale x 8 x i8> %v 141} 142 143declare <vscale x 16 x i8> @llvm.sadd.sat.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>) 144 145define <vscale x 16 x i8> @sadd_nxv16i8_vv(<vscale x 16 x i8> %va, <vscale x 16 x i8> %b) { 146; CHECK-LABEL: sadd_nxv16i8_vv: 147; CHECK: # %bb.0: 148; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma 149; CHECK-NEXT: vsadd.vv v8, v8, v10 150; CHECK-NEXT: ret 151 %v = call <vscale x 16 x i8> @llvm.sadd.sat.nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i8> %b) 152 ret <vscale x 16 x i8> %v 153} 154 155define <vscale x 16 x i8> @sadd_nxv16i8_vx(<vscale x 16 x i8> %va, i8 %b) { 156; CHECK-LABEL: sadd_nxv16i8_vx: 157; CHECK: # %bb.0: 158; CHECK-NEXT: vsetvli a1, zero, e8, m2, ta, ma 159; CHECK-NEXT: vsadd.vx v8, v8, a0 160; CHECK-NEXT: ret 161 %elt.head = insertelement <vscale x 16 x i8> poison, i8 %b, i32 0 162 %vb = shufflevector <vscale x 16 x i8> %elt.head, <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer 163 %v = call <vscale x 16 x i8> @llvm.sadd.sat.nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i8> %vb) 164 ret <vscale x 16 x i8> %v 165} 166 167define <vscale x 16 x i8> @sadd_nxv16i8_vi(<vscale x 16 x i8> %va) { 168; CHECK-LABEL: sadd_nxv16i8_vi: 169; CHECK: # %bb.0: 170; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma 171; CHECK-NEXT: vsadd.vi v8, v8, 5 172; CHECK-NEXT: ret 173 %v = call <vscale x 16 x i8> @llvm.sadd.sat.nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i8> splat (i8 5)) 174 ret <vscale x 16 x i8> %v 175} 176 177declare <vscale x 32 x i8> @llvm.sadd.sat.nxv32i8(<vscale x 32 x i8>, <vscale x 32 x i8>) 178 179define <vscale x 32 x i8> @sadd_nxv32i8_vv(<vscale x 32 x i8> %va, <vscale x 32 x i8> %b) { 180; CHECK-LABEL: sadd_nxv32i8_vv: 181; CHECK: # %bb.0: 182; CHECK-NEXT: vsetvli a0, zero, e8, m4, ta, ma 183; CHECK-NEXT: vsadd.vv v8, v8, v12 184; CHECK-NEXT: ret 185 %v = call <vscale x 32 x i8> @llvm.sadd.sat.nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i8> %b) 186 ret <vscale x 32 x i8> %v 187} 188 189define <vscale x 32 x i8> @sadd_nxv32i8_vx(<vscale x 32 x i8> %va, i8 %b) { 190; CHECK-LABEL: sadd_nxv32i8_vx: 191; CHECK: # %bb.0: 192; CHECK-NEXT: vsetvli a1, zero, e8, m4, ta, ma 193; CHECK-NEXT: vsadd.vx v8, v8, a0 194; CHECK-NEXT: ret 195 %elt.head = insertelement <vscale x 32 x i8> poison, i8 %b, i32 0 196 %vb = shufflevector <vscale x 32 x i8> %elt.head, <vscale x 32 x i8> poison, <vscale x 32 x i32> zeroinitializer 197 %v = call <vscale x 32 x i8> @llvm.sadd.sat.nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i8> %vb) 198 ret <vscale x 32 x i8> %v 199} 200 201define <vscale x 32 x i8> @sadd_nxv32i8_vi(<vscale x 32 x i8> %va) { 202; CHECK-LABEL: sadd_nxv32i8_vi: 203; CHECK: # %bb.0: 204; CHECK-NEXT: vsetvli a0, zero, e8, m4, ta, ma 205; CHECK-NEXT: vsadd.vi v8, v8, 5 206; CHECK-NEXT: ret 207 %v = call <vscale x 32 x i8> @llvm.sadd.sat.nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i8> splat (i8 5)) 208 ret <vscale x 32 x i8> %v 209} 210 211declare <vscale x 64 x i8> @llvm.sadd.sat.nxv64i8(<vscale x 64 x i8>, <vscale x 64 x i8>) 212 213define <vscale x 64 x i8> @sadd_nxv64i8_vv(<vscale x 64 x i8> %va, <vscale x 64 x i8> %b) { 214; CHECK-LABEL: sadd_nxv64i8_vv: 215; CHECK: # %bb.0: 216; CHECK-NEXT: vsetvli a0, zero, e8, m8, ta, ma 217; CHECK-NEXT: vsadd.vv v8, v8, v16 218; CHECK-NEXT: ret 219 %v = call <vscale x 64 x i8> @llvm.sadd.sat.nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i8> %b) 220 ret <vscale x 64 x i8> %v 221} 222 223define <vscale x 64 x i8> @sadd_nxv64i8_vx(<vscale x 64 x i8> %va, i8 %b) { 224; CHECK-LABEL: sadd_nxv64i8_vx: 225; CHECK: # %bb.0: 226; CHECK-NEXT: vsetvli a1, zero, e8, m8, ta, ma 227; CHECK-NEXT: vsadd.vx v8, v8, a0 228; CHECK-NEXT: ret 229 %elt.head = insertelement <vscale x 64 x i8> poison, i8 %b, i32 0 230 %vb = shufflevector <vscale x 64 x i8> %elt.head, <vscale x 64 x i8> poison, <vscale x 64 x i32> zeroinitializer 231 %v = call <vscale x 64 x i8> @llvm.sadd.sat.nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i8> %vb) 232 ret <vscale x 64 x i8> %v 233} 234 235define <vscale x 64 x i8> @sadd_nxv64i8_vi(<vscale x 64 x i8> %va) { 236; CHECK-LABEL: sadd_nxv64i8_vi: 237; CHECK: # %bb.0: 238; CHECK-NEXT: vsetvli a0, zero, e8, m8, ta, ma 239; CHECK-NEXT: vsadd.vi v8, v8, 5 240; CHECK-NEXT: ret 241 %v = call <vscale x 64 x i8> @llvm.sadd.sat.nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i8> splat (i8 5)) 242 ret <vscale x 64 x i8> %v 243} 244 245declare <vscale x 1 x i16> @llvm.sadd.sat.nxv1i16(<vscale x 1 x i16>, <vscale x 1 x i16>) 246 247define <vscale x 1 x i16> @sadd_nxv1i16_vv(<vscale x 1 x i16> %va, <vscale x 1 x i16> %b) { 248; CHECK-LABEL: sadd_nxv1i16_vv: 249; CHECK: # %bb.0: 250; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 251; CHECK-NEXT: vsadd.vv v8, v8, v9 252; CHECK-NEXT: ret 253 %v = call <vscale x 1 x i16> @llvm.sadd.sat.nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i16> %b) 254 ret <vscale x 1 x i16> %v 255} 256 257define <vscale x 1 x i16> @sadd_nxv1i16_vx(<vscale x 1 x i16> %va, i16 %b) { 258; CHECK-LABEL: sadd_nxv1i16_vx: 259; CHECK: # %bb.0: 260; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma 261; CHECK-NEXT: vsadd.vx v8, v8, a0 262; CHECK-NEXT: ret 263 %elt.head = insertelement <vscale x 1 x i16> poison, i16 %b, i32 0 264 %vb = shufflevector <vscale x 1 x i16> %elt.head, <vscale x 1 x i16> poison, <vscale x 1 x i32> zeroinitializer 265 %v = call <vscale x 1 x i16> @llvm.sadd.sat.nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i16> %vb) 266 ret <vscale x 1 x i16> %v 267} 268 269define <vscale x 1 x i16> @sadd_nxv1i16_vi(<vscale x 1 x i16> %va) { 270; CHECK-LABEL: sadd_nxv1i16_vi: 271; CHECK: # %bb.0: 272; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 273; CHECK-NEXT: vsadd.vi v8, v8, 5 274; CHECK-NEXT: ret 275 %v = call <vscale x 1 x i16> @llvm.sadd.sat.nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i16> splat (i16 5)) 276 ret <vscale x 1 x i16> %v 277} 278 279declare <vscale x 2 x i16> @llvm.sadd.sat.nxv2i16(<vscale x 2 x i16>, <vscale x 2 x i16>) 280 281define <vscale x 2 x i16> @sadd_nxv2i16_vv(<vscale x 2 x i16> %va, <vscale x 2 x i16> %b) { 282; CHECK-LABEL: sadd_nxv2i16_vv: 283; CHECK: # %bb.0: 284; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 285; CHECK-NEXT: vsadd.vv v8, v8, v9 286; CHECK-NEXT: ret 287 %v = call <vscale x 2 x i16> @llvm.sadd.sat.nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i16> %b) 288 ret <vscale x 2 x i16> %v 289} 290 291define <vscale x 2 x i16> @sadd_nxv2i16_vx(<vscale x 2 x i16> %va, i16 %b) { 292; CHECK-LABEL: sadd_nxv2i16_vx: 293; CHECK: # %bb.0: 294; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma 295; CHECK-NEXT: vsadd.vx v8, v8, a0 296; CHECK-NEXT: ret 297 %elt.head = insertelement <vscale x 2 x i16> poison, i16 %b, i32 0 298 %vb = shufflevector <vscale x 2 x i16> %elt.head, <vscale x 2 x i16> poison, <vscale x 2 x i32> zeroinitializer 299 %v = call <vscale x 2 x i16> @llvm.sadd.sat.nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i16> %vb) 300 ret <vscale x 2 x i16> %v 301} 302 303define <vscale x 2 x i16> @sadd_nxv2i16_vi(<vscale x 2 x i16> %va) { 304; CHECK-LABEL: sadd_nxv2i16_vi: 305; CHECK: # %bb.0: 306; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 307; CHECK-NEXT: vsadd.vi v8, v8, 5 308; CHECK-NEXT: ret 309 %v = call <vscale x 2 x i16> @llvm.sadd.sat.nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i16> splat (i16 5)) 310 ret <vscale x 2 x i16> %v 311} 312 313declare <vscale x 4 x i16> @llvm.sadd.sat.nxv4i16(<vscale x 4 x i16>, <vscale x 4 x i16>) 314 315define <vscale x 4 x i16> @sadd_nxv4i16_vv(<vscale x 4 x i16> %va, <vscale x 4 x i16> %b) { 316; CHECK-LABEL: sadd_nxv4i16_vv: 317; CHECK: # %bb.0: 318; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma 319; CHECK-NEXT: vsadd.vv v8, v8, v9 320; CHECK-NEXT: ret 321 %v = call <vscale x 4 x i16> @llvm.sadd.sat.nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i16> %b) 322 ret <vscale x 4 x i16> %v 323} 324 325define <vscale x 4 x i16> @sadd_nxv4i16_vx(<vscale x 4 x i16> %va, i16 %b) { 326; CHECK-LABEL: sadd_nxv4i16_vx: 327; CHECK: # %bb.0: 328; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma 329; CHECK-NEXT: vsadd.vx v8, v8, a0 330; CHECK-NEXT: ret 331 %elt.head = insertelement <vscale x 4 x i16> poison, i16 %b, i32 0 332 %vb = shufflevector <vscale x 4 x i16> %elt.head, <vscale x 4 x i16> poison, <vscale x 4 x i32> zeroinitializer 333 %v = call <vscale x 4 x i16> @llvm.sadd.sat.nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i16> %vb) 334 ret <vscale x 4 x i16> %v 335} 336 337define <vscale x 4 x i16> @sadd_nxv4i16_vi(<vscale x 4 x i16> %va) { 338; CHECK-LABEL: sadd_nxv4i16_vi: 339; CHECK: # %bb.0: 340; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma 341; CHECK-NEXT: vsadd.vi v8, v8, 5 342; CHECK-NEXT: ret 343 %v = call <vscale x 4 x i16> @llvm.sadd.sat.nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i16> splat (i16 5)) 344 ret <vscale x 4 x i16> %v 345} 346 347declare <vscale x 8 x i16> @llvm.sadd.sat.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>) 348 349define <vscale x 8 x i16> @sadd_nxv8i16_vv(<vscale x 8 x i16> %va, <vscale x 8 x i16> %b) { 350; CHECK-LABEL: sadd_nxv8i16_vv: 351; CHECK: # %bb.0: 352; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma 353; CHECK-NEXT: vsadd.vv v8, v8, v10 354; CHECK-NEXT: ret 355 %v = call <vscale x 8 x i16> @llvm.sadd.sat.nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i16> %b) 356 ret <vscale x 8 x i16> %v 357} 358 359define <vscale x 8 x i16> @sadd_nxv8i16_vx(<vscale x 8 x i16> %va, i16 %b) { 360; CHECK-LABEL: sadd_nxv8i16_vx: 361; CHECK: # %bb.0: 362; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma 363; CHECK-NEXT: vsadd.vx v8, v8, a0 364; CHECK-NEXT: ret 365 %elt.head = insertelement <vscale x 8 x i16> poison, i16 %b, i32 0 366 %vb = shufflevector <vscale x 8 x i16> %elt.head, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer 367 %v = call <vscale x 8 x i16> @llvm.sadd.sat.nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i16> %vb) 368 ret <vscale x 8 x i16> %v 369} 370 371define <vscale x 8 x i16> @sadd_nxv8i16_vi(<vscale x 8 x i16> %va) { 372; CHECK-LABEL: sadd_nxv8i16_vi: 373; CHECK: # %bb.0: 374; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma 375; CHECK-NEXT: vsadd.vi v8, v8, 5 376; CHECK-NEXT: ret 377 %v = call <vscale x 8 x i16> @llvm.sadd.sat.nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i16> splat (i16 5)) 378 ret <vscale x 8 x i16> %v 379} 380 381declare <vscale x 16 x i16> @llvm.sadd.sat.nxv16i16(<vscale x 16 x i16>, <vscale x 16 x i16>) 382 383define <vscale x 16 x i16> @sadd_nxv16i16_vv(<vscale x 16 x i16> %va, <vscale x 16 x i16> %b) { 384; CHECK-LABEL: sadd_nxv16i16_vv: 385; CHECK: # %bb.0: 386; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, ma 387; CHECK-NEXT: vsadd.vv v8, v8, v12 388; CHECK-NEXT: ret 389 %v = call <vscale x 16 x i16> @llvm.sadd.sat.nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i16> %b) 390 ret <vscale x 16 x i16> %v 391} 392 393define <vscale x 16 x i16> @sadd_nxv16i16_vx(<vscale x 16 x i16> %va, i16 %b) { 394; CHECK-LABEL: sadd_nxv16i16_vx: 395; CHECK: # %bb.0: 396; CHECK-NEXT: vsetvli a1, zero, e16, m4, ta, ma 397; CHECK-NEXT: vsadd.vx v8, v8, a0 398; CHECK-NEXT: ret 399 %elt.head = insertelement <vscale x 16 x i16> poison, i16 %b, i32 0 400 %vb = shufflevector <vscale x 16 x i16> %elt.head, <vscale x 16 x i16> poison, <vscale x 16 x i32> zeroinitializer 401 %v = call <vscale x 16 x i16> @llvm.sadd.sat.nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i16> %vb) 402 ret <vscale x 16 x i16> %v 403} 404 405define <vscale x 16 x i16> @sadd_nxv16i16_vi(<vscale x 16 x i16> %va) { 406; CHECK-LABEL: sadd_nxv16i16_vi: 407; CHECK: # %bb.0: 408; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, ma 409; CHECK-NEXT: vsadd.vi v8, v8, 5 410; CHECK-NEXT: ret 411 %v = call <vscale x 16 x i16> @llvm.sadd.sat.nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i16> splat (i16 5)) 412 ret <vscale x 16 x i16> %v 413} 414 415declare <vscale x 32 x i16> @llvm.sadd.sat.nxv32i16(<vscale x 32 x i16>, <vscale x 32 x i16>) 416 417define <vscale x 32 x i16> @sadd_nxv32i16_vv(<vscale x 32 x i16> %va, <vscale x 32 x i16> %b) { 418; CHECK-LABEL: sadd_nxv32i16_vv: 419; CHECK: # %bb.0: 420; CHECK-NEXT: vsetvli a0, zero, e16, m8, ta, ma 421; CHECK-NEXT: vsadd.vv v8, v8, v16 422; CHECK-NEXT: ret 423 %v = call <vscale x 32 x i16> @llvm.sadd.sat.nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i16> %b) 424 ret <vscale x 32 x i16> %v 425} 426 427define <vscale x 32 x i16> @sadd_nxv32i16_vx(<vscale x 32 x i16> %va, i16 %b) { 428; CHECK-LABEL: sadd_nxv32i16_vx: 429; CHECK: # %bb.0: 430; CHECK-NEXT: vsetvli a1, zero, e16, m8, ta, ma 431; CHECK-NEXT: vsadd.vx v8, v8, a0 432; CHECK-NEXT: ret 433 %elt.head = insertelement <vscale x 32 x i16> poison, i16 %b, i32 0 434 %vb = shufflevector <vscale x 32 x i16> %elt.head, <vscale x 32 x i16> poison, <vscale x 32 x i32> zeroinitializer 435 %v = call <vscale x 32 x i16> @llvm.sadd.sat.nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i16> %vb) 436 ret <vscale x 32 x i16> %v 437} 438 439define <vscale x 32 x i16> @sadd_nxv32i16_vi(<vscale x 32 x i16> %va) { 440; CHECK-LABEL: sadd_nxv32i16_vi: 441; CHECK: # %bb.0: 442; CHECK-NEXT: vsetvli a0, zero, e16, m8, ta, ma 443; CHECK-NEXT: vsadd.vi v8, v8, 5 444; CHECK-NEXT: ret 445 %v = call <vscale x 32 x i16> @llvm.sadd.sat.nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i16> splat (i16 5)) 446 ret <vscale x 32 x i16> %v 447} 448 449declare <vscale x 1 x i32> @llvm.sadd.sat.nxv1i32(<vscale x 1 x i32>, <vscale x 1 x i32>) 450 451define <vscale x 1 x i32> @sadd_nxv1i32_vv(<vscale x 1 x i32> %va, <vscale x 1 x i32> %b) { 452; CHECK-LABEL: sadd_nxv1i32_vv: 453; CHECK: # %bb.0: 454; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma 455; CHECK-NEXT: vsadd.vv v8, v8, v9 456; CHECK-NEXT: ret 457 %v = call <vscale x 1 x i32> @llvm.sadd.sat.nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i32> %b) 458 ret <vscale x 1 x i32> %v 459} 460 461define <vscale x 1 x i32> @sadd_nxv1i32_vx(<vscale x 1 x i32> %va, i32 %b) { 462; CHECK-LABEL: sadd_nxv1i32_vx: 463; CHECK: # %bb.0: 464; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, ma 465; CHECK-NEXT: vsadd.vx v8, v8, a0 466; CHECK-NEXT: ret 467 %elt.head = insertelement <vscale x 1 x i32> poison, i32 %b, i32 0 468 %vb = shufflevector <vscale x 1 x i32> %elt.head, <vscale x 1 x i32> poison, <vscale x 1 x i32> zeroinitializer 469 %v = call <vscale x 1 x i32> @llvm.sadd.sat.nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i32> %vb) 470 ret <vscale x 1 x i32> %v 471} 472 473define <vscale x 1 x i32> @sadd_nxv1i32_vi(<vscale x 1 x i32> %va) { 474; CHECK-LABEL: sadd_nxv1i32_vi: 475; CHECK: # %bb.0: 476; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma 477; CHECK-NEXT: vsadd.vi v8, v8, 5 478; CHECK-NEXT: ret 479 %v = call <vscale x 1 x i32> @llvm.sadd.sat.nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i32> splat (i32 5)) 480 ret <vscale x 1 x i32> %v 481} 482 483declare <vscale x 2 x i32> @llvm.sadd.sat.nxv2i32(<vscale x 2 x i32>, <vscale x 2 x i32>) 484 485define <vscale x 2 x i32> @sadd_nxv2i32_vv(<vscale x 2 x i32> %va, <vscale x 2 x i32> %b) { 486; CHECK-LABEL: sadd_nxv2i32_vv: 487; CHECK: # %bb.0: 488; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma 489; CHECK-NEXT: vsadd.vv v8, v8, v9 490; CHECK-NEXT: ret 491 %v = call <vscale x 2 x i32> @llvm.sadd.sat.nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i32> %b) 492 ret <vscale x 2 x i32> %v 493} 494 495define <vscale x 2 x i32> @sadd_nxv2i32_vx(<vscale x 2 x i32> %va, i32 %b) { 496; CHECK-LABEL: sadd_nxv2i32_vx: 497; CHECK: # %bb.0: 498; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma 499; CHECK-NEXT: vsadd.vx v8, v8, a0 500; CHECK-NEXT: ret 501 %elt.head = insertelement <vscale x 2 x i32> poison, i32 %b, i32 0 502 %vb = shufflevector <vscale x 2 x i32> %elt.head, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer 503 %v = call <vscale x 2 x i32> @llvm.sadd.sat.nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i32> %vb) 504 ret <vscale x 2 x i32> %v 505} 506 507define <vscale x 2 x i32> @sadd_nxv2i32_vi(<vscale x 2 x i32> %va) { 508; CHECK-LABEL: sadd_nxv2i32_vi: 509; CHECK: # %bb.0: 510; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma 511; CHECK-NEXT: vsadd.vi v8, v8, 5 512; CHECK-NEXT: ret 513 %v = call <vscale x 2 x i32> @llvm.sadd.sat.nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i32> splat (i32 5)) 514 ret <vscale x 2 x i32> %v 515} 516 517declare <vscale x 4 x i32> @llvm.sadd.sat.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>) 518 519define <vscale x 4 x i32> @sadd_nxv4i32_vv(<vscale x 4 x i32> %va, <vscale x 4 x i32> %b) { 520; CHECK-LABEL: sadd_nxv4i32_vv: 521; CHECK: # %bb.0: 522; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma 523; CHECK-NEXT: vsadd.vv v8, v8, v10 524; CHECK-NEXT: ret 525 %v = call <vscale x 4 x i32> @llvm.sadd.sat.nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i32> %b) 526 ret <vscale x 4 x i32> %v 527} 528 529define <vscale x 4 x i32> @sadd_nxv4i32_vx(<vscale x 4 x i32> %va, i32 %b) { 530; CHECK-LABEL: sadd_nxv4i32_vx: 531; CHECK: # %bb.0: 532; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, ma 533; CHECK-NEXT: vsadd.vx v8, v8, a0 534; CHECK-NEXT: ret 535 %elt.head = insertelement <vscale x 4 x i32> poison, i32 %b, i32 0 536 %vb = shufflevector <vscale x 4 x i32> %elt.head, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer 537 %v = call <vscale x 4 x i32> @llvm.sadd.sat.nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i32> %vb) 538 ret <vscale x 4 x i32> %v 539} 540 541define <vscale x 4 x i32> @sadd_nxv4i32_vi(<vscale x 4 x i32> %va) { 542; CHECK-LABEL: sadd_nxv4i32_vi: 543; CHECK: # %bb.0: 544; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma 545; CHECK-NEXT: vsadd.vi v8, v8, 5 546; CHECK-NEXT: ret 547 %v = call <vscale x 4 x i32> @llvm.sadd.sat.nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i32> splat (i32 5)) 548 ret <vscale x 4 x i32> %v 549} 550 551declare <vscale x 8 x i32> @llvm.sadd.sat.nxv8i32(<vscale x 8 x i32>, <vscale x 8 x i32>) 552 553define <vscale x 8 x i32> @sadd_nxv8i32_vv(<vscale x 8 x i32> %va, <vscale x 8 x i32> %b) { 554; CHECK-LABEL: sadd_nxv8i32_vv: 555; CHECK: # %bb.0: 556; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma 557; CHECK-NEXT: vsadd.vv v8, v8, v12 558; CHECK-NEXT: ret 559 %v = call <vscale x 8 x i32> @llvm.sadd.sat.nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i32> %b) 560 ret <vscale x 8 x i32> %v 561} 562 563define <vscale x 8 x i32> @sadd_nxv8i32_vx(<vscale x 8 x i32> %va, i32 %b) { 564; CHECK-LABEL: sadd_nxv8i32_vx: 565; CHECK: # %bb.0: 566; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma 567; CHECK-NEXT: vsadd.vx v8, v8, a0 568; CHECK-NEXT: ret 569 %elt.head = insertelement <vscale x 8 x i32> poison, i32 %b, i32 0 570 %vb = shufflevector <vscale x 8 x i32> %elt.head, <vscale x 8 x i32> poison, <vscale x 8 x i32> zeroinitializer 571 %v = call <vscale x 8 x i32> @llvm.sadd.sat.nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i32> %vb) 572 ret <vscale x 8 x i32> %v 573} 574 575define <vscale x 8 x i32> @sadd_nxv8i32_vi(<vscale x 8 x i32> %va) { 576; CHECK-LABEL: sadd_nxv8i32_vi: 577; CHECK: # %bb.0: 578; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma 579; CHECK-NEXT: vsadd.vi v8, v8, 5 580; CHECK-NEXT: ret 581 %v = call <vscale x 8 x i32> @llvm.sadd.sat.nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i32> splat (i32 5)) 582 ret <vscale x 8 x i32> %v 583} 584 585declare <vscale x 16 x i32> @llvm.sadd.sat.nxv16i32(<vscale x 16 x i32>, <vscale x 16 x i32>) 586 587define <vscale x 16 x i32> @sadd_nxv16i32_vv(<vscale x 16 x i32> %va, <vscale x 16 x i32> %b) { 588; CHECK-LABEL: sadd_nxv16i32_vv: 589; CHECK: # %bb.0: 590; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma 591; CHECK-NEXT: vsadd.vv v8, v8, v16 592; CHECK-NEXT: ret 593 %v = call <vscale x 16 x i32> @llvm.sadd.sat.nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i32> %b) 594 ret <vscale x 16 x i32> %v 595} 596 597define <vscale x 16 x i32> @sadd_nxv16i32_vx(<vscale x 16 x i32> %va, i32 %b) { 598; CHECK-LABEL: sadd_nxv16i32_vx: 599; CHECK: # %bb.0: 600; CHECK-NEXT: vsetvli a1, zero, e32, m8, ta, ma 601; CHECK-NEXT: vsadd.vx v8, v8, a0 602; CHECK-NEXT: ret 603 %elt.head = insertelement <vscale x 16 x i32> poison, i32 %b, i32 0 604 %vb = shufflevector <vscale x 16 x i32> %elt.head, <vscale x 16 x i32> poison, <vscale x 16 x i32> zeroinitializer 605 %v = call <vscale x 16 x i32> @llvm.sadd.sat.nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i32> %vb) 606 ret <vscale x 16 x i32> %v 607} 608 609define <vscale x 16 x i32> @sadd_nxv16i32_vi(<vscale x 16 x i32> %va) { 610; CHECK-LABEL: sadd_nxv16i32_vi: 611; CHECK: # %bb.0: 612; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma 613; CHECK-NEXT: vsadd.vi v8, v8, 5 614; CHECK-NEXT: ret 615 %v = call <vscale x 16 x i32> @llvm.sadd.sat.nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i32> splat (i32 5)) 616 ret <vscale x 16 x i32> %v 617} 618 619declare <vscale x 1 x i64> @llvm.sadd.sat.nxv1i64(<vscale x 1 x i64>, <vscale x 1 x i64>) 620 621define <vscale x 1 x i64> @sadd_nxv1i64_vv(<vscale x 1 x i64> %va, <vscale x 1 x i64> %b) { 622; CHECK-LABEL: sadd_nxv1i64_vv: 623; CHECK: # %bb.0: 624; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma 625; CHECK-NEXT: vsadd.vv v8, v8, v9 626; CHECK-NEXT: ret 627 %v = call <vscale x 1 x i64> @llvm.sadd.sat.nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i64> %b) 628 ret <vscale x 1 x i64> %v 629} 630 631define <vscale x 1 x i64> @sadd_nxv1i64_vx(<vscale x 1 x i64> %va, i64 %b) { 632; RV32-LABEL: sadd_nxv1i64_vx: 633; RV32: # %bb.0: 634; RV32-NEXT: addi sp, sp, -16 635; RV32-NEXT: .cfi_def_cfa_offset 16 636; RV32-NEXT: sw a0, 8(sp) 637; RV32-NEXT: sw a1, 12(sp) 638; RV32-NEXT: addi a0, sp, 8 639; RV32-NEXT: vsetvli a1, zero, e64, m1, ta, ma 640; RV32-NEXT: vlse64.v v9, (a0), zero 641; RV32-NEXT: vsadd.vv v8, v8, v9 642; RV32-NEXT: addi sp, sp, 16 643; RV32-NEXT: .cfi_def_cfa_offset 0 644; RV32-NEXT: ret 645; 646; RV64-LABEL: sadd_nxv1i64_vx: 647; RV64: # %bb.0: 648; RV64-NEXT: vsetvli a1, zero, e64, m1, ta, ma 649; RV64-NEXT: vsadd.vx v8, v8, a0 650; RV64-NEXT: ret 651 %elt.head = insertelement <vscale x 1 x i64> poison, i64 %b, i32 0 652 %vb = shufflevector <vscale x 1 x i64> %elt.head, <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer 653 %v = call <vscale x 1 x i64> @llvm.sadd.sat.nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i64> %vb) 654 ret <vscale x 1 x i64> %v 655} 656 657define <vscale x 1 x i64> @sadd_nxv1i64_vi(<vscale x 1 x i64> %va) { 658; CHECK-LABEL: sadd_nxv1i64_vi: 659; CHECK: # %bb.0: 660; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma 661; CHECK-NEXT: vsadd.vi v8, v8, 5 662; CHECK-NEXT: ret 663 %v = call <vscale x 1 x i64> @llvm.sadd.sat.nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i64> splat (i64 5)) 664 ret <vscale x 1 x i64> %v 665} 666 667declare <vscale x 2 x i64> @llvm.sadd.sat.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>) 668 669define <vscale x 2 x i64> @sadd_nxv2i64_vv(<vscale x 2 x i64> %va, <vscale x 2 x i64> %b) { 670; CHECK-LABEL: sadd_nxv2i64_vv: 671; CHECK: # %bb.0: 672; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma 673; CHECK-NEXT: vsadd.vv v8, v8, v10 674; CHECK-NEXT: ret 675 %v = call <vscale x 2 x i64> @llvm.sadd.sat.nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i64> %b) 676 ret <vscale x 2 x i64> %v 677} 678 679define <vscale x 2 x i64> @sadd_nxv2i64_vx(<vscale x 2 x i64> %va, i64 %b) { 680; RV32-LABEL: sadd_nxv2i64_vx: 681; RV32: # %bb.0: 682; RV32-NEXT: addi sp, sp, -16 683; RV32-NEXT: .cfi_def_cfa_offset 16 684; RV32-NEXT: sw a0, 8(sp) 685; RV32-NEXT: sw a1, 12(sp) 686; RV32-NEXT: addi a0, sp, 8 687; RV32-NEXT: vsetvli a1, zero, e64, m2, ta, ma 688; RV32-NEXT: vlse64.v v10, (a0), zero 689; RV32-NEXT: vsadd.vv v8, v8, v10 690; RV32-NEXT: addi sp, sp, 16 691; RV32-NEXT: .cfi_def_cfa_offset 0 692; RV32-NEXT: ret 693; 694; RV64-LABEL: sadd_nxv2i64_vx: 695; RV64: # %bb.0: 696; RV64-NEXT: vsetvli a1, zero, e64, m2, ta, ma 697; RV64-NEXT: vsadd.vx v8, v8, a0 698; RV64-NEXT: ret 699 %elt.head = insertelement <vscale x 2 x i64> poison, i64 %b, i32 0 700 %vb = shufflevector <vscale x 2 x i64> %elt.head, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer 701 %v = call <vscale x 2 x i64> @llvm.sadd.sat.nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i64> %vb) 702 ret <vscale x 2 x i64> %v 703} 704 705define <vscale x 2 x i64> @sadd_nxv2i64_vi(<vscale x 2 x i64> %va) { 706; CHECK-LABEL: sadd_nxv2i64_vi: 707; CHECK: # %bb.0: 708; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma 709; CHECK-NEXT: vsadd.vi v8, v8, 5 710; CHECK-NEXT: ret 711 %v = call <vscale x 2 x i64> @llvm.sadd.sat.nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i64> splat (i64 5)) 712 ret <vscale x 2 x i64> %v 713} 714 715declare <vscale x 4 x i64> @llvm.sadd.sat.nxv4i64(<vscale x 4 x i64>, <vscale x 4 x i64>) 716 717define <vscale x 4 x i64> @sadd_nxv4i64_vv(<vscale x 4 x i64> %va, <vscale x 4 x i64> %b) { 718; CHECK-LABEL: sadd_nxv4i64_vv: 719; CHECK: # %bb.0: 720; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma 721; CHECK-NEXT: vsadd.vv v8, v8, v12 722; CHECK-NEXT: ret 723 %v = call <vscale x 4 x i64> @llvm.sadd.sat.nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i64> %b) 724 ret <vscale x 4 x i64> %v 725} 726 727define <vscale x 4 x i64> @sadd_nxv4i64_vx(<vscale x 4 x i64> %va, i64 %b) { 728; RV32-LABEL: sadd_nxv4i64_vx: 729; RV32: # %bb.0: 730; RV32-NEXT: addi sp, sp, -16 731; RV32-NEXT: .cfi_def_cfa_offset 16 732; RV32-NEXT: sw a0, 8(sp) 733; RV32-NEXT: sw a1, 12(sp) 734; RV32-NEXT: addi a0, sp, 8 735; RV32-NEXT: vsetvli a1, zero, e64, m4, ta, ma 736; RV32-NEXT: vlse64.v v12, (a0), zero 737; RV32-NEXT: vsadd.vv v8, v8, v12 738; RV32-NEXT: addi sp, sp, 16 739; RV32-NEXT: .cfi_def_cfa_offset 0 740; RV32-NEXT: ret 741; 742; RV64-LABEL: sadd_nxv4i64_vx: 743; RV64: # %bb.0: 744; RV64-NEXT: vsetvli a1, zero, e64, m4, ta, ma 745; RV64-NEXT: vsadd.vx v8, v8, a0 746; RV64-NEXT: ret 747 %elt.head = insertelement <vscale x 4 x i64> poison, i64 %b, i32 0 748 %vb = shufflevector <vscale x 4 x i64> %elt.head, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer 749 %v = call <vscale x 4 x i64> @llvm.sadd.sat.nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i64> %vb) 750 ret <vscale x 4 x i64> %v 751} 752 753define <vscale x 4 x i64> @sadd_nxv4i64_vi(<vscale x 4 x i64> %va) { 754; CHECK-LABEL: sadd_nxv4i64_vi: 755; CHECK: # %bb.0: 756; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma 757; CHECK-NEXT: vsadd.vi v8, v8, 5 758; CHECK-NEXT: ret 759 %v = call <vscale x 4 x i64> @llvm.sadd.sat.nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i64> splat (i64 5)) 760 ret <vscale x 4 x i64> %v 761} 762 763declare <vscale x 8 x i64> @llvm.sadd.sat.nxv8i64(<vscale x 8 x i64>, <vscale x 8 x i64>) 764 765define <vscale x 8 x i64> @sadd_nxv8i64_vv(<vscale x 8 x i64> %va, <vscale x 8 x i64> %b) { 766; CHECK-LABEL: sadd_nxv8i64_vv: 767; CHECK: # %bb.0: 768; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma 769; CHECK-NEXT: vsadd.vv v8, v8, v16 770; CHECK-NEXT: ret 771 %v = call <vscale x 8 x i64> @llvm.sadd.sat.nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i64> %b) 772 ret <vscale x 8 x i64> %v 773} 774 775define <vscale x 8 x i64> @sadd_nxv8i64_vx(<vscale x 8 x i64> %va, i64 %b) { 776; RV32-LABEL: sadd_nxv8i64_vx: 777; RV32: # %bb.0: 778; RV32-NEXT: addi sp, sp, -16 779; RV32-NEXT: .cfi_def_cfa_offset 16 780; RV32-NEXT: sw a0, 8(sp) 781; RV32-NEXT: sw a1, 12(sp) 782; RV32-NEXT: addi a0, sp, 8 783; RV32-NEXT: vsetvli a1, zero, e64, m8, ta, ma 784; RV32-NEXT: vlse64.v v16, (a0), zero 785; RV32-NEXT: vsadd.vv v8, v8, v16 786; RV32-NEXT: addi sp, sp, 16 787; RV32-NEXT: .cfi_def_cfa_offset 0 788; RV32-NEXT: ret 789; 790; RV64-LABEL: sadd_nxv8i64_vx: 791; RV64: # %bb.0: 792; RV64-NEXT: vsetvli a1, zero, e64, m8, ta, ma 793; RV64-NEXT: vsadd.vx v8, v8, a0 794; RV64-NEXT: ret 795 %elt.head = insertelement <vscale x 8 x i64> poison, i64 %b, i32 0 796 %vb = shufflevector <vscale x 8 x i64> %elt.head, <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer 797 %v = call <vscale x 8 x i64> @llvm.sadd.sat.nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i64> %vb) 798 ret <vscale x 8 x i64> %v 799} 800 801define <vscale x 8 x i64> @sadd_nxv8i64_vi(<vscale x 8 x i64> %va) { 802; CHECK-LABEL: sadd_nxv8i64_vi: 803; CHECK: # %bb.0: 804; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma 805; CHECK-NEXT: vsadd.vi v8, v8, 5 806; CHECK-NEXT: ret 807 %v = call <vscale x 8 x i64> @llvm.sadd.sat.nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i64> splat (i64 5)) 808 ret <vscale x 8 x i64> %v 809} 810