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

VxWorks

开发平台:

C/C++

  1. /* wdbAltivecLib.c - Altivec register support for the external WDB agent */
  2. /* Copyright 1984-1996 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01h,30apr02,pcs  Remove the pointer corruption in fn. wdbAltivecLibInit
  7. 01g,07jun01,kab  Testing only
  8. 01f,29may01,kab  Hide altivecLib.h from non-altivec builds
  9. 01e,13apr01,pcs  Move decleration of altivecRegSetObj to
  10.                  wdb/wdbRegs.h
  11. Allocated mem for ALTIVEC_REG_SET_OBJ at init
  12.                  time and make sure that
  13. it is 16 byte aligned.
  14. 01d,23mar01,dtr  Tidying up.
  15. 01c,19mar01,tpw  Rename WDB_REG_SET_ALTIVEC to WDB_REG_SET_AV for consistency
  16.                  with WTX and other REG_SET names.
  17. 01b,19mar01,dtr  Changing header file name altiVecLib.h.
  18. 01a,01mar01,dtr Created library.
  19. */
  20. /*
  21. DESCPRIPTION
  22. This library contains routines to save, restore, get, and
  23. set the altivec registers. These operations are
  24. not task-specific.
  25. */
  26. #include "vxWorks.h"
  27. #ifdef  _WRS_ALTIVEC_SUPPORT
  28. #include "wdb/wdbRegs.h"
  29. #include "string.h"
  30. #include "altivecLib.h"
  31. /* 
  32.  * The ALTIVEC_REG_SET_OBJ is defined as a pointer and mem for it allocated at
  33.  * run time. The reason for this is to ensure that this object especially the
  34.  * first element altivecContext is 16 byte aligned.
  35.  */
  36. ALTIVEC_REG_SET_OBJ * pAltivecRegSetObj;
  37. /******************************************************************************
  38. *
  39. * wdbAltivecSave - save the altivec registers.
  40. */ 
  41. void wdbAltivecSave (void)
  42.     {
  43.     altivecSave (&pAltivecRegSetObj->altivecContext);
  44.     }
  45. /******************************************************************************
  46. *
  47. * wdbAltivecRestore - restore the previously saved altivec regs.
  48. */ 
  49. void wdbAltivecRestore (void)
  50.     {
  51.     altivecRestore (&pAltivecRegSetObj->altivecContext);
  52.     }
  53. /******************************************************************************
  54. *
  55. * wdbAltivecGet - get a pointer to the altivec reg block.
  56. */ 
  57. void wdbAltivecGet
  58.     (
  59.     void ** ppRegs
  60.     )
  61.     {
  62.     *ppRegs = (void *) &pAltivecRegSetObj->altivecContext;
  63.     }
  64. /******************************************************************************
  65. *
  66. * wdbAltivecSet - set the Altivec reg block.
  67. */ 
  68. void wdbAltivecSet
  69.     (
  70.     void * pRegs
  71.     )
  72.     {
  73.     bcopy ((char *)pRegs, (char *) &pAltivecRegSetObj->altivecContext, sizeof (ALTIVEC_CONTEXT));
  74.     }
  75. /******************************************************************************
  76. *
  77. * wdbAltivecLibInit - initialize a WDB_REG_SET_OBJ representing altivec regs.
  78. *
  79. * RETURNS: a pointer to a WDB_REG_SET_OBJ
  80. */ 
  81. WDB_REG_SET_OBJ * wdbAltivecLibInit (void)
  82.     {
  83.     WDB_REG_SET_OBJ * pRegSet;
  84.     /*  Ensure that the ALTIVEC_REG_SET_OBJ object is 16 byte aligned. This is with the assumption
  85.         that altiveccontext is the first element in the object.
  86.      */
  87.     pAltivecRegSetObj = (ALTIVEC_REG_SET_OBJ *) memalign (16, sizeof (ALTIVEC_REG_SET_OBJ));
  88.     bzero ((char *)pAltivecRegSetObj, sizeof (ALTIVEC_REG_SET_OBJ));
  89.     altivecSave (&pAltivecRegSetObj->altivecContext);
  90.     pRegSet = &pAltivecRegSetObj->regSet;
  91.     pRegSet->regSetType = WDB_REG_SET_AV;
  92.     pRegSet->save = wdbAltivecSave;
  93.     pRegSet->load = wdbAltivecRestore;
  94.     pRegSet->get = (void (*) (char **)) wdbAltivecGet;
  95.     pRegSet->set = (void (*) (char *))  wdbAltivecSet;
  96.     return (pRegSet);
  97.     }
  98. #endif /* (_WRS_ALTIVEC_SUPPORT==TRUE) */