about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbjorn3 <bjorn3@users.noreply.github.com>2020-03-27 20:55:54 +0100
committerbjorn3 <bjorn3@users.noreply.github.com>2020-07-25 12:16:41 +0200
commitabc99c62595831127e8ac4dfd6ccacd7ccbf9942 (patch)
tree5fdd776cf3ad48c8d1e473f24fdf331d21470386 /src
parent66343bf4fc986332dc355dc922a7d68f84e5fd97 (diff)
downloadrust-abc99c62595831127e8ac4dfd6ccacd7ccbf9942.tar.gz
rust-abc99c62595831127e8ac4dfd6ccacd7ccbf9942.zip
Allow storing SIMD vectors in SSA values
Diffstat (limited to 'src')
-rw-r--r--src/common.rs12
-rw-r--r--src/lib.rs9
-rw-r--r--src/pretty_clif.rs3
-rw-r--r--src/value_and_place.rs2
4 files changed, 22 insertions, 4 deletions
diff --git a/src/common.rs b/src/common.rs
index c807bde15c3..166486c49a1 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<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,
     })
diff --git a/src/lib.rs b/src/lib.rs
index 1096dbd227d..0376672fba7 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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
diff --git a/src/pretty_clif.rs b/src/pretty_clif.rs
index 0dcd2c269e8..64346c423c8 100644
--- a/src/pretty_clif.rs
+++ b/src/pretty_clif.rs
@@ -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();
         }
diff --git a/src/value_and_place.rs b/src/value_and_place.rs
index c9516a98bfe..477a417639e 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());