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

source code of glibc/sysdeps/x86/fpu/test-math-vector-sincos.h