1 // RUN: %clang_cc1 -O1 -triple arm64-apple-ios7 -target-feature +neon -ffreestanding -S -o - -emit-llvm %s | FileCheck %s
2 // Test ARM64 SIMD load and stores of an N-element structure  intrinsics
3 
4 #include <arm_neon.h>
5 
test_vld2q_lane_s64(const void * a1,int64x2x2_t a2)6 int64x2x2_t test_vld2q_lane_s64(const void * a1, int64x2x2_t a2) {
7   // CHECK: test_vld2q_lane_s64
8   return vld2q_lane_s64(a1, a2, 1);
9   // CHECK: llvm.aarch64.neon.ld2lane.v2i64.p0i8
10 }
11 
test_vld2q_lane_u64(const void * a1,uint64x2x2_t a2)12 uint64x2x2_t test_vld2q_lane_u64(const void * a1, uint64x2x2_t a2) {
13   // CHECK: test_vld2q_lane_u64
14   return vld2q_lane_u64(a1, a2, 1);
15   // CHECK: llvm.aarch64.neon.ld2lane.v2i64.p0i8
16 }
17 
test_vld2_lane_s64(const void * a1,int64x1x2_t a2)18 int64x1x2_t test_vld2_lane_s64(const void * a1, int64x1x2_t a2) {
19   // CHECK: test_vld2_lane_s64
20   return vld2_lane_s64(a1, a2, 0);
21   // CHECK: llvm.aarch64.neon.ld2lane.v1i64.p0i8
22 }
23 
test_vld2_lane_u64(const void * a1,uint64x1x2_t a2)24 uint64x1x2_t test_vld2_lane_u64(const void * a1, uint64x1x2_t a2) {
25   // CHECK: test_vld2_lane_u64
26   return vld2_lane_u64(a1, a2, 0);
27   // CHECK: llvm.aarch64.neon.ld2lane.v1i64.p0i8
28 }
29 
test_vld2q_lane_p8(const void * a1,poly8x16x2_t a2)30 poly8x16x2_t test_vld2q_lane_p8(const void * a1, poly8x16x2_t a2) {
31   // CHECK: test_vld2q_lane_p8
32   return vld2q_lane_p8(a1, a2, 0);
33   // CHECK: extractvalue {{.*}} 0{{ *$}}
34   // CHECK: extractvalue {{.*}} 1{{ *$}}
35 }
36 
test_vld2q_lane_u8(const void * a1,uint8x16x2_t a2)37 uint8x16x2_t test_vld2q_lane_u8(const void * a1, uint8x16x2_t a2) {
38   // CHECK: test_vld2q_lane_u8
39   return vld2q_lane_u8(a1, a2, 0);
40   // CHECK: llvm.aarch64.neon.ld2lane.v16i8.p0i8
41 }
42 
test_vld3q_lane_s64(const void * a1,int64x2x3_t a2)43 int64x2x3_t test_vld3q_lane_s64(const void * a1, int64x2x3_t a2) {
44   // CHECK: test_vld3q_lane_s64
45   return vld3q_lane_s64(a1, a2, 1);
46   // CHECK: llvm.aarch64.neon.ld3lane.v2i64.p0i8
47 }
48 
test_vld3q_lane_u64(const void * a1,uint64x2x3_t a2)49 uint64x2x3_t test_vld3q_lane_u64(const void * a1, uint64x2x3_t a2) {
50   // CHECK: test_vld3q_lane_u64
51   return vld3q_lane_u64(a1, a2, 1);
52   // CHECK: llvm.aarch64.neon.ld3lane.v2i64.p0i8
53 }
54 
test_vld3_lane_s64(const void * a1,int64x1x3_t a2)55 int64x1x3_t test_vld3_lane_s64(const void * a1, int64x1x3_t a2) {
56   // CHECK: test_vld3_lane_s64
57   return vld3_lane_s64(a1, a2, 0);
58   // CHECK: llvm.aarch64.neon.ld3lane.v1i64.p0i8
59 }
60 
test_vld3_lane_u64(const void * a1,uint64x1x3_t a2)61 uint64x1x3_t test_vld3_lane_u64(const void * a1, uint64x1x3_t a2) {
62   // CHECK: test_vld3_lane_u64
63   return vld3_lane_u64(a1, a2, 0);
64   // CHECK: llvm.aarch64.neon.ld3lane.v1i64.p0i8
65 }
66 
test_vld3_lane_s8(const void * a1,int8x8x3_t a2)67 int8x8x3_t test_vld3_lane_s8(const void * a1, int8x8x3_t a2) {
68   // CHECK: test_vld3_lane_s8
69   return vld3_lane_s8(a1, a2, 0);
70   // CHECK: llvm.aarch64.neon.ld3lane.v8i8.p0i8
71 }
72 
test_vld3q_lane_p8(const void * a1,poly8x16x3_t a2)73 poly8x16x3_t test_vld3q_lane_p8(const void * a1, poly8x16x3_t a2) {
74   // CHECK: test_vld3q_lane_p8
75   return vld3q_lane_p8(a1, a2, 0);
76   // CHECK: llvm.aarch64.neon.ld3lane.v16i8.p0i8
77 }
78 
test_vld3q_lane_u8(const void * a1,uint8x16x3_t a2)79 uint8x16x3_t test_vld3q_lane_u8(const void * a1, uint8x16x3_t a2) {
80   // CHECK: test_vld3q_lane_u8
81   return vld3q_lane_u8(a1, a2, 0);
82   // CHECK: llvm.aarch64.neon.ld3lane.v16i8.p0i8
83 }
84 
test_vld4q_lane_s64(const void * a1,int64x2x4_t a2)85 int64x2x4_t test_vld4q_lane_s64(const void * a1, int64x2x4_t a2) {
86   // CHECK: test_vld4q_lane_s64
87   return vld4q_lane_s64(a1, a2, 0);
88   // CHECK: llvm.aarch64.neon.ld4lane.v2i64.p0i8
89 }
90 
test_vld4q_lane_u64(const void * a1,uint64x2x4_t a2)91 uint64x2x4_t test_vld4q_lane_u64(const void * a1, uint64x2x4_t a2) {
92   // CHECK: test_vld4q_lane_u64
93   return vld4q_lane_u64(a1, a2, 0);
94   // CHECK: llvm.aarch64.neon.ld4lane.v2i64.p0i8
95 }
96 
test_vld4_lane_s64(const void * a1,int64x1x4_t a2)97 int64x1x4_t test_vld4_lane_s64(const void * a1, int64x1x4_t a2) {
98   // CHECK: test_vld4_lane_s64
99   return vld4_lane_s64(a1, a2, 0);
100   // CHECK: llvm.aarch64.neon.ld4lane.v1i64.p0i8
101 }
102 
test_vld4_lane_u64(const void * a1,uint64x1x4_t a2)103 uint64x1x4_t test_vld4_lane_u64(const void * a1, uint64x1x4_t a2) {
104   // CHECK: test_vld4_lane_u64
105   return vld4_lane_u64(a1, a2, 0);
106   // CHECK: llvm.aarch64.neon.ld4lane.v1i64.p0i8
107 }
108 
test_vld4_lane_s8(const void * a1,int8x8x4_t a2)109 int8x8x4_t test_vld4_lane_s8(const void * a1, int8x8x4_t a2) {
110   // CHECK: test_vld4_lane_s8
111   return vld4_lane_s8(a1, a2, 0);
112   // CHECK: llvm.aarch64.neon.ld4lane.v8i8.p0i8
113 }
114 
test_vld4_lane_u8(const void * a1,uint8x8x4_t a2)115 uint8x8x4_t test_vld4_lane_u8(const void * a1, uint8x8x4_t a2) {
116   // CHECK: test_vld4_lane_u8
117   return vld4_lane_u8(a1, a2, 0);
118   // CHECK: llvm.aarch64.neon.ld4lane.v8i8.p0i8
119 }
120 
test_vld4q_lane_p8(const void * a1,poly8x16x4_t a2)121 poly8x16x4_t test_vld4q_lane_p8(const void * a1, poly8x16x4_t a2) {
122   // CHECK: test_vld4q_lane_p8
123   return vld4q_lane_p8(a1, a2, 0);
124   // CHECK: llvm.aarch64.neon.ld4lane.v16i8.p0i8
125 }
126 
test_vld4q_lane_s8(const void * a1,int8x16x4_t a2)127 int8x16x4_t test_vld4q_lane_s8(const void * a1, int8x16x4_t a2) {
128   // CHECK: test_vld4q_lane_s8
129   return vld4q_lane_s8(a1, a2, 0);
130   // CHECK: extractvalue {{.*}} 0{{ *$}}
131   // CHECK: extractvalue {{.*}} 1{{ *$}}
132   // CHECK: extractvalue {{.*}} 2{{ *$}}
133   // CHECK: extractvalue {{.*}} 3{{ *$}}
134 }
135 
test_vld4q_lane_u8(const void * a1,uint8x16x4_t a2)136 uint8x16x4_t test_vld4q_lane_u8(const void * a1, uint8x16x4_t a2) {
137   // CHECK: test_vld4q_lane_u8
138   return vld4q_lane_u8(a1, a2, 0);
139   // CHECK: llvm.aarch64.neon.ld4lane.v16i8.p0i8
140 }
141 
142