118 lines
3.5 KiB
C
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 */
|