288 lines
10 KiB
C
288 lines
10 KiB
C
/* fppLib.h - floating-point coprocessor support library header */
|
|
|
|
/*
|
|
* Copyright (c) 1998,2002-2003,2010,2011 Wind River Systems, Inc.
|
|
*
|
|
* The right to copy, distribute, modify or otherwise make use of this
|
|
* software may be licensed only pursuant to the terms of an applicable
|
|
* Wind River license agreement.
|
|
*/
|
|
|
|
/*
|
|
modification history
|
|
--------------------
|
|
01j,05sep11,elp Added xmm registers to host regset (CQID: WIND00286339)
|
|
01i,06apr11,elp added xmm8-xmm15
|
|
01h,30sep10,elp fixed FPXREG_FPX() macro.
|
|
01g,14sep10,elp Added SSE support (64-bits).
|
|
01f,14jan10,elp 64bits support.
|
|
01e,19aug03,dbt Added PAL support.
|
|
01d,17jun03,jmp code cleanup.
|
|
01c,27mar03,jmp rewrote from i86.
|
|
01b,03may02,jmp added fppDtoDx() & fppDxtoD().
|
|
01a,29apr98,cym derived from i86
|
|
*/
|
|
|
|
#ifndef __INCfppSimntLibh
|
|
#define __INCfppSimntLibh
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* number of fp registers on coprocessor */
|
|
|
|
#define FP_NUM_REGS 8 /* number of FP registers */
|
|
#define XSAVE_HEADER 64 /* number of bytes in the XSAVE header */
|
|
|
|
#ifdef _WRS_CONFIG_LP64
|
|
#define XMM_NUM_REGS 16 /* number of XMM registers */
|
|
#define FP_NUM_RESERVED 6 /* reserved area in FPX_CONTEXT */
|
|
|
|
/* FPREG_SET structure offsets */
|
|
|
|
#define FPREG_FPCR 0x00 /* offset to FPCR in FPREG_SET */
|
|
#define FPREG_FPSR 0x04 /* offset to FPSR in FPREG_SET */
|
|
#define FPREG_FPTAG 0x08 /* offset to FPTAG in FPREG_SET */
|
|
#define FPREG_OP 0x0c /* offset to OP in FPREG_SET */
|
|
#define FPREG_IP 0x10 /* offset to IP in FPREG_SET */
|
|
#define FPREG_CS 0x14 /* offset to CS in FPREG_SET */
|
|
#define FPREG_DP 0x18 /* offset to DP in FPREG_SET */
|
|
#define FPREG_DS 0x1c /* offset to DS in FPREG_SET */
|
|
#define FPREG_FPX(n) (0x20 + (n)*sizeof(DOUBLEX)) /* offset to FPX(n) */
|
|
|
|
#else /* _WRS_CONFIG_LP64 */
|
|
|
|
#define XMM_NUM_REGS 8 /* number of XMM registers */
|
|
#define FP_NUM_RESERVED 14 /* reserved area in FPX_CONTEXT */
|
|
|
|
/* FPREG_SET structure offsets */
|
|
|
|
#define FPREG_FPCR 0x00 /* offset to FPCR in FPREG_SET */
|
|
#define FPREG_FPSR 0x04 /* offset to FPSR in FPREG_SET */
|
|
#define FPREG_FPTAG 0x08 /* offset to FPTAG in FPREG_SET */
|
|
#define FPREG_OP 0x0c /* offset to OP in FPREG_SET */
|
|
#define FPREG_IP 0x10 /* offset to IP in FPREG_SET */
|
|
#define FPREG_CS 0x12 /* offset to CS in FPREG_SET */
|
|
#define FPREG_DP 0x14 /* offset to DP in FPREG_SET */
|
|
#define FPREG_DS 0x18 /* offset to DS in FPREG_SET */
|
|
#define FPREG_FPX(n) (0x1c + (n)*sizeof(DOUBLEX)) /* offset to FPX(n) */
|
|
|
|
#endif /* _WRS_CONFIG_LP64 */
|
|
|
|
/* FPO_CONTEXT structure offsets */
|
|
|
|
#define FPO_CONTEXT_FPCR 0x00 /* offset to FPCR in FPO_CONTEXT */
|
|
#define FPO_CONTEXT_FPSR 0x04 /* offset to FPSR in FPO_CONTEXT */
|
|
#define FPO_CONTEXT_FPTAG 0x08 /* offset to FPTAG in FPO_CONTEXT */
|
|
#define FPO_CONTEXT_IP 0x0c /* offset to IP in FPO_CONTEXT */
|
|
#define FPO_CONTEXT_CS 0x10 /* offset to CS in FPO_CONTEXT */
|
|
#define FPO_CONTEXT_OP 0x12 /* offset to OP in FPO_CONTEXT */
|
|
#define FPO_CONTEXT_DP 0x14 /* offset to DP in FPO_CONTEXT */
|
|
#define FPO_CONTEXT_DS 0x18 /* offset to DS in FPO_CONTEXT */
|
|
#define FPO_CONTEXT_FPX(n) (0x1c + (n)*sizeof(DOUBLEX))
|
|
|
|
/* FPX_CONTEXT - structure offsets for New FP context */
|
|
|
|
#define FPX_CONTEXT_FPCR 0x00 /* offset to FPCR in FPX_CONTEXT */
|
|
#define FPX_CONTEXT_FPSR 0x02 /* offset to FPSR in FPX_CONTEXT */
|
|
#define FPX_CONTEXT_FPTAG 0x04 /* offset to FPTAG in FPX_CONTEXT */
|
|
#define FPX_CONTEXT_OP 0x06 /* offset to OP in FPX_CONTEXT */
|
|
#define FPX_CONTEXT_IP 0x08 /* offset to IP in FPX_CONTEXT */
|
|
#define FPX_CONTEXT_CS 0x0c /* offset to CS in FPX_CONTEXT */
|
|
#define FPX_CONTEXT_DP 0x10 /* offset to DP in FPX_CONTEXT */
|
|
#define FPX_CONTEXT_DS 0x14 /* offset to DS in FPX_CONTEXT */
|
|
#define FPX_CONTEXT_RSVD0 0x18 /* offset to RESERVED0 in FPX_CONTEXT */
|
|
#define FPX_CONTEXT_RSVD1 0x1c /* offset to RESERVED1 in FPX_CONTEXT */
|
|
#define FPX_CONTEXT_FPX(n) (0x20 + (n)*sizeof(DOUBLEX_SSE)) /* FPX(n) */
|
|
|
|
/* FPU Control Word register */
|
|
#define FPCR_PC_MASK 0xfcff /* Precision Control Field mask */
|
|
#define FPCR_PC_DOUBLE 0x0200 /* Double precision */
|
|
|
|
#ifndef _ASMLANGUAGE
|
|
|
|
/* DOUBLEX - double extended precision */
|
|
|
|
typedef struct
|
|
{
|
|
unsigned char f[10];
|
|
} DOUBLEX;
|
|
|
|
typedef struct
|
|
{
|
|
UCHAR f[10]; /* ST[0-7] or MM[0-7] */
|
|
UCHAR r[6]; /* reserved */
|
|
} DOUBLEX_SSE;
|
|
|
|
/* FPO_CONTEXT - Old FP context used by fsave/frstor instruction */
|
|
|
|
typedef struct fpOcontext
|
|
{
|
|
int fpcr; /* 0x00: 4 control word */
|
|
int fpsr; /* 0x04: 4 status word */
|
|
int fptag; /* 0x08: 4 tag word */
|
|
int ip; /* 0x0c: 4 instruction pointer */
|
|
short cs; /* 0x10: 2 instr pointer selector */
|
|
short op; /* 0x12: 2 last FP instr op code */
|
|
int dp; /* 0x14: 4 data pointer */
|
|
int ds; /* 0x18: 4 data pointer selector */
|
|
DOUBLEX fpx[FP_NUM_REGS]; /* 0x1c: 8*10 FR[0-7] non-TOS rel. order */
|
|
} FPO_CONTEXT; /* 108 bytes total */
|
|
|
|
/* FPX_CONTEXT - New FP context used by fxsave/fxrstor instruction */
|
|
|
|
typedef struct fpXcontext
|
|
{
|
|
short fpcr; /* 0x00: 2 control word */
|
|
short fpsr; /* 0x02: 2 status word */
|
|
short fptag; /* 0x04: 2 tag word */
|
|
short op; /* 0x06: 2 last FP instr op code */
|
|
int ip; /* 0x08: 4 instruction pointer */
|
|
int cs; /* 0x0c: 4 instr pointer selector */
|
|
int dp; /* 0x10: 4 data pointer */
|
|
int ds; /* 0x14: 4 data pointer selector */
|
|
int reserved0; /* 0x18: 4 reserved */
|
|
int reserved1; /* 0x1c: 4 reserved */
|
|
DOUBLEX_SSE fpx[FP_NUM_REGS]; /* 0x20: 8*16 FR[0-7] non-TOS rel. order */
|
|
DOUBLEX_SSE xmm[XMM_NUM_REGS]; /* 8*16 XMM[0-7] */
|
|
DOUBLEX_SSE res2[FP_NUM_RESERVED]; /* 14*16 reserved */
|
|
} FPX_CONTEXT; /* 512 bytes total */
|
|
|
|
/* FPX_EXT_CONTEXT - Extended FP context used by xsave/xrstor instruction */
|
|
|
|
typedef struct fpXExtContext
|
|
{
|
|
short fpcr; /* 0x00: 2 control word */
|
|
short fpsr; /* 0x02: 2 status word */
|
|
short fptag; /* 0x04: 2 tag word */
|
|
short op; /* 0x06: 2 last FP instr op code */
|
|
int ip; /* 0x08: 4 instr pointer */
|
|
int cs; /* 0x0c: 4 instr pointer selector */
|
|
int dp; /* 0x10: 4 data pointer */
|
|
int ds; /* 0x14: 4 data pointer selector */
|
|
int reserved0; /* 0x18: 4 reserved */
|
|
int reserved1; /* 0x20: 4 reserved */
|
|
DOUBLEX_SSE fpx[FP_NUM_REGS]; /* 0x24: 8*16 FR[0-7] */
|
|
DOUBLEX_SSE xmm[XMM_NUM_REGS]; /* 8*16 XMM[0-7] */
|
|
DOUBLEX_SSE res2[FP_NUM_RESERVED]; /* 14*16 reserved */
|
|
UCHAR xSaveHeader[XSAVE_HEADER]; /* 64 XSave header */
|
|
DOUBLEX_SSE ymm[XMM_NUM_REGS]; /* 8*16 higher 128 bits of YMM[0-7] */
|
|
} FPX_EXT_CONTEXT; /* 704 bytes total */
|
|
|
|
/* FP_CONTEXT - Common FP context */
|
|
|
|
typedef struct fpContext
|
|
{
|
|
union u
|
|
{
|
|
FPO_CONTEXT o; /* old FPO_CONTEXT for fsave/frstor */
|
|
FPX_CONTEXT x; /* new FPX_CONTEXT for fxsave/fxrstor */
|
|
FPX_EXT_CONTEXT x_ext; /* FPX_EXT_CONTEXT xsave/xrestore */
|
|
} u;
|
|
} FP_CONTEXT;
|
|
|
|
#ifdef _WRS_CONFIG_LP64
|
|
/* FPREG_SET - FP register set that is different from FP_CONTEXT */
|
|
|
|
typedef struct fpregOSet
|
|
{
|
|
int fpcr; /* 0x00: control word */
|
|
int fpsr; /* 0x04: status word */
|
|
int fptag; /* 0x08: tag word */
|
|
int op; /* 0x0c: last FP instruction op code */
|
|
int ip; /* 0x10: instruction pointer */
|
|
int cs; /* 0x14: instruction pointer selector */
|
|
int dp; /* 0x18: data pointer */
|
|
int ds; /* 0x1c: data pointer selector */
|
|
DOUBLEX fpx[FP_NUM_REGS]; /* 0x20: FR[0-7] non-TOS rel. order */
|
|
} FPREGO_SET;
|
|
|
|
#else /* _WRS_CONFIG_LP64 */
|
|
|
|
typedef FPO_CONTEXT FPREGO_SET;
|
|
|
|
#endif /* _WRS_CONFIG_LP64 */
|
|
|
|
typedef struct fpregXSet
|
|
{
|
|
int fpcr; /* 0x00: control word */
|
|
int fpsr; /* 0x04: status word */
|
|
int fptag; /* 0x08: tag word */
|
|
int op; /* 0x0c: last FP instruction op code */
|
|
int ip; /* 0x10: instruction pointer */
|
|
int cs; /* 0x14: instruction pointer selector */
|
|
int dp; /* 0x18: data pointer */
|
|
int ds; /* 0x1c: data pointer selector */
|
|
DOUBLEX fpx[FP_NUM_REGS]; /* 0x20: FR[0-7] non-TOS rel. order */
|
|
DOUBLEX_SSE xmm[XMM_NUM_REGS]; /* [8|16]*16 XMM[0-[7|15]] */
|
|
} FPREGX_SET;
|
|
|
|
typedef struct fpregXExtSet
|
|
{
|
|
int fpcr; /* 0x00: control word */
|
|
int fpsr; /* 0x04: status word */
|
|
int fptag; /* 0x08: tag word */
|
|
int op; /* 0x0c: last FP instruction op code */
|
|
int ip; /* 0x10: instruction pointer */
|
|
int cs; /* 0x14: instruction pointer selector */
|
|
int dp; /* 0x18: data pointer */
|
|
int ds; /* 0x1c: data pointer selector */
|
|
DOUBLEX fpx[FP_NUM_REGS]; /* 0x20: FR[0-7] non-TOS rel. order */
|
|
DOUBLEX_SSE xmm[XMM_NUM_REGS]; /* [8|16]*16 XMM[0-[7|15]] */
|
|
DOUBLEX_SSE ymm[XMM_NUM_REGS]; /* [8|16]*16 higher 128 bits of YMM */
|
|
} FPREGXEXT_SET;
|
|
|
|
typedef struct fpregSet
|
|
{
|
|
union n
|
|
{
|
|
FPREGO_SET o;
|
|
FPREGX_SET x;
|
|
FPREGXEXT_SET x_ext;
|
|
} n;
|
|
} FPREG_SET;
|
|
|
|
/* variable declarations */
|
|
|
|
extern REG_INDEX fpRegName[]; /* f-point data register table */
|
|
extern REG_INDEX fpCtlRegName[]; /* f-point control register table */
|
|
extern FUNCPTR fppCreateHookRtn; /* arch dependent create hook routine */
|
|
extern FUNCPTR fppDisplayHookRtn; /* arch dependent display routine */
|
|
|
|
/* func ptr to fppSave/fppXsave */
|
|
|
|
extern void (* _func_fppSaveRtn) (FP_CONTEXT *);
|
|
|
|
/* func ptr to fppRestore/fppXrestore */
|
|
|
|
extern void (* _func_fppRestoreRtn) (FP_CONTEXT *);
|
|
|
|
/* function declarations */
|
|
|
|
extern void fppArchInit (void);
|
|
extern STATUS fppProbe (void);
|
|
extern void fppDtoDx (DOUBLEX * pDx, double * pDouble);
|
|
extern void fppDxtoD (double * pDouble, DOUBLEX * pDx);
|
|
|
|
extern void fppRegsToCtx (FPREG_SET * pFpRegSet, FP_CONTEXT * pFpContext);
|
|
extern void fppCtxToRegs (FP_CONTEXT * pFpContext, FPREG_SET * pFpRegSet);
|
|
#ifdef _WRS_CONFIG_LP64
|
|
extern void fppXregsToCtx (FPREG_SET * pFpRegSet, FP_CONTEXT * pFpContext);
|
|
extern void fppXctxToRegs (FP_CONTEXT * pFpContext, FPREG_SET * pFpRegSet);
|
|
#endif /* _WRS_CONFIG_LP64 */
|
|
|
|
extern FP_CONTEXT * fppCtxCreate (TASK_ID tid);
|
|
extern STATUS fppCtxDelete (FP_CONTEXT * pCtx);
|
|
extern void fppCtxShow (FP_CONTEXT * pFpContext);
|
|
extern STATUS fppEnable (void);
|
|
extern STATUS fppDisable (void);
|
|
|
|
#endif /* _ASMLANGUAGE */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __INCfppSimntLibh */
|