PATCH [2/5] Vector math functions infrastructure

Message ID CAMXFM3tnZiJdTCpbECMJ620mJphNwjRf4Th5zmLm9jMpW4TGHA@mail.gmail.com
State Committed
Headers

Commit Message

Andrew Senkevich April 27, 2015, 1:37 p.m. UTC
  This patch (in the git am form) is refactoring of START for conditions
in individual tests and addition of macros used for runtime
architecture check.
End of previous discussion is
https://sourceware.org/ml/libc-alpha/2014-12/msg00057.html

Ok for thunk?

2015-04-27  Andrew Senkevich  <andrew.senkevich@intel.com>

        * math/libm-test.inc: START refactored.
        * math/test-double.c (TEST_MATHVEC): Add define.
        * math/test-float.c: Likewise.
        * math/test-idouble.c: Likewise.
        * math/test-ifloat.c: Likewise.
        * math/test-ildoubl.c: Likewise.
        * math/test-ldouble.c: Likewise.
        * sysdeps/generic/math-tests-arch.h (INIT_ARCH_EXT, CHECK_ARCH_EXT):
        New helper macros for runtime architecture check.

From 8f8a001c8503ee0e87aba44e445dc436cf5a8b46 Mon Sep 17 00:00:00 2001
From: Andrew Senkevich <andrew.senkevich@intel.com>
Date: Mon, 27 Apr 2015 15:35:37 +0300
Subject: [PATCH 2/5]

Refactoring of START for conditions in individual tests
and addition of macros used for runtime architecture check.

2015-04-27  Andrew Senkevich  <andrew.senkevich@intel.com>

    * math/libm-test.inc: START refactored.
    * math/test-double.c (TEST_MATHVEC): Add define.
    * math/test-float.c: Likewise.
    * math/test-idouble.c: Likewise.
    * math/test-ifloat.c: Likewise.
    * math/test-ildoubl.c: Likewise.
    * math/test-ldouble.c: Likewise.
    * sysdeps/generic/math-tests-arch.h (INIT_ARCH_EXT, CHECK_ARCH_EXT):
    New helper macros for runtime architecture check.
---
 math/libm-test.inc                | 32 ++++++++++++++++++++++----------
 math/test-double.c                |  1 +
 math/test-float.c                 |  1 +
 math/test-idouble.c               |  1 +
 math/test-ifloat.c                |  1 +
 math/test-ildoubl.c               |  1 +
 math/test-ldouble.c               |  1 +
 sysdeps/generic/math-tests-arch.h | 24 ++++++++++++++++++++++++
 8 files changed, 52 insertions(+), 10 deletions(-)
 create mode 100644 sysdeps/generic/math-tests-arch.h
  

Patch

diff --git a/math/libm-test.inc b/math/libm-test.inc
index be5ec81..c30ad11 100644
--- a/math/libm-test.inc
+++ b/math/libm-test.inc
@@ -126,6 +126,7 @@ 
 #include <argp.h>
 #include <tininess.h>
 #include <math-tests.h>
+#include <math-tests-arch.h>

 /* Structure for ulp data for a function, or the real or imaginary
    part of a function.  */
@@ -685,7 +686,7 @@  static void
 test_single_errno (const char *test_name, int errno_value,
    int expected_value, const char *expected_name)
 {
-#ifndef TEST_INLINE
+#if !defined TEST_INLINE && !TEST_MATHVEC
   if (errno_value == expected_value)
     {
       if (print_screen (1))
@@ -1691,9 +1692,18 @@  struct test_fFF_11_data
        (ARRAY)[i].RM_##ROUNDING_MODE.extra2_expected); \
   ROUND_RESTORE_ ## ROUNDING_MODE

+#if !TEST_MATHVEC
+# define VEC_SUFF
+#endif
+
+#define STR_CONCAT(a, b, c) __STRING (a##b##c)
+#define STR_CON3(a, b, c) STR_CONCAT (a, b, c)
+
 /* Start and end the tests for a given function.  */
-#define START(FUNC, EXACT) \
-  const char *this_func = #FUNC; \
+#define START(FUNC, SUFF, EXACT) \
+  CHECK_ARCH_EXT; \
+  if (TEST_MATHVEC) return; \
+  const char *this_func = STR_CON3 (FUNC, SUFF, VEC_SUFF); \
   init_max_error (this_func, EXACT)
 #define END \
   print_max_error (this_func)
@@ -1706,28 +1716,28 @@  struct test_fFF_11_data
     { \
       do \
  { \
-  START (FUNC, EXACT); \
+  START (FUNC,, EXACT); \
   LOOP_MACRO (FUNC, ARRAY, , ## __VA_ARGS__); \
   END_MACRO; \
  } \
       while (0); \
       do \
  { \
-  START (FUNC ## _downward, EXACT); \
+  START (FUNC, _downward, EXACT); \
   LOOP_MACRO (FUNC, ARRAY, FE_DOWNWARD, ## __VA_ARGS__); \
   END_MACRO; \
  } \
       while (0); \
       do \
  { \
-  START (FUNC ## _towardzero, EXACT); \
+  START (FUNC, _towardzero, EXACT); \
   LOOP_MACRO (FUNC, ARRAY, FE_TOWARDZERO, ## __VA_ARGS__); \
   END_MACRO; \
  } \
       while (0); \
       do \
  { \
-  START (FUNC ## _upward, EXACT); \
+  START (FUNC, _upward, EXACT); \
   LOOP_MACRO (FUNC, ARRAY, FE_UPWARD, ## __VA_ARGS__); \
   END_MACRO; \
  } \
@@ -6025,7 +6035,7 @@  static const struct test_c_c_data cexp_test_data[] =
 static void
 cexp_test (void)
 {
-  START (cexp, 0);
+  START (cexp,, 0);
   RUN_TEST_LOOP_c_c (cexp, cexp_test_data, );
   END_COMPLEX;
 }
@@ -7544,7 +7554,7 @@  static const struct test_if_f_data jn_test_data[] =
 static void
 jn_test (void)
 {
-  START (jn, 0);
+  START (jn,, 0);
   RUN_TEST_LOOP_if_f (jn, jn_test_data, );
   END;
 }
@@ -9506,7 +9516,7 @@  static const struct test_f_f_data tgamma_test_data[] =
 static void
 tgamma_test (void)
 {
-  START (tgamma, 0);
+  START (tgamma,, 0);
   RUN_TEST_LOOP_f_f (tgamma, tgamma_test_data, );
   END;
 }
@@ -9956,6 +9966,8 @@  main (int argc, char **argv)
   initialize ();
   printf (TEST_MSG);

+  INIT_ARCH_EXT;
+
   check_ulp ();

   /* Keep the tests a wee bit ordered (according to ISO C99).  */
diff --git a/math/test-double.c b/math/test-double.c
index cbb81f9..6c1c11c 100644
--- a/math/test-double.c
+++ b/math/test-double.c
@@ -26,6 +26,7 @@ 
 #define PRINTF_XEXPR "a"
 #define PRINTF_NEXPR "f"
 #define TEST_DOUBLE 1
+#define TEST_MATHVEC 0

 #ifndef __NO_MATH_INLINES
 # define __NO_MATH_INLINES
diff --git a/math/test-float.c b/math/test-float.c
index c54dd3c..07dc8ea 100644
--- a/math/test-float.c
+++ b/math/test-float.c
@@ -26,6 +26,7 @@ 
 #define PRINTF_XEXPR "a"
 #define PRINTF_NEXPR "f"
 #define TEST_FLOAT 1
+#define TEST_MATHVEC 0

 #ifndef __NO_MATH_INLINES
 # define __NO_MATH_INLINES
diff --git a/math/test-idouble.c b/math/test-idouble.c
index b23bd21..bb73f9c 100644
--- a/math/test-idouble.c
+++ b/math/test-idouble.c
@@ -26,6 +26,7 @@ 
 #define PRINTF_XEXPR "a"
 #define PRINTF_NEXPR "f"
 #define TEST_DOUBLE 1
+#define TEST_MATHVEC 0
 #define TEST_INLINE

 #ifdef __NO_MATH_INLINES
diff --git a/math/test-ifloat.c b/math/test-ifloat.c
index 57a7a77..74e8e4b 100644
--- a/math/test-ifloat.c
+++ b/math/test-ifloat.c
@@ -26,6 +26,7 @@ 
 #define PRINTF_XEXPR "a"
 #define PRINTF_NEXPR "f"
 #define TEST_FLOAT 1
+#define TEST_MATHVEC 0
 #define TEST_INLINE 1

 #ifdef __NO_MATH_INLINES
diff --git a/math/test-ildoubl.c b/math/test-ildoubl.c
index c38a109..f90a9ba 100644
--- a/math/test-ildoubl.c
+++ b/math/test-ildoubl.c
@@ -27,6 +27,7 @@ 
 #define PRINTF_NEXPR "Lf"
 #define TEST_INLINE
 #define TEST_LDOUBLE 1
+#define TEST_MATHVEC 0

 #ifdef __NO_MATH_INLINES
 # undef __NO_MATH_INLINES
diff --git a/math/test-ldouble.c b/math/test-ldouble.c
index 20bf0a1..97effb6 100644
--- a/math/test-ldouble.c
+++ b/math/test-ldouble.c
@@ -26,6 +26,7 @@ 
 #define PRINTF_XEXPR "La"
 #define PRINTF_NEXPR "Lf"
 #define TEST_LDOUBLE 1
+#define TEST_MATHVEC 0

 #ifndef __NO_MATH_INLINES
 # define __NO_MATH_INLINES
diff --git a/sysdeps/generic/math-tests-arch.h
b/sysdeps/generic/math-tests-arch.h
new file mode 100644
index 0000000..770ee27
--- /dev/null
+++ b/sysdeps/generic/math-tests-arch.h
@@ -0,0 +1,24 @@ 
+/* Runtime architecture check for math tests.
+   Copyright (C) 2015 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* These macros used for architecture check in math tests runtime.
+   INIT_ARCH_EXT should set up for example some global variable which is
+   checked by CHECK_ARCH_EXT which produces return from individual test to
+   prevent run on hardware not supported by tested function implementation. */
+#define INIT_ARCH_EXT
+#define CHECK_ARCH_EXT