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 8 x i7> @llvm.vp.sadd.sat.nxv8i7(<vscale x 8 x i7>, <vscale x 8 x i7>, <vscale x 8 x i1>, i32) 8 9define <vscale x 8 x i7> @vsadd_vx_nxv8i7(<vscale x 8 x i7> %a, i7 signext %b, <vscale x 8 x i1> %mask, i32 zeroext %evl) { 10; CHECK-LABEL: vsadd_vx_nxv8i7: 11; CHECK: # %bb.0: 12; CHECK-NEXT: vsetvli zero, a1, e8, m1, ta, ma 13; CHECK-NEXT: vadd.vv v8, v8, v8 14; CHECK-NEXT: vsra.vi v8, v8, 1 15; CHECK-NEXT: vadd.vx v8, v8, a0, v0.t 16; CHECK-NEXT: li a0, 63 17; CHECK-NEXT: vmin.vx v8, v8, a0, v0.t 18; CHECK-NEXT: li a0, 192 19; CHECK-NEXT: vmax.vx v8, v8, a0, v0.t 20; CHECK-NEXT: ret 21 %elt.head = insertelement <vscale x 8 x i7> poison, i7 %b, i32 0 22 %vb = shufflevector <vscale x 8 x i7> %elt.head, <vscale x 8 x i7> poison, <vscale x 8 x i32> zeroinitializer 23 %v = call <vscale x 8 x i7> @llvm.vp.sadd.sat.nxv8i7(<vscale x 8 x i7> %a, <vscale x 8 x i7> %vb, <vscale x 8 x i1> %mask, i32 %evl) 24 ret <vscale x 8 x i7> %v 25} 26 27declare <vscale x 1 x i8> @llvm.vp.sadd.sat.nxv1i8(<vscale x 1 x i8>, <vscale x 1 x i8>, <vscale x 1 x i1>, i32) 28 29define <vscale x 1 x i8> @vsadd_vv_nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i8> %b, <vscale x 1 x i1> %m, i32 zeroext %evl) { 30; CHECK-LABEL: vsadd_vv_nxv1i8: 31; CHECK: # %bb.0: 32; CHECK-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 33; CHECK-NEXT: vsadd.vv v8, v8, v9, v0.t 34; CHECK-NEXT: ret 35 %v = call <vscale x 1 x i8> @llvm.vp.sadd.sat.nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i8> %b, <vscale x 1 x i1> %m, i32 %evl) 36 ret <vscale x 1 x i8> %v 37} 38 39define <vscale x 1 x i8> @vsadd_vv_nxv1i8_unmasked(<vscale x 1 x i8> %va, <vscale x 1 x i8> %b, i32 zeroext %evl) { 40; CHECK-LABEL: vsadd_vv_nxv1i8_unmasked: 41; CHECK: # %bb.0: 42; CHECK-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 43; CHECK-NEXT: vsadd.vv v8, v8, v9 44; CHECK-NEXT: ret 45 %v = call <vscale x 1 x i8> @llvm.vp.sadd.sat.nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i8> %b, <vscale x 1 x i1> splat (i1 true), i32 %evl) 46 ret <vscale x 1 x i8> %v 47} 48 49define <vscale x 1 x i8> @vsadd_vx_nxv1i8(<vscale x 1 x i8> %va, i8 %b, <vscale x 1 x i1> %m, i32 zeroext %evl) { 50; CHECK-LABEL: vsadd_vx_nxv1i8: 51; CHECK: # %bb.0: 52; CHECK-NEXT: vsetvli zero, a1, e8, mf8, ta, ma 53; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t 54; CHECK-NEXT: ret 55 %elt.head = insertelement <vscale x 1 x i8> poison, i8 %b, i32 0 56 %vb = shufflevector <vscale x 1 x i8> %elt.head, <vscale x 1 x i8> poison, <vscale x 1 x i32> zeroinitializer 57 %v = call <vscale x 1 x i8> @llvm.vp.sadd.sat.nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i8> %vb, <vscale x 1 x i1> %m, i32 %evl) 58 ret <vscale x 1 x i8> %v 59} 60 61define <vscale x 1 x i8> @vsadd_vx_nxv1i8_commute(<vscale x 1 x i8> %va, i8 %b, <vscale x 1 x i1> %m, i32 zeroext %evl) { 62; CHECK-LABEL: vsadd_vx_nxv1i8_commute: 63; CHECK: # %bb.0: 64; CHECK-NEXT: vsetvli zero, a1, e8, mf8, ta, ma 65; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t 66; CHECK-NEXT: ret 67 %elt.head = insertelement <vscale x 1 x i8> poison, i8 %b, i32 0 68 %vb = shufflevector <vscale x 1 x i8> %elt.head, <vscale x 1 x i8> poison, <vscale x 1 x i32> zeroinitializer 69 %v = call <vscale x 1 x i8> @llvm.vp.sadd.sat.nxv1i8(<vscale x 1 x i8> %vb, <vscale x 1 x i8> %va, <vscale x 1 x i1> %m, i32 %evl) 70 ret <vscale x 1 x i8> %v 71} 72 73define <vscale x 1 x i8> @vsadd_vx_nxv1i8_unmasked(<vscale x 1 x i8> %va, i8 %b, i32 zeroext %evl) { 74; CHECK-LABEL: vsadd_vx_nxv1i8_unmasked: 75; CHECK: # %bb.0: 76; CHECK-NEXT: vsetvli zero, a1, e8, mf8, ta, ma 77; CHECK-NEXT: vsadd.vx v8, v8, a0 78; CHECK-NEXT: ret 79 %elt.head = insertelement <vscale x 1 x i8> poison, i8 %b, i32 0 80 %vb = shufflevector <vscale x 1 x i8> %elt.head, <vscale x 1 x i8> poison, <vscale x 1 x i32> zeroinitializer 81 %v = call <vscale x 1 x i8> @llvm.vp.sadd.sat.nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i8> %vb, <vscale x 1 x i1> splat (i1 true), i32 %evl) 82 ret <vscale x 1 x i8> %v 83} 84 85define <vscale x 1 x i8> @vsadd_vi_nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i1> %m, i32 zeroext %evl) { 86; CHECK-LABEL: vsadd_vi_nxv1i8: 87; CHECK: # %bb.0: 88; CHECK-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 89; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t 90; CHECK-NEXT: ret 91 %v = call <vscale x 1 x i8> @llvm.vp.sadd.sat.nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i8> splat (i8 -1), <vscale x 1 x i1> %m, i32 %evl) 92 ret <vscale x 1 x i8> %v 93} 94 95define <vscale x 1 x i8> @vsadd_vi_nxv1i8_unmasked(<vscale x 1 x i8> %va, i32 zeroext %evl) { 96; CHECK-LABEL: vsadd_vi_nxv1i8_unmasked: 97; CHECK: # %bb.0: 98; CHECK-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 99; CHECK-NEXT: vsadd.vi v8, v8, -1 100; CHECK-NEXT: ret 101 %v = call <vscale x 1 x i8> @llvm.vp.sadd.sat.nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i8> splat (i8 -1), <vscale x 1 x i1> splat (i1 true), i32 %evl) 102 ret <vscale x 1 x i8> %v 103} 104 105declare <vscale x 2 x i8> @llvm.vp.sadd.sat.nxv2i8(<vscale x 2 x i8>, <vscale x 2 x i8>, <vscale x 2 x i1>, i32) 106 107define <vscale x 2 x i8> @vsadd_vv_nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i8> %b, <vscale x 2 x i1> %m, i32 zeroext %evl) { 108; CHECK-LABEL: vsadd_vv_nxv2i8: 109; CHECK: # %bb.0: 110; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma 111; CHECK-NEXT: vsadd.vv v8, v8, v9, v0.t 112; CHECK-NEXT: ret 113 %v = call <vscale x 2 x i8> @llvm.vp.sadd.sat.nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i8> %b, <vscale x 2 x i1> %m, i32 %evl) 114 ret <vscale x 2 x i8> %v 115} 116 117define <vscale x 2 x i8> @vsadd_vv_nxv2i8_unmasked(<vscale x 2 x i8> %va, <vscale x 2 x i8> %b, i32 zeroext %evl) { 118; CHECK-LABEL: vsadd_vv_nxv2i8_unmasked: 119; CHECK: # %bb.0: 120; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma 121; CHECK-NEXT: vsadd.vv v8, v8, v9 122; CHECK-NEXT: ret 123 %v = call <vscale x 2 x i8> @llvm.vp.sadd.sat.nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i8> %b, <vscale x 2 x i1> splat (i1 true), i32 %evl) 124 ret <vscale x 2 x i8> %v 125} 126 127define <vscale x 2 x i8> @vsadd_vx_nxv2i8(<vscale x 2 x i8> %va, i8 %b, <vscale x 2 x i1> %m, i32 zeroext %evl) { 128; CHECK-LABEL: vsadd_vx_nxv2i8: 129; CHECK: # %bb.0: 130; CHECK-NEXT: vsetvli zero, a1, e8, mf4, ta, ma 131; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t 132; CHECK-NEXT: ret 133 %elt.head = insertelement <vscale x 2 x i8> poison, i8 %b, i32 0 134 %vb = shufflevector <vscale x 2 x i8> %elt.head, <vscale x 2 x i8> poison, <vscale x 2 x i32> zeroinitializer 135 %v = call <vscale x 2 x i8> @llvm.vp.sadd.sat.nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i8> %vb, <vscale x 2 x i1> %m, i32 %evl) 136 ret <vscale x 2 x i8> %v 137} 138 139define <vscale x 2 x i8> @vsadd_vx_nxv2i8_unmasked(<vscale x 2 x i8> %va, i8 %b, i32 zeroext %evl) { 140; CHECK-LABEL: vsadd_vx_nxv2i8_unmasked: 141; CHECK: # %bb.0: 142; CHECK-NEXT: vsetvli zero, a1, e8, mf4, ta, ma 143; CHECK-NEXT: vsadd.vx v8, v8, a0 144; CHECK-NEXT: ret 145 %elt.head = insertelement <vscale x 2 x i8> poison, i8 %b, i32 0 146 %vb = shufflevector <vscale x 2 x i8> %elt.head, <vscale x 2 x i8> poison, <vscale x 2 x i32> zeroinitializer 147 %v = call <vscale x 2 x i8> @llvm.vp.sadd.sat.nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i8> %vb, <vscale x 2 x i1> splat (i1 true), i32 %evl) 148 ret <vscale x 2 x i8> %v 149} 150 151define <vscale x 2 x i8> @vsadd_vi_nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i1> %m, i32 zeroext %evl) { 152; CHECK-LABEL: vsadd_vi_nxv2i8: 153; CHECK: # %bb.0: 154; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma 155; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t 156; CHECK-NEXT: ret 157 %v = call <vscale x 2 x i8> @llvm.vp.sadd.sat.nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i8> splat (i8 -1), <vscale x 2 x i1> %m, i32 %evl) 158 ret <vscale x 2 x i8> %v 159} 160 161define <vscale x 2 x i8> @vsadd_vi_nxv2i8_unmasked(<vscale x 2 x i8> %va, i32 zeroext %evl) { 162; CHECK-LABEL: vsadd_vi_nxv2i8_unmasked: 163; CHECK: # %bb.0: 164; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma 165; CHECK-NEXT: vsadd.vi v8, v8, -1 166; CHECK-NEXT: ret 167 %v = call <vscale x 2 x i8> @llvm.vp.sadd.sat.nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i8> splat (i8 -1), <vscale x 2 x i1> splat (i1 true), i32 %evl) 168 ret <vscale x 2 x i8> %v 169} 170 171declare <vscale x 3 x i8> @llvm.vp.sadd.sat.nxv3i8(<vscale x 3 x i8>, <vscale x 3 x i8>, <vscale x 3 x i1>, i32) 172 173define <vscale x 3 x i8> @vsadd_vv_nxv3i8(<vscale x 3 x i8> %va, <vscale x 3 x i8> %b, <vscale x 3 x i1> %m, i32 zeroext %evl) { 174; CHECK-LABEL: vsadd_vv_nxv3i8: 175; CHECK: # %bb.0: 176; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 177; CHECK-NEXT: vsadd.vv v8, v8, v9, v0.t 178; CHECK-NEXT: ret 179 %v = call <vscale x 3 x i8> @llvm.vp.sadd.sat.nxv3i8(<vscale x 3 x i8> %va, <vscale x 3 x i8> %b, <vscale x 3 x i1> %m, i32 %evl) 180 ret <vscale x 3 x i8> %v 181} 182 183define <vscale x 3 x i8> @vsadd_vv_nxv3i8_unmasked(<vscale x 3 x i8> %va, <vscale x 3 x i8> %b, i32 zeroext %evl) { 184; CHECK-LABEL: vsadd_vv_nxv3i8_unmasked: 185; CHECK: # %bb.0: 186; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 187; CHECK-NEXT: vsadd.vv v8, v8, v9 188; CHECK-NEXT: ret 189 %v = call <vscale x 3 x i8> @llvm.vp.sadd.sat.nxv3i8(<vscale x 3 x i8> %va, <vscale x 3 x i8> %b, <vscale x 3 x i1> splat (i1 true), i32 %evl) 190 ret <vscale x 3 x i8> %v 191} 192 193define <vscale x 3 x i8> @vsadd_vx_nxv3i8(<vscale x 3 x i8> %va, i8 %b, <vscale x 3 x i1> %m, i32 zeroext %evl) { 194; CHECK-LABEL: vsadd_vx_nxv3i8: 195; CHECK: # %bb.0: 196; CHECK-NEXT: vsetvli zero, a1, e8, mf2, ta, ma 197; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t 198; CHECK-NEXT: ret 199 %elt.head = insertelement <vscale x 3 x i8> poison, i8 %b, i32 0 200 %vb = shufflevector <vscale x 3 x i8> %elt.head, <vscale x 3 x i8> poison, <vscale x 3 x i32> zeroinitializer 201 %v = call <vscale x 3 x i8> @llvm.vp.sadd.sat.nxv3i8(<vscale x 3 x i8> %va, <vscale x 3 x i8> %vb, <vscale x 3 x i1> %m, i32 %evl) 202 ret <vscale x 3 x i8> %v 203} 204 205define <vscale x 3 x i8> @vsadd_vx_nxv3i8_unmasked(<vscale x 3 x i8> %va, i8 %b, i32 zeroext %evl) { 206; CHECK-LABEL: vsadd_vx_nxv3i8_unmasked: 207; CHECK: # %bb.0: 208; CHECK-NEXT: vsetvli zero, a1, e8, mf2, ta, ma 209; CHECK-NEXT: vsadd.vx v8, v8, a0 210; CHECK-NEXT: ret 211 %elt.head = insertelement <vscale x 3 x i8> poison, i8 %b, i32 0 212 %vb = shufflevector <vscale x 3 x i8> %elt.head, <vscale x 3 x i8> poison, <vscale x 3 x i32> zeroinitializer 213 %v = call <vscale x 3 x i8> @llvm.vp.sadd.sat.nxv3i8(<vscale x 3 x i8> %va, <vscale x 3 x i8> %vb, <vscale x 3 x i1> splat (i1 true), i32 %evl) 214 ret <vscale x 3 x i8> %v 215} 216 217define <vscale x 3 x i8> @vsadd_vi_nxv3i8(<vscale x 3 x i8> %va, <vscale x 3 x i1> %m, i32 zeroext %evl) { 218; CHECK-LABEL: vsadd_vi_nxv3i8: 219; CHECK: # %bb.0: 220; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 221; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t 222; CHECK-NEXT: ret 223 %v = call <vscale x 3 x i8> @llvm.vp.sadd.sat.nxv3i8(<vscale x 3 x i8> %va, <vscale x 3 x i8> splat (i8 -1), <vscale x 3 x i1> %m, i32 %evl) 224 ret <vscale x 3 x i8> %v 225} 226 227define <vscale x 3 x i8> @vsadd_vi_nxv3i8_unmasked(<vscale x 3 x i8> %va, i32 zeroext %evl) { 228; CHECK-LABEL: vsadd_vi_nxv3i8_unmasked: 229; CHECK: # %bb.0: 230; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 231; CHECK-NEXT: vsadd.vi v8, v8, -1 232; CHECK-NEXT: ret 233 %v = call <vscale x 3 x i8> @llvm.vp.sadd.sat.nxv3i8(<vscale x 3 x i8> %va, <vscale x 3 x i8> splat (i8 -1), <vscale x 3 x i1> splat (i1 true), i32 %evl) 234 ret <vscale x 3 x i8> %v 235} 236 237declare <vscale x 4 x i8> @llvm.vp.sadd.sat.nxv4i8(<vscale x 4 x i8>, <vscale x 4 x i8>, <vscale x 4 x i1>, i32) 238 239define <vscale x 4 x i8> @vsadd_vv_nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i8> %b, <vscale x 4 x i1> %m, i32 zeroext %evl) { 240; CHECK-LABEL: vsadd_vv_nxv4i8: 241; CHECK: # %bb.0: 242; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 243; CHECK-NEXT: vsadd.vv v8, v8, v9, v0.t 244; CHECK-NEXT: ret 245 %v = call <vscale x 4 x i8> @llvm.vp.sadd.sat.nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i8> %b, <vscale x 4 x i1> %m, i32 %evl) 246 ret <vscale x 4 x i8> %v 247} 248 249define <vscale x 4 x i8> @vsadd_vv_nxv4i8_unmasked(<vscale x 4 x i8> %va, <vscale x 4 x i8> %b, i32 zeroext %evl) { 250; CHECK-LABEL: vsadd_vv_nxv4i8_unmasked: 251; CHECK: # %bb.0: 252; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 253; CHECK-NEXT: vsadd.vv v8, v8, v9 254; CHECK-NEXT: ret 255 %v = call <vscale x 4 x i8> @llvm.vp.sadd.sat.nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i8> %b, <vscale x 4 x i1> splat (i1 true), i32 %evl) 256 ret <vscale x 4 x i8> %v 257} 258 259define <vscale x 4 x i8> @vsadd_vx_nxv4i8(<vscale x 4 x i8> %va, i8 %b, <vscale x 4 x i1> %m, i32 zeroext %evl) { 260; CHECK-LABEL: vsadd_vx_nxv4i8: 261; CHECK: # %bb.0: 262; CHECK-NEXT: vsetvli zero, a1, e8, mf2, ta, ma 263; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t 264; CHECK-NEXT: ret 265 %elt.head = insertelement <vscale x 4 x i8> poison, i8 %b, i32 0 266 %vb = shufflevector <vscale x 4 x i8> %elt.head, <vscale x 4 x i8> poison, <vscale x 4 x i32> zeroinitializer 267 %v = call <vscale x 4 x i8> @llvm.vp.sadd.sat.nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i8> %vb, <vscale x 4 x i1> %m, i32 %evl) 268 ret <vscale x 4 x i8> %v 269} 270 271define <vscale x 4 x i8> @vsadd_vx_nxv4i8_unmasked(<vscale x 4 x i8> %va, i8 %b, i32 zeroext %evl) { 272; CHECK-LABEL: vsadd_vx_nxv4i8_unmasked: 273; CHECK: # %bb.0: 274; CHECK-NEXT: vsetvli zero, a1, e8, mf2, ta, ma 275; CHECK-NEXT: vsadd.vx v8, v8, a0 276; CHECK-NEXT: ret 277 %elt.head = insertelement <vscale x 4 x i8> poison, i8 %b, i32 0 278 %vb = shufflevector <vscale x 4 x i8> %elt.head, <vscale x 4 x i8> poison, <vscale x 4 x i32> zeroinitializer 279 %v = call <vscale x 4 x i8> @llvm.vp.sadd.sat.nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i8> %vb, <vscale x 4 x i1> splat (i1 true), i32 %evl) 280 ret <vscale x 4 x i8> %v 281} 282 283define <vscale x 4 x i8> @vsadd_vi_nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i1> %m, i32 zeroext %evl) { 284; CHECK-LABEL: vsadd_vi_nxv4i8: 285; CHECK: # %bb.0: 286; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 287; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t 288; CHECK-NEXT: ret 289 %v = call <vscale x 4 x i8> @llvm.vp.sadd.sat.nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i8> splat (i8 -1), <vscale x 4 x i1> %m, i32 %evl) 290 ret <vscale x 4 x i8> %v 291} 292 293define <vscale x 4 x i8> @vsadd_vi_nxv4i8_unmasked(<vscale x 4 x i8> %va, i32 zeroext %evl) { 294; CHECK-LABEL: vsadd_vi_nxv4i8_unmasked: 295; CHECK: # %bb.0: 296; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 297; CHECK-NEXT: vsadd.vi v8, v8, -1 298; CHECK-NEXT: ret 299 %v = call <vscale x 4 x i8> @llvm.vp.sadd.sat.nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i8> splat (i8 -1), <vscale x 4 x i1> splat (i1 true), i32 %evl) 300 ret <vscale x 4 x i8> %v 301} 302 303declare <vscale x 8 x i8> @llvm.vp.sadd.sat.nxv8i8(<vscale x 8 x i8>, <vscale x 8 x i8>, <vscale x 8 x i1>, i32) 304 305define <vscale x 8 x i8> @vsadd_vv_nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i8> %b, <vscale x 8 x i1> %m, i32 zeroext %evl) { 306; CHECK-LABEL: vsadd_vv_nxv8i8: 307; CHECK: # %bb.0: 308; CHECK-NEXT: vsetvli zero, a0, e8, m1, ta, ma 309; CHECK-NEXT: vsadd.vv v8, v8, v9, v0.t 310; CHECK-NEXT: ret 311 %v = call <vscale x 8 x i8> @llvm.vp.sadd.sat.nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i8> %b, <vscale x 8 x i1> %m, i32 %evl) 312 ret <vscale x 8 x i8> %v 313} 314 315define <vscale x 8 x i8> @vsadd_vv_nxv8i8_unmasked(<vscale x 8 x i8> %va, <vscale x 8 x i8> %b, i32 zeroext %evl) { 316; CHECK-LABEL: vsadd_vv_nxv8i8_unmasked: 317; CHECK: # %bb.0: 318; CHECK-NEXT: vsetvli zero, a0, e8, m1, ta, ma 319; CHECK-NEXT: vsadd.vv v8, v8, v9 320; CHECK-NEXT: ret 321 %v = call <vscale x 8 x i8> @llvm.vp.sadd.sat.nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i8> %b, <vscale x 8 x i1> splat (i1 true), i32 %evl) 322 ret <vscale x 8 x i8> %v 323} 324 325define <vscale x 8 x i8> @vsadd_vx_nxv8i8(<vscale x 8 x i8> %va, i8 %b, <vscale x 8 x i1> %m, i32 zeroext %evl) { 326; CHECK-LABEL: vsadd_vx_nxv8i8: 327; CHECK: # %bb.0: 328; CHECK-NEXT: vsetvli zero, a1, e8, m1, ta, ma 329; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t 330; CHECK-NEXT: ret 331 %elt.head = insertelement <vscale x 8 x i8> poison, i8 %b, i32 0 332 %vb = shufflevector <vscale x 8 x i8> %elt.head, <vscale x 8 x i8> poison, <vscale x 8 x i32> zeroinitializer 333 %v = call <vscale x 8 x i8> @llvm.vp.sadd.sat.nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i8> %vb, <vscale x 8 x i1> %m, i32 %evl) 334 ret <vscale x 8 x i8> %v 335} 336 337define <vscale x 8 x i8> @vsadd_vx_nxv8i8_unmasked(<vscale x 8 x i8> %va, i8 %b, i32 zeroext %evl) { 338; CHECK-LABEL: vsadd_vx_nxv8i8_unmasked: 339; CHECK: # %bb.0: 340; CHECK-NEXT: vsetvli zero, a1, e8, m1, ta, ma 341; CHECK-NEXT: vsadd.vx v8, v8, a0 342; CHECK-NEXT: ret 343 %elt.head = insertelement <vscale x 8 x i8> poison, i8 %b, i32 0 344 %vb = shufflevector <vscale x 8 x i8> %elt.head, <vscale x 8 x i8> poison, <vscale x 8 x i32> zeroinitializer 345 %v = call <vscale x 8 x i8> @llvm.vp.sadd.sat.nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i8> %vb, <vscale x 8 x i1> splat (i1 true), i32 %evl) 346 ret <vscale x 8 x i8> %v 347} 348 349define <vscale x 8 x i8> @vsadd_vi_nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i1> %m, i32 zeroext %evl) { 350; CHECK-LABEL: vsadd_vi_nxv8i8: 351; CHECK: # %bb.0: 352; CHECK-NEXT: vsetvli zero, a0, e8, m1, ta, ma 353; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t 354; CHECK-NEXT: ret 355 %v = call <vscale x 8 x i8> @llvm.vp.sadd.sat.nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i8> splat (i8 -1), <vscale x 8 x i1> %m, i32 %evl) 356 ret <vscale x 8 x i8> %v 357} 358 359define <vscale x 8 x i8> @vsadd_vi_nxv8i8_unmasked(<vscale x 8 x i8> %va, i32 zeroext %evl) { 360; CHECK-LABEL: vsadd_vi_nxv8i8_unmasked: 361; CHECK: # %bb.0: 362; CHECK-NEXT: vsetvli zero, a0, e8, m1, ta, ma 363; CHECK-NEXT: vsadd.vi v8, v8, -1 364; CHECK-NEXT: ret 365 %v = call <vscale x 8 x i8> @llvm.vp.sadd.sat.nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i8> splat (i8 -1), <vscale x 8 x i1> splat (i1 true), i32 %evl) 366 ret <vscale x 8 x i8> %v 367} 368 369declare <vscale x 16 x i8> @llvm.vp.sadd.sat.nxv16i8(<vscale x 16 x i8>, <vscale x 16 x i8>, <vscale x 16 x i1>, i32) 370 371define <vscale x 16 x i8> @vsadd_vv_nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i8> %b, <vscale x 16 x i1> %m, i32 zeroext %evl) { 372; CHECK-LABEL: vsadd_vv_nxv16i8: 373; CHECK: # %bb.0: 374; CHECK-NEXT: vsetvli zero, a0, e8, m2, ta, ma 375; CHECK-NEXT: vsadd.vv v8, v8, v10, v0.t 376; CHECK-NEXT: ret 377 %v = call <vscale x 16 x i8> @llvm.vp.sadd.sat.nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i8> %b, <vscale x 16 x i1> %m, i32 %evl) 378 ret <vscale x 16 x i8> %v 379} 380 381define <vscale x 16 x i8> @vsadd_vv_nxv16i8_unmasked(<vscale x 16 x i8> %va, <vscale x 16 x i8> %b, i32 zeroext %evl) { 382; CHECK-LABEL: vsadd_vv_nxv16i8_unmasked: 383; CHECK: # %bb.0: 384; CHECK-NEXT: vsetvli zero, a0, e8, m2, ta, ma 385; CHECK-NEXT: vsadd.vv v8, v8, v10 386; CHECK-NEXT: ret 387 %v = call <vscale x 16 x i8> @llvm.vp.sadd.sat.nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i8> %b, <vscale x 16 x i1> splat (i1 true), i32 %evl) 388 ret <vscale x 16 x i8> %v 389} 390 391define <vscale x 16 x i8> @vsadd_vx_nxv16i8(<vscale x 16 x i8> %va, i8 %b, <vscale x 16 x i1> %m, i32 zeroext %evl) { 392; CHECK-LABEL: vsadd_vx_nxv16i8: 393; CHECK: # %bb.0: 394; CHECK-NEXT: vsetvli zero, a1, e8, m2, ta, ma 395; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t 396; CHECK-NEXT: ret 397 %elt.head = insertelement <vscale x 16 x i8> poison, i8 %b, i32 0 398 %vb = shufflevector <vscale x 16 x i8> %elt.head, <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer 399 %v = call <vscale x 16 x i8> @llvm.vp.sadd.sat.nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i8> %vb, <vscale x 16 x i1> %m, i32 %evl) 400 ret <vscale x 16 x i8> %v 401} 402 403define <vscale x 16 x i8> @vsadd_vx_nxv16i8_unmasked(<vscale x 16 x i8> %va, i8 %b, i32 zeroext %evl) { 404; CHECK-LABEL: vsadd_vx_nxv16i8_unmasked: 405; CHECK: # %bb.0: 406; CHECK-NEXT: vsetvli zero, a1, e8, m2, ta, ma 407; CHECK-NEXT: vsadd.vx v8, v8, a0 408; CHECK-NEXT: ret 409 %elt.head = insertelement <vscale x 16 x i8> poison, i8 %b, i32 0 410 %vb = shufflevector <vscale x 16 x i8> %elt.head, <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer 411 %v = call <vscale x 16 x i8> @llvm.vp.sadd.sat.nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i8> %vb, <vscale x 16 x i1> splat (i1 true), i32 %evl) 412 ret <vscale x 16 x i8> %v 413} 414 415define <vscale x 16 x i8> @vsadd_vi_nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i1> %m, i32 zeroext %evl) { 416; CHECK-LABEL: vsadd_vi_nxv16i8: 417; CHECK: # %bb.0: 418; CHECK-NEXT: vsetvli zero, a0, e8, m2, ta, ma 419; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t 420; CHECK-NEXT: ret 421 %v = call <vscale x 16 x i8> @llvm.vp.sadd.sat.nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i8> splat (i8 -1), <vscale x 16 x i1> %m, i32 %evl) 422 ret <vscale x 16 x i8> %v 423} 424 425define <vscale x 16 x i8> @vsadd_vi_nxv16i8_unmasked(<vscale x 16 x i8> %va, i32 zeroext %evl) { 426; CHECK-LABEL: vsadd_vi_nxv16i8_unmasked: 427; CHECK: # %bb.0: 428; CHECK-NEXT: vsetvli zero, a0, e8, m2, ta, ma 429; CHECK-NEXT: vsadd.vi v8, v8, -1 430; CHECK-NEXT: ret 431 %v = call <vscale x 16 x i8> @llvm.vp.sadd.sat.nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i8> splat (i8 -1), <vscale x 16 x i1> splat (i1 true), i32 %evl) 432 ret <vscale x 16 x i8> %v 433} 434 435declare <vscale x 32 x i8> @llvm.vp.sadd.sat.nxv32i8(<vscale x 32 x i8>, <vscale x 32 x i8>, <vscale x 32 x i1>, i32) 436 437define <vscale x 32 x i8> @vsadd_vv_nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i8> %b, <vscale x 32 x i1> %m, i32 zeroext %evl) { 438; CHECK-LABEL: vsadd_vv_nxv32i8: 439; CHECK: # %bb.0: 440; CHECK-NEXT: vsetvli zero, a0, e8, m4, ta, ma 441; CHECK-NEXT: vsadd.vv v8, v8, v12, v0.t 442; CHECK-NEXT: ret 443 %v = call <vscale x 32 x i8> @llvm.vp.sadd.sat.nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i8> %b, <vscale x 32 x i1> %m, i32 %evl) 444 ret <vscale x 32 x i8> %v 445} 446 447define <vscale x 32 x i8> @vsadd_vv_nxv32i8_unmasked(<vscale x 32 x i8> %va, <vscale x 32 x i8> %b, i32 zeroext %evl) { 448; CHECK-LABEL: vsadd_vv_nxv32i8_unmasked: 449; CHECK: # %bb.0: 450; CHECK-NEXT: vsetvli zero, a0, e8, m4, ta, ma 451; CHECK-NEXT: vsadd.vv v8, v8, v12 452; CHECK-NEXT: ret 453 %v = call <vscale x 32 x i8> @llvm.vp.sadd.sat.nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i8> %b, <vscale x 32 x i1> splat (i1 true), i32 %evl) 454 ret <vscale x 32 x i8> %v 455} 456 457define <vscale x 32 x i8> @vsadd_vx_nxv32i8(<vscale x 32 x i8> %va, i8 %b, <vscale x 32 x i1> %m, i32 zeroext %evl) { 458; CHECK-LABEL: vsadd_vx_nxv32i8: 459; CHECK: # %bb.0: 460; CHECK-NEXT: vsetvli zero, a1, e8, m4, ta, ma 461; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t 462; CHECK-NEXT: ret 463 %elt.head = insertelement <vscale x 32 x i8> poison, i8 %b, i32 0 464 %vb = shufflevector <vscale x 32 x i8> %elt.head, <vscale x 32 x i8> poison, <vscale x 32 x i32> zeroinitializer 465 %v = call <vscale x 32 x i8> @llvm.vp.sadd.sat.nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i8> %vb, <vscale x 32 x i1> %m, i32 %evl) 466 ret <vscale x 32 x i8> %v 467} 468 469define <vscale x 32 x i8> @vsadd_vx_nxv32i8_unmasked(<vscale x 32 x i8> %va, i8 %b, i32 zeroext %evl) { 470; CHECK-LABEL: vsadd_vx_nxv32i8_unmasked: 471; CHECK: # %bb.0: 472; CHECK-NEXT: vsetvli zero, a1, e8, m4, ta, ma 473; CHECK-NEXT: vsadd.vx v8, v8, a0 474; CHECK-NEXT: ret 475 %elt.head = insertelement <vscale x 32 x i8> poison, i8 %b, i32 0 476 %vb = shufflevector <vscale x 32 x i8> %elt.head, <vscale x 32 x i8> poison, <vscale x 32 x i32> zeroinitializer 477 %v = call <vscale x 32 x i8> @llvm.vp.sadd.sat.nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i8> %vb, <vscale x 32 x i1> splat (i1 true), i32 %evl) 478 ret <vscale x 32 x i8> %v 479} 480 481define <vscale x 32 x i8> @vsadd_vi_nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i1> %m, i32 zeroext %evl) { 482; CHECK-LABEL: vsadd_vi_nxv32i8: 483; CHECK: # %bb.0: 484; CHECK-NEXT: vsetvli zero, a0, e8, m4, ta, ma 485; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t 486; CHECK-NEXT: ret 487 %v = call <vscale x 32 x i8> @llvm.vp.sadd.sat.nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i8> splat (i8 -1), <vscale x 32 x i1> %m, i32 %evl) 488 ret <vscale x 32 x i8> %v 489} 490 491define <vscale x 32 x i8> @vsadd_vi_nxv32i8_unmasked(<vscale x 32 x i8> %va, i32 zeroext %evl) { 492; CHECK-LABEL: vsadd_vi_nxv32i8_unmasked: 493; CHECK: # %bb.0: 494; CHECK-NEXT: vsetvli zero, a0, e8, m4, ta, ma 495; CHECK-NEXT: vsadd.vi v8, v8, -1 496; CHECK-NEXT: ret 497 %v = call <vscale x 32 x i8> @llvm.vp.sadd.sat.nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i8> splat (i8 -1), <vscale x 32 x i1> splat (i1 true), i32 %evl) 498 ret <vscale x 32 x i8> %v 499} 500 501declare <vscale x 64 x i8> @llvm.vp.sadd.sat.nxv64i8(<vscale x 64 x i8>, <vscale x 64 x i8>, <vscale x 64 x i1>, i32) 502 503define <vscale x 64 x i8> @vsadd_vv_nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i8> %b, <vscale x 64 x i1> %m, i32 zeroext %evl) { 504; CHECK-LABEL: vsadd_vv_nxv64i8: 505; CHECK: # %bb.0: 506; CHECK-NEXT: vsetvli zero, a0, e8, m8, ta, ma 507; CHECK-NEXT: vsadd.vv v8, v8, v16, v0.t 508; CHECK-NEXT: ret 509 %v = call <vscale x 64 x i8> @llvm.vp.sadd.sat.nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i8> %b, <vscale x 64 x i1> %m, i32 %evl) 510 ret <vscale x 64 x i8> %v 511} 512 513define <vscale x 64 x i8> @vsadd_vv_nxv64i8_unmasked(<vscale x 64 x i8> %va, <vscale x 64 x i8> %b, i32 zeroext %evl) { 514; CHECK-LABEL: vsadd_vv_nxv64i8_unmasked: 515; CHECK: # %bb.0: 516; CHECK-NEXT: vsetvli zero, a0, e8, m8, ta, ma 517; CHECK-NEXT: vsadd.vv v8, v8, v16 518; CHECK-NEXT: ret 519 %v = call <vscale x 64 x i8> @llvm.vp.sadd.sat.nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i8> %b, <vscale x 64 x i1> splat (i1 true), i32 %evl) 520 ret <vscale x 64 x i8> %v 521} 522 523define <vscale x 64 x i8> @vsadd_vx_nxv64i8(<vscale x 64 x i8> %va, i8 %b, <vscale x 64 x i1> %m, i32 zeroext %evl) { 524; CHECK-LABEL: vsadd_vx_nxv64i8: 525; CHECK: # %bb.0: 526; CHECK-NEXT: vsetvli zero, a1, e8, m8, ta, ma 527; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t 528; CHECK-NEXT: ret 529 %elt.head = insertelement <vscale x 64 x i8> poison, i8 %b, i32 0 530 %vb = shufflevector <vscale x 64 x i8> %elt.head, <vscale x 64 x i8> poison, <vscale x 64 x i32> zeroinitializer 531 %v = call <vscale x 64 x i8> @llvm.vp.sadd.sat.nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i8> %vb, <vscale x 64 x i1> %m, i32 %evl) 532 ret <vscale x 64 x i8> %v 533} 534 535define <vscale x 64 x i8> @vsadd_vx_nxv64i8_unmasked(<vscale x 64 x i8> %va, i8 %b, i32 zeroext %evl) { 536; CHECK-LABEL: vsadd_vx_nxv64i8_unmasked: 537; CHECK: # %bb.0: 538; CHECK-NEXT: vsetvli zero, a1, e8, m8, ta, ma 539; CHECK-NEXT: vsadd.vx v8, v8, a0 540; CHECK-NEXT: ret 541 %elt.head = insertelement <vscale x 64 x i8> poison, i8 %b, i32 0 542 %vb = shufflevector <vscale x 64 x i8> %elt.head, <vscale x 64 x i8> poison, <vscale x 64 x i32> zeroinitializer 543 %v = call <vscale x 64 x i8> @llvm.vp.sadd.sat.nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i8> %vb, <vscale x 64 x i1> splat (i1 true), i32 %evl) 544 ret <vscale x 64 x i8> %v 545} 546 547define <vscale x 64 x i8> @vsadd_vi_nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i1> %m, i32 zeroext %evl) { 548; CHECK-LABEL: vsadd_vi_nxv64i8: 549; CHECK: # %bb.0: 550; CHECK-NEXT: vsetvli zero, a0, e8, m8, ta, ma 551; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t 552; CHECK-NEXT: ret 553 %v = call <vscale x 64 x i8> @llvm.vp.sadd.sat.nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i8> splat (i8 -1), <vscale x 64 x i1> %m, i32 %evl) 554 ret <vscale x 64 x i8> %v 555} 556 557define <vscale x 64 x i8> @vsadd_vi_nxv64i8_unmasked(<vscale x 64 x i8> %va, i32 zeroext %evl) { 558; CHECK-LABEL: vsadd_vi_nxv64i8_unmasked: 559; CHECK: # %bb.0: 560; CHECK-NEXT: vsetvli zero, a0, e8, m8, ta, ma 561; CHECK-NEXT: vsadd.vi v8, v8, -1 562; CHECK-NEXT: ret 563 %v = call <vscale x 64 x i8> @llvm.vp.sadd.sat.nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i8> splat (i8 -1), <vscale x 64 x i1> splat (i1 true), i32 %evl) 564 ret <vscale x 64 x i8> %v 565} 566 567; Test that split-legalization works when the mask itself needs splitting. 568 569declare <vscale x 128 x i8> @llvm.vp.sadd.sat.nxv128i8(<vscale x 128 x i8>, <vscale x 128 x i8>, <vscale x 128 x i1>, i32) 570 571define <vscale x 128 x i8> @vsadd_vi_nxv128i8(<vscale x 128 x i8> %va, <vscale x 128 x i1> %m, i32 zeroext %evl) { 572; CHECK-LABEL: vsadd_vi_nxv128i8: 573; CHECK: # %bb.0: 574; CHECK-NEXT: vsetvli a2, zero, e8, m8, ta, ma 575; CHECK-NEXT: vmv1r.v v24, v0 576; CHECK-NEXT: vlm.v v0, (a0) 577; CHECK-NEXT: csrr a0, vlenb 578; CHECK-NEXT: slli a0, a0, 3 579; CHECK-NEXT: sub a2, a1, a0 580; CHECK-NEXT: sltu a3, a1, a2 581; CHECK-NEXT: addi a3, a3, -1 582; CHECK-NEXT: and a2, a3, a2 583; CHECK-NEXT: vsetvli zero, a2, e8, m8, ta, ma 584; CHECK-NEXT: vsadd.vi v16, v16, -1, v0.t 585; CHECK-NEXT: bltu a1, a0, .LBB50_2 586; CHECK-NEXT: # %bb.1: 587; CHECK-NEXT: mv a1, a0 588; CHECK-NEXT: .LBB50_2: 589; CHECK-NEXT: vmv1r.v v0, v24 590; CHECK-NEXT: vsetvli zero, a1, e8, m8, ta, ma 591; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t 592; CHECK-NEXT: ret 593 %v = call <vscale x 128 x i8> @llvm.vp.sadd.sat.nxv128i8(<vscale x 128 x i8> %va, <vscale x 128 x i8> splat (i8 -1), <vscale x 128 x i1> %m, i32 %evl) 594 ret <vscale x 128 x i8> %v 595} 596 597define <vscale x 128 x i8> @vsadd_vi_nxv128i8_unmasked(<vscale x 128 x i8> %va, i32 zeroext %evl) { 598; CHECK-LABEL: vsadd_vi_nxv128i8_unmasked: 599; CHECK: # %bb.0: 600; CHECK-NEXT: csrr a1, vlenb 601; CHECK-NEXT: slli a1, a1, 3 602; CHECK-NEXT: sub a2, a0, a1 603; CHECK-NEXT: sltu a3, a0, a2 604; CHECK-NEXT: addi a3, a3, -1 605; CHECK-NEXT: and a2, a3, a2 606; CHECK-NEXT: vsetvli zero, a2, e8, m8, ta, ma 607; CHECK-NEXT: vsadd.vi v16, v16, -1 608; CHECK-NEXT: bltu a0, a1, .LBB51_2 609; CHECK-NEXT: # %bb.1: 610; CHECK-NEXT: mv a0, a1 611; CHECK-NEXT: .LBB51_2: 612; CHECK-NEXT: vsetvli zero, a0, e8, m8, ta, ma 613; CHECK-NEXT: vsadd.vi v8, v8, -1 614; CHECK-NEXT: ret 615 %v = call <vscale x 128 x i8> @llvm.vp.sadd.sat.nxv128i8(<vscale x 128 x i8> %va, <vscale x 128 x i8> splat (i8 -1), <vscale x 128 x i1> splat (i1 true), i32 %evl) 616 ret <vscale x 128 x i8> %v 617} 618 619declare <vscale x 1 x i16> @llvm.vp.sadd.sat.nxv1i16(<vscale x 1 x i16>, <vscale x 1 x i16>, <vscale x 1 x i1>, i32) 620 621define <vscale x 1 x i16> @vsadd_vv_nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i16> %b, <vscale x 1 x i1> %m, i32 zeroext %evl) { 622; CHECK-LABEL: vsadd_vv_nxv1i16: 623; CHECK: # %bb.0: 624; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 625; CHECK-NEXT: vsadd.vv v8, v8, v9, v0.t 626; CHECK-NEXT: ret 627 %v = call <vscale x 1 x i16> @llvm.vp.sadd.sat.nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i16> %b, <vscale x 1 x i1> %m, i32 %evl) 628 ret <vscale x 1 x i16> %v 629} 630 631define <vscale x 1 x i16> @vsadd_vv_nxv1i16_unmasked(<vscale x 1 x i16> %va, <vscale x 1 x i16> %b, i32 zeroext %evl) { 632; CHECK-LABEL: vsadd_vv_nxv1i16_unmasked: 633; CHECK: # %bb.0: 634; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 635; CHECK-NEXT: vsadd.vv v8, v8, v9 636; CHECK-NEXT: ret 637 %v = call <vscale x 1 x i16> @llvm.vp.sadd.sat.nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i16> %b, <vscale x 1 x i1> splat (i1 true), i32 %evl) 638 ret <vscale x 1 x i16> %v 639} 640 641define <vscale x 1 x i16> @vsadd_vx_nxv1i16(<vscale x 1 x i16> %va, i16 %b, <vscale x 1 x i1> %m, i32 zeroext %evl) { 642; CHECK-LABEL: vsadd_vx_nxv1i16: 643; CHECK: # %bb.0: 644; CHECK-NEXT: vsetvli zero, a1, e16, mf4, ta, ma 645; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t 646; CHECK-NEXT: ret 647 %elt.head = insertelement <vscale x 1 x i16> poison, i16 %b, i32 0 648 %vb = shufflevector <vscale x 1 x i16> %elt.head, <vscale x 1 x i16> poison, <vscale x 1 x i32> zeroinitializer 649 %v = call <vscale x 1 x i16> @llvm.vp.sadd.sat.nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i16> %vb, <vscale x 1 x i1> %m, i32 %evl) 650 ret <vscale x 1 x i16> %v 651} 652 653define <vscale x 1 x i16> @vsadd_vx_nxv1i16_unmasked(<vscale x 1 x i16> %va, i16 %b, i32 zeroext %evl) { 654; CHECK-LABEL: vsadd_vx_nxv1i16_unmasked: 655; CHECK: # %bb.0: 656; CHECK-NEXT: vsetvli zero, a1, e16, mf4, ta, ma 657; CHECK-NEXT: vsadd.vx v8, v8, a0 658; CHECK-NEXT: ret 659 %elt.head = insertelement <vscale x 1 x i16> poison, i16 %b, i32 0 660 %vb = shufflevector <vscale x 1 x i16> %elt.head, <vscale x 1 x i16> poison, <vscale x 1 x i32> zeroinitializer 661 %v = call <vscale x 1 x i16> @llvm.vp.sadd.sat.nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i16> %vb, <vscale x 1 x i1> splat (i1 true), i32 %evl) 662 ret <vscale x 1 x i16> %v 663} 664 665define <vscale x 1 x i16> @vsadd_vi_nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i1> %m, i32 zeroext %evl) { 666; CHECK-LABEL: vsadd_vi_nxv1i16: 667; CHECK: # %bb.0: 668; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 669; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t 670; CHECK-NEXT: ret 671 %v = call <vscale x 1 x i16> @llvm.vp.sadd.sat.nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i16> splat (i16 -1), <vscale x 1 x i1> %m, i32 %evl) 672 ret <vscale x 1 x i16> %v 673} 674 675define <vscale x 1 x i16> @vsadd_vi_nxv1i16_unmasked(<vscale x 1 x i16> %va, i32 zeroext %evl) { 676; CHECK-LABEL: vsadd_vi_nxv1i16_unmasked: 677; CHECK: # %bb.0: 678; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 679; CHECK-NEXT: vsadd.vi v8, v8, -1 680; CHECK-NEXT: ret 681 %v = call <vscale x 1 x i16> @llvm.vp.sadd.sat.nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i16> splat (i16 -1), <vscale x 1 x i1> splat (i1 true), i32 %evl) 682 ret <vscale x 1 x i16> %v 683} 684 685declare <vscale x 2 x i16> @llvm.vp.sadd.sat.nxv2i16(<vscale x 2 x i16>, <vscale x 2 x i16>, <vscale x 2 x i1>, i32) 686 687define <vscale x 2 x i16> @vsadd_vv_nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i16> %b, <vscale x 2 x i1> %m, i32 zeroext %evl) { 688; CHECK-LABEL: vsadd_vv_nxv2i16: 689; CHECK: # %bb.0: 690; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 691; CHECK-NEXT: vsadd.vv v8, v8, v9, v0.t 692; CHECK-NEXT: ret 693 %v = call <vscale x 2 x i16> @llvm.vp.sadd.sat.nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i16> %b, <vscale x 2 x i1> %m, i32 %evl) 694 ret <vscale x 2 x i16> %v 695} 696 697define <vscale x 2 x i16> @vsadd_vv_nxv2i16_unmasked(<vscale x 2 x i16> %va, <vscale x 2 x i16> %b, i32 zeroext %evl) { 698; CHECK-LABEL: vsadd_vv_nxv2i16_unmasked: 699; CHECK: # %bb.0: 700; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 701; CHECK-NEXT: vsadd.vv v8, v8, v9 702; CHECK-NEXT: ret 703 %v = call <vscale x 2 x i16> @llvm.vp.sadd.sat.nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i16> %b, <vscale x 2 x i1> splat (i1 true), i32 %evl) 704 ret <vscale x 2 x i16> %v 705} 706 707define <vscale x 2 x i16> @vsadd_vx_nxv2i16(<vscale x 2 x i16> %va, i16 %b, <vscale x 2 x i1> %m, i32 zeroext %evl) { 708; CHECK-LABEL: vsadd_vx_nxv2i16: 709; CHECK: # %bb.0: 710; CHECK-NEXT: vsetvli zero, a1, e16, mf2, ta, ma 711; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t 712; CHECK-NEXT: ret 713 %elt.head = insertelement <vscale x 2 x i16> poison, i16 %b, i32 0 714 %vb = shufflevector <vscale x 2 x i16> %elt.head, <vscale x 2 x i16> poison, <vscale x 2 x i32> zeroinitializer 715 %v = call <vscale x 2 x i16> @llvm.vp.sadd.sat.nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i16> %vb, <vscale x 2 x i1> %m, i32 %evl) 716 ret <vscale x 2 x i16> %v 717} 718 719define <vscale x 2 x i16> @vsadd_vx_nxv2i16_unmasked(<vscale x 2 x i16> %va, i16 %b, i32 zeroext %evl) { 720; CHECK-LABEL: vsadd_vx_nxv2i16_unmasked: 721; CHECK: # %bb.0: 722; CHECK-NEXT: vsetvli zero, a1, e16, mf2, ta, ma 723; CHECK-NEXT: vsadd.vx v8, v8, a0 724; CHECK-NEXT: ret 725 %elt.head = insertelement <vscale x 2 x i16> poison, i16 %b, i32 0 726 %vb = shufflevector <vscale x 2 x i16> %elt.head, <vscale x 2 x i16> poison, <vscale x 2 x i32> zeroinitializer 727 %v = call <vscale x 2 x i16> @llvm.vp.sadd.sat.nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i16> %vb, <vscale x 2 x i1> splat (i1 true), i32 %evl) 728 ret <vscale x 2 x i16> %v 729} 730 731define <vscale x 2 x i16> @vsadd_vi_nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i1> %m, i32 zeroext %evl) { 732; CHECK-LABEL: vsadd_vi_nxv2i16: 733; CHECK: # %bb.0: 734; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 735; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t 736; CHECK-NEXT: ret 737 %v = call <vscale x 2 x i16> @llvm.vp.sadd.sat.nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i16> splat (i16 -1), <vscale x 2 x i1> %m, i32 %evl) 738 ret <vscale x 2 x i16> %v 739} 740 741define <vscale x 2 x i16> @vsadd_vi_nxv2i16_unmasked(<vscale x 2 x i16> %va, i32 zeroext %evl) { 742; CHECK-LABEL: vsadd_vi_nxv2i16_unmasked: 743; CHECK: # %bb.0: 744; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 745; CHECK-NEXT: vsadd.vi v8, v8, -1 746; CHECK-NEXT: ret 747 %v = call <vscale x 2 x i16> @llvm.vp.sadd.sat.nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i16> splat (i16 -1), <vscale x 2 x i1> splat (i1 true), i32 %evl) 748 ret <vscale x 2 x i16> %v 749} 750 751declare <vscale x 4 x i16> @llvm.vp.sadd.sat.nxv4i16(<vscale x 4 x i16>, <vscale x 4 x i16>, <vscale x 4 x i1>, i32) 752 753define <vscale x 4 x i16> @vsadd_vv_nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i16> %b, <vscale x 4 x i1> %m, i32 zeroext %evl) { 754; CHECK-LABEL: vsadd_vv_nxv4i16: 755; CHECK: # %bb.0: 756; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma 757; CHECK-NEXT: vsadd.vv v8, v8, v9, v0.t 758; CHECK-NEXT: ret 759 %v = call <vscale x 4 x i16> @llvm.vp.sadd.sat.nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i16> %b, <vscale x 4 x i1> %m, i32 %evl) 760 ret <vscale x 4 x i16> %v 761} 762 763define <vscale x 4 x i16> @vsadd_vv_nxv4i16_unmasked(<vscale x 4 x i16> %va, <vscale x 4 x i16> %b, i32 zeroext %evl) { 764; CHECK-LABEL: vsadd_vv_nxv4i16_unmasked: 765; CHECK: # %bb.0: 766; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma 767; CHECK-NEXT: vsadd.vv v8, v8, v9 768; CHECK-NEXT: ret 769 %v = call <vscale x 4 x i16> @llvm.vp.sadd.sat.nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i16> %b, <vscale x 4 x i1> splat (i1 true), i32 %evl) 770 ret <vscale x 4 x i16> %v 771} 772 773define <vscale x 4 x i16> @vsadd_vx_nxv4i16(<vscale x 4 x i16> %va, i16 %b, <vscale x 4 x i1> %m, i32 zeroext %evl) { 774; CHECK-LABEL: vsadd_vx_nxv4i16: 775; CHECK: # %bb.0: 776; CHECK-NEXT: vsetvli zero, a1, e16, m1, ta, ma 777; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t 778; CHECK-NEXT: ret 779 %elt.head = insertelement <vscale x 4 x i16> poison, i16 %b, i32 0 780 %vb = shufflevector <vscale x 4 x i16> %elt.head, <vscale x 4 x i16> poison, <vscale x 4 x i32> zeroinitializer 781 %v = call <vscale x 4 x i16> @llvm.vp.sadd.sat.nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i16> %vb, <vscale x 4 x i1> %m, i32 %evl) 782 ret <vscale x 4 x i16> %v 783} 784 785define <vscale x 4 x i16> @vsadd_vx_nxv4i16_unmasked(<vscale x 4 x i16> %va, i16 %b, i32 zeroext %evl) { 786; CHECK-LABEL: vsadd_vx_nxv4i16_unmasked: 787; CHECK: # %bb.0: 788; CHECK-NEXT: vsetvli zero, a1, e16, m1, ta, ma 789; CHECK-NEXT: vsadd.vx v8, v8, a0 790; CHECK-NEXT: ret 791 %elt.head = insertelement <vscale x 4 x i16> poison, i16 %b, i32 0 792 %vb = shufflevector <vscale x 4 x i16> %elt.head, <vscale x 4 x i16> poison, <vscale x 4 x i32> zeroinitializer 793 %v = call <vscale x 4 x i16> @llvm.vp.sadd.sat.nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i16> %vb, <vscale x 4 x i1> splat (i1 true), i32 %evl) 794 ret <vscale x 4 x i16> %v 795} 796 797define <vscale x 4 x i16> @vsadd_vi_nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i1> %m, i32 zeroext %evl) { 798; CHECK-LABEL: vsadd_vi_nxv4i16: 799; CHECK: # %bb.0: 800; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma 801; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t 802; CHECK-NEXT: ret 803 %v = call <vscale x 4 x i16> @llvm.vp.sadd.sat.nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i16> splat (i16 -1), <vscale x 4 x i1> %m, i32 %evl) 804 ret <vscale x 4 x i16> %v 805} 806 807define <vscale x 4 x i16> @vsadd_vi_nxv4i16_unmasked(<vscale x 4 x i16> %va, i32 zeroext %evl) { 808; CHECK-LABEL: vsadd_vi_nxv4i16_unmasked: 809; CHECK: # %bb.0: 810; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma 811; CHECK-NEXT: vsadd.vi v8, v8, -1 812; CHECK-NEXT: ret 813 %v = call <vscale x 4 x i16> @llvm.vp.sadd.sat.nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i16> splat (i16 -1), <vscale x 4 x i1> splat (i1 true), i32 %evl) 814 ret <vscale x 4 x i16> %v 815} 816 817declare <vscale x 8 x i16> @llvm.vp.sadd.sat.nxv8i16(<vscale x 8 x i16>, <vscale x 8 x i16>, <vscale x 8 x i1>, i32) 818 819define <vscale x 8 x i16> @vsadd_vv_nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i16> %b, <vscale x 8 x i1> %m, i32 zeroext %evl) { 820; CHECK-LABEL: vsadd_vv_nxv8i16: 821; CHECK: # %bb.0: 822; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma 823; CHECK-NEXT: vsadd.vv v8, v8, v10, v0.t 824; CHECK-NEXT: ret 825 %v = call <vscale x 8 x i16> @llvm.vp.sadd.sat.nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i16> %b, <vscale x 8 x i1> %m, i32 %evl) 826 ret <vscale x 8 x i16> %v 827} 828 829define <vscale x 8 x i16> @vsadd_vv_nxv8i16_unmasked(<vscale x 8 x i16> %va, <vscale x 8 x i16> %b, i32 zeroext %evl) { 830; CHECK-LABEL: vsadd_vv_nxv8i16_unmasked: 831; CHECK: # %bb.0: 832; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma 833; CHECK-NEXT: vsadd.vv v8, v8, v10 834; CHECK-NEXT: ret 835 %v = call <vscale x 8 x i16> @llvm.vp.sadd.sat.nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i16> %b, <vscale x 8 x i1> splat (i1 true), i32 %evl) 836 ret <vscale x 8 x i16> %v 837} 838 839define <vscale x 8 x i16> @vsadd_vx_nxv8i16(<vscale x 8 x i16> %va, i16 %b, <vscale x 8 x i1> %m, i32 zeroext %evl) { 840; CHECK-LABEL: vsadd_vx_nxv8i16: 841; CHECK: # %bb.0: 842; CHECK-NEXT: vsetvli zero, a1, e16, m2, ta, ma 843; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t 844; CHECK-NEXT: ret 845 %elt.head = insertelement <vscale x 8 x i16> poison, i16 %b, i32 0 846 %vb = shufflevector <vscale x 8 x i16> %elt.head, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer 847 %v = call <vscale x 8 x i16> @llvm.vp.sadd.sat.nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i16> %vb, <vscale x 8 x i1> %m, i32 %evl) 848 ret <vscale x 8 x i16> %v 849} 850 851define <vscale x 8 x i16> @vsadd_vx_nxv8i16_unmasked(<vscale x 8 x i16> %va, i16 %b, i32 zeroext %evl) { 852; CHECK-LABEL: vsadd_vx_nxv8i16_unmasked: 853; CHECK: # %bb.0: 854; CHECK-NEXT: vsetvli zero, a1, e16, m2, ta, ma 855; CHECK-NEXT: vsadd.vx v8, v8, a0 856; CHECK-NEXT: ret 857 %elt.head = insertelement <vscale x 8 x i16> poison, i16 %b, i32 0 858 %vb = shufflevector <vscale x 8 x i16> %elt.head, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer 859 %v = call <vscale x 8 x i16> @llvm.vp.sadd.sat.nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i16> %vb, <vscale x 8 x i1> splat (i1 true), i32 %evl) 860 ret <vscale x 8 x i16> %v 861} 862 863define <vscale x 8 x i16> @vsadd_vi_nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i1> %m, i32 zeroext %evl) { 864; CHECK-LABEL: vsadd_vi_nxv8i16: 865; CHECK: # %bb.0: 866; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma 867; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t 868; CHECK-NEXT: ret 869 %v = call <vscale x 8 x i16> @llvm.vp.sadd.sat.nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i16> splat (i16 -1), <vscale x 8 x i1> %m, i32 %evl) 870 ret <vscale x 8 x i16> %v 871} 872 873define <vscale x 8 x i16> @vsadd_vi_nxv8i16_unmasked(<vscale x 8 x i16> %va, i32 zeroext %evl) { 874; CHECK-LABEL: vsadd_vi_nxv8i16_unmasked: 875; CHECK: # %bb.0: 876; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma 877; CHECK-NEXT: vsadd.vi v8, v8, -1 878; CHECK-NEXT: ret 879 %v = call <vscale x 8 x i16> @llvm.vp.sadd.sat.nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i16> splat (i16 -1), <vscale x 8 x i1> splat (i1 true), i32 %evl) 880 ret <vscale x 8 x i16> %v 881} 882 883declare <vscale x 16 x i16> @llvm.vp.sadd.sat.nxv16i16(<vscale x 16 x i16>, <vscale x 16 x i16>, <vscale x 16 x i1>, i32) 884 885define <vscale x 16 x i16> @vsadd_vv_nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i16> %b, <vscale x 16 x i1> %m, i32 zeroext %evl) { 886; CHECK-LABEL: vsadd_vv_nxv16i16: 887; CHECK: # %bb.0: 888; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, ma 889; CHECK-NEXT: vsadd.vv v8, v8, v12, v0.t 890; CHECK-NEXT: ret 891 %v = call <vscale x 16 x i16> @llvm.vp.sadd.sat.nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i16> %b, <vscale x 16 x i1> %m, i32 %evl) 892 ret <vscale x 16 x i16> %v 893} 894 895define <vscale x 16 x i16> @vsadd_vv_nxv16i16_unmasked(<vscale x 16 x i16> %va, <vscale x 16 x i16> %b, i32 zeroext %evl) { 896; CHECK-LABEL: vsadd_vv_nxv16i16_unmasked: 897; CHECK: # %bb.0: 898; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, ma 899; CHECK-NEXT: vsadd.vv v8, v8, v12 900; CHECK-NEXT: ret 901 %v = call <vscale x 16 x i16> @llvm.vp.sadd.sat.nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i16> %b, <vscale x 16 x i1> splat (i1 true), i32 %evl) 902 ret <vscale x 16 x i16> %v 903} 904 905define <vscale x 16 x i16> @vsadd_vx_nxv16i16(<vscale x 16 x i16> %va, i16 %b, <vscale x 16 x i1> %m, i32 zeroext %evl) { 906; CHECK-LABEL: vsadd_vx_nxv16i16: 907; CHECK: # %bb.0: 908; CHECK-NEXT: vsetvli zero, a1, e16, m4, ta, ma 909; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t 910; CHECK-NEXT: ret 911 %elt.head = insertelement <vscale x 16 x i16> poison, i16 %b, i32 0 912 %vb = shufflevector <vscale x 16 x i16> %elt.head, <vscale x 16 x i16> poison, <vscale x 16 x i32> zeroinitializer 913 %v = call <vscale x 16 x i16> @llvm.vp.sadd.sat.nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i16> %vb, <vscale x 16 x i1> %m, i32 %evl) 914 ret <vscale x 16 x i16> %v 915} 916 917define <vscale x 16 x i16> @vsadd_vx_nxv16i16_unmasked(<vscale x 16 x i16> %va, i16 %b, i32 zeroext %evl) { 918; CHECK-LABEL: vsadd_vx_nxv16i16_unmasked: 919; CHECK: # %bb.0: 920; CHECK-NEXT: vsetvli zero, a1, e16, m4, ta, ma 921; CHECK-NEXT: vsadd.vx v8, v8, a0 922; CHECK-NEXT: ret 923 %elt.head = insertelement <vscale x 16 x i16> poison, i16 %b, i32 0 924 %vb = shufflevector <vscale x 16 x i16> %elt.head, <vscale x 16 x i16> poison, <vscale x 16 x i32> zeroinitializer 925 %v = call <vscale x 16 x i16> @llvm.vp.sadd.sat.nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i16> %vb, <vscale x 16 x i1> splat (i1 true), i32 %evl) 926 ret <vscale x 16 x i16> %v 927} 928 929define <vscale x 16 x i16> @vsadd_vi_nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i1> %m, i32 zeroext %evl) { 930; CHECK-LABEL: vsadd_vi_nxv16i16: 931; CHECK: # %bb.0: 932; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, ma 933; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t 934; CHECK-NEXT: ret 935 %v = call <vscale x 16 x i16> @llvm.vp.sadd.sat.nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i16> splat (i16 -1), <vscale x 16 x i1> %m, i32 %evl) 936 ret <vscale x 16 x i16> %v 937} 938 939define <vscale x 16 x i16> @vsadd_vi_nxv16i16_unmasked(<vscale x 16 x i16> %va, i32 zeroext %evl) { 940; CHECK-LABEL: vsadd_vi_nxv16i16_unmasked: 941; CHECK: # %bb.0: 942; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, ma 943; CHECK-NEXT: vsadd.vi v8, v8, -1 944; CHECK-NEXT: ret 945 %v = call <vscale x 16 x i16> @llvm.vp.sadd.sat.nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i16> splat (i16 -1), <vscale x 16 x i1> splat (i1 true), i32 %evl) 946 ret <vscale x 16 x i16> %v 947} 948 949declare <vscale x 32 x i16> @llvm.vp.sadd.sat.nxv32i16(<vscale x 32 x i16>, <vscale x 32 x i16>, <vscale x 32 x i1>, i32) 950 951define <vscale x 32 x i16> @vsadd_vv_nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i16> %b, <vscale x 32 x i1> %m, i32 zeroext %evl) { 952; CHECK-LABEL: vsadd_vv_nxv32i16: 953; CHECK: # %bb.0: 954; CHECK-NEXT: vsetvli zero, a0, e16, m8, ta, ma 955; CHECK-NEXT: vsadd.vv v8, v8, v16, v0.t 956; CHECK-NEXT: ret 957 %v = call <vscale x 32 x i16> @llvm.vp.sadd.sat.nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i16> %b, <vscale x 32 x i1> %m, i32 %evl) 958 ret <vscale x 32 x i16> %v 959} 960 961define <vscale x 32 x i16> @vsadd_vv_nxv32i16_unmasked(<vscale x 32 x i16> %va, <vscale x 32 x i16> %b, i32 zeroext %evl) { 962; CHECK-LABEL: vsadd_vv_nxv32i16_unmasked: 963; CHECK: # %bb.0: 964; CHECK-NEXT: vsetvli zero, a0, e16, m8, ta, ma 965; CHECK-NEXT: vsadd.vv v8, v8, v16 966; CHECK-NEXT: ret 967 %v = call <vscale x 32 x i16> @llvm.vp.sadd.sat.nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i16> %b, <vscale x 32 x i1> splat (i1 true), i32 %evl) 968 ret <vscale x 32 x i16> %v 969} 970 971define <vscale x 32 x i16> @vsadd_vx_nxv32i16(<vscale x 32 x i16> %va, i16 %b, <vscale x 32 x i1> %m, i32 zeroext %evl) { 972; CHECK-LABEL: vsadd_vx_nxv32i16: 973; CHECK: # %bb.0: 974; CHECK-NEXT: vsetvli zero, a1, e16, m8, ta, ma 975; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t 976; CHECK-NEXT: ret 977 %elt.head = insertelement <vscale x 32 x i16> poison, i16 %b, i32 0 978 %vb = shufflevector <vscale x 32 x i16> %elt.head, <vscale x 32 x i16> poison, <vscale x 32 x i32> zeroinitializer 979 %v = call <vscale x 32 x i16> @llvm.vp.sadd.sat.nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i16> %vb, <vscale x 32 x i1> %m, i32 %evl) 980 ret <vscale x 32 x i16> %v 981} 982 983define <vscale x 32 x i16> @vsadd_vx_nxv32i16_unmasked(<vscale x 32 x i16> %va, i16 %b, i32 zeroext %evl) { 984; CHECK-LABEL: vsadd_vx_nxv32i16_unmasked: 985; CHECK: # %bb.0: 986; CHECK-NEXT: vsetvli zero, a1, e16, m8, ta, ma 987; CHECK-NEXT: vsadd.vx v8, v8, a0 988; CHECK-NEXT: ret 989 %elt.head = insertelement <vscale x 32 x i16> poison, i16 %b, i32 0 990 %vb = shufflevector <vscale x 32 x i16> %elt.head, <vscale x 32 x i16> poison, <vscale x 32 x i32> zeroinitializer 991 %v = call <vscale x 32 x i16> @llvm.vp.sadd.sat.nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i16> %vb, <vscale x 32 x i1> splat (i1 true), i32 %evl) 992 ret <vscale x 32 x i16> %v 993} 994 995define <vscale x 32 x i16> @vsadd_vi_nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i1> %m, i32 zeroext %evl) { 996; CHECK-LABEL: vsadd_vi_nxv32i16: 997; CHECK: # %bb.0: 998; CHECK-NEXT: vsetvli zero, a0, e16, m8, ta, ma 999; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t 1000; CHECK-NEXT: ret 1001 %v = call <vscale x 32 x i16> @llvm.vp.sadd.sat.nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i16> splat (i16 -1), <vscale x 32 x i1> %m, i32 %evl) 1002 ret <vscale x 32 x i16> %v 1003} 1004 1005define <vscale x 32 x i16> @vsadd_vi_nxv32i16_unmasked(<vscale x 32 x i16> %va, i32 zeroext %evl) { 1006; CHECK-LABEL: vsadd_vi_nxv32i16_unmasked: 1007; CHECK: # %bb.0: 1008; CHECK-NEXT: vsetvli zero, a0, e16, m8, ta, ma 1009; CHECK-NEXT: vsadd.vi v8, v8, -1 1010; CHECK-NEXT: ret 1011 %v = call <vscale x 32 x i16> @llvm.vp.sadd.sat.nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i16> splat (i16 -1), <vscale x 32 x i1> splat (i1 true), i32 %evl) 1012 ret <vscale x 32 x i16> %v 1013} 1014 1015declare <vscale x 1 x i32> @llvm.vp.sadd.sat.nxv1i32(<vscale x 1 x i32>, <vscale x 1 x i32>, <vscale x 1 x i1>, i32) 1016 1017define <vscale x 1 x i32> @vsadd_vv_nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i32> %b, <vscale x 1 x i1> %m, i32 zeroext %evl) { 1018; CHECK-LABEL: vsadd_vv_nxv1i32: 1019; CHECK: # %bb.0: 1020; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 1021; CHECK-NEXT: vsadd.vv v8, v8, v9, v0.t 1022; CHECK-NEXT: ret 1023 %v = call <vscale x 1 x i32> @llvm.vp.sadd.sat.nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i32> %b, <vscale x 1 x i1> %m, i32 %evl) 1024 ret <vscale x 1 x i32> %v 1025} 1026 1027define <vscale x 1 x i32> @vsadd_vv_nxv1i32_unmasked(<vscale x 1 x i32> %va, <vscale x 1 x i32> %b, i32 zeroext %evl) { 1028; CHECK-LABEL: vsadd_vv_nxv1i32_unmasked: 1029; CHECK: # %bb.0: 1030; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 1031; CHECK-NEXT: vsadd.vv v8, v8, v9 1032; CHECK-NEXT: ret 1033 %v = call <vscale x 1 x i32> @llvm.vp.sadd.sat.nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i32> %b, <vscale x 1 x i1> splat (i1 true), i32 %evl) 1034 ret <vscale x 1 x i32> %v 1035} 1036 1037define <vscale x 1 x i32> @vsadd_vx_nxv1i32(<vscale x 1 x i32> %va, i32 %b, <vscale x 1 x i1> %m, i32 zeroext %evl) { 1038; CHECK-LABEL: vsadd_vx_nxv1i32: 1039; CHECK: # %bb.0: 1040; CHECK-NEXT: vsetvli zero, a1, e32, mf2, ta, ma 1041; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t 1042; CHECK-NEXT: ret 1043 %elt.head = insertelement <vscale x 1 x i32> poison, i32 %b, i32 0 1044 %vb = shufflevector <vscale x 1 x i32> %elt.head, <vscale x 1 x i32> poison, <vscale x 1 x i32> zeroinitializer 1045 %v = call <vscale x 1 x i32> @llvm.vp.sadd.sat.nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i32> %vb, <vscale x 1 x i1> %m, i32 %evl) 1046 ret <vscale x 1 x i32> %v 1047} 1048 1049define <vscale x 1 x i32> @vsadd_vx_nxv1i32_unmasked(<vscale x 1 x i32> %va, i32 %b, i32 zeroext %evl) { 1050; CHECK-LABEL: vsadd_vx_nxv1i32_unmasked: 1051; CHECK: # %bb.0: 1052; CHECK-NEXT: vsetvli zero, a1, e32, mf2, ta, ma 1053; CHECK-NEXT: vsadd.vx v8, v8, a0 1054; CHECK-NEXT: ret 1055 %elt.head = insertelement <vscale x 1 x i32> poison, i32 %b, i32 0 1056 %vb = shufflevector <vscale x 1 x i32> %elt.head, <vscale x 1 x i32> poison, <vscale x 1 x i32> zeroinitializer 1057 %v = call <vscale x 1 x i32> @llvm.vp.sadd.sat.nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i32> %vb, <vscale x 1 x i1> splat (i1 true), i32 %evl) 1058 ret <vscale x 1 x i32> %v 1059} 1060 1061define <vscale x 1 x i32> @vsadd_vi_nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i1> %m, i32 zeroext %evl) { 1062; CHECK-LABEL: vsadd_vi_nxv1i32: 1063; CHECK: # %bb.0: 1064; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 1065; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t 1066; CHECK-NEXT: ret 1067 %v = call <vscale x 1 x i32> @llvm.vp.sadd.sat.nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i32> splat (i32 -1), <vscale x 1 x i1> %m, i32 %evl) 1068 ret <vscale x 1 x i32> %v 1069} 1070 1071define <vscale x 1 x i32> @vsadd_vi_nxv1i32_unmasked(<vscale x 1 x i32> %va, i32 zeroext %evl) { 1072; CHECK-LABEL: vsadd_vi_nxv1i32_unmasked: 1073; CHECK: # %bb.0: 1074; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 1075; CHECK-NEXT: vsadd.vi v8, v8, -1 1076; CHECK-NEXT: ret 1077 %v = call <vscale x 1 x i32> @llvm.vp.sadd.sat.nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i32> splat (i32 -1), <vscale x 1 x i1> splat (i1 true), i32 %evl) 1078 ret <vscale x 1 x i32> %v 1079} 1080 1081declare <vscale x 2 x i32> @llvm.vp.sadd.sat.nxv2i32(<vscale x 2 x i32>, <vscale x 2 x i32>, <vscale x 2 x i1>, i32) 1082 1083define <vscale x 2 x i32> @vsadd_vv_nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i32> %b, <vscale x 2 x i1> %m, i32 zeroext %evl) { 1084; CHECK-LABEL: vsadd_vv_nxv2i32: 1085; CHECK: # %bb.0: 1086; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma 1087; CHECK-NEXT: vsadd.vv v8, v8, v9, v0.t 1088; CHECK-NEXT: ret 1089 %v = call <vscale x 2 x i32> @llvm.vp.sadd.sat.nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i32> %b, <vscale x 2 x i1> %m, i32 %evl) 1090 ret <vscale x 2 x i32> %v 1091} 1092 1093define <vscale x 2 x i32> @vsadd_vv_nxv2i32_unmasked(<vscale x 2 x i32> %va, <vscale x 2 x i32> %b, i32 zeroext %evl) { 1094; CHECK-LABEL: vsadd_vv_nxv2i32_unmasked: 1095; CHECK: # %bb.0: 1096; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma 1097; CHECK-NEXT: vsadd.vv v8, v8, v9 1098; CHECK-NEXT: ret 1099 %v = call <vscale x 2 x i32> @llvm.vp.sadd.sat.nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i32> %b, <vscale x 2 x i1> splat (i1 true), i32 %evl) 1100 ret <vscale x 2 x i32> %v 1101} 1102 1103define <vscale x 2 x i32> @vsadd_vx_nxv2i32(<vscale x 2 x i32> %va, i32 %b, <vscale x 2 x i1> %m, i32 zeroext %evl) { 1104; CHECK-LABEL: vsadd_vx_nxv2i32: 1105; CHECK: # %bb.0: 1106; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma 1107; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t 1108; CHECK-NEXT: ret 1109 %elt.head = insertelement <vscale x 2 x i32> poison, i32 %b, i32 0 1110 %vb = shufflevector <vscale x 2 x i32> %elt.head, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer 1111 %v = call <vscale x 2 x i32> @llvm.vp.sadd.sat.nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i32> %vb, <vscale x 2 x i1> %m, i32 %evl) 1112 ret <vscale x 2 x i32> %v 1113} 1114 1115define <vscale x 2 x i32> @vsadd_vx_nxv2i32_unmasked(<vscale x 2 x i32> %va, i32 %b, i32 zeroext %evl) { 1116; CHECK-LABEL: vsadd_vx_nxv2i32_unmasked: 1117; CHECK: # %bb.0: 1118; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma 1119; CHECK-NEXT: vsadd.vx v8, v8, a0 1120; CHECK-NEXT: ret 1121 %elt.head = insertelement <vscale x 2 x i32> poison, i32 %b, i32 0 1122 %vb = shufflevector <vscale x 2 x i32> %elt.head, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer 1123 %v = call <vscale x 2 x i32> @llvm.vp.sadd.sat.nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i32> %vb, <vscale x 2 x i1> splat (i1 true), i32 %evl) 1124 ret <vscale x 2 x i32> %v 1125} 1126 1127define <vscale x 2 x i32> @vsadd_vi_nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i1> %m, i32 zeroext %evl) { 1128; CHECK-LABEL: vsadd_vi_nxv2i32: 1129; CHECK: # %bb.0: 1130; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma 1131; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t 1132; CHECK-NEXT: ret 1133 %v = call <vscale x 2 x i32> @llvm.vp.sadd.sat.nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i32> splat (i32 -1), <vscale x 2 x i1> %m, i32 %evl) 1134 ret <vscale x 2 x i32> %v 1135} 1136 1137define <vscale x 2 x i32> @vsadd_vi_nxv2i32_unmasked(<vscale x 2 x i32> %va, i32 zeroext %evl) { 1138; CHECK-LABEL: vsadd_vi_nxv2i32_unmasked: 1139; CHECK: # %bb.0: 1140; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma 1141; CHECK-NEXT: vsadd.vi v8, v8, -1 1142; CHECK-NEXT: ret 1143 %v = call <vscale x 2 x i32> @llvm.vp.sadd.sat.nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i32> splat (i32 -1), <vscale x 2 x i1> splat (i1 true), i32 %evl) 1144 ret <vscale x 2 x i32> %v 1145} 1146 1147declare <vscale x 4 x i32> @llvm.vp.sadd.sat.nxv4i32(<vscale x 4 x i32>, <vscale x 4 x i32>, <vscale x 4 x i1>, i32) 1148 1149define <vscale x 4 x i32> @vsadd_vv_nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i32> %b, <vscale x 4 x i1> %m, i32 zeroext %evl) { 1150; CHECK-LABEL: vsadd_vv_nxv4i32: 1151; CHECK: # %bb.0: 1152; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1153; CHECK-NEXT: vsadd.vv v8, v8, v10, v0.t 1154; CHECK-NEXT: ret 1155 %v = call <vscale x 4 x i32> @llvm.vp.sadd.sat.nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i32> %b, <vscale x 4 x i1> %m, i32 %evl) 1156 ret <vscale x 4 x i32> %v 1157} 1158 1159define <vscale x 4 x i32> @vsadd_vv_nxv4i32_unmasked(<vscale x 4 x i32> %va, <vscale x 4 x i32> %b, i32 zeroext %evl) { 1160; CHECK-LABEL: vsadd_vv_nxv4i32_unmasked: 1161; CHECK: # %bb.0: 1162; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1163; CHECK-NEXT: vsadd.vv v8, v8, v10 1164; CHECK-NEXT: ret 1165 %v = call <vscale x 4 x i32> @llvm.vp.sadd.sat.nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i32> %b, <vscale x 4 x i1> splat (i1 true), i32 %evl) 1166 ret <vscale x 4 x i32> %v 1167} 1168 1169define <vscale x 4 x i32> @vsadd_vx_nxv4i32(<vscale x 4 x i32> %va, i32 %b, <vscale x 4 x i1> %m, i32 zeroext %evl) { 1170; CHECK-LABEL: vsadd_vx_nxv4i32: 1171; CHECK: # %bb.0: 1172; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, ma 1173; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t 1174; CHECK-NEXT: ret 1175 %elt.head = insertelement <vscale x 4 x i32> poison, i32 %b, i32 0 1176 %vb = shufflevector <vscale x 4 x i32> %elt.head, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer 1177 %v = call <vscale x 4 x i32> @llvm.vp.sadd.sat.nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i32> %vb, <vscale x 4 x i1> %m, i32 %evl) 1178 ret <vscale x 4 x i32> %v 1179} 1180 1181define <vscale x 4 x i32> @vsadd_vx_nxv4i32_unmasked(<vscale x 4 x i32> %va, i32 %b, i32 zeroext %evl) { 1182; CHECK-LABEL: vsadd_vx_nxv4i32_unmasked: 1183; CHECK: # %bb.0: 1184; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, ma 1185; CHECK-NEXT: vsadd.vx v8, v8, a0 1186; CHECK-NEXT: ret 1187 %elt.head = insertelement <vscale x 4 x i32> poison, i32 %b, i32 0 1188 %vb = shufflevector <vscale x 4 x i32> %elt.head, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer 1189 %v = call <vscale x 4 x i32> @llvm.vp.sadd.sat.nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i32> %vb, <vscale x 4 x i1> splat (i1 true), i32 %evl) 1190 ret <vscale x 4 x i32> %v 1191} 1192 1193define <vscale x 4 x i32> @vsadd_vi_nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i1> %m, i32 zeroext %evl) { 1194; CHECK-LABEL: vsadd_vi_nxv4i32: 1195; CHECK: # %bb.0: 1196; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1197; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t 1198; CHECK-NEXT: ret 1199 %v = call <vscale x 4 x i32> @llvm.vp.sadd.sat.nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i32> splat (i32 -1), <vscale x 4 x i1> %m, i32 %evl) 1200 ret <vscale x 4 x i32> %v 1201} 1202 1203define <vscale x 4 x i32> @vsadd_vi_nxv4i32_unmasked(<vscale x 4 x i32> %va, i32 zeroext %evl) { 1204; CHECK-LABEL: vsadd_vi_nxv4i32_unmasked: 1205; CHECK: # %bb.0: 1206; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma 1207; CHECK-NEXT: vsadd.vi v8, v8, -1 1208; CHECK-NEXT: ret 1209 %v = call <vscale x 4 x i32> @llvm.vp.sadd.sat.nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i32> splat (i32 -1), <vscale x 4 x i1> splat (i1 true), i32 %evl) 1210 ret <vscale x 4 x i32> %v 1211} 1212 1213declare <vscale x 8 x i32> @llvm.vp.sadd.sat.nxv8i32(<vscale x 8 x i32>, <vscale x 8 x i32>, <vscale x 8 x i1>, i32) 1214 1215define <vscale x 8 x i32> @vsadd_vv_nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i32> %b, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1216; CHECK-LABEL: vsadd_vv_nxv8i32: 1217; CHECK: # %bb.0: 1218; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma 1219; CHECK-NEXT: vsadd.vv v8, v8, v12, v0.t 1220; CHECK-NEXT: ret 1221 %v = call <vscale x 8 x i32> @llvm.vp.sadd.sat.nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i32> %b, <vscale x 8 x i1> %m, i32 %evl) 1222 ret <vscale x 8 x i32> %v 1223} 1224 1225define <vscale x 8 x i32> @vsadd_vv_nxv8i32_unmasked(<vscale x 8 x i32> %va, <vscale x 8 x i32> %b, i32 zeroext %evl) { 1226; CHECK-LABEL: vsadd_vv_nxv8i32_unmasked: 1227; CHECK: # %bb.0: 1228; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma 1229; CHECK-NEXT: vsadd.vv v8, v8, v12 1230; CHECK-NEXT: ret 1231 %v = call <vscale x 8 x i32> @llvm.vp.sadd.sat.nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i32> %b, <vscale x 8 x i1> splat (i1 true), i32 %evl) 1232 ret <vscale x 8 x i32> %v 1233} 1234 1235define <vscale x 8 x i32> @vsadd_vx_nxv8i32(<vscale x 8 x i32> %va, i32 %b, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1236; CHECK-LABEL: vsadd_vx_nxv8i32: 1237; CHECK: # %bb.0: 1238; CHECK-NEXT: vsetvli zero, a1, e32, m4, ta, ma 1239; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t 1240; CHECK-NEXT: ret 1241 %elt.head = insertelement <vscale x 8 x i32> poison, i32 %b, i32 0 1242 %vb = shufflevector <vscale x 8 x i32> %elt.head, <vscale x 8 x i32> poison, <vscale x 8 x i32> zeroinitializer 1243 %v = call <vscale x 8 x i32> @llvm.vp.sadd.sat.nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i32> %vb, <vscale x 8 x i1> %m, i32 %evl) 1244 ret <vscale x 8 x i32> %v 1245} 1246 1247define <vscale x 8 x i32> @vsadd_vx_nxv8i32_unmasked(<vscale x 8 x i32> %va, i32 %b, i32 zeroext %evl) { 1248; CHECK-LABEL: vsadd_vx_nxv8i32_unmasked: 1249; CHECK: # %bb.0: 1250; CHECK-NEXT: vsetvli zero, a1, e32, m4, ta, ma 1251; CHECK-NEXT: vsadd.vx v8, v8, a0 1252; CHECK-NEXT: ret 1253 %elt.head = insertelement <vscale x 8 x i32> poison, i32 %b, i32 0 1254 %vb = shufflevector <vscale x 8 x i32> %elt.head, <vscale x 8 x i32> poison, <vscale x 8 x i32> zeroinitializer 1255 %v = call <vscale x 8 x i32> @llvm.vp.sadd.sat.nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i32> %vb, <vscale x 8 x i1> splat (i1 true), i32 %evl) 1256 ret <vscale x 8 x i32> %v 1257} 1258 1259define <vscale x 8 x i32> @vsadd_vi_nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1260; CHECK-LABEL: vsadd_vi_nxv8i32: 1261; CHECK: # %bb.0: 1262; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma 1263; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t 1264; CHECK-NEXT: ret 1265 %v = call <vscale x 8 x i32> @llvm.vp.sadd.sat.nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i32> splat (i32 -1), <vscale x 8 x i1> %m, i32 %evl) 1266 ret <vscale x 8 x i32> %v 1267} 1268 1269define <vscale x 8 x i32> @vsadd_vi_nxv8i32_unmasked(<vscale x 8 x i32> %va, i32 zeroext %evl) { 1270; CHECK-LABEL: vsadd_vi_nxv8i32_unmasked: 1271; CHECK: # %bb.0: 1272; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma 1273; CHECK-NEXT: vsadd.vi v8, v8, -1 1274; CHECK-NEXT: ret 1275 %v = call <vscale x 8 x i32> @llvm.vp.sadd.sat.nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i32> splat (i32 -1), <vscale x 8 x i1> splat (i1 true), i32 %evl) 1276 ret <vscale x 8 x i32> %v 1277} 1278 1279declare <vscale x 16 x i32> @llvm.vp.sadd.sat.nxv16i32(<vscale x 16 x i32>, <vscale x 16 x i32>, <vscale x 16 x i1>, i32) 1280 1281define <vscale x 16 x i32> @vsadd_vv_nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i32> %b, <vscale x 16 x i1> %m, i32 zeroext %evl) { 1282; CHECK-LABEL: vsadd_vv_nxv16i32: 1283; CHECK: # %bb.0: 1284; CHECK-NEXT: vsetvli zero, a0, e32, m8, ta, ma 1285; CHECK-NEXT: vsadd.vv v8, v8, v16, v0.t 1286; CHECK-NEXT: ret 1287 %v = call <vscale x 16 x i32> @llvm.vp.sadd.sat.nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i32> %b, <vscale x 16 x i1> %m, i32 %evl) 1288 ret <vscale x 16 x i32> %v 1289} 1290 1291define <vscale x 16 x i32> @vsadd_vv_nxv16i32_unmasked(<vscale x 16 x i32> %va, <vscale x 16 x i32> %b, i32 zeroext %evl) { 1292; CHECK-LABEL: vsadd_vv_nxv16i32_unmasked: 1293; CHECK: # %bb.0: 1294; CHECK-NEXT: vsetvli zero, a0, e32, m8, ta, ma 1295; CHECK-NEXT: vsadd.vv v8, v8, v16 1296; CHECK-NEXT: ret 1297 %v = call <vscale x 16 x i32> @llvm.vp.sadd.sat.nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i32> %b, <vscale x 16 x i1> splat (i1 true), i32 %evl) 1298 ret <vscale x 16 x i32> %v 1299} 1300 1301define <vscale x 16 x i32> @vsadd_vx_nxv16i32(<vscale x 16 x i32> %va, i32 %b, <vscale x 16 x i1> %m, i32 zeroext %evl) { 1302; CHECK-LABEL: vsadd_vx_nxv16i32: 1303; CHECK: # %bb.0: 1304; CHECK-NEXT: vsetvli zero, a1, e32, m8, ta, ma 1305; CHECK-NEXT: vsadd.vx v8, v8, a0, v0.t 1306; CHECK-NEXT: ret 1307 %elt.head = insertelement <vscale x 16 x i32> poison, i32 %b, i32 0 1308 %vb = shufflevector <vscale x 16 x i32> %elt.head, <vscale x 16 x i32> poison, <vscale x 16 x i32> zeroinitializer 1309 %v = call <vscale x 16 x i32> @llvm.vp.sadd.sat.nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i32> %vb, <vscale x 16 x i1> %m, i32 %evl) 1310 ret <vscale x 16 x i32> %v 1311} 1312 1313define <vscale x 16 x i32> @vsadd_vx_nxv16i32_unmasked(<vscale x 16 x i32> %va, i32 %b, i32 zeroext %evl) { 1314; CHECK-LABEL: vsadd_vx_nxv16i32_unmasked: 1315; CHECK: # %bb.0: 1316; CHECK-NEXT: vsetvli zero, a1, e32, m8, ta, ma 1317; CHECK-NEXT: vsadd.vx v8, v8, a0 1318; CHECK-NEXT: ret 1319 %elt.head = insertelement <vscale x 16 x i32> poison, i32 %b, i32 0 1320 %vb = shufflevector <vscale x 16 x i32> %elt.head, <vscale x 16 x i32> poison, <vscale x 16 x i32> zeroinitializer 1321 %v = call <vscale x 16 x i32> @llvm.vp.sadd.sat.nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i32> %vb, <vscale x 16 x i1> splat (i1 true), i32 %evl) 1322 ret <vscale x 16 x i32> %v 1323} 1324 1325define <vscale x 16 x i32> @vsadd_vi_nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i1> %m, i32 zeroext %evl) { 1326; CHECK-LABEL: vsadd_vi_nxv16i32: 1327; CHECK: # %bb.0: 1328; CHECK-NEXT: vsetvli zero, a0, e32, m8, ta, ma 1329; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t 1330; CHECK-NEXT: ret 1331 %v = call <vscale x 16 x i32> @llvm.vp.sadd.sat.nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i32> splat (i32 -1), <vscale x 16 x i1> %m, i32 %evl) 1332 ret <vscale x 16 x i32> %v 1333} 1334 1335define <vscale x 16 x i32> @vsadd_vi_nxv16i32_unmasked(<vscale x 16 x i32> %va, i32 zeroext %evl) { 1336; CHECK-LABEL: vsadd_vi_nxv16i32_unmasked: 1337; CHECK: # %bb.0: 1338; CHECK-NEXT: vsetvli zero, a0, e32, m8, ta, ma 1339; CHECK-NEXT: vsadd.vi v8, v8, -1 1340; CHECK-NEXT: ret 1341 %v = call <vscale x 16 x i32> @llvm.vp.sadd.sat.nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i32> splat (i32 -1), <vscale x 16 x i1> splat (i1 true), i32 %evl) 1342 ret <vscale x 16 x i32> %v 1343} 1344 1345; Test that split-legalization works then the mask needs manual splitting. 1346 1347declare <vscale x 32 x i32> @llvm.vp.sadd.sat.nxv32i32(<vscale x 32 x i32>, <vscale x 32 x i32>, <vscale x 32 x i1>, i32) 1348 1349define <vscale x 32 x i32> @vsadd_vi_nxv32i32(<vscale x 32 x i32> %va, <vscale x 32 x i1> %m, i32 zeroext %evl) { 1350; CHECK-LABEL: vsadd_vi_nxv32i32: 1351; CHECK: # %bb.0: 1352; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma 1353; CHECK-NEXT: vmv1r.v v24, v0 1354; CHECK-NEXT: csrr a1, vlenb 1355; CHECK-NEXT: srli a2, a1, 2 1356; CHECK-NEXT: slli a1, a1, 1 1357; CHECK-NEXT: vslidedown.vx v0, v0, a2 1358; CHECK-NEXT: sub a2, a0, a1 1359; CHECK-NEXT: sltu a3, a0, a2 1360; CHECK-NEXT: addi a3, a3, -1 1361; CHECK-NEXT: and a2, a3, a2 1362; CHECK-NEXT: vsetvli zero, a2, e32, m8, ta, ma 1363; CHECK-NEXT: vsadd.vi v16, v16, -1, v0.t 1364; CHECK-NEXT: bltu a0, a1, .LBB118_2 1365; CHECK-NEXT: # %bb.1: 1366; CHECK-NEXT: mv a0, a1 1367; CHECK-NEXT: .LBB118_2: 1368; CHECK-NEXT: vmv1r.v v0, v24 1369; CHECK-NEXT: vsetvli zero, a0, e32, m8, ta, ma 1370; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t 1371; CHECK-NEXT: ret 1372 %v = call <vscale x 32 x i32> @llvm.vp.sadd.sat.nxv32i32(<vscale x 32 x i32> %va, <vscale x 32 x i32> splat (i32 -1), <vscale x 32 x i1> %m, i32 %evl) 1373 ret <vscale x 32 x i32> %v 1374} 1375 1376define <vscale x 32 x i32> @vsadd_vi_nxv32i32_unmasked(<vscale x 32 x i32> %va, i32 zeroext %evl) { 1377; CHECK-LABEL: vsadd_vi_nxv32i32_unmasked: 1378; CHECK: # %bb.0: 1379; CHECK-NEXT: csrr a1, vlenb 1380; CHECK-NEXT: slli a1, a1, 1 1381; CHECK-NEXT: sub a2, a0, a1 1382; CHECK-NEXT: sltu a3, a0, a2 1383; CHECK-NEXT: addi a3, a3, -1 1384; CHECK-NEXT: and a2, a3, a2 1385; CHECK-NEXT: vsetvli zero, a2, e32, m8, ta, ma 1386; CHECK-NEXT: vsadd.vi v16, v16, -1 1387; CHECK-NEXT: bltu a0, a1, .LBB119_2 1388; CHECK-NEXT: # %bb.1: 1389; CHECK-NEXT: mv a0, a1 1390; CHECK-NEXT: .LBB119_2: 1391; CHECK-NEXT: vsetvli zero, a0, e32, m8, ta, ma 1392; CHECK-NEXT: vsadd.vi v8, v8, -1 1393; CHECK-NEXT: ret 1394 %v = call <vscale x 32 x i32> @llvm.vp.sadd.sat.nxv32i32(<vscale x 32 x i32> %va, <vscale x 32 x i32> splat (i32 -1), <vscale x 32 x i1> splat (i1 true), i32 %evl) 1395 ret <vscale x 32 x i32> %v 1396} 1397 1398declare <vscale x 1 x i64> @llvm.vp.sadd.sat.nxv1i64(<vscale x 1 x i64>, <vscale x 1 x i64>, <vscale x 1 x i1>, i32) 1399 1400define <vscale x 1 x i64> @vsadd_vv_nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i64> %b, <vscale x 1 x i1> %m, i32 zeroext %evl) { 1401; CHECK-LABEL: vsadd_vv_nxv1i64: 1402; CHECK: # %bb.0: 1403; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma 1404; CHECK-NEXT: vsadd.vv v8, v8, v9, v0.t 1405; CHECK-NEXT: ret 1406 %v = call <vscale x 1 x i64> @llvm.vp.sadd.sat.nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i64> %b, <vscale x 1 x i1> %m, i32 %evl) 1407 ret <vscale x 1 x i64> %v 1408} 1409 1410define <vscale x 1 x i64> @vsadd_vv_nxv1i64_unmasked(<vscale x 1 x i64> %va, <vscale x 1 x i64> %b, i32 zeroext %evl) { 1411; CHECK-LABEL: vsadd_vv_nxv1i64_unmasked: 1412; CHECK: # %bb.0: 1413; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma 1414; CHECK-NEXT: vsadd.vv v8, v8, v9 1415; CHECK-NEXT: ret 1416 %v = call <vscale x 1 x i64> @llvm.vp.sadd.sat.nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i64> %b, <vscale x 1 x i1> splat (i1 true), i32 %evl) 1417 ret <vscale x 1 x i64> %v 1418} 1419 1420define <vscale x 1 x i64> @vsadd_vx_nxv1i64(<vscale x 1 x i64> %va, i64 %b, <vscale x 1 x i1> %m, i32 zeroext %evl) { 1421; RV32-LABEL: vsadd_vx_nxv1i64: 1422; RV32: # %bb.0: 1423; RV32-NEXT: addi sp, sp, -16 1424; RV32-NEXT: .cfi_def_cfa_offset 16 1425; RV32-NEXT: sw a0, 8(sp) 1426; RV32-NEXT: sw a1, 12(sp) 1427; RV32-NEXT: addi a0, sp, 8 1428; RV32-NEXT: vsetvli zero, a2, e64, m1, ta, ma 1429; RV32-NEXT: vlse64.v v9, (a0), zero 1430; RV32-NEXT: vsadd.vv v8, v8, v9, v0.t 1431; RV32-NEXT: addi sp, sp, 16 1432; RV32-NEXT: .cfi_def_cfa_offset 0 1433; RV32-NEXT: ret 1434; 1435; RV64-LABEL: vsadd_vx_nxv1i64: 1436; RV64: # %bb.0: 1437; RV64-NEXT: vsetvli zero, a1, e64, m1, ta, ma 1438; RV64-NEXT: vsadd.vx v8, v8, a0, v0.t 1439; RV64-NEXT: ret 1440 %elt.head = insertelement <vscale x 1 x i64> poison, i64 %b, i32 0 1441 %vb = shufflevector <vscale x 1 x i64> %elt.head, <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer 1442 %v = call <vscale x 1 x i64> @llvm.vp.sadd.sat.nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i64> %vb, <vscale x 1 x i1> %m, i32 %evl) 1443 ret <vscale x 1 x i64> %v 1444} 1445 1446define <vscale x 1 x i64> @vsadd_vx_nxv1i64_unmasked(<vscale x 1 x i64> %va, i64 %b, i32 zeroext %evl) { 1447; RV32-LABEL: vsadd_vx_nxv1i64_unmasked: 1448; RV32: # %bb.0: 1449; RV32-NEXT: addi sp, sp, -16 1450; RV32-NEXT: .cfi_def_cfa_offset 16 1451; RV32-NEXT: sw a0, 8(sp) 1452; RV32-NEXT: sw a1, 12(sp) 1453; RV32-NEXT: addi a0, sp, 8 1454; RV32-NEXT: vsetvli zero, a2, e64, m1, ta, ma 1455; RV32-NEXT: vlse64.v v9, (a0), zero 1456; RV32-NEXT: vsadd.vv v8, v8, v9 1457; RV32-NEXT: addi sp, sp, 16 1458; RV32-NEXT: .cfi_def_cfa_offset 0 1459; RV32-NEXT: ret 1460; 1461; RV64-LABEL: vsadd_vx_nxv1i64_unmasked: 1462; RV64: # %bb.0: 1463; RV64-NEXT: vsetvli zero, a1, e64, m1, ta, ma 1464; RV64-NEXT: vsadd.vx v8, v8, a0 1465; RV64-NEXT: ret 1466 %elt.head = insertelement <vscale x 1 x i64> poison, i64 %b, i32 0 1467 %vb = shufflevector <vscale x 1 x i64> %elt.head, <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer 1468 %v = call <vscale x 1 x i64> @llvm.vp.sadd.sat.nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i64> %vb, <vscale x 1 x i1> splat (i1 true), i32 %evl) 1469 ret <vscale x 1 x i64> %v 1470} 1471 1472define <vscale x 1 x i64> @vsadd_vi_nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i1> %m, i32 zeroext %evl) { 1473; CHECK-LABEL: vsadd_vi_nxv1i64: 1474; CHECK: # %bb.0: 1475; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma 1476; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t 1477; CHECK-NEXT: ret 1478 %v = call <vscale x 1 x i64> @llvm.vp.sadd.sat.nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i64> splat (i64 -1), <vscale x 1 x i1> %m, i32 %evl) 1479 ret <vscale x 1 x i64> %v 1480} 1481 1482define <vscale x 1 x i64> @vsadd_vi_nxv1i64_unmasked(<vscale x 1 x i64> %va, i32 zeroext %evl) { 1483; CHECK-LABEL: vsadd_vi_nxv1i64_unmasked: 1484; CHECK: # %bb.0: 1485; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma 1486; CHECK-NEXT: vsadd.vi v8, v8, -1 1487; CHECK-NEXT: ret 1488 %v = call <vscale x 1 x i64> @llvm.vp.sadd.sat.nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i64> splat (i64 -1), <vscale x 1 x i1> splat (i1 true), i32 %evl) 1489 ret <vscale x 1 x i64> %v 1490} 1491 1492declare <vscale x 2 x i64> @llvm.vp.sadd.sat.nxv2i64(<vscale x 2 x i64>, <vscale x 2 x i64>, <vscale x 2 x i1>, i32) 1493 1494define <vscale x 2 x i64> @vsadd_vv_nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i64> %b, <vscale x 2 x i1> %m, i32 zeroext %evl) { 1495; CHECK-LABEL: vsadd_vv_nxv2i64: 1496; CHECK: # %bb.0: 1497; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma 1498; CHECK-NEXT: vsadd.vv v8, v8, v10, v0.t 1499; CHECK-NEXT: ret 1500 %v = call <vscale x 2 x i64> @llvm.vp.sadd.sat.nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i64> %b, <vscale x 2 x i1> %m, i32 %evl) 1501 ret <vscale x 2 x i64> %v 1502} 1503 1504define <vscale x 2 x i64> @vsadd_vv_nxv2i64_unmasked(<vscale x 2 x i64> %va, <vscale x 2 x i64> %b, i32 zeroext %evl) { 1505; CHECK-LABEL: vsadd_vv_nxv2i64_unmasked: 1506; CHECK: # %bb.0: 1507; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma 1508; CHECK-NEXT: vsadd.vv v8, v8, v10 1509; CHECK-NEXT: ret 1510 %v = call <vscale x 2 x i64> @llvm.vp.sadd.sat.nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i64> %b, <vscale x 2 x i1> splat (i1 true), i32 %evl) 1511 ret <vscale x 2 x i64> %v 1512} 1513 1514define <vscale x 2 x i64> @vsadd_vx_nxv2i64(<vscale x 2 x i64> %va, i64 %b, <vscale x 2 x i1> %m, i32 zeroext %evl) { 1515; RV32-LABEL: vsadd_vx_nxv2i64: 1516; RV32: # %bb.0: 1517; RV32-NEXT: addi sp, sp, -16 1518; RV32-NEXT: .cfi_def_cfa_offset 16 1519; RV32-NEXT: sw a0, 8(sp) 1520; RV32-NEXT: sw a1, 12(sp) 1521; RV32-NEXT: addi a0, sp, 8 1522; RV32-NEXT: vsetvli zero, a2, e64, m2, ta, ma 1523; RV32-NEXT: vlse64.v v10, (a0), zero 1524; RV32-NEXT: vsadd.vv v8, v8, v10, v0.t 1525; RV32-NEXT: addi sp, sp, 16 1526; RV32-NEXT: .cfi_def_cfa_offset 0 1527; RV32-NEXT: ret 1528; 1529; RV64-LABEL: vsadd_vx_nxv2i64: 1530; RV64: # %bb.0: 1531; RV64-NEXT: vsetvli zero, a1, e64, m2, ta, ma 1532; RV64-NEXT: vsadd.vx v8, v8, a0, v0.t 1533; RV64-NEXT: ret 1534 %elt.head = insertelement <vscale x 2 x i64> poison, i64 %b, i32 0 1535 %vb = shufflevector <vscale x 2 x i64> %elt.head, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer 1536 %v = call <vscale x 2 x i64> @llvm.vp.sadd.sat.nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i64> %vb, <vscale x 2 x i1> %m, i32 %evl) 1537 ret <vscale x 2 x i64> %v 1538} 1539 1540define <vscale x 2 x i64> @vsadd_vx_nxv2i64_unmasked(<vscale x 2 x i64> %va, i64 %b, i32 zeroext %evl) { 1541; RV32-LABEL: vsadd_vx_nxv2i64_unmasked: 1542; RV32: # %bb.0: 1543; RV32-NEXT: addi sp, sp, -16 1544; RV32-NEXT: .cfi_def_cfa_offset 16 1545; RV32-NEXT: sw a0, 8(sp) 1546; RV32-NEXT: sw a1, 12(sp) 1547; RV32-NEXT: addi a0, sp, 8 1548; RV32-NEXT: vsetvli zero, a2, e64, m2, ta, ma 1549; RV32-NEXT: vlse64.v v10, (a0), zero 1550; RV32-NEXT: vsadd.vv v8, v8, v10 1551; RV32-NEXT: addi sp, sp, 16 1552; RV32-NEXT: .cfi_def_cfa_offset 0 1553; RV32-NEXT: ret 1554; 1555; RV64-LABEL: vsadd_vx_nxv2i64_unmasked: 1556; RV64: # %bb.0: 1557; RV64-NEXT: vsetvli zero, a1, e64, m2, ta, ma 1558; RV64-NEXT: vsadd.vx v8, v8, a0 1559; RV64-NEXT: ret 1560 %elt.head = insertelement <vscale x 2 x i64> poison, i64 %b, i32 0 1561 %vb = shufflevector <vscale x 2 x i64> %elt.head, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer 1562 %v = call <vscale x 2 x i64> @llvm.vp.sadd.sat.nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i64> %vb, <vscale x 2 x i1> splat (i1 true), i32 %evl) 1563 ret <vscale x 2 x i64> %v 1564} 1565 1566define <vscale x 2 x i64> @vsadd_vi_nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i1> %m, i32 zeroext %evl) { 1567; CHECK-LABEL: vsadd_vi_nxv2i64: 1568; CHECK: # %bb.0: 1569; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma 1570; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t 1571; CHECK-NEXT: ret 1572 %v = call <vscale x 2 x i64> @llvm.vp.sadd.sat.nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i64> splat (i64 -1), <vscale x 2 x i1> %m, i32 %evl) 1573 ret <vscale x 2 x i64> %v 1574} 1575 1576define <vscale x 2 x i64> @vsadd_vi_nxv2i64_unmasked(<vscale x 2 x i64> %va, i32 zeroext %evl) { 1577; CHECK-LABEL: vsadd_vi_nxv2i64_unmasked: 1578; CHECK: # %bb.0: 1579; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma 1580; CHECK-NEXT: vsadd.vi v8, v8, -1 1581; CHECK-NEXT: ret 1582 %v = call <vscale x 2 x i64> @llvm.vp.sadd.sat.nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i64> splat (i64 -1), <vscale x 2 x i1> splat (i1 true), i32 %evl) 1583 ret <vscale x 2 x i64> %v 1584} 1585 1586declare <vscale x 4 x i64> @llvm.vp.sadd.sat.nxv4i64(<vscale x 4 x i64>, <vscale x 4 x i64>, <vscale x 4 x i1>, i32) 1587 1588define <vscale x 4 x i64> @vsadd_vv_nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i64> %b, <vscale x 4 x i1> %m, i32 zeroext %evl) { 1589; CHECK-LABEL: vsadd_vv_nxv4i64: 1590; CHECK: # %bb.0: 1591; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma 1592; CHECK-NEXT: vsadd.vv v8, v8, v12, v0.t 1593; CHECK-NEXT: ret 1594 %v = call <vscale x 4 x i64> @llvm.vp.sadd.sat.nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i64> %b, <vscale x 4 x i1> %m, i32 %evl) 1595 ret <vscale x 4 x i64> %v 1596} 1597 1598define <vscale x 4 x i64> @vsadd_vv_nxv4i64_unmasked(<vscale x 4 x i64> %va, <vscale x 4 x i64> %b, i32 zeroext %evl) { 1599; CHECK-LABEL: vsadd_vv_nxv4i64_unmasked: 1600; CHECK: # %bb.0: 1601; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma 1602; CHECK-NEXT: vsadd.vv v8, v8, v12 1603; CHECK-NEXT: ret 1604 %v = call <vscale x 4 x i64> @llvm.vp.sadd.sat.nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i64> %b, <vscale x 4 x i1> splat (i1 true), i32 %evl) 1605 ret <vscale x 4 x i64> %v 1606} 1607 1608define <vscale x 4 x i64> @vsadd_vx_nxv4i64(<vscale x 4 x i64> %va, i64 %b, <vscale x 4 x i1> %m, i32 zeroext %evl) { 1609; RV32-LABEL: vsadd_vx_nxv4i64: 1610; RV32: # %bb.0: 1611; RV32-NEXT: addi sp, sp, -16 1612; RV32-NEXT: .cfi_def_cfa_offset 16 1613; RV32-NEXT: sw a0, 8(sp) 1614; RV32-NEXT: sw a1, 12(sp) 1615; RV32-NEXT: addi a0, sp, 8 1616; RV32-NEXT: vsetvli zero, a2, e64, m4, ta, ma 1617; RV32-NEXT: vlse64.v v12, (a0), zero 1618; RV32-NEXT: vsadd.vv v8, v8, v12, v0.t 1619; RV32-NEXT: addi sp, sp, 16 1620; RV32-NEXT: .cfi_def_cfa_offset 0 1621; RV32-NEXT: ret 1622; 1623; RV64-LABEL: vsadd_vx_nxv4i64: 1624; RV64: # %bb.0: 1625; RV64-NEXT: vsetvli zero, a1, e64, m4, ta, ma 1626; RV64-NEXT: vsadd.vx v8, v8, a0, v0.t 1627; RV64-NEXT: ret 1628 %elt.head = insertelement <vscale x 4 x i64> poison, i64 %b, i32 0 1629 %vb = shufflevector <vscale x 4 x i64> %elt.head, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer 1630 %v = call <vscale x 4 x i64> @llvm.vp.sadd.sat.nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i64> %vb, <vscale x 4 x i1> %m, i32 %evl) 1631 ret <vscale x 4 x i64> %v 1632} 1633 1634define <vscale x 4 x i64> @vsadd_vx_nxv4i64_unmasked(<vscale x 4 x i64> %va, i64 %b, i32 zeroext %evl) { 1635; RV32-LABEL: vsadd_vx_nxv4i64_unmasked: 1636; RV32: # %bb.0: 1637; RV32-NEXT: addi sp, sp, -16 1638; RV32-NEXT: .cfi_def_cfa_offset 16 1639; RV32-NEXT: sw a0, 8(sp) 1640; RV32-NEXT: sw a1, 12(sp) 1641; RV32-NEXT: addi a0, sp, 8 1642; RV32-NEXT: vsetvli zero, a2, e64, m4, ta, ma 1643; RV32-NEXT: vlse64.v v12, (a0), zero 1644; RV32-NEXT: vsadd.vv v8, v8, v12 1645; RV32-NEXT: addi sp, sp, 16 1646; RV32-NEXT: .cfi_def_cfa_offset 0 1647; RV32-NEXT: ret 1648; 1649; RV64-LABEL: vsadd_vx_nxv4i64_unmasked: 1650; RV64: # %bb.0: 1651; RV64-NEXT: vsetvli zero, a1, e64, m4, ta, ma 1652; RV64-NEXT: vsadd.vx v8, v8, a0 1653; RV64-NEXT: ret 1654 %elt.head = insertelement <vscale x 4 x i64> poison, i64 %b, i32 0 1655 %vb = shufflevector <vscale x 4 x i64> %elt.head, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer 1656 %v = call <vscale x 4 x i64> @llvm.vp.sadd.sat.nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i64> %vb, <vscale x 4 x i1> splat (i1 true), i32 %evl) 1657 ret <vscale x 4 x i64> %v 1658} 1659 1660define <vscale x 4 x i64> @vsadd_vi_nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i1> %m, i32 zeroext %evl) { 1661; CHECK-LABEL: vsadd_vi_nxv4i64: 1662; CHECK: # %bb.0: 1663; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma 1664; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t 1665; CHECK-NEXT: ret 1666 %v = call <vscale x 4 x i64> @llvm.vp.sadd.sat.nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i64> splat (i64 -1), <vscale x 4 x i1> %m, i32 %evl) 1667 ret <vscale x 4 x i64> %v 1668} 1669 1670define <vscale x 4 x i64> @vsadd_vi_nxv4i64_unmasked(<vscale x 4 x i64> %va, i32 zeroext %evl) { 1671; CHECK-LABEL: vsadd_vi_nxv4i64_unmasked: 1672; CHECK: # %bb.0: 1673; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma 1674; CHECK-NEXT: vsadd.vi v8, v8, -1 1675; CHECK-NEXT: ret 1676 %v = call <vscale x 4 x i64> @llvm.vp.sadd.sat.nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i64> splat (i64 -1), <vscale x 4 x i1> splat (i1 true), i32 %evl) 1677 ret <vscale x 4 x i64> %v 1678} 1679 1680declare <vscale x 8 x i64> @llvm.vp.sadd.sat.nxv8i64(<vscale x 8 x i64>, <vscale x 8 x i64>, <vscale x 8 x i1>, i32) 1681 1682define <vscale x 8 x i64> @vsadd_vv_nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i64> %b, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1683; CHECK-LABEL: vsadd_vv_nxv8i64: 1684; CHECK: # %bb.0: 1685; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma 1686; CHECK-NEXT: vsadd.vv v8, v8, v16, v0.t 1687; CHECK-NEXT: ret 1688 %v = call <vscale x 8 x i64> @llvm.vp.sadd.sat.nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i64> %b, <vscale x 8 x i1> %m, i32 %evl) 1689 ret <vscale x 8 x i64> %v 1690} 1691 1692define <vscale x 8 x i64> @vsadd_vv_nxv8i64_unmasked(<vscale x 8 x i64> %va, <vscale x 8 x i64> %b, i32 zeroext %evl) { 1693; CHECK-LABEL: vsadd_vv_nxv8i64_unmasked: 1694; CHECK: # %bb.0: 1695; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma 1696; CHECK-NEXT: vsadd.vv v8, v8, v16 1697; CHECK-NEXT: ret 1698 %v = call <vscale x 8 x i64> @llvm.vp.sadd.sat.nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i64> %b, <vscale x 8 x i1> splat (i1 true), i32 %evl) 1699 ret <vscale x 8 x i64> %v 1700} 1701 1702define <vscale x 8 x i64> @vsadd_vx_nxv8i64(<vscale x 8 x i64> %va, i64 %b, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1703; RV32-LABEL: vsadd_vx_nxv8i64: 1704; RV32: # %bb.0: 1705; RV32-NEXT: addi sp, sp, -16 1706; RV32-NEXT: .cfi_def_cfa_offset 16 1707; RV32-NEXT: sw a0, 8(sp) 1708; RV32-NEXT: sw a1, 12(sp) 1709; RV32-NEXT: addi a0, sp, 8 1710; RV32-NEXT: vsetvli zero, a2, e64, m8, ta, ma 1711; RV32-NEXT: vlse64.v v16, (a0), zero 1712; RV32-NEXT: vsadd.vv v8, v8, v16, v0.t 1713; RV32-NEXT: addi sp, sp, 16 1714; RV32-NEXT: .cfi_def_cfa_offset 0 1715; RV32-NEXT: ret 1716; 1717; RV64-LABEL: vsadd_vx_nxv8i64: 1718; RV64: # %bb.0: 1719; RV64-NEXT: vsetvli zero, a1, e64, m8, ta, ma 1720; RV64-NEXT: vsadd.vx v8, v8, a0, v0.t 1721; RV64-NEXT: ret 1722 %elt.head = insertelement <vscale x 8 x i64> poison, i64 %b, i32 0 1723 %vb = shufflevector <vscale x 8 x i64> %elt.head, <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer 1724 %v = call <vscale x 8 x i64> @llvm.vp.sadd.sat.nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i64> %vb, <vscale x 8 x i1> %m, i32 %evl) 1725 ret <vscale x 8 x i64> %v 1726} 1727 1728define <vscale x 8 x i64> @vsadd_vx_nxv8i64_unmasked(<vscale x 8 x i64> %va, i64 %b, i32 zeroext %evl) { 1729; RV32-LABEL: vsadd_vx_nxv8i64_unmasked: 1730; RV32: # %bb.0: 1731; RV32-NEXT: addi sp, sp, -16 1732; RV32-NEXT: .cfi_def_cfa_offset 16 1733; RV32-NEXT: sw a0, 8(sp) 1734; RV32-NEXT: sw a1, 12(sp) 1735; RV32-NEXT: addi a0, sp, 8 1736; RV32-NEXT: vsetvli zero, a2, e64, m8, ta, ma 1737; RV32-NEXT: vlse64.v v16, (a0), zero 1738; RV32-NEXT: vsadd.vv v8, v8, v16 1739; RV32-NEXT: addi sp, sp, 16 1740; RV32-NEXT: .cfi_def_cfa_offset 0 1741; RV32-NEXT: ret 1742; 1743; RV64-LABEL: vsadd_vx_nxv8i64_unmasked: 1744; RV64: # %bb.0: 1745; RV64-NEXT: vsetvli zero, a1, e64, m8, ta, ma 1746; RV64-NEXT: vsadd.vx v8, v8, a0 1747; RV64-NEXT: ret 1748 %elt.head = insertelement <vscale x 8 x i64> poison, i64 %b, i32 0 1749 %vb = shufflevector <vscale x 8 x i64> %elt.head, <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer 1750 %v = call <vscale x 8 x i64> @llvm.vp.sadd.sat.nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i64> %vb, <vscale x 8 x i1> splat (i1 true), i32 %evl) 1751 ret <vscale x 8 x i64> %v 1752} 1753 1754define <vscale x 8 x i64> @vsadd_vi_nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i1> %m, i32 zeroext %evl) { 1755; CHECK-LABEL: vsadd_vi_nxv8i64: 1756; CHECK: # %bb.0: 1757; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma 1758; CHECK-NEXT: vsadd.vi v8, v8, -1, v0.t 1759; CHECK-NEXT: ret 1760 %v = call <vscale x 8 x i64> @llvm.vp.sadd.sat.nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i64> splat (i64 -1), <vscale x 8 x i1> %m, i32 %evl) 1761 ret <vscale x 8 x i64> %v 1762} 1763 1764define <vscale x 8 x i64> @vsadd_vi_nxv8i64_unmasked(<vscale x 8 x i64> %va, i32 zeroext %evl) { 1765; CHECK-LABEL: vsadd_vi_nxv8i64_unmasked: 1766; CHECK: # %bb.0: 1767; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma 1768; CHECK-NEXT: vsadd.vi v8, v8, -1 1769; CHECK-NEXT: ret 1770 %v = call <vscale x 8 x i64> @llvm.vp.sadd.sat.nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i64> splat (i64 -1), <vscale x 8 x i1> splat (i1 true), i32 %evl) 1771 ret <vscale x 8 x i64> %v 1772} 1773