122 lines
2.5 KiB
C
122 lines
2.5 KiB
C
|
/***
|
||
|
*fpinit.c - Initialize floating point
|
||
|
*
|
||
|
* Copyright (c) 1991-2001, Microsoft Corporation. All rights reserved.
|
||
|
*
|
||
|
*Purpose:
|
||
|
*
|
||
|
*Revision History:
|
||
|
* 09-29-91 GDP merged fpmath.c and fltused.asm to produce this file
|
||
|
* 09-30-91 GDP per thread initialization and termination hooks
|
||
|
* 03-04-92 GDP removed finit instruction
|
||
|
* 11-06-92 GDP added __fastflag for FORTRAN libs
|
||
|
* 03-23-93 JWM added _setdefaultprecision() to _fpmath()
|
||
|
* 12-09-94 JWM added __adjust_fdiv for Pentium FDIV detection
|
||
|
* 12-12-94 SKS _adjust_fdiv must be exported in MSVCRT.LIB model
|
||
|
* 02-06-95 JWM Mac merge
|
||
|
* 04-04-95 JWM Clear exceptions after FDIV detection (x86 only).
|
||
|
* 11-15-95 BWT Assume P5 FDIV problem will be handled in the OS.
|
||
|
* 10-07-97 RDL Added IA64.
|
||
|
*
|
||
|
*******************************************************************************/
|
||
|
#include <cv.h>
|
||
|
|
||
|
#ifdef _M_IX86
|
||
|
#include <testfdiv.h>
|
||
|
#endif
|
||
|
|
||
|
#if defined(_AMD64_) || defined(_M_IA64)
|
||
|
#include <trans.h>
|
||
|
#endif
|
||
|
|
||
|
int _fltused = 0x9875;
|
||
|
int _ldused = 0x9873;
|
||
|
|
||
|
int __fastflag = 0;
|
||
|
|
||
|
|
||
|
void _cfltcvt_init(void);
|
||
|
void _fpmath(void);
|
||
|
void _fpclear(void);
|
||
|
|
||
|
#if defined(_M_AMD64) || defined(_M_IX86) || defined(_M_IA64)
|
||
|
|
||
|
#ifndef _CRTIMP
|
||
|
#ifdef CRTDLL
|
||
|
#define _CRTIMP __declspec(dllexport)
|
||
|
#else
|
||
|
#define _CRTIMP
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
_CRTIMP int _adjust_fdiv = 0;
|
||
|
|
||
|
extern void _setdefaultprecision();
|
||
|
#endif
|
||
|
|
||
|
void (* _FPinit)(void) = _fpmath;
|
||
|
void (* _FPmtinit)(void) = _fpclear;
|
||
|
void (* _FPmtterm)(void) = _fpclear;
|
||
|
|
||
|
|
||
|
void _fpmath()
|
||
|
{
|
||
|
|
||
|
//
|
||
|
// There is no need for 'finit'
|
||
|
// since this is done by the OS
|
||
|
//
|
||
|
|
||
|
_cfltcvt_init();
|
||
|
|
||
|
#ifdef _M_IX86
|
||
|
#ifndef NT_BUILD
|
||
|
_adjust_fdiv = _ms_p5_mp_test_fdiv();
|
||
|
#endif
|
||
|
_setdefaultprecision();
|
||
|
_asm {
|
||
|
fnclex
|
||
|
}
|
||
|
#elif defined(_M_IA64)
|
||
|
/* _setdefaultprecision(); */
|
||
|
_clrfp();
|
||
|
#endif
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
void _fpclear()
|
||
|
{
|
||
|
//
|
||
|
// There is no need for 'finit'
|
||
|
// since this is done by the OS
|
||
|
//
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
void _cfltcvt_init()
|
||
|
{
|
||
|
_cfltcvt_tab[0] = (PFV) _cfltcvt;
|
||
|
_cfltcvt_tab[1] = (PFV) _cropzeros;
|
||
|
_cfltcvt_tab[2] = (PFV) _fassign;
|
||
|
_cfltcvt_tab[3] = (PFV) _forcdecpt;
|
||
|
_cfltcvt_tab[4] = (PFV) _positive;
|
||
|
/* map long double to double */
|
||
|
_cfltcvt_tab[5] = (PFV) _cfltcvt;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Routine to set the fast flag in order to speed up computation
|
||
|
* of transcendentals at the expense of limiting error checking
|
||
|
*/
|
||
|
|
||
|
int __setfflag(int new)
|
||
|
{
|
||
|
int old = __fastflag;
|
||
|
__fastflag = new;
|
||
|
return old;
|
||
|
}
|