about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbjorn3 <bjorn3@users.noreply.github.com>2019-06-23 16:33:34 +0200
committerbjorn3 <bjorn3@users.noreply.github.com>2019-06-23 16:36:14 +0200
commitd425116bdc764bdd46bf482c91aeef38fe4480e7 (patch)
tree03f171aa35d133d4438f3d39fd3ae2ecae955ca2
parentd7274ac5fdf84452cdfd09727e106bac2bf50e36 (diff)
downloadrust-d425116bdc764bdd46bf482c91aeef38fe4480e7.tar.gz
rust-d425116bdc764bdd46bf482c91aeef38fe4480e7.zip
Implement some intrinsics
-rw-r--r--src/constant.rs2
-rw-r--r--src/intrinsics.rs26
2 files changed, 27 insertions, 1 deletions
diff --git a/src/constant.rs b/src/constant.rs
index 72dd65ab3da..c13cc72b88d 100644
--- a/src/constant.rs
+++ b/src/constant.rs
@@ -106,7 +106,7 @@ pub fn force_eval_const<'a, 'tcx: 'a>(
     }
 }
 
-fn trans_const_value<'a, 'tcx: 'a>(
+pub fn trans_const_value<'a, 'tcx: 'a>(
     fx: &mut FunctionCx<'a, 'tcx, impl Backend>,
     const_: Const<'tcx>,
 ) -> CValue<'tcx> {
diff --git a/src/intrinsics.rs b/src/intrinsics.rs
index 24494d0f8d3..18a300ed12e 100644
--- a/src/intrinsics.rs
+++ b/src/intrinsics.rs
@@ -186,11 +186,24 @@ pub fn codegen_intrinsic_call<'a, 'tcx: 'a>(
             };
             ret.write_cvalue(fx, CValue::by_val(align, usize_layout));
         };
+        pref_align_of, <T> () {
+            let pref_align = fx.layout_of(T).align.pref.bytes();
+            let pref_align = CValue::const_val(fx, usize_layout.ty, pref_align as i64);
+            ret.write_cvalue(fx, pref_align);
+        };
+
+
         type_id, <T> () {
             let type_id = fx.tcx.type_id_hash(T);
             let type_id = CValue::const_val(fx, u64_layout.ty, type_id as i64);
             ret.write_cvalue(fx, type_id);
         };
+        type_name, <T> () {
+            let type_name = fx.tcx.type_name(T);
+            let type_name = crate::constant::trans_const_value(fx, *type_name);
+            ret.write_cvalue(fx, type_name);
+        };
+
         _ if intrinsic.starts_with("unchecked_") || intrinsic == "exact_div", (c x, c y) {
             // FIXME trap on overflow
             let bin_op = match intrinsic {
@@ -418,6 +431,19 @@ pub fn codegen_intrinsic_call<'a, 'tcx: 'a>(
             }
         };
 
+        volatile_load, (c ptr) {
+            // Cranelift treats loads as volatile by default
+            let inner_layout =
+                fx.layout_of(ptr.layout().ty.builtin_deref(true).unwrap().ty);
+            let val = CValue::by_ref(ptr.load_scalar(fx), inner_layout);
+            ret.write_cvalue(fx, val);
+        };
+        volatile_store, (v ptr, c val) {
+            // Cranelift treats stores as volatile by default
+            let dest = CPlace::for_addr(ptr, val.layout());
+            dest.write_cvalue(fx, val);
+        };
+
         _ if intrinsic.starts_with("atomic_fence"), () {};
         _ if intrinsic.starts_with("atomic_singlethreadfence"), () {};
         _ if intrinsic.starts_with("atomic_load"), (c ptr) {