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 is wrong for two
reasons:
- if, with AES disabled, the latter alternative was chosen despite no
"high" XMM register nor any eGPR in use, gas would still pick the AES
(VEX) encoding when no {evex} pseudo-prefix is in use (which is
against - as stated by the description of said commit - AES presently
not being considered a prereq of VAES in gcc);
- 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.
--- 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}";