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

VxWorks

开发平台:

C/C++

  1. /* binstr.s - Motorola 68040 FP binary/BCD routines (EXC) */
  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. binstrsa 3.3 12/19/90
  18. Description: Converts a 64-bit binary integer to bcd.
  19. Input: 64-bit binary integer in d2:d3, desired length (LEN) in
  20.           d0, and a  pointer to start in memory for bcd characters
  21.           in d0. (This pointer must point to byte 4 of the first
  22.           lword of the packed decimal memory string.)
  23. Output: LEN bcd digits representing the 64-bit integer.
  24. Algorithm:
  25. The 64-bit binary is assumed to have a decimal point before
  26. bit 63.  The fraction is multiplied by 10 using a mul by 2
  27. shift and a mul by 8 shift.  The bits shifted out of the
  28. msb form a decimal digit.  This process is iterated until
  29. LEN digits are formed.
  30. A1. Init d7 to 1.  D7 is the byte digit counter, and if 1, the
  31. digit formed will be assumed the least significant.  This is
  32. to force the first byte formed to have a 0 in the upper 4 bits.
  33. A2. Beginning of the loop:
  34. Copy the fraction in d2:d3 to d4:d5.
  35. A3. Multiply the fraction in d2:d3 by 8 using bit-field
  36. extracts and shifts.  The three msbs from d2 will go into
  37. d1.
  38. A4. Multiply the fraction in d4:d5 by 2 using shifts.  The msb
  39. will be collected by the carry.
  40. A5. Add using the carry the 64-bit quantities in d2:d3 and d4:d5
  41. into d2:d3.  D1 will contain the bcd digit formed.
  42. A6. Test d7.  If zero, the digit formed is the ms digit.  If non-
  43. zero, it is the ls digit.  Put the digit in its place in the
  44. upper word of d0.  If it is the ls digit, write the word
  45. from d0 to memory.
  46. A7. Decrement d6 (LEN counter) and repeat the loop until zero.
  47. Implementation Notes:
  48. The registers are used as follows:
  49. d0: LEN counter
  50. d1: temp used to form the digit
  51. d2: upper 32-bits of fraction for mul by 8
  52. d3: lower 32-bits of fraction for mul by 8
  53. d4: upper 32-bits of fraction for mul by 2
  54. d5: lower 32-bits of fraction for mul by 2
  55. d6: temp for bit-field extracts
  56. d7: byte digit formation word| digit count {0,1}
  57. a0: pointer into memory for packed bcd string formation
  58. Copyright (C) Motorola, Inc. 1990
  59. All Rights Reserved
  60. THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
  61. The copyright notice above does not evidence any
  62. actual or intended publication of such source code.
  63. BINSTR    idnt    2,1 Motorola 040 Floating Point Software Package
  64. section 8
  65. NOMANUAL
  66. */
  67. #include "fpsp040E.h"
  68. .globl __x_binstr
  69. .text
  70. __x_binstr:
  71. moveml d0-d7,a7@-
  72. |
  73. | A1: Init d7
  74. |
  75. moveql #1,d7 | init d7 for second digit
  76. subql #1,d0 | for dbf d0 would have LEN+1 passes
  77. |
  78. | A2. Copy d2:d3 to d4:d5.  Start loop.
  79. |
  80. loop:
  81. movel d2,d4 | copy the fraction before muls
  82. movel d3,d5 | to d4:d5
  83. |
  84. | A3. Multiply d2:d3 by 8|  extract msbs into d1.
  85. |
  86. bfextu d2{#0:#3},d1 | copy 3 msbs of d2 into d1
  87. asll #3,d2 | shift d2 left by 3 places
  88. bfextu d3{#0:#3},d6 | copy 3 msbs of d3 into d6
  89. asll #3,d3 | shift d3 left by 3 places
  90. orl d6,d2 | or in msbs from d3 into d2
  91. |
  92. | A4. Multiply d4:d5 by 2|  add carry out to d1.
  93. |
  94. asll #1,d5 | mul d5 by 2
  95. roxll #1,d4 | mul d4 by 2
  96. swap d6 | put 0 in d6 lower word
  97. addxw d6,d1 | add in extend from mul by 2
  98. |
  99. | A5. Add mul by 8 to mul by 2.  D1 contains the digit formed.
  100. |
  101. addl d5,d3 | add lower 32 bits
  102. nop | ERRATA FIX #13 (Rev. 1.2 6/6/90)
  103. addxl d4,d2 | add with extend upper 32 bits
  104. nop | ERRATA FIX #13 (Rev. 1.2 6/6/90)
  105. addxw d6,d1 | add in extend from add to d1
  106. swap d6 | with d6 = 0|  put 0 in upper word
  107. |
  108. | A6. Test d7 and branch.
  109. |
  110. tstw d7 | if zero, store digit # to loop
  111. jeq  first_d | if non-zero, form byte # write
  112. sec_d:
  113. swap d7 | bring first digit to word d7b
  114. aslw #4,d7 | first digit in upper 4 bits d7b
  115. addw d1,d7 | add in ls digit to d7b
  116. moveb d7,a0@+ | store d7b byte in memory
  117. swap d7 | put LEN counter in word d7a
  118. clrw d7 | set d7a to signal no digits done
  119. dbf d0,loop | do loop some more!
  120. jra  end_bstr | finished, so exit
  121. first_d:
  122. swap d7 | put digit word in d7b
  123. movew d1,d7 | put new digit in d7b
  124. swap d7 | put LEN counter in word d7a
  125. addqw #1,d7 | set d7a to signal first digit done
  126. dbf d0,loop | do loop some more!
  127. swap d7 | put last digit in string
  128. lslw #4,d7 | move it to upper 4 bits
  129. moveb d7,a0@+ | store it in memory string
  130. |
  131. | Clean up and return with result in fp0.
  132. |
  133. end_bstr:
  134. moveml a7@+,d0-d7
  135. rts
  136. | end