[2/14,x86_64] Vector math functions (added vector cos tests)

Message ID CAMXFM3uL-z3r0Q2aSpnPQnGLkj1_SDmj+h=WUr4MaaMaRGGftg@mail.gmail.com
State Committed
Headers

Commit Message

Andrew Senkevich April 30, 2015, 3:04 p.m. UTC
  This is update of test suite infrastracture with addition of tests for
vectorized cos.

2015-04-30  Andrew Senkevich  <andrew.senkevich@intel.com>

        * math/Makefile: Added rules for tests.
        * sysdeps/x86_64/fpu/Makefile: Likewise.
        * math/test-double-vlen2.h: New file.
        * math/test-double-vlen4.h: New file.
        * math/test-double-vlen8.h: New file.
        * math/test-vec-loop.h: New file.
        * sysdeps/x86_64/fpu/test-double-vlen2.c: New file.
        * sysdeps/x86_64/fpu/test-double-vlen4-avx2.c: New file.
        * sysdeps/x86_64/fpu/test-double-vlen4.c: New file.
        * sysdeps/x86_64/fpu/test-double-vlen8.c: New file.
        * sysdeps/x86_64/fpu/test-double-vlen8-wrappers.c: New file.
        * sysdeps/x86_64/fpu/libm-test-ulps: Regenarated.


Is this patch ok?


--
WBR,
Andrew
  

Comments

Joseph Myers May 22, 2015, 3:54 p.m. UTC | #1
On Thu, 30 Apr 2015, Andrew Senkevich wrote:

> This is update of test suite infrastracture with addition of tests for
> vectorized cos.

Could you please give a more detailed explanation of what the patch does 
and the rationale for the choices made?  Even if it was included in 
discussion of previous versions of this patch, every patch submission / 
resubmission should best include a self-contained write-up of the patch 
that will go in the git commit message.  (See examples of other patch 
submissions that clearly distinguish the self-contained write-up for the 
current patch - for the git commit message - and the description of 
changes from previous versions of the patch - not for the git commit 
message.)

>         * math/Makefile: Added rules for tests.
>         * sysdeps/x86_64/fpu/Makefile: Likewise.
>         * math/test-double-vlen2.h: New file.
>         * math/test-double-vlen4.h: New file.
>         * math/test-double-vlen8.h: New file.
>         * math/test-vec-loop.h: New file.
>         * sysdeps/x86_64/fpu/test-double-vlen2.c: New file.
>         * sysdeps/x86_64/fpu/test-double-vlen4-avx2.c: New file.
>         * sysdeps/x86_64/fpu/test-double-vlen4.c: New file.
>         * sysdeps/x86_64/fpu/test-double-vlen8.c: New file.
>         * sysdeps/x86_64/fpu/test-double-vlen8-wrappers.c: New file.

Why does vlen8 need a separate -wrappers file when others don't?

> diff --git a/math/Makefile b/math/Makefile

> +$(objpfx)test-double-vlen2.o: $(objpfx)libm-test.stmp
> +$(objpfx)test-double-vlen4.o: $(objpfx)libm-test.stmp
> +
> +$(objpfx)test-double-vlen2: $(libmvec)
> +$(objpfx)test-double-vlen4: $(libmvec)

Why are only vlen2 and vlen4 mentioned here, not vlen8?  I don't see any 
good architecture-independent reason for such a difference.  Indeed, with 
appropriate use of GNU make text-manipulation functions, it should be 
possible to write

$(something): $(objpfx)libm-test.stmp
$(something): $(libmvec)

where each $(something) is computed from $(libmvec-tests), and so the 
dependencies are automatically present for all the objects, including the 
architecture-specific ones such as vlen4-avx2.

> +CFLAGS-test-double-vlen8-wrappers.c = $(double-vlen8-arch-ext-cflags)

For this to go in math/Makefile, there needs to be an 
architecture-independent reason for such a -wrappers file to exist in the 
first place.

> +/* Copyright (C) 2014 Free Software Foundation, Inc.

2014-2015, in all new files.
  
Andrew Senkevich May 22, 2015, 5:18 p.m. UTC | #2
2015-05-22 18:54 GMT+03:00 Joseph Myers <joseph@codesourcery.com>:
> Why does vlen8 need a separate -wrappers file when others don't?

Because only for test built with -mavx512f some avx512 instruction was
emitted before architecture check.
Is it needed split AVX2 test to prevent changes that may appear in the future?


--
WBR,
Andrew
  
Joseph Myers May 22, 2015, 5:23 p.m. UTC | #3
On Fri, 22 May 2015, Andrew Senkevich wrote:

> 2015-05-22 18:54 GMT+03:00 Joseph Myers <joseph@codesourcery.com>:
> > Why does vlen8 need a separate -wrappers file when others don't?
> 
> Because only for test built with -mavx512f some avx512 instruction was
> emitted before architecture check.
> Is it needed split AVX2 test to prevent changes that may appear in the future?

That suggests to me that *all* these tests should be split that way - the 
main program built without special options, the calls to the functions 
built with the special options.  That would be the safest 
architecture-independent approach - have the separate wrappers file in 
every case, even if some cases don't actually need it in your x86 tests 
right now.
  
Andrew Senkevich May 26, 2015, 8:33 p.m. UTC | #4
Hi, Joseph,

this version of patch contains all tests with wrapper part.

> Could you please give a more detailed explanation of what the patch does
> and the rationale for the choices made?

This is addition of testing infrastructure for vector math functions.
We test vector math functions using scalar tests infrastructure with
help of special wrappers from scalar versions to vector ones. Wrapper
implemented with platform specific intrinsics and placed in separate
file for compilation with architecture specific options, main part of
test has no such options. With help of system of definitions unfolding
of which is drived from test we have wrapper called in individual
testing function instead old scalar function. System of definitions
includes generated during make check header
math/libm-have-vector-test.h with series of conditional defines which
helps to avoid build fails for functions having no vector versions and
runtime architecture check to prevent runtime fails of test run on
inappropriate hardware.

ChangeLog

2015-05-26  Andrew Senkevich  <andrew.senkevich@intel.com>

        * math/Makefile: Added rules for tests.
        * sysdeps/x86_64/fpu/Makefile: Likewise.
        * sysdeps/x86_64/fpu/libm-test-ulps: Regenarated.
        * math/test-vec-loop.h: New file.
        * math/test-double-vlen2.h: New file.
        * math/test-double-vlen4.h: New file.
        * math/test-double-vlen8.h: New file.
        * sysdeps/x86_64/fpu/math-tests-arch.h: New file.
        * sysdeps/x86_64/fpu/test-double-vlen2-wrappers.c: New file.
        * sysdeps/x86_64/fpu/test-double-vlen2.c: New file.
        * sysdeps/x86_64/fpu/test-double-vlen4-avx2-wrappers.c: New file.
        * sysdeps/x86_64/fpu/test-double-vlen4-avx2.c: New file.
        * sysdeps/x86_64/fpu/test-double-vlen4-wrappers.c: New file.
        * sysdeps/x86_64/fpu/test-double-vlen4.c: New file.
        * sysdeps/x86_64/fpu/test-double-vlen8-wrappers.c: New file.
        * sysdeps/x86_64/fpu/test-double-vlen8.c: New file.


--
WBR,
Andrew
  
Andrew Senkevich May 27, 2015, 10:20 a.m. UTC | #5
> appropriate use of GNU make text-manipulation functions, it should be
> possible to write
>
> $(something): $(objpfx)libm-test.stmp
> $(something): $(libmvec)
>
> where each $(something) is computed from $(libmvec-tests), and so the
> dependencies are automatically present for all the objects, including the
> architecture-specific ones such as vlen4-avx2.

Is it possible to fold the following rules (now in math/Makefile)
based on $(libm-vec-tests) or some other way? Else I need to move avx2
related rules to sysdeps Makefile.

$(objpfx)test-double-vlen2: $(libmvec) $(objpfx)init-arch.o \
   $(objpfx)test-double-vlen2-wrappers.o

$(objpfx)test-double-vlen4: $(libmvec) $(objpfx)init-arch.o \
   $(objpfx)test-double-vlen4-wrappers.o

$(objpfx)test-double-vlen4-avx2: $(libmvec) $(objpfx)init-arch.o \
$(objpfx)test-double-vlen4-avx2-wrappers.o

$(objpfx)test-double-vlen8: $(libmvec) $(objpfx)init-arch.o \
   $(objpfx)test-double-vlen8-wrappers.o


--
WBR,
Andrew
  
Joseph Myers May 28, 2015, 5:28 p.m. UTC | #6
On Wed, 27 May 2015, Andrew Senkevich wrote:

> > appropriate use of GNU make text-manipulation functions, it should be
> > possible to write
> >
> > $(something): $(objpfx)libm-test.stmp
> > $(something): $(libmvec)
> >
> > where each $(something) is computed from $(libmvec-tests), and so the
> > dependencies are automatically present for all the objects, including the
> > architecture-specific ones such as vlen4-avx2.
> 
> Is it possible to fold the following rules (now in math/Makefile)
> based on $(libm-vec-tests) or some other way? Else I need to move avx2
> related rules to sysdeps Makefile.
> 
> $(objpfx)test-double-vlen2: $(libmvec) $(objpfx)init-arch.o \
>    $(objpfx)test-double-vlen2-wrappers.o
> 
> $(objpfx)test-double-vlen4: $(libmvec) $(objpfx)init-arch.o \
>    $(objpfx)test-double-vlen4-wrappers.o
> 
> $(objpfx)test-double-vlen4-avx2: $(libmvec) $(objpfx)init-arch.o \
> $(objpfx)test-double-vlen4-avx2-wrappers.o
> 
> $(objpfx)test-double-vlen8: $(libmvec) $(objpfx)init-arch.o \
>    $(objpfx)test-double-vlen8-wrappers.o

I'd expect something like:

$(addprefix $(objpfx),$(libm-vec-tests)): $(objpfx)%: $(libmvec) $(objpfx)init-arch.o $(objpfx)%-wrappers.o

(untested) to work.
  
Andrew Senkevich May 29, 2015, 12:55 p.m. UTC | #7
>> Is it possible to fold the following rules (now in math/Makefile)
>> based on $(libm-vec-tests) or some other way? Else I need to move avx2
>> related rules to sysdeps Makefile.
>>
>> $(objpfx)test-double-vlen2: $(libmvec) $(objpfx)init-arch.o \
>>    $(objpfx)test-double-vlen2-wrappers.o
>>
>> $(objpfx)test-double-vlen4: $(libmvec) $(objpfx)init-arch.o \
>>    $(objpfx)test-double-vlen4-wrappers.o
>>
>> $(objpfx)test-double-vlen4-avx2: $(libmvec) $(objpfx)init-arch.o \
>> $(objpfx)test-double-vlen4-avx2-wrappers.o
>>
>> $(objpfx)test-double-vlen8: $(libmvec) $(objpfx)init-arch.o \
>>    $(objpfx)test-double-vlen8-wrappers.o
>
> I'd expect something like:
>
> $(addprefix $(objpfx),$(libm-vec-tests)): $(objpfx)%: $(libmvec) $(objpfx)init-arch.o $(objpfx)%-wrappers.o
>
> (untested) to work.

Unfortunately it doesn`t work, looks like no dependencies from
wrappers and init-arch to test and wrappers and init-arch are not
compiled...


--
WBR,
Andrew
  
Joseph Myers May 29, 2015, 1:30 p.m. UTC | #8
On Fri, 29 May 2015, Andrew Senkevich wrote:

> >> Is it possible to fold the following rules (now in math/Makefile)
> >> based on $(libm-vec-tests) or some other way? Else I need to move avx2
> >> related rules to sysdeps Makefile.
> >>
> >> $(objpfx)test-double-vlen2: $(libmvec) $(objpfx)init-arch.o \
> >>    $(objpfx)test-double-vlen2-wrappers.o
> >>
> >> $(objpfx)test-double-vlen4: $(libmvec) $(objpfx)init-arch.o \
> >>    $(objpfx)test-double-vlen4-wrappers.o
> >>
> >> $(objpfx)test-double-vlen4-avx2: $(libmvec) $(objpfx)init-arch.o \
> >> $(objpfx)test-double-vlen4-avx2-wrappers.o
> >>
> >> $(objpfx)test-double-vlen8: $(libmvec) $(objpfx)init-arch.o \
> >>    $(objpfx)test-double-vlen8-wrappers.o
> >
> > I'd expect something like:
> >
> > $(addprefix $(objpfx),$(libm-vec-tests)): $(objpfx)%: $(libmvec) $(objpfx)init-arch.o $(objpfx)%-wrappers.o
> >
> > (untested) to work.
> 
> Unfortunately it doesn`t work, looks like no dependencies from
> wrappers and init-arch to test and wrappers and init-arch are not
> compiled...

Well, you'll need to debug this; it's a routine use of static pattern 
rules.  Maybe there's some interaction with the other static pattern rules 
in use?  In any case, if it can't be made to work, the patch submission 
should include a sufficient explanation of the relevant GNU make features 
and why they can't handle this case.
  
Andrew Senkevich June 1, 2015, 4:27 p.m. UTC | #9
>> Is it possible to fold the following rules (now in math/Makefile)
>> based on $(libm-vec-tests) or some other way? Else I need to move avx2
>> related rules to sysdeps Makefile.
>>
>> $(objpfx)test-double-vlen2: $(libmvec) $(objpfx)init-arch.o \
>>    $(objpfx)test-double-vlen2-wrappers.o
>>
>> $(objpfx)test-double-vlen4: $(libmvec) $(objpfx)init-arch.o \
>>    $(objpfx)test-double-vlen4-wrappers.o
>>
>> $(objpfx)test-double-vlen4-avx2: $(libmvec) $(objpfx)init-arch.o \
>> $(objpfx)test-double-vlen4-avx2-wrappers.o
>>
>> $(objpfx)test-double-vlen8: $(libmvec) $(objpfx)init-arch.o \
>>    $(objpfx)test-double-vlen8-wrappers.o
>
> I'd expect something like:
>
> $(addprefix $(objpfx),$(libm-vec-tests)): $(objpfx)%: $(libmvec) $(objpfx)init-arch.o $(objpfx)%-wrappers.o
>
> (untested) to work.

Hi, Joseph, here is the patch with makefiles refactored that way.
Ok for trunk?


--
WBR,
Andrew
  
Joseph Myers June 4, 2015, 5:32 p.m. UTC | #10
On Mon, 1 Jun 2015, Andrew Senkevich wrote:

> Hi, Joseph, here is the patch with makefiles refactored that way.
> Ok for trunk?

Some new files in this patch are missing the first-line description of the 
file that should come before the copyright and license notices.

Looking at the later patches in the series, I'm concerned about the number 
of bits of boilerplate test code needed for every function with a vector 
version.

For example: it seems you need separate calls such as WRAPPER_DECL 
(WRAPPER_NAME (cos)) in the sysdeps/x86_64/fpu/test-*.c files for every 
case where you have a vector version of cos.  But since you define 
TEST_VECTOR_cos to say there's such a version, wouldn't it be better for 
libm-test.inc to contain such calls, conditional on the HAVE_VECTOR_* 
macros generated by gen-libm-have-vector-test.sh, so that only one such 
call is needed for each function, across all architectures and vector 
lengths?  Or even better, put those calls in a file that's automatically 
generated by a script (libm-test.inc has the information needed to decide 
if you should use WRAPPER_DECL_ff instead for a two-argument function, 
etc.).

If things could be arranged so that TEST_VECTOR_* go in a header that's 
also used by the files that define the wrappers, so that again only one 
file (maybe automatically generated) needs to contain the calls to 
VECTOR_WRAPPER* (appropriately adjusted to generate the names of the 
vector functions automatically, I suppose), and those calls are 
conditioned on whether there's a vector implementation of that function in 
that case, it would be even better.  That way, the TEST_VECTOR_* 
definitions would be the *only* architecture-specific thing needed for 
testing per (function, format) pair.

And maybe the files such as test-double-vlen8.c and 
test-double-vlen8-wrappers.c could end up in math/, just including headers 
(and maybe automatically-generated files) that (a) by defining 
TEST_VECTOR_* macros, say which functions have a definition for a given 
vector length, (b) define the macros such as REQUIRE_AVX512F that 
determine whether testing is possible on the current hardware, (c) say how 
to define the wrappers (even there, all that should be needed is a type 
name - everything else could be done in an architecture-independent and 
vector-format-independent manner using memcpy to initialize).

Doing things that way would be a bit more work now, but avoid a lot of 
duplication when there are lots of architectures with libmvec code, each 
for lots of functions and vector lengths.
  
Andrew Senkevich June 5, 2015, 10:16 a.m. UTC | #11
2015-06-04 20:32 GMT+03:00 Joseph Myers <joseph@codesourcery.com>:
> On Mon, 1 Jun 2015, Andrew Senkevich wrote:
>
>> Hi, Joseph, here is the patch with makefiles refactored that way.
>> Ok for trunk?
>
> Some new files in this patch are missing the first-line description of the
> file that should come before the copyright and license notices.
>
> Looking at the later patches in the series, I'm concerned about the number
> of bits of boilerplate test code needed for every function with a vector
> version.
>
> For example: it seems you need separate calls such as WRAPPER_DECL
> (WRAPPER_NAME (cos)) in the sysdeps/x86_64/fpu/test-*.c files for every
> case where you have a vector version of cos.  But since you define
> TEST_VECTOR_cos to say there's such a version, wouldn't it be better for
> libm-test.inc to contain such calls, conditional on the HAVE_VECTOR_*
> macros generated by gen-libm-have-vector-test.sh, so that only one such
> call is needed for each function, across all architectures and vector
> lengths?  Or even better, put those calls in a file that's automatically
> generated by a script (libm-test.inc has the information needed to decide
> if you should use WRAPPER_DECL_ff instead for a two-argument function,
> etc.).
>
> If things could be arranged so that TEST_VECTOR_* go in a header that's
> also used by the files that define the wrappers, so that again only one
> file (maybe automatically generated) needs to contain the calls to
> VECTOR_WRAPPER* (appropriately adjusted to generate the names of the
> vector functions automatically, I suppose), and those calls are
> conditioned on whether there's a vector implementation of that function in
> that case, it would be even better.  That way, the TEST_VECTOR_*
> definitions would be the *only* architecture-specific thing needed for
> testing per (function, format) pair.
>
> And maybe the files such as test-double-vlen8.c and
> test-double-vlen8-wrappers.c could end up in math/, just including headers
> (and maybe automatically-generated files) that (a) by defining
> TEST_VECTOR_* macros, say which functions have a definition for a given
> vector length, (b) define the macros such as REQUIRE_AVX512F that
> determine whether testing is possible on the current hardware, (c) say how
> to define the wrappers (even there, all that should be needed is a type
> name - everything else could be done in an architecture-independent and
> vector-format-independent manner using memcpy to initialize).
>
> Doing things that way would be a bit more work now, but avoid a lot of
> duplication when there are lots of architectures with libmvec code, each
> for lots of functions and vector lengths.

But current design was discussed and approved in december 2014, and
already 5 patches with this current design were committed.
Now I have series of 14 patches ready and such refactoring at this
moment is enough significant effort. So I propose to add this
refactoring as additional patch after this series. Is it ok?


--
WBR,
Andrew
  
Joseph Myers June 5, 2015, 12:14 p.m. UTC | #12
On Fri, 5 Jun 2015, Andrew Senkevich wrote:

> But current design was discussed and approved in december 2014, and
> already 5 patches with this current design were committed.

I can't find anything in December 2014 that looks to me like approval of 
this aspect of the design of patch 9/N (as it was then), just discussion 
of other issues with duplication in the code and incremental refactoring 
of it.

I don't think my comments in any way conflict with the pieces that have 
already been committed; they are specifically about the arrangement of 
things that are new in this patch (namely, definitions and declarations 
for wrapper functions used in testing, that are sufficiently mechanical 
that they should not need repeating for every (function, vector format) 
pair).

> Now I have series of 14 patches ready and such refactoring at this
> moment is enough significant effort. So I propose to add this
> refactoring as additional patch after this series. Is it ok?

No, I think the subsequent patches show up a deficiency in how each new 
function is tested, and so that should be cleaned up to reduce duplication 
before the second new function is added, rather than each patch adding 
more avoidable duplication of boilerplate test code.  It's unavoidable 
that sometimes adding more functions shows up design issues that weren't 
apparent with the addition of the first function.
  
Andrew Senkevich June 5, 2015, 6:45 p.m. UTC | #13
2015-06-04 20:32 GMT+03:00 Joseph Myers <joseph@codesourcery.com>:
> On Mon, 1 Jun 2015, Andrew Senkevich wrote:
>
>> Hi, Joseph, here is the patch with makefiles refactored that way.
>> Ok for trunk?
>
> Some new files in this patch are missing the first-line description of the
> file that should come before the copyright and license notices.
>
> Looking at the later patches in the series, I'm concerned about the number
> of bits of boilerplate test code needed for every function with a vector
> version.
>
> For example: it seems you need separate calls such as WRAPPER_DECL
> (WRAPPER_NAME (cos)) in the sysdeps/x86_64/fpu/test-*.c files for every
> case where you have a vector version of cos.  But since you define
> TEST_VECTOR_cos to say there's such a version, wouldn't it be better for
> libm-test.inc to contain such calls, conditional on the HAVE_VECTOR_*
> macros generated by gen-libm-have-vector-test.sh, so that only one such
> call is needed for each function, across all architectures and vector
> lengths?  Or even better, put those calls in a file that's automatically
> generated by a script (libm-test.inc has the information needed to decide
> if you should use WRAPPER_DECL_ff instead for a two-argument function,
> etc.).
>
> If things could be arranged so that TEST_VECTOR_* go in a header that's
> also used by the files that define the wrappers, so that again only one
> file (maybe automatically generated) needs to contain the calls to
> VECTOR_WRAPPER* (appropriately adjusted to generate the names of the
> vector functions automatically, I suppose), and those calls are
> conditioned on whether there's a vector implementation of that function in
> that case, it would be even better.  That way, the TEST_VECTOR_*
> definitions would be the *only* architecture-specific thing needed for
> testing per (function, format) pair.
>
> And maybe the files such as test-double-vlen8.c and
> test-double-vlen8-wrappers.c could end up in math/, just including headers
> (and maybe automatically-generated files) that (a) by defining
> TEST_VECTOR_* macros, say which functions have a definition for a given
> vector length, (b) define the macros such as REQUIRE_AVX512F that
> determine whether testing is possible on the current hardware, (c) say how
> to define the wrappers (even there, all that should be needed is a type
> name - everything else could be done in an architecture-independent and
> vector-format-independent manner using memcpy to initialize).
>
> Doing things that way would be a bit more work now, but avoid a lot of
> duplication when there are lots of architectures with libmvec code, each
> for lots of functions and vector lengths.

Here is refactored version according to your comments. Is it ok?

2015-06-05  Andrew Senkevich  <andrew.senkevich@intel.com>

        * math/Makefile: Added rules for vector tests.
        * math/gen-libm-have-vector-test.sh: Added generation of declaration
        under condition.
        * math/test-double-vlen2.h: New file.
        * math/test-double-vlen4.h: New file.
        * math/test-double-vlen8.h: New file.
        * math/test-vec-loop.h: Added initialization macro.
        * sysdeps/x86_64/fpu/Makefile: Added variables for vector tests.
        * sysdeps/x86_64/fpu/libm-test-ulps: Regenarated.
        * sysdeps/x86_64/fpu/math-tests-arch.h: New file.
        * sysdeps/x86_64/fpu/test-double-vlen2-wrappers.c: New file.
        * sysdeps/x86_64/fpu/test-double-vlen2.c: New file.
        * sysdeps/x86_64/fpu/test-double-vlen4-avx2-wrappers.c: New file.
        * sysdeps/x86_64/fpu/test-double-vlen4-avx2.c: New file.
        * sysdeps/x86_64/fpu/test-double-vlen4-wrappers.c: New file.
        * sysdeps/x86_64/fpu/test-double-vlen4.c: New file.
        * sysdeps/x86_64/fpu/test-double-vlen8-wrappers.c: New file.
        * sysdeps/x86_64/fpu/test-double-vlen8.c: New file.


--
WBR,
Andrew
  
Joseph Myers June 5, 2015, 10:28 p.m. UTC | #14
On Fri, 5 Jun 2015, Andrew Senkevich wrote:

> Here is refactored version according to your comments. Is it ok?

OK with the missing space before '(' in calls to INIT_VEC_LOOP fixed.
  

Patch

diff --git a/math/Makefile b/math/Makefile
index 9a3cf32..c85a498 100644
--- a/math/Makefile
+++ b/math/Makefile
@@ -115,8 +115,9 @@  tests-static = test-fpucw-static test-fpucw-ieee-static
 test-longdouble-yes = test-ldouble test-ildoubl

 ifneq (no,$(PERL))
+libm-vec-tests = $(addprefix test-,$(libmvec-tests))
 libm-tests = test-float test-double $(test-longdouble-$(long-double-fcts)) \
-       test-ifloat test-idouble
+       test-ifloat test-idouble $(libm-vec-tests)
 libm-tests.o = $(addsuffix .o,$(libm-tests))

 tests += $(libm-tests)
@@ -143,8 +144,23 @@  $(objpfx)test-double.o: $(objpfx)libm-test.stmp
 $(objpfx)test-idouble.o: $(objpfx)libm-test.stmp
 $(objpfx)test-ldouble.o: $(objpfx)libm-test.stmp
 $(objpfx)test-ildoubl.o: $(objpfx)libm-test.stmp
+
+$(objpfx)test-double-vlen2.o: $(objpfx)libm-test.stmp
+$(objpfx)test-double-vlen4.o: $(objpfx)libm-test.stmp
+
+$(objpfx)test-double-vlen2: $(libmvec)
+$(objpfx)test-double-vlen4: $(libmvec)
 endif

+libm-test-fast-math-cflags = -fno-builtin -D__FAST_MATH__ -DTEST_FAST_MATH
+libm-test-vec-cflags = $(libm-test-fast-math-cflags) -fno-inline \
+                      -ffloat-store -D_OPENMP=201307 -Wno-unknown-pragmas
+
+CFLAGS-test-double-vlen2.c = $(libm-test-vec-cflags)
$(double-vlen2-arch-ext-cflags)
+CFLAGS-test-double-vlen4.c = $(libm-test-vec-cflags)
$(double-vlen4-arch-ext-cflags)
+CFLAGS-test-double-vlen8-wrappers.c = $(double-vlen8-arch-ext-cflags)
+CFLAGS-test-double-vlen8.c = $(libm-test-vec-cflags)
+
 CFLAGS-test-float.c = -fno-inline -ffloat-store -fno-builtin
 CFLAGS-test-double.c = -fno-inline -ffloat-store -fno-builtin
 CFLAGS-test-ldouble.c = -fno-inline -ffloat-store -fno-builtin
@@ -155,12 +171,12 @@  CFLAGS-test-tgmath.c = -fno-builtin
 CFLAGS-test-tgmath2.c = -fno-builtin
 CFLAGS-test-tgmath-ret.c = -fno-builtin
 CFLAGS-test-powl.c = -fno-builtin
-CPPFLAGS-test-ifloat.c = -U__LIBC_INTERNAL_MATH_INLINES -D__FAST_MATH__ \
-                        -DTEST_FAST_MATH -fno-builtin
-CPPFLAGS-test-idouble.c = -U__LIBC_INTERNAL_MATH_INLINES -D__FAST_MATH__ \
-                         -DTEST_FAST_MATH -fno-builtin
-CPPFLAGS-test-ildoubl.c = -U__LIBC_INTERNAL_MATH_INLINES -D__FAST_MATH__ \
-                         -DTEST_FAST_MATH -fno-builtin
+CPPFLAGS-test-ifloat.c = -U__LIBC_INTERNAL_MATH_INLINES \
+                        $(libm-test-fast-math-cflags)
+CPPFLAGS-test-idouble.c = -U__LIBC_INTERNAL_MATH_INLINES \
+                         $(libm-test-fast-math-cflags)
+CPPFLAGS-test-ildoubl.c = -U__LIBC_INTERNAL_MATH_INLINES \
+                         $(libm-test-fast-math-cflags)


 # The -lieee module sets the _LIB_VERSION_ switch to IEEE mode
diff --git a/math/test-double-vlen2.h b/math/test-double-vlen2.h
new file mode 100644
index 0000000..865b092
--- /dev/null
+++ b/math/test-double-vlen2.h
@@ -0,0 +1,43 @@ 
+/* Copyright (C) 2014 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#define FLOAT double
+#define FUNC(function) function
+#define TEST_MSG "testing double vector math (without inline functions)\n"
+#define MATHCONST(x) x
+#define CHOOSE(Clongdouble,Cdouble,Cfloat,Cinlinelongdouble,Cinlinedouble,Cinlinefloat)
Cdouble
+#define PRINTF_EXPR "e"
+#define PRINTF_XEXPR "a"
+#define PRINTF_NEXPR "f"
+#define TEST_DOUBLE 1
+#define TEST_MATHVEC 1
+
+#ifndef __NO_MATH_INLINES
+# define __NO_MATH_INLINES
+#endif
+
+#define EXCEPTION_TESTS_double 0
+#define ROUNDING_TESTS_double(MODE) ((MODE) == FE_TONEAREST)
+
+#define VEC_SUFF _vlen2
+
+#define CNCT(x, y) x ## y
+#define CONCAT(a, b) CNCT (a, b)
+
+#define WRAPPER_NAME(function) CONCAT (function, VEC_SUFF)
+
+#define FUNC_TEST(function) function ## _VEC_SUFF
diff --git a/math/test-double-vlen4.h b/math/test-double-vlen4.h
new file mode 100644
index 0000000..0f31f67
--- /dev/null
+++ b/math/test-double-vlen4.h
@@ -0,0 +1,43 @@ 
+/* Copyright (C) 2014 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#define FLOAT double
+#define FUNC(function) function
+#define TEST_MSG "testing double vector math (without inline functions)\n"
+#define MATHCONST(x) x
+#define CHOOSE(Clongdouble,Cdouble,Cfloat,Cinlinelongdouble,Cinlinedouble,Cinlinefloat)
Cdouble
+#define PRINTF_EXPR "e"
+#define PRINTF_XEXPR "a"
+#define PRINTF_NEXPR "f"
+#define TEST_DOUBLE 1
+#define TEST_MATHVEC 1
+
+#ifndef __NO_MATH_INLINES
+# define __NO_MATH_INLINES
+#endif
+
+#define EXCEPTION_TESTS_double 0
+#define ROUNDING_TESTS_double(MODE) ((MODE) == FE_TONEAREST)
+
+#define VEC_SUFF _vlen4
+
+#define CNCT(x, y) x ## y
+#define CONCAT(a, b) CNCT (a, b)
+
+#define WRAPPER_NAME(function) CONCAT (function, VEC_SUFF)
+
+#define FUNC_TEST(function) function ## _VEC_SUFF
diff --git a/math/test-double-vlen8.h b/math/test-double-vlen8.h
new file mode 100644
index 0000000..e36715d
--- /dev/null
+++ b/math/test-double-vlen8.h
@@ -0,0 +1,46 @@ 
+/* Copyright (C) 2014 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#define FLOAT double
+#define FUNC(function) function
+#define TEST_MSG "testing double vector math (without inline functions)\n"
+#define MATHCONST(x) x
+#define CHOOSE(Clongdouble,Cdouble,Cfloat,Cinlinelongdouble,Cinlinedouble,Cinlinefloat)
Cdouble
+#define PRINTF_EXPR "e"
+#define PRINTF_XEXPR "a"
+#define PRINTF_NEXPR "f"
+#define TEST_DOUBLE 1
+#define TEST_MATHVEC 1
+
+#ifndef __NO_MATH_INLINES
+# define __NO_MATH_INLINES
+#endif
+
+#define EXCEPTION_TESTS_double 0
+#define ROUNDING_TESTS_double(MODE) ((MODE) == FE_TONEAREST)
+
+#define VEC_SUFF _vlen8
+
+#define CNCT(x, y) x ## y
+#define CONCAT(a, b) CNCT (a, b)
+
+#define WRAPPER_NAME(function) CONCAT (function, VEC_SUFF)
+
+#define FUNC_TEST(function) function ## _VEC_SUFF
+
+#define WRAPPER_DECL(function) \
+extern FLOAT function (FLOAT);
diff --git a/math/test-vec-loop.h b/math/test-vec-loop.h
new file mode 100644
index 0000000..5ad391b
--- /dev/null
+++ b/math/test-vec-loop.h
@@ -0,0 +1,31 @@ 
+/* Copyright (C) 2014 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+/* This macro is used in VECTOR_WRAPPER macros for vector tests.  */
+#define TEST_VEC_LOOP(len)                                     \
+  do                                                           \
+    {                                                          \
+      for (i = 1; i < len; i++)                                        \
+        {                                                      \
+          if ((FLOAT) mr[0] != (FLOAT) mr[i])                  \
+            {                                                  \
+              return ((FLOAT) mr[0] + 0.1);                    \
+            }                                                  \
+        }                                                      \
+      return ((FLOAT) mr[0]);                          \
+    }                                                          \
+  while (0)
diff --git a/sysdeps/x86_64/fpu/Makefile b/sysdeps/x86_64/fpu/Makefile
index c24188f..9cbf68b 100644
--- a/sysdeps/x86_64/fpu/Makefile
+++ b/sysdeps/x86_64/fpu/Makefile
@@ -3,3 +3,29 @@  libmvec-support += svml_d_cos2_core_sse svml_d_cos4_core_avx \
                   svml_d_cos4_core_avx2 svml_d_cos8_core_avx512 \
                   svml_d_cos_data init-arch
 endif
+
+# Rules for libmvec tests.
+ifeq ($(subdir),math)
+ifeq ($(build-mathvec),yes)
+libmvec-tests += double-vlen2 double-vlen4 double-vlen4-avx2
+
+ifeq (yes,$(config-cflags-avx512))
+libmvec-tests += double-vlen8
+endif
+
+double-vlen2-arch-ext-cflags = -msse4
+double-vlen4-arch-ext-cflags = -mavx
+double-vlen8-arch-ext-cflags = -mavx512f
+
+$(objpfx)test-double-vlen4-avx2.o: $(objpfx)libm-test.stmp
+$(objpfx)test-double-vlen8.o: $(objpfx)libm-test.stmp
+
+$(objpfx)test-double-vlen4-avx2: $(libmvec) $(objpfx)init-arch.o
+$(objpfx)test-double-vlen8: $(libmvec) $(objpfx)init-arch.o \
+                           $(objpfx)test-double-vlen8.o \
+                           $(objpfx)test-double-vlen8-wrappers.o
+
+CFLAGS-test-double-vlen4-avx2.c = $(libm-test-vec-cflags) -mavx2
+
+endif
+endif
diff --git a/sysdeps/x86_64/fpu/libm-test-ulps
b/sysdeps/x86_64/fpu/libm-test-ulps
index bbb6abc..d7d922c 100644
--- a/sysdeps/x86_64/fpu/libm-test-ulps
+++ b/sysdeps/x86_64/fpu/libm-test-ulps
@@ -965,6 +965,18 @@  idouble: 1
 ildouble: 2
 ldouble: 2

+Function: "cos_vlen2":
+double: 1
+
+Function: "cos_vlen4_avx":
+double: 1
+
+Function: "cos_vlen4_avx2":
+double: 1
+
+Function: "cos_vlen8":
+double: 1
+
 Function: "cosh":
 double: 1
 float: 1
diff --git a/sysdeps/x86_64/fpu/math-tests-arch.h
b/sysdeps/x86_64/fpu/math-tests-arch.h
new file mode 100644
index 0000000..9858e29
--- /dev/null
+++ b/sysdeps/x86_64/fpu/math-tests-arch.h
@@ -0,0 +1,89 @@ 
+/* Runtime architecture check for math tests. x86_64 version.
+   Copyright (C) 2013-2014 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#if defined REQUIRE_AVX2
+# include <init-arch.h>
+
+  /* Set to 1 if AVX2 supported.  */
+  static int avx2_usable;
+
+# define INIT_ARCH_EXT                                         \
+  do                                                           \
+    {                                                          \
+      __init_cpu_features ();                                  \
+      avx2_usable = __cpu_features.feature[index_AVX2_Usable]  \
+                  & bit_AVX2_Usable;                           \
+    }                                                          \
+  while (0)
+
+# define CHECK_ARCH_EXT                                        \
+  do                                                           \
+    {                                                          \
+      if (!avx2_usable) return;                                \
+    }                                                          \
+  while (0)
+
+#elif defined REQUIRE_AVX512F
+# include <init-arch.h>
+
+  /* Set to 1 if supported.  */
+  static int avx512f_usable, avx512dq_usable;
+
+# define INIT_ARCH_EXT                                                \
+  do                                                                  \
+    {                                                                 \
+      __init_cpu_features ();                                         \
+      avx512f_usable = __cpu_features.feature[index_AVX512F_Usable]   \
+                      & bit_AVX512F_Usable;                          \
+      avx512dq_usable = __cpu_features.feature[index_AVX512DQ_Usable] \
+                       & bit_AVX512DQ_Usable;                        \
+    }                                                                 \
+  while (0)
+
+# define CHECK_ARCH_EXT                                        \
+  do                                                           \
+    {                                                          \
+      if (!avx512f_usable || avx512dq_usable) return;          \
+    }                                                          \
+  while (0)
+
+#elif defined REQUIRE_AVX512DQ
+# include <init-arch.h>
+
+  /* Set to 1 if supported.  */
+  static int avx512dq_usable;
+
+# define INIT_ARCH_EXT                                                \
+  do                                                                  \
+    {                                                                 \
+      __init_cpu_features ();                                         \
+      avx512dq_usable = __cpu_features.feature[index_AVX512DQ_Usable] \
+                       & bit_AVX512DQ_Usable;                        \
+    }                                                                 \
+  while (0)
+
+# define CHECK_ARCH_EXT                                        \
+  do                                                           \
+    {                                                          \
+      if (!avx512dq_usable) return;                            \
+    }                                                          \
+  while (0)
+
+#else
+# include <sysdeps/generic/math-tests-arch.h>
+#endif
diff --git a/sysdeps/x86_64/fpu/test-double-vlen2.c
b/sysdeps/x86_64/fpu/test-double-vlen2.c
new file mode 100644
index 0000000..df82c96
--- /dev/null
+++ b/sysdeps/x86_64/fpu/test-double-vlen2.c
@@ -0,0 +1,38 @@ 
+/* Tests for SSE4 ISA versions of vector math functions.
+   Copyright (C) 2014 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include "test-double-vlen2.h"
+#include "test-vec-loop.h"
+#include <immintrin.h>
+
+// Wrapper from scalar to vector function implemented in SSE4.
+#define VECTOR_WRAPPER(scalar_func, vector_func) \
+extern __m128d vector_func (__m128d);          \
+FLOAT scalar_func (FLOAT x)                    \
+{                                              \
+  int i;                                       \
+  __m128d mx = _mm_set1_pd (x);                        \
+  __m128d mr = vector_func (mx);               \
+  TEST_VEC_LOOP (2);                           \
+}
+
+VECTOR_WRAPPER (WRAPPER_NAME (cos), _ZGVbN2v_cos)
+
+#define TEST_VECTOR_cos 1
+
+#include "libm-test.c"
diff --git a/sysdeps/x86_64/fpu/test-double-vlen4-avx2.c
b/sysdeps/x86_64/fpu/test-double-vlen4-avx2.c
new file mode 100644
index 0000000..581b6b7
--- /dev/null
+++ b/sysdeps/x86_64/fpu/test-double-vlen4-avx2.c
@@ -0,0 +1,43 @@ 
+/* Tests for AVX2 ISA versions of vector math functions.
+   Copyright (C) 2014 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include "test-double-vlen4.h"
+#include "test-vec-loop.h"
+#include <immintrin.h>
+
+// Wrapper from scalar to vector function implemented in AVX2.
+#define VECTOR_WRAPPER(scalar_func, vector_func) \
+extern __m256d vector_func (__m256d);          \
+FLOAT scalar_func (FLOAT x)                    \
+{                                              \
+  int i;                                       \
+  __m256d mx = _mm256_set1_pd (x);             \
+  __m256d mr = vector_func (mx);               \
+  TEST_VEC_LOOP (4);                           \
+}
+
+#undef VEC_SUFF
+#define VEC_SUFF _vlen4_avx2
+
+VECTOR_WRAPPER (WRAPPER_NAME (cos), _ZGVdN4v_cos)
+
+#define TEST_VECTOR_cos 1
+
+#define REQUIRE_AVX2
+
+#include "libm-test.c"
diff --git a/sysdeps/x86_64/fpu/test-double-vlen4.c
b/sysdeps/x86_64/fpu/test-double-vlen4.c
new file mode 100644
index 0000000..868e40d
--- /dev/null
+++ b/sysdeps/x86_64/fpu/test-double-vlen4.c
@@ -0,0 +1,41 @@ 
+/* Tests for AVX ISA versions of vector math functions.
+   Copyright (C) 2014 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include "test-double-vlen4.h"
+#include "test-vec-loop.h"
+#include <immintrin.h>
+
+// Wrapper from scalar to vector function implemented in AVX.
+#define VECTOR_WRAPPER(scalar_func, vector_func) \
+extern __m256d vector_func (__m256d);          \
+FLOAT scalar_func (FLOAT x)                    \
+{                                              \
+  int i;                                       \
+  __m256d mx = _mm256_set1_pd (x);             \
+  __m256d mr = vector_func (mx);               \
+  TEST_VEC_LOOP (4);                           \
+}
+
+#undef VEC_SUFF
+#define VEC_SUFF _vlen4_avx
+
+VECTOR_WRAPPER (WRAPPER_NAME (cos), _ZGVcN4v_cos)
+
+#define TEST_VECTOR_cos 1
+
+#include "libm-test.c"
diff --git a/sysdeps/x86_64/fpu/test-double-vlen8-wrappers.c
b/sysdeps/x86_64/fpu/test-double-vlen8-wrappers.c
new file mode 100644
index 0000000..d42fed3
--- /dev/null
+++ b/sysdeps/x86_64/fpu/test-double-vlen8-wrappers.c
@@ -0,0 +1,34 @@ 
+/* Tests for AVX-512 versions of vector math functions.
+   Copyright (C) 2014 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include "test-double-vlen8.h"
+#include "test-vec-loop.h"
+#include <immintrin.h>
+
+// Wrapper from scalar to vector function implemented in AVX-512.
+#define VECTOR_WRAPPER(scalar_func, vector_func) \
+extern __m512d vector_func (__m512d);          \
+FLOAT scalar_func (FLOAT x)                    \
+{                                              \
+  int i;                                       \
+  __m512d mx = _mm512_set1_pd (x);             \
+  __m512d mr = vector_func (mx);               \
+  TEST_VEC_LOOP (8);                           \
+}
+
+VECTOR_WRAPPER (WRAPPER_NAME (cos), _ZGVeN8v_cos)
diff --git a/sysdeps/x86_64/fpu/test-double-vlen8.c
b/sysdeps/x86_64/fpu/test-double-vlen8.c
new file mode 100644
index 0000000..49ed3f5
--- /dev/null
+++ b/sysdeps/x86_64/fpu/test-double-vlen8.c
@@ -0,0 +1,27 @@ 
+/* Tests for AVX-512 versions of vector math functions.
+   Copyright (C) 2014 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#include "test-double-vlen8.h"
+
+WRAPPER_DECL (WRAPPER_NAME (cos))
+
+#define TEST_VECTOR_cos 1
+
+#define REQUIRE_AVX512F
+
+#include "libm-test.c"