@@ -434,6 +434,141 @@ pub fn generic_simd_intrinsic<'a, 'gcc, 'tcx>(
434
434
return Ok ( bx. vector_select ( args[ 0 ] . immediate ( ) , args[ 1 ] . immediate ( ) , args[ 2 ] . immediate ( ) ) ) ;
435
435
}
436
436
437
+ if name == sym:: simd_cast_ptr {
438
+ require_simd ! ( ret_ty, InvalidMonomorphization :: SimdReturn { span, name, ty: ret_ty } ) ;
439
+ let ( out_len, out_elem) = ret_ty. simd_size_and_type ( bx. tcx ( ) ) ;
440
+
441
+ require ! (
442
+ in_len == out_len,
443
+ InvalidMonomorphization :: ReturnLengthInputType {
444
+ span,
445
+ name,
446
+ in_len,
447
+ in_ty,
448
+ ret_ty,
449
+ out_len
450
+ }
451
+ ) ;
452
+
453
+ match * in_elem. kind ( ) {
454
+ ty:: RawPtr ( p) => {
455
+ let metadata = p. ty . ptr_metadata_ty ( bx. tcx , |ty| {
456
+ bx. tcx . normalize_erasing_regions ( ty:: ParamEnv :: reveal_all ( ) , ty)
457
+ } ) ;
458
+ require ! (
459
+ metadata. is_unit( ) ,
460
+ InvalidMonomorphization :: CastFatPointer { span, name, ty: in_elem }
461
+ ) ;
462
+ }
463
+ _ => {
464
+ return_error ! ( InvalidMonomorphization :: ExpectedPointer { span, name, ty: in_elem } )
465
+ }
466
+ }
467
+ match * out_elem. kind ( ) {
468
+ ty:: RawPtr ( p) => {
469
+ let metadata = p. ty . ptr_metadata_ty ( bx. tcx , |ty| {
470
+ bx. tcx . normalize_erasing_regions ( ty:: ParamEnv :: reveal_all ( ) , ty)
471
+ } ) ;
472
+ require ! (
473
+ metadata. is_unit( ) ,
474
+ InvalidMonomorphization :: CastFatPointer { span, name, ty: out_elem }
475
+ ) ;
476
+ }
477
+ _ => {
478
+ return_error ! ( InvalidMonomorphization :: ExpectedPointer { span, name, ty: out_elem } )
479
+ }
480
+ }
481
+
482
+ let arg = args[ 0 ] . immediate ( ) ;
483
+ let elem_type = llret_ty. dyncast_vector ( ) . expect ( "vector return type" ) . get_element_type ( ) ;
484
+ let values: Vec < _ > = ( 0 ..in_len)
485
+ . map ( |i| {
486
+ let idx = bx. gcc_int ( bx. usize_type , i as _ ) ;
487
+ let value = bx. extract_element ( arg, idx) ;
488
+ bx. pointercast ( value, elem_type)
489
+ } )
490
+ . collect ( ) ;
491
+ return Ok ( bx. context . new_rvalue_from_vector ( bx. location , llret_ty, & values) ) ;
492
+ }
493
+
494
+ if name == sym:: simd_expose_addr {
495
+ require_simd ! ( ret_ty, InvalidMonomorphization :: SimdReturn { span, name, ty: ret_ty } ) ;
496
+ let ( out_len, out_elem) = ret_ty. simd_size_and_type ( bx. tcx ( ) ) ;
497
+
498
+ require ! (
499
+ in_len == out_len,
500
+ InvalidMonomorphization :: ReturnLengthInputType {
501
+ span,
502
+ name,
503
+ in_len,
504
+ in_ty,
505
+ ret_ty,
506
+ out_len
507
+ }
508
+ ) ;
509
+
510
+ match * in_elem. kind ( ) {
511
+ ty:: RawPtr ( _) => { }
512
+ _ => {
513
+ return_error ! ( InvalidMonomorphization :: ExpectedPointer { span, name, ty: in_elem } )
514
+ }
515
+ }
516
+ match * out_elem. kind ( ) {
517
+ ty:: Uint ( ty:: UintTy :: Usize ) => { }
518
+ _ => return_error ! ( InvalidMonomorphization :: ExpectedUsize { span, name, ty: out_elem } ) ,
519
+ }
520
+
521
+ let arg = args[ 0 ] . immediate ( ) ;
522
+ let elem_type = llret_ty. dyncast_vector ( ) . expect ( "vector return type" ) . get_element_type ( ) ;
523
+ let values: Vec < _ > = ( 0 ..in_len)
524
+ . map ( |i| {
525
+ let idx = bx. gcc_int ( bx. usize_type , i as _ ) ;
526
+ let value = bx. extract_element ( arg, idx) ;
527
+ bx. ptrtoint ( value, elem_type)
528
+ } )
529
+ . collect ( ) ;
530
+ return Ok ( bx. context . new_rvalue_from_vector ( bx. location , llret_ty, & values) ) ;
531
+ }
532
+
533
+ if name == sym:: simd_from_exposed_addr {
534
+ require_simd ! ( ret_ty, InvalidMonomorphization :: SimdReturn { span, name, ty: ret_ty } ) ;
535
+ let ( out_len, out_elem) = ret_ty. simd_size_and_type ( bx. tcx ( ) ) ;
536
+
537
+ require ! (
538
+ in_len == out_len,
539
+ InvalidMonomorphization :: ReturnLengthInputType {
540
+ span,
541
+ name,
542
+ in_len,
543
+ in_ty,
544
+ ret_ty,
545
+ out_len
546
+ }
547
+ ) ;
548
+
549
+ match * in_elem. kind ( ) {
550
+ ty:: Uint ( ty:: UintTy :: Usize ) => { }
551
+ _ => return_error ! ( InvalidMonomorphization :: ExpectedUsize { span, name, ty: in_elem } ) ,
552
+ }
553
+ match * out_elem. kind ( ) {
554
+ ty:: RawPtr ( _) => { }
555
+ _ => {
556
+ return_error ! ( InvalidMonomorphization :: ExpectedPointer { span, name, ty: out_elem } )
557
+ }
558
+ }
559
+
560
+ let arg = args[ 0 ] . immediate ( ) ;
561
+ let elem_type = llret_ty. dyncast_vector ( ) . expect ( "vector return type" ) . get_element_type ( ) ;
562
+ let values: Vec < _ > = ( 0 ..in_len)
563
+ . map ( |i| {
564
+ let idx = bx. gcc_int ( bx. usize_type , i as _ ) ;
565
+ let value = bx. extract_element ( arg, idx) ;
566
+ bx. inttoptr ( value, elem_type)
567
+ } )
568
+ . collect ( ) ;
569
+ return Ok ( bx. context . new_rvalue_from_vector ( bx. location , llret_ty, & values) ) ;
570
+ }
571
+
437
572
#[ cfg( feature = "master" ) ]
438
573
if name == sym:: simd_cast || name == sym:: simd_as {
439
574
require_simd ! ( ret_ty, InvalidMonomorphization :: SimdReturn { span, name, ty: ret_ty } ) ;
0 commit comments