Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / LoongArch / lsx / ir-instruction / extractelement.ll
blobf3b8e02ac28f744db6ebb42643f9f7195630ee6e
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
4 define 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
17 define 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
30 define 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
43 define 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
56 define 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
69 define 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
82 define 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
98 define 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
114 define 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
129 define 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
144 define 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
158 define 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