1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh,+zvfh,+v -target-abi=ilp32d \ 3; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH 4; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh,+zvfh,+v -target-abi=lp64d \ 5; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFH 6; RUN: llc -mtriple=riscv32 -mattr=+d,+zfh,+zvfhmin,+v -target-abi=ilp32d \ 7; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN 8; RUN: llc -mtriple=riscv64 -mattr=+d,+zfh,+zvfhmin,+v -target-abi=lp64d \ 9; RUN: -verify-machineinstrs < %s | FileCheck %s --check-prefixes=CHECK,ZVFHMIN 10 11declare <2 x half> @llvm.minnum.v2f16(<2 x half>, <2 x half>) 12 13define <2 x half> @vfmin_v2f16_vv(<2 x half> %a, <2 x half> %b) { 14; ZVFH-LABEL: vfmin_v2f16_vv: 15; ZVFH: # %bb.0: 16; ZVFH-NEXT: vsetivli zero, 2, e16, mf4, ta, ma 17; ZVFH-NEXT: vfmin.vv v8, v8, v9 18; ZVFH-NEXT: ret 19; 20; ZVFHMIN-LABEL: vfmin_v2f16_vv: 21; ZVFHMIN: # %bb.0: 22; ZVFHMIN-NEXT: vsetivli zero, 2, e16, mf4, ta, ma 23; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9 24; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v8 25; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 26; ZVFHMIN-NEXT: vfmin.vv v9, v9, v10 27; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf4, ta, ma 28; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9 29; ZVFHMIN-NEXT: ret 30 %v = call <2 x half> @llvm.minnum.v2f16(<2 x half> %a, <2 x half> %b) 31 ret <2 x half> %v 32} 33 34define <2 x half> @vfmin_v2f16_vf(<2 x half> %a, half %b) { 35; ZVFH-LABEL: vfmin_v2f16_vf: 36; ZVFH: # %bb.0: 37; ZVFH-NEXT: vsetivli zero, 2, e16, mf4, ta, ma 38; ZVFH-NEXT: vfmin.vf v8, v8, fa0 39; ZVFH-NEXT: ret 40; 41; ZVFHMIN-LABEL: vfmin_v2f16_vf: 42; ZVFHMIN: # %bb.0: 43; ZVFHMIN-NEXT: fmv.x.h a0, fa0 44; ZVFHMIN-NEXT: vsetivli zero, 2, e16, mf4, ta, ma 45; ZVFHMIN-NEXT: vmv.v.x v9, a0 46; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8 47; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v9 48; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 49; ZVFHMIN-NEXT: vfmin.vv v9, v10, v8 50; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf4, ta, ma 51; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9 52; ZVFHMIN-NEXT: ret 53 %head = insertelement <2 x half> poison, half %b, i32 0 54 %splat = shufflevector <2 x half> %head, <2 x half> poison, <2 x i32> zeroinitializer 55 %v = call <2 x half> @llvm.minnum.v2f16(<2 x half> %a, <2 x half> %splat) 56 ret <2 x half> %v 57} 58 59define <2 x half> @vfmin_v2f16_fv(<2 x half> %a, half %b) { 60; ZVFH-LABEL: vfmin_v2f16_fv: 61; ZVFH: # %bb.0: 62; ZVFH-NEXT: vsetivli zero, 2, e16, mf4, ta, ma 63; ZVFH-NEXT: vfmin.vf v8, v8, fa0 64; ZVFH-NEXT: ret 65; 66; ZVFHMIN-LABEL: vfmin_v2f16_fv: 67; ZVFHMIN: # %bb.0: 68; ZVFHMIN-NEXT: fmv.x.h a0, fa0 69; ZVFHMIN-NEXT: vsetivli zero, 2, e16, mf4, ta, ma 70; ZVFHMIN-NEXT: vmv.v.x v9, a0 71; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8 72; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v9 73; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 74; ZVFHMIN-NEXT: vfmin.vv v9, v8, v10 75; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf4, ta, ma 76; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9 77; ZVFHMIN-NEXT: ret 78 %head = insertelement <2 x half> poison, half %b, i32 0 79 %splat = shufflevector <2 x half> %head, <2 x half> poison, <2 x i32> zeroinitializer 80 %v = call <2 x half> @llvm.minnum.v2f16(<2 x half> %splat, <2 x half> %a) 81 ret <2 x half> %v 82} 83 84declare <4 x half> @llvm.minnum.v4f16(<4 x half>, <4 x half>) 85 86define <4 x half> @vfmin_v4f16_vv(<4 x half> %a, <4 x half> %b) { 87; ZVFH-LABEL: vfmin_v4f16_vv: 88; ZVFH: # %bb.0: 89; ZVFH-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 90; ZVFH-NEXT: vfmin.vv v8, v8, v9 91; ZVFH-NEXT: ret 92; 93; ZVFHMIN-LABEL: vfmin_v4f16_vv: 94; ZVFHMIN: # %bb.0: 95; ZVFHMIN-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 96; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9 97; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v8 98; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma 99; ZVFHMIN-NEXT: vfmin.vv v9, v9, v10 100; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf2, ta, ma 101; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9 102; ZVFHMIN-NEXT: ret 103 %v = call <4 x half> @llvm.minnum.v4f16(<4 x half> %a, <4 x half> %b) 104 ret <4 x half> %v 105} 106 107define <4 x half> @vfmin_v4f16_vf(<4 x half> %a, half %b) { 108; ZVFH-LABEL: vfmin_v4f16_vf: 109; ZVFH: # %bb.0: 110; ZVFH-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 111; ZVFH-NEXT: vfmin.vf v8, v8, fa0 112; ZVFH-NEXT: ret 113; 114; ZVFHMIN-LABEL: vfmin_v4f16_vf: 115; ZVFHMIN: # %bb.0: 116; ZVFHMIN-NEXT: fmv.x.h a0, fa0 117; ZVFHMIN-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 118; ZVFHMIN-NEXT: vmv.v.x v9, a0 119; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8 120; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v9 121; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma 122; ZVFHMIN-NEXT: vfmin.vv v9, v10, v8 123; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf2, ta, ma 124; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9 125; ZVFHMIN-NEXT: ret 126 %head = insertelement <4 x half> poison, half %b, i32 0 127 %splat = shufflevector <4 x half> %head, <4 x half> poison, <4 x i32> zeroinitializer 128 %v = call <4 x half> @llvm.minnum.v4f16(<4 x half> %a, <4 x half> %splat) 129 ret <4 x half> %v 130} 131 132define <4 x half> @vfmin_v4f16_fv(<4 x half> %a, half %b) { 133; ZVFH-LABEL: vfmin_v4f16_fv: 134; ZVFH: # %bb.0: 135; ZVFH-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 136; ZVFH-NEXT: vfmin.vf v8, v8, fa0 137; ZVFH-NEXT: ret 138; 139; ZVFHMIN-LABEL: vfmin_v4f16_fv: 140; ZVFHMIN: # %bb.0: 141; ZVFHMIN-NEXT: fmv.x.h a0, fa0 142; ZVFHMIN-NEXT: vsetivli zero, 4, e16, mf2, ta, ma 143; ZVFHMIN-NEXT: vmv.v.x v9, a0 144; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8 145; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v9 146; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma 147; ZVFHMIN-NEXT: vfmin.vv v9, v8, v10 148; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf2, ta, ma 149; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9 150; ZVFHMIN-NEXT: ret 151 %head = insertelement <4 x half> poison, half %b, i32 0 152 %splat = shufflevector <4 x half> %head, <4 x half> poison, <4 x i32> zeroinitializer 153 %v = call <4 x half> @llvm.minnum.v4f16(<4 x half> %splat, <4 x half> %a) 154 ret <4 x half> %v 155} 156 157declare <8 x half> @llvm.minnum.v8f16(<8 x half>, <8 x half>) 158 159define <8 x half> @vfmin_v8f16_vv(<8 x half> %a, <8 x half> %b) { 160; ZVFH-LABEL: vfmin_v8f16_vv: 161; ZVFH: # %bb.0: 162; ZVFH-NEXT: vsetivli zero, 8, e16, m1, ta, ma 163; ZVFH-NEXT: vfmin.vv v8, v8, v9 164; ZVFH-NEXT: ret 165; 166; ZVFHMIN-LABEL: vfmin_v8f16_vv: 167; ZVFHMIN: # %bb.0: 168; ZVFHMIN-NEXT: vsetivli zero, 8, e16, m1, ta, ma 169; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9 170; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v8 171; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma 172; ZVFHMIN-NEXT: vfmin.vv v10, v12, v10 173; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m1, ta, ma 174; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v10 175; ZVFHMIN-NEXT: ret 176 %v = call <8 x half> @llvm.minnum.v8f16(<8 x half> %a, <8 x half> %b) 177 ret <8 x half> %v 178} 179 180define <8 x half> @vfmin_v8f16_vf(<8 x half> %a, half %b) { 181; ZVFH-LABEL: vfmin_v8f16_vf: 182; ZVFH: # %bb.0: 183; ZVFH-NEXT: vsetivli zero, 8, e16, m1, ta, ma 184; ZVFH-NEXT: vfmin.vf v8, v8, fa0 185; ZVFH-NEXT: ret 186; 187; ZVFHMIN-LABEL: vfmin_v8f16_vf: 188; ZVFHMIN: # %bb.0: 189; ZVFHMIN-NEXT: fmv.x.h a0, fa0 190; ZVFHMIN-NEXT: vsetivli zero, 8, e16, m1, ta, ma 191; ZVFHMIN-NEXT: vmv.v.x v9, a0 192; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8 193; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v9 194; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma 195; ZVFHMIN-NEXT: vfmin.vv v10, v10, v12 196; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m1, ta, ma 197; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v10 198; ZVFHMIN-NEXT: ret 199 %head = insertelement <8 x half> poison, half %b, i32 0 200 %splat = shufflevector <8 x half> %head, <8 x half> poison, <8 x i32> zeroinitializer 201 %v = call <8 x half> @llvm.minnum.v8f16(<8 x half> %a, <8 x half> %splat) 202 ret <8 x half> %v 203} 204 205define <8 x half> @vfmin_v8f16_fv(<8 x half> %a, half %b) { 206; ZVFH-LABEL: vfmin_v8f16_fv: 207; ZVFH: # %bb.0: 208; ZVFH-NEXT: vsetivli zero, 8, e16, m1, ta, ma 209; ZVFH-NEXT: vfmin.vf v8, v8, fa0 210; ZVFH-NEXT: ret 211; 212; ZVFHMIN-LABEL: vfmin_v8f16_fv: 213; ZVFHMIN: # %bb.0: 214; ZVFHMIN-NEXT: fmv.x.h a0, fa0 215; ZVFHMIN-NEXT: vsetivli zero, 8, e16, m1, ta, ma 216; ZVFHMIN-NEXT: vmv.v.x v9, a0 217; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8 218; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v9 219; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma 220; ZVFHMIN-NEXT: vfmin.vv v10, v12, v10 221; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m1, ta, ma 222; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v10 223; ZVFHMIN-NEXT: ret 224 %head = insertelement <8 x half> poison, half %b, i32 0 225 %splat = shufflevector <8 x half> %head, <8 x half> poison, <8 x i32> zeroinitializer 226 %v = call <8 x half> @llvm.minnum.v8f16(<8 x half> %splat, <8 x half> %a) 227 ret <8 x half> %v 228} 229 230declare <16 x half> @llvm.minnum.v16f16(<16 x half>, <16 x half>) 231 232define <16 x half> @vfmin_v16f16_vv(<16 x half> %a, <16 x half> %b) { 233; ZVFH-LABEL: vfmin_v16f16_vv: 234; ZVFH: # %bb.0: 235; ZVFH-NEXT: vsetivli zero, 16, e16, m2, ta, ma 236; ZVFH-NEXT: vfmin.vv v8, v8, v10 237; ZVFH-NEXT: ret 238; 239; ZVFHMIN-LABEL: vfmin_v16f16_vv: 240; ZVFHMIN: # %bb.0: 241; ZVFHMIN-NEXT: vsetivli zero, 16, e16, m2, ta, ma 242; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v10 243; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v8 244; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma 245; ZVFHMIN-NEXT: vfmin.vv v12, v16, v12 246; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m2, ta, ma 247; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12 248; ZVFHMIN-NEXT: ret 249 %v = call <16 x half> @llvm.minnum.v16f16(<16 x half> %a, <16 x half> %b) 250 ret <16 x half> %v 251} 252 253define <16 x half> @vfmin_v16f16_vf(<16 x half> %a, half %b) { 254; ZVFH-LABEL: vfmin_v16f16_vf: 255; ZVFH: # %bb.0: 256; ZVFH-NEXT: vsetivli zero, 16, e16, m2, ta, ma 257; ZVFH-NEXT: vfmin.vf v8, v8, fa0 258; ZVFH-NEXT: ret 259; 260; ZVFHMIN-LABEL: vfmin_v16f16_vf: 261; ZVFHMIN: # %bb.0: 262; ZVFHMIN-NEXT: fmv.x.h a0, fa0 263; ZVFHMIN-NEXT: vsetivli zero, 16, e16, m2, ta, ma 264; ZVFHMIN-NEXT: vmv.v.x v10, a0 265; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v8 266; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v10 267; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma 268; ZVFHMIN-NEXT: vfmin.vv v12, v12, v16 269; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m2, ta, ma 270; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12 271; ZVFHMIN-NEXT: ret 272 %head = insertelement <16 x half> poison, half %b, i32 0 273 %splat = shufflevector <16 x half> %head, <16 x half> poison, <16 x i32> zeroinitializer 274 %v = call <16 x half> @llvm.minnum.v16f16(<16 x half> %a, <16 x half> %splat) 275 ret <16 x half> %v 276} 277 278define <16 x half> @vfmin_v16f16_fv(<16 x half> %a, half %b) { 279; ZVFH-LABEL: vfmin_v16f16_fv: 280; ZVFH: # %bb.0: 281; ZVFH-NEXT: vsetivli zero, 16, e16, m2, ta, ma 282; ZVFH-NEXT: vfmin.vf v8, v8, fa0 283; ZVFH-NEXT: ret 284; 285; ZVFHMIN-LABEL: vfmin_v16f16_fv: 286; ZVFHMIN: # %bb.0: 287; ZVFHMIN-NEXT: fmv.x.h a0, fa0 288; ZVFHMIN-NEXT: vsetivli zero, 16, e16, m2, ta, ma 289; ZVFHMIN-NEXT: vmv.v.x v10, a0 290; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v8 291; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v10 292; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma 293; ZVFHMIN-NEXT: vfmin.vv v12, v16, v12 294; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m2, ta, ma 295; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12 296; ZVFHMIN-NEXT: ret 297 %head = insertelement <16 x half> poison, half %b, i32 0 298 %splat = shufflevector <16 x half> %head, <16 x half> poison, <16 x i32> zeroinitializer 299 %v = call <16 x half> @llvm.minnum.v16f16(<16 x half> %splat, <16 x half> %a) 300 ret <16 x half> %v 301} 302 303declare <2 x float> @llvm.minnum.v2f32(<2 x float>, <2 x float>) 304 305define <2 x float> @vfmin_v2f32_vv(<2 x float> %a, <2 x float> %b) { 306; CHECK-LABEL: vfmin_v2f32_vv: 307; CHECK: # %bb.0: 308; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 309; CHECK-NEXT: vfmin.vv v8, v8, v9 310; CHECK-NEXT: ret 311 %v = call <2 x float> @llvm.minnum.v2f32(<2 x float> %a, <2 x float> %b) 312 ret <2 x float> %v 313} 314 315define <2 x float> @vfmin_v2f32_vf(<2 x float> %a, float %b) { 316; CHECK-LABEL: vfmin_v2f32_vf: 317; CHECK: # %bb.0: 318; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 319; CHECK-NEXT: vfmin.vf v8, v8, fa0 320; CHECK-NEXT: ret 321 %head = insertelement <2 x float> poison, float %b, i32 0 322 %splat = shufflevector <2 x float> %head, <2 x float> poison, <2 x i32> zeroinitializer 323 %v = call <2 x float> @llvm.minnum.v2f32(<2 x float> %a, <2 x float> %splat) 324 ret <2 x float> %v 325} 326 327define <2 x float> @vfmin_v2f32_fv(<2 x float> %a, float %b) { 328; CHECK-LABEL: vfmin_v2f32_fv: 329; CHECK: # %bb.0: 330; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma 331; CHECK-NEXT: vfmin.vf v8, v8, fa0 332; CHECK-NEXT: ret 333 %head = insertelement <2 x float> poison, float %b, i32 0 334 %splat = shufflevector <2 x float> %head, <2 x float> poison, <2 x i32> zeroinitializer 335 %v = call <2 x float> @llvm.minnum.v2f32(<2 x float> %splat, <2 x float> %a) 336 ret <2 x float> %v 337} 338 339declare <4 x float> @llvm.minnum.v4f32(<4 x float>, <4 x float>) 340 341define <4 x float> @vfmin_v4f32_vv(<4 x float> %a, <4 x float> %b) { 342; CHECK-LABEL: vfmin_v4f32_vv: 343; CHECK: # %bb.0: 344; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma 345; CHECK-NEXT: vfmin.vv v8, v8, v9 346; CHECK-NEXT: ret 347 %v = call <4 x float> @llvm.minnum.v4f32(<4 x float> %a, <4 x float> %b) 348 ret <4 x float> %v 349} 350 351define <4 x float> @vfmin_v4f32_vf(<4 x float> %a, float %b) { 352; CHECK-LABEL: vfmin_v4f32_vf: 353; CHECK: # %bb.0: 354; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma 355; CHECK-NEXT: vfmin.vf v8, v8, fa0 356; CHECK-NEXT: ret 357 %head = insertelement <4 x float> poison, float %b, i32 0 358 %splat = shufflevector <4 x float> %head, <4 x float> poison, <4 x i32> zeroinitializer 359 %v = call <4 x float> @llvm.minnum.v4f32(<4 x float> %a, <4 x float> %splat) 360 ret <4 x float> %v 361} 362 363define <4 x float> @vfmin_v4f32_fv(<4 x float> %a, float %b) { 364; CHECK-LABEL: vfmin_v4f32_fv: 365; CHECK: # %bb.0: 366; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma 367; CHECK-NEXT: vfmin.vf v8, v8, fa0 368; CHECK-NEXT: ret 369 %head = insertelement <4 x float> poison, float %b, i32 0 370 %splat = shufflevector <4 x float> %head, <4 x float> poison, <4 x i32> zeroinitializer 371 %v = call <4 x float> @llvm.minnum.v4f32(<4 x float> %splat, <4 x float> %a) 372 ret <4 x float> %v 373} 374 375declare <8 x float> @llvm.minnum.v8f32(<8 x float>, <8 x float>) 376 377define <8 x float> @vfmin_v8f32_vv(<8 x float> %a, <8 x float> %b) { 378; CHECK-LABEL: vfmin_v8f32_vv: 379; CHECK: # %bb.0: 380; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma 381; CHECK-NEXT: vfmin.vv v8, v8, v10 382; CHECK-NEXT: ret 383 %v = call <8 x float> @llvm.minnum.v8f32(<8 x float> %a, <8 x float> %b) 384 ret <8 x float> %v 385} 386 387define <8 x float> @vfmin_v8f32_vf(<8 x float> %a, float %b) { 388; CHECK-LABEL: vfmin_v8f32_vf: 389; CHECK: # %bb.0: 390; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma 391; CHECK-NEXT: vfmin.vf v8, v8, fa0 392; CHECK-NEXT: ret 393 %head = insertelement <8 x float> poison, float %b, i32 0 394 %splat = shufflevector <8 x float> %head, <8 x float> poison, <8 x i32> zeroinitializer 395 %v = call <8 x float> @llvm.minnum.v8f32(<8 x float> %a, <8 x float> %splat) 396 ret <8 x float> %v 397} 398 399define <8 x float> @vfmin_v8f32_fv(<8 x float> %a, float %b) { 400; CHECK-LABEL: vfmin_v8f32_fv: 401; CHECK: # %bb.0: 402; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma 403; CHECK-NEXT: vfmin.vf v8, v8, fa0 404; CHECK-NEXT: ret 405 %head = insertelement <8 x float> poison, float %b, i32 0 406 %splat = shufflevector <8 x float> %head, <8 x float> poison, <8 x i32> zeroinitializer 407 %v = call <8 x float> @llvm.minnum.v8f32(<8 x float> %splat, <8 x float> %a) 408 ret <8 x float> %v 409} 410 411declare <16 x float> @llvm.minnum.v16f32(<16 x float>, <16 x float>) 412 413define <16 x float> @vfmin_v16f32_vv(<16 x float> %a, <16 x float> %b) { 414; CHECK-LABEL: vfmin_v16f32_vv: 415; CHECK: # %bb.0: 416; CHECK-NEXT: vsetivli zero, 16, e32, m4, ta, ma 417; CHECK-NEXT: vfmin.vv v8, v8, v12 418; CHECK-NEXT: ret 419 %v = call <16 x float> @llvm.minnum.v16f32(<16 x float> %a, <16 x float> %b) 420 ret <16 x float> %v 421} 422 423define <16 x float> @vfmin_v16f32_vf(<16 x float> %a, float %b) { 424; CHECK-LABEL: vfmin_v16f32_vf: 425; CHECK: # %bb.0: 426; CHECK-NEXT: vsetivli zero, 16, e32, m4, ta, ma 427; CHECK-NEXT: vfmin.vf v8, v8, fa0 428; CHECK-NEXT: ret 429 %head = insertelement <16 x float> poison, float %b, i32 0 430 %splat = shufflevector <16 x float> %head, <16 x float> poison, <16 x i32> zeroinitializer 431 %v = call <16 x float> @llvm.minnum.v16f32(<16 x float> %a, <16 x float> %splat) 432 ret <16 x float> %v 433} 434 435define <16 x float> @vfmin_v16f32_fv(<16 x float> %a, float %b) { 436; CHECK-LABEL: vfmin_v16f32_fv: 437; CHECK: # %bb.0: 438; CHECK-NEXT: vsetivli zero, 16, e32, m4, ta, ma 439; CHECK-NEXT: vfmin.vf v8, v8, fa0 440; CHECK-NEXT: ret 441 %head = insertelement <16 x float> poison, float %b, i32 0 442 %splat = shufflevector <16 x float> %head, <16 x float> poison, <16 x i32> zeroinitializer 443 %v = call <16 x float> @llvm.minnum.v16f32(<16 x float> %splat, <16 x float> %a) 444 ret <16 x float> %v 445} 446 447declare <2 x double> @llvm.minnum.v2f64(<2 x double>, <2 x double>) 448 449define <2 x double> @vfmin_v2f64_vv(<2 x double> %a, <2 x double> %b) { 450; CHECK-LABEL: vfmin_v2f64_vv: 451; CHECK: # %bb.0: 452; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma 453; CHECK-NEXT: vfmin.vv v8, v8, v9 454; CHECK-NEXT: ret 455 %v = call <2 x double> @llvm.minnum.v2f64(<2 x double> %a, <2 x double> %b) 456 ret <2 x double> %v 457} 458 459define <2 x double> @vfmin_v2f64_vf(<2 x double> %a, double %b) { 460; CHECK-LABEL: vfmin_v2f64_vf: 461; CHECK: # %bb.0: 462; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma 463; CHECK-NEXT: vfmin.vf v8, v8, fa0 464; CHECK-NEXT: ret 465 %head = insertelement <2 x double> poison, double %b, i32 0 466 %splat = shufflevector <2 x double> %head, <2 x double> poison, <2 x i32> zeroinitializer 467 %v = call <2 x double> @llvm.minnum.v2f64(<2 x double> %a, <2 x double> %splat) 468 ret <2 x double> %v 469} 470 471define <2 x double> @vfmin_v2f64_fv(<2 x double> %a, double %b) { 472; CHECK-LABEL: vfmin_v2f64_fv: 473; CHECK: # %bb.0: 474; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma 475; CHECK-NEXT: vfmin.vf v8, v8, fa0 476; CHECK-NEXT: ret 477 %head = insertelement <2 x double> poison, double %b, i32 0 478 %splat = shufflevector <2 x double> %head, <2 x double> poison, <2 x i32> zeroinitializer 479 %v = call <2 x double> @llvm.minnum.v2f64(<2 x double> %splat, <2 x double> %a) 480 ret <2 x double> %v 481} 482 483declare <4 x double> @llvm.minnum.v4f64(<4 x double>, <4 x double>) 484 485define <4 x double> @vfmin_v4f64_vv(<4 x double> %a, <4 x double> %b) { 486; CHECK-LABEL: vfmin_v4f64_vv: 487; CHECK: # %bb.0: 488; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma 489; CHECK-NEXT: vfmin.vv v8, v8, v10 490; CHECK-NEXT: ret 491 %v = call <4 x double> @llvm.minnum.v4f64(<4 x double> %a, <4 x double> %b) 492 ret <4 x double> %v 493} 494 495define <4 x double> @vfmin_v4f64_vf(<4 x double> %a, double %b) { 496; CHECK-LABEL: vfmin_v4f64_vf: 497; CHECK: # %bb.0: 498; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma 499; CHECK-NEXT: vfmin.vf v8, v8, fa0 500; CHECK-NEXT: ret 501 %head = insertelement <4 x double> poison, double %b, i32 0 502 %splat = shufflevector <4 x double> %head, <4 x double> poison, <4 x i32> zeroinitializer 503 %v = call <4 x double> @llvm.minnum.v4f64(<4 x double> %a, <4 x double> %splat) 504 ret <4 x double> %v 505} 506 507define <4 x double> @vfmin_v4f64_fv(<4 x double> %a, double %b) { 508; CHECK-LABEL: vfmin_v4f64_fv: 509; CHECK: # %bb.0: 510; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma 511; CHECK-NEXT: vfmin.vf v8, v8, fa0 512; CHECK-NEXT: ret 513 %head = insertelement <4 x double> poison, double %b, i32 0 514 %splat = shufflevector <4 x double> %head, <4 x double> poison, <4 x i32> zeroinitializer 515 %v = call <4 x double> @llvm.minnum.v4f64(<4 x double> %splat, <4 x double> %a) 516 ret <4 x double> %v 517} 518 519declare <8 x double> @llvm.minnum.v8f64(<8 x double>, <8 x double>) 520 521define <8 x double> @vfmin_v8f64_vv(<8 x double> %a, <8 x double> %b) { 522; CHECK-LABEL: vfmin_v8f64_vv: 523; CHECK: # %bb.0: 524; CHECK-NEXT: vsetivli zero, 8, e64, m4, ta, ma 525; CHECK-NEXT: vfmin.vv v8, v8, v12 526; CHECK-NEXT: ret 527 %v = call <8 x double> @llvm.minnum.v8f64(<8 x double> %a, <8 x double> %b) 528 ret <8 x double> %v 529} 530 531define <8 x double> @vfmin_v8f64_vf(<8 x double> %a, double %b) { 532; CHECK-LABEL: vfmin_v8f64_vf: 533; CHECK: # %bb.0: 534; CHECK-NEXT: vsetivli zero, 8, e64, m4, ta, ma 535; CHECK-NEXT: vfmin.vf v8, v8, fa0 536; CHECK-NEXT: ret 537 %head = insertelement <8 x double> poison, double %b, i32 0 538 %splat = shufflevector <8 x double> %head, <8 x double> poison, <8 x i32> zeroinitializer 539 %v = call <8 x double> @llvm.minnum.v8f64(<8 x double> %a, <8 x double> %splat) 540 ret <8 x double> %v 541} 542 543define <8 x double> @vfmin_v8f64_fv(<8 x double> %a, double %b) { 544; CHECK-LABEL: vfmin_v8f64_fv: 545; CHECK: # %bb.0: 546; CHECK-NEXT: vsetivli zero, 8, e64, m4, ta, ma 547; CHECK-NEXT: vfmin.vf v8, v8, fa0 548; CHECK-NEXT: ret 549 %head = insertelement <8 x double> poison, double %b, i32 0 550 %splat = shufflevector <8 x double> %head, <8 x double> poison, <8 x i32> zeroinitializer 551 %v = call <8 x double> @llvm.minnum.v8f64(<8 x double> %splat, <8 x double> %a) 552 ret <8 x double> %v 553} 554 555declare <16 x double> @llvm.minnum.v16f64(<16 x double>, <16 x double>) 556 557define <16 x double> @vfmin_v16f64_vv(<16 x double> %a, <16 x double> %b) { 558; CHECK-LABEL: vfmin_v16f64_vv: 559; CHECK: # %bb.0: 560; CHECK-NEXT: vsetivli zero, 16, e64, m8, ta, ma 561; CHECK-NEXT: vfmin.vv v8, v8, v16 562; CHECK-NEXT: ret 563 %v = call <16 x double> @llvm.minnum.v16f64(<16 x double> %a, <16 x double> %b) 564 ret <16 x double> %v 565} 566 567define <16 x double> @vfmin_v16f64_vf(<16 x double> %a, double %b) { 568; CHECK-LABEL: vfmin_v16f64_vf: 569; CHECK: # %bb.0: 570; CHECK-NEXT: vsetivli zero, 16, e64, m8, ta, ma 571; CHECK-NEXT: vfmin.vf v8, v8, fa0 572; CHECK-NEXT: ret 573 %head = insertelement <16 x double> poison, double %b, i32 0 574 %splat = shufflevector <16 x double> %head, <16 x double> poison, <16 x i32> zeroinitializer 575 %v = call <16 x double> @llvm.minnum.v16f64(<16 x double> %a, <16 x double> %splat) 576 ret <16 x double> %v 577} 578 579define <16 x double> @vfmin_v16f64_fv(<16 x double> %a, double %b) { 580; CHECK-LABEL: vfmin_v16f64_fv: 581; CHECK: # %bb.0: 582; CHECK-NEXT: vsetivli zero, 16, e64, m8, ta, ma 583; CHECK-NEXT: vfmin.vf v8, v8, fa0 584; CHECK-NEXT: ret 585 %head = insertelement <16 x double> poison, double %b, i32 0 586 %splat = shufflevector <16 x double> %head, <16 x double> poison, <16 x i32> zeroinitializer 587 %v = call <16 x double> @llvm.minnum.v16f64(<16 x double> %splat, <16 x double> %a) 588 ret <16 x double> %v 589} 590