@@ -171,27 +171,6 @@ macro validate_simd_type($fx:ident, $intrinsic:ident, $span:ident, $ty:expr) {
171171 }
172172}
173173
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-
195174pub ( crate ) fn clif_vector_type < ' tcx > ( tcx: TyCtxt < ' tcx > , layout: TyAndLayout < ' tcx > ) -> Option < Type > {
196175 let ( element, count) = match & layout. abi {
197176 Abi : : Vector { element, count } => ( element. clone( ) , * count) ,
@@ -218,8 +197,10 @@ fn simd_for_each_lane<'tcx, M: Module>(
218197) {
219198 let layout = val. layout( ) ;
220199
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) ;
223204 assert_eq ! ( lane_count, ret_lane_count) ;
224205
225206 for lane_idx in 0 ..lane_count {
@@ -248,8 +229,10 @@ fn simd_pair_for_each_lane<'tcx, M: Module>(
248229 assert_eq ! ( x. layout( ) , y. layout( ) ) ;
249230 let layout = x. layout( ) ;
250231
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) ;
253236 assert_eq ! ( lane_count, ret_lane_count) ;
254237
255238 for lane in 0 ..lane_count {
@@ -269,13 +252,14 @@ fn simd_reduce<'tcx, M: Module>(
269252 ret: CPlace < ' tcx > ,
270253 f: impl Fn ( & mut FunctionCx < ' _ , ' tcx , M > , TyAndLayout < ' tcx > , Value , Value ) -> Value ,
271254) {
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) ;
273257 assert_eq ! ( lane_layout, ret. layout( ) ) ;
274258
275259 let mut res_val = val. value_field( fx, mir:: Field :: new( 0 ) ) . load_scalar( fx) ;
276260 for lane_idx in 1 ..lane_count {
277261 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 ( ) ) )
279263 . load_scalar( fx) ;
280264 res_val = f( fx, lane_layout, res_val, lane) ;
281265 }
@@ -289,14 +273,14 @@ fn simd_reduce_bool<'tcx, M: Module>(
289273 ret: CPlace < ' tcx > ,
290274 f: impl Fn ( & mut FunctionCx < ' _ , ' tcx , M > , Value , Value ) -> Value ,
291275) {
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 ) ;
293277 assert ! ( ret. layout( ) . ty. is_bool( ) ) ;
294278
295279 let res_val = val. value_field( fx, mir:: Field :: new( 0 ) ) . load_scalar( fx) ;
296280 let mut res_val = fx. bcx. ins( ) . band_imm( res_val, 1 ) ; // mask to boolean
297281 for lane_idx in 1 ..lane_count {
298282 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 ( ) ) )
300284 . load_scalar( fx) ;
301285 let lane = fx. bcx. ins( ) . band_imm( lane, 1 ) ; // mask to boolean
302286 res_val = f( fx, res_val, lane) ;
0 commit comments