(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
powerpc/
fold-vec-extract-char.p7.c
       1  /* Verify that overloaded built-ins for vec_extract() with char
       2     inputs produce the right code with a power7 (BE) target.  */
       3  
       4  /* { dg-do compile } */
       5  /* { dg-require-effective-target powerpc_vsx_ok } */
       6  /* { dg-options "-mdejagnu-cpu=power7 -O2" } */
       7  
       8  // Six tests total. Targeting P7 (BE).
       9  // P7 variable offset:  addi, li,       stxvw4x, rldicl, add, lbz, (extsb)
      10  // P7 const offset:           li, addi, stxvw4x,              lbz, (extsb)
      11  /* one extsb (extend sign-bit) instruction generated for each test against
      12     unsigned types */
      13  
      14  /* { dg-final { scan-assembler-times {\maddi\M} 9 } } */
      15  /* { dg-final { scan-assembler-times {\mli\M} 6 } } */
      16  /* { dg-final { scan-assembler-times {\mstxvw4x\M|\mstvx\M|\mstxv\M} 6 } } */
      17  /* -m32 target uses rlwinm in place of rldicl. */
      18  /* { dg-final { scan-assembler-times {\mrldicl\M|\mrlwinm\M} 3 } } */
      19  /* { dg-final { scan-assembler-times {\madd\M} 3 } } */
      20  /* { dg-final { scan-assembler-times {\mlbz\M} 6 } } */
      21  /* { dg-final { scan-assembler-times {\mextsb\M} 2 } } */
      22  
      23  #include <altivec.h>
      24  
      25  unsigned char
      26  testbc_var (vector bool char vbc2, signed int si)
      27  {
      28    return vec_extract (vbc2, si);
      29  }
      30  
      31  signed char
      32  testsc_var (vector signed char vsc2, signed int si)
      33  {
      34    return vec_extract (vsc2, si);
      35  }
      36  
      37  unsigned char
      38  testuc_var (vector unsigned char vuc2, signed int si)
      39  {
      40    return vec_extract (vuc2, si);
      41  }
      42  
      43  unsigned char
      44  testbc_cst (vector bool char vbc2)
      45  {
      46    return vec_extract (vbc2, 12);
      47  }
      48  
      49  signed char
      50  testsc_cst (vector signed char vsc2)
      51  {
      52    return vec_extract (vsc2, 12);
      53  }
      54  
      55  unsigned char
      56  testuc_cst (vector unsigned char vuc2)
      57  {
      58    return vec_extract (vuc2, 12);
      59  }
      60