This commit is contained in:
Zack Buhman 2024-04-23 20:46:18 +08:00
parent 27d9958a0a
commit a3dcf24b1c

18
c/fpu.h
View File

@ -165,10 +165,10 @@ static inline bool dn_f32_f32_f32(float32_t * a, float32_t * b, float32_t * c, u
if ((!is_nan_f32(*a)) && (!is_nan_f32(*b)) && (!is_nan_f32(*c))) { // neither input is a NaN
if (is_denormal_f32(*a) || is_denormal_f32(*b) || is_denormal_f32(*c)) { // either input is denormalized
fpscr->cause_fpu_error = 1;
return false; // do not continue
return true; // do not continue
}
}
return true;
return false;
case 1:
/*
* When FPSCR.DN is 1, a positive denormalized number is treated as
@ -179,7 +179,7 @@ static inline bool dn_f32_f32_f32(float32_t * a, float32_t * b, float32_t * c, u
if (is_denormal_f32(*a)) *a = flush_to_zero_f32(*a);
if (is_denormal_f32(*b)) *b = flush_to_zero_f32(*b);
if (is_denormal_f32(*c)) *c = flush_to_zero_f32(*c);
return true;
return false;
default:
assert(false);
}
@ -197,10 +197,10 @@ static inline bool dn_f32_f32(float32_t * a, float32_t * b, uint32_t * fps)
if ((!is_nan_f32(*a)) && (!is_nan_f32(*b))) { // neither input is a NaN
if (is_denormal_f32(*a) || is_denormal_f32(*b)) { // either input is denormalized
fpscr->cause_fpu_error = 1;
return false; // do not continue
return true; // do not continue
}
}
return true;
return false;
case 1:
/*
* When FPSCR.DN is 1, a positive denormalized number is treated as
@ -210,7 +210,7 @@ static inline bool dn_f32_f32(float32_t * a, float32_t * b, uint32_t * fps)
*/
if (is_denormal_f32(*a)) *a = flush_to_zero_f32(*a);
if (is_denormal_f32(*b)) *b = flush_to_zero_f32(*b);
return true;
return false;
default:
assert(false);
}
@ -440,7 +440,7 @@ static inline float64_t fabs_d(float64_t op1)
static inline float32_t fneg_s(float32_t op1)
{
op1.v ^= 0x80000000'00000000;
op1.v ^= 0x80000000;
return op1;
}
@ -496,7 +496,7 @@ static inline bool fcmpgt_s(float32_t op2, float32_t op1, uint32_t * fps)
if (dn_f32_f32(&op2, &op1, fps)) return false;
set_rounding_mode(fps);
bool result = f32_le(op1, op2);
bool result = f32_le(op2, op1);
update_fpscr(fps);
return !result;
}
@ -506,7 +506,7 @@ static inline bool fcmpgt_d(float64_t op2, float64_t op1, uint32_t * fps)
if (dn_f64_f64(&op2, &op1, fps)) return false;
set_rounding_mode(fps);
bool result = f64_le(op1, op2);
bool result = f64_le(op2, op1);
update_fpscr(fps);
return !result;
}