1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22#ifndef __FPA11_H__
23#define __FPA11_H__
24
25#define GET_FPA11() ((FPA11 *)(¤t_thread_info()->fpstate))
26
27
28
29
30
31
32#define GET_USERREG() ((struct pt_regs *)(THREAD_START_SP + (unsigned long)current_thread_info()) - 1)
33
34#include <linux/thread_info.h>
35
36
37#include "fpsr.h"
38#include "milieu.h"
39
40struct roundingData {
41 int8 mode;
42 int8 precision;
43 signed char exception;
44};
45
46#include "softfloat.h"
47
48#define typeNone 0x00
49#define typeSingle 0x01
50#define typeDouble 0x02
51#define typeExtended 0x03
52
53
54
55
56typedef union tagFPREG {
57 float32 fSingle;
58 float64 fDouble;
59#ifdef CONFIG_FPE_NWFPE_XP
60 floatx80 fExtended;
61#else
62 u32 padding[3];
63#endif
64} __attribute__ ((packed,aligned(4))) FPREG;
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79typedef struct tagFPA11 {
80 FPREG fpreg[8];
81 FPSR fpsr;
82 FPCR fpcr;
83 unsigned char fType[8];
84
85
86 int initflag;
87
88
89
90
91} __attribute__ ((packed,aligned(4))) FPA11;
92
93extern int8 SetRoundingMode(const unsigned int);
94extern int8 SetRoundingPrecision(const unsigned int);
95extern void nwfpe_init_fpa(union fp_state *fp);
96
97extern unsigned int EmulateAll(unsigned int opcode);
98
99extern unsigned int EmulateCPDT(const unsigned int opcode);
100extern unsigned int EmulateCPDO(const unsigned int opcode);
101extern unsigned int EmulateCPRT(const unsigned int opcode);
102
103
104extern unsigned int PerformLDF(const unsigned int opcode);
105extern unsigned int PerformSTF(const unsigned int opcode);
106extern unsigned int PerformLFM(const unsigned int opcode);
107extern unsigned int PerformSFM(const unsigned int opcode);
108
109
110
111extern unsigned int SingleCPDO(struct roundingData *roundData,
112 const unsigned int opcode, FPREG * rFd);
113
114extern unsigned int DoubleCPDO(struct roundingData *roundData,
115 const unsigned int opcode, FPREG * rFd);
116
117
118extern unsigned int ExtendedCPDO(struct roundingData *roundData,
119 const unsigned int opcode, FPREG * rFd);
120
121#endif
122