xref: /llvm-project/llvm/test/CodeGen/AArch64/sve-streaming-mode-fixed-length-extract-vector-elt.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
8;
9; extractelement
10;
11
12define half @extractelement_v2f16(<2 x half> %op1) {
13; CHECK-LABEL: extractelement_v2f16:
14; CHECK:       // %bb.0:
15; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
16; CHECK-NEXT:    mov z0.h, z0.h[1]
17; CHECK-NEXT:    // kill: def $h0 killed $h0 killed $z0
18; CHECK-NEXT:    ret
19;
20; NONEON-NOSVE-LABEL: extractelement_v2f16:
21; NONEON-NOSVE:       // %bb.0:
22; NONEON-NOSVE-NEXT:    sub sp, sp, #16
23; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
24; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
25; NONEON-NOSVE-NEXT:    ldr h0, [sp, #10]
26; NONEON-NOSVE-NEXT:    add sp, sp, #16
27; NONEON-NOSVE-NEXT:    ret
28  %r = extractelement <2 x half> %op1, i64 1
29  ret half %r
30}
31
32define half @extractelement_v4f16(<4 x half> %op1) {
33; CHECK-LABEL: extractelement_v4f16:
34; CHECK:       // %bb.0:
35; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
36; CHECK-NEXT:    mov z0.h, z0.h[3]
37; CHECK-NEXT:    // kill: def $h0 killed $h0 killed $z0
38; CHECK-NEXT:    ret
39;
40; NONEON-NOSVE-LABEL: extractelement_v4f16:
41; NONEON-NOSVE:       // %bb.0:
42; NONEON-NOSVE-NEXT:    sub sp, sp, #16
43; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
44; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
45; NONEON-NOSVE-NEXT:    ldr h0, [sp, #14]
46; NONEON-NOSVE-NEXT:    add sp, sp, #16
47; NONEON-NOSVE-NEXT:    ret
48  %r = extractelement <4 x half> %op1, i64 3
49  ret half %r
50}
51
52define half @extractelement_v8f16(<8 x half> %op1) {
53; CHECK-LABEL: extractelement_v8f16:
54; CHECK:       // %bb.0:
55; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
56; CHECK-NEXT:    mov z0.h, z0.h[7]
57; CHECK-NEXT:    // kill: def $h0 killed $h0 killed $z0
58; CHECK-NEXT:    ret
59;
60; NONEON-NOSVE-LABEL: extractelement_v8f16:
61; NONEON-NOSVE:       // %bb.0:
62; NONEON-NOSVE-NEXT:    str q0, [sp, #-16]!
63; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
64; NONEON-NOSVE-NEXT:    ldr h0, [sp, #14]
65; NONEON-NOSVE-NEXT:    add sp, sp, #16
66; NONEON-NOSVE-NEXT:    ret
67  %r = extractelement <8 x half> %op1, i64 7
68  ret half %r
69}
70
71define half @extractelement_v16f16(ptr %a) {
72; CHECK-LABEL: extractelement_v16f16:
73; CHECK:       // %bb.0:
74; CHECK-NEXT:    ldr q0, [x0, #16]
75; CHECK-NEXT:    mov z0.h, z0.h[7]
76; CHECK-NEXT:    // kill: def $h0 killed $h0 killed $z0
77; CHECK-NEXT:    ret
78;
79; NONEON-NOSVE-LABEL: extractelement_v16f16:
80; NONEON-NOSVE:       // %bb.0:
81; NONEON-NOSVE-NEXT:    ldr q0, [x0, #16]
82; NONEON-NOSVE-NEXT:    str q0, [sp, #-16]!
83; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
84; NONEON-NOSVE-NEXT:    ldr h0, [sp, #14]
85; NONEON-NOSVE-NEXT:    add sp, sp, #16
86; NONEON-NOSVE-NEXT:    ret
87  %op1 = load <16 x half>, ptr %a
88  %r = extractelement <16 x half> %op1, i64 15
89  ret half %r
90}
91
92define float @extractelement_v2f32(<2 x float> %op1) {
93; CHECK-LABEL: extractelement_v2f32:
94; CHECK:       // %bb.0:
95; CHECK-NEXT:    // kill: def $d0 killed $d0 def $z0
96; CHECK-NEXT:    mov z0.s, z0.s[1]
97; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $z0
98; CHECK-NEXT:    ret
99;
100; NONEON-NOSVE-LABEL: extractelement_v2f32:
101; NONEON-NOSVE:       // %bb.0:
102; NONEON-NOSVE-NEXT:    sub sp, sp, #16
103; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
104; NONEON-NOSVE-NEXT:    str d0, [sp, #8]
105; NONEON-NOSVE-NEXT:    ldr s0, [sp, #12]
106; NONEON-NOSVE-NEXT:    add sp, sp, #16
107; NONEON-NOSVE-NEXT:    ret
108  %r = extractelement <2 x float> %op1, i64 1
109  ret float %r
110}
111
112define float @extractelement_v4f32(<4 x float> %op1) {
113; CHECK-LABEL: extractelement_v4f32:
114; CHECK:       // %bb.0:
115; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
116; CHECK-NEXT:    mov z0.s, z0.s[3]
117; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $z0
118; CHECK-NEXT:    ret
119;
120; NONEON-NOSVE-LABEL: extractelement_v4f32:
121; NONEON-NOSVE:       // %bb.0:
122; NONEON-NOSVE-NEXT:    str q0, [sp, #-16]!
123; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
124; NONEON-NOSVE-NEXT:    ldr s0, [sp, #12]
125; NONEON-NOSVE-NEXT:    add sp, sp, #16
126; NONEON-NOSVE-NEXT:    ret
127  %r = extractelement <4 x float> %op1, i64 3
128  ret float %r
129}
130
131define float @extractelement_v8f32(ptr %a) {
132; CHECK-LABEL: extractelement_v8f32:
133; CHECK:       // %bb.0:
134; CHECK-NEXT:    ldr q0, [x0, #16]
135; CHECK-NEXT:    mov z0.s, z0.s[3]
136; CHECK-NEXT:    // kill: def $s0 killed $s0 killed $z0
137; CHECK-NEXT:    ret
138;
139; NONEON-NOSVE-LABEL: extractelement_v8f32:
140; NONEON-NOSVE:       // %bb.0:
141; NONEON-NOSVE-NEXT:    ldr q0, [x0, #16]
142; NONEON-NOSVE-NEXT:    str q0, [sp, #-16]!
143; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
144; NONEON-NOSVE-NEXT:    ldr s0, [sp, #12]
145; NONEON-NOSVE-NEXT:    add sp, sp, #16
146; NONEON-NOSVE-NEXT:    ret
147  %op1 = load <8 x float>, ptr %a
148  %r = extractelement <8 x float> %op1, i64 7
149  ret float %r
150}
151
152define double @extractelement_v1f64(<1 x double> %op1) {
153; CHECK-LABEL: extractelement_v1f64:
154; CHECK:       // %bb.0:
155; CHECK-NEXT:    ret
156;
157; NONEON-NOSVE-LABEL: extractelement_v1f64:
158; NONEON-NOSVE:       // %bb.0:
159; NONEON-NOSVE-NEXT:    ret
160  %r = extractelement <1 x double> %op1, i64 0
161  ret double %r
162}
163define double @extractelement_v2f64(<2 x double> %op1) {
164; CHECK-LABEL: extractelement_v2f64:
165; CHECK:       // %bb.0:
166; CHECK-NEXT:    // kill: def $q0 killed $q0 def $z0
167; CHECK-NEXT:    mov z0.d, z0.d[1]
168; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
169; CHECK-NEXT:    ret
170;
171; NONEON-NOSVE-LABEL: extractelement_v2f64:
172; NONEON-NOSVE:       // %bb.0:
173; NONEON-NOSVE-NEXT:    str q0, [sp, #-16]!
174; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
175; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
176; NONEON-NOSVE-NEXT:    add sp, sp, #16
177; NONEON-NOSVE-NEXT:    ret
178  %r = extractelement <2 x double> %op1, i64 1
179  ret double %r
180}
181
182define double @extractelement_v4f64(ptr %a) {
183; CHECK-LABEL: extractelement_v4f64:
184; CHECK:       // %bb.0:
185; CHECK-NEXT:    ldr q0, [x0, #16]
186; CHECK-NEXT:    mov z0.d, z0.d[1]
187; CHECK-NEXT:    // kill: def $d0 killed $d0 killed $z0
188; CHECK-NEXT:    ret
189;
190; NONEON-NOSVE-LABEL: extractelement_v4f64:
191; NONEON-NOSVE:       // %bb.0:
192; NONEON-NOSVE-NEXT:    ldr q0, [x0, #16]
193; NONEON-NOSVE-NEXT:    str q0, [sp, #-16]!
194; NONEON-NOSVE-NEXT:    .cfi_def_cfa_offset 16
195; NONEON-NOSVE-NEXT:    ldr d0, [sp, #8]
196; NONEON-NOSVE-NEXT:    add sp, sp, #16
197; NONEON-NOSVE-NEXT:    ret
198  %op1 = load <4 x double>, ptr %a
199  %r = extractelement <4 x double> %op1, i64 3
200  ret double %r
201}
202