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