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