stwotox.S
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:12k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

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