Revision 5fafdf24 target-arm/nwfpe/fpa11_cprt.c
b/target-arm/nwfpe/fpa11_cprt.c | ||
---|---|---|
55 | 55 |
{ |
56 | 56 |
case FLT_CODE >> 20: nRc = PerformFLT(opcode); break; |
57 | 57 |
case FIX_CODE >> 20: nRc = PerformFIX(opcode); break; |
58 |
|
|
58 |
|
|
59 | 59 |
case WFS_CODE >> 20: writeFPSR(readRegister(getRd(opcode))); break; |
60 | 60 |
case RFS_CODE >> 20: writeRegister(getRd(opcode),readFPSR()); break; |
61 | 61 |
|
... | ... | |
67 | 67 |
|
68 | 68 |
default: nRc = 0; |
69 | 69 |
} |
70 |
|
|
70 |
|
|
71 | 71 |
return nRc; |
72 | 72 |
} |
73 | 73 |
|
74 | 74 |
unsigned int PerformFLT(const unsigned int opcode) |
75 | 75 |
{ |
76 | 76 |
FPA11 *fpa11 = GET_FPA11(); |
77 |
|
|
77 |
|
|
78 | 78 |
unsigned int nRc = 1; |
79 | 79 |
SetRoundingMode(opcode); |
80 | 80 |
|
... | ... | |
95 | 95 |
int32_to_float64(readRegister(getRd(opcode)), &fpa11->fp_status); |
96 | 96 |
} |
97 | 97 |
break; |
98 |
|
|
98 |
|
|
99 | 99 |
case ROUND_EXTENDED: |
100 | 100 |
{ |
101 | 101 |
fpa11->fType[getFn(opcode)] = typeExtended; |
... | ... | |
103 | 103 |
int32_to_floatx80(readRegister(getRd(opcode)), &fpa11->fp_status); |
104 | 104 |
} |
105 | 105 |
break; |
106 |
|
|
106 |
|
|
107 | 107 |
default: nRc = 0; |
108 | 108 |
} |
109 |
|
|
109 |
|
|
110 | 110 |
return nRc; |
111 | 111 |
} |
112 | 112 |
|
... | ... | |
115 | 115 |
FPA11 *fpa11 = GET_FPA11(); |
116 | 116 |
unsigned int nRc = 1; |
117 | 117 |
unsigned int Fn = getFm(opcode); |
118 |
|
|
118 |
|
|
119 | 119 |
SetRoundingMode(opcode); |
120 | 120 |
|
121 | 121 |
switch (fpa11->fType[Fn]) |
... | ... | |
134 | 134 |
float64_to_int32(fpa11->fpreg[Fn].fDouble, &fpa11->fp_status)); |
135 | 135 |
} |
136 | 136 |
break; |
137 |
|
|
137 |
|
|
138 | 138 |
case typeExtended: |
139 | 139 |
{ |
140 | 140 |
writeRegister(getRd(opcode), |
141 | 141 |
floatx80_to_int32(fpa11->fpreg[Fn].fExtended, &fpa11->fp_status)); |
142 | 142 |
} |
143 | 143 |
break; |
144 |
|
|
144 |
|
|
145 | 145 |
default: nRc = 0; |
146 | 146 |
} |
147 |
|
|
147 |
|
|
148 | 148 |
return nRc; |
149 | 149 |
} |
150 | 150 |
|
151 |
|
|
151 |
|
|
152 | 152 |
static unsigned int __inline__ |
153 | 153 |
PerformComparisonOperation(floatx80 Fn, floatx80 Fm) |
154 | 154 |
{ |
... | ... | |
160 | 160 |
{ |
161 | 161 |
flags |= CC_NEGATIVE; |
162 | 162 |
} |
163 |
|
|
163 |
|
|
164 | 164 |
/* test for equal condition */ |
165 | 165 |
if (floatx80_eq(Fn,Fm, &fpa11->fp_status)) |
166 | 166 |
{ |
... | ... | |
172 | 172 |
{ |
173 | 173 |
flags |= CC_CARRY; |
174 | 174 |
} |
175 |
|
|
175 |
|
|
176 | 176 |
writeConditionCodes(flags); |
177 | 177 |
return 1; |
178 | 178 |
} |
179 | 179 |
|
180 | 180 |
/* This instruction sets the flags N, Z, C, V in the FPSR. */ |
181 |
|
|
181 |
|
|
182 | 182 |
static unsigned int PerformComparison(const unsigned int opcode) |
183 | 183 |
{ |
184 | 184 |
FPA11 *fpa11 = GET_FPA11(); |
... | ... | |
200 | 200 |
comparison (cheaper than an 80-bit one). */ |
201 | 201 |
switch (fpa11->fType[Fn]) |
202 | 202 |
{ |
203 |
case typeSingle:
|
|
203 |
case typeSingle: |
|
204 | 204 |
//printk("single.\n"); |
205 | 205 |
if (float32_is_nan(fpa11->fpreg[Fn].fSingle)) |
206 | 206 |
goto unordered; |
207 | 207 |
rFn = float32_to_floatx80(fpa11->fpreg[Fn].fSingle, &fpa11->fp_status); |
208 | 208 |
break; |
209 | 209 |
|
210 |
case typeDouble:
|
|
210 |
case typeDouble: |
|
211 | 211 |
//printk("double.\n"); |
212 | 212 |
if (float64_is_nan(fpa11->fpreg[Fn].fDouble)) |
213 | 213 |
goto unordered; |
214 | 214 |
rFn = float64_to_floatx80(fpa11->fpreg[Fn].fDouble, &fpa11->fp_status); |
215 | 215 |
break; |
216 |
|
|
217 |
case typeExtended:
|
|
216 |
|
|
217 |
case typeExtended: |
|
218 | 218 |
//printk("extended.\n"); |
219 | 219 |
if (floatx80_is_nan(fpa11->fpreg[Fn].fExtended)) |
220 | 220 |
goto unordered; |
221 | 221 |
rFn = fpa11->fpreg[Fn].fExtended; |
222 | 222 |
break; |
223 |
|
|
223 |
|
|
224 | 224 |
default: return 0; |
225 | 225 |
} |
226 | 226 |
|
... | ... | |
236 | 236 |
//printk("Fm = r%d which contains a ",Fm); |
237 | 237 |
switch (fpa11->fType[Fm]) |
238 | 238 |
{ |
239 |
case typeSingle:
|
|
239 |
case typeSingle: |
|
240 | 240 |
//printk("single.\n"); |
241 | 241 |
if (float32_is_nan(fpa11->fpreg[Fm].fSingle)) |
242 | 242 |
goto unordered; |
243 | 243 |
rFm = float32_to_floatx80(fpa11->fpreg[Fm].fSingle, &fpa11->fp_status); |
244 | 244 |
break; |
245 | 245 |
|
246 |
case typeDouble:
|
|
246 |
case typeDouble: |
|
247 | 247 |
//printk("double.\n"); |
248 | 248 |
if (float64_is_nan(fpa11->fpreg[Fm].fDouble)) |
249 | 249 |
goto unordered; |
250 | 250 |
rFm = float64_to_floatx80(fpa11->fpreg[Fm].fDouble, &fpa11->fp_status); |
251 | 251 |
break; |
252 |
|
|
253 |
case typeExtended:
|
|
252 |
|
|
253 |
case typeExtended: |
|
254 | 254 |
//printk("extended.\n"); |
255 | 255 |
if (floatx80_is_nan(fpa11->fpreg[Fm].fExtended)) |
256 | 256 |
goto unordered; |
257 | 257 |
rFm = fpa11->fpreg[Fm].fExtended; |
258 | 258 |
break; |
259 |
|
|
259 |
|
|
260 | 260 |
default: return 0; |
261 | 261 |
} |
262 | 262 |
} |
Also available in: Unified diff