public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] Allow setting CpuVRex bit in .arch directive
@ 2016-05-21 16:54 Jakub Jelinek
  2016-05-21 17:06 ` Jakub Jelinek
  0 siblings, 1 reply; 18+ messages in thread
From: Jakub Jelinek @ 2016-05-21 16:54 UTC (permalink / raw)
  To: binutils; +Cc: Uros Bizjak, Kirill Yukhin, H.J. Lu

[-- Attachment #1: Type: text/plain, Size: 2483 bytes --]

Hi!

I've tried today to check for the various AVX512* ISA issues in GCC
using assembly .arch support.  Seems by default all flags (but l10m/k10m)
are set, but if I want to allow all insns but say AVX512DQ ISA instructions
or something similar, there is no way to do it - there is no way except
for explicit no* flags to remove ISA bits from the default, so one has to
set some CPU and then add all the ISA flags one wants.  Seems most of them
can be added, except for one very important one - the CpuVRex bit.

Here is a patch to add support for .arch .vrex to set that, another option
might be to set CpuVRex whenever CpuAVX512F is set in 64-bit mode.
Any preferences?

Attached is then the hack I've been using on the GCC side, plus another hack
to try to use XMM16+ regs more often.

2016-05-21  Jakub Jelinek  <jakub@redhat.com>

	* config/tc-i386.c (cpu_arch): Add .vrex entry.

	* i386-gen.c (cpu_flag_init): Add CPU_VREX_FLAGS.
	* i386-init.h: Regenerated.

diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index 8a4d987..212796a 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -963,6 +963,8 @@ static const arch_entry cpu_arch[] =
     CPU_OSPKE_FLAGS, 0, 0 },
   { STRING_COMMA_LEN (".rdpid"), PROCESSOR_UNKNOWN,
     CPU_RDPID_FLAGS, 0, 0 },
+  { STRING_COMMA_LEN (".vrex"), PROCESSOR_UNKNOWN,
+    CPU_VREX_FLAGS, 0, 0 }
 };
 
 #ifdef I386COFF
diff --git a/opcodes/i386-gen.c b/opcodes/i386-gen.c
index 5b997f9..8042bee 100644
--- a/opcodes/i386-gen.c
+++ b/opcodes/i386-gen.c
@@ -258,7 +258,9 @@ static initializer cpu_flag_init[] =
   { "CPU_OSPKE_FLAGS",
     "CpuOSPKE" },
   { "CPU_RDPID_FLAGS",
-    "CpuRDPID" }
+    "CpuRDPID" },
+  { "CPU_VREX_FLAGS",
+    "CpuVRex" }
 };
 
 static initializer operand_type_init[] =
diff --git a/opcodes/i386-init.h b/opcodes/i386-init.h
index de68c22..f5d6c64 100644
--- a/opcodes/i386-init.h
+++ b/opcodes/i386-init.h
@@ -781,6 +781,13 @@
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
       0, 0, 0, 0, 1, 0, 0, 0, 0, 0 } }
 
+#define CPU_VREX_FLAGS \
+  { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
+
 
 #define OPERAND_TYPE_NONE \
   { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \

	Jakub

[-- Attachment #2: P2 --]
[-- Type: text/plain, Size: 2407 bytes --]

--- gcc/config/i386/i386.c.jj	2016-05-20 20:48:23.000000000 +0200
+++ gcc/config/i386/i386.c	2016-05-21 16:10:39.689599317 +0200
@@ -7910,6 +7910,8 @@ ix86_function_ms_hook_prologue (const_tr
   return false;
 }
 
+static int prev_avx512 = -1;
+
 /* Write the extra assembler code needed to declare a function properly.  */
 
 void
@@ -7918,6 +7920,59 @@ ix86_asm_output_function_label (FILE *as
 {
   bool is_ms_hook = ix86_function_ms_hook_prologue (decl);
 
+  int cur_avx512 = ((TARGET_AVX512F ? 1 : 0)
+		    | (TARGET_AVX512PF ? 2 : 0)
+		    | (TARGET_AVX512ER ? 4 : 0)
+		    | (TARGET_AVX512CD ? 8 : 0)
+		    | (TARGET_AVX512DQ ? 16 : 0)
+		    | (TARGET_AVX512BW ? 32 : 0)
+		    | (TARGET_AVX512VL ? 64 : 0)
+		    | (TARGET_AVX512VBMI ? 128 : 0)
+		    | (TARGET_AVX512IFMA ? 256 : 0));
+  if (cur_avx512 != prev_avx512)
+    {
+      fprintf (asm_out_file,
+	       "\t.arch\tbdver4\n"
+	       "\t.arch\t.8087\n"
+	       "\t.arch\t.287\n"
+	       "\t.arch\t.3dnow\n"
+	       "\t.arch\t.3dnowa\n"
+	       "\t.arch\t.padlock\n"
+	       "\t.arch\t.vmx\n"
+	       "\t.arch\t.smx\n"
+	       "\t.arch\t.ept\n"
+	       "\t.arch\t.hle\n"
+	       "\t.arch\t.rtm\n"
+	       "\t.arch\t.invpcid\n"
+	       "\t.arch\t.vmfunc\n"
+	       "\t.arch\t.prefetchwt1\n"
+	       "\t.arch\t.se1\n"
+	       "\t.arch\t.clwb\n"
+	       "\t.arch\t.pcommit\n"
+	       "\t.arch\t.mpx\n"
+	       "\t.arch\t.adx\n"
+	       "\t.arch\t.rdseed\n"
+	       "\t.arch\t.smap\n"
+	       "\t.arch\t.sha\n"
+	       "\t.arch\t.xsavec\n"
+	       "\t.arch\t.xsaves\n"
+	       "\t.arch\t.clflushopt\n"
+	       "\t.arch\t.clzero\n"
+	       "\t.arch\t.ospke\n"
+	       "\t.arch\t.rdpid\n%s%s%s%s%s%s%s%s%s%s",
+	       (TARGET_64BIT && TARGET_AVX512F) ? "\t.arch\t.vrex\n" : "",
+	       TARGET_AVX512F ? "\t.arch\t.avx512f\n" : "",
+	       TARGET_AVX512PF ? "\t.arch\t.avx512pf\n" : "",
+	       TARGET_AVX512ER ? "\t.arch\t.avx512er\n" : "",
+	       TARGET_AVX512CD ? "\t.arch\t.avx512cd\n" : "",
+	       TARGET_AVX512DQ ? "\t.arch\t.avx512dq\n" : "",
+	       TARGET_AVX512BW ? "\t.arch\t.avx512bw\n" : "",
+	       TARGET_AVX512VL ? "\t.arch\t.avx512vl\n" : "",
+	       TARGET_AVX512VBMI ? "\t.arch\t.avx512vbmi\n" : "",
+	       TARGET_AVX512IFMA ? "\t.arch\t.avx512ifma\n" : "");
+      prev_avx512 = cur_avx512;
+    }
+
   if (is_ms_hook)
     {
       int i, filler_count = (TARGET_64BIT ? 32 : 16);

[-- Attachment #3: P3 --]
[-- Type: text/plain, Size: 914 bytes --]

--- gcc/config/i386/i386.h.jj	2016-05-12 10:29:41.000000000 +0200
+++ gcc/config/i386/i386.h	2016-05-21 17:50:01.923718417 +0200
@@ -1064,10 +1064,10 @@ extern const char *host_detect_local_cpu
 
 #define REG_ALLOC_ORDER 					\
 {  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,\
-   18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,	\
-   33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,  \
-   48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62,	\
-   63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,  \
+   18, 19, 20, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 	\
+   65, 66, 67, 68, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,	\
+   32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46,	\
+   47, 48, 49, 50, 51, 52, 69, 70, 71, 72, 73, 74, 75, 76, 77,  \
    78, 79, 80 }
 
 /* ADJUST_REG_ALLOC_ORDER is a macro which permits reg_alloc_order

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH] Allow setting CpuVRex bit in .arch directive
  2016-05-21 16:54 [PATCH] Allow setting CpuVRex bit in .arch directive Jakub Jelinek
@ 2016-05-21 17:06 ` Jakub Jelinek
  2016-05-24 17:24   ` H.J. Lu
  0 siblings, 1 reply; 18+ messages in thread
From: Jakub Jelinek @ 2016-05-21 17:06 UTC (permalink / raw)
  To: binutils; +Cc: Uros Bizjak, Kirill Yukhin, H.J. Lu

Hi!

On Sat, May 21, 2016 at 06:54:05PM +0200, Jakub Jelinek wrote:
> I've tried today to check for the various AVX512* ISA issues in GCC
> using assembly .arch support.  Seems by default all flags (but l10m/k10m)
> are set, but if I want to allow all insns but say AVX512DQ ISA instructions
> or something similar, there is no way to do it - there is no way except
> for explicit no* flags to remove ISA bits from the default, so one has to
> set some CPU and then add all the ISA flags one wants.  Seems most of them
> can be added, except for one very important one - the CpuVRex bit.
> 
> Here is a patch to add support for .arch .vrex to set that, another option
> might be to set CpuVRex whenever CpuAVX512F is set in 64-bit mode.
> Any preferences?

BTW, to my surprise, I haven't found any issues in the compiler this way,
even the known ones that I've just fixed.
E.g.
	.arch	corei7
	.arch	.avx512f
	.arch	.avx512vl
	vinserti32x4	$0x0, %xmm0, %ymm15, %ymm15
	vinserti32x4	$0x1, %xmm0, %ymm15, %ymm15
	vinserti64x2	$0x0, %xmm0, %ymm15, %ymm15
	vinserti64x2	$0x1, %xmm0, %ymm15, %ymm15
	vinsertf32x4	$0x0, %xmm0, %ymm15, %ymm15
	vinsertf32x4	$0x1, %xmm0, %ymm15, %ymm15
	vinsertf64x2	$0x0, %xmm0, %ymm15, %ymm15
	vinsertf64x2	$0x1, %xmm0, %ymm15, %ymm15
assembles fine, even when it IMHO should not - the 64x2 instructions
are all AVX512VL & AVX512DQ.

	Jakub

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH] Allow setting CpuVRex bit in .arch directive
  2016-05-21 17:06 ` Jakub Jelinek
@ 2016-05-24 17:24   ` H.J. Lu
  2016-05-24 17:49     ` Jakub Jelinek
  0 siblings, 1 reply; 18+ messages in thread
From: H.J. Lu @ 2016-05-24 17:24 UTC (permalink / raw)
  To: Jakub Jelinek; +Cc: Binutils, Uros Bizjak, Kirill Yukhin

On Sat, May 21, 2016 at 10:06 AM, Jakub Jelinek <jakub@redhat.com> wrote:
> Hi!
>
> On Sat, May 21, 2016 at 06:54:05PM +0200, Jakub Jelinek wrote:
>> I've tried today to check for the various AVX512* ISA issues in GCC
>> using assembly .arch support.  Seems by default all flags (but l10m/k10m)
>> are set, but if I want to allow all insns but say AVX512DQ ISA instructions
>> or something similar, there is no way to do it - there is no way except
>> for explicit no* flags to remove ISA bits from the default, so one has to
>> set some CPU and then add all the ISA flags one wants.  Seems most of them
>> can be added, except for one very important one - the CpuVRex bit.
>>
>> Here is a patch to add support for .arch .vrex to set that, another option
>> might be to set CpuVRex whenever CpuAVX512F is set in 64-bit mode.
>> Any preferences?

Do you have a testcase to show how CpuVRex is used?

> BTW, to my surprise, I haven't found any issues in the compiler this way,
> even the known ones that I've just fixed.
> E.g.
>         .arch   corei7
>         .arch   .avx512f
>         .arch   .avx512vl
>         vinserti32x4    $0x0, %xmm0, %ymm15, %ymm15
>         vinserti32x4    $0x1, %xmm0, %ymm15, %ymm15
>         vinserti64x2    $0x0, %xmm0, %ymm15, %ymm15
>         vinserti64x2    $0x1, %xmm0, %ymm15, %ymm15
>         vinsertf32x4    $0x0, %xmm0, %ymm15, %ymm15
>         vinsertf32x4    $0x1, %xmm0, %ymm15, %ymm15
>         vinsertf64x2    $0x0, %xmm0, %ymm15, %ymm15
>         vinsertf64x2    $0x1, %xmm0, %ymm15, %ymm15
> assembles fine, even when it IMHO should not - the 64x2 instructions
> are all AVX512VL & AVX512DQ.
>

Since vinsertf64x2 is an CpuAVX512VL instruction, I don't see
why it shouldn't assemble.


-- 
H.J.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH] Allow setting CpuVRex bit in .arch directive
  2016-05-24 17:24   ` H.J. Lu
@ 2016-05-24 17:49     ` Jakub Jelinek
  2016-05-24 19:02       ` H.J. Lu
  0 siblings, 1 reply; 18+ messages in thread
From: Jakub Jelinek @ 2016-05-24 17:49 UTC (permalink / raw)
  To: H.J. Lu; +Cc: Binutils, Uros Bizjak, Kirill Yukhin

On Tue, May 24, 2016 at 10:24:11AM -0700, H.J. Lu wrote:
> On Sat, May 21, 2016 at 10:06 AM, Jakub Jelinek <jakub@redhat.com> wrote:
> > Hi!
> >
> > On Sat, May 21, 2016 at 06:54:05PM +0200, Jakub Jelinek wrote:
> >> I've tried today to check for the various AVX512* ISA issues in GCC
> >> using assembly .arch support.  Seems by default all flags (but l10m/k10m)
> >> are set, but if I want to allow all insns but say AVX512DQ ISA instructions
> >> or something similar, there is no way to do it - there is no way except
> >> for explicit no* flags to remove ISA bits from the default, so one has to
> >> set some CPU and then add all the ISA flags one wants.  Seems most of them
> >> can be added, except for one very important one - the CpuVRex bit.
> >>
> >> Here is a patch to add support for .arch .vrex to set that, another option
> >> might be to set CpuVRex whenever CpuAVX512F is set in 64-bit mode.
> >> Any preferences?
> 
> Do you have a testcase to show how CpuVRex is used?

Try:
	.arch corei7
	.arch .avx512f
	vpxord %xmm15, %xmm15, %xmm15
	vpxord %xmm16, %xmm16, %xmm16

I get:
/tmp/1.s: Assembler messages:
/tmp/1.s:4: Error: bad register name `%xmm16'
and couldn't find any way how to make that assemble if I want to
disable even some ISA set and thus have to start with .arch <cpuname>
and add all the ISA sets I want to enable on top of that CPU.

> > BTW, to my surprise, I haven't found any issues in the compiler this way,
> > even the known ones that I've just fixed.
> > E.g.
> >         .arch   corei7
> >         .arch   .avx512f
> >         .arch   .avx512vl
> >         vinserti32x4    $0x0, %xmm0, %ymm15, %ymm15
> >         vinserti32x4    $0x1, %xmm0, %ymm15, %ymm15
> >         vinserti64x2    $0x0, %xmm0, %ymm15, %ymm15
> >         vinserti64x2    $0x1, %xmm0, %ymm15, %ymm15
> >         vinsertf32x4    $0x0, %xmm0, %ymm15, %ymm15
> >         vinsertf32x4    $0x1, %xmm0, %ymm15, %ymm15
> >         vinsertf64x2    $0x0, %xmm0, %ymm15, %ymm15
> >         vinsertf64x2    $0x1, %xmm0, %ymm15, %ymm15
> > assembles fine, even when it IMHO should not - the 64x2 instructions
> > are all AVX512VL & AVX512DQ.
> >
> 
> Since vinsertf64x2 is an CpuAVX512VL instruction, I don't see
> why it shouldn't assemble.

Is it?  I believe only vinsertf32x4 is, vinsertf64x2 is
CpuAVX512VL & CpuAVX512DQ:

EVEX.NDS.256.66.0F3A.W0 18 /r ib	T4	V/V	AVX512VL	Insert 128 bits of packed single-precision floating-
VINSERTF32X4 ymm1 {k1}{z}, ymm2,			AVX512F		point values from xmm3/m128 and the remaining
xmm3/m128, imm8								values from ymm2 into ymm1 under writemask k1.

EVEX.NDS.512.66.0F3A.W0 18 /r ib	T4	V/V	AVX512F		Insert 128 bits of packed single-precision floating-
VINSERTF32X4 zmm1 {k1}{z}, zmm2,					point values from xmm3/m128 and the remaining
xmm3/m128, imm8								values from zmm2 into zmm1 under writemask k1.

EVEX.NDS.256.66.0F3A.W1 18 /r ib	T2	V/V	AVX512VL	Insert 128 bits of packed double-precision floating-
VINSERTF64X2 ymm1 {k1}{z}, ymm2,			AVX512DQ	point values from xmm3/m128 and the remaining
xmm3/m128, imm8								values from ymm2 into ymm1 under writemask k1.

EVEX.NDS.512.66.0F3A.W1 18 /r ib	T2	V/V	AVX512DQ	Insert 128 bits of packed double-precision floating-
VINSERTF64X2 zmm1 {k1}{z}, zmm2,					point values from xmm3/m128 and the remaining
xmm3/m128, imm8								values from zmm2 into zmm1 under writemask k1.

vinsertf64x2, 4, 0x6618, None, 1, CpuAVX512DQ|CpuAVX512VL, Modrm|EVex=3|Masking=3|VexOpcode=2|VexVVVV=1|VexW=2|VecESize=1|Disp8MemShift=4|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { Imm8, RegXMM|XMMword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S|Vec_Disp8, RegYMM, RegYMM }

At least in 319433-024.pdf I see in 5.1.5:

The fourth column holds abbreviated CPUID feature flags (e.g. appropriate
bits in CPUID.1:ECX, CPUID.1:EDX for SSE/SSE2/SSE3/SSSE3/SSE4.1/SSE4.2/AVX/F16C support; bits in
CPUID.(EAX=07H,ECX=0):BCX for AVX2/AVX512F etc) that indicate processor support for the instruction. If
the corresponding flag is ‘0’, the instruction will #UD.

Therefore, my understanding is that you need all the mentioned flags enabled
or it will #UD.  Does binutils treat CpuAVX512DQ|CpuAVX512VL instead
as the insn being enabled in either .arch .avx512vl, or .arch .avx512dq
alone, rather than only in .arch .avx512vl; .arch .avx512dq ?

	Jakub

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH] Allow setting CpuVRex bit in .arch directive
  2016-05-24 17:49     ` Jakub Jelinek
@ 2016-05-24 19:02       ` H.J. Lu
  2016-05-24 19:07         ` Jakub Jelinek
  2016-05-25 23:22         ` H.J. Lu
  0 siblings, 2 replies; 18+ messages in thread
From: H.J. Lu @ 2016-05-24 19:02 UTC (permalink / raw)
  To: Jakub Jelinek; +Cc: Binutils, Uros Bizjak, Kirill Yukhin

On Tue, May 24, 2016 at 10:49 AM, Jakub Jelinek <jakub@redhat.com> wrote:
> On Tue, May 24, 2016 at 10:24:11AM -0700, H.J. Lu wrote:
>> On Sat, May 21, 2016 at 10:06 AM, Jakub Jelinek <jakub@redhat.com> wrote:
>> > Hi!
>> >
>> > On Sat, May 21, 2016 at 06:54:05PM +0200, Jakub Jelinek wrote:
>> >> I've tried today to check for the various AVX512* ISA issues in GCC
>> >> using assembly .arch support.  Seems by default all flags (but l10m/k10m)
>> >> are set, but if I want to allow all insns but say AVX512DQ ISA instructions
>> >> or something similar, there is no way to do it - there is no way except
>> >> for explicit no* flags to remove ISA bits from the default, so one has to
>> >> set some CPU and then add all the ISA flags one wants.  Seems most of them
>> >> can be added, except for one very important one - the CpuVRex bit.
>> >>
>> >> Here is a patch to add support for .arch .vrex to set that, another option
>> >> might be to set CpuVRex whenever CpuAVX512F is set in 64-bit mode.
>> >> Any preferences?
>>
>> Do you have a testcase to show how CpuVRex is used?
>
> Try:
>         .arch corei7
>         .arch .avx512f
>         vpxord %xmm15, %xmm15, %xmm15
>         vpxord %xmm16, %xmm16, %xmm16
>
> I get:
> /tmp/1.s: Assembler messages:
> /tmp/1.s:4: Error: bad register name `%xmm16'

I opened:

https://sourceware.org/bugzilla/show_bug.cgi?id=20141

> and couldn't find any way how to make that assemble if I want to
> disable even some ISA set and thus have to start with .arch <cpuname>
> and add all the ISA sets I want to enable on top of that CPU.

So you want to just disable  AVX512D, no thing else.  Wouldn't a
".noarch" directive work better?

>> > BTW, to my surprise, I haven't found any issues in the compiler this way,
>> > even the known ones that I've just fixed.
>> > E.g.
>> >         .arch   corei7
>> >         .arch   .avx512f
>> >         .arch   .avx512vl
>> >         vinserti32x4    $0x0, %xmm0, %ymm15, %ymm15
>> >         vinserti32x4    $0x1, %xmm0, %ymm15, %ymm15
>> >         vinserti64x2    $0x0, %xmm0, %ymm15, %ymm15
>> >         vinserti64x2    $0x1, %xmm0, %ymm15, %ymm15
>> >         vinsertf32x4    $0x0, %xmm0, %ymm15, %ymm15
>> >         vinsertf32x4    $0x1, %xmm0, %ymm15, %ymm15
>> >         vinsertf64x2    $0x0, %xmm0, %ymm15, %ymm15
>> >         vinsertf64x2    $0x1, %xmm0, %ymm15, %ymm15
>> > assembles fine, even when it IMHO should not - the 64x2 instructions
>> > are all AVX512VL & AVX512DQ.
>> >
>>
>> Since vinsertf64x2 is an CpuAVX512VL instruction, I don't see
>> why it shouldn't assemble.
>
> Is it?  I believe only vinsertf32x4 is, vinsertf64x2 is
> CpuAVX512VL & CpuAVX512DQ:
>
> EVEX.NDS.256.66.0F3A.W0 18 /r ib        T4      V/V     AVX512VL        Insert 128 bits of packed single-precision floating-
> VINSERTF32X4 ymm1 {k1}{z}, ymm2,                        AVX512F         point values from xmm3/m128 and the remaining
> xmm3/m128, imm8                                                         values from ymm2 into ymm1 under writemask k1.
>
> EVEX.NDS.512.66.0F3A.W0 18 /r ib        T4      V/V     AVX512F         Insert 128 bits of packed single-precision floating-
> VINSERTF32X4 zmm1 {k1}{z}, zmm2,                                        point values from xmm3/m128 and the remaining
> xmm3/m128, imm8                                                         values from zmm2 into zmm1 under writemask k1.
>
> EVEX.NDS.256.66.0F3A.W1 18 /r ib        T2      V/V     AVX512VL        Insert 128 bits of packed double-precision floating-
> VINSERTF64X2 ymm1 {k1}{z}, ymm2,                        AVX512DQ        point values from xmm3/m128 and the remaining
> xmm3/m128, imm8                                                         values from ymm2 into ymm1 under writemask k1.
>
> EVEX.NDS.512.66.0F3A.W1 18 /r ib        T2      V/V     AVX512DQ        Insert 128 bits of packed double-precision floating-
> VINSERTF64X2 zmm1 {k1}{z}, zmm2,                                        point values from xmm3/m128 and the remaining
> xmm3/m128, imm8                                                         values from zmm2 into zmm1 under writemask k1.
>
> vinsertf64x2, 4, 0x6618, None, 1, CpuAVX512DQ|CpuAVX512VL, Modrm|EVex=3|Masking=3|VexOpcode=2|VexVVVV=1|VexW=2|VecESize=1|Disp8MemShift=4|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { Imm8, RegXMM|XMMword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S|Vec_Disp8, RegYMM, RegYMM }
>
> At least in 319433-024.pdf I see in 5.1.5:
>
> The fourth column holds abbreviated CPUID feature flags (e.g. appropriate
> bits in CPUID.1:ECX, CPUID.1:EDX for SSE/SSE2/SSE3/SSSE3/SSE4.1/SSE4.2/AVX/F16C support; bits in
> CPUID.(EAX=07H,ECX=0):BCX for AVX2/AVX512F etc) that indicate processor support for the instruction. If
> the corresponding flag is ‘0’, the instruction will #UD.
>
> Therefore, my understanding is that you need all the mentioned flags enabled
> or it will #UD.  Does binutils treat CpuAVX512DQ|CpuAVX512VL instead
> as the insn being enabled in either .arch .avx512vl, or .arch .avx512dq
> alone, rather than only in .arch .avx512vl; .arch .avx512dq ?
>

I opened:

https://sourceware.org/bugzilla/show_bug.cgi?id=20140

-- 
H.J.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH] Allow setting CpuVRex bit in .arch directive
  2016-05-24 19:02       ` H.J. Lu
@ 2016-05-24 19:07         ` Jakub Jelinek
  2016-05-24 20:36           ` H.J. Lu
  2016-05-25 23:22         ` H.J. Lu
  1 sibling, 1 reply; 18+ messages in thread
From: Jakub Jelinek @ 2016-05-24 19:07 UTC (permalink / raw)
  To: H.J. Lu; +Cc: Binutils, Uros Bizjak, Kirill Yukhin

On Tue, May 24, 2016 at 12:02:42PM -0700, H.J. Lu wrote:
> > Try:
> >         .arch corei7
> >         .arch .avx512f
> >         vpxord %xmm15, %xmm15, %xmm15
> >         vpxord %xmm16, %xmm16, %xmm16
> >
> > I get:
> > /tmp/1.s: Assembler messages:
> > /tmp/1.s:4: Error: bad register name `%xmm16'
> 
> I opened:
> 
> https://sourceware.org/bugzilla/show_bug.cgi?id=20141
> 
> > and couldn't find any way how to make that assemble if I want to
> > disable even some ISA set and thus have to start with .arch <cpuname>
> > and add all the ISA sets I want to enable on top of that CPU.
> 
> So you want to just disable  AVX512D, no thing else.  Wouldn't a
> ".noarch" directive work better?

Well, to be able to generically disable specific ISAs (one, several).
An alternative to .noarch would be just allowing
.arch .noavx512vl etc. (like it already allows .no87).
Perhaps instead of mentioning all the ISAs once again with "no" prefix
just handle it generically, if .arch .no* is used, look first for
entries with explicit no at the beginning, and if not found, look for
the string after the prefix in the table and assume negate.

Anyway, still it would be good to be able to change (both set and remove)
the CpuVRex bit.

	Jakub

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH] Allow setting CpuVRex bit in .arch directive
  2016-05-24 19:07         ` Jakub Jelinek
@ 2016-05-24 20:36           ` H.J. Lu
  2016-05-25 16:35             ` H.J. Lu
  2016-05-25 17:54             ` H.J. Lu
  0 siblings, 2 replies; 18+ messages in thread
From: H.J. Lu @ 2016-05-24 20:36 UTC (permalink / raw)
  To: Jakub Jelinek; +Cc: Binutils, Uros Bizjak, Kirill Yukhin

On Tue, May 24, 2016 at 12:07 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> On Tue, May 24, 2016 at 12:02:42PM -0700, H.J. Lu wrote:
>> > Try:
>> >         .arch corei7
>> >         .arch .avx512f
>> >         vpxord %xmm15, %xmm15, %xmm15
>> >         vpxord %xmm16, %xmm16, %xmm16
>> >
>> > I get:
>> > /tmp/1.s: Assembler messages:
>> > /tmp/1.s:4: Error: bad register name `%xmm16'
>>
>> I opened:
>>
>> https://sourceware.org/bugzilla/show_bug.cgi?id=20141
>>
>> > and couldn't find any way how to make that assemble if I want to
>> > disable even some ISA set and thus have to start with .arch <cpuname>
>> > and add all the ISA sets I want to enable on top of that CPU.
>>
>> So you want to just disable  AVX512D, no thing else.  Wouldn't a
>> ".noarch" directive work better?
>
> Well, to be able to generically disable specific ISAs (one, several).
> An alternative to .noarch would be just allowing
> .arch .noavx512vl etc. (like it already allows .no87).
> Perhaps instead of mentioning all the ISAs once again with "no" prefix
> just handle it generically, if .arch .no* is used, look first for
> entries with explicit no at the beginning, and if not found, look for
> the string after the prefix in the table and assume negate.

Yes, it should work.

> Anyway, still it would be good to be able to change (both set and remove)
> the CpuVRex bit.
>

CpuVRex should be cleared/set automatically based on ISA.


-- 
H.J.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH] Allow setting CpuVRex bit in .arch directive
  2016-05-24 20:36           ` H.J. Lu
@ 2016-05-25 16:35             ` H.J. Lu
  2016-05-25 17:26               ` H.J. Lu
  2016-05-25 17:54             ` H.J. Lu
  1 sibling, 1 reply; 18+ messages in thread
From: H.J. Lu @ 2016-05-25 16:35 UTC (permalink / raw)
  To: Jakub Jelinek; +Cc: Binutils, Uros Bizjak, Kirill Yukhin

[-- Attachment #1: Type: text/plain, Size: 1576 bytes --]

On Tue, May 24, 2016 at 1:36 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Tue, May 24, 2016 at 12:07 PM, Jakub Jelinek <jakub@redhat.com> wrote:
>> On Tue, May 24, 2016 at 12:02:42PM -0700, H.J. Lu wrote:
>>> > Try:
>>> >         .arch corei7
>>> >         .arch .avx512f
>>> >         vpxord %xmm15, %xmm15, %xmm15
>>> >         vpxord %xmm16, %xmm16, %xmm16
>>> >
>>> > I get:
>>> > /tmp/1.s: Assembler messages:
>>> > /tmp/1.s:4: Error: bad register name `%xmm16'
>>>
>>> I opened:
>>>
>>> https://sourceware.org/bugzilla/show_bug.cgi?id=20141
>>>
>>> > and couldn't find any way how to make that assemble if I want to
>>> > disable even some ISA set and thus have to start with .arch <cpuname>
>>> > and add all the ISA sets I want to enable on top of that CPU.
>>>
>>> So you want to just disable  AVX512D, no thing else.  Wouldn't a
>>> ".noarch" directive work better?
>>
>> Well, to be able to generically disable specific ISAs (one, several).
>> An alternative to .noarch would be just allowing
>> .arch .noavx512vl etc. (like it already allows .no87).
>> Perhaps instead of mentioning all the ISAs once again with "no" prefix
>> just handle it generically, if .arch .no* is used, look first for
>> entries with explicit no at the beginning, and if not found, look for
>> the string after the prefix in the table and assume negate.
>
> Yes, it should work.

It won't work since .noavx should disable all AVX instructions,
just just AVX.  I am going to check in this patch to move all .noXXX
directives to cpu_noarch.  We can add more .noXXX to cpu_noarch.

-- 
H.J.

[-- Attachment #2: 0001-Reimplement-.no87-.nommx-.nosse-.noavx-directives.patch --]
[-- Type: text/x-patch, Size: 30865 bytes --]

From aea4cf9db554229cfd1445813df2cf05e5d650d1 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Tue, 24 May 2016 14:50:01 -0700
Subject: [PATCH] Reimplement .no87/.nommx/.nosse/.noavx directives

Move all .noXXX directives to cpu_noarch.

gas/

	* config/tc-i386.c (arch_entry): Remove negated.
	(noarch_entry): New struct.
	(cpu_arch): Updated.  Remove .no87, .nommx, .nosse and .noavx.
	(cpu_noarch): New.
	(set_cpu_arch): Check cpu_noarch after cpu_arch.
	(md_parse_option): Allow -march=+nosse.  Check cpu_noarch after
	cpu_arch.
	(output_message): New function.
	(show_arch): Use it.  Handle cpu_noarch.
	* testsuite/gas/i386/i386.exp: Run nommx-1, nommx-2, nommx-3,
	nosse-1, nosse-2, nosse-3, noavx-1 and noavx-2.
	* testsuite/gas/i386/noavx-1.l: New file.
	* testsuite/gas/i386/noavx-1.s: Likewise.
	* testsuite/gas/i386/noavx-2.s: Likewise.
	* testsuite/gas/i386/noavx-2.l: Likewise.
	* testsuite/gas/i386/nommx-1.s: Likewise.
	* testsuite/gas/i386/nommx-1.l: Likewise.
	* testsuite/gas/i386/nommx-2.s: Likewise.
	* testsuite/gas/i386/nommx-2.l: Likewise.
	* testsuite/gas/i386/nommx-3.s: Likewise.
	* testsuite/gas/i386/nommx-3.l: Likewise.
	* testsuite/gas/i386/nosse-1.s: Likewise.
	* testsuite/gas/i386/nosse-1.l: Likewise.
	* testsuite/gas/i386/nosse-2.s: Likewise.
	* testsuite/gas/i386/nosse-2.l: Likewise.
	* testsuite/gas/i386/nosse-3.s: Likewise.
	* testsuite/gas/i386/nosse-3.l: Likewise.

opcodes/

	* i386-gen.c (cpu_flag_init): Rename CPU_ANY87_FLAGS to
	CPU_ANY_X87_FLAGS.  Add CPU_ANY_MMX_FLAGS.
	* i386-init.h: Regenerated.
---
 gas/config/tc-i386.c             | 410 ++++++++++++++++++++++++---------------
 gas/testsuite/gas/i386/i386.exp  |   8 +
 gas/testsuite/gas/i386/noavx-1.l |  13 ++
 gas/testsuite/gas/i386/noavx-1.s |   8 +
 gas/testsuite/gas/i386/noavx-2.l |   7 +
 gas/testsuite/gas/i386/noavx-2.s |   3 +
 gas/testsuite/gas/i386/nommx-1.l |  21 ++
 gas/testsuite/gas/i386/nommx-1.s |  14 ++
 gas/testsuite/gas/i386/nommx-2.l |   7 +
 gas/testsuite/gas/i386/nommx-2.s |   3 +
 gas/testsuite/gas/i386/nommx-3.l |   7 +
 gas/testsuite/gas/i386/nommx-3.s |   3 +
 gas/testsuite/gas/i386/nosse-1.l |  13 ++
 gas/testsuite/gas/i386/nosse-1.s |   8 +
 gas/testsuite/gas/i386/nosse-2.l |   7 +
 gas/testsuite/gas/i386/nosse-2.s |   3 +
 gas/testsuite/gas/i386/nosse-3.l |   7 +
 gas/testsuite/gas/i386/nosse-3.s |   3 +
 opcodes/i386-gen.c               |   4 +-
 opcodes/i386-init.h              |   9 +-
 20 files changed, 396 insertions(+), 162 deletions(-)
 create mode 100644 gas/testsuite/gas/i386/noavx-1.l
 create mode 100644 gas/testsuite/gas/i386/noavx-1.s
 create mode 100644 gas/testsuite/gas/i386/noavx-2.l
 create mode 100644 gas/testsuite/gas/i386/noavx-2.s
 create mode 100644 gas/testsuite/gas/i386/nommx-1.l
 create mode 100644 gas/testsuite/gas/i386/nommx-1.s
 create mode 100644 gas/testsuite/gas/i386/nommx-2.l
 create mode 100644 gas/testsuite/gas/i386/nommx-2.s
 create mode 100644 gas/testsuite/gas/i386/nommx-3.l
 create mode 100644 gas/testsuite/gas/i386/nommx-3.s
 create mode 100644 gas/testsuite/gas/i386/nosse-1.l
 create mode 100644 gas/testsuite/gas/i386/nosse-1.s
 create mode 100644 gas/testsuite/gas/i386/nosse-2.l
 create mode 100644 gas/testsuite/gas/i386/nosse-2.s
 create mode 100644 gas/testsuite/gas/i386/nosse-3.l
 create mode 100644 gas/testsuite/gas/i386/nosse-3.s

diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index 8a4d987..21e300f 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -133,10 +133,18 @@ typedef struct
   enum processor_type type;	/* arch type */
   i386_cpu_flags flags;		/* cpu feature flags */
   unsigned int skip;		/* show_arch should skip this. */
-  unsigned int negated;		/* turn off indicated flags.  */
 }
 arch_entry;
 
+/* Used to turn off indicated flags.  */
+typedef struct
+{
+  const char *name;		/* arch name */
+  unsigned int len;		/* arch string length */
+  i386_cpu_flags flags;		/* cpu feature flags */
+}
+noarch_entry;
+
 static void update_code_flag (int, int);
 static void set_code_flag (int);
 static void set_16bit_gcc_code_flag (int);
@@ -730,239 +738,239 @@ static const arch_entry cpu_arch[] =
   /* Do not replace the first two entries - i386_target_format()
      relies on them being there in this order.  */
   { STRING_COMMA_LEN ("generic32"), PROCESSOR_GENERIC32,
-    CPU_GENERIC32_FLAGS, 0, 0 },
+    CPU_GENERIC32_FLAGS, 0 },
   { STRING_COMMA_LEN ("generic64"), PROCESSOR_GENERIC64,
-    CPU_GENERIC64_FLAGS, 0, 0 },
+    CPU_GENERIC64_FLAGS, 0 },
   { STRING_COMMA_LEN ("i8086"), PROCESSOR_UNKNOWN,
-    CPU_NONE_FLAGS, 0, 0 },
+    CPU_NONE_FLAGS, 0 },
   { STRING_COMMA_LEN ("i186"), PROCESSOR_UNKNOWN,
-    CPU_I186_FLAGS, 0, 0 },
+    CPU_I186_FLAGS, 0 },
   { STRING_COMMA_LEN ("i286"), PROCESSOR_UNKNOWN,
-    CPU_I286_FLAGS, 0, 0 },
+    CPU_I286_FLAGS, 0 },
   { STRING_COMMA_LEN ("i386"), PROCESSOR_I386,
-    CPU_I386_FLAGS, 0, 0 },
+    CPU_I386_FLAGS, 0 },
   { STRING_COMMA_LEN ("i486"), PROCESSOR_I486,
-    CPU_I486_FLAGS, 0, 0 },
+    CPU_I486_FLAGS, 0 },
   { STRING_COMMA_LEN ("i586"), PROCESSOR_PENTIUM,
-    CPU_I586_FLAGS, 0, 0 },
+    CPU_I586_FLAGS, 0 },
   { STRING_COMMA_LEN ("i686"), PROCESSOR_PENTIUMPRO,
-    CPU_I686_FLAGS, 0, 0 },
+    CPU_I686_FLAGS, 0 },
   { STRING_COMMA_LEN ("pentium"), PROCESSOR_PENTIUM,
-    CPU_I586_FLAGS, 0, 0 },
+    CPU_I586_FLAGS, 0 },
   { STRING_COMMA_LEN ("pentiumpro"), PROCESSOR_PENTIUMPRO,
-    CPU_PENTIUMPRO_FLAGS, 0, 0 },
+    CPU_PENTIUMPRO_FLAGS, 0 },
   { STRING_COMMA_LEN ("pentiumii"), PROCESSOR_PENTIUMPRO,
-    CPU_P2_FLAGS, 0, 0 },
+    CPU_P2_FLAGS, 0 },
   { STRING_COMMA_LEN ("pentiumiii"),PROCESSOR_PENTIUMPRO,
-    CPU_P3_FLAGS, 0, 0 },
+    CPU_P3_FLAGS, 0 },
   { STRING_COMMA_LEN ("pentium4"), PROCESSOR_PENTIUM4,
-    CPU_P4_FLAGS, 0, 0 },
+    CPU_P4_FLAGS, 0 },
   { STRING_COMMA_LEN ("prescott"), PROCESSOR_NOCONA,
-    CPU_CORE_FLAGS, 0, 0 },
+    CPU_CORE_FLAGS, 0 },
   { STRING_COMMA_LEN ("nocona"), PROCESSOR_NOCONA,
-    CPU_NOCONA_FLAGS, 0, 0 },
+    CPU_NOCONA_FLAGS, 0 },
   { STRING_COMMA_LEN ("yonah"), PROCESSOR_CORE,
-    CPU_CORE_FLAGS, 1, 0 },
+    CPU_CORE_FLAGS, 1 },
   { STRING_COMMA_LEN ("core"), PROCESSOR_CORE,
-    CPU_CORE_FLAGS, 0, 0 },
+    CPU_CORE_FLAGS, 0 },
   { STRING_COMMA_LEN ("merom"), PROCESSOR_CORE2,
-    CPU_CORE2_FLAGS, 1, 0 },
+    CPU_CORE2_FLAGS, 1 },
   { STRING_COMMA_LEN ("core2"), PROCESSOR_CORE2,
-    CPU_CORE2_FLAGS, 0, 0 },
+    CPU_CORE2_FLAGS, 0 },
   { STRING_COMMA_LEN ("corei7"), PROCESSOR_COREI7,
-    CPU_COREI7_FLAGS, 0, 0 },
+    CPU_COREI7_FLAGS, 0 },
   { STRING_COMMA_LEN ("l1om"), PROCESSOR_L1OM,
-    CPU_L1OM_FLAGS, 0, 0 },
+    CPU_L1OM_FLAGS, 0 },
   { STRING_COMMA_LEN ("k1om"), PROCESSOR_K1OM,
-    CPU_K1OM_FLAGS, 0, 0 },
+    CPU_K1OM_FLAGS, 0 },
   { STRING_COMMA_LEN ("iamcu"), PROCESSOR_IAMCU,
-    CPU_IAMCU_FLAGS, 0, 0 },
+    CPU_IAMCU_FLAGS, 0 },
   { STRING_COMMA_LEN ("k6"), PROCESSOR_K6,
-    CPU_K6_FLAGS, 0, 0 },
+    CPU_K6_FLAGS, 0 },
   { STRING_COMMA_LEN ("k6_2"), PROCESSOR_K6,
-    CPU_K6_2_FLAGS, 0, 0 },
+    CPU_K6_2_FLAGS, 0 },
   { STRING_COMMA_LEN ("athlon"), PROCESSOR_ATHLON,
-    CPU_ATHLON_FLAGS, 0, 0 },
+    CPU_ATHLON_FLAGS, 0 },
   { STRING_COMMA_LEN ("sledgehammer"), PROCESSOR_K8,
-    CPU_K8_FLAGS, 1, 0 },
+    CPU_K8_FLAGS, 1 },
   { STRING_COMMA_LEN ("opteron"), PROCESSOR_K8,
-    CPU_K8_FLAGS, 0, 0 },
+    CPU_K8_FLAGS, 0 },
   { STRING_COMMA_LEN ("k8"), PROCESSOR_K8,
-    CPU_K8_FLAGS, 0, 0 },
+    CPU_K8_FLAGS, 0 },
   { STRING_COMMA_LEN ("amdfam10"), PROCESSOR_AMDFAM10,
-    CPU_AMDFAM10_FLAGS, 0, 0 },
+    CPU_AMDFAM10_FLAGS, 0 },
   { STRING_COMMA_LEN ("bdver1"), PROCESSOR_BD,
-    CPU_BDVER1_FLAGS, 0, 0 },
+    CPU_BDVER1_FLAGS, 0 },
   { STRING_COMMA_LEN ("bdver2"), PROCESSOR_BD,
-    CPU_BDVER2_FLAGS, 0, 0 },
+    CPU_BDVER2_FLAGS, 0 },
   { STRING_COMMA_LEN ("bdver3"), PROCESSOR_BD,
-    CPU_BDVER3_FLAGS, 0, 0 },
+    CPU_BDVER3_FLAGS, 0 },
   { STRING_COMMA_LEN ("bdver4"), PROCESSOR_BD,
-    CPU_BDVER4_FLAGS, 0, 0 },
+    CPU_BDVER4_FLAGS, 0 },
   { STRING_COMMA_LEN ("znver1"), PROCESSOR_ZNVER,
-    CPU_ZNVER1_FLAGS, 0, 0 },
+    CPU_ZNVER1_FLAGS, 0 },
   { STRING_COMMA_LEN ("btver1"), PROCESSOR_BT,
-    CPU_BTVER1_FLAGS, 0, 0 },
+    CPU_BTVER1_FLAGS, 0 },
   { STRING_COMMA_LEN ("btver2"), PROCESSOR_BT,
-    CPU_BTVER2_FLAGS, 0, 0 },
+    CPU_BTVER2_FLAGS, 0 },
   { STRING_COMMA_LEN (".8087"), PROCESSOR_UNKNOWN,
-    CPU_8087_FLAGS, 0, 0 },
+    CPU_8087_FLAGS, 0 },
   { STRING_COMMA_LEN (".287"), PROCESSOR_UNKNOWN,
-    CPU_287_FLAGS, 0, 0 },
+    CPU_287_FLAGS, 0 },
   { STRING_COMMA_LEN (".387"), PROCESSOR_UNKNOWN,
-    CPU_387_FLAGS, 0, 0 },
-  { STRING_COMMA_LEN (".no87"), PROCESSOR_UNKNOWN,
-    CPU_ANY87_FLAGS, 0, 1 },
+    CPU_387_FLAGS, 0 },
   { STRING_COMMA_LEN (".mmx"), PROCESSOR_UNKNOWN,
-    CPU_MMX_FLAGS, 0, 0 },
-  { STRING_COMMA_LEN (".nommx"), PROCESSOR_UNKNOWN,
-    CPU_3DNOWA_FLAGS, 0, 1 },
+    CPU_MMX_FLAGS, 0 },
   { STRING_COMMA_LEN (".sse"), PROCESSOR_UNKNOWN,
-    CPU_SSE_FLAGS, 0, 0 },
+    CPU_SSE_FLAGS, 0 },
   { STRING_COMMA_LEN (".sse2"), PROCESSOR_UNKNOWN,
-    CPU_SSE2_FLAGS, 0, 0 },
+    CPU_SSE2_FLAGS, 0 },
   { STRING_COMMA_LEN (".sse3"), PROCESSOR_UNKNOWN,
-    CPU_SSE3_FLAGS, 0, 0 },
+    CPU_SSE3_FLAGS, 0 },
   { STRING_COMMA_LEN (".ssse3"), PROCESSOR_UNKNOWN,
-    CPU_SSSE3_FLAGS, 0, 0 },
+    CPU_SSSE3_FLAGS, 0 },
   { STRING_COMMA_LEN (".sse4.1"), PROCESSOR_UNKNOWN,
-    CPU_SSE4_1_FLAGS, 0, 0 },
+    CPU_SSE4_1_FLAGS, 0 },
   { STRING_COMMA_LEN (".sse4.2"), PROCESSOR_UNKNOWN,
-    CPU_SSE4_2_FLAGS, 0, 0 },
+    CPU_SSE4_2_FLAGS, 0 },
   { STRING_COMMA_LEN (".sse4"), PROCESSOR_UNKNOWN,
-    CPU_SSE4_2_FLAGS, 0, 0 },
-  { STRING_COMMA_LEN (".nosse"), PROCESSOR_UNKNOWN,
-    CPU_ANY_SSE_FLAGS, 0, 1 },
+    CPU_SSE4_2_FLAGS, 0 },
   { STRING_COMMA_LEN (".avx"), PROCESSOR_UNKNOWN,
-    CPU_AVX_FLAGS, 0, 0 },
+    CPU_AVX_FLAGS, 0 },
   { STRING_COMMA_LEN (".avx2"), PROCESSOR_UNKNOWN,
-    CPU_AVX2_FLAGS, 0, 0 },
+    CPU_AVX2_FLAGS, 0 },
   { STRING_COMMA_LEN (".avx512f"), PROCESSOR_UNKNOWN,
-    CPU_AVX512F_FLAGS, 0, 0 },
+    CPU_AVX512F_FLAGS, 0 },
   { STRING_COMMA_LEN (".avx512cd"), PROCESSOR_UNKNOWN,
-    CPU_AVX512CD_FLAGS, 0, 0 },
+    CPU_AVX512CD_FLAGS, 0 },
   { STRING_COMMA_LEN (".avx512er"), PROCESSOR_UNKNOWN,
-    CPU_AVX512ER_FLAGS, 0, 0 },
+    CPU_AVX512ER_FLAGS, 0 },
   { STRING_COMMA_LEN (".avx512pf"), PROCESSOR_UNKNOWN,
-    CPU_AVX512PF_FLAGS, 0, 0 },
+    CPU_AVX512PF_FLAGS, 0 },
   { STRING_COMMA_LEN (".avx512dq"), PROCESSOR_UNKNOWN,
-    CPU_AVX512DQ_FLAGS, 0, 0 },
+    CPU_AVX512DQ_FLAGS, 0 },
   { STRING_COMMA_LEN (".avx512bw"), PROCESSOR_UNKNOWN,
-    CPU_AVX512BW_FLAGS, 0, 0 },
+    CPU_AVX512BW_FLAGS, 0 },
   { STRING_COMMA_LEN (".avx512vl"), PROCESSOR_UNKNOWN,
-    CPU_AVX512VL_FLAGS, 0, 0 },
-  { STRING_COMMA_LEN (".noavx"), PROCESSOR_UNKNOWN,
-    CPU_ANY_AVX_FLAGS, 0, 1 },
+    CPU_AVX512VL_FLAGS, 0 },
   { STRING_COMMA_LEN (".vmx"), PROCESSOR_UNKNOWN,
-    CPU_VMX_FLAGS, 0, 0 },
+    CPU_VMX_FLAGS, 0 },
   { STRING_COMMA_LEN (".vmfunc"), PROCESSOR_UNKNOWN,
-    CPU_VMFUNC_FLAGS, 0, 0 },
+    CPU_VMFUNC_FLAGS, 0 },
   { STRING_COMMA_LEN (".smx"), PROCESSOR_UNKNOWN,
-    CPU_SMX_FLAGS, 0, 0 },
+    CPU_SMX_FLAGS, 0 },
   { STRING_COMMA_LEN (".xsave"), PROCESSOR_UNKNOWN,
-    CPU_XSAVE_FLAGS, 0, 0 },
+    CPU_XSAVE_FLAGS, 0 },
   { STRING_COMMA_LEN (".xsaveopt"), PROCESSOR_UNKNOWN,
-    CPU_XSAVEOPT_FLAGS, 0, 0 },
+    CPU_XSAVEOPT_FLAGS, 0 },
   { STRING_COMMA_LEN (".xsavec"), PROCESSOR_UNKNOWN,
-    CPU_XSAVEC_FLAGS, 0, 0 },
+    CPU_XSAVEC_FLAGS, 0 },
   { STRING_COMMA_LEN (".xsaves"), PROCESSOR_UNKNOWN,
-    CPU_XSAVES_FLAGS, 0, 0 },
+    CPU_XSAVES_FLAGS, 0 },
   { STRING_COMMA_LEN (".aes"), PROCESSOR_UNKNOWN,
-    CPU_AES_FLAGS, 0, 0 },
+    CPU_AES_FLAGS, 0 },
   { STRING_COMMA_LEN (".pclmul"), PROCESSOR_UNKNOWN,
-    CPU_PCLMUL_FLAGS, 0, 0 },
+    CPU_PCLMUL_FLAGS, 0 },
   { STRING_COMMA_LEN (".clmul"), PROCESSOR_UNKNOWN,
-    CPU_PCLMUL_FLAGS, 1, 0 },
+    CPU_PCLMUL_FLAGS, 1 },
   { STRING_COMMA_LEN (".fsgsbase"), PROCESSOR_UNKNOWN,
-    CPU_FSGSBASE_FLAGS, 0, 0 },
+    CPU_FSGSBASE_FLAGS, 0 },
   { STRING_COMMA_LEN (".rdrnd"), PROCESSOR_UNKNOWN,
-    CPU_RDRND_FLAGS, 0, 0 },
+    CPU_RDRND_FLAGS, 0 },
   { STRING_COMMA_LEN (".f16c"), PROCESSOR_UNKNOWN,
-    CPU_F16C_FLAGS, 0, 0 },
+    CPU_F16C_FLAGS, 0 },
   { STRING_COMMA_LEN (".bmi2"), PROCESSOR_UNKNOWN,
-    CPU_BMI2_FLAGS, 0, 0 },
+    CPU_BMI2_FLAGS, 0 },
   { STRING_COMMA_LEN (".fma"), PROCESSOR_UNKNOWN,
-    CPU_FMA_FLAGS, 0, 0 },
+    CPU_FMA_FLAGS, 0 },
   { STRING_COMMA_LEN (".fma4"), PROCESSOR_UNKNOWN,
-    CPU_FMA4_FLAGS, 0, 0 },
+    CPU_FMA4_FLAGS, 0 },
   { STRING_COMMA_LEN (".xop"), PROCESSOR_UNKNOWN,
-    CPU_XOP_FLAGS, 0, 0 },
+    CPU_XOP_FLAGS, 0 },
   { STRING_COMMA_LEN (".lwp"), PROCESSOR_UNKNOWN,
-    CPU_LWP_FLAGS, 0, 0 },
+    CPU_LWP_FLAGS, 0 },
   { STRING_COMMA_LEN (".movbe"), PROCESSOR_UNKNOWN,
-    CPU_MOVBE_FLAGS, 0, 0 },
+    CPU_MOVBE_FLAGS, 0 },
   { STRING_COMMA_LEN (".cx16"), PROCESSOR_UNKNOWN,
-    CPU_CX16_FLAGS, 0, 0 },
+    CPU_CX16_FLAGS, 0 },
   { STRING_COMMA_LEN (".ept"), PROCESSOR_UNKNOWN,
-    CPU_EPT_FLAGS, 0, 0 },
+    CPU_EPT_FLAGS, 0 },
   { STRING_COMMA_LEN (".lzcnt"), PROCESSOR_UNKNOWN,
-    CPU_LZCNT_FLAGS, 0, 0 },
+    CPU_LZCNT_FLAGS, 0 },
   { STRING_COMMA_LEN (".hle"), PROCESSOR_UNKNOWN,
-    CPU_HLE_FLAGS, 0, 0 },
+    CPU_HLE_FLAGS, 0 },
   { STRING_COMMA_LEN (".rtm"), PROCESSOR_UNKNOWN,
-    CPU_RTM_FLAGS, 0, 0 },
+    CPU_RTM_FLAGS, 0 },
   { STRING_COMMA_LEN (".invpcid"), PROCESSOR_UNKNOWN,
-    CPU_INVPCID_FLAGS, 0, 0 },
+    CPU_INVPCID_FLAGS, 0 },
   { STRING_COMMA_LEN (".clflush"), PROCESSOR_UNKNOWN,
-    CPU_CLFLUSH_FLAGS, 0, 0 },
+    CPU_CLFLUSH_FLAGS, 0 },
   { STRING_COMMA_LEN (".nop"), PROCESSOR_UNKNOWN,
-    CPU_NOP_FLAGS, 0, 0 },
+    CPU_NOP_FLAGS, 0 },
   { STRING_COMMA_LEN (".syscall"), PROCESSOR_UNKNOWN,
-    CPU_SYSCALL_FLAGS, 0, 0 },
+    CPU_SYSCALL_FLAGS, 0 },
   { STRING_COMMA_LEN (".rdtscp"), PROCESSOR_UNKNOWN,
-    CPU_RDTSCP_FLAGS, 0, 0 },
+    CPU_RDTSCP_FLAGS, 0 },
   { STRING_COMMA_LEN (".3dnow"), PROCESSOR_UNKNOWN,
-    CPU_3DNOW_FLAGS, 0, 0 },
+    CPU_3DNOW_FLAGS, 0 },
   { STRING_COMMA_LEN (".3dnowa"), PROCESSOR_UNKNOWN,
-    CPU_3DNOWA_FLAGS, 0, 0 },
+    CPU_3DNOWA_FLAGS, 0 },
   { STRING_COMMA_LEN (".padlock"), PROCESSOR_UNKNOWN,
-    CPU_PADLOCK_FLAGS, 0, 0 },
+    CPU_PADLOCK_FLAGS, 0 },
   { STRING_COMMA_LEN (".pacifica"), PROCESSOR_UNKNOWN,
-    CPU_SVME_FLAGS, 1, 0 },
+    CPU_SVME_FLAGS, 1 },
   { STRING_COMMA_LEN (".svme"), PROCESSOR_UNKNOWN,
-    CPU_SVME_FLAGS, 0, 0 },
+    CPU_SVME_FLAGS, 0 },
   { STRING_COMMA_LEN (".sse4a"), PROCESSOR_UNKNOWN,
-    CPU_SSE4A_FLAGS, 0, 0 },
+    CPU_SSE4A_FLAGS, 0 },
   { STRING_COMMA_LEN (".abm"), PROCESSOR_UNKNOWN,
-    CPU_ABM_FLAGS, 0, 0 },
+    CPU_ABM_FLAGS, 0 },
   { STRING_COMMA_LEN (".bmi"), PROCESSOR_UNKNOWN,
-    CPU_BMI_FLAGS, 0, 0 },
+    CPU_BMI_FLAGS, 0 },
   { STRING_COMMA_LEN (".tbm"), PROCESSOR_UNKNOWN,
-    CPU_TBM_FLAGS, 0, 0 },
+    CPU_TBM_FLAGS, 0 },
   { STRING_COMMA_LEN (".adx"), PROCESSOR_UNKNOWN,
-    CPU_ADX_FLAGS, 0, 0 },
+    CPU_ADX_FLAGS, 0 },
   { STRING_COMMA_LEN (".rdseed"), PROCESSOR_UNKNOWN,
-    CPU_RDSEED_FLAGS, 0, 0 },
+    CPU_RDSEED_FLAGS, 0 },
   { STRING_COMMA_LEN (".prfchw"), PROCESSOR_UNKNOWN,
-    CPU_PRFCHW_FLAGS, 0, 0 },
+    CPU_PRFCHW_FLAGS, 0 },
   { STRING_COMMA_LEN (".smap"), PROCESSOR_UNKNOWN,
-    CPU_SMAP_FLAGS, 0, 0 },
+    CPU_SMAP_FLAGS, 0 },
   { STRING_COMMA_LEN (".mpx"), PROCESSOR_UNKNOWN,
-    CPU_MPX_FLAGS, 0, 0 },
+    CPU_MPX_FLAGS, 0 },
   { STRING_COMMA_LEN (".sha"), PROCESSOR_UNKNOWN,
-    CPU_SHA_FLAGS, 0, 0 },
+    CPU_SHA_FLAGS, 0 },
   { STRING_COMMA_LEN (".clflushopt"), PROCESSOR_UNKNOWN,
-    CPU_CLFLUSHOPT_FLAGS, 0, 0 },
+    CPU_CLFLUSHOPT_FLAGS, 0 },
   { STRING_COMMA_LEN (".prefetchwt1"), PROCESSOR_UNKNOWN,
-    CPU_PREFETCHWT1_FLAGS, 0, 0 },
+    CPU_PREFETCHWT1_FLAGS, 0 },
   { STRING_COMMA_LEN (".se1"), PROCESSOR_UNKNOWN,
-    CPU_SE1_FLAGS, 0, 0 },
+    CPU_SE1_FLAGS, 0 },
   { STRING_COMMA_LEN (".clwb"), PROCESSOR_UNKNOWN,
-    CPU_CLWB_FLAGS, 0, 0 },
+    CPU_CLWB_FLAGS, 0 },
   { STRING_COMMA_LEN (".pcommit"), PROCESSOR_UNKNOWN,
-    CPU_PCOMMIT_FLAGS, 0, 0 },
+    CPU_PCOMMIT_FLAGS, 0 },
   { STRING_COMMA_LEN (".avx512ifma"), PROCESSOR_UNKNOWN,
-    CPU_AVX512IFMA_FLAGS, 0, 0 },
+    CPU_AVX512IFMA_FLAGS, 0 },
   { STRING_COMMA_LEN (".avx512vbmi"), PROCESSOR_UNKNOWN,
-    CPU_AVX512VBMI_FLAGS, 0, 0 },
+    CPU_AVX512VBMI_FLAGS, 0 },
   { STRING_COMMA_LEN (".clzero"), PROCESSOR_UNKNOWN,
-    CPU_CLZERO_FLAGS, 0, 0 },
+    CPU_CLZERO_FLAGS, 0 },
   { STRING_COMMA_LEN (".mwaitx"), PROCESSOR_UNKNOWN,
-    CPU_MWAITX_FLAGS, 0, 0 },
+    CPU_MWAITX_FLAGS, 0 },
   { STRING_COMMA_LEN (".ospke"), PROCESSOR_UNKNOWN,
-    CPU_OSPKE_FLAGS, 0, 0 },
+    CPU_OSPKE_FLAGS, 0 },
   { STRING_COMMA_LEN (".rdpid"), PROCESSOR_UNKNOWN,
-    CPU_RDPID_FLAGS, 0, 0 },
+    CPU_RDPID_FLAGS, 0 },
+};
+
+static const noarch_entry cpu_noarch[] =
+{
+  { STRING_COMMA_LEN (".no87"),  CPU_ANY_X87_FLAGS },
+  { STRING_COMMA_LEN (".nommx"),  CPU_ANY_MMX_FLAGS },
+  { STRING_COMMA_LEN (".nosse"),  CPU_ANY_SSE_FLAGS },
+  { STRING_COMMA_LEN (".noavx"),  CPU_ANY_AVX_FLAGS },
 };
 
 #ifdef I386COFF
@@ -2370,12 +2378,8 @@ set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
 		  break;
 		}
 
-	      if (!cpu_arch[j].negated)
-		flags = cpu_flags_or (cpu_arch_flags,
-				      cpu_arch[j].flags);
-	      else
-		flags = cpu_flags_and_not (cpu_arch_flags,
-					   cpu_arch[j].flags);
+	      flags = cpu_flags_or (cpu_arch_flags,
+				    cpu_arch[j].flags);
 
 	      if (!valid_iamcu_cpu_flags (&flags))
 		as_fatal (_("`%s' isn't valid for Intel MCU"),
@@ -2400,6 +2404,38 @@ set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
 	      return;
 	    }
 	}
+
+      if (j >= ARRAY_SIZE (cpu_arch))
+	{
+	  /* Disable an ISA entension.  */
+	  for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
+	    if (strcmp (string, cpu_noarch [j].name) == 0)
+	      {
+		flags = cpu_flags_and_not (cpu_arch_flags,
+					   cpu_noarch[j].flags);
+		if (!cpu_flags_equal (&flags, &cpu_arch_flags))
+		  {
+		    if (cpu_sub_arch_name)
+		      {
+			char *name = cpu_sub_arch_name;
+			cpu_sub_arch_name = concat (name,
+						    cpu_noarch[j].name,
+						    (const char *) NULL);
+			free (name);
+		      }
+		    else
+		      cpu_sub_arch_name = xstrdup (cpu_noarch[j].name);
+		    cpu_arch_flags = flags;
+		    cpu_arch_isa_flags = flags;
+		  }
+		(void) restore_line_pointer (e);
+		demand_empty_rest_of_line ();
+		return;
+	      }
+
+	  j = ARRAY_SIZE (cpu_arch);
+	}
+
       if (j >= ARRAY_SIZE (cpu_arch))
 	as_bad (_("no such architecture: `%s'"), string);
 
@@ -9805,6 +9841,9 @@ md_parse_option (int c, const char *arg)
 
     case OPTION_MARCH:
       arch = xstrdup (arg);
+      /* Allow -march=+nosse.  */
+      if (*arch == '+')
+	arch++;
       do
 	{
 	  if (*arch == '.')
@@ -9838,12 +9877,8 @@ md_parse_option (int c, const char *arg)
 		  /* ISA entension.  */
 		  i386_cpu_flags flags;
 
-		  if (!cpu_arch[j].negated)
-		    flags = cpu_flags_or (cpu_arch_flags,
-					  cpu_arch[j].flags);
-		  else
-		    flags = cpu_flags_and_not (cpu_arch_flags,
-					       cpu_arch[j].flags);
+		  flags = cpu_flags_or (cpu_arch_flags,
+					cpu_arch[j].flags);
 
 		  if (!valid_iamcu_cpu_flags (&flags))
 		    as_fatal (_("`%s' isn't valid for Intel MCU"), arch);
@@ -9867,6 +9902,38 @@ md_parse_option (int c, const char *arg)
 	    }
 
 	  if (j >= ARRAY_SIZE (cpu_arch))
+	    {
+	      /* Disable an ISA entension.  */
+	      for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
+		if (*cpu_noarch [j].name == '.'
+		    && strcmp (arch, cpu_noarch [j].name + 1) == 0)
+		  {
+		    i386_cpu_flags flags;
+
+		    flags = cpu_flags_and_not (cpu_arch_flags,
+					       cpu_noarch[j].flags);
+		    if (!cpu_flags_equal (&flags, &cpu_arch_flags))
+		      {
+			if (cpu_sub_arch_name)
+			  {
+			    char *name = cpu_sub_arch_name;
+			    cpu_sub_arch_name = concat (cpu_noarch[j].name + 1,
+							(const char *) NULL);
+			    free (name);
+			  }
+			else
+			  cpu_sub_arch_name = xstrdup (cpu_noarch[j].name);
+			cpu_arch_flags = flags;
+			cpu_arch_isa_flags = flags;
+		      }
+		    break;
+		  }
+
+	      if (j >= ARRAY_SIZE (cpu_noarch))
+		j = ARRAY_SIZE (cpu_arch);
+	    }
+
+	  if (j >= ARRAY_SIZE (cpu_arch))
 	    as_fatal (_("invalid -march= option: `%s'"), arg);
 
 	  arch = next;
@@ -10049,6 +10116,44 @@ md_parse_option (int c, const char *arg)
 #define MESSAGE_TEMPLATE \
 "                                                                                "
 
+static char *
+output_message (FILE *stream, char *p, char *message, char *start,
+		int *left_p, const char *name, int len)
+{
+  int size = sizeof (MESSAGE_TEMPLATE);
+  int left = *left_p;
+
+  /* Reserve 2 spaces for ", " or ",\0" */
+  left -= len + 2;
+
+  /* Check if there is any room.  */
+  if (left >= 0)
+    {
+      if (p != start)
+	{
+	  *p++ = ',';
+	  *p++ = ' ';
+	}
+      p = mempcpy (p, name, len);
+    }
+  else
+    {
+      /* Output the current message now and start a new one.  */
+      *p++ = ',';
+      *p = '\0';
+      fprintf (stream, "%s\n", message);
+      p = start;
+      left = size - (start - message) - len - 2;
+
+      gas_assert (left >= 0);
+
+      p = mempcpy (p, name, len);
+    }
+
+  *left_p = left;
+  return p;
+}
+
 static void
 show_arch (FILE *stream, int ext, int check)
 {
@@ -10093,34 +10198,19 @@ show_arch (FILE *stream, int ext, int check)
 	  continue;
 	}
 
-      /* Reserve 2 spaces for ", " or ",\0" */
-      left -= len + 2;
-
-      /* Check if there is any room.  */
-      if (left >= 0)
-	{
-	  if (p != start)
-	    {
-	      *p++ = ',';
-	      *p++ = ' ';
-	    }
-	  p = mempcpy (p, name, len);
-	}
-      else
-	{
-	  /* Output the current message now and start a new one.  */
-	  *p++ = ',';
-	  *p = '\0';
-	  fprintf (stream, "%s\n", message);
-	  p = start;
-	  left = size - (start - message) - len - 2;
-
-	  gas_assert (left >= 0);
-
-	  p = mempcpy (p, name, len);
-	}
+      p = output_message (stream, p, message, start, &left, name, len);
     }
 
+  /* Display extensions.  */
+  if (ext)
+    for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
+      {
+	name = cpu_noarch [j].name + 1;
+	len = cpu_noarch [j].len - 1;
+	p = output_message (stream, p, message, start, &left, name,
+			    len);
+      }
+
   *p = '\0';
   fprintf (stream, "%s\n", message);
 }
diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp
index a18200e..716ec43 100644
--- a/gas/testsuite/gas/i386/i386.exp
+++ b/gas/testsuite/gas/i386/i386.exp
@@ -165,6 +165,14 @@ if [expr ([istarget "i*86-*-*"] ||  [istarget "x86_64-*-*"]) && [gas_32_check]]
     run_dump_test "387"
     run_list_test "no87" "-al"
     run_list_test "no87-2" "-march=i686+no87 -al"
+    run_list_test "nommx-1" "-al"
+    run_list_test "nommx-2" "-march=core+nommx -al"
+    run_list_test "nommx-3" "-march=+nommx -al"
+    run_list_test "nosse-1" "-al"
+    run_list_test "nosse-2" "-march=core+nosse -al"
+    run_list_test "nosse-3" "-march=+nosse -al"
+    run_list_test "noavx-1" "-al"
+    run_list_test "noavx-2" "-march=+noavx -al"
     run_dump_test "xsave"
     run_dump_test "xsave-intel"
     run_dump_test "aes"
diff --git a/gas/testsuite/gas/i386/noavx-1.l b/gas/testsuite/gas/i386/noavx-1.l
new file mode 100644
index 0000000..f4e2840
--- /dev/null
+++ b/gas/testsuite/gas/i386/noavx-1.l
@@ -0,0 +1,13 @@
+.*: Assembler messages:
+.*:4: Error: .*generic.*
+.*:8: Error: .*noavx.*
+GAS LISTING .*
+#...
+[ 	]*1[ 	]+\# Test \.arch \.noavx
+[ 	]*2[ 	]+\.text
+[ 	]*3[ 	]+\.arch generic32
+[ 	]*4[ 	]+vzeroupper
+[ 	]*5[ 	]+\.arch \.avx
+[ 	]*6[ 	]+\?\?\?\? C5F877   		vzeroupper
+[ 	]*7[ 	]+\.arch \.noavx
+[ 	]*8[ 	]+vzeroupper
diff --git a/gas/testsuite/gas/i386/noavx-1.s b/gas/testsuite/gas/i386/noavx-1.s
new file mode 100644
index 0000000..759b429
--- /dev/null
+++ b/gas/testsuite/gas/i386/noavx-1.s
@@ -0,0 +1,8 @@
+# Test .arch .noavx
+	.text
+	.arch generic32
+	vzeroupper
+	.arch .avx
+	vzeroupper
+	.arch .noavx
+	vzeroupper
diff --git a/gas/testsuite/gas/i386/noavx-2.l b/gas/testsuite/gas/i386/noavx-2.l
new file mode 100644
index 0000000..32cc140
--- /dev/null
+++ b/gas/testsuite/gas/i386/noavx-2.l
@@ -0,0 +1,7 @@
+.*: Assembler messages:
+.*:3: Error: .*noavx.*
+GAS LISTING .*
+#...
+[ 	]*1[ 	]+\# Test -march=\+noavx
+[ 	]*2[ 	]+\.text
+[ 	]*3[ 	]+vzeroupper
diff --git a/gas/testsuite/gas/i386/noavx-2.s b/gas/testsuite/gas/i386/noavx-2.s
new file mode 100644
index 0000000..82ffa3e
--- /dev/null
+++ b/gas/testsuite/gas/i386/noavx-2.s
@@ -0,0 +1,3 @@
+# Test -march=+noavx
+	.text
+	vzeroupper
diff --git a/gas/testsuite/gas/i386/nommx-1.l b/gas/testsuite/gas/i386/nommx-1.l
new file mode 100644
index 0000000..2b7a6ca
--- /dev/null
+++ b/gas/testsuite/gas/i386/nommx-1.l
@@ -0,0 +1,21 @@
+.*: Assembler messages:
+.*:4: Error: .*generic.*
+.*:7: Error: .*mmx.*
+.*:10: Error: .*3dnow.*
+.*:14: Error: .*nommx.*
+GAS LISTING .*
+#...
+[ 	]*1[ 	]+\# Test \.arch \.nommx
+[ 	]*2[ 	]+\.text
+[ 	]*3[ 	]+\.arch generic32
+[ 	]*4[ 	]+emms
+[ 	]*5[ 	]+\.arch \.mmx
+[ 	]*6[ 	]+\?\?\?\? 0F7EC0   		movd	%mm0, %eax
+[ 	]*7[ 	]+femms
+[ 	]*8[ 	]+\.arch \.3dnow
+[ 	]*9[ 	]+\?\?\?\? 0F0E     		femms
+[ 	]*10[ 	]+pswapd	%mm1,%mm0
+[ 	]*11[ 	]+\.arch \.3dnowa
+[ 	]*12[ 	]+\?\?\?\? 0F0FC1BB 		pswapd	%mm1,%mm0
+[ 	]*13[ 	]+\.arch \.nommx
+[ 	]*14[ 	]+emms
diff --git a/gas/testsuite/gas/i386/nommx-1.s b/gas/testsuite/gas/i386/nommx-1.s
new file mode 100644
index 0000000..f87edda
--- /dev/null
+++ b/gas/testsuite/gas/i386/nommx-1.s
@@ -0,0 +1,14 @@
+# Test .arch .nommx
+	.text
+	.arch generic32
+	emms
+	.arch .mmx
+	movd	%mm0, %eax
+	femms
+	.arch .3dnow
+	femms
+	pswapd	%mm1,%mm0
+	.arch .3dnowa
+	pswapd	%mm1,%mm0
+	.arch .nommx
+	emms
diff --git a/gas/testsuite/gas/i386/nommx-2.l b/gas/testsuite/gas/i386/nommx-2.l
new file mode 100644
index 0000000..a94b0a8
--- /dev/null
+++ b/gas/testsuite/gas/i386/nommx-2.l
@@ -0,0 +1,7 @@
+.*: Assembler messages:
+.*:3: Error: .*nommx.*
+GAS LISTING .*
+#...
+[ 	]*1[ 	]+\# Test -march=\.\.\.\+nommx
+[ 	]*2[ 	]+\.text
+[ 	]*3[ 	]+emms
diff --git a/gas/testsuite/gas/i386/nommx-2.s b/gas/testsuite/gas/i386/nommx-2.s
new file mode 100644
index 0000000..266ab8d
--- /dev/null
+++ b/gas/testsuite/gas/i386/nommx-2.s
@@ -0,0 +1,3 @@
+# Test -march=...+nommx
+	.text
+	emms
diff --git a/gas/testsuite/gas/i386/nommx-3.l b/gas/testsuite/gas/i386/nommx-3.l
new file mode 100644
index 0000000..0d2e1f1
--- /dev/null
+++ b/gas/testsuite/gas/i386/nommx-3.l
@@ -0,0 +1,7 @@
+.*: Assembler messages:
+.*:3: Error: .*nommx.*
+GAS LISTING .*
+#...
+[ 	]*1[ 	]+\# Test -march=\+nommx
+[ 	]*2[ 	]+\.text
+[ 	]*3[ 	]+emms
diff --git a/gas/testsuite/gas/i386/nommx-3.s b/gas/testsuite/gas/i386/nommx-3.s
new file mode 100644
index 0000000..4641c1d
--- /dev/null
+++ b/gas/testsuite/gas/i386/nommx-3.s
@@ -0,0 +1,3 @@
+# Test -march=+nommx
+	.text
+	emms
diff --git a/gas/testsuite/gas/i386/nosse-1.l b/gas/testsuite/gas/i386/nosse-1.l
new file mode 100644
index 0000000..486241b
--- /dev/null
+++ b/gas/testsuite/gas/i386/nosse-1.l
@@ -0,0 +1,13 @@
+.*: Assembler messages:
+.*:4: Error: .*generic.*
+.*:8: Error: .*nosse.*
+GAS LISTING .*
+#...
+[ 	]*1[ 	]+\# Test \.arch \.nosse
+[ 	]*2[ 	]+\.text
+[ 	]*3[ 	]+\.arch generic32
+[ 	]*4[ 	]+lfence
+[ 	]*5[ 	]+\.arch \.sse2
+[ 	]*6[ 	]+\?\?\?\? 0FAEE8   		lfence
+[ 	]*7[ 	]+\.arch \.nosse
+[ 	]*8[ 	]+lfence
diff --git a/gas/testsuite/gas/i386/nosse-1.s b/gas/testsuite/gas/i386/nosse-1.s
new file mode 100644
index 0000000..27f2528
--- /dev/null
+++ b/gas/testsuite/gas/i386/nosse-1.s
@@ -0,0 +1,8 @@
+# Test .arch .nosse
+	.text
+	.arch generic32
+	lfence
+	.arch .sse2
+	lfence
+	.arch .nosse
+	lfence
diff --git a/gas/testsuite/gas/i386/nosse-2.l b/gas/testsuite/gas/i386/nosse-2.l
new file mode 100644
index 0000000..45652b5
--- /dev/null
+++ b/gas/testsuite/gas/i386/nosse-2.l
@@ -0,0 +1,7 @@
+.*: Assembler messages:
+.*:3: Error: .*nosse.*
+GAS LISTING .*
+#...
+[ 	]*1[ 	]+\# Test -march=\.\.\.\+nosse
+[ 	]*2[ 	]+\.text
+[ 	]*3[ 	]+lfence
diff --git a/gas/testsuite/gas/i386/nosse-2.s b/gas/testsuite/gas/i386/nosse-2.s
new file mode 100644
index 0000000..bceb0c4
--- /dev/null
+++ b/gas/testsuite/gas/i386/nosse-2.s
@@ -0,0 +1,3 @@
+# Test -march=...+nosse
+	.text
+	lfence
diff --git a/gas/testsuite/gas/i386/nosse-3.l b/gas/testsuite/gas/i386/nosse-3.l
new file mode 100644
index 0000000..6626928
--- /dev/null
+++ b/gas/testsuite/gas/i386/nosse-3.l
@@ -0,0 +1,7 @@
+.*: Assembler messages:
+.*:3: Error: .*nosse.*
+GAS LISTING .*
+#...
+[ 	]*1[ 	]+\# Test -march=\+nosse
+[ 	]*2[ 	]+\.text
+[ 	]*3[ 	]+lfence
diff --git a/gas/testsuite/gas/i386/nosse-3.s b/gas/testsuite/gas/i386/nosse-3.s
new file mode 100644
index 0000000..b2ba5f7
--- /dev/null
+++ b/gas/testsuite/gas/i386/nosse-3.s
@@ -0,0 +1,3 @@
+# Test -march=+nosse
+	.text
+	lfence
diff --git a/opcodes/i386-gen.c b/opcodes/i386-gen.c
index 5b997f9..542ec6a 100644
--- a/opcodes/i386-gen.c
+++ b/opcodes/i386-gen.c
@@ -107,7 +107,7 @@ static initializer cpu_flag_init[] =
     "Cpu287" },
   { "CPU_387_FLAGS",
     "Cpu387" },
-  { "CPU_ANY87_FLAGS",
+  { "CPU_ANY_X87_FLAGS",
     "Cpu8087|Cpu287|Cpu387|Cpu687|CpuFISTTP" },
   { "CPU_CLFLUSH_FLAGS",
     "CpuClflush" },
@@ -185,6 +185,8 @@ static initializer cpu_flag_init[] =
     "CpuMMX|Cpu3dnow" },
   { "CPU_3DNOWA_FLAGS",
     "CpuMMX|Cpu3dnow|Cpu3dnowA" },
+  { "CPU_ANY_MMX_FLAGS",
+    "CpuMMX|Cpu3dnow|Cpu3dnowA" },
   { "CPU_PADLOCK_FLAGS",
     "CpuPadLock" },
   { "CPU_SVME_FLAGS",
diff --git a/opcodes/i386-init.h b/opcodes/i386-init.h
index de68c22..f553d43 100644
--- a/opcodes/i386-init.h
+++ b/opcodes/i386-init.h
@@ -249,7 +249,7 @@
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
 
-#define CPU_ANY87_FLAGS \
+#define CPU_ANY_X87_FLAGS \
   { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, \
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
@@ -522,6 +522,13 @@
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
 
+#define CPU_ANY_MMX_FLAGS \
+  { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
+
 #define CPU_PADLOCK_FLAGS \
   { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
       1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
-- 
2.5.5


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH] Allow setting CpuVRex bit in .arch directive
  2016-05-25 16:35             ` H.J. Lu
@ 2016-05-25 17:26               ` H.J. Lu
  0 siblings, 0 replies; 18+ messages in thread
From: H.J. Lu @ 2016-05-25 17:26 UTC (permalink / raw)
  To: Jakub Jelinek; +Cc: Binutils, Uros Bizjak, Kirill Yukhin

[-- Attachment #1: Type: text/plain, Size: 1718 bytes --]

On Wed, May 25, 2016 at 9:35 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Tue, May 24, 2016 at 1:36 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
>> On Tue, May 24, 2016 at 12:07 PM, Jakub Jelinek <jakub@redhat.com> wrote:
>>> On Tue, May 24, 2016 at 12:02:42PM -0700, H.J. Lu wrote:
>>>> > Try:
>>>> >         .arch corei7
>>>> >         .arch .avx512f
>>>> >         vpxord %xmm15, %xmm15, %xmm15
>>>> >         vpxord %xmm16, %xmm16, %xmm16
>>>> >
>>>> > I get:
>>>> > /tmp/1.s: Assembler messages:
>>>> > /tmp/1.s:4: Error: bad register name `%xmm16'
>>>>
>>>> I opened:
>>>>
>>>> https://sourceware.org/bugzilla/show_bug.cgi?id=20141
>>>>
>>>> > and couldn't find any way how to make that assemble if I want to
>>>> > disable even some ISA set and thus have to start with .arch <cpuname>
>>>> > and add all the ISA sets I want to enable on top of that CPU.
>>>>
>>>> So you want to just disable  AVX512D, no thing else.  Wouldn't a
>>>> ".noarch" directive work better?
>>>
>>> Well, to be able to generically disable specific ISAs (one, several).
>>> An alternative to .noarch would be just allowing
>>> .arch .noavx512vl etc. (like it already allows .no87).
>>> Perhaps instead of mentioning all the ISAs once again with "no" prefix
>>> just handle it generically, if .arch .no* is used, look first for
>>> entries with explicit no at the beginning, and if not found, look for
>>> the string after the prefix in the table and assume negate.
>>
>> Yes, it should work.
>
> It won't work since .noavx should disable all AVX instructions,
> just just AVX.  I am going to check in this patch to move all .noXXX
> directives to cpu_noarch.  We can add more .noXXX to cpu_noarch.
>

This is what I checked in.


-- 
H.J.

[-- Attachment #2: 0001-Reimplement-.no87-.nommx-.nosse-.noavx-directives.patch --]
[-- Type: text/x-patch, Size: 31131 bytes --]

From 0c1a2483f16bd8a26f1064e04f53d5fa4d2bef5f Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Tue, 24 May 2016 14:50:01 -0700
Subject: [PATCH] Reimplement .no87/.nommx/.nosse/.noavx directives

Move all .noXXX directives to cpu_noarch.

gas/

	* config/tc-i386.c (arch_entry): Remove negated.
	(noarch_entry): New struct.
	(cpu_arch): Updated.  Remove .no87, .nommx, .nosse and .noavx.
	(cpu_noarch): New.
	(set_cpu_arch): Check cpu_noarch after cpu_arch.
	(md_parse_option): Allow -march=+nosse.  Check cpu_noarch after
	cpu_arch.
	(output_message): New function.
	(show_arch): Use it.  Handle cpu_noarch.
	* testsuite/gas/i386/i386.exp: Run nommx-1, nommx-2, nommx-3,
	nosse-1, nosse-2, nosse-3, noavx-1 and noavx-2.
	* testsuite/gas/i386/noavx-1.l: New file.
	* testsuite/gas/i386/noavx-1.s: Likewise.
	* testsuite/gas/i386/noavx-2.s: Likewise.
	* testsuite/gas/i386/noavx-2.l: Likewise.
	* testsuite/gas/i386/nommx-1.s: Likewise.
	* testsuite/gas/i386/nommx-1.l: Likewise.
	* testsuite/gas/i386/nommx-2.s: Likewise.
	* testsuite/gas/i386/nommx-2.l: Likewise.
	* testsuite/gas/i386/nommx-3.s: Likewise.
	* testsuite/gas/i386/nommx-3.l: Likewise.
	* testsuite/gas/i386/nosse-1.s: Likewise.
	* testsuite/gas/i386/nosse-1.l: Likewise.
	* testsuite/gas/i386/nosse-2.s: Likewise.
	* testsuite/gas/i386/nosse-2.l: Likewise.
	* testsuite/gas/i386/nosse-3.s: Likewise.
	* testsuite/gas/i386/nosse-3.l: Likewise.

opcodes/

	* i386-gen.c (cpu_flag_init): Rename CPU_ANY87_FLAGS to
	CPU_ANY_X87_FLAGS.  Add CPU_ANY_MMX_FLAGS.
	* i386-init.h: Regenerated.
---
 gas/config/tc-i386.c             | 416 ++++++++++++++++++++++++---------------
 gas/testsuite/gas/i386/i386.exp  |   8 +
 gas/testsuite/gas/i386/noavx-1.l |  13 ++
 gas/testsuite/gas/i386/noavx-1.s |   8 +
 gas/testsuite/gas/i386/noavx-2.l |   7 +
 gas/testsuite/gas/i386/noavx-2.s |   3 +
 gas/testsuite/gas/i386/nommx-1.l |  21 ++
 gas/testsuite/gas/i386/nommx-1.s |  14 ++
 gas/testsuite/gas/i386/nommx-2.l |   7 +
 gas/testsuite/gas/i386/nommx-2.s |   3 +
 gas/testsuite/gas/i386/nommx-3.l |   7 +
 gas/testsuite/gas/i386/nommx-3.s |   3 +
 gas/testsuite/gas/i386/nosse-1.l |  13 ++
 gas/testsuite/gas/i386/nosse-1.s |   8 +
 gas/testsuite/gas/i386/nosse-2.l |   7 +
 gas/testsuite/gas/i386/nosse-2.s |   3 +
 gas/testsuite/gas/i386/nosse-3.l |   7 +
 gas/testsuite/gas/i386/nosse-3.s |   3 +
 opcodes/i386-gen.c               |   4 +-
 opcodes/i386-init.h              |   9 +-
 20 files changed, 399 insertions(+), 165 deletions(-)
 create mode 100644 gas/testsuite/gas/i386/noavx-1.l
 create mode 100644 gas/testsuite/gas/i386/noavx-1.s
 create mode 100644 gas/testsuite/gas/i386/noavx-2.l
 create mode 100644 gas/testsuite/gas/i386/noavx-2.s
 create mode 100644 gas/testsuite/gas/i386/nommx-1.l
 create mode 100644 gas/testsuite/gas/i386/nommx-1.s
 create mode 100644 gas/testsuite/gas/i386/nommx-2.l
 create mode 100644 gas/testsuite/gas/i386/nommx-2.s
 create mode 100644 gas/testsuite/gas/i386/nommx-3.l
 create mode 100644 gas/testsuite/gas/i386/nommx-3.s
 create mode 100644 gas/testsuite/gas/i386/nosse-1.l
 create mode 100644 gas/testsuite/gas/i386/nosse-1.s
 create mode 100644 gas/testsuite/gas/i386/nosse-2.l
 create mode 100644 gas/testsuite/gas/i386/nosse-2.s
 create mode 100644 gas/testsuite/gas/i386/nosse-3.l
 create mode 100644 gas/testsuite/gas/i386/nosse-3.s

diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index 8a4d987..13041ea 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -133,10 +133,18 @@ typedef struct
   enum processor_type type;	/* arch type */
   i386_cpu_flags flags;		/* cpu feature flags */
   unsigned int skip;		/* show_arch should skip this. */
-  unsigned int negated;		/* turn off indicated flags.  */
 }
 arch_entry;
 
+/* Used to turn off indicated flags.  */
+typedef struct
+{
+  const char *name;		/* arch name */
+  unsigned int len;		/* arch string length */
+  i386_cpu_flags flags;		/* cpu feature flags */
+}
+noarch_entry;
+
 static void update_code_flag (int, int);
 static void set_code_flag (int);
 static void set_16bit_gcc_code_flag (int);
@@ -730,239 +738,239 @@ static const arch_entry cpu_arch[] =
   /* Do not replace the first two entries - i386_target_format()
      relies on them being there in this order.  */
   { STRING_COMMA_LEN ("generic32"), PROCESSOR_GENERIC32,
-    CPU_GENERIC32_FLAGS, 0, 0 },
+    CPU_GENERIC32_FLAGS, 0 },
   { STRING_COMMA_LEN ("generic64"), PROCESSOR_GENERIC64,
-    CPU_GENERIC64_FLAGS, 0, 0 },
+    CPU_GENERIC64_FLAGS, 0 },
   { STRING_COMMA_LEN ("i8086"), PROCESSOR_UNKNOWN,
-    CPU_NONE_FLAGS, 0, 0 },
+    CPU_NONE_FLAGS, 0 },
   { STRING_COMMA_LEN ("i186"), PROCESSOR_UNKNOWN,
-    CPU_I186_FLAGS, 0, 0 },
+    CPU_I186_FLAGS, 0 },
   { STRING_COMMA_LEN ("i286"), PROCESSOR_UNKNOWN,
-    CPU_I286_FLAGS, 0, 0 },
+    CPU_I286_FLAGS, 0 },
   { STRING_COMMA_LEN ("i386"), PROCESSOR_I386,
-    CPU_I386_FLAGS, 0, 0 },
+    CPU_I386_FLAGS, 0 },
   { STRING_COMMA_LEN ("i486"), PROCESSOR_I486,
-    CPU_I486_FLAGS, 0, 0 },
+    CPU_I486_FLAGS, 0 },
   { STRING_COMMA_LEN ("i586"), PROCESSOR_PENTIUM,
-    CPU_I586_FLAGS, 0, 0 },
+    CPU_I586_FLAGS, 0 },
   { STRING_COMMA_LEN ("i686"), PROCESSOR_PENTIUMPRO,
-    CPU_I686_FLAGS, 0, 0 },
+    CPU_I686_FLAGS, 0 },
   { STRING_COMMA_LEN ("pentium"), PROCESSOR_PENTIUM,
-    CPU_I586_FLAGS, 0, 0 },
+    CPU_I586_FLAGS, 0 },
   { STRING_COMMA_LEN ("pentiumpro"), PROCESSOR_PENTIUMPRO,
-    CPU_PENTIUMPRO_FLAGS, 0, 0 },
+    CPU_PENTIUMPRO_FLAGS, 0 },
   { STRING_COMMA_LEN ("pentiumii"), PROCESSOR_PENTIUMPRO,
-    CPU_P2_FLAGS, 0, 0 },
+    CPU_P2_FLAGS, 0 },
   { STRING_COMMA_LEN ("pentiumiii"),PROCESSOR_PENTIUMPRO,
-    CPU_P3_FLAGS, 0, 0 },
+    CPU_P3_FLAGS, 0 },
   { STRING_COMMA_LEN ("pentium4"), PROCESSOR_PENTIUM4,
-    CPU_P4_FLAGS, 0, 0 },
+    CPU_P4_FLAGS, 0 },
   { STRING_COMMA_LEN ("prescott"), PROCESSOR_NOCONA,
-    CPU_CORE_FLAGS, 0, 0 },
+    CPU_CORE_FLAGS, 0 },
   { STRING_COMMA_LEN ("nocona"), PROCESSOR_NOCONA,
-    CPU_NOCONA_FLAGS, 0, 0 },
+    CPU_NOCONA_FLAGS, 0 },
   { STRING_COMMA_LEN ("yonah"), PROCESSOR_CORE,
-    CPU_CORE_FLAGS, 1, 0 },
+    CPU_CORE_FLAGS, 1 },
   { STRING_COMMA_LEN ("core"), PROCESSOR_CORE,
-    CPU_CORE_FLAGS, 0, 0 },
+    CPU_CORE_FLAGS, 0 },
   { STRING_COMMA_LEN ("merom"), PROCESSOR_CORE2,
-    CPU_CORE2_FLAGS, 1, 0 },
+    CPU_CORE2_FLAGS, 1 },
   { STRING_COMMA_LEN ("core2"), PROCESSOR_CORE2,
-    CPU_CORE2_FLAGS, 0, 0 },
+    CPU_CORE2_FLAGS, 0 },
   { STRING_COMMA_LEN ("corei7"), PROCESSOR_COREI7,
-    CPU_COREI7_FLAGS, 0, 0 },
+    CPU_COREI7_FLAGS, 0 },
   { STRING_COMMA_LEN ("l1om"), PROCESSOR_L1OM,
-    CPU_L1OM_FLAGS, 0, 0 },
+    CPU_L1OM_FLAGS, 0 },
   { STRING_COMMA_LEN ("k1om"), PROCESSOR_K1OM,
-    CPU_K1OM_FLAGS, 0, 0 },
+    CPU_K1OM_FLAGS, 0 },
   { STRING_COMMA_LEN ("iamcu"), PROCESSOR_IAMCU,
-    CPU_IAMCU_FLAGS, 0, 0 },
+    CPU_IAMCU_FLAGS, 0 },
   { STRING_COMMA_LEN ("k6"), PROCESSOR_K6,
-    CPU_K6_FLAGS, 0, 0 },
+    CPU_K6_FLAGS, 0 },
   { STRING_COMMA_LEN ("k6_2"), PROCESSOR_K6,
-    CPU_K6_2_FLAGS, 0, 0 },
+    CPU_K6_2_FLAGS, 0 },
   { STRING_COMMA_LEN ("athlon"), PROCESSOR_ATHLON,
-    CPU_ATHLON_FLAGS, 0, 0 },
+    CPU_ATHLON_FLAGS, 0 },
   { STRING_COMMA_LEN ("sledgehammer"), PROCESSOR_K8,
-    CPU_K8_FLAGS, 1, 0 },
+    CPU_K8_FLAGS, 1 },
   { STRING_COMMA_LEN ("opteron"), PROCESSOR_K8,
-    CPU_K8_FLAGS, 0, 0 },
+    CPU_K8_FLAGS, 0 },
   { STRING_COMMA_LEN ("k8"), PROCESSOR_K8,
-    CPU_K8_FLAGS, 0, 0 },
+    CPU_K8_FLAGS, 0 },
   { STRING_COMMA_LEN ("amdfam10"), PROCESSOR_AMDFAM10,
-    CPU_AMDFAM10_FLAGS, 0, 0 },
+    CPU_AMDFAM10_FLAGS, 0 },
   { STRING_COMMA_LEN ("bdver1"), PROCESSOR_BD,
-    CPU_BDVER1_FLAGS, 0, 0 },
+    CPU_BDVER1_FLAGS, 0 },
   { STRING_COMMA_LEN ("bdver2"), PROCESSOR_BD,
-    CPU_BDVER2_FLAGS, 0, 0 },
+    CPU_BDVER2_FLAGS, 0 },
   { STRING_COMMA_LEN ("bdver3"), PROCESSOR_BD,
-    CPU_BDVER3_FLAGS, 0, 0 },
+    CPU_BDVER3_FLAGS, 0 },
   { STRING_COMMA_LEN ("bdver4"), PROCESSOR_BD,
-    CPU_BDVER4_FLAGS, 0, 0 },
+    CPU_BDVER4_FLAGS, 0 },
   { STRING_COMMA_LEN ("znver1"), PROCESSOR_ZNVER,
-    CPU_ZNVER1_FLAGS, 0, 0 },
+    CPU_ZNVER1_FLAGS, 0 },
   { STRING_COMMA_LEN ("btver1"), PROCESSOR_BT,
-    CPU_BTVER1_FLAGS, 0, 0 },
+    CPU_BTVER1_FLAGS, 0 },
   { STRING_COMMA_LEN ("btver2"), PROCESSOR_BT,
-    CPU_BTVER2_FLAGS, 0, 0 },
+    CPU_BTVER2_FLAGS, 0 },
   { STRING_COMMA_LEN (".8087"), PROCESSOR_UNKNOWN,
-    CPU_8087_FLAGS, 0, 0 },
+    CPU_8087_FLAGS, 0 },
   { STRING_COMMA_LEN (".287"), PROCESSOR_UNKNOWN,
-    CPU_287_FLAGS, 0, 0 },
+    CPU_287_FLAGS, 0 },
   { STRING_COMMA_LEN (".387"), PROCESSOR_UNKNOWN,
-    CPU_387_FLAGS, 0, 0 },
-  { STRING_COMMA_LEN (".no87"), PROCESSOR_UNKNOWN,
-    CPU_ANY87_FLAGS, 0, 1 },
+    CPU_387_FLAGS, 0 },
   { STRING_COMMA_LEN (".mmx"), PROCESSOR_UNKNOWN,
-    CPU_MMX_FLAGS, 0, 0 },
-  { STRING_COMMA_LEN (".nommx"), PROCESSOR_UNKNOWN,
-    CPU_3DNOWA_FLAGS, 0, 1 },
+    CPU_MMX_FLAGS, 0 },
   { STRING_COMMA_LEN (".sse"), PROCESSOR_UNKNOWN,
-    CPU_SSE_FLAGS, 0, 0 },
+    CPU_SSE_FLAGS, 0 },
   { STRING_COMMA_LEN (".sse2"), PROCESSOR_UNKNOWN,
-    CPU_SSE2_FLAGS, 0, 0 },
+    CPU_SSE2_FLAGS, 0 },
   { STRING_COMMA_LEN (".sse3"), PROCESSOR_UNKNOWN,
-    CPU_SSE3_FLAGS, 0, 0 },
+    CPU_SSE3_FLAGS, 0 },
   { STRING_COMMA_LEN (".ssse3"), PROCESSOR_UNKNOWN,
-    CPU_SSSE3_FLAGS, 0, 0 },
+    CPU_SSSE3_FLAGS, 0 },
   { STRING_COMMA_LEN (".sse4.1"), PROCESSOR_UNKNOWN,
-    CPU_SSE4_1_FLAGS, 0, 0 },
+    CPU_SSE4_1_FLAGS, 0 },
   { STRING_COMMA_LEN (".sse4.2"), PROCESSOR_UNKNOWN,
-    CPU_SSE4_2_FLAGS, 0, 0 },
+    CPU_SSE4_2_FLAGS, 0 },
   { STRING_COMMA_LEN (".sse4"), PROCESSOR_UNKNOWN,
-    CPU_SSE4_2_FLAGS, 0, 0 },
-  { STRING_COMMA_LEN (".nosse"), PROCESSOR_UNKNOWN,
-    CPU_ANY_SSE_FLAGS, 0, 1 },
+    CPU_SSE4_2_FLAGS, 0 },
   { STRING_COMMA_LEN (".avx"), PROCESSOR_UNKNOWN,
-    CPU_AVX_FLAGS, 0, 0 },
+    CPU_AVX_FLAGS, 0 },
   { STRING_COMMA_LEN (".avx2"), PROCESSOR_UNKNOWN,
-    CPU_AVX2_FLAGS, 0, 0 },
+    CPU_AVX2_FLAGS, 0 },
   { STRING_COMMA_LEN (".avx512f"), PROCESSOR_UNKNOWN,
-    CPU_AVX512F_FLAGS, 0, 0 },
+    CPU_AVX512F_FLAGS, 0 },
   { STRING_COMMA_LEN (".avx512cd"), PROCESSOR_UNKNOWN,
-    CPU_AVX512CD_FLAGS, 0, 0 },
+    CPU_AVX512CD_FLAGS, 0 },
   { STRING_COMMA_LEN (".avx512er"), PROCESSOR_UNKNOWN,
-    CPU_AVX512ER_FLAGS, 0, 0 },
+    CPU_AVX512ER_FLAGS, 0 },
   { STRING_COMMA_LEN (".avx512pf"), PROCESSOR_UNKNOWN,
-    CPU_AVX512PF_FLAGS, 0, 0 },
+    CPU_AVX512PF_FLAGS, 0 },
   { STRING_COMMA_LEN (".avx512dq"), PROCESSOR_UNKNOWN,
-    CPU_AVX512DQ_FLAGS, 0, 0 },
+    CPU_AVX512DQ_FLAGS, 0 },
   { STRING_COMMA_LEN (".avx512bw"), PROCESSOR_UNKNOWN,
-    CPU_AVX512BW_FLAGS, 0, 0 },
+    CPU_AVX512BW_FLAGS, 0 },
   { STRING_COMMA_LEN (".avx512vl"), PROCESSOR_UNKNOWN,
-    CPU_AVX512VL_FLAGS, 0, 0 },
-  { STRING_COMMA_LEN (".noavx"), PROCESSOR_UNKNOWN,
-    CPU_ANY_AVX_FLAGS, 0, 1 },
+    CPU_AVX512VL_FLAGS, 0 },
   { STRING_COMMA_LEN (".vmx"), PROCESSOR_UNKNOWN,
-    CPU_VMX_FLAGS, 0, 0 },
+    CPU_VMX_FLAGS, 0 },
   { STRING_COMMA_LEN (".vmfunc"), PROCESSOR_UNKNOWN,
-    CPU_VMFUNC_FLAGS, 0, 0 },
+    CPU_VMFUNC_FLAGS, 0 },
   { STRING_COMMA_LEN (".smx"), PROCESSOR_UNKNOWN,
-    CPU_SMX_FLAGS, 0, 0 },
+    CPU_SMX_FLAGS, 0 },
   { STRING_COMMA_LEN (".xsave"), PROCESSOR_UNKNOWN,
-    CPU_XSAVE_FLAGS, 0, 0 },
+    CPU_XSAVE_FLAGS, 0 },
   { STRING_COMMA_LEN (".xsaveopt"), PROCESSOR_UNKNOWN,
-    CPU_XSAVEOPT_FLAGS, 0, 0 },
+    CPU_XSAVEOPT_FLAGS, 0 },
   { STRING_COMMA_LEN (".xsavec"), PROCESSOR_UNKNOWN,
-    CPU_XSAVEC_FLAGS, 0, 0 },
+    CPU_XSAVEC_FLAGS, 0 },
   { STRING_COMMA_LEN (".xsaves"), PROCESSOR_UNKNOWN,
-    CPU_XSAVES_FLAGS, 0, 0 },
+    CPU_XSAVES_FLAGS, 0 },
   { STRING_COMMA_LEN (".aes"), PROCESSOR_UNKNOWN,
-    CPU_AES_FLAGS, 0, 0 },
+    CPU_AES_FLAGS, 0 },
   { STRING_COMMA_LEN (".pclmul"), PROCESSOR_UNKNOWN,
-    CPU_PCLMUL_FLAGS, 0, 0 },
+    CPU_PCLMUL_FLAGS, 0 },
   { STRING_COMMA_LEN (".clmul"), PROCESSOR_UNKNOWN,
-    CPU_PCLMUL_FLAGS, 1, 0 },
+    CPU_PCLMUL_FLAGS, 1 },
   { STRING_COMMA_LEN (".fsgsbase"), PROCESSOR_UNKNOWN,
-    CPU_FSGSBASE_FLAGS, 0, 0 },
+    CPU_FSGSBASE_FLAGS, 0 },
   { STRING_COMMA_LEN (".rdrnd"), PROCESSOR_UNKNOWN,
-    CPU_RDRND_FLAGS, 0, 0 },
+    CPU_RDRND_FLAGS, 0 },
   { STRING_COMMA_LEN (".f16c"), PROCESSOR_UNKNOWN,
-    CPU_F16C_FLAGS, 0, 0 },
+    CPU_F16C_FLAGS, 0 },
   { STRING_COMMA_LEN (".bmi2"), PROCESSOR_UNKNOWN,
-    CPU_BMI2_FLAGS, 0, 0 },
+    CPU_BMI2_FLAGS, 0 },
   { STRING_COMMA_LEN (".fma"), PROCESSOR_UNKNOWN,
-    CPU_FMA_FLAGS, 0, 0 },
+    CPU_FMA_FLAGS, 0 },
   { STRING_COMMA_LEN (".fma4"), PROCESSOR_UNKNOWN,
-    CPU_FMA4_FLAGS, 0, 0 },
+    CPU_FMA4_FLAGS, 0 },
   { STRING_COMMA_LEN (".xop"), PROCESSOR_UNKNOWN,
-    CPU_XOP_FLAGS, 0, 0 },
+    CPU_XOP_FLAGS, 0 },
   { STRING_COMMA_LEN (".lwp"), PROCESSOR_UNKNOWN,
-    CPU_LWP_FLAGS, 0, 0 },
+    CPU_LWP_FLAGS, 0 },
   { STRING_COMMA_LEN (".movbe"), PROCESSOR_UNKNOWN,
-    CPU_MOVBE_FLAGS, 0, 0 },
+    CPU_MOVBE_FLAGS, 0 },
   { STRING_COMMA_LEN (".cx16"), PROCESSOR_UNKNOWN,
-    CPU_CX16_FLAGS, 0, 0 },
+    CPU_CX16_FLAGS, 0 },
   { STRING_COMMA_LEN (".ept"), PROCESSOR_UNKNOWN,
-    CPU_EPT_FLAGS, 0, 0 },
+    CPU_EPT_FLAGS, 0 },
   { STRING_COMMA_LEN (".lzcnt"), PROCESSOR_UNKNOWN,
-    CPU_LZCNT_FLAGS, 0, 0 },
+    CPU_LZCNT_FLAGS, 0 },
   { STRING_COMMA_LEN (".hle"), PROCESSOR_UNKNOWN,
-    CPU_HLE_FLAGS, 0, 0 },
+    CPU_HLE_FLAGS, 0 },
   { STRING_COMMA_LEN (".rtm"), PROCESSOR_UNKNOWN,
-    CPU_RTM_FLAGS, 0, 0 },
+    CPU_RTM_FLAGS, 0 },
   { STRING_COMMA_LEN (".invpcid"), PROCESSOR_UNKNOWN,
-    CPU_INVPCID_FLAGS, 0, 0 },
+    CPU_INVPCID_FLAGS, 0 },
   { STRING_COMMA_LEN (".clflush"), PROCESSOR_UNKNOWN,
-    CPU_CLFLUSH_FLAGS, 0, 0 },
+    CPU_CLFLUSH_FLAGS, 0 },
   { STRING_COMMA_LEN (".nop"), PROCESSOR_UNKNOWN,
-    CPU_NOP_FLAGS, 0, 0 },
+    CPU_NOP_FLAGS, 0 },
   { STRING_COMMA_LEN (".syscall"), PROCESSOR_UNKNOWN,
-    CPU_SYSCALL_FLAGS, 0, 0 },
+    CPU_SYSCALL_FLAGS, 0 },
   { STRING_COMMA_LEN (".rdtscp"), PROCESSOR_UNKNOWN,
-    CPU_RDTSCP_FLAGS, 0, 0 },
+    CPU_RDTSCP_FLAGS, 0 },
   { STRING_COMMA_LEN (".3dnow"), PROCESSOR_UNKNOWN,
-    CPU_3DNOW_FLAGS, 0, 0 },
+    CPU_3DNOW_FLAGS, 0 },
   { STRING_COMMA_LEN (".3dnowa"), PROCESSOR_UNKNOWN,
-    CPU_3DNOWA_FLAGS, 0, 0 },
+    CPU_3DNOWA_FLAGS, 0 },
   { STRING_COMMA_LEN (".padlock"), PROCESSOR_UNKNOWN,
-    CPU_PADLOCK_FLAGS, 0, 0 },
+    CPU_PADLOCK_FLAGS, 0 },
   { STRING_COMMA_LEN (".pacifica"), PROCESSOR_UNKNOWN,
-    CPU_SVME_FLAGS, 1, 0 },
+    CPU_SVME_FLAGS, 1 },
   { STRING_COMMA_LEN (".svme"), PROCESSOR_UNKNOWN,
-    CPU_SVME_FLAGS, 0, 0 },
+    CPU_SVME_FLAGS, 0 },
   { STRING_COMMA_LEN (".sse4a"), PROCESSOR_UNKNOWN,
-    CPU_SSE4A_FLAGS, 0, 0 },
+    CPU_SSE4A_FLAGS, 0 },
   { STRING_COMMA_LEN (".abm"), PROCESSOR_UNKNOWN,
-    CPU_ABM_FLAGS, 0, 0 },
+    CPU_ABM_FLAGS, 0 },
   { STRING_COMMA_LEN (".bmi"), PROCESSOR_UNKNOWN,
-    CPU_BMI_FLAGS, 0, 0 },
+    CPU_BMI_FLAGS, 0 },
   { STRING_COMMA_LEN (".tbm"), PROCESSOR_UNKNOWN,
-    CPU_TBM_FLAGS, 0, 0 },
+    CPU_TBM_FLAGS, 0 },
   { STRING_COMMA_LEN (".adx"), PROCESSOR_UNKNOWN,
-    CPU_ADX_FLAGS, 0, 0 },
+    CPU_ADX_FLAGS, 0 },
   { STRING_COMMA_LEN (".rdseed"), PROCESSOR_UNKNOWN,
-    CPU_RDSEED_FLAGS, 0, 0 },
+    CPU_RDSEED_FLAGS, 0 },
   { STRING_COMMA_LEN (".prfchw"), PROCESSOR_UNKNOWN,
-    CPU_PRFCHW_FLAGS, 0, 0 },
+    CPU_PRFCHW_FLAGS, 0 },
   { STRING_COMMA_LEN (".smap"), PROCESSOR_UNKNOWN,
-    CPU_SMAP_FLAGS, 0, 0 },
+    CPU_SMAP_FLAGS, 0 },
   { STRING_COMMA_LEN (".mpx"), PROCESSOR_UNKNOWN,
-    CPU_MPX_FLAGS, 0, 0 },
+    CPU_MPX_FLAGS, 0 },
   { STRING_COMMA_LEN (".sha"), PROCESSOR_UNKNOWN,
-    CPU_SHA_FLAGS, 0, 0 },
+    CPU_SHA_FLAGS, 0 },
   { STRING_COMMA_LEN (".clflushopt"), PROCESSOR_UNKNOWN,
-    CPU_CLFLUSHOPT_FLAGS, 0, 0 },
+    CPU_CLFLUSHOPT_FLAGS, 0 },
   { STRING_COMMA_LEN (".prefetchwt1"), PROCESSOR_UNKNOWN,
-    CPU_PREFETCHWT1_FLAGS, 0, 0 },
+    CPU_PREFETCHWT1_FLAGS, 0 },
   { STRING_COMMA_LEN (".se1"), PROCESSOR_UNKNOWN,
-    CPU_SE1_FLAGS, 0, 0 },
+    CPU_SE1_FLAGS, 0 },
   { STRING_COMMA_LEN (".clwb"), PROCESSOR_UNKNOWN,
-    CPU_CLWB_FLAGS, 0, 0 },
+    CPU_CLWB_FLAGS, 0 },
   { STRING_COMMA_LEN (".pcommit"), PROCESSOR_UNKNOWN,
-    CPU_PCOMMIT_FLAGS, 0, 0 },
+    CPU_PCOMMIT_FLAGS, 0 },
   { STRING_COMMA_LEN (".avx512ifma"), PROCESSOR_UNKNOWN,
-    CPU_AVX512IFMA_FLAGS, 0, 0 },
+    CPU_AVX512IFMA_FLAGS, 0 },
   { STRING_COMMA_LEN (".avx512vbmi"), PROCESSOR_UNKNOWN,
-    CPU_AVX512VBMI_FLAGS, 0, 0 },
+    CPU_AVX512VBMI_FLAGS, 0 },
   { STRING_COMMA_LEN (".clzero"), PROCESSOR_UNKNOWN,
-    CPU_CLZERO_FLAGS, 0, 0 },
+    CPU_CLZERO_FLAGS, 0 },
   { STRING_COMMA_LEN (".mwaitx"), PROCESSOR_UNKNOWN,
-    CPU_MWAITX_FLAGS, 0, 0 },
+    CPU_MWAITX_FLAGS, 0 },
   { STRING_COMMA_LEN (".ospke"), PROCESSOR_UNKNOWN,
-    CPU_OSPKE_FLAGS, 0, 0 },
+    CPU_OSPKE_FLAGS, 0 },
   { STRING_COMMA_LEN (".rdpid"), PROCESSOR_UNKNOWN,
-    CPU_RDPID_FLAGS, 0, 0 },
+    CPU_RDPID_FLAGS, 0 },
+};
+
+static const noarch_entry cpu_noarch[] =
+{
+  { STRING_COMMA_LEN ("no87"),  CPU_ANY_X87_FLAGS },
+  { STRING_COMMA_LEN ("nommx"),  CPU_ANY_MMX_FLAGS },
+  { STRING_COMMA_LEN ("nosse"),  CPU_ANY_SSE_FLAGS },
+  { STRING_COMMA_LEN ("noavx"),  CPU_ANY_AVX_FLAGS },
 };
 
 #ifdef I386COFF
@@ -2370,12 +2378,8 @@ set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
 		  break;
 		}
 
-	      if (!cpu_arch[j].negated)
-		flags = cpu_flags_or (cpu_arch_flags,
-				      cpu_arch[j].flags);
-	      else
-		flags = cpu_flags_and_not (cpu_arch_flags,
-					   cpu_arch[j].flags);
+	      flags = cpu_flags_or (cpu_arch_flags,
+				    cpu_arch[j].flags);
 
 	      if (!valid_iamcu_cpu_flags (&flags))
 		as_fatal (_("`%s' isn't valid for Intel MCU"),
@@ -2400,6 +2404,37 @@ set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
 	      return;
 	    }
 	}
+
+      if (*string == '.' && j >= ARRAY_SIZE (cpu_arch))
+	{
+	  /* Disable an ISA entension.  */
+	  for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
+	    if (strcmp (string + 1, cpu_noarch [j].name) == 0)
+	      {
+		flags = cpu_flags_and_not (cpu_arch_flags,
+					   cpu_noarch[j].flags);
+		if (!cpu_flags_equal (&flags, &cpu_arch_flags))
+		  {
+		    if (cpu_sub_arch_name)
+		      {
+			char *name = cpu_sub_arch_name;
+			cpu_sub_arch_name = concat (name, string,
+						    (const char *) NULL);
+			free (name);
+		      }
+		    else
+		      cpu_sub_arch_name = xstrdup (string);
+		    cpu_arch_flags = flags;
+		    cpu_arch_isa_flags = flags;
+		  }
+		(void) restore_line_pointer (e);
+		demand_empty_rest_of_line ();
+		return;
+	      }
+
+	  j = ARRAY_SIZE (cpu_arch);
+	}
+
       if (j >= ARRAY_SIZE (cpu_arch))
 	as_bad (_("no such architecture: `%s'"), string);
 
@@ -9700,7 +9735,7 @@ int
 md_parse_option (int c, const char *arg)
 {
   unsigned int j;
-  char *arch, *next;
+  char *arch, *next, *saved;
 
   switch (c)
     {
@@ -9804,7 +9839,11 @@ md_parse_option (int c, const char *arg)
       break;
 
     case OPTION_MARCH:
-      arch = xstrdup (arg);
+      saved = xstrdup (arg);
+      arch = saved;
+      /* Allow -march=+nosse.  */
+      if (*arch == '+')
+	arch++;
       do
 	{
 	  if (*arch == '.')
@@ -9838,12 +9877,8 @@ md_parse_option (int c, const char *arg)
 		  /* ISA entension.  */
 		  i386_cpu_flags flags;
 
-		  if (!cpu_arch[j].negated)
-		    flags = cpu_flags_or (cpu_arch_flags,
-					  cpu_arch[j].flags);
-		  else
-		    flags = cpu_flags_and_not (cpu_arch_flags,
-					       cpu_arch[j].flags);
+		  flags = cpu_flags_or (cpu_arch_flags,
+					cpu_arch[j].flags);
 
 		  if (!valid_iamcu_cpu_flags (&flags))
 		    as_fatal (_("`%s' isn't valid for Intel MCU"), arch);
@@ -9867,11 +9902,43 @@ md_parse_option (int c, const char *arg)
 	    }
 
 	  if (j >= ARRAY_SIZE (cpu_arch))
+	    {
+	      /* Disable an ISA entension.  */
+	      for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
+		if (strcmp (arch, cpu_noarch [j].name) == 0)
+		  {
+		    i386_cpu_flags flags;
+
+		    flags = cpu_flags_and_not (cpu_arch_flags,
+					       cpu_noarch[j].flags);
+		    if (!cpu_flags_equal (&flags, &cpu_arch_flags))
+		      {
+			if (cpu_sub_arch_name)
+			  {
+			    char *name = cpu_sub_arch_name;
+			    cpu_sub_arch_name = concat (arch,
+							(const char *) NULL);
+			    free (name);
+			  }
+			else
+			  cpu_sub_arch_name = xstrdup (arch);
+			cpu_arch_flags = flags;
+			cpu_arch_isa_flags = flags;
+		      }
+		    break;
+		  }
+
+	      if (j >= ARRAY_SIZE (cpu_noarch))
+		j = ARRAY_SIZE (cpu_arch);
+	    }
+
+	  if (j >= ARRAY_SIZE (cpu_arch))
 	    as_fatal (_("invalid -march= option: `%s'"), arg);
 
 	  arch = next;
 	}
-      while (next != NULL );
+      while (next != NULL);
+      free (saved);
       break;
 
     case OPTION_MTUNE:
@@ -10049,6 +10116,44 @@ md_parse_option (int c, const char *arg)
 #define MESSAGE_TEMPLATE \
 "                                                                                "
 
+static char *
+output_message (FILE *stream, char *p, char *message, char *start,
+		int *left_p, const char *name, int len)
+{
+  int size = sizeof (MESSAGE_TEMPLATE);
+  int left = *left_p;
+
+  /* Reserve 2 spaces for ", " or ",\0" */
+  left -= len + 2;
+
+  /* Check if there is any room.  */
+  if (left >= 0)
+    {
+      if (p != start)
+	{
+	  *p++ = ',';
+	  *p++ = ' ';
+	}
+      p = mempcpy (p, name, len);
+    }
+  else
+    {
+      /* Output the current message now and start a new one.  */
+      *p++ = ',';
+      *p = '\0';
+      fprintf (stream, "%s\n", message);
+      p = start;
+      left = size - (start - message) - len - 2;
+
+      gas_assert (left >= 0);
+
+      p = mempcpy (p, name, len);
+    }
+
+  *left_p = left;
+  return p;
+}
+
 static void
 show_arch (FILE *stream, int ext, int check)
 {
@@ -10093,34 +10198,19 @@ show_arch (FILE *stream, int ext, int check)
 	  continue;
 	}
 
-      /* Reserve 2 spaces for ", " or ",\0" */
-      left -= len + 2;
-
-      /* Check if there is any room.  */
-      if (left >= 0)
-	{
-	  if (p != start)
-	    {
-	      *p++ = ',';
-	      *p++ = ' ';
-	    }
-	  p = mempcpy (p, name, len);
-	}
-      else
-	{
-	  /* Output the current message now and start a new one.  */
-	  *p++ = ',';
-	  *p = '\0';
-	  fprintf (stream, "%s\n", message);
-	  p = start;
-	  left = size - (start - message) - len - 2;
-
-	  gas_assert (left >= 0);
-
-	  p = mempcpy (p, name, len);
-	}
+      p = output_message (stream, p, message, start, &left, name, len);
     }
 
+  /* Display disabled extensions.  */
+  if (ext)
+    for (j = 0; j < ARRAY_SIZE (cpu_noarch); j++)
+      {
+	name = cpu_noarch [j].name;
+	len = cpu_noarch [j].len;
+	p = output_message (stream, p, message, start, &left, name,
+			    len);
+      }
+
   *p = '\0';
   fprintf (stream, "%s\n", message);
 }
diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp
index a18200e..716ec43 100644
--- a/gas/testsuite/gas/i386/i386.exp
+++ b/gas/testsuite/gas/i386/i386.exp
@@ -165,6 +165,14 @@ if [expr ([istarget "i*86-*-*"] ||  [istarget "x86_64-*-*"]) && [gas_32_check]]
     run_dump_test "387"
     run_list_test "no87" "-al"
     run_list_test "no87-2" "-march=i686+no87 -al"
+    run_list_test "nommx-1" "-al"
+    run_list_test "nommx-2" "-march=core+nommx -al"
+    run_list_test "nommx-3" "-march=+nommx -al"
+    run_list_test "nosse-1" "-al"
+    run_list_test "nosse-2" "-march=core+nosse -al"
+    run_list_test "nosse-3" "-march=+nosse -al"
+    run_list_test "noavx-1" "-al"
+    run_list_test "noavx-2" "-march=+noavx -al"
     run_dump_test "xsave"
     run_dump_test "xsave-intel"
     run_dump_test "aes"
diff --git a/gas/testsuite/gas/i386/noavx-1.l b/gas/testsuite/gas/i386/noavx-1.l
new file mode 100644
index 0000000..f4e2840
--- /dev/null
+++ b/gas/testsuite/gas/i386/noavx-1.l
@@ -0,0 +1,13 @@
+.*: Assembler messages:
+.*:4: Error: .*generic.*
+.*:8: Error: .*noavx.*
+GAS LISTING .*
+#...
+[ 	]*1[ 	]+\# Test \.arch \.noavx
+[ 	]*2[ 	]+\.text
+[ 	]*3[ 	]+\.arch generic32
+[ 	]*4[ 	]+vzeroupper
+[ 	]*5[ 	]+\.arch \.avx
+[ 	]*6[ 	]+\?\?\?\? C5F877   		vzeroupper
+[ 	]*7[ 	]+\.arch \.noavx
+[ 	]*8[ 	]+vzeroupper
diff --git a/gas/testsuite/gas/i386/noavx-1.s b/gas/testsuite/gas/i386/noavx-1.s
new file mode 100644
index 0000000..759b429
--- /dev/null
+++ b/gas/testsuite/gas/i386/noavx-1.s
@@ -0,0 +1,8 @@
+# Test .arch .noavx
+	.text
+	.arch generic32
+	vzeroupper
+	.arch .avx
+	vzeroupper
+	.arch .noavx
+	vzeroupper
diff --git a/gas/testsuite/gas/i386/noavx-2.l b/gas/testsuite/gas/i386/noavx-2.l
new file mode 100644
index 0000000..32cc140
--- /dev/null
+++ b/gas/testsuite/gas/i386/noavx-2.l
@@ -0,0 +1,7 @@
+.*: Assembler messages:
+.*:3: Error: .*noavx.*
+GAS LISTING .*
+#...
+[ 	]*1[ 	]+\# Test -march=\+noavx
+[ 	]*2[ 	]+\.text
+[ 	]*3[ 	]+vzeroupper
diff --git a/gas/testsuite/gas/i386/noavx-2.s b/gas/testsuite/gas/i386/noavx-2.s
new file mode 100644
index 0000000..82ffa3e
--- /dev/null
+++ b/gas/testsuite/gas/i386/noavx-2.s
@@ -0,0 +1,3 @@
+# Test -march=+noavx
+	.text
+	vzeroupper
diff --git a/gas/testsuite/gas/i386/nommx-1.l b/gas/testsuite/gas/i386/nommx-1.l
new file mode 100644
index 0000000..2b7a6ca
--- /dev/null
+++ b/gas/testsuite/gas/i386/nommx-1.l
@@ -0,0 +1,21 @@
+.*: Assembler messages:
+.*:4: Error: .*generic.*
+.*:7: Error: .*mmx.*
+.*:10: Error: .*3dnow.*
+.*:14: Error: .*nommx.*
+GAS LISTING .*
+#...
+[ 	]*1[ 	]+\# Test \.arch \.nommx
+[ 	]*2[ 	]+\.text
+[ 	]*3[ 	]+\.arch generic32
+[ 	]*4[ 	]+emms
+[ 	]*5[ 	]+\.arch \.mmx
+[ 	]*6[ 	]+\?\?\?\? 0F7EC0   		movd	%mm0, %eax
+[ 	]*7[ 	]+femms
+[ 	]*8[ 	]+\.arch \.3dnow
+[ 	]*9[ 	]+\?\?\?\? 0F0E     		femms
+[ 	]*10[ 	]+pswapd	%mm1,%mm0
+[ 	]*11[ 	]+\.arch \.3dnowa
+[ 	]*12[ 	]+\?\?\?\? 0F0FC1BB 		pswapd	%mm1,%mm0
+[ 	]*13[ 	]+\.arch \.nommx
+[ 	]*14[ 	]+emms
diff --git a/gas/testsuite/gas/i386/nommx-1.s b/gas/testsuite/gas/i386/nommx-1.s
new file mode 100644
index 0000000..f87edda
--- /dev/null
+++ b/gas/testsuite/gas/i386/nommx-1.s
@@ -0,0 +1,14 @@
+# Test .arch .nommx
+	.text
+	.arch generic32
+	emms
+	.arch .mmx
+	movd	%mm0, %eax
+	femms
+	.arch .3dnow
+	femms
+	pswapd	%mm1,%mm0
+	.arch .3dnowa
+	pswapd	%mm1,%mm0
+	.arch .nommx
+	emms
diff --git a/gas/testsuite/gas/i386/nommx-2.l b/gas/testsuite/gas/i386/nommx-2.l
new file mode 100644
index 0000000..a94b0a8
--- /dev/null
+++ b/gas/testsuite/gas/i386/nommx-2.l
@@ -0,0 +1,7 @@
+.*: Assembler messages:
+.*:3: Error: .*nommx.*
+GAS LISTING .*
+#...
+[ 	]*1[ 	]+\# Test -march=\.\.\.\+nommx
+[ 	]*2[ 	]+\.text
+[ 	]*3[ 	]+emms
diff --git a/gas/testsuite/gas/i386/nommx-2.s b/gas/testsuite/gas/i386/nommx-2.s
new file mode 100644
index 0000000..266ab8d
--- /dev/null
+++ b/gas/testsuite/gas/i386/nommx-2.s
@@ -0,0 +1,3 @@
+# Test -march=...+nommx
+	.text
+	emms
diff --git a/gas/testsuite/gas/i386/nommx-3.l b/gas/testsuite/gas/i386/nommx-3.l
new file mode 100644
index 0000000..0d2e1f1
--- /dev/null
+++ b/gas/testsuite/gas/i386/nommx-3.l
@@ -0,0 +1,7 @@
+.*: Assembler messages:
+.*:3: Error: .*nommx.*
+GAS LISTING .*
+#...
+[ 	]*1[ 	]+\# Test -march=\+nommx
+[ 	]*2[ 	]+\.text
+[ 	]*3[ 	]+emms
diff --git a/gas/testsuite/gas/i386/nommx-3.s b/gas/testsuite/gas/i386/nommx-3.s
new file mode 100644
index 0000000..4641c1d
--- /dev/null
+++ b/gas/testsuite/gas/i386/nommx-3.s
@@ -0,0 +1,3 @@
+# Test -march=+nommx
+	.text
+	emms
diff --git a/gas/testsuite/gas/i386/nosse-1.l b/gas/testsuite/gas/i386/nosse-1.l
new file mode 100644
index 0000000..486241b
--- /dev/null
+++ b/gas/testsuite/gas/i386/nosse-1.l
@@ -0,0 +1,13 @@
+.*: Assembler messages:
+.*:4: Error: .*generic.*
+.*:8: Error: .*nosse.*
+GAS LISTING .*
+#...
+[ 	]*1[ 	]+\# Test \.arch \.nosse
+[ 	]*2[ 	]+\.text
+[ 	]*3[ 	]+\.arch generic32
+[ 	]*4[ 	]+lfence
+[ 	]*5[ 	]+\.arch \.sse2
+[ 	]*6[ 	]+\?\?\?\? 0FAEE8   		lfence
+[ 	]*7[ 	]+\.arch \.nosse
+[ 	]*8[ 	]+lfence
diff --git a/gas/testsuite/gas/i386/nosse-1.s b/gas/testsuite/gas/i386/nosse-1.s
new file mode 100644
index 0000000..27f2528
--- /dev/null
+++ b/gas/testsuite/gas/i386/nosse-1.s
@@ -0,0 +1,8 @@
+# Test .arch .nosse
+	.text
+	.arch generic32
+	lfence
+	.arch .sse2
+	lfence
+	.arch .nosse
+	lfence
diff --git a/gas/testsuite/gas/i386/nosse-2.l b/gas/testsuite/gas/i386/nosse-2.l
new file mode 100644
index 0000000..45652b5
--- /dev/null
+++ b/gas/testsuite/gas/i386/nosse-2.l
@@ -0,0 +1,7 @@
+.*: Assembler messages:
+.*:3: Error: .*nosse.*
+GAS LISTING .*
+#...
+[ 	]*1[ 	]+\# Test -march=\.\.\.\+nosse
+[ 	]*2[ 	]+\.text
+[ 	]*3[ 	]+lfence
diff --git a/gas/testsuite/gas/i386/nosse-2.s b/gas/testsuite/gas/i386/nosse-2.s
new file mode 100644
index 0000000..bceb0c4
--- /dev/null
+++ b/gas/testsuite/gas/i386/nosse-2.s
@@ -0,0 +1,3 @@
+# Test -march=...+nosse
+	.text
+	lfence
diff --git a/gas/testsuite/gas/i386/nosse-3.l b/gas/testsuite/gas/i386/nosse-3.l
new file mode 100644
index 0000000..6626928
--- /dev/null
+++ b/gas/testsuite/gas/i386/nosse-3.l
@@ -0,0 +1,7 @@
+.*: Assembler messages:
+.*:3: Error: .*nosse.*
+GAS LISTING .*
+#...
+[ 	]*1[ 	]+\# Test -march=\+nosse
+[ 	]*2[ 	]+\.text
+[ 	]*3[ 	]+lfence
diff --git a/gas/testsuite/gas/i386/nosse-3.s b/gas/testsuite/gas/i386/nosse-3.s
new file mode 100644
index 0000000..b2ba5f7
--- /dev/null
+++ b/gas/testsuite/gas/i386/nosse-3.s
@@ -0,0 +1,3 @@
+# Test -march=+nosse
+	.text
+	lfence
diff --git a/opcodes/i386-gen.c b/opcodes/i386-gen.c
index 5b997f9..542ec6a 100644
--- a/opcodes/i386-gen.c
+++ b/opcodes/i386-gen.c
@@ -107,7 +107,7 @@ static initializer cpu_flag_init[] =
     "Cpu287" },
   { "CPU_387_FLAGS",
     "Cpu387" },
-  { "CPU_ANY87_FLAGS",
+  { "CPU_ANY_X87_FLAGS",
     "Cpu8087|Cpu287|Cpu387|Cpu687|CpuFISTTP" },
   { "CPU_CLFLUSH_FLAGS",
     "CpuClflush" },
@@ -185,6 +185,8 @@ static initializer cpu_flag_init[] =
     "CpuMMX|Cpu3dnow" },
   { "CPU_3DNOWA_FLAGS",
     "CpuMMX|Cpu3dnow|Cpu3dnowA" },
+  { "CPU_ANY_MMX_FLAGS",
+    "CpuMMX|Cpu3dnow|Cpu3dnowA" },
   { "CPU_PADLOCK_FLAGS",
     "CpuPadLock" },
   { "CPU_SVME_FLAGS",
diff --git a/opcodes/i386-init.h b/opcodes/i386-init.h
index de68c22..f553d43 100644
--- a/opcodes/i386-init.h
+++ b/opcodes/i386-init.h
@@ -249,7 +249,7 @@
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
 
-#define CPU_ANY87_FLAGS \
+#define CPU_ANY_X87_FLAGS \
   { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, \
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
@@ -522,6 +522,13 @@
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
 
+#define CPU_ANY_MMX_FLAGS \
+  { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
+
 #define CPU_PADLOCK_FLAGS \
   { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
       1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
-- 
2.5.5


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH] Allow setting CpuVRex bit in .arch directive
  2016-05-24 20:36           ` H.J. Lu
  2016-05-25 16:35             ` H.J. Lu
@ 2016-05-25 17:54             ` H.J. Lu
  2016-05-25 17:58               ` Jakub Jelinek
  1 sibling, 1 reply; 18+ messages in thread
From: H.J. Lu @ 2016-05-25 17:54 UTC (permalink / raw)
  To: Jakub Jelinek; +Cc: Binutils, Uros Bizjak, Kirill Yukhin

[-- Attachment #1: Type: text/plain, Size: 313 bytes --]

On Tue, May 24, 2016 at 1:36 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
>
>> Anyway, still it would be good to be able to change (both set and remove)
>> the CpuVRex bit.
>>
>
> CpuVRex should be cleared/set automatically based on ISA.
>

I am checking in this patch to enable VREX for AVX512 directives.

-- 
H.J.

[-- Attachment #2: 0001-Enable-VREX-for-AVX512-directives.patch --]
[-- Type: text/x-patch, Size: 6691 bytes --]

From f1360d5830fc7695cd26214257c62f34b73070c8 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Wed, 25 May 2016 10:49:25 -0700
Subject: [PATCH] Enable VREX for AVX512 directives

Enable VREX for AVX512 instructions with upper 16 vector registers.

gas/

	PR gas/20141
	* testsuite/gas/i386/i386.exp: Run x86-64-pr20141.
	* testsuite/gas/i386/x86-64-pr20141.d: New file.
	* testsuite/gas/i386/x86-64-pr20141.s: Likewise.

opcodes/

	PR gas/20141
	* i386-gen.c (cpu_flag_init): Add CpuVREX to CPU_AVX512F_FLAGS,
	CPU_AVX512CD_FLAGS, CPU_AVX512ER_FLAGS and CPU_AVX512PF_FLAGS.
	* i386-init.h: Regenerated.
---
 gas/ChangeLog                           |  7 +++++++
 gas/testsuite/gas/i386/i386.exp         |  1 +
 gas/testsuite/gas/i386/x86-64-pr20141.d | 10 ++++++++++
 gas/testsuite/gas/i386/x86-64-pr20141.s |  5 +++++
 opcodes/ChangeLog                       |  7 +++++++
 opcodes/i386-gen.c                      |  8 ++++----
 opcodes/i386-init.h                     |  8 ++++----
 7 files changed, 38 insertions(+), 8 deletions(-)
 create mode 100644 gas/testsuite/gas/i386/x86-64-pr20141.d
 create mode 100644 gas/testsuite/gas/i386/x86-64-pr20141.s

diff --git a/gas/ChangeLog b/gas/ChangeLog
index 54afd16..2d23b43 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,5 +1,12 @@
 2016-05-25  H.J. Lu  <hongjiu.lu@intel.com>
 
+	PR gas/20141
+	* testsuite/gas/i386/i386.exp: Run x86-64-pr20141.
+	* testsuite/gas/i386/x86-64-pr20141.d: New file.
+	* testsuite/gas/i386/x86-64-pr20141.s: Likewise.
+
+2016-05-25  H.J. Lu  <hongjiu.lu@intel.com>
+
 	* config/tc-i386.c (arch_entry): Remove negated.
 	(noarch_entry): New struct.
 	(cpu_arch): Updated.  Remove .no87, .nommx, .nosse and .noavx.
diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp
index 716ec43..1aca467 100644
--- a/gas/testsuite/gas/i386/i386.exp
+++ b/gas/testsuite/gas/i386/i386.exp
@@ -753,6 +753,7 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_64_check]] t
     run_dump_test "x86-64-rdpid-intel"
     run_dump_test "x86-64-fence-as-lock-add-yes"
     run_dump_test "x86-64-fence-as-lock-add-no"
+    run_dump_test "x86-64-pr20141"
 
     if { ![istarget "*-*-aix*"]
       && ![istarget "*-*-beos*"]
diff --git a/gas/testsuite/gas/i386/x86-64-pr20141.d b/gas/testsuite/gas/i386/x86-64-pr20141.d
new file mode 100644
index 0000000..a8012b2
--- /dev/null
+++ b/gas/testsuite/gas/i386/x86-64-pr20141.d
@@ -0,0 +1,10 @@
+#objdump: -dw
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+0+ <_start>:
+[ 	]*[a-f0-9]+:	62 e1 7d 48 e7 21    	vmovntdq %zmm20,\(%rcx\)
+#pass
diff --git a/gas/testsuite/gas/i386/x86-64-pr20141.s b/gas/testsuite/gas/i386/x86-64-pr20141.s
new file mode 100644
index 0000000..f8fa3df
--- /dev/null
+++ b/gas/testsuite/gas/i386/x86-64-pr20141.s
@@ -0,0 +1,5 @@
+	.text
+	.arch corei7
+	.arch .avx512f
+_start:
+	vmovntdq	%zmm20, (%rcx)
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index f13f299..819c8ee 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -1,5 +1,12 @@
 2016-05-25  H.J. Lu  <hongjiu.lu@intel.com>
 
+	PR gas/20141
+	* i386-gen.c (cpu_flag_init): Add CpuVREX to CPU_AVX512F_FLAGS,
+	CPU_AVX512CD_FLAGS, CPU_AVX512ER_FLAGS and CPU_AVX512PF_FLAGS.
+	* i386-init.h: Regenerated.
+
+2016-05-25  H.J. Lu  <hongjiu.lu@intel.com>
+
 	* i386-gen.c (cpu_flag_init): Rename CPU_ANY87_FLAGS to
 	CPU_ANY_X87_FLAGS.  Add CPU_ANY_MMX_FLAGS.
 	* i386-init.h: Regenerated.
diff --git a/opcodes/i386-gen.c b/opcodes/i386-gen.c
index 542ec6a..7a090e2 100644
--- a/opcodes/i386-gen.c
+++ b/opcodes/i386-gen.c
@@ -200,13 +200,13 @@ static initializer cpu_flag_init[] =
   { "CPU_AVX2_FLAGS",
     "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2" },
   { "CPU_AVX512F_FLAGS",
-    "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F" },
+    "CpuVREX|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F" },
   { "CPU_AVX512CD_FLAGS",
-    "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512CD" },
+    "CpuVREX|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512CD" },
   { "CPU_AVX512ER_FLAGS",
-    "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512ER" },
+    "CpuVREX|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512ER" },
   { "CPU_AVX512PF_FLAGS",
-    "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512PF" },
+    "CpuVREX|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512PF" },
   { "CPU_ANY_AVX_FLAGS",
     "CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512CD|CpuAVX512ER|CpuAVX512PF" },
   { "CPU_L1OM_FLAGS",
diff --git a/opcodes/i386-init.h b/opcodes/i386-init.h
index f553d43..b023f98 100644
--- a/opcodes/i386-init.h
+++ b/opcodes/i386-init.h
@@ -575,28 +575,28 @@
   { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, \
       0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, \
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
-      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, \
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
 
 #define CPU_AVX512CD_FLAGS \
   { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, \
       0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, \
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
-      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, \
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
 
 #define CPU_AVX512ER_FLAGS \
   { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, \
       0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, \
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
-      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, \
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
 
 #define CPU_AVX512PF_FLAGS \
   { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, \
       0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, \
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
-      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, \
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
 
 #define CPU_ANY_AVX_FLAGS \
-- 
2.5.5


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH] Allow setting CpuVRex bit in .arch directive
  2016-05-25 17:54             ` H.J. Lu
@ 2016-05-25 17:58               ` Jakub Jelinek
  2016-05-25 18:26                 ` H.J. Lu
  0 siblings, 1 reply; 18+ messages in thread
From: Jakub Jelinek @ 2016-05-25 17:58 UTC (permalink / raw)
  To: H.J. Lu; +Cc: Binutils, Uros Bizjak, Kirill Yukhin

On Wed, May 25, 2016 at 10:53:51AM -0700, H.J. Lu wrote:
> I am checking in this patch to enable VREX for AVX512 directives.
> --- a/opcodes/i386-gen.c
> +++ b/opcodes/i386-gen.c
> @@ -200,13 +200,13 @@ static initializer cpu_flag_init[] =
>    { "CPU_AVX2_FLAGS",
>      "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2" },
>    { "CPU_AVX512F_FLAGS",
> -    "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F" },
> +    "CpuVREX|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F" },
>    { "CPU_AVX512CD_FLAGS",
> -    "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512CD" },
> +    "CpuVREX|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512CD" },
>    { "CPU_AVX512ER_FLAGS",
> -    "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512ER" },
> +    "CpuVREX|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512ER" },
>    { "CPU_AVX512PF_FLAGS",
> -    "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512PF" },
> +    "CpuVREX|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512PF" },
>    { "CPU_ANY_AVX_FLAGS",
>      "CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512CD|CpuAVX512ER|CpuAVX512PF" },
>    { "CPU_L1OM_FLAGS",

What about CPU_AVX512{DQ,BW,VL,IFMA,VBMI}_FLAGS ?

	Jakub

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH] Allow setting CpuVRex bit in .arch directive
  2016-05-25 17:58               ` Jakub Jelinek
@ 2016-05-25 18:26                 ` H.J. Lu
  2016-05-25 18:39                   ` Jakub Jelinek
  0 siblings, 1 reply; 18+ messages in thread
From: H.J. Lu @ 2016-05-25 18:26 UTC (permalink / raw)
  To: Jakub Jelinek; +Cc: Binutils, Uros Bizjak, Kirill Yukhin

[-- Attachment #1: Type: text/plain, Size: 1685 bytes --]

On Wed, May 25, 2016 at 10:58 AM, Jakub Jelinek <jakub@redhat.com> wrote:
> On Wed, May 25, 2016 at 10:53:51AM -0700, H.J. Lu wrote:
>> I am checking in this patch to enable VREX for AVX512 directives.
>> --- a/opcodes/i386-gen.c
>> +++ b/opcodes/i386-gen.c
>> @@ -200,13 +200,13 @@ static initializer cpu_flag_init[] =
>>    { "CPU_AVX2_FLAGS",
>>      "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2" },
>>    { "CPU_AVX512F_FLAGS",
>> -    "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F" },
>> +    "CpuVREX|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F" },
>>    { "CPU_AVX512CD_FLAGS",
>> -    "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512CD" },
>> +    "CpuVREX|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512CD" },
>>    { "CPU_AVX512ER_FLAGS",
>> -    "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512ER" },
>> +    "CpuVREX|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512ER" },
>>    { "CPU_AVX512PF_FLAGS",
>> -    "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512PF" },
>> +    "CpuVREX|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512PF" },
>>    { "CPU_ANY_AVX_FLAGS",
>>      "CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512CD|CpuAVX512ER|CpuAVX512PF" },
>>    { "CPU_L1OM_FLAGS",
>
> What about CPU_AVX512{DQ,BW,VL,IFMA,VBMI}_FLAGS ?
>
>         Jakub

I checked in this fix.

Thanks.

-- 
H.J.

[-- Attachment #2: 0001-Enable-VREX-for-all-AVX512-directives.patch --]
[-- Type: text/x-patch, Size: 8886 bytes --]

From f3ad76370f8c79e4ae74ca6826e23bf417d5283a Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Wed, 25 May 2016 11:23:40 -0700
Subject: [PATCH] Enable VREX for all AVX512 directives

Add all AVX512 bits to CPU_ANY_AVX_FLAGS.

	* i386-gen.c (cpu_flag_init): Add CpuVREX to CPU_AVX512DQ_FLAGS,
	CPU_AVX512BW_FLAGS, CPU_AVX512VL_FLAGS, CPU_AVX512IFMA_FLAGS
	and CPU_AVX512VBMI_FLAGS.  Add CpuAVX512DQ, CpuAVX512BW,
	CpuAVX512VL, CpuAVX512IFMA and CpuAVX512VBMI to
	CPU_ANY_AVX_FLAGS.
	* i386-init.h: Regenerated.
---
 opcodes/ChangeLog   |  9 +++++++
 opcodes/i386-gen.c  | 22 ++++++++--------
 opcodes/i386-init.h | 76 ++++++++++++++++++++++++++---------------------------
 3 files changed, 58 insertions(+), 49 deletions(-)

diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index 819c8ee..accee8e 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -1,5 +1,14 @@
 2016-05-25  H.J. Lu  <hongjiu.lu@intel.com>
 
+	* i386-gen.c (cpu_flag_init): Add CpuVREX to CPU_AVX512DQ_FLAGS,
+	CPU_AVX512BW_FLAGS, CPU_AVX512VL_FLAGS, CPU_AVX512IFMA_FLAGS
+	and CPU_AVX512VBMI_FLAGS.  Add CpuAVX512DQ, CpuAVX512BW,
+	CpuAVX512VL, CpuAVX512IFMA and CpuAVX512VBMI to
+	CPU_ANY_AVX_FLAGS.
+	* i386-init.h: Regenerated.
+
+2016-05-25  H.J. Lu  <hongjiu.lu@intel.com>
+
 	PR gas/20141
 	* i386-gen.c (cpu_flag_init): Add CpuVREX to CPU_AVX512F_FLAGS,
 	CPU_AVX512CD_FLAGS, CPU_AVX512ER_FLAGS and CPU_AVX512PF_FLAGS.
diff --git a/opcodes/i386-gen.c b/opcodes/i386-gen.c
index 7a090e2..b19bbe1 100644
--- a/opcodes/i386-gen.c
+++ b/opcodes/i386-gen.c
@@ -207,8 +207,18 @@ static initializer cpu_flag_init[] =
     "CpuVREX|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512ER" },
   { "CPU_AVX512PF_FLAGS",
     "CpuVREX|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512PF" },
+  { "CPU_AVX512DQ_FLAGS",
+    "CpuVREX|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512DQ" },
+  { "CPU_AVX512BW_FLAGS",
+    "CpuVREX|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512BW" },
+  { "CPU_AVX512VL_FLAGS",
+    "CpuVREX|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512VL" },
+  { "CPU_AVX512IFMA_FLAGS",
+    "CpuVREX|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512IFMA" },
+  { "CPU_AVX512VBMI_FLAGS",
+    "CpuVREX|CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512VBMI" },
   { "CPU_ANY_AVX_FLAGS",
-    "CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512CD|CpuAVX512ER|CpuAVX512PF" },
+    "CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512CD|CpuAVX512ER|CpuAVX512PF|CpuAVX512DQ|CpuAVX512BW|CpuAVX512VL|CpuAVX512IFMA|CpuAVX512VBMI" },
   { "CPU_L1OM_FLAGS",
     "unknown" },
   { "CPU_K1OM_FLAGS",
@@ -239,20 +249,10 @@ static initializer cpu_flag_init[] =
     "CpuPREFETCHWT1" },
   { "CPU_SE1_FLAGS",
     "CpuSE1" },
-  { "CPU_AVX512DQ_FLAGS",
-    "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512DQ" },
-  { "CPU_AVX512BW_FLAGS",
-    "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512BW" },
-  { "CPU_AVX512VL_FLAGS",
-    "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512VL" },
   { "CPU_CLWB_FLAGS",
     "CpuCLWB" },
   { "CPU_PCOMMIT_FLAGS",
     "CpuPCOMMIT" },
-  { "CPU_AVX512IFMA_FLAGS",
-    "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512IFMA" },
-  { "CPU_AVX512VBMI_FLAGS",
-    "CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512VBMI" },
   { "CPU_CLZERO_FLAGS",
     "CpuCLZERO" },
   { "CPU_MWAITX_FLAGS",
diff --git a/opcodes/i386-init.h b/opcodes/i386-init.h
index b023f98..ee9f7b5 100644
--- a/opcodes/i386-init.h
+++ b/opcodes/i386-init.h
@@ -599,13 +599,48 @@
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, \
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
 
-#define CPU_ANY_AVX_FLAGS \
-  { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
-      0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, \
+#define CPU_AVX512DQ_FLAGS \
+  { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, \
+      0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, \
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
+
+#define CPU_AVX512BW_FLAGS \
+  { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, \
+      0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, \
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
+
+#define CPU_AVX512VL_FLAGS \
+  { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, \
+      0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, \
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
 
+#define CPU_AVX512IFMA_FLAGS \
+  { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, \
+      0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
+
+#define CPU_AVX512VBMI_FLAGS \
+  { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, \
+      0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, \
+      1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
+
+#define CPU_ANY_AVX_FLAGS \
+  { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \
+      1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
+
 #define CPU_L1OM_FLAGS \
   { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
@@ -711,27 +746,6 @@
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, \
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
 
-#define CPU_AVX512DQ_FLAGS \
-  { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, \
-      0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, \
-      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
-      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
-      0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
-
-#define CPU_AVX512BW_FLAGS \
-  { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, \
-      0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, \
-      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
-      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
-      0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
-
-#define CPU_AVX512VL_FLAGS \
-  { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, \
-      0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, \
-      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
-      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
-      0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
-
 #define CPU_CLWB_FLAGS \
   { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
@@ -746,20 +760,6 @@
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
 
-#define CPU_AVX512IFMA_FLAGS \
-  { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, \
-      0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, \
-      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
-      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \
-      0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
-
-#define CPU_AVX512VBMI_FLAGS \
-  { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, \
-      0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, \
-      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
-      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
-      1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
-
 #define CPU_CLZERO_FLAGS \
   { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
-- 
2.5.5


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH] Allow setting CpuVRex bit in .arch directive
  2016-05-25 18:26                 ` H.J. Lu
@ 2016-05-25 18:39                   ` Jakub Jelinek
  2016-05-25 19:12                     ` H.J. Lu
  0 siblings, 1 reply; 18+ messages in thread
From: Jakub Jelinek @ 2016-05-25 18:39 UTC (permalink / raw)
  To: H.J. Lu; +Cc: Binutils, Uros Bizjak, Kirill Yukhin

On Wed, May 25, 2016 at 11:25:48AM -0700, H.J. Lu wrote:
>    { "CPU_ANY_AVX_FLAGS",
> -    "CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512CD|CpuAVX512ER|CpuAVX512PF" },
> +    "CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512CD|CpuAVX512ER|CpuAVX512PF|CpuAVX512DQ|CpuAVX512BW|CpuAVX512VL|CpuAVX512IFMA|CpuAVX512VBMI" },

Shouldn't this also include other flags that imply AVX?
Like CpuFMA|CpuFMA4|CpuXOP ?

Shouldn't CPU_ANY_SSE_FLAGS include also all the new CPU_ANY_AVX_FLAGS?

What about CPU_F16C_FLAGS and CpuF16C?  E.g. in GCC -mf16c implies
-mavx and -mno-avx implies -mno-f16c.  So shouldn't CPU_F16C_FLAGS also
include CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX
and CPU_ANY_AVX_FLAGS include CpuF16C and similarly CPU_ANY_SSE_FLAGS?

	Jakub

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH] Allow setting CpuVRex bit in .arch directive
  2016-05-25 18:39                   ` Jakub Jelinek
@ 2016-05-25 19:12                     ` H.J. Lu
  2016-05-26  0:09                       ` H.J. Lu
  0 siblings, 1 reply; 18+ messages in thread
From: H.J. Lu @ 2016-05-25 19:12 UTC (permalink / raw)
  To: Jakub Jelinek; +Cc: Binutils, Uros Bizjak, Kirill Yukhin

On Wed, May 25, 2016 at 11:38 AM, Jakub Jelinek <jakub@redhat.com> wrote:
> On Wed, May 25, 2016 at 11:25:48AM -0700, H.J. Lu wrote:
>>    { "CPU_ANY_AVX_FLAGS",
>> -    "CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512CD|CpuAVX512ER|CpuAVX512PF" },
>> +    "CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512CD|CpuAVX512ER|CpuAVX512PF|CpuAVX512DQ|CpuAVX512BW|CpuAVX512VL|CpuAVX512IFMA|CpuAVX512VBMI" },
>
> Shouldn't this also include other flags that imply AVX?
> Like CpuFMA|CpuFMA4|CpuXOP ?
>
> Shouldn't CPU_ANY_SSE_FLAGS include also all the new CPU_ANY_AVX_FLAGS?
>
> What about CPU_F16C_FLAGS and CpuF16C?  E.g. in GCC -mf16c implies
> -mavx and -mno-avx implies -mno-f16c.  So shouldn't CPU_F16C_FLAGS also
> include CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX
> and CPU_ANY_AVX_FLAGS include CpuF16C and similarly CPU_ANY_SSE_FLAGS?
>

Let me think about it.


-- 
H.J.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH] Allow setting CpuVRex bit in .arch directive
  2016-05-24 19:02       ` H.J. Lu
  2016-05-24 19:07         ` Jakub Jelinek
@ 2016-05-25 23:22         ` H.J. Lu
  2016-05-26  0:57           ` Alan Modra
  1 sibling, 1 reply; 18+ messages in thread
From: H.J. Lu @ 2016-05-25 23:22 UTC (permalink / raw)
  To: Jakub Jelinek; +Cc: Binutils, Uros Bizjak, Kirill Yukhin

[-- Attachment #1: Type: text/plain, Size: 3000 bytes --]

On Tue, May 24, 2016 at 12:02 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Tue, May 24, 2016 at 10:49 AM, Jakub Jelinek <jakub@redhat.com> wrote:

>>> Since vinsertf64x2 is an CpuAVX512VL instruction, I don't see
>>> why it shouldn't assemble.
>>
>> Is it?  I believe only vinsertf32x4 is, vinsertf64x2 is
>> CpuAVX512VL & CpuAVX512DQ:
>>
>> EVEX.NDS.256.66.0F3A.W0 18 /r ib        T4      V/V     AVX512VL        Insert 128 bits of packed single-precision floating-
>> VINSERTF32X4 ymm1 {k1}{z}, ymm2,                        AVX512F         point values from xmm3/m128 and the remaining
>> xmm3/m128, imm8                                                         values from ymm2 into ymm1 under writemask k1.
>>
>> EVEX.NDS.512.66.0F3A.W0 18 /r ib        T4      V/V     AVX512F         Insert 128 bits of packed single-precision floating-
>> VINSERTF32X4 zmm1 {k1}{z}, zmm2,                                        point values from xmm3/m128 and the remaining
>> xmm3/m128, imm8                                                         values from zmm2 into zmm1 under writemask k1.
>>
>> EVEX.NDS.256.66.0F3A.W1 18 /r ib        T2      V/V     AVX512VL        Insert 128 bits of packed double-precision floating-
>> VINSERTF64X2 ymm1 {k1}{z}, ymm2,                        AVX512DQ        point values from xmm3/m128 and the remaining
>> xmm3/m128, imm8                                                         values from ymm2 into ymm1 under writemask k1.
>>
>> EVEX.NDS.512.66.0F3A.W1 18 /r ib        T2      V/V     AVX512DQ        Insert 128 bits of packed double-precision floating-
>> VINSERTF64X2 zmm1 {k1}{z}, zmm2,                                        point values from xmm3/m128 and the remaining
>> xmm3/m128, imm8                                                         values from zmm2 into zmm1 under writemask k1.
>>
>> vinsertf64x2, 4, 0x6618, None, 1, CpuAVX512DQ|CpuAVX512VL, Modrm|EVex=3|Masking=3|VexOpcode=2|VexVVVV=1|VexW=2|VecESize=1|Disp8MemShift=4|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { Imm8, RegXMM|XMMword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S|Vec_Disp8, RegYMM, RegYMM }
>>
>> At least in 319433-024.pdf I see in 5.1.5:
>>
>> The fourth column holds abbreviated CPUID feature flags (e.g. appropriate
>> bits in CPUID.1:ECX, CPUID.1:EDX for SSE/SSE2/SSE3/SSSE3/SSE4.1/SSE4.2/AVX/F16C support; bits in
>> CPUID.(EAX=07H,ECX=0):BCX for AVX2/AVX512F etc) that indicate processor support for the instruction. If
>> the corresponding flag is ‘0’, the instruction will #UD.
>>
>> Therefore, my understanding is that you need all the mentioned flags enabled
>> or it will #UD.  Does binutils treat CpuAVX512DQ|CpuAVX512VL instead
>> as the insn being enabled in either .arch .avx512vl, or .arch .avx512dq
>> alone, rather than only in .arch .avx512vl; .arch .avx512dq ?
>>
>
> I opened:
>
> https://sourceware.org/bugzilla/show_bug.cgi?id=20140
>

This is what I checked in.


-- 
H.J.

[-- Attachment #2: 0001-Require-another-match-for-AVX512VL.patch --]
[-- Type: text/x-patch, Size: 13324 bytes --]

From 8ab4e8bfc05d8d7d92e62a439d20190ea1814b5c Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Wed, 25 May 2016 14:59:05 -0700
Subject: [PATCH] Require another match for AVX512VL

The AVX512VL bit alone isn't sufficient to select a 128-bit or 256-bit
AVX512 instruction.  We must match another AVX512 bit.

	PR gas/20140
	* config/tc-i386.c (cpu_flags_match): Require another match
	for AVX512VL.
	* testsuite/gas/i386/i386.exp: Run avx512vl-1, avx512vl-2,
	x86-64-avx512vl-1 and x86-64-avx512vl-2.
	* testsuite/gas/i386/avx512vl-1.l: New file.
	* testsuite/gas/i386/avx512vl-1.s: Likewise.
	* testsuite/gas/i386/avx512vl-2.l: Likewise.
	* testsuite/gas/i386/avx512vl-2.s: Likewise.
	* testsuite/gas/i386/x86-64-avx512vl-1.l: Likewise.
	* testsuite/gas/i386/x86-64-avx512vl-1.s: Likewise.
	* testsuite/gas/i386/x86-64-avx512vl-2.l: Likewise.
	* testsuite/gas/i386/x86-64-avx512vl-2.s: Likewise.
---
 gas/ChangeLog                              | 16 ++++++++++++
 gas/config/tc-i386.c                       | 15 ++++++++++++
 gas/testsuite/gas/i386/avx512vl-1.l        | 39 ++++++++++++++++++++++++++++++
 gas/testsuite/gas/i386/avx512vl-1.s        | 24 ++++++++++++++++++
 gas/testsuite/gas/i386/avx512vl-2.l        | 27 +++++++++++++++++++++
 gas/testsuite/gas/i386/avx512vl-2.s        | 15 ++++++++++++
 gas/testsuite/gas/i386/i386.exp            |  4 +++
 gas/testsuite/gas/i386/x86-64-avx512vl-1.l | 39 ++++++++++++++++++++++++++++++
 gas/testsuite/gas/i386/x86-64-avx512vl-1.s | 24 ++++++++++++++++++
 gas/testsuite/gas/i386/x86-64-avx512vl-2.l | 27 +++++++++++++++++++++
 gas/testsuite/gas/i386/x86-64-avx512vl-2.s | 15 ++++++++++++
 11 files changed, 245 insertions(+)
 create mode 100644 gas/testsuite/gas/i386/avx512vl-1.l
 create mode 100644 gas/testsuite/gas/i386/avx512vl-1.s
 create mode 100644 gas/testsuite/gas/i386/avx512vl-2.l
 create mode 100644 gas/testsuite/gas/i386/avx512vl-2.s
 create mode 100644 gas/testsuite/gas/i386/x86-64-avx512vl-1.l
 create mode 100644 gas/testsuite/gas/i386/x86-64-avx512vl-1.s
 create mode 100644 gas/testsuite/gas/i386/x86-64-avx512vl-2.l
 create mode 100644 gas/testsuite/gas/i386/x86-64-avx512vl-2.s

diff --git a/gas/ChangeLog b/gas/ChangeLog
index 2d23b43..da0cdc0 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,5 +1,21 @@
 2016-05-25  H.J. Lu  <hongjiu.lu@intel.com>
 
+	PR gas/20140
+	* config/tc-i386.c (cpu_flags_match): Require another match
+	for AVX512VL.
+	* testsuite/gas/i386/i386.exp: Run avx512vl-1, avx512vl-2,
+	x86-64-avx512vl-1 and x86-64-avx512vl-2.
+	* testsuite/gas/i386/avx512vl-1.l: New file.
+	* testsuite/gas/i386/avx512vl-1.s: Likewise.
+	* testsuite/gas/i386/avx512vl-2.l: Likewise.
+	* testsuite/gas/i386/avx512vl-2.s: Likewise.
+	* testsuite/gas/i386/x86-64-avx512vl-1.l: Likewise.
+	* testsuite/gas/i386/x86-64-avx512vl-1.s: Likewise.
+	* testsuite/gas/i386/x86-64-avx512vl-2.l: Likewise.
+	* testsuite/gas/i386/x86-64-avx512vl-2.s: Likewise.
+
+2016-05-25  H.J. Lu  <hongjiu.lu@intel.com>
+
 	PR gas/20141
 	* testsuite/gas/i386/i386.exp: Run x86-64-pr20141.
 	* testsuite/gas/i386/x86-64-pr20141.d: New file.
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index 13041ea..af94f72 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -1564,6 +1564,21 @@ cpu_flags_match (const insn_template *t)
 	      else
 		match |= CPU_FLAGS_ARCH_MATCH;
 	    }
+	  else if (x.bitfield.cpuavx512vl)
+	    {
+	      /* Match AVX512VL.  */
+	      if (cpu.bitfield.cpuavx512vl)
+		{
+		  /* Need another match.  */
+		  cpu.bitfield.cpuavx512vl = 0;
+		  if (!cpu_flags_all_zero (&cpu))
+		    match |= CPU_FLAGS_32BIT_MATCH;
+		  else
+		    match |= CPU_FLAGS_ARCH_MATCH;
+		}
+	      else
+		match |= CPU_FLAGS_ARCH_MATCH;
+	    }
 	  else
 	    match |= CPU_FLAGS_32BIT_MATCH;
 	}
diff --git a/gas/testsuite/gas/i386/avx512vl-1.l b/gas/testsuite/gas/i386/avx512vl-1.l
new file mode 100644
index 0000000..183c21d
--- /dev/null
+++ b/gas/testsuite/gas/i386/avx512vl-1.l
@@ -0,0 +1,39 @@
+.*: Assembler messages:
+.*:7: Error: .*bad register name.*
+.*:8: Error: .*corei7\.avx.*
+.*:9: Error: .*corei7\.avx.*
+.*:10: Error: .*corei7\.avx.*
+.*:15: Error: .*unsupported.*
+.*:16: Error: .*unsupported.*
+GAS LISTING .*
+#...
+[ 	]*1[ 	]+\.text
+[ 	]*2[ 	]+\.arch corei7
+[ 	]*3[ 	]+_start:
+[ 	]*4[ 	]+\.arch \.avx
+[ 	]*5[ 	]+\?\?\?\? C5F9E711 		vmovntdq	%xmm2, \(%ecx\)
+[ 	]*6[ 	]+\?\?\?\? C5FDE711 		vmovntdq	%ymm2, \(%ecx\)
+[ 	]*7[ 	]+vmovntdq	%zmm2, \(%ecx\)
+[ 	]*8[ 	]+vpternlogq	\$0xab, %xmm6, %xmm2, %xmm0
+[ 	]*9[ 	]+vpternlogq	\$0xab, %ymm6, %ymm2, %ymm0
+[ 	]*10[ 	]+vpternlogq	\$0xab, %zmm6, %zmm2, %zmm0
+[ 	]*11[ 	]+\.arch \.avx512f
+[ 	]*12[ 	]+\?\?\?\? C5F9E701 		vmovntdq	%xmm0, \(%ecx\)
+[ 	]*13[ 	]+\?\?\?\? C5FDE701 		vmovntdq	%ymm0, \(%ecx\)
+[ 	]*14[ 	]+\?\?\?\? 62F17D48 		vmovntdq	%zmm0, \(%ecx\)
+[ 	]*14[ 	]+E701
+[ 	]*15[ 	]+vpternlogq	\$0xab, %xmm6, %xmm2, %xmm0
+[ 	]*16[ 	]+vpternlogq	\$0xab, %ymm6, %ymm2, %ymm0
+[ 	]*17[ 	]+\?\?\?\? 62F3ED48 		vpternlogq	\$0xab, %zmm6, %zmm2, %zmm0
+[ 	]*17[ 	]+25C6AB
+[ 	]*18[ 	]+\.arch \.avx512vl
+[ 	]*19[ 	]+\?\?\?\? C5F9E701 		vmovntdq	%xmm0, \(%ecx\)
+[ 	]*20[ 	]+\?\?\?\? C5FDE701 		vmovntdq	%ymm0, \(%ecx\)
+[ 	]*21[ 	]+\?\?\?\? 62F17D48 		vmovntdq	%zmm0, \(%ecx\)
+[ 	]*21[ 	]+E701
+[ 	]*22[ 	]+\?\?\?\? 62F3ED08 		vpternlogq	\$0xab, %xmm6, %xmm2, %xmm0
+[ 	]*22[ 	]+25C6AB
+[ 	]*23[ 	]+\?\?\?\? 62F3ED28 		vpternlogq	\$0xab, %ymm6, %ymm2, %ymm0
+[ 	]*23[ 	]+25C6AB
+[ 	]*24[ 	]+\?\?\?\? 62F3ED48 		vpternlogq	\$0xab, %zmm6, %zmm2, %zmm0
+[ 	]*24[ 	]+25C6AB
diff --git a/gas/testsuite/gas/i386/avx512vl-1.s b/gas/testsuite/gas/i386/avx512vl-1.s
new file mode 100644
index 0000000..62bae08
--- /dev/null
+++ b/gas/testsuite/gas/i386/avx512vl-1.s
@@ -0,0 +1,24 @@
+	.text
+	.arch corei7
+_start:
+	.arch .avx
+	vmovntdq	%xmm2, (%ecx)
+	vmovntdq	%ymm2, (%ecx)
+	vmovntdq	%zmm2, (%ecx)
+	vpternlogq	$0xab, %xmm6, %xmm2, %xmm0
+	vpternlogq	$0xab, %ymm6, %ymm2, %ymm0
+	vpternlogq	$0xab, %zmm6, %zmm2, %zmm0
+	.arch .avx512f
+	vmovntdq	%xmm0, (%ecx)
+	vmovntdq	%ymm0, (%ecx)
+	vmovntdq	%zmm0, (%ecx)
+	vpternlogq	$0xab, %xmm6, %xmm2, %xmm0
+	vpternlogq	$0xab, %ymm6, %ymm2, %ymm0
+	vpternlogq	$0xab, %zmm6, %zmm2, %zmm0
+	.arch .avx512vl
+	vmovntdq	%xmm0, (%ecx)
+	vmovntdq	%ymm0, (%ecx)
+	vmovntdq	%zmm0, (%ecx)
+	vpternlogq	$0xab, %xmm6, %xmm2, %xmm0
+	vpternlogq	$0xab, %ymm6, %ymm2, %ymm0
+	vpternlogq	$0xab, %zmm6, %zmm2, %zmm0
diff --git a/gas/testsuite/gas/i386/avx512vl-2.l b/gas/testsuite/gas/i386/avx512vl-2.l
new file mode 100644
index 0000000..2f1f7b3
--- /dev/null
+++ b/gas/testsuite/gas/i386/avx512vl-2.l
@@ -0,0 +1,27 @@
+.*: Assembler messages:
+.*:5: Error: .*corei7.*
+.*:6: Error: .*corei7.*
+.*:7: Error: .*corei7.*
+.*:9: Error: .*corei7\.avx\.avx512vl.*
+.*:10: Error: .*corei7\.avx\.avx512vl.*
+.*:11: Error: .*corei7\.avx\.avx512vl.*
+GAS LISTING .*
+#...
+[ 	]*1[ 	]+\.text
+[ 	]*2[ 	]+\.arch corei7
+[ 	]*3[ 	]+_start:
+[ 	]*4[ 	]+\.arch \.avx
+[ 	]*5[ 	]+vpconflictd	%xmm0, %xmm5 
+[ 	]*6[ 	]+vpconflictd	%ymm0, %ymm5 
+[ 	]*7[ 	]+vpconflictd	%ymm0, %zmm5 
+[ 	]*8[ 	]+\.arch \.avx512vl
+[ 	]*9[ 	]+vpconflictd	%xmm0, %xmm5 
+[ 	]*10[ 	]+vpconflictd	%ymm0, %ymm5 
+[ 	]*11[ 	]+vpconflictd	%zmm0, %zmm5 
+[ 	]*12[ 	]+\.arch \.avx512cd
+[ 	]*13[ 	]+\?\?\?\? 62F27D08 		vpconflictd	%xmm0, %xmm5 
+[ 	]*13[ 	]+C4E8
+[ 	]*14[ 	]+\?\?\?\? 62F27D28 		vpconflictd	%ymm0, %ymm5 
+[ 	]*14[ 	]+C4E8
+[ 	]*15[ 	]+\?\?\?\? 62F27D48 		vpconflictd	%zmm0, %zmm5 
+[ 	]*15[ 	]+C4E8
diff --git a/gas/testsuite/gas/i386/avx512vl-2.s b/gas/testsuite/gas/i386/avx512vl-2.s
new file mode 100644
index 0000000..6a24a1f
--- /dev/null
+++ b/gas/testsuite/gas/i386/avx512vl-2.s
@@ -0,0 +1,15 @@
+	.text
+	.arch corei7
+_start:
+	.arch .avx
+	vpconflictd	%xmm0, %xmm5 
+	vpconflictd	%ymm0, %ymm5 
+	vpconflictd	%ymm0, %zmm5 
+	.arch .avx512vl
+	vpconflictd	%xmm0, %xmm5 
+	vpconflictd	%ymm0, %ymm5 
+	vpconflictd	%zmm0, %zmm5 
+	.arch .avx512cd
+	vpconflictd	%xmm0, %xmm5 
+	vpconflictd	%ymm0, %ymm5 
+	vpconflictd	%zmm0, %zmm5 
diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp
index 1aca467..624674d 100644
--- a/gas/testsuite/gas/i386/i386.exp
+++ b/gas/testsuite/gas/i386/i386.exp
@@ -356,6 +356,8 @@ if [expr ([istarget "i*86-*-*"] ||  [istarget "x86_64-*-*"]) && [gas_32_check]]
     run_dump_test "ospke"
     run_dump_test "rdpid"
     run_dump_test "rdpid-intel"
+    run_list_test "avx512vl-1" "-al"
+    run_list_test "avx512vl-2" "-al"
 
     # These tests require support for 8 and 16 bit relocs,
     # so we only run them for ELF and COFF targets.
@@ -754,6 +756,8 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_64_check]] t
     run_dump_test "x86-64-fence-as-lock-add-yes"
     run_dump_test "x86-64-fence-as-lock-add-no"
     run_dump_test "x86-64-pr20141"
+    run_list_test "x86-64-avx512vl-1" "-al"
+    run_list_test "x86-64-avx512vl-2" "-al"
 
     if { ![istarget "*-*-aix*"]
       && ![istarget "*-*-beos*"]
diff --git a/gas/testsuite/gas/i386/x86-64-avx512vl-1.l b/gas/testsuite/gas/i386/x86-64-avx512vl-1.l
new file mode 100644
index 0000000..c5982e7
--- /dev/null
+++ b/gas/testsuite/gas/i386/x86-64-avx512vl-1.l
@@ -0,0 +1,39 @@
+.*: Assembler messages:
+.*:7: Error: .*bad register name.*
+.*:8: Error: .*corei7\.avx.*
+.*:9: Error: .*corei7\.avx.*
+.*:10: Error: .*corei7\.avx.*
+.*:15: Error: .*unsupported.*
+.*:16: Error: .*unsupported.*
+GAS LISTING .*
+#...
+[ 	]*1[ 	]+\.text
+[ 	]*2[ 	]+\.arch corei7
+[ 	]*3[ 	]+_start:
+[ 	]*4[ 	]+\.arch \.avx
+[ 	]*5[ 	]+\?\?\?\? C5F9E711 		vmovntdq	%xmm2, \(%rcx\)
+[ 	]*6[ 	]+\?\?\?\? C5FDE711 		vmovntdq	%ymm2, \(%rcx\)
+[ 	]*7[ 	]+vmovntdq	%zmm2, \(%rcx\)
+[ 	]*8[ 	]+vpternlogq	\$0xab, %xmm16, %xmm2, %xmm0
+[ 	]*9[ 	]+vpternlogq	\$0xab, %ymm16, %ymm2, %ymm0
+[ 	]*10[ 	]+vpternlogq	\$0xab, %zmm16, %zmm2, %zmm0
+[ 	]*11[ 	]+\.arch \.avx512f
+[ 	]*12[ 	]+\?\?\?\? C5F9E701 		vmovntdq	%xmm0, \(%rcx\)
+[ 	]*13[ 	]+\?\?\?\? C5FDE701 		vmovntdq	%ymm0, \(%rcx\)
+[ 	]*14[ 	]+\?\?\?\? 62F17D48 		vmovntdq	%zmm0, \(%rcx\)
+[ 	]*14[ 	]+E701
+[ 	]*15[ 	]+vpternlogq	\$0xab, %xmm16, %xmm2, %xmm0
+[ 	]*16[ 	]+vpternlogq	\$0xab, %ymm16, %ymm2, %ymm0
+[ 	]*17[ 	]+\?\?\?\? 62B3ED48 		vpternlogq	\$0xab, %zmm16, %zmm2, %zmm0
+[ 	]*17[ 	]+25C0AB
+[ 	]*18[ 	]+\.arch \.avx512vl
+[ 	]*19[ 	]+\?\?\?\? C5F9E701 		vmovntdq	%xmm0, \(%rcx\)
+[ 	]*20[ 	]+\?\?\?\? C5FDE701 		vmovntdq	%ymm0, \(%rcx\)
+[ 	]*21[ 	]+\?\?\?\? 62F17D48 		vmovntdq	%zmm0, \(%rcx\)
+[ 	]*21[ 	]+E701
+[ 	]*22[ 	]+\?\?\?\? 62B3ED08 		vpternlogq	\$0xab, %xmm16, %xmm2, %xmm0
+[ 	]*22[ 	]+25C0AB
+[ 	]*23[ 	]+\?\?\?\? 62B3ED28 		vpternlogq	\$0xab, %ymm16, %ymm2, %ymm0
+[ 	]*23[ 	]+25C0AB
+[ 	]*24[ 	]+\?\?\?\? 62B3ED48 		vpternlogq	\$0xab, %zmm16, %zmm2, %zmm0
+[ 	]*24[ 	]+25C0AB
diff --git a/gas/testsuite/gas/i386/x86-64-avx512vl-1.s b/gas/testsuite/gas/i386/x86-64-avx512vl-1.s
new file mode 100644
index 0000000..8a5f2f9
--- /dev/null
+++ b/gas/testsuite/gas/i386/x86-64-avx512vl-1.s
@@ -0,0 +1,24 @@
+	.text
+	.arch corei7
+_start:
+	.arch .avx
+	vmovntdq	%xmm2, (%rcx)
+	vmovntdq	%ymm2, (%rcx)
+	vmovntdq	%zmm2, (%rcx)
+	vpternlogq	$0xab, %xmm16, %xmm2, %xmm0
+	vpternlogq	$0xab, %ymm16, %ymm2, %ymm0
+	vpternlogq	$0xab, %zmm16, %zmm2, %zmm0
+	.arch .avx512f
+	vmovntdq	%xmm0, (%rcx)
+	vmovntdq	%ymm0, (%rcx)
+	vmovntdq	%zmm0, (%rcx)
+	vpternlogq	$0xab, %xmm16, %xmm2, %xmm0
+	vpternlogq	$0xab, %ymm16, %ymm2, %ymm0
+	vpternlogq	$0xab, %zmm16, %zmm2, %zmm0
+	.arch .avx512vl
+	vmovntdq	%xmm0, (%rcx)
+	vmovntdq	%ymm0, (%rcx)
+	vmovntdq	%zmm0, (%rcx)
+	vpternlogq	$0xab, %xmm16, %xmm2, %xmm0
+	vpternlogq	$0xab, %ymm16, %ymm2, %ymm0
+	vpternlogq	$0xab, %zmm16, %zmm2, %zmm0
diff --git a/gas/testsuite/gas/i386/x86-64-avx512vl-2.l b/gas/testsuite/gas/i386/x86-64-avx512vl-2.l
new file mode 100644
index 0000000..10833f6
--- /dev/null
+++ b/gas/testsuite/gas/i386/x86-64-avx512vl-2.l
@@ -0,0 +1,27 @@
+.*: Assembler messages:
+.*:5: Error: .*corei7.*
+.*:6: Error: .*corei7.*
+.*:7: Error: .*corei7.*
+.*:9: Error: .*corei7\.avx\.avx512vl.*
+.*:10: Error: .*corei7\.avx\.avx512vl.*
+.*:11: Error: .*corei7\.avx\.avx512vl.*
+GAS LISTING .*
+#...
+[ 	]*1[ 	]+\.text
+[ 	]*2[ 	]+\.arch corei7
+[ 	]*3[ 	]+_start:
+[ 	]*4[ 	]+\.arch \.avx
+[ 	]*5[ 	]+vpconflictd	%xmm0, %xmm25 
+[ 	]*6[ 	]+vpconflictd	%ymm0, %ymm25 
+[ 	]*7[ 	]+vpconflictd	%ymm0, %zmm25 
+[ 	]*8[ 	]+\.arch \.avx512vl
+[ 	]*9[ 	]+vpconflictd	%xmm0, %xmm25 
+[ 	]*10[ 	]+vpconflictd	%ymm0, %ymm25 
+[ 	]*11[ 	]+vpconflictd	%zmm0, %zmm25 
+[ 	]*12[ 	]+\.arch \.avx512cd
+[ 	]*13[ 	]+\?\?\?\? 62627D08 		vpconflictd	%xmm0, %xmm25 
+[ 	]*13[ 	]+C4C8
+[ 	]*14[ 	]+\?\?\?\? 62627D28 		vpconflictd	%ymm0, %ymm25 
+[ 	]*14[ 	]+C4C8
+[ 	]*15[ 	]+\?\?\?\? 62627D48 		vpconflictd	%zmm0, %zmm25 
+[ 	]*15[ 	]+C4C8
diff --git a/gas/testsuite/gas/i386/x86-64-avx512vl-2.s b/gas/testsuite/gas/i386/x86-64-avx512vl-2.s
new file mode 100644
index 0000000..2b64c70
--- /dev/null
+++ b/gas/testsuite/gas/i386/x86-64-avx512vl-2.s
@@ -0,0 +1,15 @@
+	.text
+	.arch corei7
+_start:
+	.arch .avx
+	vpconflictd	%xmm0, %xmm25 
+	vpconflictd	%ymm0, %ymm25 
+	vpconflictd	%ymm0, %zmm25 
+	.arch .avx512vl
+	vpconflictd	%xmm0, %xmm25 
+	vpconflictd	%ymm0, %ymm25 
+	vpconflictd	%zmm0, %zmm25 
+	.arch .avx512cd
+	vpconflictd	%xmm0, %xmm25 
+	vpconflictd	%ymm0, %ymm25 
+	vpconflictd	%zmm0, %zmm25 
-- 
2.5.5


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH] Allow setting CpuVRex bit in .arch directive
  2016-05-25 19:12                     ` H.J. Lu
@ 2016-05-26  0:09                       ` H.J. Lu
  2016-05-29 15:04                         ` H.J. Lu
  0 siblings, 1 reply; 18+ messages in thread
From: H.J. Lu @ 2016-05-26  0:09 UTC (permalink / raw)
  To: Jakub Jelinek; +Cc: Binutils, Uros Bizjak, Kirill Yukhin

On Wed, May 25, 2016 at 12:12 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Wed, May 25, 2016 at 11:38 AM, Jakub Jelinek <jakub@redhat.com> wrote:
>> On Wed, May 25, 2016 at 11:25:48AM -0700, H.J. Lu wrote:
>>>    { "CPU_ANY_AVX_FLAGS",
>>> -    "CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512CD|CpuAVX512ER|CpuAVX512PF" },
>>> +    "CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512CD|CpuAVX512ER|CpuAVX512PF|CpuAVX512DQ|CpuAVX512BW|CpuAVX512VL|CpuAVX512IFMA|CpuAVX512VBMI" },
>>
>> Shouldn't this also include other flags that imply AVX?
>> Like CpuFMA|CpuFMA4|CpuXOP ?
>>
>> Shouldn't CPU_ANY_SSE_FLAGS include also all the new CPU_ANY_AVX_FLAGS?
>>
>> What about CPU_F16C_FLAGS and CpuF16C?  E.g. in GCC -mf16c implies
>> -mavx and -mno-avx implies -mno-f16c.  So shouldn't CPU_F16C_FLAGS also
>> include CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX
>> and CPU_ANY_AVX_FLAGS include CpuF16C and similarly CPU_ANY_SSE_FLAGS?
>>
>
> Let me think about it.

I opened:

https://sourceware.org/bugzilla/show_bug.cgi?id=20145

-- 
H.J.

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH] Allow setting CpuVRex bit in .arch directive
  2016-05-25 23:22         ` H.J. Lu
@ 2016-05-26  0:57           ` Alan Modra
  0 siblings, 0 replies; 18+ messages in thread
From: Alan Modra @ 2016-05-26  0:57 UTC (permalink / raw)
  To: H.J. Lu; +Cc: Jakub Jelinek, Binutils, Uros Bizjak, Kirill Yukhin

i386-linuxaout  +FAIL: i386 nommx-1
i386-linuxaout  +FAIL: i386 nosse-1
i386-linuxaout  +FAIL: i386 noavx-1
i386-linuxaout  +FAIL: i386 avx512vl-2
i586-aout  +FAIL: i386 nommx-1
i586-aout  +FAIL: i386 nosse-1
i586-aout  +FAIL: i386 noavx-1
i586-aout  +FAIL: i386 avx512vl-2
i586-coff  +FAIL: i386 nommx-1
i586-coff  +FAIL: i386 nosse-1
i586-coff  +FAIL: i386 noavx-1
i586-coff  +FAIL: i386 avx512vl-2
i686-pe  +FAIL: i386 nommx-1
i686-pe  +FAIL: i386 nosse-1
i686-pe  +FAIL: i386 noavx-1
i686-pe  +FAIL: i386 avx512vl-2
x86_64-mingw32  +FAIL: i386 nommx-1
x86_64-mingw32  +FAIL: i386 nosse-1
x86_64-mingw32  +FAIL: i386 noavx-1
x86_64-mingw32  +FAIL: i386 avx512vl-2
x86_64-mingw32  +FAIL: i386 x86-64-avx512vl-2

-- 
Alan Modra
Australia Development Lab, IBM

^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [PATCH] Allow setting CpuVRex bit in .arch directive
  2016-05-26  0:09                       ` H.J. Lu
@ 2016-05-29 15:04                         ` H.J. Lu
  0 siblings, 0 replies; 18+ messages in thread
From: H.J. Lu @ 2016-05-29 15:04 UTC (permalink / raw)
  To: Jakub Jelinek; +Cc: Binutils, Uros Bizjak, Kirill Yukhin

[-- Attachment #1: Type: text/plain, Size: 1231 bytes --]

On Wed, May 25, 2016 at 3:20 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Wed, May 25, 2016 at 12:12 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
>> On Wed, May 25, 2016 at 11:38 AM, Jakub Jelinek <jakub@redhat.com> wrote:
>>> On Wed, May 25, 2016 at 11:25:48AM -0700, H.J. Lu wrote:
>>>>    { "CPU_ANY_AVX_FLAGS",
>>>> -    "CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512CD|CpuAVX512ER|CpuAVX512PF" },
>>>> +    "CpuAVX|CpuAVX2|CpuAVX512F|CpuAVX512CD|CpuAVX512ER|CpuAVX512PF|CpuAVX512DQ|CpuAVX512BW|CpuAVX512VL|CpuAVX512IFMA|CpuAVX512VBMI" },
>>>
>>> Shouldn't this also include other flags that imply AVX?
>>> Like CpuFMA|CpuFMA4|CpuXOP ?
>>>
>>> Shouldn't CPU_ANY_SSE_FLAGS include also all the new CPU_ANY_AVX_FLAGS?
>>>
>>> What about CPU_F16C_FLAGS and CpuF16C?  E.g. in GCC -mf16c implies
>>> -mavx and -mno-avx implies -mno-f16c.  So shouldn't CPU_F16C_FLAGS also
>>> include CpuMMX|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2|CpuAVX
>>> and CPU_ANY_AVX_FLAGS include CpuF16C and similarly CPU_ANY_SSE_FLAGS?
>>>
>>
>> Let me think about it.
>
> I opened:
>
> https://sourceware.org/bugzilla/show_bug.cgi?id=20145
>

I checked in this.

I will close PR 20145.  Please open a new PR if we need more
.noXXX directives.



-- 
H.J.

[-- Attachment #2: 0001-Add-.noavx512XX-directives-to-x86-assembler.patch --]
[-- Type: text/x-patch, Size: 45903 bytes --]

From 144b71e2a88e02d0b54d4f09cc652f353b46e455 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Fri, 27 May 2016 15:41:45 -0700
Subject: [PATCH] Add .noavx512XX directives to x86 assembler

Add .noavx512f, .noavx512cd, .noavx512er, .noavx512pf, .noavx512dq,
.noavx512bw, .noavx512vl, .noavx512ifma, .noavx512vbmi directives to x86
assembler.

gas/

	PR gas/20145
	* config/tc-i386.c (cpu_noarch): Add noavx512f, noavx512cd,
	noavx512er, noavx512pf, noavx512dq, noavx512bw, noavx512vl,
	noavx512ifma and noavx512vbmi.
	* doc/c-i386.texi: Mention noavx512f, noavx512cd, noavx512er,
	noavx512pf, noavx512dq, noavx512bw, noavx512vl, noavx512ifma
	and noavx512vbmi.
	* testsuite/gas/i386/i386.exp: Run noavx512-1 and noavx512-2.
	* testsuite/gas/i386/noavx512-1.l: New file.
	* testsuite/gas/i386/noavx512-1.s: Likewise.
	* testsuite/gas/i386/noavx512-2.l: Likewise.
	* testsuite/gas/i386/noavx512-2.s: Likewise.

opcodes/

	PR gas/20145
	* i386-gen.c (cpu_flag_init): Add CPU_ANY_AVX512F_FLAGS,
	CPU_ANY_AVX512CD_FLAGS, CPU_ANY_AVX512ER_FLAGS,
	CPU_ANY_AVX512PF_FLAGS, CPU_ANY_AVX512DQ_FLAGS,
	CPU_ANY_AVX512BW_FLAGS, CPU_ANY_AVX512VL_FLAGS,
	CPU_ANY_AVX512IFMA_FLAGS and CPU_ANY_AVX512VBMI_FLAGS.
	* i386-init.h: Regenerated.
---
 gas/config/tc-i386.c                |   9 +
 gas/doc/c-i386.texi                 |   9 +
 gas/testsuite/gas/i386/i386.exp     |   2 +
 gas/testsuite/gas/i386/noavx512-1.l | 416 ++++++++++++++++++++++++++++++++++++
 gas/testsuite/gas/i386/noavx512-1.s | 207 ++++++++++++++++++
 gas/testsuite/gas/i386/noavx512-2.l | 105 +++++++++
 gas/testsuite/gas/i386/noavx512-2.s |  53 +++++
 opcodes/i386-gen.c                  |  18 ++
 opcodes/i386-init.h                 |  63 ++++++
 9 files changed, 882 insertions(+)
 create mode 100644 gas/testsuite/gas/i386/noavx512-1.l
 create mode 100644 gas/testsuite/gas/i386/noavx512-1.s
 create mode 100644 gas/testsuite/gas/i386/noavx512-2.l
 create mode 100644 gas/testsuite/gas/i386/noavx512-2.s

diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index b69130a..457f557 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -987,6 +987,15 @@ static const noarch_entry cpu_noarch[] =
   { STRING_COMMA_LEN ("nosse4"),  CPU_ANY_SSE4_1_FLAGS },
   { STRING_COMMA_LEN ("noavx"),  CPU_ANY_AVX_FLAGS },
   { STRING_COMMA_LEN ("noavx2"),  CPU_ANY_AVX2_FLAGS },
+  { STRING_COMMA_LEN ("noavx512f"), CPU_ANY_AVX512F_FLAGS },
+  { STRING_COMMA_LEN ("noavx512cd"), CPU_ANY_AVX512CD_FLAGS },
+  { STRING_COMMA_LEN ("noavx512er"), CPU_ANY_AVX512ER_FLAGS },
+  { STRING_COMMA_LEN ("noavx512pf"), CPU_ANY_AVX512PF_FLAGS },
+  { STRING_COMMA_LEN ("noavx512dq"), CPU_ANY_AVX512DQ_FLAGS },
+  { STRING_COMMA_LEN ("noavx512bw"), CPU_ANY_AVX512BW_FLAGS },
+  { STRING_COMMA_LEN ("noavx512vl"), CPU_ANY_AVX512VL_FLAGS },
+  { STRING_COMMA_LEN ("noavx512ifma"), CPU_ANY_AVX512IFMA_FLAGS },
+  { STRING_COMMA_LEN ("noavx512vbmi"), CPU_ANY_AVX512VBMI_FLAGS },
 };
 
 #ifdef I386COFF
diff --git a/gas/doc/c-i386.texi b/gas/doc/c-i386.texi
index 696cadf..30e29f6 100644
--- a/gas/doc/c-i386.texi
+++ b/gas/doc/c-i386.texi
@@ -180,6 +180,15 @@ accept various extension mnemonics.  For example,
 @code{avx512dq},
 @code{avx512ifma},
 @code{avx512vbmi},
+@code{noavx512f},
+@code{noavx512cd},
+@code{noavx512er},
+@code{noavx512pf},
+@code{noavx512vl},
+@code{noavx512bw},
+@code{noavx512dq},
+@code{noavx512ifma},
+@code{noavx512vbmi},
 @code{vmx},
 @code{vmfunc},
 @code{smx},
diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp
index 0c22498..959cd14 100644
--- a/gas/testsuite/gas/i386/i386.exp
+++ b/gas/testsuite/gas/i386/i386.exp
@@ -178,6 +178,8 @@ if [expr ([istarget "i*86-*-*"] ||  [istarget "x86_64-*-*"]) && [gas_32_check]]
     run_list_test "noavx-2" "-march=+noavx -al"
     run_list_test "noavx-3" "-al"
     run_dump_test "noavx-4"
+    run_list_test "noavx512-1" "-al"
+    run_list_test "noavx512-2" "-al"
     run_dump_test "xsave"
     run_dump_test "xsave-intel"
     run_dump_test "aes"
diff --git a/gas/testsuite/gas/i386/noavx512-1.l b/gas/testsuite/gas/i386/noavx512-1.l
new file mode 100644
index 0000000..ece9211
--- /dev/null
+++ b/gas/testsuite/gas/i386/noavx512-1.l
@@ -0,0 +1,416 @@
+.*: Assembler messages:
+.*:25: Error: .*unsupported instruction.*
+.*:26: Error: .*unsupported masking.*
+.*:27: Error: .*unsupported masking.*
+.*:47: Error: .*unsupported instruction.*
+.*:48: Error: .*unsupported masking.*
+.*:49: Error: .*unsupported masking.*
+.*:50: Error: .*not supported.*
+.*:51: Error: .*not supported.*
+.*:52: Error: .*not supported.*
+.*:69: Error: .*unsupported instruction.*
+.*:70: Error: .*unsupported masking.*
+.*:71: Error: .*unsupported masking.*
+.*:72: Error: .*not supported.*
+.*:73: Error: .*not supported.*
+.*:74: Error: .*not supported.*
+.*:75: Error: .*not supported.*
+.*:76: Error: .*not supported.*
+.*:77: Error: .*not supported.*
+.*:91: Error: .*unsupported instruction.*
+.*:92: Error: .*unsupported masking.*
+.*:93: Error: .*unsupported masking.*
+.*:94: Error: .*not supported.*
+.*:95: Error: .*not supported.*
+.*:96: Error: .*not supported.*
+.*:97: Error: .*not supported.*
+.*:98: Error: .*not supported.*
+.*:99: Error: .*not supported.*
+.*:100: Error: .*not supported.*
+.*:113: Error: .*unsupported instruction.*
+.*:114: Error: .*unsupported masking.*
+.*:115: Error: .*unsupported masking.*
+.*:116: Error: .*not supported.*
+.*:117: Error: .*not supported.*
+.*:118: Error: .*not supported.*
+.*:119: Error: .*not supported.*
+.*:120: Error: .*not supported.*
+.*:121: Error: .*not supported.*
+.*:122: Error: .*not supported.*
+.*:126: Error: .*not supported.*
+.*:127: Error: .*not supported.*
+.*:128: Error: .*not supported.*
+.*:135: Error: .*unsupported instruction.*
+.*:136: Error: .*unsupported masking.*
+.*:137: Error: .*unsupported masking.*
+.*:138: Error: .*not supported.*
+.*:139: Error: .*not supported.*
+.*:140: Error: .*not supported.*
+.*:141: Error: .*not supported.*
+.*:142: Error: .*not supported.*
+.*:143: Error: .*not supported.*
+.*:144: Error: .*not supported.*
+.*:148: Error: .*not supported.*
+.*:149: Error: .*not supported.*
+.*:150: Error: .*not supported.*
+.*:151: Error: .*not supported.*
+.*:157: Error: .*unsupported instruction.*
+.*:158: Error: .*unsupported masking.*
+.*:159: Error: .*unsupported masking.*
+.*:160: Error: .*not supported.*
+.*:161: Error: .*not supported.*
+.*:162: Error: .*not supported.*
+.*:163: Error: .*not supported.*
+.*:164: Error: .*not supported.*
+.*:165: Error: .*not supported.*
+.*:166: Error: .*not supported.*
+.*:170: Error: .*not supported.*
+.*:171: Error: .*not supported.*
+.*:172: Error: .*not supported.*
+.*:173: Error: .*not supported.*
+.*:174: Error: .*not supported.*
+.*:175: Error: .*not supported.*
+.*:176: Error: .*not supported.*
+.*:179: Error: .*bad register name.*
+.*:180: Error: .*unknown vector operation.*
+.*:181: Error: .*unknown vector operation.*
+.*:182: Error: .*not supported.*
+.*:183: Error: .*not supported.*
+.*:184: Error: .*not supported.*
+.*:185: Error: .*not supported.*
+.*:186: Error: .*not supported.*
+.*:187: Error: .*not supported.*
+.*:188: Error: .*not supported.*
+.*:189: Error: .*bad register name.*
+.*:190: Error: .*unknown vector operation.*
+.*:191: Error: .*unknown vector operation.*
+.*:192: Error: .*not supported.*
+.*:193: Error: .*not supported.*
+.*:194: Error: .*not supported.*
+.*:195: Error: .*not supported.*
+.*:196: Error: .*not supported.*
+.*:197: Error: .*not supported.*
+.*:198: Error: .*not supported.*
+GAS LISTING .*
+#...
+[ 	]*1[ 	]+\# Test \.arch \.noavx512XX
+[ 	]*2[ 	]+\.text
+[ 	]*3[ 	]+\?\?\?\? 62F27D4F 		vpabsb %zmm5, %zmm6\{%k7\}		\# AVX512BW
+[ 	]*3[ 	]+1CF5
+[ 	]*4[ 	]+\?\?\?\? 62F27D0F 		vpabsb %xmm5, %xmm6\{%k7\}		\# AVX512BW \+ AVX512VL
+[ 	]*4[ 	]+1CF5
+[ 	]*5[ 	]+\?\?\?\? 62F27D2F 		vpabsb %ymm5, %ymm6\{%k7\}		\# AVX512BW \+ AVX512VL
+[ 	]*5[ 	]+1CF5
+[ 	]*6[ 	]+\?\?\?\? 62F27D48 		vpconflictd %zmm5, %zmm6		\# AVX412CD
+[ 	]*6[ 	]+C4F5
+[ 	]*7[ 	]+\?\?\?\? 62F27D08 		vpconflictd %xmm5, %xmm6		\# AVX412CD \+ AVX512VL
+[ 	]*7[ 	]+C4F5
+[ 	]*8[ 	]+\?\?\?\? 62F27D28 		vpconflictd %ymm5, %ymm6		\# AVX412CD \+ AVX512VL
+[ 	]*8[ 	]+C4F5
+[ 	]*9[ 	]+\?\?\?\? 62F1FD4F 		vcvtpd2qq \(%ecx\), %zmm6\{%k7\}		\# AVX512DQ
+[ 	]*9[ 	]+7B31
+[ 	]*10[ 	]+\?\?\?\? 62F1FD0F 		vcvtpd2qq \(%ecx\), %xmm6\{%k7\}		\# AVX512DQ \+ AVX512VL
+[ 	]*10[ 	]+7B31
+[ 	]*11[ 	]+\?\?\?\? 62F1FD2F 		vcvtpd2qq \(%ecx\), %ymm6\{%k7\}		\# AVX512DQ \+ AVX512VL
+[ 	]*11[ 	]+7B31
+[ 	]*12[ 	]+\?\?\?\? 62F27D4F 		vexp2ps %zmm5, %zmm6\{%k7\}		\# AVX512ER
+[ 	]*12[ 	]+C8F5
+[ 	]*13[ 	]+\?\?\?\? 62F1D54F 		vaddpd %zmm4, %zmm5, %zmm6\{%k7\}		\# AVX512F
+[ 	]*13[ 	]+58F4
+[ 	]*14[ 	]+\?\?\?\? 62F1D50F 		vaddpd %xmm4, %xmm5, %xmm6\{%k7\}		\# AVX512F \+ AVX512VL
+[ 	]*14[ 	]+58F4
+[ 	]*15[ 	]+\?\?\?\? 62F1D52F 		vaddpd %ymm4, %ymm5, %ymm6\{%k7\}		\# AVX512F \+ AVX512VL
+[ 	]*15[ 	]+58F4
+[ 	]*16[ 	]+\?\?\?\? 62F2D54F 		vpmadd52luq %zmm4, %zmm5, %zmm6\{%k7\}	\# AVX512IFMA
+[ 	]*16[ 	]+B4F4
+[ 	]*17[ 	]+\?\?\?\? 62F2D50F 		vpmadd52luq %xmm4, %xmm5, %xmm6\{%k7\}	\# AVX512IFMA \+ AVX512VL
+[ 	]*17[ 	]+B4F4
+[ 	]*18[ 	]+\?\?\?\? 62F2D52F 		vpmadd52luq %ymm4, %ymm5, %ymm6\{%k7\}	\# AVX512IFMA \+ AVX512VL
+[ 	]*18[ 	]+B4F4
+[ 	]*19[ 	]+\?\?\?\? 62F2FD49 		vgatherpf0dpd 23\(%ebp,%ymm7,8\)\{%k1\}	\# AVX512PF
+[ 	]*19[ 	]+C68CFD17 
+[ 	]*19[ 	]+000000
+[ 	]*20[ 	]+\?\?\?\? 62F2554F 		vpermb %zmm4, %zmm5, %zmm6\{%k7\}		\# AVX512VBMI
+[ 	]*20[ 	]+8DF4
+[ 	]*21[ 	]+\?\?\?\? 62F2550F 		vpermb %xmm4, %xmm5, %xmm6\{%k7\}		\# AVX512VBMI \+ AVX512VL
+[ 	]*21[ 	]+8DF4
+[ 	]*22[ 	]+\?\?\?\? 62F2552F 		vpermb %ymm4, %ymm5, %ymm6\{%k7\}		\# AVX512VBMI \+ AVX512VL
+[ 	]*22[ 	]+8DF4
+[ 	]*23[ 	]+
+[ 	]*24[ 	]+\.arch \.noavx512bw
+[ 	]*25[ 	]+vpabsb %zmm5, %zmm6\{%k7\}		\# AVX512BW
+[ 	]*26[ 	]+vpabsb %xmm5, %xmm6\{%k7\}		\# AVX512BW \+ AVX512VL
+[ 	]*27[ 	]+vpabsb %ymm5, %ymm6\{%k7\}		\# AVX512BW \+ AVX512VL
+[ 	]*28[ 	]+\?\?\?\? 62F27D48 		vpconflictd %zmm5, %zmm6		\# AVX412CD
+[ 	]*28[ 	]+C4F5
+[ 	]*29[ 	]+\?\?\?\? 62F27D08 		vpconflictd %xmm5, %xmm6		\# AVX412CD \+ AVX512VL
+[ 	]*29[ 	]+C4F5
+[ 	]*30[ 	]+\?\?\?\? 62F27D28 		vpconflictd %ymm5, %ymm6		\# AVX412CD \+ AVX512VL
+[ 	]*30[ 	]+C4F5
+[ 	]*31[ 	]+\?\?\?\? 62F1FD4F 		vcvtpd2qq \(%ecx\), %zmm6\{%k7\}		\# AVX512DQ
+[ 	]*31[ 	]+7B31
+[ 	]*32[ 	]+\?\?\?\? 62F1FD0F 		vcvtpd2qq \(%ecx\), %xmm6\{%k7\}		\# AVX512DQ \+ AVX512VL
+\fGAS LISTING .*
+
+
+[ 	]*32[ 	]+7B31
+[ 	]*33[ 	]+\?\?\?\? 62F1FD2F 		vcvtpd2qq \(%ecx\), %ymm6\{%k7\}		\# AVX512DQ \+ AVX512VL
+[ 	]*33[ 	]+7B31
+[ 	]*34[ 	]+\?\?\?\? 62F27D4F 		vexp2ps %zmm5, %zmm6\{%k7\}		\# AVX512ER
+[ 	]*34[ 	]+C8F5
+[ 	]*35[ 	]+\?\?\?\? 62F1D54F 		vaddpd %zmm4, %zmm5, %zmm6\{%k7\}		\# AVX512F
+[ 	]*35[ 	]+58F4
+[ 	]*36[ 	]+\?\?\?\? 62F1D50F 		vaddpd %xmm4, %xmm5, %xmm6\{%k7\}		\# AVX512F \+ AVX512VL
+[ 	]*36[ 	]+58F4
+[ 	]*37[ 	]+\?\?\?\? 62F1D52F 		vaddpd %ymm4, %ymm5, %ymm6\{%k7\}		\# AVX512F \+ AVX512VL
+[ 	]*37[ 	]+58F4
+[ 	]*38[ 	]+\?\?\?\? 62F2D54F 		vpmadd52luq %zmm4, %zmm5, %zmm6\{%k7\}	\# AVX512IFMA
+[ 	]*38[ 	]+B4F4
+[ 	]*39[ 	]+\?\?\?\? 62F2D50F 		vpmadd52luq %xmm4, %xmm5, %xmm6\{%k7\}	\# AVX512IFMA \+ AVX512VL
+[ 	]*39[ 	]+B4F4
+[ 	]*40[ 	]+\?\?\?\? 62F2D52F 		vpmadd52luq %ymm4, %ymm5, %ymm6\{%k7\}	\# AVX512IFMA \+ AVX512VL
+[ 	]*40[ 	]+B4F4
+[ 	]*41[ 	]+\?\?\?\? 62F2FD49 		vgatherpf0dpd 23\(%ebp,%ymm7,8\)\{%k1\}	\# AVX512PF
+[ 	]*41[ 	]+C68CFD17 
+[ 	]*41[ 	]+000000
+[ 	]*42[ 	]+\?\?\?\? 62F2554F 		vpermb %zmm4, %zmm5, %zmm6\{%k7\}		\# AVX512VBMI
+[ 	]*42[ 	]+8DF4
+[ 	]*43[ 	]+\?\?\?\? 62F2550F 		vpermb %xmm4, %xmm5, %xmm6\{%k7\}		\# AVX512VBMI \+ AVX512VL
+[ 	]*43[ 	]+8DF4
+[ 	]*44[ 	]+\?\?\?\? 62F2552F 		vpermb %ymm4, %ymm5, %ymm6\{%k7\}		\# AVX512VBMI \+ AVX512VL
+[ 	]*44[ 	]+8DF4
+[ 	]*45[ 	]+
+[ 	]*46[ 	]+\.arch \.noavx512cd
+[ 	]*47[ 	]+vpabsb %zmm5, %zmm6\{%k7\}		\# AVX512BW
+[ 	]*48[ 	]+vpabsb %xmm5, %xmm6\{%k7\}		\# AVX512BW \+ AVX512VL
+[ 	]*49[ 	]+vpabsb %ymm5, %ymm6\{%k7\}		\# AVX512BW \+ AVX512VL
+[ 	]*50[ 	]+vpconflictd %zmm5, %zmm6		\# AVX412CD
+[ 	]*51[ 	]+vpconflictd %xmm5, %xmm6		\# AVX412CD \+ AVX512VL
+[ 	]*52[ 	]+vpconflictd %ymm5, %ymm6		\# AVX412CD \+ AVX512VL
+[ 	]*53[ 	]+\?\?\?\? 62F1FD4F 		vcvtpd2qq \(%ecx\), %zmm6\{%k7\}		\# AVX512DQ
+[ 	]*53[ 	]+7B31
+[ 	]*54[ 	]+\?\?\?\? 62F1FD0F 		vcvtpd2qq \(%ecx\), %xmm6\{%k7\}		\# AVX512DQ \+ AVX512VL
+[ 	]*54[ 	]+7B31
+[ 	]*55[ 	]+\?\?\?\? 62F1FD2F 		vcvtpd2qq \(%ecx\), %ymm6\{%k7\}		\# AVX512DQ \+ AVX512VL
+[ 	]*55[ 	]+7B31
+[ 	]*56[ 	]+\?\?\?\? 62F27D4F 		vexp2ps %zmm5, %zmm6\{%k7\}		\# AVX512ER
+[ 	]*56[ 	]+C8F5
+[ 	]*57[ 	]+\?\?\?\? 62F1D54F 		vaddpd %zmm4, %zmm5, %zmm6\{%k7\}		\# AVX512F
+[ 	]*57[ 	]+58F4
+[ 	]*58[ 	]+\?\?\?\? 62F1D50F 		vaddpd %xmm4, %xmm5, %xmm6\{%k7\}		\# AVX512F \+ AVX512VL
+[ 	]*58[ 	]+58F4
+[ 	]*59[ 	]+\?\?\?\? 62F1D52F 		vaddpd %ymm4, %ymm5, %ymm6\{%k7\}		\# AVX512F \+ AVX512VL
+[ 	]*59[ 	]+58F4
+[ 	]*60[ 	]+\?\?\?\? 62F2D54F 		vpmadd52luq %zmm4, %zmm5, %zmm6\{%k7\}	\# AVX512IFMA
+[ 	]*60[ 	]+B4F4
+[ 	]*61[ 	]+\?\?\?\? 62F2D50F 		vpmadd52luq %xmm4, %xmm5, %xmm6\{%k7\}	\# AVX512IFMA \+ AVX512VL
+[ 	]*61[ 	]+B4F4
+[ 	]*62[ 	]+\?\?\?\? 62F2D52F 		vpmadd52luq %ymm4, %ymm5, %ymm6\{%k7\}	\# AVX512IFMA \+ AVX512VL
+[ 	]*62[ 	]+B4F4
+[ 	]*63[ 	]+\?\?\?\? 62F2FD49 		vgatherpf0dpd 23\(%ebp,%ymm7,8\)\{%k1\}	\# AVX512PF
+[ 	]*63[ 	]+C68CFD17 
+[ 	]*63[ 	]+000000
+\fGAS LISTING .*
+
+
+[ 	]*64[ 	]+\?\?\?\? 62F2554F 		vpermb %zmm4, %zmm5, %zmm6\{%k7\}		\# AVX512VBMI
+[ 	]*64[ 	]+8DF4
+[ 	]*65[ 	]+\?\?\?\? 62F2550F 		vpermb %xmm4, %xmm5, %xmm6\{%k7\}		\# AVX512VBMI \+ AVX512VL
+[ 	]*65[ 	]+8DF4
+[ 	]*66[ 	]+\?\?\?\? 62F2552F 		vpermb %ymm4, %ymm5, %ymm6\{%k7\}		\# AVX512VBMI \+ AVX512VL
+[ 	]*66[ 	]+8DF4
+[ 	]*67[ 	]+
+[ 	]*68[ 	]+\.arch \.noavx512dq
+[ 	]*69[ 	]+vpabsb %zmm5, %zmm6\{%k7\}		\# AVX512BW
+[ 	]*70[ 	]+vpabsb %xmm5, %xmm6\{%k7\}		\# AVX512BW \+ AVX512VL
+[ 	]*71[ 	]+vpabsb %ymm5, %ymm6\{%k7\}		\# AVX512BW \+ AVX512VL
+[ 	]*72[ 	]+vpconflictd %zmm5, %zmm6		\# AVX412CD
+[ 	]*73[ 	]+vpconflictd %xmm5, %xmm6		\# AVX412CD \+ AVX512VL
+[ 	]*74[ 	]+vpconflictd %ymm5, %ymm6		\# AVX412CD \+ AVX512VL
+[ 	]*75[ 	]+vcvtpd2qq \(%ecx\), %zmm6\{%k7\}		\# AVX512DQ
+[ 	]*76[ 	]+vcvtpd2qq \(%ecx\), %xmm6\{%k7\}		\# AVX512DQ \+ AVX512VL
+[ 	]*77[ 	]+vcvtpd2qq \(%ecx\), %ymm6\{%k7\}		\# AVX512DQ \+ AVX512VL
+[ 	]*78[ 	]+\?\?\?\? 62F27D4F 		vexp2ps %zmm5, %zmm6\{%k7\}		\# AVX512ER
+[ 	]*78[ 	]+C8F5
+[ 	]*79[ 	]+\?\?\?\? 62F1D54F 		vaddpd %zmm4, %zmm5, %zmm6\{%k7\}		\# AVX512F
+[ 	]*79[ 	]+58F4
+[ 	]*80[ 	]+\?\?\?\? 62F1D50F 		vaddpd %xmm4, %xmm5, %xmm6\{%k7\}		\# AVX512F \+ AVX512VL
+[ 	]*80[ 	]+58F4
+[ 	]*81[ 	]+\?\?\?\? 62F1D52F 		vaddpd %ymm4, %ymm5, %ymm6\{%k7\}		\# AVX512F \+ AVX512VL
+[ 	]*81[ 	]+58F4
+[ 	]*82[ 	]+\?\?\?\? 62F2D54F 		vpmadd52luq %zmm4, %zmm5, %zmm6\{%k7\}	\# AVX512IFMA
+[ 	]*82[ 	]+B4F4
+[ 	]*83[ 	]+\?\?\?\? 62F2D50F 		vpmadd52luq %xmm4, %xmm5, %xmm6\{%k7\}	\# AVX512IFMA \+ AVX512VL
+[ 	]*83[ 	]+B4F4
+[ 	]*84[ 	]+\?\?\?\? 62F2D52F 		vpmadd52luq %ymm4, %ymm5, %ymm6\{%k7\}	\# AVX512IFMA \+ AVX512VL
+[ 	]*84[ 	]+B4F4
+[ 	]*85[ 	]+\?\?\?\? 62F2FD49 		vgatherpf0dpd 23\(%ebp,%ymm7,8\)\{%k1\}	\# AVX512PF
+[ 	]*85[ 	]+C68CFD17 
+[ 	]*85[ 	]+000000
+[ 	]*86[ 	]+\?\?\?\? 62F2554F 		vpermb %zmm4, %zmm5, %zmm6\{%k7\}		\# AVX512VBMI
+[ 	]*86[ 	]+8DF4
+[ 	]*87[ 	]+\?\?\?\? 62F2550F 		vpermb %xmm4, %xmm5, %xmm6\{%k7\}		\# AVX512VBMI \+ AVX512VL
+[ 	]*87[ 	]+8DF4
+[ 	]*88[ 	]+\?\?\?\? 62F2552F 		vpermb %ymm4, %ymm5, %ymm6\{%k7\}		\# AVX512VBMI \+ AVX512VL
+[ 	]*88[ 	]+8DF4
+[ 	]*89[ 	]+
+[ 	]*90[ 	]+\.arch \.noavx512er
+[ 	]*91[ 	]+vpabsb %zmm5, %zmm6\{%k7\}		\# AVX512BW
+[ 	]*92[ 	]+vpabsb %xmm5, %xmm6\{%k7\}		\# AVX512BW \+ AVX512VL
+[ 	]*93[ 	]+vpabsb %ymm5, %ymm6\{%k7\}		\# AVX512BW \+ AVX512VL
+[ 	]*94[ 	]+vpconflictd %zmm5, %zmm6		\# AVX412CD
+[ 	]*95[ 	]+vpconflictd %xmm5, %xmm6		\# AVX412CD \+ AVX512VL
+[ 	]*96[ 	]+vpconflictd %ymm5, %ymm6		\# AVX412CD \+ AVX512VL
+[ 	]*97[ 	]+vcvtpd2qq \(%ecx\), %zmm6\{%k7\}		\# AVX512DQ
+[ 	]*98[ 	]+vcvtpd2qq \(%ecx\), %xmm6\{%k7\}		\# AVX512DQ \+ AVX512VL
+[ 	]*99[ 	]+vcvtpd2qq \(%ecx\), %ymm6\{%k7\}		\# AVX512DQ \+ AVX512VL
+[ 	]*100[ 	]+vexp2ps %zmm5, %zmm6\{%k7\}		\# AVX512ER
+[ 	]*101[ 	]+\?\?\?\? 62F1D54F 		vaddpd %zmm4, %zmm5, %zmm6\{%k7\}		\# AVX512F
+[ 	]*101[ 	]+58F4
+[ 	]*102[ 	]+\?\?\?\? 62F1D50F 		vaddpd %xmm4, %xmm5, %xmm6\{%k7\}		\# AVX512F \+ AVX512VL
+[ 	]*102[ 	]+58F4
+[ 	]*103[ 	]+\?\?\?\? 62F1D52F 		vaddpd %ymm4, %ymm5, %ymm6\{%k7\}		\# AVX512F \+ AVX512VL
+\fGAS LISTING .*
+
+
+[ 	]*103[ 	]+58F4
+[ 	]*104[ 	]+\?\?\?\? 62F2D54F 		vpmadd52luq %zmm4, %zmm5, %zmm6\{%k7\}	\# AVX512IFMA
+[ 	]*104[ 	]+B4F4
+[ 	]*105[ 	]+\?\?\?\? 62F2D50F 		vpmadd52luq %xmm4, %xmm5, %xmm6\{%k7\}	\# AVX512IFMA \+ AVX512VL
+[ 	]*105[ 	]+B4F4
+[ 	]*106[ 	]+\?\?\?\? 62F2D52F 		vpmadd52luq %ymm4, %ymm5, %ymm6\{%k7\}	\# AVX512IFMA \+ AVX512VL
+[ 	]*106[ 	]+B4F4
+[ 	]*107[ 	]+\?\?\?\? 62F2FD49 		vgatherpf0dpd 23\(%ebp,%ymm7,8\)\{%k1\}	\# AVX512PF
+[ 	]*107[ 	]+C68CFD17 
+[ 	]*107[ 	]+000000
+[ 	]*108[ 	]+\?\?\?\? 62F2554F 		vpermb %zmm4, %zmm5, %zmm6\{%k7\}		\# AVX512VBMI
+[ 	]*108[ 	]+8DF4
+[ 	]*109[ 	]+\?\?\?\? 62F2550F 		vpermb %xmm4, %xmm5, %xmm6\{%k7\}		\# AVX512VBMI \+ AVX512VL
+[ 	]*109[ 	]+8DF4
+[ 	]*110[ 	]+\?\?\?\? 62F2552F 		vpermb %ymm4, %ymm5, %ymm6\{%k7\}		\# AVX512VBMI \+ AVX512VL
+[ 	]*110[ 	]+8DF4
+[ 	]*111[ 	]+
+[ 	]*112[ 	]+\.arch \.noavx512ifma
+[ 	]*113[ 	]+vpabsb %zmm5, %zmm6\{%k7\}		\# AVX512BW
+[ 	]*114[ 	]+vpabsb %xmm5, %xmm6\{%k7\}		\# AVX512BW \+ AVX512VL
+[ 	]*115[ 	]+vpabsb %ymm5, %ymm6\{%k7\}		\# AVX512BW \+ AVX512VL
+[ 	]*116[ 	]+vpconflictd %zmm5, %zmm6		\# AVX412CD
+[ 	]*117[ 	]+vpconflictd %xmm5, %xmm6		\# AVX412CD \+ AVX512VL
+[ 	]*118[ 	]+vpconflictd %ymm5, %ymm6		\# AVX412CD \+ AVX512VL
+[ 	]*119[ 	]+vcvtpd2qq \(%ecx\), %zmm6\{%k7\}		\# AVX512DQ
+[ 	]*120[ 	]+vcvtpd2qq \(%ecx\), %xmm6\{%k7\}		\# AVX512DQ \+ AVX512VL
+[ 	]*121[ 	]+vcvtpd2qq \(%ecx\), %ymm6\{%k7\}		\# AVX512DQ \+ AVX512VL
+[ 	]*122[ 	]+vexp2ps %zmm5, %zmm6\{%k7\}		\# AVX512ER
+[ 	]*123[ 	]+\?\?\?\? 62F1D54F 		vaddpd %zmm4, %zmm5, %zmm6\{%k7\}		\# AVX512F
+[ 	]*123[ 	]+58F4
+[ 	]*124[ 	]+\?\?\?\? 62F1D50F 		vaddpd %xmm4, %xmm5, %xmm6\{%k7\}		\# AVX512F \+ AVX512VL
+[ 	]*124[ 	]+58F4
+[ 	]*125[ 	]+\?\?\?\? 62F1D52F 		vaddpd %ymm4, %ymm5, %ymm6\{%k7\}		\# AVX512F \+ AVX512VL
+[ 	]*125[ 	]+58F4
+[ 	]*126[ 	]+vpmadd52luq %zmm4, %zmm5, %zmm6\{%k7\}	\# AVX512IFMA
+[ 	]*127[ 	]+vpmadd52luq %xmm4, %xmm5, %xmm6\{%k7\}	\# AVX512IFMA \+ AVX512VL
+[ 	]*128[ 	]+vpmadd52luq %ymm4, %ymm5, %ymm6\{%k7\}	\# AVX512IFMA \+ AVX512VL
+[ 	]*129[ 	]+\?\?\?\? 62F2FD49 		vgatherpf0dpd 23\(%ebp,%ymm7,8\)\{%k1\}	\# AVX512PF
+[ 	]*129[ 	]+C68CFD17 
+[ 	]*129[ 	]+000000
+[ 	]*130[ 	]+\?\?\?\? 62F2554F 		vpermb %zmm4, %zmm5, %zmm6\{%k7\}		\# AVX512VBMI
+[ 	]*130[ 	]+8DF4
+[ 	]*131[ 	]+\?\?\?\? 62F2550F 		vpermb %xmm4, %xmm5, %xmm6\{%k7\}		\# AVX512VBMI \+ AVX512VL
+[ 	]*131[ 	]+8DF4
+[ 	]*132[ 	]+\?\?\?\? 62F2552F 		vpermb %ymm4, %ymm5, %ymm6\{%k7\}		\# AVX512VBMI \+ AVX512VL
+[ 	]*132[ 	]+8DF4
+[ 	]*133[ 	]+
+[ 	]*134[ 	]+\.arch \.noavx512pf
+[ 	]*135[ 	]+vpabsb %zmm5, %zmm6\{%k7\}		\# AVX512BW
+[ 	]*136[ 	]+vpabsb %xmm5, %xmm6\{%k7\}		\# AVX512BW \+ AVX512VL
+[ 	]*137[ 	]+vpabsb %ymm5, %ymm6\{%k7\}		\# AVX512BW \+ AVX512VL
+[ 	]*138[ 	]+vpconflictd %zmm5, %zmm6		\# AVX412CD
+[ 	]*139[ 	]+vpconflictd %xmm5, %xmm6		\# AVX412CD \+ AVX512VL
+[ 	]*140[ 	]+vpconflictd %ymm5, %ymm6		\# AVX412CD \+ AVX512VL
+[ 	]*141[ 	]+vcvtpd2qq \(%ecx\), %zmm6\{%k7\}		\# AVX512DQ
+[ 	]*142[ 	]+vcvtpd2qq \(%ecx\), %xmm6\{%k7\}		\# AVX512DQ \+ AVX512VL
+[ 	]*143[ 	]+vcvtpd2qq \(%ecx\), %ymm6\{%k7\}		\# AVX512DQ \+ AVX512VL
+\fGAS LISTING .*
+
+
+[ 	]*144[ 	]+vexp2ps %zmm5, %zmm6\{%k7\}		\# AVX512ER
+[ 	]*145[ 	]+\?\?\?\? 62F1D54F 		vaddpd %zmm4, %zmm5, %zmm6\{%k7\}		\# AVX512F
+[ 	]*145[ 	]+58F4
+[ 	]*146[ 	]+\?\?\?\? 62F1D50F 		vaddpd %xmm4, %xmm5, %xmm6\{%k7\}		\# AVX512F \+ AVX512VL
+[ 	]*146[ 	]+58F4
+[ 	]*147[ 	]+\?\?\?\? 62F1D52F 		vaddpd %ymm4, %ymm5, %ymm6\{%k7\}		\# AVX512F \+ AVX512VL
+[ 	]*147[ 	]+58F4
+[ 	]*148[ 	]+vpmadd52luq %zmm4, %zmm5, %zmm6\{%k7\}	\# AVX512IFMA
+[ 	]*149[ 	]+vpmadd52luq %xmm4, %xmm5, %xmm6\{%k7\}	\# AVX512IFMA \+ AVX512VL
+[ 	]*150[ 	]+vpmadd52luq %ymm4, %ymm5, %ymm6\{%k7\}	\# AVX512IFMA \+ AVX512VL
+[ 	]*151[ 	]+vgatherpf0dpd 23\(%ebp,%ymm7,8\)\{%k1\}	\# AVX512PF
+[ 	]*152[ 	]+\?\?\?\? 62F2554F 		vpermb %zmm4, %zmm5, %zmm6\{%k7\}		\# AVX512VBMI
+[ 	]*152[ 	]+8DF4
+[ 	]*153[ 	]+\?\?\?\? 62F2550F 		vpermb %xmm4, %xmm5, %xmm6\{%k7\}		\# AVX512VBMI \+ AVX512VL
+[ 	]*153[ 	]+8DF4
+[ 	]*154[ 	]+\?\?\?\? 62F2552F 		vpermb %ymm4, %ymm5, %ymm6\{%k7\}		\# AVX512VBMI \+ AVX512VL
+[ 	]*154[ 	]+8DF4
+[ 	]*155[ 	]+
+[ 	]*156[ 	]+\.arch \.noavx512vbmi
+[ 	]*157[ 	]+vpabsb %zmm5, %zmm6\{%k7\}		\# AVX512BW
+[ 	]*158[ 	]+vpabsb %xmm5, %xmm6\{%k7\}		\# AVX512BW \+ AVX512VL
+[ 	]*159[ 	]+vpabsb %ymm5, %ymm6\{%k7\}		\# AVX512BW \+ AVX512VL
+[ 	]*160[ 	]+vpconflictd %zmm5, %zmm6		\# AVX412CD
+[ 	]*161[ 	]+vpconflictd %xmm5, %xmm6		\# AVX412CD \+ AVX512VL
+[ 	]*162[ 	]+vpconflictd %ymm5, %ymm6		\# AVX412CD \+ AVX512VL
+[ 	]*163[ 	]+vcvtpd2qq \(%ecx\), %zmm6\{%k7\}		\# AVX512DQ
+[ 	]*164[ 	]+vcvtpd2qq \(%ecx\), %xmm6\{%k7\}		\# AVX512DQ \+ AVX512VL
+[ 	]*165[ 	]+vcvtpd2qq \(%ecx\), %ymm6\{%k7\}		\# AVX512DQ \+ AVX512VL
+[ 	]*166[ 	]+vexp2ps %zmm5, %zmm6\{%k7\}		\# AVX512ER
+[ 	]*167[ 	]+\?\?\?\? 62F1D54F 		vaddpd %zmm4, %zmm5, %zmm6\{%k7\}		\# AVX512F
+[ 	]*167[ 	]+58F4
+[ 	]*168[ 	]+\?\?\?\? 62F1D50F 		vaddpd %xmm4, %xmm5, %xmm6\{%k7\}		\# AVX512F \+ AVX512VL
+[ 	]*168[ 	]+58F4
+[ 	]*169[ 	]+\?\?\?\? 62F1D52F 		vaddpd %ymm4, %ymm5, %ymm6\{%k7\}		\# AVX512F \+ AVX512VL
+[ 	]*169[ 	]+58F4
+[ 	]*170[ 	]+vpmadd52luq %zmm4, %zmm5, %zmm6\{%k7\}	\# AVX512IFMA
+[ 	]*171[ 	]+vpmadd52luq %xmm4, %xmm5, %xmm6\{%k7\}	\# AVX512IFMA \+ AVX512VL
+[ 	]*172[ 	]+vpmadd52luq %ymm4, %ymm5, %ymm6\{%k7\}	\# AVX512IFMA \+ AVX512VL
+[ 	]*173[ 	]+vgatherpf0dpd 23\(%ebp,%ymm7,8\)\{%k1\}	\# AVX512PF
+[ 	]*174[ 	]+vpermb %zmm4, %zmm5, %zmm6\{%k7\}		\# AVX512VBMI
+[ 	]*175[ 	]+vpermb %xmm4, %xmm5, %xmm6\{%k7\}		\# AVX512VBMI \+ AVX512VL
+[ 	]*176[ 	]+vpermb %ymm4, %ymm5, %ymm6\{%k7\}		\# AVX512VBMI \+ AVX512VL
+[ 	]*177[ 	]+
+[ 	]*178[ 	]+\.arch \.noavx512f
+[ 	]*179[ 	]+vpabsb %zmm5, %zmm6\{%k7\}		\# AVX512BW
+[ 	]*180[ 	]+vpabsb %xmm5, %xmm6\{%k7\}		\# AVX512BW \+ AVX512VL
+[ 	]*181[ 	]+vpabsb %ymm5, %ymm6\{%k7\}		\# AVX512BW \+ AVX512VL
+[ 	]*182[ 	]+vpconflictd %zmm5, %zmm6		\# AVX412CD
+[ 	]*183[ 	]+vpconflictd %xmm5, %xmm6		\# AVX412CD \+ AVX512VL
+[ 	]*184[ 	]+vpconflictd %ymm5, %ymm6		\# AVX412CD \+ AVX512VL
+[ 	]*185[ 	]+vcvtpd2qq \(%ecx\), %zmm6\{%k7\}		\# AVX512DQ
+[ 	]*186[ 	]+vcvtpd2qq \(%ecx\), %xmm6\{%k7\}		\# AVX512DQ \+ AVX512VL
+[ 	]*187[ 	]+vcvtpd2qq \(%ecx\), %ymm6\{%k7\}		\# AVX512DQ \+ AVX512VL
+[ 	]*188[ 	]+vexp2ps %zmm5, %zmm6\{%k7\}		\# AVX512ER
+[ 	]*189[ 	]+vaddpd %zmm4, %zmm5, %zmm6\{%k7\}		\# AVX512F
+[ 	]*190[ 	]+vaddpd %xmm4, %xmm5, %xmm6\{%k7\}		\# AVX512F \+ AVX512VL
+[ 	]*191[ 	]+vaddpd %ymm4, %ymm5, %ymm6\{%k7\}		\# AVX512F \+ AVX512VL
+\fGAS LISTING .*
+
+
+[ 	]*192[ 	]+vpmadd52luq %zmm4, %zmm5, %zmm6\{%k7\}	\# AVX512IFMA
+[ 	]*193[ 	]+vpmadd52luq %xmm4, %xmm5, %xmm6\{%k7\}	\# AVX512IFMA \+ AVX512VL
+[ 	]*194[ 	]+vpmadd52luq %ymm4, %ymm5, %ymm6\{%k7\}	\# AVX512IFMA \+ AVX512VL
+[ 	]*195[ 	]+vgatherpf0dpd 23\(%ebp,%ymm7,8\)\{%k1\}	\# AVX512PF
+[ 	]*196[ 	]+vpermb %zmm4, %zmm5, %zmm6\{%k7\}		\# AVX512VBMI
+[ 	]*197[ 	]+vpermb %xmm4, %xmm5, %xmm6\{%k7\}		\# AVX512VBMI \+ AVX512VL
+[ 	]*198[ 	]+vpermb %ymm4, %ymm5, %ymm6\{%k7\}		\# AVX512VBMI \+ AVX512VL
+[ 	]*199[ 	]+
+[ 	]*200[ 	]+\?\?\?\? C4E2791C 		vpabsb %xmm5, %xmm6
+[ 	]*200[ 	]+F5
+[ 	]*201[ 	]+\?\?\?\? C4E27D1C 		vpabsb %ymm5, %ymm6
+[ 	]*201[ 	]+F5
+[ 	]*202[ 	]+\?\?\?\? C5D158F4 		vaddpd %xmm4, %xmm5, %xmm6
+[ 	]*203[ 	]+\?\?\?\? C5D558F4 		vaddpd %ymm4, %ymm5, %ymm6
+[ 	]*204[ 	]+\?\?\?\? 660F381C 		pabsb %xmm5, %xmm6
+[ 	]*204[ 	]+F5
+[ 	]*205[ 	]+\?\?\?\? 660F58F4 		addpd %xmm4, %xmm6
+[ 	]*206[ 	]+
+[ 	]*207[ 	]+\?\?\?\? 0F1F8000 		\.p2align 4
+[ 	]*207[ 	]+000000
+#pass
diff --git a/gas/testsuite/gas/i386/noavx512-1.s b/gas/testsuite/gas/i386/noavx512-1.s
new file mode 100644
index 0000000..786f244
--- /dev/null
+++ b/gas/testsuite/gas/i386/noavx512-1.s
@@ -0,0 +1,207 @@
+# Test .arch .noavx512XX
+	.text
+	vpabsb %zmm5, %zmm6{%k7}		# AVX512BW
+	vpabsb %xmm5, %xmm6{%k7}		# AVX512BW + AVX512VL
+	vpabsb %ymm5, %ymm6{%k7}		# AVX512BW + AVX512VL
+	vpconflictd %zmm5, %zmm6		# AVX412CD
+	vpconflictd %xmm5, %xmm6		# AVX412CD + AVX512VL
+	vpconflictd %ymm5, %ymm6		# AVX412CD + AVX512VL
+	vcvtpd2qq (%ecx), %zmm6{%k7}		# AVX512DQ
+	vcvtpd2qq (%ecx), %xmm6{%k7}		# AVX512DQ + AVX512VL
+	vcvtpd2qq (%ecx), %ymm6{%k7}		# AVX512DQ + AVX512VL
+	vexp2ps %zmm5, %zmm6{%k7}		# AVX512ER
+	vaddpd %zmm4, %zmm5, %zmm6{%k7}		# AVX512F
+	vaddpd %xmm4, %xmm5, %xmm6{%k7}		# AVX512F + AVX512VL
+	vaddpd %ymm4, %ymm5, %ymm6{%k7}		# AVX512F + AVX512VL
+	vpmadd52luq %zmm4, %zmm5, %zmm6{%k7}	# AVX512IFMA
+	vpmadd52luq %xmm4, %xmm5, %xmm6{%k7}	# AVX512IFMA + AVX512VL
+	vpmadd52luq %ymm4, %ymm5, %ymm6{%k7}	# AVX512IFMA + AVX512VL
+	vgatherpf0dpd 23(%ebp,%ymm7,8){%k1}	# AVX512PF
+	vpermb %zmm4, %zmm5, %zmm6{%k7}		# AVX512VBMI
+	vpermb %xmm4, %xmm5, %xmm6{%k7}		# AVX512VBMI + AVX512VL
+	vpermb %ymm4, %ymm5, %ymm6{%k7}		# AVX512VBMI + AVX512VL
+
+	.arch .noavx512bw
+	vpabsb %zmm5, %zmm6{%k7}		# AVX512BW
+	vpabsb %xmm5, %xmm6{%k7}		# AVX512BW + AVX512VL
+	vpabsb %ymm5, %ymm6{%k7}		# AVX512BW + AVX512VL
+	vpconflictd %zmm5, %zmm6		# AVX412CD
+	vpconflictd %xmm5, %xmm6		# AVX412CD + AVX512VL
+	vpconflictd %ymm5, %ymm6		# AVX412CD + AVX512VL
+	vcvtpd2qq (%ecx), %zmm6{%k7}		# AVX512DQ
+	vcvtpd2qq (%ecx), %xmm6{%k7}		# AVX512DQ + AVX512VL
+	vcvtpd2qq (%ecx), %ymm6{%k7}		# AVX512DQ + AVX512VL
+	vexp2ps %zmm5, %zmm6{%k7}		# AVX512ER
+	vaddpd %zmm4, %zmm5, %zmm6{%k7}		# AVX512F
+	vaddpd %xmm4, %xmm5, %xmm6{%k7}		# AVX512F + AVX512VL
+	vaddpd %ymm4, %ymm5, %ymm6{%k7}		# AVX512F + AVX512VL
+	vpmadd52luq %zmm4, %zmm5, %zmm6{%k7}	# AVX512IFMA
+	vpmadd52luq %xmm4, %xmm5, %xmm6{%k7}	# AVX512IFMA + AVX512VL
+	vpmadd52luq %ymm4, %ymm5, %ymm6{%k7}	# AVX512IFMA + AVX512VL
+	vgatherpf0dpd 23(%ebp,%ymm7,8){%k1}	# AVX512PF
+	vpermb %zmm4, %zmm5, %zmm6{%k7}		# AVX512VBMI
+	vpermb %xmm4, %xmm5, %xmm6{%k7}		# AVX512VBMI + AVX512VL
+	vpermb %ymm4, %ymm5, %ymm6{%k7}		# AVX512VBMI + AVX512VL
+
+	.arch .noavx512cd
+	vpabsb %zmm5, %zmm6{%k7}		# AVX512BW
+	vpabsb %xmm5, %xmm6{%k7}		# AVX512BW + AVX512VL
+	vpabsb %ymm5, %ymm6{%k7}		# AVX512BW + AVX512VL
+	vpconflictd %zmm5, %zmm6		# AVX412CD
+	vpconflictd %xmm5, %xmm6		# AVX412CD + AVX512VL
+	vpconflictd %ymm5, %ymm6		# AVX412CD + AVX512VL
+	vcvtpd2qq (%ecx), %zmm6{%k7}		# AVX512DQ
+	vcvtpd2qq (%ecx), %xmm6{%k7}		# AVX512DQ + AVX512VL
+	vcvtpd2qq (%ecx), %ymm6{%k7}		# AVX512DQ + AVX512VL
+	vexp2ps %zmm5, %zmm6{%k7}		# AVX512ER
+	vaddpd %zmm4, %zmm5, %zmm6{%k7}		# AVX512F
+	vaddpd %xmm4, %xmm5, %xmm6{%k7}		# AVX512F + AVX512VL
+	vaddpd %ymm4, %ymm5, %ymm6{%k7}		# AVX512F + AVX512VL
+	vpmadd52luq %zmm4, %zmm5, %zmm6{%k7}	# AVX512IFMA
+	vpmadd52luq %xmm4, %xmm5, %xmm6{%k7}	# AVX512IFMA + AVX512VL
+	vpmadd52luq %ymm4, %ymm5, %ymm6{%k7}	# AVX512IFMA + AVX512VL
+	vgatherpf0dpd 23(%ebp,%ymm7,8){%k1}	# AVX512PF
+	vpermb %zmm4, %zmm5, %zmm6{%k7}		# AVX512VBMI
+	vpermb %xmm4, %xmm5, %xmm6{%k7}		# AVX512VBMI + AVX512VL
+	vpermb %ymm4, %ymm5, %ymm6{%k7}		# AVX512VBMI + AVX512VL
+
+	.arch .noavx512dq
+	vpabsb %zmm5, %zmm6{%k7}		# AVX512BW
+	vpabsb %xmm5, %xmm6{%k7}		# AVX512BW + AVX512VL
+	vpabsb %ymm5, %ymm6{%k7}		# AVX512BW + AVX512VL
+	vpconflictd %zmm5, %zmm6		# AVX412CD
+	vpconflictd %xmm5, %xmm6		# AVX412CD + AVX512VL
+	vpconflictd %ymm5, %ymm6		# AVX412CD + AVX512VL
+	vcvtpd2qq (%ecx), %zmm6{%k7}		# AVX512DQ
+	vcvtpd2qq (%ecx), %xmm6{%k7}		# AVX512DQ + AVX512VL
+	vcvtpd2qq (%ecx), %ymm6{%k7}		# AVX512DQ + AVX512VL
+	vexp2ps %zmm5, %zmm6{%k7}		# AVX512ER
+	vaddpd %zmm4, %zmm5, %zmm6{%k7}		# AVX512F
+	vaddpd %xmm4, %xmm5, %xmm6{%k7}		# AVX512F + AVX512VL
+	vaddpd %ymm4, %ymm5, %ymm6{%k7}		# AVX512F + AVX512VL
+	vpmadd52luq %zmm4, %zmm5, %zmm6{%k7}	# AVX512IFMA
+	vpmadd52luq %xmm4, %xmm5, %xmm6{%k7}	# AVX512IFMA + AVX512VL
+	vpmadd52luq %ymm4, %ymm5, %ymm6{%k7}	# AVX512IFMA + AVX512VL
+	vgatherpf0dpd 23(%ebp,%ymm7,8){%k1}	# AVX512PF
+	vpermb %zmm4, %zmm5, %zmm6{%k7}		# AVX512VBMI
+	vpermb %xmm4, %xmm5, %xmm6{%k7}		# AVX512VBMI + AVX512VL
+	vpermb %ymm4, %ymm5, %ymm6{%k7}		# AVX512VBMI + AVX512VL
+
+	.arch .noavx512er
+	vpabsb %zmm5, %zmm6{%k7}		# AVX512BW
+	vpabsb %xmm5, %xmm6{%k7}		# AVX512BW + AVX512VL
+	vpabsb %ymm5, %ymm6{%k7}		# AVX512BW + AVX512VL
+	vpconflictd %zmm5, %zmm6		# AVX412CD
+	vpconflictd %xmm5, %xmm6		# AVX412CD + AVX512VL
+	vpconflictd %ymm5, %ymm6		# AVX412CD + AVX512VL
+	vcvtpd2qq (%ecx), %zmm6{%k7}		# AVX512DQ
+	vcvtpd2qq (%ecx), %xmm6{%k7}		# AVX512DQ + AVX512VL
+	vcvtpd2qq (%ecx), %ymm6{%k7}		# AVX512DQ + AVX512VL
+	vexp2ps %zmm5, %zmm6{%k7}		# AVX512ER
+	vaddpd %zmm4, %zmm5, %zmm6{%k7}		# AVX512F
+	vaddpd %xmm4, %xmm5, %xmm6{%k7}		# AVX512F + AVX512VL
+	vaddpd %ymm4, %ymm5, %ymm6{%k7}		# AVX512F + AVX512VL
+	vpmadd52luq %zmm4, %zmm5, %zmm6{%k7}	# AVX512IFMA
+	vpmadd52luq %xmm4, %xmm5, %xmm6{%k7}	# AVX512IFMA + AVX512VL
+	vpmadd52luq %ymm4, %ymm5, %ymm6{%k7}	# AVX512IFMA + AVX512VL
+	vgatherpf0dpd 23(%ebp,%ymm7,8){%k1}	# AVX512PF
+	vpermb %zmm4, %zmm5, %zmm6{%k7}		# AVX512VBMI
+	vpermb %xmm4, %xmm5, %xmm6{%k7}		# AVX512VBMI + AVX512VL
+	vpermb %ymm4, %ymm5, %ymm6{%k7}		# AVX512VBMI + AVX512VL
+
+	.arch .noavx512ifma
+	vpabsb %zmm5, %zmm6{%k7}		# AVX512BW
+	vpabsb %xmm5, %xmm6{%k7}		# AVX512BW + AVX512VL
+	vpabsb %ymm5, %ymm6{%k7}		# AVX512BW + AVX512VL
+	vpconflictd %zmm5, %zmm6		# AVX412CD
+	vpconflictd %xmm5, %xmm6		# AVX412CD + AVX512VL
+	vpconflictd %ymm5, %ymm6		# AVX412CD + AVX512VL
+	vcvtpd2qq (%ecx), %zmm6{%k7}		# AVX512DQ
+	vcvtpd2qq (%ecx), %xmm6{%k7}		# AVX512DQ + AVX512VL
+	vcvtpd2qq (%ecx), %ymm6{%k7}		# AVX512DQ + AVX512VL
+	vexp2ps %zmm5, %zmm6{%k7}		# AVX512ER
+	vaddpd %zmm4, %zmm5, %zmm6{%k7}		# AVX512F
+	vaddpd %xmm4, %xmm5, %xmm6{%k7}		# AVX512F + AVX512VL
+	vaddpd %ymm4, %ymm5, %ymm6{%k7}		# AVX512F + AVX512VL
+	vpmadd52luq %zmm4, %zmm5, %zmm6{%k7}	# AVX512IFMA
+	vpmadd52luq %xmm4, %xmm5, %xmm6{%k7}	# AVX512IFMA + AVX512VL
+	vpmadd52luq %ymm4, %ymm5, %ymm6{%k7}	# AVX512IFMA + AVX512VL
+	vgatherpf0dpd 23(%ebp,%ymm7,8){%k1}	# AVX512PF
+	vpermb %zmm4, %zmm5, %zmm6{%k7}		# AVX512VBMI
+	vpermb %xmm4, %xmm5, %xmm6{%k7}		# AVX512VBMI + AVX512VL
+	vpermb %ymm4, %ymm5, %ymm6{%k7}		# AVX512VBMI + AVX512VL
+
+	.arch .noavx512pf
+	vpabsb %zmm5, %zmm6{%k7}		# AVX512BW
+	vpabsb %xmm5, %xmm6{%k7}		# AVX512BW + AVX512VL
+	vpabsb %ymm5, %ymm6{%k7}		# AVX512BW + AVX512VL
+	vpconflictd %zmm5, %zmm6		# AVX412CD
+	vpconflictd %xmm5, %xmm6		# AVX412CD + AVX512VL
+	vpconflictd %ymm5, %ymm6		# AVX412CD + AVX512VL
+	vcvtpd2qq (%ecx), %zmm6{%k7}		# AVX512DQ
+	vcvtpd2qq (%ecx), %xmm6{%k7}		# AVX512DQ + AVX512VL
+	vcvtpd2qq (%ecx), %ymm6{%k7}		# AVX512DQ + AVX512VL
+	vexp2ps %zmm5, %zmm6{%k7}		# AVX512ER
+	vaddpd %zmm4, %zmm5, %zmm6{%k7}		# AVX512F
+	vaddpd %xmm4, %xmm5, %xmm6{%k7}		# AVX512F + AVX512VL
+	vaddpd %ymm4, %ymm5, %ymm6{%k7}		# AVX512F + AVX512VL
+	vpmadd52luq %zmm4, %zmm5, %zmm6{%k7}	# AVX512IFMA
+	vpmadd52luq %xmm4, %xmm5, %xmm6{%k7}	# AVX512IFMA + AVX512VL
+	vpmadd52luq %ymm4, %ymm5, %ymm6{%k7}	# AVX512IFMA + AVX512VL
+	vgatherpf0dpd 23(%ebp,%ymm7,8){%k1}	# AVX512PF
+	vpermb %zmm4, %zmm5, %zmm6{%k7}		# AVX512VBMI
+	vpermb %xmm4, %xmm5, %xmm6{%k7}		# AVX512VBMI + AVX512VL
+	vpermb %ymm4, %ymm5, %ymm6{%k7}		# AVX512VBMI + AVX512VL
+
+	.arch .noavx512vbmi
+	vpabsb %zmm5, %zmm6{%k7}		# AVX512BW
+	vpabsb %xmm5, %xmm6{%k7}		# AVX512BW + AVX512VL
+	vpabsb %ymm5, %ymm6{%k7}		# AVX512BW + AVX512VL
+	vpconflictd %zmm5, %zmm6		# AVX412CD
+	vpconflictd %xmm5, %xmm6		# AVX412CD + AVX512VL
+	vpconflictd %ymm5, %ymm6		# AVX412CD + AVX512VL
+	vcvtpd2qq (%ecx), %zmm6{%k7}		# AVX512DQ
+	vcvtpd2qq (%ecx), %xmm6{%k7}		# AVX512DQ + AVX512VL
+	vcvtpd2qq (%ecx), %ymm6{%k7}		# AVX512DQ + AVX512VL
+	vexp2ps %zmm5, %zmm6{%k7}		# AVX512ER
+	vaddpd %zmm4, %zmm5, %zmm6{%k7}		# AVX512F
+	vaddpd %xmm4, %xmm5, %xmm6{%k7}		# AVX512F + AVX512VL
+	vaddpd %ymm4, %ymm5, %ymm6{%k7}		# AVX512F + AVX512VL
+	vpmadd52luq %zmm4, %zmm5, %zmm6{%k7}	# AVX512IFMA
+	vpmadd52luq %xmm4, %xmm5, %xmm6{%k7}	# AVX512IFMA + AVX512VL
+	vpmadd52luq %ymm4, %ymm5, %ymm6{%k7}	# AVX512IFMA + AVX512VL
+	vgatherpf0dpd 23(%ebp,%ymm7,8){%k1}	# AVX512PF
+	vpermb %zmm4, %zmm5, %zmm6{%k7}		# AVX512VBMI
+	vpermb %xmm4, %xmm5, %xmm6{%k7}		# AVX512VBMI + AVX512VL
+	vpermb %ymm4, %ymm5, %ymm6{%k7}		# AVX512VBMI + AVX512VL
+
+	.arch .noavx512f
+	vpabsb %zmm5, %zmm6{%k7}		# AVX512BW
+	vpabsb %xmm5, %xmm6{%k7}		# AVX512BW + AVX512VL
+	vpabsb %ymm5, %ymm6{%k7}		# AVX512BW + AVX512VL
+	vpconflictd %zmm5, %zmm6		# AVX412CD
+	vpconflictd %xmm5, %xmm6		# AVX412CD + AVX512VL
+	vpconflictd %ymm5, %ymm6		# AVX412CD + AVX512VL
+	vcvtpd2qq (%ecx), %zmm6{%k7}		# AVX512DQ
+	vcvtpd2qq (%ecx), %xmm6{%k7}		# AVX512DQ + AVX512VL
+	vcvtpd2qq (%ecx), %ymm6{%k7}		# AVX512DQ + AVX512VL
+	vexp2ps %zmm5, %zmm6{%k7}		# AVX512ER
+	vaddpd %zmm4, %zmm5, %zmm6{%k7}		# AVX512F
+	vaddpd %xmm4, %xmm5, %xmm6{%k7}		# AVX512F + AVX512VL
+	vaddpd %ymm4, %ymm5, %ymm6{%k7}		# AVX512F + AVX512VL
+	vpmadd52luq %zmm4, %zmm5, %zmm6{%k7}	# AVX512IFMA
+	vpmadd52luq %xmm4, %xmm5, %xmm6{%k7}	# AVX512IFMA + AVX512VL
+	vpmadd52luq %ymm4, %ymm5, %ymm6{%k7}	# AVX512IFMA + AVX512VL
+	vgatherpf0dpd 23(%ebp,%ymm7,8){%k1}	# AVX512PF
+	vpermb %zmm4, %zmm5, %zmm6{%k7}		# AVX512VBMI
+	vpermb %xmm4, %xmm5, %xmm6{%k7}		# AVX512VBMI + AVX512VL
+	vpermb %ymm4, %ymm5, %ymm6{%k7}		# AVX512VBMI + AVX512VL
+
+	vpabsb %xmm5, %xmm6
+	vpabsb %ymm5, %ymm6
+	vaddpd %xmm4, %xmm5, %xmm6
+	vaddpd %ymm4, %ymm5, %ymm6
+	pabsb %xmm5, %xmm6
+	addpd %xmm4, %xmm6
+
+	.p2align 4
diff --git a/gas/testsuite/gas/i386/noavx512-2.l b/gas/testsuite/gas/i386/noavx512-2.l
new file mode 100644
index 0000000..08febef
--- /dev/null
+++ b/gas/testsuite/gas/i386/noavx512-2.l
@@ -0,0 +1,105 @@
+.*: Assembler messages:
+.*:26: Error: .*unsupported masking.*
+.*:27: Error: .*unsupported masking.*
+.*:29: Error: .*unsupported instruction.*
+.*:30: Error: .*unsupported instruction.*
+.*:32: Error: .*unsupported instruction.*
+.*:33: Error: .*unsupported instruction.*
+.*:36: Error: .*unsupported masking.*
+.*:37: Error: .*unsupported masking.*
+.*:39: Error: .*unsupported instruction.*
+.*:40: Error: .*unsupported instruction.*
+.*:43: Error: .*unsupported instruction.*
+.*:44: Error: .*unsupported instruction.*
+GAS LISTING .*
+#...
+[ 	]*1[ 	]+\# Test \.arch \.noavx512vl
+[ 	]*2[ 	]+\.text
+[ 	]*3[ 	]+\?\?\?\? 62F27D4F 		vpabsb %zmm5, %zmm6\{%k7\}		\# AVX512BW
+[ 	]*3[ 	]+1CF5
+[ 	]*4[ 	]+\?\?\?\? 62F27D0F 		vpabsb %xmm5, %xmm6\{%k7\}		\# AVX512BW \+ AVX512VL
+[ 	]*4[ 	]+1CF5
+[ 	]*5[ 	]+\?\?\?\? 62F27D2F 		vpabsb %ymm5, %ymm6\{%k7\}		\# AVX512BW \+ AVX512VL
+[ 	]*5[ 	]+1CF5
+[ 	]*6[ 	]+\?\?\?\? 62F27D48 		vpconflictd %zmm5, %zmm6		\# AVX412CD
+[ 	]*6[ 	]+C4F5
+[ 	]*7[ 	]+\?\?\?\? 62F27D08 		vpconflictd %xmm5, %xmm6		\# AVX412CD \+ AVX512VL
+[ 	]*7[ 	]+C4F5
+[ 	]*8[ 	]+\?\?\?\? 62F27D28 		vpconflictd %ymm5, %ymm6		\# AVX412CD \+ AVX512VL
+[ 	]*8[ 	]+C4F5
+[ 	]*9[ 	]+\?\?\?\? 62F1FD4F 		vcvtpd2qq \(%ecx\), %zmm6\{%k7\}		\# AVX512DQ
+[ 	]*9[ 	]+7B31
+[ 	]*10[ 	]+\?\?\?\? 62F1FD0F 		vcvtpd2qq \(%ecx\), %xmm6\{%k7\}		\# AVX512DQ \+ AVX512VL
+[ 	]*10[ 	]+7B31
+[ 	]*11[ 	]+\?\?\?\? 62F1FD2F 		vcvtpd2qq \(%ecx\), %ymm6\{%k7\}		\# AVX512DQ \+ AVX512VL
+[ 	]*11[ 	]+7B31
+[ 	]*12[ 	]+\?\?\?\? 62F27D4F 		vexp2ps %zmm5, %zmm6\{%k7\}		\# AVX512ER
+[ 	]*12[ 	]+C8F5
+[ 	]*13[ 	]+\?\?\?\? 62F1D54F 		vaddpd %zmm4, %zmm5, %zmm6\{%k7\}		\# AVX512F
+[ 	]*13[ 	]+58F4
+[ 	]*14[ 	]+\?\?\?\? 62F1D50F 		vaddpd %xmm4, %xmm5, %xmm6\{%k7\}		\# AVX512F \+ AVX512VL
+[ 	]*14[ 	]+58F4
+[ 	]*15[ 	]+\?\?\?\? 62F1D52F 		vaddpd %ymm4, %ymm5, %ymm6\{%k7\}		\# AVX512F \+ AVX512VL
+[ 	]*15[ 	]+58F4
+[ 	]*16[ 	]+\?\?\?\? 62F2D54F 		vpmadd52luq %zmm4, %zmm5, %zmm6\{%k7\}	\# AVX512IFMA
+[ 	]*16[ 	]+B4F4
+[ 	]*17[ 	]+\?\?\?\? 62F2D50F 		vpmadd52luq %xmm4, %xmm5, %xmm6\{%k7\}	\# AVX512IFMA \+ AVX512VL
+[ 	]*17[ 	]+B4F4
+[ 	]*18[ 	]+\?\?\?\? 62F2D52F 		vpmadd52luq %ymm4, %ymm5, %ymm6\{%k7\}	\# AVX512IFMA \+ AVX512VL
+[ 	]*18[ 	]+B4F4
+[ 	]*19[ 	]+\?\?\?\? 62F2FD49 		vgatherpf0dpd 23\(%ebp,%ymm7,8\)\{%k1\}	\# AVX512PF
+[ 	]*19[ 	]+C68CFD17 
+[ 	]*19[ 	]+000000
+[ 	]*20[ 	]+\?\?\?\? 62F2554F 		vpermb %zmm4, %zmm5, %zmm6\{%k7\}		\# AVX512VBMI
+[ 	]*20[ 	]+8DF4
+[ 	]*21[ 	]+\?\?\?\? 62F2550F 		vpermb %xmm4, %xmm5, %xmm6\{%k7\}		\# AVX512VBMI \+ AVX512VL
+[ 	]*21[ 	]+8DF4
+[ 	]*22[ 	]+\?\?\?\? 62F2552F 		vpermb %ymm4, %ymm5, %ymm6\{%k7\}		\# AVX512VBMI \+ AVX512VL
+[ 	]*22[ 	]+8DF4
+[ 	]*23[ 	]+
+[ 	]*24[ 	]+\.arch \.noavx512vl
+[ 	]*25[ 	]+\?\?\?\? 62F27D4F 		vpabsb %zmm5, %zmm6\{%k7\}		\# AVX512BW
+[ 	]*25[ 	]+1CF5
+[ 	]*26[ 	]+vpabsb %xmm5, %xmm6\{%k7\}		\# AVX512BW \+ AVX512VL
+[ 	]*27[ 	]+vpabsb %ymm5, %ymm6\{%k7\}		\# AVX512BW \+ AVX512VL
+[ 	]*28[ 	]+\?\?\?\? 62F27D48 		vpconflictd %zmm5, %zmm6		\# AVX412CD
+[ 	]*28[ 	]+C4F5
+[ 	]*29[ 	]+vpconflictd %xmm5, %xmm6		\# AVX412CD \+ AVX512VL
+[ 	]*30[ 	]+vpconflictd %ymm5, %ymm6		\# AVX412CD \+ AVX512VL
+[ 	]*31[ 	]+\?\?\?\? 62F1FD4F 		vcvtpd2qq \(%ecx\), %zmm6\{%k7\}		\# AVX512DQ
+[ 	]*31[ 	]+7B31
+[ 	]*32[ 	]+vcvtpd2qq \(%ecx\), %xmm6\{%k7\}		\# AVX512DQ \+ AVX512VL
+[ 	]*33[ 	]+vcvtpd2qq \(%ecx\), %ymm6\{%k7\}		\# AVX512DQ \+ AVX512VL
+\fGAS LISTING .*
+
+
+[ 	]*34[ 	]+\?\?\?\? 62F27D4F 		vexp2ps %zmm5, %zmm6\{%k7\}		\# AVX512ER
+[ 	]*34[ 	]+C8F5
+[ 	]*35[ 	]+\?\?\?\? 62F1D54F 		vaddpd %zmm4, %zmm5, %zmm6\{%k7\}		\# AVX512F
+[ 	]*35[ 	]+58F4
+[ 	]*36[ 	]+vaddpd %xmm4, %xmm5, %xmm6\{%k7\}		\# AVX512F \+ AVX512VL
+[ 	]*37[ 	]+vaddpd %ymm4, %ymm5, %ymm6\{%k7\}		\# AVX512F \+ AVX512VL
+[ 	]*38[ 	]+\?\?\?\? 62F2D54F 		vpmadd52luq %zmm4, %zmm5, %zmm6\{%k7\}	\# AVX512IFMA
+[ 	]*38[ 	]+B4F4
+[ 	]*39[ 	]+vpmadd52luq %xmm4, %xmm5, %xmm6\{%k7\}	\# AVX512IFMA \+ AVX512VL
+[ 	]*40[ 	]+vpmadd52luq %ymm4, %ymm5, %ymm6\{%k7\}	\# AVX512IFMA \+ AVX512VL
+[ 	]*41[ 	]+\?\?\?\? 62F2FD49 		vgatherpf0dpd 23\(%ebp,%ymm7,8\)\{%k1\}	\# AVX512PF
+[ 	]*41[ 	]+C68CFD17 
+[ 	]*41[ 	]+000000
+[ 	]*42[ 	]+\?\?\?\? 62F2554F 		vpermb %zmm4, %zmm5, %zmm6\{%k7\}		\# AVX512VBMI
+[ 	]*42[ 	]+8DF4
+[ 	]*43[ 	]+vpermb %xmm4, %xmm5, %xmm6\{%k7\}		\# AVX512VBMI \+ AVX512VL
+[ 	]*44[ 	]+vpermb %ymm4, %ymm5, %ymm6\{%k7\}		\# AVX512VBMI \+ AVX512VL
+[ 	]*45[ 	]+
+[ 	]*46[ 	]+\?\?\?\? C4E2791C 		vpabsb %xmm5, %xmm6
+[ 	]*46[ 	]+F5
+[ 	]*47[ 	]+\?\?\?\? C4E27D1C 		vpabsb %ymm5, %ymm6
+[ 	]*47[ 	]+F5
+[ 	]*48[ 	]+\?\?\?\? C5D158F4 		vaddpd %xmm4, %xmm5, %xmm6
+[ 	]*49[ 	]+\?\?\?\? C5D558F4 		vaddpd %ymm4, %ymm5, %ymm6
+[ 	]*50[ 	]+\?\?\?\? 660F381C 		pabsb %xmm5, %xmm6
+[ 	]*50[ 	]+F5
+[ 	]*51[ 	]+\?\?\?\? 660F58F4 		addpd %xmm4, %xmm6
+[ 	]*52[ 	]+
+[ 	]*53[ 	]+\?\?\?\? 0F1F00   		\.p2align 4
+#pass
diff --git a/gas/testsuite/gas/i386/noavx512-2.s b/gas/testsuite/gas/i386/noavx512-2.s
new file mode 100644
index 0000000..b9ef95c
--- /dev/null
+++ b/gas/testsuite/gas/i386/noavx512-2.s
@@ -0,0 +1,53 @@
+# Test .arch .noavx512vl
+	.text
+	vpabsb %zmm5, %zmm6{%k7}		# AVX512BW
+	vpabsb %xmm5, %xmm6{%k7}		# AVX512BW + AVX512VL
+	vpabsb %ymm5, %ymm6{%k7}		# AVX512BW + AVX512VL
+	vpconflictd %zmm5, %zmm6		# AVX412CD
+	vpconflictd %xmm5, %xmm6		# AVX412CD + AVX512VL
+	vpconflictd %ymm5, %ymm6		# AVX412CD + AVX512VL
+	vcvtpd2qq (%ecx), %zmm6{%k7}		# AVX512DQ
+	vcvtpd2qq (%ecx), %xmm6{%k7}		# AVX512DQ + AVX512VL
+	vcvtpd2qq (%ecx), %ymm6{%k7}		# AVX512DQ + AVX512VL
+	vexp2ps %zmm5, %zmm6{%k7}		# AVX512ER
+	vaddpd %zmm4, %zmm5, %zmm6{%k7}		# AVX512F
+	vaddpd %xmm4, %xmm5, %xmm6{%k7}		# AVX512F + AVX512VL
+	vaddpd %ymm4, %ymm5, %ymm6{%k7}		# AVX512F + AVX512VL
+	vpmadd52luq %zmm4, %zmm5, %zmm6{%k7}	# AVX512IFMA
+	vpmadd52luq %xmm4, %xmm5, %xmm6{%k7}	# AVX512IFMA + AVX512VL
+	vpmadd52luq %ymm4, %ymm5, %ymm6{%k7}	# AVX512IFMA + AVX512VL
+	vgatherpf0dpd 23(%ebp,%ymm7,8){%k1}	# AVX512PF
+	vpermb %zmm4, %zmm5, %zmm6{%k7}		# AVX512VBMI
+	vpermb %xmm4, %xmm5, %xmm6{%k7}		# AVX512VBMI + AVX512VL
+	vpermb %ymm4, %ymm5, %ymm6{%k7}		# AVX512VBMI + AVX512VL
+
+	.arch .noavx512vl
+	vpabsb %zmm5, %zmm6{%k7}		# AVX512BW
+	vpabsb %xmm5, %xmm6{%k7}		# AVX512BW + AVX512VL
+	vpabsb %ymm5, %ymm6{%k7}		# AVX512BW + AVX512VL
+	vpconflictd %zmm5, %zmm6		# AVX412CD
+	vpconflictd %xmm5, %xmm6		# AVX412CD + AVX512VL
+	vpconflictd %ymm5, %ymm6		# AVX412CD + AVX512VL
+	vcvtpd2qq (%ecx), %zmm6{%k7}		# AVX512DQ
+	vcvtpd2qq (%ecx), %xmm6{%k7}		# AVX512DQ + AVX512VL
+	vcvtpd2qq (%ecx), %ymm6{%k7}		# AVX512DQ + AVX512VL
+	vexp2ps %zmm5, %zmm6{%k7}		# AVX512ER
+	vaddpd %zmm4, %zmm5, %zmm6{%k7}		# AVX512F
+	vaddpd %xmm4, %xmm5, %xmm6{%k7}		# AVX512F + AVX512VL
+	vaddpd %ymm4, %ymm5, %ymm6{%k7}		# AVX512F + AVX512VL
+	vpmadd52luq %zmm4, %zmm5, %zmm6{%k7}	# AVX512IFMA
+	vpmadd52luq %xmm4, %xmm5, %xmm6{%k7}	# AVX512IFMA + AVX512VL
+	vpmadd52luq %ymm4, %ymm5, %ymm6{%k7}	# AVX512IFMA + AVX512VL
+	vgatherpf0dpd 23(%ebp,%ymm7,8){%k1}	# AVX512PF
+	vpermb %zmm4, %zmm5, %zmm6{%k7}		# AVX512VBMI
+	vpermb %xmm4, %xmm5, %xmm6{%k7}		# AVX512VBMI + AVX512VL
+	vpermb %ymm4, %ymm5, %ymm6{%k7}		# AVX512VBMI + AVX512VL
+
+	vpabsb %xmm5, %xmm6
+	vpabsb %ymm5, %ymm6
+	vaddpd %xmm4, %xmm5, %xmm6
+	vaddpd %ymm4, %ymm5, %ymm6
+	pabsb %xmm5, %xmm6
+	addpd %xmm4, %xmm6
+
+	.p2align 4
diff --git a/opcodes/i386-gen.c b/opcodes/i386-gen.c
index f1e8142..6ebad47 100644
--- a/opcodes/i386-gen.c
+++ b/opcodes/i386-gen.c
@@ -285,6 +285,24 @@ static initializer cpu_flag_init[] =
     "CPU_ANY_AVX2_FLAGS|CpuF16C|CpuFMA|CpuFMA4|CpuXOP|CpuAVX" },
   { "CPU_ANY_AVX2_FLAGS",
     "CpuAVX2" },
+  { "CPU_ANY_AVX512F_FLAGS",
+    "CpuVREX|CpuRegZMM|CpuRegMask|CpuAVX512CD|CpuAVX512ER|CpuAVX512PF|CpuAVX512DQ|CpuAVX512BW|CpuAVX512VL|CpuAVX512IFMA|CpuAVX512VBMI|CpuAVX512F" },
+  { "CPU_ANY_AVX512CD_FLAGS",
+    "CpuAVX512CD" },
+  { "CPU_ANY_AVX512ER_FLAGS",
+    "CpuAVX512ER" },
+  { "CPU_ANY_AVX512PF_FLAGS",
+    "CpuAVX512PF" },
+  { "CPU_ANY_AVX512DQ_FLAGS",
+    "CpuAVX512DQ" },
+  { "CPU_ANY_AVX512BW_FLAGS",
+    "CpuAVX512BW" },
+  { "CPU_ANY_AVX512VL_FLAGS",
+    "CpuAVX512VL" },
+  { "CPU_ANY_AVX512IFMA_FLAGS",
+    "CpuAVX512IFMA" },
+  { "CPU_ANY_AVX512VBMI_FLAGS",
+    "CpuAVX512VBMI" },
 };
 
 static initializer operand_type_init[] =
diff --git a/opcodes/i386-init.h b/opcodes/i386-init.h
index e522d61..10bc4f0 100644
--- a/opcodes/i386-init.h
+++ b/opcodes/i386-init.h
@@ -858,6 +858,69 @@
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
 
+#define CPU_ANY_AVX512F_FLAGS \
+  { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, \
+      1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 } }
+
+#define CPU_ANY_AVX512CD_FLAGS \
+  { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
+
+#define CPU_ANY_AVX512ER_FLAGS \
+  { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
+
+#define CPU_ANY_AVX512PF_FLAGS \
+  { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
+
+#define CPU_ANY_AVX512DQ_FLAGS \
+  { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
+
+#define CPU_ANY_AVX512BW_FLAGS \
+  { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
+
+#define CPU_ANY_AVX512VL_FLAGS \
+  { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
+
+#define CPU_ANY_AVX512IFMA_FLAGS \
+  { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
+
+#define CPU_ANY_AVX512VBMI_FLAGS \
+  { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
+      1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
+
 
 #define OPERAND_TYPE_NONE \
   { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
-- 
2.5.5


^ permalink raw reply	[flat|nested] 18+ messages in thread

end of thread, other threads:[~2016-05-29 15:04 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-05-21 16:54 [PATCH] Allow setting CpuVRex bit in .arch directive Jakub Jelinek
2016-05-21 17:06 ` Jakub Jelinek
2016-05-24 17:24   ` H.J. Lu
2016-05-24 17:49     ` Jakub Jelinek
2016-05-24 19:02       ` H.J. Lu
2016-05-24 19:07         ` Jakub Jelinek
2016-05-24 20:36           ` H.J. Lu
2016-05-25 16:35             ` H.J. Lu
2016-05-25 17:26               ` H.J. Lu
2016-05-25 17:54             ` H.J. Lu
2016-05-25 17:58               ` Jakub Jelinek
2016-05-25 18:26                 ` H.J. Lu
2016-05-25 18:39                   ` Jakub Jelinek
2016-05-25 19:12                     ` H.J. Lu
2016-05-26  0:09                       ` H.J. Lu
2016-05-29 15:04                         ` H.J. Lu
2016-05-25 23:22         ` H.J. Lu
2016-05-26  0:57           ` Alan Modra

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).