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