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