public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* [committed, PATCH] Add support for Intel CET instructions
@ 2017-03-06 23:29 H.J. Lu
  2017-03-07  8:59 ` Jan Beulich
  2017-03-09 15:45 ` H.J. Lu
  0 siblings, 2 replies; 4+ messages in thread
From: H.J. Lu @ 2017-03-06 23:29 UTC (permalink / raw)
  To: binutils

Support Intel Control-flow Enforcement Technology (CET) instructions:

https://software.intel.com/sites/default/files/managed/4d/2a/control-flow-enforcement-technology-preview.pdf

gas/

	* config/tc-i386.c (cpu_arch): Add .cet.
	* doc/c-i386.texi: Document cet.
	* testsuite/gas/i386/cet-intel.d: New file.
	* testsuite/gas/i386/cet.d: Likewise.
	* testsuite/gas/i386/cet.s: Likewise.
	* testsuite/gas/i386/x86-64-cet-intel.d: Likewise.
	* testsuite/gas/i386/x86-64-cet.d: Likewise.
	* testsuite/gas/i386/x86-64-cet.s: Likewise.
	* testsuite/gas/i386/i386.exp: Run Intel CET tests.

opcodes/

	* i386-dis.c (REG_0F1E_MOD_3): New enum.
	(MOD_0F1E_PREFIX_1): Likewise.
	(MOD_0F38F5_PREFIX_2): Likewise.
	(MOD_0F38F6_PREFIX_0): Likewise.
	(RM_0F1E_MOD_3_REG_7): Likewise.
	(PREFIX_MOD_0_0F01_REG_5): Likewise.
	(PREFIX_MOD_3_0F01_REG_5_RM_1): Likewise.
	(PREFIX_MOD_3_0F01_REG_5_RM_2): Likewise.
	(PREFIX_0F1E): Likewise.
	(PREFIX_MOD_0_0FAE_REG_5): Likewise.
	(PREFIX_0F38F5): Likewise.
	(dis386_twobyte): Use PREFIX_0F1E.
	(reg_table): Add REG_0F1E_MOD_3.
	(prefix_table): Add PREFIX_MOD_0_0F01_REG_5,
	PREFIX_MOD_3_0F01_REG_5_RM_1, PREFIX_MOD_3_0F01_REG_5_RM_2,
	PREFIX_0F1E, PREFIX_MOD_0_0FAE_REG_5 and PREFIX_0F38F5.  Update
	PREFIX_0FAE_REG_6 and PREFIX_0F38F6.
	(three_byte_table): Use PREFIX_0F38F5.
	(mod_table): Use PREFIX_MOD_0_0F01_REG_5, PREFIX_MOD_0_0FAE_REG_5.
	Add MOD_0F1E_PREFIX_1, MOD_0F38F5_PREFIX_2, MOD_0F38F6_PREFIX_0.
	(rm_table): Add MOD_0F38F5_PREFIX_2, MOD_0F38F6_PREFIX_0,
	RM_0F1E_MOD_3_REG_7.  Use PREFIX_MOD_3_0F01_REG_5_RM_1 and
	PREFIX_MOD_3_0F01_REG_5_RM_2.
	* i386-gen.c (cpu_flag_init): Add CPU_CET_FLAGS.
	(cpu_flags): Add CpuCET.
	* i386-opc.h (CpuCET): New enum.
	(CpuUnused): Commented out.
	(i386_cpu_flags): Add cpucet.
	* i386-opc.tbl: Add Intel CET instructions.
	* i386-init.h: Regenerated.
	* i386-tbl.h: Likewise.
---
 gas/ChangeLog                             |  12 +
 gas/config/tc-i386.c                      |   2 +
 gas/doc/c-i386.texi                       |   2 +
 gas/testsuite/gas/i386/cet-intel.d        |  31 ++
 gas/testsuite/gas/i386/cet.d              |  29 ++
 gas/testsuite/gas/i386/cet.s              |  25 +
 gas/testsuite/gas/i386/i386.exp           |   4 +
 gas/testsuite/gas/i386/x86-64-cet-intel.d |  38 ++
 gas/testsuite/gas/i386/x86-64-cet.d       |  37 ++
 gas/testsuite/gas/i386/x86-64-cet.s       |  33 ++
 opcodes/ChangeLog                         |  34 ++
 opcodes/i386-dis.c                        | 105 ++++-
 opcodes/i386-gen.c                        |   3 +
 opcodes/i386-init.h                       | 119 ++---
 opcodes/i386-opc.h                        |   5 +
 opcodes/i386-opc.tbl                      |  19 +
 opcodes/i386-tbl.h                        | 730 +++++++++++++++++++-----------
 17 files changed, 894 insertions(+), 334 deletions(-)
 create mode 100644 gas/testsuite/gas/i386/cet-intel.d
 create mode 100644 gas/testsuite/gas/i386/cet.d
 create mode 100644 gas/testsuite/gas/i386/cet.s
 create mode 100644 gas/testsuite/gas/i386/x86-64-cet-intel.d
 create mode 100644 gas/testsuite/gas/i386/x86-64-cet.d
 create mode 100644 gas/testsuite/gas/i386/x86-64-cet.s

diff --git a/gas/ChangeLog b/gas/ChangeLog
index 654b3cb..f9af65d6 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,5 +1,17 @@
 2017-03-06  H.J. Lu  <hongjiu.lu@intel.com>
 
+	* config/tc-i386.c (cpu_arch): Add .cet.
+	* doc/c-i386.texi: Document cet.
+	* testsuite/gas/i386/cet-intel.d: New file.
+	* testsuite/gas/i386/cet.d: Likewise.
+	* testsuite/gas/i386/cet.s: Likewise.
+	* testsuite/gas/i386/x86-64-cet-intel.d: Likewise.
+	* testsuite/gas/i386/x86-64-cet.d: Likewise.
+	* testsuite/gas/i386/x86-64-cet.s: Likewise.
+	* testsuite/gas/i386/i386.exp: Run Intel CET tests.
+
+2017-03-06  H.J. Lu  <hongjiu.lu@intel.com>
+
 	* testsuite/gas/i386/x86-64-mpx-inval-2.s: Force a good alignment.
 	* testsuite/gas/i386/x86-64-mpx-inval-2.l: Expect [0-9A-F]+.
 
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index 12b3032..7deacad 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -978,6 +978,8 @@ static const arch_entry cpu_arch[] =
     CPU_RDPID_FLAGS, 0 },
   { STRING_COMMA_LEN (".ptwrite"), PROCESSOR_UNKNOWN,
     CPU_PTWRITE_FLAGS, 0 },
+  { STRING_COMMA_LEN (".cet"), PROCESSOR_UNKNOWN,
+    CPU_CET_FLAGS, 0 },
 };
 
 static const noarch_entry cpu_noarch[] =
diff --git a/gas/doc/c-i386.texi b/gas/doc/c-i386.texi
index 2cbffb9..0733587 100644
--- a/gas/doc/c-i386.texi
+++ b/gas/doc/c-i386.texi
@@ -167,6 +167,7 @@ accept various extension mnemonics.  For example,
 @code{sha},
 @code{rdpid},
 @code{ptwrite},
+@code{cet},
 @code{prefetchwt1},
 @code{clflushopt},
 @code{se1},
@@ -1198,6 +1199,7 @@ supported on the CPU specified.  The choices for @var{cpu_type} are:
 @item @samp{.avx512vl} @tab @samp{.avx512bw} @tab @samp{.avx512dq} @tab @samp{.avx512ifma}
 @item @samp{.avx512vbmi} @tab @samp{.avx512_4fmaps} @tab @samp{.avx512_4vnniw}
 @item @samp{.avx512_vpopcntdq} @tab @samp{.clwb} @tab @samp{.rdpid} @tab @samp{.ptwrite}
+@item @samp{.cet}
 @item @samp{.3dnow} @tab @samp{.3dnowa} @tab @samp{.sse4a} @tab @samp{.sse5}
 @item @samp{.syscall} @tab @samp{.rdtscp} @tab @samp{.svme} @tab @samp{.abm}
 @item @samp{.lwp} @tab @samp{.fma4} @tab @samp{.xop} @tab @samp{.cx16}
diff --git a/gas/testsuite/gas/i386/cet-intel.d b/gas/testsuite/gas/i386/cet-intel.d
new file mode 100644
index 0000000..a5f5533
--- /dev/null
+++ b/gas/testsuite/gas/i386/cet-intel.d
@@ -0,0 +1,31 @@
+#source: cet.s
+#as: -J
+#objdump: -dw -Mintel
+#name: i386 CET (Intel mode)
+
+.*: +file format .*
+
+Disassembly of section .text:
+
+0+ <_start>:
+ +[a-f0-9]+:	f3 0f 01 e9          	incsspd 
+ +[a-f0-9]+:	f3 0f 1e c9          	rdsspd ecx
+ +[a-f0-9]+:	f3 0f 01 ea          	savessp 
+ +[a-f0-9]+:	f3 0f 01 29          	rstorssp QWORD PTR \[ecx\]
+ +[a-f0-9]+:	0f 38 f6 04 02       	wrssd  \[edx\+eax\*1\],eax
+ +[a-f0-9]+:	66 0f 38 f5 14 2f    	wrussd \[edi\+ebp\*1\],edx
+ +[a-f0-9]+:	f3 0f ae 28          	setssbsy QWORD PTR \[eax\]
+ +[a-f0-9]+:	f3 0f ae 34 04       	clrssbsy QWORD PTR \[esp\+eax\*1\]
+ +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
+ +[a-f0-9]+:	f3 0f 1e fb          	endbr32 
+ +[a-f0-9]+:	f3 0f 01 e9          	incsspd 
+ +[a-f0-9]+:	f3 0f 1e c9          	rdsspd ecx
+ +[a-f0-9]+:	f3 0f 01 ea          	savessp 
+ +[a-f0-9]+:	f3 0f 01 2c 01       	rstorssp QWORD PTR \[ecx\+eax\*1\]
+ +[a-f0-9]+:	0f 38 f6 02          	wrssd  \[edx\],eax
+ +[a-f0-9]+:	66 0f 38 f5 14 2f    	wrussd \[edi\+ebp\*1\],edx
+ +[a-f0-9]+:	f3 0f ae 28          	setssbsy QWORD PTR \[eax\]
+ +[a-f0-9]+:	f3 0f ae 34 04       	clrssbsy QWORD PTR \[esp\+eax\*1\]
+ +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
+ +[a-f0-9]+:	f3 0f 1e fb          	endbr32 
+#pass
diff --git a/gas/testsuite/gas/i386/cet.d b/gas/testsuite/gas/i386/cet.d
new file mode 100644
index 0000000..bb356e4
--- /dev/null
+++ b/gas/testsuite/gas/i386/cet.d
@@ -0,0 +1,29 @@
+#objdump: -dw
+#name: i386 CET
+
+.*:     file format .*
+
+Disassembly of section .text:
+
+0+ <_start>:
+ +[a-f0-9]+:	f3 0f 01 e9          	incsspd 
+ +[a-f0-9]+:	f3 0f 1e c9          	rdsspd %ecx
+ +[a-f0-9]+:	f3 0f 01 ea          	savessp 
+ +[a-f0-9]+:	f3 0f 01 29          	rstorssp \(%ecx\)
+ +[a-f0-9]+:	0f 38 f6 04 02       	wrssd  %eax,\(%edx,%eax,1\)
+ +[a-f0-9]+:	66 0f 38 f5 14 2f    	wrussd %edx,\(%edi,%ebp,1\)
+ +[a-f0-9]+:	f3 0f ae 28          	setssbsy \(%eax\)
+ +[a-f0-9]+:	f3 0f ae 34 04       	clrssbsy \(%esp,%eax,1\)
+ +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
+ +[a-f0-9]+:	f3 0f 1e fb          	endbr32 
+ +[a-f0-9]+:	f3 0f 01 e9          	incsspd 
+ +[a-f0-9]+:	f3 0f 1e c9          	rdsspd %ecx
+ +[a-f0-9]+:	f3 0f 01 ea          	savessp 
+ +[a-f0-9]+:	f3 0f 01 2c 01       	rstorssp \(%ecx,%eax,1\)
+ +[a-f0-9]+:	0f 38 f6 02          	wrssd  %eax,\(%edx\)
+ +[a-f0-9]+:	66 0f 38 f5 14 2f    	wrussd %edx,\(%edi,%ebp,1\)
+ +[a-f0-9]+:	f3 0f ae 28          	setssbsy \(%eax\)
+ +[a-f0-9]+:	f3 0f ae 34 04       	clrssbsy \(%esp,%eax,1\)
+ +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
+ +[a-f0-9]+:	f3 0f 1e fb          	endbr32 
+#pass
diff --git a/gas/testsuite/gas/i386/cet.s b/gas/testsuite/gas/i386/cet.s
new file mode 100644
index 0000000..deb659d
--- /dev/null
+++ b/gas/testsuite/gas/i386/cet.s
@@ -0,0 +1,25 @@
+# Check CET instructions
+	.text
+_start:
+	incsspd
+	rdsspd %ecx
+	savessp
+	rstorssp (%ecx)
+	wrssd %eax, (%edx, %eax)
+	wrussd %edx, (%edi, %ebp)
+	setssbsy (%eax)
+	clrssbsy (%esp, %eax)
+	endbr64
+	endbr32
+
+	.intel_syntax noprefix
+	incsspd
+	rdsspd ecx
+	savessp
+	rstorssp QWORD PTR [ecx + eax]
+	wrssd [edx],eax
+	wrussd [edi + ebp],edx
+	setssbsy QWORD PTR [eax]
+	clrssbsy QWORD PTR [esp + eax]
+	endbr64
+	endbr32
diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp
index 10fe71c..cc5917a 100644
--- a/gas/testsuite/gas/i386/i386.exp
+++ b/gas/testsuite/gas/i386/i386.exp
@@ -382,6 +382,8 @@ if [expr ([istarget "i*86-*-*"] ||  [istarget "x86_64-*-*"]) && [gas_32_check]]
     run_list_test "avx512vl-1" "-al"
     run_list_test "avx512vl-2" "-al"
     run_dump_test "fpu-bad"
+    run_dump_test "cet"
+    run_dump_test "cet-intel"
 
     # These tests require support for 8 and 16 bit relocs,
     # so we only run them for ELF and COFF targets.
@@ -799,6 +801,8 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_64_check]] t
     run_list_test "x86-64-avx512vl-1" "-al"
     run_list_test "x86-64-avx512vl-2" "-al"
     run_dump_test "x86-64-opcode-bad"
+    run_dump_test "x86-64-cet"
+    run_dump_test "x86-64-cet-intel"
 
     if { ![istarget "*-*-aix*"]
       && ![istarget "*-*-beos*"]
diff --git a/gas/testsuite/gas/i386/x86-64-cet-intel.d b/gas/testsuite/gas/i386/x86-64-cet-intel.d
new file mode 100644
index 0000000..07e666f
--- /dev/null
+++ b/gas/testsuite/gas/i386/x86-64-cet-intel.d
@@ -0,0 +1,38 @@
+#source: x86-64-cet.s
+#objdump: -dw -Mintel
+#name: x86-64 CET (Intel mode)
+
+.*: +file format .*
+
+Disassembly of section .text:
+
+0+ <_start>:
+ +[a-f0-9]+:	f3 0f 01 e9          	incsspd 
+ +[a-f0-9]+:	f3 48 0f 01 e9       	incsspq 
+ +[a-f0-9]+:	f3 41 0f 1e cc       	rdsspd r12d
+ +[a-f0-9]+:	f3 48 0f 1e c8       	rdsspq rax
+ +[a-f0-9]+:	f3 0f 01 ea          	savessp 
+ +[a-f0-9]+:	f3 41 0f 01 2c 24    	rstorssp QWORD PTR \[r12\]
+ +[a-f0-9]+:	41 0f 38 f6 04 24    	wrssd  \[r12\],eax
+ +[a-f0-9]+:	4a 0f 38 f6 14 39    	wrssq  \[rcx\+r15\*1\],rdx
+ +[a-f0-9]+:	66 41 0f 38 f5 04 24 	wrussd \[r12\],eax
+ +[a-f0-9]+:	66 48 0f 38 f5 0c 03 	wrussq \[rbx\+rax\*1\],rcx
+ +[a-f0-9]+:	f3 0f ae 28          	setssbsy QWORD PTR \[rax\]
+ +[a-f0-9]+:	f3 42 0f ae 34 26    	clrssbsy QWORD PTR \[rsi\+r12\*1\]
+ +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
+ +[a-f0-9]+:	f3 0f 1e fb          	endbr32 
+ +[a-f0-9]+:	f3 0f 01 e9          	incsspd 
+ +[a-f0-9]+:	f3 48 0f 01 e9       	incsspq 
+ +[a-f0-9]+:	f3 41 0f 1e cc       	rdsspd r12d
+ +[a-f0-9]+:	f3 48 0f 1e c8       	rdsspq rax
+ +[a-f0-9]+:	f3 0f 01 ea          	savessp 
+ +[a-f0-9]+:	f3 41 0f 01 2c 24    	rstorssp QWORD PTR \[r12\]
+ +[a-f0-9]+:	41 0f 38 f6 04 24    	wrssd  \[r12\],eax
+ +[a-f0-9]+:	4a 0f 38 f6 14 39    	wrssq  \[rcx\+r15\*1\],rdx
+ +[a-f0-9]+:	66 41 0f 38 f5 04 24 	wrussd \[r12\],eax
+ +[a-f0-9]+:	66 48 0f 38 f5 0c 03 	wrussq \[rbx\+rax\*1\],rcx
+ +[a-f0-9]+:	f3 0f ae 28          	setssbsy QWORD PTR \[rax\]
+ +[a-f0-9]+:	f3 42 0f ae 34 26    	clrssbsy QWORD PTR \[rsi\+r12\*1\]
+ +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
+ +[a-f0-9]+:	f3 0f 1e fb          	endbr32 
+#pass
diff --git a/gas/testsuite/gas/i386/x86-64-cet.d b/gas/testsuite/gas/i386/x86-64-cet.d
new file mode 100644
index 0000000..7e5b717
--- /dev/null
+++ b/gas/testsuite/gas/i386/x86-64-cet.d
@@ -0,0 +1,37 @@
+#objdump: -dw
+#name: x86-64 CET
+
+.*: +file format .*
+
+Disassembly of section .text:
+
+0+ <_start>:
+ +[a-f0-9]+:	f3 0f 01 e9          	incsspd 
+ +[a-f0-9]+:	f3 48 0f 01 e9       	incsspq 
+ +[a-f0-9]+:	f3 41 0f 1e cc       	rdsspd %r12d
+ +[a-f0-9]+:	f3 48 0f 1e c8       	rdsspq %rax
+ +[a-f0-9]+:	f3 0f 01 ea          	savessp 
+ +[a-f0-9]+:	f3 41 0f 01 2c 24    	rstorssp \(%r12\)
+ +[a-f0-9]+:	41 0f 38 f6 04 24    	wrssd  %eax,\(%r12\)
+ +[a-f0-9]+:	4a 0f 38 f6 14 39    	wrssq  %rdx,\(%rcx,%r15,1\)
+ +[a-f0-9]+:	66 41 0f 38 f5 04 24 	wrussd %eax,\(%r12\)
+ +[a-f0-9]+:	66 48 0f 38 f5 0c 03 	wrussq %rcx,\(%rbx,%rax,1\)
+ +[a-f0-9]+:	f3 0f ae 28          	setssbsy \(%rax\)
+ +[a-f0-9]+:	f3 42 0f ae 34 26    	clrssbsy \(%rsi,%r12,1\)
+ +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
+ +[a-f0-9]+:	f3 0f 1e fb          	endbr32 
+ +[a-f0-9]+:	f3 0f 01 e9          	incsspd 
+ +[a-f0-9]+:	f3 48 0f 01 e9       	incsspq 
+ +[a-f0-9]+:	f3 41 0f 1e cc       	rdsspd %r12d
+ +[a-f0-9]+:	f3 48 0f 1e c8       	rdsspq %rax
+ +[a-f0-9]+:	f3 0f 01 ea          	savessp 
+ +[a-f0-9]+:	f3 41 0f 01 2c 24    	rstorssp \(%r12\)
+ +[a-f0-9]+:	41 0f 38 f6 04 24    	wrssd  %eax,\(%r12\)
+ +[a-f0-9]+:	4a 0f 38 f6 14 39    	wrssq  %rdx,\(%rcx,%r15,1\)
+ +[a-f0-9]+:	66 41 0f 38 f5 04 24 	wrussd %eax,\(%r12\)
+ +[a-f0-9]+:	66 48 0f 38 f5 0c 03 	wrussq %rcx,\(%rbx,%rax,1\)
+ +[a-f0-9]+:	f3 0f ae 28          	setssbsy \(%rax\)
+ +[a-f0-9]+:	f3 42 0f ae 34 26    	clrssbsy \(%rsi,%r12,1\)
+ +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
+ +[a-f0-9]+:	f3 0f 1e fb          	endbr32 
+#pass
diff --git a/gas/testsuite/gas/i386/x86-64-cet.s b/gas/testsuite/gas/i386/x86-64-cet.s
new file mode 100644
index 0000000..15a28d7
--- /dev/null
+++ b/gas/testsuite/gas/i386/x86-64-cet.s
@@ -0,0 +1,33 @@
+# Check 64bit CET instructions
+	.text
+_start:
+	incsspd
+	incsspq
+	rdsspd %r12d
+	rdsspq %rax
+	savessp
+	rstorssp (%r12)
+	wrssd %eax, (%r12)
+	wrssq %rdx, (%rcx, %r15)
+	wrussd %eax, (%r12)
+	wrussq %rcx, (%rbx, %rax)
+	setssbsy (%rax)
+	clrssbsy (%rsi, %r12)
+	endbr64
+	endbr32
+
+	.intel_syntax noprefix
+	incsspd
+	incsspq
+	rdsspd r12d
+	rdsspq rax
+	savessp
+	rstorssp QWORD PTR [r12]
+	wrssd [r12],eax
+	wrssq [rcx+r15],rdx
+	wrussd [r12],eax
+	wrussq [rbx+rax],rcx
+	setssbsy QWORD PTR [rax]
+	clrssbsy QWORD PTR [rsi+r12]
+	endbr64
+	endbr32
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index 27f3235..f2b1bec 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -1,3 +1,37 @@
+2017-03-06  H.J. Lu  <hongjiu.lu@intel.com>
+
+	* i386-dis.c (REG_0F1E_MOD_3): New enum.
+	(MOD_0F1E_PREFIX_1): Likewise.
+	(MOD_0F38F5_PREFIX_2): Likewise.
+	(MOD_0F38F6_PREFIX_0): Likewise.
+	(RM_0F1E_MOD_3_REG_7): Likewise.
+	(PREFIX_MOD_0_0F01_REG_5): Likewise.
+	(PREFIX_MOD_3_0F01_REG_5_RM_1): Likewise.
+	(PREFIX_MOD_3_0F01_REG_5_RM_2): Likewise.
+	(PREFIX_0F1E): Likewise.
+	(PREFIX_MOD_0_0FAE_REG_5): Likewise.
+	(PREFIX_0F38F5): Likewise.
+	(dis386_twobyte): Use PREFIX_0F1E.
+	(reg_table): Add REG_0F1E_MOD_3.
+	(prefix_table): Add PREFIX_MOD_0_0F01_REG_5,
+	PREFIX_MOD_3_0F01_REG_5_RM_1, PREFIX_MOD_3_0F01_REG_5_RM_2,
+	PREFIX_0F1E, PREFIX_MOD_0_0FAE_REG_5 and PREFIX_0F38F5.  Update
+	PREFIX_0FAE_REG_6 and PREFIX_0F38F6.
+	(three_byte_table): Use PREFIX_0F38F5.
+	(mod_table): Use PREFIX_MOD_0_0F01_REG_5, PREFIX_MOD_0_0FAE_REG_5.
+	Add MOD_0F1E_PREFIX_1, MOD_0F38F5_PREFIX_2, MOD_0F38F6_PREFIX_0.
+	(rm_table): Add MOD_0F38F5_PREFIX_2, MOD_0F38F6_PREFIX_0,
+	RM_0F1E_MOD_3_REG_7.  Use PREFIX_MOD_3_0F01_REG_5_RM_1 and
+	PREFIX_MOD_3_0F01_REG_5_RM_2.
+	* i386-gen.c (cpu_flag_init): Add CPU_CET_FLAGS.
+	(cpu_flags): Add CpuCET.
+	* i386-opc.h (CpuCET): New enum.
+	(CpuUnused): Commented out.
+	(i386_cpu_flags): Add cpucet.
+	* i386-opc.tbl: Add Intel CET instructions.
+	* i386-init.h: Regenerated.
+	* i386-tbl.h: Likewise.
+
 2017-03-06  Alan Modra  <amodra@gmail.com>
 
 	PR 21124
diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c
index 76781a0..3980c46 100644
--- a/opcodes/i386-dis.c
+++ b/opcodes/i386-dis.c
@@ -723,6 +723,7 @@ enum
   REG_0F01,
   REG_0F0D,
   REG_0F18,
+  REG_0F1E_MOD_3,
   REG_0F71,
   REG_0F72,
   REG_0F73,
@@ -776,6 +777,7 @@ enum
   MOD_0F1A_PREFIX_0,
   MOD_0F1B_PREFIX_0,
   MOD_0F1B_PREFIX_1,
+  MOD_0F1E_PREFIX_1,
   MOD_0F24,
   MOD_0F26,
   MOD_0F2B_PREFIX_0,
@@ -814,6 +816,8 @@ enum
   MOD_0FE7_PREFIX_2,
   MOD_0FF0_PREFIX_3,
   MOD_0F382A_PREFIX_2,
+  MOD_0F38F5_PREFIX_2,
+  MOD_0F38F6_PREFIX_0,
   MOD_62_32BIT,
   MOD_C4_32BIT,
   MOD_C5_32BIT,
@@ -933,6 +937,7 @@ enum
   RM_0F01_REG_3,
   RM_0F01_REG_5,
   RM_0F01_REG_7,
+  RM_0F1E_MOD_3_REG_7,
   RM_0FAE_REG_5,
   RM_0FAE_REG_6,
   RM_0FAE_REG_7
@@ -941,12 +946,16 @@ enum
 enum
 {
   PREFIX_90 = 0,
+  PREFIX_MOD_0_0F01_REG_5,
+  PREFIX_MOD_3_0F01_REG_5_RM_1,
+  PREFIX_MOD_3_0F01_REG_5_RM_2,
   PREFIX_0F10,
   PREFIX_0F11,
   PREFIX_0F12,
   PREFIX_0F16,
   PREFIX_0F1A,
   PREFIX_0F1B,
+  PREFIX_0F1E,
   PREFIX_0F2A,
   PREFIX_0F2B,
   PREFIX_0F2C,
@@ -985,6 +994,7 @@ enum
   PREFIX_0FAE_REG_3,
   PREFIX_MOD_0_0FAE_REG_4,
   PREFIX_MOD_3_0FAE_REG_4,
+  PREFIX_MOD_0_0FAE_REG_5,
   PREFIX_0FAE_REG_6,
   PREFIX_0FAE_REG_7,
   PREFIX_0FB8,
@@ -1048,6 +1058,7 @@ enum
   PREFIX_0F38DF,
   PREFIX_0F38F0,
   PREFIX_0F38F1,
+  PREFIX_0F38F5,
   PREFIX_0F38F6,
   PREFIX_0F3A08,
   PREFIX_0F3A09,
@@ -2839,7 +2850,7 @@ static const struct dis386 dis386_twobyte[] = {
   { PREFIX_TABLE (PREFIX_0F1B) },
   { "nopQ",		{ Ev }, 0 },
   { "nopQ",		{ Ev }, 0 },
-  { "nopQ",		{ Ev }, 0 },
+  { PREFIX_TABLE (PREFIX_0F1E) },
   { "nopQ",		{ Ev }, 0 },
   /* 20 */
   { "movZ",		{ Rm, Cm }, 0 },
@@ -3589,6 +3600,17 @@ static const struct dis386 reg_table[][8] = {
     { MOD_TABLE (MOD_0F18_REG_6) },
     { MOD_TABLE (MOD_0F18_REG_7) },
   },
+  /* REG_0F1E_MOD_3 */
+  {
+    { "nopQ",		{ Ev }, 0 },
+    { "rdsspK",		{ Rdq }, PREFIX_OPCODE },
+    { "nopQ",		{ Ev }, 0 },
+    { "nopQ",		{ Ev }, 0 },
+    { "nopQ",		{ Ev }, 0 },
+    { "nopQ",		{ Ev }, 0 },
+    { "nopQ",		{ Ev }, 0 },
+    { RM_TABLE (RM_0F1E_MOD_3_REG_7) },
+  },
   /* REG_0F71 */
   {
     { Bad_Opcode },
@@ -3758,6 +3780,24 @@ static const struct dis386 prefix_table[][4] = {
     { NULL, { { NULL, 0 } }, PREFIX_IGNORED }
   },
 
+  /* PREFIX_MOD_0_0F01_REG_5 */
+  {
+    { Bad_Opcode },
+    { "rstorssp",	{ Mq }, PREFIX_OPCODE },
+  },
+
+  /* PREFIX_MOD_3_0F01_REG_5_RM_1 */
+  {
+    { Bad_Opcode },
+    { "incsspK",	{ Skip_MODRM }, PREFIX_OPCODE },
+  },
+
+  /* PREFIX_MOD_3_0F01_REG_5_RM_2 */
+  {
+    { Bad_Opcode },
+    { "savessp",	{ Skip_MODRM }, PREFIX_OPCODE },
+  },
+
   /* PREFIX_0F10 */
   {
     { "movups",	{ XM, EXx }, PREFIX_OPCODE },
@@ -3805,6 +3845,14 @@ static const struct dis386 prefix_table[][4] = {
     { "bndcn",  { Gbnd, Ev_bnd }, 0 },
   },
 
+  /* PREFIX_0F1E */
+  {
+    { "nopQ",	{ Ev }, PREFIX_OPCODE },
+    { MOD_TABLE (MOD_0F1E_PREFIX_1) },
+    { "nopQ",	{ Ev }, PREFIX_OPCODE },
+    { "nopQ",	{ Ev }, PREFIX_OPCODE },
+  },
+
   /* PREFIX_0F2A */
   {
     { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
@@ -4080,11 +4128,17 @@ static const struct dis386 prefix_table[][4] = {
     { "ptwrite%LQ", { Edq }, 0 },
   },
 
+  /* PREFIX_MOD_0_0FAE_REG_5 */
+  {
+    { "xrstor",		{ FXSAVE }, PREFIX_OPCODE },
+    { "setssbsy",	{ Mq }, PREFIX_OPCODE },
+  },
+
   /* PREFIX_0FAE_REG_6 */
   {
-    { "xsaveopt",      { FXSAVE }, 0 },
-    { Bad_Opcode },
-    { "clwb",	{ Mb }, 0 },
+    { "xsaveopt",	{ FXSAVE }, PREFIX_OPCODE },
+    { "clrssbsy",	{ Mq }, PREFIX_OPCODE },
+    { "clwb",	{ Mb }, PREFIX_OPCODE },
   },
 
   /* PREFIX_0FAE_REG_7 */
@@ -4513,9 +4567,16 @@ static const struct dis386 prefix_table[][4] = {
     { "crc32",	{ Gdq, { CRC32_Fixup, v_mode } }, PREFIX_OPCODE },
   },
 
-  /* PREFIX_0F38F6 */
+  /* PREFIX_0F38F5 */
   {
     { Bad_Opcode },
+    { Bad_Opcode },
+    { MOD_TABLE (MOD_0F38F5_PREFIX_2) },
+  },
+
+  /* PREFIX_0F38F6 */
+  {
+    { MOD_TABLE (MOD_0F38F6_PREFIX_0) },
     { "adoxS",	{ Gdq, Edq}, PREFIX_OPCODE },
     { "adcxS",	{ Gdq, Edq}, PREFIX_OPCODE },
     { Bad_Opcode },
@@ -7246,7 +7307,7 @@ static const struct dis386 three_byte_table[][256] = {
     { Bad_Opcode },
     { Bad_Opcode },
     { Bad_Opcode },
-    { Bad_Opcode },
+    { PREFIX_TABLE (PREFIX_0F38F5) },
     { PREFIX_TABLE (PREFIX_0F38F6) },
     { Bad_Opcode },
     /* f8 */
@@ -11406,7 +11467,7 @@ static const struct dis386 mod_table[][2] = {
   },
   {
     /* MOD_0F01_REG_5 */
-    { Bad_Opcode },
+    { PREFIX_TABLE (PREFIX_MOD_0_0F01_REG_5) },
     { RM_TABLE (RM_0F01_REG_5) },
   },
   {
@@ -11480,6 +11541,11 @@ static const struct dis386 mod_table[][2] = {
     { "nopQ",		{ Ev }, 0 },
   },
   {
+    /* MOD_0F1E_PREFIX_1 */
+    { "nopQ",		{ Ev }, 0 },
+    { REG_TABLE (REG_0F1E_MOD_3) },
+  },
+  {
     /* MOD_0F24 */
     { Bad_Opcode },
     { "movL",		{ Rd, Td }, 0 },
@@ -11587,7 +11653,7 @@ static const struct dis386 mod_table[][2] = {
   },
   {
     /* MOD_0FAE_REG_5 */
-    { "xrstor",		{ FXSAVE }, 0 },
+    { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_5) },
     { RM_TABLE (RM_0FAE_REG_5) },
   },
   {
@@ -11656,6 +11722,14 @@ static const struct dis386 mod_table[][2] = {
     { "movntdqa",	{ XM, Mx }, 0 },
   },
   {
+    /* MOD_0F38F5_PREFIX_2 */
+    { "wrussK",		{ M, Gdq }, PREFIX_OPCODE },
+  },
+  {
+    /* MOD_0F38F6_PREFIX_0 */
+    { "wrssK",		{ M, Gdq }, PREFIX_OPCODE },
+  },
+  {
     /* MOD_62_32BIT */
     { "bound{S|}",	{ Gv, Ma }, 0 },
     { EVEX_TABLE (EVEX_0F) },
@@ -12157,8 +12231,8 @@ static const struct dis386 rm_table[][8] = {
   {
     /* RM_0F01_REG_5 */
     { Bad_Opcode },
-    { Bad_Opcode },
-    { Bad_Opcode },
+    { PREFIX_TABLE (PREFIX_MOD_3_0F01_REG_5_RM_1) },
+    { PREFIX_TABLE (PREFIX_MOD_3_0F01_REG_5_RM_2) },
     { Bad_Opcode },
     { Bad_Opcode },
     { Bad_Opcode },
@@ -12174,6 +12248,17 @@ static const struct dis386 rm_table[][8] = {
     { "clzero",		{ Skip_MODRM }, 0  },
   },
   {
+    /* RM_0F1E_MOD_3_REG_7 */
+    { "nopQ",		{ Ev }, 0 },
+    { "nopQ",		{ Ev }, 0 },
+    { "endbr64",	{ Skip_MODRM },  PREFIX_OPCODE },
+    { "endbr32",	{ Skip_MODRM },  PREFIX_OPCODE },
+    { "nopQ",		{ Ev }, 0 },
+    { "nopQ",		{ Ev }, 0 },
+    { "nopQ",		{ Ev }, 0 },
+    { "nopQ",		{ Ev }, 0 },
+  },
+  {
     /* RM_0FAE_REG_5 */
     { "lfence",		{ Skip_MODRM }, 0 },
   },
diff --git a/opcodes/i386-gen.c b/opcodes/i386-gen.c
index df17851..4736afa 100644
--- a/opcodes/i386-gen.c
+++ b/opcodes/i386-gen.c
@@ -263,6 +263,8 @@ static initializer cpu_flag_init[] =
     "CpuRDPID" },
   { "CPU_PTWRITE_FLAGS",
     "CpuPTWRITE" },
+  { "CPU_CET_FLAGS",
+    "CpuCET" },
   { "CPU_ANY_X87_FLAGS",
     "CPU_ANY_287_FLAGS|Cpu8087" },
   { "CPU_ANY_287_FLAGS",
@@ -524,6 +526,7 @@ static bitfield cpu_flags[] =
   BITFIELD (CpuOSPKE),
   BITFIELD (CpuRDPID),
   BITFIELD (CpuPTWRITE),
+  BITFIELD (CpuCET),
   BITFIELD (CpuRegMMX),
   BITFIELD (CpuRegXMM),
   BITFIELD (CpuRegYMM),
diff --git a/opcodes/i386-opc.h b/opcodes/i386-opc.h
index 140235f..9e4355c 100644
--- a/opcodes/i386-opc.h
+++ b/opcodes/i386-opc.h
@@ -208,6 +208,8 @@ enum
   CpuRDPID,
   /* PTWRITE instruction required */
   CpuPTWRITE,
+  /* CET instruction support required */
+  CpuCET,
   /* MMX register support required */
   CpuRegMMX,
   /* XMM register support required */
@@ -233,7 +235,9 @@ enum
 
 /* If you get a compiler error for zero width of the unused field,
    comment it out.  */
+#if 0
 #define CpuUnused	(CpuMax + 1)
+#endif
 
 /* We can check if an instruction is available with array instead
    of bitfield. */
@@ -329,6 +333,7 @@ typedef union i386_cpu_flags
       unsigned int cpuospke:1;
       unsigned int cpurdpid:1;
       unsigned int cpuptwrite:1;
+      unsigned int cpucet:1;
       unsigned int cpuregmmx:1;
       unsigned int cpuregxmm:1;
       unsigned int cpuregymm:1;
diff --git a/opcodes/i386-opc.tbl b/opcodes/i386-opc.tbl
index 163a4e4..4c259d5 100644
--- a/opcodes/i386-opc.tbl
+++ b/opcodes/i386-opc.tbl
@@ -5996,3 +5996,22 @@ rdpid, 1, 0xf30fc7, 0x7, 2, CpuRDPID|Cpu64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_
 ptwrite, 1, 0xf30fae, 0x4, 2, CpuPTWRITE, Modrm|CheckRegSize|No_bSuf|No_wSuf|No_sSuf|No_ldSuf, { Reg32|Reg64|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
 
 // PTWRITE instructions end.
+
+// CET instructions.
+
+incsspd, 0, 0xf30f01e9, None, 3, CpuCET, IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { 0 }
+incsspq, 0, 0xf30f01e9, None, 3, CpuCET|Cpu64, IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|Rex64, { 0 }
+rdsspd, 1, 0xf30f1e, 0x1, 2, CpuCET, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { Reg32 }
+rdsspq, 1, 0xf30f1e, 0x1, 2, CpuRDPID|Cpu64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|Rex64, { Reg64 }
+savessp, 0, 0xf30f01ea, None, 3, CpuCET, IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { 0 }
+rstorssp, 1, 0xf30f01, 0x5, 2, CpuCET, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|NoRex64, { Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+wrssd, 2, 0x0f38f6, None, 3, CpuCET, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { Reg32, Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+wrssq, 2, 0x0f38f6, None, 3, CpuCET|Cpu64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|Rex64, { Reg64, Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+wrussd, 2, 0x660f38f5, None, 3, CpuCET, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { Reg32, Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+wrussq, 2, 0x660f38f5, None, 3, CpuCET|Cpu64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|Rex64, { Reg64, Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+setssbsy, 1, 0xf30fae, 0x5, 2, CpuCET, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|NoRex64, { Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+clrssbsy, 1, 0xf30fae, 0x6, 2, CpuCET, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|NoRex64, { Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+endbr64, 0, 0xf30f1efa, None, 3, CpuCET, IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { 0 }
+endbr32, 0, 0xf30f1efb, None, 3, CpuCET, IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { 0 }
+
+// CET instructions end.

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

* Re: [committed, PATCH] Add support for Intel CET instructions
  2017-03-06 23:29 [committed, PATCH] Add support for Intel CET instructions H.J. Lu
@ 2017-03-07  8:59 ` Jan Beulich
  2017-03-07 15:48   ` H.J. Lu
  2017-03-09 15:45 ` H.J. Lu
  1 sibling, 1 reply; 4+ messages in thread
From: Jan Beulich @ 2017-03-07  8:59 UTC (permalink / raw)
  To: H.J. Lu; +Cc: binutils

>>> On 07.03.17 at 00:28, <hongjiu.lu@intel.com> wrote:
> Support Intel Control-flow Enforcement Technology (CET) instructions:
> 
> https://software.intel.com/sites/default/files/managed/4d/2a/control-flow-enfo 
> rcement-technology-preview.pdf
> 
> gas/
> 
> 	* config/tc-i386.c (cpu_arch): Add .cet.
> 	* doc/c-i386.texi: Document cet.
> 	* testsuite/gas/i386/cet-intel.d: New file.
> 	* testsuite/gas/i386/cet.d: Likewise.
> 	* testsuite/gas/i386/cet.s: Likewise.
> 	* testsuite/gas/i386/x86-64-cet-intel.d: Likewise.
> 	* testsuite/gas/i386/x86-64-cet.d: Likewise.
> 	* testsuite/gas/i386/x86-64-cet.s: Likewise.
> 	* testsuite/gas/i386/i386.exp: Run Intel CET tests.
> 
> opcodes/
> 
> 	* i386-dis.c (REG_0F1E_MOD_3): New enum.
> 	(MOD_0F1E_PREFIX_1): Likewise.
> 	(MOD_0F38F5_PREFIX_2): Likewise.
> 	(MOD_0F38F6_PREFIX_0): Likewise.
> 	(RM_0F1E_MOD_3_REG_7): Likewise.
> 	(PREFIX_MOD_0_0F01_REG_5): Likewise.
> 	(PREFIX_MOD_3_0F01_REG_5_RM_1): Likewise.
> 	(PREFIX_MOD_3_0F01_REG_5_RM_2): Likewise.
> 	(PREFIX_0F1E): Likewise.
> 	(PREFIX_MOD_0_0FAE_REG_5): Likewise.
> 	(PREFIX_0F38F5): Likewise.
> 	(dis386_twobyte): Use PREFIX_0F1E.
> 	(reg_table): Add REG_0F1E_MOD_3.
> 	(prefix_table): Add PREFIX_MOD_0_0F01_REG_5,
> 	PREFIX_MOD_3_0F01_REG_5_RM_1, PREFIX_MOD_3_0F01_REG_5_RM_2,
> 	PREFIX_0F1E, PREFIX_MOD_0_0FAE_REG_5 and PREFIX_0F38F5.  Update
> 	PREFIX_0FAE_REG_6 and PREFIX_0F38F6.
> 	(three_byte_table): Use PREFIX_0F38F5.
> 	(mod_table): Use PREFIX_MOD_0_0F01_REG_5, PREFIX_MOD_0_0FAE_REG_5.
> 	Add MOD_0F1E_PREFIX_1, MOD_0F38F5_PREFIX_2, MOD_0F38F6_PREFIX_0.
> 	(rm_table): Add MOD_0F38F5_PREFIX_2, MOD_0F38F6_PREFIX_0,
> 	RM_0F1E_MOD_3_REG_7.  Use PREFIX_MOD_3_0F01_REG_5_RM_1 and
> 	PREFIX_MOD_3_0F01_REG_5_RM_2.
> 	* i386-gen.c (cpu_flag_init): Add CPU_CET_FLAGS.
> 	(cpu_flags): Add CpuCET.
> 	* i386-opc.h (CpuCET): New enum.
> 	(CpuUnused): Commented out.
> 	(i386_cpu_flags): Add cpucet.
> 	* i386-opc.tbl: Add Intel CET instructions.
> 	* i386-init.h: Regenerated.
> 	* i386-tbl.h: Likewise.
> ---
>  gas/ChangeLog                             |  12 +
>  gas/config/tc-i386.c                      |   2 +
>  gas/doc/c-i386.texi                       |   2 +
>  gas/testsuite/gas/i386/cet-intel.d        |  31 ++
>  gas/testsuite/gas/i386/cet.d              |  29 ++
>  gas/testsuite/gas/i386/cet.s              |  25 +
>  gas/testsuite/gas/i386/i386.exp           |   4 +
>  gas/testsuite/gas/i386/x86-64-cet-intel.d |  38 ++
>  gas/testsuite/gas/i386/x86-64-cet.d       |  37 ++
>  gas/testsuite/gas/i386/x86-64-cet.s       |  33 ++
>  opcodes/ChangeLog                         |  34 ++
>  opcodes/i386-dis.c                        | 105 ++++-
>  opcodes/i386-gen.c                        |   3 +
>  opcodes/i386-init.h                       | 119 ++---
>  opcodes/i386-opc.h                        |   5 +
>  opcodes/i386-opc.tbl                      |  19 +
>  opcodes/i386-tbl.h                        | 730 +++++++++++++++++++-----------
>  17 files changed, 894 insertions(+), 334 deletions(-)
>  create mode 100644 gas/testsuite/gas/i386/cet-intel.d
>  create mode 100644 gas/testsuite/gas/i386/cet.d
>  create mode 100644 gas/testsuite/gas/i386/cet.s
>  create mode 100644 gas/testsuite/gas/i386/x86-64-cet-intel.d
>  create mode 100644 gas/testsuite/gas/i386/x86-64-cet.d
>  create mode 100644 gas/testsuite/gas/i386/x86-64-cet.s
> 
> diff --git a/gas/ChangeLog b/gas/ChangeLog
> index 654b3cb..f9af65d6 100644
> --- a/gas/ChangeLog
> +++ b/gas/ChangeLog
> @@ -1,5 +1,17 @@
>  2017-03-06  H.J. Lu  <hongjiu.lu@intel.com>
>  
> +	* config/tc-i386.c (cpu_arch): Add .cet.
> +	* doc/c-i386.texi: Document cet.
> +	* testsuite/gas/i386/cet-intel.d: New file.
> +	* testsuite/gas/i386/cet.d: Likewise.
> +	* testsuite/gas/i386/cet.s: Likewise.
> +	* testsuite/gas/i386/x86-64-cet-intel.d: Likewise.
> +	* testsuite/gas/i386/x86-64-cet.d: Likewise.
> +	* testsuite/gas/i386/x86-64-cet.s: Likewise.
> +	* testsuite/gas/i386/i386.exp: Run Intel CET tests.
> +
> +2017-03-06  H.J. Lu  <hongjiu.lu@intel.com>
> +
>  	* testsuite/gas/i386/x86-64-mpx-inval-2.s: Force a good alignment.
>  	* testsuite/gas/i386/x86-64-mpx-inval-2.l: Expect [0-9A-F]+.
>  
> diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
> index 12b3032..7deacad 100644
> --- a/gas/config/tc-i386.c
> +++ b/gas/config/tc-i386.c
> @@ -978,6 +978,8 @@ static const arch_entry cpu_arch[] =
>      CPU_RDPID_FLAGS, 0 },
>    { STRING_COMMA_LEN (".ptwrite"), PROCESSOR_UNKNOWN,
>      CPU_PTWRITE_FLAGS, 0 },
> +  { STRING_COMMA_LEN (".cet"), PROCESSOR_UNKNOWN,
> +    CPU_CET_FLAGS, 0 },
>  };
>  
>  static const noarch_entry cpu_noarch[] =
> diff --git a/gas/doc/c-i386.texi b/gas/doc/c-i386.texi
> index 2cbffb9..0733587 100644
> --- a/gas/doc/c-i386.texi
> +++ b/gas/doc/c-i386.texi
> @@ -167,6 +167,7 @@ accept various extension mnemonics.  For example,
>  @code{sha},
>  @code{rdpid},
>  @code{ptwrite},
> +@code{cet},
>  @code{prefetchwt1},
>  @code{clflushopt},
>  @code{se1},
> @@ -1198,6 +1199,7 @@ supported on the CPU specified.  The choices for 
> @var{cpu_type} are:
>  @item @samp{.avx512vl} @tab @samp{.avx512bw} @tab @samp{.avx512dq} @tab 
> @samp{.avx512ifma}
>  @item @samp{.avx512vbmi} @tab @samp{.avx512_4fmaps} @tab 
> @samp{.avx512_4vnniw}
>  @item @samp{.avx512_vpopcntdq} @tab @samp{.clwb} @tab @samp{.rdpid} @tab 
> @samp{.ptwrite}
> +@item @samp{.cet}
>  @item @samp{.3dnow} @tab @samp{.3dnowa} @tab @samp{.sse4a} @tab 
> @samp{.sse5}
>  @item @samp{.syscall} @tab @samp{.rdtscp} @tab @samp{.svme} @tab 
> @samp{.abm}
>  @item @samp{.lwp} @tab @samp{.fma4} @tab @samp{.xop} @tab @samp{.cx16}
> diff --git a/gas/testsuite/gas/i386/cet-intel.d 
> b/gas/testsuite/gas/i386/cet-intel.d
> new file mode 100644
> index 0000000..a5f5533
> --- /dev/null
> +++ b/gas/testsuite/gas/i386/cet-intel.d
> @@ -0,0 +1,31 @@
> +#source: cet.s
> +#as: -J
> +#objdump: -dw -Mintel
> +#name: i386 CET (Intel mode)
> +
> +.*: +file format .*
> +
> +Disassembly of section .text:
> +
> +0+ <_start>:
> + +[a-f0-9]+:	f3 0f 01 e9          	incsspd 
> + +[a-f0-9]+:	f3 0f 1e c9          	rdsspd ecx
> + +[a-f0-9]+:	f3 0f 01 ea          	savessp 
> + +[a-f0-9]+:	f3 0f 01 29          	rstorssp QWORD PTR \[ecx\]
> + +[a-f0-9]+:	0f 38 f6 04 02       	wrssd  \[edx\+eax\*1\],eax
> + +[a-f0-9]+:	66 0f 38 f5 14 2f    	wrussd \[edi\+ebp\*1\],edx
> + +[a-f0-9]+:	f3 0f ae 28          	setssbsy QWORD PTR \[eax\]
> + +[a-f0-9]+:	f3 0f ae 34 04       	clrssbsy QWORD PTR \[esp\+eax\*1\]
> + +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
> + +[a-f0-9]+:	f3 0f 1e fb          	endbr32 
> + +[a-f0-9]+:	f3 0f 01 e9          	incsspd 
> + +[a-f0-9]+:	f3 0f 1e c9          	rdsspd ecx
> + +[a-f0-9]+:	f3 0f 01 ea          	savessp 
> + +[a-f0-9]+:	f3 0f 01 2c 01       	rstorssp QWORD PTR \[ecx\+eax\*1\]
> + +[a-f0-9]+:	0f 38 f6 02          	wrssd  \[edx\],eax
> + +[a-f0-9]+:	66 0f 38 f5 14 2f    	wrussd \[edi\+ebp\*1\],edx
> + +[a-f0-9]+:	f3 0f ae 28          	setssbsy QWORD PTR \[eax\]
> + +[a-f0-9]+:	f3 0f ae 34 04       	clrssbsy QWORD PTR \[esp\+eax\*1\]
> + +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
> + +[a-f0-9]+:	f3 0f 1e fb          	endbr32 
> +#pass
> diff --git a/gas/testsuite/gas/i386/cet.d b/gas/testsuite/gas/i386/cet.d
> new file mode 100644
> index 0000000..bb356e4
> --- /dev/null
> +++ b/gas/testsuite/gas/i386/cet.d
> @@ -0,0 +1,29 @@
> +#objdump: -dw
> +#name: i386 CET
> +
> +.*:     file format .*
> +
> +Disassembly of section .text:
> +
> +0+ <_start>:
> + +[a-f0-9]+:	f3 0f 01 e9          	incsspd 
> + +[a-f0-9]+:	f3 0f 1e c9          	rdsspd %ecx
> + +[a-f0-9]+:	f3 0f 01 ea          	savessp 
> + +[a-f0-9]+:	f3 0f 01 29          	rstorssp \(%ecx\)
> + +[a-f0-9]+:	0f 38 f6 04 02       	wrssd  %eax,\(%edx,%eax,1\)
> + +[a-f0-9]+:	66 0f 38 f5 14 2f    	wrussd %edx,\(%edi,%ebp,1\)
> + +[a-f0-9]+:	f3 0f ae 28          	setssbsy \(%eax\)
> + +[a-f0-9]+:	f3 0f ae 34 04       	clrssbsy \(%esp,%eax,1\)
> + +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
> + +[a-f0-9]+:	f3 0f 1e fb          	endbr32 
> + +[a-f0-9]+:	f3 0f 01 e9          	incsspd 
> + +[a-f0-9]+:	f3 0f 1e c9          	rdsspd %ecx
> + +[a-f0-9]+:	f3 0f 01 ea          	savessp 
> + +[a-f0-9]+:	f3 0f 01 2c 01       	rstorssp \(%ecx,%eax,1\)
> + +[a-f0-9]+:	0f 38 f6 02          	wrssd  %eax,\(%edx\)
> + +[a-f0-9]+:	66 0f 38 f5 14 2f    	wrussd %edx,\(%edi,%ebp,1\)
> + +[a-f0-9]+:	f3 0f ae 28          	setssbsy \(%eax\)
> + +[a-f0-9]+:	f3 0f ae 34 04       	clrssbsy \(%esp,%eax,1\)
> + +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
> + +[a-f0-9]+:	f3 0f 1e fb          	endbr32 
> +#pass
> diff --git a/gas/testsuite/gas/i386/cet.s b/gas/testsuite/gas/i386/cet.s
> new file mode 100644
> index 0000000..deb659d
> --- /dev/null
> +++ b/gas/testsuite/gas/i386/cet.s
> @@ -0,0 +1,25 @@
> +# Check CET instructions
> +	.text
> +_start:
> +	incsspd
> +	rdsspd %ecx
> +	savessp
> +	rstorssp (%ecx)
> +	wrssd %eax, (%edx, %eax)
> +	wrussd %edx, (%edi, %ebp)
> +	setssbsy (%eax)
> +	clrssbsy (%esp, %eax)
> +	endbr64
> +	endbr32
> +
> +	.intel_syntax noprefix
> +	incsspd
> +	rdsspd ecx
> +	savessp
> +	rstorssp QWORD PTR [ecx + eax]
> +	wrssd [edx],eax
> +	wrussd [edi + ebp],edx
> +	setssbsy QWORD PTR [eax]
> +	clrssbsy QWORD PTR [esp + eax]
> +	endbr64
> +	endbr32
> diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp
> index 10fe71c..cc5917a 100644
> --- a/gas/testsuite/gas/i386/i386.exp
> +++ b/gas/testsuite/gas/i386/i386.exp
> @@ -382,6 +382,8 @@ if [expr ([istarget "i*86-*-*"] ||  [istarget "x86_64-*-*"]) && 
> [gas_32_check]]
>      run_list_test "avx512vl-1" "-al"
>      run_list_test "avx512vl-2" "-al"
>      run_dump_test "fpu-bad"
> +    run_dump_test "cet"
> +    run_dump_test "cet-intel"
>  
>      # These tests require support for 8 and 16 bit relocs,
>      # so we only run them for ELF and COFF targets.
> @@ -799,6 +801,8 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && 
> [gas_64_check]] t
>      run_list_test "x86-64-avx512vl-1" "-al"
>      run_list_test "x86-64-avx512vl-2" "-al"
>      run_dump_test "x86-64-opcode-bad"
> +    run_dump_test "x86-64-cet"
> +    run_dump_test "x86-64-cet-intel"
>  
>      if { ![istarget "*-*-aix*"]
>        && ![istarget "*-*-beos*"]
> diff --git a/gas/testsuite/gas/i386/x86-64-cet-intel.d 
> b/gas/testsuite/gas/i386/x86-64-cet-intel.d
> new file mode 100644
> index 0000000..07e666f
> --- /dev/null
> +++ b/gas/testsuite/gas/i386/x86-64-cet-intel.d
> @@ -0,0 +1,38 @@
> +#source: x86-64-cet.s
> +#objdump: -dw -Mintel
> +#name: x86-64 CET (Intel mode)
> +
> +.*: +file format .*
> +
> +Disassembly of section .text:
> +
> +0+ <_start>:
> + +[a-f0-9]+:	f3 0f 01 e9          	incsspd 
> + +[a-f0-9]+:	f3 48 0f 01 e9       	incsspq 
> + +[a-f0-9]+:	f3 41 0f 1e cc       	rdsspd r12d
> + +[a-f0-9]+:	f3 48 0f 1e c8       	rdsspq rax
> + +[a-f0-9]+:	f3 0f 01 ea          	savessp 
> + +[a-f0-9]+:	f3 41 0f 01 2c 24    	rstorssp QWORD PTR \[r12\]
> + +[a-f0-9]+:	41 0f 38 f6 04 24    	wrssd  \[r12\],eax
> + +[a-f0-9]+:	4a 0f 38 f6 14 39    	wrssq  \[rcx\+r15\*1\],rdx
> + +[a-f0-9]+:	66 41 0f 38 f5 04 24 	wrussd \[r12\],eax
> + +[a-f0-9]+:	66 48 0f 38 f5 0c 03 	wrussq \[rbx\+rax\*1\],rcx
> + +[a-f0-9]+:	f3 0f ae 28          	setssbsy QWORD PTR \[rax\]
> + +[a-f0-9]+:	f3 42 0f ae 34 26    	clrssbsy QWORD PTR \[rsi\+r12\*1\]
> + +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
> + +[a-f0-9]+:	f3 0f 1e fb          	endbr32 
> + +[a-f0-9]+:	f3 0f 01 e9          	incsspd 
> + +[a-f0-9]+:	f3 48 0f 01 e9       	incsspq 
> + +[a-f0-9]+:	f3 41 0f 1e cc       	rdsspd r12d
> + +[a-f0-9]+:	f3 48 0f 1e c8       	rdsspq rax
> + +[a-f0-9]+:	f3 0f 01 ea          	savessp 
> + +[a-f0-9]+:	f3 41 0f 01 2c 24    	rstorssp QWORD PTR \[r12\]
> + +[a-f0-9]+:	41 0f 38 f6 04 24    	wrssd  \[r12\],eax
> + +[a-f0-9]+:	4a 0f 38 f6 14 39    	wrssq  \[rcx\+r15\*1\],rdx
> + +[a-f0-9]+:	66 41 0f 38 f5 04 24 	wrussd \[r12\],eax
> + +[a-f0-9]+:	66 48 0f 38 f5 0c 03 	wrussq \[rbx\+rax\*1\],rcx
> + +[a-f0-9]+:	f3 0f ae 28          	setssbsy QWORD PTR \[rax\]
> + +[a-f0-9]+:	f3 42 0f ae 34 26    	clrssbsy QWORD PTR \[rsi\+r12\*1\]
> + +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
> + +[a-f0-9]+:	f3 0f 1e fb          	endbr32 
> +#pass
> diff --git a/gas/testsuite/gas/i386/x86-64-cet.d 
> b/gas/testsuite/gas/i386/x86-64-cet.d
> new file mode 100644
> index 0000000..7e5b717
> --- /dev/null
> +++ b/gas/testsuite/gas/i386/x86-64-cet.d
> @@ -0,0 +1,37 @@
> +#objdump: -dw
> +#name: x86-64 CET
> +
> +.*: +file format .*
> +
> +Disassembly of section .text:
> +
> +0+ <_start>:
> + +[a-f0-9]+:	f3 0f 01 e9          	incsspd 
> + +[a-f0-9]+:	f3 48 0f 01 e9       	incsspq 
> + +[a-f0-9]+:	f3 41 0f 1e cc       	rdsspd %r12d
> + +[a-f0-9]+:	f3 48 0f 1e c8       	rdsspq %rax
> + +[a-f0-9]+:	f3 0f 01 ea          	savessp 
> + +[a-f0-9]+:	f3 41 0f 01 2c 24    	rstorssp \(%r12\)
> + +[a-f0-9]+:	41 0f 38 f6 04 24    	wrssd  %eax,\(%r12\)
> + +[a-f0-9]+:	4a 0f 38 f6 14 39    	wrssq  %rdx,\(%rcx,%r15,1\)
> + +[a-f0-9]+:	66 41 0f 38 f5 04 24 	wrussd %eax,\(%r12\)
> + +[a-f0-9]+:	66 48 0f 38 f5 0c 03 	wrussq %rcx,\(%rbx,%rax,1\)
> + +[a-f0-9]+:	f3 0f ae 28          	setssbsy \(%rax\)
> + +[a-f0-9]+:	f3 42 0f ae 34 26    	clrssbsy \(%rsi,%r12,1\)
> + +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
> + +[a-f0-9]+:	f3 0f 1e fb          	endbr32 
> + +[a-f0-9]+:	f3 0f 01 e9          	incsspd 
> + +[a-f0-9]+:	f3 48 0f 01 e9       	incsspq 
> + +[a-f0-9]+:	f3 41 0f 1e cc       	rdsspd %r12d
> + +[a-f0-9]+:	f3 48 0f 1e c8       	rdsspq %rax
> + +[a-f0-9]+:	f3 0f 01 ea          	savessp 
> + +[a-f0-9]+:	f3 41 0f 01 2c 24    	rstorssp \(%r12\)
> + +[a-f0-9]+:	41 0f 38 f6 04 24    	wrssd  %eax,\(%r12\)
> + +[a-f0-9]+:	4a 0f 38 f6 14 39    	wrssq  %rdx,\(%rcx,%r15,1\)
> + +[a-f0-9]+:	66 41 0f 38 f5 04 24 	wrussd %eax,\(%r12\)
> + +[a-f0-9]+:	66 48 0f 38 f5 0c 03 	wrussq %rcx,\(%rbx,%rax,1\)
> + +[a-f0-9]+:	f3 0f ae 28          	setssbsy \(%rax\)
> + +[a-f0-9]+:	f3 42 0f ae 34 26    	clrssbsy \(%rsi,%r12,1\)
> + +[a-f0-9]+:	f3 0f 1e fa          	endbr64 
> + +[a-f0-9]+:	f3 0f 1e fb          	endbr32 
> +#pass
> diff --git a/gas/testsuite/gas/i386/x86-64-cet.s 
> b/gas/testsuite/gas/i386/x86-64-cet.s
> new file mode 100644
> index 0000000..15a28d7
> --- /dev/null
> +++ b/gas/testsuite/gas/i386/x86-64-cet.s
> @@ -0,0 +1,33 @@
> +# Check 64bit CET instructions
> +	.text
> +_start:
> +	incsspd
> +	incsspq
> +	rdsspd %r12d
> +	rdsspq %rax
> +	savessp
> +	rstorssp (%r12)
> +	wrssd %eax, (%r12)
> +	wrssq %rdx, (%rcx, %r15)
> +	wrussd %eax, (%r12)
> +	wrussq %rcx, (%rbx, %rax)
> +	setssbsy (%rax)
> +	clrssbsy (%rsi, %r12)
> +	endbr64
> +	endbr32
> +
> +	.intel_syntax noprefix
> +	incsspd
> +	incsspq
> +	rdsspd r12d
> +	rdsspq rax
> +	savessp
> +	rstorssp QWORD PTR [r12]
> +	wrssd [r12],eax
> +	wrssq [rcx+r15],rdx
> +	wrussd [r12],eax
> +	wrussq [rbx+rax],rcx
> +	setssbsy QWORD PTR [rax]
> +	clrssbsy QWORD PTR [rsi+r12]
> +	endbr64
> +	endbr32
> diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
> index 27f3235..f2b1bec 100644
> --- a/opcodes/ChangeLog
> +++ b/opcodes/ChangeLog
> @@ -1,3 +1,37 @@
> +2017-03-06  H.J. Lu  <hongjiu.lu@intel.com>
> +
> +	* i386-dis.c (REG_0F1E_MOD_3): New enum.
> +	(MOD_0F1E_PREFIX_1): Likewise.
> +	(MOD_0F38F5_PREFIX_2): Likewise.
> +	(MOD_0F38F6_PREFIX_0): Likewise.
> +	(RM_0F1E_MOD_3_REG_7): Likewise.
> +	(PREFIX_MOD_0_0F01_REG_5): Likewise.
> +	(PREFIX_MOD_3_0F01_REG_5_RM_1): Likewise.
> +	(PREFIX_MOD_3_0F01_REG_5_RM_2): Likewise.
> +	(PREFIX_0F1E): Likewise.
> +	(PREFIX_MOD_0_0FAE_REG_5): Likewise.
> +	(PREFIX_0F38F5): Likewise.
> +	(dis386_twobyte): Use PREFIX_0F1E.
> +	(reg_table): Add REG_0F1E_MOD_3.
> +	(prefix_table): Add PREFIX_MOD_0_0F01_REG_5,
> +	PREFIX_MOD_3_0F01_REG_5_RM_1, PREFIX_MOD_3_0F01_REG_5_RM_2,
> +	PREFIX_0F1E, PREFIX_MOD_0_0FAE_REG_5 and PREFIX_0F38F5.  Update
> +	PREFIX_0FAE_REG_6 and PREFIX_0F38F6.
> +	(three_byte_table): Use PREFIX_0F38F5.
> +	(mod_table): Use PREFIX_MOD_0_0F01_REG_5, PREFIX_MOD_0_0FAE_REG_5.
> +	Add MOD_0F1E_PREFIX_1, MOD_0F38F5_PREFIX_2, MOD_0F38F6_PREFIX_0.
> +	(rm_table): Add MOD_0F38F5_PREFIX_2, MOD_0F38F6_PREFIX_0,
> +	RM_0F1E_MOD_3_REG_7.  Use PREFIX_MOD_3_0F01_REG_5_RM_1 and
> +	PREFIX_MOD_3_0F01_REG_5_RM_2.
> +	* i386-gen.c (cpu_flag_init): Add CPU_CET_FLAGS.
> +	(cpu_flags): Add CpuCET.
> +	* i386-opc.h (CpuCET): New enum.
> +	(CpuUnused): Commented out.
> +	(i386_cpu_flags): Add cpucet.
> +	* i386-opc.tbl: Add Intel CET instructions.
> +	* i386-init.h: Regenerated.
> +	* i386-tbl.h: Likewise.
> +
>  2017-03-06  Alan Modra  <amodra@gmail.com>
>  
>  	PR 21124
> diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c
> index 76781a0..3980c46 100644
> --- a/opcodes/i386-dis.c
> +++ b/opcodes/i386-dis.c
> @@ -723,6 +723,7 @@ enum
>    REG_0F01,
>    REG_0F0D,
>    REG_0F18,
> +  REG_0F1E_MOD_3,
>    REG_0F71,
>    REG_0F72,
>    REG_0F73,
> @@ -776,6 +777,7 @@ enum
>    MOD_0F1A_PREFIX_0,
>    MOD_0F1B_PREFIX_0,
>    MOD_0F1B_PREFIX_1,
> +  MOD_0F1E_PREFIX_1,
>    MOD_0F24,
>    MOD_0F26,
>    MOD_0F2B_PREFIX_0,
> @@ -814,6 +816,8 @@ enum
>    MOD_0FE7_PREFIX_2,
>    MOD_0FF0_PREFIX_3,
>    MOD_0F382A_PREFIX_2,
> +  MOD_0F38F5_PREFIX_2,
> +  MOD_0F38F6_PREFIX_0,
>    MOD_62_32BIT,
>    MOD_C4_32BIT,
>    MOD_C5_32BIT,
> @@ -933,6 +937,7 @@ enum
>    RM_0F01_REG_3,
>    RM_0F01_REG_5,
>    RM_0F01_REG_7,
> +  RM_0F1E_MOD_3_REG_7,
>    RM_0FAE_REG_5,
>    RM_0FAE_REG_6,
>    RM_0FAE_REG_7
> @@ -941,12 +946,16 @@ enum
>  enum
>  {
>    PREFIX_90 = 0,
> +  PREFIX_MOD_0_0F01_REG_5,
> +  PREFIX_MOD_3_0F01_REG_5_RM_1,
> +  PREFIX_MOD_3_0F01_REG_5_RM_2,
>    PREFIX_0F10,
>    PREFIX_0F11,
>    PREFIX_0F12,
>    PREFIX_0F16,
>    PREFIX_0F1A,
>    PREFIX_0F1B,
> +  PREFIX_0F1E,
>    PREFIX_0F2A,
>    PREFIX_0F2B,
>    PREFIX_0F2C,
> @@ -985,6 +994,7 @@ enum
>    PREFIX_0FAE_REG_3,
>    PREFIX_MOD_0_0FAE_REG_4,
>    PREFIX_MOD_3_0FAE_REG_4,
> +  PREFIX_MOD_0_0FAE_REG_5,
>    PREFIX_0FAE_REG_6,
>    PREFIX_0FAE_REG_7,
>    PREFIX_0FB8,
> @@ -1048,6 +1058,7 @@ enum
>    PREFIX_0F38DF,
>    PREFIX_0F38F0,
>    PREFIX_0F38F1,
> +  PREFIX_0F38F5,
>    PREFIX_0F38F6,
>    PREFIX_0F3A08,
>    PREFIX_0F3A09,
> @@ -2839,7 +2850,7 @@ static const struct dis386 dis386_twobyte[] = {
>    { PREFIX_TABLE (PREFIX_0F1B) },
>    { "nopQ",		{ Ev }, 0 },
>    { "nopQ",		{ Ev }, 0 },
> -  { "nopQ",		{ Ev }, 0 },
> +  { PREFIX_TABLE (PREFIX_0F1E) },
>    { "nopQ",		{ Ev }, 0 },
>    /* 20 */
>    { "movZ",		{ Rm, Cm }, 0 },
> @@ -3589,6 +3600,17 @@ static const struct dis386 reg_table[][8] = {
>      { MOD_TABLE (MOD_0F18_REG_6) },
>      { MOD_TABLE (MOD_0F18_REG_7) },
>    },
> +  /* REG_0F1E_MOD_3 */
> +  {
> +    { "nopQ",		{ Ev }, 0 },
> +    { "rdsspK",		{ Rdq }, PREFIX_OPCODE },
> +    { "nopQ",		{ Ev }, 0 },
> +    { "nopQ",		{ Ev }, 0 },
> +    { "nopQ",		{ Ev }, 0 },
> +    { "nopQ",		{ Ev }, 0 },
> +    { "nopQ",		{ Ev }, 0 },
> +    { RM_TABLE (RM_0F1E_MOD_3_REG_7) },
> +  },
>    /* REG_0F71 */
>    {
>      { Bad_Opcode },
> @@ -3758,6 +3780,24 @@ static const struct dis386 prefix_table[][4] = {
>      { NULL, { { NULL, 0 } }, PREFIX_IGNORED }
>    },
>  
> +  /* PREFIX_MOD_0_0F01_REG_5 */
> +  {
> +    { Bad_Opcode },
> +    { "rstorssp",	{ Mq }, PREFIX_OPCODE },
> +  },
> +
> +  /* PREFIX_MOD_3_0F01_REG_5_RM_1 */
> +  {
> +    { Bad_Opcode },
> +    { "incsspK",	{ Skip_MODRM }, PREFIX_OPCODE },
> +  },
> +
> +  /* PREFIX_MOD_3_0F01_REG_5_RM_2 */
> +  {
> +    { Bad_Opcode },
> +    { "savessp",	{ Skip_MODRM }, PREFIX_OPCODE },
> +  },
> +
>    /* PREFIX_0F10 */
>    {
>      { "movups",	{ XM, EXx }, PREFIX_OPCODE },
> @@ -3805,6 +3845,14 @@ static const struct dis386 prefix_table[][4] = {
>      { "bndcn",  { Gbnd, Ev_bnd }, 0 },
>    },
>  
> +  /* PREFIX_0F1E */
> +  {
> +    { "nopQ",	{ Ev }, PREFIX_OPCODE },
> +    { MOD_TABLE (MOD_0F1E_PREFIX_1) },
> +    { "nopQ",	{ Ev }, PREFIX_OPCODE },
> +    { "nopQ",	{ Ev }, PREFIX_OPCODE },
> +  },
> +
>    /* PREFIX_0F2A */
>    {
>      { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
> @@ -4080,11 +4128,17 @@ static const struct dis386 prefix_table[][4] = {
>      { "ptwrite%LQ", { Edq }, 0 },
>    },
>  
> +  /* PREFIX_MOD_0_0FAE_REG_5 */
> +  {
> +    { "xrstor",		{ FXSAVE }, PREFIX_OPCODE },
> +    { "setssbsy",	{ Mq }, PREFIX_OPCODE },
> +  },
> +
>    /* PREFIX_0FAE_REG_6 */
>    {
> -    { "xsaveopt",      { FXSAVE }, 0 },
> -    { Bad_Opcode },
> -    { "clwb",	{ Mb }, 0 },
> +    { "xsaveopt",	{ FXSAVE }, PREFIX_OPCODE },
> +    { "clrssbsy",	{ Mq }, PREFIX_OPCODE },
> +    { "clwb",	{ Mb }, PREFIX_OPCODE },
>    },
>  
>    /* PREFIX_0FAE_REG_7 */
> @@ -4513,9 +4567,16 @@ static const struct dis386 prefix_table[][4] = {
>      { "crc32",	{ Gdq, { CRC32_Fixup, v_mode } }, PREFIX_OPCODE },
>    },
>  
> -  /* PREFIX_0F38F6 */
> +  /* PREFIX_0F38F5 */
>    {
>      { Bad_Opcode },
> +    { Bad_Opcode },
> +    { MOD_TABLE (MOD_0F38F5_PREFIX_2) },
> +  },
> +
> +  /* PREFIX_0F38F6 */
> +  {
> +    { MOD_TABLE (MOD_0F38F6_PREFIX_0) },
>      { "adoxS",	{ Gdq, Edq}, PREFIX_OPCODE },
>      { "adcxS",	{ Gdq, Edq}, PREFIX_OPCODE },
>      { Bad_Opcode },
> @@ -7246,7 +7307,7 @@ static const struct dis386 three_byte_table[][256] = {
>      { Bad_Opcode },
>      { Bad_Opcode },
>      { Bad_Opcode },
> -    { Bad_Opcode },
> +    { PREFIX_TABLE (PREFIX_0F38F5) },
>      { PREFIX_TABLE (PREFIX_0F38F6) },
>      { Bad_Opcode },
>      /* f8 */
> @@ -11406,7 +11467,7 @@ static const struct dis386 mod_table[][2] = {
>    },
>    {
>      /* MOD_0F01_REG_5 */
> -    { Bad_Opcode },
> +    { PREFIX_TABLE (PREFIX_MOD_0_0F01_REG_5) },
>      { RM_TABLE (RM_0F01_REG_5) },
>    },
>    {
> @@ -11480,6 +11541,11 @@ static const struct dis386 mod_table[][2] = {
>      { "nopQ",		{ Ev }, 0 },
>    },
>    {
> +    /* MOD_0F1E_PREFIX_1 */
> +    { "nopQ",		{ Ev }, 0 },
> +    { REG_TABLE (REG_0F1E_MOD_3) },
> +  },
> +  {
>      /* MOD_0F24 */
>      { Bad_Opcode },
>      { "movL",		{ Rd, Td }, 0 },
> @@ -11587,7 +11653,7 @@ static const struct dis386 mod_table[][2] = {
>    },
>    {
>      /* MOD_0FAE_REG_5 */
> -    { "xrstor",		{ FXSAVE }, 0 },
> +    { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_5) },
>      { RM_TABLE (RM_0FAE_REG_5) },
>    },
>    {
> @@ -11656,6 +11722,14 @@ static const struct dis386 mod_table[][2] = {
>      { "movntdqa",	{ XM, Mx }, 0 },
>    },
>    {
> +    /* MOD_0F38F5_PREFIX_2 */
> +    { "wrussK",		{ M, Gdq }, PREFIX_OPCODE },
> +  },
> +  {
> +    /* MOD_0F38F6_PREFIX_0 */
> +    { "wrssK",		{ M, Gdq }, PREFIX_OPCODE },
> +  },
> +  {
>      /* MOD_62_32BIT */
>      { "bound{S|}",	{ Gv, Ma }, 0 },
>      { EVEX_TABLE (EVEX_0F) },
> @@ -12157,8 +12231,8 @@ static const struct dis386 rm_table[][8] = {
>    {
>      /* RM_0F01_REG_5 */
>      { Bad_Opcode },
> -    { Bad_Opcode },
> -    { Bad_Opcode },
> +    { PREFIX_TABLE (PREFIX_MOD_3_0F01_REG_5_RM_1) },
> +    { PREFIX_TABLE (PREFIX_MOD_3_0F01_REG_5_RM_2) },
>      { Bad_Opcode },
>      { Bad_Opcode },
>      { Bad_Opcode },
> @@ -12174,6 +12248,17 @@ static const struct dis386 rm_table[][8] = {
>      { "clzero",		{ Skip_MODRM }, 0  },
>    },
>    {
> +    /* RM_0F1E_MOD_3_REG_7 */
> +    { "nopQ",		{ Ev }, 0 },
> +    { "nopQ",		{ Ev }, 0 },
> +    { "endbr64",	{ Skip_MODRM },  PREFIX_OPCODE },
> +    { "endbr32",	{ Skip_MODRM },  PREFIX_OPCODE },
> +    { "nopQ",		{ Ev }, 0 },
> +    { "nopQ",		{ Ev }, 0 },
> +    { "nopQ",		{ Ev }, 0 },
> +    { "nopQ",		{ Ev }, 0 },
> +  },
> +  {
>      /* RM_0FAE_REG_5 */
>      { "lfence",		{ Skip_MODRM }, 0 },
>    },
> diff --git a/opcodes/i386-gen.c b/opcodes/i386-gen.c
> index df17851..4736afa 100644
> --- a/opcodes/i386-gen.c
> +++ b/opcodes/i386-gen.c
> @@ -263,6 +263,8 @@ static initializer cpu_flag_init[] =
>      "CpuRDPID" },
>    { "CPU_PTWRITE_FLAGS",
>      "CpuPTWRITE" },
> +  { "CPU_CET_FLAGS",
> +    "CpuCET" },
>    { "CPU_ANY_X87_FLAGS",
>      "CPU_ANY_287_FLAGS|Cpu8087" },
>    { "CPU_ANY_287_FLAGS",
> @@ -524,6 +526,7 @@ static bitfield cpu_flags[] =
>    BITFIELD (CpuOSPKE),
>    BITFIELD (CpuRDPID),
>    BITFIELD (CpuPTWRITE),
> +  BITFIELD (CpuCET),
>    BITFIELD (CpuRegMMX),
>    BITFIELD (CpuRegXMM),
>    BITFIELD (CpuRegYMM),
> diff --git a/opcodes/i386-opc.h b/opcodes/i386-opc.h
> index 140235f..9e4355c 100644
> --- a/opcodes/i386-opc.h
> +++ b/opcodes/i386-opc.h
> @@ -208,6 +208,8 @@ enum
>    CpuRDPID,
>    /* PTWRITE instruction required */
>    CpuPTWRITE,
> +  /* CET instruction support required */
> +  CpuCET,
>    /* MMX register support required */
>    CpuRegMMX,
>    /* XMM register support required */
> @@ -233,7 +235,9 @@ enum
>  
>  /* If you get a compiler error for zero width of the unused field,
>     comment it out.  */
> +#if 0
>  #define CpuUnused	(CpuMax + 1)
> +#endif
>  
>  /* We can check if an instruction is available with array instead
>     of bitfield. */
> @@ -329,6 +333,7 @@ typedef union i386_cpu_flags
>        unsigned int cpuospke:1;
>        unsigned int cpurdpid:1;
>        unsigned int cpuptwrite:1;
> +      unsigned int cpucet:1;
>        unsigned int cpuregmmx:1;
>        unsigned int cpuregxmm:1;
>        unsigned int cpuregymm:1;
> diff --git a/opcodes/i386-opc.tbl b/opcodes/i386-opc.tbl
> index 163a4e4..4c259d5 100644
> --- a/opcodes/i386-opc.tbl
> +++ b/opcodes/i386-opc.tbl
> @@ -5996,3 +5996,22 @@ rdpid, 1, 0xf30fc7, 0x7, 2, CpuRDPID|Cpu64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_
>  ptwrite, 1, 0xf30fae, 0x4, 2, CpuPTWRITE, Modrm|CheckRegSize|No_bSuf|No_wSuf|No_sSuf|No_ldSuf, { Reg32|Reg64|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
>  
>  // PTWRITE instructions end.
> +
> +// CET instructions.
> +
> +incsspd, 0, 0xf30f01e9, None, 3, CpuCET, IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { 0 }
> +incsspq, 0, 0xf30f01e9, None, 3, CpuCET|Cpu64, IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|Rex64, { 0 }
> +rdsspd, 1, 0xf30f1e, 0x1, 2, CpuCET, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { Reg32 }
> +rdsspq, 1, 0xf30f1e, 0x1, 2, CpuRDPID|Cpu64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|Rex64, { Reg64 }
> +savessp, 0, 0xf30f01ea, None, 3, CpuCET, IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { 0 }
> +rstorssp, 1, 0xf30f01, 0x5, 2, CpuCET, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|NoRex64, { Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
> +wrssd, 2, 0x0f38f6, None, 3, CpuCET, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { Reg32, Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
> +wrssq, 2, 0x0f38f6, None, 3, CpuCET|Cpu64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|Rex64, { Reg64, Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
> +wrussd, 2, 0x660f38f5, None, 3, CpuCET, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { Reg32, Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
> +wrussq, 2, 0x660f38f5, None, 3, CpuCET|Cpu64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|Rex64, { Reg64, Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }

I think using "d" suffixes here is rather inconsistent with all other
AT&T syntax GPR-accessing instructions - this suffix is strictly
Intel syntax outside of SIMD. Please seriously consider switching
to conventional AT&T suffix handling for these.

Jan

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

* Re: [committed, PATCH] Add support for Intel CET instructions
  2017-03-07  8:59 ` Jan Beulich
@ 2017-03-07 15:48   ` H.J. Lu
  0 siblings, 0 replies; 4+ messages in thread
From: H.J. Lu @ 2017-03-07 15:48 UTC (permalink / raw)
  To: Jan Beulich; +Cc: Binutils

On Tue, Mar 7, 2017 at 12:59 AM, Jan Beulich <JBeulich@suse.com> wrote:
>>>> On 07.03.17 at 00:28, <hongjiu.lu@intel.com> wrote:
>> Support Intel Control-flow Enforcement Technology (CET) instructions:
>>
>> https://software.intel.com/sites/default/files/managed/4d/2a/control-flow-enfo
>> rcement-technology-preview.pdf
>>
>> gas/
>>
>>       * config/tc-i386.c (cpu_arch): Add .cet.
>>       * doc/c-i386.texi: Document cet.
>>       * testsuite/gas/i386/cet-intel.d: New file.
>>       * testsuite/gas/i386/cet.d: Likewise.
>>       * testsuite/gas/i386/cet.s: Likewise.
>>       * testsuite/gas/i386/x86-64-cet-intel.d: Likewise.
>>       * testsuite/gas/i386/x86-64-cet.d: Likewise.
>>       * testsuite/gas/i386/x86-64-cet.s: Likewise.
>>       * testsuite/gas/i386/i386.exp: Run Intel CET tests.
>>
>> opcodes/
>>
>>       * i386-dis.c (REG_0F1E_MOD_3): New enum.
>>       (MOD_0F1E_PREFIX_1): Likewise.
>>       (MOD_0F38F5_PREFIX_2): Likewise.
>>       (MOD_0F38F6_PREFIX_0): Likewise.
>>       (RM_0F1E_MOD_3_REG_7): Likewise.
>>       (PREFIX_MOD_0_0F01_REG_5): Likewise.
>>       (PREFIX_MOD_3_0F01_REG_5_RM_1): Likewise.
>>       (PREFIX_MOD_3_0F01_REG_5_RM_2): Likewise.
>>       (PREFIX_0F1E): Likewise.
>>       (PREFIX_MOD_0_0FAE_REG_5): Likewise.
>>       (PREFIX_0F38F5): Likewise.
>>       (dis386_twobyte): Use PREFIX_0F1E.
>>       (reg_table): Add REG_0F1E_MOD_3.
>>       (prefix_table): Add PREFIX_MOD_0_0F01_REG_5,
>>       PREFIX_MOD_3_0F01_REG_5_RM_1, PREFIX_MOD_3_0F01_REG_5_RM_2,
>>       PREFIX_0F1E, PREFIX_MOD_0_0FAE_REG_5 and PREFIX_0F38F5.  Update
>>       PREFIX_0FAE_REG_6 and PREFIX_0F38F6.
>>       (three_byte_table): Use PREFIX_0F38F5.
>>       (mod_table): Use PREFIX_MOD_0_0F01_REG_5, PREFIX_MOD_0_0FAE_REG_5.
>>       Add MOD_0F1E_PREFIX_1, MOD_0F38F5_PREFIX_2, MOD_0F38F6_PREFIX_0.
>>       (rm_table): Add MOD_0F38F5_PREFIX_2, MOD_0F38F6_PREFIX_0,
>>       RM_0F1E_MOD_3_REG_7.  Use PREFIX_MOD_3_0F01_REG_5_RM_1 and
>>       PREFIX_MOD_3_0F01_REG_5_RM_2.
>>       * i386-gen.c (cpu_flag_init): Add CPU_CET_FLAGS.
>>       (cpu_flags): Add CpuCET.
>>       * i386-opc.h (CpuCET): New enum.
>>       (CpuUnused): Commented out.
>>       (i386_cpu_flags): Add cpucet.
>>       * i386-opc.tbl: Add Intel CET instructions.
>>       * i386-init.h: Regenerated.
>>       * i386-tbl.h: Likewise.
>> ---
>>  gas/ChangeLog                             |  12 +
>>  gas/config/tc-i386.c                      |   2 +
>>  gas/doc/c-i386.texi                       |   2 +
>>  gas/testsuite/gas/i386/cet-intel.d        |  31 ++
>>  gas/testsuite/gas/i386/cet.d              |  29 ++
>>  gas/testsuite/gas/i386/cet.s              |  25 +
>>  gas/testsuite/gas/i386/i386.exp           |   4 +
>>  gas/testsuite/gas/i386/x86-64-cet-intel.d |  38 ++
>>  gas/testsuite/gas/i386/x86-64-cet.d       |  37 ++
>>  gas/testsuite/gas/i386/x86-64-cet.s       |  33 ++
>>  opcodes/ChangeLog                         |  34 ++
>>  opcodes/i386-dis.c                        | 105 ++++-
>>  opcodes/i386-gen.c                        |   3 +
>>  opcodes/i386-init.h                       | 119 ++---
>>  opcodes/i386-opc.h                        |   5 +
>>  opcodes/i386-opc.tbl                      |  19 +
>>  opcodes/i386-tbl.h                        | 730 +++++++++++++++++++-----------
>>  17 files changed, 894 insertions(+), 334 deletions(-)
>>  create mode 100644 gas/testsuite/gas/i386/cet-intel.d
>>  create mode 100644 gas/testsuite/gas/i386/cet.d
>>  create mode 100644 gas/testsuite/gas/i386/cet.s
>>  create mode 100644 gas/testsuite/gas/i386/x86-64-cet-intel.d
>>  create mode 100644 gas/testsuite/gas/i386/x86-64-cet.d
>>  create mode 100644 gas/testsuite/gas/i386/x86-64-cet.s
>>
>> diff --git a/gas/ChangeLog b/gas/ChangeLog
>> index 654b3cb..f9af65d6 100644
>> --- a/gas/ChangeLog
>> +++ b/gas/ChangeLog
>> @@ -1,5 +1,17 @@
>>  2017-03-06  H.J. Lu  <hongjiu.lu@intel.com>
>>
>> +     * config/tc-i386.c (cpu_arch): Add .cet.
>> +     * doc/c-i386.texi: Document cet.
>> +     * testsuite/gas/i386/cet-intel.d: New file.
>> +     * testsuite/gas/i386/cet.d: Likewise.
>> +     * testsuite/gas/i386/cet.s: Likewise.
>> +     * testsuite/gas/i386/x86-64-cet-intel.d: Likewise.
>> +     * testsuite/gas/i386/x86-64-cet.d: Likewise.
>> +     * testsuite/gas/i386/x86-64-cet.s: Likewise.
>> +     * testsuite/gas/i386/i386.exp: Run Intel CET tests.
>> +
>> +2017-03-06  H.J. Lu  <hongjiu.lu@intel.com>
>> +
>>       * testsuite/gas/i386/x86-64-mpx-inval-2.s: Force a good alignment.
>>       * testsuite/gas/i386/x86-64-mpx-inval-2.l: Expect [0-9A-F]+.
>>
>> diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
>> index 12b3032..7deacad 100644
>> --- a/gas/config/tc-i386.c
>> +++ b/gas/config/tc-i386.c
>> @@ -978,6 +978,8 @@ static const arch_entry cpu_arch[] =
>>      CPU_RDPID_FLAGS, 0 },
>>    { STRING_COMMA_LEN (".ptwrite"), PROCESSOR_UNKNOWN,
>>      CPU_PTWRITE_FLAGS, 0 },
>> +  { STRING_COMMA_LEN (".cet"), PROCESSOR_UNKNOWN,
>> +    CPU_CET_FLAGS, 0 },
>>  };
>>
>>  static const noarch_entry cpu_noarch[] =
>> diff --git a/gas/doc/c-i386.texi b/gas/doc/c-i386.texi
>> index 2cbffb9..0733587 100644
>> --- a/gas/doc/c-i386.texi
>> +++ b/gas/doc/c-i386.texi
>> @@ -167,6 +167,7 @@ accept various extension mnemonics.  For example,
>>  @code{sha},
>>  @code{rdpid},
>>  @code{ptwrite},
>> +@code{cet},
>>  @code{prefetchwt1},
>>  @code{clflushopt},
>>  @code{se1},
>> @@ -1198,6 +1199,7 @@ supported on the CPU specified.  The choices for
>> @var{cpu_type} are:
>>  @item @samp{.avx512vl} @tab @samp{.avx512bw} @tab @samp{.avx512dq} @tab
>> @samp{.avx512ifma}
>>  @item @samp{.avx512vbmi} @tab @samp{.avx512_4fmaps} @tab
>> @samp{.avx512_4vnniw}
>>  @item @samp{.avx512_vpopcntdq} @tab @samp{.clwb} @tab @samp{.rdpid} @tab
>> @samp{.ptwrite}
>> +@item @samp{.cet}
>>  @item @samp{.3dnow} @tab @samp{.3dnowa} @tab @samp{.sse4a} @tab
>> @samp{.sse5}
>>  @item @samp{.syscall} @tab @samp{.rdtscp} @tab @samp{.svme} @tab
>> @samp{.abm}
>>  @item @samp{.lwp} @tab @samp{.fma4} @tab @samp{.xop} @tab @samp{.cx16}
>> diff --git a/gas/testsuite/gas/i386/cet-intel.d
>> b/gas/testsuite/gas/i386/cet-intel.d
>> new file mode 100644
>> index 0000000..a5f5533
>> --- /dev/null
>> +++ b/gas/testsuite/gas/i386/cet-intel.d
>> @@ -0,0 +1,31 @@
>> +#source: cet.s
>> +#as: -J
>> +#objdump: -dw -Mintel
>> +#name: i386 CET (Intel mode)
>> +
>> +.*: +file format .*
>> +
>> +Disassembly of section .text:
>> +
>> +0+ <_start>:
>> + +[a-f0-9]+: f3 0f 01 e9             incsspd
>> + +[a-f0-9]+: f3 0f 1e c9             rdsspd ecx
>> + +[a-f0-9]+: f3 0f 01 ea             savessp
>> + +[a-f0-9]+: f3 0f 01 29             rstorssp QWORD PTR \[ecx\]
>> + +[a-f0-9]+: 0f 38 f6 04 02          wrssd  \[edx\+eax\*1\],eax
>> + +[a-f0-9]+: 66 0f 38 f5 14 2f       wrussd \[edi\+ebp\*1\],edx
>> + +[a-f0-9]+: f3 0f ae 28             setssbsy QWORD PTR \[eax\]
>> + +[a-f0-9]+: f3 0f ae 34 04          clrssbsy QWORD PTR \[esp\+eax\*1\]
>> + +[a-f0-9]+: f3 0f 1e fa             endbr64
>> + +[a-f0-9]+: f3 0f 1e fb             endbr32
>> + +[a-f0-9]+: f3 0f 01 e9             incsspd
>> + +[a-f0-9]+: f3 0f 1e c9             rdsspd ecx
>> + +[a-f0-9]+: f3 0f 01 ea             savessp
>> + +[a-f0-9]+: f3 0f 01 2c 01          rstorssp QWORD PTR \[ecx\+eax\*1\]
>> + +[a-f0-9]+: 0f 38 f6 02             wrssd  \[edx\],eax
>> + +[a-f0-9]+: 66 0f 38 f5 14 2f       wrussd \[edi\+ebp\*1\],edx
>> + +[a-f0-9]+: f3 0f ae 28             setssbsy QWORD PTR \[eax\]
>> + +[a-f0-9]+: f3 0f ae 34 04          clrssbsy QWORD PTR \[esp\+eax\*1\]
>> + +[a-f0-9]+: f3 0f 1e fa             endbr64
>> + +[a-f0-9]+: f3 0f 1e fb             endbr32
>> +#pass
>> diff --git a/gas/testsuite/gas/i386/cet.d b/gas/testsuite/gas/i386/cet.d
>> new file mode 100644
>> index 0000000..bb356e4
>> --- /dev/null
>> +++ b/gas/testsuite/gas/i386/cet.d
>> @@ -0,0 +1,29 @@
>> +#objdump: -dw
>> +#name: i386 CET
>> +
>> +.*:     file format .*
>> +
>> +Disassembly of section .text:
>> +
>> +0+ <_start>:
>> + +[a-f0-9]+: f3 0f 01 e9             incsspd
>> + +[a-f0-9]+: f3 0f 1e c9             rdsspd %ecx
>> + +[a-f0-9]+: f3 0f 01 ea             savessp
>> + +[a-f0-9]+: f3 0f 01 29             rstorssp \(%ecx\)
>> + +[a-f0-9]+: 0f 38 f6 04 02          wrssd  %eax,\(%edx,%eax,1\)
>> + +[a-f0-9]+: 66 0f 38 f5 14 2f       wrussd %edx,\(%edi,%ebp,1\)
>> + +[a-f0-9]+: f3 0f ae 28             setssbsy \(%eax\)
>> + +[a-f0-9]+: f3 0f ae 34 04          clrssbsy \(%esp,%eax,1\)
>> + +[a-f0-9]+: f3 0f 1e fa             endbr64
>> + +[a-f0-9]+: f3 0f 1e fb             endbr32
>> + +[a-f0-9]+: f3 0f 01 e9             incsspd
>> + +[a-f0-9]+: f3 0f 1e c9             rdsspd %ecx
>> + +[a-f0-9]+: f3 0f 01 ea             savessp
>> + +[a-f0-9]+: f3 0f 01 2c 01          rstorssp \(%ecx,%eax,1\)
>> + +[a-f0-9]+: 0f 38 f6 02             wrssd  %eax,\(%edx\)
>> + +[a-f0-9]+: 66 0f 38 f5 14 2f       wrussd %edx,\(%edi,%ebp,1\)
>> + +[a-f0-9]+: f3 0f ae 28             setssbsy \(%eax\)
>> + +[a-f0-9]+: f3 0f ae 34 04          clrssbsy \(%esp,%eax,1\)
>> + +[a-f0-9]+: f3 0f 1e fa             endbr64
>> + +[a-f0-9]+: f3 0f 1e fb             endbr32
>> +#pass
>> diff --git a/gas/testsuite/gas/i386/cet.s b/gas/testsuite/gas/i386/cet.s
>> new file mode 100644
>> index 0000000..deb659d
>> --- /dev/null
>> +++ b/gas/testsuite/gas/i386/cet.s
>> @@ -0,0 +1,25 @@
>> +# Check CET instructions
>> +     .text
>> +_start:
>> +     incsspd
>> +     rdsspd %ecx
>> +     savessp
>> +     rstorssp (%ecx)
>> +     wrssd %eax, (%edx, %eax)
>> +     wrussd %edx, (%edi, %ebp)
>> +     setssbsy (%eax)
>> +     clrssbsy (%esp, %eax)
>> +     endbr64
>> +     endbr32
>> +
>> +     .intel_syntax noprefix
>> +     incsspd
>> +     rdsspd ecx
>> +     savessp
>> +     rstorssp QWORD PTR [ecx + eax]
>> +     wrssd [edx],eax
>> +     wrussd [edi + ebp],edx
>> +     setssbsy QWORD PTR [eax]
>> +     clrssbsy QWORD PTR [esp + eax]
>> +     endbr64
>> +     endbr32
>> diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp
>> index 10fe71c..cc5917a 100644
>> --- a/gas/testsuite/gas/i386/i386.exp
>> +++ b/gas/testsuite/gas/i386/i386.exp
>> @@ -382,6 +382,8 @@ if [expr ([istarget "i*86-*-*"] ||  [istarget "x86_64-*-*"]) &&
>> [gas_32_check]]
>>      run_list_test "avx512vl-1" "-al"
>>      run_list_test "avx512vl-2" "-al"
>>      run_dump_test "fpu-bad"
>> +    run_dump_test "cet"
>> +    run_dump_test "cet-intel"
>>
>>      # These tests require support for 8 and 16 bit relocs,
>>      # so we only run them for ELF and COFF targets.
>> @@ -799,6 +801,8 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) &&
>> [gas_64_check]] t
>>      run_list_test "x86-64-avx512vl-1" "-al"
>>      run_list_test "x86-64-avx512vl-2" "-al"
>>      run_dump_test "x86-64-opcode-bad"
>> +    run_dump_test "x86-64-cet"
>> +    run_dump_test "x86-64-cet-intel"
>>
>>      if { ![istarget "*-*-aix*"]
>>        && ![istarget "*-*-beos*"]
>> diff --git a/gas/testsuite/gas/i386/x86-64-cet-intel.d
>> b/gas/testsuite/gas/i386/x86-64-cet-intel.d
>> new file mode 100644
>> index 0000000..07e666f
>> --- /dev/null
>> +++ b/gas/testsuite/gas/i386/x86-64-cet-intel.d
>> @@ -0,0 +1,38 @@
>> +#source: x86-64-cet.s
>> +#objdump: -dw -Mintel
>> +#name: x86-64 CET (Intel mode)
>> +
>> +.*: +file format .*
>> +
>> +Disassembly of section .text:
>> +
>> +0+ <_start>:
>> + +[a-f0-9]+: f3 0f 01 e9             incsspd
>> + +[a-f0-9]+: f3 48 0f 01 e9          incsspq
>> + +[a-f0-9]+: f3 41 0f 1e cc          rdsspd r12d
>> + +[a-f0-9]+: f3 48 0f 1e c8          rdsspq rax
>> + +[a-f0-9]+: f3 0f 01 ea             savessp
>> + +[a-f0-9]+: f3 41 0f 01 2c 24       rstorssp QWORD PTR \[r12\]
>> + +[a-f0-9]+: 41 0f 38 f6 04 24       wrssd  \[r12\],eax
>> + +[a-f0-9]+: 4a 0f 38 f6 14 39       wrssq  \[rcx\+r15\*1\],rdx
>> + +[a-f0-9]+: 66 41 0f 38 f5 04 24    wrussd \[r12\],eax
>> + +[a-f0-9]+: 66 48 0f 38 f5 0c 03    wrussq \[rbx\+rax\*1\],rcx
>> + +[a-f0-9]+: f3 0f ae 28             setssbsy QWORD PTR \[rax\]
>> + +[a-f0-9]+: f3 42 0f ae 34 26       clrssbsy QWORD PTR \[rsi\+r12\*1\]
>> + +[a-f0-9]+: f3 0f 1e fa             endbr64
>> + +[a-f0-9]+: f3 0f 1e fb             endbr32
>> + +[a-f0-9]+: f3 0f 01 e9             incsspd
>> + +[a-f0-9]+: f3 48 0f 01 e9          incsspq
>> + +[a-f0-9]+: f3 41 0f 1e cc          rdsspd r12d
>> + +[a-f0-9]+: f3 48 0f 1e c8          rdsspq rax
>> + +[a-f0-9]+: f3 0f 01 ea             savessp
>> + +[a-f0-9]+: f3 41 0f 01 2c 24       rstorssp QWORD PTR \[r12\]
>> + +[a-f0-9]+: 41 0f 38 f6 04 24       wrssd  \[r12\],eax
>> + +[a-f0-9]+: 4a 0f 38 f6 14 39       wrssq  \[rcx\+r15\*1\],rdx
>> + +[a-f0-9]+: 66 41 0f 38 f5 04 24    wrussd \[r12\],eax
>> + +[a-f0-9]+: 66 48 0f 38 f5 0c 03    wrussq \[rbx\+rax\*1\],rcx
>> + +[a-f0-9]+: f3 0f ae 28             setssbsy QWORD PTR \[rax\]
>> + +[a-f0-9]+: f3 42 0f ae 34 26       clrssbsy QWORD PTR \[rsi\+r12\*1\]
>> + +[a-f0-9]+: f3 0f 1e fa             endbr64
>> + +[a-f0-9]+: f3 0f 1e fb             endbr32
>> +#pass
>> diff --git a/gas/testsuite/gas/i386/x86-64-cet.d
>> b/gas/testsuite/gas/i386/x86-64-cet.d
>> new file mode 100644
>> index 0000000..7e5b717
>> --- /dev/null
>> +++ b/gas/testsuite/gas/i386/x86-64-cet.d
>> @@ -0,0 +1,37 @@
>> +#objdump: -dw
>> +#name: x86-64 CET
>> +
>> +.*: +file format .*
>> +
>> +Disassembly of section .text:
>> +
>> +0+ <_start>:
>> + +[a-f0-9]+: f3 0f 01 e9             incsspd
>> + +[a-f0-9]+: f3 48 0f 01 e9          incsspq
>> + +[a-f0-9]+: f3 41 0f 1e cc          rdsspd %r12d
>> + +[a-f0-9]+: f3 48 0f 1e c8          rdsspq %rax
>> + +[a-f0-9]+: f3 0f 01 ea             savessp
>> + +[a-f0-9]+: f3 41 0f 01 2c 24       rstorssp \(%r12\)
>> + +[a-f0-9]+: 41 0f 38 f6 04 24       wrssd  %eax,\(%r12\)
>> + +[a-f0-9]+: 4a 0f 38 f6 14 39       wrssq  %rdx,\(%rcx,%r15,1\)
>> + +[a-f0-9]+: 66 41 0f 38 f5 04 24    wrussd %eax,\(%r12\)
>> + +[a-f0-9]+: 66 48 0f 38 f5 0c 03    wrussq %rcx,\(%rbx,%rax,1\)
>> + +[a-f0-9]+: f3 0f ae 28             setssbsy \(%rax\)
>> + +[a-f0-9]+: f3 42 0f ae 34 26       clrssbsy \(%rsi,%r12,1\)
>> + +[a-f0-9]+: f3 0f 1e fa             endbr64
>> + +[a-f0-9]+: f3 0f 1e fb             endbr32
>> + +[a-f0-9]+: f3 0f 01 e9             incsspd
>> + +[a-f0-9]+: f3 48 0f 01 e9          incsspq
>> + +[a-f0-9]+: f3 41 0f 1e cc          rdsspd %r12d
>> + +[a-f0-9]+: f3 48 0f 1e c8          rdsspq %rax
>> + +[a-f0-9]+: f3 0f 01 ea             savessp
>> + +[a-f0-9]+: f3 41 0f 01 2c 24       rstorssp \(%r12\)
>> + +[a-f0-9]+: 41 0f 38 f6 04 24       wrssd  %eax,\(%r12\)
>> + +[a-f0-9]+: 4a 0f 38 f6 14 39       wrssq  %rdx,\(%rcx,%r15,1\)
>> + +[a-f0-9]+: 66 41 0f 38 f5 04 24    wrussd %eax,\(%r12\)
>> + +[a-f0-9]+: 66 48 0f 38 f5 0c 03    wrussq %rcx,\(%rbx,%rax,1\)
>> + +[a-f0-9]+: f3 0f ae 28             setssbsy \(%rax\)
>> + +[a-f0-9]+: f3 42 0f ae 34 26       clrssbsy \(%rsi,%r12,1\)
>> + +[a-f0-9]+: f3 0f 1e fa             endbr64
>> + +[a-f0-9]+: f3 0f 1e fb             endbr32
>> +#pass
>> diff --git a/gas/testsuite/gas/i386/x86-64-cet.s
>> b/gas/testsuite/gas/i386/x86-64-cet.s
>> new file mode 100644
>> index 0000000..15a28d7
>> --- /dev/null
>> +++ b/gas/testsuite/gas/i386/x86-64-cet.s
>> @@ -0,0 +1,33 @@
>> +# Check 64bit CET instructions
>> +     .text
>> +_start:
>> +     incsspd
>> +     incsspq
>> +     rdsspd %r12d
>> +     rdsspq %rax
>> +     savessp
>> +     rstorssp (%r12)
>> +     wrssd %eax, (%r12)
>> +     wrssq %rdx, (%rcx, %r15)
>> +     wrussd %eax, (%r12)
>> +     wrussq %rcx, (%rbx, %rax)
>> +     setssbsy (%rax)
>> +     clrssbsy (%rsi, %r12)
>> +     endbr64
>> +     endbr32
>> +
>> +     .intel_syntax noprefix
>> +     incsspd
>> +     incsspq
>> +     rdsspd r12d
>> +     rdsspq rax
>> +     savessp
>> +     rstorssp QWORD PTR [r12]
>> +     wrssd [r12],eax
>> +     wrssq [rcx+r15],rdx
>> +     wrussd [r12],eax
>> +     wrussq [rbx+rax],rcx
>> +     setssbsy QWORD PTR [rax]
>> +     clrssbsy QWORD PTR [rsi+r12]
>> +     endbr64
>> +     endbr32
>> diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
>> index 27f3235..f2b1bec 100644
>> --- a/opcodes/ChangeLog
>> +++ b/opcodes/ChangeLog
>> @@ -1,3 +1,37 @@
>> +2017-03-06  H.J. Lu  <hongjiu.lu@intel.com>
>> +
>> +     * i386-dis.c (REG_0F1E_MOD_3): New enum.
>> +     (MOD_0F1E_PREFIX_1): Likewise.
>> +     (MOD_0F38F5_PREFIX_2): Likewise.
>> +     (MOD_0F38F6_PREFIX_0): Likewise.
>> +     (RM_0F1E_MOD_3_REG_7): Likewise.
>> +     (PREFIX_MOD_0_0F01_REG_5): Likewise.
>> +     (PREFIX_MOD_3_0F01_REG_5_RM_1): Likewise.
>> +     (PREFIX_MOD_3_0F01_REG_5_RM_2): Likewise.
>> +     (PREFIX_0F1E): Likewise.
>> +     (PREFIX_MOD_0_0FAE_REG_5): Likewise.
>> +     (PREFIX_0F38F5): Likewise.
>> +     (dis386_twobyte): Use PREFIX_0F1E.
>> +     (reg_table): Add REG_0F1E_MOD_3.
>> +     (prefix_table): Add PREFIX_MOD_0_0F01_REG_5,
>> +     PREFIX_MOD_3_0F01_REG_5_RM_1, PREFIX_MOD_3_0F01_REG_5_RM_2,
>> +     PREFIX_0F1E, PREFIX_MOD_0_0FAE_REG_5 and PREFIX_0F38F5.  Update
>> +     PREFIX_0FAE_REG_6 and PREFIX_0F38F6.
>> +     (three_byte_table): Use PREFIX_0F38F5.
>> +     (mod_table): Use PREFIX_MOD_0_0F01_REG_5, PREFIX_MOD_0_0FAE_REG_5.
>> +     Add MOD_0F1E_PREFIX_1, MOD_0F38F5_PREFIX_2, MOD_0F38F6_PREFIX_0.
>> +     (rm_table): Add MOD_0F38F5_PREFIX_2, MOD_0F38F6_PREFIX_0,
>> +     RM_0F1E_MOD_3_REG_7.  Use PREFIX_MOD_3_0F01_REG_5_RM_1 and
>> +     PREFIX_MOD_3_0F01_REG_5_RM_2.
>> +     * i386-gen.c (cpu_flag_init): Add CPU_CET_FLAGS.
>> +     (cpu_flags): Add CpuCET.
>> +     * i386-opc.h (CpuCET): New enum.
>> +     (CpuUnused): Commented out.
>> +     (i386_cpu_flags): Add cpucet.
>> +     * i386-opc.tbl: Add Intel CET instructions.
>> +     * i386-init.h: Regenerated.
>> +     * i386-tbl.h: Likewise.
>> +
>>  2017-03-06  Alan Modra  <amodra@gmail.com>
>>
>>       PR 21124
>> diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c
>> index 76781a0..3980c46 100644
>> --- a/opcodes/i386-dis.c
>> +++ b/opcodes/i386-dis.c
>> @@ -723,6 +723,7 @@ enum
>>    REG_0F01,
>>    REG_0F0D,
>>    REG_0F18,
>> +  REG_0F1E_MOD_3,
>>    REG_0F71,
>>    REG_0F72,
>>    REG_0F73,
>> @@ -776,6 +777,7 @@ enum
>>    MOD_0F1A_PREFIX_0,
>>    MOD_0F1B_PREFIX_0,
>>    MOD_0F1B_PREFIX_1,
>> +  MOD_0F1E_PREFIX_1,
>>    MOD_0F24,
>>    MOD_0F26,
>>    MOD_0F2B_PREFIX_0,
>> @@ -814,6 +816,8 @@ enum
>>    MOD_0FE7_PREFIX_2,
>>    MOD_0FF0_PREFIX_3,
>>    MOD_0F382A_PREFIX_2,
>> +  MOD_0F38F5_PREFIX_2,
>> +  MOD_0F38F6_PREFIX_0,
>>    MOD_62_32BIT,
>>    MOD_C4_32BIT,
>>    MOD_C5_32BIT,
>> @@ -933,6 +937,7 @@ enum
>>    RM_0F01_REG_3,
>>    RM_0F01_REG_5,
>>    RM_0F01_REG_7,
>> +  RM_0F1E_MOD_3_REG_7,
>>    RM_0FAE_REG_5,
>>    RM_0FAE_REG_6,
>>    RM_0FAE_REG_7
>> @@ -941,12 +946,16 @@ enum
>>  enum
>>  {
>>    PREFIX_90 = 0,
>> +  PREFIX_MOD_0_0F01_REG_5,
>> +  PREFIX_MOD_3_0F01_REG_5_RM_1,
>> +  PREFIX_MOD_3_0F01_REG_5_RM_2,
>>    PREFIX_0F10,
>>    PREFIX_0F11,
>>    PREFIX_0F12,
>>    PREFIX_0F16,
>>    PREFIX_0F1A,
>>    PREFIX_0F1B,
>> +  PREFIX_0F1E,
>>    PREFIX_0F2A,
>>    PREFIX_0F2B,
>>    PREFIX_0F2C,
>> @@ -985,6 +994,7 @@ enum
>>    PREFIX_0FAE_REG_3,
>>    PREFIX_MOD_0_0FAE_REG_4,
>>    PREFIX_MOD_3_0FAE_REG_4,
>> +  PREFIX_MOD_0_0FAE_REG_5,
>>    PREFIX_0FAE_REG_6,
>>    PREFIX_0FAE_REG_7,
>>    PREFIX_0FB8,
>> @@ -1048,6 +1058,7 @@ enum
>>    PREFIX_0F38DF,
>>    PREFIX_0F38F0,
>>    PREFIX_0F38F1,
>> +  PREFIX_0F38F5,
>>    PREFIX_0F38F6,
>>    PREFIX_0F3A08,
>>    PREFIX_0F3A09,
>> @@ -2839,7 +2850,7 @@ static const struct dis386 dis386_twobyte[] = {
>>    { PREFIX_TABLE (PREFIX_0F1B) },
>>    { "nopQ",          { Ev }, 0 },
>>    { "nopQ",          { Ev }, 0 },
>> -  { "nopQ",          { Ev }, 0 },
>> +  { PREFIX_TABLE (PREFIX_0F1E) },
>>    { "nopQ",          { Ev }, 0 },
>>    /* 20 */
>>    { "movZ",          { Rm, Cm }, 0 },
>> @@ -3589,6 +3600,17 @@ static const struct dis386 reg_table[][8] = {
>>      { MOD_TABLE (MOD_0F18_REG_6) },
>>      { MOD_TABLE (MOD_0F18_REG_7) },
>>    },
>> +  /* REG_0F1E_MOD_3 */
>> +  {
>> +    { "nopQ",                { Ev }, 0 },
>> +    { "rdsspK",              { Rdq }, PREFIX_OPCODE },
>> +    { "nopQ",                { Ev }, 0 },
>> +    { "nopQ",                { Ev }, 0 },
>> +    { "nopQ",                { Ev }, 0 },
>> +    { "nopQ",                { Ev }, 0 },
>> +    { "nopQ",                { Ev }, 0 },
>> +    { RM_TABLE (RM_0F1E_MOD_3_REG_7) },
>> +  },
>>    /* REG_0F71 */
>>    {
>>      { Bad_Opcode },
>> @@ -3758,6 +3780,24 @@ static const struct dis386 prefix_table[][4] = {
>>      { NULL, { { NULL, 0 } }, PREFIX_IGNORED }
>>    },
>>
>> +  /* PREFIX_MOD_0_0F01_REG_5 */
>> +  {
>> +    { Bad_Opcode },
>> +    { "rstorssp",    { Mq }, PREFIX_OPCODE },
>> +  },
>> +
>> +  /* PREFIX_MOD_3_0F01_REG_5_RM_1 */
>> +  {
>> +    { Bad_Opcode },
>> +    { "incsspK",     { Skip_MODRM }, PREFIX_OPCODE },
>> +  },
>> +
>> +  /* PREFIX_MOD_3_0F01_REG_5_RM_2 */
>> +  {
>> +    { Bad_Opcode },
>> +    { "savessp",     { Skip_MODRM }, PREFIX_OPCODE },
>> +  },
>> +
>>    /* PREFIX_0F10 */
>>    {
>>      { "movups",      { XM, EXx }, PREFIX_OPCODE },
>> @@ -3805,6 +3845,14 @@ static const struct dis386 prefix_table[][4] = {
>>      { "bndcn",  { Gbnd, Ev_bnd }, 0 },
>>    },
>>
>> +  /* PREFIX_0F1E */
>> +  {
>> +    { "nopQ",        { Ev }, PREFIX_OPCODE },
>> +    { MOD_TABLE (MOD_0F1E_PREFIX_1) },
>> +    { "nopQ",        { Ev }, PREFIX_OPCODE },
>> +    { "nopQ",        { Ev }, PREFIX_OPCODE },
>> +  },
>> +
>>    /* PREFIX_0F2A */
>>    {
>>      { "cvtpi2ps", { XM, EMCq }, PREFIX_OPCODE },
>> @@ -4080,11 +4128,17 @@ static const struct dis386 prefix_table[][4] = {
>>      { "ptwrite%LQ", { Edq }, 0 },
>>    },
>>
>> +  /* PREFIX_MOD_0_0FAE_REG_5 */
>> +  {
>> +    { "xrstor",              { FXSAVE }, PREFIX_OPCODE },
>> +    { "setssbsy",    { Mq }, PREFIX_OPCODE },
>> +  },
>> +
>>    /* PREFIX_0FAE_REG_6 */
>>    {
>> -    { "xsaveopt",      { FXSAVE }, 0 },
>> -    { Bad_Opcode },
>> -    { "clwb",        { Mb }, 0 },
>> +    { "xsaveopt",    { FXSAVE }, PREFIX_OPCODE },
>> +    { "clrssbsy",    { Mq }, PREFIX_OPCODE },
>> +    { "clwb",        { Mb }, PREFIX_OPCODE },
>>    },
>>
>>    /* PREFIX_0FAE_REG_7 */
>> @@ -4513,9 +4567,16 @@ static const struct dis386 prefix_table[][4] = {
>>      { "crc32",       { Gdq, { CRC32_Fixup, v_mode } }, PREFIX_OPCODE },
>>    },
>>
>> -  /* PREFIX_0F38F6 */
>> +  /* PREFIX_0F38F5 */
>>    {
>>      { Bad_Opcode },
>> +    { Bad_Opcode },
>> +    { MOD_TABLE (MOD_0F38F5_PREFIX_2) },
>> +  },
>> +
>> +  /* PREFIX_0F38F6 */
>> +  {
>> +    { MOD_TABLE (MOD_0F38F6_PREFIX_0) },
>>      { "adoxS",       { Gdq, Edq}, PREFIX_OPCODE },
>>      { "adcxS",       { Gdq, Edq}, PREFIX_OPCODE },
>>      { Bad_Opcode },
>> @@ -7246,7 +7307,7 @@ static const struct dis386 three_byte_table[][256] = {
>>      { Bad_Opcode },
>>      { Bad_Opcode },
>>      { Bad_Opcode },
>> -    { Bad_Opcode },
>> +    { PREFIX_TABLE (PREFIX_0F38F5) },
>>      { PREFIX_TABLE (PREFIX_0F38F6) },
>>      { Bad_Opcode },
>>      /* f8 */
>> @@ -11406,7 +11467,7 @@ static const struct dis386 mod_table[][2] = {
>>    },
>>    {
>>      /* MOD_0F01_REG_5 */
>> -    { Bad_Opcode },
>> +    { PREFIX_TABLE (PREFIX_MOD_0_0F01_REG_5) },
>>      { RM_TABLE (RM_0F01_REG_5) },
>>    },
>>    {
>> @@ -11480,6 +11541,11 @@ static const struct dis386 mod_table[][2] = {
>>      { "nopQ",                { Ev }, 0 },
>>    },
>>    {
>> +    /* MOD_0F1E_PREFIX_1 */
>> +    { "nopQ",                { Ev }, 0 },
>> +    { REG_TABLE (REG_0F1E_MOD_3) },
>> +  },
>> +  {
>>      /* MOD_0F24 */
>>      { Bad_Opcode },
>>      { "movL",                { Rd, Td }, 0 },
>> @@ -11587,7 +11653,7 @@ static const struct dis386 mod_table[][2] = {
>>    },
>>    {
>>      /* MOD_0FAE_REG_5 */
>> -    { "xrstor",              { FXSAVE }, 0 },
>> +    { PREFIX_TABLE (PREFIX_MOD_0_0FAE_REG_5) },
>>      { RM_TABLE (RM_0FAE_REG_5) },
>>    },
>>    {
>> @@ -11656,6 +11722,14 @@ static const struct dis386 mod_table[][2] = {
>>      { "movntdqa",    { XM, Mx }, 0 },
>>    },
>>    {
>> +    /* MOD_0F38F5_PREFIX_2 */
>> +    { "wrussK",              { M, Gdq }, PREFIX_OPCODE },
>> +  },
>> +  {
>> +    /* MOD_0F38F6_PREFIX_0 */
>> +    { "wrssK",               { M, Gdq }, PREFIX_OPCODE },
>> +  },
>> +  {
>>      /* MOD_62_32BIT */
>>      { "bound{S|}",   { Gv, Ma }, 0 },
>>      { EVEX_TABLE (EVEX_0F) },
>> @@ -12157,8 +12231,8 @@ static const struct dis386 rm_table[][8] = {
>>    {
>>      /* RM_0F01_REG_5 */
>>      { Bad_Opcode },
>> -    { Bad_Opcode },
>> -    { Bad_Opcode },
>> +    { PREFIX_TABLE (PREFIX_MOD_3_0F01_REG_5_RM_1) },
>> +    { PREFIX_TABLE (PREFIX_MOD_3_0F01_REG_5_RM_2) },
>>      { Bad_Opcode },
>>      { Bad_Opcode },
>>      { Bad_Opcode },
>> @@ -12174,6 +12248,17 @@ static const struct dis386 rm_table[][8] = {
>>      { "clzero",              { Skip_MODRM }, 0  },
>>    },
>>    {
>> +    /* RM_0F1E_MOD_3_REG_7 */
>> +    { "nopQ",                { Ev }, 0 },
>> +    { "nopQ",                { Ev }, 0 },
>> +    { "endbr64",     { Skip_MODRM },  PREFIX_OPCODE },
>> +    { "endbr32",     { Skip_MODRM },  PREFIX_OPCODE },
>> +    { "nopQ",                { Ev }, 0 },
>> +    { "nopQ",                { Ev }, 0 },
>> +    { "nopQ",                { Ev }, 0 },
>> +    { "nopQ",                { Ev }, 0 },
>> +  },
>> +  {
>>      /* RM_0FAE_REG_5 */
>>      { "lfence",              { Skip_MODRM }, 0 },
>>    },
>> diff --git a/opcodes/i386-gen.c b/opcodes/i386-gen.c
>> index df17851..4736afa 100644
>> --- a/opcodes/i386-gen.c
>> +++ b/opcodes/i386-gen.c
>> @@ -263,6 +263,8 @@ static initializer cpu_flag_init[] =
>>      "CpuRDPID" },
>>    { "CPU_PTWRITE_FLAGS",
>>      "CpuPTWRITE" },
>> +  { "CPU_CET_FLAGS",
>> +    "CpuCET" },
>>    { "CPU_ANY_X87_FLAGS",
>>      "CPU_ANY_287_FLAGS|Cpu8087" },
>>    { "CPU_ANY_287_FLAGS",
>> @@ -524,6 +526,7 @@ static bitfield cpu_flags[] =
>>    BITFIELD (CpuOSPKE),
>>    BITFIELD (CpuRDPID),
>>    BITFIELD (CpuPTWRITE),
>> +  BITFIELD (CpuCET),
>>    BITFIELD (CpuRegMMX),
>>    BITFIELD (CpuRegXMM),
>>    BITFIELD (CpuRegYMM),
>> diff --git a/opcodes/i386-opc.h b/opcodes/i386-opc.h
>> index 140235f..9e4355c 100644
>> --- a/opcodes/i386-opc.h
>> +++ b/opcodes/i386-opc.h
>> @@ -208,6 +208,8 @@ enum
>>    CpuRDPID,
>>    /* PTWRITE instruction required */
>>    CpuPTWRITE,
>> +  /* CET instruction support required */
>> +  CpuCET,
>>    /* MMX register support required */
>>    CpuRegMMX,
>>    /* XMM register support required */
>> @@ -233,7 +235,9 @@ enum
>>
>>  /* If you get a compiler error for zero width of the unused field,
>>     comment it out.  */
>> +#if 0
>>  #define CpuUnused    (CpuMax + 1)
>> +#endif
>>
>>  /* We can check if an instruction is available with array instead
>>     of bitfield. */
>> @@ -329,6 +333,7 @@ typedef union i386_cpu_flags
>>        unsigned int cpuospke:1;
>>        unsigned int cpurdpid:1;
>>        unsigned int cpuptwrite:1;
>> +      unsigned int cpucet:1;
>>        unsigned int cpuregmmx:1;
>>        unsigned int cpuregxmm:1;
>>        unsigned int cpuregymm:1;
>> diff --git a/opcodes/i386-opc.tbl b/opcodes/i386-opc.tbl
>> index 163a4e4..4c259d5 100644
>> --- a/opcodes/i386-opc.tbl
>> +++ b/opcodes/i386-opc.tbl
>> @@ -5996,3 +5996,22 @@ rdpid, 1, 0xf30fc7, 0x7, 2, CpuRDPID|Cpu64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_
>>  ptwrite, 1, 0xf30fae, 0x4, 2, CpuPTWRITE, Modrm|CheckRegSize|No_bSuf|No_wSuf|No_sSuf|No_ldSuf, { Reg32|Reg64|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
>>
>>  // PTWRITE instructions end.
>> +
>> +// CET instructions.
>> +
>> +incsspd, 0, 0xf30f01e9, None, 3, CpuCET, IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { 0 }
>> +incsspq, 0, 0xf30f01e9, None, 3, CpuCET|Cpu64, IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|Rex64, { 0 }
>> +rdsspd, 1, 0xf30f1e, 0x1, 2, CpuCET, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { Reg32 }
>> +rdsspq, 1, 0xf30f1e, 0x1, 2, CpuRDPID|Cpu64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|Rex64, { Reg64 }
>> +savessp, 0, 0xf30f01ea, None, 3, CpuCET, IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { 0 }
>> +rstorssp, 1, 0xf30f01, 0x5, 2, CpuCET, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|NoRex64, { Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
>> +wrssd, 2, 0x0f38f6, None, 3, CpuCET, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { Reg32, Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
>> +wrssq, 2, 0x0f38f6, None, 3, CpuCET|Cpu64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|Rex64, { Reg64, Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
>> +wrussd, 2, 0x660f38f5, None, 3, CpuCET, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { Reg32, Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
>> +wrussq, 2, 0x660f38f5, None, 3, CpuCET|Cpu64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|Rex64, { Reg64, Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
>
> I think using "d" suffixes here is rather inconsistent with all other
> AT&T syntax GPR-accessing instructions - this suffix is strictly
> Intel syntax outside of SIMD. Please seriously consider switching
> to conventional AT&T suffix handling for these.
>

I prefer to keep them the same as ISA, similar to movd/movq.


-- 
H.J.

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

* Re: [committed, PATCH] Add support for Intel CET instructions
  2017-03-06 23:29 [committed, PATCH] Add support for Intel CET instructions H.J. Lu
  2017-03-07  8:59 ` Jan Beulich
@ 2017-03-09 15:45 ` H.J. Lu
  1 sibling, 0 replies; 4+ messages in thread
From: H.J. Lu @ 2017-03-09 15:45 UTC (permalink / raw)
  To: Binutils

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

On Mon, Mar 6, 2017 at 3:28 PM, H.J. Lu <hongjiu.lu@intel.com> wrote:
> Support Intel Control-flow Enforcement Technology (CET) instructions:
>
> https://software.intel.com/sites/default/files/managed/4d/2a/control-flow-enforcement-technology-preview.pdf
>
> gas/
>
>         * config/tc-i386.c (cpu_arch): Add .cet.
>         * doc/c-i386.texi: Document cet.
>         * testsuite/gas/i386/cet-intel.d: New file.
>         * testsuite/gas/i386/cet.d: Likewise.
>         * testsuite/gas/i386/cet.s: Likewise.
>         * testsuite/gas/i386/x86-64-cet-intel.d: Likewise.
>         * testsuite/gas/i386/x86-64-cet.d: Likewise.
>         * testsuite/gas/i386/x86-64-cet.s: Likewise.
>         * testsuite/gas/i386/i386.exp: Run Intel CET tests.
>
> opcodes/
>
>         * i386-dis.c (REG_0F1E_MOD_3): New enum.
>         (MOD_0F1E_PREFIX_1): Likewise.
>         (MOD_0F38F5_PREFIX_2): Likewise.
>         (MOD_0F38F6_PREFIX_0): Likewise.
>         (RM_0F1E_MOD_3_REG_7): Likewise.
>         (PREFIX_MOD_0_0F01_REG_5): Likewise.
>         (PREFIX_MOD_3_0F01_REG_5_RM_1): Likewise.
>         (PREFIX_MOD_3_0F01_REG_5_RM_2): Likewise.
>         (PREFIX_0F1E): Likewise.
>         (PREFIX_MOD_0_0FAE_REG_5): Likewise.
>         (PREFIX_0F38F5): Likewise.
>         (dis386_twobyte): Use PREFIX_0F1E.
>         (reg_table): Add REG_0F1E_MOD_3.
>         (prefix_table): Add PREFIX_MOD_0_0F01_REG_5,
>         PREFIX_MOD_3_0F01_REG_5_RM_1, PREFIX_MOD_3_0F01_REG_5_RM_2,
>         PREFIX_0F1E, PREFIX_MOD_0_0FAE_REG_5 and PREFIX_0F38F5.  Update
>         PREFIX_0FAE_REG_6 and PREFIX_0F38F6.
>         (three_byte_table): Use PREFIX_0F38F5.
>         (mod_table): Use PREFIX_MOD_0_0F01_REG_5, PREFIX_MOD_0_0FAE_REG_5.
>         Add MOD_0F1E_PREFIX_1, MOD_0F38F5_PREFIX_2, MOD_0F38F6_PREFIX_0.
>         (rm_table): Add MOD_0F38F5_PREFIX_2, MOD_0F38F6_PREFIX_0,
>         RM_0F1E_MOD_3_REG_7.  Use PREFIX_MOD_3_0F01_REG_5_RM_1 and
>         PREFIX_MOD_3_0F01_REG_5_RM_2.
>         * i386-gen.c (cpu_flag_init): Add CPU_CET_FLAGS.
>         (cpu_flags): Add CpuCET.
>         * i386-opc.h (CpuCET): New enum.
>         (CpuUnused): Commented out.
>         (i386_cpu_flags): Add cpucet.
>         * i386-opc.tbl: Add Intel CET instructions.
>         * i386-init.h: Regenerated.
>         * i386-tbl.h: Likewise.


I checked in this to fix a typo.

-- 
H.J.

[-- Attachment #2: 0001-Use-CpuCET-on-rdsspq.patch --]
[-- Type: text/x-patch, Size: 2809 bytes --]

From c1fe188b154a4e81372629316be3d3a7820efdac Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Thu, 9 Mar 2017 07:43:48 -0800
Subject: [PATCH] Use CpuCET on rdsspq

	* i386-opc.tbl: Use CpuCET on rdsspq.
	* i386-tbl.h: Regenerated.
---
 opcodes/ChangeLog    | 5 +++++
 opcodes/i386-opc.tbl | 2 +-
 opcodes/i386-tbl.h   | 2 +-
 3 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index 52b6a92..0eae000 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -1,3 +1,8 @@
+2017-03-09  H.J. Lu  <hongjiu.lu@intel.com>
+
+	* i386-opc.tbl: Use CpuCET on rdsspq.
+	* i386-tbl.h: Regenerated.
+
 2017-03-08  Peter Bergner  <bergner@vnet.ibm.com>
 
 	* ppc-dis.c (ppc_opts) <altivec>: Do not use PPC_OPCODE_ALTIVEC2;
diff --git a/opcodes/i386-opc.tbl b/opcodes/i386-opc.tbl
index 4c259d5..1e16932 100644
--- a/opcodes/i386-opc.tbl
+++ b/opcodes/i386-opc.tbl
@@ -6002,7 +6002,7 @@ ptwrite, 1, 0xf30fae, 0x4, 2, CpuPTWRITE, Modrm|CheckRegSize|No_bSuf|No_wSuf|No_
 incsspd, 0, 0xf30f01e9, None, 3, CpuCET, IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { 0 }
 incsspq, 0, 0xf30f01e9, None, 3, CpuCET|Cpu64, IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|Rex64, { 0 }
 rdsspd, 1, 0xf30f1e, 0x1, 2, CpuCET, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { Reg32 }
-rdsspq, 1, 0xf30f1e, 0x1, 2, CpuRDPID|Cpu64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|Rex64, { Reg64 }
+rdsspq, 1, 0xf30f1e, 0x1, 2, CpuCET|Cpu64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|Rex64, { Reg64 }
 savessp, 0, 0xf30f01ea, None, 3, CpuCET, IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { 0 }
 rstorssp, 1, 0xf30f01, 0x5, 2, CpuCET, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|NoRex64, { Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
 wrssd, 2, 0x0f38f6, None, 3, CpuCET, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { Reg32, Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
diff --git a/opcodes/i386-tbl.h b/opcodes/i386-tbl.h
index 17033d2..eaf3a40 100644
--- a/opcodes/i386-tbl.h
+++ b/opcodes/i386-tbl.h
@@ -91946,7 +91946,7 @@ const insn_template i386_optab[] =
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0, 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, 1, 0, 0, 0, 0, 0, 1, 0 } },
     { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1,
       1, 1, 1, 1, 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,
-- 
2.9.3


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

end of thread, other threads:[~2017-03-09 15:45 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-03-06 23:29 [committed, PATCH] Add support for Intel CET instructions H.J. Lu
2017-03-07  8:59 ` Jan Beulich
2017-03-07 15:48   ` H.J. Lu
2017-03-09 15:45 ` H.J. Lu

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).