1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32 3; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64 4 5define <vscale x 1 x i8> @vsub_vv_nxv1i8(<vscale x 1 x i8> %va, <vscale x 1 x i8> %vb) { 6; CHECK-LABEL: vsub_vv_nxv1i8: 7; CHECK: # %bb.0: 8; CHECK-NEXT: vsetvli a0, zero, e8, mf8, ta, ma 9; CHECK-NEXT: vsub.vv v8, v8, v9 10; CHECK-NEXT: ret 11 %vc = sub <vscale x 1 x i8> %va, %vb 12 ret <vscale x 1 x i8> %vc 13} 14 15define <vscale x 1 x i8> @vsub_vx_nxv1i8(<vscale x 1 x i8> %va, i8 signext %b) { 16; CHECK-LABEL: vsub_vx_nxv1i8: 17; CHECK: # %bb.0: 18; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, ma 19; CHECK-NEXT: vsub.vx v8, v8, a0 20; CHECK-NEXT: ret 21 %head = insertelement <vscale x 1 x i8> poison, i8 %b, i32 0 22 %splat = shufflevector <vscale x 1 x i8> %head, <vscale x 1 x i8> poison, <vscale x 1 x i32> zeroinitializer 23 %vc = sub <vscale x 1 x i8> %va, %splat 24 ret <vscale x 1 x i8> %vc 25} 26 27define <vscale x 1 x i8> @vsub_vx_nxv1i8_0(<vscale x 1 x i8> %va) { 28; CHECK-LABEL: vsub_vx_nxv1i8_0: 29; CHECK: # %bb.0: 30; CHECK-NEXT: li a0, 1 31; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, ma 32; CHECK-NEXT: vsub.vx v8, v8, a0 33; CHECK-NEXT: ret 34 %vc = sub <vscale x 1 x i8> %va, splat (i8 1) 35 ret <vscale x 1 x i8> %vc 36} 37 38; Test constant subs to see if we can optimize them away for scalable vectors. 39define <vscale x 1 x i8> @vsub_ii_nxv1i8_1() { 40; CHECK-LABEL: vsub_ii_nxv1i8_1: 41; CHECK: # %bb.0: 42; CHECK-NEXT: vsetvli a0, zero, e8, mf8, ta, ma 43; CHECK-NEXT: vmv.v.i v8, -1 44; CHECK-NEXT: ret 45 %vc = sub <vscale x 1 x i8> splat (i8 2), splat (i8 3) 46 ret <vscale x 1 x i8> %vc 47} 48 49define <vscale x 2 x i8> @vsub_vv_nxv2i8(<vscale x 2 x i8> %va, <vscale x 2 x i8> %vb) { 50; CHECK-LABEL: vsub_vv_nxv2i8: 51; CHECK: # %bb.0: 52; CHECK-NEXT: vsetvli a0, zero, e8, mf4, ta, ma 53; CHECK-NEXT: vsub.vv v8, v8, v9 54; CHECK-NEXT: ret 55 %vc = sub <vscale x 2 x i8> %va, %vb 56 ret <vscale x 2 x i8> %vc 57} 58 59define <vscale x 2 x i8> @vsub_vx_nxv2i8(<vscale x 2 x i8> %va, i8 signext %b) { 60; CHECK-LABEL: vsub_vx_nxv2i8: 61; CHECK: # %bb.0: 62; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, ma 63; CHECK-NEXT: vsub.vx v8, v8, a0 64; CHECK-NEXT: ret 65 %head = insertelement <vscale x 2 x i8> poison, i8 %b, i32 0 66 %splat = shufflevector <vscale x 2 x i8> %head, <vscale x 2 x i8> poison, <vscale x 2 x i32> zeroinitializer 67 %vc = sub <vscale x 2 x i8> %va, %splat 68 ret <vscale x 2 x i8> %vc 69} 70 71define <vscale x 2 x i8> @vsub_vx_nxv2i8_0(<vscale x 2 x i8> %va) { 72; CHECK-LABEL: vsub_vx_nxv2i8_0: 73; CHECK: # %bb.0: 74; CHECK-NEXT: li a0, 1 75; CHECK-NEXT: vsetvli a1, zero, e8, mf4, ta, ma 76; CHECK-NEXT: vsub.vx v8, v8, a0 77; CHECK-NEXT: ret 78 %vc = sub <vscale x 2 x i8> %va, splat (i8 1) 79 ret <vscale x 2 x i8> %vc 80} 81 82define <vscale x 4 x i8> @vsub_vv_nxv4i8(<vscale x 4 x i8> %va, <vscale x 4 x i8> %vb) { 83; CHECK-LABEL: vsub_vv_nxv4i8: 84; CHECK: # %bb.0: 85; CHECK-NEXT: vsetvli a0, zero, e8, mf2, ta, ma 86; CHECK-NEXT: vsub.vv v8, v8, v9 87; CHECK-NEXT: ret 88 %vc = sub <vscale x 4 x i8> %va, %vb 89 ret <vscale x 4 x i8> %vc 90} 91 92define <vscale x 4 x i8> @vsub_vx_nxv4i8(<vscale x 4 x i8> %va, i8 signext %b) { 93; CHECK-LABEL: vsub_vx_nxv4i8: 94; CHECK: # %bb.0: 95; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma 96; CHECK-NEXT: vsub.vx v8, v8, a0 97; CHECK-NEXT: ret 98 %head = insertelement <vscale x 4 x i8> poison, i8 %b, i32 0 99 %splat = shufflevector <vscale x 4 x i8> %head, <vscale x 4 x i8> poison, <vscale x 4 x i32> zeroinitializer 100 %vc = sub <vscale x 4 x i8> %va, %splat 101 ret <vscale x 4 x i8> %vc 102} 103 104define <vscale x 4 x i8> @vsub_vx_nxv4i8_0(<vscale x 4 x i8> %va) { 105; CHECK-LABEL: vsub_vx_nxv4i8_0: 106; CHECK: # %bb.0: 107; CHECK-NEXT: li a0, 1 108; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma 109; CHECK-NEXT: vsub.vx v8, v8, a0 110; CHECK-NEXT: ret 111 %vc = sub <vscale x 4 x i8> %va, splat (i8 1) 112 ret <vscale x 4 x i8> %vc 113} 114 115define <vscale x 8 x i8> @vsub_vv_nxv8i8(<vscale x 8 x i8> %va, <vscale x 8 x i8> %vb) { 116; CHECK-LABEL: vsub_vv_nxv8i8: 117; CHECK: # %bb.0: 118; CHECK-NEXT: vsetvli a0, zero, e8, m1, ta, ma 119; CHECK-NEXT: vsub.vv v8, v8, v9 120; CHECK-NEXT: ret 121 %vc = sub <vscale x 8 x i8> %va, %vb 122 ret <vscale x 8 x i8> %vc 123} 124 125define <vscale x 8 x i8> @vsub_vx_nxv8i8(<vscale x 8 x i8> %va, i8 signext %b) { 126; CHECK-LABEL: vsub_vx_nxv8i8: 127; CHECK: # %bb.0: 128; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma 129; CHECK-NEXT: vsub.vx v8, v8, a0 130; CHECK-NEXT: ret 131 %head = insertelement <vscale x 8 x i8> poison, i8 %b, i32 0 132 %splat = shufflevector <vscale x 8 x i8> %head, <vscale x 8 x i8> poison, <vscale x 8 x i32> zeroinitializer 133 %vc = sub <vscale x 8 x i8> %va, %splat 134 ret <vscale x 8 x i8> %vc 135} 136 137define <vscale x 8 x i8> @vsub_vx_nxv8i8_0(<vscale x 8 x i8> %va) { 138; CHECK-LABEL: vsub_vx_nxv8i8_0: 139; CHECK: # %bb.0: 140; CHECK-NEXT: li a0, 1 141; CHECK-NEXT: vsetvli a1, zero, e8, m1, ta, ma 142; CHECK-NEXT: vsub.vx v8, v8, a0 143; CHECK-NEXT: ret 144 %vc = sub <vscale x 8 x i8> %va, splat (i8 1) 145 ret <vscale x 8 x i8> %vc 146} 147 148define <vscale x 16 x i8> @vsub_vv_nxv16i8(<vscale x 16 x i8> %va, <vscale x 16 x i8> %vb) { 149; CHECK-LABEL: vsub_vv_nxv16i8: 150; CHECK: # %bb.0: 151; CHECK-NEXT: vsetvli a0, zero, e8, m2, ta, ma 152; CHECK-NEXT: vsub.vv v8, v8, v10 153; CHECK-NEXT: ret 154 %vc = sub <vscale x 16 x i8> %va, %vb 155 ret <vscale x 16 x i8> %vc 156} 157 158define <vscale x 16 x i8> @vsub_vx_nxv16i8(<vscale x 16 x i8> %va, i8 signext %b) { 159; CHECK-LABEL: vsub_vx_nxv16i8: 160; CHECK: # %bb.0: 161; CHECK-NEXT: vsetvli a1, zero, e8, m2, ta, ma 162; CHECK-NEXT: vsub.vx v8, v8, a0 163; CHECK-NEXT: ret 164 %head = insertelement <vscale x 16 x i8> poison, i8 %b, i32 0 165 %splat = shufflevector <vscale x 16 x i8> %head, <vscale x 16 x i8> poison, <vscale x 16 x i32> zeroinitializer 166 %vc = sub <vscale x 16 x i8> %va, %splat 167 ret <vscale x 16 x i8> %vc 168} 169 170define <vscale x 16 x i8> @vsub_vx_nxv16i8_0(<vscale x 16 x i8> %va) { 171; CHECK-LABEL: vsub_vx_nxv16i8_0: 172; CHECK: # %bb.0: 173; CHECK-NEXT: li a0, 1 174; CHECK-NEXT: vsetvli a1, zero, e8, m2, ta, ma 175; CHECK-NEXT: vsub.vx v8, v8, a0 176; CHECK-NEXT: ret 177 %vc = sub <vscale x 16 x i8> %va, splat (i8 1) 178 ret <vscale x 16 x i8> %vc 179} 180 181define <vscale x 32 x i8> @vsub_vv_nxv32i8(<vscale x 32 x i8> %va, <vscale x 32 x i8> %vb) { 182; CHECK-LABEL: vsub_vv_nxv32i8: 183; CHECK: # %bb.0: 184; CHECK-NEXT: vsetvli a0, zero, e8, m4, ta, ma 185; CHECK-NEXT: vsub.vv v8, v8, v12 186; CHECK-NEXT: ret 187 %vc = sub <vscale x 32 x i8> %va, %vb 188 ret <vscale x 32 x i8> %vc 189} 190 191define <vscale x 32 x i8> @vsub_vx_nxv32i8(<vscale x 32 x i8> %va, i8 signext %b) { 192; CHECK-LABEL: vsub_vx_nxv32i8: 193; CHECK: # %bb.0: 194; CHECK-NEXT: vsetvli a1, zero, e8, m4, ta, ma 195; CHECK-NEXT: vsub.vx v8, v8, a0 196; CHECK-NEXT: ret 197 %head = insertelement <vscale x 32 x i8> poison, i8 %b, i32 0 198 %splat = shufflevector <vscale x 32 x i8> %head, <vscale x 32 x i8> poison, <vscale x 32 x i32> zeroinitializer 199 %vc = sub <vscale x 32 x i8> %va, %splat 200 ret <vscale x 32 x i8> %vc 201} 202 203define <vscale x 32 x i8> @vsub_vx_nxv32i8_0(<vscale x 32 x i8> %va) { 204; CHECK-LABEL: vsub_vx_nxv32i8_0: 205; CHECK: # %bb.0: 206; CHECK-NEXT: li a0, 1 207; CHECK-NEXT: vsetvli a1, zero, e8, m4, ta, ma 208; CHECK-NEXT: vsub.vx v8, v8, a0 209; CHECK-NEXT: ret 210 %vc = sub <vscale x 32 x i8> %va, splat (i8 1) 211 ret <vscale x 32 x i8> %vc 212} 213 214define <vscale x 64 x i8> @vsub_vv_nxv64i8(<vscale x 64 x i8> %va, <vscale x 64 x i8> %vb) { 215; CHECK-LABEL: vsub_vv_nxv64i8: 216; CHECK: # %bb.0: 217; CHECK-NEXT: vsetvli a0, zero, e8, m8, ta, ma 218; CHECK-NEXT: vsub.vv v8, v8, v16 219; CHECK-NEXT: ret 220 %vc = sub <vscale x 64 x i8> %va, %vb 221 ret <vscale x 64 x i8> %vc 222} 223 224define <vscale x 64 x i8> @vsub_vx_nxv64i8(<vscale x 64 x i8> %va, i8 signext %b) { 225; CHECK-LABEL: vsub_vx_nxv64i8: 226; CHECK: # %bb.0: 227; CHECK-NEXT: vsetvli a1, zero, e8, m8, ta, ma 228; CHECK-NEXT: vsub.vx v8, v8, a0 229; CHECK-NEXT: ret 230 %head = insertelement <vscale x 64 x i8> poison, i8 %b, i32 0 231 %splat = shufflevector <vscale x 64 x i8> %head, <vscale x 64 x i8> poison, <vscale x 64 x i32> zeroinitializer 232 %vc = sub <vscale x 64 x i8> %va, %splat 233 ret <vscale x 64 x i8> %vc 234} 235 236define <vscale x 64 x i8> @vsub_vx_nxv64i8_0(<vscale x 64 x i8> %va) { 237; CHECK-LABEL: vsub_vx_nxv64i8_0: 238; CHECK: # %bb.0: 239; CHECK-NEXT: li a0, 1 240; CHECK-NEXT: vsetvli a1, zero, e8, m8, ta, ma 241; CHECK-NEXT: vsub.vx v8, v8, a0 242; CHECK-NEXT: ret 243 %vc = sub <vscale x 64 x i8> %va, splat (i8 1) 244 ret <vscale x 64 x i8> %vc 245} 246 247define <vscale x 1 x i16> @vsub_vv_nxv1i16(<vscale x 1 x i16> %va, <vscale x 1 x i16> %vb) { 248; CHECK-LABEL: vsub_vv_nxv1i16: 249; CHECK: # %bb.0: 250; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 251; CHECK-NEXT: vsub.vv v8, v8, v9 252; CHECK-NEXT: ret 253 %vc = sub <vscale x 1 x i16> %va, %vb 254 ret <vscale x 1 x i16> %vc 255} 256 257define <vscale x 1 x i16> @vsub_vx_nxv1i16(<vscale x 1 x i16> %va, i16 signext %b) { 258; CHECK-LABEL: vsub_vx_nxv1i16: 259; CHECK: # %bb.0: 260; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma 261; CHECK-NEXT: vsub.vx v8, v8, a0 262; CHECK-NEXT: ret 263 %head = insertelement <vscale x 1 x i16> poison, i16 %b, i32 0 264 %splat = shufflevector <vscale x 1 x i16> %head, <vscale x 1 x i16> poison, <vscale x 1 x i32> zeroinitializer 265 %vc = sub <vscale x 1 x i16> %va, %splat 266 ret <vscale x 1 x i16> %vc 267} 268 269define <vscale x 1 x i16> @vsub_vx_nxv1i16_0(<vscale x 1 x i16> %va) { 270; CHECK-LABEL: vsub_vx_nxv1i16_0: 271; CHECK: # %bb.0: 272; CHECK-NEXT: li a0, 1 273; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma 274; CHECK-NEXT: vsub.vx v8, v8, a0 275; CHECK-NEXT: ret 276 %vc = sub <vscale x 1 x i16> %va, splat (i16 1) 277 ret <vscale x 1 x i16> %vc 278} 279 280define <vscale x 2 x i16> @vsub_vv_nxv2i16(<vscale x 2 x i16> %va, <vscale x 2 x i16> %vb) { 281; CHECK-LABEL: vsub_vv_nxv2i16: 282; CHECK: # %bb.0: 283; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 284; CHECK-NEXT: vsub.vv v8, v8, v9 285; CHECK-NEXT: ret 286 %vc = sub <vscale x 2 x i16> %va, %vb 287 ret <vscale x 2 x i16> %vc 288} 289 290define <vscale x 2 x i16> @vsub_vx_nxv2i16(<vscale x 2 x i16> %va, i16 signext %b) { 291; CHECK-LABEL: vsub_vx_nxv2i16: 292; CHECK: # %bb.0: 293; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma 294; CHECK-NEXT: vsub.vx v8, v8, a0 295; CHECK-NEXT: ret 296 %head = insertelement <vscale x 2 x i16> poison, i16 %b, i32 0 297 %splat = shufflevector <vscale x 2 x i16> %head, <vscale x 2 x i16> poison, <vscale x 2 x i32> zeroinitializer 298 %vc = sub <vscale x 2 x i16> %va, %splat 299 ret <vscale x 2 x i16> %vc 300} 301 302define <vscale x 2 x i16> @vsub_vx_nxv2i16_0(<vscale x 2 x i16> %va) { 303; CHECK-LABEL: vsub_vx_nxv2i16_0: 304; CHECK: # %bb.0: 305; CHECK-NEXT: li a0, 1 306; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma 307; CHECK-NEXT: vsub.vx v8, v8, a0 308; CHECK-NEXT: ret 309 %vc = sub <vscale x 2 x i16> %va, splat (i16 1) 310 ret <vscale x 2 x i16> %vc 311} 312 313define <vscale x 4 x i16> @vsub_vv_nxv4i16(<vscale x 4 x i16> %va, <vscale x 4 x i16> %vb) { 314; CHECK-LABEL: vsub_vv_nxv4i16: 315; CHECK: # %bb.0: 316; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma 317; CHECK-NEXT: vsub.vv v8, v8, v9 318; CHECK-NEXT: ret 319 %vc = sub <vscale x 4 x i16> %va, %vb 320 ret <vscale x 4 x i16> %vc 321} 322 323define <vscale x 4 x i16> @vsub_vx_nxv4i16(<vscale x 4 x i16> %va, i16 signext %b) { 324; CHECK-LABEL: vsub_vx_nxv4i16: 325; CHECK: # %bb.0: 326; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma 327; CHECK-NEXT: vsub.vx v8, v8, a0 328; CHECK-NEXT: ret 329 %head = insertelement <vscale x 4 x i16> poison, i16 %b, i32 0 330 %splat = shufflevector <vscale x 4 x i16> %head, <vscale x 4 x i16> poison, <vscale x 4 x i32> zeroinitializer 331 %vc = sub <vscale x 4 x i16> %va, %splat 332 ret <vscale x 4 x i16> %vc 333} 334 335define <vscale x 4 x i16> @vsub_vx_nxv4i16_0(<vscale x 4 x i16> %va) { 336; CHECK-LABEL: vsub_vx_nxv4i16_0: 337; CHECK: # %bb.0: 338; CHECK-NEXT: li a0, 1 339; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma 340; CHECK-NEXT: vsub.vx v8, v8, a0 341; CHECK-NEXT: ret 342 %vc = sub <vscale x 4 x i16> %va, splat (i16 1) 343 ret <vscale x 4 x i16> %vc 344} 345 346define <vscale x 8 x i16> @vsub_vv_nxv8i16(<vscale x 8 x i16> %va, <vscale x 8 x i16> %vb) { 347; CHECK-LABEL: vsub_vv_nxv8i16: 348; CHECK: # %bb.0: 349; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma 350; CHECK-NEXT: vsub.vv v8, v8, v10 351; CHECK-NEXT: ret 352 %vc = sub <vscale x 8 x i16> %va, %vb 353 ret <vscale x 8 x i16> %vc 354} 355 356define <vscale x 8 x i16> @vsub_vx_nxv8i16(<vscale x 8 x i16> %va, i16 signext %b) { 357; CHECK-LABEL: vsub_vx_nxv8i16: 358; CHECK: # %bb.0: 359; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma 360; CHECK-NEXT: vsub.vx v8, v8, a0 361; CHECK-NEXT: ret 362 %head = insertelement <vscale x 8 x i16> poison, i16 %b, i32 0 363 %splat = shufflevector <vscale x 8 x i16> %head, <vscale x 8 x i16> poison, <vscale x 8 x i32> zeroinitializer 364 %vc = sub <vscale x 8 x i16> %va, %splat 365 ret <vscale x 8 x i16> %vc 366} 367 368define <vscale x 8 x i16> @vsub_vx_nxv8i16_0(<vscale x 8 x i16> %va) { 369; CHECK-LABEL: vsub_vx_nxv8i16_0: 370; CHECK: # %bb.0: 371; CHECK-NEXT: li a0, 1 372; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma 373; CHECK-NEXT: vsub.vx v8, v8, a0 374; CHECK-NEXT: ret 375 %vc = sub <vscale x 8 x i16> %va, splat (i16 1) 376 ret <vscale x 8 x i16> %vc 377} 378 379define <vscale x 16 x i16> @vsub_vv_nxv16i16(<vscale x 16 x i16> %va, <vscale x 16 x i16> %vb) { 380; CHECK-LABEL: vsub_vv_nxv16i16: 381; CHECK: # %bb.0: 382; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, ma 383; CHECK-NEXT: vsub.vv v8, v8, v12 384; CHECK-NEXT: ret 385 %vc = sub <vscale x 16 x i16> %va, %vb 386 ret <vscale x 16 x i16> %vc 387} 388 389define <vscale x 16 x i16> @vsub_vx_nxv16i16(<vscale x 16 x i16> %va, i16 signext %b) { 390; CHECK-LABEL: vsub_vx_nxv16i16: 391; CHECK: # %bb.0: 392; CHECK-NEXT: vsetvli a1, zero, e16, m4, ta, ma 393; CHECK-NEXT: vsub.vx v8, v8, a0 394; CHECK-NEXT: ret 395 %head = insertelement <vscale x 16 x i16> poison, i16 %b, i32 0 396 %splat = shufflevector <vscale x 16 x i16> %head, <vscale x 16 x i16> poison, <vscale x 16 x i32> zeroinitializer 397 %vc = sub <vscale x 16 x i16> %va, %splat 398 ret <vscale x 16 x i16> %vc 399} 400 401define <vscale x 16 x i16> @vsub_vx_nxv16i16_0(<vscale x 16 x i16> %va) { 402; CHECK-LABEL: vsub_vx_nxv16i16_0: 403; CHECK: # %bb.0: 404; CHECK-NEXT: li a0, 1 405; CHECK-NEXT: vsetvli a1, zero, e16, m4, ta, ma 406; CHECK-NEXT: vsub.vx v8, v8, a0 407; CHECK-NEXT: ret 408 %vc = sub <vscale x 16 x i16> %va, splat (i16 1) 409 ret <vscale x 16 x i16> %vc 410} 411 412define <vscale x 32 x i16> @vsub_vv_nxv32i16(<vscale x 32 x i16> %va, <vscale x 32 x i16> %vb) { 413; CHECK-LABEL: vsub_vv_nxv32i16: 414; CHECK: # %bb.0: 415; CHECK-NEXT: vsetvli a0, zero, e16, m8, ta, ma 416; CHECK-NEXT: vsub.vv v8, v8, v16 417; CHECK-NEXT: ret 418 %vc = sub <vscale x 32 x i16> %va, %vb 419 ret <vscale x 32 x i16> %vc 420} 421 422define <vscale x 32 x i16> @vsub_vx_nxv32i16(<vscale x 32 x i16> %va, i16 signext %b) { 423; CHECK-LABEL: vsub_vx_nxv32i16: 424; CHECK: # %bb.0: 425; CHECK-NEXT: vsetvli a1, zero, e16, m8, ta, ma 426; CHECK-NEXT: vsub.vx v8, v8, a0 427; CHECK-NEXT: ret 428 %head = insertelement <vscale x 32 x i16> poison, i16 %b, i32 0 429 %splat = shufflevector <vscale x 32 x i16> %head, <vscale x 32 x i16> poison, <vscale x 32 x i32> zeroinitializer 430 %vc = sub <vscale x 32 x i16> %va, %splat 431 ret <vscale x 32 x i16> %vc 432} 433 434define <vscale x 32 x i16> @vsub_vx_nxv32i16_0(<vscale x 32 x i16> %va) { 435; CHECK-LABEL: vsub_vx_nxv32i16_0: 436; CHECK: # %bb.0: 437; CHECK-NEXT: li a0, 1 438; CHECK-NEXT: vsetvli a1, zero, e16, m8, ta, ma 439; CHECK-NEXT: vsub.vx v8, v8, a0 440; CHECK-NEXT: ret 441 %vc = sub <vscale x 32 x i16> %va, splat (i16 1) 442 ret <vscale x 32 x i16> %vc 443} 444 445define <vscale x 1 x i32> @vsub_vv_nxv1i32(<vscale x 1 x i32> %va, <vscale x 1 x i32> %vb) { 446; CHECK-LABEL: vsub_vv_nxv1i32: 447; CHECK: # %bb.0: 448; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma 449; CHECK-NEXT: vsub.vv v8, v8, v9 450; CHECK-NEXT: ret 451 %vc = sub <vscale x 1 x i32> %va, %vb 452 ret <vscale x 1 x i32> %vc 453} 454 455define <vscale x 1 x i32> @vsub_vx_nxv1i32(<vscale x 1 x i32> %va, i32 signext %b) { 456; CHECK-LABEL: vsub_vx_nxv1i32: 457; CHECK: # %bb.0: 458; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, ma 459; CHECK-NEXT: vsub.vx v8, v8, a0 460; CHECK-NEXT: ret 461 %head = insertelement <vscale x 1 x i32> poison, i32 %b, i32 0 462 %splat = shufflevector <vscale x 1 x i32> %head, <vscale x 1 x i32> poison, <vscale x 1 x i32> zeroinitializer 463 %vc = sub <vscale x 1 x i32> %va, %splat 464 ret <vscale x 1 x i32> %vc 465} 466 467define <vscale x 1 x i32> @vsub_vx_nxv1i32_0(<vscale x 1 x i32> %va) { 468; CHECK-LABEL: vsub_vx_nxv1i32_0: 469; CHECK: # %bb.0: 470; CHECK-NEXT: li a0, 1 471; CHECK-NEXT: vsetvli a1, zero, e32, mf2, ta, ma 472; CHECK-NEXT: vsub.vx v8, v8, a0 473; CHECK-NEXT: ret 474 %vc = sub <vscale x 1 x i32> %va, splat (i32 1) 475 ret <vscale x 1 x i32> %vc 476} 477 478define <vscale x 2 x i32> @vsub_vv_nxv2i32(<vscale x 2 x i32> %va, <vscale x 2 x i32> %vb) { 479; CHECK-LABEL: vsub_vv_nxv2i32: 480; CHECK: # %bb.0: 481; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma 482; CHECK-NEXT: vsub.vv v8, v8, v9 483; CHECK-NEXT: ret 484 %vc = sub <vscale x 2 x i32> %va, %vb 485 ret <vscale x 2 x i32> %vc 486} 487 488define <vscale x 2 x i32> @vsub_vx_nxv2i32(<vscale x 2 x i32> %va, i32 signext %b) { 489; CHECK-LABEL: vsub_vx_nxv2i32: 490; CHECK: # %bb.0: 491; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma 492; CHECK-NEXT: vsub.vx v8, v8, a0 493; CHECK-NEXT: ret 494 %head = insertelement <vscale x 2 x i32> poison, i32 %b, i32 0 495 %splat = shufflevector <vscale x 2 x i32> %head, <vscale x 2 x i32> poison, <vscale x 2 x i32> zeroinitializer 496 %vc = sub <vscale x 2 x i32> %va, %splat 497 ret <vscale x 2 x i32> %vc 498} 499 500define <vscale x 2 x i32> @vsub_vx_nxv2i32_0(<vscale x 2 x i32> %va) { 501; CHECK-LABEL: vsub_vx_nxv2i32_0: 502; CHECK: # %bb.0: 503; CHECK-NEXT: li a0, 1 504; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma 505; CHECK-NEXT: vsub.vx v8, v8, a0 506; CHECK-NEXT: ret 507 %vc = sub <vscale x 2 x i32> %va, splat (i32 1) 508 ret <vscale x 2 x i32> %vc 509} 510 511define <vscale x 4 x i32> @vsub_vv_nxv4i32(<vscale x 4 x i32> %va, <vscale x 4 x i32> %vb) { 512; CHECK-LABEL: vsub_vv_nxv4i32: 513; CHECK: # %bb.0: 514; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma 515; CHECK-NEXT: vsub.vv v8, v8, v10 516; CHECK-NEXT: ret 517 %vc = sub <vscale x 4 x i32> %va, %vb 518 ret <vscale x 4 x i32> %vc 519} 520 521define <vscale x 4 x i32> @vsub_vx_nxv4i32(<vscale x 4 x i32> %va, i32 signext %b) { 522; CHECK-LABEL: vsub_vx_nxv4i32: 523; CHECK: # %bb.0: 524; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, ma 525; CHECK-NEXT: vsub.vx v8, v8, a0 526; CHECK-NEXT: ret 527 %head = insertelement <vscale x 4 x i32> poison, i32 %b, i32 0 528 %splat = shufflevector <vscale x 4 x i32> %head, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer 529 %vc = sub <vscale x 4 x i32> %va, %splat 530 ret <vscale x 4 x i32> %vc 531} 532 533define <vscale x 4 x i32> @vsub_vx_nxv4i32_0(<vscale x 4 x i32> %va) { 534; CHECK-LABEL: vsub_vx_nxv4i32_0: 535; CHECK: # %bb.0: 536; CHECK-NEXT: li a0, 1 537; CHECK-NEXT: vsetvli a1, zero, e32, m2, ta, ma 538; CHECK-NEXT: vsub.vx v8, v8, a0 539; CHECK-NEXT: ret 540 %vc = sub <vscale x 4 x i32> %va, splat (i32 1) 541 ret <vscale x 4 x i32> %vc 542} 543 544define <vscale x 8 x i32> @vsub_vv_nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i32> %vb) { 545; CHECK-LABEL: vsub_vv_nxv8i32: 546; CHECK: # %bb.0: 547; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma 548; CHECK-NEXT: vsub.vv v8, v8, v12 549; CHECK-NEXT: ret 550 %vc = sub <vscale x 8 x i32> %va, %vb 551 ret <vscale x 8 x i32> %vc 552} 553 554define <vscale x 8 x i32> @vsub_vx_nxv8i32(<vscale x 8 x i32> %va, i32 signext %b) { 555; CHECK-LABEL: vsub_vx_nxv8i32: 556; CHECK: # %bb.0: 557; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma 558; CHECK-NEXT: vsub.vx v8, v8, a0 559; CHECK-NEXT: ret 560 %head = insertelement <vscale x 8 x i32> poison, i32 %b, i32 0 561 %splat = shufflevector <vscale x 8 x i32> %head, <vscale x 8 x i32> poison, <vscale x 8 x i32> zeroinitializer 562 %vc = sub <vscale x 8 x i32> %va, %splat 563 ret <vscale x 8 x i32> %vc 564} 565 566define <vscale x 8 x i32> @vsub_vx_nxv8i32_0(<vscale x 8 x i32> %va) { 567; CHECK-LABEL: vsub_vx_nxv8i32_0: 568; CHECK: # %bb.0: 569; CHECK-NEXT: li a0, 1 570; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, ma 571; CHECK-NEXT: vsub.vx v8, v8, a0 572; CHECK-NEXT: ret 573 %vc = sub <vscale x 8 x i32> %va, splat (i32 1) 574 ret <vscale x 8 x i32> %vc 575} 576 577define <vscale x 16 x i32> @vsub_vv_nxv16i32(<vscale x 16 x i32> %va, <vscale x 16 x i32> %vb) { 578; CHECK-LABEL: vsub_vv_nxv16i32: 579; CHECK: # %bb.0: 580; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma 581; CHECK-NEXT: vsub.vv v8, v8, v16 582; CHECK-NEXT: ret 583 %vc = sub <vscale x 16 x i32> %va, %vb 584 ret <vscale x 16 x i32> %vc 585} 586 587define <vscale x 16 x i32> @vsub_vx_nxv16i32(<vscale x 16 x i32> %va, i32 signext %b) { 588; CHECK-LABEL: vsub_vx_nxv16i32: 589; CHECK: # %bb.0: 590; CHECK-NEXT: vsetvli a1, zero, e32, m8, ta, ma 591; CHECK-NEXT: vsub.vx v8, v8, a0 592; CHECK-NEXT: ret 593 %head = insertelement <vscale x 16 x i32> poison, i32 %b, i32 0 594 %splat = shufflevector <vscale x 16 x i32> %head, <vscale x 16 x i32> poison, <vscale x 16 x i32> zeroinitializer 595 %vc = sub <vscale x 16 x i32> %va, %splat 596 ret <vscale x 16 x i32> %vc 597} 598 599define <vscale x 16 x i32> @vsub_vx_nxv16i32_0(<vscale x 16 x i32> %va) { 600; CHECK-LABEL: vsub_vx_nxv16i32_0: 601; CHECK: # %bb.0: 602; CHECK-NEXT: li a0, 1 603; CHECK-NEXT: vsetvli a1, zero, e32, m8, ta, ma 604; CHECK-NEXT: vsub.vx v8, v8, a0 605; CHECK-NEXT: ret 606 %vc = sub <vscale x 16 x i32> %va, splat (i32 1) 607 ret <vscale x 16 x i32> %vc 608} 609 610define <vscale x 1 x i64> @vsub_vv_nxv1i64(<vscale x 1 x i64> %va, <vscale x 1 x i64> %vb) { 611; CHECK-LABEL: vsub_vv_nxv1i64: 612; CHECK: # %bb.0: 613; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma 614; CHECK-NEXT: vsub.vv v8, v8, v9 615; CHECK-NEXT: ret 616 %vc = sub <vscale x 1 x i64> %va, %vb 617 ret <vscale x 1 x i64> %vc 618} 619 620define <vscale x 1 x i64> @vsub_vx_nxv1i64(<vscale x 1 x i64> %va, i64 %b) { 621; RV32-LABEL: vsub_vx_nxv1i64: 622; RV32: # %bb.0: 623; RV32-NEXT: addi sp, sp, -16 624; RV32-NEXT: .cfi_def_cfa_offset 16 625; RV32-NEXT: sw a0, 8(sp) 626; RV32-NEXT: sw a1, 12(sp) 627; RV32-NEXT: addi a0, sp, 8 628; RV32-NEXT: vsetvli a1, zero, e64, m1, ta, ma 629; RV32-NEXT: vlse64.v v9, (a0), zero 630; RV32-NEXT: vsub.vv v8, v8, v9 631; RV32-NEXT: addi sp, sp, 16 632; RV32-NEXT: .cfi_def_cfa_offset 0 633; RV32-NEXT: ret 634; 635; RV64-LABEL: vsub_vx_nxv1i64: 636; RV64: # %bb.0: 637; RV64-NEXT: vsetvli a1, zero, e64, m1, ta, ma 638; RV64-NEXT: vsub.vx v8, v8, a0 639; RV64-NEXT: ret 640 %head = insertelement <vscale x 1 x i64> poison, i64 %b, i32 0 641 %splat = shufflevector <vscale x 1 x i64> %head, <vscale x 1 x i64> poison, <vscale x 1 x i32> zeroinitializer 642 %vc = sub <vscale x 1 x i64> %va, %splat 643 ret <vscale x 1 x i64> %vc 644} 645 646define <vscale x 1 x i64> @vsub_vx_nxv1i64_0(<vscale x 1 x i64> %va) { 647; CHECK-LABEL: vsub_vx_nxv1i64_0: 648; CHECK: # %bb.0: 649; CHECK-NEXT: li a0, 1 650; CHECK-NEXT: vsetvli a1, zero, e64, m1, ta, ma 651; CHECK-NEXT: vsub.vx v8, v8, a0 652; CHECK-NEXT: ret 653 %vc = sub <vscale x 1 x i64> %va, splat (i64 1) 654 ret <vscale x 1 x i64> %vc 655} 656 657define <vscale x 2 x i64> @vsub_vv_nxv2i64(<vscale x 2 x i64> %va, <vscale x 2 x i64> %vb) { 658; CHECK-LABEL: vsub_vv_nxv2i64: 659; CHECK: # %bb.0: 660; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma 661; CHECK-NEXT: vsub.vv v8, v8, v10 662; CHECK-NEXT: ret 663 %vc = sub <vscale x 2 x i64> %va, %vb 664 ret <vscale x 2 x i64> %vc 665} 666 667define <vscale x 2 x i64> @vsub_vx_nxv2i64(<vscale x 2 x i64> %va, i64 %b) { 668; RV32-LABEL: vsub_vx_nxv2i64: 669; RV32: # %bb.0: 670; RV32-NEXT: addi sp, sp, -16 671; RV32-NEXT: .cfi_def_cfa_offset 16 672; RV32-NEXT: sw a0, 8(sp) 673; RV32-NEXT: sw a1, 12(sp) 674; RV32-NEXT: addi a0, sp, 8 675; RV32-NEXT: vsetvli a1, zero, e64, m2, ta, ma 676; RV32-NEXT: vlse64.v v10, (a0), zero 677; RV32-NEXT: vsub.vv v8, v8, v10 678; RV32-NEXT: addi sp, sp, 16 679; RV32-NEXT: .cfi_def_cfa_offset 0 680; RV32-NEXT: ret 681; 682; RV64-LABEL: vsub_vx_nxv2i64: 683; RV64: # %bb.0: 684; RV64-NEXT: vsetvli a1, zero, e64, m2, ta, ma 685; RV64-NEXT: vsub.vx v8, v8, a0 686; RV64-NEXT: ret 687 %head = insertelement <vscale x 2 x i64> poison, i64 %b, i32 0 688 %splat = shufflevector <vscale x 2 x i64> %head, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer 689 %vc = sub <vscale x 2 x i64> %va, %splat 690 ret <vscale x 2 x i64> %vc 691} 692 693define <vscale x 2 x i64> @vsub_vx_nxv2i64_0(<vscale x 2 x i64> %va) { 694; CHECK-LABEL: vsub_vx_nxv2i64_0: 695; CHECK: # %bb.0: 696; CHECK-NEXT: li a0, 1 697; CHECK-NEXT: vsetvli a1, zero, e64, m2, ta, ma 698; CHECK-NEXT: vsub.vx v8, v8, a0 699; CHECK-NEXT: ret 700 %vc = sub <vscale x 2 x i64> %va, splat (i64 1) 701 ret <vscale x 2 x i64> %vc 702} 703 704define <vscale x 4 x i64> @vsub_vv_nxv4i64(<vscale x 4 x i64> %va, <vscale x 4 x i64> %vb) { 705; CHECK-LABEL: vsub_vv_nxv4i64: 706; CHECK: # %bb.0: 707; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma 708; CHECK-NEXT: vsub.vv v8, v8, v12 709; CHECK-NEXT: ret 710 %vc = sub <vscale x 4 x i64> %va, %vb 711 ret <vscale x 4 x i64> %vc 712} 713 714define <vscale x 4 x i64> @vsub_vx_nxv4i64(<vscale x 4 x i64> %va, i64 %b) { 715; RV32-LABEL: vsub_vx_nxv4i64: 716; RV32: # %bb.0: 717; RV32-NEXT: addi sp, sp, -16 718; RV32-NEXT: .cfi_def_cfa_offset 16 719; RV32-NEXT: sw a0, 8(sp) 720; RV32-NEXT: sw a1, 12(sp) 721; RV32-NEXT: addi a0, sp, 8 722; RV32-NEXT: vsetvli a1, zero, e64, m4, ta, ma 723; RV32-NEXT: vlse64.v v12, (a0), zero 724; RV32-NEXT: vsub.vv v8, v8, v12 725; RV32-NEXT: addi sp, sp, 16 726; RV32-NEXT: .cfi_def_cfa_offset 0 727; RV32-NEXT: ret 728; 729; RV64-LABEL: vsub_vx_nxv4i64: 730; RV64: # %bb.0: 731; RV64-NEXT: vsetvli a1, zero, e64, m4, ta, ma 732; RV64-NEXT: vsub.vx v8, v8, a0 733; RV64-NEXT: ret 734 %head = insertelement <vscale x 4 x i64> poison, i64 %b, i32 0 735 %splat = shufflevector <vscale x 4 x i64> %head, <vscale x 4 x i64> poison, <vscale x 4 x i32> zeroinitializer 736 %vc = sub <vscale x 4 x i64> %va, %splat 737 ret <vscale x 4 x i64> %vc 738} 739 740define <vscale x 4 x i64> @vsub_vx_nxv4i64_0(<vscale x 4 x i64> %va) { 741; CHECK-LABEL: vsub_vx_nxv4i64_0: 742; CHECK: # %bb.0: 743; CHECK-NEXT: li a0, 1 744; CHECK-NEXT: vsetvli a1, zero, e64, m4, ta, ma 745; CHECK-NEXT: vsub.vx v8, v8, a0 746; CHECK-NEXT: ret 747 %vc = sub <vscale x 4 x i64> %va, splat (i64 1) 748 ret <vscale x 4 x i64> %vc 749} 750 751define <vscale x 8 x i64> @vsub_vv_nxv8i64(<vscale x 8 x i64> %va, <vscale x 8 x i64> %vb) { 752; CHECK-LABEL: vsub_vv_nxv8i64: 753; CHECK: # %bb.0: 754; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma 755; CHECK-NEXT: vsub.vv v8, v8, v16 756; CHECK-NEXT: ret 757 %vc = sub <vscale x 8 x i64> %va, %vb 758 ret <vscale x 8 x i64> %vc 759} 760 761define <vscale x 8 x i64> @vsub_vx_nxv8i64(<vscale x 8 x i64> %va, i64 %b) { 762; RV32-LABEL: vsub_vx_nxv8i64: 763; RV32: # %bb.0: 764; RV32-NEXT: addi sp, sp, -16 765; RV32-NEXT: .cfi_def_cfa_offset 16 766; RV32-NEXT: sw a0, 8(sp) 767; RV32-NEXT: sw a1, 12(sp) 768; RV32-NEXT: addi a0, sp, 8 769; RV32-NEXT: vsetvli a1, zero, e64, m8, ta, ma 770; RV32-NEXT: vlse64.v v16, (a0), zero 771; RV32-NEXT: vsub.vv v8, v8, v16 772; RV32-NEXT: addi sp, sp, 16 773; RV32-NEXT: .cfi_def_cfa_offset 0 774; RV32-NEXT: ret 775; 776; RV64-LABEL: vsub_vx_nxv8i64: 777; RV64: # %bb.0: 778; RV64-NEXT: vsetvli a1, zero, e64, m8, ta, ma 779; RV64-NEXT: vsub.vx v8, v8, a0 780; RV64-NEXT: ret 781 %head = insertelement <vscale x 8 x i64> poison, i64 %b, i32 0 782 %splat = shufflevector <vscale x 8 x i64> %head, <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer 783 %vc = sub <vscale x 8 x i64> %va, %splat 784 ret <vscale x 8 x i64> %vc 785} 786 787define <vscale x 8 x i64> @vsub_vx_nxv8i64_0(<vscale x 8 x i64> %va) { 788; CHECK-LABEL: vsub_vx_nxv8i64_0: 789; CHECK: # %bb.0: 790; CHECK-NEXT: li a0, 1 791; CHECK-NEXT: vsetvli a1, zero, e64, m8, ta, ma 792; CHECK-NEXT: vsub.vx v8, v8, a0 793; CHECK-NEXT: ret 794 %vc = sub <vscale x 8 x i64> %va, splat (i64 1) 795 ret <vscale x 8 x i64> %vc 796} 797 798define <vscale x 8 x i64> @vsub_xx_nxv8i64(i64 %a, i64 %b) nounwind { 799; RV32-LABEL: vsub_xx_nxv8i64: 800; RV32: # %bb.0: 801; RV32-NEXT: addi sp, sp, -16 802; RV32-NEXT: sub a4, a0, a2 803; RV32-NEXT: sltu a0, a0, a2 804; RV32-NEXT: sub a1, a1, a3 805; RV32-NEXT: sub a1, a1, a0 806; RV32-NEXT: sw a4, 8(sp) 807; RV32-NEXT: sw a1, 12(sp) 808; RV32-NEXT: addi a0, sp, 8 809; RV32-NEXT: vsetvli a1, zero, e64, m8, ta, ma 810; RV32-NEXT: vlse64.v v8, (a0), zero 811; RV32-NEXT: addi sp, sp, 16 812; RV32-NEXT: ret 813; 814; RV64-LABEL: vsub_xx_nxv8i64: 815; RV64: # %bb.0: 816; RV64-NEXT: sub a0, a0, a1 817; RV64-NEXT: vsetvli a1, zero, e64, m8, ta, ma 818; RV64-NEXT: vmv.v.x v8, a0 819; RV64-NEXT: ret 820 %head1 = insertelement <vscale x 8 x i64> poison, i64 %a, i32 0 821 %splat1 = shufflevector <vscale x 8 x i64> %head1, <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer 822 %head2 = insertelement <vscale x 8 x i64> poison, i64 %b, i32 0 823 %splat2 = shufflevector <vscale x 8 x i64> %head2, <vscale x 8 x i64> poison, <vscale x 8 x i32> zeroinitializer 824 %v = sub <vscale x 8 x i64> %splat1, %splat2 825 ret <vscale x 8 x i64> %v 826} 827 828define <vscale x 8 x i32> @vsub_vv_mask_nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i32> %vb, <vscale x 8 x i1> %mask) { 829; CHECK-LABEL: vsub_vv_mask_nxv8i32: 830; CHECK: # %bb.0: 831; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, mu 832; CHECK-NEXT: vsub.vv v8, v8, v12, v0.t 833; CHECK-NEXT: ret 834 835 %vs = select <vscale x 8 x i1> %mask, <vscale x 8 x i32> %vb, <vscale x 8 x i32> zeroinitializer 836 %vc = sub <vscale x 8 x i32> %va, %vs 837 ret <vscale x 8 x i32> %vc 838} 839 840define <vscale x 8 x i32> @vsub_vx_mask_nxv8i32(<vscale x 8 x i32> %va, i32 signext %b, <vscale x 8 x i1> %mask) { 841; CHECK-LABEL: vsub_vx_mask_nxv8i32: 842; CHECK: # %bb.0: 843; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu 844; CHECK-NEXT: vsub.vx v8, v8, a0, v0.t 845; CHECK-NEXT: ret 846 %head = insertelement <vscale x 8 x i32> poison, i32 %b, i32 0 847 %splat = shufflevector <vscale x 8 x i32> %head, <vscale x 8 x i32> poison, <vscale x 8 x i32> zeroinitializer 848 %vs = select <vscale x 8 x i1> %mask, <vscale x 8 x i32> %splat, <vscale x 8 x i32> zeroinitializer 849 %vc = sub <vscale x 8 x i32> %va, %vs 850 ret <vscale x 8 x i32> %vc 851} 852 853define <vscale x 8 x i32> @vsub_vi_mask_nxv8i32(<vscale x 8 x i32> %va, <vscale x 8 x i1> %mask) { 854; CHECK-LABEL: vsub_vi_mask_nxv8i32: 855; CHECK: # %bb.0: 856; CHECK-NEXT: li a0, 7 857; CHECK-NEXT: vsetvli a1, zero, e32, m4, ta, mu 858; CHECK-NEXT: vsub.vx v8, v8, a0, v0.t 859; CHECK-NEXT: ret 860 %vs = select <vscale x 8 x i1> %mask, <vscale x 8 x i32> splat (i32 7), <vscale x 8 x i32> zeroinitializer 861 %vc = sub <vscale x 8 x i32> %va, %vs 862 ret <vscale x 8 x i32> %vc 863} 864