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