Skip to content

Commit 4cb8f97

Browse files
mshockwavejaidTwtopperc
authored
[clang][RISCV] Add C intrinsics for XSfvfexp* and XSfvfexpa* (llvm#165792)
Add C intrinsics for XSfvfexp16e/32e, XSfvfbfexp16e, and XSfvfexpa(64e) introduced in llvm#164349 and llvm#164499 Co-authored-by: Jesse Huang <[email protected]> Co-authored-by: Craig Topper <[email protected]>
1 parent 645a9ed commit 4cb8f97

File tree

21 files changed

+4183
-0
lines changed

21 files changed

+4183
-0
lines changed

clang/include/clang/Basic/riscv_sifive_vector.td

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,13 @@ multiclass RVVVQMACCQOQBuiltinSet<list<list<string>> suffixes_prototypes> {
121121
defm NAME : RVVOutOp1Op2BuiltinSet<NAME, "s", suffixes_prototypes>;
122122
}
123123

124+
multiclass RVVVFEXPBuiltinSet<list<list<string>> suffixes_prototypes, string type_range> {
125+
let UnMaskedPolicyScheme = HasPassthruOperand,
126+
OverloadedName = NAME,
127+
Log2LMUL = [-2, -1, 0, 1, 2, 3] in
128+
defm NAME : RVVOutBuiltinSet<NAME, type_range, suffixes_prototypes>;
129+
}
130+
124131
multiclass RVVVFNRCLIPBuiltinSet<string suffix, string prototype, string type_range> {
125132
let Log2LMUL = [-3, -2, -1, 0, 1, 2],
126133
Name = NAME,
@@ -145,6 +152,26 @@ let UnMaskedPolicyScheme = HasPolicyOperand in
145152
defm sf_vqmaccsu_4x8x4 : RVVVQMACCQOQBuiltinSet<[["", "w", "ww(FixedSEW:8)Sv(FixedSEW:8)Uv"]]>;
146153
}
147154

155+
let RequiredFeatures = ["xsfvfbfexp16e"] in {
156+
defm sf_vfexp : RVVVFEXPBuiltinSet<[["v", "v", "vv"]], "y">;
157+
}
158+
159+
let RequiredFeatures = ["xsfvfexp16e"] in {
160+
defm sf_vfexp : RVVVFEXPBuiltinSet<[["v", "v", "vv"]], "x">;
161+
}
162+
163+
let RequiredFeatures = ["xsfvfexp32e"] in {
164+
defm sf_vfexp : RVVVFEXPBuiltinSet<[["v", "v", "vv"]], "f">;
165+
}
166+
167+
let RequiredFeatures = ["xsfvfexpa"] in {
168+
defm sf_vfexpa : RVVVFEXPBuiltinSet<[["v", "v", "vv"]], "xf">;
169+
}
170+
171+
let RequiredFeatures = ["xsfvfexpa64e"] in {
172+
defm sf_vfexpa : RVVVFEXPBuiltinSet<[["v", "v", "vv"]], "d">;
173+
}
174+
148175
let UnMaskedPolicyScheme = HasPolicyOperand in
149176
let RequiredFeatures = ["xsfvfwmaccqqq"] in
150177
defm sf_vfwmacc_4x4x4 : RVVVFWMACCBuiltinSet<[["", "Fw", "FwFwSvv"]]>;
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
2+
// REQUIRES: riscv-registered-target
3+
// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64x -target-feature +zvfh \
4+
// RUN: -target-feature +xsfvfexp16e -disable-O0-optnone \
5+
// RUN: -emit-llvm %s -o - | opt -S -passes=mem2reg | \
6+
// RUN: FileCheck --check-prefix=CHECK-RV64 %s
7+
8+
#include <sifive_vector.h>
9+
10+
// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexp_v_f16mf4(
11+
// CHECK-RV64-SAME: <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0:[0-9]+]] {
12+
// CHECK-RV64-NEXT: [[ENTRY:.*:]]
13+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexp.nxv1f16.i64(<vscale x 1 x half> poison, <vscale x 1 x half> [[VS2]], i64 [[VL]])
14+
// CHECK-RV64-NEXT: ret <vscale x 1 x half> [[TMP0]]
15+
//
16+
vfloat16mf4_t test_sf_vfexp_v_f16mf4(vfloat16mf4_t vs2, size_t vl) {
17+
return __riscv_sf_vfexp_v_f16mf4(vs2, vl);
18+
}
19+
20+
// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexp_v_f16mf2(
21+
// CHECK-RV64-SAME: <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
22+
// CHECK-RV64-NEXT: [[ENTRY:.*:]]
23+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexp.nxv2f16.i64(<vscale x 2 x half> poison, <vscale x 2 x half> [[VS2]], i64 [[VL]])
24+
// CHECK-RV64-NEXT: ret <vscale x 2 x half> [[TMP0]]
25+
//
26+
vfloat16mf2_t test_sf_vfexp_v_f16mf2(vfloat16mf2_t vs2, size_t vl) {
27+
return __riscv_sf_vfexp_v_f16mf2(vs2, vl);
28+
}
29+
30+
// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexp_v_f16m1(
31+
// CHECK-RV64-SAME: <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
32+
// CHECK-RV64-NEXT: [[ENTRY:.*:]]
33+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexp.nxv4f16.i64(<vscale x 4 x half> poison, <vscale x 4 x half> [[VS2]], i64 [[VL]])
34+
// CHECK-RV64-NEXT: ret <vscale x 4 x half> [[TMP0]]
35+
//
36+
vfloat16m1_t test_sf_vfexp_v_f16m1(vfloat16m1_t vs2, size_t vl) {
37+
return __riscv_sf_vfexp_v_f16m1(vs2, vl);
38+
}
39+
40+
// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexp_v_f16m2(
41+
// CHECK-RV64-SAME: <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
42+
// CHECK-RV64-NEXT: [[ENTRY:.*:]]
43+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexp.nxv8f16.i64(<vscale x 8 x half> poison, <vscale x 8 x half> [[VS2]], i64 [[VL]])
44+
// CHECK-RV64-NEXT: ret <vscale x 8 x half> [[TMP0]]
45+
//
46+
vfloat16m2_t test_sf_vfexp_v_f16m2(vfloat16m2_t vs2, size_t vl) {
47+
return __riscv_sf_vfexp_v_f16m2(vs2, vl);
48+
}
49+
50+
// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexp_v_f16m4(
51+
// CHECK-RV64-SAME: <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
52+
// CHECK-RV64-NEXT: [[ENTRY:.*:]]
53+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexp.nxv16f16.i64(<vscale x 16 x half> poison, <vscale x 16 x half> [[VS2]], i64 [[VL]])
54+
// CHECK-RV64-NEXT: ret <vscale x 16 x half> [[TMP0]]
55+
//
56+
vfloat16m4_t test_sf_vfexp_v_f16m4(vfloat16m4_t vs2, size_t vl) {
57+
return __riscv_sf_vfexp_v_f16m4(vs2, vl);
58+
}
59+
60+
// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexp_v_f16m8(
61+
// CHECK-RV64-SAME: <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
62+
// CHECK-RV64-NEXT: [[ENTRY:.*:]]
63+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexp.nxv32f16.i64(<vscale x 32 x half> poison, <vscale x 32 x half> [[VS2]], i64 [[VL]])
64+
// CHECK-RV64-NEXT: ret <vscale x 32 x half> [[TMP0]]
65+
//
66+
vfloat16m8_t test_sf_vfexp_v_f16m8(vfloat16m8_t vs2, size_t vl) {
67+
return __riscv_sf_vfexp_v_f16m8(vs2, vl);
68+
}
69+
70+
// CHECK-RV64-LABEL: define dso_local <vscale x 1 x half> @test_sf_vfexp_v_f16mf4_m(
71+
// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <vscale x 1 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
72+
// CHECK-RV64-NEXT: [[ENTRY:.*:]]
73+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 1 x half> @llvm.riscv.sf.vfexp.mask.nxv1f16.i64(<vscale x 1 x half> poison, <vscale x 1 x half> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 3)
74+
// CHECK-RV64-NEXT: ret <vscale x 1 x half> [[TMP0]]
75+
//
76+
vfloat16mf4_t test_sf_vfexp_v_f16mf4_m(vbool64_t vm, vfloat16mf4_t vs2,
77+
size_t vl) {
78+
return __riscv_sf_vfexp_v_f16mf4_m(vm, vs2, vl);
79+
}
80+
81+
// CHECK-RV64-LABEL: define dso_local <vscale x 2 x half> @test_sf_vfexp_v_f16mf2_m(
82+
// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
83+
// CHECK-RV64-NEXT: [[ENTRY:.*:]]
84+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x half> @llvm.riscv.sf.vfexp.mask.nxv2f16.i64(<vscale x 2 x half> poison, <vscale x 2 x half> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 3)
85+
// CHECK-RV64-NEXT: ret <vscale x 2 x half> [[TMP0]]
86+
//
87+
vfloat16mf2_t test_sf_vfexp_v_f16mf2_m(vbool32_t vm, vfloat16mf2_t vs2,
88+
size_t vl) {
89+
return __riscv_sf_vfexp_v_f16mf2_m(vm, vs2, vl);
90+
}
91+
92+
// CHECK-RV64-LABEL: define dso_local <vscale x 4 x half> @test_sf_vfexp_v_f16m1_m(
93+
// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
94+
// CHECK-RV64-NEXT: [[ENTRY:.*:]]
95+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x half> @llvm.riscv.sf.vfexp.mask.nxv4f16.i64(<vscale x 4 x half> poison, <vscale x 4 x half> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 3)
96+
// CHECK-RV64-NEXT: ret <vscale x 4 x half> [[TMP0]]
97+
//
98+
vfloat16m1_t test_sf_vfexp_v_f16m1_m(vbool16_t vm, vfloat16m1_t vs2,
99+
size_t vl) {
100+
return __riscv_sf_vfexp_v_f16m1_m(vm, vs2, vl);
101+
}
102+
103+
// CHECK-RV64-LABEL: define dso_local <vscale x 8 x half> @test_sf_vfexp_v_f16m2_m(
104+
// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
105+
// CHECK-RV64-NEXT: [[ENTRY:.*:]]
106+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x half> @llvm.riscv.sf.vfexp.mask.nxv8f16.i64(<vscale x 8 x half> poison, <vscale x 8 x half> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 3)
107+
// CHECK-RV64-NEXT: ret <vscale x 8 x half> [[TMP0]]
108+
//
109+
vfloat16m2_t test_sf_vfexp_v_f16m2_m(vbool8_t vm, vfloat16m2_t vs2, size_t vl) {
110+
return __riscv_sf_vfexp_v_f16m2_m(vm, vs2, vl);
111+
}
112+
113+
// CHECK-RV64-LABEL: define dso_local <vscale x 16 x half> @test_sf_vfexp_v_f16m4_m(
114+
// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
115+
// CHECK-RV64-NEXT: [[ENTRY:.*:]]
116+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x half> @llvm.riscv.sf.vfexp.mask.nxv16f16.i64(<vscale x 16 x half> poison, <vscale x 16 x half> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 3)
117+
// CHECK-RV64-NEXT: ret <vscale x 16 x half> [[TMP0]]
118+
//
119+
vfloat16m4_t test_sf_vfexp_v_f16m4_m(vbool4_t vm, vfloat16m4_t vs2, size_t vl) {
120+
return __riscv_sf_vfexp_v_f16m4_m(vm, vs2, vl);
121+
}
122+
123+
// CHECK-RV64-LABEL: define dso_local <vscale x 32 x half> @test_sf_vfexp_v_f16m8_m(
124+
// CHECK-RV64-SAME: <vscale x 32 x i1> [[VM:%.*]], <vscale x 32 x half> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
125+
// CHECK-RV64-NEXT: [[ENTRY:.*:]]
126+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 32 x half> @llvm.riscv.sf.vfexp.mask.nxv32f16.i64(<vscale x 32 x half> poison, <vscale x 32 x half> [[VS2]], <vscale x 32 x i1> [[VM]], i64 [[VL]], i64 3)
127+
// CHECK-RV64-NEXT: ret <vscale x 32 x half> [[TMP0]]
128+
//
129+
vfloat16m8_t test_sf_vfexp_v_f16m8_m(vbool2_t vm, vfloat16m8_t vs2, size_t vl) {
130+
return __riscv_sf_vfexp_v_f16m8_m(vm, vs2, vl);
131+
}
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
2+
// REQUIRES: riscv-registered-target
3+
// RUN: %clang_cc1 -triple riscv64 -target-feature +zve64x -target-feature +zve32f \
4+
// RUN: -target-feature +xsfvfexp32e -disable-O0-optnone \
5+
// RUN: -emit-llvm %s -o - | opt -S -passes=mem2reg | \
6+
// RUN: FileCheck --check-prefix=CHECK-RV64 %s
7+
8+
#include <sifive_vector.h>
9+
10+
// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexp_v_f32mf2(
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 float> @llvm.riscv.sf.vfexp.nxv1f32.i64(<vscale x 1 x float> poison, <vscale x 1 x float> [[VS2]], i64 [[VL]])
14+
// CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]]
15+
//
16+
vfloat32mf2_t test_sf_vfexp_v_f32mf2(vfloat32mf2_t vs2, size_t vl) {
17+
return __riscv_sf_vfexp_v_f32mf2(vs2, vl);
18+
}
19+
20+
// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexp_v_f32m1(
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 float> @llvm.riscv.sf.vfexp.nxv2f32.i64(<vscale x 2 x float> poison, <vscale x 2 x float> [[VS2]], i64 [[VL]])
24+
// CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]]
25+
//
26+
vfloat32m1_t test_sf_vfexp_v_f32m1(vfloat32m1_t vs2, size_t vl) {
27+
return __riscv_sf_vfexp_v_f32m1(vs2, vl);
28+
}
29+
30+
// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexp_v_f32m2(
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 float> @llvm.riscv.sf.vfexp.nxv4f32.i64(<vscale x 4 x float> poison, <vscale x 4 x float> [[VS2]], i64 [[VL]])
34+
// CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]]
35+
//
36+
vfloat32m2_t test_sf_vfexp_v_f32m2(vfloat32m2_t vs2, size_t vl) {
37+
return __riscv_sf_vfexp_v_f32m2(vs2, vl);
38+
}
39+
40+
// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexp_v_f32m4(
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 float> @llvm.riscv.sf.vfexp.nxv8f32.i64(<vscale x 8 x float> poison, <vscale x 8 x float> [[VS2]], i64 [[VL]])
44+
// CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]]
45+
//
46+
vfloat32m4_t test_sf_vfexp_v_f32m4(vfloat32m4_t vs2, size_t vl) {
47+
return __riscv_sf_vfexp_v_f32m4(vs2, vl);
48+
}
49+
50+
// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexp_v_f32m8(
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 float> @llvm.riscv.sf.vfexp.nxv16f32.i64(<vscale x 16 x float> poison, <vscale x 16 x float> [[VS2]], i64 [[VL]])
54+
// CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]]
55+
//
56+
vfloat32m8_t test_sf_vfexp_v_f32m8(vfloat32m8_t vs2, size_t vl) {
57+
return __riscv_sf_vfexp_v_f32m8(vs2, vl);
58+
}
59+
60+
// CHECK-RV64-LABEL: define dso_local <vscale x 1 x float> @test_sf_vfexp_v_f32mf2_m(
61+
// CHECK-RV64-SAME: <vscale x 1 x i1> [[VM:%.*]], <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 float> @llvm.riscv.sf.vfexp.mask.nxv1f32.i64(<vscale x 1 x float> poison, <vscale x 1 x float> [[VS2]], <vscale x 1 x i1> [[VM]], i64 [[VL]], i64 3)
64+
// CHECK-RV64-NEXT: ret <vscale x 1 x float> [[TMP0]]
65+
//
66+
vfloat32mf2_t test_sf_vfexp_v_f32mf2_m(vbool64_t vm, vfloat32mf2_t vs2,
67+
size_t vl) {
68+
return __riscv_sf_vfexp_v_f32mf2_m(vm, vs2, vl);
69+
}
70+
71+
// CHECK-RV64-LABEL: define dso_local <vscale x 2 x float> @test_sf_vfexp_v_f32m1_m(
72+
// CHECK-RV64-SAME: <vscale x 2 x i1> [[VM:%.*]], <vscale x 2 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
73+
// CHECK-RV64-NEXT: [[ENTRY:.*:]]
74+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 2 x float> @llvm.riscv.sf.vfexp.mask.nxv2f32.i64(<vscale x 2 x float> poison, <vscale x 2 x float> [[VS2]], <vscale x 2 x i1> [[VM]], i64 [[VL]], i64 3)
75+
// CHECK-RV64-NEXT: ret <vscale x 2 x float> [[TMP0]]
76+
//
77+
vfloat32m1_t test_sf_vfexp_v_f32m1_m(vbool32_t vm, vfloat32m1_t vs2,
78+
size_t vl) {
79+
return __riscv_sf_vfexp_v_f32m1_m(vm, vs2, vl);
80+
}
81+
82+
// CHECK-RV64-LABEL: define dso_local <vscale x 4 x float> @test_sf_vfexp_v_f32m2_m(
83+
// CHECK-RV64-SAME: <vscale x 4 x i1> [[VM:%.*]], <vscale x 4 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
84+
// CHECK-RV64-NEXT: [[ENTRY:.*:]]
85+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 4 x float> @llvm.riscv.sf.vfexp.mask.nxv4f32.i64(<vscale x 4 x float> poison, <vscale x 4 x float> [[VS2]], <vscale x 4 x i1> [[VM]], i64 [[VL]], i64 3)
86+
// CHECK-RV64-NEXT: ret <vscale x 4 x float> [[TMP0]]
87+
//
88+
vfloat32m2_t test_sf_vfexp_v_f32m2_m(vbool16_t vm, vfloat32m2_t vs2,
89+
size_t vl) {
90+
return __riscv_sf_vfexp_v_f32m2_m(vm, vs2, vl);
91+
}
92+
93+
// CHECK-RV64-LABEL: define dso_local <vscale x 8 x float> @test_sf_vfexp_v_f32m4_m(
94+
// CHECK-RV64-SAME: <vscale x 8 x i1> [[VM:%.*]], <vscale x 8 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
95+
// CHECK-RV64-NEXT: [[ENTRY:.*:]]
96+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 8 x float> @llvm.riscv.sf.vfexp.mask.nxv8f32.i64(<vscale x 8 x float> poison, <vscale x 8 x float> [[VS2]], <vscale x 8 x i1> [[VM]], i64 [[VL]], i64 3)
97+
// CHECK-RV64-NEXT: ret <vscale x 8 x float> [[TMP0]]
98+
//
99+
vfloat32m4_t test_sf_vfexp_v_f32m4_m(vbool8_t vm, vfloat32m4_t vs2, size_t vl) {
100+
return __riscv_sf_vfexp_v_f32m4_m(vm, vs2, vl);
101+
}
102+
103+
// CHECK-RV64-LABEL: define dso_local <vscale x 16 x float> @test_sf_vfexp_v_f32m8_m(
104+
// CHECK-RV64-SAME: <vscale x 16 x i1> [[VM:%.*]], <vscale x 16 x float> [[VS2:%.*]], i64 noundef [[VL:%.*]]) #[[ATTR0]] {
105+
// CHECK-RV64-NEXT: [[ENTRY:.*:]]
106+
// CHECK-RV64-NEXT: [[TMP0:%.*]] = call <vscale x 16 x float> @llvm.riscv.sf.vfexp.mask.nxv16f32.i64(<vscale x 16 x float> poison, <vscale x 16 x float> [[VS2]], <vscale x 16 x i1> [[VM]], i64 [[VL]], i64 3)
107+
// CHECK-RV64-NEXT: ret <vscale x 16 x float> [[TMP0]]
108+
//
109+
vfloat32m8_t test_sf_vfexp_v_f32m8_m(vbool4_t vm, vfloat32m8_t vs2, size_t vl) {
110+
return __riscv_sf_vfexp_v_f32m8_m(vm, vs2, vl);
111+
}

0 commit comments

Comments
 (0)