]> git.lizzy.rs Git - rust.git/commitdiff
Implement intrinsics {ctlz,cttz}{,_nonzero} and ctpop
authorbjorn3 <bjorn3@users.noreply.github.com>
Wed, 8 Aug 2018 12:39:46 +0000 (14:39 +0200)
committerbjorn3 <bjorn3@users.noreply.github.com>
Wed, 8 Aug 2018 12:39:46 +0000 (14:39 +0200)
examples/example.rs
examples/mini_core.rs
src/abi.rs
src/base.rs

index ecc5db5c0db18a25fe493763c14f6a5c89a02d31..05b370f91e08c1edcd929354390767f958328fbb 100644 (file)
@@ -150,3 +150,7 @@ unsafe fn call_uninit() -> u8 {
 fn repeat_array() -> [u8; 3] {
     [0; 3]
 }
+
+unsafe fn use_ctlz_nonzero(a: u16) -> u16 {
+    intrinsics::ctlz_nonzero(a)
+}
index dc19d66b214464acd9a958e7ae20dce5f5987259..17d321db345daaeb1de3cef386d5934248defb6d 100644 (file)
@@ -139,6 +139,7 @@ pub mod intrinsics {
         pub fn copy<T>(src: *const T, dst: *mut T, count: usize);
         pub fn transmute<T, U>(e: T) -> U;
         pub fn uninit<T>() -> T;
+        pub fn ctlz_nonzero<T>(x: T) -> T;
     }
 }
 
index 929002f0e80398103c0cc6a393e83be4b925d9ac..0d44952dc0d58086db73bfa56cca47c023a8d704 100644 (file)
@@ -500,6 +500,24 @@ pub fn codegen_call<'a, 'tcx: 'a>(
                     let uninit_val = uninit_place.to_cvalue(fx);
                     ret.write_cvalue(fx, uninit_val);
                 }
+                "ctlz" | "ctlz_nonzero" => {
+                    assert_eq!(args.len(), 1);
+                    let arg = args[0].load_value(fx);
+                    let res = CValue::ByVal(fx.bcx.ins().clz(arg), args[0].layout());
+                    ret.write_cvalue(fx, res);
+                }
+                "cttz" | "cttz_nonzero" => {
+                    assert_eq!(args.len(), 1);
+                    let arg = args[0].load_value(fx);
+                    let res = CValue::ByVal(fx.bcx.ins().clz(arg), args[0].layout());
+                    ret.write_cvalue(fx, res);
+                }
+                "ctpop" => {
+                    assert_eq!(args.len(), 1);
+                    let arg = args[0].load_value(fx);
+                    let res = CValue::ByVal(fx.bcx.ins().popcnt(arg), args[0].layout());
+                    ret.write_cvalue(fx, res);
+                }
                 _ => fx
                     .tcx
                     .sess
index d479e9350686fcd22a176641ac009d889451158b..31be6e58f4207c516129a7b66c475693ae39c24f 100644 (file)
@@ -359,7 +359,8 @@ fn trans_stmt<'a, 'tcx: 'a>(
                         UnOp::Not => fx.bcx.ins().bnot(val),
                         UnOp::Neg => match ty.sty {
                             TypeVariants::TyInt(_) => {
-                                let zero = fx.bcx.ins().iconst(types::I64, 0);
+                                let clif_ty = fx.cton_type(ty).unwrap();
+                                let zero = fx.bcx.ins().iconst(clif_ty, 0);
                                 fx.bcx.ins().isub(zero, val)
                             }
                             TypeVariants::TyFloat(_) => fx.bcx.ins().fneg(val),