1118611Snjl/* Check calling convention in the vector ABI.  */
2118611Snjl
3218590Sjkim/* { dg-do compile { target { s390*-*-* } } } */
4118611Snjl/* { dg-options "-O3 -mzarch -march=z13" } */
5118611Snjl
6118611Snjl/* c.i and c.j are passed by reference since a struct with two
7217365Sjkim   elements is no vector type argument.  */
8217365Sjkim/* { dg-final { scan-assembler "ld\t%v\[0-9\]*,0\\(%r3\\)" } } */
9118611Snjl/* { dg-final { scan-assembler "ld\t%v\[0-9\]*,8\\(%r3\\)" } } */
10118611Snjl
11217365Sjkim/* just_v2si is passed in a vector reg if it as an incoming arg.
12217365Sjkim   However, as return value it is passed via hidden first pointer
13217365Sjkim   argument.  */
14217365Sjkim/* { dg-final { scan-assembler ".*st.*\t%v\[0-9\]*,0\\(%r2\\)" } } */
15217365Sjkim
16217365Sjkim/* { dg-final { scan-assembler "gnu_attribute 8, 2" } } */
17217365Sjkim
18217365Sjkimtypedef int __attribute__ ((vector_size(8))) v2si;
19217365Sjkim
20217365Sjkimstruct just_v2si
21217365Sjkim{
22217365Sjkim  v2si i;
23217365Sjkim};
24217365Sjkim
25118611Snjlstruct two_v2si
26217365Sjkim{
27217365Sjkim  v2si i, j;
28217365Sjkim};
29118611Snjl
30217365Sjkimstruct just_v2si
31217365Sjkimadd_structvecs (v2si a, struct just_v2si b, struct two_v2si c)
32217365Sjkim{
33217365Sjkim  struct just_v2si res;
34217365Sjkim
35217365Sjkim  res.i = a + b.i + c.i + c.j;
36217365Sjkim  return res;
37217365Sjkim}
38217365Sjkim