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
6int64x2x2_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
12uint64x2x2_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
18int64x1x2_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
24uint64x1x2_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
30poly8x16x2_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
37uint8x16x2_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
43int64x2x3_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
49uint64x2x3_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
55int64x1x3_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
61uint64x1x3_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
67int8x8x3_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
73poly8x16x3_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
79uint8x16x3_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
85int64x2x4_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
91uint64x2x4_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
97int64x1x4_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
103uint64x1x4_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
109int8x8x4_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
115uint8x8x4_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
121poly8x16x4_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
127int8x16x4_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
136uint8x16x4_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