Skip to content

Commit 2f9eee8

Browse files
tclin914circYuan
andauthored
[RISCV] Implement intrinsics for XAndesVBFHCVT (#145634)
This patch implements clang intrinsic support for XAndesVBFHCVT. The clang intrinsicis for XAndesVBFHCVT is similar to Zvfbfmin, but it doesn't have mask variants. The document for the intrinsics can be found at: https://github.com/andestech/andes-vector-intrinsic-doc/tree/ast-v5_4_0-release-v5/auto-generated/andes-v5 Co-authored-by: Tony Chuan-Yue Yuan <[email protected]>
1 parent 0529a34 commit 2f9eee8

File tree

11 files changed

+747
-2
lines changed

11 files changed

+747
-2
lines changed

clang/include/clang/Basic/riscv_andes_vector.td

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,52 @@ include "riscv_vector_common.td"
1818
// Instruction definitions
1919
//===----------------------------------------------------------------------===//
2020

21+
// Andes Vector BFLOAT16 Conversion Extension (XAndesVBFHCvt)
22+
23+
let RequiredFeatures = ["xandesvbfhcvt"],
24+
Log2LMUL = [-2, -1, 0, 1, 2],
25+
HasMasked = false,
26+
UnMaskedPolicyScheme = HasPassthruOperand in {
27+
def nds_vfwcvt_s_bf16 : RVVConvBuiltin<"Fw", "Fwv", "y", "nds_vfwcvt_s">;
28+
29+
let ManualCodegen = [{
30+
{
31+
// LLVM intrinsic
32+
// Unmasked: (passthru, op0, frm, vl)
33+
SmallVector<llvm::Value*, 4> Operands;
34+
bool HasMaskedOff = !(PolicyAttrs & RVV_VTA);
35+
bool HasRoundModeOp = HasMaskedOff ? Ops.size() == 4 : Ops.size() == 3;
36+
37+
unsigned Offset = HasMaskedOff ? 1 : 0;
38+
39+
if (!HasMaskedOff)
40+
Operands.push_back(llvm::PoisonValue::get(ResultType));
41+
else
42+
Operands.push_back(Ops[0]);
43+
44+
Operands.push_back(Ops[Offset]); // op0
45+
46+
if (HasRoundModeOp) {
47+
Operands.push_back(Ops[Offset + 1]); // frm
48+
Operands.push_back(Ops[Offset + 2]); // vl
49+
} else {
50+
Operands.push_back(ConstantInt::get(Ops[Offset + 1]->getType(), 7)); // frm
51+
Operands.push_back(Ops[Offset + 1]); // vl
52+
}
53+
54+
IntrinsicTypes = {ResultType, Ops[Offset]->getType(),
55+
Operands.back()->getType()};
56+
llvm::Function *F = CGM.getIntrinsic(ID, IntrinsicTypes);
57+
return Builder.CreateCall(F, Operands, "");
58+
}
59+
}] in {
60+
let HasFRMRoundModeOp = 1, Name = "nds_vfncvt_bf16_s", IRName = "nds_vfncvt_bf16_s" in
61+
def nds_vfncvt_bf16_s_rm : RVVConvBuiltin<"v", "vFwu", "y", "nds_vfncvt_bf16">;
62+
63+
def nds_vfncvt_bf16_s : RVVConvBuiltin<"v", "vFw", "y", "nds_vfncvt_bf16">;
64+
}
65+
}
66+
2167
// Andes Vector Packed FP16 Extension (XAndesVPackFPH)
2268

2369
multiclass RVVFPMAD {

clang/lib/Sema/SemaRISCV.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1438,8 +1438,15 @@ void SemaRISCV::checkRVVTypeSupport(QualType Ty, SourceLocation Loc, Decl *D,
14381438
!FeatureMap.lookup("zvfhmin"))
14391439
Diag(Loc, diag::err_riscv_type_requires_extension, D)
14401440
<< Ty << "zvfh or zvfhmin";
1441-
else if (Info.ElementType->isBFloat16Type() && !FeatureMap.lookup("zvfbfmin"))
1442-
Diag(Loc, diag::err_riscv_type_requires_extension, D) << Ty << "zvfbfmin";
1441+
else if (Info.ElementType->isBFloat16Type() &&
1442+
!FeatureMap.lookup("zvfbfmin") &&
1443+
!FeatureMap.lookup("xandesvbfhcvt"))
1444+
if (DeclareAndesVectorBuiltins) {
1445+
Diag(Loc, diag::err_riscv_type_requires_extension, D)
1446+
<< Ty << "zvfbfmin or xandesvbfhcvt";
1447+
} else {
1448+
Diag(Loc, diag::err_riscv_type_requires_extension, D) << Ty << "zvfbfmin";
1449+
}
14431450
else if (Info.ElementType->isSpecificBuiltinType(BuiltinType::Float) &&
14441451
!FeatureMap.lookup("zve32f"))
14451452
Diag(Loc, diag::err_riscv_type_requires_extension, D) << Ty << "zve32f";
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 2
2+
// REQUIRES: riscv-registered-target
3+
// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64x \
4+
// RUN: -target-feature +xandesvbfhcvt -disable-O0-optnone \
5+
// RUN: -emit-llvm %s -o - | opt -S -passes=mem2reg | \
6+
// RUN: FileCheck --check-prefix=CHECK-RV64 %s
7+
8+
#include <andes_vector.h>
9+
10+
// CHECK-RV64-LABEL: define dso_local <vscale x 1 x bfloat> @test_nds_vfncvt_bf16_s_bf16mf4
11+
// CHECK-RV64-SAME: (<vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] {
12+
// CHECK-RV64-NEXT: entry:
13+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x bfloat> @llvm.riscv.nds.vfncvt.bf16.s.nxv1bf16.nxv1f32.i64(<vscale x 1 x bfloat> poison, <vscale x 1 x float> [[VS2]], i64 7, i64 [[VL]])
14+
// CHECK-RV64-NEXT: ret <vscale x 1 x bfloat> [[TMP0]]
15+
//
16+
vbfloat16mf4_t test_nds_vfncvt_bf16_s_bf16mf4(vfloat32mf2_t vs2, size_t vl) {
17+
return __riscv_nds_vfncvt_bf16_s_bf16mf4(vs2, vl);
18+
}
19+
20+
// CHECK-RV64-LABEL: define dso_local <vscale x 2 x bfloat> @test_nds_vfncvt_bf16_s_bf16mf2
21+
// CHECK-RV64-SAME: (<vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
22+
// CHECK-RV64-NEXT: entry:
23+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x bfloat> @llvm.riscv.nds.vfncvt.bf16.s.nxv2bf16.nxv2f32.i64(<vscale x 2 x bfloat> poison, <vscale x 2 x float> [[VS2]], i64 7, i64 [[VL]])
24+
// CHECK-RV64-NEXT: ret <vscale x 2 x bfloat> [[TMP0]]
25+
//
26+
vbfloat16mf2_t test_nds_vfncvt_bf16_s_bf16mf2(vfloat32m1_t vs2, size_t vl) {
27+
return __riscv_nds_vfncvt_bf16_s_bf16mf2(vs2, vl);
28+
}
29+
30+
// CHECK-RV64-LABEL: define dso_local <vscale x 4 x bfloat> @test_nds_vfncvt_bf16_s_bf16m1
31+
// CHECK-RV64-SAME: (<vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
32+
// CHECK-RV64-NEXT: entry:
33+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x bfloat> @llvm.riscv.nds.vfncvt.bf16.s.nxv4bf16.nxv4f32.i64(<vscale x 4 x bfloat> poison, <vscale x 4 x float> [[VS2]], i64 7, i64 [[VL]])
34+
// CHECK-RV64-NEXT: ret <vscale x 4 x bfloat> [[TMP0]]
35+
//
36+
vbfloat16m1_t test_nds_vfncvt_bf16_s_bf16m1(vfloat32m2_t vs2, size_t vl) {
37+
return __riscv_nds_vfncvt_bf16_s_bf16m1(vs2, vl);
38+
}
39+
40+
// CHECK-RV64-LABEL: define dso_local <vscale x 8 x bfloat> @test_nds_vfncvt_bf16_s_bf16m2
41+
// CHECK-RV64-SAME: (<vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
42+
// CHECK-RV64-NEXT: entry:
43+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x bfloat> @llvm.riscv.nds.vfncvt.bf16.s.nxv8bf16.nxv8f32.i64(<vscale x 8 x bfloat> poison, <vscale x 8 x float> [[VS2]], i64 7, i64 [[VL]])
44+
// CHECK-RV64-NEXT: ret <vscale x 8 x bfloat> [[TMP0]]
45+
//
46+
vbfloat16m2_t test_nds_vfncvt_bf16_s_bf16m2(vfloat32m4_t vs2, size_t vl) {
47+
return __riscv_nds_vfncvt_bf16_s_bf16m2(vs2, vl);
48+
}
49+
50+
// CHECK-RV64-LABEL: define dso_local <vscale x 16 x bfloat> @test_nds_vfncvt_bf16_s_bf16m4
51+
// CHECK-RV64-SAME: (<vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
52+
// CHECK-RV64-NEXT: entry:
53+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x bfloat> @llvm.riscv.nds.vfncvt.bf16.s.nxv16bf16.nxv16f32.i64(<vscale x 16 x bfloat> poison, <vscale x 16 x float> [[VS2]], i64 7, i64 [[VL]])
54+
// CHECK-RV64-NEXT: ret <vscale x 16 x bfloat> [[TMP0]]
55+
//
56+
vbfloat16m4_t test_nds_vfncvt_bf16_s_bf16m4(vfloat32m8_t vs2, size_t vl) {
57+
return __riscv_nds_vfncvt_bf16_s_bf16m4(vs2, vl);
58+
}
59+
60+
// CHECK-RV64-LABEL: define dso_local <vscale x 1 x bfloat> @test_nds_vfncvt_bf16_s_bf16mf4_rm
61+
// CHECK-RV64-SAME: (<vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
62+
// CHECK-RV64-NEXT: entry:
63+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x bfloat> @llvm.riscv.nds.vfncvt.bf16.s.nxv1bf16.nxv1f32.i64(<vscale x 1 x bfloat> poison, <vscale x 1 x float> [[VS2]], i64 0, i64 [[VL]])
64+
// CHECK-RV64-NEXT: ret <vscale x 1 x bfloat> [[TMP0]]
65+
//
66+
vbfloat16mf4_t test_nds_vfncvt_bf16_s_bf16mf4_rm(vfloat32mf2_t vs2, size_t vl) {
67+
return __riscv_nds_vfncvt_bf16_s_bf16mf4_rm(vs2, __RISCV_FRM_RNE, vl);
68+
}
69+
70+
// CHECK-RV64-LABEL: define dso_local <vscale x 2 x bfloat> @test_nds_vfncvt_bf16_s_bf16mf2_rm
71+
// CHECK-RV64-SAME: (<vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
72+
// CHECK-RV64-NEXT: entry:
73+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x bfloat> @llvm.riscv.nds.vfncvt.bf16.s.nxv2bf16.nxv2f32.i64(<vscale x 2 x bfloat> poison, <vscale x 2 x float> [[VS2]], i64 0, i64 [[VL]])
74+
// CHECK-RV64-NEXT: ret <vscale x 2 x bfloat> [[TMP0]]
75+
//
76+
vbfloat16mf2_t test_nds_vfncvt_bf16_s_bf16mf2_rm(vfloat32m1_t vs2, size_t vl) {
77+
return __riscv_nds_vfncvt_bf16_s_bf16mf2_rm(vs2, __RISCV_FRM_RNE, vl);
78+
}
79+
80+
// CHECK-RV64-LABEL: define dso_local <vscale x 4 x bfloat> @test_nds_vfncvt_bf16_s_bf16m1_rm
81+
// CHECK-RV64-SAME: (<vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
82+
// CHECK-RV64-NEXT: entry:
83+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x bfloat> @llvm.riscv.nds.vfncvt.bf16.s.nxv4bf16.nxv4f32.i64(<vscale x 4 x bfloat> poison, <vscale x 4 x float> [[VS2]], i64 0, i64 [[VL]])
84+
// CHECK-RV64-NEXT: ret <vscale x 4 x bfloat> [[TMP0]]
85+
//
86+
vbfloat16m1_t test_nds_vfncvt_bf16_s_bf16m1_rm(vfloat32m2_t vs2, size_t vl) {
87+
return __riscv_nds_vfncvt_bf16_s_bf16m1_rm(vs2, __RISCV_FRM_RNE, vl);
88+
}
89+
90+
// CHECK-RV64-LABEL: define dso_local <vscale x 8 x bfloat> @test_nds_vfncvt_bf16_s_bf16m2_rm
91+
// CHECK-RV64-SAME: (<vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
92+
// CHECK-RV64-NEXT: entry:
93+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x bfloat> @llvm.riscv.nds.vfncvt.bf16.s.nxv8bf16.nxv8f32.i64(<vscale x 8 x bfloat> poison, <vscale x 8 x float> [[VS2]], i64 0, i64 [[VL]])
94+
// CHECK-RV64-NEXT: ret <vscale x 8 x bfloat> [[TMP0]]
95+
//
96+
vbfloat16m2_t test_nds_vfncvt_bf16_s_bf16m2_rm(vfloat32m4_t vs2, size_t vl) {
97+
return __riscv_nds_vfncvt_bf16_s_bf16m2_rm(vs2, __RISCV_FRM_RNE, vl);
98+
}
99+
100+
// CHECK-RV64-LABEL: define dso_local <vscale x 16 x bfloat> @test_nds_vfncvt_bf16_s_bf16m4_rm
101+
// CHECK-RV64-SAME: (<vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
102+
// CHECK-RV64-NEXT: entry:
103+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x bfloat> @llvm.riscv.nds.vfncvt.bf16.s.nxv16bf16.nxv16f32.i64(<vscale x 16 x bfloat> poison, <vscale x 16 x float> [[VS2]], i64 0, i64 [[VL]])
104+
// CHECK-RV64-NEXT: ret <vscale x 16 x bfloat> [[TMP0]]
105+
//
106+
vbfloat16m4_t test_nds_vfncvt_bf16_s_bf16m4_rm(vfloat32m8_t vs2, size_t vl) {
107+
return __riscv_nds_vfncvt_bf16_s_bf16m4_rm(vs2, __RISCV_FRM_RNE, vl);
108+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 2
2+
// REQUIRES: riscv-registered-target
3+
// RUN: %clang_cc1 -triple riscv64 -target-feature +v \
4+
// RUN: -target-feature +xandesvbfhcvt -disable-O0-optnone \
5+
// RUN: -emit-llvm %s -o - | opt -S -passes=mem2reg | \
6+
// RUN: FileCheck --check-prefix=CHECK-RV64 %s
7+
8+
#include <andes_vector.h>
9+
10+
// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_nds_vfwcvt_s_bf16_f32mf2
11+
// CHECK-RV64-SAME: (<vscale x 1 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] {
12+
// CHECK-RV64-NEXT: entry:
13+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x float> @llvm.riscv.nds.vfwcvt.s.bf16.nxv1f32.nxv1bf16.i64(<vscale x 1 x float> poison, <vscale x 1 x bfloat> [[VS2]], i64 [[VL]])
14+
// CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]]
15+
//
16+
vfloat32mf2_t test_nds_vfwcvt_s_bf16_f32mf2(vbfloat16mf4_t vs2, size_t vl) {
17+
return __riscv_nds_vfwcvt_s_bf16_f32mf2(vs2, vl);
18+
}
19+
20+
// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_nds_vfwcvt_s_bf16_f32m1
21+
// CHECK-RV64-SAME: (<vscale x 2 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
22+
// CHECK-RV64-NEXT: entry:
23+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.nds.vfwcvt.s.bf16.nxv2f32.nxv2bf16.i64(<vscale x 2 x float> poison, <vscale x 2 x bfloat> [[VS2]], i64 [[VL]])
24+
// CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]]
25+
//
26+
vfloat32m1_t test_nds_vfwcvt_s_bf16_f32m1(vbfloat16mf2_t vs2, size_t vl) {
27+
return __riscv_nds_vfwcvt_s_bf16_f32m1(vs2, vl);
28+
}
29+
30+
// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_nds_vfwcvt_s_bf16_f32m2
31+
// CHECK-RV64-SAME: (<vscale x 4 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
32+
// CHECK-RV64-NEXT: entry:
33+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.nds.vfwcvt.s.bf16.nxv4f32.nxv4bf16.i64(<vscale x 4 x float> poison, <vscale x 4 x bfloat> [[VS2]], i64 [[VL]])
34+
// CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]]
35+
//
36+
vfloat32m2_t test_nds_vfwcvt_s_bf16_f32m2(vbfloat16m1_t vs2, size_t vl) {
37+
return __riscv_nds_vfwcvt_s_bf16_f32m2(vs2, vl);
38+
}
39+
40+
// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_nds_vfwcvt_s_bf16_f32m4
41+
// CHECK-RV64-SAME: (<vscale x 8 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
42+
// CHECK-RV64-NEXT: entry:
43+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.nds.vfwcvt.s.bf16.nxv8f32.nxv8bf16.i64(<vscale x 8 x float> poison, <vscale x 8 x bfloat> [[VS2]], i64 [[VL]])
44+
// CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]]
45+
//
46+
vfloat32m4_t test_nds_vfwcvt_s_bf16_f32m4(vbfloat16m2_t vs2, size_t vl) {
47+
return __riscv_nds_vfwcvt_s_bf16_f32m4(vs2, vl);
48+
}
49+
50+
// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_nds_vfwcvt_s_bf16_f32m8
51+
// CHECK-RV64-SAME: (<vscale x 16 x bfloat> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
52+
// CHECK-RV64-NEXT: entry:
53+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.nds.vfwcvt.s.bf16.nxv16f32.nxv16bf16.i64(<vscale x 16 x float> poison, <vscale x 16 x bfloat> [[VS2]], i64 [[VL]])
54+
// CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]]
55+
//
56+
vfloat32m8_t test_nds_vfwcvt_s_bf16_f32m8(vbfloat16m4_t vs2, size_t vl) {
57+
return __riscv_nds_vfwcvt_s_bf16_f32m8(vs2, vl);
58+
}
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 2
2+
// REQUIRES: riscv-registered-target
3+
// RUN: %clang_cc1 -triple riscv64 -target-feature +v \
4+
// RUN: -target-feature +xandesvbfhcvt -disable-O0-optnone \
5+
// RUN: -emit-llvm %s -o - | opt -S -passes=mem2reg | \
6+
// RUN: FileCheck --check-prefix=CHECK-RV64 %s
7+
8+
#include <andes_vector.h>
9+
10+
// CHECK-RV64-LABEL: define dso_local <vscale x 1 x bfloat> @test_nds_vfncvt_bf16_s_bf16mf4
11+
// CHECK-RV64-SAME: (<vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] {
12+
// CHECK-RV64-NEXT: entry:
13+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x bfloat> @llvm.riscv.nds.vfncvt.bf16.s.nxv1bf16.nxv1f32.i64(<vscale x 1 x bfloat> poison, <vscale x 1 x float> [[VS2]], i64 7, i64 [[VL]])
14+
// CHECK-RV64-NEXT: ret <vscale x 1 x bfloat> [[TMP0]]
15+
//
16+
vbfloat16mf4_t test_nds_vfncvt_bf16_s_bf16mf4(vfloat32mf2_t vs2, size_t vl) {
17+
return __riscv_nds_vfncvt_bf16(vs2, vl);
18+
}
19+
20+
// CHECK-RV64-LABEL: define dso_local <vscale x 2 x bfloat> @test_nds_vfncvt_bf16_s_bf16mf2
21+
// CHECK-RV64-SAME: (<vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
22+
// CHECK-RV64-NEXT: entry:
23+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x bfloat> @llvm.riscv.nds.vfncvt.bf16.s.nxv2bf16.nxv2f32.i64(<vscale x 2 x bfloat> poison, <vscale x 2 x float> [[VS2]], i64 7, i64 [[VL]])
24+
// CHECK-RV64-NEXT: ret <vscale x 2 x bfloat> [[TMP0]]
25+
//
26+
vbfloat16mf2_t test_nds_vfncvt_bf16_s_bf16mf2(vfloat32m1_t vs2, size_t vl) {
27+
return __riscv_nds_vfncvt_bf16(vs2, vl);
28+
}
29+
30+
// CHECK-RV64-LABEL: define dso_local <vscale x 4 x bfloat> @test_nds_vfncvt_bf16_s_bf16m1
31+
// CHECK-RV64-SAME: (<vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
32+
// CHECK-RV64-NEXT: entry:
33+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x bfloat> @llvm.riscv.nds.vfncvt.bf16.s.nxv4bf16.nxv4f32.i64(<vscale x 4 x bfloat> poison, <vscale x 4 x float> [[VS2]], i64 7, i64 [[VL]])
34+
// CHECK-RV64-NEXT: ret <vscale x 4 x bfloat> [[TMP0]]
35+
//
36+
vbfloat16m1_t test_nds_vfncvt_bf16_s_bf16m1(vfloat32m2_t vs2, size_t vl) {
37+
return __riscv_nds_vfncvt_bf16(vs2, vl);
38+
}
39+
40+
// CHECK-RV64-LABEL: define dso_local <vscale x 8 x bfloat> @test_nds_vfncvt_bf16_s_bf16m2
41+
// CHECK-RV64-SAME: (<vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
42+
// CHECK-RV64-NEXT: entry:
43+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x bfloat> @llvm.riscv.nds.vfncvt.bf16.s.nxv8bf16.nxv8f32.i64(<vscale x 8 x bfloat> poison, <vscale x 8 x float> [[VS2]], i64 7, i64 [[VL]])
44+
// CHECK-RV64-NEXT: ret <vscale x 8 x bfloat> [[TMP0]]
45+
//
46+
vbfloat16m2_t test_nds_vfncvt_bf16_s_bf16m2(vfloat32m4_t vs2, size_t vl) {
47+
return __riscv_nds_vfncvt_bf16(vs2, vl);
48+
}
49+
50+
// CHECK-RV64-LABEL: define dso_local <vscale x 16 x bfloat> @test_nds_vfncvt_bf16_s_bf16m4
51+
// CHECK-RV64-SAME: (<vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
52+
// CHECK-RV64-NEXT: entry:
53+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x bfloat> @llvm.riscv.nds.vfncvt.bf16.s.nxv16bf16.nxv16f32.i64(<vscale x 16 x bfloat> poison, <vscale x 16 x float> [[VS2]], i64 7, i64 [[VL]])
54+
// CHECK-RV64-NEXT: ret <vscale x 16 x bfloat> [[TMP0]]
55+
//
56+
vbfloat16m4_t test_nds_vfncvt_bf16_s_bf16m4(vfloat32m8_t vs2, size_t vl) {
57+
return __riscv_nds_vfncvt_bf16(vs2, vl);
58+
}
59+
60+
// CHECK-RV64-LABEL: define dso_local <vscale x 1 x bfloat> @test_nds_vfncvt_bf16_s_bf16mf4_rm
61+
// CHECK-RV64-SAME: (<vscale x 1 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
62+
// CHECK-RV64-NEXT: entry:
63+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x bfloat> @llvm.riscv.nds.vfncvt.bf16.s.nxv1bf16.nxv1f32.i64(<vscale x 1 x bfloat> poison, <vscale x 1 x float> [[VS2]], i64 0, i64 [[VL]])
64+
// CHECK-RV64-NEXT: ret <vscale x 1 x bfloat> [[TMP0]]
65+
//
66+
vbfloat16mf4_t test_nds_vfncvt_bf16_s_bf16mf4_rm(vfloat32mf2_t vs2, size_t vl) {
67+
return __riscv_nds_vfncvt_bf16(vs2, __RISCV_FRM_RNE, vl);
68+
}
69+
70+
// CHECK-RV64-LABEL: define dso_local <vscale x 2 x bfloat> @test_nds_vfncvt_bf16_s_bf16mf2_rm
71+
// CHECK-RV64-SAME: (<vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
72+
// CHECK-RV64-NEXT: entry:
73+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x bfloat> @llvm.riscv.nds.vfncvt.bf16.s.nxv2bf16.nxv2f32.i64(<vscale x 2 x bfloat> poison, <vscale x 2 x float> [[VS2]], i64 0, i64 [[VL]])
74+
// CHECK-RV64-NEXT: ret <vscale x 2 x bfloat> [[TMP0]]
75+
//
76+
vbfloat16mf2_t test_nds_vfncvt_bf16_s_bf16mf2_rm(vfloat32m1_t vs2, size_t vl) {
77+
return __riscv_nds_vfncvt_bf16(vs2, __RISCV_FRM_RNE, vl);
78+
}
79+
80+
// CHECK-RV64-LABEL: define dso_local <vscale x 4 x bfloat> @test_nds_vfncvt_bf16_s_bf16m1_rm
81+
// CHECK-RV64-SAME: (<vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
82+
// CHECK-RV64-NEXT: entry:
83+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x bfloat> @llvm.riscv.nds.vfncvt.bf16.s.nxv4bf16.nxv4f32.i64(<vscale x 4 x bfloat> poison, <vscale x 4 x float> [[VS2]], i64 0, i64 [[VL]])
84+
// CHECK-RV64-NEXT: ret <vscale x 4 x bfloat> [[TMP0]]
85+
//
86+
vbfloat16m1_t test_nds_vfncvt_bf16_s_bf16m1_rm(vfloat32m2_t vs2, size_t vl) {
87+
return __riscv_nds_vfncvt_bf16(vs2, __RISCV_FRM_RNE, vl);
88+
}
89+
90+
// CHECK-RV64-LABEL: define dso_local <vscale x 8 x bfloat> @test_nds_vfncvt_bf16_s_bf16m2_rm
91+
// CHECK-RV64-SAME: (<vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
92+
// CHECK-RV64-NEXT: entry:
93+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x bfloat> @llvm.riscv.nds.vfncvt.bf16.s.nxv8bf16.nxv8f32.i64(<vscale x 8 x bfloat> poison, <vscale x 8 x float> [[VS2]], i64 0, i64 [[VL]])
94+
// CHECK-RV64-NEXT: ret <vscale x 8 x bfloat> [[TMP0]]
95+
//
96+
vbfloat16m2_t test_nds_vfncvt_bf16_s_bf16m2_rm(vfloat32m4_t vs2, size_t vl) {
97+
return __riscv_nds_vfncvt_bf16(vs2, __RISCV_FRM_RNE, vl);
98+
}
99+
100+
// CHECK-RV64-LABEL: define dso_local <vscale x 16 x bfloat> @test_nds_vfncvt_bf16_s_bf16m4_rm
101+
// CHECK-RV64-SAME: (<vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
102+
// CHECK-RV64-NEXT: entry:
103+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x bfloat> @llvm.riscv.nds.vfncvt.bf16.s.nxv16bf16.nxv16f32.i64(<vscale x 16 x bfloat> poison, <vscale x 16 x float> [[VS2]], i64 0, i64 [[VL]])
104+
// CHECK-RV64-NEXT: ret <vscale x 16 x bfloat> [[TMP0]]
105+
//
106+
vbfloat16m4_t test_nds_vfncvt_bf16_s_bf16m4_rm(vfloat32m8_t vs2, size_t vl) {
107+
return __riscv_nds_vfncvt_bf16(vs2, __RISCV_FRM_RNE, vl);
108+
}

0 commit comments

Comments
 (0)