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

VxWorks

开发平台:

C/C++

  1. /* l_slog2.s - Motorola 68040 FP log base-10 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. slog2sa 3.1 12/10/90
  18.        The entry point __l_slog10 computes the base-10
  19. logarithm of an input argument X.
  20. __l_slog10d does the same except the input value is a
  21. denormalized number.
  22. sLog2 and sLog2d are the base-2 analogues.
  23.        INPUT: Double-extended value in memory location pointed to
  24. by address register a0.
  25.        OUTPUT: log_10(X) or log_2(X) returned in floating-point
  26. register fp0.
  27.        ACCURACY and MONOTONICITY: The returned result is within 1.7
  28. ulps in 64 significant bit, i.e. within 0.5003 ulp
  29. to 53 bits if the result is subsequently rounded
  30. to double precision. The result is provably monotonic
  31. in double precision.
  32.        SPEED: Two timings are measured, both in the copy-back mode.
  33. The first one is measured when the function is invoked
  34. the first time (so the instructions and data are not
  35. in cache), and the second one is measured when the
  36. function is reinvoked at the same input argument.
  37.        ALGORITHM and IMPLEMENTATION NOTES:
  38.        __l_slog10d:
  39.        Step 0.   If X < 0, create a NaN and raise the invalid operation
  40.                  flag. Otherwise, save fpcr in D1|  set FpCR to default.
  41.        Notes:    Default means round-to-nearest mode, no floating-point
  42.                  traps, and precision control = double extended.
  43.        Step 1.   Call __l_slognd to obtain Y = log(X), the natural log of X.
  44.        Notes:    Even if X is denormalized, log(X) is always normalized.
  45.        Step 2.   Compute log_10(X) = log(X) * (1/log(10)).
  46.             2.1  Restore the user fpcr
  47.             2.2  Return ans := Y * INV_L10.
  48.        __l_slog10:
  49.        Step 0.   If X < 0, create a NaN and raise the invalid operation
  50.                  flag. Otherwise, save fpcr in D1|  set FpCR to default.
  51.        Notes:    Default means round-to-nearest mode, no floating-point
  52.                  traps, and precision control = double extended.
  53.        Step 1.   Call sLogN to obtain Y = log(X), the natural log of X.
  54.        Step 2.   Compute log_10(X) = log(X) * (1/log(10)).
  55.             2.1  Restore the user fpcr
  56.             2.2  Return ans := Y * INV_L10.
  57.        sLog2d:
  58.        Step 0.   If X < 0, create a NaN and raise the invalid operation
  59.                  flag. Otherwise, save fpcr in D1|  set FpCR to default.
  60.        Notes:    Default means round-to-nearest mode, no floating-point
  61.                  traps, and precision control = double extended.
  62.        Step 1.   Call __l_slognd to obtain Y = log(X), the natural log of X.
  63.        Notes:    Even if X is denormalized, log(X) is always normalized.
  64.        Step 2.   Compute log_10(X) = log(X) * (1/log(2)).
  65.             2.1  Restore the user fpcr
  66.             2.2  Return ans := Y * INV_L2.
  67.        sLog2:
  68.        Step 0.   If X < 0, create a NaN and raise the invalid operation
  69.                  flag. Otherwise, save fpcr in D1|  set FpCR to default.
  70.        Notes:    Default means round-to-nearest mode, no floating-point
  71.                  traps, and precision control = double extended.
  72.        Step 1.   If X is not an integer power of two, i.e., X != 2^k,
  73.                  go to Step 3.
  74.        Step 2.   Return k.
  75.             2.1  Get integer k, X = 2^k.
  76.             2.2  Restore the user fpcr.
  77.             2.3  Return ans := convert-to-double-extended(k).
  78.        Step 3.   Call sLogN to obtain Y = log(X), the natural log of X.
  79.        Step 4.   Compute log_2(X) = log(X) * (1/log(2)).
  80.             4.1  Restore the user fpcr
  81.             4.2  Return ans := Y * INV_L2.
  82. Copyright (C) Motorola, Inc. 1990
  83. All Rights Reserved
  84. THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
  85. The copyright notice above does not evidence any
  86. actual or intended publication of such source code.
  87. SLOG2    idnt    2,1 Motorola 040 Floating Point Software Package
  88. section 8
  89. NOMANUAL
  90. */
  91. | xref __l_t_frcinx
  92. | xref __l_t_operr
  93. | xref __l_slogn
  94. | xref __l_slognd
  95. INV_L10:  .long 0x3FFD0000,0xDE5BD8A9,0x37287195,0x00000000
  96. INV_L2:   .long 0x3FFF0000,0xB8AA3B29,0x5C17F0BC,0x00000000
  97. .text
  98. .globl __l_slog10d
  99. __l_slog10d:
  100. |--entry point for Log10(X), X is denormalized
  101. movel a0@,d0
  102. jlt  invalid
  103. movel d1,a7@-
  104. clrl d1
  105. bsrl __l_slognd |...log(X), X denorm.
  106. fmovel a7@+,fpcr
  107. fmulx INV_L10,fp0
  108. jra  __l_t_frcinx
  109. .globl __l_slog10
  110. __l_slog10:
  111. |--entry point for Log10(X), X is normalized
  112. movel a0@,d0
  113. jlt  invalid
  114. movel d1,a7@-
  115. clrl d1
  116. bsrl __l_slogn |...log(X), X normal.
  117. fmovel a7@+,fpcr
  118. fmulx INV_L10,fp0
  119. jra  __l_t_frcinx
  120. .globl __l_slog2d
  121. __l_slog2d:
  122. |--entry point for Log2(X), X is denormalized
  123. movel a0@,d0
  124. jlt  invalid
  125. movel d1,a7@-
  126. clrl d1
  127. bsrl __l_slognd |...log(X), X denorm.
  128. fmovel a7@+,fpcr
  129. fmulx INV_L2,fp0
  130. jra  __l_t_frcinx
  131. .globl __l_slog2
  132. __l_slog2:
  133. |--entry point for Log2(X), X is normalized
  134. movel a0@,d0
  135. jlt  invalid
  136. movel a0@(8),d0
  137. jne  continue |...X is not 2^k
  138. movel a0@(4),d0
  139. andl #0x7FFFFFFF,d0
  140. tstl d0
  141. jne  continue
  142. |--X = 2^k.
  143. movew a0@,d0
  144. andl #0x00007FFF,d0
  145. subl #0x3FFF,d0
  146. fmovel d1,fpcr
  147. fmovel d0,fp0
  148. jra  __l_t_frcinx
  149. continue:
  150. movel d1,a7@-
  151. clrl d1
  152. bsrl __l_slogn |...log(X), X normal.
  153. fmovel a7@+,fpcr
  154. fmulx INV_L2,fp0
  155. jra  __l_t_frcinx
  156. invalid:
  157. jra  __l_t_operr
  158. | end