blob: edbac919fd81bfbd7310d35b3ca376a62ea3757f [file] [log] [blame]
/* { dg-do run } */
/* { dg-options "-O2 -fno-strict-aliasing -msse2" } */
/* { dg-additional-options "-mno-mmx" { target { ! ia32 } } } */
#include <string.h>
#include "sse2-check.h"
__attribute__((noinline, noclone))
static void
test_pextrw (__m64 *i, unsigned int imm, int *r)
{
switch (imm)
{
case 0:
*r = _m_pextrw (*i, 0);
break;
case 1:
*r = _m_pextrw (*i, 1);
break;
case 2:
*r = _m_pextrw (*i, 2);
break;
case 3:
*r = _m_pextrw (*i, 3);
break;
default:
break;
}
}
/* Routine to manually compute the results */
static void
compute_correct_result (__m64 *src_p, unsigned int imm, int *res_p)
{
unsigned short *src = (unsigned short *) src_p;
if (imm < 4)
*res_p = src[imm];
}
static void
sse2_test (void)
{
int r, ck;
int i;
int failed = 0;
__v4hi y = { 3320, -3339, 48, 4392 };
/* Run the MMX tests */
for (i = 0; i < 4; i++)
{
test_pextrw ((__m64 *) &y, i, &r);
compute_correct_result ((__m64 *) &y, i, &ck);
if (r != ck)
failed++;
}
if (failed)
abort ();
}