(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
i386/
sse4a-extract.c
       1  /* { dg-do run } */
       2  /* { dg-require-effective-target sse4a } */
       3  /* { dg-options "-O2 -msse4a" } */
       4  
       5  #include "sse4a-check.h"
       6  
       7  #include <ammintrin.h>
       8  
       9  typedef union
      10  {
      11    long long i[2];
      12    __m128i vec;
      13  } LI;
      14  
      15  static long long 
      16  sse4a_test_extrq (long long in)
      17  {
      18    __m128i v1, v2;
      19    long long index_length, pad;
      20    LI v_out;
      21    index_length = 0x0000000000000810LL; 
      22    pad = 0x0;
      23    v1 = _mm_set_epi64x (pad, in);
      24    v2 = _mm_set_epi64x (pad, index_length); 
      25    v_out.vec = _mm_extract_si64 (v1, v2);
      26    return (v_out.i[0]); 
      27  }
      28  
      29  static long long 
      30  sse4a_test_extrqi (long long in)
      31  {
      32    __m128i v1;
      33    long long pad =0x0;
      34    LI v_out;
      35    v1 = _mm_set_epi64x (pad, in);
      36    v_out.vec = _mm_extracti_si64 (v1, (unsigned int) 0x10,(unsigned int) 0x08);
      37    return (v_out.i[0]);
      38  }
      39  
      40  static int chk (long long i1, long long i2)
      41  {
      42    int n_fails =0;
      43    if (i1 != i2) 
      44      n_fails +=1;
      45    return n_fails;
      46  }
      47  
      48  long long vals_in[5] =
      49    {
      50      0x1234567887654321LL,
      51      0x1456782093002490LL,
      52      0x2340909123990390LL,
      53      0x9595959599595999LL,
      54      0x9099038798000029LL
      55    };
      56  
      57  long long vals_out[5] =
      58    {
      59      0x0000000000006543LL,
      60      0x0000000000000024LL,
      61      0x0000000000009903LL,
      62      0x0000000000005959LL,
      63      0x0000000000000000LL
      64    };
      65  
      66  static void
      67  sse4a_test (void)
      68  {
      69    int i;
      70    int fail = 0;
      71    long long out;
      72  
      73    for (i = 0; i < 5; i += 1)
      74      {
      75        out = sse4a_test_extrq (vals_in[i]);
      76        fail += chk(out, vals_out[i]);
      77  
      78        out = sse4a_test_extrqi (vals_in[i]);
      79        fail += chk(out, vals_out[i]);
      80      }
      81  
      82    if (fail != 0)
      83      abort ();
      84  }