summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/i386/sse4_1-dpps-2.c
blob: 48483b6c824b35e36d9056f489aa2bc600a888c2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/* { dg-do run } */
/* { dg-require-effective-target sse4 } */
/* { dg-options "-O2 -msse4.1" } */

#ifndef CHECK_H
#define CHECK_H "sse4_1-check.h"
#endif

#ifndef TEST
#define TEST sse4_1_test
#endif

#include CHECK_H

#include <smmintrin.h>

#include <string.h>

#define lmskN  0x00
#define lmsk0  0x01
#define lmsk1  0x02
#define lmsk2  0x04
#define lmsk3  0x08
#define lmsk01 0x03
#define lmsk02 0x05
#define lmsk03 0x09
#define lmsk12 0x06
#define lmsk13 0x0A
#define lmsk23 0x0C
#define lmskA  0x0F

#define hmskN  0x00
#define hmskA  0xF0
#define hmsk0  0x10
#define hmsk1  0x20
#define hmsk2  0x40
#define hmsk3  0x80
#define hmsk01 0x30
#define hmsk02 0x50
#define hmsk03 0x90
#define hmsk12 0x60
#define hmsk13 0xA0
#define hmsk23 0xC0

#ifndef HIMASK
#define HIMASK hmskA
#endif

#ifndef LOMASK
#define LOMASK lmskA
#endif

static void
TEST (void)
{
  union
    {
      __m128 x;
      float f[4];
    } val1[16], val2[16], res[16], chk[16];
  int i,j;
  float tmp;

  for (i = 0; i < 16; i++)
    {
      val1[i].f[0] = 2.;
      val1[i].f[1] = 3.;
      val1[i].f[2] = 4.;
      val1[i].f[3] = 5.;

      val2[i].f[0] = 10.;
      val2[i].f[1] = 100.;
      val2[i].f[2] = 1000.;
      val2[i].f[3] = 10000.;

      tmp = 0.;
      for (j = 0; j < 4; j++)
        if ((HIMASK & (0x10 << j)))
	  tmp += val1[i].f [j] * val2[i].f [j];

      for (j = 0; j < 4; j++)
	if ((LOMASK & (1 << j)))
	  chk[i].f[j] = tmp;
    }

   for (i = 0; i < 16; i++)
     {
       res[i].x = _mm_dp_ps (val1[i].x, val2[i].x, HIMASK | LOMASK);
       if (memcmp (&res[i], &chk[i], sizeof (chk[i])))
	 abort ();
     }
}