1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+d,+zvfh,+zfbfmin,+zvfbfmin,+v \ 3; RUN: -target-abi=ilp32d -verify-machineinstrs < %s | FileCheck %s \ 4; RUN: --check-prefixes=CHECK,ZVFH 5; RUN: llc -mtriple=riscv64 -mattr=+d,+zvfh,+zfbfmin,+zvfbfmin,+v \ 6; RUN: -target-abi=lp64d -verify-machineinstrs < %s | FileCheck %s \ 7; RUN: --check-prefixes=CHECK,ZVFH 8; RUN: llc -mtriple=riscv32 -mattr=+d,+zfhmin,+zvfhmin,+zfbfmin,+zvfbfmin,+v \ 9; RUN: -target-abi=ilp32d -verify-machineinstrs < %s | FileCheck %s \ 10; RUN: --check-prefixes=CHECK,ZVFHMIN 11; RUN: llc -mtriple=riscv64 -mattr=+d,+zfhmin,+zvfhmin,+zfbfmin,+zvfbfmin,+v \ 12; RUN: -target-abi=lp64d -verify-machineinstrs < %s | FileCheck %s \ 13; RUN: --check-prefixes=CHECK,ZVFHMIN 14 15define <vscale x 1 x bfloat> @vfmax_nxv1bf16_vv(<vscale x 1 x bfloat> %a, <vscale x 1 x bfloat> %b) { 16; CHECK-LABEL: vfmax_nxv1bf16_vv: 17; CHECK: # %bb.0: 18; CHECK-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 19; CHECK-NEXT: vfwcvtbf16.f.f.v v10, v9 20; CHECK-NEXT: vfwcvtbf16.f.f.v v9, v8 21; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 22; CHECK-NEXT: vfmax.vv v9, v9, v10 23; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, ma 24; CHECK-NEXT: vfncvtbf16.f.f.w v8, v9 25; CHECK-NEXT: ret 26 %v = call <vscale x 1 x bfloat> @llvm.maxnum.nxv1bf16(<vscale x 1 x bfloat> %a, <vscale x 1 x bfloat> %b) 27 ret <vscale x 1 x bfloat> %v 28} 29 30define <vscale x 1 x bfloat> @vfmax_nxv1bf16_vf(<vscale x 1 x bfloat> %a, bfloat %b) { 31; CHECK-LABEL: vfmax_nxv1bf16_vf: 32; CHECK: # %bb.0: 33; CHECK-NEXT: fmv.x.h a0, fa0 34; CHECK-NEXT: vsetvli a1, zero, e16, mf4, ta, ma 35; CHECK-NEXT: vmv.v.x v9, a0 36; CHECK-NEXT: vfwcvtbf16.f.f.v v10, v8 37; CHECK-NEXT: vfwcvtbf16.f.f.v v8, v9 38; CHECK-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 39; CHECK-NEXT: vfmax.vv v9, v10, v8 40; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, ma 41; CHECK-NEXT: vfncvtbf16.f.f.w v8, v9 42; CHECK-NEXT: ret 43 %head = insertelement <vscale x 1 x bfloat> poison, bfloat %b, i32 0 44 %splat = shufflevector <vscale x 1 x bfloat> %head, <vscale x 1 x bfloat> poison, <vscale x 1 x i32> zeroinitializer 45 %v = call <vscale x 1 x bfloat> @llvm.maxnum.nxv1bf16(<vscale x 1 x bfloat> %a, <vscale x 1 x bfloat> %splat) 46 ret <vscale x 1 x bfloat> %v 47} 48 49declare <vscale x 2 x bfloat> @llvm.maxnum.nxv2bf16(<vscale x 2 x bfloat>, <vscale x 2 x bfloat>) 50 51define <vscale x 2 x bfloat> @vfmax_nxv2bf16_vv(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b) { 52; CHECK-LABEL: vfmax_nxv2bf16_vv: 53; CHECK: # %bb.0: 54; CHECK-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 55; CHECK-NEXT: vfwcvtbf16.f.f.v v10, v9 56; CHECK-NEXT: vfwcvtbf16.f.f.v v9, v8 57; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma 58; CHECK-NEXT: vfmax.vv v9, v9, v10 59; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, ma 60; CHECK-NEXT: vfncvtbf16.f.f.w v8, v9 61; CHECK-NEXT: ret 62 %v = call <vscale x 2 x bfloat> @llvm.maxnum.nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %b) 63 ret <vscale x 2 x bfloat> %v 64} 65 66define <vscale x 2 x bfloat> @vfmax_nxv2bf16_vf(<vscale x 2 x bfloat> %a, bfloat %b) { 67; CHECK-LABEL: vfmax_nxv2bf16_vf: 68; CHECK: # %bb.0: 69; CHECK-NEXT: fmv.x.h a0, fa0 70; CHECK-NEXT: vsetvli a1, zero, e16, mf2, ta, ma 71; CHECK-NEXT: vmv.v.x v9, a0 72; CHECK-NEXT: vfwcvtbf16.f.f.v v10, v8 73; CHECK-NEXT: vfwcvtbf16.f.f.v v8, v9 74; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma 75; CHECK-NEXT: vfmax.vv v9, v10, v8 76; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, ma 77; CHECK-NEXT: vfncvtbf16.f.f.w v8, v9 78; CHECK-NEXT: ret 79 %head = insertelement <vscale x 2 x bfloat> poison, bfloat %b, i32 0 80 %splat = shufflevector <vscale x 2 x bfloat> %head, <vscale x 2 x bfloat> poison, <vscale x 2 x i32> zeroinitializer 81 %v = call <vscale x 2 x bfloat> @llvm.maxnum.nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x bfloat> %splat) 82 ret <vscale x 2 x bfloat> %v 83} 84 85declare <vscale x 4 x bfloat> @llvm.maxnum.nxv4bf16(<vscale x 4 x bfloat>, <vscale x 4 x bfloat>) 86 87define <vscale x 4 x bfloat> @vfmax_nxv4bf16_vv(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b) { 88; CHECK-LABEL: vfmax_nxv4bf16_vv: 89; CHECK: # %bb.0: 90; CHECK-NEXT: vsetvli a0, zero, e16, m1, ta, ma 91; CHECK-NEXT: vfwcvtbf16.f.f.v v10, v9 92; CHECK-NEXT: vfwcvtbf16.f.f.v v12, v8 93; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma 94; CHECK-NEXT: vfmax.vv v10, v12, v10 95; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, ma 96; CHECK-NEXT: vfncvtbf16.f.f.w v8, v10 97; CHECK-NEXT: ret 98 %v = call <vscale x 4 x bfloat> @llvm.maxnum.nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %b) 99 ret <vscale x 4 x bfloat> %v 100} 101 102define <vscale x 4 x bfloat> @vfmax_nxv4bf16_vf(<vscale x 4 x bfloat> %a, bfloat %b) { 103; CHECK-LABEL: vfmax_nxv4bf16_vf: 104; CHECK: # %bb.0: 105; CHECK-NEXT: fmv.x.h a0, fa0 106; CHECK-NEXT: vsetvli a1, zero, e16, m1, ta, ma 107; CHECK-NEXT: vmv.v.x v9, a0 108; CHECK-NEXT: vfwcvtbf16.f.f.v v10, v8 109; CHECK-NEXT: vfwcvtbf16.f.f.v v12, v9 110; CHECK-NEXT: vsetvli zero, zero, e32, m2, ta, ma 111; CHECK-NEXT: vfmax.vv v10, v10, v12 112; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, ma 113; CHECK-NEXT: vfncvtbf16.f.f.w v8, v10 114; CHECK-NEXT: ret 115 %head = insertelement <vscale x 4 x bfloat> poison, bfloat %b, i32 0 116 %splat = shufflevector <vscale x 4 x bfloat> %head, <vscale x 4 x bfloat> poison, <vscale x 4 x i32> zeroinitializer 117 %v = call <vscale x 4 x bfloat> @llvm.maxnum.nxv4bf16(<vscale x 4 x bfloat> %a, <vscale x 4 x bfloat> %splat) 118 ret <vscale x 4 x bfloat> %v 119} 120 121declare <vscale x 8 x bfloat> @llvm.maxnum.nxv8bf16(<vscale x 8 x bfloat>, <vscale x 8 x bfloat>) 122 123define <vscale x 8 x bfloat> @vfmax_nxv8bf16_vv(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) { 124; CHECK-LABEL: vfmax_nxv8bf16_vv: 125; CHECK: # %bb.0: 126; CHECK-NEXT: vsetvli a0, zero, e16, m2, ta, ma 127; CHECK-NEXT: vfwcvtbf16.f.f.v v12, v10 128; CHECK-NEXT: vfwcvtbf16.f.f.v v16, v8 129; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma 130; CHECK-NEXT: vfmax.vv v12, v16, v12 131; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, ma 132; CHECK-NEXT: vfncvtbf16.f.f.w v8, v12 133; CHECK-NEXT: ret 134 %v = call <vscale x 8 x bfloat> @llvm.maxnum.nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %b) 135 ret <vscale x 8 x bfloat> %v 136} 137 138define <vscale x 8 x bfloat> @vfmax_nxv8bf16_vf(<vscale x 8 x bfloat> %a, bfloat %b) { 139; CHECK-LABEL: vfmax_nxv8bf16_vf: 140; CHECK: # %bb.0: 141; CHECK-NEXT: fmv.x.h a0, fa0 142; CHECK-NEXT: vsetvli a1, zero, e16, m2, ta, ma 143; CHECK-NEXT: vmv.v.x v10, a0 144; CHECK-NEXT: vfwcvtbf16.f.f.v v12, v8 145; CHECK-NEXT: vfwcvtbf16.f.f.v v16, v10 146; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma 147; CHECK-NEXT: vfmax.vv v12, v12, v16 148; CHECK-NEXT: vsetvli zero, zero, e16, m2, ta, ma 149; CHECK-NEXT: vfncvtbf16.f.f.w v8, v12 150; CHECK-NEXT: ret 151 %head = insertelement <vscale x 8 x bfloat> poison, bfloat %b, i32 0 152 %splat = shufflevector <vscale x 8 x bfloat> %head, <vscale x 8 x bfloat> poison, <vscale x 8 x i32> zeroinitializer 153 %v = call <vscale x 8 x bfloat> @llvm.maxnum.nxv8bf16(<vscale x 8 x bfloat> %a, <vscale x 8 x bfloat> %splat) 154 ret <vscale x 8 x bfloat> %v 155} 156 157declare <vscale x 16 x bfloat> @llvm.maxnum.nxv16bf16(<vscale x 16 x bfloat>, <vscale x 16 x bfloat>) 158 159define <vscale x 16 x bfloat> @vfmax_nxv16bf16_vv(<vscale x 16 x bfloat> %a, <vscale x 16 x bfloat> %b) { 160; CHECK-LABEL: vfmax_nxv16bf16_vv: 161; CHECK: # %bb.0: 162; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, ma 163; CHECK-NEXT: vfwcvtbf16.f.f.v v16, v12 164; CHECK-NEXT: vfwcvtbf16.f.f.v v24, v8 165; CHECK-NEXT: vsetvli zero, zero, e32, m8, ta, ma 166; CHECK-NEXT: vfmax.vv v16, v24, v16 167; CHECK-NEXT: vsetvli zero, zero, e16, m4, ta, ma 168; CHECK-NEXT: vfncvtbf16.f.f.w v8, v16 169; CHECK-NEXT: ret 170 %v = call <vscale x 16 x bfloat> @llvm.maxnum.nxv16bf16(<vscale x 16 x bfloat> %a, <vscale x 16 x bfloat> %b) 171 ret <vscale x 16 x bfloat> %v 172} 173 174define <vscale x 16 x bfloat> @vfmax_nxv16bf16_vf(<vscale x 16 x bfloat> %a, bfloat %b) { 175; CHECK-LABEL: vfmax_nxv16bf16_vf: 176; CHECK: # %bb.0: 177; CHECK-NEXT: fmv.x.h a0, fa0 178; CHECK-NEXT: vsetvli a1, zero, e16, m4, ta, ma 179; CHECK-NEXT: vmv.v.x v12, a0 180; CHECK-NEXT: vfwcvtbf16.f.f.v v16, v8 181; CHECK-NEXT: vfwcvtbf16.f.f.v v24, v12 182; CHECK-NEXT: vsetvli zero, zero, e32, m8, ta, ma 183; CHECK-NEXT: vfmax.vv v16, v16, v24 184; CHECK-NEXT: vsetvli zero, zero, e16, m4, ta, ma 185; CHECK-NEXT: vfncvtbf16.f.f.w v8, v16 186; CHECK-NEXT: ret 187 %head = insertelement <vscale x 16 x bfloat> poison, bfloat %b, i32 0 188 %splat = shufflevector <vscale x 16 x bfloat> %head, <vscale x 16 x bfloat> poison, <vscale x 16 x i32> zeroinitializer 189 %v = call <vscale x 16 x bfloat> @llvm.maxnum.nxv16bf16(<vscale x 16 x bfloat> %a, <vscale x 16 x bfloat> %splat) 190 ret <vscale x 16 x bfloat> %v 191} 192 193declare <vscale x 32 x bfloat> @llvm.maxnum.nxv32bf16(<vscale x 32 x bfloat>, <vscale x 32 x bfloat>) 194 195define <vscale x 32 x bfloat> @vfmax_nxv32bf16_vv(<vscale x 32 x bfloat> %a, <vscale x 32 x bfloat> %b) { 196; CHECK-LABEL: vfmax_nxv32bf16_vv: 197; CHECK: # %bb.0: 198; CHECK-NEXT: addi sp, sp, -16 199; CHECK-NEXT: .cfi_def_cfa_offset 16 200; CHECK-NEXT: csrr a0, vlenb 201; CHECK-NEXT: slli a0, a0, 3 202; CHECK-NEXT: sub sp, sp, a0 203; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb 204; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, ma 205; CHECK-NEXT: vfwcvtbf16.f.f.v v24, v16 206; CHECK-NEXT: addi a0, sp, 16 207; CHECK-NEXT: vs8r.v v24, (a0) # Unknown-size Folded Spill 208; CHECK-NEXT: vfwcvtbf16.f.f.v v0, v8 209; CHECK-NEXT: vfwcvtbf16.f.f.v v24, v20 210; CHECK-NEXT: vfwcvtbf16.f.f.v v16, v12 211; CHECK-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload 212; CHECK-NEXT: vsetvli zero, zero, e32, m8, ta, ma 213; CHECK-NEXT: vfmax.vv v0, v0, v8 214; CHECK-NEXT: vsetvli zero, zero, e16, m4, ta, ma 215; CHECK-NEXT: vfncvtbf16.f.f.w v8, v0 216; CHECK-NEXT: vsetvli zero, zero, e32, m8, ta, ma 217; CHECK-NEXT: vfmax.vv v16, v16, v24 218; CHECK-NEXT: vsetvli zero, zero, e16, m4, ta, ma 219; CHECK-NEXT: vfncvtbf16.f.f.w v12, v16 220; CHECK-NEXT: csrr a0, vlenb 221; CHECK-NEXT: slli a0, a0, 3 222; CHECK-NEXT: add sp, sp, a0 223; CHECK-NEXT: .cfi_def_cfa sp, 16 224; CHECK-NEXT: addi sp, sp, 16 225; CHECK-NEXT: .cfi_def_cfa_offset 0 226; CHECK-NEXT: ret 227 %v = call <vscale x 32 x bfloat> @llvm.maxnum.nxv32bf16(<vscale x 32 x bfloat> %a, <vscale x 32 x bfloat> %b) 228 ret <vscale x 32 x bfloat> %v 229} 230 231define <vscale x 32 x bfloat> @vfmax_nxv32bf16_vf(<vscale x 32 x bfloat> %a, bfloat %b) { 232; CHECK-LABEL: vfmax_nxv32bf16_vf: 233; CHECK: # %bb.0: 234; CHECK-NEXT: addi sp, sp, -16 235; CHECK-NEXT: .cfi_def_cfa_offset 16 236; CHECK-NEXT: csrr a0, vlenb 237; CHECK-NEXT: slli a0, a0, 3 238; CHECK-NEXT: sub sp, sp, a0 239; CHECK-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb 240; CHECK-NEXT: fmv.x.h a0, fa0 241; CHECK-NEXT: vsetvli a1, zero, e16, m4, ta, ma 242; CHECK-NEXT: vfwcvtbf16.f.f.v v16, v8 243; CHECK-NEXT: addi a1, sp, 16 244; CHECK-NEXT: vs8r.v v16, (a1) # Unknown-size Folded Spill 245; CHECK-NEXT: vfwcvtbf16.f.f.v v24, v12 246; CHECK-NEXT: vsetvli a1, zero, e16, m8, ta, ma 247; CHECK-NEXT: vmv.v.x v8, a0 248; CHECK-NEXT: vsetvli a0, zero, e16, m4, ta, ma 249; CHECK-NEXT: vfwcvtbf16.f.f.v v0, v8 250; CHECK-NEXT: vfwcvtbf16.f.f.v v16, v12 251; CHECK-NEXT: addi a0, sp, 16 252; CHECK-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload 253; CHECK-NEXT: vsetvli zero, zero, e32, m8, ta, ma 254; CHECK-NEXT: vfmax.vv v0, v8, v0 255; CHECK-NEXT: vsetvli zero, zero, e16, m4, ta, ma 256; CHECK-NEXT: vfncvtbf16.f.f.w v8, v0 257; CHECK-NEXT: vsetvli zero, zero, e32, m8, ta, ma 258; CHECK-NEXT: vfmax.vv v16, v24, v16 259; CHECK-NEXT: vsetvli zero, zero, e16, m4, ta, ma 260; CHECK-NEXT: vfncvtbf16.f.f.w v12, v16 261; CHECK-NEXT: csrr a0, vlenb 262; CHECK-NEXT: slli a0, a0, 3 263; CHECK-NEXT: add sp, sp, a0 264; CHECK-NEXT: .cfi_def_cfa sp, 16 265; CHECK-NEXT: addi sp, sp, 16 266; CHECK-NEXT: .cfi_def_cfa_offset 0 267; CHECK-NEXT: ret 268 %head = insertelement <vscale x 32 x bfloat> poison, bfloat %b, i32 0 269 %splat = shufflevector <vscale x 32 x bfloat> %head, <vscale x 32 x bfloat> poison, <vscale x 32 x i32> zeroinitializer 270 %v = call <vscale x 32 x bfloat> @llvm.maxnum.nxv32bf16(<vscale x 32 x bfloat> %a, <vscale x 32 x bfloat> %splat) 271 ret <vscale x 32 x bfloat> %v 272} 273 274declare <vscale x 1 x half> @llvm.maxnum.nxv1f16(<vscale x 1 x half>, <vscale x 1 x half>) 275 276define <vscale x 1 x half> @vfmax_nxv1f16_vv(<vscale x 1 x half> %a, <vscale x 1 x half> %b) { 277; ZVFH-LABEL: vfmax_nxv1f16_vv: 278; ZVFH: # %bb.0: 279; ZVFH-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 280; ZVFH-NEXT: vfmax.vv v8, v8, v9 281; ZVFH-NEXT: ret 282; 283; ZVFHMIN-LABEL: vfmax_nxv1f16_vv: 284; ZVFHMIN: # %bb.0: 285; ZVFHMIN-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 286; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9 287; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v8 288; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 289; ZVFHMIN-NEXT: vfmax.vv v9, v9, v10 290; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf4, ta, ma 291; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9 292; ZVFHMIN-NEXT: ret 293 %v = call <vscale x 1 x half> @llvm.maxnum.nxv1f16(<vscale x 1 x half> %a, <vscale x 1 x half> %b) 294 ret <vscale x 1 x half> %v 295} 296 297define <vscale x 1 x half> @vfmax_nxv1f16_vf(<vscale x 1 x half> %a, half %b) { 298; ZVFH-LABEL: vfmax_nxv1f16_vf: 299; ZVFH: # %bb.0: 300; ZVFH-NEXT: vsetvli a0, zero, e16, mf4, ta, ma 301; ZVFH-NEXT: vfmax.vf v8, v8, fa0 302; ZVFH-NEXT: ret 303; 304; ZVFHMIN-LABEL: vfmax_nxv1f16_vf: 305; ZVFHMIN: # %bb.0: 306; ZVFHMIN-NEXT: fmv.x.h a0, fa0 307; ZVFHMIN-NEXT: vsetvli a1, zero, e16, mf4, ta, ma 308; ZVFHMIN-NEXT: vmv.v.x v9, a0 309; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8 310; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v9 311; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma 312; ZVFHMIN-NEXT: vfmax.vv v9, v10, v8 313; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf4, ta, ma 314; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9 315; ZVFHMIN-NEXT: ret 316 %head = insertelement <vscale x 1 x half> poison, half %b, i32 0 317 %splat = shufflevector <vscale x 1 x half> %head, <vscale x 1 x half> poison, <vscale x 1 x i32> zeroinitializer 318 %v = call <vscale x 1 x half> @llvm.maxnum.nxv1f16(<vscale x 1 x half> %a, <vscale x 1 x half> %splat) 319 ret <vscale x 1 x half> %v 320} 321 322declare <vscale x 2 x half> @llvm.maxnum.nxv2f16(<vscale x 2 x half>, <vscale x 2 x half>) 323 324define <vscale x 2 x half> @vfmax_nxv2f16_vv(<vscale x 2 x half> %a, <vscale x 2 x half> %b) { 325; ZVFH-LABEL: vfmax_nxv2f16_vv: 326; ZVFH: # %bb.0: 327; ZVFH-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 328; ZVFH-NEXT: vfmax.vv v8, v8, v9 329; ZVFH-NEXT: ret 330; 331; ZVFHMIN-LABEL: vfmax_nxv2f16_vv: 332; ZVFHMIN: # %bb.0: 333; ZVFHMIN-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 334; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9 335; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v8 336; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma 337; ZVFHMIN-NEXT: vfmax.vv v9, v9, v10 338; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf2, ta, ma 339; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9 340; ZVFHMIN-NEXT: ret 341 %v = call <vscale x 2 x half> @llvm.maxnum.nxv2f16(<vscale x 2 x half> %a, <vscale x 2 x half> %b) 342 ret <vscale x 2 x half> %v 343} 344 345define <vscale x 2 x half> @vfmax_nxv2f16_vf(<vscale x 2 x half> %a, half %b) { 346; ZVFH-LABEL: vfmax_nxv2f16_vf: 347; ZVFH: # %bb.0: 348; ZVFH-NEXT: vsetvli a0, zero, e16, mf2, ta, ma 349; ZVFH-NEXT: vfmax.vf v8, v8, fa0 350; ZVFH-NEXT: ret 351; 352; ZVFHMIN-LABEL: vfmax_nxv2f16_vf: 353; ZVFHMIN: # %bb.0: 354; ZVFHMIN-NEXT: fmv.x.h a0, fa0 355; ZVFHMIN-NEXT: vsetvli a1, zero, e16, mf2, ta, ma 356; ZVFHMIN-NEXT: vmv.v.x v9, a0 357; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8 358; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v9 359; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m1, ta, ma 360; ZVFHMIN-NEXT: vfmax.vv v9, v10, v8 361; ZVFHMIN-NEXT: vsetvli zero, zero, e16, mf2, ta, ma 362; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v9 363; ZVFHMIN-NEXT: ret 364 %head = insertelement <vscale x 2 x half> poison, half %b, i32 0 365 %splat = shufflevector <vscale x 2 x half> %head, <vscale x 2 x half> poison, <vscale x 2 x i32> zeroinitializer 366 %v = call <vscale x 2 x half> @llvm.maxnum.nxv2f16(<vscale x 2 x half> %a, <vscale x 2 x half> %splat) 367 ret <vscale x 2 x half> %v 368} 369 370declare <vscale x 4 x half> @llvm.maxnum.nxv4f16(<vscale x 4 x half>, <vscale x 4 x half>) 371 372define <vscale x 4 x half> @vfmax_nxv4f16_vv(<vscale x 4 x half> %a, <vscale x 4 x half> %b) { 373; ZVFH-LABEL: vfmax_nxv4f16_vv: 374; ZVFH: # %bb.0: 375; ZVFH-NEXT: vsetvli a0, zero, e16, m1, ta, ma 376; ZVFH-NEXT: vfmax.vv v8, v8, v9 377; ZVFH-NEXT: ret 378; 379; ZVFHMIN-LABEL: vfmax_nxv4f16_vv: 380; ZVFHMIN: # %bb.0: 381; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m1, ta, ma 382; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v9 383; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v8 384; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma 385; ZVFHMIN-NEXT: vfmax.vv v10, v12, v10 386; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m1, ta, ma 387; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v10 388; ZVFHMIN-NEXT: ret 389 %v = call <vscale x 4 x half> @llvm.maxnum.nxv4f16(<vscale x 4 x half> %a, <vscale x 4 x half> %b) 390 ret <vscale x 4 x half> %v 391} 392 393define <vscale x 4 x half> @vfmax_nxv4f16_vf(<vscale x 4 x half> %a, half %b) { 394; ZVFH-LABEL: vfmax_nxv4f16_vf: 395; ZVFH: # %bb.0: 396; ZVFH-NEXT: vsetvli a0, zero, e16, m1, ta, ma 397; ZVFH-NEXT: vfmax.vf v8, v8, fa0 398; ZVFH-NEXT: ret 399; 400; ZVFHMIN-LABEL: vfmax_nxv4f16_vf: 401; ZVFHMIN: # %bb.0: 402; ZVFHMIN-NEXT: fmv.x.h a0, fa0 403; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m1, ta, ma 404; ZVFHMIN-NEXT: vmv.v.x v9, a0 405; ZVFHMIN-NEXT: vfwcvt.f.f.v v10, v8 406; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v9 407; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m2, ta, ma 408; ZVFHMIN-NEXT: vfmax.vv v10, v10, v12 409; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m1, ta, ma 410; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v10 411; ZVFHMIN-NEXT: ret 412 %head = insertelement <vscale x 4 x half> poison, half %b, i32 0 413 %splat = shufflevector <vscale x 4 x half> %head, <vscale x 4 x half> poison, <vscale x 4 x i32> zeroinitializer 414 %v = call <vscale x 4 x half> @llvm.maxnum.nxv4f16(<vscale x 4 x half> %a, <vscale x 4 x half> %splat) 415 ret <vscale x 4 x half> %v 416} 417 418declare <vscale x 8 x half> @llvm.maxnum.nxv8f16(<vscale x 8 x half>, <vscale x 8 x half>) 419 420define <vscale x 8 x half> @vfmax_nxv8f16_vv(<vscale x 8 x half> %a, <vscale x 8 x half> %b) { 421; ZVFH-LABEL: vfmax_nxv8f16_vv: 422; ZVFH: # %bb.0: 423; ZVFH-NEXT: vsetvli a0, zero, e16, m2, ta, ma 424; ZVFH-NEXT: vfmax.vv v8, v8, v10 425; ZVFH-NEXT: ret 426; 427; ZVFHMIN-LABEL: vfmax_nxv8f16_vv: 428; ZVFHMIN: # %bb.0: 429; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m2, ta, ma 430; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v10 431; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v8 432; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma 433; ZVFHMIN-NEXT: vfmax.vv v12, v16, v12 434; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m2, ta, ma 435; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12 436; ZVFHMIN-NEXT: ret 437 %v = call <vscale x 8 x half> @llvm.maxnum.nxv8f16(<vscale x 8 x half> %a, <vscale x 8 x half> %b) 438 ret <vscale x 8 x half> %v 439} 440 441define <vscale x 8 x half> @vfmax_nxv8f16_vf(<vscale x 8 x half> %a, half %b) { 442; ZVFH-LABEL: vfmax_nxv8f16_vf: 443; ZVFH: # %bb.0: 444; ZVFH-NEXT: vsetvli a0, zero, e16, m2, ta, ma 445; ZVFH-NEXT: vfmax.vf v8, v8, fa0 446; ZVFH-NEXT: ret 447; 448; ZVFHMIN-LABEL: vfmax_nxv8f16_vf: 449; ZVFHMIN: # %bb.0: 450; ZVFHMIN-NEXT: fmv.x.h a0, fa0 451; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m2, ta, ma 452; ZVFHMIN-NEXT: vmv.v.x v10, a0 453; ZVFHMIN-NEXT: vfwcvt.f.f.v v12, v8 454; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v10 455; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m4, ta, ma 456; ZVFHMIN-NEXT: vfmax.vv v12, v12, v16 457; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m2, ta, ma 458; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v12 459; ZVFHMIN-NEXT: ret 460 %head = insertelement <vscale x 8 x half> poison, half %b, i32 0 461 %splat = shufflevector <vscale x 8 x half> %head, <vscale x 8 x half> poison, <vscale x 8 x i32> zeroinitializer 462 %v = call <vscale x 8 x half> @llvm.maxnum.nxv8f16(<vscale x 8 x half> %a, <vscale x 8 x half> %splat) 463 ret <vscale x 8 x half> %v 464} 465 466declare <vscale x 16 x half> @llvm.maxnum.nxv16f16(<vscale x 16 x half>, <vscale x 16 x half>) 467 468define <vscale x 16 x half> @vfmax_nxv16f16_vv(<vscale x 16 x half> %a, <vscale x 16 x half> %b) { 469; ZVFH-LABEL: vfmax_nxv16f16_vv: 470; ZVFH: # %bb.0: 471; ZVFH-NEXT: vsetvli a0, zero, e16, m4, ta, ma 472; ZVFH-NEXT: vfmax.vv v8, v8, v12 473; ZVFH-NEXT: ret 474; 475; ZVFHMIN-LABEL: vfmax_nxv16f16_vv: 476; ZVFHMIN: # %bb.0: 477; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m4, ta, ma 478; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v12 479; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v8 480; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 481; ZVFHMIN-NEXT: vfmax.vv v16, v24, v16 482; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma 483; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v16 484; ZVFHMIN-NEXT: ret 485 %v = call <vscale x 16 x half> @llvm.maxnum.nxv16f16(<vscale x 16 x half> %a, <vscale x 16 x half> %b) 486 ret <vscale x 16 x half> %v 487} 488 489define <vscale x 16 x half> @vfmax_nxv16f16_vf(<vscale x 16 x half> %a, half %b) { 490; ZVFH-LABEL: vfmax_nxv16f16_vf: 491; ZVFH: # %bb.0: 492; ZVFH-NEXT: vsetvli a0, zero, e16, m4, ta, ma 493; ZVFH-NEXT: vfmax.vf v8, v8, fa0 494; ZVFH-NEXT: ret 495; 496; ZVFHMIN-LABEL: vfmax_nxv16f16_vf: 497; ZVFHMIN: # %bb.0: 498; ZVFHMIN-NEXT: fmv.x.h a0, fa0 499; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m4, ta, ma 500; ZVFHMIN-NEXT: vmv.v.x v12, a0 501; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v8 502; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v12 503; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 504; ZVFHMIN-NEXT: vfmax.vv v16, v16, v24 505; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma 506; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v16 507; ZVFHMIN-NEXT: ret 508 %head = insertelement <vscale x 16 x half> poison, half %b, i32 0 509 %splat = shufflevector <vscale x 16 x half> %head, <vscale x 16 x half> poison, <vscale x 16 x i32> zeroinitializer 510 %v = call <vscale x 16 x half> @llvm.maxnum.nxv16f16(<vscale x 16 x half> %a, <vscale x 16 x half> %splat) 511 ret <vscale x 16 x half> %v 512} 513 514declare <vscale x 32 x half> @llvm.maxnum.nxv32f16(<vscale x 32 x half>, <vscale x 32 x half>) 515 516define <vscale x 32 x half> @vfmax_nxv32f16_vv(<vscale x 32 x half> %a, <vscale x 32 x half> %b) { 517; ZVFH-LABEL: vfmax_nxv32f16_vv: 518; ZVFH: # %bb.0: 519; ZVFH-NEXT: vsetvli a0, zero, e16, m8, ta, ma 520; ZVFH-NEXT: vfmax.vv v8, v8, v16 521; ZVFH-NEXT: ret 522; 523; ZVFHMIN-LABEL: vfmax_nxv32f16_vv: 524; ZVFHMIN: # %bb.0: 525; ZVFHMIN-NEXT: addi sp, sp, -16 526; ZVFHMIN-NEXT: .cfi_def_cfa_offset 16 527; ZVFHMIN-NEXT: csrr a0, vlenb 528; ZVFHMIN-NEXT: slli a0, a0, 3 529; ZVFHMIN-NEXT: sub sp, sp, a0 530; ZVFHMIN-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb 531; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m4, ta, ma 532; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v16 533; ZVFHMIN-NEXT: addi a0, sp, 16 534; ZVFHMIN-NEXT: vs8r.v v24, (a0) # Unknown-size Folded Spill 535; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v8 536; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v20 537; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v12 538; ZVFHMIN-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload 539; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 540; ZVFHMIN-NEXT: vfmax.vv v0, v0, v8 541; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma 542; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v0 543; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 544; ZVFHMIN-NEXT: vfmax.vv v16, v16, v24 545; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma 546; ZVFHMIN-NEXT: vfncvt.f.f.w v12, v16 547; ZVFHMIN-NEXT: csrr a0, vlenb 548; ZVFHMIN-NEXT: slli a0, a0, 3 549; ZVFHMIN-NEXT: add sp, sp, a0 550; ZVFHMIN-NEXT: .cfi_def_cfa sp, 16 551; ZVFHMIN-NEXT: addi sp, sp, 16 552; ZVFHMIN-NEXT: .cfi_def_cfa_offset 0 553; ZVFHMIN-NEXT: ret 554 %v = call <vscale x 32 x half> @llvm.maxnum.nxv32f16(<vscale x 32 x half> %a, <vscale x 32 x half> %b) 555 ret <vscale x 32 x half> %v 556} 557 558define <vscale x 32 x half> @vfmax_nxv32f16_vf(<vscale x 32 x half> %a, half %b) { 559; ZVFH-LABEL: vfmax_nxv32f16_vf: 560; ZVFH: # %bb.0: 561; ZVFH-NEXT: vsetvli a0, zero, e16, m8, ta, ma 562; ZVFH-NEXT: vfmax.vf v8, v8, fa0 563; ZVFH-NEXT: ret 564; 565; ZVFHMIN-LABEL: vfmax_nxv32f16_vf: 566; ZVFHMIN: # %bb.0: 567; ZVFHMIN-NEXT: addi sp, sp, -16 568; ZVFHMIN-NEXT: .cfi_def_cfa_offset 16 569; ZVFHMIN-NEXT: csrr a0, vlenb 570; ZVFHMIN-NEXT: slli a0, a0, 3 571; ZVFHMIN-NEXT: sub sp, sp, a0 572; ZVFHMIN-NEXT: .cfi_escape 0x0f, 0x0d, 0x72, 0x00, 0x11, 0x10, 0x22, 0x11, 0x08, 0x92, 0xa2, 0x38, 0x00, 0x1e, 0x22 # sp + 16 + 8 * vlenb 573; ZVFHMIN-NEXT: fmv.x.h a0, fa0 574; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m4, ta, ma 575; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v8 576; ZVFHMIN-NEXT: addi a1, sp, 16 577; ZVFHMIN-NEXT: vs8r.v v16, (a1) # Unknown-size Folded Spill 578; ZVFHMIN-NEXT: vfwcvt.f.f.v v24, v12 579; ZVFHMIN-NEXT: vsetvli a1, zero, e16, m8, ta, ma 580; ZVFHMIN-NEXT: vmv.v.x v8, a0 581; ZVFHMIN-NEXT: vsetvli a0, zero, e16, m4, ta, ma 582; ZVFHMIN-NEXT: vfwcvt.f.f.v v0, v8 583; ZVFHMIN-NEXT: vfwcvt.f.f.v v16, v12 584; ZVFHMIN-NEXT: addi a0, sp, 16 585; ZVFHMIN-NEXT: vl8r.v v8, (a0) # Unknown-size Folded Reload 586; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 587; ZVFHMIN-NEXT: vfmax.vv v0, v8, v0 588; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma 589; ZVFHMIN-NEXT: vfncvt.f.f.w v8, v0 590; ZVFHMIN-NEXT: vsetvli zero, zero, e32, m8, ta, ma 591; ZVFHMIN-NEXT: vfmax.vv v16, v24, v16 592; ZVFHMIN-NEXT: vsetvli zero, zero, e16, m4, ta, ma 593; ZVFHMIN-NEXT: vfncvt.f.f.w v12, v16 594; ZVFHMIN-NEXT: csrr a0, vlenb 595; ZVFHMIN-NEXT: slli a0, a0, 3 596; ZVFHMIN-NEXT: add sp, sp, a0 597; ZVFHMIN-NEXT: .cfi_def_cfa sp, 16 598; ZVFHMIN-NEXT: addi sp, sp, 16 599; ZVFHMIN-NEXT: .cfi_def_cfa_offset 0 600; ZVFHMIN-NEXT: ret 601 %head = insertelement <vscale x 32 x half> poison, half %b, i32 0 602 %splat = shufflevector <vscale x 32 x half> %head, <vscale x 32 x half> poison, <vscale x 32 x i32> zeroinitializer 603 %v = call <vscale x 32 x half> @llvm.maxnum.nxv32f16(<vscale x 32 x half> %a, <vscale x 32 x half> %splat) 604 ret <vscale x 32 x half> %v 605} 606 607declare <vscale x 1 x float> @llvm.maxnum.nxv1f32(<vscale x 1 x float>, <vscale x 1 x float>) 608 609define <vscale x 1 x float> @vfmax_nxv1f32_vv(<vscale x 1 x float> %a, <vscale x 1 x float> %b) { 610; CHECK-LABEL: vfmax_nxv1f32_vv: 611; CHECK: # %bb.0: 612; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma 613; CHECK-NEXT: vfmax.vv v8, v8, v9 614; CHECK-NEXT: ret 615 %v = call <vscale x 1 x float> @llvm.maxnum.nxv1f32(<vscale x 1 x float> %a, <vscale x 1 x float> %b) 616 ret <vscale x 1 x float> %v 617} 618 619define <vscale x 1 x float> @vfmax_nxv1f32_vf(<vscale x 1 x float> %a, float %b) { 620; CHECK-LABEL: vfmax_nxv1f32_vf: 621; CHECK: # %bb.0: 622; CHECK-NEXT: vsetvli a0, zero, e32, mf2, ta, ma 623; CHECK-NEXT: vfmax.vf v8, v8, fa0 624; CHECK-NEXT: ret 625 %head = insertelement <vscale x 1 x float> poison, float %b, i32 0 626 %splat = shufflevector <vscale x 1 x float> %head, <vscale x 1 x float> poison, <vscale x 1 x i32> zeroinitializer 627 %v = call <vscale x 1 x float> @llvm.maxnum.nxv1f32(<vscale x 1 x float> %a, <vscale x 1 x float> %splat) 628 ret <vscale x 1 x float> %v 629} 630 631declare <vscale x 2 x float> @llvm.maxnum.nxv2f32(<vscale x 2 x float>, <vscale x 2 x float>) 632 633define <vscale x 2 x float> @vfmax_nxv2f32_vv(<vscale x 2 x float> %a, <vscale x 2 x float> %b) { 634; CHECK-LABEL: vfmax_nxv2f32_vv: 635; CHECK: # %bb.0: 636; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma 637; CHECK-NEXT: vfmax.vv v8, v8, v9 638; CHECK-NEXT: ret 639 %v = call <vscale x 2 x float> @llvm.maxnum.nxv2f32(<vscale x 2 x float> %a, <vscale x 2 x float> %b) 640 ret <vscale x 2 x float> %v 641} 642 643define <vscale x 2 x float> @vfmax_nxv2f32_vf(<vscale x 2 x float> %a, float %b) { 644; CHECK-LABEL: vfmax_nxv2f32_vf: 645; CHECK: # %bb.0: 646; CHECK-NEXT: vsetvli a0, zero, e32, m1, ta, ma 647; CHECK-NEXT: vfmax.vf v8, v8, fa0 648; CHECK-NEXT: ret 649 %head = insertelement <vscale x 2 x float> poison, float %b, i32 0 650 %splat = shufflevector <vscale x 2 x float> %head, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer 651 %v = call <vscale x 2 x float> @llvm.maxnum.nxv2f32(<vscale x 2 x float> %a, <vscale x 2 x float> %splat) 652 ret <vscale x 2 x float> %v 653} 654 655declare <vscale x 4 x float> @llvm.maxnum.nxv4f32(<vscale x 4 x float>, <vscale x 4 x float>) 656 657define <vscale x 4 x float> @vfmax_nxv4f32_vv(<vscale x 4 x float> %a, <vscale x 4 x float> %b) { 658; CHECK-LABEL: vfmax_nxv4f32_vv: 659; CHECK: # %bb.0: 660; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma 661; CHECK-NEXT: vfmax.vv v8, v8, v10 662; CHECK-NEXT: ret 663 %v = call <vscale x 4 x float> @llvm.maxnum.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x float> %b) 664 ret <vscale x 4 x float> %v 665} 666 667define <vscale x 4 x float> @vfmax_nxv4f32_vf(<vscale x 4 x float> %a, float %b) { 668; CHECK-LABEL: vfmax_nxv4f32_vf: 669; CHECK: # %bb.0: 670; CHECK-NEXT: vsetvli a0, zero, e32, m2, ta, ma 671; CHECK-NEXT: vfmax.vf v8, v8, fa0 672; CHECK-NEXT: ret 673 %head = insertelement <vscale x 4 x float> poison, float %b, i32 0 674 %splat = shufflevector <vscale x 4 x float> %head, <vscale x 4 x float> poison, <vscale x 4 x i32> zeroinitializer 675 %v = call <vscale x 4 x float> @llvm.maxnum.nxv4f32(<vscale x 4 x float> %a, <vscale x 4 x float> %splat) 676 ret <vscale x 4 x float> %v 677} 678 679declare <vscale x 8 x float> @llvm.maxnum.nxv8f32(<vscale x 8 x float>, <vscale x 8 x float>) 680 681define <vscale x 8 x float> @vfmax_nxv8f32_vv(<vscale x 8 x float> %a, <vscale x 8 x float> %b) { 682; CHECK-LABEL: vfmax_nxv8f32_vv: 683; CHECK: # %bb.0: 684; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma 685; CHECK-NEXT: vfmax.vv v8, v8, v12 686; CHECK-NEXT: ret 687 %v = call <vscale x 8 x float> @llvm.maxnum.nxv8f32(<vscale x 8 x float> %a, <vscale x 8 x float> %b) 688 ret <vscale x 8 x float> %v 689} 690 691define <vscale x 8 x float> @vfmax_nxv8f32_vf(<vscale x 8 x float> %a, float %b) { 692; CHECK-LABEL: vfmax_nxv8f32_vf: 693; CHECK: # %bb.0: 694; CHECK-NEXT: vsetvli a0, zero, e32, m4, ta, ma 695; CHECK-NEXT: vfmax.vf v8, v8, fa0 696; CHECK-NEXT: ret 697 %head = insertelement <vscale x 8 x float> poison, float %b, i32 0 698 %splat = shufflevector <vscale x 8 x float> %head, <vscale x 8 x float> poison, <vscale x 8 x i32> zeroinitializer 699 %v = call <vscale x 8 x float> @llvm.maxnum.nxv8f32(<vscale x 8 x float> %a, <vscale x 8 x float> %splat) 700 ret <vscale x 8 x float> %v 701} 702 703declare <vscale x 16 x float> @llvm.maxnum.nxv16f32(<vscale x 16 x float>, <vscale x 16 x float>) 704 705define <vscale x 16 x float> @vfmax_nxv16f32_vv(<vscale x 16 x float> %a, <vscale x 16 x float> %b) { 706; CHECK-LABEL: vfmax_nxv16f32_vv: 707; CHECK: # %bb.0: 708; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma 709; CHECK-NEXT: vfmax.vv v8, v8, v16 710; CHECK-NEXT: ret 711 %v = call <vscale x 16 x float> @llvm.maxnum.nxv16f32(<vscale x 16 x float> %a, <vscale x 16 x float> %b) 712 ret <vscale x 16 x float> %v 713} 714 715define <vscale x 16 x float> @vfmax_nxv16f32_vf(<vscale x 16 x float> %a, float %b) { 716; CHECK-LABEL: vfmax_nxv16f32_vf: 717; CHECK: # %bb.0: 718; CHECK-NEXT: vsetvli a0, zero, e32, m8, ta, ma 719; CHECK-NEXT: vfmax.vf v8, v8, fa0 720; CHECK-NEXT: ret 721 %head = insertelement <vscale x 16 x float> poison, float %b, i32 0 722 %splat = shufflevector <vscale x 16 x float> %head, <vscale x 16 x float> poison, <vscale x 16 x i32> zeroinitializer 723 %v = call <vscale x 16 x float> @llvm.maxnum.nxv16f32(<vscale x 16 x float> %a, <vscale x 16 x float> %splat) 724 ret <vscale x 16 x float> %v 725} 726 727declare <vscale x 1 x double> @llvm.maxnum.nxv1f64(<vscale x 1 x double>, <vscale x 1 x double>) 728 729define <vscale x 1 x double> @vfmax_nxv1f64_vv(<vscale x 1 x double> %a, <vscale x 1 x double> %b) { 730; CHECK-LABEL: vfmax_nxv1f64_vv: 731; CHECK: # %bb.0: 732; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma 733; CHECK-NEXT: vfmax.vv v8, v8, v9 734; CHECK-NEXT: ret 735 %v = call <vscale x 1 x double> @llvm.maxnum.nxv1f64(<vscale x 1 x double> %a, <vscale x 1 x double> %b) 736 ret <vscale x 1 x double> %v 737} 738 739define <vscale x 1 x double> @vfmax_nxv1f64_vf(<vscale x 1 x double> %a, double %b) { 740; CHECK-LABEL: vfmax_nxv1f64_vf: 741; CHECK: # %bb.0: 742; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma 743; CHECK-NEXT: vfmax.vf v8, v8, fa0 744; CHECK-NEXT: ret 745 %head = insertelement <vscale x 1 x double> poison, double %b, i32 0 746 %splat = shufflevector <vscale x 1 x double> %head, <vscale x 1 x double> poison, <vscale x 1 x i32> zeroinitializer 747 %v = call <vscale x 1 x double> @llvm.maxnum.nxv1f64(<vscale x 1 x double> %a, <vscale x 1 x double> %splat) 748 ret <vscale x 1 x double> %v 749} 750 751declare <vscale x 2 x double> @llvm.maxnum.nxv2f64(<vscale x 2 x double>, <vscale x 2 x double>) 752 753define <vscale x 2 x double> @vfmax_nxv2f64_vv(<vscale x 2 x double> %a, <vscale x 2 x double> %b) { 754; CHECK-LABEL: vfmax_nxv2f64_vv: 755; CHECK: # %bb.0: 756; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma 757; CHECK-NEXT: vfmax.vv v8, v8, v10 758; CHECK-NEXT: ret 759 %v = call <vscale x 2 x double> @llvm.maxnum.nxv2f64(<vscale x 2 x double> %a, <vscale x 2 x double> %b) 760 ret <vscale x 2 x double> %v 761} 762 763define <vscale x 2 x double> @vfmax_nxv2f64_vf(<vscale x 2 x double> %a, double %b) { 764; CHECK-LABEL: vfmax_nxv2f64_vf: 765; CHECK: # %bb.0: 766; CHECK-NEXT: vsetvli a0, zero, e64, m2, ta, ma 767; CHECK-NEXT: vfmax.vf v8, v8, fa0 768; CHECK-NEXT: ret 769 %head = insertelement <vscale x 2 x double> poison, double %b, i32 0 770 %splat = shufflevector <vscale x 2 x double> %head, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer 771 %v = call <vscale x 2 x double> @llvm.maxnum.nxv2f64(<vscale x 2 x double> %a, <vscale x 2 x double> %splat) 772 ret <vscale x 2 x double> %v 773} 774 775declare <vscale x 4 x double> @llvm.maxnum.nxv4f64(<vscale x 4 x double>, <vscale x 4 x double>) 776 777define <vscale x 4 x double> @vfmax_nxv4f64_vv(<vscale x 4 x double> %a, <vscale x 4 x double> %b) { 778; CHECK-LABEL: vfmax_nxv4f64_vv: 779; CHECK: # %bb.0: 780; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma 781; CHECK-NEXT: vfmax.vv v8, v8, v12 782; CHECK-NEXT: ret 783 %v = call <vscale x 4 x double> @llvm.maxnum.nxv4f64(<vscale x 4 x double> %a, <vscale x 4 x double> %b) 784 ret <vscale x 4 x double> %v 785} 786 787define <vscale x 4 x double> @vfmax_nxv4f64_vf(<vscale x 4 x double> %a, double %b) { 788; CHECK-LABEL: vfmax_nxv4f64_vf: 789; CHECK: # %bb.0: 790; CHECK-NEXT: vsetvli a0, zero, e64, m4, ta, ma 791; CHECK-NEXT: vfmax.vf v8, v8, fa0 792; CHECK-NEXT: ret 793 %head = insertelement <vscale x 4 x double> poison, double %b, i32 0 794 %splat = shufflevector <vscale x 4 x double> %head, <vscale x 4 x double> poison, <vscale x 4 x i32> zeroinitializer 795 %v = call <vscale x 4 x double> @llvm.maxnum.nxv4f64(<vscale x 4 x double> %a, <vscale x 4 x double> %splat) 796 ret <vscale x 4 x double> %v 797} 798 799declare <vscale x 8 x double> @llvm.maxnum.nxv8f64(<vscale x 8 x double>, <vscale x 8 x double>) 800 801define <vscale x 8 x double> @vfmax_nxv8f64_vv(<vscale x 8 x double> %a, <vscale x 8 x double> %b) { 802; CHECK-LABEL: vfmax_nxv8f64_vv: 803; CHECK: # %bb.0: 804; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma 805; CHECK-NEXT: vfmax.vv v8, v8, v16 806; CHECK-NEXT: ret 807 %v = call <vscale x 8 x double> @llvm.maxnum.nxv8f64(<vscale x 8 x double> %a, <vscale x 8 x double> %b) 808 ret <vscale x 8 x double> %v 809} 810 811define <vscale x 8 x double> @vfmax_nxv8f64_vf(<vscale x 8 x double> %a, double %b) { 812; CHECK-LABEL: vfmax_nxv8f64_vf: 813; CHECK: # %bb.0: 814; CHECK-NEXT: vsetvli a0, zero, e64, m8, ta, ma 815; CHECK-NEXT: vfmax.vf v8, v8, fa0 816; CHECK-NEXT: ret 817 %head = insertelement <vscale x 8 x double> poison, double %b, i32 0 818 %splat = shufflevector <vscale x 8 x double> %head, <vscale x 8 x double> poison, <vscale x 8 x i32> zeroinitializer 819 %v = call <vscale x 8 x double> @llvm.maxnum.nxv8f64(<vscale x 8 x double> %a, <vscale x 8 x double> %splat) 820 ret <vscale x 8 x double> %v 821} 822