@@ -171,27 +171,6 @@ macro validate_simd_type($fx:ident, $intrinsic:ident, $span:ident, $ty:expr) {
171
171
}
172
172
}
173
173
174
- fn lane_type_and_count < ' tcx > (
175
- tcx: TyCtxt < ' tcx > ,
176
- layout: TyAndLayout < ' tcx > ,
177
- ) -> ( TyAndLayout < ' tcx > , u16) {
178
- assert ! ( layout. ty. is_simd( ) ) ;
179
- let lane_count = match layout. fields {
180
- rustc_target : : abi:: FieldsShape :: Array { stride : _, count } => u16:: try_from( count) . unwrap( ) ,
181
- _ => unreachable!( "lane_type_and_count({:?})" , layout) ,
182
- } ;
183
- let lane_layout = layout
184
- . field(
185
- & ty:: layout:: LayoutCx {
186
- tcx,
187
- param_env : ParamEnv :: reveal_all( ) ,
188
- } ,
189
- 0 ,
190
- )
191
- . unwrap( ) ;
192
- ( lane_layout, lane_count)
193
- }
194
-
195
174
pub ( crate ) fn clif_vector_type < ' tcx > ( tcx: TyCtxt < ' tcx > , layout: TyAndLayout < ' tcx > ) -> Option < Type > {
196
175
let ( element, count) = match & layout. abi {
197
176
Abi : : Vector { element, count } => ( element. clone( ) , * count) ,
@@ -218,8 +197,10 @@ fn simd_for_each_lane<'tcx, M: Module>(
218
197
) {
219
198
let layout = val. layout( ) ;
220
199
221
- let ( lane_layout, lane_count) = lane_type_and_count( fx. tcx, layout) ;
222
- let ( ret_lane_layout, ret_lane_count) = lane_type_and_count( fx. tcx, ret. layout( ) ) ;
200
+ let ( lane_count, lane_ty) = layout. ty. simd_size_and_type( fx. tcx) ;
201
+ let lane_layout = fx. layout_of( lane_ty) ;
202
+ let ( ret_lane_count, ret_lane_ty) = ret. layout( ) . ty. simd_size_and_type( fx. tcx) ;
203
+ let ret_lane_layout = fx. layout_of( ret_lane_ty) ;
223
204
assert_eq ! ( lane_count, ret_lane_count) ;
224
205
225
206
for lane_idx in 0 ..lane_count {
@@ -248,8 +229,10 @@ fn simd_pair_for_each_lane<'tcx, M: Module>(
248
229
assert_eq ! ( x. layout( ) , y. layout( ) ) ;
249
230
let layout = x. layout( ) ;
250
231
251
- let ( lane_layout, lane_count) = lane_type_and_count( fx. tcx, layout) ;
252
- let ( ret_lane_layout, ret_lane_count) = lane_type_and_count( fx. tcx, ret. layout( ) ) ;
232
+ let ( lane_count, lane_ty) = layout. ty. simd_size_and_type( fx. tcx) ;
233
+ let lane_layout = fx. layout_of( lane_ty) ;
234
+ let ( ret_lane_count, ret_lane_ty) = ret. layout( ) . ty. simd_size_and_type( fx. tcx) ;
235
+ let ret_lane_layout = fx. layout_of( ret_lane_ty) ;
253
236
assert_eq ! ( lane_count, ret_lane_count) ;
254
237
255
238
for lane in 0 ..lane_count {
@@ -269,13 +252,14 @@ fn simd_reduce<'tcx, M: Module>(
269
252
ret: CPlace < ' tcx > ,
270
253
f: impl Fn ( & mut FunctionCx < ' _ , ' tcx , M > , TyAndLayout < ' tcx > , Value , Value ) -> Value ,
271
254
) {
272
- let ( lane_layout, lane_count) = lane_type_and_count( fx. tcx, val. layout( ) ) ;
255
+ let ( lane_count, lane_ty) = val. layout( ) . ty. simd_size_and_type( fx. tcx) ;
256
+ let lane_layout = fx. layout_of( lane_ty) ;
273
257
assert_eq ! ( lane_layout, ret. layout( ) ) ;
274
258
275
259
let mut res_val = val. value_field( fx, mir:: Field :: new( 0 ) ) . load_scalar( fx) ;
276
260
for lane_idx in 1 ..lane_count {
277
261
let lane = val
278
- . value_field( fx, mir:: Field :: new( lane_idx. into ( ) ) )
262
+ . value_field( fx, mir:: Field :: new( lane_idx. try_into ( ) . unwrap ( ) ) )
279
263
. load_scalar( fx) ;
280
264
res_val = f( fx, lane_layout, res_val, lane) ;
281
265
}
@@ -289,14 +273,14 @@ fn simd_reduce_bool<'tcx, M: Module>(
289
273
ret: CPlace < ' tcx > ,
290
274
f: impl Fn ( & mut FunctionCx < ' _ , ' tcx , M > , Value , Value ) -> Value ,
291
275
) {
292
- let ( _lane_layout , lane_count ) = lane_type_and_count ( fx . tcx , val. layout( ) ) ;
276
+ let ( lane_count , _lane_ty ) = val. layout( ) . ty . simd_size_and_type ( fx . tcx ) ;
293
277
assert ! ( ret. layout( ) . ty. is_bool( ) ) ;
294
278
295
279
let res_val = val. value_field( fx, mir:: Field :: new( 0 ) ) . load_scalar( fx) ;
296
280
let mut res_val = fx. bcx. ins( ) . band_imm( res_val, 1 ) ; // mask to boolean
297
281
for lane_idx in 1 ..lane_count {
298
282
let lane = val
299
- . value_field( fx, mir:: Field :: new( lane_idx. into ( ) ) )
283
+ . value_field( fx, mir:: Field :: new( lane_idx. try_into ( ) . unwrap ( ) ) )
300
284
. load_scalar( fx) ;
301
285
let lane = fx. bcx. ins( ) . band_imm( lane, 1 ) ; // mask to boolean
302
286
res_val = f( fx, res_val, lane) ;
0 commit comments