16bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// RUN: %clang_cc1 -O1 -triple arm64-apple-ios7 -target-feature +neon -ffreestanding -S -o - -emit-llvm %s | FileCheck %s
2651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// Test ARM64 SIMD load and stores of an N-element structure  intrinsics
3651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
4651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include <arm_neon.h>
5651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
6651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint64x2x2_t test_vld2q_lane_s64(const void * a1, int64x2x2_t a2) {
7651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vld2q_lane_s64
8651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vld2q_lane_s64(a1, a2, 1);
96bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.ld2lane.v2i64.p0i8
10651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
11651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
12651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesuint64x2x2_t test_vld2q_lane_u64(const void * a1, uint64x2x2_t a2) {
13651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vld2q_lane_u64
14651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vld2q_lane_u64(a1, a2, 1);
156bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.ld2lane.v2i64.p0i8
16651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
17651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
18651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint64x1x2_t test_vld2_lane_s64(const void * a1, int64x1x2_t a2) {
19651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vld2_lane_s64
20651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vld2_lane_s64(a1, a2, 0);
216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.ld2lane.v1i64.p0i8
22651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
23651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
24651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesuint64x1x2_t test_vld2_lane_u64(const void * a1, uint64x1x2_t a2) {
25651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vld2_lane_u64
26651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vld2_lane_u64(a1, a2, 0);
276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.ld2lane.v1i64.p0i8
28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
29651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
30651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespoly8x16x2_t test_vld2q_lane_p8(const void * a1, poly8x16x2_t a2) {
31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vld2q_lane_p8
32651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vld2q_lane_p8(a1, a2, 0);
33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: extractvalue {{.*}} 0{{ *$}}
34651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: extractvalue {{.*}} 1{{ *$}}
35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesuint8x16x2_t test_vld2q_lane_u8(const void * a1, uint8x16x2_t a2) {
38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vld2q_lane_u8
39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vld2q_lane_u8(a1, a2, 0);
406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.ld2lane.v16i8.p0i8
41651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint64x2x3_t test_vld3q_lane_s64(const void * a1, int64x2x3_t a2) {
44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vld3q_lane_s64
45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vld3q_lane_s64(a1, a2, 1);
466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.ld3lane.v2i64.p0i8
47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesuint64x2x3_t test_vld3q_lane_u64(const void * a1, uint64x2x3_t a2) {
50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vld3q_lane_u64
51651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vld3q_lane_u64(a1, a2, 1);
526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.ld3lane.v2i64.p0i8
53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
55651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint64x1x3_t test_vld3_lane_s64(const void * a1, int64x1x3_t a2) {
56651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vld3_lane_s64
57651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vld3_lane_s64(a1, a2, 0);
586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.ld3lane.v1i64.p0i8
59651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
60651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
61651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesuint64x1x3_t test_vld3_lane_u64(const void * a1, uint64x1x3_t a2) {
62651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vld3_lane_u64
63651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vld3_lane_u64(a1, a2, 0);
646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.ld3lane.v1i64.p0i8
65651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
66651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
67651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint8x8x3_t test_vld3_lane_s8(const void * a1, int8x8x3_t a2) {
68651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vld3_lane_s8
69651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vld3_lane_s8(a1, a2, 0);
706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.ld3lane.v8i8.p0i8
71651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
73651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespoly8x16x3_t test_vld3q_lane_p8(const void * a1, poly8x16x3_t a2) {
74651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vld3q_lane_p8
75651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vld3q_lane_p8(a1, a2, 0);
766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.ld3lane.v16i8.p0i8
77651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
78651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
79651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesuint8x16x3_t test_vld3q_lane_u8(const void * a1, uint8x16x3_t a2) {
80651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vld3q_lane_u8
81651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vld3q_lane_u8(a1, a2, 0);
826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.ld3lane.v16i8.p0i8
83651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
84651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
85651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint64x2x4_t test_vld4q_lane_s64(const void * a1, int64x2x4_t a2) {
86651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vld4q_lane_s64
87651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vld4q_lane_s64(a1, a2, 0);
886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.ld4lane.v2i64.p0i8
89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
90651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
91651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesuint64x2x4_t test_vld4q_lane_u64(const void * a1, uint64x2x4_t a2) {
92651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vld4q_lane_u64
93651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vld4q_lane_u64(a1, a2, 0);
946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.ld4lane.v2i64.p0i8
95651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
96651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
97651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint64x1x4_t test_vld4_lane_s64(const void * a1, int64x1x4_t a2) {
98651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vld4_lane_s64
99651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vld4_lane_s64(a1, a2, 0);
1006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.ld4lane.v1i64.p0i8
101651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
102651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
103651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesuint64x1x4_t test_vld4_lane_u64(const void * a1, uint64x1x4_t a2) {
104651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vld4_lane_u64
105651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vld4_lane_u64(a1, a2, 0);
1066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.ld4lane.v1i64.p0i8
107651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
108651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint8x8x4_t test_vld4_lane_s8(const void * a1, int8x8x4_t a2) {
110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vld4_lane_s8
111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vld4_lane_s8(a1, a2, 0);
1126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.ld4lane.v8i8.p0i8
113651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
114651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
115651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesuint8x8x4_t test_vld4_lane_u8(const void * a1, uint8x8x4_t a2) {
116651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vld4_lane_u8
117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vld4_lane_u8(a1, a2, 0);
1186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.ld4lane.v8i8.p0i8
119651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespoly8x16x4_t test_vld4q_lane_p8(const void * a1, poly8x16x4_t a2) {
122651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vld4q_lane_p8
123651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vld4q_lane_p8(a1, a2, 0);
1246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.ld4lane.v16i8.p0i8
125651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
126651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
127651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint8x16x4_t test_vld4q_lane_s8(const void * a1, int8x16x4_t a2) {
128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vld4q_lane_s8
129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vld4q_lane_s8(a1, a2, 0);
130651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: extractvalue {{.*}} 0{{ *$}}
131651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: extractvalue {{.*}} 1{{ *$}}
132651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: extractvalue {{.*}} 2{{ *$}}
133651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: extractvalue {{.*}} 3{{ *$}}
134651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
135651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
136651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesuint8x16x4_t test_vld4q_lane_u8(const void * a1, uint8x16x4_t a2) {
137651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vld4q_lane_u8
138651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vld4q_lane_u8(a1, a2, 0);
1396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.ld4lane.v16i8.p0i8
140651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
141651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
142