annotate gcc/testsuite/gcc.c-torture/compile/980506-2.c @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /*
kono
parents:
diff changeset
2 * inspired by glibc-2.0.6/sysdeps/libm-ieee754/s_nextafterf.c
kono
parents:
diff changeset
3 *
kono
parents:
diff changeset
4 * gcc -O2 -S -DOP=+ gives faddp %st(1),%st
kono
parents:
diff changeset
5 * gcc -O2 -S -DOP=* gives fmulp %st(1),%st
kono
parents:
diff changeset
6 * gcc -O2 -S -DOP=- gives fsubrp %st(1),%st
kono
parents:
diff changeset
7 * gcc -O2 -S -DOP=/ gives fdivrp %st(1),%st
kono
parents:
diff changeset
8 */
kono
parents:
diff changeset
9
kono
parents:
diff changeset
10 #ifndef OP
kono
parents:
diff changeset
11 #define OP *
kono
parents:
diff changeset
12 #endif
kono
parents:
diff changeset
13
kono
parents:
diff changeset
14 typedef int int32_t __attribute__ ((__mode__ ( __SI__ ))) ;
kono
parents:
diff changeset
15 typedef unsigned int u_int32_t __attribute__ ((__mode__ ( __SI__ ))) ;
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 typedef union
kono
parents:
diff changeset
18 {
kono
parents:
diff changeset
19 float value;
kono
parents:
diff changeset
20 u_int32_t word;
kono
parents:
diff changeset
21 } ieee_float_shape_type;
kono
parents:
diff changeset
22
kono
parents:
diff changeset
23 float __nextafterf(float x, float y)
kono
parents:
diff changeset
24 {
kono
parents:
diff changeset
25 int32_t hx,hy,ix,iy;
kono
parents:
diff changeset
26
kono
parents:
diff changeset
27 {
kono
parents:
diff changeset
28 ieee_float_shape_type gf_u;
kono
parents:
diff changeset
29 gf_u.value = x;
kono
parents:
diff changeset
30 hx = gf_u.word;
kono
parents:
diff changeset
31 }
kono
parents:
diff changeset
32 {
kono
parents:
diff changeset
33 ieee_float_shape_type gf_u;
kono
parents:
diff changeset
34 gf_u.value = y;
kono
parents:
diff changeset
35 hy = gf_u.word;
kono
parents:
diff changeset
36 }
kono
parents:
diff changeset
37 ix = hx&0x7fffffff;
kono
parents:
diff changeset
38 iy = hy&0x7fffffff;
kono
parents:
diff changeset
39
kono
parents:
diff changeset
40 if ( ix > 0x7f800000 || iy > 0x7f800000 )
kono
parents:
diff changeset
41 return x+y;
kono
parents:
diff changeset
42 if (x == y) return x;
kono
parents:
diff changeset
43 if (ix == 0)
kono
parents:
diff changeset
44 {
kono
parents:
diff changeset
45 {
kono
parents:
diff changeset
46 ieee_float_shape_type sf_u;
kono
parents:
diff changeset
47 sf_u.word = (hy&0x80000000) | 1;
kono
parents:
diff changeset
48 x = sf_u.value;
kono
parents:
diff changeset
49 }
kono
parents:
diff changeset
50 y = x*x;
kono
parents:
diff changeset
51 if (y == x) return y; else return x;
kono
parents:
diff changeset
52 }
kono
parents:
diff changeset
53 if (hx >= 0)
kono
parents:
diff changeset
54 {
kono
parents:
diff changeset
55 if (hx > hy)
kono
parents:
diff changeset
56 hx -= 1;
kono
parents:
diff changeset
57 else
kono
parents:
diff changeset
58 hx += 1;
kono
parents:
diff changeset
59 }
kono
parents:
diff changeset
60 else
kono
parents:
diff changeset
61 {
kono
parents:
diff changeset
62 if (hy >= 0 || hx > hy)
kono
parents:
diff changeset
63 hx -= 1;
kono
parents:
diff changeset
64 else
kono
parents:
diff changeset
65 hx += 1;
kono
parents:
diff changeset
66 }
kono
parents:
diff changeset
67 hy = hx & 0x7f800000;
kono
parents:
diff changeset
68 if (hy >= 0x7f800000)
kono
parents:
diff changeset
69 return x+x;
kono
parents:
diff changeset
70 if (hy < 0x00800000)
kono
parents:
diff changeset
71 {
kono
parents:
diff changeset
72 y = x OP x;
kono
parents:
diff changeset
73 if (y != x)
kono
parents:
diff changeset
74 {
kono
parents:
diff changeset
75 ieee_float_shape_type sf_u;
kono
parents:
diff changeset
76 sf_u.word = hx;
kono
parents:
diff changeset
77 y = sf_u.value;
kono
parents:
diff changeset
78 return y;
kono
parents:
diff changeset
79 }
kono
parents:
diff changeset
80 }
kono
parents:
diff changeset
81 {
kono
parents:
diff changeset
82 ieee_float_shape_type sf_u;
kono
parents:
diff changeset
83 sf_u.word = hx;
kono
parents:
diff changeset
84 x = sf_u.value;
kono
parents:
diff changeset
85 }
kono
parents:
diff changeset
86 return x;
kono
parents:
diff changeset
87 }
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89