annotate packages/hal/mips/arch/current/src/mipsfp.c @ 92:08ffab08d2ee ecos-sw-2000-05-26

Merge from eCos master repository on 2000-05-26-07:47:03-BST
author jlarmour
date Fri, 26 May 2000 13:46:34 +0000
parents bf00f99aec69
children e0c0827131d1
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 //==========================================================================
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
8 //####COPYRIGHTBEGIN####
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
9 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
10 // -------------------------------------------
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
11 // The contents of this file are subject to the Red Hat eCos Public License
66
bf00f99aec69 Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents: 64
diff changeset
12 // Version 1.1 (the "License"); you may not use this file except in
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
13 // compliance with the License. You may obtain a copy of the License at
66
bf00f99aec69 Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents: 64
diff changeset
14 // http://www.redhat.com/
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
15 //
66
bf00f99aec69 Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents: 64
diff changeset
16 // Software distributed under the License is distributed on an "AS IS"
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
18 // License for the specific language governing rights and limitations under
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
19 // the License.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
20 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
21 // The Original Code is eCos - Embedded Configurable Operating System,
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
22 // released September 30, 1998.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
23 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
24 // The Initial Developer of the Original Code is Red Hat.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
25 // Portions created by Red Hat are
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
26 // Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
27 // All Rights Reserved.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
28 // -------------------------------------------
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 62
diff changeset
29 //
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
30 //####COPYRIGHTEND####
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
31 //==========================================================================
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
32 //#####DESCRIPTIONBEGIN####
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
33 //
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
34 // Author(s): jlarmour
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
35 // Contributors: jlarmour
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
36 // Date: 1999-07-13
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
37 // 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
38 // 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
39 // 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
40 // 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
41 //
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 //####DESCRIPTIONEND####
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
44 //
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
45 //========================================================================*/
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
46
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
47 // CONFIGURATION
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
48
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
49 #include <pkgconf/hal.h>
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 #ifdef CYGHWR_HAL_MIPS_FPU
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
52
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
53 // INCLUDES
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 #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
56 #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
57 #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
58 #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
59 #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
60 // HAL_SavedRegisters
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
61 #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
62 #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
63
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
64 // TYPES
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
65
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
66 // 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
67
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
68 #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
69
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
70 typedef union
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
71 {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
72 cyg_int32 asi32[2];
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
73
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
74 cyg_int64 asi64;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
75
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
76 double value;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
77
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
78 struct
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
79 {
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
80 #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
81 unsigned int sign : 1;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
82 unsigned int exponent: 11;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
83 unsigned int fraction0:4;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
84 unsigned int fraction1:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
85 unsigned int fraction2:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
86 unsigned int fraction3:16;
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
87 #else
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
88 unsigned int fraction2:16;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
89 unsigned int fraction3:16;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
90 unsigned int sign : 1;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
91 unsigned int exponent: 11;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
92 unsigned int fraction0:4;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
93 unsigned int fraction1:16;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
94 #endif
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
95 } number;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
96
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
97 struct
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
98 {
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
99 #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
100 unsigned int sign : 1;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
101 unsigned int exponent: 11;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
102 unsigned int quiet:1;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
103 unsigned int function0:3;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
104 unsigned int function1:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
105 unsigned int function2:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
106 unsigned int function3:16;
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
107 #else
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
108 unsigned int function2:16;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
109 unsigned int function3:16;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
110 unsigned int sign : 1;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
111 unsigned int exponent: 11;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
112 unsigned int quiet:1;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
113 unsigned int function0:3;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
114 unsigned int function1:16;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
115 #endif
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
116 } nan;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
117
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
118 struct
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
119 {
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
120 #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
121 cyg_uint32 msw;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
122 cyg_uint32 lsw;
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
123 #else
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
124 cyg_uint32 lsw;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
125 cyg_uint32 msw;
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
126 #endif
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
127 } parts;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
128
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
129
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
130 } Cyg_libm_ieee_double_shape_type;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
131
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
132
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
133 typedef union
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
134 {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
135 cyg_int32 asi32;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
136
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
137 float value;
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 struct
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 unsigned int sign : 1;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
142 unsigned int exponent: 8;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
143 unsigned int fraction0: 7;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
144 unsigned int fraction1: 16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
145 } number;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
146
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
147 struct
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
148 {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
149 unsigned int sign:1;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
150 unsigned int exponent:8;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
151 unsigned int quiet:1;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
152 unsigned int function0:6;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
153 unsigned int function1:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
154 } nan;
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 } Cyg_libm_ieee_float_shape_type;
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
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
159 #else // Little endian
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
160
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
161 typedef union
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
162 {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
163 cyg_int32 asi32[2];
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_int64 asi64;
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 double value;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
168
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
169 struct
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
170 {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
171 #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
172 unsigned int fraction1:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
173 unsigned int fraction0: 4;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
174 unsigned int exponent :11;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
175 unsigned int sign : 1;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
176 unsigned int fraction3:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
177 unsigned int fraction2:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
178 #else
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
179 unsigned int fraction3:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
180 unsigned int fraction2:16;
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 #endif
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
186 } number;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
187
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
188 struct
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
189 {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
190 #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
191 unsigned int function1:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
192 unsigned int function0:3;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
193 unsigned int quiet:1;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
194 unsigned int exponent: 11;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
195 unsigned int sign : 1;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
196 unsigned int function3:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
197 unsigned int function2:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
198 #else
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
199 unsigned int function3:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
200 unsigned int function2:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
201 unsigned int function1:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
202 unsigned int function0:3;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
203 unsigned int quiet:1;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
204 unsigned int exponent: 11;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
205 unsigned int sign : 1;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
206 #endif
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
207 } nan;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
208
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
209 struct
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
210 {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
211 #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
212 cyg_uint32 msw;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
213 cyg_uint32 lsw;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
214 #else
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
215 cyg_uint32 lsw;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
216 cyg_uint32 msw;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
217 #endif
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
218 } parts;
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 } Cyg_libm_ieee_double_shape_type;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
221
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
222
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
223 typedef union
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
224 {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
225 cyg_int32 asi32;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
226
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
227 float value;
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 struct
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 unsigned int fraction0: 7;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
232 unsigned int fraction1: 16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
233 unsigned int exponent: 8;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
234 unsigned int sign : 1;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
235 } number;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
236
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
237 struct
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
238 {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
239 unsigned int function1:16;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
240 unsigned int function0:6;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
241 unsigned int quiet:1;
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 } nan;
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 } Cyg_libm_ieee_float_shape_type;
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 #endif // little-endian
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
249
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
250 typedef enum {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
251 ADD_INSN=0, // 0
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
252 SUB_INSN,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
253 MUL_INSN,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
254 DIV_INSN,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
255 SQRT_INSN,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
256 ABS_INSN, // 5
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
257 MOV_INSN,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
258 NEG_INSN,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
259 ROUNDL_INSN,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
260 TRUNCL_INSN,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
261 CEILL_INSN, // 10
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
262 FLOORL_INSN,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
263 ROUNDW_INSN,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
264 TRUNCW_INSN,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
265 CEILW_INSN,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
266 FLOORW_INSN, // 15
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
267 // ...
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
268 CVTS_INSN=32,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
269 CVTD_INSN,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
270 // ...
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
271 CVTW_INSN=36,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
272 CVTL_INSN,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
273 // ...
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
274 //
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
275 // 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
276
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
277 } fp_operation;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
278
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
279 typedef enum {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
280 S_FORMAT=16,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
281 D_FORMAT=17,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
282 W_FORMAT=20,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
283 L_FORMAT=21
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
284 } fp_format;
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 // FUNCTIONS
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
287
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
288 #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
289
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
290 // 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
291 // 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
292 // 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
293
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
294 static __inline__ void
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
295 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
296 {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
297 #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
298 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
299 #else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
300 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
301 # endif
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
302 } // reg2flt()
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
303
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
304 static __inline__ void
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
305 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
306 {
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
307 #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
308 *(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
309 #else
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
310 *((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
311 # endif
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
312 } // flt2reg()
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
313
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
314 static __inline__ void
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
315 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
316 {
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
317 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
318 } // reg2dbl()
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
319
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
320 static __inline__ void
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
321 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
322 {
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
323 *(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
324 } // dbl2reg()
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
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
327 // 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
328 // successfully.
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
329
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
330 // 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
331 // 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
332 // +/- 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
333
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
334 externC cyg_uint8
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
335 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
336 {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
337 CYG_WORD insn;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
338 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
339 cyg_uint8 handled=0;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
340 fp_format format;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
341 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
342 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
343 // floating point
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
344 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
345 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
346
30
641b639be825 Merge from eCos master repository on 1999-08-16-22:01:37-BST
jlarmour
parents: 26
diff changeset
347 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
348
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
349 CYG_CHECK_DATA_PTR( regs,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
350 "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
351
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
352 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
353 "Asked to process non-FPE exception");
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
354
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
355 // 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
356 // 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
357 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
358 CYG_REPORT_RETVAL(0);
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
359 return 0;
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
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
362 // 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
363 // 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
364 // 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
365 if (regs->cause & CAUSE_BD) {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
366 insn = *(((CYG_WORD *) regs->pc) + 1);
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
367 delay_slot = true;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
368 } else {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
369 insn = *(CYG_WORD *) regs->pc;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
370 delay_slot = false;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
371 }
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
372
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
373 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
374
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
375 CYG_ASSERT( (insn>>26) == 0x11,
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
376 "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
377
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
378 // Determine the format
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
379 format = (insn >> 21) & 0x1f;
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 switch (format)
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
382 {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
383 case S_FORMAT:
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
384 break;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
385 case D_FORMAT:
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
386 fp64bit++;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
387 break;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
388 case W_FORMAT:
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
389 fixedpoint++;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
390 break;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
391 case L_FORMAT:
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
392 fixedpoint++;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
393 fp64bit++;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
394 break;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
395 default:
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
396 computational_insn=0;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
397 break;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
398 } // switch
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
399
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
400 // 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
401 if (computational_insn && !fixedpoint) {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
402
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
403 // Decode the registers used
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
404 dstreg = &regs->f[ (insn >> 6) & 0x1f ];
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
405 srcreg1 = &regs->f[ (insn >> 11) & 0x1f ];
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
406 srcreg2 = &regs->f[ (insn >> 16) & 0x1f ];
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
407
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
408 // Determine the operation requested
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
409 switch (insn & 0x3f)
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
410 {
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
411 case ADD_INSN:
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
412 case SUB_INSN:
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
413 case MUL_INSN:
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
414 case DIV_INSN:
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
415
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
416 if (fp64bit) {
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
417 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
418
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
419 reg2dbl( srcreg1, &s1 );
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
420 reg2dbl( srcreg2, &s2 );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
421
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
422 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
423 // but preserve sign
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
424 if (s1.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
425 s1.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
426 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
427 s1.value = 0.0;
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
428 dbl2reg( &s1, srcreg1 );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
429 handled++;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
430 }
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
431
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
432 // 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
433 // 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
434 // 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
435 // 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
436 // 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
437
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
438 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
439 // but preserve sign
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
440 if (s2.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
441 s2.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
442 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
443 s2.value = 0.0;
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
444 dbl2reg( &s2, srcreg2 );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
445 handled++;
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
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
448 } else { // 32-bit
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
449 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
450
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
451 reg2flt( srcreg1, &s1 );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
452 reg2flt( srcreg2, &s2 );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
453
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
454 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
455 // but preserve sign
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
456 if (s1.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
457 s1.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
458 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
459 s1.value = 0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
460 flt2reg( &s1, srcreg1 );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
461 handled++;
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 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
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 (s2.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
466 s2.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 s2.value = 0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
469 flt2reg( &s2, srcreg2 );
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 }
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
472 }
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
473 break;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
474
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
475 case SQRT_INSN:
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
476 if ( fp64bit ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
477 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
478
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
479 reg2dbl( dstreg, &d );
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
480 reg2dbl( srcreg1, &s );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
481
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
482 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
483 // 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
484 // 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
485 if ( delay_slot ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
486 // but preserve sign
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
487 if (s.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
488 s.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
489 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
490 s.value = 0.0;
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
491 dbl2reg( &s, srcreg1 );
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
492 } else {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
493 // but preserve sign
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
494 if (s.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
495 d.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
496 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
497 d.value = 0.0;
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
498 dbl2reg( &d, dstreg );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
499 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
500 }
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
501 handled++;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
502 }
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
503
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
504 } else { // 32-bit
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
505 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
506
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
507 reg2flt( dstreg, &d );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
508 reg2flt( srcreg1, &s );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
509
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
510 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
511 // 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
512 // 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
513 if ( delay_slot ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
514 // but preserve sign
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
515 if (s.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
516 s.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
517 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
518 s.value = 0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
519 flt2reg( &s, srcreg1 );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
520 } else {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
521 // but preserve sign
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
522 if (s.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
523 d.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
524 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
525 d.value = 0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
526 flt2reg( &d, dstreg );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
527 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
528 }
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
529 handled++;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
530 }
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
531 }
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
532 break;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
533
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
534 case ABS_INSN:
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
535 // 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
536 if ( fp64bit ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
537 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
538
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
539 reg2dbl( dstreg, &d );
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
540 reg2dbl( srcreg1, &s );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
541
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
542 // 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
543 // 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
544 if ( delay_slot ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
545 if ( issubnormal( s ) ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
546 // 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
547 // 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
548 // register
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
549 if (s.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
550 s.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
551 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
552 s.value = 0.0;
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
553 dbl2reg( &s, srcreg1 );
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
554 handled++;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
555 }
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
556 } else {
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
557 d.asi64 = s.asi64;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
558 d.number.sign = 0;
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
559 dbl2reg( &d, dstreg );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
560 regs->pc += 4;
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
561 handled++;
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
562 }
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
563 } else { // 32-bit
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
564 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
565
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
566 reg2flt( dstreg, &d );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
567 reg2flt( srcreg1, &s );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
568
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
569 // 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
570 // 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
571 if ( delay_slot ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
572 if ( issubnormal( s ) ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
573 // 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
574 // 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
575 // register
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
576 if (s.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
577 s.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
578 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
579 s.value = 0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
580 flt2reg( &s, srcreg1 );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
581 handled++;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
582 }
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
583 } else {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
584 d.asi32 = s.asi32;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
585 d.number.sign = 0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
586 flt2reg( &d, dstreg );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
587 regs->pc += 4;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
588 handled++;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
589 }
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
590 }
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
591 break;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
592
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
593 case MOV_INSN:
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
594 // 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
595 if ( fp64bit ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
596 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
597
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
598 reg2dbl( dstreg, &d );
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
599 reg2dbl( srcreg1, &s );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
600
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
601 // 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
602 // 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
603 if ( delay_slot ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
604 if ( issubnormal( s ) ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
605 // but preserve sign
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
606 if (s.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
607 s.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
608 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
609 s.value = 0.0;
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
610 dbl2reg( &s, srcreg1 );
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
611 handled++;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
612 }
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
613 } else {
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
614 d.asi64 = s.asi64;
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
615 dbl2reg( &d, dstreg );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
616 regs->pc += 4;
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
617 handled++;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
618 }
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
619 } else { // 32-bit
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
620 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
621
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
622 reg2flt( dstreg, &d );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
623 reg2flt( srcreg1, &s );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
624
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
625 // 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
626 // 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
627 if ( delay_slot ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
628 if ( issubnormal( s ) ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
629 // 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
630 // 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
631 // register
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
632 if (s.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
633 s.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
634 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
635 s.value = 0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
636 flt2reg( &s, srcreg1 );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
637 handled++;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
638 }
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
639 } else {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
640 d.asi32 = s.asi32;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
641 flt2reg( &d, dstreg );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
642 regs->pc += 4;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
643 handled++;
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
644 }
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
645 }
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
646 break;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
647
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
648 case NEG_INSN:
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
649 // 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
650 if ( fp64bit ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
651 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
652
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
653 reg2dbl( dstreg, &d );
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
654 reg2dbl( srcreg1, &s );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
655
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
656 // 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
657 // 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
658 if ( delay_slot ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
659 if ( issubnormal( s ) ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
660 // but preserve sign
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
661 if (s.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
662 s.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
663 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
664 s.value = 0.0;
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
665 dbl2reg( &s, srcreg1 );
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
666 handled++;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
667 }
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
668 } else {
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
669 d.asi64 = s.asi64;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
670 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
671 dbl2reg( &d, dstreg );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
672 regs->pc += 4;
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
673 handled++;
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
674 }
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
675 } else { // 32-bit
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
676 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
677
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
678 reg2flt( dstreg, &d );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
679 reg2flt( srcreg1, &s );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
680
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
681 // 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
682 // 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
683 if ( delay_slot ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
684 if ( issubnormal( s ) ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
685 // but preserve sign
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
686 if (s.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
687 s.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
688 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
689 s.value = 0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
690 flt2reg( &s, srcreg1 );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
691 handled++;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
692 }
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
693 } else {
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
694 d.asi32 = s.asi32;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
695 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
696 flt2reg( &d, dstreg );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
697 regs->pc += 4;
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
698 handled++;
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
699 }
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
700 }
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
701 break;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
702
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
703 // 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
704 // 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
705 // So simply zero denormalized numbers
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
706 case ROUNDL_INSN:
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
707 case TRUNCL_INSN:
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
708 case CEILL_INSN:
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
709 case FLOORL_INSN:
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
710 case ROUNDW_INSN:
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
711 case TRUNCW_INSN:
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
712 case CEILW_INSN:
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
713 case FLOORW_INSN:
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
714 case CVTS_INSN:
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
715 case CVTD_INSN:
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
716 case CVTW_INSN:
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
717 case CVTL_INSN:
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
718
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
719 if ( fp64bit ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
720 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
721
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
722 reg2dbl( srcreg1, &s );
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
723
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
724 // 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
725 if ( issubnormal( s ) ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
726 // but preserve sign
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
727 if (s.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
728 s.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
729 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
730 s.value = 0.0;
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
731 dbl2reg( &s, srcreg1 );
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
732 handled++;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
733 }
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
734 } else { // 32-bit
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
735 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
736
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
737 reg2flt( srcreg1, &s );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
738
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
739 // 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
740 if ( issubnormal( s ) ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
741 // but preserve sign
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
742 if (s.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
743 s.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
744 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
745 s.value = 0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
746 flt2reg( &s, srcreg1 );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
747 handled++;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
748 }
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
749 }
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
750 break;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
751
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
752 default:
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
753 // 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
754 if ( (insn & 0x30) == 0x30 ) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
755 if (fp64bit) {
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
756 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
757
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
758 reg2dbl( srcreg1, &s1 );
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
759 reg2dbl( srcreg2, &s2 );
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
760
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
761 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
762 // but preserve sign
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
763 if (s1.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
764 s1.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
765 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
766 s1.value = 0.0;
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
767 dbl2reg( &s1, srcreg1 );
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
768 handled++;
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
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
771 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
772 // but preserve sign
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
773 if (s2.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
774 s2.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
775 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
776 s2.value = 0.0;
92
08ffab08d2ee Merge from eCos master repository on 2000-05-26-07:47:03-BST
jlarmour
parents: 66
diff changeset
777 dbl2reg( &s2, srcreg2 );
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
778 handled++;
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
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
781 } else { // 32-bit
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
782 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
783
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
784 reg2flt( srcreg1, &s1 );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
785 reg2flt( srcreg2, &s2 );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
786
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
787 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
788 // but preserve sign
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
789 if (s1.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
790 s1.value = -0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
791 else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
792 s1.value = 0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
793 flt2reg( &s1, srcreg1 );
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
794 handled++;
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( 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
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 (s2.number.sign)
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
799 s2.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 s2.value = 0.0;
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
802 flt2reg( &s2, srcreg2 );
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 } // else
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
806 } // if
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
807 break;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
808 } // switch
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
809 } // if (computational_insn && !fixedpoint)
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
810
62
7a6ac9edc838 Merge from eCos master repository on 2000-01-24-19:43:49-GMT
jlarmour
parents: 30
diff changeset
811 if ( handled != 0) {
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
812 // 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
813 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
814 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
815 FCR31_FLAGS_V | FCR31_FLAGS_Z |
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
816 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
817
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
818 }
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 CYG_REPORT_RETVAL( handled );
26
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
821 return handled;
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
822 } // cyg_hal_mips_process_fpe()
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
823
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
824 #endif // ifdef CYGHWR_HAL_MIPS_FPU
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
825
4741a3c3496a Merge from eCos master repository on 1999-07-23-05:47:06-BST
jlarmour
parents:
diff changeset
826 // EOF mipsfp.c