/* { dg-do run } */ /* { dg-options "-O2 -fno-strict-aliasing -msse2" } */ /* { dg-additional-options "-mno-mmx" { target { ! ia32 } } } */ #include #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 (); }