On Thu, May 28, 2026 at 01:02:46PM +0200, Uros Bizjak wrote:
> Like the attached patch?
Note, I've already committed my patch to trunk, so this won't apply there.
> I guess we should change all similar TYPE_LEA alternatives (ADD and SAL
> insns).
>
> Uros.
> diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
> index 063e14cb2c1..baa3a6f8db7 100644
> --- a/gcc/config/i386/i386.md
> +++ b/gcc/config/i386/i386.md
> @@ -983,6 +983,8 @@ (define_attr "enabled" ""
> (symbol_ref "TARGET_APX_NDD")
> (eq_attr "isa" "apx_ndd_64")
> (symbol_ref "TARGET_APX_NDD && Pmode == DImode")
> + (eq_attr "isa" "noapx_nf")
> + (symbol_ref "!TARGET_APX_NF")
> (eq_attr "isa" "vaes_avx512vl")
> (symbol_ref "TARGET_VAES && TARGET_AVX512VL")
> (eq_attr "isa" "avx10_2") (symbol_ref "TARGET_AVX10_2")
> @@ -6746,10 +6748,8 @@ (define_insn "*add<mode>_1<nf_name>"
> switch (get_attr_type (insn))
> {
> case TYPE_LEA:
> - if (TARGET_APX_NDD && <nf_applied>)
> - return "%{nf%} add{<imodesuffix>}\t{%2, %1, %0|%0, %1, %2}";
> - else
> - return "#";
> + gcc_assert (!TARGET_APX_NF);
> + return "#";
>
> case TYPE_INCDEC:
> if (operands[2] == const1_rtx)
> @@ -6776,7 +6776,7 @@ (define_insn "*add<mode>_1<nf_name>"
> : "<nf_prefix>add{<imodesuffix>}\t{%2, %0|%0, %2}";
> }
> }
> - [(set_attr "isa" "*,*,*,*,*,apx_ndd,apx_ndd,apx_ndd")
> + [(set_attr "isa" "*,*,*,*,noapx_nf,apx_ndd,apx_ndd,apx_ndd")
> (set (attr "type")
> (cond [(eq_attr "alternative" "4")
> (const_string "lea")
I thought we want some r <- r, e apx_ndd alternative (r <- r, l is already
covered), but then the operands are commutative with % and there is that
r <- rje, r alternative. On the other side, the canonical order for
CONST_INT operand in addition is that CONST_INT is the second operand, not
the first one, so maybe we do want that. But unsure where exactly the
actual insn wants the immediate. Though given that the TYPE_LEA
"%{nf%} add{<imodesuffix>}\t{%2, %1, %0|%0, %1, %2}" case supposedly
assembled as well as that r <- rje, r, maybe it accepts immediates in both
spots.
But gas rejects the second insn in
addq $24, %rax, %rdx
addq %rax, $24, %rdx
so I really wonder how the r <-> rje, r alternative actually works. This is
a mess.
Jakub