1/* { dg-do run } */ 2/* { dg-require-effective-target sse4 } */ 3/* { dg-options "-O2 -msse4.1" } */ 4 5#ifndef CHECK_H 6#define CHECK_H "sse4_1-check.h" 7#endif 8 9#ifndef TEST 10#define TEST sse4_1_test 11#endif 12 13#include CHECK_H 14 15#include <smmintrin.h> 16 17#include <string.h> 18 19#define lmskN 0x00 20#define lmsk0 0x01 21#define lmsk1 0x02 22#define lmsk01 0x03 23 24#define hmskA 0x30 25#define hmsk0 0x10 26#define hmsk1 0x20 27#define hmsk01 0x30 28#define hmskN 0x00 29 30#ifndef HIMASK 31#define HIMASK hmskA 32#endif 33 34#ifndef LOMASK 35#define LOMASK lmsk01 36#endif 37 38static void 39TEST (void) 40{ 41 union 42 { 43 __m128d x; 44 double d[2]; 45 } val1[4], val2[4], res[4], chk[4]; 46 int i, j; 47 double tmp; 48 49 for (i = 0; i < 4; i++) 50 { 51 val1[i].d [0] = 2.; 52 val1[i].d [1] = 3.; 53 54 val2[i].d [0] = 10.; 55 val2[i].d [1] = 100.; 56 57 tmp = 0.; 58 for (j = 0; j < 2; j++) 59 if ((HIMASK & (0x10 << j))) 60 tmp += val1[i].d [j] * val2[i].d [j]; 61 62 for (j = 0; j < 2; j++) 63 if ((LOMASK & (1 << j))) 64 chk[i].d[j] = tmp; 65 } 66 67 for (i = 0; i < 4; i++) 68 { 69 res[i].x = _mm_dp_pd (val1[i].x, val2[i].x, HIMASK | LOMASK); 70 if (memcmp (&res[i], &chk[i], sizeof (chk[i]))) 71 abort (); 72 } 73} 74