(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
s390/
vector/
vec-abi-vararg-1.c
       1  /* Check calling convention with variable argument lists in the vector
       2     ABI.  */
       3  
       4  /* { dg-do run { target { s390*-*-* } } } */
       5  /* { dg-require-effective-target s390_vx } */
       6  /* { dg-options "-O3 -mzarch -march=z13 --save-temps" } */
       7  
       8  /* Make sure arguments are fetched from the argument overflow area.  */
       9  /* { dg-final { scan-assembler "vl\t%v\[0-9\]*,352\\(%r15\\)" { target lp64 } } } */
      10  /* { dg-final { scan-assembler "ld\t%v\[0-9\]*,368\\(%r15\\)" { target lp64 } } } */
      11  /* { dg-final { scan-assembler "vl\t%v\[0-9\]*,376\\(%r15\\)" { target lp64 } } } */
      12  /* { dg-final { scan-assembler "ld\t%v\[0-9\]*,392\\(%r15\\)" { target lp64 } } } */
      13  
      14  /* { dg-final { scan-assembler "vl\t%v\[0-9\]*,208\\(%r15\\)" { target ilp32 } } } */
      15  /* { dg-final { scan-assembler "ld\t%v\[0-9\]*,224\\(%r15\\)" { target ilp32 } } } */
      16  /* { dg-final { scan-assembler "vl\t%v\[0-9\]*,232\\(%r15\\)" { target ilp32 } } } */
      17  /* { dg-final { scan-assembler "ld\t%v\[0-9\]*,248\\(%r15\\)" { target ilp32 } } } */
      18  
      19  
      20  #include <stdarg.h>
      21  
      22  extern void abort (void);
      23  
      24  typedef long long v2di __attribute__((vector_size(16)));
      25  typedef int v2si __attribute__((vector_size(8)));
      26  
      27  v2di __attribute__((noinline))
      28  add (int a, ...)
      29  {
      30    int i;
      31    va_list va;
      32    v2di di_result = { 0, 0 };
      33    v2si si_result = (v2si){ 0, 0 };
      34  
      35    va_start (va, a);
      36  
      37    di_result += va_arg (va, v2di);
      38    si_result += va_arg (va, v2si);
      39    di_result += va_arg (va, v2di);
      40    si_result += va_arg (va, v2si);
      41  
      42    va_end (va);
      43  
      44    di_result[0] += si_result[0];
      45    di_result[1] += si_result[1];
      46  
      47    return di_result;
      48  }
      49  
      50  int
      51  main ()
      52  {
      53    v2di r = add (4, (v2di){ 11, 21 }, (v2si){ 12, 22 }, (v2di){ 13, 23 }, (v2si){ 14, 24 });
      54  
      55    if (r[0] != 50 || r[1] != 90)
      56      abort ();
      57  
      58    return 0;
      59  }