Manman Ren | d105e73 | 2012-10-16 19:01:37 +0000 | [diff] [blame^] | 1 | // 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 | |
| 6 | typedef __attribute__(( ext_vector_type(2) )) int __int2; |
| 7 | |
| 8 | // Passing legal vector types as varargs. |
| 9 | double 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 | |
| 32 | double 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 | } |