Revision 65ce8c2f target-sparc/op_helper.c

b/target-sparc/op_helper.c
12 12
#ifdef USE_INT_TO_FLOAT_HELPERS
13 13
void do_fitos(void)
14 14
{
15
    FT0 = (float) *((int32_t *)&FT1);
15
    FT0 = int32_to_float32(*((int32_t *)&FT1));
16 16
}
17 17

  
18 18
void do_fitod(void)
19 19
{
20
    DT0 = (double) *((int32_t *)&FT1);
20
    DT0 = int32_to_float64(*((int32_t *)&FT1));
21 21
}
22 22
#endif
23 23

  
......
43 43
    DT0 = float64_sqrt(DT1, &env->fp_status);
44 44
}
45 45

  
46
#define FS 0
47
void do_fcmps (void)
48
{
49
    env->fsr &= ~((FSR_FCC1 | FSR_FCC0) << FS);
50
    if (isnan(FT0) || isnan(FT1)) {
51
        T0 = (FSR_FCC1 | FSR_FCC0) << FS;
52
	if (env->fsr & FSR_NVM) {
53
	    env->fsr |= T0;
54
	    raise_exception(TT_FP_EXCP);
55
	} else {
56
	    env->fsr |= FSR_NVA;
57
	}
58
    } else if (FT0 < FT1) {
59
        T0 = FSR_FCC0 << FS;
60
    } else if (FT0 > FT1) {
61
        T0 = FSR_FCC1 << FS;
62
    } else {
63
        T0 = 0;
46
#define GEN_FCMP(name, size, reg1, reg2, FS)                            \
47
    void glue(do_, name) (void)                                         \
48
    {                                                                   \
49
        env->fsr &= ~((FSR_FCC1 | FSR_FCC0) << FS);                     \
50
        switch (glue(size, _compare) (reg1, reg2, &env->fp_status)) {   \
51
        case float_relation_unordered:                                  \
52
            T0 = (FSR_FCC1 | FSR_FCC0) << FS;                           \
53
            if (env->fsr & FSR_NVM) {                                   \
54
                env->fsr |= T0;                                         \
55
                raise_exception(TT_FP_EXCP);                            \
56
            } else {                                                    \
57
                env->fsr |= FSR_NVA;                                    \
58
            }                                                           \
59
            break;                                                      \
60
        case float_relation_less:                                       \
61
            T0 = FSR_FCC0 << FS;                                        \
62
            break;                                                      \
63
        case float_relation_greater:                                    \
64
            T0 = FSR_FCC1 << FS;                                        \
65
            break;                                                      \
66
        default:                                                        \
67
            T0 = 0;                                                     \
68
            break;                                                      \
69
        }                                                               \
70
        env->fsr |= T0;                                                 \
64 71
    }
65
    env->fsr |= T0;
66
}
67 72

  
68
void do_fcmpd (void)
69
{
70
    env->fsr &= ~((FSR_FCC1 | FSR_FCC0) << FS);
71
    if (isnan(DT0) || isnan(DT1)) {
72
        T0 = (FSR_FCC1 | FSR_FCC0) << FS;
73
	if (env->fsr & FSR_NVM) {
74
	    env->fsr |= T0;
75
	    raise_exception(TT_FP_EXCP);
76
	} else {
77
	    env->fsr |= FSR_NVA;
78
	}
79
    } else if (DT0 < DT1) {
80
        T0 = FSR_FCC0 << FS;
81
    } else if (DT0 > DT1) {
82
        T0 = FSR_FCC1 << FS;
83
    } else {
84
        T0 = 0;
85
    }
86
    env->fsr |= T0;
87
}
73
GEN_FCMP(fcmps, float32, FT0, FT1, 0);
74
GEN_FCMP(fcmpd, float64, DT0, DT1, 0);
88 75

  
89 76
#ifdef TARGET_SPARC64
90
#undef FS
91
#define FS 22
92
void do_fcmps_fcc1 (void)
93
{
94
    env->fsr &= ~((FSR_FCC1 | FSR_FCC0) << FS);
95
    if (isnan(FT0) || isnan(FT1)) {
96
        T0 = (FSR_FCC1 | FSR_FCC0) << FS;
97
	if (env->fsr & FSR_NVM) {
98
	    env->fsr |= T0;
99
	    raise_exception(TT_FP_EXCP);
100
	} else {
101
	    env->fsr |= FSR_NVA;
102
	}
103
    } else if (FT0 < FT1) {
104
        T0 = FSR_FCC0 << FS;
105
    } else if (FT0 > FT1) {
106
        T0 = FSR_FCC1 << FS;
107
    } else {
108
        T0 = 0;
109
    }
110
    env->fsr |= T0;
111
}
112

  
113
void do_fcmpd_fcc1 (void)
114
{
115
    env->fsr &= ~((FSR_FCC1 | FSR_FCC0) << FS);
116
    if (isnan(DT0) || isnan(DT1)) {
117
        T0 = (FSR_FCC1 | FSR_FCC0) << FS;
118
	if (env->fsr & FSR_NVM) {
119
	    env->fsr |= T0;
120
	    raise_exception(TT_FP_EXCP);
121
	} else {
122
	    env->fsr |= FSR_NVA;
123
	}
124
    } else if (DT0 < DT1) {
125
        T0 = FSR_FCC0 << FS;
126
    } else if (DT0 > DT1) {
127
        T0 = FSR_FCC1 << FS;
128
    } else {
129
        T0 = 0;
130
    }
131
    env->fsr |= T0;
132
}
77
GEN_FCMP(fcmps_fcc1, float32, FT0, FT1, 22);
78
GEN_FCMP(fcmpd_fcc1, float64, DT0, DT1, 22);
133 79

  
134
#undef FS
135
#define FS 24
136
void do_fcmps_fcc2 (void)
137
{
138
    env->fsr &= ~((FSR_FCC1 | FSR_FCC0) << FS);
139
    if (isnan(FT0) || isnan(FT1)) {
140
        T0 = (FSR_FCC1 | FSR_FCC0) << FS;
141
	if (env->fsr & FSR_NVM) {
142
	    env->fsr |= T0;
143
	    raise_exception(TT_FP_EXCP);
144
	} else {
145
	    env->fsr |= FSR_NVA;
146
	}
147
    } else if (FT0 < FT1) {
148
        T0 = FSR_FCC0 << FS;
149
    } else if (FT0 > FT1) {
150
        T0 = FSR_FCC1 << FS;
151
    } else {
152
        T0 = 0;
153
    }
154
    env->fsr |= T0;
155
}
80
GEN_FCMP(fcmps_fcc2, float32, FT0, FT1, 24);
81
GEN_FCMP(fcmpd_fcc2, float64, DT0, DT1, 24);
156 82

  
157
void do_fcmpd_fcc2 (void)
158
{
159
    env->fsr &= ~((FSR_FCC1 | FSR_FCC0) << FS);
160
    if (isnan(DT0) || isnan(DT1)) {
161
        T0 = (FSR_FCC1 | FSR_FCC0) << FS;
162
	if (env->fsr & FSR_NVM) {
163
	    env->fsr |= T0;
164
	    raise_exception(TT_FP_EXCP);
165
	} else {
166
	    env->fsr |= FSR_NVA;
167
	}
168
    } else if (DT0 < DT1) {
169
        T0 = FSR_FCC0 << FS;
170
    } else if (DT0 > DT1) {
171
        T0 = FSR_FCC1 << FS;
172
    } else {
173
        T0 = 0;
174
    }
175
    env->fsr |= T0;
176
}
177

  
178
#undef FS
179
#define FS 26
180
void do_fcmps_fcc3 (void)
181
{
182
    env->fsr &= ~((FSR_FCC1 | FSR_FCC0) << FS);
183
    if (isnan(FT0) || isnan(FT1)) {
184
        T0 = (FSR_FCC1 | FSR_FCC0) << FS;
185
	if (env->fsr & FSR_NVM) {
186
	    env->fsr |= T0;
187
	    raise_exception(TT_FP_EXCP);
188
	} else {
189
	    env->fsr |= FSR_NVA;
190
	}
191
    } else if (FT0 < FT1) {
192
        T0 = FSR_FCC0 << FS;
193
    } else if (FT0 > FT1) {
194
        T0 = FSR_FCC1 << FS;
195
    } else {
196
        T0 = 0;
197
    }
198
    env->fsr |= T0;
199
}
200

  
201
void do_fcmpd_fcc3 (void)
202
{
203
    env->fsr &= ~((FSR_FCC1 | FSR_FCC0) << FS);
204
    if (isnan(DT0) || isnan(DT1)) {
205
        T0 = (FSR_FCC1 | FSR_FCC0) << FS;
206
	if (env->fsr & FSR_NVM) {
207
	    env->fsr |= T0;
208
	    raise_exception(TT_FP_EXCP);
209
	} else {
210
	    env->fsr |= FSR_NVA;
211
	}
212
    } else if (DT0 < DT1) {
213
        T0 = FSR_FCC0 << FS;
214
    } else if (DT0 > DT1) {
215
        T0 = FSR_FCC1 << FS;
216
    } else {
217
        T0 = 0;
218
    }
219
    env->fsr |= T0;
220
}
221
#undef FS
83
GEN_FCMP(fcmps_fcc3, float32, FT0, FT1, 26);
84
GEN_FCMP(fcmpd_fcc3, float64, DT0, DT1, 26);
222 85
#endif
223 86

  
224 87
#if defined(CONFIG_USER_ONLY) 
......
783 646
    set_float_rounding_mode(rnd_mode, &env->fp_status);
784 647
}
785 648

  
786
void cpu_get_fp64(uint64_t *pmant, uint16_t *pexp, double f)
787
{
788
    int exptemp;
789

  
790
    *pmant = ldexp(frexp(f, &exptemp), 53);
791
    *pexp = exptemp;
792
}
793

  
794
double cpu_put_fp64(uint64_t mant, uint16_t exp)
795
{
796
    return ldexp((double) mant, exp - 53);
797
}
798

  
799 649
void helper_debug()
800 650
{
801 651
    env->exception_index = EXCP_DEBUG;

Also available in: Unified diff