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;
}
}
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
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),