(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
powerpc/
mmx-packssdw-1.c
       1  /* { dg-do run } */
       2  /* { dg-options "-O3 -mpower8-vector" } */
       3  /* { dg-require-effective-target p8vector_hw } */
       4  
       5  #define NO_WARN_X86_INTRINSICS 1
       6  #ifndef CHECK_H
       7  #define CHECK_H "mmx-check.h"
       8  #endif
       9  
      10  #ifndef TEST
      11  #define TEST mmx_test
      12  #endif
      13  
      14  #include CHECK_H
      15  
      16  #include <mmintrin.h>
      17  
      18  static __m64
      19  __attribute__((noinline, unused))
      20  test (__m64 s1, __m64 s2)
      21  {
      22    return _mm_packs_pi32 (s1, s2);
      23  }
      24  
      25  static short
      26  saturate (int val)
      27  {
      28    if (val > 32767)
      29      return 32767;
      30    else if (val < -32768)
      31      return -32768;
      32    else
      33      return val;
      34  }
      35  
      36  static inline int
      37  l_mm_extract_pi32 (__m64 b, int imm8)
      38  {
      39    unsigned int shift = imm8 & 0x1;
      40  #ifdef __BIG_ENDIAN__
      41    shift = 1 - shift;
      42  #endif
      43    return ((long long)b >> (shift * 32)) & 0xffffffff;
      44  }
      45  
      46  static void
      47  TEST (void)
      48  {
      49    __m64_union s1, s2;
      50    __m64_union u;
      51    __m64_union e;
      52    int start, end, inc;
      53  
      54    s1.as_m64 = _mm_set_pi32 (2134, -128);
      55    s2.as_m64 = _mm_set_pi32 (41124, 234);
      56    u.as_m64 = test (s1.as_m64, s2.as_m64);
      57  
      58  #ifdef __LITTLE_ENDIAN__
      59    e.as_m64 = _mm_set_pi16 (saturate (l_mm_extract_pi32 (s2.as_m64, 1)),
      60                             saturate (l_mm_extract_pi32 (s2.as_m64, 0)),
      61                             saturate (l_mm_extract_pi32 (s1.as_m64, 1)),
      62                             saturate (l_mm_extract_pi32 (s1.as_m64, 0)));
      63  #else
      64    e.as_m64 = _mm_set_pi16 (saturate (l_mm_extract_pi32 (s1.as_m64, 1)),
      65                             saturate (l_mm_extract_pi32 (s1.as_m64, 0)),
      66                             saturate (l_mm_extract_pi32 (s2.as_m64, 1)),
      67                             saturate (l_mm_extract_pi32 (s2.as_m64, 0)));
      68  #endif
      69  
      70    if (u.as_m64 != e.as_m64)
      71      abort ();
      72  }