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

VxWorks

开发平台:

C/C++

  1. /* mathHardALib.s - C-callable math routines for the i80387 */
  2. /* Copyright 1984-2001 Wind River Systems, Inc. */
  3. /*
  4. modification history 
  5. --------------------
  6. 01g,28aug01,hdn  changed "fldl %st" to "fld %st" to shut off warning
  7.  added mathHardFmodIeee() for IEEE compliance
  8.  replaced .align with .balign
  9.  moved round-mode bit macros to fppI86Lib.h
  10.  added FUNC/FUNC_LABEL and GTEXT/GDATA macros
  11. 01f,09may00,pai  fixed _mathHardFmod to test for partial remainder (SPR
  12.                  #30548).
  13. 01e,29sep97,hdn  fixed a bug in _mathHardPow.
  14. 01d,17jun96,hdn  fixed a bug in _mathHardSincos.
  15. 01c,16jun93,hdn  updated to 5.1.
  16. 01b,14oct92,hdn  aligned all functions.
  17. 01a,16sep92,hdn  written by modifying Tron's mathHardALib.s.
  18. */
  19. /*
  20. DESCRIPTION
  21. This library provides a C interface to the high-level math functions
  22. on the i80387 floating-point coprocessor.  All angle-related
  23. parameters and return values are expressed in radians.  Functions
  24. capable errors, will set errno upon an error. All functions
  25. included in this library whos names correspond to the ANSI C specification
  26. are, indeed, ANSI-compatable. In the spirit of ANSI, HUGE_VAL is now
  27. supported.
  28. WARNING
  29. This library works only if an i80387 coprocessor is in the system! 
  30. Attempts to use these routines with no coprocessor present 
  31. will result in illegal instruction traps.
  32. SEE ALSO:
  33. fppLib (1), floatLib (1), The C Programming Language - Second Edition
  34. INCLUDE FILE: math.h
  35. INTERNAL
  36. Each routine has the following format:
  37.     o calculate floating-point function using double parameter 
  38.     o store result to %st0 register
  39. */
  40. #define _ASMLANGUAGE
  41. #include "vxWorks.h"
  42. #include "asm.h"
  43. #include "fppLib.h"
  44. #include "errno.h"
  45. .data
  46. .globl FUNC(copyright_wind_river)
  47. .long FUNC(copyright_wind_river)
  48. /* externals */
  49. /* internals */
  50.         .globl  GTEXT(mathHardLog2)
  51.         .globl  GTEXT(mathHardLog10)
  52.         .globl  GTEXT(mathHardLog)
  53.         .globl  GTEXT(mathHardExp)
  54. .globl  GTEXT(mathHardAsin)
  55. .globl  GTEXT(mathHardAcos)
  56. .globl  GTEXT(mathHardAtan)
  57. .globl  GTEXT(mathHardAtan2)
  58.         .globl  GTEXT(mathHardTan)
  59.         .globl  GTEXT(mathHardCos)
  60.         .globl  GTEXT(mathHardSin)
  61.         .globl  GTEXT(mathHardPow)
  62.         .globl  GTEXT(mathHardSqrt)
  63.         .globl  GTEXT(mathHardFabs)
  64. .globl  GTEXT(mathHardFmod)
  65. .globl  GTEXT(mathHardFmodIeee)
  66. .globl  GTEXT(mathHardSincos)
  67. .globl  GTEXT(mathHardFloor)
  68. .globl  GTEXT(mathHardCeil)
  69. .globl  GTEXT(mathHardTrunc)
  70. .globl  GTEXT(mathHardRound)
  71. .globl  GTEXT(mathHardIround)
  72. .globl  GTEXT(mathHardIrint)
  73. .globl  GTEXT(mathHardInfinity)
  74.         .text
  75. .balign 16
  76. /*******************************************************************************
  77. *
  78. * mathHardAcos - ANSI-compatable hardware floating-point arc-cosine
  79. *
  80. * RETURNS: The arc-cosine in the range -pi/2 to pi/2 radians.
  81. *
  82. * double mathHardAcos (dblParam)
  83. *     double dblParam; /* angle in radians *
  84. *
  85. */
  86. FUNC_LABEL(mathHardAcos) /* acos(x) = pi/2 - atan(x/sqrt(1-x**2)) */
  87. pushl %ebp
  88. movl %esp,%ebp
  89. fldl DARG1(%ebp)
  90. fldl DARG1(%ebp)
  91. fmul %st,%st(1)
  92. fxch %st(1)
  93. fld1
  94. fsubp %st,%st(1)
  95. fsqrt
  96. fpatan
  97. fld1
  98. fld1
  99. faddp %st,%st(1)
  100. fldpi
  101. fdivp %st,%st(1)
  102. fsubp %st,%st(1)
  103. leave
  104. ret
  105. /*******************************************************************************
  106. *
  107. * mathHardAsin - ANSI-compatable hardware floating-point arc-sine
  108. *
  109. * RETURNS: The arc-sine in the range 0.0 to pi radians.
  110. * SEE ALSO: 
  111. * floatLib (1), "The C Programming Language - Second Edition"
  112. *
  113. * double mathHardAsin (dblParam)
  114. *     double dblParam; /* angle in radians *
  115. *
  116. */
  117. .balign 16,0x90
  118. FUNC_LABEL(mathHardAsin) /* asin(x) = atan(x/sqrt(1-x**2)) */
  119. pushl %ebp
  120. movl %esp,%ebp
  121. fldl DARG1(%ebp)
  122. fldl DARG1(%ebp)
  123. fmul %st,%st(1)
  124. fxch %st(1)
  125. fld1
  126. fsubp %st,%st(1)
  127. fsqrt
  128. fpatan
  129. leave
  130. ret
  131. /*******************************************************************************
  132. *
  133. * mathHardAtan - ANSI-compatable hardware floating-point arc-tangent
  134. *
  135. * RETURNS: The arc-tangent of dblParam in the range -pi/2 to pi/2.
  136. *
  137. * SEE ALSO: floatLib (1), acos (2), asin (2)
  138. *
  139. * double mathHardAtan (dblParam)
  140. *     double dblParam; /* angle in radians *
  141. *
  142. */
  143. .balign 16,0x90
  144. FUNC_LABEL(mathHardAtan)
  145. pushl %ebp
  146. movl %esp,%ebp
  147. fldl DARG1(%ebp)
  148. fld1
  149. fpatan
  150. leave
  151. ret
  152. /*******************************************************************************
  153. *
  154. * mathHardAtan2 - hardware floating point function for arctangent of (dblY/dblX)
  155. *
  156. * RETURNS:
  157. *    The arc-tangent of (dblY/dblX) in the range -pi to pi.
  158. *
  159. * SEE ALSO: 
  160. * floatLib (1), "The C Programming Language - Second Edition"
  161. *
  162. * double mathHardAtan2 (dblY, dblX)
  163. *     double dblY; /* Y *
  164. *     double dblX; /* X *
  165. *
  166. */
  167. .balign 16,0x90
  168. FUNC_LABEL(mathHardAtan2)
  169. pushl %ebp
  170. movl %esp,%ebp
  171. fldl DARG1(%ebp)
  172. fldl DARG2(%ebp)
  173. fpatan
  174. leave
  175. ret
  176.     
  177. /*******************************************************************************
  178. *
  179. * mathHardCos - ANSI-compatable hardware floating-point cosine
  180. *
  181. * RETURNS: the cosine of the radian argument dblParam
  182. *
  183. * SEE ALSO: 
  184. * floatLib (1), sin (2), cos (2), tan(2),
  185. * "The C Programming Language - Second Edition"
  186. *
  187. * double mathHardCos (dblParam)
  188. *     double dblParam; /* angle in radians *
  189. *
  190. */
  191. .balign 16,0x90
  192. FUNC_LABEL(mathHardCos)
  193. pushl %ebp
  194. movl %esp,%ebp
  195. fldl DARG1(%ebp)
  196. fcos
  197. fstl DARG1(%ebp)
  198. fwait
  199. movl DARG1+4(%ebp),%eax
  200. movl DARG1(%ebp),%edx
  201. leave
  202. ret
  203. /*******************************************************************************
  204. *
  205. * mathHardExp - hardware floating-point exponential function
  206. *
  207. * RETURNS:
  208. *    Floating-point inverse natural logarithm (e ** (dblExponent)).
  209. *
  210. * SEE ALSO: 
  211. * floatLib (1), "The C Programming Language - Second Edition"
  212. *
  213. * double mathHardExp (dblExponent)
  214. *     double dblExponent; /* argument *
  215. *
  216. */
  217. .balign 16,0x90
  218. powerOftwo:
  219. /* 2**z. 
  220.  * z1 is integer of z. z2 is fractal of z.
  221.  * if z2 is greater than 0.5, z2 -= 0.5, then
  222.  *     2**z = 2**(z1 + z2 + 0.5) = 2**(z1) * 2**(z2) * 2**(0.5)
  223.  * if z2 is less than 0.5, then
  224.  *     2**z = 2**(z1 + z2) = 2**(z1) * 2**(z2)
  225.  */
  226. pushl %ebp
  227. movl %esp,%ebp
  228. /* change the Round Control bits */
  229. subl $8,%esp
  230. fstcw -4(%ebp)
  231. fwait
  232. movw -4(%ebp),%ax
  233. andw $ FPCR_RC_MASK,%ax
  234. orw $ FPCR_RC_DOWN,%ax
  235. movw %ax,-8(%ebp)
  236. fldcw -8(%ebp)
  237. /* get z1(integer part of z) and z2(fractal part of z) */
  238. fld %st
  239. frndint
  240. fldcw -4(%ebp)
  241. fsub %st,%st(1)
  242. fxch %st(1)
  243. fchs
  244. /* get a value 0.5 */
  245. fld1
  246. fchs
  247. fld1
  248. fscale
  249. fxch %st(1)
  250. fstp %st
  251. /* get z2 % 0.5 */
  252. fxch %st(1)
  253. fprem
  254. fstsw %ax
  255. fstp %st(1)
  256. /* get A = 2**(z2) */
  257. f2xm1
  258. fld1
  259. faddp %st,%st(1)
  260. test $0x0200,%ax
  261. jz powerOftwo0
  262. /* get A = 2**(z2) * 2**(0.5) */
  263. fld1
  264. fadd %st,%st(0)
  265. fsqrt
  266. fmulp %st,%st(1)
  267. powerOftwo0:
  268. /* get 2**z = A * 2**(z1) */
  269. fscale
  270. fstp %st(1)
  271. addl $8,%esp
  272. leave
  273. ret
  274. .balign 16,0x90
  275. FUNC_LABEL(mathHardExp) /* e**y = 2**(y * log2(e)) */
  276. pushl %ebp
  277. movl %esp,%ebp
  278. fldl DARG1(%ebp)
  279. fldl2e
  280. fmulp %st,%st(1)
  281. call powerOftwo
  282. leave
  283. ret
  284. /*******************************************************************************
  285. *
  286. * mathHardFabs - ANSI-compatable hardware floating-point absolute value
  287. *
  288. * RETURNS: The floating-point absolute value of dblParam.
  289. *
  290. * SEE ALSO: 
  291. * floatLib (1), "The C Programming Language - Second Edition"
  292. *
  293. * double mathHardFabs (dblParam)
  294. *     double dblParam; /* argument *
  295. *
  296. */
  297. .balign 16,0x90
  298. FUNC_LABEL(mathHardFabs) 
  299. pushl %ebp
  300. movl %esp,%ebp
  301. fldl DARG1(%ebp)
  302. fabs
  303. leave
  304. ret
  305. /*******************************************************************************
  306. *
  307. * mathHardLog - ANSI-compatable hardware floating-point natural logarithm 
  308. *
  309. * RETURNS: The natural logarithm of dblParam.
  310. *
  311. * SEE ALSO: 
  312. * floatLib (1), "The C Programming Language - Second Edition"
  313. *
  314. * double mathHardLog (dblParam)
  315. *     double dblParam; /* argument *
  316. *
  317. */
  318. .balign 16,0x90
  319. FUNC_LABEL(mathHardLog) /* loge(x) = loge(2) * log2(x) */
  320. pushl %ebp
  321. movl %esp,%ebp
  322. fldln2 /* st0 = loge(2) */
  323. fldl DARG1(%ebp) /* st0 = x, st1 = loge(2) */
  324. fyl2x /* st0 = loge(2) * log2(x) */
  325. leave
  326. ret
  327. /*******************************************************************************
  328. *
  329. * mathHardLog10 - ANSI-compatable hardware floating-point base 10 logarithm
  330. *
  331. * RETURNS: The logarithm (base 10) of dblParam.
  332. *
  333. * SEE ALSO: floatLib (1), log2 (2)
  334. *
  335. * double mathHardLog10 (dblParam)
  336. *     double dblParam; /* argument *
  337. *
  338. */
  339. .balign 16,0x90
  340. FUNC_LABEL(mathHardLog10) /* log10(x) = log10(2) * log2(x) */
  341. pushl %ebp
  342. movl %esp,%ebp
  343. fldlg2 /* st0 = log10(2) */
  344. fldl DARG1(%ebp) /* st0 = x, st1 = log10(2) */
  345. fyl2x /* st0 = log10(2) * log2(x) */
  346. leave
  347. ret
  348. /*******************************************************************************
  349. *
  350. * mathHardLog2 - ANSI-compatable hardware floating-point logarithm base 2 
  351. *
  352. * RETURNS: The logarithm (base 2) of dblParam.
  353. *
  354. * SEE ALSO: floatLib (1), log10 (2)
  355. *
  356. * double mathHardLog2 (dblParam)
  357. *     double dblParam; /* argument *
  358. *
  359. */
  360. .balign 16,0x90
  361. FUNC_LABEL(mathHardLog2)
  362. pushl %ebp
  363. movl %esp,%ebp
  364. fld1
  365. fldl DARG1(%ebp)
  366. fyl2x
  367. leave
  368. ret
  369. /*******************************************************************************
  370. *
  371. * mathHardPow - ANSI-compatable hardware floating-point power function
  372. *
  373. * RETURNS: The floating-point value of dblX to the power of dblY.
  374. *
  375. * SEE ALSO: floatLib (1), sqrt (2)
  376. *
  377. * double mathHardPow (dblX, dblY)
  378. *     double dblX; /* X *
  379. *     double dblY; /* Y *
  380. *
  381. */
  382. .balign 16,0x90
  383. FUNC_LABEL(mathHardPow)  /* x**y = 2**(y * log2(x)) */
  384. pushl %ebp
  385. movl %esp,%ebp
  386. fldz
  387. fldl DARG1(%ebp)
  388. fcompp
  389. fstsw %ax
  390. sahf
  391. je powZeroX /* if (x == 0) */
  392. jb powNegX /* if (x < 0) */
  393. fldl DARG2(%ebp) /* x > 0 */
  394. fldl DARG1(%ebp) /* x**y = 2**(y * log2(x)) */
  395. fyl2x
  396. call powerOftwo
  397. jmp powExit
  398. powZeroX: /* x == 0 */
  399. fldz
  400. fldl DARG2(%ebp)
  401. fcompp
  402. fstsw %ax
  403. sahf
  404. ja powNan /* if (y > 0),  (0**y = 0) */
  405. je powOne /* if (y == 0), (0**0 = 1) */
  406. fldl mathHardInfinity0 /* if (y < 0),  (0**y = HUGE_VALUE */
  407. fldl2t
  408. fmulp %st, %st(1)
  409. call powerOftwo
  410. jmp powErrExit
  411. powOne:
  412. fld1
  413. jmp powErrExit
  414. powNan:
  415. fldz
  416. jmp powErrExit
  417. powNegX: /* x < 0 */
  418. fldl DARG2(%ebp)
  419. frndint
  420. fcompl DARG2(%ebp)
  421. fstsw %ax
  422. sahf
  423. jne powNan /* if (y != int(y)), (x**y = 0) */
  424. fldl DARG2(%ebp) /* x**y = 2**(y * log2(|x|)) */
  425. fldl DARG1(%ebp)
  426. fabs
  427. fyl2x
  428. call powerOftwo
  429. fld1 /* if ((y % 2) != 0)              */
  430. fld1 /*   x**y = -(%st)                */
  431. faddp /* else                           */
  432. fldl DARG2(%ebp)             /*   x**y = %st                   */
  433. fprem
  434. fldz
  435. fcompp
  436. fstsw %ax
  437. sahf
  438. je powExit0
  439. fcomp %st /* pop, fincstp + ffree might work */
  440. fchs /* x**y = -(%st) */
  441. jmp powExit
  442. powExit0:
  443. fcomp %st /* pop, fincstp + ffree might work */
  444. jmp powExit
  445. powErrExit:
  446. powExit:
  447. leave
  448. ret
  449. /*******************************************************************************
  450. *
  451. * mathHardSin - ANSI-compatable hardware floating-point sine
  452. *
  453. * RETURNS: The floating-point sine of dblParam.
  454. *
  455. * SEE ALSO: 
  456. *   floatLib (1), cos (2), tan (2), 
  457. *   "The C Programming Language - Second Edition"
  458. *
  459. * double mathHardSin (dblParam)
  460. *     double dblParam; /* angle in radians *
  461. *
  462. */
  463. .balign 16,0x90
  464. FUNC_LABEL(mathHardSin)
  465. pushl %ebp
  466. movl %esp,%ebp
  467. fldl DARG1(%ebp)
  468. fsin
  469. leave
  470. ret
  471. /*******************************************************************************
  472. *
  473. * mathHardSqrt - ANSI-compatable hardware floating-point square root
  474. *
  475. * RETURNS: The floating-point square root of dblParam.
  476. *
  477. * SEE ALSO: floatLib(1), pow (2)
  478. *
  479. * double mathHardSqrt (dblParam)
  480. *     double dblParam; /* argument *
  481. *
  482. */
  483. .balign 16,0x90
  484. FUNC_LABEL(mathHardSqrt)
  485. pushl %ebp
  486. movl %esp,%ebp
  487. fldl DARG1(%ebp)
  488. fsqrt
  489. leave
  490. ret
  491. /*******************************************************************************
  492. *
  493. * mathHardTan - ANSI-compatable hardware floating-point tangent
  494. *
  495. * RETURNS: Floating-point tangent of dblParam.
  496. *
  497. * SEE ALSO: floatLib (1), cos (2), sin (2),
  498. * "The C Programming Language - Second Edition"
  499. *
  500. * double mathHardTan (dblParam)
  501. *     double dblParam; /* angle in radians *
  502. *
  503. */
  504. .balign 16,0x90
  505. FUNC_LABEL(mathHardTan)
  506. pushl %ebp
  507. movl %esp,%ebp
  508. fldl DARG1(%ebp)
  509. fptan
  510. fstp %st
  511. leave
  512. ret
  513. /*******************************************************************************
  514. *
  515. * mathHardSincos - simultaneous hardware floating-point sine and cosine
  516. *
  517. * RETURNS:
  518. * The simultaeous floating point results of sine and cosine of the 
  519. * radian argument  The dblParam must be in range of -1.0 to +1.0.
  520. *
  521. * CAVEAT:
  522. * Supported for the HD648132 only.
  523. *
  524. * SEE ALSO: floatLib (1), "HD648132 Floating-Point User's Manual"
  525. *
  526. * void mathHardSincos (dblParam, sinResult, cosResult)
  527. *     double dblParam; /* angle in radians *
  528. *     double *sinResult; /* sine result buffer *
  529. *     double *cosResult; /* cosine result buffer *
  530. *
  531. */
  532. .balign 16,0x90
  533. FUNC_LABEL(mathHardSincos)
  534. pushl %ebp
  535. movl %esp,%ebp
  536. fldl DARG1(%ebp)
  537. fsincos
  538. movl DARG2L(%ebp),%eax
  539. fstpl (%eax)
  540. movl DARG2(%ebp),%edx
  541. fstpl (%edx)
  542. leave
  543. ret
  544. /*******************************************************************************
  545. *
  546. * mathHardFmod - ANSI-compatable hardware floating-point modulus (fprem)
  547. *
  548. * RETURNS: 
  549. * Floating-point modulus of (dblParam / dblDivisor) with the sign of dblParam.  
  550. *
  551. * SEE ALSO: 
  552. * floatLib (1), "The C Programming Language - Second Edition"
  553. *
  554. * double mathHardFmod (dblParam, dblDivisor)
  555. *     double dblParam; /* argument *
  556. *     double dblDivisor; /* divisor *
  557. *
  558. */
  559. .balign 16,0x90
  560. FUNC_LABEL(mathHardFmod)
  561. pushl %ebp
  562. movl %esp,%ebp
  563. fldl DARG2(%ebp)
  564. fldl DARG1(%ebp)
  565. reducePartial:
  566. fprem /* fprem for non IEEE */
  567. fstsw %ax /* put the FPU status word in AX */
  568. test $0x0400,%ax /* is there a partial remainder at ST(0) ? */
  569. jnz reducePartial
  570. fstp %st(1)
  571. leave
  572. ret
  573. /*******************************************************************************
  574. *
  575. * mathHardFmodIeee - ANSI-compatable hardware floating-point modulus (fprem1)
  576. *
  577. * RETURNS: 
  578. * Floating-point modulus of (dblParam / dblDivisor) with the sign of dblParam.  
  579. *
  580. * SEE ALSO: 
  581. * floatLib (1), "The C Programming Language - Second Edition"
  582. *
  583. * double mathHardFmodIeee (dblParam, dblDivisor)
  584. *     double dblParam; /* argument *
  585. *     double dblDivisor; /* divisor *
  586. *
  587. */
  588. .balign 16,0x90
  589. FUNC_LABEL(mathHardFmodIeee)
  590. pushl %ebp
  591. movl %esp,%ebp
  592. fldl DARG2(%ebp)
  593. fldl DARG1(%ebp)
  594. reducePartialIeee:
  595. fprem1 /* fprem1 for IEEE */
  596. fstsw %ax /* put the FPU status word in AX */
  597. test $0x0400,%ax /* is there a partial remainder at ST(0) ? */
  598. jnz reducePartialIeee
  599. fstp %st(1)
  600. leave
  601. ret
  602. /*******************************************************************************
  603. *
  604. * mathHardFloor - ANSI-compatable hardware floating-point floor
  605. *
  606. * Performs a 'round-to-negative-infinity'.
  607. *
  608. * RETURNS: 
  609. * The largest integral value less than or equal to dblParam,
  610. * result is returned in double precision.
  611. *
  612. * SEE ALSO: 
  613. * floatLib (1), "The C Programming Language - Second Edition"
  614. *
  615. *
  616. * double mathHardFloor (dblParam)
  617. *     double dblParam; /* argument *
  618. *
  619. */
  620. .balign 16,0x90
  621. FUNC_LABEL(mathHardFloor)
  622. pushl %ebp
  623. movl %esp,%ebp
  624. subl $8,%esp
  625. fstcw -4(%ebp)
  626. fwait
  627. movw -4(%ebp),%ax
  628. andw $ FPCR_RC_MASK,%ax
  629. orw $ FPCR_RC_DOWN,%ax
  630. movw %ax,-8(%ebp)
  631. fldcw -8(%ebp)
  632. fldl DARG1(%ebp)
  633. frndint
  634. fldcw -4(%ebp)
  635. addl $8,%esp
  636. leave
  637. ret
  638. /*******************************************************************************
  639. *
  640. * mathHardCeil - ANSI-compatable hardware floating-point ceiling
  641. *
  642. * Performs a 'round-to-positive-infinity'
  643. *
  644. * RETURNS: 
  645. * The least integral value greater than or equal to dblParam,
  646. * result is returned in double precision.
  647. *
  648. * SEE ALSO: 
  649. * floatLib (1), "The C Programming Language - Second Edition"
  650. *
  651. * double mathHardCeil (dblParam)
  652. *     double dblParam; /* argument *
  653. *
  654. */
  655. .balign 16,0x90
  656. FUNC_LABEL(mathHardCeil)
  657. pushl %ebp
  658. movl %esp,%ebp
  659. subl $8,%esp
  660. fstcw -4(%ebp)
  661. fwait
  662. movw -4(%ebp),%ax
  663. andw $ FPCR_RC_MASK,%ax
  664. orw $ FPCR_RC_UP,%ax
  665. movw %ax,-8(%ebp)
  666. fldcw -8(%ebp)
  667. fldl DARG1(%ebp)
  668. frndint
  669. fldcw -4(%ebp)
  670. addl $8,%esp
  671. leave
  672. ret
  673. /*******************************************************************************
  674. *
  675. * mathHardTrunc - hardware floating-point truncation
  676. *
  677. * Performs FINTRZ.
  678. *
  679. * RETURNS:
  680. * The integer portion of a double-precision number,
  681. * result is in double-precision.
  682. *
  683. * SEE ALSO: floatLib (1)
  684. *
  685. * double mathHardTrunc (dblParam)
  686. *     double dblParam; /* argument *
  687. *
  688. */
  689. .balign 16,0x90
  690. FUNC_LABEL(mathHardTrunc)
  691. pushl %ebp
  692. movl %esp,%ebp
  693. subl $8,%esp
  694. fstcw -4(%ebp)
  695. fwait
  696. movw -4(%ebp),%ax
  697. andw $ FPCR_RC_MASK,%ax
  698. orw $ FPCR_RC_ZERO,%ax
  699. movw %ax,-8(%ebp)
  700. fldcw -8(%ebp)
  701. fldl DARG1(%ebp)
  702. frndint
  703. fldcw -4(%ebp)
  704. addl $8,%esp
  705. leave
  706. ret
  707. /*******************************************************************************
  708. *
  709. * mathHardRound - hardware floating-point rounding
  710. *
  711. * Performs a 'round-to-nearest'.
  712. *
  713. * SEE ALSO: floatLib (1)
  714. *
  715. * double mathHardRound (dblParam)
  716. *     double dblParam; /* argument *
  717. *
  718. */
  719. .balign 16,0x90
  720. FUNC_LABEL(mathHardRound)
  721. pushl %ebp
  722. movl %esp,%ebp
  723. subl $8,%esp
  724. fstcw -4(%ebp)
  725. fwait
  726. movw -4(%ebp),%ax
  727. andw $ FPCR_RC_MASK,%ax
  728. orw $ FPCR_RC_NEAREST,%ax
  729. movw %ax,-8(%ebp)
  730. fldcw -8(%ebp)
  731. fldl DARG1(%ebp)
  732. frndint
  733. fldcw -4(%ebp)
  734. addl $8,%esp
  735. leave
  736. ret
  737. /*******************************************************************************
  738. *
  739. * mathHardIround - hardware floating-point rounding to nearest integer
  740. *
  741. * Performs a 'round-to-nearest' function.
  742. *
  743. * NOTE:
  744. * If dblParam is spaced evenly between two integers,
  745. * then the  even integer will be returned.
  746. *
  747. * int mathHardIround (dblParam)
  748. *     double dblParam; /* argument *
  749. *
  750. */
  751. .balign 16,0x90
  752. FUNC_LABEL(mathHardIround)
  753. pushl %ebp
  754. movl %esp,%ebp
  755. subl $8,%esp
  756. fstcw -4(%ebp)
  757. fwait
  758. movw -4(%ebp),%ax
  759. andw $0xf3ff,%ax
  760. orw $0x0,%ax
  761. movw %ax,-8(%ebp)
  762. fldcw -8(%ebp)
  763. fldl DARG1(%ebp)
  764. frndint
  765. fistpl DARG1(%ebp)
  766. fwait
  767. movl DARG1(%ebp),%eax
  768. fldcw -4(%ebp)
  769. addl $8,%esp
  770. leave
  771. ret
  772. /********************************************************************************
  773. * mathHardIrint - hardware floating-point double to integer conversion
  774. *
  775. * Convert dblParam to an integer using the selected IEEE
  776. * rounding direction.
  777. *
  778. * CAVEAT:
  779. * The rounding direction is not pre-selectable
  780. * and is fixed for 'round-to-the-nearest'.
  781. *
  782. * SEE ALSO: floatLib (1)
  783. * int mathHardIrint (dblParam)
  784. *     double dblParam; /* argument *
  785. *
  786. */
  787.  
  788. .balign 16,0x90
  789. FUNC_LABEL(mathHardIrint)
  790. pushl %ebp
  791. movl %esp,%ebp
  792. fldl DARG1(%ebp)
  793. frndint
  794. fistpl DARG1(%ebp)
  795. fwait
  796. movl DARG1(%ebp),%eax
  797. leave
  798. ret
  799. /********************************************************************************
  800. * mathHardInfinity - hardware floating-point return of a very large double
  801. *
  802. * SEE ALSO: floatLib(1)
  803. * double mathHardInfinity ()
  804. *
  805. */
  806.  
  807. .balign 16
  808. mathHardInfinity0:
  809. .double 0d4.09600000000000000000e+03
  810. .balign 16
  811. FUNC_LABEL(mathHardInfinity) /* 10**4096 = 2**(4096 * log2(10)) */
  812. pushl %ebp
  813. movl %esp,%ebp
  814. fldl mathHardInfinity0
  815. fldl2t
  816. fmulp %st,%st(1)
  817. call powerOftwo
  818. leave
  819. ret