Fix 'fpclassify: ambiguous call' compile fail in MSVC 2022 (#2426)

Similar to #2219, we see "'fpclassify': ambiguous call" error in
test_conformance\basic\test_fpmath.cpp
due to missing constexpr at
https://github.com/KhronosGroup/OpenCL-CTS/blob/9265cbb2c274/test_conformance/basic/test_fpmath.cpp#L104
This PR fixes the issue by moving utility function isnan_fp in
testHarness.h and use it.
Note this PR doesn't modify use of isnan in many tests where only
float/double values are checked.
This commit is contained in:
Wenju He
2025-08-06 00:08:04 +08:00
committed by GitHub
parent 9ca0126c54
commit e15c6eb760
12 changed files with 94 additions and 107 deletions

View File

@@ -260,7 +260,7 @@ int TestFunc_HalfI_Half_Half(const Func *f, MTdata d, bool relaxedMode)
if (t[j] == q[j] && t2[j] == q2[j]) continue;
// Check for paired NaNs
if (IsHalfNaN(t[j]) && IsHalfNaN(q[j]) && t2[j] == q2[j])
if (isnan_fp(t[j]) && isnan_fp(q[j]) && t2[j] == q2[j])
continue;
cl_half test = ((cl_half *)q)[j];
@@ -282,7 +282,7 @@ int TestFunc_HalfI_Half_Half(const Func *f, MTdata d, bool relaxedMode)
// then the standard either neglects to say what is returned
// in iptr or leaves it undefined or implementation defined.
int iptrUndefined = IsHalfInfinity(p[j]) || (HTF(p2[j]) == 0.0f)
|| IsHalfNaN(p2[j]) || IsHalfNaN(p[j]);
|| isnan_fp(p2[j]) || isnan_fp(p[j]);
if (iptrUndefined) iErr = 0;
int fail = !(fabsf(err) <= half_ulps && iErr == 0);

View File

@@ -274,10 +274,10 @@ int TestFunc_Half_Half_Half_Half(const Func *f, MTdata d, bool relaxedMode)
if (skipNanInf)
{
if (overflow[j] || IsHalfInfinity(correct)
|| IsHalfNaN(correct) || IsHalfInfinity(hp0[j])
|| IsHalfNaN(hp0[j]) || IsHalfInfinity(hp1[j])
|| IsHalfNaN(hp1[j]) || IsHalfInfinity(hp2[j])
|| IsHalfNaN(hp2[j]))
|| isnan_fp(correct) || IsHalfInfinity(hp0[j])
|| isnan_fp(hp0[j]) || IsHalfInfinity(hp1[j])
|| isnan_fp(hp1[j]) || IsHalfInfinity(hp2[j])
|| isnan_fp(hp2[j]))
continue;
}
@@ -318,9 +318,9 @@ int TestFunc_Half_Half_Half_Half(const Func *f, MTdata d, bool relaxedMode)
// Note: no double rounding here. Reference
// functions calculate in single precision.
if (IsHalfInfinity(correct2)
|| IsHalfNaN(correct2)
|| isnan_fp(correct2)
|| IsHalfInfinity(correct3)
|| IsHalfNaN(correct3))
|| isnan_fp(correct3))
continue;
}
@@ -381,13 +381,13 @@ int TestFunc_Half_Half_Half_Half(const Func *f, MTdata d, bool relaxedMode)
// Note: no double rounding here. Reference
// functions calculate in single precision.
if (IsHalfInfinity(correct2)
|| IsHalfNaN(correct2)
|| isnan_fp(correct2)
|| IsHalfInfinity(correct3)
|| IsHalfNaN(correct3)
|| isnan_fp(correct3)
|| IsHalfInfinity(correct4)
|| IsHalfNaN(correct4)
|| isnan_fp(correct4)
|| IsHalfInfinity(correct5)
|| IsHalfNaN(correct5))
|| isnan_fp(correct5))
continue;
}
@@ -474,13 +474,13 @@ int TestFunc_Half_Half_Half_Half(const Func *f, MTdata d, bool relaxedMode)
// Note: no double rounding here. Reference
// functions calculate in single precision.
if (IsHalfInfinity(correct2)
|| IsHalfNaN(correct2)
|| isnan_fp(correct2)
|| IsHalfInfinity(correct3)
|| IsHalfNaN(correct3)
|| isnan_fp(correct3)
|| IsHalfInfinity(correct4)
|| IsHalfNaN(correct4)
|| isnan_fp(correct4)
|| IsHalfInfinity(correct5)
|| IsHalfNaN(correct5))
|| isnan_fp(correct5))
continue;
}
@@ -551,9 +551,9 @@ int TestFunc_Half_Half_Half_Half(const Func *f, MTdata d, bool relaxedMode)
// Note: no double rounding here. Reference
// functions calculate in single precision.
if (IsHalfInfinity(correct2)
|| IsHalfNaN(correct2)
|| isnan_fp(correct2)
|| IsHalfInfinity(correct3)
|| IsHalfNaN(correct3))
|| isnan_fp(correct3))
continue;
}
@@ -613,13 +613,13 @@ int TestFunc_Half_Half_Half_Half(const Func *f, MTdata d, bool relaxedMode)
// Note: no double rounding here. Reference
// functions calculate in single precision.
if (IsHalfInfinity(correct2)
|| IsHalfNaN(correct2)
|| isnan_fp(correct2)
|| IsHalfInfinity(correct3)
|| IsHalfNaN(correct3)
|| isnan_fp(correct3)
|| IsHalfInfinity(correct4)
|| IsHalfNaN(correct4)
|| isnan_fp(correct4)
|| IsHalfInfinity(correct5)
|| IsHalfNaN(correct5))
|| isnan_fp(correct5))
continue;
}
@@ -689,9 +689,9 @@ int TestFunc_Half_Half_Half_Half(const Func *f, MTdata d, bool relaxedMode)
// Note: no double rounding here. Reference
// functions calculate in single precision.
if (IsHalfInfinity(correct2)
|| IsHalfNaN(correct2)
|| isnan_fp(correct2)
|| IsHalfInfinity(correct3)
|| IsHalfNaN(correct3))
|| isnan_fp(correct3))
continue;
}

View File

@@ -249,9 +249,9 @@ int TestFunc_Half2_Half(const Func *f, MTdata d, bool relaxedMode)
if (skipNanInf && overflow[j]) continue;
// Note: no double rounding here. Reference functions
// calculate in single precision.
if (IsHalfInfinity(correct1) || IsHalfNaN(correct1)
|| IsHalfInfinity(correct2) || IsHalfNaN(correct2)
|| IsHalfInfinity(pIn[j]) || IsHalfNaN(pIn[j]))
if (IsHalfInfinity(correct1) || isnan_fp(correct1)
|| IsHalfInfinity(correct2) || isnan_fp(correct2)
|| IsHalfInfinity(pIn[j]) || isnan_fp(pIn[j]))
continue;
}
@@ -320,13 +320,13 @@ int TestFunc_Half2_Half(const Func *f, MTdata d, bool relaxedMode)
// Note: no double rounding here. Reference
// functions calculate in single precision.
if (IsHalfInfinity(correctp)
|| IsHalfNaN(correctp)
|| isnan_fp(correctp)
|| IsHalfInfinity(correctn)
|| IsHalfNaN(correctn)
|| isnan_fp(correctn)
|| IsHalfInfinity(correct2p)
|| IsHalfNaN(correct2p)
|| isnan_fp(correct2p)
|| IsHalfInfinity(correct2n)
|| IsHalfNaN(correct2n))
|| isnan_fp(correct2n))
continue;
}

View File

@@ -19,6 +19,7 @@
#include "harness/compat.h"
#include "harness/rounding_mode.h"
#include "harness/fpcontrol.h"
#include "harness/mathHelpers.h"
#include "harness/testHarness.h"
#include "harness/ThreadPool.h"
#include "harness/conversions.h"
@@ -172,16 +173,6 @@ inline int IsFloatNaN(double x)
return ((u.u & 0x7fffffffU) > 0x7F800000U);
}
inline bool IsHalfNaN(const cl_half v)
{
// Extract FP16 exponent and mantissa
uint16_t h_exp = (((cl_half)v) >> (CL_HALF_MANT_DIG - 1)) & 0x1F;
uint16_t h_mant = ((cl_half)v) & 0x3FF;
// NaN test
return (h_exp == 0x1F && h_mant != 0);
}
inline bool IsHalfInfinity(const cl_half v)
{
// Extract FP16 exponent and mantissa