@@ -28,6 +28,7 @@ use syntax_pos::Span;
2828
2929use std:: cmp:: Ordering ;
3030use std:: { iter, i128, u128} ;
31+ use std:: convert:: TryFrom ;
3132
3233fn get_simple_intrinsic ( cx : & CodegenCx < ' ll , ' _ > , name : & str ) -> Option < & ' ll Value > {
3334 let llvm_name = match name {
@@ -1105,8 +1106,8 @@ fn generic_simd_intrinsic(
11051106 let m_len = match in_ty. kind {
11061107 // Note that this `.unwrap()` crashes for isize/usize, that's sort
11071108 // of intentional as there's not currently a use case for that.
1108- ty:: Int ( i) => i. bit_width ( ) . unwrap ( ) ,
1109- ty:: Uint ( i) => i. bit_width ( ) . unwrap ( ) ,
1109+ ty:: Int ( i) => i. bit_width ( ) . unwrap ( ) as u64 ,
1110+ ty:: Uint ( i) => i. bit_width ( ) . unwrap ( ) as u64 ,
11101111 _ => return_error ! ( "`{}` is not an integral type" , in_ty) ,
11111112 } ;
11121113 require_simd ! ( arg_tys[ 1 ] , "argument" ) ;
@@ -1116,7 +1117,7 @@ fn generic_simd_intrinsic(
11161117 m_len, v_len
11171118 ) ;
11181119 let i1 = bx. type_i1 ( ) ;
1119- let i1xn = bx. type_vector ( i1, m_len as u64 ) ;
1120+ let i1xn = bx. type_vector ( i1, m_len) ;
11201121 let m_i1s = bx. bitcast ( args[ 0 ] . immediate ( ) , i1xn) ;
11211122 return Ok ( bx. select ( m_i1s, args[ 1 ] . immediate ( ) , args[ 2 ] . immediate ( ) ) ) ;
11221123 }
@@ -1166,7 +1167,7 @@ fn generic_simd_intrinsic(
11661167 require_simd ! ( ret_ty, "return" ) ;
11671168
11681169 let out_len = ret_ty. simd_size ( tcx) ;
1169- require ! ( out_len == n,
1170+ require ! ( out_len == n as u64 ,
11701171 "expected return type of length {}, found `{}` with length {}" ,
11711172 n, ret_ty, out_len) ;
11721173 require ! ( in_elem == ret_ty. simd_type( tcx) ,
@@ -1251,7 +1252,7 @@ fn generic_simd_intrinsic(
12511252 // trailing bits.
12521253 let expected_int_bits = in_len. max ( 8 ) ;
12531254 match ret_ty. kind {
1254- ty:: Uint ( i) if i. bit_width ( ) == Some ( expected_int_bits) => ( ) ,
1255+ ty:: Uint ( i) if i. bit_width ( ) == Some ( expected_int_bits as usize ) => ( ) ,
12551256 _ => return_error ! (
12561257 "bitmask `{}`, expected `u{}`" ,
12571258 ret_ty, expected_int_bits
@@ -1276,7 +1277,8 @@ fn generic_simd_intrinsic(
12761277
12771278 // Shift the MSB to the right by "in_elem_bitwidth - 1" into the first bit position.
12781279 let shift_indices = vec ! [
1279- bx. cx. const_int( bx. type_ix( in_elem_bitwidth as _) , ( in_elem_bitwidth - 1 ) as _) ; in_len
1280+ bx. cx. const_int( bx. type_ix( in_elem_bitwidth as _) , ( in_elem_bitwidth - 1 ) as _) ;
1281+ in_len as _
12801282 ] ;
12811283 let i_xn_msb = bx. lshr ( i_xn, bx. const_vector ( shift_indices. as_slice ( ) ) ) ;
12821284 // Truncate vector to an <i1 x N>
@@ -1291,7 +1293,7 @@ fn generic_simd_intrinsic(
12911293 name : & str ,
12921294 in_elem : & :: rustc:: ty:: TyS < ' _ > ,
12931295 in_ty : & :: rustc:: ty:: TyS < ' _ > ,
1294- in_len : usize ,
1296+ in_len : u64 ,
12951297 bx : & mut Builder < ' a , ' ll , ' tcx > ,
12961298 span : Span ,
12971299 args : & [ OperandRef < ' tcx , & ' ll Value > ] ,
@@ -1506,11 +1508,12 @@ fn generic_simd_intrinsic(
15061508 // Truncate the mask vector to a vector of i1s:
15071509 let ( mask, mask_ty) = {
15081510 let i1 = bx. type_i1 ( ) ;
1509- let i1xn = bx. type_vector ( i1, in_len as u64 ) ;
1511+ let i1xn = bx. type_vector ( i1, in_len) ;
15101512 ( bx. trunc ( args[ 2 ] . immediate ( ) , i1xn) , i1xn)
15111513 } ;
15121514
15131515 // Type of the vector of pointers:
1516+ let in_len = usize:: try_from ( in_len) . unwrap ( ) ;
15141517 let llvm_pointer_vec_ty = llvm_vector_ty ( bx, underlying_ty, in_len, pointer_count) ;
15151518 let llvm_pointer_vec_str = llvm_vector_str ( underlying_ty, in_len, pointer_count) ;
15161519
@@ -1606,13 +1609,14 @@ fn generic_simd_intrinsic(
16061609 // Truncate the mask vector to a vector of i1s:
16071610 let ( mask, mask_ty) = {
16081611 let i1 = bx. type_i1 ( ) ;
1609- let i1xn = bx. type_vector ( i1, in_len as u64 ) ;
1612+ let i1xn = bx. type_vector ( i1, in_len) ;
16101613 ( bx. trunc ( args[ 2 ] . immediate ( ) , i1xn) , i1xn)
16111614 } ;
16121615
16131616 let ret_t = bx. type_void ( ) ;
16141617
16151618 // Type of the vector of pointers:
1619+ let in_len = usize:: try_from ( in_len) . unwrap ( ) ;
16161620 let llvm_pointer_vec_ty = llvm_vector_ty ( bx, underlying_ty, in_len, pointer_count) ;
16171621 let llvm_pointer_vec_str = llvm_vector_str ( underlying_ty, in_len, pointer_count) ;
16181622
0 commit comments