Skip to content

Commit c0b5cc9

Browse files
committed
Do intrinsic changes in rustc_codegen_cranelift
1 parent 4b6bbcb commit c0b5cc9

File tree

3 files changed

+9
-5
lines changed

3 files changed

+9
-5
lines changed

compiler/rustc_codegen_cranelift/example/example.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ pub fn array_as_slice(arr: &[u8; 3]) -> &[u8] {
149149
arr
150150
}
151151

152-
pub unsafe fn use_ctlz_nonzero(a: u16) -> u16 {
152+
pub unsafe fn use_ctlz_nonzero(a: u16) -> u32 {
153153
intrinsics::ctlz_nonzero(a)
154154
}
155155

compiler/rustc_codegen_cranelift/example/mini_core.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -627,7 +627,7 @@ pub mod intrinsics {
627627
pub fn min_align_of_val<T: ?::Sized>(val: *const T) -> usize;
628628
pub fn copy<T>(src: *const T, dst: *mut T, count: usize);
629629
pub fn transmute<T, U>(e: T) -> U;
630-
pub fn ctlz_nonzero<T>(x: T) -> T;
630+
pub fn ctlz_nonzero<T>(x: T) -> u32;
631631
#[rustc_safe_intrinsic]
632632
pub fn needs_drop<T: ?::Sized>() -> bool;
633633
#[rustc_safe_intrinsic]

compiler/rustc_codegen_cranelift/src/intrinsics/mod.rs

+7-3
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ use rustc_span::source_map::Spanned;
2626
use rustc_span::symbol::{sym, Symbol};
2727

2828
pub(crate) use self::llvm::codegen_llvm_intrinsic_call;
29+
use crate::cast::clif_intcast;
2930
use crate::prelude::*;
3031

3132
fn bug_on_incorrect_arg_count(intrinsic: impl std::fmt::Display) -> ! {
@@ -627,7 +628,8 @@ fn codegen_regular_intrinsic_call<'tcx>(
627628

628629
// FIXME trap on `ctlz_nonzero` with zero arg.
629630
let res = fx.bcx.ins().clz(val);
630-
let res = CValue::by_val(res, arg.layout());
631+
let res = clif_intcast(fx, res, types::I32, false);
632+
let res = CValue::by_val(res, ret.layout());
631633
ret.write_cvalue(fx, res);
632634
}
633635
sym::cttz | sym::cttz_nonzero => {
@@ -636,15 +638,17 @@ fn codegen_regular_intrinsic_call<'tcx>(
636638

637639
// FIXME trap on `cttz_nonzero` with zero arg.
638640
let res = fx.bcx.ins().ctz(val);
639-
let res = CValue::by_val(res, arg.layout());
641+
let res = clif_intcast(fx, res, types::I32, false);
642+
let res = CValue::by_val(res, ret.layout());
640643
ret.write_cvalue(fx, res);
641644
}
642645
sym::ctpop => {
643646
intrinsic_args!(fx, args => (arg); intrinsic);
644647
let val = arg.load_scalar(fx);
645648

646649
let res = fx.bcx.ins().popcnt(val);
647-
let res = CValue::by_val(res, arg.layout());
650+
let res = clif_intcast(fx, res, types::I32, false);
651+
let res = CValue::by_val(res, ret.layout());
648652
ret.write_cvalue(fx, res);
649653
}
650654
sym::bitreverse => {

0 commit comments

Comments
 (0)