1 /* Common definitions for libm tests for vector functions. 2 Copyright (C) 2014-2022 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 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 10 The GNU C Library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with the GNU C Library; if not, see 17 <https://www.gnu.org/licenses/>. */ 18 19 #define TEST_MATHVEC 1 20 #define TEST_NARROW 0 21 #define TEST_ERRNO 0 22 #define TEST_EXCEPTIONS 0 23 24 #define CNCT(x, y) x ## y 25 #define CONCAT(a, b) CNCT (a, b) 26 27 #define WRAPPER_NAME(function) CONCAT (function, VEC_SUFF) 28 #define FUNC_TEST(function) WRAPPER_NAME (FUNC (function)) 29 30 /* This macro is used in VECTOR_WRAPPER macros for vector tests. */ 31 #define TEST_VEC_LOOP(vec, len) \ 32 do \ 33 { \ 34 for (i = 1; i < len; i++) \ 35 { \ 36 if ((FLOAT) vec[0] != (FLOAT) vec[i]) \ 37 { \ 38 vec[0] = (FLOAT) vec[0] + 0.1; \ 39 break; \ 40 } \ 41 } \ 42 } \ 43 while (0) 44 45 #define INIT_VEC_LOOP(vec, val, len) \ 46 do \ 47 { \ 48 for (i = 0; i < len; i++) \ 49 { \ 50 vec[i] = val; \ 51 } \ 52 } \ 53 while (0) 54 55 #define WRAPPER_DECL_f(function) extern FLOAT function (FLOAT); 56 #define WRAPPER_DECL_ff(function) extern FLOAT function (FLOAT, FLOAT); 57 #define WRAPPER_DECL_fFF(function) extern void function (FLOAT, FLOAT *, FLOAT *); 58 59 /* Wrapper from scalar to vector function. */ 60 #define VECTOR_WRAPPER(scalar_func, vector_func) \ 61 extern VEC_TYPE vector_func (VEC_TYPE); \ 62 FLOAT scalar_func (FLOAT x) \ 63 { \ 64 int i; \ 65 VEC_TYPE mx; \ 66 INIT_VEC_LOOP (mx, x, VEC_LEN); \ 67 VEC_TYPE mr = vector_func (mx); \ 68 TEST_VEC_LOOP (mr, VEC_LEN); \ 69 return ((FLOAT) mr[0]); \ 70 } 71 72 /* Wrapper from scalar 2 argument function to vector one. */ 73 #define VECTOR_WRAPPER_ff(scalar_func, vector_func) \ 74 extern VEC_TYPE vector_func (VEC_TYPE, VEC_TYPE); \ 75 FLOAT scalar_func (FLOAT x, FLOAT y) \ 76 { \ 77 int i; \ 78 VEC_TYPE mx, my; \ 79 INIT_VEC_LOOP (mx, x, VEC_LEN); \ 80 INIT_VEC_LOOP (my, y, VEC_LEN); \ 81 VEC_TYPE mr = vector_func (mx, my); \ 82 TEST_VEC_LOOP (mr, VEC_LEN); \ 83 return ((FLOAT) mr[0]); \ 84 } 85 86 /* Wrapper from scalar 3 argument function to vector one. */ 87 #define VECTOR_WRAPPER_fFF(scalar_func, vector_func) \ 88 extern void vector_func (VEC_TYPE, VEC_TYPE *, VEC_TYPE *); \ 89 void scalar_func (FLOAT x, FLOAT * r, FLOAT * r1) \ 90 { \ 91 int i; \ 92 VEC_TYPE mx, mr, mr1; \ 93 INIT_VEC_LOOP (mx, x, VEC_LEN); \ 94 vector_func (mx, &mr, &mr1); \ 95 TEST_VEC_LOOP (mr, VEC_LEN); \ 96 TEST_VEC_LOOP (mr1, VEC_LEN); \ 97 *r = (FLOAT) mr[0]; \ 98 *r1 = (FLOAT) mr1[0]; \ 99 return; \ 100 } 101