xref: /minix3/external/bsd/llvm/dist/clang/test/CodeGen/arm-vaarg-align.c (revision f4a2713ac843a11c696ec80c0a5e3e5d80b4d338)
1*f4a2713aSLionel Sambuc // REQUIRES: arm-registered-target
2*f4a2713aSLionel Sambuc // RUN: %clang_cc1 -triple arm -target-abi aapcs %s -emit-llvm -o - | FileCheck -check-prefix=AAPCS %s
3*f4a2713aSLionel Sambuc // RUN: %clang_cc1 -triple arm -target-abi apcs-gnu %s -emit-llvm -o - | FileCheck -check-prefix=APCS-GNU %s
4*f4a2713aSLionel Sambuc /*
5*f4a2713aSLionel Sambuc  * Check that va_arg accesses stack according to ABI alignment
6*f4a2713aSLionel Sambuc  * long long and double require 8-byte alignment under AAPCS
7*f4a2713aSLionel Sambuc  * however, they only require 4-byte alignment under APCS
8*f4a2713aSLionel Sambuc  */
t1(int i,...)9*f4a2713aSLionel Sambuc long long t1(int i, ...) {
10*f4a2713aSLionel Sambuc     // AAPCS: t1
11*f4a2713aSLionel Sambuc     // APCS-GNU: t1
12*f4a2713aSLionel Sambuc     __builtin_va_list ap;
13*f4a2713aSLionel Sambuc     __builtin_va_start(ap, i);
14*f4a2713aSLionel Sambuc     // AAPCS: add i32 %{{.*}} 7
15*f4a2713aSLionel Sambuc     // AAPCS: and i32 %{{.*}} -8
16*f4a2713aSLionel Sambuc     // APCS-GNU-NOT: add i32 %{{.*}} 7
17*f4a2713aSLionel Sambuc     // APCS-GNU-NOT: and i32 %{{.*}} -8
18*f4a2713aSLionel Sambuc     long long ll = __builtin_va_arg(ap, long long);
19*f4a2713aSLionel Sambuc     __builtin_va_end(ap);
20*f4a2713aSLionel Sambuc     return ll;
21*f4a2713aSLionel Sambuc }
t2(int i,...)22*f4a2713aSLionel Sambuc double t2(int i, ...) {
23*f4a2713aSLionel Sambuc     // AAPCS: t2
24*f4a2713aSLionel Sambuc     // APCS-GNU: t2
25*f4a2713aSLionel Sambuc     __builtin_va_list ap;
26*f4a2713aSLionel Sambuc     __builtin_va_start(ap, i);
27*f4a2713aSLionel Sambuc     // AAPCS: add i32 %{{.*}} 7
28*f4a2713aSLionel Sambuc     // AAPCS: and i32 %{{.*}} -8
29*f4a2713aSLionel Sambuc     // APCS-GNU-NOT: add i32 %{{.*}} 7
30*f4a2713aSLionel Sambuc     // APCS-GNU-NOT: and i32 %{{.*}} -8
31*f4a2713aSLionel Sambuc     double ll = __builtin_va_arg(ap, double);
32*f4a2713aSLionel Sambuc     __builtin_va_end(ap);
33*f4a2713aSLionel Sambuc     return ll;
34*f4a2713aSLionel Sambuc }
35