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 <8 x i7> @llvm.vp.add.v8i7(<8 x i7>, <8 x i7>, <8 x i1>, i32) 8 9define <8 x i7> @vadd_vv_v8i7(<8 x i7> %va, <8 x i7> %b, <8 x i1> %m, i32 zeroext %evl) { 10; CHECK-LABEL: vadd_vv_v8i7: 11; CHECK: # %bb.0: 12; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 13; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t 14; CHECK-NEXT: ret 15 %v = call <8 x i7> @llvm.vp.add.v8i7(<8 x i7> %va, <8 x i7> %b, <8 x i1> %m, i32 %evl) 16 ret <8 x i7> %v 17} 18 19declare <2 x i8> @llvm.vp.add.v2i8(<2 x i8>, <2 x i8>, <2 x i1>, i32) 20 21define <2 x i8> @vadd_vv_v2i8(<2 x i8> %va, <2 x i8> %b, <2 x i1> %m, i32 zeroext %evl) { 22; CHECK-LABEL: vadd_vv_v2i8: 23; CHECK: # %bb.0: 24; CHECK-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 25; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t 26; CHECK-NEXT: ret 27 %v = call <2 x i8> @llvm.vp.add.v2i8(<2 x i8> %va, <2 x i8> %b, <2 x i1> %m, i32 %evl) 28 ret <2 x i8> %v 29} 30 31define <2 x i8> @vadd_vv_v2i8_unmasked(<2 x i8> %va, <2 x i8> %b, i32 zeroext %evl) { 32; CHECK-LABEL: vadd_vv_v2i8_unmasked: 33; CHECK: # %bb.0: 34; CHECK-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 35; CHECK-NEXT: vadd.vv v8, v8, v9 36; CHECK-NEXT: ret 37 %v = call <2 x i8> @llvm.vp.add.v2i8(<2 x i8> %va, <2 x i8> %b, <2 x i1> splat (i1 true), i32 %evl) 38 ret <2 x i8> %v 39} 40 41define <2 x i8> @vadd_vx_v2i8(<2 x i8> %va, i8 %b, <2 x i1> %m, i32 zeroext %evl) { 42; CHECK-LABEL: vadd_vx_v2i8: 43; CHECK: # %bb.0: 44; CHECK-NEXT: vsetvli zero, a1, e8, mf8, ta, ma 45; CHECK-NEXT: vadd.vx v8, v8, a0, v0.t 46; CHECK-NEXT: ret 47 %elt.head = insertelement <2 x i8> poison, i8 %b, i32 0 48 %vb = shufflevector <2 x i8> %elt.head, <2 x i8> poison, <2 x i32> zeroinitializer 49 %v = call <2 x i8> @llvm.vp.add.v2i8(<2 x i8> %va, <2 x i8> %vb, <2 x i1> %m, i32 %evl) 50 ret <2 x i8> %v 51} 52 53define <2 x i8> @vadd_vx_v2i8_unmasked(<2 x i8> %va, i8 %b, i32 zeroext %evl) { 54; CHECK-LABEL: vadd_vx_v2i8_unmasked: 55; CHECK: # %bb.0: 56; CHECK-NEXT: vsetvli zero, a1, e8, mf8, ta, ma 57; CHECK-NEXT: vadd.vx v8, v8, a0 58; CHECK-NEXT: ret 59 %elt.head = insertelement <2 x i8> poison, i8 %b, i32 0 60 %vb = shufflevector <2 x i8> %elt.head, <2 x i8> poison, <2 x i32> zeroinitializer 61 %v = call <2 x i8> @llvm.vp.add.v2i8(<2 x i8> %va, <2 x i8> %vb, <2 x i1> splat (i1 true), i32 %evl) 62 ret <2 x i8> %v 63} 64 65define <2 x i8> @vadd_vi_v2i8(<2 x i8> %va, <2 x i1> %m, i32 zeroext %evl) { 66; CHECK-LABEL: vadd_vi_v2i8: 67; CHECK: # %bb.0: 68; CHECK-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 69; CHECK-NEXT: vadd.vi v8, v8, -1, v0.t 70; CHECK-NEXT: ret 71 %v = call <2 x i8> @llvm.vp.add.v2i8(<2 x i8> %va, <2 x i8> splat (i8 -1), <2 x i1> %m, i32 %evl) 72 ret <2 x i8> %v 73} 74 75define <2 x i8> @vadd_vi_v2i8_unmasked(<2 x i8> %va, i32 zeroext %evl) { 76; CHECK-LABEL: vadd_vi_v2i8_unmasked: 77; CHECK: # %bb.0: 78; CHECK-NEXT: vsetvli zero, a0, e8, mf8, ta, ma 79; CHECK-NEXT: vadd.vi v8, v8, -1 80; CHECK-NEXT: ret 81 %v = call <2 x i8> @llvm.vp.add.v2i8(<2 x i8> %va, <2 x i8> splat (i8 -1), <2 x i1> splat (i1 true), i32 %evl) 82 ret <2 x i8> %v 83} 84 85declare <4 x i8> @llvm.vp.add.v4i8(<4 x i8>, <4 x i8>, <4 x i1>, i32) 86 87define <4 x i8> @vadd_vv_v4i8(<4 x i8> %va, <4 x i8> %b, <4 x i1> %m, i32 zeroext %evl) { 88; CHECK-LABEL: vadd_vv_v4i8: 89; CHECK: # %bb.0: 90; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma 91; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t 92; CHECK-NEXT: ret 93 %v = call <4 x i8> @llvm.vp.add.v4i8(<4 x i8> %va, <4 x i8> %b, <4 x i1> %m, i32 %evl) 94 ret <4 x i8> %v 95} 96 97define <4 x i8> @vadd_vv_v4i8_unmasked(<4 x i8> %va, <4 x i8> %b, i32 zeroext %evl) { 98; CHECK-LABEL: vadd_vv_v4i8_unmasked: 99; CHECK: # %bb.0: 100; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma 101; CHECK-NEXT: vadd.vv v8, v8, v9 102; CHECK-NEXT: ret 103 %v = call <4 x i8> @llvm.vp.add.v4i8(<4 x i8> %va, <4 x i8> %b, <4 x i1> splat (i1 true), i32 %evl) 104 ret <4 x i8> %v 105} 106 107define <4 x i8> @vadd_vx_v4i8(<4 x i8> %va, i8 %b, <4 x i1> %m, i32 zeroext %evl) { 108; CHECK-LABEL: vadd_vx_v4i8: 109; CHECK: # %bb.0: 110; CHECK-NEXT: vsetvli zero, a1, e8, mf4, ta, ma 111; CHECK-NEXT: vadd.vx v8, v8, a0, v0.t 112; CHECK-NEXT: ret 113 %elt.head = insertelement <4 x i8> poison, i8 %b, i32 0 114 %vb = shufflevector <4 x i8> %elt.head, <4 x i8> poison, <4 x i32> zeroinitializer 115 %v = call <4 x i8> @llvm.vp.add.v4i8(<4 x i8> %va, <4 x i8> %vb, <4 x i1> %m, i32 %evl) 116 ret <4 x i8> %v 117} 118 119define <4 x i8> @vadd_vx_v4i8_commute(<4 x i8> %va, i8 %b, <4 x i1> %m, i32 zeroext %evl) { 120; CHECK-LABEL: vadd_vx_v4i8_commute: 121; CHECK: # %bb.0: 122; CHECK-NEXT: vsetvli zero, a1, e8, mf4, ta, ma 123; CHECK-NEXT: vadd.vx v8, v8, a0, v0.t 124; CHECK-NEXT: ret 125 %elt.head = insertelement <4 x i8> poison, i8 %b, i32 0 126 %vb = shufflevector <4 x i8> %elt.head, <4 x i8> poison, <4 x i32> zeroinitializer 127 %v = call <4 x i8> @llvm.vp.add.v4i8(<4 x i8> %vb, <4 x i8> %va, <4 x i1> %m, i32 %evl) 128 ret <4 x i8> %v 129} 130 131define <4 x i8> @vadd_vx_v4i8_unmasked(<4 x i8> %va, i8 %b, i32 zeroext %evl) { 132; CHECK-LABEL: vadd_vx_v4i8_unmasked: 133; CHECK: # %bb.0: 134; CHECK-NEXT: vsetvli zero, a1, e8, mf4, ta, ma 135; CHECK-NEXT: vadd.vx v8, v8, a0 136; CHECK-NEXT: ret 137 %elt.head = insertelement <4 x i8> poison, i8 %b, i32 0 138 %vb = shufflevector <4 x i8> %elt.head, <4 x i8> poison, <4 x i32> zeroinitializer 139 %v = call <4 x i8> @llvm.vp.add.v4i8(<4 x i8> %va, <4 x i8> %vb, <4 x i1> splat (i1 true), i32 %evl) 140 ret <4 x i8> %v 141} 142 143define <4 x i8> @vadd_vi_v4i8(<4 x i8> %va, <4 x i1> %m, i32 zeroext %evl) { 144; CHECK-LABEL: vadd_vi_v4i8: 145; CHECK: # %bb.0: 146; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma 147; CHECK-NEXT: vadd.vi v8, v8, -1, v0.t 148; CHECK-NEXT: ret 149 %v = call <4 x i8> @llvm.vp.add.v4i8(<4 x i8> %va, <4 x i8> splat (i8 -1), <4 x i1> %m, i32 %evl) 150 ret <4 x i8> %v 151} 152 153define <4 x i8> @vadd_vi_v4i8_unmasked(<4 x i8> %va, i32 zeroext %evl) { 154; CHECK-LABEL: vadd_vi_v4i8_unmasked: 155; CHECK: # %bb.0: 156; CHECK-NEXT: vsetvli zero, a0, e8, mf4, ta, ma 157; CHECK-NEXT: vadd.vi v8, v8, -1 158; CHECK-NEXT: ret 159 %v = call <4 x i8> @llvm.vp.add.v4i8(<4 x i8> %va, <4 x i8> splat (i8 -1), <4 x i1> splat (i1 true), i32 %evl) 160 ret <4 x i8> %v 161} 162 163declare <5 x i8> @llvm.vp.add.v5i8(<5 x i8>, <5 x i8>, <5 x i1>, i32) 164 165define <5 x i8> @vadd_vv_v5i8(<5 x i8> %va, <5 x i8> %b, <5 x i1> %m, i32 zeroext %evl) { 166; CHECK-LABEL: vadd_vv_v5i8: 167; CHECK: # %bb.0: 168; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 169; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t 170; CHECK-NEXT: ret 171 %v = call <5 x i8> @llvm.vp.add.v5i8(<5 x i8> %va, <5 x i8> %b, <5 x i1> %m, i32 %evl) 172 ret <5 x i8> %v 173} 174 175define <5 x i8> @vadd_vv_v5i8_unmasked(<5 x i8> %va, <5 x i8> %b, i32 zeroext %evl) { 176; CHECK-LABEL: vadd_vv_v5i8_unmasked: 177; CHECK: # %bb.0: 178; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 179; CHECK-NEXT: vadd.vv v8, v8, v9 180; CHECK-NEXT: ret 181 %v = call <5 x i8> @llvm.vp.add.v5i8(<5 x i8> %va, <5 x i8> %b, <5 x i1> splat (i1 true), i32 %evl) 182 ret <5 x i8> %v 183} 184 185define <5 x i8> @vadd_vx_v5i8(<5 x i8> %va, i8 %b, <5 x i1> %m, i32 zeroext %evl) { 186; CHECK-LABEL: vadd_vx_v5i8: 187; CHECK: # %bb.0: 188; CHECK-NEXT: vsetvli zero, a1, e8, mf2, ta, ma 189; CHECK-NEXT: vadd.vx v8, v8, a0, v0.t 190; CHECK-NEXT: ret 191 %elt.head = insertelement <5 x i8> poison, i8 %b, i32 0 192 %vb = shufflevector <5 x i8> %elt.head, <5 x i8> poison, <5 x i32> zeroinitializer 193 %v = call <5 x i8> @llvm.vp.add.v5i8(<5 x i8> %va, <5 x i8> %vb, <5 x i1> %m, i32 %evl) 194 ret <5 x i8> %v 195} 196 197define <5 x i8> @vadd_vx_v5i8_unmasked(<5 x i8> %va, i8 %b, i32 zeroext %evl) { 198; CHECK-LABEL: vadd_vx_v5i8_unmasked: 199; CHECK: # %bb.0: 200; CHECK-NEXT: vsetvli zero, a1, e8, mf2, ta, ma 201; CHECK-NEXT: vadd.vx v8, v8, a0 202; CHECK-NEXT: ret 203 %elt.head = insertelement <5 x i8> poison, i8 %b, i32 0 204 %vb = shufflevector <5 x i8> %elt.head, <5 x i8> poison, <5 x i32> zeroinitializer 205 %v = call <5 x i8> @llvm.vp.add.v5i8(<5 x i8> %va, <5 x i8> %vb, <5 x i1> splat (i1 true), i32 %evl) 206 ret <5 x i8> %v 207} 208 209define <5 x i8> @vadd_vi_v5i8(<5 x i8> %va, <5 x i1> %m, i32 zeroext %evl) { 210; CHECK-LABEL: vadd_vi_v5i8: 211; CHECK: # %bb.0: 212; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 213; CHECK-NEXT: vadd.vi v8, v8, -1, v0.t 214; CHECK-NEXT: ret 215 %v = call <5 x i8> @llvm.vp.add.v5i8(<5 x i8> %va, <5 x i8> splat (i8 -1), <5 x i1> %m, i32 %evl) 216 ret <5 x i8> %v 217} 218 219define <5 x i8> @vadd_vi_v5i8_unmasked(<5 x i8> %va, i32 zeroext %evl) { 220; CHECK-LABEL: vadd_vi_v5i8_unmasked: 221; CHECK: # %bb.0: 222; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 223; CHECK-NEXT: vadd.vi v8, v8, -1 224; CHECK-NEXT: ret 225 %v = call <5 x i8> @llvm.vp.add.v5i8(<5 x i8> %va, <5 x i8> splat (i8 -1), <5 x i1> splat (i1 true), i32 %evl) 226 ret <5 x i8> %v 227} 228 229declare <8 x i8> @llvm.vp.add.v8i8(<8 x i8>, <8 x i8>, <8 x i1>, i32) 230 231define <8 x i8> @vadd_vv_v8i8(<8 x i8> %va, <8 x i8> %b, <8 x i1> %m, i32 zeroext %evl) { 232; CHECK-LABEL: vadd_vv_v8i8: 233; CHECK: # %bb.0: 234; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 235; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t 236; CHECK-NEXT: ret 237 %v = call <8 x i8> @llvm.vp.add.v8i8(<8 x i8> %va, <8 x i8> %b, <8 x i1> %m, i32 %evl) 238 ret <8 x i8> %v 239} 240 241define <8 x i8> @vadd_vv_v8i8_unmasked(<8 x i8> %va, <8 x i8> %b, i32 zeroext %evl) { 242; CHECK-LABEL: vadd_vv_v8i8_unmasked: 243; CHECK: # %bb.0: 244; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 245; CHECK-NEXT: vadd.vv v8, v8, v9 246; CHECK-NEXT: ret 247 %v = call <8 x i8> @llvm.vp.add.v8i8(<8 x i8> %va, <8 x i8> %b, <8 x i1> splat (i1 true), i32 %evl) 248 ret <8 x i8> %v 249} 250 251define <8 x i8> @vadd_vx_v8i8(<8 x i8> %va, i8 %b, <8 x i1> %m, i32 zeroext %evl) { 252; CHECK-LABEL: vadd_vx_v8i8: 253; CHECK: # %bb.0: 254; CHECK-NEXT: vsetvli zero, a1, e8, mf2, ta, ma 255; CHECK-NEXT: vadd.vx v8, v8, a0, v0.t 256; CHECK-NEXT: ret 257 %elt.head = insertelement <8 x i8> poison, i8 %b, i32 0 258 %vb = shufflevector <8 x i8> %elt.head, <8 x i8> poison, <8 x i32> zeroinitializer 259 %v = call <8 x i8> @llvm.vp.add.v8i8(<8 x i8> %va, <8 x i8> %vb, <8 x i1> %m, i32 %evl) 260 ret <8 x i8> %v 261} 262 263define <8 x i8> @vadd_vx_v8i8_unmasked(<8 x i8> %va, i8 %b, i32 zeroext %evl) { 264; CHECK-LABEL: vadd_vx_v8i8_unmasked: 265; CHECK: # %bb.0: 266; CHECK-NEXT: vsetvli zero, a1, e8, mf2, ta, ma 267; CHECK-NEXT: vadd.vx v8, v8, a0 268; CHECK-NEXT: ret 269 %elt.head = insertelement <8 x i8> poison, i8 %b, i32 0 270 %vb = shufflevector <8 x i8> %elt.head, <8 x i8> poison, <8 x i32> zeroinitializer 271 %v = call <8 x i8> @llvm.vp.add.v8i8(<8 x i8> %va, <8 x i8> %vb, <8 x i1> splat (i1 true), i32 %evl) 272 ret <8 x i8> %v 273} 274 275define <8 x i8> @vadd_vi_v8i8(<8 x i8> %va, <8 x i1> %m, i32 zeroext %evl) { 276; CHECK-LABEL: vadd_vi_v8i8: 277; CHECK: # %bb.0: 278; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 279; CHECK-NEXT: vadd.vi v8, v8, -1, v0.t 280; CHECK-NEXT: ret 281 %v = call <8 x i8> @llvm.vp.add.v8i8(<8 x i8> %va, <8 x i8> splat (i8 -1), <8 x i1> %m, i32 %evl) 282 ret <8 x i8> %v 283} 284 285define <8 x i8> @vadd_vi_v8i8_unmasked(<8 x i8> %va, i32 zeroext %evl) { 286; CHECK-LABEL: vadd_vi_v8i8_unmasked: 287; CHECK: # %bb.0: 288; CHECK-NEXT: vsetvli zero, a0, e8, mf2, ta, ma 289; CHECK-NEXT: vadd.vi v8, v8, -1 290; CHECK-NEXT: ret 291 %v = call <8 x i8> @llvm.vp.add.v8i8(<8 x i8> %va, <8 x i8> splat (i8 -1), <8 x i1> splat (i1 true), i32 %evl) 292 ret <8 x i8> %v 293} 294 295declare <16 x i8> @llvm.vp.add.v16i8(<16 x i8>, <16 x i8>, <16 x i1>, i32) 296 297define <16 x i8> @vadd_vv_v16i8(<16 x i8> %va, <16 x i8> %b, <16 x i1> %m, i32 zeroext %evl) { 298; CHECK-LABEL: vadd_vv_v16i8: 299; CHECK: # %bb.0: 300; CHECK-NEXT: vsetvli zero, a0, e8, m1, ta, ma 301; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t 302; CHECK-NEXT: ret 303 %v = call <16 x i8> @llvm.vp.add.v16i8(<16 x i8> %va, <16 x i8> %b, <16 x i1> %m, i32 %evl) 304 ret <16 x i8> %v 305} 306 307define <16 x i8> @vadd_vv_v16i8_unmasked(<16 x i8> %va, <16 x i8> %b, i32 zeroext %evl) { 308; CHECK-LABEL: vadd_vv_v16i8_unmasked: 309; CHECK: # %bb.0: 310; CHECK-NEXT: vsetvli zero, a0, e8, m1, ta, ma 311; CHECK-NEXT: vadd.vv v8, v8, v9 312; CHECK-NEXT: ret 313 %v = call <16 x i8> @llvm.vp.add.v16i8(<16 x i8> %va, <16 x i8> %b, <16 x i1> splat (i1 true), i32 %evl) 314 ret <16 x i8> %v 315} 316 317define <16 x i8> @vadd_vx_v16i8(<16 x i8> %va, i8 %b, <16 x i1> %m, i32 zeroext %evl) { 318; CHECK-LABEL: vadd_vx_v16i8: 319; CHECK: # %bb.0: 320; CHECK-NEXT: vsetvli zero, a1, e8, m1, ta, ma 321; CHECK-NEXT: vadd.vx v8, v8, a0, v0.t 322; CHECK-NEXT: ret 323 %elt.head = insertelement <16 x i8> poison, i8 %b, i32 0 324 %vb = shufflevector <16 x i8> %elt.head, <16 x i8> poison, <16 x i32> zeroinitializer 325 %v = call <16 x i8> @llvm.vp.add.v16i8(<16 x i8> %va, <16 x i8> %vb, <16 x i1> %m, i32 %evl) 326 ret <16 x i8> %v 327} 328 329define <16 x i8> @vadd_vx_v16i8_unmasked(<16 x i8> %va, i8 %b, i32 zeroext %evl) { 330; CHECK-LABEL: vadd_vx_v16i8_unmasked: 331; CHECK: # %bb.0: 332; CHECK-NEXT: vsetvli zero, a1, e8, m1, ta, ma 333; CHECK-NEXT: vadd.vx v8, v8, a0 334; CHECK-NEXT: ret 335 %elt.head = insertelement <16 x i8> poison, i8 %b, i32 0 336 %vb = shufflevector <16 x i8> %elt.head, <16 x i8> poison, <16 x i32> zeroinitializer 337 %v = call <16 x i8> @llvm.vp.add.v16i8(<16 x i8> %va, <16 x i8> %vb, <16 x i1> splat (i1 true), i32 %evl) 338 ret <16 x i8> %v 339} 340 341define <16 x i8> @vadd_vi_v16i8(<16 x i8> %va, <16 x i1> %m, i32 zeroext %evl) { 342; CHECK-LABEL: vadd_vi_v16i8: 343; CHECK: # %bb.0: 344; CHECK-NEXT: vsetvli zero, a0, e8, m1, ta, ma 345; CHECK-NEXT: vadd.vi v8, v8, -1, v0.t 346; CHECK-NEXT: ret 347 %v = call <16 x i8> @llvm.vp.add.v16i8(<16 x i8> %va, <16 x i8> splat (i8 -1), <16 x i1> %m, i32 %evl) 348 ret <16 x i8> %v 349} 350 351define <16 x i8> @vadd_vi_v16i8_unmasked(<16 x i8> %va, i32 zeroext %evl) { 352; CHECK-LABEL: vadd_vi_v16i8_unmasked: 353; CHECK: # %bb.0: 354; CHECK-NEXT: vsetvli zero, a0, e8, m1, ta, ma 355; CHECK-NEXT: vadd.vi v8, v8, -1 356; CHECK-NEXT: ret 357 %v = call <16 x i8> @llvm.vp.add.v16i8(<16 x i8> %va, <16 x i8> splat (i8 -1), <16 x i1> splat (i1 true), i32 %evl) 358 ret <16 x i8> %v 359} 360 361declare <256 x i8> @llvm.vp.add.v258i8(<256 x i8>, <256 x i8>, <256 x i1>, i32) 362 363define <256 x i8> @vadd_vi_v258i8(<256 x i8> %va, <256 x i1> %m, i32 zeroext %evl) { 364; CHECK-LABEL: vadd_vi_v258i8: 365; CHECK: # %bb.0: 366; CHECK-NEXT: vsetivli zero, 1, e8, m1, ta, ma 367; CHECK-NEXT: vmv1r.v v24, v0 368; CHECK-NEXT: li a2, 128 369; CHECK-NEXT: vsetvli zero, a2, e8, m8, ta, ma 370; CHECK-NEXT: vlm.v v0, (a0) 371; CHECK-NEXT: addi a0, a1, -128 372; CHECK-NEXT: sltu a3, a1, a0 373; CHECK-NEXT: addi a3, a3, -1 374; CHECK-NEXT: and a0, a3, a0 375; CHECK-NEXT: vsetvli zero, a0, e8, m8, ta, ma 376; CHECK-NEXT: vadd.vi v16, v16, -1, v0.t 377; CHECK-NEXT: bltu a1, a2, .LBB32_2 378; CHECK-NEXT: # %bb.1: 379; CHECK-NEXT: li a1, 128 380; CHECK-NEXT: .LBB32_2: 381; CHECK-NEXT: vmv1r.v v0, v24 382; CHECK-NEXT: vsetvli zero, a1, e8, m8, ta, ma 383; CHECK-NEXT: vadd.vi v8, v8, -1, v0.t 384; CHECK-NEXT: ret 385 %v = call <256 x i8> @llvm.vp.add.v258i8(<256 x i8> %va, <256 x i8> splat (i8 -1), <256 x i1> %m, i32 %evl) 386 ret <256 x i8> %v 387} 388 389define <256 x i8> @vadd_vi_v258i8_unmasked(<256 x i8> %va, i32 zeroext %evl) { 390; CHECK-LABEL: vadd_vi_v258i8_unmasked: 391; CHECK: # %bb.0: 392; CHECK-NEXT: li a2, 128 393; CHECK-NEXT: mv a1, a0 394; CHECK-NEXT: bltu a0, a2, .LBB33_2 395; CHECK-NEXT: # %bb.1: 396; CHECK-NEXT: li a1, 128 397; CHECK-NEXT: .LBB33_2: 398; CHECK-NEXT: vsetvli zero, a1, e8, m8, ta, ma 399; CHECK-NEXT: vadd.vi v8, v8, -1 400; CHECK-NEXT: addi a1, a0, -128 401; CHECK-NEXT: sltu a0, a0, a1 402; CHECK-NEXT: addi a0, a0, -1 403; CHECK-NEXT: and a0, a0, a1 404; CHECK-NEXT: vsetvli zero, a0, e8, m8, ta, ma 405; CHECK-NEXT: vadd.vi v16, v16, -1 406; CHECK-NEXT: ret 407 %v = call <256 x i8> @llvm.vp.add.v258i8(<256 x i8> %va, <256 x i8> splat (i8 -1), <256 x i1> splat (i1 true), i32 %evl) 408 ret <256 x i8> %v 409} 410 411; Test splitting when the %evl is a known constant. 412 413define <256 x i8> @vadd_vi_v258i8_evl129(<256 x i8> %va, <256 x i1> %m) { 414; CHECK-LABEL: vadd_vi_v258i8_evl129: 415; CHECK: # %bb.0: 416; CHECK-NEXT: li a1, 128 417; CHECK-NEXT: vsetvli zero, a1, e8, m8, ta, ma 418; CHECK-NEXT: vlm.v v24, (a0) 419; CHECK-NEXT: vadd.vi v8, v8, -1, v0.t 420; CHECK-NEXT: vmv1r.v v0, v24 421; CHECK-NEXT: vsetivli zero, 1, e8, m8, ta, ma 422; CHECK-NEXT: vadd.vi v16, v16, -1, v0.t 423; CHECK-NEXT: ret 424 %v = call <256 x i8> @llvm.vp.add.v258i8(<256 x i8> %va, <256 x i8> splat (i8 -1), <256 x i1> %m, i32 129) 425 ret <256 x i8> %v 426} 427 428; FIXME: The upper half is doing nothing. 429 430define <256 x i8> @vadd_vi_v258i8_evl128(<256 x i8> %va, <256 x i1> %m) { 431; CHECK-LABEL: vadd_vi_v258i8_evl128: 432; CHECK: # %bb.0: 433; CHECK-NEXT: li a0, 128 434; CHECK-NEXT: vsetvli zero, a0, e8, m8, ta, ma 435; CHECK-NEXT: vadd.vi v8, v8, -1, v0.t 436; CHECK-NEXT: ret 437 %v = call <256 x i8> @llvm.vp.add.v258i8(<256 x i8> %va, <256 x i8> splat (i8 -1), <256 x i1> %m, i32 128) 438 ret <256 x i8> %v 439} 440 441declare <2 x i16> @llvm.vp.add.v2i16(<2 x i16>, <2 x i16>, <2 x i1>, i32) 442 443define <2 x i16> @vadd_vv_v2i16(<2 x i16> %va, <2 x i16> %b, <2 x i1> %m, i32 zeroext %evl) { 444; CHECK-LABEL: vadd_vv_v2i16: 445; CHECK: # %bb.0: 446; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 447; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t 448; CHECK-NEXT: ret 449 %v = call <2 x i16> @llvm.vp.add.v2i16(<2 x i16> %va, <2 x i16> %b, <2 x i1> %m, i32 %evl) 450 ret <2 x i16> %v 451} 452 453define <2 x i16> @vadd_vv_v2i16_unmasked(<2 x i16> %va, <2 x i16> %b, i32 zeroext %evl) { 454; CHECK-LABEL: vadd_vv_v2i16_unmasked: 455; CHECK: # %bb.0: 456; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 457; CHECK-NEXT: vadd.vv v8, v8, v9 458; CHECK-NEXT: ret 459 %v = call <2 x i16> @llvm.vp.add.v2i16(<2 x i16> %va, <2 x i16> %b, <2 x i1> splat (i1 true), i32 %evl) 460 ret <2 x i16> %v 461} 462 463define <2 x i16> @vadd_vx_v2i16(<2 x i16> %va, i16 %b, <2 x i1> %m, i32 zeroext %evl) { 464; CHECK-LABEL: vadd_vx_v2i16: 465; CHECK: # %bb.0: 466; CHECK-NEXT: vsetvli zero, a1, e16, mf4, ta, ma 467; CHECK-NEXT: vadd.vx v8, v8, a0, v0.t 468; CHECK-NEXT: ret 469 %elt.head = insertelement <2 x i16> poison, i16 %b, i32 0 470 %vb = shufflevector <2 x i16> %elt.head, <2 x i16> poison, <2 x i32> zeroinitializer 471 %v = call <2 x i16> @llvm.vp.add.v2i16(<2 x i16> %va, <2 x i16> %vb, <2 x i1> %m, i32 %evl) 472 ret <2 x i16> %v 473} 474 475define <2 x i16> @vadd_vx_v2i16_unmasked(<2 x i16> %va, i16 %b, i32 zeroext %evl) { 476; CHECK-LABEL: vadd_vx_v2i16_unmasked: 477; CHECK: # %bb.0: 478; CHECK-NEXT: vsetvli zero, a1, e16, mf4, ta, ma 479; CHECK-NEXT: vadd.vx v8, v8, a0 480; CHECK-NEXT: ret 481 %elt.head = insertelement <2 x i16> poison, i16 %b, i32 0 482 %vb = shufflevector <2 x i16> %elt.head, <2 x i16> poison, <2 x i32> zeroinitializer 483 %v = call <2 x i16> @llvm.vp.add.v2i16(<2 x i16> %va, <2 x i16> %vb, <2 x i1> splat (i1 true), i32 %evl) 484 ret <2 x i16> %v 485} 486 487define <2 x i16> @vadd_vi_v2i16(<2 x i16> %va, <2 x i1> %m, i32 zeroext %evl) { 488; CHECK-LABEL: vadd_vi_v2i16: 489; CHECK: # %bb.0: 490; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 491; CHECK-NEXT: vadd.vi v8, v8, -1, v0.t 492; CHECK-NEXT: ret 493 %v = call <2 x i16> @llvm.vp.add.v2i16(<2 x i16> %va, <2 x i16> splat (i16 -1), <2 x i1> %m, i32 %evl) 494 ret <2 x i16> %v 495} 496 497define <2 x i16> @vadd_vi_v2i16_unmasked(<2 x i16> %va, i32 zeroext %evl) { 498; CHECK-LABEL: vadd_vi_v2i16_unmasked: 499; CHECK: # %bb.0: 500; CHECK-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 501; CHECK-NEXT: vadd.vi v8, v8, -1 502; CHECK-NEXT: ret 503 %v = call <2 x i16> @llvm.vp.add.v2i16(<2 x i16> %va, <2 x i16> splat (i16 -1), <2 x i1> splat (i1 true), i32 %evl) 504 ret <2 x i16> %v 505} 506 507declare <4 x i16> @llvm.vp.add.v4i16(<4 x i16>, <4 x i16>, <4 x i1>, i32) 508 509define <4 x i16> @vadd_vv_v4i16(<4 x i16> %va, <4 x i16> %b, <4 x i1> %m, i32 zeroext %evl) { 510; CHECK-LABEL: vadd_vv_v4i16: 511; CHECK: # %bb.0: 512; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 513; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t 514; CHECK-NEXT: ret 515 %v = call <4 x i16> @llvm.vp.add.v4i16(<4 x i16> %va, <4 x i16> %b, <4 x i1> %m, i32 %evl) 516 ret <4 x i16> %v 517} 518 519define <4 x i16> @vadd_vv_v4i16_unmasked(<4 x i16> %va, <4 x i16> %b, i32 zeroext %evl) { 520; CHECK-LABEL: vadd_vv_v4i16_unmasked: 521; CHECK: # %bb.0: 522; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 523; CHECK-NEXT: vadd.vv v8, v8, v9 524; CHECK-NEXT: ret 525 %v = call <4 x i16> @llvm.vp.add.v4i16(<4 x i16> %va, <4 x i16> %b, <4 x i1> splat (i1 true), i32 %evl) 526 ret <4 x i16> %v 527} 528 529define <4 x i16> @vadd_vx_v4i16(<4 x i16> %va, i16 %b, <4 x i1> %m, i32 zeroext %evl) { 530; CHECK-LABEL: vadd_vx_v4i16: 531; CHECK: # %bb.0: 532; CHECK-NEXT: vsetvli zero, a1, e16, mf2, ta, ma 533; CHECK-NEXT: vadd.vx v8, v8, a0, v0.t 534; CHECK-NEXT: ret 535 %elt.head = insertelement <4 x i16> poison, i16 %b, i32 0 536 %vb = shufflevector <4 x i16> %elt.head, <4 x i16> poison, <4 x i32> zeroinitializer 537 %v = call <4 x i16> @llvm.vp.add.v4i16(<4 x i16> %va, <4 x i16> %vb, <4 x i1> %m, i32 %evl) 538 ret <4 x i16> %v 539} 540 541define <4 x i16> @vadd_vx_v4i16_unmasked(<4 x i16> %va, i16 %b, i32 zeroext %evl) { 542; CHECK-LABEL: vadd_vx_v4i16_unmasked: 543; CHECK: # %bb.0: 544; CHECK-NEXT: vsetvli zero, a1, e16, mf2, ta, ma 545; CHECK-NEXT: vadd.vx v8, v8, a0 546; CHECK-NEXT: ret 547 %elt.head = insertelement <4 x i16> poison, i16 %b, i32 0 548 %vb = shufflevector <4 x i16> %elt.head, <4 x i16> poison, <4 x i32> zeroinitializer 549 %v = call <4 x i16> @llvm.vp.add.v4i16(<4 x i16> %va, <4 x i16> %vb, <4 x i1> splat (i1 true), i32 %evl) 550 ret <4 x i16> %v 551} 552 553define <4 x i16> @vadd_vi_v4i16(<4 x i16> %va, <4 x i1> %m, i32 zeroext %evl) { 554; CHECK-LABEL: vadd_vi_v4i16: 555; CHECK: # %bb.0: 556; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 557; CHECK-NEXT: vadd.vi v8, v8, -1, v0.t 558; CHECK-NEXT: ret 559 %v = call <4 x i16> @llvm.vp.add.v4i16(<4 x i16> %va, <4 x i16> splat (i16 -1), <4 x i1> %m, i32 %evl) 560 ret <4 x i16> %v 561} 562 563define <4 x i16> @vadd_vi_v4i16_unmasked(<4 x i16> %va, i32 zeroext %evl) { 564; CHECK-LABEL: vadd_vi_v4i16_unmasked: 565; CHECK: # %bb.0: 566; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 567; CHECK-NEXT: vadd.vi v8, v8, -1 568; CHECK-NEXT: ret 569 %v = call <4 x i16> @llvm.vp.add.v4i16(<4 x i16> %va, <4 x i16> splat (i16 -1), <4 x i1> splat (i1 true), i32 %evl) 570 ret <4 x i16> %v 571} 572 573declare <8 x i16> @llvm.vp.add.v8i16(<8 x i16>, <8 x i16>, <8 x i1>, i32) 574 575define <8 x i16> @vadd_vv_v8i16(<8 x i16> %va, <8 x i16> %b, <8 x i1> %m, i32 zeroext %evl) { 576; CHECK-LABEL: vadd_vv_v8i16: 577; CHECK: # %bb.0: 578; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma 579; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t 580; CHECK-NEXT: ret 581 %v = call <8 x i16> @llvm.vp.add.v8i16(<8 x i16> %va, <8 x i16> %b, <8 x i1> %m, i32 %evl) 582 ret <8 x i16> %v 583} 584 585define <8 x i16> @vadd_vv_v8i16_unmasked(<8 x i16> %va, <8 x i16> %b, i32 zeroext %evl) { 586; CHECK-LABEL: vadd_vv_v8i16_unmasked: 587; CHECK: # %bb.0: 588; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma 589; CHECK-NEXT: vadd.vv v8, v8, v9 590; CHECK-NEXT: ret 591 %v = call <8 x i16> @llvm.vp.add.v8i16(<8 x i16> %va, <8 x i16> %b, <8 x i1> splat (i1 true), i32 %evl) 592 ret <8 x i16> %v 593} 594 595define <8 x i16> @vadd_vx_v8i16(<8 x i16> %va, i16 %b, <8 x i1> %m, i32 zeroext %evl) { 596; CHECK-LABEL: vadd_vx_v8i16: 597; CHECK: # %bb.0: 598; CHECK-NEXT: vsetvli zero, a1, e16, m1, ta, ma 599; CHECK-NEXT: vadd.vx v8, v8, a0, v0.t 600; CHECK-NEXT: ret 601 %elt.head = insertelement <8 x i16> poison, i16 %b, i32 0 602 %vb = shufflevector <8 x i16> %elt.head, <8 x i16> poison, <8 x i32> zeroinitializer 603 %v = call <8 x i16> @llvm.vp.add.v8i16(<8 x i16> %va, <8 x i16> %vb, <8 x i1> %m, i32 %evl) 604 ret <8 x i16> %v 605} 606 607define <8 x i16> @vadd_vx_v8i16_unmasked(<8 x i16> %va, i16 %b, i32 zeroext %evl) { 608; CHECK-LABEL: vadd_vx_v8i16_unmasked: 609; CHECK: # %bb.0: 610; CHECK-NEXT: vsetvli zero, a1, e16, m1, ta, ma 611; CHECK-NEXT: vadd.vx v8, v8, a0 612; CHECK-NEXT: ret 613 %elt.head = insertelement <8 x i16> poison, i16 %b, i32 0 614 %vb = shufflevector <8 x i16> %elt.head, <8 x i16> poison, <8 x i32> zeroinitializer 615 %v = call <8 x i16> @llvm.vp.add.v8i16(<8 x i16> %va, <8 x i16> %vb, <8 x i1> splat (i1 true), i32 %evl) 616 ret <8 x i16> %v 617} 618 619define <8 x i16> @vadd_vi_v8i16(<8 x i16> %va, <8 x i1> %m, i32 zeroext %evl) { 620; CHECK-LABEL: vadd_vi_v8i16: 621; CHECK: # %bb.0: 622; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma 623; CHECK-NEXT: vadd.vi v8, v8, -1, v0.t 624; CHECK-NEXT: ret 625 %v = call <8 x i16> @llvm.vp.add.v8i16(<8 x i16> %va, <8 x i16> splat (i16 -1), <8 x i1> %m, i32 %evl) 626 ret <8 x i16> %v 627} 628 629define <8 x i16> @vadd_vi_v8i16_unmasked(<8 x i16> %va, i32 zeroext %evl) { 630; CHECK-LABEL: vadd_vi_v8i16_unmasked: 631; CHECK: # %bb.0: 632; CHECK-NEXT: vsetvli zero, a0, e16, m1, ta, ma 633; CHECK-NEXT: vadd.vi v8, v8, -1 634; CHECK-NEXT: ret 635 %v = call <8 x i16> @llvm.vp.add.v8i16(<8 x i16> %va, <8 x i16> splat (i16 -1), <8 x i1> splat (i1 true), i32 %evl) 636 ret <8 x i16> %v 637} 638 639declare <16 x i16> @llvm.vp.add.v16i16(<16 x i16>, <16 x i16>, <16 x i1>, i32) 640 641define <16 x i16> @vadd_vv_v16i16(<16 x i16> %va, <16 x i16> %b, <16 x i1> %m, i32 zeroext %evl) { 642; CHECK-LABEL: vadd_vv_v16i16: 643; CHECK: # %bb.0: 644; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma 645; CHECK-NEXT: vadd.vv v8, v8, v10, v0.t 646; CHECK-NEXT: ret 647 %v = call <16 x i16> @llvm.vp.add.v16i16(<16 x i16> %va, <16 x i16> %b, <16 x i1> %m, i32 %evl) 648 ret <16 x i16> %v 649} 650 651define <16 x i16> @vadd_vv_v16i16_unmasked(<16 x i16> %va, <16 x i16> %b, i32 zeroext %evl) { 652; CHECK-LABEL: vadd_vv_v16i16_unmasked: 653; CHECK: # %bb.0: 654; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma 655; CHECK-NEXT: vadd.vv v8, v8, v10 656; CHECK-NEXT: ret 657 %v = call <16 x i16> @llvm.vp.add.v16i16(<16 x i16> %va, <16 x i16> %b, <16 x i1> splat (i1 true), i32 %evl) 658 ret <16 x i16> %v 659} 660 661define <16 x i16> @vadd_vx_v16i16(<16 x i16> %va, i16 %b, <16 x i1> %m, i32 zeroext %evl) { 662; CHECK-LABEL: vadd_vx_v16i16: 663; CHECK: # %bb.0: 664; CHECK-NEXT: vsetvli zero, a1, e16, m2, ta, ma 665; CHECK-NEXT: vadd.vx v8, v8, a0, v0.t 666; CHECK-NEXT: ret 667 %elt.head = insertelement <16 x i16> poison, i16 %b, i32 0 668 %vb = shufflevector <16 x i16> %elt.head, <16 x i16> poison, <16 x i32> zeroinitializer 669 %v = call <16 x i16> @llvm.vp.add.v16i16(<16 x i16> %va, <16 x i16> %vb, <16 x i1> %m, i32 %evl) 670 ret <16 x i16> %v 671} 672 673define <16 x i16> @vadd_vx_v16i16_unmasked(<16 x i16> %va, i16 %b, i32 zeroext %evl) { 674; CHECK-LABEL: vadd_vx_v16i16_unmasked: 675; CHECK: # %bb.0: 676; CHECK-NEXT: vsetvli zero, a1, e16, m2, ta, ma 677; CHECK-NEXT: vadd.vx v8, v8, a0 678; CHECK-NEXT: ret 679 %elt.head = insertelement <16 x i16> poison, i16 %b, i32 0 680 %vb = shufflevector <16 x i16> %elt.head, <16 x i16> poison, <16 x i32> zeroinitializer 681 %v = call <16 x i16> @llvm.vp.add.v16i16(<16 x i16> %va, <16 x i16> %vb, <16 x i1> splat (i1 true), i32 %evl) 682 ret <16 x i16> %v 683} 684 685define <16 x i16> @vadd_vi_v16i16(<16 x i16> %va, <16 x i1> %m, i32 zeroext %evl) { 686; CHECK-LABEL: vadd_vi_v16i16: 687; CHECK: # %bb.0: 688; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma 689; CHECK-NEXT: vadd.vi v8, v8, -1, v0.t 690; CHECK-NEXT: ret 691 %v = call <16 x i16> @llvm.vp.add.v16i16(<16 x i16> %va, <16 x i16> splat (i16 -1), <16 x i1> %m, i32 %evl) 692 ret <16 x i16> %v 693} 694 695define <16 x i16> @vadd_vi_v16i16_unmasked(<16 x i16> %va, i32 zeroext %evl) { 696; CHECK-LABEL: vadd_vi_v16i16_unmasked: 697; CHECK: # %bb.0: 698; CHECK-NEXT: vsetvli zero, a0, e16, m2, ta, ma 699; CHECK-NEXT: vadd.vi v8, v8, -1 700; CHECK-NEXT: ret 701 %v = call <16 x i16> @llvm.vp.add.v16i16(<16 x i16> %va, <16 x i16> splat (i16 -1), <16 x i1> splat (i1 true), i32 %evl) 702 ret <16 x i16> %v 703} 704 705declare <2 x i32> @llvm.vp.add.v2i32(<2 x i32>, <2 x i32>, <2 x i1>, i32) 706 707define <2 x i32> @vadd_vv_v2i32(<2 x i32> %va, <2 x i32> %b, <2 x i1> %m, i32 zeroext %evl) { 708; CHECK-LABEL: vadd_vv_v2i32: 709; CHECK: # %bb.0: 710; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 711; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t 712; CHECK-NEXT: ret 713 %v = call <2 x i32> @llvm.vp.add.v2i32(<2 x i32> %va, <2 x i32> %b, <2 x i1> %m, i32 %evl) 714 ret <2 x i32> %v 715} 716 717define <2 x i32> @vadd_vv_v2i32_unmasked(<2 x i32> %va, <2 x i32> %b, i32 zeroext %evl) { 718; CHECK-LABEL: vadd_vv_v2i32_unmasked: 719; CHECK: # %bb.0: 720; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 721; CHECK-NEXT: vadd.vv v8, v8, v9 722; CHECK-NEXT: ret 723 %v = call <2 x i32> @llvm.vp.add.v2i32(<2 x i32> %va, <2 x i32> %b, <2 x i1> splat (i1 true), i32 %evl) 724 ret <2 x i32> %v 725} 726 727define <2 x i32> @vadd_vx_v2i32(<2 x i32> %va, i32 %b, <2 x i1> %m, i32 zeroext %evl) { 728; CHECK-LABEL: vadd_vx_v2i32: 729; CHECK: # %bb.0: 730; CHECK-NEXT: vsetvli zero, a1, e32, mf2, ta, ma 731; CHECK-NEXT: vadd.vx v8, v8, a0, v0.t 732; CHECK-NEXT: ret 733 %elt.head = insertelement <2 x i32> poison, i32 %b, i32 0 734 %vb = shufflevector <2 x i32> %elt.head, <2 x i32> poison, <2 x i32> zeroinitializer 735 %v = call <2 x i32> @llvm.vp.add.v2i32(<2 x i32> %va, <2 x i32> %vb, <2 x i1> %m, i32 %evl) 736 ret <2 x i32> %v 737} 738 739define <2 x i32> @vadd_vx_v2i32_unmasked(<2 x i32> %va, i32 %b, i32 zeroext %evl) { 740; CHECK-LABEL: vadd_vx_v2i32_unmasked: 741; CHECK: # %bb.0: 742; CHECK-NEXT: vsetvli zero, a1, e32, mf2, ta, ma 743; CHECK-NEXT: vadd.vx v8, v8, a0 744; CHECK-NEXT: ret 745 %elt.head = insertelement <2 x i32> poison, i32 %b, i32 0 746 %vb = shufflevector <2 x i32> %elt.head, <2 x i32> poison, <2 x i32> zeroinitializer 747 %v = call <2 x i32> @llvm.vp.add.v2i32(<2 x i32> %va, <2 x i32> %vb, <2 x i1> splat (i1 true), i32 %evl) 748 ret <2 x i32> %v 749} 750 751define <2 x i32> @vadd_vi_v2i32(<2 x i32> %va, <2 x i1> %m, i32 zeroext %evl) { 752; CHECK-LABEL: vadd_vi_v2i32: 753; CHECK: # %bb.0: 754; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 755; CHECK-NEXT: vadd.vi v8, v8, -1, v0.t 756; CHECK-NEXT: ret 757 %v = call <2 x i32> @llvm.vp.add.v2i32(<2 x i32> %va, <2 x i32> splat (i32 -1), <2 x i1> %m, i32 %evl) 758 ret <2 x i32> %v 759} 760 761define <2 x i32> @vadd_vi_v2i32_unmasked(<2 x i32> %va, i32 zeroext %evl) { 762; CHECK-LABEL: vadd_vi_v2i32_unmasked: 763; CHECK: # %bb.0: 764; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 765; CHECK-NEXT: vadd.vi v8, v8, -1 766; CHECK-NEXT: ret 767 %v = call <2 x i32> @llvm.vp.add.v2i32(<2 x i32> %va, <2 x i32> splat (i32 -1), <2 x i1> splat (i1 true), i32 %evl) 768 ret <2 x i32> %v 769} 770 771declare <4 x i32> @llvm.vp.add.v4i32(<4 x i32>, <4 x i32>, <4 x i1>, i32) 772 773define <4 x i32> @vadd_vv_v4i32(<4 x i32> %va, <4 x i32> %b, <4 x i1> %m, i32 zeroext %evl) { 774; CHECK-LABEL: vadd_vv_v4i32: 775; CHECK: # %bb.0: 776; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma 777; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t 778; CHECK-NEXT: ret 779 %v = call <4 x i32> @llvm.vp.add.v4i32(<4 x i32> %va, <4 x i32> %b, <4 x i1> %m, i32 %evl) 780 ret <4 x i32> %v 781} 782 783define <4 x i32> @vadd_vv_v4i32_unmasked(<4 x i32> %va, <4 x i32> %b, i32 zeroext %evl) { 784; CHECK-LABEL: vadd_vv_v4i32_unmasked: 785; CHECK: # %bb.0: 786; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma 787; CHECK-NEXT: vadd.vv v8, v8, v9 788; CHECK-NEXT: ret 789 %v = call <4 x i32> @llvm.vp.add.v4i32(<4 x i32> %va, <4 x i32> %b, <4 x i1> splat (i1 true), i32 %evl) 790 ret <4 x i32> %v 791} 792 793define <4 x i32> @vadd_vx_v4i32(<4 x i32> %va, i32 %b, <4 x i1> %m, i32 zeroext %evl) { 794; CHECK-LABEL: vadd_vx_v4i32: 795; CHECK: # %bb.0: 796; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma 797; CHECK-NEXT: vadd.vx v8, v8, a0, v0.t 798; CHECK-NEXT: ret 799 %elt.head = insertelement <4 x i32> poison, i32 %b, i32 0 800 %vb = shufflevector <4 x i32> %elt.head, <4 x i32> poison, <4 x i32> zeroinitializer 801 %v = call <4 x i32> @llvm.vp.add.v4i32(<4 x i32> %va, <4 x i32> %vb, <4 x i1> %m, i32 %evl) 802 ret <4 x i32> %v 803} 804 805define <4 x i32> @vadd_vx_v4i32_unmasked(<4 x i32> %va, i32 %b, i32 zeroext %evl) { 806; CHECK-LABEL: vadd_vx_v4i32_unmasked: 807; CHECK: # %bb.0: 808; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma 809; CHECK-NEXT: vadd.vx v8, v8, a0 810; CHECK-NEXT: ret 811 %elt.head = insertelement <4 x i32> poison, i32 %b, i32 0 812 %vb = shufflevector <4 x i32> %elt.head, <4 x i32> poison, <4 x i32> zeroinitializer 813 %v = call <4 x i32> @llvm.vp.add.v4i32(<4 x i32> %va, <4 x i32> %vb, <4 x i1> splat (i1 true), i32 %evl) 814 ret <4 x i32> %v 815} 816 817define <4 x i32> @vadd_vi_v4i32(<4 x i32> %va, <4 x i1> %m, i32 zeroext %evl) { 818; CHECK-LABEL: vadd_vi_v4i32: 819; CHECK: # %bb.0: 820; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma 821; CHECK-NEXT: vadd.vi v8, v8, -1, v0.t 822; CHECK-NEXT: ret 823 %v = call <4 x i32> @llvm.vp.add.v4i32(<4 x i32> %va, <4 x i32> splat (i32 -1), <4 x i1> %m, i32 %evl) 824 ret <4 x i32> %v 825} 826 827define <4 x i32> @vadd_vi_v4i32_unmasked(<4 x i32> %va, i32 zeroext %evl) { 828; CHECK-LABEL: vadd_vi_v4i32_unmasked: 829; CHECK: # %bb.0: 830; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma 831; CHECK-NEXT: vadd.vi v8, v8, -1 832; CHECK-NEXT: ret 833 %v = call <4 x i32> @llvm.vp.add.v4i32(<4 x i32> %va, <4 x i32> splat (i32 -1), <4 x i1> splat (i1 true), i32 %evl) 834 ret <4 x i32> %v 835} 836 837declare <8 x i32> @llvm.vp.add.v8i32(<8 x i32>, <8 x i32>, <8 x i1>, i32) 838 839define <8 x i32> @vadd_vv_v8i32(<8 x i32> %va, <8 x i32> %b, <8 x i1> %m, i32 zeroext %evl) { 840; CHECK-LABEL: vadd_vv_v8i32: 841; CHECK: # %bb.0: 842; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma 843; CHECK-NEXT: vadd.vv v8, v8, v10, v0.t 844; CHECK-NEXT: ret 845 %v = call <8 x i32> @llvm.vp.add.v8i32(<8 x i32> %va, <8 x i32> %b, <8 x i1> %m, i32 %evl) 846 ret <8 x i32> %v 847} 848 849define <8 x i32> @vadd_vv_v8i32_unmasked(<8 x i32> %va, <8 x i32> %b, i32 zeroext %evl) { 850; CHECK-LABEL: vadd_vv_v8i32_unmasked: 851; CHECK: # %bb.0: 852; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma 853; CHECK-NEXT: vadd.vv v8, v8, v10 854; CHECK-NEXT: ret 855 %v = call <8 x i32> @llvm.vp.add.v8i32(<8 x i32> %va, <8 x i32> %b, <8 x i1> splat (i1 true), i32 %evl) 856 ret <8 x i32> %v 857} 858 859define <8 x i32> @vadd_vx_v8i32(<8 x i32> %va, i32 %b, <8 x i1> %m, i32 zeroext %evl) { 860; CHECK-LABEL: vadd_vx_v8i32: 861; CHECK: # %bb.0: 862; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, ma 863; CHECK-NEXT: vadd.vx v8, v8, a0, v0.t 864; CHECK-NEXT: ret 865 %elt.head = insertelement <8 x i32> poison, i32 %b, i32 0 866 %vb = shufflevector <8 x i32> %elt.head, <8 x i32> poison, <8 x i32> zeroinitializer 867 %v = call <8 x i32> @llvm.vp.add.v8i32(<8 x i32> %va, <8 x i32> %vb, <8 x i1> %m, i32 %evl) 868 ret <8 x i32> %v 869} 870 871define <8 x i32> @vadd_vx_v8i32_unmasked(<8 x i32> %va, i32 %b, i32 zeroext %evl) { 872; CHECK-LABEL: vadd_vx_v8i32_unmasked: 873; CHECK: # %bb.0: 874; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, ma 875; CHECK-NEXT: vadd.vx v8, v8, a0 876; CHECK-NEXT: ret 877 %elt.head = insertelement <8 x i32> poison, i32 %b, i32 0 878 %vb = shufflevector <8 x i32> %elt.head, <8 x i32> poison, <8 x i32> zeroinitializer 879 %v = call <8 x i32> @llvm.vp.add.v8i32(<8 x i32> %va, <8 x i32> %vb, <8 x i1> splat (i1 true), i32 %evl) 880 ret <8 x i32> %v 881} 882 883define <8 x i32> @vadd_vi_v8i32(<8 x i32> %va, <8 x i1> %m, i32 zeroext %evl) { 884; CHECK-LABEL: vadd_vi_v8i32: 885; CHECK: # %bb.0: 886; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma 887; CHECK-NEXT: vadd.vi v8, v8, -1, v0.t 888; CHECK-NEXT: ret 889 %v = call <8 x i32> @llvm.vp.add.v8i32(<8 x i32> %va, <8 x i32> splat (i32 -1), <8 x i1> %m, i32 %evl) 890 ret <8 x i32> %v 891} 892 893define <8 x i32> @vadd_vi_v8i32_unmasked(<8 x i32> %va, i32 zeroext %evl) { 894; CHECK-LABEL: vadd_vi_v8i32_unmasked: 895; CHECK: # %bb.0: 896; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma 897; CHECK-NEXT: vadd.vi v8, v8, -1 898; CHECK-NEXT: ret 899 %v = call <8 x i32> @llvm.vp.add.v8i32(<8 x i32> %va, <8 x i32> splat (i32 -1), <8 x i1> splat (i1 true), i32 %evl) 900 ret <8 x i32> %v 901} 902 903declare <16 x i32> @llvm.vp.add.v16i32(<16 x i32>, <16 x i32>, <16 x i1>, i32) 904 905define <16 x i32> @vadd_vv_v16i32(<16 x i32> %va, <16 x i32> %b, <16 x i1> %m, i32 zeroext %evl) { 906; CHECK-LABEL: vadd_vv_v16i32: 907; CHECK: # %bb.0: 908; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma 909; CHECK-NEXT: vadd.vv v8, v8, v12, v0.t 910; CHECK-NEXT: ret 911 %v = call <16 x i32> @llvm.vp.add.v16i32(<16 x i32> %va, <16 x i32> %b, <16 x i1> %m, i32 %evl) 912 ret <16 x i32> %v 913} 914 915define <16 x i32> @vadd_vv_v16i32_unmasked(<16 x i32> %va, <16 x i32> %b, i32 zeroext %evl) { 916; CHECK-LABEL: vadd_vv_v16i32_unmasked: 917; CHECK: # %bb.0: 918; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma 919; CHECK-NEXT: vadd.vv v8, v8, v12 920; CHECK-NEXT: ret 921 %v = call <16 x i32> @llvm.vp.add.v16i32(<16 x i32> %va, <16 x i32> %b, <16 x i1> splat (i1 true), i32 %evl) 922 ret <16 x i32> %v 923} 924 925define <16 x i32> @vadd_vx_v16i32(<16 x i32> %va, i32 %b, <16 x i1> %m, i32 zeroext %evl) { 926; CHECK-LABEL: vadd_vx_v16i32: 927; CHECK: # %bb.0: 928; CHECK-NEXT: vsetvli zero, a1, e32, m4, ta, ma 929; CHECK-NEXT: vadd.vx v8, v8, a0, v0.t 930; CHECK-NEXT: ret 931 %elt.head = insertelement <16 x i32> poison, i32 %b, i32 0 932 %vb = shufflevector <16 x i32> %elt.head, <16 x i32> poison, <16 x i32> zeroinitializer 933 %v = call <16 x i32> @llvm.vp.add.v16i32(<16 x i32> %va, <16 x i32> %vb, <16 x i1> %m, i32 %evl) 934 ret <16 x i32> %v 935} 936 937define <16 x i32> @vadd_vx_v16i32_unmasked(<16 x i32> %va, i32 %b, i32 zeroext %evl) { 938; CHECK-LABEL: vadd_vx_v16i32_unmasked: 939; CHECK: # %bb.0: 940; CHECK-NEXT: vsetvli zero, a1, e32, m4, ta, ma 941; CHECK-NEXT: vadd.vx v8, v8, a0 942; CHECK-NEXT: ret 943 %elt.head = insertelement <16 x i32> poison, i32 %b, i32 0 944 %vb = shufflevector <16 x i32> %elt.head, <16 x i32> poison, <16 x i32> zeroinitializer 945 %v = call <16 x i32> @llvm.vp.add.v16i32(<16 x i32> %va, <16 x i32> %vb, <16 x i1> splat (i1 true), i32 %evl) 946 ret <16 x i32> %v 947} 948 949define <16 x i32> @vadd_vi_v16i32(<16 x i32> %va, <16 x i1> %m, i32 zeroext %evl) { 950; CHECK-LABEL: vadd_vi_v16i32: 951; CHECK: # %bb.0: 952; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma 953; CHECK-NEXT: vadd.vi v8, v8, -1, v0.t 954; CHECK-NEXT: ret 955 %v = call <16 x i32> @llvm.vp.add.v16i32(<16 x i32> %va, <16 x i32> splat (i32 -1), <16 x i1> %m, i32 %evl) 956 ret <16 x i32> %v 957} 958 959define <16 x i32> @vadd_vi_v16i32_unmasked(<16 x i32> %va, i32 zeroext %evl) { 960; CHECK-LABEL: vadd_vi_v16i32_unmasked: 961; CHECK: # %bb.0: 962; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma 963; CHECK-NEXT: vadd.vi v8, v8, -1 964; CHECK-NEXT: ret 965 %v = call <16 x i32> @llvm.vp.add.v16i32(<16 x i32> %va, <16 x i32> splat (i32 -1), <16 x i1> splat (i1 true), i32 %evl) 966 ret <16 x i32> %v 967} 968 969declare <2 x i64> @llvm.vp.add.v2i64(<2 x i64>, <2 x i64>, <2 x i1>, i32) 970 971define <2 x i64> @vadd_vv_v2i64(<2 x i64> %va, <2 x i64> %b, <2 x i1> %m, i32 zeroext %evl) { 972; CHECK-LABEL: vadd_vv_v2i64: 973; CHECK: # %bb.0: 974; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma 975; CHECK-NEXT: vadd.vv v8, v8, v9, v0.t 976; CHECK-NEXT: ret 977 %v = call <2 x i64> @llvm.vp.add.v2i64(<2 x i64> %va, <2 x i64> %b, <2 x i1> %m, i32 %evl) 978 ret <2 x i64> %v 979} 980 981define <2 x i64> @vadd_vv_v2i64_unmasked(<2 x i64> %va, <2 x i64> %b, i32 zeroext %evl) { 982; CHECK-LABEL: vadd_vv_v2i64_unmasked: 983; CHECK: # %bb.0: 984; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma 985; CHECK-NEXT: vadd.vv v8, v8, v9 986; CHECK-NEXT: ret 987 %v = call <2 x i64> @llvm.vp.add.v2i64(<2 x i64> %va, <2 x i64> %b, <2 x i1> splat (i1 true), i32 %evl) 988 ret <2 x i64> %v 989} 990 991define <2 x i64> @vadd_vx_v2i64(<2 x i64> %va, i64 %b, <2 x i1> %m, i32 zeroext %evl) { 992; RV32-LABEL: vadd_vx_v2i64: 993; RV32: # %bb.0: 994; RV32-NEXT: addi sp, sp, -16 995; RV32-NEXT: .cfi_def_cfa_offset 16 996; RV32-NEXT: sw a0, 8(sp) 997; RV32-NEXT: sw a1, 12(sp) 998; RV32-NEXT: addi a0, sp, 8 999; RV32-NEXT: vsetivli zero, 2, e64, m1, ta, ma 1000; RV32-NEXT: vlse64.v v9, (a0), zero 1001; RV32-NEXT: vsetvli zero, a2, e64, m1, ta, ma 1002; RV32-NEXT: vadd.vv v8, v8, v9, v0.t 1003; RV32-NEXT: addi sp, sp, 16 1004; RV32-NEXT: .cfi_def_cfa_offset 0 1005; RV32-NEXT: ret 1006; 1007; RV64-LABEL: vadd_vx_v2i64: 1008; RV64: # %bb.0: 1009; RV64-NEXT: vsetvli zero, a1, e64, m1, ta, ma 1010; RV64-NEXT: vadd.vx v8, v8, a0, v0.t 1011; RV64-NEXT: ret 1012 %elt.head = insertelement <2 x i64> poison, i64 %b, i32 0 1013 %vb = shufflevector <2 x i64> %elt.head, <2 x i64> poison, <2 x i32> zeroinitializer 1014 %v = call <2 x i64> @llvm.vp.add.v2i64(<2 x i64> %va, <2 x i64> %vb, <2 x i1> %m, i32 %evl) 1015 ret <2 x i64> %v 1016} 1017 1018define <2 x i64> @vadd_vx_v2i64_unmasked(<2 x i64> %va, i64 %b, i32 zeroext %evl) { 1019; RV32-LABEL: vadd_vx_v2i64_unmasked: 1020; RV32: # %bb.0: 1021; RV32-NEXT: addi sp, sp, -16 1022; RV32-NEXT: .cfi_def_cfa_offset 16 1023; RV32-NEXT: sw a0, 8(sp) 1024; RV32-NEXT: sw a1, 12(sp) 1025; RV32-NEXT: addi a0, sp, 8 1026; RV32-NEXT: vsetivli zero, 2, e64, m1, ta, ma 1027; RV32-NEXT: vlse64.v v9, (a0), zero 1028; RV32-NEXT: vsetvli zero, a2, e64, m1, ta, ma 1029; RV32-NEXT: vadd.vv v8, v8, v9 1030; RV32-NEXT: addi sp, sp, 16 1031; RV32-NEXT: .cfi_def_cfa_offset 0 1032; RV32-NEXT: ret 1033; 1034; RV64-LABEL: vadd_vx_v2i64_unmasked: 1035; RV64: # %bb.0: 1036; RV64-NEXT: vsetvli zero, a1, e64, m1, ta, ma 1037; RV64-NEXT: vadd.vx v8, v8, a0 1038; RV64-NEXT: ret 1039 %elt.head = insertelement <2 x i64> poison, i64 %b, i32 0 1040 %vb = shufflevector <2 x i64> %elt.head, <2 x i64> poison, <2 x i32> zeroinitializer 1041 %v = call <2 x i64> @llvm.vp.add.v2i64(<2 x i64> %va, <2 x i64> %vb, <2 x i1> splat (i1 true), i32 %evl) 1042 ret <2 x i64> %v 1043} 1044 1045define <2 x i64> @vadd_vi_v2i64(<2 x i64> %va, <2 x i1> %m, i32 zeroext %evl) { 1046; CHECK-LABEL: vadd_vi_v2i64: 1047; CHECK: # %bb.0: 1048; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma 1049; CHECK-NEXT: vadd.vi v8, v8, -1, v0.t 1050; CHECK-NEXT: ret 1051 %v = call <2 x i64> @llvm.vp.add.v2i64(<2 x i64> %va, <2 x i64> splat (i64 -1), <2 x i1> %m, i32 %evl) 1052 ret <2 x i64> %v 1053} 1054 1055define <2 x i64> @vadd_vi_v2i64_unmasked(<2 x i64> %va, i32 zeroext %evl) { 1056; CHECK-LABEL: vadd_vi_v2i64_unmasked: 1057; CHECK: # %bb.0: 1058; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma 1059; CHECK-NEXT: vadd.vi v8, v8, -1 1060; CHECK-NEXT: ret 1061 %v = call <2 x i64> @llvm.vp.add.v2i64(<2 x i64> %va, <2 x i64> splat (i64 -1), <2 x i1> splat (i1 true), i32 %evl) 1062 ret <2 x i64> %v 1063} 1064 1065declare <4 x i64> @llvm.vp.add.v4i64(<4 x i64>, <4 x i64>, <4 x i1>, i32) 1066 1067define <4 x i64> @vadd_vv_v4i64(<4 x i64> %va, <4 x i64> %b, <4 x i1> %m, i32 zeroext %evl) { 1068; CHECK-LABEL: vadd_vv_v4i64: 1069; CHECK: # %bb.0: 1070; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma 1071; CHECK-NEXT: vadd.vv v8, v8, v10, v0.t 1072; CHECK-NEXT: ret 1073 %v = call <4 x i64> @llvm.vp.add.v4i64(<4 x i64> %va, <4 x i64> %b, <4 x i1> %m, i32 %evl) 1074 ret <4 x i64> %v 1075} 1076 1077define <4 x i64> @vadd_vv_v4i64_unmasked(<4 x i64> %va, <4 x i64> %b, i32 zeroext %evl) { 1078; CHECK-LABEL: vadd_vv_v4i64_unmasked: 1079; CHECK: # %bb.0: 1080; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma 1081; CHECK-NEXT: vadd.vv v8, v8, v10 1082; CHECK-NEXT: ret 1083 %v = call <4 x i64> @llvm.vp.add.v4i64(<4 x i64> %va, <4 x i64> %b, <4 x i1> splat (i1 true), i32 %evl) 1084 ret <4 x i64> %v 1085} 1086 1087define <4 x i64> @vadd_vx_v4i64(<4 x i64> %va, i64 %b, <4 x i1> %m, i32 zeroext %evl) { 1088; RV32-LABEL: vadd_vx_v4i64: 1089; RV32: # %bb.0: 1090; RV32-NEXT: addi sp, sp, -16 1091; RV32-NEXT: .cfi_def_cfa_offset 16 1092; RV32-NEXT: sw a0, 8(sp) 1093; RV32-NEXT: sw a1, 12(sp) 1094; RV32-NEXT: addi a0, sp, 8 1095; RV32-NEXT: vsetivli zero, 4, e64, m2, ta, ma 1096; RV32-NEXT: vlse64.v v10, (a0), zero 1097; RV32-NEXT: vsetvli zero, a2, e64, m2, ta, ma 1098; RV32-NEXT: vadd.vv v8, v8, v10, v0.t 1099; RV32-NEXT: addi sp, sp, 16 1100; RV32-NEXT: .cfi_def_cfa_offset 0 1101; RV32-NEXT: ret 1102; 1103; RV64-LABEL: vadd_vx_v4i64: 1104; RV64: # %bb.0: 1105; RV64-NEXT: vsetvli zero, a1, e64, m2, ta, ma 1106; RV64-NEXT: vadd.vx v8, v8, a0, v0.t 1107; RV64-NEXT: ret 1108 %elt.head = insertelement <4 x i64> poison, i64 %b, i32 0 1109 %vb = shufflevector <4 x i64> %elt.head, <4 x i64> poison, <4 x i32> zeroinitializer 1110 %v = call <4 x i64> @llvm.vp.add.v4i64(<4 x i64> %va, <4 x i64> %vb, <4 x i1> %m, i32 %evl) 1111 ret <4 x i64> %v 1112} 1113 1114define <4 x i64> @vadd_vx_v4i64_unmasked(<4 x i64> %va, i64 %b, i32 zeroext %evl) { 1115; RV32-LABEL: vadd_vx_v4i64_unmasked: 1116; RV32: # %bb.0: 1117; RV32-NEXT: addi sp, sp, -16 1118; RV32-NEXT: .cfi_def_cfa_offset 16 1119; RV32-NEXT: sw a0, 8(sp) 1120; RV32-NEXT: sw a1, 12(sp) 1121; RV32-NEXT: addi a0, sp, 8 1122; RV32-NEXT: vsetivli zero, 4, e64, m2, ta, ma 1123; RV32-NEXT: vlse64.v v10, (a0), zero 1124; RV32-NEXT: vsetvli zero, a2, e64, m2, ta, ma 1125; RV32-NEXT: vadd.vv v8, v8, v10 1126; RV32-NEXT: addi sp, sp, 16 1127; RV32-NEXT: .cfi_def_cfa_offset 0 1128; RV32-NEXT: ret 1129; 1130; RV64-LABEL: vadd_vx_v4i64_unmasked: 1131; RV64: # %bb.0: 1132; RV64-NEXT: vsetvli zero, a1, e64, m2, ta, ma 1133; RV64-NEXT: vadd.vx v8, v8, a0 1134; RV64-NEXT: ret 1135 %elt.head = insertelement <4 x i64> poison, i64 %b, i32 0 1136 %vb = shufflevector <4 x i64> %elt.head, <4 x i64> poison, <4 x i32> zeroinitializer 1137 %v = call <4 x i64> @llvm.vp.add.v4i64(<4 x i64> %va, <4 x i64> %vb, <4 x i1> splat (i1 true), i32 %evl) 1138 ret <4 x i64> %v 1139} 1140 1141define <4 x i64> @vadd_vi_v4i64(<4 x i64> %va, <4 x i1> %m, i32 zeroext %evl) { 1142; CHECK-LABEL: vadd_vi_v4i64: 1143; CHECK: # %bb.0: 1144; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma 1145; CHECK-NEXT: vadd.vi v8, v8, -1, v0.t 1146; CHECK-NEXT: ret 1147 %v = call <4 x i64> @llvm.vp.add.v4i64(<4 x i64> %va, <4 x i64> splat (i64 -1), <4 x i1> %m, i32 %evl) 1148 ret <4 x i64> %v 1149} 1150 1151define <4 x i64> @vadd_vi_v4i64_unmasked(<4 x i64> %va, i32 zeroext %evl) { 1152; CHECK-LABEL: vadd_vi_v4i64_unmasked: 1153; CHECK: # %bb.0: 1154; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma 1155; CHECK-NEXT: vadd.vi v8, v8, -1 1156; CHECK-NEXT: ret 1157 %v = call <4 x i64> @llvm.vp.add.v4i64(<4 x i64> %va, <4 x i64> splat (i64 -1), <4 x i1> splat (i1 true), i32 %evl) 1158 ret <4 x i64> %v 1159} 1160 1161declare <8 x i64> @llvm.vp.add.v8i64(<8 x i64>, <8 x i64>, <8 x i1>, i32) 1162 1163define <8 x i64> @vadd_vv_v8i64(<8 x i64> %va, <8 x i64> %b, <8 x i1> %m, i32 zeroext %evl) { 1164; CHECK-LABEL: vadd_vv_v8i64: 1165; CHECK: # %bb.0: 1166; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma 1167; CHECK-NEXT: vadd.vv v8, v8, v12, v0.t 1168; CHECK-NEXT: ret 1169 %v = call <8 x i64> @llvm.vp.add.v8i64(<8 x i64> %va, <8 x i64> %b, <8 x i1> %m, i32 %evl) 1170 ret <8 x i64> %v 1171} 1172 1173define <8 x i64> @vadd_vv_v8i64_unmasked(<8 x i64> %va, <8 x i64> %b, i32 zeroext %evl) { 1174; CHECK-LABEL: vadd_vv_v8i64_unmasked: 1175; CHECK: # %bb.0: 1176; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma 1177; CHECK-NEXT: vadd.vv v8, v8, v12 1178; CHECK-NEXT: ret 1179 %v = call <8 x i64> @llvm.vp.add.v8i64(<8 x i64> %va, <8 x i64> %b, <8 x i1> splat (i1 true), i32 %evl) 1180 ret <8 x i64> %v 1181} 1182 1183define <8 x i64> @vadd_vx_v8i64(<8 x i64> %va, i64 %b, <8 x i1> %m, i32 zeroext %evl) { 1184; RV32-LABEL: vadd_vx_v8i64: 1185; RV32: # %bb.0: 1186; RV32-NEXT: addi sp, sp, -16 1187; RV32-NEXT: .cfi_def_cfa_offset 16 1188; RV32-NEXT: sw a0, 8(sp) 1189; RV32-NEXT: sw a1, 12(sp) 1190; RV32-NEXT: addi a0, sp, 8 1191; RV32-NEXT: vsetivli zero, 8, e64, m4, ta, ma 1192; RV32-NEXT: vlse64.v v12, (a0), zero 1193; RV32-NEXT: vsetvli zero, a2, e64, m4, ta, ma 1194; RV32-NEXT: vadd.vv v8, v8, v12, v0.t 1195; RV32-NEXT: addi sp, sp, 16 1196; RV32-NEXT: .cfi_def_cfa_offset 0 1197; RV32-NEXT: ret 1198; 1199; RV64-LABEL: vadd_vx_v8i64: 1200; RV64: # %bb.0: 1201; RV64-NEXT: vsetvli zero, a1, e64, m4, ta, ma 1202; RV64-NEXT: vadd.vx v8, v8, a0, v0.t 1203; RV64-NEXT: ret 1204 %elt.head = insertelement <8 x i64> poison, i64 %b, i32 0 1205 %vb = shufflevector <8 x i64> %elt.head, <8 x i64> poison, <8 x i32> zeroinitializer 1206 %v = call <8 x i64> @llvm.vp.add.v8i64(<8 x i64> %va, <8 x i64> %vb, <8 x i1> %m, i32 %evl) 1207 ret <8 x i64> %v 1208} 1209 1210define <8 x i64> @vadd_vx_v8i64_unmasked(<8 x i64> %va, i64 %b, i32 zeroext %evl) { 1211; RV32-LABEL: vadd_vx_v8i64_unmasked: 1212; RV32: # %bb.0: 1213; RV32-NEXT: addi sp, sp, -16 1214; RV32-NEXT: .cfi_def_cfa_offset 16 1215; RV32-NEXT: sw a0, 8(sp) 1216; RV32-NEXT: sw a1, 12(sp) 1217; RV32-NEXT: addi a0, sp, 8 1218; RV32-NEXT: vsetivli zero, 8, e64, m4, ta, ma 1219; RV32-NEXT: vlse64.v v12, (a0), zero 1220; RV32-NEXT: vsetvli zero, a2, e64, m4, ta, ma 1221; RV32-NEXT: vadd.vv v8, v8, v12 1222; RV32-NEXT: addi sp, sp, 16 1223; RV32-NEXT: .cfi_def_cfa_offset 0 1224; RV32-NEXT: ret 1225; 1226; RV64-LABEL: vadd_vx_v8i64_unmasked: 1227; RV64: # %bb.0: 1228; RV64-NEXT: vsetvli zero, a1, e64, m4, ta, ma 1229; RV64-NEXT: vadd.vx v8, v8, a0 1230; RV64-NEXT: ret 1231 %elt.head = insertelement <8 x i64> poison, i64 %b, i32 0 1232 %vb = shufflevector <8 x i64> %elt.head, <8 x i64> poison, <8 x i32> zeroinitializer 1233 %v = call <8 x i64> @llvm.vp.add.v8i64(<8 x i64> %va, <8 x i64> %vb, <8 x i1> splat (i1 true), i32 %evl) 1234 ret <8 x i64> %v 1235} 1236 1237define <8 x i64> @vadd_vi_v8i64(<8 x i64> %va, <8 x i1> %m, i32 zeroext %evl) { 1238; CHECK-LABEL: vadd_vi_v8i64: 1239; CHECK: # %bb.0: 1240; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma 1241; CHECK-NEXT: vadd.vi v8, v8, -1, v0.t 1242; CHECK-NEXT: ret 1243 %v = call <8 x i64> @llvm.vp.add.v8i64(<8 x i64> %va, <8 x i64> splat (i64 -1), <8 x i1> %m, i32 %evl) 1244 ret <8 x i64> %v 1245} 1246 1247define <8 x i64> @vadd_vi_v8i64_unmasked(<8 x i64> %va, i32 zeroext %evl) { 1248; CHECK-LABEL: vadd_vi_v8i64_unmasked: 1249; CHECK: # %bb.0: 1250; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma 1251; CHECK-NEXT: vadd.vi v8, v8, -1 1252; CHECK-NEXT: ret 1253 %v = call <8 x i64> @llvm.vp.add.v8i64(<8 x i64> %va, <8 x i64> splat (i64 -1), <8 x i1> splat (i1 true), i32 %evl) 1254 ret <8 x i64> %v 1255} 1256 1257declare <16 x i64> @llvm.vp.add.v16i64(<16 x i64>, <16 x i64>, <16 x i1>, i32) 1258 1259define <16 x i64> @vadd_vv_v16i64(<16 x i64> %va, <16 x i64> %b, <16 x i1> %m, i32 zeroext %evl) { 1260; CHECK-LABEL: vadd_vv_v16i64: 1261; CHECK: # %bb.0: 1262; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma 1263; CHECK-NEXT: vadd.vv v8, v8, v16, v0.t 1264; CHECK-NEXT: ret 1265 %v = call <16 x i64> @llvm.vp.add.v16i64(<16 x i64> %va, <16 x i64> %b, <16 x i1> %m, i32 %evl) 1266 ret <16 x i64> %v 1267} 1268 1269define <16 x i64> @vadd_vv_v16i64_unmasked(<16 x i64> %va, <16 x i64> %b, i32 zeroext %evl) { 1270; CHECK-LABEL: vadd_vv_v16i64_unmasked: 1271; CHECK: # %bb.0: 1272; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma 1273; CHECK-NEXT: vadd.vv v8, v8, v16 1274; CHECK-NEXT: ret 1275 %v = call <16 x i64> @llvm.vp.add.v16i64(<16 x i64> %va, <16 x i64> %b, <16 x i1> splat (i1 true), i32 %evl) 1276 ret <16 x i64> %v 1277} 1278 1279define <16 x i64> @vadd_vx_v16i64(<16 x i64> %va, i64 %b, <16 x i1> %m, i32 zeroext %evl) { 1280; RV32-LABEL: vadd_vx_v16i64: 1281; RV32: # %bb.0: 1282; RV32-NEXT: addi sp, sp, -16 1283; RV32-NEXT: .cfi_def_cfa_offset 16 1284; RV32-NEXT: sw a0, 8(sp) 1285; RV32-NEXT: sw a1, 12(sp) 1286; RV32-NEXT: addi a0, sp, 8 1287; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma 1288; RV32-NEXT: vlse64.v v16, (a0), zero 1289; RV32-NEXT: vsetvli zero, a2, e64, m8, ta, ma 1290; RV32-NEXT: vadd.vv v8, v8, v16, v0.t 1291; RV32-NEXT: addi sp, sp, 16 1292; RV32-NEXT: .cfi_def_cfa_offset 0 1293; RV32-NEXT: ret 1294; 1295; RV64-LABEL: vadd_vx_v16i64: 1296; RV64: # %bb.0: 1297; RV64-NEXT: vsetvli zero, a1, e64, m8, ta, ma 1298; RV64-NEXT: vadd.vx v8, v8, a0, v0.t 1299; RV64-NEXT: ret 1300 %elt.head = insertelement <16 x i64> poison, i64 %b, i32 0 1301 %vb = shufflevector <16 x i64> %elt.head, <16 x i64> poison, <16 x i32> zeroinitializer 1302 %v = call <16 x i64> @llvm.vp.add.v16i64(<16 x i64> %va, <16 x i64> %vb, <16 x i1> %m, i32 %evl) 1303 ret <16 x i64> %v 1304} 1305 1306define <16 x i64> @vadd_vx_v16i64_unmasked(<16 x i64> %va, i64 %b, i32 zeroext %evl) { 1307; RV32-LABEL: vadd_vx_v16i64_unmasked: 1308; RV32: # %bb.0: 1309; RV32-NEXT: addi sp, sp, -16 1310; RV32-NEXT: .cfi_def_cfa_offset 16 1311; RV32-NEXT: sw a0, 8(sp) 1312; RV32-NEXT: sw a1, 12(sp) 1313; RV32-NEXT: addi a0, sp, 8 1314; RV32-NEXT: vsetivli zero, 16, e64, m8, ta, ma 1315; RV32-NEXT: vlse64.v v16, (a0), zero 1316; RV32-NEXT: vsetvli zero, a2, e64, m8, ta, ma 1317; RV32-NEXT: vadd.vv v8, v8, v16 1318; RV32-NEXT: addi sp, sp, 16 1319; RV32-NEXT: .cfi_def_cfa_offset 0 1320; RV32-NEXT: ret 1321; 1322; RV64-LABEL: vadd_vx_v16i64_unmasked: 1323; RV64: # %bb.0: 1324; RV64-NEXT: vsetvli zero, a1, e64, m8, ta, ma 1325; RV64-NEXT: vadd.vx v8, v8, a0 1326; RV64-NEXT: ret 1327 %elt.head = insertelement <16 x i64> poison, i64 %b, i32 0 1328 %vb = shufflevector <16 x i64> %elt.head, <16 x i64> poison, <16 x i32> zeroinitializer 1329 %v = call <16 x i64> @llvm.vp.add.v16i64(<16 x i64> %va, <16 x i64> %vb, <16 x i1> splat (i1 true), i32 %evl) 1330 ret <16 x i64> %v 1331} 1332 1333define <16 x i64> @vadd_vi_v16i64(<16 x i64> %va, <16 x i1> %m, i32 zeroext %evl) { 1334; CHECK-LABEL: vadd_vi_v16i64: 1335; CHECK: # %bb.0: 1336; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma 1337; CHECK-NEXT: vadd.vi v8, v8, -1, v0.t 1338; CHECK-NEXT: ret 1339 %v = call <16 x i64> @llvm.vp.add.v16i64(<16 x i64> %va, <16 x i64> splat (i64 -1), <16 x i1> %m, i32 %evl) 1340 ret <16 x i64> %v 1341} 1342 1343define <16 x i64> @vadd_vi_v16i64_unmasked(<16 x i64> %va, i32 zeroext %evl) { 1344; CHECK-LABEL: vadd_vi_v16i64_unmasked: 1345; CHECK: # %bb.0: 1346; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma 1347; CHECK-NEXT: vadd.vi v8, v8, -1 1348; CHECK-NEXT: ret 1349 %v = call <16 x i64> @llvm.vp.add.v16i64(<16 x i64> %va, <16 x i64> splat (i64 -1), <16 x i1> splat (i1 true), i32 %evl) 1350 ret <16 x i64> %v 1351} 1352 1353; Test that split-legalization works as expected. 1354 1355declare <32 x i64> @llvm.vp.add.v32i64(<32 x i64>, <32 x i64>, <32 x i1>, i32) 1356 1357define <32 x i64> @vadd_vx_v32i64(<32 x i64> %va, <32 x i1> %m, i32 zeroext %evl) { 1358; CHECK-LABEL: vadd_vx_v32i64: 1359; CHECK: # %bb.0: 1360; CHECK-NEXT: li a2, 16 1361; CHECK-NEXT: vsetivli zero, 2, e8, mf4, ta, ma 1362; CHECK-NEXT: vslidedown.vi v24, v0, 2 1363; CHECK-NEXT: mv a1, a0 1364; CHECK-NEXT: bltu a0, a2, .LBB108_2 1365; CHECK-NEXT: # %bb.1: 1366; CHECK-NEXT: li a1, 16 1367; CHECK-NEXT: .LBB108_2: 1368; CHECK-NEXT: vsetvli zero, a1, e64, m8, ta, ma 1369; CHECK-NEXT: vadd.vi v8, v8, -1, v0.t 1370; CHECK-NEXT: addi a1, a0, -16 1371; CHECK-NEXT: sltu a0, a0, a1 1372; CHECK-NEXT: addi a0, a0, -1 1373; CHECK-NEXT: and a0, a0, a1 1374; CHECK-NEXT: vmv1r.v v0, v24 1375; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma 1376; CHECK-NEXT: vadd.vi v16, v16, -1, v0.t 1377; CHECK-NEXT: ret 1378 %v = call <32 x i64> @llvm.vp.add.v32i64(<32 x i64> %va, <32 x i64> splat (i64 -1), <32 x i1> %m, i32 %evl) 1379 ret <32 x i64> %v 1380} 1381 1382define <32 x i64> @vadd_vi_v32i64_unmasked(<32 x i64> %va, i32 zeroext %evl) { 1383; CHECK-LABEL: vadd_vi_v32i64_unmasked: 1384; CHECK: # %bb.0: 1385; CHECK-NEXT: li a2, 16 1386; CHECK-NEXT: mv a1, a0 1387; CHECK-NEXT: bltu a0, a2, .LBB109_2 1388; CHECK-NEXT: # %bb.1: 1389; CHECK-NEXT: li a1, 16 1390; CHECK-NEXT: .LBB109_2: 1391; CHECK-NEXT: vsetvli zero, a1, e64, m8, ta, ma 1392; CHECK-NEXT: vadd.vi v8, v8, -1 1393; CHECK-NEXT: addi a1, a0, -16 1394; CHECK-NEXT: sltu a0, a0, a1 1395; CHECK-NEXT: addi a0, a0, -1 1396; CHECK-NEXT: and a0, a0, a1 1397; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma 1398; CHECK-NEXT: vadd.vi v16, v16, -1 1399; CHECK-NEXT: ret 1400 %v = call <32 x i64> @llvm.vp.add.v32i64(<32 x i64> %va, <32 x i64> splat (i64 -1), <32 x i1> splat (i1 true), i32 %evl) 1401 ret <32 x i64> %v 1402} 1403 1404define <32 x i64> @vadd_vx_v32i64_evl12(<32 x i64> %va, <32 x i1> %m) { 1405; CHECK-LABEL: vadd_vx_v32i64_evl12: 1406; CHECK: # %bb.0: 1407; CHECK-NEXT: vsetivli zero, 12, e64, m8, ta, ma 1408; CHECK-NEXT: vadd.vi v8, v8, -1, v0.t 1409; CHECK-NEXT: ret 1410 %v = call <32 x i64> @llvm.vp.add.v32i64(<32 x i64> %va, <32 x i64> splat (i64 -1), <32 x i1> %m, i32 12) 1411 ret <32 x i64> %v 1412} 1413 1414define <32 x i64> @vadd_vx_v32i64_evl27(<32 x i64> %va, <32 x i1> %m) { 1415; CHECK-LABEL: vadd_vx_v32i64_evl27: 1416; CHECK: # %bb.0: 1417; CHECK-NEXT: vsetivli zero, 2, e8, mf4, ta, ma 1418; CHECK-NEXT: vslidedown.vi v24, v0, 2 1419; CHECK-NEXT: vsetivli zero, 16, e64, m8, ta, ma 1420; CHECK-NEXT: vadd.vi v8, v8, -1, v0.t 1421; CHECK-NEXT: vmv1r.v v0, v24 1422; CHECK-NEXT: vsetivli zero, 11, e64, m8, ta, ma 1423; CHECK-NEXT: vadd.vi v16, v16, -1, v0.t 1424; CHECK-NEXT: ret 1425 %v = call <32 x i64> @llvm.vp.add.v32i64(<32 x i64> %va, <32 x i64> splat (i64 -1), <32 x i1> %m, i32 27) 1426 ret <32 x i64> %v 1427} 1428