1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=aarch64-none-eabi | FileCheck %s --check-prefixes=CHECK,CHECK-SD
3 ; RUN: llc < %s -mtriple=aarch64-none-eabi -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI
5 ; Note: these tests use stores instead of returns as the return handling for
6 ; vector ptrs is currently sometimes create invalid unmerge values.
8 define void @vector_gep_i32(ptr %b, i32 %off, ptr %p) {
9 ; CHECK-LABEL: vector_gep_i32:
10 ; CHECK: // %bb.0: // %entry
11 ; CHECK-NEXT: add x8, x0, w1, sxtw
12 ; CHECK-NEXT: str x8, [x2]
15 %g = getelementptr i8, ptr %b, i32 %off
20 define void @vector_gep_i64(ptr %b, i64 %off, ptr %p) {
21 ; CHECK-LABEL: vector_gep_i64:
22 ; CHECK: // %bb.0: // %entry
23 ; CHECK-NEXT: add x8, x0, x1
24 ; CHECK-NEXT: str x8, [x2]
27 %g = getelementptr i8, ptr %b, i64 %off
32 define void @vector_gep_v1i32(<1 x ptr> %b, <1 x i32> %off, ptr %p) {
33 ; CHECK-SD-LABEL: vector_gep_v1i32:
34 ; CHECK-SD: // %bb.0: // %entry
35 ; CHECK-SD-NEXT: shl d1, d1, #32
36 ; CHECK-SD-NEXT: ssra d0, d1, #32
37 ; CHECK-SD-NEXT: str d0, [x0]
40 ; CHECK-GI-LABEL: vector_gep_v1i32:
41 ; CHECK-GI: // %bb.0: // %entry
42 ; CHECK-GI-NEXT: fmov w8, s1
43 ; CHECK-GI-NEXT: fmov x9, d0
44 ; CHECK-GI-NEXT: add x8, x9, w8, sxtw
45 ; CHECK-GI-NEXT: str x8, [x0]
48 %g = getelementptr i8, <1 x ptr> %b, <1 x i32> %off
49 store <1 x ptr> %g, ptr %p
53 define void @vector_gep_v2i32(<2 x ptr> %b, <2 x i32> %off, ptr %p) {
54 ; CHECK-LABEL: vector_gep_v2i32:
55 ; CHECK: // %bb.0: // %entry
56 ; CHECK-NEXT: saddw v0.2d, v0.2d, v1.2s
57 ; CHECK-NEXT: str q0, [x0]
60 %g = getelementptr i8, <2 x ptr> %b, <2 x i32> %off
61 store <2 x ptr> %g, ptr %p
65 define void @vector_gep_v3i32(<3 x ptr> %b, <3 x i32> %off, ptr %p) {
66 ; CHECK-SD-LABEL: vector_gep_v3i32:
67 ; CHECK-SD: // %bb.0: // %entry
68 ; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0
69 ; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1
70 ; CHECK-SD-NEXT: // kill: def $d2 killed $d2 def $q2
71 ; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]
72 ; CHECK-SD-NEXT: saddw2 v2.2d, v2.2d, v3.4s
73 ; CHECK-SD-NEXT: str d2, [x0, #16]
74 ; CHECK-SD-NEXT: saddw v0.2d, v0.2d, v3.2s
75 ; CHECK-SD-NEXT: str q0, [x0]
78 ; CHECK-GI-LABEL: vector_gep_v3i32:
79 ; CHECK-GI: // %bb.0: // %entry
80 ; CHECK-GI-NEXT: smov x8, v3.s[0]
81 ; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0
82 ; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1
83 ; CHECK-GI-NEXT: smov x9, v3.s[1]
84 ; CHECK-GI-NEXT: mov v0.d[1], v1.d[0]
85 ; CHECK-GI-NEXT: fmov d1, x8
86 ; CHECK-GI-NEXT: mov w8, v3.s[2]
87 ; CHECK-GI-NEXT: mov v1.d[1], x9
88 ; CHECK-GI-NEXT: fmov x9, d2
89 ; CHECK-GI-NEXT: add x8, x9, w8, sxtw
90 ; CHECK-GI-NEXT: add v0.2d, v0.2d, v1.2d
91 ; CHECK-GI-NEXT: str x8, [x0, #16]
92 ; CHECK-GI-NEXT: str q0, [x0]
95 %g = getelementptr i8, <3 x ptr> %b, <3 x i32> %off
96 store <3 x ptr> %g, ptr %p
100 define void @vector_gep_v4i32(<4 x ptr> %b, <4 x i32> %off, ptr %p) {
101 ; CHECK-SD-LABEL: vector_gep_v4i32:
102 ; CHECK-SD: // %bb.0: // %entry
103 ; CHECK-SD-NEXT: saddw2 v1.2d, v1.2d, v2.4s
104 ; CHECK-SD-NEXT: saddw v0.2d, v0.2d, v2.2s
105 ; CHECK-SD-NEXT: stp q0, q1, [x0]
108 ; CHECK-GI-LABEL: vector_gep_v4i32:
109 ; CHECK-GI: // %bb.0: // %entry
110 ; CHECK-GI-NEXT: saddw v0.2d, v0.2d, v2.2s
111 ; CHECK-GI-NEXT: saddw2 v1.2d, v1.2d, v2.4s
112 ; CHECK-GI-NEXT: stp q0, q1, [x0]
115 %g = getelementptr i8, <4 x ptr> %b, <4 x i32> %off
116 store <4 x ptr> %g, ptr %p
120 define void @vector_gep_v1i64(<1 x ptr> %b, <1 x i64> %off, ptr %p) {
121 ; CHECK-SD-LABEL: vector_gep_v1i64:
122 ; CHECK-SD: // %bb.0: // %entry
123 ; CHECK-SD-NEXT: add d0, d0, d1
124 ; CHECK-SD-NEXT: str d0, [x0]
127 ; CHECK-GI-LABEL: vector_gep_v1i64:
128 ; CHECK-GI: // %bb.0: // %entry
129 ; CHECK-GI-NEXT: fmov x8, d0
130 ; CHECK-GI-NEXT: fmov x9, d1
131 ; CHECK-GI-NEXT: add x8, x8, x9
132 ; CHECK-GI-NEXT: str x8, [x0]
135 %g = getelementptr i8, <1 x ptr> %b, <1 x i64> %off
136 store <1 x ptr> %g, ptr %p
140 define void @vector_gep_v2i64(<2 x ptr> %b, <2 x i64> %off, ptr %p) {
141 ; CHECK-LABEL: vector_gep_v2i64:
142 ; CHECK: // %bb.0: // %entry
143 ; CHECK-NEXT: add v0.2d, v0.2d, v1.2d
144 ; CHECK-NEXT: str q0, [x0]
147 %g = getelementptr i8, <2 x ptr> %b, <2 x i64> %off
148 store <2 x ptr> %g, ptr %p
152 define void @vector_gep_v3i64(<3 x ptr> %b, <3 x i64> %off, ptr %p) {
153 ; CHECK-SD-LABEL: vector_gep_v3i64:
154 ; CHECK-SD: // %bb.0: // %entry
155 ; CHECK-SD-NEXT: // kill: def $d3 killed $d3 def $q3
156 ; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0
157 ; CHECK-SD-NEXT: // kill: def $d4 killed $d4 def $q4
158 ; CHECK-SD-NEXT: // kill: def $d1 killed $d1 def $q1
159 ; CHECK-SD-NEXT: mov v3.d[1], v4.d[0]
160 ; CHECK-SD-NEXT: mov v0.d[1], v1.d[0]
161 ; CHECK-SD-NEXT: add d1, d2, d5
162 ; CHECK-SD-NEXT: str d1, [x0, #16]
163 ; CHECK-SD-NEXT: add v0.2d, v0.2d, v3.2d
164 ; CHECK-SD-NEXT: str q0, [x0]
167 ; CHECK-GI-LABEL: vector_gep_v3i64:
168 ; CHECK-GI: // %bb.0: // %entry
169 ; CHECK-GI-NEXT: // kill: def $d0 killed $d0 def $q0
170 ; CHECK-GI-NEXT: // kill: def $d3 killed $d3 def $q3
171 ; CHECK-GI-NEXT: // kill: def $d1 killed $d1 def $q1
172 ; CHECK-GI-NEXT: // kill: def $d4 killed $d4 def $q4
173 ; CHECK-GI-NEXT: fmov x8, d2
174 ; CHECK-GI-NEXT: fmov x9, d5
175 ; CHECK-GI-NEXT: mov v0.d[1], v1.d[0]
176 ; CHECK-GI-NEXT: mov v3.d[1], v4.d[0]
177 ; CHECK-GI-NEXT: add x8, x8, x9
178 ; CHECK-GI-NEXT: str x8, [x0, #16]
179 ; CHECK-GI-NEXT: add v0.2d, v0.2d, v3.2d
180 ; CHECK-GI-NEXT: str q0, [x0]
183 %g = getelementptr i8, <3 x ptr> %b, <3 x i64> %off
184 store <3 x ptr> %g, ptr %p
188 define void @vector_gep_v4i64(<4 x ptr> %b, <4 x i64> %off, ptr %p) {
189 ; CHECK-SD-LABEL: vector_gep_v4i64:
190 ; CHECK-SD: // %bb.0: // %entry
191 ; CHECK-SD-NEXT: add v1.2d, v1.2d, v3.2d
192 ; CHECK-SD-NEXT: add v0.2d, v0.2d, v2.2d
193 ; CHECK-SD-NEXT: stp q0, q1, [x0]
196 ; CHECK-GI-LABEL: vector_gep_v4i64:
197 ; CHECK-GI: // %bb.0: // %entry
198 ; CHECK-GI-NEXT: add v0.2d, v0.2d, v2.2d
199 ; CHECK-GI-NEXT: add v1.2d, v1.2d, v3.2d
200 ; CHECK-GI-NEXT: stp q0, q1, [x0]
203 %g = getelementptr i8, <4 x ptr> %b, <4 x i64> %off
204 store <4 x ptr> %g, ptr %p
208 define void @vector_gep_v4i128(<2 x ptr> %b, <2 x i128> %off, ptr %p) {
209 ; CHECK-LABEL: vector_gep_v4i128:
210 ; CHECK: // %bb.0: // %entry
211 ; CHECK-NEXT: fmov d1, x0
212 ; CHECK-NEXT: mov v1.d[1], x2
213 ; CHECK-NEXT: add v0.2d, v0.2d, v1.2d
214 ; CHECK-NEXT: str q0, [x4]
217 %g = getelementptr i8, <2 x ptr> %b, <2 x i128> %off
218 store <2 x ptr> %g, ptr %p