1 /* { dg-do compile } */
2 /* { dg-options "-O2 -ftree-vectorize -ffast-math -fdump-tree-vect-details --save-temps" } */
3 
4 void
copysign_half(_Float16 * restrict a,_Float16 * restrict b,_Float16 * restrict r,int n)5 copysign_half (_Float16 * restrict a, _Float16 * restrict b,
6 	       _Float16 * restrict r, int n)
7 {
8   for (int i = 0; i < n; i++)
9     {
10       r[i] = __builtin_copysignf16 (a[i], b[i]);
11     }
12 }
13 
14 void
copysign_float(float * restrict a,float * restrict b,float * restrict r,int n)15 copysign_float (float *restrict a, float *restrict b, float *restrict r,
16 		int n)
17 {
18   for (int i = 0; i < n; i++)
19     {
20       r[i] = __builtin_copysignf (a[i], b[i]);
21     }
22 }
23 
24 void
copysign_double(double * restrict a,double * restrict b,double * restrict r,int n)25 copysign_double (double *restrict a, double *restrict b, double *restrict r,
26 		 int n)
27 {
28   for (int i = 0; i < n; i++)
29     {
30       r[i] = __builtin_copysign (a[i], b[i]);
31     }
32 }
33 
34 /* { dg-final { scan-tree-dump-times "vectorized 1 loops in function" 3 "vect" } } */
35 /* { dg-final { scan-assembler-times {\tand\tz[0-9]+\.h, z[0-9]+\.h, #0x8000\n} 1 } } */
36 /* { dg-final { scan-assembler-times {\tand\tz[0-9]+\.h, z[0-9]+\.h, #0x7fff\n} 1 } } */
37 /* { dg-final { scan-assembler-times {\tand\tz[0-9]+\.s, z[0-9]+\.s, #0x80000000\n} 1 } } */
38 /* { dg-final { scan-assembler-times {\tand\tz[0-9]+\.s, z[0-9]+\.s, #0x7fffffff\n} 1 } } */
39 /* { dg-final { scan-assembler-times {\tand\tz[0-9]+\.d, z[0-9]+\.d, #0x8000000000000000\n} 1 } } */
40 /* { dg-final { scan-assembler-times {\tand\tz[0-9]+\.d, z[0-9]+\.d, #0x7fffffffffffffff\n} 1 } } */
41 /* { dg-final { scan-assembler-times {\torr\tz[0-9]+\.d, z[0-9]+\.d, z[0-9]+\.d\n} 3 } } */
42