181 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+d,+zvfh,+v,+zvfbfmin -target-abi=ilp32d \3; RUN: -verify-machineinstrs < %s | FileCheck %s4; RUN: llc -mtriple=riscv64 -mattr=+d,+zvfh,+v,+zvfbfmin -target-abi=lp64d \5; RUN: -verify-machineinstrs < %s | FileCheck %s6; RUN: llc -mtriple=riscv32 -mattr=+d,+zvfhmin,+v,+zvfbfmin -target-abi=ilp32d \7; RUN: -verify-machineinstrs < %s | FileCheck %s8; RUN: llc -mtriple=riscv64 -mattr=+d,+zvfhmin,+v,+zvfbfmin -target-abi=lp64d \9; RUN: -verify-machineinstrs < %s | FileCheck %s10 11define <2 x float> @vfptrunc_v2f64_v2f32(<2 x double> %va) strictfp {12; CHECK-LABEL: vfptrunc_v2f64_v2f32:13; CHECK: # %bb.0:14; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma15; CHECK-NEXT: vfncvt.f.f.w v9, v816; CHECK-NEXT: vmv1r.v v8, v917; CHECK-NEXT: ret18 %evec = call <2 x float> @llvm.experimental.constrained.fptrunc.v2f32.v2f64(<2 x double> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")19 ret <2 x float> %evec20}21 22define <2 x half> @vfptrunc_v2f64_v2f16(<2 x double> %va) strictfp {23; CHECK-LABEL: vfptrunc_v2f64_v2f16:24; CHECK: # %bb.0:25; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma26; CHECK-NEXT: vfncvt.rod.f.f.w v9, v827; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, ma28; CHECK-NEXT: vfncvt.f.f.w v8, v929; CHECK-NEXT: ret30 %evec = call <2 x half> @llvm.experimental.constrained.fptrunc.v2f16.v2f64(<2 x double> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")31 ret <2 x half> %evec32}33 34define <2 x half> @vfptrunc_v2f32_v2f16(<2 x float> %va) strictfp {35; CHECK-LABEL: vfptrunc_v2f32_v2f16:36; CHECK: # %bb.0:37; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma38; CHECK-NEXT: vfncvt.f.f.w v9, v839; CHECK-NEXT: vmv1r.v v8, v940; CHECK-NEXT: ret41 %evec = call <2 x half> @llvm.experimental.constrained.fptrunc.v2f16.v2f32(<2 x float> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")42 ret <2 x half> %evec43}44 45define <4 x float> @vfptrunc_v4f64_v4f32(<4 x double> %va) strictfp {46; CHECK-LABEL: vfptrunc_v4f64_v4f32:47; CHECK: # %bb.0:48; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma49; CHECK-NEXT: vfncvt.f.f.w v10, v850; CHECK-NEXT: vmv.v.v v8, v1051; CHECK-NEXT: ret52 %evec = call <4 x float> @llvm.experimental.constrained.fptrunc.v4f32.v4f64(<4 x double> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")53 ret <4 x float> %evec54}55 56define <4 x half> @vfptrunc_v4f64_v4f16(<4 x double> %va) strictfp {57; CHECK-LABEL: vfptrunc_v4f64_v4f16:58; CHECK: # %bb.0:59; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma60; CHECK-NEXT: vfncvt.rod.f.f.w v10, v861; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, ma62; CHECK-NEXT: vfncvt.f.f.w v8, v1063; CHECK-NEXT: ret64 %evec = call <4 x half> @llvm.experimental.constrained.fptrunc.v4f16.v4f64(<4 x double> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")65 ret <4 x half> %evec66}67 68define <4 x half> @vfptrunc_v4f32_v4f16(<4 x float> %va) strictfp {69; CHECK-LABEL: vfptrunc_v4f32_v4f16:70; CHECK: # %bb.0:71; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma72; CHECK-NEXT: vfncvt.f.f.w v9, v873; CHECK-NEXT: vmv1r.v v8, v974; CHECK-NEXT: ret75 %evec = call <4 x half> @llvm.experimental.constrained.fptrunc.v4f16.v4f32(<4 x float> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")76 ret <4 x half> %evec77}78 79define <8 x float> @vfptrunc_v8f64_v8f32(<8 x double> %va) strictfp {80; CHECK-LABEL: vfptrunc_v8f64_v8f32:81; CHECK: # %bb.0:82; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma83; CHECK-NEXT: vfncvt.f.f.w v12, v884; CHECK-NEXT: vmv.v.v v8, v1285; CHECK-NEXT: ret86 %evec = call <8 x float> @llvm.experimental.constrained.fptrunc.v8f32.v8f64(<8 x double> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")87 ret <8 x float> %evec88}89 90define <8 x half> @vfptrunc_v8f64_v8f16(<8 x double> %va) strictfp {91; CHECK-LABEL: vfptrunc_v8f64_v8f16:92; CHECK: # %bb.0:93; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma94; CHECK-NEXT: vfncvt.rod.f.f.w v12, v895; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, ma96; CHECK-NEXT: vfncvt.f.f.w v8, v1297; CHECK-NEXT: ret98 %evec = call <8 x half> @llvm.experimental.constrained.fptrunc.v8f16.v8f64(<8 x double> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")99 ret <8 x half> %evec100}101 102define <8 x half> @vfptrunc_v8f32_v8f16(<8 x float> %va) strictfp {103; CHECK-LABEL: vfptrunc_v8f32_v8f16:104; CHECK: # %bb.0:105; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma106; CHECK-NEXT: vfncvt.f.f.w v10, v8107; CHECK-NEXT: vmv.v.v v8, v10108; CHECK-NEXT: ret109 %evec = call <8 x half> @llvm.experimental.constrained.fptrunc.v8f16.v8f32(<8 x float> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")110 ret <8 x half> %evec111}112 113define <2 x bfloat> @vfptrunc_v2f64_v2bf16(<2 x double> %va) strictfp {114; CHECK-LABEL: vfptrunc_v2f64_v2bf16:115; CHECK: # %bb.0:116; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma117; CHECK-NEXT: vfncvt.rod.f.f.w v9, v8118; CHECK-NEXT: vsetvli zero, zero, e16, mf4, ta, ma119; CHECK-NEXT: vfncvtbf16.f.f.w v8, v9120; CHECK-NEXT: ret121 %evec = call <2 x bfloat> @llvm.experimental.constrained.fptrunc.v2bf16.v2f64(<2 x double> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")122 ret <2 x bfloat> %evec123}124 125define <2 x bfloat> @vfptrunc_v2f32_v2bf16(<2 x float> %va) strictfp {126; CHECK-LABEL: vfptrunc_v2f32_v2bf16:127; CHECK: # %bb.0:128; CHECK-NEXT: vsetivli zero, 2, e16, mf4, ta, ma129; CHECK-NEXT: vfncvtbf16.f.f.w v9, v8130; CHECK-NEXT: vmv1r.v v8, v9131; CHECK-NEXT: ret132 %evec = call <2 x bfloat> @llvm.experimental.constrained.fptrunc.v2bf16.v2f32(<2 x float> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")133 ret <2 x bfloat> %evec134}135 136define <4 x bfloat> @vfptrunc_v4f64_v4bf16(<4 x double> %va) strictfp {137; CHECK-LABEL: vfptrunc_v4f64_v4bf16:138; CHECK: # %bb.0:139; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma140; CHECK-NEXT: vfncvt.rod.f.f.w v10, v8141; CHECK-NEXT: vsetvli zero, zero, e16, mf2, ta, ma142; CHECK-NEXT: vfncvtbf16.f.f.w v8, v10143; CHECK-NEXT: ret144 %evec = call <4 x bfloat> @llvm.experimental.constrained.fptrunc.v4bf16.v4f64(<4 x double> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")145 ret <4 x bfloat> %evec146}147 148define <4 x bfloat> @vfptrunc_v4f32_v4bf16(<4 x float> %va) strictfp {149; CHECK-LABEL: vfptrunc_v4f32_v4bf16:150; CHECK: # %bb.0:151; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma152; CHECK-NEXT: vfncvtbf16.f.f.w v9, v8153; CHECK-NEXT: vmv1r.v v8, v9154; CHECK-NEXT: ret155 %evec = call <4 x bfloat> @llvm.experimental.constrained.fptrunc.v4bf16.v4f32(<4 x float> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")156 ret <4 x bfloat> %evec157}158 159define <8 x bfloat> @vfptrunc_v8f64_v8bf16(<8 x double> %va) strictfp {160; CHECK-LABEL: vfptrunc_v8f64_v8bf16:161; CHECK: # %bb.0:162; CHECK-NEXT: vsetivli zero, 8, e32, m2, ta, ma163; CHECK-NEXT: vfncvt.rod.f.f.w v12, v8164; CHECK-NEXT: vsetvli zero, zero, e16, m1, ta, ma165; CHECK-NEXT: vfncvtbf16.f.f.w v8, v12166; CHECK-NEXT: ret167 %evec = call <8 x bfloat> @llvm.experimental.constrained.fptrunc.v8bf16.v8f64(<8 x double> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")168 ret <8 x bfloat> %evec169}170 171define <8 x bfloat> @vfptrunc_v8f32_v8bf16(<8 x float> %va) strictfp {172; CHECK-LABEL: vfptrunc_v8f32_v8bf16:173; CHECK: # %bb.0:174; CHECK-NEXT: vsetivli zero, 8, e16, m1, ta, ma175; CHECK-NEXT: vfncvtbf16.f.f.w v10, v8176; CHECK-NEXT: vmv.v.v v8, v10177; CHECK-NEXT: ret178 %evec = call <8 x bfloat> @llvm.experimental.constrained.fptrunc.v8bf16.v8f32(<8 x float> %va, metadata !"round.dynamic", metadata !"fpexcept.strict")179 ret <8 x bfloat> %evec180}181