1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
/* { dg-do compile } */
/* { dg-options "-O2 -ffast-math -fdump-tree-optimized" } */
/* { dg-require-effective-target c99_runtime } */
extern void link_error(void);
#define T(TYPE, C_TY, FNAME) \
void f_##FNAME##_1 (TYPE a) \
{ \
TYPE t1 = 1.0##C_TY / a; \
TYPE t2 = __builtin_##FNAME (t1); \
TYPE t3 = __builtin_##FNAME (a); \
TYPE t4 = -t3; \
if (t2 != t4) \
link_error (); \
} \
void f_##FNAME##_2 (TYPE a) \
{ \
TYPE t1 = 2.0##C_TY / a; \
TYPE t2 = __builtin_##FNAME (t1); \
TYPE t3 = __builtin_##FNAME (2.0); \
TYPE t4 = __builtin_##FNAME (a); \
TYPE t5 = t3 - t4; \
if (t2 != t5) \
link_error (); \
} \
void f_##FNAME##_3 (TYPE a, TYPE b) \
{ \
TYPE t1 = __builtin_##FNAME (a); \
TYPE t2 = __builtin_##FNAME (b); \
TYPE t3 = t1 + t2; \
TYPE t4 = a * b; \
TYPE t5 = __builtin_##FNAME (t4); \
if (t3 != t5) \
link_error (); \
} \
void f_##FNAME##_4 (TYPE a, TYPE b) \
{ \
TYPE t1 = __builtin_##FNAME (a); \
TYPE t2 = __builtin_##FNAME (b); \
TYPE t3 = t1 - t2; \
TYPE t4 = a / b; \
TYPE t5 = __builtin_##FNAME (t4); \
if (t3 != t5) \
link_error (); \
}
#define TEST_LOGS(TYPE, C_TY, F_TY) \
T (TYPE, C_TY, log##F_TY) \
T (TYPE, C_TY, log2##F_TY) \
T (TYPE, C_TY, log10##F_TY)
TEST_LOGS (double, , )
TEST_LOGS (float, f, f)
TEST_LOGS (long double, L, l)
/* { dg-final { scan-tree-dump-not "link_error" "optimized" } } */
|