|
|
1.1 root 1: /*
2: NetWinder Floating Point Emulator
3: (c) Rebel.com, 1998-1999
4:
5: Direct questions, comments to Scott Bambrough <[email protected]>
6:
7: This program is free software; you can redistribute it and/or modify
8: it under the terms of the GNU General Public License as published by
9: the Free Software Foundation; either version 2 of the License, or
10: (at your option) any later version.
11:
12: This program is distributed in the hope that it will be useful,
13: but WITHOUT ANY WARRANTY; without even the implied warranty of
14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15: GNU General Public License for more details.
16:
17: You should have received a copy of the GNU General Public License
1.1.1.3 root 18: along with this program; if not, see <http://www.gnu.org/licenses/>.
1.1 root 19: */
20:
21: #ifndef __FPA11_H__
22: #define __FPA11_H__
23:
24: #include <stdlib.h>
25: #include <stdio.h>
26: #include <errno.h>
27:
28: #include <cpu.h>
29:
30: #define GET_FPA11() (qemufpa)
31:
32: /*
33: * The processes registers are always at the very top of the 8K
34: * stack+task struct. Use the same method as 'current' uses to
35: * reach them.
36: */
37: extern CPUARMState *user_registers;
38:
39: #define GET_USERREG() (user_registers)
40:
41: /* Need task_struct */
42: //#include <linux/sched.h>
43:
44: /* includes */
45: #include "fpsr.h" /* FP control and status register definitions */
46: #include "softfloat.h"
47:
48: #define typeNone 0x00
49: #define typeSingle 0x01
50: #define typeDouble 0x02
51: #define typeExtended 0x03
52:
53: /*
54: * This must be no more and no less than 12 bytes.
55: */
56: typedef union tagFPREG {
57: floatx80 fExtended;
58: float64 fDouble;
59: float32 fSingle;
60: } FPREG;
61:
62: /*
63: * FPA11 device model.
64: *
65: * This structure is exported to user space. Do not re-order.
66: * Only add new stuff to the end, and do not change the size of
67: * any element. Elements of this structure are used by user
68: * space, and must match struct user_fp in include/asm-arm/user.h.
69: * We include the byte offsets below for documentation purposes.
70: *
71: * The size of this structure and FPREG are checked by fpmodule.c
72: * on initialisation. If the rules have been broken, NWFPE will
73: * not initialise.
74: */
75: typedef struct tagFPA11 {
76: /* 0 */ FPREG fpreg[8]; /* 8 floating point registers */
77: /* 96 */ FPSR fpsr; /* floating point status register */
78: /* 100 */ FPCR fpcr; /* floating point control register */
79: /* 104 */ unsigned char fType[8]; /* type of floating point value held in
80: floating point registers. One of none
81: single, double or extended. */
82: /* 112 */ int initflag; /* this is special. The kernel guarantees
83: to set it to 0 when a thread is launched,
84: so we can use it to detect whether this
85: instance of the emulator needs to be
86: initialised. */
87: float_status fp_status; /* QEMU float emulator status */
88: } FPA11;
89:
90: extern FPA11* qemufpa;
91:
1.1.1.4 root 92: void resetFPA11(void);
93: void SetRoundingMode(const unsigned int);
94: void SetRoundingPrecision(const unsigned int);
1.1 root 95:
96: static inline unsigned int readRegister(unsigned int reg)
97: {
98: return (user_registers->regs[(reg)]);
99: }
100:
101: static inline void writeRegister(unsigned int x, unsigned int y)
102: {
103: #if 0
104: printf("writing %d to r%d\n",y,x);
105: #endif
106: user_registers->regs[(x)]=(y);
107: }
108:
109: static inline void writeConditionCodes(unsigned int x)
110: {
111: cpsr_write(user_registers,x,CPSR_NZCV);
112: }
113:
1.1.1.5 ! root 114: #define ARM_REG_PC 15
1.1 root 115:
116: unsigned int EmulateAll(unsigned int opcode, FPA11* qfpa, CPUARMState* qregs);
117:
1.1.1.2 root 118: unsigned int EmulateCPDO(const unsigned int);
119: unsigned int EmulateCPDT(const unsigned int);
120: unsigned int EmulateCPRT(const unsigned int);
121:
122: unsigned int SingleCPDO(const unsigned int opcode);
123: unsigned int DoubleCPDO(const unsigned int opcode);
124: unsigned int ExtendedCPDO(const unsigned int opcode);
125:
126:
1.1 root 127: /* included only for get_user/put_user macros */
128: #include "qemu.h"
129:
130: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.