xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/arm64-neon-simd-ldst-one.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -verify-machineinstrs -mtriple=arm64-none-linux-gnu -mattr=+neon | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker%struct.uint8x16x2_t = type { [2 x <16 x i8>] }
5*9880d681SAndroid Build Coastguard Worker%struct.poly8x16x2_t = type { [2 x <16 x i8>] }
6*9880d681SAndroid Build Coastguard Worker%struct.uint8x16x3_t = type { [3 x <16 x i8>] }
7*9880d681SAndroid Build Coastguard Worker%struct.int8x16x2_t = type { [2 x <16 x i8>] }
8*9880d681SAndroid Build Coastguard Worker%struct.int16x8x2_t = type { [2 x <8 x i16>] }
9*9880d681SAndroid Build Coastguard Worker%struct.int32x4x2_t = type { [2 x <4 x i32>] }
10*9880d681SAndroid Build Coastguard Worker%struct.int64x2x2_t = type { [2 x <2 x i64>] }
11*9880d681SAndroid Build Coastguard Worker%struct.float32x4x2_t = type { [2 x <4 x float>] }
12*9880d681SAndroid Build Coastguard Worker%struct.float64x2x2_t = type { [2 x <2 x double>] }
13*9880d681SAndroid Build Coastguard Worker%struct.int8x8x2_t = type { [2 x <8 x i8>] }
14*9880d681SAndroid Build Coastguard Worker%struct.int16x4x2_t = type { [2 x <4 x i16>] }
15*9880d681SAndroid Build Coastguard Worker%struct.int32x2x2_t = type { [2 x <2 x i32>] }
16*9880d681SAndroid Build Coastguard Worker%struct.int64x1x2_t = type { [2 x <1 x i64>] }
17*9880d681SAndroid Build Coastguard Worker%struct.float32x2x2_t = type { [2 x <2 x float>] }
18*9880d681SAndroid Build Coastguard Worker%struct.float64x1x2_t = type { [2 x <1 x double>] }
19*9880d681SAndroid Build Coastguard Worker%struct.int8x16x3_t = type { [3 x <16 x i8>] }
20*9880d681SAndroid Build Coastguard Worker%struct.int16x8x3_t = type { [3 x <8 x i16>] }
21*9880d681SAndroid Build Coastguard Worker%struct.int32x4x3_t = type { [3 x <4 x i32>] }
22*9880d681SAndroid Build Coastguard Worker%struct.int64x2x3_t = type { [3 x <2 x i64>] }
23*9880d681SAndroid Build Coastguard Worker%struct.float32x4x3_t = type { [3 x <4 x float>] }
24*9880d681SAndroid Build Coastguard Worker%struct.float64x2x3_t = type { [3 x <2 x double>] }
25*9880d681SAndroid Build Coastguard Worker%struct.int8x8x3_t = type { [3 x <8 x i8>] }
26*9880d681SAndroid Build Coastguard Worker%struct.int16x4x3_t = type { [3 x <4 x i16>] }
27*9880d681SAndroid Build Coastguard Worker%struct.int32x2x3_t = type { [3 x <2 x i32>] }
28*9880d681SAndroid Build Coastguard Worker%struct.int64x1x3_t = type { [3 x <1 x i64>] }
29*9880d681SAndroid Build Coastguard Worker%struct.float32x2x3_t = type { [3 x <2 x float>] }
30*9880d681SAndroid Build Coastguard Worker%struct.float64x1x3_t = type { [3 x <1 x double>] }
31*9880d681SAndroid Build Coastguard Worker%struct.int8x16x4_t = type { [4 x <16 x i8>] }
32*9880d681SAndroid Build Coastguard Worker%struct.int16x8x4_t = type { [4 x <8 x i16>] }
33*9880d681SAndroid Build Coastguard Worker%struct.int32x4x4_t = type { [4 x <4 x i32>] }
34*9880d681SAndroid Build Coastguard Worker%struct.int64x2x4_t = type { [4 x <2 x i64>] }
35*9880d681SAndroid Build Coastguard Worker%struct.float32x4x4_t = type { [4 x <4 x float>] }
36*9880d681SAndroid Build Coastguard Worker%struct.float64x2x4_t = type { [4 x <2 x double>] }
37*9880d681SAndroid Build Coastguard Worker%struct.int8x8x4_t = type { [4 x <8 x i8>] }
38*9880d681SAndroid Build Coastguard Worker%struct.int16x4x4_t = type { [4 x <4 x i16>] }
39*9880d681SAndroid Build Coastguard Worker%struct.int32x2x4_t = type { [4 x <2 x i32>] }
40*9880d681SAndroid Build Coastguard Worker%struct.int64x1x4_t = type { [4 x <1 x i64>] }
41*9880d681SAndroid Build Coastguard Worker%struct.float32x2x4_t = type { [4 x <2 x float>] }
42*9880d681SAndroid Build Coastguard Worker%struct.float64x1x4_t = type { [4 x <1 x double>] }
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_ld_from_poll_v16i8(<16 x i8> %a) {
45*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_ld_from_poll_v16i8:
46*9880d681SAndroid Build Coastguard Worker; CHECK: adrp {{x[0-9]+}}, .{{[A-Z0-9_]+}}
47*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{q[0-9]+}}, [{{x[0-9]+}}, {{#?}}:lo12:.{{[A-Z0-9_]+}}]
48*9880d681SAndroid Build Coastguard Workerentry:
49*9880d681SAndroid Build Coastguard Worker  %b = add <16 x i8> %a, <i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8, i8 9, i8 10, i8 11, i8 2, i8 13, i8 14, i8 15, i8 16>
50*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %b
51*9880d681SAndroid Build Coastguard Worker}
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_ld_from_poll_v8i16(<8 x i16> %a) {
54*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_ld_from_poll_v8i16:
55*9880d681SAndroid Build Coastguard Worker; CHECK: adrp {{x[0-9]+}}, .{{[A-Z0-9_]+}}
56*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{q[0-9]+}}, [{{x[0-9]+}}, {{#?}}:lo12:.{{[A-Z0-9_]+}}]
57*9880d681SAndroid Build Coastguard Workerentry:
58*9880d681SAndroid Build Coastguard Worker  %b = add <8 x i16> %a, <i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8>
59*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %b
60*9880d681SAndroid Build Coastguard Worker}
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_ld_from_poll_v4i32(<4 x i32> %a) {
63*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_ld_from_poll_v4i32:
64*9880d681SAndroid Build Coastguard Worker; CHECK: adrp {{x[0-9]+}}, .{{[A-Z0-9_]+}}
65*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{q[0-9]+}}, [{{x[0-9]+}}, {{#?}}:lo12:.{{[A-Z0-9_]+}}]
66*9880d681SAndroid Build Coastguard Workerentry:
67*9880d681SAndroid Build Coastguard Worker  %b = add <4 x i32> %a, <i32 1, i32 2, i32 3, i32 4>
68*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %b
69*9880d681SAndroid Build Coastguard Worker}
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_ld_from_poll_v2i64(<2 x i64> %a) {
72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_ld_from_poll_v2i64:
73*9880d681SAndroid Build Coastguard Worker; CHECK: adrp {{x[0-9]+}}, .{{[A-Z0-9_]+}}
74*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{q[0-9]+}}, [{{x[0-9]+}}, {{#?}}:lo12:.{{[A-Z0-9_]+}}]
75*9880d681SAndroid Build Coastguard Workerentry:
76*9880d681SAndroid Build Coastguard Worker  %b = add <2 x i64> %a, <i64 1, i64 2>
77*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %b
78*9880d681SAndroid Build Coastguard Worker}
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_ld_from_poll_v4f32(<4 x float> %a) {
81*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_ld_from_poll_v4f32:
82*9880d681SAndroid Build Coastguard Worker; CHECK: adrp {{x[0-9]+}}, .{{[A-Z0-9_]+}}
83*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{q[0-9]+}}, [{{x[0-9]+}}, {{#?}}:lo12:.{{[A-Z0-9_]+}}]
84*9880d681SAndroid Build Coastguard Workerentry:
85*9880d681SAndroid Build Coastguard Worker  %b = fadd <4 x float> %a, <float 1.0, float 2.0, float 3.0, float 4.0>
86*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %b
87*9880d681SAndroid Build Coastguard Worker}
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test_ld_from_poll_v2f64(<2 x double> %a) {
90*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_ld_from_poll_v2f64:
91*9880d681SAndroid Build Coastguard Worker; CHECK: adrp {{x[0-9]+}}, .{{[A-Z0-9_]+}}
92*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{q[0-9]+}}, [{{x[0-9]+}}, {{#?}}:lo12:.{{[A-Z0-9_]+}}]
93*9880d681SAndroid Build Coastguard Workerentry:
94*9880d681SAndroid Build Coastguard Worker  %b = fadd <2 x double> %a, <double 1.0, double 2.0>
95*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %b
96*9880d681SAndroid Build Coastguard Worker}
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_ld_from_poll_v8i8(<8 x i8> %a) {
99*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_ld_from_poll_v8i8:
100*9880d681SAndroid Build Coastguard Worker; CHECK: adrp {{x[0-9]+}}, .{{[A-Z0-9_]+}}
101*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{d[0-9]+}}, [{{x[0-9]+}}, {{#?}}:lo12:.{{[A-Z0-9_]+}}]
102*9880d681SAndroid Build Coastguard Workerentry:
103*9880d681SAndroid Build Coastguard Worker  %b = add <8 x i8> %a, <i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 8>
104*9880d681SAndroid Build Coastguard Worker  ret <8 x i8> %b
105*9880d681SAndroid Build Coastguard Worker}
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_ld_from_poll_v4i16(<4 x i16> %a) {
108*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_ld_from_poll_v4i16:
109*9880d681SAndroid Build Coastguard Worker; CHECK: adrp {{x[0-9]+}}, .{{[A-Z0-9_]+}}
110*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{d[0-9]+}}, [{{x[0-9]+}}, {{#?}}:lo12:.{{[A-Z0-9_]+}}]
111*9880d681SAndroid Build Coastguard Workerentry:
112*9880d681SAndroid Build Coastguard Worker  %b = add <4 x i16> %a, <i16 1, i16 2, i16 3, i16 4>
113*9880d681SAndroid Build Coastguard Worker  ret <4 x i16> %b
114*9880d681SAndroid Build Coastguard Worker}
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test_ld_from_poll_v2i32(<2 x i32> %a) {
117*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_ld_from_poll_v2i32:
118*9880d681SAndroid Build Coastguard Worker; CHECK: adrp {{x[0-9]+}}, .{{[A-Z0-9_]+}}
119*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{d[0-9]+}}, [{{x[0-9]+}}, {{#?}}:lo12:.{{[A-Z0-9_]+}}]
120*9880d681SAndroid Build Coastguard Workerentry:
121*9880d681SAndroid Build Coastguard Worker  %b = add <2 x i32> %a, <i32 1, i32 2>
122*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %b
123*9880d681SAndroid Build Coastguard Worker}
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_vld1q_dup_s8(i8* %a) {
126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1q_dup_s8:
127*9880d681SAndroid Build Coastguard Worker; CHECK: ld1r {{{ ?v[0-9]+.16b ?}}}, [x0]
128*9880d681SAndroid Build Coastguard Workerentry:
129*9880d681SAndroid Build Coastguard Worker  %0 = load i8, i8* %a, align 1
130*9880d681SAndroid Build Coastguard Worker  %1 = insertelement <16 x i8> undef, i8 %0, i32 0
131*9880d681SAndroid Build Coastguard Worker  %lane = shufflevector <16 x i8> %1, <16 x i8> undef, <16 x i32> zeroinitializer
132*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %lane
133*9880d681SAndroid Build Coastguard Worker}
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vld1q_dup_s16(i16* %a) {
136*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1q_dup_s16:
137*9880d681SAndroid Build Coastguard Worker; CHECK: ld1r {{{ ?v[0-9]+.8h ?}}}, [x0]
138*9880d681SAndroid Build Coastguard Workerentry:
139*9880d681SAndroid Build Coastguard Worker  %0 = load i16, i16* %a, align 2
140*9880d681SAndroid Build Coastguard Worker  %1 = insertelement <8 x i16> undef, i16 %0, i32 0
141*9880d681SAndroid Build Coastguard Worker  %lane = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> zeroinitializer
142*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %lane
143*9880d681SAndroid Build Coastguard Worker}
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vld1q_dup_s32(i32* %a) {
146*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1q_dup_s32:
147*9880d681SAndroid Build Coastguard Worker; CHECK: ld1r {{{ ?v[0-9]+.4s ?}}}, [x0]
148*9880d681SAndroid Build Coastguard Workerentry:
149*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %a, align 4
150*9880d681SAndroid Build Coastguard Worker  %1 = insertelement <4 x i32> undef, i32 %0, i32 0
151*9880d681SAndroid Build Coastguard Worker  %lane = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> zeroinitializer
152*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %lane
153*9880d681SAndroid Build Coastguard Worker}
154*9880d681SAndroid Build Coastguard Worker
155*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vld1q_dup_s64(i64* %a) {
156*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1q_dup_s64:
157*9880d681SAndroid Build Coastguard Worker; CHECK: ld1r {{{ ?v[0-9]+.2d ?}}}, [x0]
158*9880d681SAndroid Build Coastguard Workerentry:
159*9880d681SAndroid Build Coastguard Worker  %0 = load i64, i64* %a, align 8
160*9880d681SAndroid Build Coastguard Worker  %1 = insertelement <2 x i64> undef, i64 %0, i32 0
161*9880d681SAndroid Build Coastguard Worker  %lane = shufflevector <2 x i64> %1, <2 x i64> undef, <2 x i32> zeroinitializer
162*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %lane
163*9880d681SAndroid Build Coastguard Worker}
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_vld1q_dup_f32(float* %a) {
166*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1q_dup_f32:
167*9880d681SAndroid Build Coastguard Worker; CHECK: ld1r {{{ ?v[0-9]+.4s ?}}}, [x0]
168*9880d681SAndroid Build Coastguard Workerentry:
169*9880d681SAndroid Build Coastguard Worker  %0 = load float, float* %a, align 4
170*9880d681SAndroid Build Coastguard Worker  %1 = insertelement <4 x float> undef, float %0, i32 0
171*9880d681SAndroid Build Coastguard Worker  %lane = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> zeroinitializer
172*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %lane
173*9880d681SAndroid Build Coastguard Worker}
174*9880d681SAndroid Build Coastguard Worker
175*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test_vld1q_dup_f64(double* %a) {
176*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1q_dup_f64:
177*9880d681SAndroid Build Coastguard Worker; CHECK: ld1r {{{ ?v[0-9]+.2d ?}}}, [x0]
178*9880d681SAndroid Build Coastguard Workerentry:
179*9880d681SAndroid Build Coastguard Worker  %0 = load double, double* %a, align 8
180*9880d681SAndroid Build Coastguard Worker  %1 = insertelement <2 x double> undef, double %0, i32 0
181*9880d681SAndroid Build Coastguard Worker  %lane = shufflevector <2 x double> %1, <2 x double> undef, <2 x i32> zeroinitializer
182*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %lane
183*9880d681SAndroid Build Coastguard Worker}
184*9880d681SAndroid Build Coastguard Worker
185*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_vld1_dup_s8(i8* %a) {
186*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1_dup_s8:
187*9880d681SAndroid Build Coastguard Worker; CHECK: ld1r {{{ ?v[0-9]+.8b ?}}}, [x0]
188*9880d681SAndroid Build Coastguard Workerentry:
189*9880d681SAndroid Build Coastguard Worker  %0 = load i8, i8* %a, align 1
190*9880d681SAndroid Build Coastguard Worker  %1 = insertelement <8 x i8> undef, i8 %0, i32 0
191*9880d681SAndroid Build Coastguard Worker  %lane = shufflevector <8 x i8> %1, <8 x i8> undef, <8 x i32> zeroinitializer
192*9880d681SAndroid Build Coastguard Worker  ret <8 x i8> %lane
193*9880d681SAndroid Build Coastguard Worker}
194*9880d681SAndroid Build Coastguard Worker
195*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_vld1_dup_s16(i16* %a) {
196*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1_dup_s16:
197*9880d681SAndroid Build Coastguard Worker; CHECK: ld1r {{{ ?v[0-9]+.4h ?}}}, [x0]
198*9880d681SAndroid Build Coastguard Workerentry:
199*9880d681SAndroid Build Coastguard Worker  %0 = load i16, i16* %a, align 2
200*9880d681SAndroid Build Coastguard Worker  %1 = insertelement <4 x i16> undef, i16 %0, i32 0
201*9880d681SAndroid Build Coastguard Worker  %lane = shufflevector <4 x i16> %1, <4 x i16> undef, <4 x i32> zeroinitializer
202*9880d681SAndroid Build Coastguard Worker  ret <4 x i16> %lane
203*9880d681SAndroid Build Coastguard Worker}
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test_vld1_dup_s32(i32* %a) {
206*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1_dup_s32:
207*9880d681SAndroid Build Coastguard Worker; CHECK: ld1r {{{ ?v[0-9]+.2s ?}}}, [x0]
208*9880d681SAndroid Build Coastguard Workerentry:
209*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %a, align 4
210*9880d681SAndroid Build Coastguard Worker  %1 = insertelement <2 x i32> undef, i32 %0, i32 0
211*9880d681SAndroid Build Coastguard Worker  %lane = shufflevector <2 x i32> %1, <2 x i32> undef, <2 x i32> zeroinitializer
212*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %lane
213*9880d681SAndroid Build Coastguard Worker}
214*9880d681SAndroid Build Coastguard Worker
215*9880d681SAndroid Build Coastguard Workerdefine <1 x i64> @test_vld1_dup_s64(i64* %a) {
216*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1_dup_s64:
217*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{d[0-9]+}}, [x0]
218*9880d681SAndroid Build Coastguard Workerentry:
219*9880d681SAndroid Build Coastguard Worker  %0 = load i64, i64* %a, align 8
220*9880d681SAndroid Build Coastguard Worker  %1 = insertelement <1 x i64> undef, i64 %0, i32 0
221*9880d681SAndroid Build Coastguard Worker  ret <1 x i64> %1
222*9880d681SAndroid Build Coastguard Worker}
223*9880d681SAndroid Build Coastguard Worker
224*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test_vld1_dup_f32(float* %a) {
225*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1_dup_f32:
226*9880d681SAndroid Build Coastguard Worker; CHECK: ld1r {{{ ?v[0-9]+.2s ?}}}, [x0]
227*9880d681SAndroid Build Coastguard Workerentry:
228*9880d681SAndroid Build Coastguard Worker  %0 = load float, float* %a, align 4
229*9880d681SAndroid Build Coastguard Worker  %1 = insertelement <2 x float> undef, float %0, i32 0
230*9880d681SAndroid Build Coastguard Worker  %lane = shufflevector <2 x float> %1, <2 x float> undef, <2 x i32> zeroinitializer
231*9880d681SAndroid Build Coastguard Worker  ret <2 x float> %lane
232*9880d681SAndroid Build Coastguard Worker}
233*9880d681SAndroid Build Coastguard Worker
234*9880d681SAndroid Build Coastguard Workerdefine <1 x double> @test_vld1_dup_f64(double* %a) {
235*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1_dup_f64:
236*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{d[0-9]+}}, [x0]
237*9880d681SAndroid Build Coastguard Workerentry:
238*9880d681SAndroid Build Coastguard Worker  %0 = load double, double* %a, align 8
239*9880d681SAndroid Build Coastguard Worker  %1 = insertelement <1 x double> undef, double %0, i32 0
240*9880d681SAndroid Build Coastguard Worker  ret <1 x double> %1
241*9880d681SAndroid Build Coastguard Worker}
242*9880d681SAndroid Build Coastguard Worker
243*9880d681SAndroid Build Coastguard Workerdefine <1 x i64> @testDUP.v1i64(i64* %a, i64* %b) #0 {
244*9880d681SAndroid Build Coastguard Worker; As there is a store operation depending on %1, LD1R pattern can't be selected.
245*9880d681SAndroid Build Coastguard Worker; So LDR and FMOV should be emitted.
246*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: testDUP.v1i64:
247*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{x[0-9]+}}, [{{x[0-9]+}}]
248*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: fmov {{d[0-9]+}}, {{x[0-9]+}}
249*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: str {{x[0-9]+}}, [{{x[0-9]+}}]
250*9880d681SAndroid Build Coastguard Worker  %1 = load i64, i64* %a, align 8
251*9880d681SAndroid Build Coastguard Worker  store i64 %1, i64* %b, align 8
252*9880d681SAndroid Build Coastguard Worker  %vecinit.i = insertelement <1 x i64> undef, i64 %1, i32 0
253*9880d681SAndroid Build Coastguard Worker  ret <1 x i64> %vecinit.i
254*9880d681SAndroid Build Coastguard Worker}
255*9880d681SAndroid Build Coastguard Worker
256*9880d681SAndroid Build Coastguard Workerdefine <1 x double> @testDUP.v1f64(double* %a, double* %b) #0 {
257*9880d681SAndroid Build Coastguard Worker; As there is a store operation depending on %1, LD1R pattern can't be selected.
258*9880d681SAndroid Build Coastguard Worker; So LDR and FMOV should be emitted.
259*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: testDUP.v1f64:
260*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{d[0-9]+}}, [{{x[0-9]+}}]
261*9880d681SAndroid Build Coastguard Worker; CHECK: str {{d[0-9]+}}, [{{x[0-9]+}}]
262*9880d681SAndroid Build Coastguard Worker  %1 = load double, double* %a, align 8
263*9880d681SAndroid Build Coastguard Worker  store double %1, double* %b, align 8
264*9880d681SAndroid Build Coastguard Worker  %vecinit.i = insertelement <1 x double> undef, double %1, i32 0
265*9880d681SAndroid Build Coastguard Worker  ret <1 x double> %vecinit.i
266*9880d681SAndroid Build Coastguard Worker}
267*9880d681SAndroid Build Coastguard Worker
268*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_vld1q_lane_s8(i8* %a, <16 x i8> %b) {
269*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1q_lane_s8:
270*9880d681SAndroid Build Coastguard Worker; CHECK: ld1 { {{v[0-9]+}}.b }[{{[0-9]+}}], [x0]
271*9880d681SAndroid Build Coastguard Workerentry:
272*9880d681SAndroid Build Coastguard Worker  %0 = load i8, i8* %a, align 1
273*9880d681SAndroid Build Coastguard Worker  %vld1_lane = insertelement <16 x i8> %b, i8 %0, i32 15
274*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %vld1_lane
275*9880d681SAndroid Build Coastguard Worker}
276*9880d681SAndroid Build Coastguard Worker
277*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test_vld1q_lane_s16(i16* %a, <8 x i16> %b) {
278*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1q_lane_s16:
279*9880d681SAndroid Build Coastguard Worker; CHECK: ld1 { {{v[0-9]+}}.h }[{{[0-9]+}}], [x0]
280*9880d681SAndroid Build Coastguard Workerentry:
281*9880d681SAndroid Build Coastguard Worker  %0 = load i16, i16* %a, align 2
282*9880d681SAndroid Build Coastguard Worker  %vld1_lane = insertelement <8 x i16> %b, i16 %0, i32 7
283*9880d681SAndroid Build Coastguard Worker  ret <8 x i16> %vld1_lane
284*9880d681SAndroid Build Coastguard Worker}
285*9880d681SAndroid Build Coastguard Worker
286*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test_vld1q_lane_s32(i32* %a, <4 x i32> %b) {
287*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1q_lane_s32:
288*9880d681SAndroid Build Coastguard Worker; CHECK: ld1 { {{v[0-9]+}}.s }[{{[0-9]+}}], [x0]
289*9880d681SAndroid Build Coastguard Workerentry:
290*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %a, align 4
291*9880d681SAndroid Build Coastguard Worker  %vld1_lane = insertelement <4 x i32> %b, i32 %0, i32 3
292*9880d681SAndroid Build Coastguard Worker  ret <4 x i32> %vld1_lane
293*9880d681SAndroid Build Coastguard Worker}
294*9880d681SAndroid Build Coastguard Worker
295*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_vld1q_lane_s64(i64* %a, <2 x i64> %b) {
296*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1q_lane_s64:
297*9880d681SAndroid Build Coastguard Worker; CHECK: ld1 { {{v[0-9]+}}.d }[{{[0-9]+}}], [x0]
298*9880d681SAndroid Build Coastguard Workerentry:
299*9880d681SAndroid Build Coastguard Worker  %0 = load i64, i64* %a, align 8
300*9880d681SAndroid Build Coastguard Worker  %vld1_lane = insertelement <2 x i64> %b, i64 %0, i32 1
301*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %vld1_lane
302*9880d681SAndroid Build Coastguard Worker}
303*9880d681SAndroid Build Coastguard Worker
304*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test_vld1q_lane_f32(float* %a, <4 x float> %b) {
305*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1q_lane_f32:
306*9880d681SAndroid Build Coastguard Worker; CHECK: ld1 { {{v[0-9]+}}.s }[{{[0-9]+}}], [x0]
307*9880d681SAndroid Build Coastguard Workerentry:
308*9880d681SAndroid Build Coastguard Worker  %0 = load float, float* %a, align 4
309*9880d681SAndroid Build Coastguard Worker  %vld1_lane = insertelement <4 x float> %b, float %0, i32 3
310*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %vld1_lane
311*9880d681SAndroid Build Coastguard Worker}
312*9880d681SAndroid Build Coastguard Worker
313*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test_vld1q_lane_f64(double* %a, <2 x double> %b) {
314*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1q_lane_f64:
315*9880d681SAndroid Build Coastguard Worker; CHECK: ld1 { {{v[0-9]+}}.d }[{{[0-9]+}}], [x0]
316*9880d681SAndroid Build Coastguard Workerentry:
317*9880d681SAndroid Build Coastguard Worker  %0 = load double, double* %a, align 8
318*9880d681SAndroid Build Coastguard Worker  %vld1_lane = insertelement <2 x double> %b, double %0, i32 1
319*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %vld1_lane
320*9880d681SAndroid Build Coastguard Worker}
321*9880d681SAndroid Build Coastguard Worker
322*9880d681SAndroid Build Coastguard Workerdefine <8 x i8> @test_vld1_lane_s8(i8* %a, <8 x i8> %b) {
323*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1_lane_s8:
324*9880d681SAndroid Build Coastguard Worker; CHECK: ld1 { {{v[0-9]+}}.b }[{{[0-9]+}}], [x0]
325*9880d681SAndroid Build Coastguard Workerentry:
326*9880d681SAndroid Build Coastguard Worker  %0 = load i8, i8* %a, align 1
327*9880d681SAndroid Build Coastguard Worker  %vld1_lane = insertelement <8 x i8> %b, i8 %0, i32 7
328*9880d681SAndroid Build Coastguard Worker  ret <8 x i8> %vld1_lane
329*9880d681SAndroid Build Coastguard Worker}
330*9880d681SAndroid Build Coastguard Worker
331*9880d681SAndroid Build Coastguard Workerdefine <4 x i16> @test_vld1_lane_s16(i16* %a, <4 x i16> %b) {
332*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1_lane_s16:
333*9880d681SAndroid Build Coastguard Worker; CHECK: ld1 { {{v[0-9]+}}.h }[{{[0-9]+}}], [x0]
334*9880d681SAndroid Build Coastguard Workerentry:
335*9880d681SAndroid Build Coastguard Worker  %0 = load i16, i16* %a, align 2
336*9880d681SAndroid Build Coastguard Worker  %vld1_lane = insertelement <4 x i16> %b, i16 %0, i32 3
337*9880d681SAndroid Build Coastguard Worker  ret <4 x i16> %vld1_lane
338*9880d681SAndroid Build Coastguard Worker}
339*9880d681SAndroid Build Coastguard Worker
340*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test_vld1_lane_s32(i32* %a, <2 x i32> %b) {
341*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1_lane_s32:
342*9880d681SAndroid Build Coastguard Worker; CHECK: ld1 { {{v[0-9]+}}.s }[{{[0-9]+}}], [x0]
343*9880d681SAndroid Build Coastguard Workerentry:
344*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %a, align 4
345*9880d681SAndroid Build Coastguard Worker  %vld1_lane = insertelement <2 x i32> %b, i32 %0, i32 1
346*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %vld1_lane
347*9880d681SAndroid Build Coastguard Worker}
348*9880d681SAndroid Build Coastguard Worker
349*9880d681SAndroid Build Coastguard Workerdefine <1 x i64> @test_vld1_lane_s64(i64* %a, <1 x i64> %b) {
350*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1_lane_s64:
351*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{d[0-9]+}}, [x0]
352*9880d681SAndroid Build Coastguard Workerentry:
353*9880d681SAndroid Build Coastguard Worker  %0 = load i64, i64* %a, align 8
354*9880d681SAndroid Build Coastguard Worker  %vld1_lane = insertelement <1 x i64> undef, i64 %0, i32 0
355*9880d681SAndroid Build Coastguard Worker  ret <1 x i64> %vld1_lane
356*9880d681SAndroid Build Coastguard Worker}
357*9880d681SAndroid Build Coastguard Worker
358*9880d681SAndroid Build Coastguard Workerdefine <2 x float> @test_vld1_lane_f32(float* %a, <2 x float> %b) {
359*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1_lane_f32:
360*9880d681SAndroid Build Coastguard Worker; CHECK: ld1 { {{v[0-9]+}}.s }[{{[0-9]+}}], [x0]
361*9880d681SAndroid Build Coastguard Workerentry:
362*9880d681SAndroid Build Coastguard Worker  %0 = load float, float* %a, align 4
363*9880d681SAndroid Build Coastguard Worker  %vld1_lane = insertelement <2 x float> %b, float %0, i32 1
364*9880d681SAndroid Build Coastguard Worker  ret <2 x float> %vld1_lane
365*9880d681SAndroid Build Coastguard Worker}
366*9880d681SAndroid Build Coastguard Worker
367*9880d681SAndroid Build Coastguard Workerdefine <1 x double> @test_vld1_lane_f64(double* %a, <1 x double> %b) {
368*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vld1_lane_f64:
369*9880d681SAndroid Build Coastguard Worker; CHECK: ldr {{d[0-9]+}}, [x0]
370*9880d681SAndroid Build Coastguard Workerentry:
371*9880d681SAndroid Build Coastguard Worker  %0 = load double, double* %a, align 8
372*9880d681SAndroid Build Coastguard Worker  %vld1_lane = insertelement <1 x double> undef, double %0, i32 0
373*9880d681SAndroid Build Coastguard Worker  ret <1 x double> %vld1_lane
374*9880d681SAndroid Build Coastguard Worker}
375*9880d681SAndroid Build Coastguard Worker
376*9880d681SAndroid Build Coastguard Workerdefine void @test_vst1q_lane_s8(i8* %a, <16 x i8> %b) {
377*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vst1q_lane_s8:
378*9880d681SAndroid Build Coastguard Worker; CHECK: st1 { {{v[0-9]+}}.b }[{{[0-9]+}}], [x0]
379*9880d681SAndroid Build Coastguard Workerentry:
380*9880d681SAndroid Build Coastguard Worker  %0 = extractelement <16 x i8> %b, i32 15
381*9880d681SAndroid Build Coastguard Worker  store i8 %0, i8* %a, align 1
382*9880d681SAndroid Build Coastguard Worker  ret void
383*9880d681SAndroid Build Coastguard Worker}
384*9880d681SAndroid Build Coastguard Worker
385*9880d681SAndroid Build Coastguard Workerdefine void @test_vst1q_lane_s16(i16* %a, <8 x i16> %b) {
386*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vst1q_lane_s16:
387*9880d681SAndroid Build Coastguard Worker; CHECK: st1 { {{v[0-9]+}}.h }[{{[0-9]+}}], [x0]
388*9880d681SAndroid Build Coastguard Workerentry:
389*9880d681SAndroid Build Coastguard Worker  %0 = extractelement <8 x i16> %b, i32 7
390*9880d681SAndroid Build Coastguard Worker  store i16 %0, i16* %a, align 2
391*9880d681SAndroid Build Coastguard Worker  ret void
392*9880d681SAndroid Build Coastguard Worker}
393*9880d681SAndroid Build Coastguard Worker
394*9880d681SAndroid Build Coastguard Workerdefine void @test_vst1q_lane_s32(i32* %a, <4 x i32> %b) {
395*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vst1q_lane_s32:
396*9880d681SAndroid Build Coastguard Worker; CHECK: st1 { {{v[0-9]+}}.s }[{{[0-9]+}}], [x0]
397*9880d681SAndroid Build Coastguard Workerentry:
398*9880d681SAndroid Build Coastguard Worker  %0 = extractelement <4 x i32> %b, i32 3
399*9880d681SAndroid Build Coastguard Worker  store i32 %0, i32* %a, align 4
400*9880d681SAndroid Build Coastguard Worker  ret void
401*9880d681SAndroid Build Coastguard Worker}
402*9880d681SAndroid Build Coastguard Worker
403*9880d681SAndroid Build Coastguard Workerdefine void @test_vst1q_lane_s64(i64* %a, <2 x i64> %b) {
404*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vst1q_lane_s64:
405*9880d681SAndroid Build Coastguard Worker; CHECK: st1 { {{v[0-9]+}}.d }[{{[0-9]+}}], [x0]
406*9880d681SAndroid Build Coastguard Workerentry:
407*9880d681SAndroid Build Coastguard Worker  %0 = extractelement <2 x i64> %b, i32 1
408*9880d681SAndroid Build Coastguard Worker  store i64 %0, i64* %a, align 8
409*9880d681SAndroid Build Coastguard Worker  ret void
410*9880d681SAndroid Build Coastguard Worker}
411*9880d681SAndroid Build Coastguard Worker
412*9880d681SAndroid Build Coastguard Workerdefine void @test_vst1q_lane_f32(float* %a, <4 x float> %b) {
413*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vst1q_lane_f32:
414*9880d681SAndroid Build Coastguard Worker; CHECK: st1 { {{v[0-9]+}}.s }[{{[0-9]+}}], [x0]
415*9880d681SAndroid Build Coastguard Workerentry:
416*9880d681SAndroid Build Coastguard Worker  %0 = extractelement <4 x float> %b, i32 3
417*9880d681SAndroid Build Coastguard Worker  store float %0, float* %a, align 4
418*9880d681SAndroid Build Coastguard Worker  ret void
419*9880d681SAndroid Build Coastguard Worker}
420*9880d681SAndroid Build Coastguard Worker
421*9880d681SAndroid Build Coastguard Workerdefine void @test_vst1q_lane_f64(double* %a, <2 x double> %b) {
422*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vst1q_lane_f64:
423*9880d681SAndroid Build Coastguard Worker; CHECK: st1 { {{v[0-9]+}}.d }[{{[0-9]+}}], [x0]
424*9880d681SAndroid Build Coastguard Workerentry:
425*9880d681SAndroid Build Coastguard Worker  %0 = extractelement <2 x double> %b, i32 1
426*9880d681SAndroid Build Coastguard Worker  store double %0, double* %a, align 8
427*9880d681SAndroid Build Coastguard Worker  ret void
428*9880d681SAndroid Build Coastguard Worker}
429*9880d681SAndroid Build Coastguard Worker
430*9880d681SAndroid Build Coastguard Workerdefine void @test_vst1_lane_s8(i8* %a, <8 x i8> %b) {
431*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vst1_lane_s8:
432*9880d681SAndroid Build Coastguard Worker; CHECK: st1 { {{v[0-9]+}}.b }[{{[0-9]+}}], [x0]
433*9880d681SAndroid Build Coastguard Workerentry:
434*9880d681SAndroid Build Coastguard Worker  %0 = extractelement <8 x i8> %b, i32 7
435*9880d681SAndroid Build Coastguard Worker  store i8 %0, i8* %a, align 1
436*9880d681SAndroid Build Coastguard Worker  ret void
437*9880d681SAndroid Build Coastguard Worker}
438*9880d681SAndroid Build Coastguard Worker
439*9880d681SAndroid Build Coastguard Workerdefine void @test_vst1_lane_s16(i16* %a, <4 x i16> %b) {
440*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vst1_lane_s16:
441*9880d681SAndroid Build Coastguard Worker; CHECK: st1 { {{v[0-9]+}}.h }[{{[0-9]+}}], [x0]
442*9880d681SAndroid Build Coastguard Workerentry:
443*9880d681SAndroid Build Coastguard Worker  %0 = extractelement <4 x i16> %b, i32 3
444*9880d681SAndroid Build Coastguard Worker  store i16 %0, i16* %a, align 2
445*9880d681SAndroid Build Coastguard Worker  ret void
446*9880d681SAndroid Build Coastguard Worker}
447*9880d681SAndroid Build Coastguard Worker
448*9880d681SAndroid Build Coastguard Workerdefine void @test_vst1_lane_s32(i32* %a, <2 x i32> %b) {
449*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vst1_lane_s32:
450*9880d681SAndroid Build Coastguard Worker; CHECK: st1 { {{v[0-9]+}}.s }[{{[0-9]+}}], [x0]
451*9880d681SAndroid Build Coastguard Workerentry:
452*9880d681SAndroid Build Coastguard Worker  %0 = extractelement <2 x i32> %b, i32 1
453*9880d681SAndroid Build Coastguard Worker  store i32 %0, i32* %a, align 4
454*9880d681SAndroid Build Coastguard Worker  ret void
455*9880d681SAndroid Build Coastguard Worker}
456*9880d681SAndroid Build Coastguard Worker
457*9880d681SAndroid Build Coastguard Workerdefine void @test_vst1_lane_s64(i64* %a, <1 x i64> %b) {
458*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vst1_lane_s64:
459*9880d681SAndroid Build Coastguard Worker; CHECK: st1 { {{v[0-9]+}}.d }[{{[0-9]+}}], [x0]
460*9880d681SAndroid Build Coastguard Workerentry:
461*9880d681SAndroid Build Coastguard Worker  %0 = extractelement <1 x i64> %b, i32 0
462*9880d681SAndroid Build Coastguard Worker  store i64 %0, i64* %a, align 8
463*9880d681SAndroid Build Coastguard Worker  ret void
464*9880d681SAndroid Build Coastguard Worker}
465*9880d681SAndroid Build Coastguard Worker
466*9880d681SAndroid Build Coastguard Workerdefine void @test_vst1_lane_f32(float* %a, <2 x float> %b) {
467*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vst1_lane_f32:
468*9880d681SAndroid Build Coastguard Worker; CHECK: st1 { {{v[0-9]+}}.s }[{{[0-9]+}}], [x0]
469*9880d681SAndroid Build Coastguard Workerentry:
470*9880d681SAndroid Build Coastguard Worker  %0 = extractelement <2 x float> %b, i32 1
471*9880d681SAndroid Build Coastguard Worker  store float %0, float* %a, align 4
472*9880d681SAndroid Build Coastguard Worker  ret void
473*9880d681SAndroid Build Coastguard Worker}
474*9880d681SAndroid Build Coastguard Worker
475*9880d681SAndroid Build Coastguard Workerdefine void @test_vst1_lane_f64(double* %a, <1 x double> %b) {
476*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_vst1_lane_f64:
477*9880d681SAndroid Build Coastguard Worker; CHECK: str {{d[0-9]+}}, [x0]
478*9880d681SAndroid Build Coastguard Workerentry:
479*9880d681SAndroid Build Coastguard Worker  %0 = extractelement <1 x double> %b, i32 0
480*9880d681SAndroid Build Coastguard Worker  store double %0, double* %a, align 8
481*9880d681SAndroid Build Coastguard Worker  ret void
482*9880d681SAndroid Build Coastguard Worker}
483