120253Sjoerg/* { dg-do run } */
220302Sjoerg/* { dg-require-effective-target sse4 } */
320302Sjoerg/* { dg-options "-O2 -msse4.1" } */
420253Sjoerg
520253Sjoerg#ifndef CHECK_H
620253Sjoerg#define CHECK_H "sse4_1-check.h"
720253Sjoerg#endif
820253Sjoerg
920302Sjoerg#ifndef TEST
1020253Sjoerg#define TEST sse4_1_test
1120253Sjoerg#endif
1220253Sjoerg
1320253Sjoerg#include CHECK_H
1420302Sjoerg
1520253Sjoerg#include <smmintrin.h>
1620253Sjoerg#include <string.h>
1720302Sjoerg
1820253Sjoerg#define NUM 20
1920253Sjoerg
2020253Sjoerg#ifndef MASK
2120253Sjoerg#define MASK 0x0f
2220253Sjoerg#endif
2320253Sjoerg
2420253Sjoergstatic void
2520253Sjoerginit_blendps (float *src1, float *src2)
2620253Sjoerg{
2730259Scharnier  int i, sign = 1;
2830259Scharnier
2950479Speter  for (i = 0; i < NUM * 4; i++)
3030259Scharnier    {
3130259Scharnier      src1[i] = i * i * sign;
3230259Scharnier      src2[i] = (i + 20) * sign;
3338112Snate      sign = -sign;
3421330Sdavidn    }
3521330Sdavidn}
3644229Sdavidn
3720253Sjoergstatic int
3856000Sdavidncheck_blendps (__m128 *dst, float *src1, float *src2)
3956000Sdavidn{
4056000Sdavidn  float tmp[4];
4152512Sdavidn  int j;
4252512Sdavidn
4352512Sdavidn  memcpy (&tmp[0], src1, sizeof (tmp));
4420253Sjoerg  for (j = 0; j < 4; j++)
4520267Sjoerg    if ((MASK & (1 << j)))
4620267Sjoerg      tmp[j] = src2[j];
4752512Sdavidn
4820267Sjoerg  return memcmp (dst, &tmp[0], sizeof (tmp));
4920267Sjoerg}
5020267Sjoerg
5120267Sjoergstatic void
5252512SdavidnTEST (void)
5320267Sjoerg{
5452512Sdavidn  __m128 x, y;
5520253Sjoerg  union
5644229Sdavidn    {
5744229Sdavidn      __m128 x[NUM];
5844229Sdavidn      float f[NUM * 4];
5944229Sdavidn    } dst, src1, src2;
6044229Sdavidn  union
6144229Sdavidn    {
6244229Sdavidn      __m128 x;
6344229Sdavidn      float f[4];
6444229Sdavidn    } src3;
6544229Sdavidn  int i;
6644229Sdavidn
6744229Sdavidn  init_blendps (src1.f, src2.f);
6844229Sdavidn
6944229Sdavidn  /* Check blendps imm8, m128, xmm */
7044229Sdavidn  for (i = 0; i < NUM; i++)
7144229Sdavidn    {
7244229Sdavidn      dst.x[i] = _mm_blend_ps (src1.x[i], src2.x[i], MASK);
7344229Sdavidn      if (check_blendps (&dst.x[i], &src1.f[i * 4], &src2.f[i * 4]))
7444229Sdavidn	abort ();
7544229Sdavidn    }
7644229Sdavidn
7744229Sdavidn   /* Check blendps imm8, xmm, xmm */
7844229Sdavidn  x = _mm_blend_ps (dst.x[2], src3.x, MASK);
7944229Sdavidn  y = _mm_blend_ps (src3.x, dst.x[2], MASK);
8044229Sdavidn
8144229Sdavidn  if (check_blendps (&x, &dst.f[8], &src3.f[0]))
8244229Sdavidn    abort ();
8344229Sdavidn
8444229Sdavidn  if (check_blendps (&y, &src3.f[0], &dst.f[8]))
8544229Sdavidn    abort ();
8644229Sdavidn}
8744229Sdavidn