1  /* { dg-do compile } */
       2  /* { dg-require-effective-target powerpc_p9vector_ok } */
       3  /* { dg-options "-mdejagnu-cpu=power9 -O3" } */
       4  
       5  #include <altivec.h>
       6  
       7  /* Verify P9 vec_revb builtin generates the XXBR{Q,D,W,H} instructions.  */
       8  
       9  vector char
      10  rev_char (vector char a)
      11  {
      12    return vec_revb (a);		/* Is a NOP, maps to move inst  */
      13  }
      14  
      15  vector bool char
      16  rev_bool_char (vector bool char a)
      17  {
      18    return vec_revb (a);		/* Is a NOP, maps to move inst  */
      19  }
      20  
      21  vector signed char
      22  rev_schar (vector signed char a)
      23  {
      24    return vec_revb (a);		/* Is a NOP, maps to move inst  */
      25  }
      26  
      27  vector unsigned char
      28  rev_uchar (vector unsigned char a)
      29  {
      30    return vec_revb (a);		/* Is a NOP, maps to move inst  */
      31  }
      32  
      33  vector short
      34  rev_short (vector short a)
      35  {
      36    return vec_revb (a);		/* XXBRH.  */
      37  }
      38  
      39  vector bool short
      40  rev_bool_short (vector bool short a)
      41  {
      42    return vec_revb (a);		/* XXBRH.  */
      43  }
      44  
      45  vector unsigned short
      46  rev_ushort (vector unsigned short a)
      47  {
      48    return vec_revb (a);		/* XXBRH.  */
      49  }
      50  
      51  vector int
      52  rev_int (vector int a)
      53  {
      54    return vec_revb (a);		/* XXBRW.  */
      55  }
      56  
      57  vector bool int
      58  rev_bool_int (vector bool int a)
      59  {
      60    return vec_revb (a);		/* XXBRW.  */
      61  }
      62  
      63  vector unsigned int
      64  rev_uint (vector unsigned int a)
      65  {
      66    return vec_revb (a);		/* XXBRW.  */
      67  }
      68  
      69  vector float
      70  rev_float (vector float a)
      71  {
      72    return vec_revb (a);		/* XXBRW.  */
      73  }
      74  
      75  vector double
      76  rev_double (vector double a)
      77  {
      78    return vec_revb (a);		/* XXBRD.  */
      79  }
      80  
      81  /* { dg-final { scan-assembler-times "xxbrd" 1 } } */
      82  /* { dg-final { scan-assembler-times "xxbrh" 3 } } */
      83  /* { dg-final { scan-assembler-times "xxbrw" 4 } } */