On 24/05/16 14:25, Kyrill Tkachov wrote: > Hi all, > > The int_log2 function in arm.c is not really useful since we already have a > generic function for calculating > the log2 of HOST_WIDE_INTs. The only difference in functionality is that > int_log2 also asserts that the result > is no greater than 31. > > This patch removes int_log2 in favour of exact_log2 and adds an assert on the > result to make sure the return > value was as expected. > > Bootstrapped and tested on arm-none-linux-gnueabihf. > > Is this ok? Or is there something I'm missing about int_log2?
Not that I can see - this is OK. Thanks for the patience, I'm behind on patch reviews thanks to unplanned time off recently. Ramana > > Thanks, > Kyrill > > 2016-05-24 Kyrylo Tkachov <kyrylo.tkac...@arm.com> > > * config/arm/arm.c (int_log2): Delete definition and prototype. > (shift_op): Use exact_log2 instead of int_log2. > (vfp3_const_double_for_fract_bits): Likewise. > > arm-1.patch > > > diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c > index > 6cc0feb6f87157171c889e998e52b4e5d8683c66..3fe6eab46f3c18ace6899b5be45ad646992f43e4 > 100644 > --- a/gcc/config/arm/arm.c > +++ b/gcc/config/arm/arm.c > @@ -104,7 +104,6 @@ static void arm_print_operand_address (FILE *, > machine_mode, rtx); > static bool arm_print_operand_punct_valid_p (unsigned char code); > static const char *fp_const_from_val (REAL_VALUE_TYPE *); > static arm_cc get_arm_condition_code (rtx); > -static HOST_WIDE_INT int_log2 (HOST_WIDE_INT); > static const char *output_multi_immediate (rtx *, const char *, const char *, > int, HOST_WIDE_INT); > static const char *shift_op (rtx, HOST_WIDE_INT *); > @@ -18920,7 +18919,8 @@ shift_op (rtx op, HOST_WIDE_INT *amountp) > return NULL; > } > > - *amountp = int_log2 (*amountp); > + *amountp = exact_log2 (*amountp); > + gcc_assert (IN_RANGE (*amountp, 0, 31)); > return ARM_LSL_NAME; > > default: > @@ -18952,22 +18952,6 @@ shift_op (rtx op, HOST_WIDE_INT *amountp) > return mnem; > } > > -/* Obtain the shift from the POWER of two. */ > - > -static HOST_WIDE_INT > -int_log2 (HOST_WIDE_INT power) > -{ > - HOST_WIDE_INT shift = 0; > - > - while ((((HOST_WIDE_INT) 1 << shift) & power) == 0) > - { > - gcc_assert (shift <= 31); > - shift++; > - } > - > - return shift; > -} > - > /* Output a .ascii pseudo-op, keeping track of lengths. This is > because /bin/as is horribly restrictive. The judgement about > whether or not each character is 'printable' (and can be output as > @@ -27691,7 +27675,11 @@ vfp3_const_double_for_fract_bits (rtx operand) > HOST_WIDE_INT value = real_to_integer (&r0); > value = value & 0xffffffff; > if ((value != 0) && ( (value & (value - 1)) == 0)) > - return int_log2 (value); > + { > + int ret = exact_log2 (value); > + gcc_assert (IN_RANGE (ret, 0, 31)); > + return ret; > + } > } > } > return 0; >