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