Annotation of qemu/linux-user/arm/nwfpe/fpa11.h, revision 1.1.1.3

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: 
                     92: extern void resetFPA11(void);
                     93: extern void SetRoundingMode(const unsigned int);
                     94: extern void SetRoundingPrecision(const unsigned int);
                     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: 
                    114: #define REG_PC 15
                    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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.