Allow storing SIMD vectors in SSA values

This commit is contained in:
bjorn3 2020-03-27 20:55:54 +01:00
parent 66343bf4fc
commit abc99c6259
4 changed files with 22 additions and 4 deletions

View File

@ -62,6 +62,18 @@ fn clif_type_from_ty<'tcx>(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> Option<types::Typ
pointer_ty(tcx)
}
}
ty::Adt(adt_def, _) if adt_def.repr.simd() => {
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,
})

View File

@ -299,6 +299,8 @@ fn build_isa(sess: &Session, enable_pic: bool) -> Box<dyn isa::TargetIsa + 'stat
};
flags_builder.set("tls_model", tls_model).unwrap();
flags_builder.set("enable_simd", "true").unwrap();
// FIXME(CraneStation/cranelift#732) fix LICM in presence of jump tables
/*
use rustc_session::config::OptLevel;
@ -316,9 +318,10 @@ fn build_isa(sess: &Session, enable_pic: bool) -> Box<dyn isa::TargetIsa + 'stat
}*/
let flags = settings::Flags::new(flags_builder);
cranelift_codegen::isa::lookup(target_triple)
.unwrap()
.finish(flags)
let mut isa_builder = cranelift_codegen::isa::lookup(target_triple).unwrap();
isa_builder.enable("haswell").unwrap();
isa_builder.finish(flags)
}
/// This is the entrypoint for a hot plugged rustc_codegen_cranelift

View File

@ -248,7 +248,8 @@ pub(crate) fn write_clif_file<'tcx>(
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();
}

View File

@ -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());