annotate packages/hal/mips/arch/current/src/mipsfp.c @ 208:e0c0827131d1 ecos

Merge from eCos master repository on 2002-05-20-20:11:54-BST
author jlarmour
date Mon, 20 May 2002 22:19:26 +0000
parents 08ffab08d2ee
children d2c90368aeef
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
1 //==========================================================================
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
2 //
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
3 // mipsfp.c
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
4 //
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
5 // HAL miscellaneous functions
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
6 //
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
7 //==========================================================================
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 92
diff changeset
8 //####ECOSGPLCOPYRIGHTBEGIN####
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 92
diff changeset
9 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 92
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 92
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 92
diff changeset
12 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 92
diff changeset
13 // eCos is free software; you can redistribute it and/or modify it under
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 92
diff changeset
14 // the terms of the GNU General Public License as published by the Free
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 92
diff changeset
15 // Software Foundation; either version 2 or (at your option) any later version.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 92
diff changeset
16 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 92
diff changeset
17 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 92
diff changeset
18 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 92
diff changeset
19 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 92
diff changeset
20 // for more details.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 92
diff changeset
21 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 92
diff changeset
22 // You should have received a copy of the GNU General Public License along
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 92
diff changeset
23 // with eCos; if not, write to the Free Software Foundation, Inc.,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 92
diff changeset
24 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 92
diff changeset
25 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 92
diff changeset
26 // As a special exception, if other files instantiate templates or use macros
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 92
diff changeset
27 // or inline functions from this file, or you compile this file and link it
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 92
diff changeset
28 // with other works to produce a work based on this file, this file does not
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 92
diff changeset
29 // by itself cause the resulting work to be covered by the GNU General Public
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 92
diff changeset
30 // License. However the source code for this file must still be made available
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 92
diff changeset
31 // in accordance with section (3) of the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 92
diff changeset
32 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 92
diff changeset
33 // This exception does not invalidate any other reasons why a work based on
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 92
diff changeset
34 // this file might be covered by the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 92
diff changeset
35 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 92
diff changeset
36 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 92
diff changeset
37 // at http://sources.redhat.com/ecos/ecos-license
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 92
diff changeset
38 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 92
diff changeset
39 //####ECOSGPLCOPYRIGHTEND####
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
40 //==========================================================================
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
41 //#####DESCRIPTIONBEGIN####
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
42 //
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
43 // Author(s): jlarmour
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
44 // Contributors: jlarmour
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
45 // Date: 1999-07-13
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
46 // Purpose: Emulate unimplemented FP operations on MIPS architectures
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
47 // Description: This catches the unimplemented operation excetion only,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
48 // and if possible deals with it so processing can continue
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
49 // as if the MIPS had a proper IEEE FPU
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
50 //
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
51 //
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
52 //####DESCRIPTIONEND####
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
53 //
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
54 //========================================================================*/
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
55
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
56 // CONFIGURATION
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
57
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
58 #include <pkgconf/hal.h>
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
59
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
60 #ifdef CYGHWR_HAL_MIPS_FPU
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
61
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
62 // INCLUDES
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
63
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
64 #include <cyg/infra/cyg_type.h> // Standard eCos types
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
65 #include <cyg/infra/cyg_ass.h> // Standard eCos assertion support
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
66 #include <cyg/infra/cyg_trac.h> // Standard eCos tracing support
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
67 #include <cyg/hal/hal_intr.h> // HAL interrupt vectors
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
68 #include <cyg/hal/hal_arch.h> // Architecture types such as
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
69 // HAL_SavedRegisters
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
70 #define CYGARC_HAL_COMMON_EXPORT_CPU_MACROS
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
71 #include <cyg/hal/mips-regs.h> // MIPS register and bitmask definitions
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
72
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
73 // TYPES
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
74
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
75 // The following types were taken from <sys/ieeefp.h> from libm.
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
76
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
77 #if (CYG_BYTEORDER == CYG_MSBFIRST) // Big endian
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
78
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
79 typedef union
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
80 {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
81 cyg_int32 asi32[2];
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
82
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
83 cyg_int64 asi64;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
84
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
85 double value;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
86
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
87 struct
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
88 {
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
89 #if (CYG_DOUBLE_BYTEORDER == CYG_MSBFIRST)
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
90 unsigned int sign : 1;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
91 unsigned int exponent: 11;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
92 unsigned int fraction0:4;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
93 unsigned int fraction1:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
94 unsigned int fraction2:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
95 unsigned int fraction3:16;
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
96 #else
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
97 unsigned int fraction2:16;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
98 unsigned int fraction3:16;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
99 unsigned int sign : 1;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
100 unsigned int exponent: 11;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
101 unsigned int fraction0:4;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
102 unsigned int fraction1:16;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
103 #endif
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
104 } number;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
105
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
106 struct
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
107 {
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
108 #if (CYG_DOUBLE_BYTEORDER == CYG_MSBFIRST)
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
109 unsigned int sign : 1;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
110 unsigned int exponent: 11;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
111 unsigned int quiet:1;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
112 unsigned int function0:3;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
113 unsigned int function1:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
114 unsigned int function2:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
115 unsigned int function3:16;
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
116 #else
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
117 unsigned int function2:16;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
118 unsigned int function3:16;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
119 unsigned int sign : 1;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
120 unsigned int exponent: 11;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
121 unsigned int quiet:1;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
122 unsigned int function0:3;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
123 unsigned int function1:16;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
124 #endif
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
125 } nan;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
126
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
127 struct
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
128 {
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
129 #if (CYG_DOUBLE_BYTEORDER == CYG_MSBFIRST)
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
130 cyg_uint32 msw;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
131 cyg_uint32 lsw;
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
132 #else
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
133 cyg_uint32 lsw;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
134 cyg_uint32 msw;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
135 #endif
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
136 } parts;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
137
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
138
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
139 } Cyg_libm_ieee_double_shape_type;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
140
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
141
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
142 typedef union
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
143 {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
144 cyg_int32 asi32;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
145
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
146 float value;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
147
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
148 struct
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
149 {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
150 unsigned int sign : 1;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
151 unsigned int exponent: 8;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
152 unsigned int fraction0: 7;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
153 unsigned int fraction1: 16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
154 } number;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
155
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
156 struct
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
157 {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
158 unsigned int sign:1;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
159 unsigned int exponent:8;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
160 unsigned int quiet:1;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
161 unsigned int function0:6;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
162 unsigned int function1:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
163 } nan;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
164
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
165 } Cyg_libm_ieee_float_shape_type;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
166
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
167
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
168 #else // Little endian
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
169
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
170 typedef union
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
171 {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
172 cyg_int32 asi32[2];
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
173
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
174 cyg_int64 asi64;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
175
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
176 double value;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
177
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
178 struct
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
179 {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
180 #if (CYG_DOUBLE_BYTEORDER == CYG_MSBFIRST) // Big endian
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
181 unsigned int fraction1:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
182 unsigned int fraction0: 4;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
183 unsigned int exponent :11;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
184 unsigned int sign : 1;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
185 unsigned int fraction3:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
186 unsigned int fraction2:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
187 #else
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
188 unsigned int fraction3:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
189 unsigned int fraction2:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
190 unsigned int fraction1:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
191 unsigned int fraction0: 4;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
192 unsigned int exponent :11;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
193 unsigned int sign : 1;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
194 #endif
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
195 } number;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
196
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
197 struct
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
198 {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
199 #if (CYG_DOUBLE_BYTEORDER == CYG_MSBFIRST) // Big endian
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
200 unsigned int function1:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
201 unsigned int function0:3;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
202 unsigned int quiet:1;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
203 unsigned int exponent: 11;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
204 unsigned int sign : 1;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
205 unsigned int function3:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
206 unsigned int function2:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
207 #else
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
208 unsigned int function3:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
209 unsigned int function2:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
210 unsigned int function1:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
211 unsigned int function0:3;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
212 unsigned int quiet:1;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
213 unsigned int exponent: 11;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
214 unsigned int sign : 1;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
215 #endif
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
216 } nan;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
217
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
218 struct
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
219 {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
220 #if (CYG_DOUBLE_BYTEORDER == CYG_MSBFIRST) // Big endian
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
221 cyg_uint32 msw;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
222 cyg_uint32 lsw;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
223 #else
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
224 cyg_uint32 lsw;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
225 cyg_uint32 msw;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
226 #endif
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
227 } parts;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
228
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
229 } Cyg_libm_ieee_double_shape_type;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
230
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
231
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
232 typedef union
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
233 {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
234 cyg_int32 asi32;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
235
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
236 float value;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
237
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
238 struct
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
239 {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
240 unsigned int fraction0: 7;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
241 unsigned int fraction1: 16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
242 unsigned int exponent: 8;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
243 unsigned int sign : 1;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
244 } number;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
245
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
246 struct
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
247 {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
248 unsigned int function1:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
249 unsigned int function0:6;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
250 unsigned int quiet:1;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
251 unsigned int exponent:8;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
252 unsigned int sign:1;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
253 } nan;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
254
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
255 } Cyg_libm_ieee_float_shape_type;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
256
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
257 #endif // little-endian
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
258
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
259 typedef enum {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
260 ADD_INSN=0, // 0
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
261 SUB_INSN,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
262 MUL_INSN,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
263 DIV_INSN,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
264 SQRT_INSN,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
265 ABS_INSN, // 5
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
266 MOV_INSN,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
267 NEG_INSN,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
268 ROUNDL_INSN,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
269 TRUNCL_INSN,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
270 CEILL_INSN, // 10
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
271 FLOORL_INSN,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
272 ROUNDW_INSN,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
273 TRUNCW_INSN,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
274 CEILW_INSN,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
275 FLOORW_INSN, // 15
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
276 // ...
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
277 CVTS_INSN=32,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
278 CVTD_INSN,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
279 // ...
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
280 CVTW_INSN=36,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
281 CVTL_INSN,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
282 // ...
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
283 //
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
284 // 48-63 are floating point compare - treated separately
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
285
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
286 } fp_operation;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
287
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
288 typedef enum {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
289 S_FORMAT=16,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
290 D_FORMAT=17,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
291 W_FORMAT=20,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
292 L_FORMAT=21
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
293 } fp_format;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
294
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
295 // FUNCTIONS
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
296
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
297 #define issubnormal(_x_) ((_x_).number.exponent == 0)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
298
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
299 // These functions convert between single precision floating point numbers
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
300 // represented in register or union form. This is required because endian-ness
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
301 // matters when a 32-bit float is in a 64-bit register.
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
302
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
303 static __inline__ void
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
304 reg2flt( CYG_HAL_FPU_REG *fpu_reg_p, Cyg_libm_ieee_float_shape_type *flt)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
305 {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
306 #if defined(CYGHWR_HAL_MIPS_FPU_32BIT) || (CYG_BYTEORDER == CYG_LSBFIRST)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
307 flt->asi32 = *(cyg_int32 *)fpu_reg_p;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
308 #else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
309 flt->asi32 = *((cyg_int32 *)fpu_reg_p + 1);
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
310 # endif
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
311 } // reg2flt()
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
312
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
313 static __inline__ void
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
314 flt2reg( Cyg_libm_ieee_float_shape_type *flt, CYG_HAL_FPU_REG *fpu_reg_p )
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
315 {
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
316 #if defined(CYGHWR_HAL_MIPS_FPU_32BIT) || (CYG_BYTEORDER == CYG_LSBFIRST)
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
317 *(cyg_int32 *)fpu_reg_p = flt->asi32;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
318 #else
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
319 *((cyg_int32 *)fpu_reg_p + 1) = flt->asi32;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
320 # endif
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
321 } // flt2reg()
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
322
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
323 static __inline__ void
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
324 reg2dbl( CYG_HAL_FPU_REG *fpu_reg_p, Cyg_libm_ieee_double_shape_type *flt)
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
325 {
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
326 flt->asi64 = *(cyg_int64 *)fpu_reg_p;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
327 } // reg2dbl()
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
328
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
329 static __inline__ void
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
330 dbl2reg( Cyg_libm_ieee_double_shape_type *flt, CYG_HAL_FPU_REG *fpu_reg_p )
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
331 {
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
332 *(cyg_uint64*)fpu_reg_p = flt->asi64;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
333 } // dbl2reg()
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
334
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
335
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
336 // This function returns non-zero if the exception has been handled
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
337 // successfully.
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
338
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
339 // FIXME: Arguably we should raise underflow exceptions in some of the cases
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
340 // below e.g. sqrt(subnormal). And perhaps we should round appropriately to
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
341 // +/- 2^^Emin if round to +/- infinity is enabled, as per the FS bit. Not sure.
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
342
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
343 externC cyg_uint8
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
344 cyg_hal_mips_process_fpe( HAL_SavedRegisters *regs )
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
345 {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
346 CYG_WORD insn;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
347 CYG_HAL_FPU_REG *srcreg1, *srcreg2, *dstreg;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
348 cyg_uint8 handled=0;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
349 fp_format format;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
350 cyg_uint8 fp64bit=0; // true if format is 64bit, false if 32bit
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
351 cyg_uint8 fixedpoint=0; // true if format is fixed point, false if
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
352 // floating point
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
353 cyg_uint8 computational_insn=1; // computational FP instruction
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
354 cyg_bool delay_slot; // did it happen in a delay slot
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
355
30
641b639be825 Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents: 26
diff changeset
356 CYG_REPORT_FUNCNAMETYPE("cyg_hal_mips_process_fpe", "returning %d");
641b639be825 Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents: 26
diff changeset
357
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
358 CYG_CHECK_DATA_PTR( regs,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
359 "cyg_hal_mips_process_fpe() called with invalid regs ptr");
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
360
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
361 CYG_PRECONDITION( (regs->vector>>2) == CYGNUM_HAL_VECTOR_FPE,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
362 "Asked to process non-FPE exception");
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
363
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
364 // First of all, we only handle the unimplemented operation exception
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
365 // here, so if we don't have that, we just exit
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
366 if ((regs->fcr31 & FCR31_CAUSE_E) == 0) {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
367 CYG_REPORT_RETVAL(0);
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
368 return 0;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
369 }
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
370
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
371 // Get the contents of the instruction that caused the exception. This
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
372 // may have been in a branch delay slot however, so we have to check
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
373 // the BD bit in the cause register first.
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
374 if (regs->cause & CAUSE_BD) {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
375 insn = *(((CYG_WORD *) regs->pc) + 1);
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
376 delay_slot = true;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
377 } else {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
378 insn = *(CYG_WORD *) regs->pc;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
379 delay_slot = false;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
380 }
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
381
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
382 CYG_TRACE2(true, "exception at pc %08x containing %08x", regs->pc, insn);
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
383
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
384 CYG_ASSERT( (insn>>26) == 0x11,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
385 "Instruction at pc doesn't have expected opcode COP1");
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
386
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
387 // Determine the format
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
388 format = (insn >> 21) & 0x1f;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
389
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
390 switch (format)
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
391 {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
392 case S_FORMAT:
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
393 break;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
394 case D_FORMAT:
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
395 fp64bit++;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
396 break;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
397 case W_FORMAT:
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
398 fixedpoint++;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
399 break;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
400 case L_FORMAT:
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
401 fixedpoint++;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
402 fp64bit++;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
403 break;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
404 default:
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
405 computational_insn=0;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
406 break;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
407 } // switch
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
408
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
409 // This module only emulates computational floating point instructions
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
410 if (computational_insn && !fixedpoint) {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
411
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
412 // Decode the registers used
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
413 dstreg = &regs->f[ (insn >> 6) & 0x1f ];
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
414 srcreg1 = &regs->f[ (insn >> 11) & 0x1f ];
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
415 srcreg2 = &regs->f[ (insn >> 16) & 0x1f ];
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
416
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
417 // Determine the operation requested
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
418 switch (insn & 0x3f)
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
419 {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
420 case ADD_INSN:
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
421 case SUB_INSN:
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
422 case MUL_INSN:
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
423 case DIV_INSN:
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
424
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
425 if (fp64bit) {
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
426 Cyg_libm_ieee_double_shape_type s1, s2;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
427
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
428 reg2dbl( srcreg1, &s1 );
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
429 reg2dbl( srcreg2, &s2 );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
430
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
431 if ( issubnormal( s1 ) ) { // flush to 0 and restart
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
432 // but preserve sign
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
433 if (s1.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
434 s1.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
435 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
436 s1.value = 0.0;
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
437 dbl2reg( &s1, srcreg1 );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
438 handled++;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
439 }
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
440
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
441 // We could try flushing both to 0 at the same time, but
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
442 // that's inadvisable if both numbers are very small.
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
443 // Particularly if this is DIV_INSN, when we could therefore
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
444 // get 0/0 even when the program explicitly checked for
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
445 // denominator != 0. That's also why we check s1 first.
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
446
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
447 else if ( issubnormal( s2 ) ) { // flush to 0 and restart
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
448 // but preserve sign
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
449 if (s2.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
450 s2.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
451 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
452 s2.value = 0.0;
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
453 dbl2reg( &s2, srcreg2 );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
454 handled++;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
455 }
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
456
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
457 } else { // 32-bit
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
458 Cyg_libm_ieee_float_shape_type s1, s2;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
459
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
460 reg2flt( srcreg1, &s1 );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
461 reg2flt( srcreg2, &s2 );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
462
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
463 if ( issubnormal( s1 )) { // flush to 0 and restart
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
464 // but preserve sign
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
465 if (s1.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
466 s1.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
467 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
468 s1.value = 0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
469 flt2reg( &s1, srcreg1 );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
470 handled++;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
471 }
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
472 else if ( issubnormal( s2 ) ) { // flush to 0 and restart
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
473 // but preserve sign
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
474 if (s2.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
475 s2.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
476 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
477 s2.value = 0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
478 flt2reg( &s2, srcreg2 );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
479 handled++;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
480 }
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
481 }
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
482 break;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
483
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
484 case SQRT_INSN:
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
485 if ( fp64bit ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
486 Cyg_libm_ieee_double_shape_type d, s;
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
487
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
488 reg2dbl( dstreg, &d );
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
489 reg2dbl( srcreg1, &s );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
490
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
491 if ( issubnormal( s ) ) { // Sqrt of something tiny is 0
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
492 // if this is a delay slot, we can't restart properly
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
493 // so if it is subnormal, clear the source register instead
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
494 if ( delay_slot ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
495 // but preserve sign
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
496 if (s.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
497 s.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
498 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
499 s.value = 0.0;
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
500 dbl2reg( &s, srcreg1 );
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
501 } else {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
502 // but preserve sign
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
503 if (s.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
504 d.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
505 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
506 d.value = 0.0;
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
507 dbl2reg( &d, dstreg );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
508 regs->pc += 4; // We've dealt with this so move on
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
509 }
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
510 handled++;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
511 }
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
512
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
513 } else { // 32-bit
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
514 Cyg_libm_ieee_float_shape_type d, s;
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
515
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
516 reg2flt( dstreg, &d );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
517 reg2flt( srcreg1, &s );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
518
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
519 if ( issubnormal( s ) ) { // Sqrt of something tiny is 0
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
520 // if this is a delay slot, we can't restart properly
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
521 // so if it is subnormal, clear the source register instead
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
522 if ( delay_slot ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
523 // but preserve sign
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
524 if (s.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
525 s.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
526 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
527 s.value = 0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
528 flt2reg( &s, srcreg1 );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
529 } else {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
530 // but preserve sign
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
531 if (s.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
532 d.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
533 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
534 d.value = 0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
535 flt2reg( &d, dstreg );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
536 regs->pc += 4; // We've dealt with this so move on
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
537 }
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
538 handled++;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
539 }
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
540 }
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
541 break;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
542
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
543 case ABS_INSN:
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
544 // We may as well do this right if we can
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
545 if ( fp64bit ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
546 Cyg_libm_ieee_double_shape_type d, s;
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
547
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
548 reg2dbl( dstreg, &d );
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
549 reg2dbl( srcreg1, &s );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
550
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
551 // if this is a delay slot, we can't restart properly
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
552 // so if it is subnormal, clear the source register instead
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
553 if ( delay_slot ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
554 if ( issubnormal( s ) ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
555 // The sign is still important for abs in case
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
556 // there are any further operations on the same
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
557 // register
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
558 if (s.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
559 s.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
560 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
561 s.value = 0.0;
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
562 dbl2reg( &s, srcreg1 );
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
563 handled++;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
564 }
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
565 } else {
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
566 d.asi64 = s.asi64;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
567 d.number.sign = 0;
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
568 dbl2reg( &d, dstreg );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
569 regs->pc += 4;
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
570 handled++;
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
571 }
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
572 } else { // 32-bit
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
573 Cyg_libm_ieee_float_shape_type d, s;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
574
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
575 reg2flt( dstreg, &d );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
576 reg2flt( srcreg1, &s );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
577
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
578 // if this is a delay slot, we can't restart properly
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
579 // so if it is subnormal, clear the source register instead
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
580 if ( delay_slot ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
581 if ( issubnormal( s ) ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
582 // The sign is still important for abs in case
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
583 // there are any further operations on the same
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
584 // register
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
585 if (s.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
586 s.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
587 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
588 s.value = 0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
589 flt2reg( &s, srcreg1 );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
590 handled++;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
591 }
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
592 } else {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
593 d.asi32 = s.asi32;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
594 d.number.sign = 0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
595 flt2reg( &d, dstreg );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
596 regs->pc += 4;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
597 handled++;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
598 }
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
599 }
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
600 break;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
601
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
602 case MOV_INSN:
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
603 // We may as well do this right if we can
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
604 if ( fp64bit ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
605 Cyg_libm_ieee_double_shape_type d, s;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
606
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
607 reg2dbl( dstreg, &d );
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
608 reg2dbl( srcreg1, &s );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
609
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
610 // if this is a delay slot, we can't restart properly
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
611 // so if it is subnormal, clear the source register instead
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
612 if ( delay_slot ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
613 if ( issubnormal( s ) ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
614 // but preserve sign
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
615 if (s.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
616 s.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
617 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
618 s.value = 0.0;
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
619 dbl2reg( &s, srcreg1 );
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
620 handled++;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
621 }
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
622 } else {
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
623 d.asi64 = s.asi64;
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
624 dbl2reg( &d, dstreg );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
625 regs->pc += 4;
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
626 handled++;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
627 }
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
628 } else { // 32-bit
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
629 Cyg_libm_ieee_float_shape_type d, s;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
630
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
631 reg2flt( dstreg, &d );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
632 reg2flt( srcreg1, &s );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
633
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
634 // if this is a delay slot, we can't restart properly
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
635 // so if it is subnormal, clear the source register instead
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
636 if ( delay_slot ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
637 if ( issubnormal( s ) ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
638 // The sign is still important for abs in case
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
639 // there are any further operations on the same
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
640 // register
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
641 if (s.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
642 s.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
643 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
644 s.value = 0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
645 flt2reg( &s, srcreg1 );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
646 handled++;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
647 }
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
648 } else {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
649 d.asi32 = s.asi32;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
650 flt2reg( &d, dstreg );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
651 regs->pc += 4;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
652 handled++;
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
653 }
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
654 }
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
655 break;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
656
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
657 case NEG_INSN:
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
658 // We may as well do this right if we can
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
659 if ( fp64bit ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
660 Cyg_libm_ieee_double_shape_type d, s;
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
661
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
662 reg2dbl( dstreg, &d );
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
663 reg2dbl( srcreg1, &s );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
664
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
665 // if this is a delay slot, we can't restart properly
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
666 // so if it is subnormal, clear the source register instead
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
667 if ( delay_slot ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
668 if ( issubnormal( s ) ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
669 // but preserve sign
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
670 if (s.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
671 s.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
672 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
673 s.value = 0.0;
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
674 dbl2reg( &s, srcreg1 );
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
675 handled++;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
676 }
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
677 } else {
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
678 d.asi64 = s.asi64;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
679 d.number.sign = s.number.sign ? 0 : 1;
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
680 dbl2reg( &d, dstreg );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
681 regs->pc += 4;
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
682 handled++;
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
683 }
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
684 } else { // 32-bit
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
685 Cyg_libm_ieee_float_shape_type d, s;
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
686
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
687 reg2flt( dstreg, &d );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
688 reg2flt( srcreg1, &s );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
689
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
690 // if this is a delay slot, we can't restart properly
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
691 // so if it is subnormal, clear the source register instead
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
692 if ( delay_slot ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
693 if ( issubnormal( s ) ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
694 // but preserve sign
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
695 if (s.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
696 s.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
697 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
698 s.value = 0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
699 flt2reg( &s, srcreg1 );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
700 handled++;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
701 }
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
702 } else {
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
703 d.asi32 = s.asi32;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
704 d.number.sign = s.number.sign ? 0 : 1;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
705 flt2reg( &d, dstreg );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
706 regs->pc += 4;
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
707 handled++;
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
708 }
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
709 }
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
710 break;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
711
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
712 // We can't do much about floating-point to fixed-point arithmetic
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
713 // without emulating the FPU here ourselves!
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
714 // So simply zero denormalized numbers
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
715 case ROUNDL_INSN:
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
716 case TRUNCL_INSN:
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
717 case CEILL_INSN:
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
718 case FLOORL_INSN:
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
719 case ROUNDW_INSN:
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
720 case TRUNCW_INSN:
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
721 case CEILW_INSN:
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
722 case FLOORW_INSN:
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
723 case CVTS_INSN:
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
724 case CVTD_INSN:
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
725 case CVTW_INSN:
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
726 case CVTL_INSN:
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
727
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
728 if ( fp64bit ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
729 Cyg_libm_ieee_double_shape_type s;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
730
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
731 reg2dbl( srcreg1, &s );
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
732
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
733 // just try and 0 the source register if it is subnormal
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
734 if ( issubnormal( s ) ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
735 // but preserve sign
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
736 if (s.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
737 s.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
738 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
739 s.value = 0.0;
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
740 dbl2reg( &s, srcreg1 );
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
741 handled++;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
742 }
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
743 } else { // 32-bit
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
744 Cyg_libm_ieee_float_shape_type s;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
745
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
746 reg2flt( srcreg1, &s );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
747
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
748 // just try and 0 the source register if it is subnormal
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
749 if ( issubnormal( s ) ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
750 // but preserve sign
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
751 if (s.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
752 s.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
753 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
754 s.value = 0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
755 flt2reg( &s, srcreg1 );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
756 handled++;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
757 }
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
758 }
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
759 break;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
760
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
761 default:
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
762 // check for floating-point compare (C.cond.fmt)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
763 if ( (insn & 0x30) == 0x30 ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
764 if (fp64bit) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
765 Cyg_libm_ieee_double_shape_type s1, s2;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
766
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
767 reg2dbl( srcreg1, &s1 );
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
768 reg2dbl( srcreg2, &s2 );
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
769
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
770 if ( issubnormal( s1 ) ) { // flush to 0 and restart
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
771 // but preserve sign
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
772 if (s1.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
773 s1.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
774 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
775 s1.value = 0.0;
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
776 dbl2reg( &s1, srcreg1 );
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
777 handled++;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
778 }
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
779
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
780 if ( issubnormal( s2 ) ) { // flush to 0 and restart
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
781 // but preserve sign
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
782 if (s2.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
783 s2.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
784 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
785 s2.value = 0.0;
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
786 dbl2reg( &s2, srcreg2 );
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
787 handled++;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
788 }
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
789
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
790 } else { // 32-bit
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
791 Cyg_libm_ieee_float_shape_type s1, s2;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
792
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
793 reg2flt( srcreg1, &s1 );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
794 reg2flt( srcreg2, &s2 );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
795
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
796 if ( issubnormal( s1 )) { // flush to 0 and restart
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
797 // but preserve sign
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
798 if (s1.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
799 s1.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
800 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
801 s1.value = 0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
802 flt2reg( &s1, srcreg1 );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
803 handled++;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
804 }
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
805 if ( issubnormal( s2 ) ) { // flush to 0 and restart
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
806 // but preserve sign
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
807 if (s2.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
808 s2.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
809 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
810 s2.value = 0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
811 flt2reg( &s2, srcreg2 );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
812 handled++;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
813 }
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
814 } // else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
815 } // if
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
816 break;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
817 } // switch
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
818 } // if (computational_insn && !fixedpoint)
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
819
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
820 if ( handled != 0) {
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
821 // We must clear the cause and flag bits before restoring FPCR31
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
822 regs->fcr31 &= ~(FCR31_CAUSE_E | FCR31_CAUSE_V | FCR31_CAUSE_Z |
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
823 FCR31_CAUSE_O | FCR31_CAUSE_U | FCR31_CAUSE_I |
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
824 FCR31_FLAGS_V | FCR31_FLAGS_Z |
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
825 FCR31_FLAGS_O | FCR31_FLAGS_U | FCR31_FLAGS_I);
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
826
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
827 }
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
828
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
829 CYG_REPORT_RETVAL( handled );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
830 return handled;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
831 } // cyg_hal_mips_process_fpe()
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
832
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
833 #endif // ifdef CYGHWR_HAL_MIPS_FPU
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
834
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
835 // EOF mipsfp.c