00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifdef __cplusplus
00024 # define __GR_MATH_INLINE __inline
00025 #else
00026 # define __GR_MATH_INLINE extern __inline
00027 #endif
00028
00029 # define __sincos_code \
00030 register long double __cosr; \
00031 register long double __sinr; \
00032 __asm __volatile__ \
00033 ("fsincos\n\t" \
00034 "fnstsw %%ax\n\t" \
00035 "testl $0x400, %%eax\n\t" \
00036 "jz 1f\n\t" \
00037 "fldpi\n\t" \
00038 "fadd %%st(0)\n\t" \
00039 "fxch %%st(1)\n\t" \
00040 "2: fprem1\n\t" \
00041 "fnstsw %%ax\n\t" \
00042 "testl $0x400, %%eax\n\t" \
00043 "jnz 2b\n\t" \
00044 "fstp %%st(1)\n\t" \
00045 "fsincos\n\t" \
00046 "1:" \
00047 : "=t" (__cosr), "=u" (__sinr) : "0" (__x)); \
00048 *__sinx = __sinr; \
00049 *__cosx = __cosr
00050
00051 __GR_MATH_INLINE void
00052 __sincos (double __x, double *__sinx, double *__cosx) __THROW
00053 {
00054 __sincos_code;
00055 }
00056
00057 __GR_MATH_INLINE void
00058 __sincosf (float __x, float *__sinx, float *__cosx) __THROW
00059 {
00060 __sincos_code;
00061 }
00062
00063 __GR_MATH_INLINE void
00064 __sincosl (long double __x, long double *__sinx, long double *__cosx) __THROW
00065 {
00066 __sincos_code;
00067 }
00068
00069 #undef __sincos_code
00070 #undef __GR_MATH_INLINE