@@ -792,7 +792,7 @@ fn generic_simd_intrinsic(
792792            _ => return_error ! ( "`{}` is not an integral type" ,  in_ty) , 
793793        } ; 
794794        require_simd ! ( arg_tys[ 1 ] ,  "argument" ) ; 
795-         let  v_len  = arg_tys[ 1 ] . simd_size ( tcx) ; 
795+         let  ( v_len,  _ )   = arg_tys[ 1 ] . simd_size_and_type ( bx . tcx ( ) ) ; 
796796        require ! ( 
797797            // Allow masks for vectors with fewer than 8 elements to be 
798798            // represented with a u8 or i8. 
@@ -812,8 +812,6 @@ fn generic_simd_intrinsic(
812812    // every intrinsic below takes a SIMD vector as its first argument 
813813    require_simd ! ( arg_tys[ 0 ] ,  "input" ) ; 
814814    let  in_ty = arg_tys[ 0 ] ; 
815-     let  in_elem = arg_tys[ 0 ] . simd_type ( tcx) ; 
816-     let  in_len = arg_tys[ 0 ] . simd_size ( tcx) ; 
817815
818816    let  comparison = match  name { 
819817        sym:: simd_eq => Some ( hir:: BinOpKind :: Eq ) , 
@@ -825,14 +823,15 @@ fn generic_simd_intrinsic(
825823        _ => None , 
826824    } ; 
827825
826+     let  ( in_len,  in_elem)  = arg_tys[ 0 ] . simd_size_and_type ( bx. tcx ( ) ) ; 
828827    if  let  Some ( cmp_op)  = comparison { 
829828        require_simd ! ( ret_ty,  "return" ) ; 
830829
831-         let  out_len  = ret_ty. simd_size ( tcx) ; 
830+         let  ( out_len,  out_ty )   = ret_ty. simd_size_and_type ( bx . tcx ( ) ) ; 
832831        require ! ( 
833832            in_len == out_len, 
834833            "expected return type with length {} (same as input type `{}`), \  
835-                     found `{}` with length {}", 
834+               found `{}` with length {}", 
836835            in_len, 
837836            in_ty, 
838837            ret_ty, 
@@ -842,7 +841,7 @@ fn generic_simd_intrinsic(
842841            bx. type_kind( bx. element_type( llret_ty) )  == TypeKind :: Integer , 
843842            "expected return type with integer elements, found `{}` with non-integer `{}`" , 
844843            ret_ty, 
845-             ret_ty . simd_type ( tcx ) 
844+             out_ty 
846845        ) ; 
847846
848847        return  Ok ( compare_simd_types ( 
@@ -862,7 +861,7 @@ fn generic_simd_intrinsic(
862861
863862        require_simd ! ( ret_ty,  "return" ) ; 
864863
865-         let  out_len  = ret_ty. simd_size ( tcx) ; 
864+         let  ( out_len,  out_ty )   = ret_ty. simd_size_and_type ( bx . tcx ( ) ) ; 
866865        require ! ( 
867866            out_len == n, 
868867            "expected return type of length {}, found `{}` with length {}" , 
@@ -871,13 +870,13 @@ fn generic_simd_intrinsic(
871870            out_len
872871        ) ; 
873872        require ! ( 
874-             in_elem == ret_ty . simd_type ( tcx ) , 
873+             in_elem == out_ty , 
875874            "expected return element type `{}` (element of input `{}`), \  
876-                     found `{}` with element type `{}`", 
875+               found `{}` with element type `{}`", 
877876            in_elem, 
878877            in_ty, 
879878            ret_ty, 
880-             ret_ty . simd_type ( tcx ) 
879+             out_ty 
881880        ) ; 
882881
883882        let  total_len = u128:: from ( in_len)  *  2 ; 
@@ -946,7 +945,7 @@ fn generic_simd_intrinsic(
946945        let  m_elem_ty = in_elem; 
947946        let  m_len = in_len; 
948947        require_simd ! ( arg_tys[ 1 ] ,  "argument" ) ; 
949-         let  v_len  = arg_tys[ 1 ] . simd_size ( tcx) ; 
948+         let  ( v_len,  _ )   = arg_tys[ 1 ] . simd_size_and_type ( bx . tcx ( ) ) ; 
950949        require ! ( 
951950            m_len == v_len, 
952951            "mismatched lengths: mask length `{}` != other vector length `{}`" , 
@@ -1173,25 +1172,27 @@ fn generic_simd_intrinsic(
11731172        require_simd ! ( ret_ty,  "return" ) ; 
11741173
11751174        // Of the same length: 
1175+         let  ( out_len,  _)  = arg_tys[ 1 ] . simd_size_and_type ( bx. tcx ( ) ) ; 
1176+         let  ( out_len2,  _)  = arg_tys[ 2 ] . simd_size_and_type ( bx. tcx ( ) ) ; 
11761177        require ! ( 
1177-             in_len == arg_tys [ 1 ] . simd_size ( tcx ) , 
1178+             in_len == out_len , 
11781179            "expected {} argument with length {} (same as input type `{}`), \  
1179-                     found `{}` with length {}", 
1180+               found `{}` with length {}", 
11801181            "second" , 
11811182            in_len, 
11821183            in_ty, 
11831184            arg_tys[ 1 ] , 
1184-             arg_tys [ 1 ] . simd_size ( tcx ) 
1185+             out_len 
11851186        ) ; 
11861187        require ! ( 
1187-             in_len == arg_tys [ 2 ] . simd_size ( tcx ) , 
1188+             in_len == out_len2 , 
11881189            "expected {} argument with length {} (same as input type `{}`), \  
1189-                     found `{}` with length {}", 
1190+               found `{}` with length {}", 
11901191            "third" , 
11911192            in_len, 
11921193            in_ty, 
11931194            arg_tys[ 2 ] , 
1194-             arg_tys [ 2 ] . simd_size ( tcx ) 
1195+             out_len2 
11951196        ) ; 
11961197
11971198        // The return type must match the first argument type 
@@ -1215,39 +1216,40 @@ fn generic_simd_intrinsic(
12151216
12161217        // The second argument must be a simd vector with an element type that's a pointer 
12171218        // to the element type of the first argument 
1218-         let  ( pointer_count ,  underlying_ty )  = match   arg_tys[ 1 ] . simd_type ( tcx ) . kind ( )   { 
1219-             ty :: RawPtr ( p )   if  p . ty  == in_elem =>  { 
1220-                  ( ptr_count ( arg_tys [ 1 ] . simd_type ( tcx ) ) ,   non_ptr ( arg_tys [ 1 ] . simd_type ( tcx ) ) ) 
1221-             } 
1219+         let  ( _ ,  element_ty0 )  = arg_tys[ 0 ] . simd_size_and_type ( bx . tcx ( ) ) ; 
1220+         let   ( _ ,  element_ty1 )  = arg_tys [ 1 ] . simd_size_and_type ( bx . tcx ( ) ) ; 
1221+         let   ( pointer_count ,  underlying_ty )  =  match  element_ty1 . kind ( )   { 
1222+             ty :: RawPtr ( p )   if  p . ty  == in_elem =>  ( ptr_count ( element_ty1 ) ,   non_ptr ( element_ty1 ) ) , 
12221223            _ => { 
12231224                require ! ( 
12241225                    false , 
12251226                    "expected element type `{}` of second argument `{}` \  
1226-                                    to be a pointer to the element type `{}` of the first \ 
1227-                                    argument `{}`, found `{}` != `*_ {}`", 
1228-                     arg_tys [ 1 ] . simd_type ( tcx ) , 
1227+                          to be a pointer to the element type `{}` of the first \ 
1228+                          argument `{}`, found `{}` != `*_ {}`", 
1229+                     element_ty1 , 
12291230                    arg_tys[ 1 ] , 
12301231                    in_elem, 
12311232                    in_ty, 
1232-                     arg_tys [ 1 ] . simd_type ( tcx ) , 
1233+                     element_ty1 , 
12331234                    in_elem
12341235                ) ; 
12351236                unreachable ! ( ) ; 
12361237            } 
12371238        } ; 
12381239        assert ! ( pointer_count > 0 ) ; 
1239-         assert_eq ! ( pointer_count - 1 ,  ptr_count( arg_tys [ 0 ] . simd_type ( tcx ) ) ) ; 
1240-         assert_eq ! ( underlying_ty,  non_ptr( arg_tys [ 0 ] . simd_type ( tcx ) ) ) ; 
1240+         assert_eq ! ( pointer_count - 1 ,  ptr_count( element_ty0 ) ) ; 
1241+         assert_eq ! ( underlying_ty,  non_ptr( element_ty0 ) ) ; 
12411242
12421243        // The element type of the third argument must be a signed integer type of any width: 
1243-         match  arg_tys[ 2 ] . simd_type ( tcx) . kind ( )  { 
1244+         let  ( _,  element_ty2)  = arg_tys[ 2 ] . simd_size_and_type ( bx. tcx ( ) ) ; 
1245+         match  element_ty2. kind ( )  { 
12441246            ty:: Int ( _)  => ( ) , 
12451247            _ => { 
12461248                require ! ( 
12471249                    false , 
12481250                    "expected element type `{}` of third argument `{}` \  
12491251                                  to be a signed integer type", 
1250-                     arg_tys [ 2 ] . simd_type ( tcx ) , 
1252+                     element_ty2 , 
12511253                    arg_tys[ 2 ] 
12521254                ) ; 
12531255            } 
@@ -1299,25 +1301,27 @@ fn generic_simd_intrinsic(
12991301        require_simd ! ( arg_tys[ 2 ] ,  "third" ) ; 
13001302
13011303        // Of the same length: 
1304+         let  ( element_len1,  _)  = arg_tys[ 1 ] . simd_size_and_type ( bx. tcx ( ) ) ; 
1305+         let  ( element_len2,  _)  = arg_tys[ 2 ] . simd_size_and_type ( bx. tcx ( ) ) ; 
13021306        require ! ( 
1303-             in_len == arg_tys [ 1 ] . simd_size ( tcx ) , 
1307+             in_len == element_len1 , 
13041308            "expected {} argument with length {} (same as input type `{}`), \  
1305-                     found `{}` with length {}", 
1309+              found `{}` with length {}", 
13061310            "second" , 
13071311            in_len, 
13081312            in_ty, 
13091313            arg_tys[ 1 ] , 
1310-             arg_tys [ 1 ] . simd_size ( tcx ) 
1314+             element_len1 
13111315        ) ; 
13121316        require ! ( 
1313-             in_len == arg_tys [ 2 ] . simd_size ( tcx ) , 
1317+             in_len == element_len2 , 
13141318            "expected {} argument with length {} (same as input type `{}`), \  
1315-                     found `{}` with length {}", 
1319+              found `{}` with length {}", 
13161320            "third" , 
13171321            in_len, 
13181322            in_ty, 
13191323            arg_tys[ 2 ] , 
1320-             arg_tys [ 2 ] . simd_size ( tcx ) 
1324+             element_len2 
13211325        ) ; 
13221326
13231327        // This counts how many pointers 
@@ -1338,39 +1342,42 @@ fn generic_simd_intrinsic(
13381342
13391343        // The second argument must be a simd vector with an element type that's a pointer 
13401344        // to the element type of the first argument 
1341-         let  ( pointer_count,  underlying_ty)  = match  arg_tys[ 1 ] . simd_type ( tcx) . kind ( )  { 
1345+         let  ( _,  element_ty0)  = arg_tys[ 0 ] . simd_size_and_type ( bx. tcx ( ) ) ; 
1346+         let  ( _,  element_ty1)  = arg_tys[ 1 ] . simd_size_and_type ( bx. tcx ( ) ) ; 
1347+         let  ( _,  element_ty2)  = arg_tys[ 2 ] . simd_size_and_type ( bx. tcx ( ) ) ; 
1348+         let  ( pointer_count,  underlying_ty)  = match  element_ty1. kind ( )  { 
13421349            ty:: RawPtr ( p)  if  p. ty  == in_elem && p. mutbl  == hir:: Mutability :: Mut  => { 
1343-                 ( ptr_count ( arg_tys [ 1 ] . simd_type ( tcx ) ) ,  non_ptr ( arg_tys [ 1 ] . simd_type ( tcx ) ) ) 
1350+                 ( ptr_count ( element_ty1 ) ,  non_ptr ( element_ty1 ) ) 
13441351            } 
13451352            _ => { 
13461353                require ! ( 
13471354                    false , 
13481355                    "expected element type `{}` of second argument `{}` \  
1349-                                    to be a pointer to the element type `{}` of the first \ 
1350-                                    argument `{}`, found `{}` != `*mut {}`", 
1351-                     arg_tys [ 1 ] . simd_type ( tcx ) , 
1356+                          to be a pointer to the element type `{}` of the first \ 
1357+                          argument `{}`, found `{}` != `*mut {}`", 
1358+                     element_ty1 , 
13521359                    arg_tys[ 1 ] , 
13531360                    in_elem, 
13541361                    in_ty, 
1355-                     arg_tys [ 1 ] . simd_type ( tcx ) , 
1362+                     element_ty1 , 
13561363                    in_elem
13571364                ) ; 
13581365                unreachable ! ( ) ; 
13591366            } 
13601367        } ; 
13611368        assert ! ( pointer_count > 0 ) ; 
1362-         assert_eq ! ( pointer_count - 1 ,  ptr_count( arg_tys [ 0 ] . simd_type ( tcx ) ) ) ; 
1363-         assert_eq ! ( underlying_ty,  non_ptr( arg_tys [ 0 ] . simd_type ( tcx ) ) ) ; 
1369+         assert_eq ! ( pointer_count - 1 ,  ptr_count( element_ty0 ) ) ; 
1370+         assert_eq ! ( underlying_ty,  non_ptr( element_ty0 ) ) ; 
13641371
13651372        // The element type of the third argument must be a signed integer type of any width: 
1366-         match  arg_tys [ 2 ] . simd_type ( tcx ) . kind ( )  { 
1373+         match  element_ty2 . kind ( )  { 
13671374            ty:: Int ( _)  => ( ) , 
13681375            _ => { 
13691376                require ! ( 
13701377                    false , 
13711378                    "expected element type `{}` of third argument `{}` \  
1372-                                   to  be a signed integer type", 
1373-                     arg_tys [ 2 ] . simd_type ( tcx ) , 
1379+                           be a signed integer type", 
1380+                     element_ty2 , 
13741381                    arg_tys[ 2 ] 
13751382                ) ; 
13761383            } 
@@ -1567,7 +1574,7 @@ unsupported {} from `{}` with element `{}` of size `{}` to `{}`"#,
15671574
15681575    if  name == sym:: simd_cast { 
15691576        require_simd ! ( ret_ty,  "return" ) ; 
1570-         let  out_len  = ret_ty. simd_size ( tcx) ; 
1577+         let  ( out_len,  out_elem )   = ret_ty. simd_size_and_type ( bx . tcx ( ) ) ; 
15711578        require ! ( 
15721579            in_len == out_len, 
15731580            "expected return type with length {} (same as input type `{}`), \  
@@ -1578,8 +1585,6 @@ unsupported {} from `{}` with element `{}` of size `{}` to `{}`"#,
15781585            out_len
15791586        ) ; 
15801587        // casting cares about nominal type, not just structural type 
1581-         let  out_elem = ret_ty. simd_type ( tcx) ; 
1582- 
15831588        if  in_elem == out_elem { 
15841589            return  Ok ( args[ 0 ] . immediate ( ) ) ; 
15851590        } 
@@ -1695,7 +1700,7 @@ unsupported {} from `{}` with element `{}` of size `{}` to `{}`"#,
16951700                return_error ! ( 
16961701                    "expected element type `{}` of vector type `{}` \  
16971702                      to be a signed or unsigned integer type", 
1698-                     arg_tys[ 0 ] . simd_type ( tcx) , 
1703+                     arg_tys[ 0 ] . simd_size_and_type ( bx . tcx( ) ) . 1 , 
16991704                    arg_tys[ 0 ] 
17001705                ) ; 
17011706            } 
0 commit comments