54 * Special cases:
55 * Let trig be any of sin, cos, or tan.
56 * trig(+-INF) is NaN, with signals;
57 * trig(NaN) is that NaN;
58 *
59 * Accuracy:
60 * computer TRIG(x) returns trig(x) nearly rounded.
61 */
62 /* INDENT ON */
63
64 #include "libm.h"
65 #include "libm_synonyms.h"
66 #include "longdouble.h"
67
68 #include <sys/isa_defs.h>
69
70 void
71 sincosl(long double x, long double *s, long double *c) {
72 long double y[2], z = 0.0L;
73 int n, ix;
74 #if defined(_LITTLE_ENDIAN)
75 int *px = (int *) &x;
76 #endif
77
78 /* trig(Inf or NaN) is NaN */
79 if (!finitel(x)) {
80 *s = *c = x - x;
81 return;
82 }
83
84 /* High word of x. */
85 #if defined(_BIG_ENDIAN)
86 ix = *(int *) &x;
87 #else
88 XTOI(px, ix);
89 #endif
90
91 /* |x| ~< pi/4 */
92 ix &= 0x7fffffff;
93 if (ix <= 0x3ffe9220)
94 *s = __k_sincosl(x, z, c);
95
96 /* argument reduction needed */
97 else {
98 n = __rem_pio2l(x, y);
99 switch (n & 3) {
100 case 0:
101 *s = __k_sincosl(y[0], y[1], c);
102 break;
103 case 1:
104 *c = -__k_sincosl(y[0], y[1], s);
105 break;
106 case 2:
107 *s = -__k_sincosl(y[0], y[1], c);
108 *c = -*c;
|
54 * Special cases:
55 * Let trig be any of sin, cos, or tan.
56 * trig(+-INF) is NaN, with signals;
57 * trig(NaN) is that NaN;
58 *
59 * Accuracy:
60 * computer TRIG(x) returns trig(x) nearly rounded.
61 */
62 /* INDENT ON */
63
64 #include "libm.h"
65 #include "libm_synonyms.h"
66 #include "longdouble.h"
67
68 #include <sys/isa_defs.h>
69
70 void
71 sincosl(long double x, long double *s, long double *c) {
72 long double y[2], z = 0.0L;
73 int n, ix;
74 #if defined(__i386) || defined(__amd64)
75 int *px = (int *) &x;
76 #endif
77
78 /* trig(Inf or NaN) is NaN */
79 if (!finitel(x)) {
80 *s = *c = x - x;
81 return;
82 }
83
84 /* High word of x. */
85 #if defined(__i386) || defined(__amd64)
86 XTOI(px, ix);
87 #else
88 ix = *(int *) &x;
89 #endif
90
91 /* |x| ~< pi/4 */
92 ix &= 0x7fffffff;
93 if (ix <= 0x3ffe9220)
94 *s = __k_sincosl(x, z, c);
95
96 /* argument reduction needed */
97 else {
98 n = __rem_pio2l(x, y);
99 switch (n & 3) {
100 case 0:
101 *s = __k_sincosl(y[0], y[1], c);
102 break;
103 case 1:
104 *c = -__k_sincosl(y[0], y[1], s);
105 break;
106 case 2:
107 *s = -__k_sincosl(y[0], y[1], c);
108 *c = -*c;
|