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

VxWorks

开发平台:

C/C++

  1. /* l_stowtox.s - Motorola 68040 FP power-of-two routines (LIB) */
  2. /* Copyright 1991-1993 Wind River Systems, Inc. */
  3. .data
  4. .globl _copyright_wind_river
  5. .long _copyright_wind_river
  6. /*
  7. modification history
  8. --------------------
  9. 01e,21jul93,kdl  added .text (SPR #2372).
  10. 01d,23aug92,jcf  changed bxxx to jxx.
  11. 01c,26may92,rrr  the tree shuffle
  12. 01b,10jan92,kdl  added modification history; general cleanup.
  13. 01a,15aug91,kdl  original version, from Motorola FPSP v2.0.
  14. */
  15. /*
  16. DESCRIPTION
  17. stwotoxsa 3.1 12/10/90
  18. __l_stwotox  --- 2**X
  19. __l_stwotoxd --- 2**X for denormalized X
  20. __l_stentox  --- 10**X
  21. __l_stentoxd --- 10**X for denormalized X
  22. Input: Double-extended number X in location pointed to
  23. by address register a0.
  24. Output: The function values are returned in Fp0.
  25. Accuracy and Monotonicity: The returned result is within 2 ulps in
  26. 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
  27. result is subsequently rounded to double precision. The
  28. result is provably monotonic in double precision.
  29. Speed: The program __l_stwotox takes approximately 190 cycles and the
  30. program __l_stentox takes approximately 200 cycles.
  31. Algorithm:
  32. twotox
  33. 1. If |X| > 16480, go to ExpBig.
  34. 2. If |X| < 2**(-70), go to ExpSm.
  35. 3. Decompose X as X = N/64 + r where |r| <= 1/128. Furthermore
  36. decompose N as
  37.  N = 64(M + M') + j,  j = 0,1,2,...,63.
  38. 4. Overwrite r := r * log2. Then
  39. 2**X = 2**(M') * 2**(M) * 2**(j/64) * exp(r).
  40. Go to expr to compute that expression.
  41. tentox
  42. 1. If |X| > 16480*log_10(2) (base 10 log of 2), go to ExpBig.
  43. 2. If |X| < 2**(-70), go to ExpSm.
  44. 3. Set y := X*log_2(10)*64 (base 2 log of 10). Set
  45. N := round-to-int(y). Decompose N as
  46.  N = 64(M + M') + j,  j = 0,1,2,...,63.
  47. 4. Define r as
  48. r := ((X - N*L1)-N*L2) * L10
  49. where L1, L2 are the leading and trailing parts of log_10(2)/64
  50. and L10 is the natural log of 10. Then
  51. 10**X = 2**(M') * 2**(M) * 2**(j/64) * exp(r).
  52. Go to expr to compute that expression.
  53. expr
  54. 1. Fetch 2**(j/64) from table as Fact1 and Fact2.
  55. 2. Overwrite Fact1 and Fact2 by
  56. Fact1 := 2**(M) * Fact1
  57. Fact2 := 2**(M) * Fact2
  58. Thus Fact1 + Fact2 = 2**(M) * 2**(j/64).
  59. 3. Calculate P where 1 + P approximates exp(r):
  60. P = r + r*r*(A1+r*(A2+...+r*A5)).
  61. 4. Let AdjFact := 2**(M'). Return
  62. AdjFact * ( Fact1 + ((Fact1*P) + Fact2) ).
  63. Exit.
  64. ExpBig
  65. 1. Generate overflow by Huge * Huge if X > 0|  otherwise, generate
  66. underflow by Tiny * Tiny.
  67. ExpSm
  68. 1. Return 1 + X.
  69. Copyright (C) Motorola, Inc. 1990
  70. All Rights Reserved
  71. THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
  72. The copyright notice above does not evidence any
  73. actual or intended publication of such source code.
  74. STWOTOX idnt 2,1 Motorola 040 Floating Point Software Package
  75. section 8
  76. NOMANUAL
  77. */
  78. #include "fpsp040L.h"
  79. BOUNDS1: .long 0x3FB98000,0x400D80C0 |... 2^(-70),16480
  80. BOUNDS2: .long 0x3FB98000,0x400B9B07 |... 2^(-70),16480 LOG2/LOG10
  81. L2TEN64: .long 0x406A934F,0x0979A371 |... 64LOG10/LOG2
  82. L10TWO1: .long 0x3F734413,0x509F8000 |... LOG2/64LOG10
  83. L10TWO2: .long 0xBFCD0000,0xC0219DC1,0xDA994FD2,0x00000000
  84. LOG10: .long 0x40000000,0x935D8DDD,0xAAA8AC17,0x00000000
  85. LOG2: .long 0x3FFE0000,0xB17217F7,0xD1CF79AC,0x00000000
  86. EXPA5: .long 0x3F56C16D,0x6F7BD0B2
  87. EXPA4: .long 0x3F811112,0x302C712C
  88. EXPA3: .long 0x3FA55555,0x55554CC1
  89. EXPA2: .long 0x3FC55555,0x55554A54
  90. EXPA1: .long 0x3FE00000,0x00000000,0x00000000,0x00000000
  91. HUGE: .long 0x7FFE0000,0xFFFFFFFF,0xFFFFFFFF,0x00000000
  92. TINY: .long 0x00010000,0xFFFFFFFF,0xFFFFFFFF,0x00000000
  93. EXPTBL:
  94. .long  0x3FFF0000,0x80000000,0x00000000,0x3F738000
  95. .long  0x3FFF0000,0x8164D1F3,0xBC030773,0x3FBEF7CA
  96. .long  0x3FFF0000,0x82CD8698,0xAC2BA1D7,0x3FBDF8A9
  97. .long  0x3FFF0000,0x843A28C3,0xACDE4046,0x3FBCD7C9
  98. .long  0x3FFF0000,0x85AAC367,0xCC487B15,0xBFBDE8DA
  99. .long  0x3FFF0000,0x871F6196,0x9E8D1010,0x3FBDE85C
  100. .long  0x3FFF0000,0x88980E80,0x92DA8527,0x3FBEBBF1
  101. .long  0x3FFF0000,0x8A14D575,0x496EFD9A,0x3FBB80CA
  102. .long  0x3FFF0000,0x8B95C1E3,0xEA8BD6E7,0xBFBA8373
  103. .long  0x3FFF0000,0x8D1ADF5B,0x7E5BA9E6,0xBFBE9670
  104. .long  0x3FFF0000,0x8EA4398B,0x45CD53C0,0x3FBDB700
  105. .long  0x3FFF0000,0x9031DC43,0x1466B1DC,0x3FBEEEB0
  106. .long  0x3FFF0000,0x91C3D373,0xAB11C336,0x3FBBFD6D
  107. .long  0x3FFF0000,0x935A2B2F,0x13E6E92C,0xBFBDB319
  108. .long  0x3FFF0000,0x94F4EFA8,0xFEF70961,0x3FBDBA2B
  109. .long  0x3FFF0000,0x96942D37,0x20185A00,0x3FBE91D5
  110. .long  0x3FFF0000,0x9837F051,0x8DB8A96F,0x3FBE8D5A
  111. .long  0x3FFF0000,0x99E04593,0x20B7FA65,0xBFBCDE7B
  112. .long  0x3FFF0000,0x9B8D39B9,0xD54E5539,0xBFBEBAAF
  113. .long  0x3FFF0000,0x9D3ED9A7,0x2CFFB751,0xBFBD86DA
  114. .long  0x3FFF0000,0x9EF53260,0x91A111AE,0xBFBEBEDD
  115. .long  0x3FFF0000,0xA0B0510F,0xB9714FC2,0x3FBCC96E
  116. .long  0x3FFF0000,0xA2704303,0x0C496819,0xBFBEC90B
  117. .long  0x3FFF0000,0xA43515AE,0x09E6809E,0x3FBBD1DB
  118. .long  0x3FFF0000,0xA5FED6A9,0xB15138EA,0x3FBCE5EB
  119. .long  0x3FFF0000,0xA7CD93B4,0xE965356A,0xBFBEC274
  120. .long  0x3FFF0000,0xA9A15AB4,0xEA7C0EF8,0x3FBEA83C
  121. .long  0x3FFF0000,0xAB7A39B5,0xA93ED337,0x3FBECB00
  122. .long  0x3FFF0000,0xAD583EEA,0x42A14AC6,0x3FBE9301
  123. .long  0x3FFF0000,0xAF3B78AD,0x690A4375,0xBFBD8367
  124. .long  0x3FFF0000,0xB123F581,0xD2AC2590,0xBFBEF05F
  125. .long  0x3FFF0000,0xB311C412,0xA9112489,0x3FBDFB3C
  126. .long  0x3FFF0000,0xB504F333,0xF9DE6484,0x3FBEB2FB
  127. .long  0x3FFF0000,0xB6FD91E3,0x28D17791,0x3FBAE2CB
  128. .long  0x3FFF0000,0xB8FBAF47,0x62FB9EE9,0x3FBCDC3C
  129. .long  0x3FFF0000,0xBAFF5AB2,0x133E45FB,0x3FBEE9AA
  130. .long  0x3FFF0000,0xBD08A39F,0x580C36BF,0xBFBEAEFD
  131. .long  0x3FFF0000,0xBF1799B6,0x7A731083,0xBFBCBF51
  132. .long  0x3FFF0000,0xC12C4CCA,0x66709456,0x3FBEF88A
  133. .long  0x3FFF0000,0xC346CCDA,0x24976407,0x3FBD83B2
  134. .long  0x3FFF0000,0xC5672A11,0x5506DADD,0x3FBDF8AB
  135. .long  0x3FFF0000,0xC78D74C8,0xABB9B15D,0xBFBDFB17
  136. .long  0x3FFF0000,0xC9B9BD86,0x6E2F27A3,0xBFBEFE3C
  137. .long  0x3FFF0000,0xCBEC14FE,0xF2727C5D,0xBFBBB6F8
  138. .long  0x3FFF0000,0xCE248C15,0x1F8480E4,0xBFBCEE53
  139. .long  0x3FFF0000,0xD06333DA,0xEF2B2595,0xBFBDA4AE
  140. .long  0x3FFF0000,0xD2A81D91,0xF12AE45A,0x3FBC9124
  141. .long  0x3FFF0000,0xD4F35AAB,0xCFEDFA1F,0x3FBEB243
  142. .long  0x3FFF0000,0xD744FCCA,0xD69D6AF4,0x3FBDE69A
  143. .long  0x3FFF0000,0xD99D15C2,0x78AFD7B6,0xBFB8BC61
  144. .long  0x3FFF0000,0xDBFBB797,0xDAF23755,0x3FBDF610
  145. .long  0x3FFF0000,0xDE60F482,0x5E0E9124,0xBFBD8BE1
  146. .long  0x3FFF0000,0xE0CCDEEC,0x2A94E111,0x3FBACB12
  147. .long  0x3FFF0000,0xE33F8972,0xBE8A5A51,0x3FBB9BFE
  148. .long  0x3FFF0000,0xE5B906E7,0x7C8348A8,0x3FBCF2F4
  149. .long  0x3FFF0000,0xE8396A50,0x3C4BDC68,0x3FBEF22F
  150. .long  0x3FFF0000,0xEAC0C6E7,0xDD24392F,0xBFBDBF4A
  151. .long  0x3FFF0000,0xED4F301E,0xD9942B84,0x3FBEC01A
  152. .long  0x3FFF0000,0xEFE4B99B,0xDCDAF5CB,0x3FBE8CAC
  153. .long  0x3FFF0000,0xF281773C,0x59FFB13A,0xBFBCBB3F
  154. .long  0x3FFF0000,0xF5257D15,0x2486CC2C,0x3FBEF73A
  155. .long  0x3FFF0000,0xF7D0DF73,0x0AD13BB9,0xBFB8B795
  156. .long  0x3FFF0000,0xFA83B2DB,0x722A033A,0x3FBEF84B
  157. .long  0x3FFF0000,0xFD3E0C0C,0xF486C175,0xBFBEF581
  158. #define N L_SCR1
  159. #define X FP_SCR1
  160. #define XDCARE X+2
  161. #define XFRAC X+4
  162. #define ADJFACT FP_SCR2
  163. #define FACT1 FP_SCR3
  164. #define FACT1HI FACT1+4
  165. #define FACT1LOW  FACT1+8
  166. #define FACT2 FP_SCR4
  167. #define FACT2HI FACT2+4
  168. #define FACT2LOW  FACT2+8
  169. | xref __l_t_unfl
  170. | xref __l_t_ovfl
  171. | xref __l_t_frcinx
  172. .text
  173. .globl __l_stwotoxd
  174. __l_stwotoxd:
  175. |--ENTRY POINT FOR 2**(X) FOR DENORMALIZED ARGUMENT
  176. fmovel d1,fpcr /* set user's rounding mode/precision */
  177. .long 0xf23c4400,0x3f800000 /* fmoves  &0x3F800000,fp0 */
  178. movel a0@,d0
  179. orl #0x00800001,d0
  180. fadds d0,fp0
  181. jra  __l_t_frcinx
  182. .globl __l_stwotox
  183. __l_stwotox:
  184. /* |--ENTRY POINT FOR 2**(X), HERE X IS FINITE, NON-ZERO, AND NOT NAN'S */
  185. fmovemx a0@,fp0-fp0 /* |...lOAD INPUT, do not set cc's */
  186. movel A0@,d0
  187. movew A0@(4),d0
  188. fmovex fp0,a6@(X)
  189. andil #0x7FFFFFFF,d0
  190. cmpil #0x3FB98000,d0 |...|X| >= 2**(-70)?
  191. jge  TWOOK1
  192. jra  EXPBORS
  193. TWOOK1:
  194. cmpil #0x400D80C0,d0 |...|X| > 16480?
  195. jle  TWOMAIN
  196. jra  EXPBORS
  197. TWOMAIN:
  198. |--USUAL CASE, 2^(-70) <= |X| <= 16480
  199. fmovex fp0,fp1
  200. .long 0xf23c44a3,0x42800000 /* fmuls  &0x42800000,fp1 */
  201. fmovel fp1,a6@(N) |...N = ROUND-TO-INT(64 X)
  202. movel d2,a7@-
  203. lea EXPTBL,a1  |...lOAD ADDRESS OF TABLE OF 2^(J/64)
  204. fmovel a6@(N),fp1 |...N --> FLOATING FMT
  205. movel a6@(N),d0
  206. movel d0,d2
  207. andil #0x3F,d0 |...D0 IS J
  208. asll #4,d0 |...DISPLACEMENT FOR 2^(J/64)
  209. addal d0,a1 |...ADDRESS FOR 2^(J/64)
  210. asrl #6,d2 |...d2 IS L, N = 64L + J
  211. movel d2,d0
  212. asrl #1,d0 |...D0 IS M
  213. subl d0,d2 /* |...d2 IS M', N = 64(M+M') + J */
  214. addil #0x3FFF,d2
  215. movew d2,a6@(ADJFACT) /* |...ADJFACT IS 2^(M') */
  216. movel a7@+,d2
  217. |--SUMMARY: a1 IS ADDRESS FOR THE LEADING PORTION OF 2^(J/64),
  218. /* |--D0 IS M WHERE N = 64(M+M') + J. NOTE THAT |M| <= 16140 BY DESIGN. */
  219. /* |--ADJFACT = 2^(M'). */
  220. |--REGISTERS SAVED SO FAR ARE (IN ORDER) fpcr, D0, FP1, a1, AND FP2.
  221. .long 0xf23c44a3,0x3c800000 /* fmuls  &0x3C800000,fp1 */
  222. movel a1@+,a6@(FACT1)
  223. movel a1@+,a6@(FACT1HI)
  224. movel a1@+,a6@(FACT1LOW)
  225. movew a1@+,a6@(FACT2)
  226. clrw a6@(FACT2+2)
  227. fsubx fp1,fp0   |...X - (1/64)*INT(64 X)
  228. movew a1@+,a6@(FACT2HI)
  229. clrw a6@(FACT2HI+2)
  230. clrl a6@(FACT2LOW)
  231. addw d0,a6@(FACT1)
  232. fmulx LOG2,fp0 |...FP0 IS R
  233. addw d0,a6@(FACT2)
  234. jra  expr
  235. EXPBORS:
  236. |--fpcr, D0 SAVED
  237. cmpil #0x3FFF8000,d0
  238. jgt  EXPBIG
  239. EXPSM:
  240. |--|X| IS SMALL, RETURN 1 + X
  241. fmovel d1,fpcr | restore users exceptions
  242. .long 0xf23c4422,0x3f800000 /* fadds  &0x3F800000,fp0 */
  243. jra  __l_t_frcinx
  244. EXPBIG:
  245. |--|X| IS LARGE, GENERATE OVERFLOW IF X > 0|  ELSE GENERATE UNDERFLOW
  246. |--REGISTERS SAVE SO FAR ARE fpcr AND  D0
  247. movel a6@(X),d0
  248. cmpil #0,d0
  249. jlt  EXPNEG
  250. bclr #7,a0@ | t_ovfl expects positive value
  251. jra  __l_t_ovfl
  252. EXPNEG:
  253. bclr #7,a0@ | t_unfl expects positive value
  254. jra  __l_t_unfl
  255. .globl __l_stentoxd
  256. __l_stentoxd:
  257. |--ENTRY POINT FOR 10**(X) FOR DENORMALIZED ARGUMENT
  258. fmovel d1,fpcr /* set user's rounding mode/precision */
  259. .long 0xf23c4400,0x3f800000 /* fmoves  &0x3F800000,fp0 */
  260. movel a0@,d0
  261. orl #0x00800001,d0
  262. fadds d0,fp0
  263. jra  __l_t_frcinx
  264. .globl __l_stentox
  265. __l_stentox:
  266. /* |--ENTRY POINT FOR 10**(X), HERE X IS FINITE, NON-ZERO, AND NOT NAN'S */
  267. fmovemx a0@,fp0-fp0 /* |...lOAD INPUT, do not set cc's */
  268. movel A0@,d0
  269. movew A0@(4),d0
  270. fmovex fp0,a6@(X)
  271. andil #0x7FFFFFFF,d0
  272. cmpil #0x3FB98000,d0 |...|X| >= 2**(-70)?
  273. jge  TENOK1
  274. jra  EXPBORS
  275. TENOK1:
  276. cmpil #0x400B9B07,d0 |...|X| <= 16480*log2/log10 ?
  277. jle  TENMAIN
  278. jra  EXPBORS
  279. TENMAIN:
  280. |--USUAL CASE, 2^(-70) <= |X| <= 16480 LOG 2 / LOG 10
  281. fmovex fp0,fp1
  282. fmuld L2TEN64,fp1 |...X*64*LOG10/LOG2
  283. fmovel fp1,a6@(N) |...N=INT(X*64*LOG10/LOG2)
  284. movel d2,a7@-
  285. lea EXPTBL,a1  |...LOAD ADDRESS OF TABLE OF 2^(J/64)
  286. fmovel a6@(N),fp1 |...N --> FLOATING FMT
  287. movel a6@(N),d0
  288. movel d0,d2
  289. andil #0x3F,d0 |...D0 IS J
  290. asll #4,d0 |...DISPLACEMENT FOR 2^(J/64)
  291. addal d0,a1 |...ADDRESS FOR 2^(J/64)
  292. asrl #6,d2 |...d2 IS L, N = 64L + J
  293. movel d2,d0
  294. asrl #1,d0 |...D0 IS M
  295. subl d0,d2 /* |...d2 IS M', N = 64(M+M') + J */
  296. addil #0x3FFF,d2
  297. movew d2,a6@(ADJFACT) /* |...ADJFACT IS 2^(M') */
  298. movel a7@+,d2
  299. |--SUMMARY: a1 IS ADDRESS FOR THE LEADING PORTION OF 2^(J/64),
  300. /* |--D0 IS M WHERE N = 64(M+M') + J. NOTE THAT |M| <= 16140 BY DESIGN. */
  301. /* |--ADJFACT = 2^(M'). */
  302. |--REGISTERS SAVED SO FAR ARE (IN ORDER) fpcr, D0, FP1, a1, AND FP2.
  303. fmovex fp1,fp2
  304. fmuld L10TWO1,fp1 |...N*(LOG2/64LOG10)_LEAD
  305. movel a1@+,a6@(FACT1)
  306. fmulx L10TWO2,fp2 |...N*(LOG2/64LOG10)_TRAIL
  307. movel a1@+,a6@(FACT1HI)
  308. movel a1@+,a6@(FACT1LOW)
  309. fsubx fp1,fp0 |...X - N L_LEAD
  310. movew a1@+,a6@(FACT2)
  311. fsubx fp2,fp0 |...X - N L_TRAIL
  312. clrw a6@(FACT2+2)
  313. movew a1@+,a6@(FACT2HI)
  314. clrw a6@(FACT2HI+2)
  315. clrl a6@(FACT2LOW)
  316. fmulx LOG10,fp0 |...FP0 IS R
  317. addw d0,a6@(FACT1)
  318. addw d0,a6@(FACT2)
  319. expr:
  320. |--fpcr, FP2, FP3 ARE SAVED IN ORDER AS SHOWN.
  321. /* |--ADJFACT CONTAINS 2**(M'), FACT1 + FACT2 = 2**(M) * 2**(J/64). */
  322. |--FP0 IS R. THE FOLLOWING CODE COMPUTES
  323. /* |-- 2**(M'+M) * 2**(J/64) * EXP(R) */
  324. fmovex fp0,fp1
  325. fmulx fp1,fp1 |...FP1 IS S = R*R
  326. fmoved EXPA5,fp2 |...FP2 IS a5
  327. fmoved EXPA4,fp3 |...FP3 IS a4
  328. fmulx fp1,fp2 |...FP2 IS S*A5
  329. fmulx fp1,fp3 |...FP3 IS S*A4
  330. faddd EXPA3,fp2 |...FP2 IS a3+S*A5
  331. faddd EXPA2,fp3 |...FP3 IS a2+S*A4
  332. fmulx fp1,fp2 |...FP2 IS S*(A3+S*A5)
  333. fmulx fp1,fp3 |...FP3 IS S*(A2+S*A4)
  334. faddd EXPA1,fp2 |...FP2 IS a1+S*(A3+S*A5)
  335. fmulx fp0,fp3 |...FP3 IS R*S*(A2+S*A4)
  336. fmulx fp1,fp2 |...FP2 IS S*(A1+S*(A3+S*A5))
  337. faddx fp3,fp0 |...FP0 IS R+R*S*(A2+S*A4)
  338. faddx fp2,fp0 |...FP0 IS EXP(R) - 1
  339. |--FINAL RECONSTRUCTION PROCESS
  340. |--EXP(X) = 2^M*2^(J/64) + 2^M*2^(J/64)*(EXP(R)-1)  -  (1 OR 0)
  341. fmulx a6@(FACT1),fp0
  342. faddx a6@(FACT2),fp0
  343. faddx a6@(FACT1),fp0
  344. fmovel d1,fpcr | restore users exceptions
  345. clrw a6@(ADJFACT+2)
  346. movel #0x80000000,a6@(ADJFACT+4)
  347. clrl a6@(ADJFACT+8)
  348. fmulx a6@(ADJFACT),fp0 |...FINAL ADJUSTMENT
  349. jra  __l_t_frcinx
  350. | end