1  /* { dg-do compile { target { ! ia32 } } } */
       2  /* { dg-options "-O2 -mavx512vl -mno-avx512bw" } */
       3  
       4  #include <x86intrin.h>
       5  
       6  __m128i
       7  f1 (__m128i a, __m128i b)
       8  {
       9    register __m128i c __asm ("xmm16") = a;
      10    asm volatile ("" : "+v" (c));
      11    c = _mm_packs_epi16 (c, b);
      12    asm volatile ("" : "+v" (c));
      13    return c;
      14  }
      15  
      16  /* { dg-final { scan-assembler-times "vpacksswb\[^\n\r\]*xmm\[0-9\]" 1 } } */
      17  /* { dg-final { scan-assembler-not "vpacksswb\[^\n\r\]*xmm16" } } */
      18  
      19  __m128i
      20  f2 (__m128i a, __m128i b)
      21  {
      22    register __m128i c __asm ("xmm16") = a;
      23    asm volatile ("" : "+v" (c));
      24    c = _mm_packs_epi32 (c, b);
      25    asm volatile ("" : "+v" (c));
      26    return c;
      27  }
      28  
      29  /* { dg-final { scan-assembler-times "vpackssdw\[^\n\r\]*xmm\[0-9\]" 1 } } */
      30  /* { dg-final { scan-assembler-not "vpackssdw\[^\n\r\]*xmm16" } } */
      31  
      32  __m128i
      33  f3 (__m128i a, __m128i b)
      34  {
      35    register __m128i c __asm ("xmm16") = a;
      36    asm volatile ("" : "+v" (c));
      37    c = _mm_packus_epi16 (c, b);
      38    asm volatile ("" : "+v" (c));
      39    return c;
      40  }
      41  
      42  /* { dg-final { scan-assembler-times "vpackuswb\[^\n\r\]*xmm\[0-9\]" 1 } } */
      43  /* { dg-final { scan-assembler-not "vpackuswb\[^\n\r\]*xmm16" } } */
      44  
      45  __m128i
      46  f4 (__m128i a, __m128i b)
      47  {
      48    register __m128i c __asm ("xmm16") = a;
      49    asm volatile ("" : "+v" (c));
      50    c = _mm_packus_epi32 (c, b);
      51    asm volatile ("" : "+v" (c));
      52    return c;
      53  }
      54  
      55  /* { dg-final { scan-assembler-times "vpackusdw\[^\n\r\]*xmm\[0-9\]" 1 } } */
      56  /* { dg-final { scan-assembler-not "vpackusdw\[^\n\r\]*xmm16" } } */
      57  
      58  __m256i
      59  f5 (__m256i a, __m256i b)
      60  {
      61    register __m256i c __asm ("xmm16") = a;
      62    asm volatile ("" : "+v" (c));
      63    c = _mm256_packs_epi16 (c, b);
      64    asm volatile ("" : "+v" (c));
      65    return c;
      66  }
      67  
      68  /* { dg-final { scan-assembler-times "vpacksswb\[^\n\r\]*ymm\[0-9\]" 1 } } */
      69  /* { dg-final { scan-assembler-not "vpacksswb\[^\n\r\]*ymm16" } } */
      70  
      71  __m256i
      72  f6 (__m256i a, __m256i b)
      73  {
      74    register __m256i c __asm ("xmm16") = a;
      75    asm volatile ("" : "+v" (c));
      76    c = _mm256_packs_epi32 (c, b);
      77    asm volatile ("" : "+v" (c));
      78    return c;
      79  }
      80  
      81  /* { dg-final { scan-assembler-times "vpackssdw\[^\n\r\]*ymm\[0-9\]" 1 } } */
      82  /* { dg-final { scan-assembler-not "vpackssdw\[^\n\r\]*ymm16" } } */
      83  
      84  __m256i
      85  f7 (__m256i a, __m256i b)
      86  {
      87    register __m256i c __asm ("xmm16") = a;
      88    asm volatile ("" : "+v" (c));
      89    c = _mm256_packus_epi16 (c, b);
      90    asm volatile ("" : "+v" (c));
      91    return c;
      92  }
      93  
      94  /* { dg-final { scan-assembler-times "vpackuswb\[^\n\r\]*ymm\[0-9\]" 1 } } */
      95  /* { dg-final { scan-assembler-not "vpackuswb\[^\n\r\]*ymm16" } } */
      96  
      97  __m256i
      98  f8 (__m256i a, __m256i b)
      99  {
     100    register __m256i c __asm ("xmm16") = a;
     101    asm volatile ("" : "+v" (c));
     102    c = _mm256_packus_epi32 (c, b);
     103    asm volatile ("" : "+v" (c));
     104    return c;
     105  }
     106  
     107  /* { dg-final { scan-assembler-times "vpackusdw\[^\n\r\]*ymm\[0-9\]" 1 } } */
     108  /* { dg-final { scan-assembler-not "vpackusdw\[^\n\r\]*ymm16" } } */