Files
vxWorks/h/arch/simlinux/fppSimlinuxLib.h
2025-08-20 18:25:46 +08:00

118 lines
3.5 KiB
C

/* fppLib.h - floating-point coprocessor support library header */
/* Copyright 1984-2003 Wind River Systems, Inc. */
/*
modification history
--------------------
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 */
/* 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_IP 0x0c /* offset to IP in FPREG_SET */
#define FPREG_CS 0x10 /* offset to CS in FPREG_SET */
#define FPREG_OP 0x12 /* offset to OP 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))
/* FPU Control Word register */
#define FPCR_PC_MASK 0xfffffcff /* Precision Control Field mask */
#define FPCR_PC_DOUBLE 0x0200 /* Double precision */
#ifndef _ASMLANGUAGE
/* DOUBLEX - double extended precision */
typedef struct
{
unsigned char f[10];
} DOUBLEX;
/* FP_CONTEXT - FP context used by fsave/frstor instruction */
typedef struct fpContext /* FP_CONTEXT */
{
int fpcr; /* 4 control word (16 low bits) */
int fpsr; /* 4 status word (16 low bits) */
int fptag; /* 4 tag word (16 low bits) */
int ip; /* 4 instruction pointer offset */
short cs; /* 2 instruction pointer selector */
short op; /* 2 last FP instruction op code */
int dp; /* 4 operand pointer offset */
int ds; /* 4 operand pointer selector */
DOUBLEX fpx[FP_NUM_REGS]; /* 8*10 FR[0-7] non-TOS rel. order */
} FP_CONTEXT; /* 108 bytes total */
#define FPREG_SET FP_CONTEXT
/* 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 */
/* function declarations */
#if defined(__STDC__) || defined(__cplusplus)
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);
extern FP_CONTEXT * fppCtxCreate (int tid);
extern STATUS fppCtxDelete (FP_CONTEXT * pCtx);
extern void fppCtxShow (FP_CONTEXT * pFpContext);
extern STATUS fppEnable (void);
extern STATUS fppDisable (void);
#else
extern void fppArchInit ();
extern void fppArchTaskCreateInit ();
extern STATUS fppProbe ();
extern void fppDtoDx ();
extern void fppDxtoD ();
extern void fppRegsToCtx ();
extern void fppCtxToRegs ();
extern FP_CONTEXT * fppCtxCreate ();
extern STATUS fppCtxDelete ();
extern void fppCtxShow ();
extern STATUS fppEnable ();
extern STATUS fppDisable ();
#endif /* __STDC__ */
#endif /* _ASMLANGUAGE */
#ifdef __cplusplus
}
#endif
#endif /* __INCfppSimntLibh */