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