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

VxWorks

开发平台:

C/C++

  1. /* fppALib.s - floating-point coprocessor support assembly language routines */
  2. /* Copyright 1984-2002 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01j,25mar02,hdn  added clearing TS bit in fppSave/fppXsave (spr 70187)
  7. 01i,20nov01,hdn  doc clean up for 5.5
  8. 01h,21aug01,hdn  imported SSE support from T31 ver 01k
  9. 01g,04apr98,hdn  added X86FPU_387, X86FPU_487 macros.
  10. 01f,21sep95,hdn  added support for NS486
  11. 01e,01nov94,hdn  added a check of sysProcessor for Pentium
  12. 01d,10aug93,hdn  changed fppProbeSup().
  13. 01c,01jun93,hdn  updated to 5.1.
  14.   - fixed #else and #endif
  15.   - changed VOID to void
  16.   - changed ASMLANGUAGE to _ASMLANGUAGE
  17.   - changed copyright notice
  18. 01b,29sep92,hdn  debugged. fixed bugs.
  19. 01a,07apr92,hdn  written based on TRON version.
  20. */
  21. /*
  22. DESCRIPTION
  23. This library contains routines to support the Intel Architecture Floating
  24. Point Unit (FPU).  The routines fppSave() and fppRestore() save and restore
  25. all the floating-point context and MMX technology state, which is 108 bytes
  26. and consists of the 16 extended double precision registers and three control
  27. registers.  
  28. The routines fppXsave() and fppXrestore() save and restore the newer 
  29. floating-point context, newer MMX technology state, and streaming SIMD state
  30. that is 512 bytes, with fxsave and fxrstor instruction.
  31. Higher-level access mechanisms are found in fppLib.
  32. SEE ALSO: fppLib, Intel Architecture Floating-Point Unit User's Manual
  33. */
  34. #define _ASMLANGUAGE
  35. #include "vxWorks.h"
  36. #include "fppLib.h"
  37. #include "asm.h"
  38. #include "regs.h"
  39. #include "arch/i86/vxI86Lib.h"
  40. .data
  41. .globl FUNC(copyright_wind_river)
  42. .long FUNC(copyright_wind_river)
  43. /* externals */
  44. .globl VAR(fppFsw)
  45. .globl VAR(fppFcw)
  46. .globl VAR(sysCoprocessor)
  47. /* internals */
  48. .globl GTEXT(fppSave)
  49. .globl GTEXT(fppRestore)
  50. .globl GTEXT(fppXsave)
  51. .globl GTEXT(fppXrestore)
  52. .globl GTEXT(fppDtoDx)
  53. .globl GTEXT(fppDxtoD)
  54. .globl GTEXT(fppProbeSup)
  55. .text
  56. .balign 16
  57. /*******************************************************************************
  58. *
  59. * fppSave - save the floating-pointing unit context with fnsave
  60. *
  61. * This routine saves the floating-point unit context and MMX technology state
  62. * with fnsave.
  63. * The context saved is 108 bytes and contains:
  64. *
  65. *       - control word 4
  66. * - status word 4
  67. * - tag word 4
  68. * - instruction pointer 4
  69. * - instruction pointer selector 2
  70. * - last FP instruction op code 2
  71. * - data pointer 4
  72. * - data pointer selector 4
  73. * - FR/MM[0-7] 8 * 10
  74. *
  75. * RETURNS: N/A
  76. *
  77. * SEE ALSO: fppRestore(), Intel Architecture Floating-Point Unit 
  78. * User's Manual
  79. * void fppSave (pFpContext)
  80. *     FP_CONTEXT * pFpContext; /* where to save context *
  81. */
  82. FUNC_LABEL(fppSave)
  83. movl SP_ARG1(%esp), %eax /* where to save registers */
  84. clts /* clear the TS bit in CR0 */
  85. fnsave (%eax)
  86. ret
  87. /*******************************************************************************
  88. *
  89. * fppRestore - restore the floating-point unit context with frstor
  90. *
  91. * This routine restores the floating-point unit context and MMX technology
  92. * state with frstor.
  93. * The context restored is:
  94. *
  95. *       - control word 4
  96. * - status word 4
  97. * - tag word 4
  98. * - instruction pointer 4
  99. * - instruction pointer selector 2
  100. * - last FP instruction op code 2
  101. * - data pointer 4
  102. * - data pointer selector 4
  103. * - FR/MM[0-7] 8 * 10
  104. *
  105. * RETURNS: N/A
  106. *
  107. * SEE ALSO: fppSave(), Intel Architecture Floating-Point Unit User's Manual
  108. * void fppRestore (pFpContext)
  109. *    FP_CONTEXT * pFpContext; /* from where to restore context *
  110. */
  111. .balign 16,0x90
  112. FUNC_LABEL(fppRestore)
  113. movl SP_ARG1(%esp), %eax /* from where to restore registers */
  114. frstor (%eax)
  115. ret
  116. /*******************************************************************************
  117. *
  118. * fppXsave - save the floating-pointing unit context with fxsave
  119. *
  120. * This routine saves the floating-point unit context, newer MMX technology
  121. * state, and streaming SIMD state with fxsave.
  122. * The context saved is 512 bytes and contains:
  123. *
  124. *       - control word 2
  125. * - status word 2
  126. * - tag word 2
  127. * - last FP instruction op code 2
  128. * - instruction pointer  4
  129. * - instruction pointer selector 4
  130. * - data pointer 4
  131. * - data pointer selector 4
  132. * - FR/MM[0-7] 8 * 16
  133. * - XMM[0-7] 8 * 16
  134. *
  135. * RETURNS: N/A
  136. *
  137. * SEE ALSO: fppXrestore(), Intel Architecture Software Developer's Manual 
  138. * void fppXsave (pFpContext)
  139. *     FP_CONTEXT * pFpContext; /* where to save context *
  140. */
  141. .balign 16,0x90
  142. FUNC_LABEL(fppXsave)
  143. movl SP_ARG1(%esp), %eax /* where to save registers */
  144. clts /* clear the TS bit in CR0 */
  145. fxsave (%eax)
  146. ret
  147. /*******************************************************************************
  148. *
  149. * fppXrestore - restore the floating-point unit context with fxrstor
  150. *
  151. * This routine restores the floating-point unit context, newer MMX technology
  152. * state, and streaming SIMD state with fxrstor.
  153. * The context restored is:
  154. *
  155. *       - control word 2
  156. * - status word 2
  157. * - tag word 2
  158. * - last FP instruction op code 2
  159. * - instruction pointer  4
  160. * - instruction pointer selector 4
  161. * - data pointer 4
  162. * - data pointer selector 4
  163. * - FR/MM[0-7] 8 * 16
  164. * - XMM[0-7] 8 * 16
  165. *
  166. * RETURNS: N/A
  167. *
  168. * SEE ALSO: fppXsave(), Intel Architecture Software Developer's Manual 
  169. * void fppXrestore (pFpContext)
  170. *    FP_CONTEXT * pFpContext; /* from where to restore context *
  171. */
  172. .balign 16,0x90
  173. FUNC_LABEL(fppXrestore)
  174. movl SP_ARG1(%esp), %eax /* from where to restore registers */
  175. fxrstor (%eax)
  176. ret
  177. /*******************************************************************************
  178. *
  179. * fppDtoDx - convert double to extended double precision
  180. *
  181. * The FPU uses a special extended double precision format
  182. * (10 bytes as opposed to 8 bytes) for internal operations.
  183. * The routines fppSave and fppRestore must preserve this precision.
  184. *
  185. * NOMANUAL
  186. * void fppDtoDx (pDx, pDouble)
  187. *     DOUBLEX *pDx;  /* where to save result    *
  188. *     double *pDouble;  /* ptr to value to convert *
  189. */
  190. .balign 16,0x90
  191. FUNC_LABEL(fppDtoDx)
  192. movl SP_ARG1(%esp), %edx /* to Dx */
  193. movl SP_ARG2(%esp), %eax /* from D */
  194. subl $16, %esp
  195. fstpt (%esp) /* save %st */
  196. fldl (%eax)
  197. fstpt (%edx)
  198. fldt (%esp) /* restore %st */
  199. addl $16, %esp
  200. ret
  201. /*******************************************************************************
  202. *
  203. * fppDxtoD - convert extended double precisoion to double
  204. *
  205. * The FPU uses a special extended double precision format
  206. * (10 bytes as opposed to 8 bytes) for internal operations.
  207. * The routines fppSave and fppRestore must preserve this precision.
  208. *
  209. * NOMANUAL
  210. * void fppDxtoD (pDouble, pDx)
  211. *     double *pDouble; /* where to save result    *
  212. *     DOUBLEX *pDx; /* ptr to value to convert *
  213. */
  214. .balign 16,0x90
  215. FUNC_LABEL(fppDxtoD)
  216. movl SP_ARG1(%esp), %edx /* to D */
  217. movl SP_ARG2(%esp), %eax /* from Dx */
  218. subl $16, %esp
  219. fstpt (%esp) /* save %st */
  220. fldt (%eax)
  221. fstpl (%edx)
  222. fldt (%esp) /* restore %st */
  223. addl $16, %esp
  224. ret
  225. /*******************************************************************************
  226. *
  227. * fppProbeSup - fppProbe support routine
  228. *
  229. * This routine executes some floating-point unit instruction which will cause a
  230. * bus error if a floating-point unit is not present.  A handler, viz. 
  231. * fppProbeTrap, should be installed at that vector.  If the floating-point
  232. * unit is present this routine returns OK.
  233. *
  234. * SEE ALSO: Intel Architecture Floating-Point Unit User's Manual
  235. *
  236. * NOMANUAL
  237. * STATUS fppProbeSup ()
  238. */
  239. .balign 16,0x90
  240. FUNC_LABEL(fppProbeSup)
  241. cmpl    $ X86CPU_386,FUNC(sysProcessor) /* is it 386 ? */
  242. jne fppProbe487
  243. /* does it have 387 ? */
  244. fninit
  245. movl $FUNC(fppFsw),%edx
  246. movl $FUNC(fppFcw),%ecx
  247. fnstsw (%edx)
  248. cmpb $0,(%edx)
  249. jne fppProbeNo387
  250. fnstcw (%ecx)
  251. movw (%ecx),%ax
  252. cmpw $0x37f,%ax
  253. jne fppProbeNo387
  254. movl %cr0,%eax
  255. andl $0xfffffff9,%eax
  256. orl $0x00000002,%eax
  257. movl %eax,%cr0 /* EM=0, MP=1 */
  258. movl    $ X86FPU_387,FUNC(sysCoprocessor) /* it has 80387 */
  259. xorl %eax,%eax /* set status to OK */
  260. jmp fppProbeDone
  261. fppProbeNo387:
  262. movl %cr0,%eax
  263. andl $0xfffffff9,%eax
  264. orl $0x00000004,%eax  /* EM=1, MP=0 */
  265. movl %eax,%cr0
  266. movl $ ERROR,%eax /* set status to ERROR */
  267. jmp fppProbeDone
  268. fppProbe487:
  269. cmpl    $ X86CPU_NS486,FUNC(sysProcessor) /* is it NS486 ? */
  270. je fppProbeNo487
  271. /* does it have 487 ? */
  272. fninit
  273. movl $FUNC(fppFcw),%edx
  274. fnstcw (%edx)
  275. movw (%edx),%ax
  276. cmpw $0x37f,%ax
  277. jne fppProbeNo487
  278. movl %cr0,%eax
  279. andl $0xffffffd9,%eax
  280. orl $0x00000002,%eax
  281. movl %eax,%cr0 /* NE=0, EM=0, MP=1 */
  282. movl    $ X86FPU_487,FUNC(sysCoprocessor) /* it has 80487 */
  283. xorl %eax,%eax /* set status to OK */
  284. jmp fppProbeDone
  285. fppProbeNo487:
  286. movl %cr0,%eax
  287. andl $0xffffffd9,%eax
  288. orl $0x00000004,%eax
  289. movl %eax,%cr0 /* NE=0, EM=1, MP=0 */
  290. movl $ ERROR,%eax /* set status to ERROR */
  291. jmp fppProbeDone
  292. fppProbeNS486:
  293. movl $ ERROR,%eax /* set status to ERROR */
  294. fppProbeDone:
  295. ret