xref: /llvm-project/llvm/test/CodeGen/AArch64/sve-streaming-mode-fixed-length-bitcast.ll (revision 5f7502bf1f193482e23385cdd4cfecf09f19ccbc)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mattr=+sve -force-streaming-compatible  < %s | FileCheck %s
3; RUN: llc -mattr=+sme -force-streaming  < %s | FileCheck %s
4; RUN: llc -force-streaming-compatible < %s | FileCheck %s --check-prefix=NONEON-NOSVE
5
6target triple = "aarch64-unknown-linux-gnu"
7
8define void @bitcast_v4i8(ptr %a, ptr %b) {
9; CHECK-LABEL: bitcast_v4i8:
10; CHECK:       // %bb.0:
11; CHECK-NEXT:    ptrue p0.h, vl4
12; CHECK-NEXT:    ld1b { z0.h }, p0/z, [x0]
13; CHECK-NEXT:    st1b { z0.h }, p0, [x1]
14; CHECK-NEXT:    ret
15;
16; NONEON-NOSVE-LABEL: bitcast_v4i8:
17; NONEON-NOSVE:       // %bb.0:
18; NONEON-NOSVE-NEXT:    ldrb w8, [x0]
19; NONEON-NOSVE-NEXT:    ldrb w9, [x0, #1]
20; NONEON-NOSVE-NEXT:    ldrb w10, [x0, #2]
21; NONEON-NOSVE-NEXT:    ldrb w11, [x0, #3]
22; NONEON-NOSVE-NEXT:    strb w11, [x1, #3]
23; NONEON-NOSVE-NEXT:    strb w10, [x1, #2]
24; NONEON-NOSVE-NEXT:    strb w9, [x1, #1]
25; NONEON-NOSVE-NEXT:    strb w8, [x1]
26; NONEON-NOSVE-NEXT:    ret
27  %load = load volatile <4 x i8>, ptr %a
28  %cast = bitcast <4 x i8> %load to <4 x i8>
29  store volatile <4 x i8> %cast, ptr %b
30  ret void
31}
32
33define void @bitcast_v8i8(ptr %a, ptr %b) {
34; CHECK-LABEL: bitcast_v8i8:
35; CHECK:       // %bb.0:
36; CHECK-NEXT:    ldr d0, [x0]
37; CHECK-NEXT:    str d0, [x1]
38; CHECK-NEXT:    ret
39;
40; NONEON-NOSVE-LABEL: bitcast_v8i8:
41; NONEON-NOSVE:       // %bb.0:
42; NONEON-NOSVE-NEXT:    ldr d0, [x0]
43; NONEON-NOSVE-NEXT:    str d0, [x1]
44; NONEON-NOSVE-NEXT:    ret
45  %load = load volatile <8 x i8>, ptr %a
46  %cast = bitcast <8 x i8> %load to <8 x i8>
47  store volatile <8 x i8> %cast, ptr %b
48  ret void
49}
50
51define void @bitcast_v16i8(ptr %a, ptr %b) {
52; CHECK-LABEL: bitcast_v16i8:
53; CHECK:       // %bb.0:
54; CHECK-NEXT:    ldr q0, [x0]
55; CHECK-NEXT:    str q0, [x1]
56; CHECK-NEXT:    ret
57;
58; NONEON-NOSVE-LABEL: bitcast_v16i8:
59; NONEON-NOSVE:       // %bb.0:
60; NONEON-NOSVE-NEXT:    ldr q0, [x0]
61; NONEON-NOSVE-NEXT:    str q0, [x1]
62; NONEON-NOSVE-NEXT:    ret
63  %load = load volatile <16 x i8>, ptr %a
64  %cast = bitcast <16 x i8> %load to <16 x i8>
65  store volatile <16 x i8> %cast, ptr %b
66  ret void
67}
68
69define void @bitcast_v32i8(ptr %a, ptr %b) {
70; CHECK-LABEL: bitcast_v32i8:
71; CHECK:       // %bb.0:
72; CHECK-NEXT:    ldr q0, [x0]
73; CHECK-NEXT:    ldr q1, [x0, #16]
74; CHECK-NEXT:    str q1, [x1, #16]
75; CHECK-NEXT:    str q0, [x1]
76; CHECK-NEXT:    ret
77;
78; NONEON-NOSVE-LABEL: bitcast_v32i8:
79; NONEON-NOSVE:       // %bb.0:
80; NONEON-NOSVE-NEXT:    ldr q0, [x0]
81; NONEON-NOSVE-NEXT:    ldr q1, [x0, #16]
82; NONEON-NOSVE-NEXT:    str q1, [x1, #16]
83; NONEON-NOSVE-NEXT:    str q0, [x1]
84; NONEON-NOSVE-NEXT:    ret
85  %load = load volatile <32 x i8>, ptr %a
86  %cast = bitcast <32 x i8> %load to <32 x i8>
87  store volatile <32 x i8> %cast, ptr %b
88  ret void
89}
90
91define void @bitcast_v2i16(ptr %a, ptr %b) {
92; CHECK-LABEL: bitcast_v2i16:
93; CHECK:       // %bb.0:
94; CHECK-NEXT:    ptrue p0.s, vl2
95; CHECK-NEXT:    ld1h { z0.s }, p0/z, [x0]
96; CHECK-NEXT:    mov z1.s, z0.s[1]
97; CHECK-NEXT:    zip1 z0.h, z0.h, z1.h
98; CHECK-NEXT:    fmov w8, s0
99; CHECK-NEXT:    str w8, [x1]
100; CHECK-NEXT:    ret
101;
102; NONEON-NOSVE-LABEL: bitcast_v2i16:
103; NONEON-NOSVE:       // %bb.0:
104; NONEON-NOSVE-NEXT:    sub sp, sp, #32
105; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 32
106; NONEON-NOSVE-NEXT:    ldrh w8, [x0, #2]
107; NONEON-NOSVE-NEXT:    str w8, [sp, #4]
108; NONEON-NOSVE-NEXT:    ldrh w8, [x0]
109; NONEON-NOSVE-NEXT:    str w8, [sp]
110; NONEON-NOSVE-NEXT:    ldr d0, [sp]
111; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
112; NONEON-NOSVE-NEXT:    ldp w8, w9, [sp, #8]
113; NONEON-NOSVE-NEXT:    strh w9, [sp, #18]
114; NONEON-NOSVE-NEXT:    strh w8, [sp, #16]
115; NONEON-NOSVE-NEXT:    ldr d0, [sp, #16]
116; NONEON-NOSVE-NEXT:    str d0, [sp, #24]
117; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
118; NONEON-NOSVE-NEXT:    str w8, [x1]
119; NONEON-NOSVE-NEXT:    add sp, sp, #32
120; NONEON-NOSVE-NEXT:    ret
121  %load = load volatile <2 x i16>, ptr %a
122  %cast = bitcast <2 x i16> %load to <2 x half>
123  store volatile <2 x half> %cast, ptr %b
124  ret void
125}
126
127define void @bitcast_v4i16(ptr %a, ptr %b) {
128; CHECK-LABEL: bitcast_v4i16:
129; CHECK:       // %bb.0:
130; CHECK-NEXT:    ldr d0, [x0]
131; CHECK-NEXT:    str d0, [x1]
132; CHECK-NEXT:    ret
133;
134; NONEON-NOSVE-LABEL: bitcast_v4i16:
135; NONEON-NOSVE:       // %bb.0:
136; NONEON-NOSVE-NEXT:    ldr d0, [x0]
137; NONEON-NOSVE-NEXT:    str d0, [x1]
138; NONEON-NOSVE-NEXT:    ret
139  %load = load volatile <4 x i16>, ptr %a
140  %cast = bitcast <4 x i16> %load to <4 x half>
141  store volatile <4 x half> %cast, ptr %b
142  ret void
143}
144
145define void @bitcast_v8i16(ptr %a, ptr %b) {
146; CHECK-LABEL: bitcast_v8i16:
147; CHECK:       // %bb.0:
148; CHECK-NEXT:    ldr q0, [x0]
149; CHECK-NEXT:    str q0, [x1]
150; CHECK-NEXT:    ret
151;
152; NONEON-NOSVE-LABEL: bitcast_v8i16:
153; NONEON-NOSVE:       // %bb.0:
154; NONEON-NOSVE-NEXT:    ldr q0, [x0]
155; NONEON-NOSVE-NEXT:    str q0, [x1]
156; NONEON-NOSVE-NEXT:    ret
157  %load = load volatile <8 x i16>, ptr %a
158  %cast = bitcast <8 x i16> %load to <8 x half>
159  store volatile <8 x half> %cast, ptr %b
160  ret void
161}
162
163define void @bitcast_v16i16(ptr %a, ptr %b) {
164; CHECK-LABEL: bitcast_v16i16:
165; CHECK:       // %bb.0:
166; CHECK-NEXT:    ldr q0, [x0]
167; CHECK-NEXT:    ldr q1, [x0, #16]
168; CHECK-NEXT:    str q1, [x1, #16]
169; CHECK-NEXT:    str q0, [x1]
170; CHECK-NEXT:    ret
171;
172; NONEON-NOSVE-LABEL: bitcast_v16i16:
173; NONEON-NOSVE:       // %bb.0:
174; NONEON-NOSVE-NEXT:    ldr q0, [x0]
175; NONEON-NOSVE-NEXT:    ldr q1, [x0, #16]
176; NONEON-NOSVE-NEXT:    str q1, [x1, #16]
177; NONEON-NOSVE-NEXT:    str q0, [x1]
178; NONEON-NOSVE-NEXT:    ret
179  %load = load volatile <16 x i16>, ptr %a
180  %cast = bitcast <16 x i16> %load to <16 x half>
181  store volatile <16 x half> %cast, ptr %b
182  ret void
183}
184
185define void @bitcast_v2i32(ptr %a, ptr %b) {
186; CHECK-LABEL: bitcast_v2i32:
187; CHECK:       // %bb.0:
188; CHECK-NEXT:    ldr d0, [x0]
189; CHECK-NEXT:    str d0, [x1]
190; CHECK-NEXT:    ret
191;
192; NONEON-NOSVE-LABEL: bitcast_v2i32:
193; NONEON-NOSVE:       // %bb.0:
194; NONEON-NOSVE-NEXT:    ldr d0, [x0]
195; NONEON-NOSVE-NEXT:    str d0, [x1]
196; NONEON-NOSVE-NEXT:    ret
197  %load = load volatile <2 x i32>, ptr %a
198  %cast = bitcast <2 x i32> %load to <2 x float>
199  store volatile <2 x float> %cast, ptr %b
200  ret void
201}
202
203define void @bitcast_v4i32(ptr %a, ptr %b) {
204; CHECK-LABEL: bitcast_v4i32:
205; CHECK:       // %bb.0:
206; CHECK-NEXT:    ldr q0, [x0]
207; CHECK-NEXT:    str q0, [x1]
208; CHECK-NEXT:    ret
209;
210; NONEON-NOSVE-LABEL: bitcast_v4i32:
211; NONEON-NOSVE:       // %bb.0:
212; NONEON-NOSVE-NEXT:    ldr q0, [x0]
213; NONEON-NOSVE-NEXT:    str q0, [x1]
214; NONEON-NOSVE-NEXT:    ret
215  %load = load volatile <4 x i32>, ptr %a
216  %cast = bitcast <4 x i32> %load to <4 x float>
217  store volatile <4 x float> %cast, ptr %b
218  ret void
219}
220
221define void @bitcast_v8i32(ptr %a, ptr %b) {
222; CHECK-LABEL: bitcast_v8i32:
223; CHECK:       // %bb.0:
224; CHECK-NEXT:    ldr q0, [x0]
225; CHECK-NEXT:    ldr q1, [x0, #16]
226; CHECK-NEXT:    str q1, [x1, #16]
227; CHECK-NEXT:    str q0, [x1]
228; CHECK-NEXT:    ret
229;
230; NONEON-NOSVE-LABEL: bitcast_v8i32:
231; NONEON-NOSVE:       // %bb.0:
232; NONEON-NOSVE-NEXT:    ldr q0, [x0]
233; NONEON-NOSVE-NEXT:    ldr q1, [x0, #16]
234; NONEON-NOSVE-NEXT:    str q1, [x1, #16]
235; NONEON-NOSVE-NEXT:    str q0, [x1]
236; NONEON-NOSVE-NEXT:    ret
237  %load = load volatile <8 x i32>, ptr %a
238  %cast = bitcast <8 x i32> %load to <8 x float>
239  store volatile <8 x float> %cast, ptr %b
240  ret void
241}
242
243define void @bitcast_v1i64(ptr %a, ptr %b) {
244; CHECK-LABEL: bitcast_v1i64:
245; CHECK:       // %bb.0:
246; CHECK-NEXT:    ldr d0, [x0]
247; CHECK-NEXT:    str d0, [x1]
248; CHECK-NEXT:    ret
249;
250; NONEON-NOSVE-LABEL: bitcast_v1i64:
251; NONEON-NOSVE:       // %bb.0:
252; NONEON-NOSVE-NEXT:    ldr d0, [x0]
253; NONEON-NOSVE-NEXT:    str d0, [x1]
254; NONEON-NOSVE-NEXT:    ret
255  %load = load volatile <1 x i64>, ptr %a
256  %cast = bitcast <1 x i64> %load to <1 x double>
257  store volatile <1 x double> %cast, ptr %b
258  ret void
259}
260
261define void @bitcast_v2i64(ptr %a, ptr %b) {
262; CHECK-LABEL: bitcast_v2i64:
263; CHECK:       // %bb.0:
264; CHECK-NEXT:    ldr q0, [x0]
265; CHECK-NEXT:    str q0, [x1]
266; CHECK-NEXT:    ret
267;
268; NONEON-NOSVE-LABEL: bitcast_v2i64:
269; NONEON-NOSVE:       // %bb.0:
270; NONEON-NOSVE-NEXT:    ldr q0, [x0]
271; NONEON-NOSVE-NEXT:    str q0, [x1]
272; NONEON-NOSVE-NEXT:    ret
273  %load = load volatile <2 x i64>, ptr %a
274  %cast = bitcast <2 x i64> %load to <2 x double>
275  store volatile <2 x double> %cast, ptr %b
276  ret void
277}
278
279define void @bitcast_v4i64(ptr %a, ptr %b) {
280; CHECK-LABEL: bitcast_v4i64:
281; CHECK:       // %bb.0:
282; CHECK-NEXT:    ldr q0, [x0]
283; CHECK-NEXT:    ldr q1, [x0, #16]
284; CHECK-NEXT:    str q1, [x1, #16]
285; CHECK-NEXT:    str q0, [x1]
286; CHECK-NEXT:    ret
287;
288; NONEON-NOSVE-LABEL: bitcast_v4i64:
289; NONEON-NOSVE:       // %bb.0:
290; NONEON-NOSVE-NEXT:    ldr q0, [x0]
291; NONEON-NOSVE-NEXT:    ldr q1, [x0, #16]
292; NONEON-NOSVE-NEXT:    str q1, [x1, #16]
293; NONEON-NOSVE-NEXT:    str q0, [x1]
294; NONEON-NOSVE-NEXT:    ret
295  %load = load volatile <4 x i64>, ptr %a
296  %cast = bitcast <4 x i64> %load to <4 x double>
297  store volatile <4 x double> %cast, ptr %b
298  ret void
299}
300
301