@@ -28,6 +28,7 @@ use syntax_pos::Span;
28
28
29
29
use std:: cmp:: Ordering ;
30
30
use std:: { iter, i128, u128} ;
31
+ use std:: convert:: TryFrom ;
31
32
32
33
fn get_simple_intrinsic ( cx : & CodegenCx < ' ll , ' _ > , name : & str ) -> Option < & ' ll Value > {
33
34
let llvm_name = match name {
@@ -1105,8 +1106,8 @@ fn generic_simd_intrinsic(
1105
1106
let m_len = match in_ty. kind {
1106
1107
// Note that this `.unwrap()` crashes for isize/usize, that's sort
1107
1108
// 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 ,
1110
1111
_ => return_error ! ( "`{}` is not an integral type" , in_ty) ,
1111
1112
} ;
1112
1113
require_simd ! ( arg_tys[ 1 ] , "argument" ) ;
@@ -1116,7 +1117,7 @@ fn generic_simd_intrinsic(
1116
1117
m_len, v_len
1117
1118
) ;
1118
1119
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) ;
1120
1121
let m_i1s = bx. bitcast ( args[ 0 ] . immediate ( ) , i1xn) ;
1121
1122
return Ok ( bx. select ( m_i1s, args[ 1 ] . immediate ( ) , args[ 2 ] . immediate ( ) ) ) ;
1122
1123
}
@@ -1166,7 +1167,7 @@ fn generic_simd_intrinsic(
1166
1167
require_simd ! ( ret_ty, "return" ) ;
1167
1168
1168
1169
let out_len = ret_ty. simd_size ( tcx) ;
1169
- require ! ( out_len == n,
1170
+ require ! ( out_len == n as u64 ,
1170
1171
"expected return type of length {}, found `{}` with length {}" ,
1171
1172
n, ret_ty, out_len) ;
1172
1173
require ! ( in_elem == ret_ty. simd_type( tcx) ,
@@ -1251,7 +1252,7 @@ fn generic_simd_intrinsic(
1251
1252
// trailing bits.
1252
1253
let expected_int_bits = in_len. max ( 8 ) ;
1253
1254
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 ) => ( ) ,
1255
1256
_ => return_error ! (
1256
1257
"bitmask `{}`, expected `u{}`" ,
1257
1258
ret_ty, expected_int_bits
@@ -1276,7 +1277,8 @@ fn generic_simd_intrinsic(
1276
1277
1277
1278
// Shift the MSB to the right by "in_elem_bitwidth - 1" into the first bit position.
1278
1279
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 _
1280
1282
] ;
1281
1283
let i_xn_msb = bx. lshr ( i_xn, bx. const_vector ( shift_indices. as_slice ( ) ) ) ;
1282
1284
// Truncate vector to an <i1 x N>
@@ -1291,7 +1293,7 @@ fn generic_simd_intrinsic(
1291
1293
name : & str ,
1292
1294
in_elem : & :: rustc:: ty:: TyS < ' _ > ,
1293
1295
in_ty : & :: rustc:: ty:: TyS < ' _ > ,
1294
- in_len : usize ,
1296
+ in_len : u64 ,
1295
1297
bx : & mut Builder < ' a , ' ll , ' tcx > ,
1296
1298
span : Span ,
1297
1299
args : & [ OperandRef < ' tcx , & ' ll Value > ] ,
@@ -1506,11 +1508,12 @@ fn generic_simd_intrinsic(
1506
1508
// Truncate the mask vector to a vector of i1s:
1507
1509
let ( mask, mask_ty) = {
1508
1510
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) ;
1510
1512
( bx. trunc ( args[ 2 ] . immediate ( ) , i1xn) , i1xn)
1511
1513
} ;
1512
1514
1513
1515
// Type of the vector of pointers:
1516
+ let in_len = usize:: try_from ( in_len) . unwrap ( ) ;
1514
1517
let llvm_pointer_vec_ty = llvm_vector_ty ( bx, underlying_ty, in_len, pointer_count) ;
1515
1518
let llvm_pointer_vec_str = llvm_vector_str ( underlying_ty, in_len, pointer_count) ;
1516
1519
@@ -1606,13 +1609,14 @@ fn generic_simd_intrinsic(
1606
1609
// Truncate the mask vector to a vector of i1s:
1607
1610
let ( mask, mask_ty) = {
1608
1611
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) ;
1610
1613
( bx. trunc ( args[ 2 ] . immediate ( ) , i1xn) , i1xn)
1611
1614
} ;
1612
1615
1613
1616
let ret_t = bx. type_void ( ) ;
1614
1617
1615
1618
// Type of the vector of pointers:
1619
+ let in_len = usize:: try_from ( in_len) . unwrap ( ) ;
1616
1620
let llvm_pointer_vec_ty = llvm_vector_ty ( bx, underlying_ty, in_len, pointer_count) ;
1617
1621
let llvm_pointer_vec_str = llvm_vector_str ( underlying_ty, in_len, pointer_count) ;
1618
1622
0 commit comments