OSDN Git Service

0bed72ba138840f77ce26e98f11b7b24e311ee2a
[pf3gnuchains/gcc-fork.git] / gcc / testsuite / gcc.dg / torture / builtin-modf-1.c
1 /* Copyright (C) 2007  Free Software Foundation.
2
3    Verify that built-in folding of modf is correctly performed by the
4    compiler.
5
6    Origin: Kaveh R. Ghazi,  February 23, 2007.  */
7
8 /* { dg-do link } */
9 /* { dg-options "-fno-finite-math-only" { target sh*-*-* } } */
10 /* { dg-options "-funsafe-math-optimizations -fsigned-zeros -fno-associative-math" { target powerpc-*-darwin* powerpc*-*-linux* } } */
11
12 extern void link_error(int);
13
14 /* Return TRUE if the sign of X != sign of Y.  This is important when
15    comparing signed zeros.  */
16 #define CKSGN_F(X,Y) \
17   (__builtin_copysignf(1.0F,(X)) != __builtin_copysignf(1.0F,(Y)))
18 #define CKSGN(X,Y) \
19   (__builtin_copysign(1.0,(X)) != __builtin_copysign(1.0,(Y)))
20 #define CKSGN_L(X,Y) \
21   (__builtin_copysignl(1.0L,(X)) != __builtin_copysignl(1.0L,(Y)))
22
23 /* We use these macros if we can only check these when optimizing.  In
24    some cases we rely on other optimizations to propagate the value
25    and fold away certain constructs.  Likewise for the sign testing.
26    TRUE means an error occurred.  */
27 #ifdef __OPTIMIZE__
28 #define CKRES(X) (X)
29 #define CKIPTR(X,Y) X != Y
30 #define CKSGN_IPTR_F(X,Y) CKSGN_F(X,Y)
31 #define CKSGN_IPTR(X,Y) CKSGN(X,Y)
32 #define CKSGN_IPTR_L(X,Y) CKSGN_L(X,Y)
33 #else
34 #define CKRES(X) 0
35 #define CKIPTR(X,Y) 0
36 #define CKSGN_IPTR_F(X,Y) 0
37 #define CKSGN_IPTR(X,Y) 0
38 #define CKSGN_IPTR_L(X,Y) 0
39 #endif
40
41 /* Test that modf(ARG1,&iptr) == FRACRES && iptr == INTRES.  Check the
42    sign in case we get -0.0.  */
43 #define TESTIT_MODF(ARG,INTRES,FRACRES) do { \
44   float iptrf = 0.5; double iptr = 0.5; long double iptrl = 0.5; \
45   if (__builtin_modff(ARG##f,&iptrf) != FRACRES##f \
46       || CKIPTR(iptrf,INTRES##f) \
47       || CKSGN_F(__builtin_modff(ARG##f,&iptrf),FRACRES##f) \
48       || CKSGN_IPTR_F(iptrf,INTRES##f)) \
49     link_error(__LINE__); \
50   if (__builtin_modf(ARG,&iptr) != FRACRES \
51       || CKIPTR(iptr,INTRES) \
52       || CKSGN(__builtin_modf(ARG,&iptr),FRACRES) \
53       || CKSGN_IPTR(iptr,INTRES)) \
54     link_error(__LINE__); \
55   if (__builtin_modfl(ARG##l,&iptrl) != FRACRES##l \
56       || CKIPTR(iptrl,INTRES##l) \
57       || CKSGN_L(__builtin_modfl(ARG##l,&iptrl),FRACRES##l) \
58       || CKSGN_IPTR_L(iptrl,INTRES##l)) \
59     link_error(__LINE__); \
60   } while (0)
61
62 /* Test that modf(NEG FUNCARG(ARGARG, &iptr)) == FRACRES &&
63    FUNCRES(iptr) is true.  Check the sign of both as well.  This is
64    for checking an argument of Inf.  */
65 #define TESTIT_MODF2(NEG,FUNCARG,ARGARG,FUNCRES,FRACRES) do { \
66   float iptrf = 0.5; double iptr = 0.5; long double iptrl = 0.5; \
67   if (__builtin_modff(NEG __builtin_##FUNCARG##f(ARGARG),&iptrf) != FRACRES##f \
68       || CKSGN_F(__builtin_modff(NEG __builtin_##FUNCARG##f(ARGARG),&iptrf), FRACRES##f) \
69       || CKIPTR(!__builtin_##FUNCRES##f(iptrf),0) \
70       || CKSGN_IPTR_F(iptrf,FRACRES##f)) \
71     link_error(__LINE__); \
72   if (__builtin_modf(NEG __builtin_##FUNCARG(ARGARG),&iptr) != FRACRES \
73       || CKSGN(__builtin_modf(NEG __builtin_##FUNCARG(ARGARG),&iptr), FRACRES) \
74       || CKIPTR(!__builtin_##FUNCRES(iptr),0) \
75       || CKSGN_IPTR(iptr,FRACRES)) \
76     link_error(__LINE__); \
77   if (__builtin_modfl(NEG __builtin_##FUNCARG##l(ARGARG),&iptrl) != FRACRES##l \
78       || CKSGN_L(__builtin_modfl(NEG __builtin_##FUNCARG##l(ARGARG),&iptrl), FRACRES##l) \
79       || CKIPTR(!__builtin_##FUNCRES##l(iptrl),0) \
80       || CKSGN_IPTR_L(iptrl,FRACRES##l)) \
81     link_error(__LINE__); \
82   } while (0)
83
84 /* Test that FUNCRES(modf(NEG FUNCARG(ARGARG, &iptr))) is true &&
85    FUNCRES(iptr) is true.  Check the sign of both as well.  This is
86    for checking an argument of NaN.  */
87 #define TESTIT_MODF3(NEG,FUNCARG,ARGARG,FUNCRES) do { \
88   float iptrf = 0.5; double iptr = 0.5; long double iptrl = 0.5; \
89   if (CKRES(!__builtin_##FUNCRES##f(__builtin_modff(NEG __builtin_##FUNCARG##f(ARGARG),&iptrf))) \
90       || CKSGN_F(__builtin_modff(NEG __builtin_##FUNCARG##f(ARGARG),&iptrf), NEG 1) \
91       || CKIPTR(!__builtin_##FUNCRES##f(iptrf),0) \
92       || CKSGN_IPTR_F(iptrf,NEG 1)) \
93     link_error(__LINE__); \
94   if (CKRES(!__builtin_##FUNCRES(__builtin_modf(NEG __builtin_##FUNCARG(ARGARG),&iptr))) \
95       || CKSGN(__builtin_modf(NEG __builtin_##FUNCARG(ARGARG),&iptr), NEG 1) \
96       || CKIPTR(!__builtin_##FUNCRES(iptr),0) \
97       || CKSGN_IPTR(iptr,NEG 1)) \
98     link_error(__LINE__); \
99   if (CKRES(!__builtin_##FUNCRES##l(__builtin_modfl(NEG __builtin_##FUNCARG##l(ARGARG),&iptrl))) \
100       || CKSGN_L(__builtin_modfl(NEG __builtin_##FUNCARG##l(ARGARG),&iptrl), NEG 1) \
101       || CKIPTR(!__builtin_##FUNCRES##l(iptrl),0) \
102       || CKSGN_IPTR_L(iptrl,NEG 1)) \
103     link_error(__LINE__); \
104   } while (0)
105
106 void __attribute__ ((__noinline__))
107 foo(void)
108 {
109   /* Test that modf(ARG1,&iptr) -> ARG3 && iptr == ARG2.  */
110   TESTIT_MODF (0x1p10F+0.5, 0x1p10, 0.5);
111   TESTIT_MODF (0x1p10F+0x1p-10, 0x1p10, 0x1p-10);
112   TESTIT_MODF (12345678L/17.0, 726216.0, -726216L+12345678L/17.0);
113   TESTIT_MODF (555.555, 555.0, -555+555.555);
114   TESTIT_MODF (5000/11.0, 454.0, -454+5000/11.0);
115   TESTIT_MODF (1000/7.0, 142.0, -142+1000/7.0);
116   TESTIT_MODF (123/7.0, 17.0, -17+123/7.0);
117   TESTIT_MODF (117/7.0, 16.0, -16+117/7.0);
118   TESTIT_MODF (5.5, 5.0, 0.5);
119   TESTIT_MODF (1.5, 1.0, 0.5);
120   TESTIT_MODF (4/3.0, 1.0, -1+4/3.0);
121   TESTIT_MODF (1.0, 1.0, 0.0);
122   TESTIT_MODF (0.5, 0.0, 0.5);
123   TESTIT_MODF (4/9.0, 0.0, 4/9.0);
124   TESTIT_MODF (1/3.0, 0.0, 1/3.0);
125   TESTIT_MODF (1/9.0, 0.0, 1/9.0);
126   TESTIT_MODF (0.0, 0.0, 0.0);
127
128   TESTIT_MODF (-0.0, -0.0, -0.0);
129   TESTIT_MODF (-1/9.0, -0.0, -1/9.0);
130   TESTIT_MODF (-1/3.0, -0.0, -1/3.0);
131   TESTIT_MODF (-4/9.0, -0.0, -4/9.0);
132   TESTIT_MODF (-0.5, -0.0, -0.5);
133   TESTIT_MODF (-1.0, -1.0, -0.0);
134   TESTIT_MODF (-4/3.0, -1.0, 1-4/3.0);
135   TESTIT_MODF (-1.5, -1.0, -0.5);
136   TESTIT_MODF (-5.5, -5.0, -0.5);
137   TESTIT_MODF (-117/7.0, -16.0, 16-117/7.0);
138   TESTIT_MODF (-123/7.0, -17.0, 17-123/7.0);
139   TESTIT_MODF (-1000/7.0, -142.0, 142-1000/7.0);
140   TESTIT_MODF (-5000/11.0, -454.0, 454-5000/11.0);
141   TESTIT_MODF (-555.555, -555.0, 555-555.555);
142   TESTIT_MODF (-12345678L/17.0, -726216.0, 726216L-12345678L/17.0);
143   TESTIT_MODF (-0x1p10F-0x1p-10, -0x1p10, -0x1p-10);
144   TESTIT_MODF (-0x1p10F-0.5, -0x1p10, -0.5);
145
146   
147   /* Test for modf(+-Inf,&i) -> (i=+-0.0, +-Inf).  */
148   TESTIT_MODF2 ( ,inf, , isinf, 0.0);
149   TESTIT_MODF2 (- ,inf, , isinf, -0.0);
150
151   /* Test for and modf(+-NaN,&i) -> (i=+-NaN, +-NaN).  */
152   TESTIT_MODF3 ( ,nan, "", isnan);
153   TESTIT_MODF3 (- ,nan, "", isnan);
154 }
155
156 int main()
157 {
158   foo();
159   
160   return 0;
161 }