/*------------------------------------------------------------------------
 * filename - cos.cas
 *
 * function(s)
 *        cos - trigonometric function
 *-----------------------------------------------------------------------*/

/*
 *      C/C++ Run Time Library - Version 5.0
 *
 *      Copyright (c) 1987, 1992 by Borland International
 *      All Rights Reserved.
 *
 */


#pragma inline
#include <asmrules.h>

#include <_math.h>
#include <math.h>
#include <errno.h>
#include <stddef.h>

static  unsigned short   NANTRIG [4] = {0,0,0x0420, 0x7FF8};

/*--------------------------------------------------------------------------*

Name            cos - trigonometric function

Usage           double cos(double x);

Prototype in    math.h

Description     cos  returns the  cosine of   the input  value. Angles  are
                specified in radians.

Return value    cos returns a value in the range -1 to 1.
                For very  large arguments (magnitude 2^53  radians or more)
                there  is no  precision. This  is "silent",  since the ANSI
                spec allows no error return for this function.

*---------------------------------------------------------------------------*/
#pragma warn -rvl

double _FARFUNC cos( double  x )
{
asm     FLD     DOUBLE (x)

asm     mov     ax, 7FF0h
asm     and     ax, W0 (x [6])          /* extract the exponent field */
asm     cmp     ax, (53 * 16) + 3FF0h   /* biased version of exponent 53 */
asm     jae     cos_tooLarge

#ifdef _Windows
        _f87_Cosine();
#else
        if (_8087 >= 3)
        {
asm     db      OPCODE_FCOS
        }
        else
        {
asm     _FAST_  (_FCOS_)
        }
#endif

cos_end:
        return;

cos_tooLarge:
asm     FSTP    ST(0)                   /* pop x from stack */

#pragma warn -ret
        return  _matherr (TLOSS, "cos", &x, NULL, *(double *) NANTRIG);
#pragma warn .ret
}
#pragma warn .rvl
