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