/*------------------------------------------------------------------------
 * filename - sinl.cas
 *
 * function(s)
 *        sinl - long double trigonometric sine 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   NANTRIGL [5] = {0,0,0,0xC021, 0x7FFF};

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

Name            sinl - long double trigonometric sine function

Usage           long double sinl(long double x);

Prototype in    math.h

Description     sinl  returns  the  sine  of  the  input  value.  Angles are
                specified in radians.

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

*---------------------------------------------------------------------------*/
#pragma warn -rvl
long double _FARFUNC sinl (long double x)
{
asm     FLD     LONGDOUBLE (x)

asm     mov     ax, 7FFFh
asm     and     ax, W0 (x [8])          /* extract the exponent field */
asm     cmp     ax, 63 + 3FFFh          /* biased version of exponent 63 */
asm     jae     sinl_tooLarge

#ifdef _Windows
        _f87_Sine();
#else
        if (_8087 >= 3)
        {
asm     db      OPCODE_FSIN
        }
        else
        {
asm     _FAST_  (_FSIN_)
        }
#endif

sinl_end:
        return;


sinl_tooLarge:
asm     FSTP    ST (0)                  /* pop x from stack */
#pragma warn -ret
        return  __matherrl (TLOSS, "sinl", &x, NULL, *((long double *) NANTRIGL));
#pragma warn .ret
}
#pragma warn .rvl
