1  /* Verify that overloaded built-ins for vec_splat with char
       2     inputs produce the right code.  */
       3  
       4  /* { dg-do compile } */
       5  /* { dg-require-effective-target powerpc_altivec_ok } */
       6  /* { dg-options "-maltivec -O2" } */
       7  
       8  #include <altivec.h>
       9  
      10  vector bool char testb_0  (vector bool char x) { return vec_splat (x, 0b00000); }
      11  vector bool char testb_1  (vector bool char x) { return vec_splat (x, 0b00001); }
      12  vector bool char testb_2  (vector bool char x) { return vec_splat (x, 0b00010); }
      13  vector bool char testb_4  (vector bool char x) { return vec_splat (x, 0b00100); }
      14  vector bool char testb_8  (vector bool char x) { return vec_splat (x, 0b01000); }
      15  
      16  vector signed char tests_0  (vector signed char x) { return vec_splat (x, 0b00000); }
      17  vector signed char tests_1  (vector signed char x) { return vec_splat (x, 0b00001); }
      18  vector signed char tests_2  (vector signed char x) { return vec_splat (x, 0b00010); }
      19  vector signed char tests_4  (vector signed char x) { return vec_splat (x, 0b00100); }
      20  vector signed char tests_8  (vector signed char x) { return vec_splat (x, 0b01000); }
      21  
      22  vector unsigned char testu_0  (vector unsigned char x) { return vec_splat (x, 0b00000); }
      23  vector unsigned char testu_1  (vector unsigned char x) { return vec_splat (x, 0b00001); }
      24  vector unsigned char testu_2  (vector unsigned char x) { return vec_splat (x, 0b00010); }
      25  vector unsigned char testu_4  (vector unsigned char x) { return vec_splat (x, 0b00100); }
      26  vector unsigned char testu_8  (vector unsigned char x) { return vec_splat (x, 0b01000); }
      27  
      28  /* Similar tests as above, but the source vector is a known constant. */
      29  const vector bool char by = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p'};
      30  const vector signed char sy = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p'};
      31  const vector unsigned char uy = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p'};
      32  
      33  vector bool char test_bc (vector bool char x) { return vec_splat (by, 0b00010); }
      34  vector signed char test_sc (vector signed char x) { return vec_splat (sy, 0b00011); }
      35  vector unsigned char test_uc (vector unsigned char x) { return vec_splat (uy, 0b00110); }
      36  
      37  // vec_splat() using variable vectors should generate the vspltb instruction.
      38  /* { dg-final { scan-assembler-times "vspltb" 15 } } */
      39  // vec_splat() using a constant vector will generate a load or a splat immediate byte.
      40  /* { dg-final { scan-assembler-times {\mlvx\M|\mlxvw4x\M|\mxxspltib\M} 3 } } */