1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 2; RUN: llc -mtriple=riscv32 -mattr=+v,+d,+zvfh,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32,NOZFMIN,ZVFH 3; RUN: llc -mtriple=riscv64 -mattr=+v,+d,+zvfh,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64,NOZFMIN,ZVFH 4; RUN: llc -mtriple=riscv32 -mattr=+v,+d,+zvfhmin,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32,NOZFMIN,ZVFHMIN 5; RUN: llc -mtriple=riscv64 -mattr=+v,+d,+zvfhmin,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64,NOZFMIN,ZVFHMIN 6; RUN: llc -mtriple=riscv32 -mattr=+v,+d,+zfhmin,+zfbfmin,+zvfhmin,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV32,ZFMIN 7; RUN: llc -mtriple=riscv64 -mattr=+v,+d,+zfhmin,+zfbfmin,+zvfhmin,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,RV64,ZFMIN 8 9define <vscale x 1 x i8> @vp_splat_nxv1i8(i8 %val, <vscale x 1 x i1> %m, i32 zeroext %evl) { 10; CHECK-LABEL: vp_splat_nxv1i8: 11; CHECK: # %bb.0: 12; CHECK-NEXT: vsetvli zero, a1, e8, mf8, ta, ma 13; CHECK-NEXT: vmv.v.x v8, a0 14; CHECK-NEXT: ret 15 %splat = call <vscale x 1 x i8> @llvm.experimental.vp.splat.nxv1i8(i8 %val, <vscale x 1 x i1> %m, i32 %evl) 16 ret <vscale x 1 x i8> %splat 17} 18 19define <vscale x 2 x i8> @vp_splat_nxv2i8(i8 %val, <vscale x 2 x i1> %m, i32 zeroext %evl) { 20; CHECK-LABEL: vp_splat_nxv2i8: 21; CHECK: # %bb.0: 22; CHECK-NEXT: vsetvli zero, a1, e8, mf4, ta, ma 23; CHECK-NEXT: vmv.v.x v8, a0 24; CHECK-NEXT: ret 25 %splat = call <vscale x 2 x i8> @llvm.experimental.vp.splat.nxv2i8(i8 %val, <vscale x 2 x i1> %m, i32 %evl) 26 ret <vscale x 2 x i8> %splat 27} 28 29define <vscale x 4 x i8> @vp_splat_nxv4i8(i8 %val, <vscale x 4 x i1> %m, i32 zeroext %evl) { 30; CHECK-LABEL: vp_splat_nxv4i8: 31; CHECK: # %bb.0: 32; CHECK-NEXT: vsetvli zero, a1, e8, mf2, ta, ma 33; CHECK-NEXT: vmv.v.x v8, a0 34; CHECK-NEXT: ret 35 %splat = call <vscale x 4 x i8> @llvm.experimental.vp.splat.nxv4i8(i8 %val, <vscale x 4 x i1> %m, i32 %evl) 36 ret <vscale x 4 x i8> %splat 37} 38 39define <vscale x 8 x i8> @vp_splat_nxv8i8(i8 %val, <vscale x 8 x i1> %m, i32 zeroext %evl) { 40; CHECK-LABEL: vp_splat_nxv8i8: 41; CHECK: # %bb.0: 42; CHECK-NEXT: vsetvli zero, a1, e8, m1, ta, ma 43; CHECK-NEXT: vmv.v.x v8, a0 44; CHECK-NEXT: ret 45 %splat = call <vscale x 8 x i8> @llvm.experimental.vp.splat.nxv8i8(i8 %val, <vscale x 8 x i1> %m, i32 %evl) 46 ret <vscale x 8 x i8> %splat 47} 48 49define <vscale x 16 x i8> @vp_splat_nxv16i8(i8 %val, <vscale x 16 x i1> %m, i32 zeroext %evl) { 50; CHECK-LABEL: vp_splat_nxv16i8: 51; CHECK: # %bb.0: 52; CHECK-NEXT: vsetvli zero, a1, e8, m2, ta, ma 53; CHECK-NEXT: vmv.v.x v8, a0 54; CHECK-NEXT: ret 55 %splat = call <vscale x 16 x i8> @llvm.experimental.vp.splat.nxv16i8(i8 %val, <vscale x 16 x i1> %m, i32 %evl) 56 ret <vscale x 16 x i8> %splat 57} 58 59define <vscale x 32 x i8> @vp_splat_nxv32i8(i8 %val, <vscale x 32 x i1> %m, i32 zeroext %evl) { 60; CHECK-LABEL: vp_splat_nxv32i8: 61; CHECK: # %bb.0: 62; CHECK-NEXT: vsetvli zero, a1, e8, m4, ta, ma 63; CHECK-NEXT: vmv.v.x v8, a0 64; CHECK-NEXT: ret 65 %splat = call <vscale x 32 x i8> @llvm.experimental.vp.splat.nxv32i8(i8 %val, <vscale x 32 x i1> %m, i32 %evl) 66 ret <vscale x 32 x i8> %splat 67} 68 69define <vscale x 64 x i8> @vp_splat_nxv64i8(i8 %val, <vscale x 64 x i1> %m, i32 zeroext %evl) { 70; CHECK-LABEL: vp_splat_nxv64i8: 71; CHECK: # %bb.0: 72; CHECK-NEXT: vsetvli zero, a1, e8, m8, ta, ma 73; CHECK-NEXT: vmv.v.x v8, a0 74; CHECK-NEXT: ret 75 %splat = call <vscale x 64 x i8> @llvm.experimental.vp.splat.nxv64i8(i8 %val, <vscale x 64 x i1> %m, i32 %evl) 76 ret <vscale x 64 x i8> %splat 77} 78 79define <vscale x 1 x i16> @vp_splat_nxv1i16(i16 %val, <vscale x 1 x i1> %m, i32 zeroext %evl) { 80; CHECK-LABEL: vp_splat_nxv1i16: 81; CHECK: # %bb.0: 82; CHECK-NEXT: vsetvli zero, a1, e16, mf4, ta, ma 83; CHECK-NEXT: vmv.v.x v8, a0 84; CHECK-NEXT: ret 85 %splat = call <vscale x 1 x i16> @llvm.experimental.vp.splat.nxv1i16(i16 %val, <vscale x 1 x i1> %m, i32 %evl) 86 ret <vscale x 1 x i16> %splat 87} 88 89define <vscale x 2 x i16> @vp_splat_nxv2i16(i16 %val, <vscale x 2 x i1> %m, i32 zeroext %evl) { 90; CHECK-LABEL: vp_splat_nxv2i16: 91; CHECK: # %bb.0: 92; CHECK-NEXT: vsetvli zero, a1, e16, mf2, ta, ma 93; CHECK-NEXT: vmv.v.x v8, a0 94; CHECK-NEXT: ret 95 %splat = call <vscale x 2 x i16> @llvm.experimental.vp.splat.nxv2i16(i16 %val, <vscale x 2 x i1> %m, i32 %evl) 96 ret <vscale x 2 x i16> %splat 97} 98 99define <vscale x 4 x i16> @vp_splat_nxv4i16(i16 %val, <vscale x 4 x i1> %m, i32 zeroext %evl) { 100; CHECK-LABEL: vp_splat_nxv4i16: 101; CHECK: # %bb.0: 102; CHECK-NEXT: vsetvli zero, a1, e16, m1, ta, ma 103; CHECK-NEXT: vmv.v.x v8, a0 104; CHECK-NEXT: ret 105 %splat = call <vscale x 4 x i16> @llvm.experimental.vp.splat.nxv4i16(i16 %val, <vscale x 4 x i1> %m, i32 %evl) 106 ret <vscale x 4 x i16> %splat 107} 108 109define <vscale x 8 x i16> @vp_splat_nxv8i16(i16 %val, <vscale x 8 x i1> %m, i32 zeroext %evl) { 110; CHECK-LABEL: vp_splat_nxv8i16: 111; CHECK: # %bb.0: 112; CHECK-NEXT: vsetvli zero, a1, e16, m2, ta, ma 113; CHECK-NEXT: vmv.v.x v8, a0 114; CHECK-NEXT: ret 115 %splat = call <vscale x 8 x i16> @llvm.experimental.vp.splat.nxv8i16(i16 %val, <vscale x 8 x i1> %m, i32 %evl) 116 ret <vscale x 8 x i16> %splat 117} 118 119define <vscale x 16 x i16> @vp_splat_nxv16i16(i16 %val, <vscale x 16 x i1> %m, i32 zeroext %evl) { 120; CHECK-LABEL: vp_splat_nxv16i16: 121; CHECK: # %bb.0: 122; CHECK-NEXT: vsetvli zero, a1, e16, m4, ta, ma 123; CHECK-NEXT: vmv.v.x v8, a0 124; CHECK-NEXT: ret 125 %splat = call <vscale x 16 x i16> @llvm.experimental.vp.splat.nxv16i16(i16 %val, <vscale x 16 x i1> %m, i32 %evl) 126 ret <vscale x 16 x i16> %splat 127} 128 129define <vscale x 32 x i16> @vp_splat_nxv32i16(i16 %val, <vscale x 32 x i1> %m, i32 zeroext %evl) { 130; CHECK-LABEL: vp_splat_nxv32i16: 131; CHECK: # %bb.0: 132; CHECK-NEXT: vsetvli zero, a1, e16, m8, ta, ma 133; CHECK-NEXT: vmv.v.x v8, a0 134; CHECK-NEXT: ret 135 %splat = call <vscale x 32 x i16> @llvm.experimental.vp.splat.nxv32i16(i16 %val, <vscale x 32 x i1> %m, i32 %evl) 136 ret <vscale x 32 x i16> %splat 137} 138 139define <vscale x 1 x i32> @vp_splat_nxv1i32(i32 %val, <vscale x 1 x i1> %m, i32 zeroext %evl) { 140; CHECK-LABEL: vp_splat_nxv1i32: 141; CHECK: # %bb.0: 142; CHECK-NEXT: vsetvli zero, a1, e32, mf2, ta, ma 143; CHECK-NEXT: vmv.v.x v8, a0 144; CHECK-NEXT: ret 145 %splat = call <vscale x 1 x i32> @llvm.experimental.vp.splat.nxv1i32(i32 %val, <vscale x 1 x i1> %m, i32 %evl) 146 ret <vscale x 1 x i32> %splat 147} 148 149define <vscale x 2 x i32> @vp_splat_nxv2i32(i32 %val, <vscale x 2 x i1> %m, i32 zeroext %evl) { 150; CHECK-LABEL: vp_splat_nxv2i32: 151; CHECK: # %bb.0: 152; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma 153; CHECK-NEXT: vmv.v.x v8, a0 154; CHECK-NEXT: ret 155 %splat = call <vscale x 2 x i32> @llvm.experimental.vp.splat.nxv2i32(i32 %val, <vscale x 2 x i1> %m, i32 %evl) 156 ret <vscale x 2 x i32> %splat 157} 158 159define <vscale x 4 x i32> @vp_splat_nxv4i32(i32 %val, <vscale x 4 x i1> %m, i32 zeroext %evl) { 160; CHECK-LABEL: vp_splat_nxv4i32: 161; CHECK: # %bb.0: 162; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, ma 163; CHECK-NEXT: vmv.v.x v8, a0 164; CHECK-NEXT: ret 165 %splat = call <vscale x 4 x i32> @llvm.experimental.vp.splat.nxv4i32(i32 %val, <vscale x 4 x i1> %m, i32 %evl) 166 ret <vscale x 4 x i32> %splat 167} 168 169define <vscale x 8 x i32> @vp_splat_nxv8i32(i32 %val, <vscale x 8 x i1> %m, i32 zeroext %evl) { 170; CHECK-LABEL: vp_splat_nxv8i32: 171; CHECK: # %bb.0: 172; CHECK-NEXT: vsetvli zero, a1, e32, m4, ta, ma 173; CHECK-NEXT: vmv.v.x v8, a0 174; CHECK-NEXT: ret 175 %splat = call <vscale x 8 x i32> @llvm.experimental.vp.splat.nxv8i32(i32 %val, <vscale x 8 x i1> %m, i32 %evl) 176 ret <vscale x 8 x i32> %splat 177} 178 179define <vscale x 16 x i32> @vp_splat_nxv16i32(i32 %val, <vscale x 16 x i1> %m, i32 zeroext %evl) { 180; CHECK-LABEL: vp_splat_nxv16i32: 181; CHECK: # %bb.0: 182; CHECK-NEXT: vsetvli zero, a1, e32, m8, ta, ma 183; CHECK-NEXT: vmv.v.x v8, a0 184; CHECK-NEXT: ret 185 %splat = call <vscale x 16 x i32> @llvm.experimental.vp.splat.nxv16i32(i32 %val, <vscale x 16 x i1> %m, i32 %evl) 186 ret <vscale x 16 x i32> %splat 187} 188 189define <vscale x 1 x i64> @vp_splat_nxv1i64(i64 %val, <vscale x 1 x i1> %m, i32 zeroext %evl) { 190; RV32-LABEL: vp_splat_nxv1i64: 191; RV32: # %bb.0: 192; RV32-NEXT: addi sp, sp, -16 193; RV32-NEXT: .cfi_def_cfa_offset 16 194; RV32-NEXT: sw a0, 8(sp) 195; RV32-NEXT: sw a1, 12(sp) 196; RV32-NEXT: addi a0, sp, 8 197; RV32-NEXT: vsetvli a1, zero, e64, m1, ta, ma 198; RV32-NEXT: vlse64.v v8, (a0), zero 199; RV32-NEXT: addi sp, sp, 16 200; RV32-NEXT: .cfi_def_cfa_offset 0 201; RV32-NEXT: ret 202; 203; RV64-LABEL: vp_splat_nxv1i64: 204; RV64: # %bb.0: 205; RV64-NEXT: vsetvli zero, a1, e64, m1, ta, ma 206; RV64-NEXT: vmv.v.x v8, a0 207; RV64-NEXT: ret 208 %splat = call <vscale x 1 x i64> @llvm.experimental.vp.splat.nxv1i64(i64 %val, <vscale x 1 x i1> %m, i32 %evl) 209 ret <vscale x 1 x i64> %splat 210} 211 212define <vscale x 2 x i64> @vp_splat_nxv2i64(i64 %val, <vscale x 2 x i1> %m, i32 zeroext %evl) { 213; RV32-LABEL: vp_splat_nxv2i64: 214; RV32: # %bb.0: 215; RV32-NEXT: addi sp, sp, -16 216; RV32-NEXT: .cfi_def_cfa_offset 16 217; RV32-NEXT: sw a0, 8(sp) 218; RV32-NEXT: sw a1, 12(sp) 219; RV32-NEXT: addi a0, sp, 8 220; RV32-NEXT: vsetvli a1, zero, e64, m2, ta, ma 221; RV32-NEXT: vlse64.v v8, (a0), zero 222; RV32-NEXT: addi sp, sp, 16 223; RV32-NEXT: .cfi_def_cfa_offset 0 224; RV32-NEXT: ret 225; 226; RV64-LABEL: vp_splat_nxv2i64: 227; RV64: # %bb.0: 228; RV64-NEXT: vsetvli zero, a1, e64, m2, ta, ma 229; RV64-NEXT: vmv.v.x v8, a0 230; RV64-NEXT: ret 231 %splat = call <vscale x 2 x i64> @llvm.experimental.vp.splat.nxv2i64(i64 %val, <vscale x 2 x i1> %m, i32 %evl) 232 ret <vscale x 2 x i64> %splat 233} 234 235define <vscale x 4 x i64> @vp_splat_nxv4i64(i64 %val, <vscale x 4 x i1> %m, i32 zeroext %evl) { 236; RV32-LABEL: vp_splat_nxv4i64: 237; RV32: # %bb.0: 238; RV32-NEXT: addi sp, sp, -16 239; RV32-NEXT: .cfi_def_cfa_offset 16 240; RV32-NEXT: sw a0, 8(sp) 241; RV32-NEXT: sw a1, 12(sp) 242; RV32-NEXT: addi a0, sp, 8 243; RV32-NEXT: vsetvli a1, zero, e64, m4, ta, ma 244; RV32-NEXT: vlse64.v v8, (a0), zero 245; RV32-NEXT: addi sp, sp, 16 246; RV32-NEXT: .cfi_def_cfa_offset 0 247; RV32-NEXT: ret 248; 249; RV64-LABEL: vp_splat_nxv4i64: 250; RV64: # %bb.0: 251; RV64-NEXT: vsetvli zero, a1, e64, m4, ta, ma 252; RV64-NEXT: vmv.v.x v8, a0 253; RV64-NEXT: ret 254 %splat = call <vscale x 4 x i64> @llvm.experimental.vp.splat.nxv4i64(i64 %val, <vscale x 4 x i1> %m, i32 %evl) 255 ret <vscale x 4 x i64> %splat 256} 257 258define <vscale x 8 x i64> @vp_splat_nxv8i64(i64 %val, <vscale x 8 x i1> %m, i32 zeroext %evl) { 259; RV32-LABEL: vp_splat_nxv8i64: 260; RV32: # %bb.0: 261; RV32-NEXT: addi sp, sp, -16 262; RV32-NEXT: .cfi_def_cfa_offset 16 263; RV32-NEXT: sw a0, 8(sp) 264; RV32-NEXT: sw a1, 12(sp) 265; RV32-NEXT: addi a0, sp, 8 266; RV32-NEXT: vsetvli a1, zero, e64, m8, ta, ma 267; RV32-NEXT: vlse64.v v8, (a0), zero 268; RV32-NEXT: addi sp, sp, 16 269; RV32-NEXT: .cfi_def_cfa_offset 0 270; RV32-NEXT: ret 271; 272; RV64-LABEL: vp_splat_nxv8i64: 273; RV64: # %bb.0: 274; RV64-NEXT: vsetvli zero, a1, e64, m8, ta, ma 275; RV64-NEXT: vmv.v.x v8, a0 276; RV64-NEXT: ret 277 %splat = call <vscale x 8 x i64> @llvm.experimental.vp.splat.nxv8i64(i64 %val, <vscale x 8 x i1> %m, i32 %evl) 278 ret <vscale x 8 x i64> %splat 279} 280 281define <vscale x 1 x bfloat> @vp_splat_nxv1bf16(bfloat %val, <vscale x 1 x i1> %m, i32 zeroext %evl) { 282; NOZFMIN-LABEL: vp_splat_nxv1bf16: 283; NOZFMIN: # %bb.0: 284; NOZFMIN-NEXT: fmv.x.w a1, fa0 285; NOZFMIN-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 286; NOZFMIN-NEXT: vmv.v.x v8, a1 287; NOZFMIN-NEXT: ret 288; 289; ZFMIN-LABEL: vp_splat_nxv1bf16: 290; ZFMIN: # %bb.0: 291; ZFMIN-NEXT: fmv.x.h a1, fa0 292; ZFMIN-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 293; ZFMIN-NEXT: vmv.v.x v8, a1 294; ZFMIN-NEXT: ret 295 %splat = call <vscale x 1 x bfloat> @llvm.experimental.vp.splat.nxv1bf16(bfloat %val, <vscale x 1 x i1> %m, i32 %evl) 296 ret <vscale x 1 x bfloat> %splat 297} 298 299define <vscale x 2 x bfloat> @vp_splat_nxv2bf16(bfloat %val, <vscale x 2 x i1> %m, i32 zeroext %evl) { 300; NOZFMIN-LABEL: vp_splat_nxv2bf16: 301; NOZFMIN: # %bb.0: 302; NOZFMIN-NEXT: fmv.x.w a1, fa0 303; NOZFMIN-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 304; NOZFMIN-NEXT: vmv.v.x v8, a1 305; NOZFMIN-NEXT: ret 306; 307; ZFMIN-LABEL: vp_splat_nxv2bf16: 308; ZFMIN: # %bb.0: 309; ZFMIN-NEXT: fmv.x.h a1, fa0 310; ZFMIN-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 311; ZFMIN-NEXT: vmv.v.x v8, a1 312; ZFMIN-NEXT: ret 313 %splat = call <vscale x 2 x bfloat> @llvm.experimental.vp.splat.nxv2bf16(bfloat %val, <vscale x 2 x i1> %m, i32 %evl) 314 ret <vscale x 2 x bfloat> %splat 315} 316 317define <vscale x 4 x bfloat> @vp_splat_nxv4bf16(bfloat %val, <vscale x 4 x i1> %m, i32 zeroext %evl) { 318; NOZFMIN-LABEL: vp_splat_nxv4bf16: 319; NOZFMIN: # %bb.0: 320; NOZFMIN-NEXT: fmv.x.w a1, fa0 321; NOZFMIN-NEXT: vsetvli zero, a0, e16, m1, ta, ma 322; NOZFMIN-NEXT: vmv.v.x v8, a1 323; NOZFMIN-NEXT: ret 324; 325; ZFMIN-LABEL: vp_splat_nxv4bf16: 326; ZFMIN: # %bb.0: 327; ZFMIN-NEXT: fmv.x.h a1, fa0 328; ZFMIN-NEXT: vsetvli zero, a0, e16, m1, ta, ma 329; ZFMIN-NEXT: vmv.v.x v8, a1 330; ZFMIN-NEXT: ret 331 %splat = call <vscale x 4 x bfloat> @llvm.experimental.vp.splat.nxv4bf16(bfloat %val, <vscale x 4 x i1> %m, i32 %evl) 332 ret <vscale x 4 x bfloat> %splat 333} 334 335define <vscale x 8 x bfloat> @vp_splat_nxv8bf16(bfloat %val, <vscale x 8 x i1> %m, i32 zeroext %evl) { 336; NOZFMIN-LABEL: vp_splat_nxv8bf16: 337; NOZFMIN: # %bb.0: 338; NOZFMIN-NEXT: fmv.x.w a1, fa0 339; NOZFMIN-NEXT: vsetvli zero, a0, e16, m2, ta, ma 340; NOZFMIN-NEXT: vmv.v.x v8, a1 341; NOZFMIN-NEXT: ret 342; 343; ZFMIN-LABEL: vp_splat_nxv8bf16: 344; ZFMIN: # %bb.0: 345; ZFMIN-NEXT: fmv.x.h a1, fa0 346; ZFMIN-NEXT: vsetvli zero, a0, e16, m2, ta, ma 347; ZFMIN-NEXT: vmv.v.x v8, a1 348; ZFMIN-NEXT: ret 349 %splat = call <vscale x 8 x bfloat> @llvm.experimental.vp.splat.nxv8bf16(bfloat %val, <vscale x 8 x i1> %m, i32 %evl) 350 ret <vscale x 8 x bfloat> %splat 351} 352 353define <vscale x 16 x bfloat> @vp_splat_nxv16bf16(bfloat %val, <vscale x 16 x i1> %m, i32 zeroext %evl) { 354; NOZFMIN-LABEL: vp_splat_nxv16bf16: 355; NOZFMIN: # %bb.0: 356; NOZFMIN-NEXT: fmv.x.w a1, fa0 357; NOZFMIN-NEXT: vsetvli zero, a0, e16, m4, ta, ma 358; NOZFMIN-NEXT: vmv.v.x v8, a1 359; NOZFMIN-NEXT: ret 360; 361; ZFMIN-LABEL: vp_splat_nxv16bf16: 362; ZFMIN: # %bb.0: 363; ZFMIN-NEXT: fmv.x.h a1, fa0 364; ZFMIN-NEXT: vsetvli zero, a0, e16, m4, ta, ma 365; ZFMIN-NEXT: vmv.v.x v8, a1 366; ZFMIN-NEXT: ret 367 %splat = call <vscale x 16 x bfloat> @llvm.experimental.vp.splat.nxv16bf16(bfloat %val, <vscale x 16 x i1> %m, i32 %evl) 368 ret <vscale x 16 x bfloat> %splat 369} 370 371define <vscale x 32 x bfloat> @vp_splat_nxv32bf16(bfloat %val, <vscale x 32 x i1> %m, i32 zeroext %evl) { 372; NOZFMIN-LABEL: vp_splat_nxv32bf16: 373; NOZFMIN: # %bb.0: 374; NOZFMIN-NEXT: fmv.x.w a1, fa0 375; NOZFMIN-NEXT: vsetvli zero, a0, e16, m8, ta, ma 376; NOZFMIN-NEXT: vmv.v.x v8, a1 377; NOZFMIN-NEXT: ret 378; 379; ZFMIN-LABEL: vp_splat_nxv32bf16: 380; ZFMIN: # %bb.0: 381; ZFMIN-NEXT: fmv.x.h a1, fa0 382; ZFMIN-NEXT: vsetvli zero, a0, e16, m8, ta, ma 383; ZFMIN-NEXT: vmv.v.x v8, a1 384; ZFMIN-NEXT: ret 385 %splat = call <vscale x 32 x bfloat> @llvm.experimental.vp.splat.nxv32bf16(bfloat %val, <vscale x 32 x i1> %m, i32 %evl) 386 ret <vscale x 32 x bfloat> %splat 387} 388 389define <vscale x 1 x half> @vp_splat_nxv1f16(half %val, <vscale x 1 x i1> %m, i32 zeroext %evl) { 390; ZVFH-LABEL: vp_splat_nxv1f16: 391; ZVFH: # %bb.0: 392; ZVFH-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 393; ZVFH-NEXT: vfmv.v.f v8, fa0 394; ZVFH-NEXT: ret 395; 396; ZVFHMIN-LABEL: vp_splat_nxv1f16: 397; ZVFHMIN: # %bb.0: 398; ZVFHMIN-NEXT: fmv.x.w a1, fa0 399; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 400; ZVFHMIN-NEXT: vmv.v.x v8, a1 401; ZVFHMIN-NEXT: ret 402; 403; ZFMIN-LABEL: vp_splat_nxv1f16: 404; ZFMIN: # %bb.0: 405; ZFMIN-NEXT: fmv.x.h a1, fa0 406; ZFMIN-NEXT: vsetvli zero, a0, e16, mf4, ta, ma 407; ZFMIN-NEXT: vmv.v.x v8, a1 408; ZFMIN-NEXT: ret 409 %splat = call <vscale x 1 x half> @llvm.experimental.vp.splat.nxv1f16(half %val, <vscale x 1 x i1> %m, i32 %evl) 410 ret <vscale x 1 x half> %splat 411} 412 413define <vscale x 2 x half> @vp_splat_nxv2f16(half %val, <vscale x 2 x i1> %m, i32 zeroext %evl) { 414; ZVFH-LABEL: vp_splat_nxv2f16: 415; ZVFH: # %bb.0: 416; ZVFH-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 417; ZVFH-NEXT: vfmv.v.f v8, fa0 418; ZVFH-NEXT: ret 419; 420; ZVFHMIN-LABEL: vp_splat_nxv2f16: 421; ZVFHMIN: # %bb.0: 422; ZVFHMIN-NEXT: fmv.x.w a1, fa0 423; ZVFHMIN-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 424; ZVFHMIN-NEXT: vmv.v.x v8, a1 425; ZVFHMIN-NEXT: ret 426; 427; ZFMIN-LABEL: vp_splat_nxv2f16: 428; ZFMIN: # %bb.0: 429; ZFMIN-NEXT: fmv.x.h a1, fa0 430; ZFMIN-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 431; ZFMIN-NEXT: vmv.v.x v8, a1 432; ZFMIN-NEXT: ret 433 %splat = call <vscale x 2 x half> @llvm.experimental.vp.splat.nxv2f16(half %val, <vscale x 2 x i1> %m, i32 %evl) 434 ret <vscale x 2 x half> %splat 435} 436 437define <vscale x 4 x half> @vp_splat_nxv4f16(half %val, <vscale x 4 x i1> %m, i32 zeroext %evl) { 438; ZVFH-LABEL: vp_splat_nxv4f16: 439; ZVFH: # %bb.0: 440; ZVFH-NEXT: vsetvli zero, a0, e16, m1, ta, ma 441; ZVFH-NEXT: vfmv.v.f v8, fa0 442; ZVFH-NEXT: ret 443; 444; ZVFHMIN-LABEL: vp_splat_nxv4f16: 445; ZVFHMIN: # %bb.0: 446; ZVFHMIN-NEXT: fmv.x.w a1, fa0 447; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m1, ta, ma 448; ZVFHMIN-NEXT: vmv.v.x v8, a1 449; ZVFHMIN-NEXT: ret 450; 451; ZFMIN-LABEL: vp_splat_nxv4f16: 452; ZFMIN: # %bb.0: 453; ZFMIN-NEXT: fmv.x.h a1, fa0 454; ZFMIN-NEXT: vsetvli zero, a0, e16, m1, ta, ma 455; ZFMIN-NEXT: vmv.v.x v8, a1 456; ZFMIN-NEXT: ret 457 %splat = call <vscale x 4 x half> @llvm.experimental.vp.splat.nxv4f16(half %val, <vscale x 4 x i1> %m, i32 %evl) 458 ret <vscale x 4 x half> %splat 459} 460 461define <vscale x 8 x half> @vp_splat_nxv8f16(half %val, <vscale x 8 x i1> %m, i32 zeroext %evl) { 462; ZVFH-LABEL: vp_splat_nxv8f16: 463; ZVFH: # %bb.0: 464; ZVFH-NEXT: vsetvli zero, a0, e16, m2, ta, ma 465; ZVFH-NEXT: vfmv.v.f v8, fa0 466; ZVFH-NEXT: ret 467; 468; ZVFHMIN-LABEL: vp_splat_nxv8f16: 469; ZVFHMIN: # %bb.0: 470; ZVFHMIN-NEXT: fmv.x.w a1, fa0 471; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m2, ta, ma 472; ZVFHMIN-NEXT: vmv.v.x v8, a1 473; ZVFHMIN-NEXT: ret 474; 475; ZFMIN-LABEL: vp_splat_nxv8f16: 476; ZFMIN: # %bb.0: 477; ZFMIN-NEXT: fmv.x.h a1, fa0 478; ZFMIN-NEXT: vsetvli zero, a0, e16, m2, ta, ma 479; ZFMIN-NEXT: vmv.v.x v8, a1 480; ZFMIN-NEXT: ret 481 %splat = call <vscale x 8 x half> @llvm.experimental.vp.splat.nxv8f16(half %val, <vscale x 8 x i1> %m, i32 %evl) 482 ret <vscale x 8 x half> %splat 483} 484 485define <vscale x 16 x half> @vp_splat_nxv16f16(half %val, <vscale x 16 x i1> %m, i32 zeroext %evl) { 486; ZVFH-LABEL: vp_splat_nxv16f16: 487; ZVFH: # %bb.0: 488; ZVFH-NEXT: vsetvli zero, a0, e16, m4, ta, ma 489; ZVFH-NEXT: vfmv.v.f v8, fa0 490; ZVFH-NEXT: ret 491; 492; ZVFHMIN-LABEL: vp_splat_nxv16f16: 493; ZVFHMIN: # %bb.0: 494; ZVFHMIN-NEXT: fmv.x.w a1, fa0 495; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m4, ta, ma 496; ZVFHMIN-NEXT: vmv.v.x v8, a1 497; ZVFHMIN-NEXT: ret 498; 499; ZFMIN-LABEL: vp_splat_nxv16f16: 500; ZFMIN: # %bb.0: 501; ZFMIN-NEXT: fmv.x.h a1, fa0 502; ZFMIN-NEXT: vsetvli zero, a0, e16, m4, ta, ma 503; ZFMIN-NEXT: vmv.v.x v8, a1 504; ZFMIN-NEXT: ret 505 %splat = call <vscale x 16 x half> @llvm.experimental.vp.splat.nxv16f16(half %val, <vscale x 16 x i1> %m, i32 %evl) 506 ret <vscale x 16 x half> %splat 507} 508 509define <vscale x 32 x half> @vp_splat_nxv32f16(half %val, <vscale x 32 x i1> %m, i32 zeroext %evl) { 510; ZVFH-LABEL: vp_splat_nxv32f16: 511; ZVFH: # %bb.0: 512; ZVFH-NEXT: vsetvli zero, a0, e16, m8, ta, ma 513; ZVFH-NEXT: vfmv.v.f v8, fa0 514; ZVFH-NEXT: ret 515; 516; ZVFHMIN-LABEL: vp_splat_nxv32f16: 517; ZVFHMIN: # %bb.0: 518; ZVFHMIN-NEXT: fmv.x.w a1, fa0 519; ZVFHMIN-NEXT: vsetvli zero, a0, e16, m8, ta, ma 520; ZVFHMIN-NEXT: vmv.v.x v8, a1 521; ZVFHMIN-NEXT: ret 522; 523; ZFMIN-LABEL: vp_splat_nxv32f16: 524; ZFMIN: # %bb.0: 525; ZFMIN-NEXT: fmv.x.h a1, fa0 526; ZFMIN-NEXT: vsetvli zero, a0, e16, m8, ta, ma 527; ZFMIN-NEXT: vmv.v.x v8, a1 528; ZFMIN-NEXT: ret 529 %splat = call <vscale x 32 x half> @llvm.experimental.vp.splat.nxv32f16(half %val, <vscale x 32 x i1> %m, i32 %evl) 530 ret <vscale x 32 x half> %splat 531} 532 533define <vscale x 1 x float> @vp_splat_nxv1f32(float %val, <vscale x 1 x i1> %m, i32 zeroext %evl) { 534; CHECK-LABEL: vp_splat_nxv1f32: 535; CHECK: # %bb.0: 536; CHECK-NEXT: vsetvli zero, a0, e32, mf2, ta, ma 537; CHECK-NEXT: vfmv.v.f v8, fa0 538; CHECK-NEXT: ret 539 %splat = call <vscale x 1 x float> @llvm.experimental.vp.splat.nxv1f32(float %val, <vscale x 1 x i1> %m, i32 %evl) 540 ret <vscale x 1 x float> %splat 541} 542 543define <vscale x 2 x float> @vp_splat_nxv2f32(float %val, <vscale x 2 x i1> %m, i32 zeroext %evl) { 544; CHECK-LABEL: vp_splat_nxv2f32: 545; CHECK: # %bb.0: 546; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma 547; CHECK-NEXT: vfmv.v.f v8, fa0 548; CHECK-NEXT: ret 549 %splat = call <vscale x 2 x float> @llvm.experimental.vp.splat.nxv2f32(float %val, <vscale x 2 x i1> %m, i32 %evl) 550 ret <vscale x 2 x float> %splat 551} 552 553define <vscale x 4 x float> @vp_splat_nxv4f32(float %val, <vscale x 4 x i1> %m, i32 zeroext %evl) { 554; CHECK-LABEL: vp_splat_nxv4f32: 555; CHECK: # %bb.0: 556; CHECK-NEXT: vsetvli zero, a0, e32, m2, ta, ma 557; CHECK-NEXT: vfmv.v.f v8, fa0 558; CHECK-NEXT: ret 559 %splat = call <vscale x 4 x float> @llvm.experimental.vp.splat.nxv4f32(float %val, <vscale x 4 x i1> %m, i32 %evl) 560 ret <vscale x 4 x float> %splat 561} 562 563define <vscale x 8 x float> @vp_splat_nxv8f32(float %val, <vscale x 8 x i1> %m, i32 zeroext %evl) { 564; CHECK-LABEL: vp_splat_nxv8f32: 565; CHECK: # %bb.0: 566; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma 567; CHECK-NEXT: vfmv.v.f v8, fa0 568; CHECK-NEXT: ret 569 %splat = call <vscale x 8 x float> @llvm.experimental.vp.splat.nxv8f32(float %val, <vscale x 8 x i1> %m, i32 %evl) 570 ret <vscale x 8 x float> %splat 571} 572 573define <vscale x 16 x float> @vp_splat_nxv16f32(float %val, <vscale x 16 x i1> %m, i32 zeroext %evl) { 574; CHECK-LABEL: vp_splat_nxv16f32: 575; CHECK: # %bb.0: 576; CHECK-NEXT: vsetvli zero, a0, e32, m8, ta, ma 577; CHECK-NEXT: vfmv.v.f v8, fa0 578; CHECK-NEXT: ret 579 %splat = call <vscale x 16 x float> @llvm.experimental.vp.splat.nxv16f32(float %val, <vscale x 16 x i1> %m, i32 %evl) 580 ret <vscale x 16 x float> %splat 581} 582 583define <vscale x 1 x double> @vp_splat_nxv1f64(double %val, <vscale x 1 x i1> %m, i32 zeroext %evl) { 584; CHECK-LABEL: vp_splat_nxv1f64: 585; CHECK: # %bb.0: 586; CHECK-NEXT: vsetvli zero, a0, e64, m1, ta, ma 587; CHECK-NEXT: vfmv.v.f v8, fa0 588; CHECK-NEXT: ret 589 %splat = call <vscale x 1 x double> @llvm.experimental.vp.splat.nxv1f64(double %val, <vscale x 1 x i1> %m, i32 %evl) 590 ret <vscale x 1 x double> %splat 591} 592 593define <vscale x 2 x double> @vp_splat_nxv2f64(double %val, <vscale x 2 x i1> %m, i32 zeroext %evl) { 594; CHECK-LABEL: vp_splat_nxv2f64: 595; CHECK: # %bb.0: 596; CHECK-NEXT: vsetvli zero, a0, e64, m2, ta, ma 597; CHECK-NEXT: vfmv.v.f v8, fa0 598; CHECK-NEXT: ret 599 %splat = call <vscale x 2 x double> @llvm.experimental.vp.splat.nxv2f64(double %val, <vscale x 2 x i1> %m, i32 %evl) 600 ret <vscale x 2 x double> %splat 601} 602 603define <vscale x 4 x double> @vp_splat_nxv4f64(double %val, <vscale x 4 x i1> %m, i32 zeroext %evl) { 604; CHECK-LABEL: vp_splat_nxv4f64: 605; CHECK: # %bb.0: 606; CHECK-NEXT: vsetvli zero, a0, e64, m4, ta, ma 607; CHECK-NEXT: vfmv.v.f v8, fa0 608; CHECK-NEXT: ret 609 %splat = call <vscale x 4 x double> @llvm.experimental.vp.splat.nxv4f64(double %val, <vscale x 4 x i1> %m, i32 %evl) 610 ret <vscale x 4 x double> %splat 611} 612 613define <vscale x 8 x double> @vp_splat_nxv8f64(double %val, <vscale x 8 x i1> %m, i32 zeroext %evl) { 614; CHECK-LABEL: vp_splat_nxv8f64: 615; CHECK: # %bb.0: 616; CHECK-NEXT: vsetvli zero, a0, e64, m8, ta, ma 617; CHECK-NEXT: vfmv.v.f v8, fa0 618; CHECK-NEXT: ret 619 %splat = call <vscale x 8 x double> @llvm.experimental.vp.splat.nxv8f64(double %val, <vscale x 8 x i1> %m, i32 %evl) 620 ret <vscale x 8 x double> %splat 621} 622 623define <vscale x 16 x i31> @vp_splat_nxv16i31(i31 %val, <vscale x 16 x i1> %m, i32 zeroext %evl) { 624; CHECK-LABEL: vp_splat_nxv16i31: 625; CHECK: # %bb.0: 626; CHECK-NEXT: vsetvli zero, a1, e32, m8, ta, ma 627; CHECK-NEXT: vmv.v.x v8, a0 628; CHECK-NEXT: ret 629 %splat = call <vscale x 16 x i31> @llvm.experimental.vp.splat.nxv16i31(i31 %val, <vscale x 16 x i1> %m, i32 %evl) 630 ret <vscale x 16 x i31> %splat 631} 632 633define <vscale x 15 x i32> @vp_splat_nxv15i32(i32 %val, <vscale x 15 x i1> %m, i32 zeroext %evl) { 634; CHECK-LABEL: vp_splat_nxv15i32: 635; CHECK: # %bb.0: 636; CHECK-NEXT: vsetvli zero, a1, e32, m8, ta, ma 637; CHECK-NEXT: vmv.v.x v8, a0 638; CHECK-NEXT: ret 639 %splat = call <vscale x 15 x i32> @llvm.experimental.vp.splat.nxv15i32(i32 %val, <vscale x 15 x i1> %m, i32 %evl) 640 ret <vscale x 15 x i32> %splat 641} 642 643; Split case. 644define <vscale x 32 x i32> @vp_splat_nxv32i32(i32 %val, <vscale x 32 x i1> %m, i32 zeroext %evl) { 645; CHECK-LABEL: vp_splat_nxv32i32: 646; CHECK: # %bb.0: 647; CHECK-NEXT: csrr a2, vlenb 648; CHECK-NEXT: slli a2, a2, 1 649; CHECK-NEXT: sub a3, a1, a2 650; CHECK-NEXT: sltu a4, a1, a3 651; CHECK-NEXT: addi a4, a4, -1 652; CHECK-NEXT: and a3, a4, a3 653; CHECK-NEXT: vsetvli zero, a3, e32, m8, ta, ma 654; CHECK-NEXT: vmv.v.x v16, a0 655; CHECK-NEXT: bltu a1, a2, .LBB45_2 656; CHECK-NEXT: # %bb.1: 657; CHECK-NEXT: mv a1, a2 658; CHECK-NEXT: .LBB45_2: 659; CHECK-NEXT: vsetvli zero, a1, e32, m8, ta, ma 660; CHECK-NEXT: vmv.v.x v8, a0 661; CHECK-NEXT: ret 662 %splat = call <vscale x 32 x i32> @llvm.experimental.vp.splat.nxv32i32(i32 %val, <vscale x 32 x i1> %m, i32 %evl) 663 ret <vscale x 32 x i32> %splat 664} 665