|
#include <math.h> |
|
|
#include <fenv.h> |
|
1 |
#include "exec.h" |
#include "exec.h" |
2 |
|
|
3 |
//#define DEBUG_MMU |
//#define DEBUG_MMU |
22 |
|
|
23 |
void do_fabss(void) |
void do_fabss(void) |
24 |
{ |
{ |
25 |
FT0 = fabsf(FT1); |
FT0 = float32_abs(FT1); |
26 |
} |
} |
27 |
|
|
28 |
void do_fsqrts(void) |
void do_fsqrts(void) |
29 |
{ |
{ |
30 |
FT0 = sqrtf(FT1); |
FT0 = float32_sqrt(FT1, &env->fp_status); |
31 |
} |
} |
32 |
|
|
33 |
void do_fsqrtd(void) |
void do_fsqrtd(void) |
34 |
{ |
{ |
35 |
DT0 = sqrt(DT1); |
DT0 = float64_sqrt(DT1, &env->fp_status); |
36 |
} |
} |
37 |
|
|
38 |
void do_fcmps (void) |
void do_fcmps (void) |
250 |
|
|
251 |
void helper_ldfsr(void) |
void helper_ldfsr(void) |
252 |
{ |
{ |
253 |
|
int rnd_mode; |
254 |
switch (env->fsr & FSR_RD_MASK) { |
switch (env->fsr & FSR_RD_MASK) { |
255 |
case FSR_RD_NEAREST: |
case FSR_RD_NEAREST: |
256 |
fesetround(FE_TONEAREST); |
rnd_mode = float_round_nearest_even; |
257 |
break; |
break; |
258 |
case FSR_RD_ZERO: |
case FSR_RD_ZERO: |
259 |
fesetround(FE_TOWARDZERO); |
rnd_mode = float_round_to_zero; |
260 |
break; |
break; |
261 |
case FSR_RD_POS: |
case FSR_RD_POS: |
262 |
fesetround(FE_UPWARD); |
rnd_mode = float_round_up; |
263 |
break; |
break; |
264 |
case FSR_RD_NEG: |
case FSR_RD_NEG: |
265 |
fesetround(FE_DOWNWARD); |
rnd_mode = float_round_down; |
266 |
break; |
break; |
267 |
} |
} |
268 |
|
set_float_rounding_mode(rnd_mode, &env->fp_status); |
269 |
} |
} |
270 |
|
|
271 |
void cpu_get_fp64(uint64_t *pmant, uint16_t *pexp, double f) |
void cpu_get_fp64(uint64_t *pmant, uint16_t *pexp, double f) |