Re: [PATCH v1 1/2] powerpc/bitops: Use immediate operand when possible

From: Christophe Leroy
Date: Tue Apr 13 2021 - 12:34:05 EST




Le 12/04/2021 à 23:54, Segher Boessenkool a écrit :
Hi!

On Thu, Apr 08, 2021 at 03:33:44PM +0000, Christophe Leroy wrote:
For clear bits, on 32 bits 'rlwinm' can be used instead or 'andc' for
when all bits to be cleared are consecutive.

Also on 64-bits, as long as both the top and bottom bits are in the low
32-bit half (for 32 bit mode, it can wrap as well).

Yes. But here we are talking about clearing a few bits, all other ones must remain unchanged. An rlwinm on PPC64 will always clear the upper part, which is unlikely what we want.


For the time being only
handle the single bit case, which we detect by checking whether the
mask is a power of two.

You could look at rs6000_is_valid_mask in GCC:
<https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/config/rs6000/rs6000.c;h=48b8efd732b251c059628096314848305deb0c0b;hb=HEAD#l11148>
used by rs6000_is_valid_and_mask immediately after it. You probably
want to allow only rlwinm in your case, and please note this checks if
something is a valid mask, not the inverse of a valid mask (as you
want here).

This check looks more complex than what I need. It is used for both rlw... and rld..., and it calculates the operants. The only thing I need is to validate the mask.
I found a way: By anding the mask with the complement of itself rotated by left bits to 1, we identify the transitions from 0 to 1. If the result is a power of 2, it means there's only one transition so the mask is as expected.

So I did that in v2.



So yes this is pretty involved :-)

Your patch looks good btw. But please use "n", not "i", as constraint?

Done.

Christophe