@@ -20,7 +20,7 @@ use rustc_middle::ty::{self, Ty};
20
20
use rustc_middle:: { bug, span_bug} ;
21
21
use rustc_span:: { sym, symbol:: kw, Span , Symbol } ;
22
22
use rustc_target:: abi:: { self , HasDataLayout , Primitive } ;
23
- use rustc_target:: spec:: PanicStrategy ;
23
+ use rustc_target:: spec:: { HasTargetSpec , PanicStrategy } ;
24
24
25
25
use std:: cmp:: Ordering ;
26
26
use std:: iter;
@@ -1187,11 +1187,28 @@ fn generic_simd_intrinsic(
1187
1187
// FIXME: use:
1188
1188
// https://github.com/llvm-mirror/llvm/blob/master/include/llvm/IR/Function.h#L182
1189
1189
// https://github.com/llvm-mirror/llvm/blob/master/include/llvm/IR/Intrinsics.h#L81
1190
- fn llvm_vector_str ( elem_ty : Ty < ' _ > , vec_len : u64 , no_pointers : usize ) -> String {
1190
+ fn llvm_vector_str (
1191
+ elem_ty : Ty < ' _ > ,
1192
+ vec_len : u64 ,
1193
+ no_pointers : usize ,
1194
+ bx : & Builder < ' a , ' ll , ' tcx > ,
1195
+ ) -> String {
1191
1196
let p0s: String = "p0" . repeat ( no_pointers) ;
1192
1197
match * elem_ty. kind ( ) {
1193
- ty:: Int ( v) => format ! ( "v{}{}i{}" , vec_len, p0s, v. bit_width( ) . unwrap( ) ) ,
1194
- ty:: Uint ( v) => format ! ( "v{}{}i{}" , vec_len, p0s, v. bit_width( ) . unwrap( ) ) ,
1198
+ ty:: Int ( v) => format ! (
1199
+ "v{}{}i{}" ,
1200
+ vec_len,
1201
+ p0s,
1202
+ // Normalize to prevent crash if v: IntTy::Isize
1203
+ v. normalize( bx. target_spec( ) . pointer_width) . bit_width( ) . unwrap( )
1204
+ ) ,
1205
+ ty:: Uint ( v) => format ! (
1206
+ "v{}{}i{}" ,
1207
+ vec_len,
1208
+ p0s,
1209
+ // Normalize to prevent crash if v: UIntTy::Usize
1210
+ v. normalize( bx. target_spec( ) . pointer_width) . bit_width( ) . unwrap( )
1211
+ ) ,
1195
1212
ty:: Float ( v) => format ! ( "v{}{}f{}" , vec_len, p0s, v. bit_width( ) ) ,
1196
1213
_ => unreachable ! ( ) ,
1197
1214
}
@@ -1327,11 +1344,11 @@ fn generic_simd_intrinsic(
1327
1344
1328
1345
// Type of the vector of pointers:
1329
1346
let llvm_pointer_vec_ty = llvm_vector_ty ( bx, underlying_ty, in_len, pointer_count) ;
1330
- let llvm_pointer_vec_str = llvm_vector_str ( underlying_ty, in_len, pointer_count) ;
1347
+ let llvm_pointer_vec_str = llvm_vector_str ( underlying_ty, in_len, pointer_count, bx ) ;
1331
1348
1332
1349
// Type of the vector of elements:
1333
1350
let llvm_elem_vec_ty = llvm_vector_ty ( bx, underlying_ty, in_len, pointer_count - 1 ) ;
1334
- let llvm_elem_vec_str = llvm_vector_str ( underlying_ty, in_len, pointer_count - 1 ) ;
1351
+ let llvm_elem_vec_str = llvm_vector_str ( underlying_ty, in_len, pointer_count - 1 , bx ) ;
1335
1352
1336
1353
let llvm_intrinsic =
1337
1354
format ! ( "llvm.masked.gather.{}.{}" , llvm_elem_vec_str, llvm_pointer_vec_str) ;
@@ -1455,11 +1472,11 @@ fn generic_simd_intrinsic(
1455
1472
1456
1473
// Type of the vector of pointers:
1457
1474
let llvm_pointer_vec_ty = llvm_vector_ty ( bx, underlying_ty, in_len, pointer_count) ;
1458
- let llvm_pointer_vec_str = llvm_vector_str ( underlying_ty, in_len, pointer_count) ;
1475
+ let llvm_pointer_vec_str = llvm_vector_str ( underlying_ty, in_len, pointer_count, bx ) ;
1459
1476
1460
1477
// Type of the vector of elements:
1461
1478
let llvm_elem_vec_ty = llvm_vector_ty ( bx, underlying_ty, in_len, pointer_count - 1 ) ;
1462
- let llvm_elem_vec_str = llvm_vector_str ( underlying_ty, in_len, pointer_count - 1 ) ;
1479
+ let llvm_elem_vec_str = llvm_vector_str ( underlying_ty, in_len, pointer_count - 1 , bx ) ;
1463
1480
1464
1481
let llvm_intrinsic =
1465
1482
format ! ( "llvm.masked.scatter.{}.{}" , llvm_elem_vec_str, llvm_pointer_vec_str) ;
0 commit comments