1  /* Test whether overloading works as expected.  */
       2  
       3  /* { dg-do compile { target { s390*-*-* } } } */
       4  /* { dg-options "-march=z13 -mzarch -mzvector -fdump-tree-original" } */
       5  
       6  __vector int var_v4si;
       7  __vector unsigned var_uv4si;
       8  __vector bool var_bv4si;
       9  __vector long long var_v2di;
      10  __vector unsigned long long var_uv2di;
      11  __vector bool long long var_bv2di;
      12  __vector double var_v2df;
      13  
      14  int *intptr;
      15  unsigned *uintptr;
      16  double *dblptr;
      17  unsigned long long ull;
      18  const int *cintptr;
      19  long long* llptr;
      20  unsigned long long* ullptr;
      21  
      22  typedef __vector int v4si;
      23  typedef __vector unsigned int uv4si;
      24  
      25  v4si var2_v4si;
      26  uv4si var2_uv4si;
      27  
      28  void
      29  foo ()
      30  {
      31    __builtin_s390_vec_scatter_element (var_v4si,  var_uv4si, intptr, (unsigned long long)0);
      32    __builtin_s390_vec_scatter_element (var2_v4si, var2_uv4si, intptr, (unsigned long long)0);
      33    __builtin_s390_vec_scatter_element (var_bv4si, var_uv4si, uintptr, (unsigned long long)0);
      34    __builtin_s390_vec_scatter_element (var_uv4si, var_uv4si, uintptr, (unsigned long long)0);
      35    __builtin_s390_vec_scatter_element (var_v2di,  var_uv2di, llptr, (unsigned long long)0);
      36    __builtin_s390_vec_scatter_element (var_bv2di, var_uv2di, ullptr, (unsigned long long)0);
      37    __builtin_s390_vec_scatter_element (var_uv2di, var_uv2di, ullptr, (unsigned long long)0);
      38    __builtin_s390_vec_scatter_element (var_v2df,  var_uv2di, dblptr, (unsigned long long)0);
      39  
      40    /* While the last argument is a int there is a way to convert it to
      41       unsigned long long, so this variant is supposed to match.  */
      42   __builtin_s390_vec_scatter_element (var_v4si,  var_uv4si, intptr, 0);
      43  
      44    __builtin_s390_vec_insert_and_zero (intptr);
      45    __builtin_s390_vec_insert_and_zero (cintptr);
      46  
      47    __builtin_s390_vec_promote ((signed char)1, 1);
      48    __builtin_s390_vec_promote ((unsigned char)1, 1);
      49    __builtin_s390_vec_promote ((short int)1, 1);
      50    __builtin_s390_vec_promote ((unsigned short int)1, 1);
      51    __builtin_s390_vec_promote ((int)1, 1);
      52    __builtin_s390_vec_promote ((unsigned)1, 1);
      53    __builtin_s390_vec_promote ((long long)1, 1);
      54    __builtin_s390_vec_promote ((unsigned long long)1, 1);
      55    __builtin_s390_vec_promote ((double)1, 1);
      56  
      57    /* This is supposed to match vec_promote_s32 */
      58    __builtin_s390_vec_promote (1, (signed char) -1);
      59  
      60    /* Constants in C usually are considered int.  */
      61    __builtin_s390_vec_promote (1, 1);
      62  
      63    /* And (unsigned) long if they are too big for int.  */
      64    __builtin_s390_vec_promote (1ULL << 32, 1);
      65    __builtin_s390_vec_promote (1LL << 32, 1);
      66  }
      67  
      68  /* { dg-final { scan-tree-dump-times "__builtin_s390_vscef " 5 "original" } } */
      69  /* { dg-final { scan-tree-dump-times "__builtin_s390_vsceg " 4 "original" } } */
      70  
      71  /* { dg-final { scan-tree-dump-times "__builtin_s390_vllezf " 2 "original" } } */
      72  
      73  /* { dg-final { scan-tree-dump-times "__builtin_s390_vlvgb_noin " 2 "original" } } */
      74  /* { dg-final { scan-tree-dump-times "__builtin_s390_vlvgh_noin " 2 "original" } } */
      75  /* { dg-final { scan-tree-dump-times "__builtin_s390_vlvgf_noin " 4 "original" } } */
      76  /* { dg-final { scan-tree-dump-times "__builtin_s390_vlvgg_noin " 4 "original" } } */
      77  /* { dg-final { scan-tree-dump-times "__builtin_s390_vlvgg_dbl_noin " 1 "original" } } */