1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -mattr=+d,+zvfh,+v,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s 3; RUN: llc -mtriple=riscv64 -mattr=+d,+zvfh,+v,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s 4; RUN: llc -mtriple=riscv32 -mattr=+d,+zvfhmin,+v,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s 5; RUN: llc -mtriple=riscv64 -mattr=+d,+zvfhmin,+v,+zvfbfmin -verify-machineinstrs < %s | FileCheck %s 6 7declare <vscale x 2 x float> @llvm.vp.fpext.nxv2f32.nxv2f16(<vscale x 2 x half>, <vscale x 2 x i1>, i32) 8 9define <vscale x 2 x float> @vfpext_nxv2f16_nxv2f32(<vscale x 2 x half> %a, <vscale x 2 x i1> %m, i32 zeroext %vl) { 10; CHECK-LABEL: vfpext_nxv2f16_nxv2f32: 11; CHECK: # %bb.0: 12; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 13; CHECK-NEXT: vfwcvt.f.f.v v9, v8, v0.t 14; CHECK-NEXT: vmv1r.v v8, v9 15; CHECK-NEXT: ret 16 %v = call <vscale x 2 x float> @llvm.vp.fpext.nxv2f32.nxv2f16(<vscale x 2 x half> %a, <vscale x 2 x i1> %m, i32 %vl) 17 ret <vscale x 2 x float> %v 18} 19 20define <vscale x 2 x float> @vfpext_nxv2f16_nxv2f32_unmasked(<vscale x 2 x half> %a, i32 zeroext %vl) { 21; CHECK-LABEL: vfpext_nxv2f16_nxv2f32_unmasked: 22; CHECK: # %bb.0: 23; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 24; CHECK-NEXT: vfwcvt.f.f.v v9, v8 25; CHECK-NEXT: vmv1r.v v8, v9 26; CHECK-NEXT: ret 27 %v = call <vscale x 2 x float> @llvm.vp.fpext.nxv2f32.nxv2f16(<vscale x 2 x half> %a, <vscale x 2 x i1> splat (i1 true), i32 %vl) 28 ret <vscale x 2 x float> %v 29} 30 31declare <vscale x 2 x double> @llvm.vp.fpext.nxv2f64.nxv2f16(<vscale x 2 x half>, <vscale x 2 x i1>, i32) 32 33define <vscale x 2 x double> @vfpext_nxv2f16_nxv2f64(<vscale x 2 x half> %a, <vscale x 2 x i1> %m, i32 zeroext %vl) { 34; CHECK-LABEL: vfpext_nxv2f16_nxv2f64: 35; CHECK: # %bb.0: 36; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 37; CHECK-NEXT: vfwcvt.f.f.v v10, v8, v0.t 38; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma 39; CHECK-NEXT: vfwcvt.f.f.v v8, v10, v0.t 40; CHECK-NEXT: ret 41 %v = call <vscale x 2 x double> @llvm.vp.fpext.nxv2f64.nxv2f16(<vscale x 2 x half> %a, <vscale x 2 x i1> %m, i32 %vl) 42 ret <vscale x 2 x double> %v 43} 44 45define <vscale x 2 x double> @vfpext_nxv2f16_nxv2f64_unmasked(<vscale x 2 x half> %a, i32 zeroext %vl) { 46; CHECK-LABEL: vfpext_nxv2f16_nxv2f64_unmasked: 47; CHECK: # %bb.0: 48; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 49; CHECK-NEXT: vfwcvt.f.f.v v10, v8 50; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma 51; CHECK-NEXT: vfwcvt.f.f.v v8, v10 52; CHECK-NEXT: ret 53 %v = call <vscale x 2 x double> @llvm.vp.fpext.nxv2f64.nxv2f16(<vscale x 2 x half> %a, <vscale x 2 x i1> splat (i1 true), i32 %vl) 54 ret <vscale x 2 x double> %v 55} 56 57declare <vscale x 2 x double> @llvm.vp.fpext.nxv2f64.nxv2f32(<vscale x 2 x float>, <vscale x 2 x i1>, i32) 58 59define <vscale x 2 x double> @vfpext_nxv2f32_nxv2f64(<vscale x 2 x float> %a, <vscale x 2 x i1> %m, i32 zeroext %vl) { 60; CHECK-LABEL: vfpext_nxv2f32_nxv2f64: 61; CHECK: # %bb.0: 62; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma 63; CHECK-NEXT: vfwcvt.f.f.v v10, v8, v0.t 64; CHECK-NEXT: vmv2r.v v8, v10 65; CHECK-NEXT: ret 66 %v = call <vscale x 2 x double> @llvm.vp.fpext.nxv2f64.nxv2f32(<vscale x 2 x float> %a, <vscale x 2 x i1> %m, i32 %vl) 67 ret <vscale x 2 x double> %v 68} 69 70define <vscale x 2 x double> @vfpext_nxv2f32_nxv2f64_unmasked(<vscale x 2 x float> %a, i32 zeroext %vl) { 71; CHECK-LABEL: vfpext_nxv2f32_nxv2f64_unmasked: 72; CHECK: # %bb.0: 73; CHECK-NEXT: vsetvli zero, a0, e32, m1, ta, ma 74; CHECK-NEXT: vfwcvt.f.f.v v10, v8 75; CHECK-NEXT: vmv2r.v v8, v10 76; CHECK-NEXT: ret 77 %v = call <vscale x 2 x double> @llvm.vp.fpext.nxv2f64.nxv2f32(<vscale x 2 x float> %a, <vscale x 2 x i1> splat (i1 true), i32 %vl) 78 ret <vscale x 2 x double> %v 79} 80 81declare <vscale x 7 x double> @llvm.vp.fpext.nxv7f64.nxv7f32(<vscale x 7 x float>, <vscale x 7 x i1>, i32) 82 83define <vscale x 7 x double> @vfpext_nxv7f32_nxv7f64(<vscale x 7 x float> %a, <vscale x 7 x i1> %m, i32 zeroext %vl) { 84; CHECK-LABEL: vfpext_nxv7f32_nxv7f64: 85; CHECK: # %bb.0: 86; CHECK-NEXT: vsetvli zero, a0, e32, m4, ta, ma 87; CHECK-NEXT: vfwcvt.f.f.v v16, v8, v0.t 88; CHECK-NEXT: vmv8r.v v8, v16 89; CHECK-NEXT: ret 90 %v = call <vscale x 7 x double> @llvm.vp.fpext.nxv7f64.nxv7f32(<vscale x 7 x float> %a, <vscale x 7 x i1> %m, i32 %vl) 91 ret <vscale x 7 x double> %v 92} 93 94declare <vscale x 32 x float> @llvm.vp.fpext.nxv32f32.nxv32f16(<vscale x 32 x half>, <vscale x 32 x i1>, i32) 95 96define <vscale x 32 x float> @vfpext_nxv32f16_nxv32f32(<vscale x 32 x half> %a, <vscale x 32 x i1> %m, i32 zeroext %vl) { 97; CHECK-LABEL: vfpext_nxv32f16_nxv32f32: 98; CHECK: # %bb.0: 99; CHECK-NEXT: vsetvli a1, zero, e8, mf2, ta, ma 100; CHECK-NEXT: vmv1r.v v24, v0 101; CHECK-NEXT: csrr a1, vlenb 102; CHECK-NEXT: srli a2, a1, 2 103; CHECK-NEXT: slli a1, a1, 1 104; CHECK-NEXT: vslidedown.vx v0, v0, a2 105; CHECK-NEXT: sub a2, a0, a1 106; CHECK-NEXT: sltu a3, a0, a2 107; CHECK-NEXT: addi a3, a3, -1 108; CHECK-NEXT: and a2, a3, a2 109; CHECK-NEXT: vsetvli zero, a2, e16, m4, ta, ma 110; CHECK-NEXT: vfwcvt.f.f.v v16, v12, v0.t 111; CHECK-NEXT: bltu a0, a1, .LBB7_2 112; CHECK-NEXT: # %bb.1: 113; CHECK-NEXT: mv a0, a1 114; CHECK-NEXT: .LBB7_2: 115; CHECK-NEXT: vmv1r.v v0, v24 116; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, ma 117; CHECK-NEXT: vfwcvt.f.f.v v24, v8, v0.t 118; CHECK-NEXT: vmv8r.v v8, v24 119; CHECK-NEXT: ret 120 %v = call <vscale x 32 x float> @llvm.vp.fpext.nxv32f32.nxv32f16(<vscale x 32 x half> %a, <vscale x 32 x i1> %m, i32 %vl) 121 ret <vscale x 32 x float> %v 122} 123 124declare <vscale x 2 x float> @llvm.vp.fpext.nxv2f32.nxv2bf16(<vscale x 2 x bfloat>, <vscale x 2 x i1>, i32) 125 126define <vscale x 2 x float> @vfpext_nxv2bf16_nxv2f32(<vscale x 2 x bfloat> %a, <vscale x 2 x i1> %m, i32 zeroext %vl) { 127; CHECK-LABEL: vfpext_nxv2bf16_nxv2f32: 128; CHECK: # %bb.0: 129; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 130; CHECK-NEXT: vfwcvtbf16.f.f.v v9, v8, v0.t 131; CHECK-NEXT: vmv1r.v v8, v9 132; CHECK-NEXT: ret 133 %v = call <vscale x 2 x float> @llvm.vp.fpext.nxv2f32.nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x i1> %m, i32 %vl) 134 ret <vscale x 2 x float> %v 135} 136 137define <vscale x 2 x float> @vfpext_nxv2bf16_nxv2f32_unmasked(<vscale x 2 x bfloat> %a, i32 zeroext %vl) { 138; CHECK-LABEL: vfpext_nxv2bf16_nxv2f32_unmasked: 139; CHECK: # %bb.0: 140; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 141; CHECK-NEXT: vfwcvtbf16.f.f.v v9, v8 142; CHECK-NEXT: vmv1r.v v8, v9 143; CHECK-NEXT: ret 144 %v = call <vscale x 2 x float> @llvm.vp.fpext.nxv2f32.nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x i1> splat (i1 true), i32 %vl) 145 ret <vscale x 2 x float> %v 146} 147 148declare <vscale x 2 x double> @llvm.vp.fpext.nxv2f64.nxv2bf16(<vscale x 2 x bfloat>, <vscale x 2 x i1>, i32) 149 150define <vscale x 2 x double> @vfpext_nxv2bf16_nxv2f64(<vscale x 2 x bfloat> %a, <vscale x 2 x i1> %m, i32 zeroext %vl) { 151; CHECK-LABEL: vfpext_nxv2bf16_nxv2f64: 152; CHECK: # %bb.0: 153; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 154; CHECK-NEXT: vfwcvtbf16.f.f.v v10, v8, v0.t 155; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma 156; CHECK-NEXT: vfwcvt.f.f.v v8, v10, v0.t 157; CHECK-NEXT: ret 158 %v = call <vscale x 2 x double> @llvm.vp.fpext.nxv2f64.nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x i1> %m, i32 %vl) 159 ret <vscale x 2 x double> %v 160} 161 162define <vscale x 2 x double> @vfpext_nxv2bf16_nxv2f64_unmasked(<vscale x 2 x bfloat> %a, i32 zeroext %vl) { 163; CHECK-LABEL: vfpext_nxv2bf16_nxv2f64_unmasked: 164; CHECK: # %bb.0: 165; CHECK-NEXT: vsetvli zero, a0, e16, mf2, ta, ma 166; CHECK-NEXT: vfwcvtbf16.f.f.v v10, v8 167; CHECK-NEXT: vsetvli zero, zero, e32, m1, ta, ma 168; CHECK-NEXT: vfwcvt.f.f.v v8, v10 169; CHECK-NEXT: ret 170 %v = call <vscale x 2 x double> @llvm.vp.fpext.nxv2f64.nxv2bf16(<vscale x 2 x bfloat> %a, <vscale x 2 x i1> splat (i1 true), i32 %vl) 171 ret <vscale x 2 x double> %v 172} 173 174