diff mbox

[ARM,1/4] Replace uses of int_log2 by exact_log2

Message ID 57500C72.4010308@foss.arm.com
State New
Headers show

Commit Message

Kyrill Tkachov June 2, 2016, 10:37 a.m. UTC
I wanted to ping this patch, but checking the gcc-patches archive I see this wasn't
archived, though I have confirmed that the patch was sent out and distributed by
the mail server correctly.

Anyway, resending...

Thanks,
Kyrill

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?
>
> Thanks,
> Kyrill
>
> 2016-05-24  Kyrylo Tkachov  <kyrylo.tkachov@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.

Comments

Kyrill Tkachov June 9, 2016, 11:04 a.m. UTC | #1
Ping.
https://gcc.gnu.org/ml/gcc-patches/2016-06/msg00139.html

Thanks,
Kyrill

On 02/06/16 11:37, Kyrill Tkachov wrote:
> I wanted to ping this patch, but checking the gcc-patches archive I see this wasn't
> archived, though I have confirmed that the patch was sent out and distributed by
> the mail server correctly.
>
> Anyway, resending...
>
> Thanks,
> Kyrill
>
> 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?
>>
>> Thanks,
>> Kyrill
>>
>> 2016-05-24  Kyrylo Tkachov  <kyrylo.tkachov@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.
>
Kyrill Tkachov June 16, 2016, 9:31 a.m. UTC | #2
Ping.

Thanks,
Kyrill

On 09/06/16 12:04, Kyrill Tkachov wrote:
> Ping.
> https://gcc.gnu.org/ml/gcc-patches/2016-06/msg00139.html
>
> Thanks,
> Kyrill
>
> On 02/06/16 11:37, Kyrill Tkachov wrote:
>> I wanted to ping this patch, but checking the gcc-patches archive I see this wasn't
>> archived, though I have confirmed that the patch was sent out and distributed by
>> the mail server correctly.
>>
>> Anyway, resending...
>>
>> Thanks,
>> Kyrill
>>
>> 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?
>>>
>>> Thanks,
>>> Kyrill
>>>
>>> 2016-05-24  Kyrylo Tkachov  <kyrylo.tkachov@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.
>>
>
Kyrill Tkachov June 24, 2016, 12:28 p.m. UTC | #3
Ping.

Thanks,
Kyrill

On 16/06/16 10:31, Kyrill Tkachov wrote:
> Ping.
>
> Thanks,
> Kyrill
>
> On 09/06/16 12:04, Kyrill Tkachov wrote:
>> Ping.
>> https://gcc.gnu.org/ml/gcc-patches/2016-06/msg00139.html
>>
>> Thanks,
>> Kyrill
>>
>> On 02/06/16 11:37, Kyrill Tkachov wrote:
>>> I wanted to ping this patch, but checking the gcc-patches archive I see this wasn't
>>> archived, though I have confirmed that the patch was sent out and distributed by
>>> the mail server correctly.
>>>
>>> Anyway, resending...
>>>
>>> Thanks,
>>> Kyrill
>>>
>>> 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?
>>>>
>>>> Thanks,
>>>> Kyrill
>>>>
>>>> 2016-05-24  Kyrylo Tkachov  <kyrylo.tkachov@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.
>>>
>>
>
diff mbox

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;