[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sve-st1-addressing-mode-reg-reg.ll
blobb659ded53a8c1639e0405821ad5acac63abe3cef
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve,+bf16 < %s | FileCheck %s
4 ; ST1B
6 define void @st1_nxv16i8(ptr %addr, i64 %off, <vscale x 16 x i8> %val) {
7 ; CHECK-LABEL: st1_nxv16i8:
8 ; CHECK:       // %bb.0:
9 ; CHECK-NEXT:    ptrue p0.b
10 ; CHECK-NEXT:    st1b { z0.b }, p0, [x0, x1]
11 ; CHECK-NEXT:    ret
12   %ptr = getelementptr inbounds i8, ptr %addr, i64 %off
13   store <vscale x 16 x i8> %val, <vscale x 16 x i8>* %ptr
14   ret void
17 define void @st1_nxv16i8_bitcast_from_i16(ptr %addr, i64 %off, <vscale x 8 x i16> %val) {
18 ; CHECK-LABEL: st1_nxv16i8_bitcast_from_i16:
19 ; CHECK:       // %bb.0:
20 ; CHECK-NEXT:    ptrue p0.b
21 ; CHECK-NEXT:    st1b { z0.b }, p0, [x0, x1]
22 ; CHECK-NEXT:    ret
23   %ptr = getelementptr inbounds i8, ptr %addr, i64 %off
24   store <vscale x 8 x i16> %val, <vscale x 8 x i16>* %ptr
25   ret void
28 define void @st1_nxv16i8_bitcast_from_i32(ptr %addr, i64 %off, <vscale x 4 x i32> %val) {
29 ; CHECK-LABEL: st1_nxv16i8_bitcast_from_i32:
30 ; CHECK:       // %bb.0:
31 ; CHECK-NEXT:    ptrue p0.b
32 ; CHECK-NEXT:    st1b { z0.b }, p0, [x0, x1]
33 ; CHECK-NEXT:    ret
34   %ptr = getelementptr inbounds i8, ptr %addr, i64 %off
35   store <vscale x 4 x i32> %val, <vscale x 4 x i32>* %ptr
36   ret void
39 define void @st1_nxv16i8_bitcast_from_i64(ptr %addr, i64 %off, <vscale x 2 x i64> %val) {
40 ; CHECK-LABEL: st1_nxv16i8_bitcast_from_i64:
41 ; CHECK:       // %bb.0:
42 ; CHECK-NEXT:    ptrue p0.b
43 ; CHECK-NEXT:    st1b { z0.b }, p0, [x0, x1]
44 ; CHECK-NEXT:    ret
45   %ptr = getelementptr inbounds i8, ptr %addr, i64 %off
46   store <vscale x 2 x i64> %val, <vscale x 2 x i64>* %ptr
47   ret void
50 define void @st1_nxv8i16_trunc8(ptr %addr, i64 %off, <vscale x 8 x i16> %val) {
51 ; CHECK-LABEL: st1_nxv8i16_trunc8:
52 ; CHECK:       // %bb.0:
53 ; CHECK-NEXT:    ptrue p0.h
54 ; CHECK-NEXT:    st1b { z0.h }, p0, [x0, x1]
55 ; CHECK-NEXT:    ret
56   %ptr = getelementptr inbounds i8, ptr %addr, i64 %off
57   %trunc = trunc <vscale x 8 x i16> %val to <vscale x 8 x i8>
58   store <vscale x 8 x i8> %trunc, <vscale x 8 x i8>* %ptr
59   ret void
62 define void @st1_nxv4i32_trunc8(ptr %addr, i64 %off, <vscale x 4 x i32> %val) {
63 ; CHECK-LABEL: st1_nxv4i32_trunc8:
64 ; CHECK:       // %bb.0:
65 ; CHECK-NEXT:    ptrue p0.s
66 ; CHECK-NEXT:    st1b { z0.s }, p0, [x0, x1]
67 ; CHECK-NEXT:    ret
68   %ptr = getelementptr inbounds i8, ptr %addr, i64 %off
69   %trunc = trunc <vscale x 4 x i32> %val to <vscale x 4 x i8>
70   store <vscale x 4 x i8> %trunc, <vscale x 4 x i8>* %ptr
71   ret void
74 define void @st1_nxv2i64_trunc8(ptr %addr, i64 %off, <vscale x 2 x i64> %val) {
75 ; CHECK-LABEL: st1_nxv2i64_trunc8:
76 ; CHECK:       // %bb.0:
77 ; CHECK-NEXT:    ptrue p0.d
78 ; CHECK-NEXT:    st1b { z0.d }, p0, [x0, x1]
79 ; CHECK-NEXT:    ret
80   %ptr = getelementptr inbounds i8, ptr %addr, i64 %off
81   %trunc = trunc <vscale x 2 x i64> %val to <vscale x 2 x i8>
82   store <vscale x 2 x i8> %trunc, <vscale x 2 x i8>* %ptr
83   ret void
86 ; ST1H
88 define void @st1_nxv8i16(ptr %addr, i64 %off, <vscale x 8 x i16> %val) {
89 ; CHECK-LABEL: st1_nxv8i16:
90 ; CHECK:       // %bb.0:
91 ; CHECK-NEXT:    ptrue p0.h
92 ; CHECK-NEXT:    st1h { z0.h }, p0, [x0, x1, lsl #1]
93 ; CHECK-NEXT:    ret
94   %ptr = getelementptr inbounds i16, ptr %addr, i64 %off
95   store <vscale x 8 x i16> %val, <vscale x 8 x i16>* %ptr
96   ret void
99 define void @st1_nxv4i32_trunc16(ptr %addr, i64 %off, <vscale x 4 x i32> %val) {
100 ; CHECK-LABEL: st1_nxv4i32_trunc16:
101 ; CHECK:       // %bb.0:
102 ; CHECK-NEXT:    ptrue p0.s
103 ; CHECK-NEXT:    st1h { z0.s }, p0, [x0, x1, lsl #1]
104 ; CHECK-NEXT:    ret
105   %ptr = getelementptr inbounds i16, ptr %addr, i64 %off
106   %trunc = trunc <vscale x 4 x i32> %val to <vscale x 4 x i16>
107   store <vscale x 4 x i16> %trunc, <vscale x 4 x i16>* %ptr
108   ret void
111 define void @st1_nxv2i64_trunc16(ptr %addr, i64 %off, <vscale x 2 x i64> %val) {
112 ; CHECK-LABEL: st1_nxv2i64_trunc16:
113 ; CHECK:       // %bb.0:
114 ; CHECK-NEXT:    ptrue p0.d
115 ; CHECK-NEXT:    st1h { z0.d }, p0, [x0, x1, lsl #1]
116 ; CHECK-NEXT:    ret
117   %ptr = getelementptr inbounds i16, ptr %addr, i64 %off
118   %trunc = trunc <vscale x 2 x i64> %val to <vscale x 2 x i16>
119   store <vscale x 2 x i16> %trunc, <vscale x 2 x i16>* %ptr
120   ret void
123 define void @st1_nxv8f16(ptr %addr, i64 %off, <vscale x 8 x half> %val) {
124 ; CHECK-LABEL: st1_nxv8f16:
125 ; CHECK:       // %bb.0:
126 ; CHECK-NEXT:    ptrue p0.h
127 ; CHECK-NEXT:    st1h { z0.h }, p0, [x0, x1, lsl #1]
128 ; CHECK-NEXT:    ret
129   %ptr = getelementptr inbounds half, ptr %addr, i64 %off
130   store <vscale x 8 x half> %val, <vscale x 8 x half>* %ptr
131   ret void
134 define void @st1_nxv8bf16(ptr %addr, i64 %off, <vscale x 8 x bfloat> %val) {
135 ; CHECK-LABEL: st1_nxv8bf16:
136 ; CHECK:       // %bb.0:
137 ; CHECK-NEXT:    ptrue p0.h
138 ; CHECK-NEXT:    st1h { z0.h }, p0, [x0, x1, lsl #1]
139 ; CHECK-NEXT:    ret
140   %ptr = getelementptr inbounds bfloat, ptr %addr, i64 %off
141   store <vscale x 8 x bfloat> %val, <vscale x 8 x bfloat>* %ptr
142   ret void
145 define void @st1_nxv4f16(ptr %addr, i64 %off, <vscale x 4 x half> %val) {
146 ; CHECK-LABEL: st1_nxv4f16:
147 ; CHECK:       // %bb.0:
148 ; CHECK-NEXT:    ptrue p0.s
149 ; CHECK-NEXT:    st1h { z0.s }, p0, [x0, x1, lsl #1]
150 ; CHECK-NEXT:    ret
151   %ptr = getelementptr inbounds half, ptr %addr, i64 %off
152   store <vscale x 4 x half> %val, <vscale x 4 x half>* %ptr
153   ret void
156 define void @st1_nxv4bf16(ptr %addr, i64 %off, <vscale x 4 x bfloat> %val) {
157 ; CHECK-LABEL: st1_nxv4bf16:
158 ; CHECK:       // %bb.0:
159 ; CHECK-NEXT:    ptrue p0.s
160 ; CHECK-NEXT:    st1h { z0.s }, p0, [x0, x1, lsl #1]
161 ; CHECK-NEXT:    ret
162   %ptr = getelementptr inbounds bfloat, ptr %addr, i64 %off
163   store <vscale x 4 x bfloat> %val, <vscale x 4 x bfloat>* %ptr
164   ret void
167 define void @st1_nxv2f16(ptr %addr, i64 %off, <vscale x 2 x half> %val) {
168 ; CHECK-LABEL: st1_nxv2f16:
169 ; CHECK:       // %bb.0:
170 ; CHECK-NEXT:    ptrue p0.d
171 ; CHECK-NEXT:    st1h { z0.d }, p0, [x0, x1, lsl #1]
172 ; CHECK-NEXT:    ret
173   %ptr = getelementptr inbounds half, ptr %addr, i64 %off
174   store <vscale x 2 x half> %val, <vscale x 2 x half>* %ptr
175   ret void
178 define void @st1_nxv2bf16(ptr %addr, i64 %off, <vscale x 2 x bfloat> %val) {
179 ; CHECK-LABEL: st1_nxv2bf16:
180 ; CHECK:       // %bb.0:
181 ; CHECK-NEXT:    ptrue p0.d
182 ; CHECK-NEXT:    st1h { z0.d }, p0, [x0, x1, lsl #1]
183 ; CHECK-NEXT:    ret
184   %ptr = getelementptr inbounds bfloat, ptr %addr, i64 %off
185   store <vscale x 2 x bfloat> %val, <vscale x 2 x bfloat>* %ptr
186   ret void
189 ; ST1W
191 define void @st1_nxv4i32(ptr %addr, i64 %off, <vscale x 4 x i32> %val) {
192 ; CHECK-LABEL: st1_nxv4i32:
193 ; CHECK:       // %bb.0:
194 ; CHECK-NEXT:    ptrue p0.s
195 ; CHECK-NEXT:    st1w { z0.s }, p0, [x0, x1, lsl #2]
196 ; CHECK-NEXT:    ret
197   %ptr = getelementptr inbounds i32, ptr %addr, i64 %off
198   store <vscale x 4 x i32> %val, <vscale x 4 x i32>* %ptr
199   ret void
202 define void @st1_nxv2i64_trunc32(ptr %addr, i64 %off, <vscale x 2 x i64> %val) {
203 ; CHECK-LABEL: st1_nxv2i64_trunc32:
204 ; CHECK:       // %bb.0:
205 ; CHECK-NEXT:    ptrue p0.d
206 ; CHECK-NEXT:    st1w { z0.d }, p0, [x0, x1, lsl #2]
207 ; CHECK-NEXT:    ret
208   %ptr = getelementptr inbounds i32, ptr %addr, i64 %off
209   %trunc = trunc <vscale x 2 x i64> %val to <vscale x 2 x i32>
210   store <vscale x 2 x i32> %trunc, <vscale x 2 x i32>* %ptr
211   ret void
214 define void @st1_nxv4f32(ptr %addr, i64 %off, <vscale x 4 x float> %val) {
215 ; CHECK-LABEL: st1_nxv4f32:
216 ; CHECK:       // %bb.0:
217 ; CHECK-NEXT:    ptrue p0.s
218 ; CHECK-NEXT:    st1w { z0.s }, p0, [x0, x1, lsl #2]
219 ; CHECK-NEXT:    ret
220   %ptr = getelementptr inbounds float, ptr %addr, i64 %off
221   store <vscale x 4 x float> %val, <vscale x 4 x float>* %ptr
222   ret void
225 define void @st1_nxv2f32(ptr %addr, i64 %off, <vscale x 2 x float> %val) {
226 ; CHECK-LABEL: st1_nxv2f32:
227 ; CHECK:       // %bb.0:
228 ; CHECK-NEXT:    ptrue p0.d
229 ; CHECK-NEXT:    st1w { z0.d }, p0, [x0, x1, lsl #2]
230 ; CHECK-NEXT:    ret
231   %ptr = getelementptr inbounds float, ptr %addr, i64 %off
232   store <vscale x 2 x float> %val, <vscale x 2 x float>* %ptr
233   ret void
236 ; ST1D
238 define void @st1_nxv2i64(ptr %addr, i64 %off, <vscale x 2 x i64> %val) {
239 ; CHECK-LABEL: st1_nxv2i64:
240 ; CHECK:       // %bb.0:
241 ; CHECK-NEXT:    ptrue p0.d
242 ; CHECK-NEXT:    st1d { z0.d }, p0, [x0, x1, lsl #3]
243 ; CHECK-NEXT:    ret
244   %ptr = getelementptr inbounds i64, ptr %addr, i64 %off
245   store <vscale x 2 x i64> %val, <vscale x 2 x i64>* %ptr
246   ret void
249 define void @st1_nxv2f64(ptr %addr, i64 %off, <vscale x 2 x double> %val) {
250 ; CHECK-LABEL: st1_nxv2f64:
251 ; CHECK:       // %bb.0:
252 ; CHECK-NEXT:    ptrue p0.d
253 ; CHECK-NEXT:    st1d { z0.d }, p0, [x0, x1, lsl #3]
254 ; CHECK-NEXT:    ret
255   %ptr = getelementptr inbounds double, ptr %addr, i64 %off
256   store <vscale x 2 x double> %val, <vscale x 2 x double>* %ptr
257   ret void