@@ -23,7 +23,7 @@ use rustc_codegen_ssa::traits::{
2323use rustc_middle:: bug;
2424#[ cfg( feature = "master" ) ]
2525use rustc_middle:: ty:: layout:: FnAbiOf ;
26- use rustc_middle:: ty:: layout:: { HasTypingEnv , LayoutOf } ;
26+ use rustc_middle:: ty:: layout:: LayoutOf ;
2727use rustc_middle:: ty:: { self , Instance , Ty } ;
2828use rustc_span:: { Span , Symbol , sym} ;
2929use rustc_target:: callconv:: { ArgAbi , PassMode } ;
@@ -205,21 +205,10 @@ impl<'a, 'gcc, 'tcx> IntrinsicCallBuilderMethods<'tcx> for Builder<'a, 'gcc, 'tc
205205 span : Span ,
206206 ) -> Result < ( ) , Instance < ' tcx > > {
207207 let tcx = self . tcx ;
208- let callee_ty = instance. ty ( tcx, self . typing_env ( ) ) ;
209208
210- let ( def_id, fn_args) = match * callee_ty. kind ( ) {
211- ty:: FnDef ( def_id, fn_args) => ( def_id, fn_args) ,
212- _ => bug ! ( "expected fn item type, found {}" , callee_ty) ,
213- } ;
214-
215- let sig = callee_ty. fn_sig ( tcx) ;
216- let sig = tcx. normalize_erasing_late_bound_regions ( self . typing_env ( ) , sig) ;
217- let arg_tys = sig. inputs ( ) ;
218- let ret_ty = sig. output ( ) ;
219- let name = tcx. item_name ( def_id) ;
209+ let name = tcx. item_name ( instance. def_id ( ) ) ;
220210 let name_str = name. as_str ( ) ;
221-
222- let llret_ty = self . layout_of ( ret_ty) . gcc_type ( self ) ;
211+ let fn_args = instance. args ;
223212
224213 let simple = get_simple_intrinsic ( self , name) ;
225214 let simple_func = get_simple_function ( self , name) ;
@@ -320,8 +309,7 @@ impl<'a, 'gcc, 'tcx> IntrinsicCallBuilderMethods<'tcx> for Builder<'a, 'gcc, 'tc
320309 | sym:: rotate_right
321310 | sym:: saturating_add
322311 | sym:: saturating_sub => {
323- let ty = arg_tys[ 0 ] ;
324- match int_type_width_signed ( ty, self ) {
312+ match int_type_width_signed ( args[ 0 ] . layout . ty , self ) {
325313 Some ( ( width, signed) ) => match name {
326314 sym:: ctlz | sym:: cttz => {
327315 let func = self . current_func . borrow ( ) . expect ( "func" ) ;
@@ -400,7 +388,7 @@ impl<'a, 'gcc, 'tcx> IntrinsicCallBuilderMethods<'tcx> for Builder<'a, 'gcc, 'tc
400388 tcx. dcx ( ) . emit_err ( InvalidMonomorphization :: BasicIntegerType {
401389 span,
402390 name,
403- ty,
391+ ty : args [ 0 ] . layout . ty ,
404392 } ) ;
405393 return Ok ( ( ) ) ;
406394 }
@@ -492,7 +480,14 @@ impl<'a, 'gcc, 'tcx> IntrinsicCallBuilderMethods<'tcx> for Builder<'a, 'gcc, 'tc
492480 }
493481
494482 _ if name_str. starts_with ( "simd_" ) => {
495- match generic_simd_intrinsic ( self , name, callee_ty, args, ret_ty, llret_ty, span) {
483+ match generic_simd_intrinsic (
484+ self ,
485+ name,
486+ args,
487+ result. layout . ty ,
488+ result. layout . gcc_type ( self ) ,
489+ span,
490+ ) {
496491 Ok ( value) => value,
497492 Err ( ( ) ) => return Ok ( ( ) ) ,
498493 }
@@ -503,13 +498,10 @@ impl<'a, 'gcc, 'tcx> IntrinsicCallBuilderMethods<'tcx> for Builder<'a, 'gcc, 'tc
503498 } ;
504499
505500 if result. layout . ty . is_bool ( ) {
506- OperandRef :: from_immediate_or_packed_pair ( self , value, result. layout )
507- . val
508- . store ( self , result) ;
501+ let val = self . from_immediate ( value) ;
502+ self . store_to_place ( val, result. val ) ;
509503 } else if !result. layout . ty . is_unit ( ) {
510- let ptr_llty = self . type_ptr_to ( result. layout . gcc_type ( self ) ) ;
511- let ptr = self . pointercast ( result. val . llval , ptr_llty) ;
512- self . store ( value, ptr, result. val . align ) ;
504+ self . store_to_place ( value, result. val ) ;
513505 }
514506 Ok ( ( ) )
515507 }
0 commit comments