@@ -76,21 +76,14 @@ define void @extract_4xdouble(ptr %src, ptr %dst) nounwind {
76
76
define void @extract_32xi8_idx (ptr %src , ptr %dst , i32 %idx ) nounwind {
77
77
; CHECK-LABEL: extract_32xi8_idx:
78
78
; 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
84
79
; 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
94
87
; CHECK-NEXT: ret
95
88
%v = load volatile <32 x i8 >, ptr %src
96
89
%e = extractelement <32 x i8 > %v , i32 %idx
@@ -101,21 +94,14 @@ define void @extract_32xi8_idx(ptr %src, ptr %dst, i32 %idx) nounwind {
101
94
define void @extract_16xi16_idx (ptr %src , ptr %dst , i32 %idx ) nounwind {
102
95
; CHECK-LABEL: extract_16xi16_idx:
103
96
; 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
109
97
; 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
119
105
; CHECK-NEXT: ret
120
106
%v = load volatile <16 x i16 >, ptr %src
121
107
%e = extractelement <16 x i16 > %v , i32 %idx
@@ -141,21 +127,15 @@ define void @extract_8xi32_idx(ptr %src, ptr %dst, i32 %idx) nounwind {
141
127
define void @extract_4xi64_idx (ptr %src , ptr %dst , i32 %idx ) nounwind {
142
128
; CHECK-LABEL: extract_4xi64_idx:
143
129
; 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
149
130
; 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
159
139
; CHECK-NEXT: ret
160
140
%v = load volatile <4 x i64 >, ptr %src
161
141
%e = extractelement <4 x i64 > %v , i32 %idx
@@ -181,21 +161,15 @@ define void @extract_8xfloat_idx(ptr %src, ptr %dst, i32 %idx) nounwind {
181
161
define void @extract_4xdouble_idx (ptr %src , ptr %dst , i32 %idx ) nounwind {
182
162
; CHECK-LABEL: extract_4xdouble_idx:
183
163
; 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
189
164
; 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
199
173
; CHECK-NEXT: ret
200
174
%v = load volatile <4 x double >, ptr %src
201
175
%e = extractelement <4 x double > %v , i32 %idx
0 commit comments