diff options
| author | Huon Wilson <dbau.pp+github@gmail.com> | 2015-07-20 11:55:47 -0700 |
|---|---|---|
| committer | Huon Wilson <dbau.pp+github@gmail.com> | 2015-08-17 14:41:38 -0700 |
| commit | 78eead63fa91dbe156236b547bb4290f02784712 (patch) | |
| tree | c28d0e3ffb8bf528732a8bf5a35d5f82d66b0a68 | |
| parent | 9af385bddb3076637ab299672c90702562644894 (diff) | |
| download | rust-78eead63fa91dbe156236b547bb4290f02784712.tar.gz rust-78eead63fa91dbe156236b547bb4290f02784712.zip | |
Implement the simd_insert/simd_extract intrinsics.
| -rw-r--r-- | src/librustc_trans/trans/intrinsic.rs | 21 | ||||
| -rw-r--r-- | src/librustc_typeck/check/mod.rs | 2 |
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) => { |
