mathHardLib.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:13k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* mathHardLib.c - hardware floating point math library */
  2. /* Copyright 1984-2001 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01c,05sep01,hdn  added cosh, sinh, tanh support(spr 25654)
  8. 01b,08jun93,hdn  updated to 5.1
  9.   -changed copyright notice
  10.   -changed VOID to void
  11.   -made logMsg calls indirect to reduce coupling
  12.   -changed includes to have absolute path from h/
  13. 01a,16sep92,hdn  written by modifying Tron's mathHardLib.c.
  14. */
  15. /*
  16. DESCRIPTION
  17. This library provides support routines for using the hardware floating
  18. point coprocessor i80387 with high-level math functions.
  19. The high level functions include triginometric operations, exponents,
  20. etc.  
  21. The routines in this library will automatically be used for high-level
  22. math functions only if mathHardInit() has been called previously.  
  23. */
  24. #include "vxWorks.h"
  25. #include "math.h"
  26. #include "logLib.h"
  27. #include "fppLib.h"
  28. #include "intLib.h"
  29. #include "private/funcBindP.h"
  30. /* Externals */
  31. extern double  mathHardAcos (); /* functions in mathHardALib.s */
  32. extern double  mathHardAsin ();
  33. extern double  mathHardAtan ();
  34. extern double  mathHardAtan2 ();
  35. extern double  mathHardCeil ();
  36. extern double  mathHardCos ();
  37. extern double  mathHardExp ();
  38. extern double  mathHardFabs ();
  39. extern double  mathHardFloor ();
  40. extern double  mathHardFmod ();
  41. extern double  mathHardInfinity ();
  42. extern int     mathHardIrint ();
  43. extern int     mathHardIround ();
  44. extern double  mathHardLog ();
  45. extern double  mathHardLog2 ();
  46. extern double  mathHardLog10 ();
  47. extern double  mathHardPow ();
  48. extern double  mathHardRound ();
  49. extern double  mathHardSin ();
  50. extern void    mathHardSincos ();
  51. extern double  mathHardSqrt ();
  52. extern double  mathHardTan ();
  53. extern double  mathHardTrunc ();
  54. extern double  cosh (); /* functions in libc/math */
  55. extern double  sinh ();
  56. extern double  tanh ();
  57. extern DBLFUNCPTR mathAcosFunc; /* double-precision function ptrs */
  58. extern DBLFUNCPTR mathAsinFunc;
  59. extern DBLFUNCPTR mathAtanFunc;
  60. extern DBLFUNCPTR mathAtan2Func;
  61. extern DBLFUNCPTR mathCbrtFunc;
  62. extern DBLFUNCPTR mathCeilFunc;
  63. extern DBLFUNCPTR mathCosFunc;
  64. extern DBLFUNCPTR mathCoshFunc;
  65. extern DBLFUNCPTR mathExpFunc;
  66. extern DBLFUNCPTR mathFabsFunc;
  67. extern DBLFUNCPTR mathFloorFunc;
  68. extern DBLFUNCPTR mathFmodFunc;
  69. extern DBLFUNCPTR mathHypotFunc;
  70. extern DBLFUNCPTR mathInfinityFunc;
  71. extern FUNCPTR mathIrintFunc;
  72. extern FUNCPTR mathIroundFunc;
  73. extern DBLFUNCPTR mathLogFunc;
  74. extern DBLFUNCPTR mathLog2Func;
  75. extern DBLFUNCPTR mathLog10Func;
  76. extern DBLFUNCPTR mathPowFunc;
  77. extern DBLFUNCPTR mathRoundFunc;
  78. extern DBLFUNCPTR mathSinFunc;
  79. extern VOIDFUNCPTR mathSincosFunc;
  80. extern DBLFUNCPTR mathSinhFunc;
  81. extern DBLFUNCPTR mathSqrtFunc;
  82. extern DBLFUNCPTR mathTanFunc;
  83. extern DBLFUNCPTR mathTanhFunc;
  84. extern DBLFUNCPTR mathTruncFunc;
  85. extern FLTFUNCPTR mathFacosFunc; /* single-precision function ptrs */
  86. extern FLTFUNCPTR mathFasinFunc;
  87. extern FLTFUNCPTR mathFatanFunc;
  88. extern FLTFUNCPTR mathFatan2Func;
  89. extern FLTFUNCPTR mathFcbrtFunc;
  90. extern FLTFUNCPTR mathFceilFunc;
  91. extern FLTFUNCPTR mathFcosFunc;
  92. extern FLTFUNCPTR mathFcoshFunc;
  93. extern FLTFUNCPTR mathFexpFunc;
  94. extern FLTFUNCPTR mathFfabsFunc;
  95. extern FLTFUNCPTR mathFfloorFunc;
  96. extern FLTFUNCPTR mathFfmodFunc;
  97. extern FLTFUNCPTR mathFhypotFunc;
  98. extern FLTFUNCPTR mathFinfinityFunc;
  99. extern FUNCPTR mathFirintFunc;
  100. extern FUNCPTR mathFiroundFunc;
  101. extern FLTFUNCPTR mathFlogFunc;
  102. extern FLTFUNCPTR mathFlog2Func;
  103. extern FLTFUNCPTR mathFlog10Func;
  104. extern FLTFUNCPTR mathFpowFunc;
  105. extern FLTFUNCPTR mathFroundFunc;
  106. extern FLTFUNCPTR mathFsinFunc;
  107. extern VOIDFUNCPTR mathFsincosFunc;
  108. extern FLTFUNCPTR mathFsinhFunc;
  109. extern FLTFUNCPTR mathFsqrtFunc;
  110. extern FLTFUNCPTR mathFtanFunc;
  111. extern FLTFUNCPTR mathFtanhFunc;
  112. extern FLTFUNCPTR mathFtruncFunc;
  113. extern void mathErrNoInit (); /* initial value of func ptrs */
  114. /* Forward declarations */
  115. LOCAL void mathHardNoSingle ();
  116. LOCAL void mathHardCbrt ();
  117. LOCAL void mathHardHypot ();
  118. /******************************************************************************
  119. *
  120. * mathHardInit - initialize hardware floating point math support
  121. *
  122. * This routine is called from usrConfig if INCLUDE_I80387
  123. * is defined.  This causes the linker to include the floating point
  124. * hardware support library.
  125. *
  126. * This routine places the addresses of the hardware high-level math functions
  127. * (triginometric functions, etc.) in a set of global variables.  This
  128. * allows the standard math functions (e.g. sin(), pow()) to have a single
  129. * entry point but be dispatched to the hardware or software support
  130. * routines, as specified.
  131. * Certain routines which are present in the floating point software emulation
  132. * library do not have equivalent hardware support routines.  (These are
  133. * primarily routines which handle single-precision floating point.)  If
  134. * no emulation routine address has already been put in the global variable
  135. * for this function, the address of a dummy routine which logs an error
  136. * message is placed in the variable; if an emulation routine address is
  137. * present (the emulation initialization, via mathSoftInit(), must be done 
  138. * prior to hardware floating point initialization), the emulation routine 
  139. * address is left alone.  In this way, hardware routines will be used for all 
  140. * available functions, while emulation will be used for the missing functions.
  141. *
  142. * SEE ALSO: mathSoftInit()
  143. *
  144. */
  145. void mathHardInit ()
  146.     {
  147.     /* Don't do more unless there really is hardware support */
  148.     fppInit(); /* attempt to init hardware support */
  149.     if (fppProbe() != OK) /* is there a coprocessor ? */
  150. return; /*  exit if no */
  151.     
  152.     /* Load hardware routine addresses into global variables
  153.      * defined in mathALib.s.
  154.      */
  155.     /* Double-precision routines */
  156.     
  157.     if (mathAcosFunc == (DBLFUNCPTR) mathErrNoInit)
  158.         mathAcosFunc = mathHardAcos;
  159.     if (mathAsinFunc == (DBLFUNCPTR) mathErrNoInit)
  160.         mathAsinFunc = mathHardAsin;
  161.     if (mathAtanFunc == (DBLFUNCPTR) mathErrNoInit)
  162.         mathAtanFunc = mathHardAtan;
  163.     if (mathAtan2Func == (DBLFUNCPTR) mathErrNoInit)
  164.         mathAtan2Func = mathHardAtan2;
  165.     if (mathCeilFunc == (DBLFUNCPTR) mathErrNoInit)
  166.         mathCeilFunc = mathHardCeil;
  167.     if (mathCosFunc == (DBLFUNCPTR) mathErrNoInit)
  168.         mathCosFunc = mathHardCos;
  169.     if (mathCoshFunc == (DBLFUNCPTR) mathErrNoInit)
  170.         mathCoshFunc = cosh; /* drag in libc/math/cosh */
  171.     if (mathExpFunc == (DBLFUNCPTR) mathErrNoInit)
  172.         mathExpFunc = mathHardExp;
  173.     if (mathFabsFunc == (DBLFUNCPTR) mathErrNoInit)
  174.         mathFabsFunc = mathHardFabs;
  175.     if (mathFmodFunc == (DBLFUNCPTR) mathErrNoInit)
  176.         mathFmodFunc = mathHardFmod;
  177.     if (mathFloorFunc == (DBLFUNCPTR) mathErrNoInit)
  178.         mathFloorFunc = mathHardFloor;
  179.     if (mathInfinityFunc == (DBLFUNCPTR) mathErrNoInit)
  180.         mathInfinityFunc = mathHardInfinity;
  181.     if (mathIrintFunc == (FUNCPTR) mathErrNoInit)
  182.         mathIrintFunc = mathHardIrint;
  183.     if (mathIroundFunc == (FUNCPTR) mathErrNoInit)
  184.         mathIroundFunc = mathHardIround;
  185.     if (mathLogFunc == (DBLFUNCPTR) mathErrNoInit)
  186.         mathLogFunc = mathHardLog;
  187.     if (mathLog2Func == (DBLFUNCPTR) mathErrNoInit)
  188.         mathLog2Func = mathHardLog2;
  189.     if (mathLog10Func == (DBLFUNCPTR) mathErrNoInit)
  190.         mathLog10Func = mathHardLog10;
  191.     if (mathPowFunc == (DBLFUNCPTR) mathErrNoInit)
  192.         mathPowFunc = mathHardPow;
  193.     if (mathRoundFunc == (DBLFUNCPTR) mathErrNoInit)
  194.         mathRoundFunc = mathHardRound;
  195.     if (mathSinFunc == (DBLFUNCPTR) mathErrNoInit)
  196.         mathSinFunc = mathHardSin;
  197.     if (mathSincosFunc == mathErrNoInit)
  198.         mathSincosFunc = mathHardSincos;
  199.     if (mathSinhFunc == (DBLFUNCPTR) mathErrNoInit)
  200.         mathSinhFunc = sinh; /* drag in libc/math/sinh */
  201.     if (mathSqrtFunc == (DBLFUNCPTR) mathErrNoInit)
  202.         mathSqrtFunc = mathHardSqrt;
  203.     if (mathTanFunc == (DBLFUNCPTR) mathErrNoInit)
  204.         mathTanFunc = mathHardTan;
  205.     if (mathTanhFunc == (DBLFUNCPTR) mathErrNoInit)
  206.         mathTanhFunc = tanh; /* drag in libc/math/tanh */
  207.     if (mathTruncFunc == (DBLFUNCPTR) mathErrNoInit)
  208.         mathTruncFunc = mathHardTrunc;
  209.     /* Single-precision functions (unsupported) */
  210.     
  211.     if (mathFacosFunc == (FLTFUNCPTR) mathErrNoInit)
  212.      mathFacosFunc = (FLTFUNCPTR) mathHardNoSingle;
  213.     if (mathFasinFunc == (FLTFUNCPTR) mathErrNoInit)
  214. mathFasinFunc = (FLTFUNCPTR) mathHardNoSingle;
  215.     if (mathFatanFunc == (FLTFUNCPTR) mathErrNoInit)
  216. mathFatanFunc = (FLTFUNCPTR) mathHardNoSingle;
  217.     if (mathFatan2Func == (FLTFUNCPTR) mathErrNoInit)
  218. mathFatan2Func = (FLTFUNCPTR) mathHardNoSingle;
  219.     if (mathFcbrtFunc == (FLTFUNCPTR) mathErrNoInit)
  220. mathFcbrtFunc = (FLTFUNCPTR) mathHardNoSingle;
  221.     if (mathFceilFunc == (FLTFUNCPTR) mathErrNoInit)
  222. mathFceilFunc = (FLTFUNCPTR) mathHardNoSingle;
  223.     if (mathFcosFunc == (FLTFUNCPTR) mathErrNoInit)
  224. mathFcosFunc = (FLTFUNCPTR) mathHardNoSingle;
  225.     if (mathFcoshFunc == (FLTFUNCPTR) mathErrNoInit)
  226. mathFcoshFunc = (FLTFUNCPTR) mathHardNoSingle;
  227.     if (mathFexpFunc == (FLTFUNCPTR) mathErrNoInit)
  228. mathFexpFunc = (FLTFUNCPTR) mathHardNoSingle;
  229.     if (mathFfabsFunc == (FLTFUNCPTR) mathErrNoInit)
  230. mathFfabsFunc = (FLTFUNCPTR) mathHardNoSingle;
  231.     if (mathFfmodFunc == (FLTFUNCPTR) mathErrNoInit)
  232. mathFfmodFunc = (FLTFUNCPTR) mathHardNoSingle;
  233.     if (mathFfloorFunc == (FLTFUNCPTR) mathErrNoInit)
  234. mathFfloorFunc = (FLTFUNCPTR) mathHardNoSingle;
  235.     if (mathFhypotFunc == (FLTFUNCPTR) mathErrNoInit)
  236. mathFhypotFunc = (FLTFUNCPTR) mathHardNoSingle;
  237.     if (mathFinfinityFunc == (FLTFUNCPTR) mathErrNoInit)
  238. mathFinfinityFunc = (FLTFUNCPTR) mathHardNoSingle;
  239.     if (mathFirintFunc == (FUNCPTR) mathErrNoInit)
  240. mathFirintFunc = (FUNCPTR) mathHardNoSingle;
  241.     if (mathFiroundFunc == (FUNCPTR) mathErrNoInit)
  242. mathFiroundFunc = (FUNCPTR) mathHardNoSingle;
  243.     if (mathFlogFunc == (FLTFUNCPTR) mathErrNoInit)
  244. mathFlogFunc = (FLTFUNCPTR) mathHardNoSingle;
  245.     if (mathFlog2Func == (FLTFUNCPTR) mathErrNoInit)
  246. mathFlog2Func = (FLTFUNCPTR) mathHardNoSingle;
  247.     if (mathFlog10Func == (FLTFUNCPTR) mathErrNoInit)
  248. mathFlog10Func = (FLTFUNCPTR) mathHardNoSingle;
  249.     if (mathFpowFunc == (FLTFUNCPTR) mathErrNoInit)
  250. mathFpowFunc = (FLTFUNCPTR) mathHardNoSingle;
  251.     if (mathFroundFunc == (FLTFUNCPTR) mathErrNoInit)
  252. mathFroundFunc = (FLTFUNCPTR) mathHardNoSingle;
  253.     if (mathFsinFunc == (FLTFUNCPTR) mathErrNoInit)
  254. mathFsinFunc = (FLTFUNCPTR) mathHardNoSingle;
  255.     if (mathFsincosFunc == mathErrNoInit)
  256. mathFsincosFunc = mathHardNoSingle;
  257.     if (mathFsinhFunc == (FLTFUNCPTR) mathErrNoInit)
  258. mathFsinhFunc = (FLTFUNCPTR) mathHardNoSingle;
  259.     if (mathFsqrtFunc == (FLTFUNCPTR) mathErrNoInit)
  260. mathFsqrtFunc = (FLTFUNCPTR) mathHardNoSingle;
  261.     if (mathFtanFunc == (FLTFUNCPTR) mathErrNoInit)
  262. mathFtanFunc = (FLTFUNCPTR) mathHardNoSingle;
  263.     if (mathFtanhFunc == (FLTFUNCPTR) mathErrNoInit)
  264. mathFtanhFunc = (FLTFUNCPTR) mathHardNoSingle;
  265.     if (mathFtruncFunc == (FLTFUNCPTR) mathErrNoInit)
  266. mathFtruncFunc = (FLTFUNCPTR) mathHardNoSingle;
  267.     /* Miscellaneous unsupported functions */
  268.     if (mathCbrtFunc == (DBLFUNCPTR) mathErrNoInit)
  269.      mathCbrtFunc = (DBLFUNCPTR) mathHardCbrt;
  270.     if (mathHypotFunc == (DBLFUNCPTR) mathErrNoInit)
  271.      mathHypotFunc = (DBLFUNCPTR) mathHardHypot;
  272.     }
  273. /******************************************************************************
  274. *
  275. * mathHardNoSingle - log error message for unsupported single-precision fp
  276. *
  277. * This routine will generate a log message to the VxWorks console if
  278. * an attempt is made to use single-precision math functions with the
  279. * hardware floating point coprocessor (not supported).
  280. *
  281. */
  282. LOCAL void mathHardNoSingle ()
  283.     {
  284.     if (_func_logMsg != NULL)
  285. (* _func_logMsg) ("ERROR - single-precision flt. point not supportedn",
  286.   0,0,0,0,0,0);
  287.     }
  288. /******************************************************************************
  289. *
  290. * mathHardCbrt - log error message for unsupported cube root function
  291. *
  292. * This routine will generate a log message to the VxWorks console if
  293. * an attempt is made to use the cbrt() cube root function with the
  294. * hardware floating point coprocessor (not supported).
  295. *
  296. */
  297. LOCAL void mathHardCbrt ()
  298.     {
  299.     if (_func_logMsg != NULL)
  300.         (* _func_logMsg) ("ERROR - h/w flt. point cube root not supportedn",
  301.   0,0,0,0,0,0);
  302.     }
  303. /******************************************************************************
  304. *
  305. * mathHardHypot - log error message for unsupported hypot function
  306. *
  307. * This routine will generate a log message to the VxWorks console if
  308. * an attempt is made to use the hypot() Euclidean distance function with 
  309. * the hardware floating point coprocessor (not supported).
  310. *
  311. */
  312. LOCAL void mathHardHypot ()
  313.     {
  314.     if (_func_logMsg != NULL)
  315.         (* _func_logMsg) ("ERROR - h/w flt. point hypot not supportedn",
  316.   0,0,0,0,0,0);
  317.     }