@@ -510,6 +510,77 @@ pub fn check_intrinsic_type(
510510
511511 sym:: debug_assertions => ( 0 , 1 , Vec :: new ( ) , tcx. types . bool ) ,
512512
513+ sym:: simd_eq
514+ | sym:: simd_ne
515+ | sym:: simd_lt
516+ | sym:: simd_le
517+ | sym:: simd_gt
518+ | sym:: simd_ge => ( 2 , 0 , vec ! [ param( 0 ) , param( 0 ) ] , param ( 1 ) ) ,
519+ sym:: simd_add
520+ | sym:: simd_sub
521+ | sym:: simd_mul
522+ | sym:: simd_rem
523+ | sym:: simd_div
524+ | sym:: simd_shl
525+ | sym:: simd_shr
526+ | sym:: simd_and
527+ | sym:: simd_or
528+ | sym:: simd_xor
529+ | sym:: simd_fmin
530+ | sym:: simd_fmax
531+ | sym:: simd_fpow
532+ | sym:: simd_saturating_add
533+ | sym:: simd_saturating_sub => ( 1 , 0 , vec ! [ param( 0 ) , param( 0 ) ] , param ( 0 ) ) ,
534+ sym:: simd_arith_offset => ( 2 , 0 , vec ! [ param( 0 ) , param( 1 ) ] , param ( 0 ) ) ,
535+ sym:: simd_neg
536+ | sym:: simd_bswap
537+ | sym:: simd_bitreverse
538+ | sym:: simd_ctlz
539+ | sym:: simd_cttz
540+ | sym:: simd_fsqrt
541+ | sym:: simd_fsin
542+ | sym:: simd_fcos
543+ | sym:: simd_fexp
544+ | sym:: simd_fexp2
545+ | sym:: simd_flog2
546+ | sym:: simd_flog10
547+ | sym:: simd_flog
548+ | sym:: simd_fabs
549+ | sym:: simd_ceil
550+ | sym:: simd_floor
551+ | sym:: simd_round
552+ | sym:: simd_trunc => ( 1 , 0 , vec ! [ param( 0 ) ] , param ( 0 ) ) ,
553+ sym:: simd_fpowi => ( 1 , 0 , vec ! [ param( 0 ) , tcx. types. i32 ] , param ( 0 ) ) ,
554+ sym:: simd_fma => ( 1 , 0 , vec ! [ param( 0 ) , param( 0 ) , param( 0 ) ] , param ( 0 ) ) ,
555+ sym:: simd_gather => ( 3 , 0 , vec ! [ param( 0 ) , param( 1 ) , param( 2 ) ] , param ( 0 ) ) ,
556+ sym:: simd_masked_load => ( 3 , 0 , vec ! [ param( 0 ) , param( 1 ) , param( 2 ) ] , param ( 2 ) ) ,
557+ sym:: simd_masked_store => ( 3 , 0 , vec ! [ param( 0 ) , param( 1 ) , param( 2 ) ] , Ty :: new_unit ( tcx) ) ,
558+ sym:: simd_scatter => ( 3 , 0 , vec ! [ param( 0 ) , param( 1 ) , param( 2 ) ] , Ty :: new_unit ( tcx) ) ,
559+ sym:: simd_insert => ( 2 , 0 , vec ! [ param( 0 ) , tcx. types. u32 , param( 1 ) ] , param ( 0 ) ) ,
560+ sym:: simd_extract => ( 2 , 0 , vec ! [ param( 0 ) , tcx. types. u32 ] , param ( 1 ) ) ,
561+ sym:: simd_cast
562+ | sym:: simd_as
563+ | sym:: simd_cast_ptr
564+ | sym:: simd_expose_addr
565+ | sym:: simd_from_exposed_addr => ( 2 , 0 , vec ! [ param( 0 ) ] , param ( 1 ) ) ,
566+ sym:: simd_bitmask => ( 2 , 0 , vec ! [ param( 0 ) ] , param ( 1 ) ) ,
567+ sym:: simd_select | sym:: simd_select_bitmask => {
568+ ( 2 , 0 , vec ! [ param( 0 ) , param( 1 ) , param( 1 ) ] , param ( 1 ) )
569+ }
570+ sym:: simd_reduce_all | sym:: simd_reduce_any => ( 1 , 0 , vec ! [ param( 0 ) ] , tcx. types . bool ) ,
571+ sym:: simd_reduce_add_ordered | sym:: simd_reduce_mul_ordered => {
572+ ( 2 , 0 , vec ! [ param( 0 ) , param( 1 ) ] , param ( 1 ) )
573+ }
574+ sym:: simd_reduce_add_unordered
575+ | sym:: simd_reduce_mul_unordered
576+ | sym:: simd_reduce_and
577+ | sym:: simd_reduce_or
578+ | sym:: simd_reduce_xor
579+ | sym:: simd_reduce_min
580+ | sym:: simd_reduce_max => ( 2 , 0 , vec ! [ param( 0 ) ] , param ( 1 ) ) ,
581+ sym:: simd_shuffle => ( 3 , 0 , vec ! [ param( 0 ) , param( 0 ) , param( 1 ) ] , param ( 2 ) ) ,
582+ sym:: simd_shuffle_generic => ( 2 , 1 , vec ! [ param( 0 ) , param( 0 ) ] , param ( 1 ) ) ,
583+
513584 other => {
514585 tcx. dcx ( ) . emit_err ( UnrecognizedIntrinsicFunction { span, name : other } ) ;
515586 return ;
@@ -521,102 +592,3 @@ pub fn check_intrinsic_type(
521592 let sig = ty:: Binder :: bind_with_vars ( sig, bound_vars) ;
522593 equate_intrinsic_type ( tcx, span, intrinsic_id, n_tps, n_lts, n_cts, sig)
523594}
524-
525- /// Type-check `extern "platform-intrinsic" { ... }` functions.
526- pub fn check_platform_intrinsic_type (
527- tcx : TyCtxt < ' _ > ,
528- intrinsic_id : LocalDefId ,
529- span : Span ,
530- name : Symbol ,
531- ) {
532- let generics = tcx. generics_of ( intrinsic_id) ;
533- let param = |n| {
534- if let Some ( & ty:: GenericParamDef {
535- name, kind : ty:: GenericParamDefKind :: Type { .. } , ..
536- } ) = generics. opt_param_at ( n as usize , tcx)
537- {
538- Ty :: new_param ( tcx, n, name)
539- } else {
540- Ty :: new_error_with_message ( tcx, span, "expected param" )
541- }
542- } ;
543-
544- let ( n_tps, n_cts, inputs, output) = match name {
545- sym:: simd_eq | sym:: simd_ne | sym:: simd_lt | sym:: simd_le | sym:: simd_gt | sym:: simd_ge => {
546- ( 2 , 0 , vec ! [ param( 0 ) , param( 0 ) ] , param ( 1 ) )
547- }
548- sym:: simd_add
549- | sym:: simd_sub
550- | sym:: simd_mul
551- | sym:: simd_rem
552- | sym:: simd_div
553- | sym:: simd_shl
554- | sym:: simd_shr
555- | sym:: simd_and
556- | sym:: simd_or
557- | sym:: simd_xor
558- | sym:: simd_fmin
559- | sym:: simd_fmax
560- | sym:: simd_fpow
561- | sym:: simd_saturating_add
562- | sym:: simd_saturating_sub => ( 1 , 0 , vec ! [ param( 0 ) , param( 0 ) ] , param ( 0 ) ) ,
563- sym:: simd_arith_offset => ( 2 , 0 , vec ! [ param( 0 ) , param( 1 ) ] , param ( 0 ) ) ,
564- sym:: simd_neg
565- | sym:: simd_bswap
566- | sym:: simd_bitreverse
567- | sym:: simd_ctlz
568- | sym:: simd_cttz
569- | sym:: simd_fsqrt
570- | sym:: simd_fsin
571- | sym:: simd_fcos
572- | sym:: simd_fexp
573- | sym:: simd_fexp2
574- | sym:: simd_flog2
575- | sym:: simd_flog10
576- | sym:: simd_flog
577- | sym:: simd_fabs
578- | sym:: simd_ceil
579- | sym:: simd_floor
580- | sym:: simd_round
581- | sym:: simd_trunc => ( 1 , 0 , vec ! [ param( 0 ) ] , param ( 0 ) ) ,
582- sym:: simd_fpowi => ( 1 , 0 , vec ! [ param( 0 ) , tcx. types. i32 ] , param ( 0 ) ) ,
583- sym:: simd_fma => ( 1 , 0 , vec ! [ param( 0 ) , param( 0 ) , param( 0 ) ] , param ( 0 ) ) ,
584- sym:: simd_gather => ( 3 , 0 , vec ! [ param( 0 ) , param( 1 ) , param( 2 ) ] , param ( 0 ) ) ,
585- sym:: simd_masked_load => ( 3 , 0 , vec ! [ param( 0 ) , param( 1 ) , param( 2 ) ] , param ( 2 ) ) ,
586- sym:: simd_masked_store => ( 3 , 0 , vec ! [ param( 0 ) , param( 1 ) , param( 2 ) ] , Ty :: new_unit ( tcx) ) ,
587- sym:: simd_scatter => ( 3 , 0 , vec ! [ param( 0 ) , param( 1 ) , param( 2 ) ] , Ty :: new_unit ( tcx) ) ,
588- sym:: simd_insert => ( 2 , 0 , vec ! [ param( 0 ) , tcx. types. u32 , param( 1 ) ] , param ( 0 ) ) ,
589- sym:: simd_extract => ( 2 , 0 , vec ! [ param( 0 ) , tcx. types. u32 ] , param ( 1 ) ) ,
590- sym:: simd_cast
591- | sym:: simd_as
592- | sym:: simd_cast_ptr
593- | sym:: simd_expose_addr
594- | sym:: simd_from_exposed_addr => ( 2 , 0 , vec ! [ param( 0 ) ] , param ( 1 ) ) ,
595- sym:: simd_bitmask => ( 2 , 0 , vec ! [ param( 0 ) ] , param ( 1 ) ) ,
596- sym:: simd_select | sym:: simd_select_bitmask => {
597- ( 2 , 0 , vec ! [ param( 0 ) , param( 1 ) , param( 1 ) ] , param ( 1 ) )
598- }
599- sym:: simd_reduce_all | sym:: simd_reduce_any => ( 1 , 0 , vec ! [ param( 0 ) ] , tcx. types . bool ) ,
600- sym:: simd_reduce_add_ordered | sym:: simd_reduce_mul_ordered => {
601- ( 2 , 0 , vec ! [ param( 0 ) , param( 1 ) ] , param ( 1 ) )
602- }
603- sym:: simd_reduce_add_unordered
604- | sym:: simd_reduce_mul_unordered
605- | sym:: simd_reduce_and
606- | sym:: simd_reduce_or
607- | sym:: simd_reduce_xor
608- | sym:: simd_reduce_min
609- | sym:: simd_reduce_max => ( 2 , 0 , vec ! [ param( 0 ) ] , param ( 1 ) ) ,
610- sym:: simd_shuffle => ( 3 , 0 , vec ! [ param( 0 ) , param( 0 ) , param( 1 ) ] , param ( 2 ) ) ,
611- sym:: simd_shuffle_generic => ( 2 , 1 , vec ! [ param( 0 ) , param( 0 ) ] , param ( 1 ) ) ,
612- _ => {
613- let msg = format ! ( "unrecognized platform-specific intrinsic function: `{name}`" ) ;
614- tcx. dcx ( ) . span_err ( span, msg) ;
615- return ;
616- }
617- } ;
618-
619- let sig = tcx. mk_fn_sig ( inputs, output, false , hir:: Unsafety :: Unsafe , Abi :: PlatformIntrinsic ) ;
620- let sig = ty:: Binder :: dummy ( sig) ;
621- equate_intrinsic_type ( tcx, span, intrinsic_id, n_tps, 0 , n_cts, sig)
622- }
0 commit comments