about summary refs log tree commit diff
diff options
context:
space:
mode:
authorHuon Wilson <dbau.pp+github@gmail.com>2015-07-20 11:55:47 -0700
committerHuon Wilson <dbau.pp+github@gmail.com>2015-08-17 14:41:38 -0700
commit78eead63fa91dbe156236b547bb4290f02784712 (patch)
treec28d0e3ffb8bf528732a8bf5a35d5f82d66b0a68
parent9af385bddb3076637ab299672c90702562644894 (diff)
downloadrust-78eead63fa91dbe156236b547bb4290f02784712.tar.gz
rust-78eead63fa91dbe156236b547bb4290f02784712.zip
Implement the simd_insert/simd_extract intrinsics.
-rw-r--r--src/librustc_trans/trans/intrinsic.rs21
-rw-r--r--src/librustc_typeck/check/mod.rs2
2 files changed, 22 insertions, 1 deletions
diff --git a/src/librustc_trans/trans/intrinsic.rs b/src/librustc_trans/trans/intrinsic.rs
index f79b62878c1..7c8deb9a791 100644
--- a/src/librustc_trans/trans/intrinsic.rs
+++ b/src/librustc_trans/trans/intrinsic.rs
@@ -1426,5 +1426,24 @@ fn generic_simd_intrinsic<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
 
         return ShuffleVector(bcx, llargs[0], llargs[1], C_vector(&indices))
     }
-    C_null(llret_ty)
+
+    if name == "simd_insert" {
+        require!(arg_tys[0].is_simd(tcx),
+                 "SIMD insert intrinsic monomorphised for non-SIMD input type");
+
+        let elem_ty = arg_tys[0].simd_type(tcx);
+        require!(arg_tys[2] == elem_ty,
+                 "SIMD insert intrinsic monomorphised with inserted type not SIMD element type");
+        return InsertElement(bcx, llargs[0], llargs[2], llargs[1])
+    }
+    if name == "simd_extract" {
+        require!(arg_tys[0].is_simd(tcx),
+                 "SIMD insert intrinsic monomorphised for non-SIMD input type");
+
+        let elem_ty = arg_tys[0].simd_type(tcx);
+        require!(ret_ty == elem_ty,
+                 "SIMD insert intrinsic monomorphised with returned type not SIMD element type");
+        return ExtractElement(bcx, llargs[0], llargs[1])
+    }
+    bcx.sess().span_bug(call_info.span, "unknown SIMD intrinsic");
 }
diff --git a/src/librustc_typeck/check/mod.rs b/src/librustc_typeck/check/mod.rs
index 56230ae06f9..2821538a295 100644
--- a/src/librustc_typeck/check/mod.rs
+++ b/src/librustc_typeck/check/mod.rs
@@ -5344,6 +5344,8 @@ pub fn check_intrinsic_type(ccx: &CrateCtxt, it: &ast::ForeignItem) {
             "simd_eq" | "simd_ne" | "simd_lt" | "simd_le" | "simd_gt" | "simd_ge" => {
                 (2, vec![param(ccx, 0), param(ccx, 0)], param(ccx, 1))
             }
+            "simd_insert" => (2, vec![param(ccx, 0), tcx.types.u32, param(ccx, 1)], param(ccx, 0)),
+            "simd_extract" => (2, vec![param(ccx, 0), tcx.types.u32], param(ccx, 1)),
             name if name.starts_with("simd_shuffle") => {
                 match name["simd_shuffle".len()..].parse() {
                     Ok(n) => {