xref: /llvm-project/llvm/test/CodeGen/LoongArch/lsx/ir-instruction/extractelement.ll (revision a5c90e48b6f11bc6db7344503589648f76b16d80)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3
2; RUN: llc --mtriple=loongarch64 --mattr=+lsx < %s | FileCheck %s
3
4define void @extract_16xi8(ptr %src, ptr %dst) nounwind {
5; CHECK-LABEL: extract_16xi8:
6; CHECK:       # %bb.0:
7; CHECK-NEXT:    vld $vr0, $a0, 0
8; CHECK-NEXT:    vpickve2gr.b $a0, $vr0, 1
9; CHECK-NEXT:    st.b $a0, $a1, 0
10; CHECK-NEXT:    ret
11  %v = load volatile <16 x i8>, ptr %src
12  %e = extractelement <16 x i8> %v, i32 1
13  store i8 %e, ptr %dst
14  ret void
15}
16
17define void @extract_8xi16(ptr %src, ptr %dst) nounwind {
18; CHECK-LABEL: extract_8xi16:
19; CHECK:       # %bb.0:
20; CHECK-NEXT:    vld $vr0, $a0, 0
21; CHECK-NEXT:    vpickve2gr.h $a0, $vr0, 1
22; CHECK-NEXT:    st.h $a0, $a1, 0
23; CHECK-NEXT:    ret
24  %v = load volatile <8 x i16>, ptr %src
25  %e = extractelement <8 x i16> %v, i32 1
26  store i16 %e, ptr %dst
27  ret void
28}
29
30define void @extract_4xi32(ptr %src, ptr %dst) nounwind {
31; CHECK-LABEL: extract_4xi32:
32; CHECK:       # %bb.0:
33; CHECK-NEXT:    vld $vr0, $a0, 0
34; CHECK-NEXT:    vpickve2gr.w $a0, $vr0, 1
35; CHECK-NEXT:    st.w $a0, $a1, 0
36; CHECK-NEXT:    ret
37  %v = load volatile <4 x i32>, ptr %src
38  %e = extractelement <4 x i32> %v, i32 1
39  store i32 %e, ptr %dst
40  ret void
41}
42
43define void @extract_2xi64(ptr %src, ptr %dst) nounwind {
44; CHECK-LABEL: extract_2xi64:
45; CHECK:       # %bb.0:
46; CHECK-NEXT:    vld $vr0, $a0, 0
47; CHECK-NEXT:    vpickve2gr.d $a0, $vr0, 1
48; CHECK-NEXT:    st.d $a0, $a1, 0
49; CHECK-NEXT:    ret
50  %v = load volatile <2 x i64>, ptr %src
51  %e = extractelement <2 x i64> %v, i32 1
52  store i64 %e, ptr %dst
53  ret void
54}
55
56define void @extract_4xfloat(ptr %src, ptr %dst) nounwind {
57; CHECK-LABEL: extract_4xfloat:
58; CHECK:       # %bb.0:
59; CHECK-NEXT:    vld $vr0, $a0, 0
60; CHECK-NEXT:    vreplvei.w $vr0, $vr0, 1
61; CHECK-NEXT:    fst.s $fa0, $a1, 0
62; CHECK-NEXT:    ret
63  %v = load volatile <4 x float>, ptr %src
64  %e = extractelement <4 x float> %v, i32 1
65  store float %e, ptr %dst
66  ret void
67}
68
69define void @extract_2xdouble(ptr %src, ptr %dst) nounwind {
70; CHECK-LABEL: extract_2xdouble:
71; CHECK:       # %bb.0:
72; CHECK-NEXT:    vld $vr0, $a0, 0
73; CHECK-NEXT:    vreplvei.d $vr0, $vr0, 1
74; CHECK-NEXT:    fst.d $fa0, $a1, 0
75; CHECK-NEXT:    ret
76  %v = load volatile <2 x double>, ptr %src
77  %e = extractelement <2 x double> %v, i32 1
78  store double %e, ptr %dst
79  ret void
80}
81
82define void @extract_16xi8_idx(ptr %src, ptr %dst, i32 %idx) nounwind {
83; CHECK-LABEL: extract_16xi8_idx:
84; CHECK:       # %bb.0:
85; CHECK-NEXT:    vld $vr0, $a0, 0
86; CHECK-NEXT:    bstrpick.d $a0, $a2, 31, 0
87; CHECK-NEXT:    vreplve.b $vr0, $vr0, $a0
88; CHECK-NEXT:    movfr2gr.s $a0, $fa0
89; CHECK-NEXT:    srai.w $a0, $a0, 24
90; CHECK-NEXT:    st.b $a0, $a1, 0
91; CHECK-NEXT:    ret
92  %v = load volatile <16 x i8>, ptr %src
93  %e = extractelement <16 x i8> %v, i32 %idx
94  store i8 %e, ptr %dst
95  ret void
96}
97
98define void @extract_8xi16_idx(ptr %src, ptr %dst, i32 %idx) nounwind {
99; CHECK-LABEL: extract_8xi16_idx:
100; CHECK:       # %bb.0:
101; CHECK-NEXT:    vld $vr0, $a0, 0
102; CHECK-NEXT:    bstrpick.d $a0, $a2, 31, 0
103; CHECK-NEXT:    vreplve.h $vr0, $vr0, $a0
104; CHECK-NEXT:    movfr2gr.s $a0, $fa0
105; CHECK-NEXT:    srai.w $a0, $a0, 16
106; CHECK-NEXT:    st.h $a0, $a1, 0
107; CHECK-NEXT:    ret
108  %v = load volatile <8 x i16>, ptr %src
109  %e = extractelement <8 x i16> %v, i32 %idx
110  store i16 %e, ptr %dst
111  ret void
112}
113
114define void @extract_4xi32_idx(ptr %src, ptr %dst, i32 %idx) nounwind {
115; CHECK-LABEL: extract_4xi32_idx:
116; CHECK:       # %bb.0:
117; CHECK-NEXT:    vld $vr0, $a0, 0
118; CHECK-NEXT:    bstrpick.d $a0, $a2, 31, 0
119; CHECK-NEXT:    vreplve.w $vr0, $vr0, $a0
120; CHECK-NEXT:    movfr2gr.s $a0, $fa0
121; CHECK-NEXT:    st.w $a0, $a1, 0
122; CHECK-NEXT:    ret
123  %v = load volatile <4 x i32>, ptr %src
124  %e = extractelement <4 x i32> %v, i32 %idx
125  store i32 %e, ptr %dst
126  ret void
127}
128
129define void @extract_2xi64_idx(ptr %src, ptr %dst, i32 %idx) nounwind {
130; CHECK-LABEL: extract_2xi64_idx:
131; CHECK:       # %bb.0:
132; CHECK-NEXT:    vld $vr0, $a0, 0
133; CHECK-NEXT:    bstrpick.d $a0, $a2, 31, 0
134; CHECK-NEXT:    vreplve.d $vr0, $vr0, $a0
135; CHECK-NEXT:    movfr2gr.d $a0, $fa0
136; CHECK-NEXT:    st.d $a0, $a1, 0
137; CHECK-NEXT:    ret
138  %v = load volatile <2 x i64>, ptr %src
139  %e = extractelement <2 x i64> %v, i32 %idx
140  store i64 %e, ptr %dst
141  ret void
142}
143
144define void @extract_4xfloat_idx(ptr %src, ptr %dst, i32 %idx) nounwind {
145; CHECK-LABEL: extract_4xfloat_idx:
146; CHECK:       # %bb.0:
147; CHECK-NEXT:    vld $vr0, $a0, 0
148; CHECK-NEXT:    bstrpick.d $a0, $a2, 31, 0
149; CHECK-NEXT:    vreplve.w $vr0, $vr0, $a0
150; CHECK-NEXT:    fst.s $fa0, $a1, 0
151; CHECK-NEXT:    ret
152  %v = load volatile <4 x float>, ptr %src
153  %e = extractelement <4 x float> %v, i32 %idx
154  store float %e, ptr %dst
155  ret void
156}
157
158define void @extract_2xdouble_idx(ptr %src, ptr %dst, i32 %idx) nounwind {
159; CHECK-LABEL: extract_2xdouble_idx:
160; CHECK:       # %bb.0:
161; CHECK-NEXT:    vld $vr0, $a0, 0
162; CHECK-NEXT:    bstrpick.d $a0, $a2, 31, 0
163; CHECK-NEXT:    vreplve.d $vr0, $vr0, $a0
164; CHECK-NEXT:    fst.d $fa0, $a1, 0
165; CHECK-NEXT:    ret
166  %v = load volatile <2 x double>, ptr %src
167  %e = extractelement <2 x double> %v, i32 %idx
168  store double %e, ptr %dst
169  ret void
170}
171