xref: /llvm-project/llvm/test/CodeGen/AArch64/sve-streaming-mode-fixed-length-limit-duplane.ll (revision 8e0cd7382adacd8bc1741dc26bc0be6bdf8e238a)
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 <4 x i32> @test(ptr %arg1, ptr %arg2) {
9; CHECK-LABEL: test:
10; CHECK:       // %bb.0: // %entry
11; CHECK-NEXT:    ldp q0, q1, [x0, #32]
12; CHECK-NEXT:    ldp q3, q4, [x0]
13; CHECK-NEXT:    add z2.s, z0.s, z0.s
14; CHECK-NEXT:    add z5.s, z1.s, z1.s
15; CHECK-NEXT:    mov z0.s, z1.s[2]
16; CHECK-NEXT:    add z1.s, z3.s, z3.s
17; CHECK-NEXT:    add z3.s, z4.s, z4.s
18; CHECK-NEXT:    // kill: def $q0 killed $q0 killed $z0
19; CHECK-NEXT:    stp q2, q5, [x0, #32]
20; CHECK-NEXT:    stp q1, q3, [x0]
21; CHECK-NEXT:    ret
22;
23; NONEON-NOSVE-LABEL: test:
24; NONEON-NOSVE:       // %bb.0: // %entry
25; NONEON-NOSVE-NEXT:    sub sp, sp, #144
26; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 144
27; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0, #32]
28; NONEON-NOSVE-NEXT:    ldp q2, q3, [x0]
29; NONEON-NOSVE-NEXT:    str q1, [sp, #64]
30; NONEON-NOSVE-NEXT:    stp q0, q3, [sp, #32]
31; NONEON-NOSVE-NEXT:    ldr w9, [sp, #60]
32; NONEON-NOSVE-NEXT:    str q2, [sp, #16]
33; NONEON-NOSVE-NEXT:    ldr w8, [sp, #40]
34; NONEON-NOSVE-NEXT:    add w9, w9, w9
35; NONEON-NOSVE-NEXT:    stp w8, w8, [sp, #8]
36; NONEON-NOSVE-NEXT:    str w9, [sp, #124]
37; NONEON-NOSVE-NEXT:    ldr w9, [sp, #56]
38; NONEON-NOSVE-NEXT:    stp w8, w8, [sp]
39; NONEON-NOSVE-NEXT:    add w8, w8, w8
40; NONEON-NOSVE-NEXT:    add w9, w9, w9
41; NONEON-NOSVE-NEXT:    ldr q0, [sp]
42; NONEON-NOSVE-NEXT:    str w9, [sp, #120]
43; NONEON-NOSVE-NEXT:    ldr w9, [sp, #52]
44; NONEON-NOSVE-NEXT:    add w9, w9, w9
45; NONEON-NOSVE-NEXT:    str w9, [sp, #116]
46; NONEON-NOSVE-NEXT:    ldr w9, [sp, #48]
47; NONEON-NOSVE-NEXT:    add w9, w9, w9
48; NONEON-NOSVE-NEXT:    str w9, [sp, #112]
49; NONEON-NOSVE-NEXT:    ldr w9, [sp, #28]
50; NONEON-NOSVE-NEXT:    add w9, w9, w9
51; NONEON-NOSVE-NEXT:    str w9, [sp, #92]
52; NONEON-NOSVE-NEXT:    ldr w9, [sp, #24]
53; NONEON-NOSVE-NEXT:    add w9, w9, w9
54; NONEON-NOSVE-NEXT:    str w9, [sp, #88]
55; NONEON-NOSVE-NEXT:    ldr w9, [sp, #20]
56; NONEON-NOSVE-NEXT:    add w9, w9, w9
57; NONEON-NOSVE-NEXT:    str w9, [sp, #84]
58; NONEON-NOSVE-NEXT:    ldr w9, [sp, #16]
59; NONEON-NOSVE-NEXT:    add w9, w9, w9
60; NONEON-NOSVE-NEXT:    str w9, [sp, #80]
61; NONEON-NOSVE-NEXT:    ldr w9, [sp, #44]
62; NONEON-NOSVE-NEXT:    add w9, w9, w9
63; NONEON-NOSVE-NEXT:    stp w8, w9, [sp, #104]
64; NONEON-NOSVE-NEXT:    ldr w8, [sp, #36]
65; NONEON-NOSVE-NEXT:    add w8, w8, w8
66; NONEON-NOSVE-NEXT:    str w8, [sp, #100]
67; NONEON-NOSVE-NEXT:    ldr w8, [sp, #32]
68; NONEON-NOSVE-NEXT:    add w8, w8, w8
69; NONEON-NOSVE-NEXT:    str w8, [sp, #96]
70; NONEON-NOSVE-NEXT:    ldr w8, [sp, #76]
71; NONEON-NOSVE-NEXT:    ldp q4, q2, [sp, #80]
72; NONEON-NOSVE-NEXT:    add w8, w8, w8
73; NONEON-NOSVE-NEXT:    str w8, [sp, #140]
74; NONEON-NOSVE-NEXT:    ldr w8, [sp, #72]
75; NONEON-NOSVE-NEXT:    add w8, w8, w8
76; NONEON-NOSVE-NEXT:    str w8, [sp, #136]
77; NONEON-NOSVE-NEXT:    ldr w8, [sp, #68]
78; NONEON-NOSVE-NEXT:    add w8, w8, w8
79; NONEON-NOSVE-NEXT:    str w8, [sp, #132]
80; NONEON-NOSVE-NEXT:    ldr w8, [sp, #64]
81; NONEON-NOSVE-NEXT:    add w8, w8, w8
82; NONEON-NOSVE-NEXT:    str w8, [sp, #128]
83; NONEON-NOSVE-NEXT:    ldp q3, q1, [sp, #112]
84; NONEON-NOSVE-NEXT:    stp q4, q3, [x0]
85; NONEON-NOSVE-NEXT:    stp q1, q2, [x0, #32]
86; NONEON-NOSVE-NEXT:    add sp, sp, #144
87; NONEON-NOSVE-NEXT:    ret
88entry:
89  %0 = load <16 x i32>, ptr %arg1, align 256
90  %1 = load <16 x i32>, ptr %arg2, align 256
91  %shvec = shufflevector <16 x i32> %0, <16 x i32> %1, <4 x i32> <i32 14, i32 14, i32 14, i32 14>
92  %2 = add <16 x i32> %0, %0
93  store <16 x i32> %2, ptr %arg1, align 256
94  ret <4 x i32> %shvec
95}
96
97define <2 x i32> @test2(ptr %arg1, ptr %arg2) {
98; CHECK-LABEL: test2:
99; CHECK:       // %bb.0: // %entry
100; CHECK-NEXT:    ldp q1, q0, [x0, #32]
101; CHECK-NEXT:    ldp q3, q4, [x0]
102; CHECK-NEXT:    add z2.s, z0.s, z0.s
103; CHECK-NEXT:    ext z0.b, z0.b, z0.b, #8
104; CHECK-NEXT:    add z1.s, z1.s, z1.s
105; CHECK-NEXT:    add z3.s, z3.s, z3.s
106; CHECK-NEXT:    add z4.s, z4.s, z4.s
107; CHECK-NEXT:    mov z0.s, s0
108; CHECK-NEXT:    stp q1, q2, [x0, #32]
109; CHECK-NEXT:    stp q3, q4, [x0]
110; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
111; CHECK-NEXT:    ret
112;
113; NONEON-NOSVE-LABEL: test2:
114; NONEON-NOSVE:       // %bb.0: // %entry
115; NONEON-NOSVE-NEXT:    sub sp, sp, #144
116; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 144
117; NONEON-NOSVE-NEXT:    ldp q1, q0, [x0, #32]
118; NONEON-NOSVE-NEXT:    ldp q2, q3, [x0]
119; NONEON-NOSVE-NEXT:    str q1, [sp, #64]
120; NONEON-NOSVE-NEXT:    stp q0, q3, [sp, #32]
121; NONEON-NOSVE-NEXT:    ldr d0, [sp, #40]
122; NONEON-NOSVE-NEXT:    str q2, [sp, #16]
123; NONEON-NOSVE-NEXT:    str d0, [sp]
124; NONEON-NOSVE-NEXT:    ldr w8, [sp]
125; NONEON-NOSVE-NEXT:    stp w8, w8, [sp, #8]
126; NONEON-NOSVE-NEXT:    ldr w8, [sp, #60]
127; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
128; NONEON-NOSVE-NEXT:    add w8, w8, w8
129; NONEON-NOSVE-NEXT:    str w8, [sp, #124]
130; NONEON-NOSVE-NEXT:    ldr w8, [sp, #56]
131; NONEON-NOSVE-NEXT:    add w8, w8, w8
132; NONEON-NOSVE-NEXT:    str w8, [sp, #120]
133; NONEON-NOSVE-NEXT:    ldr w8, [sp, #52]
134; NONEON-NOSVE-NEXT:    add w8, w8, w8
135; NONEON-NOSVE-NEXT:    str w8, [sp, #116]
136; NONEON-NOSVE-NEXT:    ldr w8, [sp, #48]
137; NONEON-NOSVE-NEXT:    add w8, w8, w8
138; NONEON-NOSVE-NEXT:    str w8, [sp, #112]
139; NONEON-NOSVE-NEXT:    ldr w8, [sp, #28]
140; NONEON-NOSVE-NEXT:    add w8, w8, w8
141; NONEON-NOSVE-NEXT:    str w8, [sp, #92]
142; NONEON-NOSVE-NEXT:    ldr w8, [sp, #24]
143; NONEON-NOSVE-NEXT:    add w8, w8, w8
144; NONEON-NOSVE-NEXT:    str w8, [sp, #88]
145; NONEON-NOSVE-NEXT:    ldr w8, [sp, #20]
146; NONEON-NOSVE-NEXT:    add w8, w8, w8
147; NONEON-NOSVE-NEXT:    str w8, [sp, #84]
148; NONEON-NOSVE-NEXT:    ldr w8, [sp, #16]
149; NONEON-NOSVE-NEXT:    add w8, w8, w8
150; NONEON-NOSVE-NEXT:    str w8, [sp, #80]
151; NONEON-NOSVE-NEXT:    ldr w8, [sp, #44]
152; NONEON-NOSVE-NEXT:    add w8, w8, w8
153; NONEON-NOSVE-NEXT:    str w8, [sp, #108]
154; NONEON-NOSVE-NEXT:    ldr w8, [sp, #40]
155; NONEON-NOSVE-NEXT:    add w8, w8, w8
156; NONEON-NOSVE-NEXT:    str w8, [sp, #104]
157; NONEON-NOSVE-NEXT:    ldr w8, [sp, #36]
158; NONEON-NOSVE-NEXT:    add w8, w8, w8
159; NONEON-NOSVE-NEXT:    str w8, [sp, #100]
160; NONEON-NOSVE-NEXT:    ldr w8, [sp, #32]
161; NONEON-NOSVE-NEXT:    add w8, w8, w8
162; NONEON-NOSVE-NEXT:    str w8, [sp, #96]
163; NONEON-NOSVE-NEXT:    ldr w8, [sp, #76]
164; NONEON-NOSVE-NEXT:    ldp q4, q2, [sp, #80]
165; NONEON-NOSVE-NEXT:    add w8, w8, w8
166; NONEON-NOSVE-NEXT:    str w8, [sp, #140]
167; NONEON-NOSVE-NEXT:    ldr w8, [sp, #72]
168; NONEON-NOSVE-NEXT:    add w8, w8, w8
169; NONEON-NOSVE-NEXT:    str w8, [sp, #136]
170; NONEON-NOSVE-NEXT:    ldr w8, [sp, #68]
171; NONEON-NOSVE-NEXT:    add w8, w8, w8
172; NONEON-NOSVE-NEXT:    str w8, [sp, #132]
173; NONEON-NOSVE-NEXT:    ldr w8, [sp, #64]
174; NONEON-NOSVE-NEXT:    add w8, w8, w8
175; NONEON-NOSVE-NEXT:    str w8, [sp, #128]
176; NONEON-NOSVE-NEXT:    ldp q3, q1, [sp, #112]
177; NONEON-NOSVE-NEXT:    stp q4, q3, [x0]
178; NONEON-NOSVE-NEXT:    stp q1, q2, [x0, #32]
179; NONEON-NOSVE-NEXT:    add sp, sp, #144
180; NONEON-NOSVE-NEXT:    ret
181entry:
182  %0 = load <16 x i32>, ptr %arg1, align 256
183  %1 = load <16 x i32>, ptr %arg2, align 256
184  %shvec = shufflevector <16 x i32> %0, <16 x i32> %1, <2 x i32> <i32 14, i32 14>
185  %2 = add <16 x i32> %0, %0
186  store <16 x i32> %2, ptr %arg1, align 256
187  ret <2 x i32> %shvec
188}
189