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

VxWorks

开发平台:

C/C++

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