1  /* { dg-do run } */
       2  /* { dg-options "-O2 -fno-strict-aliasing -msse2" } */
       3  /* { dg-additional-options "-mno-mmx" { target { ! ia32 } } } */
       4  
       5  #include <string.h>
       6  #include "sse2-check.h"
       7  
       8  __attribute__((noinline, noclone))
       9  static void
      10  test_pextrw (__m64 *i, unsigned int imm, int *r)
      11  {
      12    switch (imm)
      13      {
      14      case 0:
      15        *r = _m_pextrw (*i, 0);
      16        break;
      17      case 1:
      18        *r = _m_pextrw (*i, 1);
      19        break;
      20      case 2:
      21        *r = _m_pextrw (*i, 2);
      22        break;
      23      case 3:
      24        *r = _m_pextrw (*i, 3);
      25        break;
      26      default:
      27        break;
      28      }
      29  }
      30  
      31  /* Routine to manually compute the results */
      32  static void
      33  compute_correct_result (__m64 *src_p, unsigned int imm, int *res_p)
      34  {
      35    unsigned short *src = (unsigned short *) src_p;
      36    if (imm < 4)
      37      *res_p = src[imm];
      38  }
      39  
      40  static void
      41  sse2_test (void)
      42  {
      43    int r, ck;
      44    int i;
      45    int failed = 0;
      46    __v4hi y = { 3320, -3339, 48, 4392 };
      47  
      48    /* Run the MMX tests */
      49    for (i = 0; i < 4; i++)
      50      {
      51        test_pextrw ((__m64 *) &y, i, &r);
      52        compute_correct_result ((__m64 *) &y, i, &ck);
      53        if (r != ck)
      54  	failed++;
      55      }
      56  
      57    if (failed)
      58      abort ();
      59  }