[v2] x86/{,V}AES: adjust when to force EVEX encoding

Message ID aac51702-1ede-464d-8154-a6754df27a8c@suse.com
State Committed
Commit 0ab66f099bf0f405542944c5ce178151bea934b2
Headers
Series [v2] x86/{,V}AES: adjust when to force EVEX encoding |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gcc_build--master-arm success Build passed
linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 success Build passed
linaro-tcwg-bot/tcwg_gcc_check--master-arm success Test passed
linaro-tcwg-bot/tcwg_gcc_check--master-aarch64 success Test passed

Commit Message

Jan Beulich Sept. 30, 2024, 7:32 a.m. UTC
  Commit a79d13a01f8c ("i386: Fix aes/vaes patterns [PR114576]") correctly
said "..., but we need to emit {evex} prefix in the assembly if AES ISA
is not enabled". Yet it did so only for the TARGET_AES insns. Going from
the alternative chosen in the TARGET_VAES insns isn't quite right: If
AES is (also) enabled, EVEX encoding would needlessly be forced.

gcc/

	* config/i386/sse.md (vaesdec_<mode>, vaesdeclast_<mode>,
	vaesenc_<mode>, vaesenclast_<mode>): Replace which_alternative
	check by TARGET_AES one.
---
As an aside - {evex} (and other) pseudo-prefixes would better be avoided
anyway whenever possible, as those are getting in the way of code
putting in place macro overrides for certain insns: gas 2.43 rejects
such bogus placement of pseudo-prefixes.

Is it, btw, correct that none of these insns have a "prefix" attribute?
---
v2: Adjust (shrink) description.
  

Comments

Hongtao Liu Oct. 8, 2024, 6:54 a.m. UTC | #1
On Mon, Sep 30, 2024 at 3:33 PM Jan Beulich <jbeulich@suse.com> wrote:
>
> Commit a79d13a01f8c ("i386: Fix aes/vaes patterns [PR114576]") correctly
> said "..., but we need to emit {evex} prefix in the assembly if AES ISA
> is not enabled". Yet it did so only for the TARGET_AES insns. Going from
> the alternative chosen in the TARGET_VAES insns isn't quite right: If
> AES is (also) enabled, EVEX encoding would needlessly be forced.
>
> gcc/
>
>         * config/i386/sse.md (vaesdec_<mode>, vaesdeclast_<mode>,
>         vaesenc_<mode>, vaesenclast_<mode>): Replace which_alternative
>         check by TARGET_AES one.
> ---
> As an aside - {evex} (and other) pseudo-prefixes would better be avoided
> anyway whenever possible, as those are getting in the way of code
> putting in place macro overrides for certain insns: gas 2.43 rejects
> such bogus placement of pseudo-prefixes.
>
> Is it, btw, correct that none of these insns have a "prefix" attribute?
There's some automatic in i386.md to determine the prefix, rough, not
very accurate.

  688;; Prefix used: original, VEX or maybe VEX.
  689(define_attr "prefix" "orig,vex,maybe_vex,evex,maybe_evex"
  690  (cond [(eq_attr "mode" "OI,V8SF,V4DF")
  691           (const_string "vex")
  692         (eq_attr "mode" "XI,V16SF,V8DF")
  693           (const_string "evex")
  694         (eq_attr "type" "ssemuladd")
  695           (if_then_else (eq_attr "isa" "fma4")
  696             (const_string "vex")
  697             (const_string "maybe_evex"))
  698         (eq_attr "type" "sse4arg")
  699           (const_string "vex")
  700        ]
  701        (const_string "orig")))
  702

> ---
> v2: Adjust (shrink) description.
Ok for the patch.
>
> --- a/gcc/config/i386/sse.md
> +++ b/gcc/config/i386/sse.md
> @@ -30802,7 +30802,7 @@
>           UNSPEC_VAESDEC))]
>    "TARGET_VAES"
>  {
> -  if (which_alternative == 0 && <MODE>mode == V16QImode)
> +  if (!TARGET_AES && <MODE>mode == V16QImode)
>      return "%{evex%} vaesdec\t{%2, %1, %0|%0, %1, %2}";
>    else
>      return "vaesdec\t{%2, %1, %0|%0, %1, %2}";
> @@ -30816,7 +30816,7 @@
>           UNSPEC_VAESDECLAST))]
>    "TARGET_VAES"
>  {
> -  if (which_alternative == 0 && <MODE>mode == V16QImode)
> +  if (!TARGET_AES && <MODE>mode == V16QImode)
>      return "%{evex%} vaesdeclast\t{%2, %1, %0|%0, %1, %2}";
>    else
>      return "vaesdeclast\t{%2, %1, %0|%0, %1, %2}";
> @@ -30830,7 +30830,7 @@
>           UNSPEC_VAESENC))]
>    "TARGET_VAES"
>  {
> -  if (which_alternative == 0 && <MODE>mode == V16QImode)
> +  if (!TARGET_AES && <MODE>mode == V16QImode)
>      return "%{evex%} vaesenc\t{%2, %1, %0|%0, %1, %2}";
>    else
>      return "vaesenc\t{%2, %1, %0|%0, %1, %2}";
> @@ -30844,7 +30844,7 @@
>           UNSPEC_VAESENCLAST))]
>    "TARGET_VAES"
>  {
> -  if (which_alternative == 0 && <MODE>mode == V16QImode)
> +  if (!TARGET_AES && <MODE>mode == V16QImode)
>      return "%{evex%} vaesenclast\t{%2, %1, %0|%0, %1, %2}";
>    else
>      return "vaesenclast\t{%2, %1, %0|%0, %1, %2}";
  
Jan Beulich Oct. 8, 2024, 7 a.m. UTC | #2
On 08.10.2024 08:54, Hongtao Liu wrote:
> On Mon, Sep 30, 2024 at 3:33 PM Jan Beulich <jbeulich@suse.com> wrote:
>>
>> Commit a79d13a01f8c ("i386: Fix aes/vaes patterns [PR114576]") correctly
>> said "..., but we need to emit {evex} prefix in the assembly if AES ISA
>> is not enabled". Yet it did so only for the TARGET_AES insns. Going from
>> the alternative chosen in the TARGET_VAES insns isn't quite right: If
>> AES is (also) enabled, EVEX encoding would needlessly be forced.
>>
>> gcc/
>>
>>         * config/i386/sse.md (vaesdec_<mode>, vaesdeclast_<mode>,
>>         vaesenc_<mode>, vaesenclast_<mode>): Replace which_alternative
>>         check by TARGET_AES one.
>> ---
>> As an aside - {evex} (and other) pseudo-prefixes would better be avoided
>> anyway whenever possible, as those are getting in the way of code
>> putting in place macro overrides for certain insns: gas 2.43 rejects
>> such bogus placement of pseudo-prefixes.
>>
>> Is it, btw, correct that none of these insns have a "prefix" attribute?
> There's some automatic in i386.md to determine the prefix, rough, not
> very accurate.
> 
>   688;; Prefix used: original, VEX or maybe VEX.
>   689(define_attr "prefix" "orig,vex,maybe_vex,evex,maybe_evex"
>   690  (cond [(eq_attr "mode" "OI,V8SF,V4DF")
>   691           (const_string "vex")
>   692         (eq_attr "mode" "XI,V16SF,V8DF")
>   693           (const_string "evex")
>   694         (eq_attr "type" "ssemuladd")
>   695           (if_then_else (eq_attr "isa" "fma4")
>   696             (const_string "vex")
>   697             (const_string "maybe_evex"))
>   698         (eq_attr "type" "sse4arg")
>   699           (const_string "vex")
>   700        ]
>   701        (const_string "orig")))
>   702

I'm aware, and I raised the question because it seemed pretty clear to
me that it wouldn't get things right here.

>> ---
>> v2: Adjust (shrink) description.
> Ok for the patch.

Thanks. What about the 14.x branch?

Jan
  
Hongtao Liu Oct. 8, 2024, 7:33 a.m. UTC | #3
On Tue, Oct 8, 2024 at 3:00 PM Jan Beulich <jbeulich@suse.com> wrote:
>
> On 08.10.2024 08:54, Hongtao Liu wrote:
> > On Mon, Sep 30, 2024 at 3:33 PM Jan Beulich <jbeulich@suse.com> wrote:
> >>
> >> Commit a79d13a01f8c ("i386: Fix aes/vaes patterns [PR114576]") correctly
> >> said "..., but we need to emit {evex} prefix in the assembly if AES ISA
> >> is not enabled". Yet it did so only for the TARGET_AES insns. Going from
> >> the alternative chosen in the TARGET_VAES insns isn't quite right: If
> >> AES is (also) enabled, EVEX encoding would needlessly be forced.
> >>
> >> gcc/
> >>
> >>         * config/i386/sse.md (vaesdec_<mode>, vaesdeclast_<mode>,
> >>         vaesenc_<mode>, vaesenclast_<mode>): Replace which_alternative
> >>         check by TARGET_AES one.
> >> ---
> >> As an aside - {evex} (and other) pseudo-prefixes would better be avoided
> >> anyway whenever possible, as those are getting in the way of code
> >> putting in place macro overrides for certain insns: gas 2.43 rejects
> >> such bogus placement of pseudo-prefixes.
> >>
> >> Is it, btw, correct that none of these insns have a "prefix" attribute?
> > There's some automatic in i386.md to determine the prefix, rough, not
> > very accurate.
> >
> >   688;; Prefix used: original, VEX or maybe VEX.
> >   689(define_attr "prefix" "orig,vex,maybe_vex,evex,maybe_evex"
> >   690  (cond [(eq_attr "mode" "OI,V8SF,V4DF")
> >   691           (const_string "vex")
> >   692         (eq_attr "mode" "XI,V16SF,V8DF")
> >   693           (const_string "evex")
> >   694         (eq_attr "type" "ssemuladd")
> >   695           (if_then_else (eq_attr "isa" "fma4")
> >   696             (const_string "vex")
> >   697             (const_string "maybe_evex"))
> >   698         (eq_attr "type" "sse4arg")
> >   699           (const_string "vex")
> >   700        ]
> >   701        (const_string "orig")))
> >   702
>
> I'm aware, and I raised the question because it seemed pretty clear to
> me that it wouldn't get things right here.
AFAIK It's mainly for attr length to determine the codesize of
instructions( ix86_min_insn_size), and the rough model should be
sufficient for most cases.
>
> >> ---
> >> v2: Adjust (shrink) description.
> > Ok for the patch.
>
> Thanks. What about the 14.x branch?
Also Ok.
>
> Jan
  

Patch

--- a/gcc/config/i386/sse.md
+++ b/gcc/config/i386/sse.md
@@ -30802,7 +30802,7 @@ 
 	  UNSPEC_VAESDEC))]
   "TARGET_VAES"
 {
-  if (which_alternative == 0 && <MODE>mode == V16QImode)
+  if (!TARGET_AES && <MODE>mode == V16QImode)
     return "%{evex%} vaesdec\t{%2, %1, %0|%0, %1, %2}";
   else
     return "vaesdec\t{%2, %1, %0|%0, %1, %2}";
@@ -30816,7 +30816,7 @@ 
 	  UNSPEC_VAESDECLAST))]
   "TARGET_VAES"
 {
-  if (which_alternative == 0 && <MODE>mode == V16QImode)
+  if (!TARGET_AES && <MODE>mode == V16QImode)
     return "%{evex%} vaesdeclast\t{%2, %1, %0|%0, %1, %2}";
   else
     return "vaesdeclast\t{%2, %1, %0|%0, %1, %2}";
@@ -30830,7 +30830,7 @@ 
 	  UNSPEC_VAESENC))]
   "TARGET_VAES"
 {
-  if (which_alternative == 0 && <MODE>mode == V16QImode)
+  if (!TARGET_AES && <MODE>mode == V16QImode)
     return "%{evex%} vaesenc\t{%2, %1, %0|%0, %1, %2}";
   else
     return "vaesenc\t{%2, %1, %0|%0, %1, %2}";
@@ -30844,7 +30844,7 @@ 
 	  UNSPEC_VAESENCLAST))]
   "TARGET_VAES"
 {
-  if (which_alternative == 0 && <MODE>mode == V16QImode)
+  if (!TARGET_AES && <MODE>mode == V16QImode)
     return "%{evex%} vaesenclast\t{%2, %1, %0|%0, %1, %2}";
   else
     return "vaesenclast\t{%2, %1, %0|%0, %1, %2}";