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 38 static void TEST(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