@@ -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;
@@ -1190,11 +1190,28 @@ fn generic_simd_intrinsic(
1190
1190
// FIXME: use:
1191
1191
// https://github.com/llvm-mirror/llvm/blob/master/include/llvm/IR/Function.h#L182
1192
1192
// https://github.com/llvm-mirror/llvm/blob/master/include/llvm/IR/Intrinsics.h#L81
1193
- fn llvm_vector_str ( elem_ty : Ty < ' _ > , vec_len : u64 , no_pointers : usize ) -> String {
1193
+ fn llvm_vector_str (
1194
+ elem_ty : Ty < ' _ > ,
1195
+ vec_len : u64 ,
1196
+ no_pointers : usize ,
1197
+ bx : & Builder < ' a , ' ll , ' tcx > ,
1198
+ ) -> String {
1194
1199
let p0s: String = "p0" . repeat ( no_pointers) ;
1195
1200
match * elem_ty. kind ( ) {
1196
- ty:: Int ( v) => format ! ( "v{}{}i{}" , vec_len, p0s, v. bit_width( ) . unwrap( ) ) ,
1197
- ty:: Uint ( v) => format ! ( "v{}{}i{}" , vec_len, p0s, v. bit_width( ) . unwrap( ) ) ,
1201
+ ty:: Int ( v) => format ! (
1202
+ "v{}{}i{}" ,
1203
+ vec_len,
1204
+ p0s,
1205
+ // Normalize to prevent crash if v: IntTy::Isize
1206
+ v. normalize( bx. target_spec( ) . pointer_width) . bit_width( ) . unwrap( )
1207
+ ) ,
1208
+ ty:: Uint ( v) => format ! (
1209
+ "v{}{}i{}" ,
1210
+ vec_len,
1211
+ p0s,
1212
+ // Normalize to prevent crash if v: UIntTy::Usize
1213
+ v. normalize( bx. target_spec( ) . pointer_width) . bit_width( ) . unwrap( )
1214
+ ) ,
1198
1215
ty:: Float ( v) => format ! ( "v{}{}f{}" , vec_len, p0s, v. bit_width( ) ) ,
1199
1216
_ => unreachable ! ( ) ,
1200
1217
}
@@ -1330,11 +1347,11 @@ fn generic_simd_intrinsic(
1330
1347
1331
1348
// Type of the vector of pointers:
1332
1349
let llvm_pointer_vec_ty = llvm_vector_ty ( bx, underlying_ty, in_len, pointer_count) ;
1333
- let llvm_pointer_vec_str = llvm_vector_str ( underlying_ty, in_len, pointer_count) ;
1350
+ let llvm_pointer_vec_str = llvm_vector_str ( underlying_ty, in_len, pointer_count, bx ) ;
1334
1351
1335
1352
// Type of the vector of elements:
1336
1353
let llvm_elem_vec_ty = llvm_vector_ty ( bx, underlying_ty, in_len, pointer_count - 1 ) ;
1337
- let llvm_elem_vec_str = llvm_vector_str ( underlying_ty, in_len, pointer_count - 1 ) ;
1354
+ let llvm_elem_vec_str = llvm_vector_str ( underlying_ty, in_len, pointer_count - 1 , bx ) ;
1338
1355
1339
1356
let llvm_intrinsic =
1340
1357
format ! ( "llvm.masked.gather.{}.{}" , llvm_elem_vec_str, llvm_pointer_vec_str) ;
@@ -1458,11 +1475,11 @@ fn generic_simd_intrinsic(
1458
1475
1459
1476
// Type of the vector of pointers:
1460
1477
let llvm_pointer_vec_ty = llvm_vector_ty ( bx, underlying_ty, in_len, pointer_count) ;
1461
- let llvm_pointer_vec_str = llvm_vector_str ( underlying_ty, in_len, pointer_count) ;
1478
+ let llvm_pointer_vec_str = llvm_vector_str ( underlying_ty, in_len, pointer_count, bx ) ;
1462
1479
1463
1480
// Type of the vector of elements:
1464
1481
let llvm_elem_vec_ty = llvm_vector_ty ( bx, underlying_ty, in_len, pointer_count - 1 ) ;
1465
- let llvm_elem_vec_str = llvm_vector_str ( underlying_ty, in_len, pointer_count - 1 ) ;
1482
+ let llvm_elem_vec_str = llvm_vector_str ( underlying_ty, in_len, pointer_count - 1 , bx ) ;
1466
1483
1467
1484
let llvm_intrinsic =
1468
1485
format ! ( "llvm.masked.scatter.{}.{}" , llvm_elem_vec_str, llvm_pointer_vec_str) ;
0 commit comments