blob: fee41b8514f9a7753a3d83532e02f1affa8e9ebf [file] [log] [blame]
Manman Rend105e732012-10-16 19:01:37 +00001// RUN: %clang_cc1 -triple armv7-apple-darwin -target-abi aapcs -emit-llvm -o - %s | FileCheck %s
2// RUN: %clang_cc1 -triple armv7-apple-darwin -target-abi apcs-gnu -emit-llvm -o - %s | FileCheck -check-prefix=APCS-GNU %s
3
4#include <stdarg.h>
5
6typedef __attribute__(( ext_vector_type(2) )) int __int2;
7
8// Passing legal vector types as varargs.
9double varargs_vec_2i(int fixed, ...) {
10// CHECK: varargs_vec_2i
11// CHECK: %c3 = alloca <2 x i32>, align 8
12// CHECK: %3 = and i32 %2, -8
13// CHECK: %ap.align = inttoptr i32 %3 to i8*
14// CHECK: %ap.next = getelementptr i8* %ap.align, i32 8
15// CHECK: bitcast i8* %ap.align to <2 x i32>*
16// APCS-GNU: varargs_vec_2i
17// APCS-GNU: %c3 = alloca <2 x i32>, align 8
18// APCS-GNU: %var.align = alloca <2 x i32>
19// APCS-GNU: %ap.next = getelementptr i8* %ap.cur, i32 8
20// APCS-GNU: %1 = bitcast <2 x i32>* %var.align to i8*
21// APCS-GNU: call void @llvm.memcpy
22// APCS-GNU: %2 = load <2 x i32>* %var.align
23 va_list ap;
24 double sum = fixed;
25 va_start(ap, fixed);
26 __int2 c3 = va_arg(ap, __int2);
27 sum = sum + c3.x + c3.y;
28 va_end(ap);
29 return sum;
30}
31
32double test_2i(__int2 *in) {
33// CHECK: test_2i
34// CHECK: call arm_aapcscc double (i32, ...)* @varargs_vec_2i(i32 3, <2 x i32> %1)
35// APCS-GNU: test_2i
36// APCS-GNU: call double (i32, ...)* @varargs_vec_2i(i32 3, <2 x i32> %1)
37 return varargs_vec_2i(3, *in);
38}