1/* Check calling convention in the vector ABI. */ 2 3/* { dg-do compile { target { s390*-*-* } } } */ 4/* { dg-options "-O3 -mzarch -march=z13" } */ 5 6/* No abi attribute should be emitted when nothing relevant happened. */ 7/* { dg-final { scan-assembler-not "gnu_attribute" } } */ 8 9#include <stdarg.h> 10 11/* Local use is ok. */ 12 13typedef int v4si __attribute__((vector_size(16))); 14 15static 16v4si __attribute__((__noinline__)) 17foo (v4si a) 18{ 19 return a + (v4si){ 1, 2, 3, 4 }; 20} 21 22int 23bar (int a) 24{ 25 return foo ((v4si){ 1, 1, 1, 1 })[1]; 26} 27 28/* Big vector type only used as function argument and return value 29 without being a struct/union member. The alignment change is not 30 relevant here. */ 31 32typedef double v4df __attribute__((vector_size(32))); 33 34v4df 35add (v4df a, v4df b, v4df c, v4df d, 36 v4df e, v4df f, v4df g, v4df h, v4df i) 37{ 38 return a + b + c + d + e + f + g + h + i; 39} 40 41double 42bar2 (int n, ...) 43{ 44 double ret; 45 v4df a; 46 va_list va; 47 48 va_start (va, n); 49 ret = va_arg (va, v4df)[2]; 50 va_end (va); 51 52 return ret; 53} 54