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) \ |
35 | extern void vector_func (VEC_TYPE, VEC_INT_TYPE, VEC_INT_TYPE); \ |
36 | void 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) \ |
57 | extern void vector_func (VEC_TYPE, VEC_INT_TYPE, VEC_INT_TYPE, \ |
58 | VEC_INT_TYPE, VEC_INT_TYPE); \ |
59 | void 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) \ |
79 | extern 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); \ |
83 | void 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 | |