Files
m241Neelima/vxworks-6.9/target/h/arch/simlinux/fppSimlinuxLib.h
T
2026-07-30 11:19:44 +05:30

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 */