test-math-vector-sincos.h 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /* Wrappers definitions for tests of ABI of vector sincos/sincosf having
  2. vector declaration "#pragma omp declare simd notinbranch".
  3. Copyright (C) 2016-2019 Free Software Foundation, Inc.
  4. This file is part of the GNU C Library.
  5. The GNU C Library is free software; you can redistribute it and/or
  6. modify it under the terms of the GNU Lesser General Public
  7. License as published by the Free Software Foundation; either
  8. version 2.1 of the License, or (at your option) any later version.
  9. The GNU C Library is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. Lesser General Public License for more details.
  13. You should have received a copy of the GNU Lesser General Public
  14. License along with the GNU C Library; if not, see
  15. <http://www.gnu.org/licenses/>. */
  16. #define INIT_VEC_PTRS_LOOP(vec, val, len) \
  17. do \
  18. { \
  19. union { VEC_INT_TYPE v; __typeof__ ((val)[0]) *a[(len)]; } u; \
  20. for (i = 0; i < len; i++) \
  21. u.a[i] = &(val)[i]; \
  22. (vec) = u.v; \
  23. } \
  24. while (0)
  25. /* Wrapper for vector sincos/sincosf compatible with x86_64 and x32 variants
  26. of _ZGVbN2vvv_sincos, _ZGVdN4vvv_sincos, _ZGVeN8vvv_sincos;
  27. x32 variants of _ZGVbN4vvv_sincosf, _ZGVcN4vvv_sincos, _ZGVdN8vvv_sincosf,
  28. _ZGVeN16vvv_sincosf. */
  29. #define VECTOR_WRAPPER_fFF_2(scalar_func, vector_func) \
  30. extern void vector_func (VEC_TYPE, VEC_INT_TYPE, VEC_INT_TYPE); \
  31. void scalar_func (FLOAT x, FLOAT * r, FLOAT * r1) \
  32. { \
  33. int i; \
  34. FLOAT r_loc[VEC_LEN], r1_loc[VEC_LEN]; \
  35. VEC_TYPE mx; \
  36. VEC_INT_TYPE mr, mr1; \
  37. INIT_VEC_LOOP (mx, x, VEC_LEN); \
  38. INIT_VEC_PTRS_LOOP (mr, r_loc, VEC_LEN); \
  39. INIT_VEC_PTRS_LOOP (mr1, r1_loc, VEC_LEN); \
  40. vector_func (mx, mr, mr1); \
  41. TEST_VEC_LOOP (r_loc, VEC_LEN); \
  42. TEST_VEC_LOOP (r1_loc, VEC_LEN); \
  43. *r = r_loc[0]; \
  44. *r1 = r1_loc[0]; \
  45. return; \
  46. }
  47. /* Wrapper for vector sincos/sincosf compatible with x86_64 variants of
  48. _ZGVcN4vvv_sincos, _ZGVeN16vvv_sincosf, _ZGVbN4vvv_sincosf,
  49. _ZGVdN8vvv_sincosf, _ZGVcN8vvv_sincosf. */
  50. #define VECTOR_WRAPPER_fFF_3(scalar_func, vector_func) \
  51. extern void vector_func (VEC_TYPE, VEC_INT_TYPE, VEC_INT_TYPE, \
  52. VEC_INT_TYPE, VEC_INT_TYPE); \
  53. void scalar_func (FLOAT x, FLOAT * r, FLOAT * r1) \
  54. { \
  55. int i; \
  56. FLOAT r_loc[VEC_LEN/2], r1_loc[VEC_LEN/2]; \
  57. VEC_TYPE mx; \
  58. VEC_INT_TYPE mr, mr1; \
  59. INIT_VEC_LOOP (mx, x, VEC_LEN); \
  60. INIT_VEC_PTRS_LOOP (mr, r_loc, VEC_LEN/2); \
  61. INIT_VEC_PTRS_LOOP (mr1, r1_loc, VEC_LEN/2); \
  62. vector_func (mx, mr, mr, mr1, mr1); \
  63. TEST_VEC_LOOP (r_loc, VEC_LEN/2); \
  64. TEST_VEC_LOOP (r1_loc, VEC_LEN/2); \
  65. *r = r_loc[0]; \
  66. *r1 = r1_loc[0]; \
  67. return; \
  68. }
  69. /* Wrapper for vector sincosf compatible with x86_64 variant of
  70. _ZGVcN8vvv_sincosf. */
  71. #define VECTOR_WRAPPER_fFF_4(scalar_func, vector_func) \
  72. extern void vector_func (VEC_TYPE, VEC_INT_TYPE, VEC_INT_TYPE, \
  73. VEC_INT_TYPE, VEC_INT_TYPE, \
  74. VEC_INT_TYPE, VEC_INT_TYPE, \
  75. VEC_INT_TYPE, VEC_INT_TYPE); \
  76. void scalar_func (FLOAT x, FLOAT * r, FLOAT * r1) \
  77. { \
  78. int i; \
  79. FLOAT r_loc[VEC_LEN/4], r1_loc[VEC_LEN/4]; \
  80. VEC_TYPE mx; \
  81. VEC_INT_TYPE mr, mr1; \
  82. INIT_VEC_LOOP (mx, x, VEC_LEN); \
  83. INIT_VEC_PTRS_LOOP (mr, r_loc, VEC_LEN/4); \
  84. INIT_VEC_PTRS_LOOP (mr1, r1_loc, VEC_LEN/4); \
  85. vector_func (mx, mr, mr, mr, mr, mr1, mr1, mr1, mr1); \
  86. TEST_VEC_LOOP (r_loc, VEC_LEN/4); \
  87. TEST_VEC_LOOP (r1_loc, VEC_LEN/4); \
  88. *r = r_loc[0]; \
  89. *r1 = r1_loc[0]; \
  90. return; \
  91. }