@@ -510,6 +510,77 @@ pub fn check_intrinsic_type(
510
510
511
511
sym:: debug_assertions => ( 0 , 1 , Vec :: new ( ) , tcx. types . bool ) ,
512
512
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
+
513
584
other => {
514
585
tcx. dcx ( ) . emit_err ( UnrecognizedIntrinsicFunction { span, name : other } ) ;
515
586
return ;
@@ -521,102 +592,3 @@ pub fn check_intrinsic_type(
521
592
let sig = ty:: Binder :: bind_with_vars ( sig, bound_vars) ;
522
593
equate_intrinsic_type ( tcx, span, intrinsic_id, n_tps, n_lts, n_cts, sig)
523
594
}
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