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

嵌入式Linux

开发平台:

Unix_Linux

  1. |
  2. | smovecr.sa 3.1 12/10/90
  3. |
  4. | The entry point sMOVECR returns the constant at the
  5. | offset given in the instruction field.
  6. |
  7. | Input: An offset in the instruction word.
  8. |
  9. | Output: The constant rounded to the user's rounding
  10. | mode unchecked for overflow.
  11. |
  12. | Modified: fp0.
  13. |
  14. |
  15. | Copyright (C) Motorola, Inc. 1990
  16. | All Rights Reserved
  17. |
  18. | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA 
  19. | The copyright notice above does not evidence any  
  20. | actual or intended publication of such source code.
  21. |SMOVECR idnt 2,1 | Motorola 040 Floating Point Software Package
  22. |section 8
  23. .include "fpsp.h"
  24. |xref nrm_set
  25. |xref round
  26. |xref PIRN
  27. |xref PIRZRM
  28. |xref PIRP
  29. |xref SMALRN
  30. |xref SMALRZRM
  31. |xref SMALRP
  32. |xref BIGRN
  33. |xref BIGRZRM
  34. |xref BIGRP
  35. FZERO: .long 00000000
  36. |
  37. | FMOVECR 
  38. |
  39. .global smovcr
  40. smovcr:
  41. bfextu CMDREG1B(%a6){#9:#7},%d0 |get offset
  42. bfextu USER_FPCR(%a6){#26:#2},%d1 |get rmode
  43. |
  44. | check range of offset
  45. |
  46. tstb %d0 |if zero, offset is to pi
  47. beqs PI_TBL |it is pi
  48. cmpib #0x0a,%d0 |check range $01 - $0a
  49. bles Z_VAL |if in this range, return zero
  50. cmpib #0x0e,%d0 |check range $0b - $0e
  51. bles SM_TBL |valid constants in this range
  52. cmpib #0x2f,%d0 |check range $10 - $2f
  53. bles Z_VAL |if in this range, return zero 
  54. cmpib #0x3f,%d0 |check range $30 - $3f
  55. ble   BG_TBL |valid constants in this range
  56. Z_VAL:
  57. fmoves FZERO,%fp0
  58. rts
  59. PI_TBL:
  60. tstb %d1 |offset is zero, check for rmode
  61. beqs PI_RN |if zero, rn mode
  62. cmpib #0x3,%d1 |check for rp
  63. beqs PI_RP |if 3, rp mode
  64. PI_RZRM:
  65. leal PIRZRM,%a0 |rmode is rz or rm, load PIRZRM in a0
  66. bra set_finx
  67. PI_RN:
  68. leal PIRN,%a0 |rmode is rn, load PIRN in a0
  69. bra set_finx
  70. PI_RP:
  71. leal PIRP,%a0 |rmode is rp, load PIRP in a0
  72. bra set_finx
  73. SM_TBL:
  74. subil #0xb,%d0 |make offset in 0 - 4 range
  75. tstb %d1 |check for rmode
  76. beqs SM_RN |if zero, rn mode
  77. cmpib #0x3,%d1 |check for rp
  78. beqs SM_RP |if 3, rp mode
  79. SM_RZRM:
  80. leal SMALRZRM,%a0 |rmode is rz or rm, load SMRZRM in a0
  81. cmpib #0x2,%d0 |check if result is inex
  82. ble set_finx |if 0 - 2, it is inexact
  83. bra no_finx |if 3, it is exact
  84. SM_RN:
  85. leal SMALRN,%a0 |rmode is rn, load SMRN in a0
  86. cmpib #0x2,%d0 |check if result is inex
  87. ble set_finx |if 0 - 2, it is inexact
  88. bra no_finx |if 3, it is exact
  89. SM_RP:
  90. leal SMALRP,%a0 |rmode is rp, load SMRP in a0
  91. cmpib #0x2,%d0 |check if result is inex
  92. ble set_finx |if 0 - 2, it is inexact
  93. bra no_finx |if 3, it is exact
  94. BG_TBL:
  95. subil #0x30,%d0 |make offset in 0 - f range
  96. tstb %d1 |check for rmode
  97. beqs BG_RN |if zero, rn mode
  98. cmpib #0x3,%d1 |check for rp
  99. beqs BG_RP |if 3, rp mode
  100. BG_RZRM:
  101. leal BIGRZRM,%a0 |rmode is rz or rm, load BGRZRM in a0
  102. cmpib #0x1,%d0 |check if result is inex
  103. ble set_finx |if 0 - 1, it is inexact
  104. cmpib #0x7,%d0 |second check
  105. ble no_finx |if 0 - 7, it is exact
  106. bra set_finx |if 8 - f, it is inexact
  107. BG_RN:
  108. leal BIGRN,%a0 |rmode is rn, load BGRN in a0
  109. cmpib #0x1,%d0 |check if result is inex
  110. ble set_finx |if 0 - 1, it is inexact
  111. cmpib #0x7,%d0 |second check
  112. ble no_finx |if 0 - 7, it is exact
  113. bra set_finx |if 8 - f, it is inexact
  114. BG_RP:
  115. leal BIGRP,%a0 |rmode is rp, load SMRP in a0
  116. cmpib #0x1,%d0 |check if result is inex
  117. ble set_finx |if 0 - 1, it is inexact
  118. cmpib #0x7,%d0 |second check
  119. ble no_finx |if 0 - 7, it is exact
  120. | bra set_finx ;if 8 - f, it is inexact
  121. set_finx:
  122. orl #inx2a_mask,USER_FPSR(%a6) |set inex2/ainex
  123. no_finx:
  124. mulul #12,%d0 |use offset to point into tables
  125. movel %d1,L_SCR1(%a6) |load mode for round call
  126. bfextu USER_FPCR(%a6){#24:#2},%d1 |get precision
  127. tstl %d1 |check if extended precision
  128. |
  129. | Precision is extended
  130. |
  131. bnes not_ext |if extended, do not call round
  132. fmovemx (%a0,%d0),%fp0-%fp0 |return result in fp0
  133. rts
  134. |
  135. | Precision is single or double
  136. |
  137. not_ext:
  138. swap %d1 |rnd prec in upper word of d1
  139. addl L_SCR1(%a6),%d1 |merge rmode in low word of d1
  140. movel (%a0,%d0),FP_SCR1(%a6) |load first word to temp storage
  141. movel 4(%a0,%d0),FP_SCR1+4(%a6) |load second word
  142. movel 8(%a0,%d0),FP_SCR1+8(%a6) |load third word
  143. clrl %d0 |clear g,r,s
  144. lea FP_SCR1(%a6),%a0
  145. btstb #sign_bit,LOCAL_EX(%a0)
  146. sne LOCAL_SGN(%a0) |convert to internal ext. format
  147. bsr round |go round the mantissa
  148. bfclr LOCAL_SGN(%a0){#0:#8} |convert back to IEEE ext format
  149. beqs fin_fcr
  150. bsetb #sign_bit,LOCAL_EX(%a0)
  151. fin_fcr:
  152. fmovemx (%a0),%fp0-%fp0
  153. rts
  154. |end