On Fri, Nov 3, 2023 at 6:34 PM Uros Bizjak <[email protected]> wrote:
>
> The patch generalizes address register class handling to allow multiple
> address register classes. For APX EGPR targets, some instructions can't be
> encoded with REX2 prefix, so it is necessary to limit address register
> class to avoid REX2 registers. The same situation happens for instructions
> with high registers, where the REX register can not be used in the address,
> so the existing infrastructure can be adapted to also handle this case.
>
> The patch is mostly a mechanical rename of "gpr32" attribute to "addr" and
> introduces no functional changes, although it fixes a couple of inconsistent
> attribute values in passing.
@@ -22569,9 +22578,8 @@ (define_insn "<sse4_1_avx2>_mpsadbw"
mpsadbw\t{%3, %2, %0|%0, %2, %3}
vmpsadbw\t{%3, %2, %1, %0|%0, %1, %2, %3}"
[(set_attr "isa" "noavx,noavx,avx")
- (set_attr "gpr32" "0,0,1")
+ (set_attr "addr" "rex")
(set_attr "type" "sselog1")
- (set_attr "gpr32" "0")
(set_attr "length_immediate" "1")
(set_attr "prefix_extra" "1")
(set_attr "prefix" "orig,orig,vex")
I believe your fix is correct.
>
> A follow-up patch will use the above infrastructure to limit address register
> class to legacy registers for instructions with high registers.
The patch looks good to me, but please leave some time for Hongyu in
case he has any comments.
>
> gcc/ChangeLog:
>
> * config/i386/i386.cc (ix86_memory_address_use_extended_reg_class_p):
> Rename to ...
> (ix86_memory_address_reg_class): ... this. Generalize address
> register class handling to allow multiple address register classes.
> Return maximal class for unrecognized instructions. Improve comments.
> (ix86_insn_base_reg_class): Rewrite to handle
> multiple address register classes.
> (ix86_regno_ok_for_insn_base_p): Ditto.
> (ix86_insn_index_reg_class): Ditto.
> * config/i386/i386.md: Rename "gpr32" attribute to "addr"
> and substitute its values with "0" -> "rex", "1" -> "*".
> (addr): New attribute to limit allowed address register set.
> (gpr32): Remove.
> * config/i386/mmx.md: Rename "gpr32" attribute to "addr"
> and substitute its values with "0" -> "rex", "1" -> "*".
> * config/i386/sse.md: Ditto.
>
> Bootstrapped and regression tested on x86_64-linux-gnu {,-m32}.
>
> Comments welcome.
>
> Uros.
--
BR,
Hongtao