summaryrefslogtreecommitdiffstats
path: root/config
diff options
context:
space:
mode:
authorJordan Henderson <jhenderson@hdfgroup.org>2024-03-02 01:27:31 (GMT)
committerJordan Henderson <jhenderson@hdfgroup.org>2024-03-02 01:27:31 (GMT)
commita209e23d79c41b0e3d78bb8394d1b2f704d7db77 (patch)
tree12c7a284162676bbc83015c010f2ad533aa5739c /config
parent6965049700fa367d0cfe6fba211bac0ff53263ba (diff)
downloadhdf5-a209e23d79c41b0e3d78bb8394d1b2f704d7db77.zip
hdf5-a209e23d79c41b0e3d78bb8394d1b2f704d7db77.tar.gz
hdf5-a209e23d79c41b0e3d78bb8394d1b2f704d7db77.tar.bz2
Add test program to see if _Float16 really works
Diffstat (limited to 'config')
-rw-r--r--config/cmake/ConfigureChecks.cmake23
-rw-r--r--config/cmake/HDFTests.c33
2 files changed, 53 insertions, 3 deletions
diff --git a/config/cmake/ConfigureChecks.cmake b/config/cmake/ConfigureChecks.cmake
index 14e8b75..25de5b0 100644
--- a/config/cmake/ConfigureChecks.cmake
+++ b/config/cmake/ConfigureChecks.cmake
@@ -384,10 +384,27 @@ if (${HDF_PREFIX}_SIZEOF__FLOAT16)
if (h5_have_flt16_epsilon AND h5_have_flt16_min AND
h5_have_flt16_max AND h5_have_flt16_min_10_exp AND
h5_have_flt16_max_10_exp AND h5_have_flt16_mant_dig)
- set (${HDF_PREFIX}_HAVE__FLOAT16 1)
+ # Finally, some compilers like OneAPI on MSVC appear to just be broken,
+ # as support for _Float16 and its macros can be detected properly, but
+ # then code is generated that uses the __truncsfhf2, __truncdfhf2,
+ # __extendhfsf2 functions, which end up being unresolved with MSVC. Let's
+ # try to compile a program that will generate these functions as a last
+ # resort for checking for _Float16 support.
+ message (VERBOSE "Compiling test program for _Float16 support")
+ try_compile (
+ h5_compiled_float16_test
+ ${CMAKE_BINARY_DIR}
+ ${HDF_RESOURCES_DIR}/HDFTests.c
+ COMPILE_DEFINITIONS "-DCHECK_FLOAT16"
+ C_STANDARD 99
+ )
- # Check if we can use fabsf16
- CHECK_FUNCTION_EXISTS (fabsf16 ${HDF_PREFIX}_HAVE_FABSF16)
+ if (${h5_compiled_float16_test})
+ set (${HDF_PREFIX}_HAVE__FLOAT16 1)
+
+ # Check if we can use fabsf16
+ CHECK_FUNCTION_EXISTS (fabsf16 ${HDF_PREFIX}_HAVE_FABSF16)
+ endif ()
else ()
set (${HDF_PREFIX}_HAVE__FLOAT16 0)
endif ()
diff --git a/config/cmake/HDFTests.c b/config/cmake/HDFTests.c
index 095f113..fd0beb2 100644
--- a/config/cmake/HDFTests.c
+++ b/config/cmake/HDFTests.c
@@ -192,3 +192,36 @@ int main ()
}
#endif /* HAVE_IOEO */
+
+#ifdef CHECK_FLOAT16
+
+#define __STDC_WANT_IEC_60559_TYPES_EXT__
+#include <float.h>
+
+int
+main(int argc, char **argv)
+{
+ signed char a;
+ _Float16 b;
+ double c;
+
+ /* Convert signed char to _Float16 */
+ a = 1;
+ b = (_Float16)a;
+
+ /* Convert back */
+ b = 3.0f16;
+ a = (signed char)b;
+
+ /* Convert double to _Float16 */
+ c = 5.0;
+ b = (_Float16)c;
+
+ /* Convert back */
+ b = 3.0f16;
+ c = (double)b;
+
+ return 0;
+}
+
+#endif /* CHECK_FLOAT16 */