1d105e73368e677e65af724947be85ec87a0fa45eManman Ren// RUN: %clang_cc1 -triple armv7-apple-darwin -target-abi aapcs -emit-llvm -o - %s | FileCheck %s 2d105e73368e677e65af724947be85ec87a0fa45eManman Ren// RUN: %clang_cc1 -triple armv7-apple-darwin -target-abi apcs-gnu -emit-llvm -o - %s | FileCheck -check-prefix=APCS-GNU %s 387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// RUN: %clang_cc1 -triple arm-linux-androideabi -emit-llvm -o - %s | FileCheck -check-prefix=ANDROID %s 4d105e73368e677e65af724947be85ec87a0fa45eManman Ren 5d105e73368e677e65af724947be85ec87a0fa45eManman Ren#include <stdarg.h> 6d105e73368e677e65af724947be85ec87a0fa45eManman Ren 7d105e73368e677e65af724947be85ec87a0fa45eManman Rentypedef __attribute__(( ext_vector_type(2) )) int __int2; 897f81573636068fb9536436188caadf030584e58Manman Rentypedef __attribute__(( ext_vector_type(3) )) char __char3; 997f81573636068fb9536436188caadf030584e58Manman Rentypedef __attribute__(( ext_vector_type(5) )) char __char5; 1097f81573636068fb9536436188caadf030584e58Manman Rentypedef __attribute__(( ext_vector_type(9) )) char __char9; 1197f81573636068fb9536436188caadf030584e58Manman Rentypedef __attribute__(( ext_vector_type(19) )) char __char19; 1297f81573636068fb9536436188caadf030584e58Manman Rentypedef __attribute__(( ext_vector_type(3) )) short __short3; 1397f81573636068fb9536436188caadf030584e58Manman Rentypedef __attribute__(( ext_vector_type(5) )) short __short5; 14d105e73368e677e65af724947be85ec87a0fa45eManman Ren 15d105e73368e677e65af724947be85ec87a0fa45eManman Ren// Passing legal vector types as varargs. 16d105e73368e677e65af724947be85ec87a0fa45eManman Rendouble varargs_vec_2i(int fixed, ...) { 17d105e73368e677e65af724947be85ec87a0fa45eManman Ren// CHECK: varargs_vec_2i 1887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[VAR:%.*]] = alloca <2 x i32>, align 8 1987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[ALIGN:%.*]] = and i32 {{%.*}}, -8 202e2f9dc3efb3b0f4892f3730eecb61255dac3c58Manman Ren// CHECK: [[AP_ALIGN:%.*]] = inttoptr i32 [[ALIGN]] to i8* 2187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP_ALIGN]], i32 8 2287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[AP_CAST:%.*]] = bitcast i8* [[AP_ALIGN]] to <2 x i32>* 2387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[VEC:%.*]] = load <2 x i32>, <2 x i32>* [[AP_CAST]], align 8 2487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store <2 x i32> [[VEC]], <2 x i32>* [[VAR]], align 8 25d105e73368e677e65af724947be85ec87a0fa45eManman Ren// APCS-GNU: varargs_vec_2i 2687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: [[VAR:%.*]] = alloca <2 x i32>, align 8 2787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: [[AP:%.*]] = load i8*, 2887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP]], i32 8 2987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: [[AP_CAST:%.*]] = bitcast i8* [[AP]] to <2 x i32>* 3087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: [[VEC:%.*]] = load <2 x i32>, <2 x i32>* [[AP_CAST]], align 4 3187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: store <2 x i32> [[VEC]], <2 x i32>* [[VAR]], align 8 3287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: varargs_vec_2i 3387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[VAR:%.*]] = alloca <2 x i32>, align 8 3487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[ALIGN:%.*]] = and i32 {{%.*}}, -8 3587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[AP_ALIGN:%.*]] = inttoptr i32 [[ALIGN]] to i8* 3687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP_ALIGN]], i32 8 3787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[AP_CAST:%.*]] = bitcast i8* [[AP_ALIGN]] to <2 x i32>* 3887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[VEC:%.*]] = load <2 x i32>, <2 x i32>* [[AP_CAST]], align 8 3987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: store <2 x i32> [[VEC]], <2 x i32>* [[VAR]], align 8 40d105e73368e677e65af724947be85ec87a0fa45eManman Ren va_list ap; 41d105e73368e677e65af724947be85ec87a0fa45eManman Ren double sum = fixed; 42d105e73368e677e65af724947be85ec87a0fa45eManman Ren va_start(ap, fixed); 43d105e73368e677e65af724947be85ec87a0fa45eManman Ren __int2 c3 = va_arg(ap, __int2); 44d105e73368e677e65af724947be85ec87a0fa45eManman Ren sum = sum + c3.x + c3.y; 45d105e73368e677e65af724947be85ec87a0fa45eManman Ren va_end(ap); 46d105e73368e677e65af724947be85ec87a0fa45eManman Ren return sum; 47d105e73368e677e65af724947be85ec87a0fa45eManman Ren} 48d105e73368e677e65af724947be85ec87a0fa45eManman Ren 49d105e73368e677e65af724947be85ec87a0fa45eManman Rendouble test_2i(__int2 *in) { 50d105e73368e677e65af724947be85ec87a0fa45eManman Ren// CHECK: test_2i 5158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar// CHECK: call arm_aapcscc double (i32, ...) @varargs_vec_2i(i32 3, <2 x i32> {{%.*}}) 52d105e73368e677e65af724947be85ec87a0fa45eManman Ren// APCS-GNU: test_2i 5358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar// APCS-GNU: call double (i32, ...) @varargs_vec_2i(i32 3, <2 x i32> {{%.*}}) 5487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: test_2i 5587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: call double (i32, ...) @varargs_vec_2i(i32 3, <2 x i32> {{%.*}}) 56d105e73368e677e65af724947be85ec87a0fa45eManman Ren return varargs_vec_2i(3, *in); 57d105e73368e677e65af724947be85ec87a0fa45eManman Ren} 5897f81573636068fb9536436188caadf030584e58Manman Ren 5997f81573636068fb9536436188caadf030584e58Manman Rendouble varargs_vec_3c(int fixed, ...) { 6097f81573636068fb9536436188caadf030584e58Manman Ren// CHECK: varargs_vec_3c 612e2f9dc3efb3b0f4892f3730eecb61255dac3c58Manman Ren// CHECK: alloca <3 x i8>, align 4 6287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP:%.*]], i32 4 632e2f9dc3efb3b0f4892f3730eecb61255dac3c58Manman Ren// CHECK: bitcast i8* [[AP]] to <3 x i8>* 6497f81573636068fb9536436188caadf030584e58Manman Ren// APCS-GNU: varargs_vec_3c 652e2f9dc3efb3b0f4892f3730eecb61255dac3c58Manman Ren// APCS-GNU: alloca <3 x i8>, align 4 6687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP:%.*]], i32 4 672e2f9dc3efb3b0f4892f3730eecb61255dac3c58Manman Ren// APCS-GNU: bitcast i8* [[AP]] to <3 x i8>* 6887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: varargs_vec_3c 6987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: alloca <3 x i8>, align 4 7087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP:%.*]], i32 4 7187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: bitcast i8* [[AP]] to <3 x i8>* 7297f81573636068fb9536436188caadf030584e58Manman Ren va_list ap; 7397f81573636068fb9536436188caadf030584e58Manman Ren double sum = fixed; 7497f81573636068fb9536436188caadf030584e58Manman Ren va_start(ap, fixed); 7597f81573636068fb9536436188caadf030584e58Manman Ren __char3 c3 = va_arg(ap, __char3); 7697f81573636068fb9536436188caadf030584e58Manman Ren sum = sum + c3.x + c3.y; 7797f81573636068fb9536436188caadf030584e58Manman Ren va_end(ap); 7897f81573636068fb9536436188caadf030584e58Manman Ren return sum; 7997f81573636068fb9536436188caadf030584e58Manman Ren} 8097f81573636068fb9536436188caadf030584e58Manman Ren 8197f81573636068fb9536436188caadf030584e58Manman Rendouble test_3c(__char3 *in) { 8297f81573636068fb9536436188caadf030584e58Manman Ren// CHECK: test_3c 8358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar// CHECK: call arm_aapcscc double (i32, ...) @varargs_vec_3c(i32 3, i32 {{%.*}}) 8497f81573636068fb9536436188caadf030584e58Manman Ren// APCS-GNU: test_3c 8558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar// APCS-GNU: call double (i32, ...) @varargs_vec_3c(i32 3, i32 {{%.*}}) 8687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: test_3c 8787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: call double (i32, ...) @varargs_vec_3c(i32 3, <3 x i8> {{%.*}}) 8897f81573636068fb9536436188caadf030584e58Manman Ren return varargs_vec_3c(3, *in); 8997f81573636068fb9536436188caadf030584e58Manman Ren} 9097f81573636068fb9536436188caadf030584e58Manman Ren 9197f81573636068fb9536436188caadf030584e58Manman Rendouble varargs_vec_5c(int fixed, ...) { 9297f81573636068fb9536436188caadf030584e58Manman Ren// CHECK: varargs_vec_5c 9387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[VAR:%.*]] = alloca <5 x i8>, align 8 942e2f9dc3efb3b0f4892f3730eecb61255dac3c58Manman Ren// CHECK: [[ALIGN:%.*]] = and i32 {{%.*}}, -8 952e2f9dc3efb3b0f4892f3730eecb61255dac3c58Manman Ren// CHECK: [[AP_ALIGN:%.*]] = inttoptr i32 [[ALIGN]] to i8* 9687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP_ALIGN]], i32 8 9787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[AP_CAST:%.*]] = bitcast i8* [[AP_ALIGN]] to <5 x i8>* 9887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[VEC:%.*]] = load <5 x i8>, <5 x i8>* [[AP_CAST]], align 8 9987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store <5 x i8> [[VEC]], <5 x i8>* [[VAR]], align 8 10097f81573636068fb9536436188caadf030584e58Manman Ren// APCS-GNU: varargs_vec_5c 10187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: [[VAR:%.*]] = alloca <5 x i8>, align 8 10287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: [[AP:%.*]] = load i8*, 10387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP]], i32 8 10487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: [[AP_CAST:%.*]] = bitcast i8* [[AP]] to <5 x i8>* 10587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: [[VEC:%.*]] = load <5 x i8>, <5 x i8>* [[AP_CAST]], align 4 10687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: store <5 x i8> [[VEC]], <5 x i8>* [[VAR]], align 8 10787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: varargs_vec_5c 10887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[VAR:%.*]] = alloca <5 x i8>, align 8 10987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[ALIGN:%.*]] = and i32 {{%.*}}, -8 11087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[AP_ALIGN:%.*]] = inttoptr i32 [[ALIGN]] to i8* 11187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP_ALIGN]], i32 8 11287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[AP_CAST:%.*]] = bitcast i8* [[AP_ALIGN]] to <5 x i8>* 11387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[VEC:%.*]] = load <5 x i8>, <5 x i8>* [[AP_CAST]], align 8 11487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: store <5 x i8> [[VEC]], <5 x i8>* [[VAR]], align 8 11597f81573636068fb9536436188caadf030584e58Manman Ren va_list ap; 11697f81573636068fb9536436188caadf030584e58Manman Ren double sum = fixed; 11797f81573636068fb9536436188caadf030584e58Manman Ren va_start(ap, fixed); 11897f81573636068fb9536436188caadf030584e58Manman Ren __char5 c5 = va_arg(ap, __char5); 11997f81573636068fb9536436188caadf030584e58Manman Ren sum = sum + c5.x + c5.y; 12097f81573636068fb9536436188caadf030584e58Manman Ren va_end(ap); 12197f81573636068fb9536436188caadf030584e58Manman Ren return sum; 12297f81573636068fb9536436188caadf030584e58Manman Ren} 12397f81573636068fb9536436188caadf030584e58Manman Ren 12497f81573636068fb9536436188caadf030584e58Manman Rendouble test_5c(__char5 *in) { 12597f81573636068fb9536436188caadf030584e58Manman Ren// CHECK: test_5c 12658878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar// CHECK: call arm_aapcscc double (i32, ...) @varargs_vec_5c(i32 5, <2 x i32> {{%.*}}) 12797f81573636068fb9536436188caadf030584e58Manman Ren// APCS-GNU: test_5c 12858878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar// APCS-GNU: call double (i32, ...) @varargs_vec_5c(i32 5, <2 x i32> {{%.*}}) 12987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: test_5c 13087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: call double (i32, ...) @varargs_vec_5c(i32 5, <2 x i32> {{%.*}}) 13197f81573636068fb9536436188caadf030584e58Manman Ren return varargs_vec_5c(5, *in); 13297f81573636068fb9536436188caadf030584e58Manman Ren} 13397f81573636068fb9536436188caadf030584e58Manman Ren 13497f81573636068fb9536436188caadf030584e58Manman Rendouble varargs_vec_9c(int fixed, ...) { 13597f81573636068fb9536436188caadf030584e58Manman Ren// CHECK: varargs_vec_9c 13687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[VAR:%.*]] = alloca <9 x i8>, align 16 1372e2f9dc3efb3b0f4892f3730eecb61255dac3c58Manman Ren// CHECK: [[ALIGN:%.*]] = and i32 {{%.*}}, -8 1382e2f9dc3efb3b0f4892f3730eecb61255dac3c58Manman Ren// CHECK: [[AP_ALIGN:%.*]] = inttoptr i32 [[ALIGN]] to i8* 13987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP_ALIGN]], i32 16 14087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[AP_CAST:%.*]] = bitcast i8* [[AP_ALIGN]] to <9 x i8>* 14187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[T0:%.*]] = load <9 x i8>, <9 x i8>* [[AP_CAST]], align 8 14287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store <9 x i8> [[T0]], <9 x i8>* [[VAR]], align 16 14397f81573636068fb9536436188caadf030584e58Manman Ren// APCS-GNU: varargs_vec_9c 14487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: [[VAR:%.*]] = alloca <9 x i8>, align 16 14587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: [[AP:%.*]] = load i8*, 14687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP]], i32 16 14787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: [[AP_CAST:%.*]] = bitcast i8* [[AP]] to <9 x i8>* 14887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: [[VEC:%.*]] = load <9 x i8>, <9 x i8>* [[AP_CAST]], align 4 14987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: store <9 x i8> [[VEC]], <9 x i8>* [[VAR]], align 16 15087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: varargs_vec_9c 15187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[VAR:%.*]] = alloca <9 x i8>, align 16 15287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[ALIGN:%.*]] = and i32 {{%.*}}, -8 15387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[AP_ALIGN:%.*]] = inttoptr i32 [[ALIGN]] to i8* 15487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP_ALIGN]], i32 16 15587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[AP_CAST:%.*]] = bitcast i8* [[AP_ALIGN]] to <9 x i8>* 15687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[T0:%.*]] = load <9 x i8>, <9 x i8>* [[AP_CAST]], align 8 15787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: store <9 x i8> [[T0]], <9 x i8>* [[VAR]], align 16 15897f81573636068fb9536436188caadf030584e58Manman Ren va_list ap; 15997f81573636068fb9536436188caadf030584e58Manman Ren double sum = fixed; 16097f81573636068fb9536436188caadf030584e58Manman Ren va_start(ap, fixed); 16197f81573636068fb9536436188caadf030584e58Manman Ren __char9 c9 = va_arg(ap, __char9); 16297f81573636068fb9536436188caadf030584e58Manman Ren sum = sum + c9.x + c9.y; 16397f81573636068fb9536436188caadf030584e58Manman Ren va_end(ap); 16497f81573636068fb9536436188caadf030584e58Manman Ren return sum; 16597f81573636068fb9536436188caadf030584e58Manman Ren} 16697f81573636068fb9536436188caadf030584e58Manman Ren 16797f81573636068fb9536436188caadf030584e58Manman Rendouble test_9c(__char9 *in) { 16897f81573636068fb9536436188caadf030584e58Manman Ren// CHECK: test_9c 16958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar// CHECK: call arm_aapcscc double (i32, ...) @varargs_vec_9c(i32 9, <4 x i32> {{%.*}}) 17097f81573636068fb9536436188caadf030584e58Manman Ren// APCS-GNU: test_9c 17158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar// APCS-GNU: call double (i32, ...) @varargs_vec_9c(i32 9, <4 x i32> {{%.*}}) 17287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: test_9c 17387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: call double (i32, ...) @varargs_vec_9c(i32 9, <4 x i32> {{%.*}}) 17497f81573636068fb9536436188caadf030584e58Manman Ren return varargs_vec_9c(9, *in); 17597f81573636068fb9536436188caadf030584e58Manman Ren} 17697f81573636068fb9536436188caadf030584e58Manman Ren 17797f81573636068fb9536436188caadf030584e58Manman Rendouble varargs_vec_19c(int fixed, ...) { 17897f81573636068fb9536436188caadf030584e58Manman Ren// CHECK: varargs_vec_19c 17987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP:%.*]], i32 4 18087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[VAR:%.*]] = bitcast i8* [[AP]] to <19 x i8>** 18187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[VAR2:%.*]] = load <19 x i8>*, <19 x i8>** [[VAR]] 18297f81573636068fb9536436188caadf030584e58Manman Ren// APCS-GNU: varargs_vec_19c 18387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP:%.*]], i32 4 18487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: [[VAR:%.*]] = bitcast i8* [[AP]] to <19 x i8>** 18587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: [[VAR2:%.*]] = load <19 x i8>*, <19 x i8>** [[VAR]] 18687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: varargs_vec_19c 18787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP:%.*]], i32 4 18887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[VAR:%.*]] = bitcast i8* [[AP]] to <19 x i8>** 18987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[VAR2:%.*]] = load <19 x i8>*, <19 x i8>** [[VAR]] 19097f81573636068fb9536436188caadf030584e58Manman Ren va_list ap; 19197f81573636068fb9536436188caadf030584e58Manman Ren double sum = fixed; 19297f81573636068fb9536436188caadf030584e58Manman Ren va_start(ap, fixed); 19397f81573636068fb9536436188caadf030584e58Manman Ren __char19 c19 = va_arg(ap, __char19); 19497f81573636068fb9536436188caadf030584e58Manman Ren sum = sum + c19.x + c19.y; 19597f81573636068fb9536436188caadf030584e58Manman Ren va_end(ap); 19697f81573636068fb9536436188caadf030584e58Manman Ren return sum; 19797f81573636068fb9536436188caadf030584e58Manman Ren} 19897f81573636068fb9536436188caadf030584e58Manman Ren 19997f81573636068fb9536436188caadf030584e58Manman Rendouble test_19c(__char19 *in) { 20097f81573636068fb9536436188caadf030584e58Manman Ren// CHECK: test_19c 20158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar// CHECK: call arm_aapcscc double (i32, ...) @varargs_vec_19c(i32 19, <19 x i8>* {{%.*}}) 20297f81573636068fb9536436188caadf030584e58Manman Ren// APCS-GNU: test_19c 20358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar// APCS-GNU: call double (i32, ...) @varargs_vec_19c(i32 19, <19 x i8>* {{%.*}}) 20487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: test_19c 20587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: call double (i32, ...) @varargs_vec_19c(i32 19, <19 x i8>* {{%.*}}) 20697f81573636068fb9536436188caadf030584e58Manman Ren return varargs_vec_19c(19, *in); 20797f81573636068fb9536436188caadf030584e58Manman Ren} 20897f81573636068fb9536436188caadf030584e58Manman Ren 20997f81573636068fb9536436188caadf030584e58Manman Rendouble varargs_vec_3s(int fixed, ...) { 21097f81573636068fb9536436188caadf030584e58Manman Ren// CHECK: varargs_vec_3s 2112e2f9dc3efb3b0f4892f3730eecb61255dac3c58Manman Ren// CHECK: alloca <3 x i16>, align 8 2122e2f9dc3efb3b0f4892f3730eecb61255dac3c58Manman Ren// CHECK: [[ALIGN:%.*]] = and i32 {{%.*}}, -8 2132e2f9dc3efb3b0f4892f3730eecb61255dac3c58Manman Ren// CHECK: [[AP_ALIGN:%.*]] = inttoptr i32 [[ALIGN]] to i8* 21487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP_ALIGN]], i32 8 2152e2f9dc3efb3b0f4892f3730eecb61255dac3c58Manman Ren// CHECK: bitcast i8* [[AP_ALIGN]] to <3 x i16>* 21697f81573636068fb9536436188caadf030584e58Manman Ren// APCS-GNU: varargs_vec_3s 21787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: [[VAR:%.*]] = alloca <3 x i16>, align 8 21887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: [[AP:%.*]] = load i8*, 21987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP]], i32 8 22087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: [[AP_CAST:%.*]] = bitcast i8* [[AP]] to <3 x i16>* 22187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: [[VEC:%.*]] = load <3 x i16>, <3 x i16>* [[AP_CAST]], align 4 22287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: varargs_vec_3s 22387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: alloca <3 x i16>, align 8 22487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[ALIGN:%.*]] = and i32 {{%.*}}, -8 22587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[AP_ALIGN:%.*]] = inttoptr i32 [[ALIGN]] to i8* 22687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP_ALIGN]], i32 8 22787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: bitcast i8* [[AP_ALIGN]] to <3 x i16>* 22897f81573636068fb9536436188caadf030584e58Manman Ren va_list ap; 22997f81573636068fb9536436188caadf030584e58Manman Ren double sum = fixed; 23097f81573636068fb9536436188caadf030584e58Manman Ren va_start(ap, fixed); 23197f81573636068fb9536436188caadf030584e58Manman Ren __short3 c3 = va_arg(ap, __short3); 23297f81573636068fb9536436188caadf030584e58Manman Ren sum = sum + c3.x + c3.y; 23397f81573636068fb9536436188caadf030584e58Manman Ren va_end(ap); 23497f81573636068fb9536436188caadf030584e58Manman Ren return sum; 23597f81573636068fb9536436188caadf030584e58Manman Ren} 23697f81573636068fb9536436188caadf030584e58Manman Ren 23797f81573636068fb9536436188caadf030584e58Manman Rendouble test_3s(__short3 *in) { 23897f81573636068fb9536436188caadf030584e58Manman Ren// CHECK: test_3s 23958878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar// CHECK: call arm_aapcscc double (i32, ...) @varargs_vec_3s(i32 3, <2 x i32> {{%.*}}) 24097f81573636068fb9536436188caadf030584e58Manman Ren// APCS-GNU: test_3s 24158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar// APCS-GNU: call double (i32, ...) @varargs_vec_3s(i32 3, <2 x i32> {{%.*}}) 24287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: test_3s 24387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: call double (i32, ...) @varargs_vec_3s(i32 3, <3 x i16> {{%.*}}) 24497f81573636068fb9536436188caadf030584e58Manman Ren return varargs_vec_3s(3, *in); 24597f81573636068fb9536436188caadf030584e58Manman Ren} 24697f81573636068fb9536436188caadf030584e58Manman Ren 24797f81573636068fb9536436188caadf030584e58Manman Rendouble varargs_vec_5s(int fixed, ...) { 24897f81573636068fb9536436188caadf030584e58Manman Ren// CHECK: varargs_vec_5s 24987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[VAR_ALIGN:%.*]] = alloca <5 x i16>, align 16 2502e2f9dc3efb3b0f4892f3730eecb61255dac3c58Manman Ren// CHECK: [[ALIGN:%.*]] = and i32 {{%.*}}, -8 2512e2f9dc3efb3b0f4892f3730eecb61255dac3c58Manman Ren// CHECK: [[AP_ALIGN:%.*]] = inttoptr i32 [[ALIGN]] to i8* 25287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP_ALIGN]], i32 16 25387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[AP_CAST:%.*]] = bitcast i8* [[AP_ALIGN]] to <5 x i16>* 25487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[VEC:%.*]] = load <5 x i16>, <5 x i16>* [[AP_CAST]], align 8 25587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: store <5 x i16> [[VEC]], <5 x i16>* [[VAR_ALIGN]], align 16 25697f81573636068fb9536436188caadf030584e58Manman Ren// APCS-GNU: varargs_vec_5s 25787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: [[VAR:%.*]] = alloca <5 x i16>, align 16 25887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: [[AP:%.*]] = load i8*, 25987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP]], i32 16 26087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: [[AP_CAST:%.*]] = bitcast i8* [[AP]] to <5 x i16>* 26187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: [[VEC:%.*]] = load <5 x i16>, <5 x i16>* [[AP_CAST]], align 4 26287d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: varargs_vec_5s 26387d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[VAR_ALIGN:%.*]] = alloca <5 x i16>, align 16 26487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[ALIGN:%.*]] = and i32 {{%.*}}, -8 26587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[AP_ALIGN:%.*]] = inttoptr i32 [[ALIGN]] to i8* 26687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP_ALIGN]], i32 16 26787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[AP_CAST:%.*]] = bitcast i8* [[AP_ALIGN]] to <5 x i16>* 26887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[VEC:%.*]] = load <5 x i16>, <5 x i16>* [[AP_CAST]], align 8 26987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: store <5 x i16> [[VEC]], <5 x i16>* [[VAR_ALIGN]], align 16 27097f81573636068fb9536436188caadf030584e58Manman Ren va_list ap; 27197f81573636068fb9536436188caadf030584e58Manman Ren double sum = fixed; 27297f81573636068fb9536436188caadf030584e58Manman Ren va_start(ap, fixed); 27397f81573636068fb9536436188caadf030584e58Manman Ren __short5 c5 = va_arg(ap, __short5); 27497f81573636068fb9536436188caadf030584e58Manman Ren sum = sum + c5.x + c5.y; 27597f81573636068fb9536436188caadf030584e58Manman Ren va_end(ap); 27697f81573636068fb9536436188caadf030584e58Manman Ren return sum; 27797f81573636068fb9536436188caadf030584e58Manman Ren} 27897f81573636068fb9536436188caadf030584e58Manman Ren 27997f81573636068fb9536436188caadf030584e58Manman Rendouble test_5s(__short5 *in) { 28097f81573636068fb9536436188caadf030584e58Manman Ren// CHECK: test_5s 28158878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar// CHECK: call arm_aapcscc double (i32, ...) @varargs_vec_5s(i32 5, <4 x i32> {{%.*}}) 28297f81573636068fb9536436188caadf030584e58Manman Ren// APCS-GNU: test_5s 28358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar// APCS-GNU: call double (i32, ...) @varargs_vec_5s(i32 5, <4 x i32> {{%.*}}) 28487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: test_5s 28587d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: call double (i32, ...) @varargs_vec_5s(i32 5, <4 x i32> {{%.*}}) 28697f81573636068fb9536436188caadf030584e58Manman Ren return varargs_vec_5s(5, *in); 28797f81573636068fb9536436188caadf030584e58Manman Ren} 288933710242edc66da21e865948d4c8e3a6badf2dfManman Ren 289933710242edc66da21e865948d4c8e3a6badf2dfManman Ren// Pass struct as varargs. 290933710242edc66da21e865948d4c8e3a6badf2dfManman Rentypedef struct 291933710242edc66da21e865948d4c8e3a6badf2dfManman Ren{ 292933710242edc66da21e865948d4c8e3a6badf2dfManman Ren __int2 i2; 293933710242edc66da21e865948d4c8e3a6badf2dfManman Ren float f; 294933710242edc66da21e865948d4c8e3a6badf2dfManman Ren} StructWithVec; 295933710242edc66da21e865948d4c8e3a6badf2dfManman Ren 296933710242edc66da21e865948d4c8e3a6badf2dfManman Rendouble varargs_struct(int fixed, ...) { 297933710242edc66da21e865948d4c8e3a6badf2dfManman Ren// CHECK: varargs_struct 2982e2f9dc3efb3b0f4892f3730eecb61255dac3c58Manman Ren// CHECK: [[ALIGN:%.*]] = and i32 {{%.*}}, -8 2992e2f9dc3efb3b0f4892f3730eecb61255dac3c58Manman Ren// CHECK: [[AP_ALIGN:%.*]] = inttoptr i32 [[ALIGN]] to i8* 30087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// CHECK: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP_ALIGN]], i32 16 3012e2f9dc3efb3b0f4892f3730eecb61255dac3c58Manman Ren// CHECK: bitcast i8* [[AP_ALIGN]] to %struct.StructWithVec* 302933710242edc66da21e865948d4c8e3a6badf2dfManman Ren// APCS-GNU: varargs_struct 3032e2f9dc3efb3b0f4892f3730eecb61255dac3c58Manman Ren// APCS-GNU: [[VAR_ALIGN:%.*]] = alloca %struct.StructWithVec 30487d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// APCS-GNU: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* {{%.*}}, i32 16 3052e2f9dc3efb3b0f4892f3730eecb61255dac3c58Manman Ren// APCS-GNU: bitcast %struct.StructWithVec* [[VAR_ALIGN]] to i8* 306933710242edc66da21e865948d4c8e3a6badf2dfManman Ren// APCS-GNU: call void @llvm.memcpy 30787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: varargs_struct 30887d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[ALIGN:%.*]] = and i32 {{%.*}}, -8 30987d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[AP_ALIGN:%.*]] = inttoptr i32 [[ALIGN]] to i8* 31087d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: [[AP_NEXT:%.*]] = getelementptr inbounds i8, i8* [[AP_ALIGN]], i32 16 31187d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: bitcast i8* [[AP_ALIGN]] to %struct.StructWithVec* 312933710242edc66da21e865948d4c8e3a6badf2dfManman Ren va_list ap; 313933710242edc66da21e865948d4c8e3a6badf2dfManman Ren double sum = fixed; 314933710242edc66da21e865948d4c8e3a6badf2dfManman Ren va_start(ap, fixed); 315933710242edc66da21e865948d4c8e3a6badf2dfManman Ren StructWithVec c3 = va_arg(ap, StructWithVec); 316933710242edc66da21e865948d4c8e3a6badf2dfManman Ren sum = sum + c3.i2.x + c3.i2.y + c3.f; 317933710242edc66da21e865948d4c8e3a6badf2dfManman Ren va_end(ap); 318933710242edc66da21e865948d4c8e3a6badf2dfManman Ren return sum; 319933710242edc66da21e865948d4c8e3a6badf2dfManman Ren} 320933710242edc66da21e865948d4c8e3a6badf2dfManman Ren 321933710242edc66da21e865948d4c8e3a6badf2dfManman Rendouble test_struct(StructWithVec* d) { 322933710242edc66da21e865948d4c8e3a6badf2dfManman Ren// CHECK: test_struct 32358878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar// CHECK: call arm_aapcscc double (i32, ...) @varargs_struct(i32 3, [2 x i64] {{%.*}}) 324933710242edc66da21e865948d4c8e3a6badf2dfManman Ren// APCS-GNU: test_struct 32558878f85ab89b13e9eea4af3ccf055e42c557bc8Pirama Arumuga Nainar// APCS-GNU: call double (i32, ...) @varargs_struct(i32 3, [2 x i64] {{%.*}}) 32687d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: test_struct 32787d948ecccffea9e9e37d0d053b246e2d6d6c47bPirama Arumuga Nainar// ANDROID: call double (i32, ...) @varargs_struct(i32 3, [2 x i64] {{%.*}}) 328933710242edc66da21e865948d4c8e3a6badf2dfManman Ren return varargs_struct(3, *d); 329933710242edc66da21e865948d4c8e3a6badf2dfManman Ren} 330