@@ -740,23 +740,6 @@ fn generic_simd_intrinsic(
740
740
llret_ty : & ' ll Type ,
741
741
span : Span ,
742
742
) -> Result < & ' ll Value , ( ) > {
743
- // Given a SIMD vector type `x` return the element type and the number of
744
- // elements in the vector.
745
- fn simd_ty_and_len ( bx : & Builder < ' a , ' ll , ' tcx > , simd_ty : Ty < ' tcx > ) -> ( Ty < ' tcx > , u64 ) {
746
- let ty = if let ty:: Adt ( _def, _substs) = simd_ty. kind ( ) {
747
- let f0_ty = bx. layout_of ( simd_ty) . field ( bx, 0 ) . ty ;
748
- if let ty:: Array ( element_ty, _) = f0_ty. kind ( ) { element_ty } else { f0_ty }
749
- } else {
750
- bug ! ( "should only be called with a SIMD type" )
751
- } ;
752
- let count = if let abi:: Abi :: Vector { count, .. } = bx. layout_of ( simd_ty) . abi {
753
- count
754
- } else {
755
- bug ! ( "should only be called with a SIMD type" )
756
- } ;
757
- ( ty, count)
758
- }
759
-
760
743
// macros for error handling:
761
744
macro_rules! emit_error {
762
745
( $msg: tt) => {
@@ -809,7 +792,7 @@ fn generic_simd_intrinsic(
809
792
_ => return_error ! ( "`{}` is not an integral type" , in_ty) ,
810
793
} ;
811
794
require_simd ! ( arg_tys[ 1 ] , "argument" ) ;
812
- let ( _ , v_len ) = simd_ty_and_len ( bx , arg_tys[ 1 ] ) ;
795
+ let ( v_len , _ ) = arg_tys[ 1 ] . simd_size_and_type ( bx . tcx ( ) ) ;
813
796
require ! (
814
797
// Allow masks for vectors with fewer than 8 elements to be
815
798
// represented with a u8 or i8.
@@ -840,11 +823,11 @@ fn generic_simd_intrinsic(
840
823
_ => None ,
841
824
} ;
842
825
843
- let ( in_elem , in_len ) = simd_ty_and_len ( bx , arg_tys[ 0 ] ) ;
826
+ let ( in_len , in_elem ) = arg_tys[ 0 ] . simd_size_and_type ( bx . tcx ( ) ) ;
844
827
if let Some ( cmp_op) = comparison {
845
828
require_simd ! ( ret_ty, "return" ) ;
846
829
847
- let ( out_ty , out_len ) = simd_ty_and_len ( bx, ret_ty ) ;
830
+ let ( out_len , out_ty ) = ret_ty . simd_size_and_type ( bx. tcx ( ) ) ;
848
831
require ! (
849
832
in_len == out_len,
850
833
"expected return type with length {} (same as input type `{}`), \
@@ -878,7 +861,7 @@ fn generic_simd_intrinsic(
878
861
879
862
require_simd ! ( ret_ty, "return" ) ;
880
863
881
- let ( out_ty , out_len ) = simd_ty_and_len ( bx, ret_ty ) ;
864
+ let ( out_len , out_ty ) = ret_ty . simd_size_and_type ( bx. tcx ( ) ) ;
882
865
require ! (
883
866
out_len == n,
884
867
"expected return type of length {}, found `{}` with length {}" ,
@@ -962,7 +945,7 @@ fn generic_simd_intrinsic(
962
945
let m_elem_ty = in_elem;
963
946
let m_len = in_len;
964
947
require_simd ! ( arg_tys[ 1 ] , "argument" ) ;
965
- let ( _ , v_len ) = simd_ty_and_len ( bx , arg_tys[ 1 ] ) ;
948
+ let ( v_len , _ ) = arg_tys[ 1 ] . simd_size_and_type ( bx . tcx ( ) ) ;
966
949
require ! (
967
950
m_len == v_len,
968
951
"mismatched lengths: mask length `{}` != other vector length `{}`" ,
@@ -1187,8 +1170,8 @@ fn generic_simd_intrinsic(
1187
1170
require_simd ! ( ret_ty, "return" ) ;
1188
1171
1189
1172
// Of the same length:
1190
- let ( _ , out_len ) = simd_ty_and_len ( bx , arg_tys[ 1 ] ) ;
1191
- let ( _ , out_len2 ) = simd_ty_and_len ( bx , arg_tys[ 2 ] ) ;
1173
+ let ( out_len , _ ) = arg_tys[ 1 ] . simd_size_and_type ( bx . tcx ( ) ) ;
1174
+ let ( out_len2 , _ ) = arg_tys[ 2 ] . simd_size_and_type ( bx . tcx ( ) ) ;
1192
1175
require ! (
1193
1176
in_len == out_len,
1194
1177
"expected {} argument with length {} (same as input type `{}`), \
@@ -1231,8 +1214,8 @@ fn generic_simd_intrinsic(
1231
1214
1232
1215
// The second argument must be a simd vector with an element type that's a pointer
1233
1216
// to the element type of the first argument
1234
- let ( element_ty0 , _ ) = simd_ty_and_len ( bx , arg_tys[ 0 ] ) ;
1235
- let ( element_ty1 , _ ) = simd_ty_and_len ( bx , arg_tys[ 1 ] ) ;
1217
+ let ( _ , element_ty0 ) = arg_tys[ 0 ] . simd_size_and_type ( bx . tcx ( ) ) ;
1218
+ let ( _ , element_ty1 ) = arg_tys[ 1 ] . simd_size_and_type ( bx . tcx ( ) ) ;
1236
1219
let ( pointer_count, underlying_ty) = match element_ty1. kind ( ) {
1237
1220
ty:: RawPtr ( p) if p. ty == in_elem => ( ptr_count ( element_ty1) , non_ptr ( element_ty1) ) ,
1238
1221
_ => {
@@ -1256,7 +1239,7 @@ fn generic_simd_intrinsic(
1256
1239
assert_eq ! ( underlying_ty, non_ptr( element_ty0) ) ;
1257
1240
1258
1241
// The element type of the third argument must be a signed integer type of any width:
1259
- let ( element_ty2 , _ ) = simd_ty_and_len ( bx , arg_tys[ 2 ] ) ;
1242
+ let ( _ , element_ty2 ) = arg_tys[ 2 ] . simd_size_and_type ( bx . tcx ( ) ) ;
1260
1243
match element_ty2. kind ( ) {
1261
1244
ty:: Int ( _) => ( ) ,
1262
1245
_ => {
@@ -1316,8 +1299,8 @@ fn generic_simd_intrinsic(
1316
1299
require_simd ! ( arg_tys[ 2 ] , "third" ) ;
1317
1300
1318
1301
// Of the same length:
1319
- let ( _ , element_len1 ) = simd_ty_and_len ( bx , arg_tys[ 1 ] ) ;
1320
- let ( _ , element_len2 ) = simd_ty_and_len ( bx , arg_tys[ 2 ] ) ;
1302
+ let ( element_len1 , _ ) = arg_tys[ 1 ] . simd_size_and_type ( bx . tcx ( ) ) ;
1303
+ let ( element_len2 , _ ) = arg_tys[ 2 ] . simd_size_and_type ( bx . tcx ( ) ) ;
1321
1304
require ! (
1322
1305
in_len == element_len1,
1323
1306
"expected {} argument with length {} (same as input type `{}`), \
@@ -1357,9 +1340,9 @@ fn generic_simd_intrinsic(
1357
1340
1358
1341
// The second argument must be a simd vector with an element type that's a pointer
1359
1342
// to the element type of the first argument
1360
- let ( element_ty0 , _element_len0 ) = simd_ty_and_len ( bx , arg_tys[ 0 ] ) ;
1361
- let ( element_ty1 , _element_len1 ) = simd_ty_and_len ( bx , arg_tys[ 1 ] ) ;
1362
- let ( element_ty2 , _element_len2 ) = simd_ty_and_len ( bx , arg_tys[ 2 ] ) ;
1343
+ let ( _ , element_ty0 ) = arg_tys[ 0 ] . simd_size_and_type ( bx . tcx ( ) ) ;
1344
+ let ( _ , element_ty1 ) = arg_tys[ 1 ] . simd_size_and_type ( bx . tcx ( ) ) ;
1345
+ let ( _ , element_ty2 ) = arg_tys[ 2 ] . simd_size_and_type ( bx . tcx ( ) ) ;
1363
1346
let ( pointer_count, underlying_ty) = match element_ty1. kind ( ) {
1364
1347
ty:: RawPtr ( p) if p. ty == in_elem && p. mutbl == hir:: Mutability :: Mut => {
1365
1348
( ptr_count ( element_ty1) , non_ptr ( element_ty1) )
@@ -1589,7 +1572,7 @@ unsupported {} from `{}` with element `{}` of size `{}` to `{}`"#,
1589
1572
1590
1573
if name == sym:: simd_cast {
1591
1574
require_simd ! ( ret_ty, "return" ) ;
1592
- let ( out_elem , out_len ) = simd_ty_and_len ( bx, ret_ty ) ;
1575
+ let ( out_len , out_elem ) = ret_ty . simd_size_and_type ( bx. tcx ( ) ) ;
1593
1576
require ! (
1594
1577
in_len == out_len,
1595
1578
"expected return type with length {} (same as input type `{}`), \
@@ -1715,7 +1698,7 @@ unsupported {} from `{}` with element `{}` of size `{}` to `{}`"#,
1715
1698
return_error ! (
1716
1699
"expected element type `{}` of vector type `{}` \
1717
1700
to be a signed or unsigned integer type",
1718
- simd_ty_and_len ( bx , arg_tys[ 0 ] ) . 0 ,
1701
+ arg_tys[ 0 ] . simd_size_and_type ( bx . tcx ( ) ) . 1 ,
1719
1702
arg_tys[ 0 ]
1720
1703
) ;
1721
1704
}
0 commit comments