Skip to content

Commit c5093a2

Browse files
committed
Fix cg_clif implementation
1 parent 3e9b6bd commit c5093a2

File tree

1 file changed

+14
-18
lines changed
  • compiler/rustc_codegen_cranelift/src/intrinsics

1 file changed

+14
-18
lines changed

compiler/rustc_codegen_cranelift/src/intrinsics/mod.rs

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -659,8 +659,7 @@ fn codegen_regular_intrinsic_call<'tcx>(
659659
intrinsic_args!(fx, args => (x, y, z); intrinsic);
660660
let layout = x.layout();
661661

662-
let width_bits = layout.size.bits() as u64;
663-
let width_bits = fx.bcx.ins().iconst(types::I32, width_bits as i64);
662+
let width_bits = layout.size.bits() as i64;
664663

665664
let lhs_bits = x.load_scalar(fx);
666665
let rhs_bits = y.load_scalar(fx);
@@ -669,17 +668,16 @@ fn codegen_regular_intrinsic_call<'tcx>(
669668
let ty = fx.bcx.func.dfg.value_type(lhs_bits);
670669
let zero = fx.bcx.ins().iconst(ty, 0);
671670

672-
let shift_bits = fx.bcx.ins().urem(raw_shift_bits, width_bits);
671+
let shift_bits = fx.bcx.ins().band_imm(raw_shift_bits, width_bits - 1);
672+
let inv_shift_bits = fx.bcx.ins().irsub_imm(shift_bits, width_bits);
673+
let is_zero = fx.bcx.ins().icmp_imm(IntCC::Equal, shift_bits, 0);
673674

674675
// lhs_bits << shift_bits
675676
let shl = fx.bcx.ins().ishl(lhs_bits, shift_bits);
676677

677-
let inv_shift_bits = fx.bcx.ins().isub(width_bits, shift_bits);
678-
679-
// rhs_bits.bounded_shr(inv_shift_bits)
680-
let inv_shift_bits_mod = fx.bcx.ins().urem(inv_shift_bits, width_bits);
681-
let shr = fx.bcx.ins().ushr(rhs_bits, inv_shift_bits_mod);
682-
let is_zero = fx.bcx.ins().icmp(IntCC::Equal, inv_shift_bits_mod, zero);
678+
// rhs_bits.unbounded_shr(inv_shift_bits)
679+
// we don't need a modulo here because `ushr` implicitly does it
680+
let shr = fx.bcx.ins().ushr(rhs_bits, inv_shift_bits);
683681
let shr = fx.bcx.ins().select(is_zero, zero, shr);
684682

685683
let res = fx.bcx.ins().bor(shr, shl);
@@ -689,8 +687,7 @@ fn codegen_regular_intrinsic_call<'tcx>(
689687
intrinsic_args!(fx, args => (x, y, z); intrinsic);
690688
let layout = x.layout();
691689

692-
let width_bits = layout.size.bits() as u64;
693-
let width_bits = fx.bcx.ins().iconst(types::I32, width_bits as i64);
690+
let width_bits = layout.size.bits() as i64;
694691

695692
let lhs_bits = x.load_scalar(fx);
696693
let rhs_bits = y.load_scalar(fx);
@@ -699,17 +696,16 @@ fn codegen_regular_intrinsic_call<'tcx>(
699696
let ty = fx.bcx.func.dfg.value_type(lhs_bits);
700697
let zero = fx.bcx.ins().iconst(ty, 0);
701698

702-
let shift_bits = fx.bcx.ins().urem(raw_shift_bits, width_bits);
699+
let shift_bits = fx.bcx.ins().band_imm(raw_shift_bits, width_bits - 1);
700+
let inv_shift_bits = fx.bcx.ins().irsub_imm(shift_bits, width_bits);
701+
let is_zero = fx.bcx.ins().icmp_imm(IntCC::Equal, shift_bits, 0);
703702

704703
// rhs_bits >> shift_bits
705704
let shr = fx.bcx.ins().ushr(rhs_bits, shift_bits);
706705

707-
let inv_shift_bits = fx.bcx.ins().isub(width_bits, shift_bits);
708-
709-
// lhs_bits.bounded_shl(inv_shift_bits)
710-
let inv_shift_bits_mod = fx.bcx.ins().urem(inv_shift_bits, width_bits);
711-
let shl = fx.bcx.ins().ishl(lhs_bits, inv_shift_bits_mod);
712-
let is_zero = fx.bcx.ins().icmp(IntCC::Equal, inv_shift_bits_mod, zero);
706+
// lhs_bits.unbounded_shl(inv_shift_bits)
707+
// we don't need a modulo here because `ishl` implicitly does it
708+
let shl = fx.bcx.ins().ishl(lhs_bits, inv_shift_bits);
713709
let shl = fx.bcx.ins().select(is_zero, zero, shl);
714710

715711
let res = fx.bcx.ins().bor(shr, shl);

0 commit comments

Comments
 (0)