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