Fix fmin/fmax in AOT XIP intrinsics (#1848)

This commit is contained in:
Huang Qi 2022-12-29 18:48:55 +08:00 committed by GitHub
parent 41eb938a95
commit d1fe589d43
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -218,41 +218,45 @@ aot_intrinsic_copysign_f64(float64 a, float64 b)
float32 float32
aot_intrinsic_fmin_f32(float32 a, float32 b) aot_intrinsic_fmin_f32(float32 a, float32 b)
{ {
if (isnan(a)) if (isnan(a) || isnan(b))
return a; return NAN;
else if (isnan(b)) else if (a == 0 && a == b)
return b; return signbit(a) ? a : b;
else else
return fminf(a, b); return a > b ? b : a;
} }
float64 float64
aot_intrinsic_fmin_f64(float64 a, float64 b) aot_intrinsic_fmin_f64(float64 a, float64 b)
{ {
float64 c = fmin(a, b); if (isnan(a) || isnan(b))
if (c == 0 && a == b) return NAN;
else if (a == 0 && a == b)
return signbit(a) ? a : b; return signbit(a) ? a : b;
return c; else
return a > b ? b : a;
} }
float32 float32
aot_intrinsic_fmax_f32(float32 a, float32 b) aot_intrinsic_fmax_f32(float32 a, float32 b)
{ {
if (isnan(a)) if (isnan(a) || isnan(b))
return a; return NAN;
else if (isnan(b)) else if (a == 0 && a == b)
return b; return signbit(a) ? b : a;
else else
return fmaxf(a, b); return a > b ? a : b;
} }
float64 float64
aot_intrinsic_fmax_f64(float64 a, float64 b) aot_intrinsic_fmax_f64(float64 a, float64 b)
{ {
float64 c = fmax(a, b); if (isnan(a) || isnan(b))
if (c == 0 && a == b) return NAN;
else if (a == 0 && a == b)
return signbit(a) ? b : a; return signbit(a) ? b : a;
return c; else
return a > b ? a : b;
} }
uint32 uint32