From abc99c62595831127e8ac4dfd6ccacd7ccbf9942 Mon Sep 17 00:00:00 2001 From: bjorn3 Date: Fri, 27 Mar 2020 20:55:54 +0100 Subject: [PATCH] Allow storing SIMD vectors in SSA values --- src/common.rs | 12 ++++++++++++ src/lib.rs | 9 ++++++--- src/pretty_clif.rs | 3 ++- src/value_and_place.rs | 2 ++ 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/common.rs b/src/common.rs index c807bde15c30..166486c49a17 100644 --- a/src/common.rs +++ b/src/common.rs @@ -62,6 +62,18 @@ fn clif_type_from_ty<'tcx>(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> Option { + let (element, count) = match &tcx.layout_of(ParamEnv::reveal_all().and(ty)).unwrap().abi { + Abi::Vector { element, count } => (element.clone(), *count), + _ => unreachable!(), + }; + + match scalar_to_clif_type(tcx, element).by(u16::try_from(count).unwrap()) { + // Cranelift currently only implements icmp for 128bit vectors. + Some(vector_ty) if vector_ty.bits() == 128 => vector_ty, + _ => return None, + } + } ty::Param(_) => bug!("ty param {:?}", ty), _ => return None, }) diff --git a/src/lib.rs b/src/lib.rs index 1096dbd227d6..0376672fba7a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -299,6 +299,8 @@ fn build_isa(sess: &Session, enable_pic: bool) -> Box Box( let target_triple = crate::target_triple(tcx.sess); writeln!(file, "test compile").unwrap(); writeln!(file, "set is_pic").unwrap(); - writeln!(file, "target {}", target_triple).unwrap(); + writeln!(file, "set enable_simd").unwrap(); + writeln!(file, "target {} haswell", target_triple).unwrap(); writeln!(file, "").unwrap(); file.write(clif.as_bytes()).unwrap(); } diff --git a/src/value_and_place.rs b/src/value_and_place.rs index c9516a98bfe4..477a417639e9 100644 --- a/src/value_and_place.rs +++ b/src/value_and_place.rs @@ -589,6 +589,8 @@ impl<'tcx> CPlace<'tcx> { fx: &mut FunctionCx<'_, 'tcx, impl Backend>, field: mir::Field, ) -> CPlace<'tcx> { + // FIXME handle simd values + let layout = self.layout(); if let CPlaceInner::VarPair(local, var1, var2) = self.inner { let layout = layout.field(&*fx, field.index());