fpsr.h 3.8 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
/*
    NetWinder Floating Point Emulator
    (c) Rebel.com, 1998-1999

    Direct questions, comments to Scott Bambrough <scottb@netwinder.org>

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

#ifndef __FPSR_H__
#define __FPSR_H__

/*
The FPSR is a 32 bit register consisting of 4 parts, each exactly
one byte.

	SYSTEM ID
	EXCEPTION TRAP ENABLE BYTE
	SYSTEM CONTROL BYTE
	CUMULATIVE EXCEPTION FLAGS BYTE
33

L
Linus Torvalds 已提交
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
The FPCR is a 32 bit register consisting of bit flags.
*/

/* SYSTEM ID
------------
Note: the system id byte is read only  */

typedef unsigned int FPSR;	/* type for floating point status register */
typedef unsigned int FPCR;	/* type for floating point control register */

#define MASK_SYSID		0xff000000
#define BIT_HARDWARE		0x80000000
#define FP_EMULATOR		0x01000000	/* System ID for emulator */
#define FP_ACCELERATOR		0x81000000	/* System ID for FPA11 */

/* EXCEPTION TRAP ENABLE BYTE
----------------------------- */

#define MASK_TRAP_ENABLE	0x00ff0000
#define MASK_TRAP_ENABLE_STRICT	0x001f0000
#define BIT_IXE		0x00100000	/* inexact exception enable */
#define BIT_UFE		0x00080000	/* underflow exception enable */
#define BIT_OFE		0x00040000	/* overflow exception enable */
#define BIT_DZE		0x00020000	/* divide by zero exception enable */
#define BIT_IOE		0x00010000	/* invalid operation exception enable */

/* SYSTEM CONTROL BYTE
---------------------- */

#define MASK_SYSTEM_CONTROL	0x0000ff00
#define MASK_TRAP_STRICT	0x00001f00

#define BIT_AC	0x00001000	/* use alternative C-flag definition
				   for compares */
#define BIT_EP	0x00000800	/* use expanded packed decimal format */
#define BIT_SO	0x00000400	/* select synchronous operation of FPA */
#define BIT_NE	0x00000200	/* NaN exception bit */
#define BIT_ND	0x00000100	/* no denormalized numbers bit */

/* CUMULATIVE EXCEPTION FLAGS BYTE
---------------------------------- */

#define MASK_EXCEPTION_FLAGS		0x000000ff
#define MASK_EXCEPTION_FLAGS_STRICT	0x0000001f

#define BIT_IXC		0x00000010	/* inexact exception flag */
#define BIT_UFC		0x00000008	/* underflow exception flag */
#define BIT_OFC		0x00000004	/* overfloat exception flag */
#define BIT_DZC		0x00000002	/* divide by zero exception flag */
#define BIT_IOC		0x00000001	/* invalid operation exception flag */

/* Floating Point Control Register
----------------------------------*/

#define BIT_RU		0x80000000	/* rounded up bit */
#define BIT_IE		0x10000000	/* inexact bit */
#define BIT_MO		0x08000000	/* mantissa overflow bit */
#define BIT_EO		0x04000000	/* exponent overflow bit */
#define BIT_SB		0x00000800	/* store bounce */
#define BIT_AB		0x00000400	/* arithmetic bounce */
#define BIT_RE		0x00000200	/* rounding exception */
#define BIT_DA		0x00000100	/* disable FPA */

#define MASK_OP		0x00f08010	/* AU operation code */
#define MASK_PR		0x00080080	/* AU precision */
#define MASK_S1		0x00070000	/* AU source register 1 */
#define MASK_S2		0x00000007	/* AU source register 2 */
#define MASK_DS		0x00007000	/* AU destination register */
#define MASK_RM		0x00000060	/* AU rounding mode */
#define MASK_ALU	0x9cfff2ff	/* only ALU can write these bits */
#define MASK_RESET	0x00000d00	/* bits set on reset, all others cleared */
#define MASK_WFC	MASK_RESET
#define MASK_RFC	~MASK_RESET

#endif