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

VxWorks

开发平台:

C/C++

  1. /* fpsp040E.h - Motorola 68040 FP definitions (EXC) */
  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. fpsp040E.h 3.3 3.3
  16. Copyright (C) Motorola, Inc. 1990
  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. fpsp040E.h --- stack frame offsets during FPSP exception handling
  22. These equates are used to access the exception frame, the fsave
  23. frame and any local variables needed by the FPSP package.
  24. All FPSP handlers begin by executing:
  25. link a6,#-LOCAL_SIZE
  26. fsave a7@-
  27. moveml d0-d1/a0-a1,a6@(USER_DA)
  28. fmovemx fp0-fp3,a6@(USER_FP0)
  29. fmovel fpsr/fpcr/fpi,a6@(USER_FPSR)
  30. After initialization, the stack looks like this:
  31. A7 ---> +-------------------------------+
  32. | |
  33. | FPU fsave area |
  34. | |
  35. +-------------------------------+
  36. | |
  37. | FPSP Local Variables |
  38. |      including |
  39. |   saved registers |
  40. | |
  41. +-------------------------------+
  42. A6 ---> | Saved A6 |
  43. +-------------------------------+
  44. | |
  45. | Exception Frame |
  46. | |
  47. | |
  48. Positive offsets from A6 refer to the exception frame.  Negative
  49. offsets refer to the Local Variable area and the fsave area.
  50. The fsave frame is also accessible 'from the top' via A7.
  51. On exit, the handlers execute:
  52. moveml a6@(USER_DA),d0-d1/a0-a1
  53. fmovemx a6@(USER_FP0),fp0-fp3
  54. fmovel a6@(USER_FPSR),fpsr/fpcr/fpi
  55. frestore a7@+
  56. unlk a6
  57. and then either 'bra __x_fpsp_done' if the exception was completely
  58. handled by the package, or 'bra real_xxxx' which is an external
  59. label to a routine that will process a real exception of the
  60. type that was generated.  Some handlers may omit the 'frestore'
  61. if the FPU state after the exception is idle.
  62. Sometimes the exception handler will transform the fsave area
  63. because it needs to report an exception back to the user.  This
  64. can happen if the package is entered for an unimplemented float
  65. instruction that generates (say) an underflow.  Alternatively,
  66. a second fsave frame can be pushed onto the stack and the
  67. handler exit code will reload the new frame and discard the old.
  68. The registers d0, d1, a0, a1 and fp0-fp3 are always saved and
  69. restored from the 'local variable' area and can be used as
  70. temporaries.  If a routine needs to change any
  71. of these registers, it should modify the saved copy and let
  72. the handler exit code restore the value.
  73. NOMANUAL
  74. */
  75. |----------------------------------------------------------------------
  76. |
  77. | Local Variables on the stack
  78. |
  79. #define LOCAL_SIZE 192 /* bytes req'd for local vars */
  80. #define LV -LOCAL_SIZE /* convenient base value */
  81. #define USER_DA LV+0 /* save space for d0-d1,a0-a1 */
  82. #define USER_D0 LV+0 /* saved user d0 */
  83. #define USER_D1 LV+4 /* saved user d1 */
  84. #define USER_A0 LV+8 /* saved user a0 */
  85. #define USER_A1 LV+12 /* saved user a1 */
  86. #define USER_FP0 LV+16 /* saved user fp0 */
  87. #define USER_FP1 LV+28 /* saved user fp1 */
  88. #define USER_FP2 LV+40 /* saved user fp2 */
  89. #define USER_FP3 LV+52 /* saved user fp3 */
  90. #define USER_FPCR LV+64 /* saved user fpcr */
  91. #define fpcr_ENABLE USER_FPCR+2 /* fpcr exception enable  */
  92. #define fpcr_MODE USER_FPCR+3 /* fpcr rounding mode control */
  93. #define USER_FPSR LV+68 /* saved user FPSR */
  94. #define FPSR_CC USER_FPSR+0 /* FPSR condition code */
  95. #define FPSR_QBYTE USER_FPSR+1 /* FPSR quotient */
  96. #define FPSR_EXCEPT USER_FPSR+2 /* FPSR exception */
  97. #define FPSR_AEXCEPT USER_FPSR+3 /* FPSR accrued exception */
  98. #define USER_fpi LV+72 /* saved user fpi */
  99. #define FP_SCR1 LV+76 /* room for temp float value */
  100. #define FP_SCR2 LV+92 /* room for temp float value */
  101. #define L_SCR1 LV+108 /* room for temp long value */
  102. #define L_SCR2 LV+112 /* room for temp long value */
  103. #define STORE_FLG LV+116
  104. #define BINDEC_FLG LV+117 /* used in __x_bindec */
  105. #define DNRM_FLG LV+118 /* used in __x_res_func */
  106. #define RES_FLG LV+119 /* used in __x_res_func */
  107. #define DY_MO_FLG LV+120 /* dyadic/monadic flag */
  108. #define UFLG_TMP LV+121 /* temporary for uflag errata */
  109. #define CU_ONLY LV+122 /* cu-only flag */
  110. #define VER_TMP LV+123 /* temp holding for version no*/
  111. #define L_SCR3 LV+124 /* room for temp long value */
  112. #define FP_SCR3 LV+128 /* room for temp float value */
  113. #define FP_SCR4 LV+144 /* room for temp float value */
  114. #define FP_SCR5 LV+160 /* room for temp float value */
  115. #define FP_SCR6 LV+176
  116. |
  117. |NEXT equ LV+192 | need to increase LOCAL_SIZE
  118. |
  119. |--------------------------------------------------------------------------
  120. |
  121. | fsave offsets and bit definitions
  122. |
  123. | Offsets are defined from the end of an fsave because the last 10
  124. | .words of a busy frame are the same as the unimplemented frame.
  125. |
  126. #define CU_SAVEPC LV-92 /* micro-pc for CU (1 byte) */
  127. #define FPR_DIRTY_BITS LV-91 /* fpr dirty bits */
  128. #define WBTEMP LV-76 /* write back temp (12 bytes) */
  129. #define WBTEMP_EX WBTEMP /*  sign & exponent (2 bytes) */
  130. #define WBTEMP_HI WBTEMP+4 /*  mantissa [63:32] (4 bytes)*/
  131. #define WBTEMP_LO WBTEMP+8 /*  mantissa [31:00] (4 bytes)*/
  132. #define WBTEMP_SGN WBTEMP+2 /* used to store sign */
  133. #define FPSR_SHADOW LV-64 /* fpsr shadow reg */
  134. #define fpiCU LV-60 /* Instr. addr. reg. for CU
  135.  * (4 bytes) */
  136. #define CMDREG2B LV-52 /* cmd reg for machine 2 */
  137. #define CMDREG3B LV-48 /* cmd reg for E3 exceptions
  138.  * (2 bytes) */
  139. #define NMNEXC LV-44 /* NMNEXC (unsup,snan bits) */
  140. #define nmn_unsup_bit 1
  141. #define nmn_snan_bit 0
  142. #define NMCEXC LV-43 /* NMNEXC # NMCEXC */
  143. #define nmn_operr_bit 7
  144. #define nmn_ovfl_bit 6
  145. #define nmn_unfl_bit 5
  146. #define nmc_unsup_bit 4
  147. #define nmc_snan_bit 3
  148. #define nmc_operr_bit 2
  149. #define nmc_ovfl_bit 1
  150. #define nmc_unfl_bit 0
  151. |
  152. #define STAG LV-40 /* source tag (1 byte) */
  153. #define WBTEMP_GRS LV-40 /* alias wbtemp guard, round, sticky */
  154. #define guard_bit 1 /* guard bit is bit number 1 */
  155. #define __x_round_bit 0 /* round bit is bit number 0 */
  156. #define stag_mask 0xE0 /* upper 3 bits are source tag
  157.  * type */
  158. #define __x_denorm_bit 7 /* bit determins if denorm or
  159.  * unnorm */
  160. #define etemp15_bit 4 /* etemp exponent bit #15 */
  161. #define wbtemp66_bit 2 /* wbtemp mantissa bit #66 */
  162. #define wbtemp1_bit 1 /* wbtemp mantissa bit #1 */
  163. #define wbtemp0_bit 0 /* wbtemp mantissa bit #0 */
  164. |
  165. #define STICKY LV-39 /* holds sticky bit */
  166. #define sticky_bit 7
  167. |
  168. #define CMDREG1B LV-36 /* cmd reg for E1 exceptions
  169.  * (2 bytes) */
  170. #define kfact_bit 12 /* distinguishes static/dynamic
  171.  * k-factor on packed move out.
  172.  * NOTE: this equate only works
  173.  * when CMDREG1B is in a reg. */
  174. #define CMDWORD LV-35 /* command word in cmd1b */
  175. #define direction_bit 5 /* bit 0 in opclass */
  176. #define size_bit2 12 /* bit 2 in size field */
  177. |
  178. #define DTAG LV-32 /* dest tag (1 byte) */
  179. #define dtag_mask 0xE0 /* upper 3 bits are dest type */
  180. #define fptemp15_bit 4 /* fptemp exponent bit #15 */
  181. |
  182. #define WB_BYTE LV-31 /* holds WBTE15 bit (1 byte) */
  183. #define wbtemp15_bit 4 /* wbtemp exponent bit #15 */
  184. #define E_BYTE LV-28 /* holds E1 & E3 bits (1 byte)*/
  185. #define E1 2 /* which bit is E1 flag */
  186. #define E3 1 /* which bit is E3 flag */
  187. #define SFLAG 0 /* which bit is S flag */
  188. #define T_BYTE LV-27 /* holds T and U bits (1 byte)*/
  189. #define XFLAG 7 /* which bit is X flag */
  190. #define UFLAG 5 /* which bit is U flag */
  191. #define TFLAG 4 /* which bit is T flag */
  192. |
  193. #define FPTEMP LV-24 /* fptemp (12 bytes) */
  194. #define FPTEMP_EX FPTEMP /*  sign & exponent (2 bytes) */
  195. #define FPTEMP_HI FPTEMP+4 /*  mantissa [63:32] (4 bytes)*/
  196. #define FPTEMP_LO FPTEMP+8 /*  mantissa [31:00] (4 bytes)*/
  197. #define FPTEMP_SGN FPTEMP+2 /* used to store sign */
  198. #define ETEMP LV-12 /* etemp (12 bytes) */
  199. #define ETEMP_EX ETEMP /*  sign & exponent (2 bytes) */
  200. #define ETEMP_HI ETEMP+4 /*  mantissa [63:32] (4 bytes)*/
  201. #define ETEMP_LO ETEMP+8 /*  mantissa [31:00] (4 bytes)*/
  202. #define ETEMP_SGN ETEMP+2 /* used to store sign */
  203. #define EXC_SR 4 /* exc frame status register */
  204. #define EXC_PC 6 /* exc frame program counter */
  205. #define EXC_VEC 10 /* exc frame vector
  206.  * (format+vector#) */
  207. #define EXC_EA 12 /* exc frame effective addr */
  208. |--------------------------------------------------------------------------
  209. |
  210. | FPSR/fpcr bits
  211. |
  212. #define neg_bit 3 /* negative result */
  213. #define z_bit 2 /* zero result */
  214. #define inf_bit 1 /* infinity result */
  215. #define nan_bit 0 /* not-a-number result */
  216. |
  217. #define q_sn_bit 7 /* sign bit of quotient byte */
  218. |
  219. #define __x_bsun_bit 7 /* branch on unordered */
  220. #define __x_snan_bit 6 /* signalling nan */
  221. #define __x_operr_bit 5 /* operand error */
  222. #define __x_ovfl_bit 4 /* overflow */
  223. #define __x_unfl_bit 3 /* underflow */
  224. #define __x_dz_bit 2 /* divide by zero */
  225. #define __x_inex2_bit 1 /* inexact result 2 */
  226. #define __x_inex1_bit 0 /* inexact result 1 */
  227. |
  228. #define aiop_bit 7 /* accrued illegal operation */
  229. #define aovfl_bit 6 /* accrued overflow */
  230. #define aunfl_bit 5 /* accrued underflow */
  231. #define adz_bit 4 /* accrued divide by zero */
  232. #define ainex_bit 3 /* accrued inexact */
  233. |
  234. | FPSR individual bit masks
  235. |
  236. #define neg_mask 0x08000000
  237. #define z_mask 0x04000000
  238. #define inf_mask 0x02000000
  239. #define nan_mask 0x01000000
  240. |
  241. #define __x_bsun_mask 0x00008000
  242. #define __x_snan_mask 0x00004000
  243. #define __x_operr_mask 0x00002000
  244. #define __x_ovfl_mask 0x00001000
  245. #define __x_unfl_mask 0x00000800
  246. #define __x_dz_mask 0x00000400
  247. #define __x_inex2_mask 0x00000200
  248. #define __x_inex1_mask 0x00000100
  249. |
  250. #define aiop_mask 0x00000080 /* accrued illegal operation */
  251. #define aovfl_mask 0x00000040 /* accrued overflow */
  252. #define aunfl_mask 0x00000020 /* accrued underflow */
  253. #define adz_mask 0x00000010 /* accrued divide by zero */
  254. #define ainex_mask 0x00000008 /* accrued inexact */
  255. |
  256. | FPSR combinations used in the FPSP
  257. |
  258. #define __x_dzinf_mask inf_mask+__x_dz_mask+adz_mask
  259. #define opnan_mask nan_mask+__x_operr_mask+aiop_mask
  260. #define nzi_mask 0x01ffffff  /* clears N, Z, and I */
  261. #define unfinx_mask __x_unfl_mask+__x_inex2_mask+aunfl_mask+ainex_mask
  262. #define unf2inx_mask __x_unfl_mask+__x_inex2_mask+ainex_mask
  263. #define ovfinx_mask __x_ovfl_mask+__x_inex2_mask+aovfl_mask+ainex_mask
  264. #define inx1a_mask __x_inex1_mask+ainex_mask
  265. #define inx2a_mask __x_inex2_mask+ainex_mask
  266. #define __x_snaniop_mask nan_mask+__x_snan_mask+aiop_mask
  267. #define naniop_mask nan_mask+aiop_mask
  268. #define neginf_mask neg_mask+inf_mask
  269. #define infaiop_mask inf_mask+aiop_mask
  270. #define negz_mask neg_mask+z_mask
  271. #define opaop_mask __x_operr_mask+aiop_mask
  272. #define __x_unfl_inx_mask __x_unfl_mask+aunfl_mask+ainex_mask
  273. #define __x_ovfl_inx_mask __x_ovfl_mask+aovfl_mask+ainex_mask
  274. |
  275. |--------------------------------------------------------------------------
  276. |
  277. | fpcr rounding modes
  278. |
  279. #define x_mode 0x00 /* round to extended */
  280. #define s_mode 0x40 /* round to single */
  281. #define d_mode 0x80 /* round to double */
  282. #define rn_mode 0x00 /* round nearest */
  283. #define rz_mode 0x10 /* round to zero */
  284. #define rm_mode 0x20 /* round to minus infinity */
  285. #define rp_mode 0x30 /* round to plus infinity */
  286. |
  287. |--------------------------------------------------------------------------
  288. |
  289. | Miscellaneous equates
  290. |
  291. #define signan_bit 6 /* signalling nan bit in mantissa */
  292. #define sign_bit 7
  293. |
  294. #define rnd_stky_bit 29 /* round/sticky bit of mantissa
  295.  * this can only be used if in a
  296.  * data register */
  297. #define sx_mask 0x01800000 /* set s and x bits in word 0x48 */
  298. #define LOCAL_EX 0
  299. #define LOCAL_SGN 2
  300. #define LOCAL_HI 4
  301. #define LOCAL_LO 8
  302. #define LOCAL_GRS 12 /* valid ONLY for FP_SCR1, FP_SCR2 */
  303. #define __x_norm_tag 0x00 /* tag bits in {7:5} position */
  304. #define zero_tag 0x20
  305. #define inf_tag 0x40
  306. #define nan_tag 0x60
  307. #define dnrm_tag 0x80
  308. |
  309. | fsave sizes and formats
  310. |
  311. #define VER_4 0x40 /* fpsp compatible version
  312.    * numbers are in the 0x40s
  313.  * {0x40-0x4f} */
  314. #define VER_40 0x40 /* original version number */
  315. #define VER_41 0x41 /* revision version number */
  316. #define BUSY_SIZE 100 /* size of busy frame */
  317. #define BUSY_FRAME LV-BUSY_SIZE /* start of busy frame */
  318. #define UNIMP_40_SIZE 44 /* size of orig unimp frame */
  319. #define UNIMP_41_SIZE 52 /* size of rev unimp frame */
  320. #define IDLE_SIZE 4 /* size of idle frame */
  321. #define IDLE_FRAME LV-IDLE_SIZE /* start of idle frame */
  322. |
  323. | exception vectors
  324. |
  325. #define TRACE_VEC 0x2024 /* trace trap */
  326. #define FLINE_VEC 0x002C /* 'real' F-line */
  327. #define UNIMP_VEC 0x202C /* unimplemented */
  328. #define INEX_VEC 0x00C4
  329. #define dbl_thresh 0x3C01
  330. #define sgl_thresh 0x3F81
  331. |