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; |