1  /* PR target/100637 */
       2  /* { dg-do compile } */
       3  /* { dg-options "-O2 -ftree-vectorize -msse4 -fno-vect-cost-model" } */
       4  
       5  short r[2], a[2], b[2];
       6  unsigned short ur[2], ua[2], ub[2];
       7  
       8  void mulh (void)
       9  {
      10    int i;
      11  
      12    for (i = 0; i < 2; i++)
      13      r[i] = ((int) a[i] * b[i]) >> 16;
      14  }
      15  
      16  /* { dg-final { scan-assembler "pmulhw" } } */
      17  
      18  void mulhu (void)
      19  {
      20    int i;
      21  
      22    for (i = 0; i < 2; i++)
      23      ur[i] = ((unsigned int) ua[i] * ub[i]) >> 16;
      24  }
      25  
      26  /* { dg-final { scan-assembler "pmulhuw" } } */
      27  
      28  void mulhrs (void)
      29  {
      30    int i;
      31  
      32    for (i = 0; i < 2; i++)
      33      r[i] = ((((int) a[i] * b[i]) >> 14) + 1) >> 1;
      34  }
      35  
      36  /* { dg-final { scan-assembler "pmulhrsw" } } */
      37  
      38  void maxs (void)
      39  {
      40    int i;
      41  
      42    for (i = 0; i < 2; i++)
      43      r[i] = a[i] > b[i] ? a[i] : b[i];
      44  }
      45  
      46  /* { dg-final { scan-assembler "pmaxsw" } } */
      47  
      48  void maxu (void)
      49  {
      50    int i;
      51  
      52    for (i = 0; i < 2; i++)
      53      ur[i] = ua[i] > ub[i] ? ua[i] : ub[i];
      54  }
      55  
      56  /* { dg-final { scan-assembler "pmaxuw" } } */
      57  
      58  void mins (void)
      59  {
      60    int i;
      61  
      62    for (i = 0; i < 2; i++)
      63      r[i] = a[i] < b[i] ? a[i] : b[i];
      64  }
      65  
      66  /* { dg-final { scan-assembler "pminsw" } } */
      67  
      68  void minu (void)
      69  {
      70    int i;
      71  
      72    for (i = 0; i < 2; i++)
      73      ur[i] = ua[i] < ub[i] ? ua[i] : ub[i];
      74  }
      75  
      76  /* { dg-final { scan-assembler "pminuw" } } */
      77  
      78  void _abs (void)
      79  {
      80    int i;
      81  
      82    for (i = 0; i < 2; i++)
      83      r[i] = a[i] < 0 ? -a[i] : a[i];
      84  }
      85  
      86  /* { dg-final { scan-assembler "pabsw" } } */
      87  
      88  void avgu (void)
      89  {
      90    int i;
      91  
      92    for (i = 0; i < 2; i++)
      93      ur[i] = (ua[i] + ub[i] + 1) >> 1;
      94  }
      95  
      96  /* { dg-final { scan-assembler "pavgw" } } */