@@ -76,21 +76,14 @@ define void @extract_4xdouble(ptr %src, ptr %dst) nounwind {
7676define void @extract_32xi8_idx (ptr %src , ptr %dst , i32 %idx ) nounwind {
7777; CHECK-LABEL: extract_32xi8_idx:
7878; CHECK: # %bb.0:
79- ; CHECK-NEXT: addi.d $sp, $sp, -96
80- ; CHECK-NEXT: st.d $ra, $sp, 88 # 8-byte Folded Spill
81- ; CHECK-NEXT: st.d $fp, $sp, 80 # 8-byte Folded Spill
82- ; CHECK-NEXT: addi.d $fp, $sp, 96
83- ; CHECK-NEXT: bstrins.d $sp, $zero, 4, 0
8479; CHECK-NEXT: xvld $xr0, $a0, 0
85- ; CHECK-NEXT: xvst $xr0, $sp, 32
86- ; CHECK-NEXT: addi.d $a0, $sp, 32
87- ; CHECK-NEXT: bstrins.d $a0, $a2, 4, 0
88- ; CHECK-NEXT: ld.b $a0, $a0, 0
89- ; CHECK-NEXT: st.b $a0, $a1, 0
90- ; CHECK-NEXT: addi.d $sp, $fp, -96
91- ; CHECK-NEXT: ld.d $fp, $sp, 80 # 8-byte Folded Reload
92- ; CHECK-NEXT: ld.d $ra, $sp, 88 # 8-byte Folded Reload
93- ; CHECK-NEXT: addi.d $sp, $sp, 96
80+ ; CHECK-NEXT: bstrpick.d $a0, $a2, 31, 0
81+ ; CHECK-NEXT: bstrpick.d $a0, $a0, 31, 2
82+ ; CHECK-NEXT: xvreplgr2vr.w $xr1, $a0
83+ ; CHECK-NEXT: xvperm.w $xr0, $xr0, $xr1
84+ ; CHECK-NEXT: andi $a0, $a2, 3
85+ ; CHECK-NEXT: xvreplve.b $xr0, $xr0, $a0
86+ ; CHECK-NEXT: xvstelm.b $xr0, $a1, 0, 0
9487; CHECK-NEXT: ret
9588 %v = load volatile <32 x i8 >, ptr %src
9689 %e = extractelement <32 x i8 > %v , i32 %idx
@@ -101,21 +94,14 @@ define void @extract_32xi8_idx(ptr %src, ptr %dst, i32 %idx) nounwind {
10194define void @extract_16xi16_idx (ptr %src , ptr %dst , i32 %idx ) nounwind {
10295; CHECK-LABEL: extract_16xi16_idx:
10396; CHECK: # %bb.0:
104- ; CHECK-NEXT: addi.d $sp, $sp, -96
105- ; CHECK-NEXT: st.d $ra, $sp, 88 # 8-byte Folded Spill
106- ; CHECK-NEXT: st.d $fp, $sp, 80 # 8-byte Folded Spill
107- ; CHECK-NEXT: addi.d $fp, $sp, 96
108- ; CHECK-NEXT: bstrins.d $sp, $zero, 4, 0
10997; CHECK-NEXT: xvld $xr0, $a0, 0
110- ; CHECK-NEXT: xvst $xr0, $sp, 32
111- ; CHECK-NEXT: addi.d $a0, $sp, 32
112- ; CHECK-NEXT: bstrins.d $a0, $a2, 4, 1
113- ; CHECK-NEXT: ld.h $a0, $a0, 0
114- ; CHECK-NEXT: st.h $a0, $a1, 0
115- ; CHECK-NEXT: addi.d $sp, $fp, -96
116- ; CHECK-NEXT: ld.d $fp, $sp, 80 # 8-byte Folded Reload
117- ; CHECK-NEXT: ld.d $ra, $sp, 88 # 8-byte Folded Reload
118- ; CHECK-NEXT: addi.d $sp, $sp, 96
98+ ; CHECK-NEXT: bstrpick.d $a0, $a2, 31, 0
99+ ; CHECK-NEXT: bstrpick.d $a0, $a0, 31, 1
100+ ; CHECK-NEXT: xvreplgr2vr.w $xr1, $a0
101+ ; CHECK-NEXT: xvperm.w $xr0, $xr0, $xr1
102+ ; CHECK-NEXT: andi $a0, $a2, 1
103+ ; CHECK-NEXT: xvreplve.h $xr0, $xr0, $a0
104+ ; CHECK-NEXT: xvstelm.h $xr0, $a1, 0, 0
119105; CHECK-NEXT: ret
120106 %v = load volatile <16 x i16 >, ptr %src
121107 %e = extractelement <16 x i16 > %v , i32 %idx
@@ -141,21 +127,15 @@ define void @extract_8xi32_idx(ptr %src, ptr %dst, i32 %idx) nounwind {
141127define void @extract_4xi64_idx (ptr %src , ptr %dst , i32 %idx ) nounwind {
142128; CHECK-LABEL: extract_4xi64_idx:
143129; CHECK: # %bb.0:
144- ; CHECK-NEXT: addi.d $sp, $sp, -96
145- ; CHECK-NEXT: st.d $ra, $sp, 88 # 8-byte Folded Spill
146- ; CHECK-NEXT: st.d $fp, $sp, 80 # 8-byte Folded Spill
147- ; CHECK-NEXT: addi.d $fp, $sp, 96
148- ; CHECK-NEXT: bstrins.d $sp, $zero, 4, 0
149130; CHECK-NEXT: xvld $xr0, $a0, 0
150- ; CHECK-NEXT: xvst $xr0, $sp, 32
151- ; CHECK-NEXT: addi.d $a0, $sp, 32
152- ; CHECK-NEXT: bstrins.d $a0, $a2, 4, 3
153- ; CHECK-NEXT: ld.d $a0, $a0, 0
154- ; CHECK-NEXT: st.d $a0, $a1, 0
155- ; CHECK-NEXT: addi.d $sp, $fp, -96
156- ; CHECK-NEXT: ld.d $fp, $sp, 80 # 8-byte Folded Reload
157- ; CHECK-NEXT: ld.d $ra, $sp, 88 # 8-byte Folded Reload
158- ; CHECK-NEXT: addi.d $sp, $sp, 96
131+ ; CHECK-NEXT: bstrpick.d $a0, $a2, 31, 0
132+ ; CHECK-NEXT: xvreplgr2vr.w $xr1, $a0
133+ ; CHECK-NEXT: xvslli.w $xr1, $xr1, 1
134+ ; CHECK-NEXT: xvperm.w $xr2, $xr0, $xr1
135+ ; CHECK-NEXT: xvaddi.wu $xr1, $xr1, 1
136+ ; CHECK-NEXT: xvperm.w $xr0, $xr0, $xr1
137+ ; CHECK-NEXT: xvilvl.w $xr0, $xr0, $xr2
138+ ; CHECK-NEXT: xvstelm.d $xr0, $a1, 0, 0
159139; CHECK-NEXT: ret
160140 %v = load volatile <4 x i64 >, ptr %src
161141 %e = extractelement <4 x i64 > %v , i32 %idx
@@ -181,21 +161,15 @@ define void @extract_8xfloat_idx(ptr %src, ptr %dst, i32 %idx) nounwind {
181161define void @extract_4xdouble_idx (ptr %src , ptr %dst , i32 %idx ) nounwind {
182162; CHECK-LABEL: extract_4xdouble_idx:
183163; CHECK: # %bb.0:
184- ; CHECK-NEXT: addi.d $sp, $sp, -96
185- ; CHECK-NEXT: st.d $ra, $sp, 88 # 8-byte Folded Spill
186- ; CHECK-NEXT: st.d $fp, $sp, 80 # 8-byte Folded Spill
187- ; CHECK-NEXT: addi.d $fp, $sp, 96
188- ; CHECK-NEXT: bstrins.d $sp, $zero, 4, 0
189164; CHECK-NEXT: xvld $xr0, $a0, 0
190- ; CHECK-NEXT: xvst $xr0, $sp, 32
191- ; CHECK-NEXT: addi.d $a0, $sp, 32
192- ; CHECK-NEXT: bstrins.d $a0, $a2, 4, 3
193- ; CHECK-NEXT: fld.d $fa0, $a0, 0
194- ; CHECK-NEXT: fst.d $fa0, $a1, 0
195- ; CHECK-NEXT: addi.d $sp, $fp, -96
196- ; CHECK-NEXT: ld.d $fp, $sp, 80 # 8-byte Folded Reload
197- ; CHECK-NEXT: ld.d $ra, $sp, 88 # 8-byte Folded Reload
198- ; CHECK-NEXT: addi.d $sp, $sp, 96
165+ ; CHECK-NEXT: bstrpick.d $a0, $a2, 31, 0
166+ ; CHECK-NEXT: xvreplgr2vr.w $xr1, $a0
167+ ; CHECK-NEXT: xvslli.w $xr1, $xr1, 1
168+ ; CHECK-NEXT: xvperm.w $xr2, $xr0, $xr1
169+ ; CHECK-NEXT: xvaddi.wu $xr1, $xr1, 1
170+ ; CHECK-NEXT: xvperm.w $xr0, $xr0, $xr1
171+ ; CHECK-NEXT: xvilvl.w $xr0, $xr0, $xr2
172+ ; CHECK-NEXT: xvstelm.d $xr0, $a1, 0, 0
199173; CHECK-NEXT: ret
200174 %v = load volatile <4 x double >, ptr %src
201175 %e = extractelement <4 x double > %v , i32 %idx
0 commit comments