Revision 417454b0 target-sparc/op_helper.c
b/target-sparc/op_helper.c | ||
---|---|---|
9 | 9 |
cpu_loop_exit(); |
10 | 10 |
} |
11 | 11 |
|
12 |
void check_ieee_exceptions() |
|
13 |
{ |
|
14 |
T0 = get_float_exception_flags(&env->fp_status); |
|
15 |
if (T0) |
|
16 |
{ |
|
17 |
/* Copy IEEE 754 flags into FSR */ |
|
18 |
if (T0 & float_flag_invalid) |
|
19 |
env->fsr |= FSR_NVC; |
|
20 |
if (T0 & float_flag_overflow) |
|
21 |
env->fsr |= FSR_OFC; |
|
22 |
if (T0 & float_flag_underflow) |
|
23 |
env->fsr |= FSR_UFC; |
|
24 |
if (T0 & float_flag_divbyzero) |
|
25 |
env->fsr |= FSR_DZC; |
|
26 |
if (T0 & float_flag_inexact) |
|
27 |
env->fsr |= FSR_NXC; |
|
28 |
|
|
29 |
if ((env->fsr & FSR_CEXC_MASK) & ((env->fsr & FSR_TEM_MASK) >> 23)) |
|
30 |
{ |
|
31 |
/* Unmasked exception, generate a trap */ |
|
32 |
env->fsr |= FSR_FTT_IEEE_EXCP; |
|
33 |
raise_exception(TT_FP_EXCP); |
|
34 |
} |
|
35 |
else |
|
36 |
{ |
|
37 |
/* Accumulate exceptions */ |
|
38 |
env->fsr |= (env->fsr & FSR_CEXC_MASK) << 5; |
|
39 |
} |
|
40 |
} |
|
41 |
} |
|
42 |
|
|
12 | 43 |
#ifdef USE_INT_TO_FLOAT_HELPERS |
13 | 44 |
void do_fitos(void) |
14 | 45 |
{ |
46 |
set_float_exception_flags(0, &env->fp_status); |
|
15 | 47 |
FT0 = int32_to_float32(*((int32_t *)&FT1), &env->fp_status); |
48 |
check_ieee_exceptions(); |
|
16 | 49 |
} |
17 | 50 |
|
18 | 51 |
void do_fitod(void) |
... | ... | |
35 | 68 |
|
36 | 69 |
void do_fsqrts(void) |
37 | 70 |
{ |
71 |
set_float_exception_flags(0, &env->fp_status); |
|
38 | 72 |
FT0 = float32_sqrt(FT1, &env->fp_status); |
73 |
check_ieee_exceptions(); |
|
39 | 74 |
} |
40 | 75 |
|
41 | 76 |
void do_fsqrtd(void) |
42 | 77 |
{ |
78 |
set_float_exception_flags(0, &env->fp_status); |
|
43 | 79 |
DT0 = float64_sqrt(DT1, &env->fp_status); |
80 |
check_ieee_exceptions(); |
|
44 | 81 |
} |
45 | 82 |
|
46 |
#define GEN_FCMP(name, size, reg1, reg2, FS) \
|
|
83 |
#define GEN_FCMP(name, size, reg1, reg2, FS, TRAP) \
|
|
47 | 84 |
void glue(do_, name) (void) \ |
48 | 85 |
{ \ |
49 | 86 |
env->fsr &= ~((FSR_FCC1 | FSR_FCC0) << FS); \ |
50 | 87 |
switch (glue(size, _compare) (reg1, reg2, &env->fp_status)) { \ |
51 | 88 |
case float_relation_unordered: \ |
52 | 89 |
T0 = (FSR_FCC1 | FSR_FCC0) << FS; \ |
53 |
if (env->fsr & FSR_NVM) { \
|
|
90 |
if ((env->fsr & FSR_NVM) || TRAP) { \
|
|
54 | 91 |
env->fsr |= T0; \ |
92 |
env->fsr |= FSR_NVC; \ |
|
93 |
env->fsr |= FSR_FTT_IEEE_EXCP; \ |
|
55 | 94 |
raise_exception(TT_FP_EXCP); \ |
56 | 95 |
} else { \ |
57 | 96 |
env->fsr |= FSR_NVA; \ |
... | ... | |
70 | 109 |
env->fsr |= T0; \ |
71 | 110 |
} |
72 | 111 |
|
73 |
GEN_FCMP(fcmps, float32, FT0, FT1, 0); |
|
74 |
GEN_FCMP(fcmpd, float64, DT0, DT1, 0); |
|
112 |
GEN_FCMP(fcmps, float32, FT0, FT1, 0, 0); |
|
113 |
GEN_FCMP(fcmpd, float64, DT0, DT1, 0, 0); |
|
114 |
|
|
115 |
GEN_FCMP(fcmpes, float32, FT0, FT1, 0, 1); |
|
116 |
GEN_FCMP(fcmped, float64, DT0, DT1, 0, 1); |
|
75 | 117 |
|
76 | 118 |
#ifdef TARGET_SPARC64 |
77 |
GEN_FCMP(fcmps_fcc1, float32, FT0, FT1, 22); |
|
78 |
GEN_FCMP(fcmpd_fcc1, float64, DT0, DT1, 22); |
|
119 |
GEN_FCMP(fcmps_fcc1, float32, FT0, FT1, 22, 0); |
|
120 |
GEN_FCMP(fcmpd_fcc1, float64, DT0, DT1, 22, 0); |
|
121 |
|
|
122 |
GEN_FCMP(fcmps_fcc2, float32, FT0, FT1, 24, 0); |
|
123 |
GEN_FCMP(fcmpd_fcc2, float64, DT0, DT1, 24, 0); |
|
124 |
|
|
125 |
GEN_FCMP(fcmps_fcc3, float32, FT0, FT1, 26, 0); |
|
126 |
GEN_FCMP(fcmpd_fcc3, float64, DT0, DT1, 26, 0); |
|
127 |
|
|
128 |
GEN_FCMP(fcmpes_fcc1, float32, FT0, FT1, 22, 1); |
|
129 |
GEN_FCMP(fcmped_fcc1, float64, DT0, DT1, 22, 1); |
|
79 | 130 |
|
80 |
GEN_FCMP(fcmps_fcc2, float32, FT0, FT1, 24);
|
|
81 |
GEN_FCMP(fcmpd_fcc2, float64, DT0, DT1, 24);
|
|
131 |
GEN_FCMP(fcmpes_fcc2, float32, FT0, FT1, 24, 1);
|
|
132 |
GEN_FCMP(fcmped_fcc2, float64, DT0, DT1, 24, 1);
|
|
82 | 133 |
|
83 |
GEN_FCMP(fcmps_fcc3, float32, FT0, FT1, 26);
|
|
84 |
GEN_FCMP(fcmpd_fcc3, float64, DT0, DT1, 26);
|
|
134 |
GEN_FCMP(fcmpes_fcc3, float32, FT0, FT1, 26, 1);
|
|
135 |
GEN_FCMP(fcmped_fcc3, float64, DT0, DT1, 26, 1);
|
|
85 | 136 |
#endif |
86 | 137 |
|
87 | 138 |
#if defined(CONFIG_USER_ONLY) |
Also available in: Unified diff