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

VxWorks

开发平台:

C/C++

  1. /* fpsp040L.h - Motorola 68040 FP definitions (LIB) */
  2. /* Copyright 1991-1992 Wind River Systems, Inc. */
  3. .data
  4. .globl _copyright_wind_river
  5. .long _copyright_wind_river
  6. /*
  7. modification history
  8. --------------------
  9. 01c,26may92,rrr  the tree shuffle
  10. 01b,10jan92,kdl  added modification history; general cleanup.
  11. 01a,15aug91,kdl  original version, from Motorola FPSP v2.0.
  12. */
  13. /*
  14. DESCRIPTION
  15. fpsp040L.h 1.1 3/27/91
  16. Copyright (C) Motorola, Inc. 1991
  17. All Rights Reserved
  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. fpsp040L.h --- stack frame offsets for library version of FPSP
  22. This file is derived from fpsp040E.h.  All equates that refer
  23. to the fsave frame and it's bits are removed with the
  24. exception of ETEMP, WBTEMP, DTAG and STAG which are simulated
  25. in the library version.  Equates for the exception frame are
  26. also not needed.  Some of the equates that are only used in
  27. the kernel version of the FPSP are left in to minimize the
  28. differences between this file and the original.
  29. The library routines use the same source files as the regular
  30. kernel mode code so they expect the same setup.  That is, you
  31. must create enough space on the stack for all save areas and
  32. work variables that are needed, and save any registers that
  33. your compiler does not treat as scratch registers on return
  34. from function calls.
  35. The worst case setup is:
  36. link a6,#-LOCAL_SIZE
  37. moveml d0-d1/a0-a1,a6@(USER_DA)
  38. fmovemx fp0-fp3,a6@(USER_FP0)
  39. fmoveml fpsr/fpcr,a6@(USER_FPSR)
  40. After initialization, the stack looks like this:
  41. A7 ---> +-------------------------------+
  42. | |
  43. | FPSP Local Variables |
  44. |      including |
  45. |   saved registers |
  46. | |
  47. +-------------------------------+
  48. A6 ---> | Saved A6 |
  49. +-------------------------------+
  50. | Return PC |
  51. +-------------------------------+
  52. | Arguments to  |
  53. | an FPSP library |
  54. | package |
  55. | |
  56. Positive offsets from A6 refer to the input arguments.  Negative
  57. offsets refer to the Local Variable area.
  58. On exit, execute:
  59. moveml a6@(USER_DA),d0-d1/a0-a1
  60. fmovemx a6@(USER_FP0),fp0-fp3
  61. fmovel a6@(USER_FPSR),fpsr/fpcr
  62. unlk a6
  63. rts
  64. Many 68K C compilers treat a0/a1/d0/d1/fp0/fp1 as scratch so
  65. a simplified setup/exit is possible:
  66. link a6,#-LOCAL_SIZE
  67. fmovemx fp2-fp3,a6@(USER_FP2)
  68. fmovel fpsr/fpcr,a6@(USER_FPSR)
  69. [call appropriate emulation routine]
  70. fmovemx a6@(USER_FP2),fp2-fp3
  71. fmovel a6@(USER_FPSR),fpsr/fpcr
  72. unlk a6
  73. rts
  74. Note that you must still save fp2/fp3 because the FPSP emulation
  75. routines expect fp0-fp3 as scratch registers.  For all monadic
  76. entry points, the caller should save the fpcr in d1 and zero the
  77. real fpcr before calling the emulation routine.  On return, the
  78. monadic emulation code will place the value supplied in d1 back
  79. into the fpcr and do a single floating point operation so that
  80. the final result will be correctly rounded and any specified
  81. exceptions will be generated.
  82. NOMANUAL
  83. */
  84. |----------------------------------------------------------------------
  85. |
  86. | Local Variables on the stack
  87. |
  88. #define LOCAL_SIZE 228 /* bytes req'd for local vars */
  89. #define LV -LOCAL_SIZE /* convenient base value */
  90. #define USER_DA LV+0 /* save space for d0-d1,a0-a1 */
  91. #define USER_D0 LV+0 /* saved user d0 */
  92. #define USER_D1 LV+4 /* saved user d1 */
  93. #define USER_A0 LV+8 /* saved user a0 */
  94. #define USER_A1 LV+12 /* saved user a1 */
  95. #define USER_FP0 LV+16 /* saved user fp0 */
  96. #define USER_FP1 LV+28 /* saved user fp1 */
  97. #define USER_FP2 LV+40 /* saved user fp2 */
  98. #define USER_FP3 LV+52 /* saved user fp3 */
  99. #define USER_FPCR LV+64 /* saved user fpcr */
  100. #define fpcr_ENABLE USER_FPCR+2 /* fpcr exception enable  */
  101. #define fpcr_MODE USER_FPCR+3 /* fpcr rounding mode control */
  102. #define USER_FPSR LV+68 /* saved user FPSR */
  103. #define FPSR_CC USER_FPSR+0 /* FPSR condition code */
  104. #define FPSR_QBYTE USER_FPSR+1 /* FPSR quotient */
  105. #define FPSR_EXCEPT USER_FPSR+2 /* FPSR exception */
  106. #define FPSR_AEXCEPT USER_FPSR+3 /* FPSR accrued exception */
  107. #define USER_fpi LV+72 /* saved user fpi */
  108. #define FP_SCR1 LV+76 /* room for temp float value */
  109. #define FP_SCR2 LV+92 /* room for temp float value */
  110. #define L_SCR1 LV+108 /* room for temp long value */
  111. #define L_SCR2 LV+112 /* room for temp long value */
  112. #define STORE_FLG LV+116
  113. #define BINDEC_FLG LV+117 /* used in __l_bindec */
  114. #define DNRM_FLG LV+118 /* used in __l_res_func */
  115. #define RES_FLG LV+119 /* used in __l_res_func */
  116. #define DY_MO_FLG LV+120 /* dyadic/monadic flag */
  117. #define UFLG_TMP LV+121 /* temporary for uflag errata */
  118. #define CU_ONLY LV+122 /* cu-only flag */
  119. #define VER_TMP LV+123 /* temp holding for version no*/
  120. #define L_SCR3 LV+124 /* room for temp long value */
  121. #define FP_SCR3 LV+128 /* room for temp float value */
  122. #define FP_SCR4 LV+144 /* room for temp float value */
  123. #define FP_SCR5 LV+160 /* room for temp float value */
  124. #define FP_SCR6 LV+176
  125. |
  126. |--------------------------------------------------------------------------
  127. |
  128. #define STAG LV+192 /* source tag (1 byte) */
  129. |
  130. #define DTAG LV+193 /* dest tag (1 byte) */
  131. |
  132. #define FPTEMP LV+196 /* fptemp (12 bytes) */
  133. #define FPTEMP_EX FPTEMP /*  sign & exponent (2 bytes) */
  134. #define FPTEMP_HI FPTEMP+4 /*  mantissa [63:32] (4 bytes)*/
  135. #define FPTEMP_LO FPTEMP+8 /*  mantissa [31:00] (4 bytes)*/
  136. |
  137. #define FPTEMP_SGN FPTEMP+2 /* used to store sign */
  138. |
  139. #define ETEMP LV+208 /* etemp (12 bytes) */
  140. #define ETEMP_EX ETEMP /*  sign & exponent (2 bytes) */
  141. #define ETEMP_HI ETEMP+4 /*  mantissa [63:32] (4 bytes)*/
  142. #define ETEMP_LO ETEMP+8 /*  mantissa [31:00] (4 bytes)*/
  143. |
  144. #define ETEMP_SGN ETEMP+2 /* used to store sign */
  145. |
  146. |--------------------------------------------------------------------------
  147. |
  148. | FPSR/fpcr bits
  149. |
  150. #define neg_bit 3 /* negative result */
  151. #define z_bit 2 /* zero result */
  152. #define inf_bit 1 /* infinity result */
  153. #define nan_bit 0 /* not-a-number result */
  154. #define q_sn_bit 7 /* sign bit of quotient byte */
  155. #define __l_bsun_bit 7 /* branch on unordered */
  156. #define __l_snan_bit 6 /* signalling nan */
  157. #define __l_operr_bit 5 /* operand error */
  158. #define __l_ovfl_bit 4 /* overflow */
  159. #define __l_unfl_bit 3 /* underflow */
  160. #define __l_dz_bit 2 /* divide by zero */
  161. #define __l_inex2_bit 1 /* inexact result 2 */
  162. #define __l_inex1_bit 0 /* inexact result 1 */
  163. |
  164. #define aiop_bit 7 /* accrued illegal operation */
  165. #define aovfl_bit 6 /* accrued overflow */
  166. #define aunfl_bit 5 /* accrued underflow */
  167. #define adz_bit 4 /* accrued divide by zero */
  168. #define ainex_bit 3 /* accrued inexact */
  169. |
  170. | FPSR individual bit masks
  171. |
  172. #define neg_mask 0x08000000
  173. #define z_mask 0x04000000
  174. #define inf_mask 0x02000000
  175. #define nan_mask 0x01000000
  176. #define __l_bsun_mask 0x00008000
  177. #define __l_snan_mask 0x00004000
  178. #define __l_operr_mask 0x00002000
  179. #define __l_ovfl_mask 0x00001000
  180. #define __l_unfl_mask 0x00000800
  181. #define __l_dz_mask 0x00000400
  182. #define __l_inex2_mask 0x00000200
  183. #define __l_inex1_mask 0x00000100
  184. #define aiop_mask 0x00000080 /* accrued illegal operation */
  185. #define aovfl_mask 0x00000040 /* accrued overflow */
  186. #define aunfl_mask 0x00000020 /* accrued underflow */
  187. #define adz_mask 0x00000010 /* accrued divide by zero */
  188. #define ainex_mask 0x00000008 /* accrued inexact */
  189. |
  190. | FPSR combinations used in the FPSP
  191. |
  192. #define __l_dzinf_mask inf_mask+__l_dz_mask+adz_mask
  193. #define opnan_mask nan_mask+__l_operr_mask+aiop_mask
  194. #define nzi_mask 0x01ffffff  /* clears N, Z, and I */
  195. #define unfinx_mask __l_unfl_mask+__l_inex2_mask+aunfl_mask+ainex_mask
  196. #define unf2inx_mask __l_unfl_mask+__l_inex2_mask+ainex_mask
  197. #define ovfinx_mask __l_ovfl_mask+__l_inex2_mask+aovfl_mask+ainex_mask
  198. #define inx1a_mask __l_inex1_mask+ainex_mask
  199. #define inx2a_mask __l_inex2_mask+ainex_mask
  200. #define __l_snaniop_mask nan_mask+__l_snan_mask+aiop_mask
  201. #define naniop_mask nan_mask+aiop_mask
  202. #define neginf_mask neg_mask+inf_mask
  203. #define infaiop_mask inf_mask+aiop_mask
  204. #define negz_mask neg_mask+z_mask
  205. #define opaop_mask __l_operr_mask+aiop_mask
  206. #define __l_unfl_inx_mask __l_unfl_mask+aunfl_mask+ainex_mask
  207. #define __l_ovfl_inx_mask __l_ovfl_mask+aovfl_mask+ainex_mask
  208. |
  209. |--------------------------------------------------------------------------
  210. |
  211. | fpcr rounding modes
  212. |
  213. #define x_mode 0x00 /* round to extended */
  214. #define s_mode 0x40 /* round to single */
  215. #define d_mode 0x80 /* round to double */
  216. #define rn_mode 0x00 /* round nearest */
  217. #define rz_mode 0x10 /* round to zero */
  218. #define rm_mode 0x20 /* round to minus infinity */
  219. #define rp_mode 0x30 /* round to plus infinity */
  220. |
  221. |--------------------------------------------------------------------------
  222. |
  223. | Miscellaneous equates
  224. #define signan_bit 6 /* signalling nan bit in mantissa */
  225. #define sign_bit 7
  226. #define rnd_stky_bit 29 /* round/sticky bit of mantissa
  227.  * this can only be used if in a
  228.  * data register */
  229. #define LOCAL_EX 0
  230. #define LOCAL_SGN 2
  231. #define LOCAL_HI 4
  232. #define LOCAL_LO 8
  233. #define LOCAL_GRS 12 /* valid ONLY for FP_SCR1, FP_SCR2 */
  234. #define __l_norm_tag 0x00 /* tag bits in {7:5} position */
  235. #define zero_tag 0x20
  236. #define inf_tag 0x40
  237. #define nan_tag 0x60
  238. #define dnrm_tag 0x80
  239. #define dbl_thresh 0x3C01
  240. #define sgl_thresh 0x3F81