]> git.lizzy.rs Git - rust.git/commitdiff
Implement the simd_insert/simd_extract intrinsics.
authorHuon Wilson <dbau.pp+github@gmail.com>
Mon, 20 Jul 2015 18:55:47 +0000 (11:55 -0700)
committerHuon Wilson <dbau.pp+github@gmail.com>
Mon, 17 Aug 2015 21:41:38 +0000 (14:41 -0700)
src/librustc_trans/trans/intrinsic.rs
src/librustc_typeck/check/mod.rs

index f79b62878c1e9eca8b282c8f942ecabdb856cf9e..7c8deb9a791ebfb73c630727500da02a4574c81f 100644 (file)
@@ -1426,5 +1426,24 @@ macro_rules! require {
 
         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");
 }
index 56230ae06f9e1cb931d5da67c420d67d179ad68b..2821538a295361c81c65554a9c8020a078c1fcbe 100644 (file)
@@ -5344,6 +5344,8 @@ fn param<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>, n: u32) -> Ty<'tcx> {
             "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) => {