Skip to content

Commit caa62bc

Browse files
committed
Add lowering test
1 parent 3d801c0 commit caa62bc

File tree

1 file changed

+125
-0
lines changed

1 file changed

+125
-0
lines changed
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm %s -o %t.ll
2+
// RUN: FileCheck --input-file=%t.ll %s
3+
4+
int finite(double);
5+
6+
// CHECK: define {{.*}}@test_is_finite
7+
void test_is_finite(__fp16 *H, float F, double D, long double LD) {
8+
volatile int res;
9+
res = __builtin_isinf(*H);
10+
// CHECK: call i1 @llvm.is.fpclass.f16(half %{{.*}}, i32 516)
11+
res = __builtin_isinf(F);
12+
// CHECK: call i1 @llvm.is.fpclass.f32(float %{{.*}}, i32 516)
13+
res = __builtin_isinf(D);
14+
// CHECK: call i1 @llvm.is.fpclass.f64(double %{{.*}}, i32 516)
15+
res = __builtin_isinf(LD);
16+
// CHECK: call i1 @llvm.is.fpclass.f80(x86_fp80 %{{.*}}, i32 516)
17+
18+
res = __builtin_isfinite(*H);
19+
// CHECK: call i1 @llvm.is.fpclass.f16(half %{{.*}}, i32 504)
20+
res = __builtin_isfinite(F);
21+
// CHECK: call i1 @llvm.is.fpclass.f32(float %{{.*}}, i32 504)
22+
res = finite(D);
23+
// CHECK: call i32 @finite(double %{{.*}})
24+
25+
res = __builtin_isnormal(*H);
26+
// CHECK: call i1 @llvm.is.fpclass.f16(half %{{.*}}, i32 264)
27+
res = __builtin_isnormal(F);
28+
// CHECK: call i1 @llvm.is.fpclass.f32(float %{{.*}}, i32 264)
29+
30+
res = __builtin_issubnormal(F);
31+
// CHECK: call i1 @llvm.is.fpclass.f32(float %{{.*}}, i32 144)
32+
res = __builtin_iszero(F);
33+
// CHECK: call i1 @llvm.is.fpclass.f32(float %{{.*}}, i32 96)
34+
res = __builtin_issignaling(F);
35+
// CHECK: call i1 @llvm.is.fpclass.f32(float %{{.*}}, i32 1)
36+
}
37+
38+
_Bool check_isfpclass_finite(float x) {
39+
return __builtin_isfpclass(x, 504 /*Finite*/);
40+
}
41+
42+
// CHECK: define {{.*}}@check_isfpclass_finite
43+
// CHECK: call i1 @llvm.is.fpclass.f32(float %{{.*}}, i32 504)
44+
45+
_Bool check_isfpclass_nan_f32(float x) {
46+
return __builtin_isfpclass(x, 3 /*NaN*/);
47+
}
48+
49+
// CHECK: define {{.*}}@check_isfpclass_nan_f32
50+
// CHECK: call i1 @llvm.is.fpclass.f32(float %{{.*}}, i32 3)
51+
52+
_Bool check_isfpclass_snan_f64(double x) {
53+
return __builtin_isfpclass(x, 1 /*SNaN*/);
54+
}
55+
56+
// CHECK: define {{.*}}@check_isfpclass_snan_f64
57+
// CHECK: call i1 @llvm.is.fpclass.f64(double %{{.*}}, i32 1)
58+
59+
60+
_Bool check_isfpclass_zero_f16(_Float16 x) {
61+
return __builtin_isfpclass(x, 96 /*Zero*/);
62+
}
63+
64+
// CHECK: define {{.*}}@check_isfpclass_zero_f16
65+
// CHECK: call i1 @llvm.is.fpclass.f16(half %{{.*}}, i32 96)
66+
67+
// Update when we support FP pragma in functions.
68+
69+
// _Bool check_isfpclass_finite_strict(float x) {
70+
// #pragma STDC FENV_ACCESS ON
71+
// return __builtin_isfpclass(x, 504 /*Finite*/);
72+
// }
73+
//
74+
// _Bool check_isfpclass_nan_f32_strict(float x) {
75+
// #pragma STDC FENV_ACCESS ON
76+
// return __builtin_isfpclass(x, 3 /*NaN*/);
77+
// }
78+
//
79+
// _Bool check_isfpclass_snan_f64_strict(double x) {
80+
// #pragma STDC FENV_ACCESS ON
81+
// return __builtin_isfpclass(x, 1 /*NaN*/);
82+
// }
83+
//
84+
// _Bool check_isfpclass_zero_f16_strict(_Float16 x) {
85+
// #pragma STDC FENV_ACCESS ON
86+
// return __builtin_isfpclass(x, 96 /*Zero*/);
87+
// }
88+
//
89+
// _Bool check_isnan(float x) {
90+
// #pragma STDC FENV_ACCESS ON
91+
// return __builtin_isnan(x);
92+
// }
93+
//
94+
// _Bool check_isinf(float x) {
95+
// #pragma STDC FENV_ACCESS ON
96+
// return __builtin_isinf(x);
97+
// }
98+
//
99+
// _Bool check_isfinite(float x) {
100+
// #pragma STDC FENV_ACCESS ON
101+
// return __builtin_isfinite(x);
102+
// }
103+
//
104+
// _Bool check_isnormal(float x) {
105+
// #pragma STDC FENV_ACCESS ON
106+
// return __builtin_isnormal(x);
107+
// }
108+
//
109+
// typedef float __attribute__((ext_vector_type(4))) float4;
110+
// typedef double __attribute__((ext_vector_type(4))) double4;
111+
// typedef int __attribute__((ext_vector_type(4))) int4;
112+
// typedef long __attribute__((ext_vector_type(4))) long4;
113+
//
114+
// int4 check_isfpclass_nan_v4f32(float4 x) {
115+
// return __builtin_isfpclass(x, 3 /*NaN*/);
116+
// }
117+
//
118+
// int4 check_isfpclass_nan_strict_v4f32(float4 x) {
119+
// #pragma STDC FENV_ACCESS ON
120+
// return __builtin_isfpclass(x, 3 /*NaN*/);
121+
// }
122+
//
123+
// long4 check_isfpclass_nan_v4f64(double4 x) {
124+
// return __builtin_isfpclass(x, 3 /*NaN*/);
125+
// }

0 commit comments

Comments
 (0)