]> git.lizzy.rs Git - rust.git/commitdiff
make simd_size return a u64
authorRalf Jung <post@ralfj.de>
Sat, 16 Nov 2019 12:31:09 +0000 (13:31 +0100)
committerRalf Jung <post@ralfj.de>
Sat, 16 Nov 2019 12:31:09 +0000 (13:31 +0100)
src/librustc/ty/layout.rs
src/librustc/ty/sty.rs
src/librustc_codegen_llvm/intrinsic.rs
src/librustc_mir/interpret/intrinsics.rs

index 972452601ddd5c6ef192bf19a277177f8d76ce34..b9fc5f59b7bbc554f4813ad5ff39660d037e723c 100644 (file)
@@ -697,7 +697,7 @@ fn layout_raw_uncached(&self, ty: Ty<'tcx>) -> Result<&'tcx LayoutDetails, Layou
             // SIMD vector types.
             ty::Adt(def, ..) if def.repr.simd() => {
                 let element = self.layout_of(ty.simd_type(tcx))?;
-                let count = ty.simd_size(tcx) as u64;
+                let count = ty.simd_size(tcx);
                 assert!(count > 0);
                 let scalar = match element.abi {
                     Abi::Scalar(ref scalar) => scalar.clone(),
index d1d71a42872449d8a59cd54c1d48a0ed2707f15e..b7e645d55a5fcebbdd5970ca1d3efe1779f9e4fe 100644 (file)
@@ -1819,20 +1819,20 @@ pub fn simd_type(&self, tcx: TyCtxt<'tcx>) -> Ty<'tcx> {
         }
     }
 
-    pub fn simd_size(&self, _tcx: TyCtxt<'tcx>) -> usize {
+    pub fn simd_size(&self, _tcx: TyCtxt<'tcx>) -> u64 {
         // Parameter currently unused, but probably needed in the future to
         // allow `#[repr(simd)] struct Simd<T, const N: usize>([T; N]);`.
         match self.kind {
-            Adt(def, _) => def.non_enum_variant().fields.len(),
+            Adt(def, _) => def.non_enum_variant().fields.len() as u64,
             _ => bug!("simd_size called on invalid type")
         }
     }
 
-    pub fn simd_size_and_type(&self, tcx: TyCtxt<'tcx>) -> (usize, Ty<'tcx>) {
+    pub fn simd_size_and_type(&self, tcx: TyCtxt<'tcx>) -> (u64, Ty<'tcx>) {
         match self.kind {
             Adt(def, substs) => {
                 let variant = def.non_enum_variant();
-                (variant.fields.len(), variant.fields[0].ty(tcx, substs))
+                (variant.fields.len() as u64, variant.fields[0].ty(tcx, substs))
             }
             _ => bug!("simd_size_and_type called on invalid type")
         }
index e1ce7f622e2ef15a02278fecaafe4141c01796e0..fb5f457bb3a1ceaf73e852fa2e308983732ba6bc 100644 (file)
@@ -28,6 +28,7 @@
 
 use std::cmp::Ordering;
 use std::{iter, i128, u128};
+use std::convert::TryFrom;
 
 fn get_simple_intrinsic(cx: &CodegenCx<'ll, '_>, name: &str) -> Option<&'ll Value> {
     let llvm_name = match name {
@@ -1105,8 +1106,8 @@ macro_rules! require_simd {
         let m_len = match in_ty.kind {
             // Note that this `.unwrap()` crashes for isize/usize, that's sort
             // of intentional as there's not currently a use case for that.
-            ty::Int(i) => i.bit_width().unwrap(),
-            ty::Uint(i) => i.bit_width().unwrap(),
+            ty::Int(i) => i.bit_width().unwrap() as u64,
+            ty::Uint(i) => i.bit_width().unwrap() as u64,
             _ => return_error!("`{}` is not an integral type", in_ty),
         };
         require_simd!(arg_tys[1], "argument");
@@ -1116,7 +1117,7 @@ macro_rules! require_simd {
                  m_len, v_len
         );
         let i1 = bx.type_i1();
-        let i1xn = bx.type_vector(i1, m_len as u64);
+        let i1xn = bx.type_vector(i1, m_len);
         let m_i1s = bx.bitcast(args[0].immediate(), i1xn);
         return Ok(bx.select(m_i1s, args[1].immediate(), args[2].immediate()));
     }
@@ -1166,7 +1167,7 @@ macro_rules! require_simd {
         require_simd!(ret_ty, "return");
 
         let out_len = ret_ty.simd_size(tcx);
-        require!(out_len == n,
+        require!(out_len == n as u64,
                  "expected return type of length {}, found `{}` with length {}",
                  n, ret_ty, out_len);
         require!(in_elem == ret_ty.simd_type(tcx),
@@ -1251,7 +1252,7 @@ macro_rules! require_simd {
         // trailing bits.
         let expected_int_bits = in_len.max(8);
         match ret_ty.kind {
-           ty::Uint(i) if i.bit_width() == Some(expected_int_bits) => (),
+           ty::Uint(i) if i.bit_width() == Some(expected_int_bits as usize) => (),
             _ => return_error!(
                 "bitmask `{}`, expected `u{}`",
                 ret_ty, expected_int_bits
@@ -1276,7 +1277,8 @@ macro_rules! require_simd {
 
         // Shift the MSB to the right by "in_elem_bitwidth - 1" into the first bit position.
         let shift_indices = vec![
-            bx.cx.const_int(bx.type_ix(in_elem_bitwidth as _), (in_elem_bitwidth - 1) as _); in_len
+            bx.cx.const_int(bx.type_ix(in_elem_bitwidth as _), (in_elem_bitwidth - 1) as _);
+            in_len as _
         ];
         let i_xn_msb = bx.lshr(i_xn, bx.const_vector(shift_indices.as_slice()));
         // Truncate vector to an <i1 x N>
@@ -1291,7 +1293,7 @@ fn simd_simple_float_intrinsic(
         name: &str,
         in_elem: &::rustc::ty::TyS<'_>,
         in_ty: &::rustc::ty::TyS<'_>,
-        in_len: usize,
+        in_len: u64,
         bx: &mut Builder<'a, 'll, 'tcx>,
         span: Span,
         args: &[OperandRef<'tcx, &'ll Value>],
@@ -1506,11 +1508,12 @@ fn non_ptr(t: Ty<'_>) -> Ty<'_> {
         // Truncate the mask vector to a vector of i1s:
         let (mask, mask_ty) = {
             let i1 = bx.type_i1();
-            let i1xn = bx.type_vector(i1, in_len as u64);
+            let i1xn = bx.type_vector(i1, in_len);
             (bx.trunc(args[2].immediate(), i1xn), i1xn)
         };
 
         // Type of the vector of pointers:
+        let in_len = usize::try_from(in_len).unwrap();
         let llvm_pointer_vec_ty = llvm_vector_ty(bx, underlying_ty, in_len, pointer_count);
         let llvm_pointer_vec_str = llvm_vector_str(underlying_ty, in_len, pointer_count);
 
@@ -1606,13 +1609,14 @@ fn non_ptr(t: Ty<'_>) -> Ty<'_> {
         // Truncate the mask vector to a vector of i1s:
         let (mask, mask_ty) = {
             let i1 = bx.type_i1();
-            let i1xn = bx.type_vector(i1, in_len as u64);
+            let i1xn = bx.type_vector(i1, in_len);
             (bx.trunc(args[2].immediate(), i1xn), i1xn)
         };
 
         let ret_t = bx.type_void();
 
         // Type of the vector of pointers:
+        let in_len = usize::try_from(in_len).unwrap();
         let llvm_pointer_vec_ty = llvm_vector_ty(bx, underlying_ty, in_len, pointer_count);
         let llvm_pointer_vec_str = llvm_vector_str(underlying_ty, in_len, pointer_count);
 
index e43e6c0e43a8021c3b43a04f10112106fec8f9a3..23f7b1acb54d470f73c08386288aeca37538f675 100644 (file)
@@ -306,7 +306,6 @@ pub fn emulate_intrinsic(
                 let elem = args[2];
                 let input = args[0];
                 let (len, e_ty) = input.layout.ty.simd_size_and_type(self.tcx.tcx);
-                let len = len as u64;
                 assert!(
                     index < len,
                     "Index `{}` must be in bounds of vector type `{}`: `[0, {})`",
@@ -337,7 +336,7 @@ pub fn emulate_intrinsic(
                 let index = u64::from(self.read_scalar(args[1])?.to_u32()?);
                 let (len, e_ty) = args[0].layout.ty.simd_size_and_type(self.tcx.tcx);
                 assert!(
-                    index < len as u64,
+                    index < len,
                     "index `{}` is out-of-bounds of vector type `{}` with length `{}`",
                     index, e_ty, len
                 );