1f79470583759d20c20268711e6111461aefa8461Jim Grosbach// REQUIRES: arm-registered-target 2bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy// RUN: %clang_cc1 -triple armv7a-linux-gnueabi \ 3bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy// RUN: -target-cpu cortex-a8 \ 4a3f55b026fc24db6a4e275a8e4110d071122b99dRafael Espindola// RUN: -emit-llvm -o - %s | FileCheck %s 5bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy#include <arm_neon.h> 6bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloyint main(){ 7bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy int32_t v0[3]; 8bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy int32x2x3_t v1; 9bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy int32_t v2[4]; 10bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy int32x2x4_t v3; 11bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy int64x1x3_t v4; 12bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy int64x1x4_t v5; 13bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy int64_t v6[3]; 14bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy int64_t v7[4]; 15bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy 16bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy v1 = vld3_dup_s32(v0); 17bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy// CHECK: [[T168:%.*]] = call { <2 x i32>, <2 x i32>, <2 x i32> } @llvm.arm.neon.vld3lane.v2i32(i8* {{.*}}, <2 x i32> undef, <2 x i32> undef, <2 x i32> undef, i32 {{[0-9]+}}, i32 {{[0-9]+}}) 18bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy// CHECK-NEXT: [[T169:%.*]] = extractvalue { <2 x i32>, <2 x i32>, <2 x i32> } [[T168]], 0 19bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy// CHECK-NEXT: [[T170:%.*]] = shufflevector <2 x i32> [[T169]], <2 x i32> [[T169]], <2 x i32> zeroinitializer 20bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy// CHECK-NEXT: [[T171:%.*]] = insertvalue { <2 x i32>, <2 x i32>, <2 x i32> } [[T168]], <2 x i32> [[T170]], 0 21bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy// CHECK-NEXT: [[T172:%.*]] = extractvalue { <2 x i32>, <2 x i32>, <2 x i32> } [[T171]], 1 22bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy// CHECK-NEXT: [[T173:%.*]] = shufflevector <2 x i32> [[T172]], <2 x i32> [[T172]], <2 x i32> zeroinitializer 23bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy// CHECK-NEXT: [[T174:%.*]] = insertvalue { <2 x i32>, <2 x i32>, <2 x i32> } [[T171]], <2 x i32> [[T173]], 1 24bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy// CHECK-NEXT: [[T175:%.*]] = extractvalue { <2 x i32>, <2 x i32>, <2 x i32> } [[T174]], 2 25bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy// CHECK-NEXT: [[T176:%.*]] = shufflevector <2 x i32> [[T175]], <2 x i32> [[T175]], <2 x i32> zeroinitializer 26bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy// CHECK-NEXT: [[T177:%.*]] = insertvalue { <2 x i32>, <2 x i32>, <2 x i32> } [[T174]], <2 x i32> [[T176]], 2 27bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy 28bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy v3 = vld4_dup_s32(v2); 29bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy// CHECK: [[T178:%.*]] = call { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } @llvm.arm.neon.vld4lane.v2i32(i8* {{.*}}, <2 x i32> undef, <2 x i32> undef, <2 x i32> undef, <2 x i32> undef, i32 {{[0-9]+}}, i32 {{[0-9]+}}) 30bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy// CHECK-NEXT: [[T179:%.*]] = extractvalue { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } [[T178]], 0 31bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy// CHECK-NEXT: [[T180:%.*]] = shufflevector <2 x i32> [[T179]], <2 x i32> [[T179]], <2 x i32> zeroinitializer 32bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy// CHECK-NEXT: [[T181:%.*]] = insertvalue { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } [[T178]], <2 x i32> [[T180]], 0 33bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy// CHECK-NEXT: [[T182:%.*]] = extractvalue { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } [[T181]], 1 34bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy// CHECK-NEXT: [[T183:%.*]] = shufflevector <2 x i32> [[T182]], <2 x i32> [[T182]], <2 x i32> zeroinitializer 35bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy// CHECK-NEXT: [[T184:%.*]] = insertvalue { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } [[T181]], <2 x i32> [[T183]], 1 36bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy// CHECK-NEXT: [[T185:%.*]] = extractvalue { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } [[T184]], 2 37bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy// CHECK-NEXT: [[T186:%.*]] = shufflevector <2 x i32> [[T185]], <2 x i32> [[T185]], <2 x i32> zeroinitializer 38bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy// CHECK-NEXT: [[T187:%.*]] = insertvalue { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } [[T184]], <2 x i32> [[T186]], 2 39bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy// CHECK-NEXT: [[T188:%.*]] = extractvalue { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } [[T187]], 3 40bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy// CHECK-NEXT: [[T189:%.*]] = shufflevector <2 x i32> [[T188]], <2 x i32> [[T188]], <2 x i32> zeroinitializer 41bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy// CHECK-NEXT: [[T190:%.*]] = insertvalue { <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32> } [[T187]], <2 x i32> [[T189]], 3 42bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy 43bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy v4 = vld3_dup_s64(v6); 44bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy// CHECK: {{%.*}} = call { <1 x i64>, <1 x i64>, <1 x i64> } @llvm.arm.neon.vld3.v1i64(i8* {{.*}}, i32 {{[0-9]+}}) 45bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy 46bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy v5 = vld4_dup_s64(v7); 47bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy// CHECK: {{%.*}} = call { <1 x i64>, <1 x i64>, <1 x i64>, <1 x i64> } @llvm.arm.neon.vld4.v1i64(i8* {{.*}}, i32 {{[0-9]+}}) 48bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy 49bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy return 0; 50bd86ad5c1a4ce7cd05f0370921b31a2eabf19f8fJames Molloy} 51