This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PATCH: Check for lock without a lockable instruction


Hi,

The lock prefix is valid only on add, adc, and, btc, btr, bts, cmpxchg,
cmpxch8b, dec, inc, neg, not, or, sbb, sub, xor, xadd and xchg with
a memory operand.  I am checking in this patch to check for it.

Thanks.


H.J.
---
gas/

2009-11-12  H.J. Lu  <hongjiu.lu@intel.com>

	* config/tc-i386.c (LOCKREP_PREFIX): Removed.
	(REP_PREFIX): New.
	(LOCK_PREFIX): Likewise.
	(PREFIX_GROUP): Likewise.
	(REX_PREFIX): Updated.
	(MAX_PREFIXES): Likewise.
	(add_prefix): Updated.  Return enum PREFIX_GROUP.
	(md_assemble): Check for lock without a lockable instruction.
	(parse_insn): Updated.
	(output_insn): Likewise.

gas/testsuite/

2009-11-12  H.J. Lu  <hongjiu.lu@intel.com>

	* gas/i386/i386.exp: Run lock-1, lock-1-intel, lockbad-1,
	x86-64-lock-1, x86-64-lock-1-intel and x86-64-lockbad-1.

	* gas/i386/lock-1-intel.d: New.
	* gas/i386/lock-1.d: Likewise.
	* gas/i386/lock-1.s: Likewise.
	* gas/i386/lockbad-1.l: Likewise.
	* gas/i386/lockbad-1.s: Likewise.
	* gas/i386/x86-64-lock-1-intel.d: Likewise.
	* gas/i386/x86-64-lock-1.d: Likewise.
	* gas/i386/x86-64-lock-1.s: Likewise.
	* gas/i386/x86-64-lockbad-1.l: Likewise.
	* gas/i386/x86-64-lockbad-1.s: Likewise.

opcodes/

2009-11-12  H.J. Lu  <hongjiu.lu@intel.com>

	* i386-gen.c (opcode_modifiers): Add IsLockable.

	* i386-opc.h (IsLockable): New.
	(i386_opcode_modifier): Add islockable.

	* i386-opc.tbl: Add IsLockable to add, adc, and, btc, btr,
	bts, cmpxchg, cmpxch8b, dec, inc, neg, not, or, sbb, sub,
	xor, xadd and xchg.
	* i386-tbl.h: Regenerated.

diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index e787215..4f80e98 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -59,14 +59,15 @@
    WAIT_PREFIX must be the first prefix since FWAIT is really is an
    instruction, and so must come before any prefixes.
    The preferred prefix order is SEG_PREFIX, ADDR_PREFIX, DATA_PREFIX,
-   LOCKREP_PREFIX.  */
+   REP_PREFIX, LOCK_PREFIX.  */
 #define WAIT_PREFIX	0
 #define SEG_PREFIX	1
 #define ADDR_PREFIX	2
 #define DATA_PREFIX	3
-#define LOCKREP_PREFIX	4
-#define REX_PREFIX	5       /* must come last.  */
-#define MAX_PREFIXES	6	/* max prefixes per opcode */
+#define REP_PREFIX	4
+#define LOCK_PREFIX	5
+#define REX_PREFIX	6       /* must come last.  */
+#define MAX_PREFIXES	7	/* max prefixes per opcode */
 
 /* we define the syntax here (modulo base,index,scale syntax) */
 #define REGISTER_PREFIX '%'
@@ -1783,13 +1784,26 @@ offset_in_range (offsetT val, int size)
   return val & mask;
 }
 
-/* Returns 0 if attempting to add a prefix where one from the same
-   class already exists, 1 if non rep/repne added, 2 if rep/repne
-   added.  */
-static int
+enum PREFIX_GROUP
+{
+  PREFIX_EXIST = 0,
+  PREFIX_LOCK,
+  PREFIX_REP,
+  PREFIX_OTHER
+};
+
+/* Returns
+   a. PREFIX_EXIST if attempting to add a prefix where one from the
+   same class already exists.
+   b. PREFIX_LOCK if lock prefix is added.
+   c. PREFIX_REP if rep/repne prefix is added.
+   d. PREFIX_OTHER if other prefix is added.
+ */
+
+static enum PREFIX_GROUP
 add_prefix (unsigned int prefix)
 {
-  int ret = 1;
+  enum PREFIX_GROUP ret = PREFIX_OTHER;
   unsigned int q;
 
   if (prefix >= REX_OPCODE && prefix < REX_OPCODE + 16
@@ -1798,7 +1812,7 @@ add_prefix (unsigned int prefix)
       if ((i.prefix[REX_PREFIX] & prefix & REX_W)
 	  || ((i.prefix[REX_PREFIX] & (REX_R | REX_X | REX_B))
 	      && (prefix & (REX_R | REX_X | REX_B))))
-	ret = 0;
+	ret = PREFIX_EXIST;
       q = REX_PREFIX;
     }
   else
@@ -1819,10 +1833,13 @@ add_prefix (unsigned int prefix)
 
 	case REPNE_PREFIX_OPCODE:
 	case REPE_PREFIX_OPCODE:
-	  ret = 2;
-	  /* fall thru */
+	  q = REP_PREFIX;
+	  ret = PREFIX_REP;
+	  break;
+
 	case LOCK_PREFIX_OPCODE:
-	  q = LOCKREP_PREFIX;
+	  q = LOCK_PREFIX;
+	  ret = PREFIX_LOCK;
 	  break;
 
 	case FWAIT_OPCODE:
@@ -1838,7 +1855,7 @@ add_prefix (unsigned int prefix)
 	  break;
 	}
       if (i.prefix[q] != 0)
-	ret = 0;
+	ret = PREFIX_EXIST;
     }
 
   if (ret)
@@ -2915,6 +2932,15 @@ md_assemble (char *line)
     if (!add_prefix (FWAIT_OPCODE))
       return;
 
+  /* Check for lock without a lockable instruction.  */
+  if (i.prefix[LOCK_PREFIX]
+      && (!i.tm.opcode_modifier.islockable
+	  || i.mem_operands == 0))
+    {
+      as_bad (_("expecting lockable instruction after `lock'"));
+      return;
+    }
+
   /* Check string instruction segment overrides.  */
   if (i.tm.opcode_modifier.isstring && i.mem_operands != 0)
     {
@@ -3111,11 +3137,13 @@ parse_insn (char *line, char *mnemonic)
 	  /* Add prefix, checking for repeated prefixes.  */
 	  switch (add_prefix (current_templates->start->base_opcode))
 	    {
-	    case 0:
+	    case PREFIX_EXIST:
 	      return NULL;
-	    case 2:
+	    case PREFIX_REP:
 	      expecting_string_instruction = current_templates->start->name;
 	      break;
+	    default:
+	      break;
 	    }
 	  /* Skip past PREFIX_SEPARATOR and reset token_start.  */
 	  token_start = ++l;
@@ -5636,7 +5664,7 @@ output_insn (void)
 		    {
 check_prefix:
 		      if (prefix != REPE_PREFIX_OPCODE
-			  || (i.prefix[LOCKREP_PREFIX]
+			  || (i.prefix[REP_PREFIX]
 			      != REPE_PREFIX_OPCODE))
 			add_prefix (prefix);
 		    }
diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp
index 52b57b6..bcdeec5 100644
--- a/gas/testsuite/gas/i386/i386.exp
+++ b/gas/testsuite/gas/i386/i386.exp
@@ -63,6 +63,9 @@ if [expr ([istarget "i*86-*-*"] ||  [istarget "x86_64-*-*"]) && [gas_32_check]]
     run_dump_test "ssse3"
     run_dump_test "rep"
     run_dump_test "rep-suffix"
+    run_dump_test "lock-1"
+    run_dump_test "lock-1-intel"
+    run_list_test "lockbad-1" "-al"
     run_dump_test "fp"
     run_dump_test "nops"
     run_dump_test "nops16-1"
@@ -251,6 +254,9 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_64_check]] t
     run_dump_test "x86-64-ssse3"
     run_dump_test "x86-64-rep"
     run_dump_test "x86-64-rep-suffix"
+    run_dump_test "x86-64-lock-1"
+    run_dump_test "x86-64-lock-1-intel"
+    run_list_test "x86-64-lockbad-1" "-al"
     run_dump_test "x86-64-cbw"
     run_dump_test "x86-64-cbw-intel"
     run_dump_test "x86-64-io"
diff --git a/gas/testsuite/gas/i386/lock-1-intel.d b/gas/testsuite/gas/i386/lock-1-intel.d
new file mode 100644
index 0000000..9897a92
--- /dev/null
+++ b/gas/testsuite/gas/i386/lock-1-intel.d
@@ -0,0 +1,69 @@
+#objdump: -dwMintel
+#name: i386 lockable insns (Intel disassembly)
+#source: lock-1.s
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+0+ <foo>:
+[ 	]*[a-f0-9]+:	f0 03 03             	lock add eax,DWORD PTR \[ebx\]
+[ 	]*[a-f0-9]+:	f0 83 03 64          	lock add DWORD PTR \[ebx\],0x64
+[ 	]*[a-f0-9]+:	f0 13 03             	lock adc eax,DWORD PTR \[ebx\]
+[ 	]*[a-f0-9]+:	f0 83 13 64          	lock adc DWORD PTR \[ebx\],0x64
+[ 	]*[a-f0-9]+:	f0 23 03             	lock and eax,DWORD PTR \[ebx\]
+[ 	]*[a-f0-9]+:	f0 83 23 64          	lock and DWORD PTR \[ebx\],0x64
+[ 	]*[a-f0-9]+:	f0 0f bb 03          	lock btc DWORD PTR \[ebx\],eax
+[ 	]*[a-f0-9]+:	f0 0f ba 3b 64       	lock btc DWORD PTR \[ebx\],0x64
+[ 	]*[a-f0-9]+:	f0 0f b3 03          	lock btr DWORD PTR \[ebx\],eax
+[ 	]*[a-f0-9]+:	f0 0f ba 33 64       	lock btr DWORD PTR \[ebx\],0x64
+[ 	]*[a-f0-9]+:	f0 0f ab 03          	lock bts DWORD PTR \[ebx\],eax
+[ 	]*[a-f0-9]+:	f0 0f ba 2b 64       	lock bts DWORD PTR \[ebx\],0x64
+[ 	]*[a-f0-9]+:	f0 0f b1 03          	lock cmpxchg DWORD PTR \[ebx\],eax
+[ 	]*[a-f0-9]+:	f0 0f c7 0b          	lock cmpxchg8b QWORD PTR \[ebx\]
+[ 	]*[a-f0-9]+:	f0 ff 0b             	lock dec DWORD PTR \[ebx\]
+[ 	]*[a-f0-9]+:	f0 ff 03             	lock inc DWORD PTR \[ebx\]
+[ 	]*[a-f0-9]+:	f0 f7 1b             	lock neg DWORD PTR \[ebx\]
+[ 	]*[a-f0-9]+:	f0 f7 13             	lock not DWORD PTR \[ebx\]
+[ 	]*[a-f0-9]+:	f0 0b 03             	lock or eax,DWORD PTR \[ebx\]
+[ 	]*[a-f0-9]+:	f0 83 0b 64          	lock or DWORD PTR \[ebx\],0x64
+[ 	]*[a-f0-9]+:	f0 1b 03             	lock sbb eax,DWORD PTR \[ebx\]
+[ 	]*[a-f0-9]+:	f0 83 1b 64          	lock sbb DWORD PTR \[ebx\],0x64
+[ 	]*[a-f0-9]+:	f0 2b 03             	lock sub eax,DWORD PTR \[ebx\]
+[ 	]*[a-f0-9]+:	f0 83 2b 64          	lock sub DWORD PTR \[ebx\],0x64
+[ 	]*[a-f0-9]+:	f0 0f c1 03          	lock xadd DWORD PTR \[ebx\],eax
+[ 	]*[a-f0-9]+:	f0 87 03             	lock xchg DWORD PTR \[ebx\],eax
+[ 	]*[a-f0-9]+:	f0 87 03             	lock xchg DWORD PTR \[ebx\],eax
+[ 	]*[a-f0-9]+:	f0 33 03             	lock xor eax,DWORD PTR \[ebx\]
+[ 	]*[a-f0-9]+:	f0 83 33 64          	lock xor DWORD PTR \[ebx\],0x64
+[ 	]*[a-f0-9]+:	f0 03 03             	lock add eax,DWORD PTR \[ebx\]
+[ 	]*[a-f0-9]+:	f0 83 03 64          	lock add DWORD PTR \[ebx\],0x64
+[ 	]*[a-f0-9]+:	f0 13 03             	lock adc eax,DWORD PTR \[ebx\]
+[ 	]*[a-f0-9]+:	f0 83 13 64          	lock adc DWORD PTR \[ebx\],0x64
+[ 	]*[a-f0-9]+:	f0 23 03             	lock and eax,DWORD PTR \[ebx\]
+[ 	]*[a-f0-9]+:	f0 83 23 64          	lock and DWORD PTR \[ebx\],0x64
+[ 	]*[a-f0-9]+:	f0 0f bb 03          	lock btc DWORD PTR \[ebx\],eax
+[ 	]*[a-f0-9]+:	f0 0f ba 3b 64       	lock btc DWORD PTR \[ebx\],0x64
+[ 	]*[a-f0-9]+:	f0 0f b3 03          	lock btr DWORD PTR \[ebx\],eax
+[ 	]*[a-f0-9]+:	f0 0f ba 33 64       	lock btr DWORD PTR \[ebx\],0x64
+[ 	]*[a-f0-9]+:	f0 0f ab 03          	lock bts DWORD PTR \[ebx\],eax
+[ 	]*[a-f0-9]+:	f0 0f ba 2b 64       	lock bts DWORD PTR \[ebx\],0x64
+[ 	]*[a-f0-9]+:	f0 0f b1 03          	lock cmpxchg DWORD PTR \[ebx\],eax
+[ 	]*[a-f0-9]+:	f0 0f c7 0b          	lock cmpxchg8b QWORD PTR \[ebx\]
+[ 	]*[a-f0-9]+:	f0 ff 0b             	lock dec DWORD PTR \[ebx\]
+[ 	]*[a-f0-9]+:	f0 ff 03             	lock inc DWORD PTR \[ebx\]
+[ 	]*[a-f0-9]+:	f0 f7 1b             	lock neg DWORD PTR \[ebx\]
+[ 	]*[a-f0-9]+:	f0 f7 13             	lock not DWORD PTR \[ebx\]
+[ 	]*[a-f0-9]+:	f0 0b 03             	lock or eax,DWORD PTR \[ebx\]
+[ 	]*[a-f0-9]+:	f0 83 0b 64          	lock or DWORD PTR \[ebx\],0x64
+[ 	]*[a-f0-9]+:	f0 1b 03             	lock sbb eax,DWORD PTR \[ebx\]
+[ 	]*[a-f0-9]+:	f0 83 1b 64          	lock sbb DWORD PTR \[ebx\],0x64
+[ 	]*[a-f0-9]+:	f0 2b 03             	lock sub eax,DWORD PTR \[ebx\]
+[ 	]*[a-f0-9]+:	f0 83 2b 64          	lock sub DWORD PTR \[ebx\],0x64
+[ 	]*[a-f0-9]+:	f0 0f c1 03          	lock xadd DWORD PTR \[ebx\],eax
+[ 	]*[a-f0-9]+:	f0 87 03             	lock xchg DWORD PTR \[ebx\],eax
+[ 	]*[a-f0-9]+:	f0 87 03             	lock xchg DWORD PTR \[ebx\],eax
+[ 	]*[a-f0-9]+:	f0 33 03             	lock xor eax,DWORD PTR \[ebx\]
+[ 	]*[a-f0-9]+:	f0 83 33 64          	lock xor DWORD PTR \[ebx\],0x64
+#pass
diff --git a/gas/testsuite/gas/i386/lock-1.d b/gas/testsuite/gas/i386/lock-1.d
new file mode 100644
index 0000000..a9ab747
--- /dev/null
+++ b/gas/testsuite/gas/i386/lock-1.d
@@ -0,0 +1,68 @@
+#objdump: -dw
+#name: i386 lockable insns
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+0+ <foo>:
+[ 	]*[a-f0-9]+:	f0 03 03             	lock add \(%ebx\),%eax
+[ 	]*[a-f0-9]+:	f0 83 03 64          	lock addl \$0x64,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 13 03             	lock adc \(%ebx\),%eax
+[ 	]*[a-f0-9]+:	f0 83 13 64          	lock adcl \$0x64,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 23 03             	lock and \(%ebx\),%eax
+[ 	]*[a-f0-9]+:	f0 83 23 64          	lock andl \$0x64,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 0f bb 03          	lock btc %eax,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 0f ba 3b 64       	lock btcl \$0x64,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 0f b3 03          	lock btr %eax,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 0f ba 33 64       	lock btrl \$0x64,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 0f ab 03          	lock bts %eax,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 0f ba 2b 64       	lock btsl \$0x64,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 0f b1 03          	lock cmpxchg %eax,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 0f c7 0b          	lock cmpxchg8b \(%ebx\)
+[ 	]*[a-f0-9]+:	f0 ff 0b             	lock decl \(%ebx\)
+[ 	]*[a-f0-9]+:	f0 ff 03             	lock incl \(%ebx\)
+[ 	]*[a-f0-9]+:	f0 f7 1b             	lock negl \(%ebx\)
+[ 	]*[a-f0-9]+:	f0 f7 13             	lock notl \(%ebx\)
+[ 	]*[a-f0-9]+:	f0 0b 03             	lock or \(%ebx\),%eax
+[ 	]*[a-f0-9]+:	f0 83 0b 64          	lock orl \$0x64,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 1b 03             	lock sbb \(%ebx\),%eax
+[ 	]*[a-f0-9]+:	f0 83 1b 64          	lock sbbl \$0x64,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 2b 03             	lock sub \(%ebx\),%eax
+[ 	]*[a-f0-9]+:	f0 83 2b 64          	lock subl \$0x64,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 0f c1 03          	lock xadd %eax,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 87 03             	lock xchg %eax,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 87 03             	lock xchg %eax,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 33 03             	lock xor \(%ebx\),%eax
+[ 	]*[a-f0-9]+:	f0 83 33 64          	lock xorl \$0x64,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 03 03             	lock add \(%ebx\),%eax
+[ 	]*[a-f0-9]+:	f0 83 03 64          	lock addl \$0x64,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 13 03             	lock adc \(%ebx\),%eax
+[ 	]*[a-f0-9]+:	f0 83 13 64          	lock adcl \$0x64,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 23 03             	lock and \(%ebx\),%eax
+[ 	]*[a-f0-9]+:	f0 83 23 64          	lock andl \$0x64,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 0f bb 03          	lock btc %eax,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 0f ba 3b 64       	lock btcl \$0x64,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 0f b3 03          	lock btr %eax,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 0f ba 33 64       	lock btrl \$0x64,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 0f ab 03          	lock bts %eax,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 0f ba 2b 64       	lock btsl \$0x64,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 0f b1 03          	lock cmpxchg %eax,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 0f c7 0b          	lock cmpxchg8b \(%ebx\)
+[ 	]*[a-f0-9]+:	f0 ff 0b             	lock decl \(%ebx\)
+[ 	]*[a-f0-9]+:	f0 ff 03             	lock incl \(%ebx\)
+[ 	]*[a-f0-9]+:	f0 f7 1b             	lock negl \(%ebx\)
+[ 	]*[a-f0-9]+:	f0 f7 13             	lock notl \(%ebx\)
+[ 	]*[a-f0-9]+:	f0 0b 03             	lock or \(%ebx\),%eax
+[ 	]*[a-f0-9]+:	f0 83 0b 64          	lock orl \$0x64,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 1b 03             	lock sbb \(%ebx\),%eax
+[ 	]*[a-f0-9]+:	f0 83 1b 64          	lock sbbl \$0x64,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 2b 03             	lock sub \(%ebx\),%eax
+[ 	]*[a-f0-9]+:	f0 83 2b 64          	lock subl \$0x64,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 0f c1 03          	lock xadd %eax,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 87 03             	lock xchg %eax,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 87 03             	lock xchg %eax,\(%ebx\)
+[ 	]*[a-f0-9]+:	f0 33 03             	lock xor \(%ebx\),%eax
+[ 	]*[a-f0-9]+:	f0 83 33 64          	lock xorl \$0x64,\(%ebx\)
+#pass
diff --git a/gas/testsuite/gas/i386/lock-1.s b/gas/testsuite/gas/i386/lock-1.s
new file mode 100644
index 0000000..11991f7
--- /dev/null
+++ b/gas/testsuite/gas/i386/lock-1.s
@@ -0,0 +1,64 @@
+# Lockable Instructions
+
+	.text
+foo:
+	lock add (%ebx), %eax
+	lock add $0x64, (%ebx)
+	lock adc (%ebx), %eax
+	lock adc $0x64, (%ebx)
+	lock and (%ebx), %eax
+	lock and $0x64, (%ebx)
+	lock btc %eax, (%ebx)
+	lock btc $0x64, (%ebx)
+	lock btr %eax, (%ebx)
+	lock btr $0x64, (%ebx)
+	lock bts %eax, (%ebx)
+	lock bts $0x64, (%ebx)
+	lock cmpxchg %eax,(%ebx)
+	lock cmpxchg8b (%ebx)
+	lock decl (%ebx)
+	lock incl (%ebx)
+	lock negl (%ebx)
+	lock notl (%ebx)
+	lock or (%ebx), %eax
+	lock or $0x64, (%ebx)
+	lock sbb (%ebx), %eax
+	lock sbb $0x64, (%ebx)
+	lock sub (%ebx), %eax
+	lock sub $0x64, (%ebx)
+	lock xadd %eax, (%ebx)
+	lock xchg (%ebx), %eax
+	lock xchg %eax, (%ebx)
+	lock xor (%ebx), %eax
+	lock xor $0x64, (%ebx)
+
+	.intel_syntax noprefix
+	lock add eax,DWORD PTR [ebx]
+	lock add DWORD PTR [ebx],0x64
+	lock adc eax,DWORD PTR [ebx]
+	lock adc DWORD PTR [ebx],0x64
+	lock and eax,DWORD PTR [ebx]
+	lock and DWORD PTR [ebx],0x64
+	lock btc DWORD PTR [ebx],eax
+	lock btc DWORD PTR [ebx],0x64
+	lock btr DWORD PTR [ebx],eax
+	lock btr DWORD PTR [ebx],0x64
+	lock bts DWORD PTR [ebx],eax
+	lock bts DWORD PTR [ebx],0x64
+	lock cmpxchg DWORD PTR [ebx],eax
+	lock cmpxchg8b QWORD PTR [ebx]
+	lock dec DWORD PTR [ebx]
+	lock inc DWORD PTR [ebx]
+	lock neg DWORD PTR [ebx]
+	lock not DWORD PTR [ebx]
+	lock or eax,DWORD PTR [ebx]
+	lock or DWORD PTR [ebx],0x64
+	lock sbb eax,DWORD PTR [ebx]
+	lock sbb DWORD PTR [ebx],0x64
+	lock sub eax,DWORD PTR [ebx]
+	lock sub DWORD PTR [ebx],0x64
+	lock xadd DWORD PTR [ebx],eax
+	lock xchg DWORD PTR [ebx],eax
+	lock xchg DWORD PTR [ebx],eax
+	lock xor eax,DWORD PTR [ebx]
+	lock xor DWORD PTR [ebx],0x64
diff --git a/gas/testsuite/gas/i386/lockbad-1.l b/gas/testsuite/gas/i386/lockbad-1.l
new file mode 100644
index 0000000..19ea049
--- /dev/null
+++ b/gas/testsuite/gas/i386/lockbad-1.l
@@ -0,0 +1,135 @@
+.*: Assembler messages:
+.*:5: Error: .*
+.*:6: Error: .*
+.*:8: Error: .*
+.*:9: Error: .*
+.*:10: Error: .*
+.*:11: Error: .*
+.*:12: Error: .*
+.*:13: Error: .*
+.*:14: Error: .*
+.*:15: Error: .*
+.*:16: Error: .*
+.*:17: Error: .*
+.*:18: Error: .*
+.*:19: Error: .*
+.*:20: Error: .*
+.*:21: Error: .*
+.*:22: Error: .*
+.*:23: Error: .*
+.*:24: Error: .*
+.*:25: Error: .*
+.*:26: Error: .*
+.*:27: Error: .*
+.*:28: Error: .*
+.*:29: Error: .*
+.*:30: Error: .*
+.*:31: Error: .*
+.*:32: Error: .*
+.*:33: Error: .*
+.*:34: Error: .*
+.*:35: Error: .*
+.*:38: Error: .*
+.*:39: Error: .*
+.*:41: Error: .*
+.*:42: Error: .*
+.*:43: Error: .*
+.*:44: Error: .*
+.*:45: Error: .*
+.*:46: Error: .*
+.*:47: Error: .*
+.*:48: Error: .*
+.*:49: Error: .*
+.*:50: Error: .*
+.*:51: Error: .*
+.*:52: Error: .*
+.*:53: Error: .*
+.*:54: Error: .*
+.*:55: Error: .*
+.*:56: Error: .*
+.*:57: Error: .*
+.*:58: Error: .*
+.*:59: Error: .*
+.*:60: Error: .*
+.*:61: Error: .*
+.*:62: Error: .*
+.*:63: Error: .*
+.*:64: Error: .*
+.*:65: Error: .*
+.*:66: Error: .*
+.*:67: Error: .*
+.*:68: Error: .*
+GAS LISTING .*
+
+
+[ 	]*1[ 	]+\# Unlockable Instructions
+[ 	]*2[ 	]+
+[ 	]*3[ 	]+\.text
+[ 	]*4[ 	]+foo:
+[ 	]*5[ 	]+lock mov %ecx, %eax
+[ 	]*6[ 	]+lock mov \(%ebx\), %eax
+[ 	]*7[ 	]+
+[ 	]*8[ 	]+lock add %ebx, %eax
+[ 	]*9[ 	]+lock add \$0x64, %ebx
+[ 	]*10[ 	]+lock adc %ebx, %eax
+[ 	]*11[ 	]+lock adc \$0x64, %ebx
+[ 	]*12[ 	]+lock and %ebx, %eax
+[ 	]*13[ 	]+lock and \$0x64, %ebx
+[ 	]*14[ 	]+lock btc %eax, %ebx
+[ 	]*15[ 	]+lock btc \$0x64, %ebx
+[ 	]*16[ 	]+lock btr %eax, %ebx
+[ 	]*17[ 	]+lock btr \$0x64, %ebx
+[ 	]*18[ 	]+lock bts %eax, %ebx
+[ 	]*19[ 	]+lock bts \$0x64, %ebx
+[ 	]*20[ 	]+lock cmpxchg %eax,%ebx
+[ 	]*21[ 	]+lock decl %ebx
+[ 	]*22[ 	]+lock incl %ebx
+[ 	]*23[ 	]+lock negl %ebx
+[ 	]*24[ 	]+lock notl %ebx
+[ 	]*25[ 	]+lock or %ebx, %eax
+[ 	]*26[ 	]+lock or \$0x64, %ebx
+[ 	]*27[ 	]+lock sbb %ebx, %eax
+[ 	]*28[ 	]+lock sbb \$0x64, %ebx
+[ 	]*29[ 	]+lock sub %ebx, %eax
+[ 	]*30[ 	]+lock sub \$0x64, %ebx
+[ 	]*31[ 	]+lock xadd %eax, %ebx
+[ 	]*32[ 	]+lock xchg %ebx, %eax
+[ 	]*33[ 	]+lock xchg %eax, %ebx
+[ 	]*34[ 	]+lock xor %ebx, %eax
+[ 	]*35[ 	]+lock xor \$0x64, %ebx
+[ 	]*36[ 	]+
+[ 	]*37[ 	]+\.intel_syntax noprefix
+[ 	]*38[ 	]+lock mov eax,ebx
+[ 	]*39[ 	]+lock mov eax,DWORD PTR \[ebx\]
+[ 	]*40[ 	]+
+[ 	]*41[ 	]+lock add eax,ebx
+[ 	]*42[ 	]+lock add ebx,0x64
+[ 	]*43[ 	]+lock adc eax,ebx
+[ 	]*44[ 	]+lock adc ebx,0x64
+[ 	]*45[ 	]+lock and eax,ebx
+[ 	]*46[ 	]+lock and ebx,0x64
+[ 	]*47[ 	]+lock btc ebx,eax
+[ 	]*48[ 	]+lock btc ebx,0x64
+[ 	]*49[ 	]+lock btr ebx,eax
+[ 	]*50[ 	]+lock btr ebx,0x64
+[ 	]*51[ 	]+lock bts ebx,eax
+[ 	]*52[ 	]+lock bts ebx,0x64
+[ 	]*53[ 	]+lock cmpxchg ebx,eax
+[ 	]*54[ 	]+lock dec ebx
+[ 	]*55[ 	]+lock inc ebx
+[ 	]*56[ 	]+lock neg ebx
+[ 	]*57[ 	]+lock not ebx
+GAS LISTING .*
+
+
+[ 	]*58[ 	]+lock or eax,ebx
+[ 	]*59[ 	]+lock or ebx,0x64
+[ 	]*60[ 	]+lock sbb eax,ebx
+[ 	]*61[ 	]+lock sbb ebx,0x64
+[ 	]*62[ 	]+lock sub eax,ebx
+[ 	]*63[ 	]+lock sub ebx,0x64
+[ 	]*64[ 	]+lock xadd ebx,eax
+[ 	]*65[ 	]+lock xchg ebx,eax
+[ 	]*66[ 	]+lock xchg ebx,eax
+[ 	]*67[ 	]+lock xor eax,ebx
+[ 	]*68[ 	]+lock xor ebx,0x64
diff --git a/gas/testsuite/gas/i386/lockbad-1.s b/gas/testsuite/gas/i386/lockbad-1.s
new file mode 100644
index 0000000..dbb5b5c
--- /dev/null
+++ b/gas/testsuite/gas/i386/lockbad-1.s
@@ -0,0 +1,68 @@
+# Unlockable Instructions
+
+	.text
+foo:
+	lock mov %ecx, %eax
+	lock mov (%ebx), %eax
+
+	lock add %ebx, %eax
+	lock add $0x64, %ebx
+	lock adc %ebx, %eax
+	lock adc $0x64, %ebx
+	lock and %ebx, %eax
+	lock and $0x64, %ebx
+	lock btc %eax, %ebx
+	lock btc $0x64, %ebx
+	lock btr %eax, %ebx
+	lock btr $0x64, %ebx
+	lock bts %eax, %ebx
+	lock bts $0x64, %ebx
+	lock cmpxchg %eax,%ebx
+	lock decl %ebx
+	lock incl %ebx
+	lock negl %ebx
+	lock notl %ebx
+	lock or %ebx, %eax
+	lock or $0x64, %ebx
+	lock sbb %ebx, %eax
+	lock sbb $0x64, %ebx
+	lock sub %ebx, %eax
+	lock sub $0x64, %ebx
+	lock xadd %eax, %ebx
+	lock xchg %ebx, %eax
+	lock xchg %eax, %ebx
+	lock xor %ebx, %eax
+	lock xor $0x64, %ebx
+
+	.intel_syntax noprefix
+	lock mov eax,ebx
+	lock mov eax,DWORD PTR [ebx]
+
+	lock add eax,ebx
+	lock add ebx,0x64
+	lock adc eax,ebx
+	lock adc ebx,0x64
+	lock and eax,ebx
+	lock and ebx,0x64
+	lock btc ebx,eax
+	lock btc ebx,0x64
+	lock btr ebx,eax
+	lock btr ebx,0x64
+	lock bts ebx,eax
+	lock bts ebx,0x64
+	lock cmpxchg ebx,eax
+	lock dec ebx
+	lock inc ebx
+	lock neg ebx
+	lock not ebx
+	lock or eax,ebx
+	lock or ebx,0x64
+	lock sbb eax,ebx
+	lock sbb ebx,0x64
+	lock sub eax,ebx
+	lock sub ebx,0x64
+	lock xadd ebx,eax
+	lock xchg ebx,eax
+	lock xchg ebx,eax
+	lock xor eax,ebx
+	lock xor ebx,0x64
diff --git a/gas/testsuite/gas/i386/x86-64-lock-1-intel.d b/gas/testsuite/gas/i386/x86-64-lock-1-intel.d
new file mode 100644
index 0000000..5cc0c08
--- /dev/null
+++ b/gas/testsuite/gas/i386/x86-64-lock-1-intel.d
@@ -0,0 +1,69 @@
+#objdump: -dwMintel
+#name: x86-64 lockable insns (Intel disassembly)
+#source: x86-64-lock-1.s
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+0+ <foo>:
+[ 	]*[a-f0-9]+:	f0 03 03             	lock add eax,DWORD PTR \[rbx\]
+[ 	]*[a-f0-9]+:	f0 83 03 64          	lock add DWORD PTR \[rbx\],0x64
+[ 	]*[a-f0-9]+:	f0 13 03             	lock adc eax,DWORD PTR \[rbx\]
+[ 	]*[a-f0-9]+:	f0 83 13 64          	lock adc DWORD PTR \[rbx\],0x64
+[ 	]*[a-f0-9]+:	f0 23 03             	lock and eax,DWORD PTR \[rbx\]
+[ 	]*[a-f0-9]+:	f0 83 23 64          	lock and DWORD PTR \[rbx\],0x64
+[ 	]*[a-f0-9]+:	f0 0f bb 03          	lock btc DWORD PTR \[rbx\],eax
+[ 	]*[a-f0-9]+:	f0 0f ba 3b 64       	lock btc DWORD PTR \[rbx\],0x64
+[ 	]*[a-f0-9]+:	f0 0f b3 03          	lock btr DWORD PTR \[rbx\],eax
+[ 	]*[a-f0-9]+:	f0 0f ba 33 64       	lock btr DWORD PTR \[rbx\],0x64
+[ 	]*[a-f0-9]+:	f0 0f ab 03          	lock bts DWORD PTR \[rbx\],eax
+[ 	]*[a-f0-9]+:	f0 0f ba 2b 64       	lock bts DWORD PTR \[rbx\],0x64
+[ 	]*[a-f0-9]+:	f0 0f b1 03          	lock cmpxchg DWORD PTR \[rbx\],eax
+[ 	]*[a-f0-9]+:	f0 0f c7 0b          	lock cmpxchg8b QWORD PTR \[rbx\]
+[ 	]*[a-f0-9]+:	f0 ff 0b             	lock dec DWORD PTR \[rbx\]
+[ 	]*[a-f0-9]+:	f0 ff 03             	lock inc DWORD PTR \[rbx\]
+[ 	]*[a-f0-9]+:	f0 f7 1b             	lock neg DWORD PTR \[rbx\]
+[ 	]*[a-f0-9]+:	f0 f7 13             	lock not DWORD PTR \[rbx\]
+[ 	]*[a-f0-9]+:	f0 0b 03             	lock or eax,DWORD PTR \[rbx\]
+[ 	]*[a-f0-9]+:	f0 83 0b 64          	lock or DWORD PTR \[rbx\],0x64
+[ 	]*[a-f0-9]+:	f0 1b 03             	lock sbb eax,DWORD PTR \[rbx\]
+[ 	]*[a-f0-9]+:	f0 83 1b 64          	lock sbb DWORD PTR \[rbx\],0x64
+[ 	]*[a-f0-9]+:	f0 2b 03             	lock sub eax,DWORD PTR \[rbx\]
+[ 	]*[a-f0-9]+:	f0 83 2b 64          	lock sub DWORD PTR \[rbx\],0x64
+[ 	]*[a-f0-9]+:	f0 0f c1 03          	lock xadd DWORD PTR \[rbx\],eax
+[ 	]*[a-f0-9]+:	f0 87 03             	lock xchg DWORD PTR \[rbx\],eax
+[ 	]*[a-f0-9]+:	f0 87 03             	lock xchg DWORD PTR \[rbx\],eax
+[ 	]*[a-f0-9]+:	f0 33 03             	lock xor eax,DWORD PTR \[rbx\]
+[ 	]*[a-f0-9]+:	f0 83 33 64          	lock xor DWORD PTR \[rbx\],0x64
+[ 	]*[a-f0-9]+:	f0 03 03             	lock add eax,DWORD PTR \[rbx\]
+[ 	]*[a-f0-9]+:	f0 83 03 64          	lock add DWORD PTR \[rbx\],0x64
+[ 	]*[a-f0-9]+:	f0 13 03             	lock adc eax,DWORD PTR \[rbx\]
+[ 	]*[a-f0-9]+:	f0 83 13 64          	lock adc DWORD PTR \[rbx\],0x64
+[ 	]*[a-f0-9]+:	f0 23 03             	lock and eax,DWORD PTR \[rbx\]
+[ 	]*[a-f0-9]+:	f0 83 23 64          	lock and DWORD PTR \[rbx\],0x64
+[ 	]*[a-f0-9]+:	f0 0f bb 03          	lock btc DWORD PTR \[rbx\],eax
+[ 	]*[a-f0-9]+:	f0 0f ba 3b 64       	lock btc DWORD PTR \[rbx\],0x64
+[ 	]*[a-f0-9]+:	f0 0f b3 03          	lock btr DWORD PTR \[rbx\],eax
+[ 	]*[a-f0-9]+:	f0 0f ba 33 64       	lock btr DWORD PTR \[rbx\],0x64
+[ 	]*[a-f0-9]+:	f0 0f ab 03          	lock bts DWORD PTR \[rbx\],eax
+[ 	]*[a-f0-9]+:	f0 0f ba 2b 64       	lock bts DWORD PTR \[rbx\],0x64
+[ 	]*[a-f0-9]+:	f0 0f b1 03          	lock cmpxchg DWORD PTR \[rbx\],eax
+[ 	]*[a-f0-9]+:	f0 0f c7 0b          	lock cmpxchg8b QWORD PTR \[rbx\]
+[ 	]*[a-f0-9]+:	f0 ff 0b             	lock dec DWORD PTR \[rbx\]
+[ 	]*[a-f0-9]+:	f0 ff 03             	lock inc DWORD PTR \[rbx\]
+[ 	]*[a-f0-9]+:	f0 f7 1b             	lock neg DWORD PTR \[rbx\]
+[ 	]*[a-f0-9]+:	f0 f7 13             	lock not DWORD PTR \[rbx\]
+[ 	]*[a-f0-9]+:	f0 0b 03             	lock or eax,DWORD PTR \[rbx\]
+[ 	]*[a-f0-9]+:	f0 83 0b 64          	lock or DWORD PTR \[rbx\],0x64
+[ 	]*[a-f0-9]+:	f0 1b 03             	lock sbb eax,DWORD PTR \[rbx\]
+[ 	]*[a-f0-9]+:	f0 83 1b 64          	lock sbb DWORD PTR \[rbx\],0x64
+[ 	]*[a-f0-9]+:	f0 2b 03             	lock sub eax,DWORD PTR \[rbx\]
+[ 	]*[a-f0-9]+:	f0 83 2b 64          	lock sub DWORD PTR \[rbx\],0x64
+[ 	]*[a-f0-9]+:	f0 0f c1 03          	lock xadd DWORD PTR \[rbx\],eax
+[ 	]*[a-f0-9]+:	f0 87 03             	lock xchg DWORD PTR \[rbx\],eax
+[ 	]*[a-f0-9]+:	f0 87 03             	lock xchg DWORD PTR \[rbx\],eax
+[ 	]*[a-f0-9]+:	f0 33 03             	lock xor eax,DWORD PTR \[rbx\]
+[ 	]*[a-f0-9]+:	f0 83 33 64          	lock xor DWORD PTR \[rbx\],0x64
+#pass
diff --git a/gas/testsuite/gas/i386/x86-64-lock-1.d b/gas/testsuite/gas/i386/x86-64-lock-1.d
new file mode 100644
index 0000000..112f289
--- /dev/null
+++ b/gas/testsuite/gas/i386/x86-64-lock-1.d
@@ -0,0 +1,68 @@
+#objdump: -dw
+#name: x86-64 lockable insns
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+0+ <foo>:
+[ 	]*[a-f0-9]+:	f0 03 03             	lock add \(%rbx\),%eax
+[ 	]*[a-f0-9]+:	f0 83 03 64          	lock addl \$0x64,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 13 03             	lock adc \(%rbx\),%eax
+[ 	]*[a-f0-9]+:	f0 83 13 64          	lock adcl \$0x64,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 23 03             	lock and \(%rbx\),%eax
+[ 	]*[a-f0-9]+:	f0 83 23 64          	lock andl \$0x64,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 0f bb 03          	lock btc %eax,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 0f ba 3b 64       	lock btcl \$0x64,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 0f b3 03          	lock btr %eax,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 0f ba 33 64       	lock btrl \$0x64,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 0f ab 03          	lock bts %eax,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 0f ba 2b 64       	lock btsl \$0x64,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 0f b1 03          	lock cmpxchg %eax,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 0f c7 0b          	lock cmpxchg8b \(%rbx\)
+[ 	]*[a-f0-9]+:	f0 ff 0b             	lock decl \(%rbx\)
+[ 	]*[a-f0-9]+:	f0 ff 03             	lock incl \(%rbx\)
+[ 	]*[a-f0-9]+:	f0 f7 1b             	lock negl \(%rbx\)
+[ 	]*[a-f0-9]+:	f0 f7 13             	lock notl \(%rbx\)
+[ 	]*[a-f0-9]+:	f0 0b 03             	lock or \(%rbx\),%eax
+[ 	]*[a-f0-9]+:	f0 83 0b 64          	lock orl \$0x64,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 1b 03             	lock sbb \(%rbx\),%eax
+[ 	]*[a-f0-9]+:	f0 83 1b 64          	lock sbbl \$0x64,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 2b 03             	lock sub \(%rbx\),%eax
+[ 	]*[a-f0-9]+:	f0 83 2b 64          	lock subl \$0x64,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 0f c1 03          	lock xadd %eax,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 87 03             	lock xchg %eax,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 87 03             	lock xchg %eax,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 33 03             	lock xor \(%rbx\),%eax
+[ 	]*[a-f0-9]+:	f0 83 33 64          	lock xorl \$0x64,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 03 03             	lock add \(%rbx\),%eax
+[ 	]*[a-f0-9]+:	f0 83 03 64          	lock addl \$0x64,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 13 03             	lock adc \(%rbx\),%eax
+[ 	]*[a-f0-9]+:	f0 83 13 64          	lock adcl \$0x64,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 23 03             	lock and \(%rbx\),%eax
+[ 	]*[a-f0-9]+:	f0 83 23 64          	lock andl \$0x64,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 0f bb 03          	lock btc %eax,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 0f ba 3b 64       	lock btcl \$0x64,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 0f b3 03          	lock btr %eax,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 0f ba 33 64       	lock btrl \$0x64,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 0f ab 03          	lock bts %eax,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 0f ba 2b 64       	lock btsl \$0x64,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 0f b1 03          	lock cmpxchg %eax,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 0f c7 0b          	lock cmpxchg8b \(%rbx\)
+[ 	]*[a-f0-9]+:	f0 ff 0b             	lock decl \(%rbx\)
+[ 	]*[a-f0-9]+:	f0 ff 03             	lock incl \(%rbx\)
+[ 	]*[a-f0-9]+:	f0 f7 1b             	lock negl \(%rbx\)
+[ 	]*[a-f0-9]+:	f0 f7 13             	lock notl \(%rbx\)
+[ 	]*[a-f0-9]+:	f0 0b 03             	lock or \(%rbx\),%eax
+[ 	]*[a-f0-9]+:	f0 83 0b 64          	lock orl \$0x64,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 1b 03             	lock sbb \(%rbx\),%eax
+[ 	]*[a-f0-9]+:	f0 83 1b 64          	lock sbbl \$0x64,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 2b 03             	lock sub \(%rbx\),%eax
+[ 	]*[a-f0-9]+:	f0 83 2b 64          	lock subl \$0x64,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 0f c1 03          	lock xadd %eax,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 87 03             	lock xchg %eax,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 87 03             	lock xchg %eax,\(%rbx\)
+[ 	]*[a-f0-9]+:	f0 33 03             	lock xor \(%rbx\),%eax
+[ 	]*[a-f0-9]+:	f0 83 33 64          	lock xorl \$0x64,\(%rbx\)
+#pass
diff --git a/gas/testsuite/gas/i386/x86-64-lock-1.s b/gas/testsuite/gas/i386/x86-64-lock-1.s
new file mode 100644
index 0000000..5f21dce
--- /dev/null
+++ b/gas/testsuite/gas/i386/x86-64-lock-1.s
@@ -0,0 +1,64 @@
+# 64bit lockable Instructions
+
+	.text
+foo:
+	lock add (%rbx), %eax
+	lock add $0x64, (%rbx)
+	lock adc (%rbx), %eax
+	lock adc $0x64, (%rbx)
+	lock and (%rbx), %eax
+	lock and $0x64, (%rbx)
+	lock btc %eax, (%rbx)
+	lock btc $0x64, (%rbx)
+	lock btr %eax, (%rbx)
+	lock btr $0x64, (%rbx)
+	lock bts %eax, (%rbx)
+	lock bts $0x64, (%rbx)
+	lock cmpxchg %eax,(%rbx)
+	lock cmpxchg8b (%rbx)
+	lock decl (%rbx)
+	lock incl (%rbx)
+	lock negl (%rbx)
+	lock notl (%rbx)
+	lock or (%rbx), %eax
+	lock or $0x64, (%rbx)
+	lock sbb (%rbx), %eax
+	lock sbb $0x64, (%rbx)
+	lock sub (%rbx), %eax
+	lock sub $0x64, (%rbx)
+	lock xadd %eax, (%rbx)
+	lock xchg (%rbx), %eax
+	lock xchg %eax, (%rbx)
+	lock xor (%rbx), %eax
+	lock xor $0x64, (%rbx)
+
+	.intel_syntax noprefix
+	lock add eax,DWORD PTR [rbx]
+	lock add DWORD PTR [rbx],0x64
+	lock adc eax,DWORD PTR [rbx]
+	lock adc DWORD PTR [rbx],0x64
+	lock and eax,DWORD PTR [rbx]
+	lock and DWORD PTR [rbx],0x64
+	lock btc DWORD PTR [rbx],eax
+	lock btc DWORD PTR [rbx],0x64
+	lock btr DWORD PTR [rbx],eax
+	lock btr DWORD PTR [rbx],0x64
+	lock bts DWORD PTR [rbx],eax
+	lock bts DWORD PTR [rbx],0x64
+	lock cmpxchg DWORD PTR [rbx],eax
+	lock cmpxchg8b QWORD PTR [rbx]
+	lock dec DWORD PTR [rbx]
+	lock inc DWORD PTR [rbx]
+	lock neg DWORD PTR [rbx]
+	lock not DWORD PTR [rbx]
+	lock or eax,DWORD PTR [rbx]
+	lock or DWORD PTR [rbx],0x64
+	lock sbb eax,DWORD PTR [rbx]
+	lock sbb DWORD PTR [rbx],0x64
+	lock sub eax,DWORD PTR [rbx]
+	lock sub DWORD PTR [rbx],0x64
+	lock xadd DWORD PTR [rbx],eax
+	lock xchg DWORD PTR [rbx],eax
+	lock xchg DWORD PTR [rbx],eax
+	lock xor eax,DWORD PTR [rbx]
+	lock xor DWORD PTR [rbx],0x64
diff --git a/gas/testsuite/gas/i386/x86-64-lockbad-1.l b/gas/testsuite/gas/i386/x86-64-lockbad-1.l
new file mode 100644
index 0000000..9753e14
--- /dev/null
+++ b/gas/testsuite/gas/i386/x86-64-lockbad-1.l
@@ -0,0 +1,135 @@
+.*: Assembler messages:
+.*:5: Error: .*
+.*:6: Error: .*
+.*:8: Error: .*
+.*:9: Error: .*
+.*:10: Error: .*
+.*:11: Error: .*
+.*:12: Error: .*
+.*:13: Error: .*
+.*:14: Error: .*
+.*:15: Error: .*
+.*:16: Error: .*
+.*:17: Error: .*
+.*:18: Error: .*
+.*:19: Error: .*
+.*:20: Error: .*
+.*:21: Error: .*
+.*:22: Error: .*
+.*:23: Error: .*
+.*:24: Error: .*
+.*:25: Error: .*
+.*:26: Error: .*
+.*:27: Error: .*
+.*:28: Error: .*
+.*:29: Error: .*
+.*:30: Error: .*
+.*:31: Error: .*
+.*:32: Error: .*
+.*:33: Error: .*
+.*:34: Error: .*
+.*:35: Error: .*
+.*:38: Error: .*
+.*:39: Error: .*
+.*:41: Error: .*
+.*:42: Error: .*
+.*:43: Error: .*
+.*:44: Error: .*
+.*:45: Error: .*
+.*:46: Error: .*
+.*:47: Error: .*
+.*:48: Error: .*
+.*:49: Error: .*
+.*:50: Error: .*
+.*:51: Error: .*
+.*:52: Error: .*
+.*:53: Error: .*
+.*:54: Error: .*
+.*:55: Error: .*
+.*:56: Error: .*
+.*:57: Error: .*
+.*:58: Error: .*
+.*:59: Error: .*
+.*:60: Error: .*
+.*:61: Error: .*
+.*:62: Error: .*
+.*:63: Error: .*
+.*:64: Error: .*
+.*:65: Error: .*
+.*:66: Error: .*
+.*:67: Error: .*
+.*:68: Error: .*
+GAS LISTING .*
+
+
+[ 	]*1[ 	]+\# 64bit unlockable Instructions
+[ 	]*2[ 	]+
+[ 	]*3[ 	]+\.text
+[ 	]*4[ 	]+foo:
+[ 	]*5[ 	]+lock mov %ecx, %eax
+[ 	]*6[ 	]+lock mov \(%rbx\), %eax
+[ 	]*7[ 	]+
+[ 	]*8[ 	]+lock add %ebx, %eax
+[ 	]*9[ 	]+lock add \$0x64, %ebx
+[ 	]*10[ 	]+lock adc %ebx, %eax
+[ 	]*11[ 	]+lock adc \$0x64, %ebx
+[ 	]*12[ 	]+lock and %ebx, %eax
+[ 	]*13[ 	]+lock and \$0x64, %ebx
+[ 	]*14[ 	]+lock btc %eax, %ebx
+[ 	]*15[ 	]+lock btc \$0x64, %ebx
+[ 	]*16[ 	]+lock btr %eax, %ebx
+[ 	]*17[ 	]+lock btr \$0x64, %ebx
+[ 	]*18[ 	]+lock bts %eax, %ebx
+[ 	]*19[ 	]+lock bts \$0x64, %ebx
+[ 	]*20[ 	]+lock cmpxchg %eax,%ebx
+[ 	]*21[ 	]+lock decl %ebx
+[ 	]*22[ 	]+lock incl %ebx
+[ 	]*23[ 	]+lock negl %ebx
+[ 	]*24[ 	]+lock notl %ebx
+[ 	]*25[ 	]+lock or %ebx, %eax
+[ 	]*26[ 	]+lock or \$0x64, %ebx
+[ 	]*27[ 	]+lock sbb %ebx, %eax
+[ 	]*28[ 	]+lock sbb \$0x64, %ebx
+[ 	]*29[ 	]+lock sub %ebx, %eax
+[ 	]*30[ 	]+lock sub \$0x64, %ebx
+[ 	]*31[ 	]+lock xadd %eax, %ebx
+[ 	]*32[ 	]+lock xchg %ebx, %eax
+[ 	]*33[ 	]+lock xchg %eax, %ebx
+[ 	]*34[ 	]+lock xor %ebx, %eax
+[ 	]*35[ 	]+lock xor \$0x64, %ebx
+[ 	]*36[ 	]+
+[ 	]*37[ 	]+\.intel_syntax noprefix
+[ 	]*38[ 	]+lock mov eax,ebx
+[ 	]*39[ 	]+lock mov eax,DWORD PTR \[rbx\]
+[ 	]*40[ 	]+
+[ 	]*41[ 	]+lock add eax,ebx
+[ 	]*42[ 	]+lock add ebx,0x64
+[ 	]*43[ 	]+lock adc eax,ebx
+[ 	]*44[ 	]+lock adc ebx,0x64
+[ 	]*45[ 	]+lock and eax,ebx
+[ 	]*46[ 	]+lock and ebx,0x64
+[ 	]*47[ 	]+lock btc ebx,eax
+[ 	]*48[ 	]+lock btc ebx,0x64
+[ 	]*49[ 	]+lock btr ebx,eax
+[ 	]*50[ 	]+lock btr ebx,0x64
+[ 	]*51[ 	]+lock bts ebx,eax
+[ 	]*52[ 	]+lock bts ebx,0x64
+[ 	]*53[ 	]+lock cmpxchg ebx,eax
+[ 	]*54[ 	]+lock dec ebx
+[ 	]*55[ 	]+lock inc ebx
+[ 	]*56[ 	]+lock neg ebx
+[ 	]*57[ 	]+lock not ebx
+GAS LISTING .*
+
+
+[ 	]*58[ 	]+lock or eax,ebx
+[ 	]*59[ 	]+lock or ebx,0x64
+[ 	]*60[ 	]+lock sbb eax,ebx
+[ 	]*61[ 	]+lock sbb ebx,0x64
+[ 	]*62[ 	]+lock sub eax,ebx
+[ 	]*63[ 	]+lock sub ebx,0x64
+[ 	]*64[ 	]+lock xadd ebx,eax
+[ 	]*65[ 	]+lock xchg ebx,eax
+[ 	]*66[ 	]+lock xchg ebx,eax
+[ 	]*67[ 	]+lock xor eax,ebx
+[ 	]*68[ 	]+lock xor ebx,0x64
diff --git a/gas/testsuite/gas/i386/x86-64-lockbad-1.s b/gas/testsuite/gas/i386/x86-64-lockbad-1.s
new file mode 100644
index 0000000..6a20a0c
--- /dev/null
+++ b/gas/testsuite/gas/i386/x86-64-lockbad-1.s
@@ -0,0 +1,68 @@
+# 64bit unlockable Instructions
+
+	.text
+foo:
+	lock mov %ecx, %eax
+	lock mov (%rbx), %eax
+
+	lock add %ebx, %eax
+	lock add $0x64, %ebx
+	lock adc %ebx, %eax
+	lock adc $0x64, %ebx
+	lock and %ebx, %eax
+	lock and $0x64, %ebx
+	lock btc %eax, %ebx
+	lock btc $0x64, %ebx
+	lock btr %eax, %ebx
+	lock btr $0x64, %ebx
+	lock bts %eax, %ebx
+	lock bts $0x64, %ebx
+	lock cmpxchg %eax,%ebx
+	lock decl %ebx
+	lock incl %ebx
+	lock negl %ebx
+	lock notl %ebx
+	lock or %ebx, %eax
+	lock or $0x64, %ebx
+	lock sbb %ebx, %eax
+	lock sbb $0x64, %ebx
+	lock sub %ebx, %eax
+	lock sub $0x64, %ebx
+	lock xadd %eax, %ebx
+	lock xchg %ebx, %eax
+	lock xchg %eax, %ebx
+	lock xor %ebx, %eax
+	lock xor $0x64, %ebx
+
+	.intel_syntax noprefix
+	lock mov eax,ebx
+	lock mov eax,DWORD PTR [rbx]
+
+	lock add eax,ebx
+	lock add ebx,0x64
+	lock adc eax,ebx
+	lock adc ebx,0x64
+	lock and eax,ebx
+	lock and ebx,0x64
+	lock btc ebx,eax
+	lock btc ebx,0x64
+	lock btr ebx,eax
+	lock btr ebx,0x64
+	lock bts ebx,eax
+	lock bts ebx,0x64
+	lock cmpxchg ebx,eax
+	lock dec ebx
+	lock inc ebx
+	lock neg ebx
+	lock not ebx
+	lock or eax,ebx
+	lock or ebx,0x64
+	lock sbb eax,ebx
+	lock sbb ebx,0x64
+	lock sub eax,ebx
+	lock sub ebx,0x64
+	lock xadd ebx,eax
+	lock xchg ebx,eax
+	lock xchg ebx,eax
+	lock xor eax,ebx
+	lock xor ebx,0x64
diff --git a/opcodes/i386-gen.c b/opcodes/i386-gen.c
index d877f83..3ddd4b6 100644
--- a/opcodes/i386-gen.c
+++ b/opcodes/i386-gen.c
@@ -337,6 +337,7 @@ static bitfield opcode_modifiers[] =
   BITFIELD (No_ldSuf),
   BITFIELD (FWait),
   BITFIELD (IsString),
+  BITFIELD (IsLockable),
   BITFIELD (RegKludge),
   BITFIELD (FirstXmm0),
   BITFIELD (Implicit1stXmm0),
diff --git a/opcodes/i386-opc.h b/opcodes/i386-opc.h
index f8de8cd..cee1303 100644
--- a/opcodes/i386-opc.h
+++ b/opcodes/i386-opc.h
@@ -240,6 +240,8 @@ enum
   FWait,
   /* quick test for string instructions */
   IsString,
+  /* quick test for lockable instructions */
+  IsLockable,
   /* fake an extra reg operand for clr, imul and special register
      processing for some instructions.  */
   RegKludge,
@@ -340,6 +342,7 @@ typedef struct i386_opcode_modifier
   unsigned int no_ldsuf:1;
   unsigned int fwait:1;
   unsigned int isstring:1;
+  unsigned int islockable:1;
   unsigned int regkludge:1;
   unsigned int firstxmm0:1;
   unsigned int implicit1stxmm0:1;
diff --git a/opcodes/i386-opc.tbl b/opcodes/i386-opc.tbl
index 2253ffa..8883029 100644
--- a/opcodes/i386-opc.tbl
+++ b/opcodes/i386-opc.tbl
@@ -126,10 +126,10 @@ popa, 0, 0x61, None, 1, Cpu186|CpuNo64, DefaultSize|No_bSuf|No_sSuf|No_qSuf|No_l
 // xchg commutes:  we allow both operand orders.
 
 // In the 64bit code, xchg rax, rax is reused for new nop instruction.
-xchg, 2, 0x90, None, 1, 0, ShortForm|No_bSuf|No_sSuf|No_ldSuf, { Reg16|Reg32|Reg64, Acc|Word|Dword|Qword }
-xchg, 2, 0x90, None, 1, 0, ShortForm|No_bSuf|No_sSuf|No_ldSuf, { Acc|Word|Dword|Qword, Reg16|Reg32|Reg64 }
-xchg, 2, 0x86, None, 1, 0, W|Modrm|No_sSuf|No_ldSuf, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
-xchg, 2, 0x86, None, 1, 0, W|Modrm|No_sSuf|No_ldSuf, { Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S, Reg8|Reg16|Reg32|Reg64 }
+xchg, 2, 0x90, None, 1, 0, ShortForm|No_bSuf|No_sSuf|No_ldSuf|IsLockable, { Reg16|Reg32|Reg64, Acc|Word|Dword|Qword }
+xchg, 2, 0x90, None, 1, 0, ShortForm|No_bSuf|No_sSuf|No_ldSuf|IsLockable, { Acc|Word|Dword|Qword, Reg16|Reg32|Reg64 }
+xchg, 2, 0x86, None, 1, 0, W|Modrm|No_sSuf|No_ldSuf|IsLockable, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+xchg, 2, 0x86, None, 1, 0, W|Modrm|No_sSuf|No_ldSuf|IsLockable, { Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S, Reg8|Reg16|Reg32|Reg64 }
 
 // In/out from ports.
 in, 2, 0xe4, None, 1, 0, W|No_sSuf|No_qSuf|No_ldSuf, { Imm8, Acc|Byte|Word|Dword }
@@ -168,26 +168,26 @@ std, 0, 0xfd, None, 1, 0, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { 0
 sti, 0, 0xfb, None, 1, 0, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { 0 }
 
 // Arithmetic.
-add, 2, 0x0, None, 1, 0, D|W|Modrm|No_sSuf|No_ldSuf, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
-add, 2, 0x83, 0x0, 1, 0, Modrm|No_bSuf|No_sSuf|No_ldSuf, { Imm8S, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
-add, 2, 0x4, None, 1, 0, W|No_sSuf|No_ldSuf, { Imm8|Imm16|Imm32|Imm32S, Acc|Byte|Word|Dword|Qword }
-add, 2, 0x80, 0x0, 1, 0, W|Modrm|No_sSuf|No_ldSuf, { Imm8|Imm16|Imm32|Imm32S, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+add, 2, 0x0, None, 1, 0, D|W|Modrm|No_sSuf|No_ldSuf|IsLockable, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+add, 2, 0x83, 0x0, 1, 0, Modrm|No_bSuf|No_sSuf|No_ldSuf|IsLockable, { Imm8S, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+add, 2, 0x4, None, 1, 0, W|No_sSuf|No_ldSuf|IsLockable, { Imm8|Imm16|Imm32|Imm32S, Acc|Byte|Word|Dword|Qword }
+add, 2, 0x80, 0x0, 1, 0, W|Modrm|No_sSuf|No_ldSuf|IsLockable, { Imm8|Imm16|Imm32|Imm32S, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
 
-inc, 1, 0x40, None, 1, CpuNo64, ShortForm|No_bSuf|No_sSuf|No_qSuf|No_ldSuf, { Reg16|Reg32 }
-inc, 1, 0xfe, 0x0, 1, 0, W|Modrm|No_sSuf|No_ldSuf, { Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+inc, 1, 0x40, None, 1, CpuNo64, ShortForm|No_bSuf|No_sSuf|No_qSuf|No_ldSuf|IsLockable, { Reg16|Reg32 }
+inc, 1, 0xfe, 0x0, 1, 0, W|Modrm|No_sSuf|No_ldSuf|IsLockable, { Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
 
-sub, 2, 0x28, None, 1, 0, D|W|Modrm|No_sSuf|No_ldSuf, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
-sub, 2, 0x83, 0x5, 1, 0, Modrm|No_bSuf|No_sSuf|No_ldSuf, { Imm8S, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
-sub, 2, 0x2c, None, 1, 0, W|No_sSuf|No_ldSuf, { Imm8|Imm16|Imm32|Imm32S, Acc|Byte|Word|Dword|Qword }
-sub, 2, 0x80, 0x5, 1, 0, W|Modrm|No_sSuf|No_ldSuf, { Imm8|Imm16|Imm32|Imm32S, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+sub, 2, 0x28, None, 1, 0, D|W|Modrm|No_sSuf|No_ldSuf|IsLockable, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+sub, 2, 0x83, 0x5, 1, 0, Modrm|No_bSuf|No_sSuf|No_ldSuf|IsLockable, { Imm8S, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+sub, 2, 0x2c, None, 1, 0, W|No_sSuf|No_ldSuf|IsLockable, { Imm8|Imm16|Imm32|Imm32S, Acc|Byte|Word|Dword|Qword }
+sub, 2, 0x80, 0x5, 1, 0, W|Modrm|No_sSuf|No_ldSuf|IsLockable, { Imm8|Imm16|Imm32|Imm32S, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
 
-dec, 1, 0x48, None, 1, CpuNo64, ShortForm|No_bSuf|No_sSuf|No_qSuf|No_ldSuf, { Reg16|Reg32 }
-dec, 1, 0xfe, 0x1, 1, 0, W|Modrm|No_sSuf|No_ldSuf, { Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+dec, 1, 0x48, None, 1, CpuNo64, ShortForm|No_bSuf|No_sSuf|No_qSuf|No_ldSuf|IsLockable, { Reg16|Reg32 }
+dec, 1, 0xfe, 0x1, 1, 0, W|Modrm|No_sSuf|No_ldSuf|IsLockable, { Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
 
-sbb, 2, 0x18, None, 1, 0, D|W|Modrm|No_sSuf|No_ldSuf, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
-sbb, 2, 0x83, 0x3, 1, 0, Modrm|No_bSuf|No_sSuf|No_ldSuf, { Imm8S, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
-sbb, 2, 0x1c, None, 1, 0, W|No_sSuf|No_ldSuf, { Imm8|Imm16|Imm32|Imm32S, Acc|Byte|Word|Dword|Qword }
-sbb, 2, 0x80, 0x3, 1, 0, W|Modrm|No_sSuf|No_ldSuf, { Imm8|Imm16|Imm32|Imm32S, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+sbb, 2, 0x18, None, 1, 0, D|W|Modrm|No_sSuf|No_ldSuf|IsLockable, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+sbb, 2, 0x83, 0x3, 1, 0, Modrm|No_bSuf|No_sSuf|No_ldSuf|IsLockable, { Imm8S, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+sbb, 2, 0x1c, None, 1, 0, W|No_sSuf|No_ldSuf|IsLockable, { Imm8|Imm16|Imm32|Imm32S, Acc|Byte|Word|Dword|Qword }
+sbb, 2, 0x80, 0x3, 1, 0, W|Modrm|No_sSuf|No_ldSuf|IsLockable, { Imm8|Imm16|Imm32|Imm32S, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
 
 cmp, 2, 0x38, None, 1, 0, D|W|Modrm|No_sSuf|No_ldSuf, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
 cmp, 2, 0x83, 0x7, 1, 0, Modrm|No_bSuf|No_sSuf|No_ldSuf, { Imm8S, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
@@ -199,31 +199,31 @@ test, 2, 0x84, None, 1, 0, W|Modrm|No_sSuf|No_ldSuf, { Byte|Word|Dword|Qword|Uns
 test, 2, 0xa8, None, 1, 0, W|No_sSuf|No_ldSuf, { Imm8|Imm16|Imm32|Imm32S, Acc|Byte|Word|Dword|Qword }
 test, 2, 0xf6, 0x0, 1, 0, W|Modrm|No_sSuf|No_ldSuf, { Imm8|Imm16|Imm32|Imm32S, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
 
-and, 2, 0x20, None, 1, 0, D|W|Modrm|No_sSuf|No_ldSuf, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
-and, 2, 0x83, 0x4, 1, 0, Modrm|No_bSuf|No_sSuf|No_ldSuf, { Imm8S, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
-and, 2, 0x24, None, 1, 0, W|No_sSuf|No_ldSuf, { Imm8|Imm16|Imm32|Imm32S, Acc|Byte|Word|Dword|Qword }
-and, 2, 0x80, 0x4, 1, 0, W|Modrm|No_sSuf|No_ldSuf, { Imm8|Imm16|Imm32|Imm32S, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+and, 2, 0x20, None, 1, 0, D|W|Modrm|No_sSuf|No_ldSuf|IsLockable, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+and, 2, 0x83, 0x4, 1, 0, Modrm|No_bSuf|No_sSuf|No_ldSuf|IsLockable, { Imm8S, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+and, 2, 0x24, None, 1, 0, W|No_sSuf|No_ldSuf|IsLockable, { Imm8|Imm16|Imm32|Imm32S, Acc|Byte|Word|Dword|Qword }
+and, 2, 0x80, 0x4, 1, 0, W|Modrm|No_sSuf|No_ldSuf|IsLockable, { Imm8|Imm16|Imm32|Imm32S, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
 
-or, 2, 0x8, None, 1, 0, D|W|Modrm|No_sSuf|No_ldSuf, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
-or, 2, 0x83, 0x1, 1, 0, Modrm|No_bSuf|No_sSuf|No_ldSuf, { Imm8S, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
-or, 2, 0xc, None, 1, 0, W|No_sSuf|No_ldSuf, { Imm8|Imm16|Imm32|Imm32S, Acc|Byte|Word|Dword|Qword }
-or, 2, 0x80, 0x1, 1, 0, W|Modrm|No_sSuf|No_ldSuf, { Imm8|Imm16|Imm32|Imm32S, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+or, 2, 0x8, None, 1, 0, D|W|Modrm|No_sSuf|No_ldSuf|IsLockable, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+or, 2, 0x83, 0x1, 1, 0, Modrm|No_bSuf|No_sSuf|No_ldSuf|IsLockable, { Imm8S, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+or, 2, 0xc, None, 1, 0, W|No_sSuf|No_ldSuf|IsLockable, { Imm8|Imm16|Imm32|Imm32S, Acc|Byte|Word|Dword|Qword }
+or, 2, 0x80, 0x1, 1, 0, W|Modrm|No_sSuf|No_ldSuf|IsLockable, { Imm8|Imm16|Imm32|Imm32S, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
 
-xor, 2, 0x30, None, 1, 0, D|W|Modrm|No_sSuf|No_ldSuf, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
-xor, 2, 0x83, 0x6, 1, 0, Modrm|No_bSuf|No_sSuf|No_ldSuf, { Imm8S, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
-xor, 2, 0x34, None, 1, 0, W|No_sSuf|No_ldSuf, { Imm8|Imm16|Imm32|Imm32S, Acc|Byte|Word|Dword|Qword }
-xor, 2, 0x80, 0x6, 1, 0, W|Modrm|No_sSuf|No_ldSuf, { Imm8|Imm16|Imm32|Imm32S, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+xor, 2, 0x30, None, 1, 0, D|W|Modrm|No_sSuf|No_ldSuf|IsLockable, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+xor, 2, 0x83, 0x6, 1, 0, Modrm|No_bSuf|No_sSuf|No_ldSuf|IsLockable, { Imm8S, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+xor, 2, 0x34, None, 1, 0, W|No_sSuf|No_ldSuf|IsLockable, { Imm8|Imm16|Imm32|Imm32S, Acc|Byte|Word|Dword|Qword }
+xor, 2, 0x80, 0x6, 1, 0, W|Modrm|No_sSuf|No_ldSuf|IsLockable, { Imm8|Imm16|Imm32|Imm32S, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
 
 // clr with 1 operand is really xor with 2 operands.
 clr, 1, 0x30, None, 1, 0, W|Modrm|No_sSuf|No_ldSuf|RegKludge, { Reg8|Reg16|Reg32|Reg64 }
 
-adc, 2, 0x10, None, 1, 0, D|W|Modrm|No_sSuf|No_ldSuf, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
-adc, 2, 0x83, 0x2, 1, 0, Modrm|No_bSuf|No_sSuf|No_ldSuf, { Imm8S, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
-adc, 2, 0x14, None, 1, 0, W|No_sSuf|No_ldSuf, { Imm8|Imm16|Imm32|Imm32S, Acc|Byte|Word|Dword|Qword }
-adc, 2, 0x80, 0x2, 1, 0, W|Modrm|No_sSuf|No_ldSuf, { Imm8|Imm16|Imm32|Imm32S, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+adc, 2, 0x10, None, 1, 0, D|W|Modrm|No_sSuf|No_ldSuf|IsLockable, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+adc, 2, 0x83, 0x2, 1, 0, Modrm|No_bSuf|No_sSuf|No_ldSuf|IsLockable, { Imm8S, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+adc, 2, 0x14, None, 1, 0, W|No_sSuf|No_ldSuf|IsLockable, { Imm8|Imm16|Imm32|Imm32S, Acc|Byte|Word|Dword|Qword }
+adc, 2, 0x80, 0x2, 1, 0, W|Modrm|No_sSuf|No_ldSuf|IsLockable, { Imm8|Imm16|Imm32|Imm32S, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
 
-neg, 1, 0xf6, 0x3, 1, 0, W|Modrm|No_sSuf|No_ldSuf, { Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
-not, 1, 0xf6, 0x2, 1, 0, W|Modrm|No_sSuf|No_ldSuf, { Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+neg, 1, 0xf6, 0x3, 1, 0, W|Modrm|No_sSuf|No_ldSuf|IsLockable, { Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+not, 1, 0xf6, 0x2, 1, 0, W|Modrm|No_sSuf|No_ldSuf|IsLockable, { Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
 
 aaa, 0, 0x37, None, 1, CpuNo64, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { 0 }
 aas, 0, 0x3f, None, 1, CpuNo64, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { 0 }
@@ -479,12 +479,12 @@ bsf, 2, 0xfbc, None, 2, Cpu386, Modrm|No_bSuf|No_sSuf|No_ldSuf, { Reg16|Reg32|Re
 bsr, 2, 0xfbd, None, 2, Cpu386, Modrm|No_bSuf|No_sSuf|No_ldSuf, { Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S, Reg16|Reg32|Reg64 }
 bt, 2, 0xfa3, None, 2, Cpu386, Modrm|No_bSuf|No_sSuf|No_ldSuf, { Reg16|Reg32|Reg64, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
 bt, 2, 0xfba, 0x4, 2, Cpu386, Modrm|No_bSuf|No_sSuf|No_ldSuf, { Imm8, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
-btc, 2, 0xfbb, None, 2, Cpu386, Modrm|No_bSuf|No_sSuf|No_ldSuf, { Reg16|Reg32|Reg64, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
-btc, 2, 0xfba, 0x7, 2, Cpu386, Modrm|No_bSuf|No_sSuf|No_ldSuf, { Imm8, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
-btr, 2, 0xfb3, None, 2, Cpu386, Modrm|No_bSuf|No_sSuf|No_ldSuf, { Reg16|Reg32|Reg64, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
-btr, 2, 0xfba, 0x6, 2, Cpu386, Modrm|No_bSuf|No_sSuf|No_ldSuf, { Imm8, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
-bts, 2, 0xfab, None, 2, Cpu386, Modrm|No_bSuf|No_sSuf|No_ldSuf, { Reg16|Reg32|Reg64, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
-bts, 2, 0xfba, 0x5, 2, Cpu386, Modrm|No_bSuf|No_sSuf|No_ldSuf, { Imm8, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+btc, 2, 0xfbb, None, 2, Cpu386, Modrm|No_bSuf|No_sSuf|No_ldSuf|IsLockable, { Reg16|Reg32|Reg64, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+btc, 2, 0xfba, 0x7, 2, Cpu386, Modrm|No_bSuf|No_sSuf|No_ldSuf|IsLockable, { Imm8, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+btr, 2, 0xfb3, None, 2, Cpu386, Modrm|No_bSuf|No_sSuf|No_ldSuf|IsLockable, { Reg16|Reg32|Reg64, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+btr, 2, 0xfba, 0x6, 2, Cpu386, Modrm|No_bSuf|No_sSuf|No_ldSuf|IsLockable, { Imm8, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+bts, 2, 0xfab, None, 2, Cpu386, Modrm|No_bSuf|No_sSuf|No_ldSuf|IsLockable, { Reg16|Reg32|Reg64, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+bts, 2, 0xfba, 0x5, 2, Cpu386, Modrm|No_bSuf|No_sSuf|No_ldSuf|IsLockable, { Imm8, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
 
 // Interrupts & op. sys insns.
 // See gas/config/tc-i386.c for conversion of 'int $3' into the special
@@ -829,8 +829,8 @@ rex.wrxb, 0, 0x4f, None, 1, Cpu64, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ld
 // 486 extensions.
 
 bswap, 1, 0xfc8, None, 2, Cpu486, ShortForm|No_bSuf|No_wSuf|No_sSuf|No_ldSuf, { Reg32|Reg64 }
-xadd, 2, 0xfc0, None, 2, Cpu486, W|Modrm|No_sSuf|No_ldSuf, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
-cmpxchg, 2, 0xfb0, None, 2, Cpu486, W|Modrm|No_sSuf|No_ldSuf, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+xadd, 2, 0xfc0, None, 2, Cpu486, W|Modrm|No_sSuf|No_ldSuf|IsLockable, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+cmpxchg, 2, 0xfb0, None, 2, Cpu486, W|Modrm|No_sSuf|No_ldSuf|IsLockable, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
 invd, 0, 0xf08, None, 2, Cpu486, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { 0 }
 wbinvd, 0, 0xf09, None, 2, Cpu486, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { 0 }
 invlpg, 1, 0xf01, 0x7, 2, Cpu486, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
@@ -842,7 +842,7 @@ cpuid, 0, 0xfa2, None, 2, Cpu486, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldS
 wrmsr, 0, 0xf30, None, 2, Cpu586, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { 0 }
 rdtsc, 0, 0xf31, None, 2, Cpu586, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { 0 }
 rdmsr, 0, 0xf32, None, 2, Cpu586, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { 0 }
-cmpxchg8b, 1, 0xfc7, 0x1, 2, Cpu586, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_ldSuf, { Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
+cmpxchg8b, 1, 0xfc7, 0x1, 2, Cpu586, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_ldSuf|IsLockable, { Qword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S }
 
 // Pentium II/Pentium Pro extensions.
 sysenter, 0, 0xf34, None, 2, Cpu686, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { 0 }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]