@@ -659,8 +659,7 @@ fn codegen_regular_intrinsic_call<'tcx>(
659
659
intrinsic_args ! ( fx, args => ( x, y, z) ; intrinsic) ;
660
660
let layout = x. layout ( ) ;
661
661
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 ;
664
663
665
664
let lhs_bits = x. load_scalar ( fx) ;
666
665
let rhs_bits = y. load_scalar ( fx) ;
@@ -669,17 +668,16 @@ fn codegen_regular_intrinsic_call<'tcx>(
669
668
let ty = fx. bcx . func . dfg . value_type ( lhs_bits) ;
670
669
let zero = fx. bcx . ins ( ) . iconst ( ty, 0 ) ;
671
670
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 ) ;
673
674
674
675
// lhs_bits << shift_bits
675
676
let shl = fx. bcx . ins ( ) . ishl ( lhs_bits, shift_bits) ;
676
677
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) ;
683
681
let shr = fx. bcx . ins ( ) . select ( is_zero, zero, shr) ;
684
682
685
683
let res = fx. bcx . ins ( ) . bor ( shr, shl) ;
@@ -689,8 +687,7 @@ fn codegen_regular_intrinsic_call<'tcx>(
689
687
intrinsic_args ! ( fx, args => ( x, y, z) ; intrinsic) ;
690
688
let layout = x. layout ( ) ;
691
689
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 ;
694
691
695
692
let lhs_bits = x. load_scalar ( fx) ;
696
693
let rhs_bits = y. load_scalar ( fx) ;
@@ -699,17 +696,16 @@ fn codegen_regular_intrinsic_call<'tcx>(
699
696
let ty = fx. bcx . func . dfg . value_type ( lhs_bits) ;
700
697
let zero = fx. bcx . ins ( ) . iconst ( ty, 0 ) ;
701
698
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 ) ;
703
702
704
703
// rhs_bits >> shift_bits
705
704
let shr = fx. bcx . ins ( ) . ushr ( rhs_bits, shift_bits) ;
706
705
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) ;
713
709
let shl = fx. bcx . ins ( ) . select ( is_zero, zero, shl) ;
714
710
715
711
let res = fx. bcx . ins ( ) . bor ( shr, shl) ;
0 commit comments