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]

Re: [RFC PATCH] Fix decoding of superfluous data32 prefix before superfluous rex.W prefix before push.


Thanks for that pointer.  I followed that hint to do a few more similar
changes and managed to get to where all the "66 48 ..." cases in
x86-64-stack.s produce "data32 rex.W ...".  Here's the final change
including all that.

There are no other 'make check' regressions on x86_64-linux-gnu.
The disassembler code is so hairy that I can't be sure I haven't broken
some other case for which there is no test coverage.  But you might
know it enough better that you can be more confident than I am.

Ok for trunk?


Thanks,
Roland


gas/testsuite/
2012-08-06  Roland McGrath  <mcgrathr@google.com>

	* gas/i386/x86-64-stack.s: Add cases for push immediate.
	* gas/testsuite/gas/i386/ilp32/x86-64-stack-intel.d: Updated.
	* gas/testsuite/gas/i386/ilp32/x86-64-stack-suffix.d: Updated.
	* gas/testsuite/gas/i386/ilp32/x86-64-stack.d: Updated.
	* gas/testsuite/gas/i386/x86-64-stack-intel.d: Updated.
	* gas/testsuite/gas/i386/x86-64-stack-suffix.d: Updated.
	* gas/testsuite/gas/i386/x86-64-stack.d: Updated.

opcodes/
2012-08-06  Roland McGrath  <mcgrathr@google.com>
	    Victor Khimenko  <khim@google.com>
	    H.J. Lu  <hongjiu.lu@intel.com>

	* i386-dis.c (OP_sI): In b_T_mode and v_mode, REX_W trumps DFLAG.
	(putop): For 'T', 'U', and 'V', treat REX_W like DFLAG.
	(intel_operand_size): For stack_v_mode, treat REX_W like DFLAG.
	(OP_E_register): Likewise.
	(OP_REG): For low 8 whole registers, treat REX_W like DFLAG.

diff --git a/gas/testsuite/gas/i386/ilp32/x86-64-stack-intel.d
b/gas/testsuite/gas/i386/ilp32/x86-64-stack-intel.d
index 7092a42..fbcada2 100644
--- a/gas/testsuite/gas/i386/ilp32/x86-64-stack-intel.d
+++ b/gas/testsuite/gas/i386/ilp32/x86-64-stack-intel.d
@@ -10,41 +10,51 @@ Disassembly of section .text:
 [ 	]*[a-f0-9]+:	50                   	push   rax
 [ 	]*[a-f0-9]+:	66 50                	push   ax
 [ 	]*[a-f0-9]+:	48 50                	rex.W push rax
-[ 	]*[a-f0-9]+:	66 48 50             	data32 push rax
+[ 	]*[a-f0-9]+:	66 48 50             	data32 rex.W push rax
 [ 	]*[a-f0-9]+:	58                   	pop    rax
 [ 	]*[a-f0-9]+:	66 58                	pop    ax
 [ 	]*[a-f0-9]+:	48 58                	rex.W pop rax
-[ 	]*[a-f0-9]+:	66 48 58             	data32 pop rax
+[ 	]*[a-f0-9]+:	66 48 58             	data32 rex.W pop rax
 [ 	]*[a-f0-9]+:	8f c0                	pop    rax
 [ 	]*[a-f0-9]+:	66 8f c0             	pop    ax
 [ 	]*[a-f0-9]+:	48 8f c0             	rex.W pop rax
-[ 	]*[a-f0-9]+:	66 48 8f c0          	data32 pop rax
+[ 	]*[a-f0-9]+:	66 48 8f c0          	data32 rex.W pop rax
 [ 	]*[a-f0-9]+:	8f 00                	pop    QWORD PTR \[rax\]
 [ 	]*[a-f0-9]+:	66 8f 00             	pop    WORD PTR \[rax\]
 [ 	]*[a-f0-9]+:	48 8f 00             	rex.W pop QWORD PTR \[rax\]
-[ 	]*[a-f0-9]+:	66 48 8f 00          	data32 pop QWORD PTR \[rax\]
+[ 	]*[a-f0-9]+:	66 48 8f 00          	data32 rex.W pop QWORD PTR \[rax\]
 [ 	]*[a-f0-9]+:	ff d0                	call   rax
 [ 	]*[a-f0-9]+:	66 ff d0             	call   ax
 [ 	]*[a-f0-9]+:	48 ff d0             	rex.W call rax
-[ 	]*[a-f0-9]+:	66 48 ff d0          	data32 call rax
+[ 	]*[a-f0-9]+:	66 48 ff d0          	data32 rex.W call rax
 [ 	]*[a-f0-9]+:	ff 10                	call   QWORD PTR \[rax\]
 [ 	]*[a-f0-9]+:	66 ff 10             	call   WORD PTR \[rax\]
 [ 	]*[a-f0-9]+:	48 ff 10             	rex.W call QWORD PTR \[rax\]
-[ 	]*[a-f0-9]+:	66 48 ff 10          	data32 call QWORD PTR \[rax\]
+[ 	]*[a-f0-9]+:	66 48 ff 10          	data32 rex.W call QWORD PTR \[rax\]
 [ 	]*[a-f0-9]+:	ff e0                	jmp    rax
 [ 	]*[a-f0-9]+:	66 ff e0             	jmp    ax
 [ 	]*[a-f0-9]+:	48 ff e0             	rex.W jmp rax
-[ 	]*[a-f0-9]+:	66 48 ff e0          	data32 jmp rax
+[ 	]*[a-f0-9]+:	66 48 ff e0          	data32 rex.W jmp rax
 [ 	]*[a-f0-9]+:	ff 20                	jmp    QWORD PTR \[rax\]
 [ 	]*[a-f0-9]+:	66 ff 20             	jmp    WORD PTR \[rax\]
 [ 	]*[a-f0-9]+:	48 ff 20             	rex.W jmp QWORD PTR \[rax\]
-[ 	]*[a-f0-9]+:	66 48 ff 20          	data32 jmp QWORD PTR \[rax\]
+[ 	]*[a-f0-9]+:	66 48 ff 20          	data32 rex.W jmp QWORD PTR \[rax\]
 [ 	]*[a-f0-9]+:	ff f0                	push   rax
 [ 	]*[a-f0-9]+:	66 ff f0             	push   ax
 [ 	]*[a-f0-9]+:	48 ff f0             	rex.W push rax
-[ 	]*[a-f0-9]+:	66 48 ff f0          	data32 push rax
+[ 	]*[a-f0-9]+:	66 48 ff f0          	data32 rex.W push rax
 [ 	]*[a-f0-9]+:	ff 30                	push   QWORD PTR \[rax\]
 [ 	]*[a-f0-9]+:	66 ff 30             	push   WORD PTR \[rax\]
 [ 	]*[a-f0-9]+:	48 ff 30             	rex.W push QWORD PTR \[rax\]
-[ 	]*[a-f0-9]+:	66 48 ff 30          	data32 push QWORD PTR \[rax\]
+[ 	]*[a-f0-9]+:	66 48 ff 30          	data32 rex.W push QWORD PTR \[rax\]
+[ 	]*[a-f0-9]+:	6a ff                	push   0xffffffffffffffff
+[ 	]*[a-f0-9]+:	66 6a ff             	pushw  0xffff
+[ 	]*[a-f0-9]+:	48 6a ff             	rex.W push 0xffffffffffffffff
+[ 	]*[a-f0-9]+:	66 48 6a ff          	data32 rex.W push 0xffffffffffffffff
+[ 	]*[a-f0-9]+:	68 01 02 03 04       	push   0x4030201
+[ 	]*[a-f0-9]+:	66 68 01 02          	pushw  0x201
+[ 	]*[a-f0-9]+:	03 04 48             	add    eax,DWORD PTR \[rax\+rcx\*2\]
+[ 	]*[a-f0-9]+:	68 01 02 03 04       	push   0x4030201
+[ 	]*[a-f0-9]+:	66 48 68 01 02 03 04 	data32 rex.W push 0x4030201
+[ 	]*[a-f0-9]+:	90                   	nop
 #pass
diff --git a/gas/testsuite/gas/i386/ilp32/x86-64-stack-suffix.d
b/gas/testsuite/gas/i386/ilp32/x86-64-stack-suffix.d
index 45101dd..dd2f3da 100644
--- a/gas/testsuite/gas/i386/ilp32/x86-64-stack-suffix.d
+++ b/gas/testsuite/gas/i386/ilp32/x86-64-stack-suffix.d
@@ -10,41 +10,51 @@ Disassembly of section .text:
 [ 	]*[a-f0-9]+:	50                   	pushq  %rax
 [ 	]*[a-f0-9]+:	66 50                	pushw  %ax
 [ 	]*[a-f0-9]+:	48 50                	rex.W pushq %rax
-[ 	]*[a-f0-9]+:	66 48 50             	data32 pushq %rax
+[ 	]*[a-f0-9]+:	66 48 50             	data32 rex.W pushq %rax
 [ 	]*[a-f0-9]+:	58                   	popq   %rax
 [ 	]*[a-f0-9]+:	66 58                	popw   %ax
 [ 	]*[a-f0-9]+:	48 58                	rex.W popq %rax
-[ 	]*[a-f0-9]+:	66 48 58             	data32 popq %rax
+[ 	]*[a-f0-9]+:	66 48 58             	data32 rex.W popq %rax
 [ 	]*[a-f0-9]+:	8f c0                	popq   %rax
 [ 	]*[a-f0-9]+:	66 8f c0             	popw   %ax
 [ 	]*[a-f0-9]+:	48 8f c0             	rex.W popq %rax
-[ 	]*[a-f0-9]+:	66 48 8f c0          	data32 popq %rax
+[ 	]*[a-f0-9]+:	66 48 8f c0          	data32 rex.W popq %rax
 [ 	]*[a-f0-9]+:	8f 00                	popq   \(%rax\)
 [ 	]*[a-f0-9]+:	66 8f 00             	popw   \(%rax\)
 [ 	]*[a-f0-9]+:	48 8f 00             	rex.W popq \(%rax\)
-[ 	]*[a-f0-9]+:	66 48 8f 00          	data32 popq \(%rax\)
+[ 	]*[a-f0-9]+:	66 48 8f 00          	data32 rex.W popq \(%rax\)
 [ 	]*[a-f0-9]+:	ff d0                	callq  \*%rax
 [ 	]*[a-f0-9]+:	66 ff d0             	callw  \*%ax
 [ 	]*[a-f0-9]+:	48 ff d0             	rex.W callq \*%rax
-[ 	]*[a-f0-9]+:	66 48 ff d0          	data32 callq \*%rax
+[ 	]*[a-f0-9]+:	66 48 ff d0          	data32 rex.W callq \*%rax
 [ 	]*[a-f0-9]+:	ff 10                	callq  \*\(%rax\)
 [ 	]*[a-f0-9]+:	66 ff 10             	callw  \*\(%rax\)
 [ 	]*[a-f0-9]+:	48 ff 10             	rex.W callq \*\(%rax\)
-[ 	]*[a-f0-9]+:	66 48 ff 10          	data32 callq \*\(%rax\)
+[ 	]*[a-f0-9]+:	66 48 ff 10          	data32 rex.W callq \*\(%rax\)
 [ 	]*[a-f0-9]+:	ff e0                	jmpq   \*%rax
 [ 	]*[a-f0-9]+:	66 ff e0             	jmpw   \*%ax
 [ 	]*[a-f0-9]+:	48 ff e0             	rex.W jmpq \*%rax
-[ 	]*[a-f0-9]+:	66 48 ff e0          	data32 jmpq \*%rax
+[ 	]*[a-f0-9]+:	66 48 ff e0          	data32 rex.W jmpq \*%rax
 [ 	]*[a-f0-9]+:	ff 20                	jmpq   \*\(%rax\)
 [ 	]*[a-f0-9]+:	66 ff 20             	jmpw   \*\(%rax\)
 [ 	]*[a-f0-9]+:	48 ff 20             	rex.W jmpq \*\(%rax\)
-[ 	]*[a-f0-9]+:	66 48 ff 20          	data32 jmpq \*\(%rax\)
+[ 	]*[a-f0-9]+:	66 48 ff 20          	data32 rex.W jmpq \*\(%rax\)
 [ 	]*[a-f0-9]+:	ff f0                	pushq  %rax
 [ 	]*[a-f0-9]+:	66 ff f0             	pushw  %ax
 [ 	]*[a-f0-9]+:	48 ff f0             	rex.W pushq %rax
-[ 	]*[a-f0-9]+:	66 48 ff f0          	data32 pushq %rax
+[ 	]*[a-f0-9]+:	66 48 ff f0          	data32 rex.W pushq %rax
 [ 	]*[a-f0-9]+:	ff 30                	pushq  \(%rax\)
 [ 	]*[a-f0-9]+:	66 ff 30             	pushw  \(%rax\)
 [ 	]*[a-f0-9]+:	48 ff 30             	rex.W pushq \(%rax\)
-[ 	]*[a-f0-9]+:	66 48 ff 30          	data32 pushq \(%rax\)
+[ 	]*[a-f0-9]+:	66 48 ff 30          	data32 rex.W pushq \(%rax\)
+[ 	]*[a-f0-9]+:	6a ff                	pushq  \$0xffffffffffffffff
+[ 	]*[a-f0-9]+:	66 6a ff             	pushw  \$0xffff
+[ 	]*[a-f0-9]+:	48 6a ff             	rex.W pushq \$0xffffffffffffffff
+[ 	]*[a-f0-9]+:	66 48 6a ff          	data32 rex.W pushq \$0xffffffffffffffff
+[ 	]*[a-f0-9]+:	68 01 02 03 04       	pushq  \$0x4030201
+[ 	]*[a-f0-9]+:	66 68 01 02          	pushw  \$0x201
+[ 	]*[a-f0-9]+:	03 04 48             	addl   \(%rax,%rcx,2\),%eax
+[ 	]*[a-f0-9]+:	68 01 02 03 04       	pushq  \$0x4030201
+[ 	]*[a-f0-9]+:	66 48 68 01 02 03 04 	data32 rex.W pushq \$0x4030201
+[ 	]*[a-f0-9]+:	90                   	nop
 #pass
diff --git a/gas/testsuite/gas/i386/ilp32/x86-64-stack.d
b/gas/testsuite/gas/i386/ilp32/x86-64-stack.d
index 4976597..9f4553a 100644
--- a/gas/testsuite/gas/i386/ilp32/x86-64-stack.d
+++ b/gas/testsuite/gas/i386/ilp32/x86-64-stack.d
@@ -10,41 +10,51 @@ Disassembly of section .text:
 [ 	]*[a-f0-9]+:	50                   	push   %rax
 [ 	]*[a-f0-9]+:	66 50                	push   %ax
 [ 	]*[a-f0-9]+:	48 50                	rex.W push %rax
-[ 	]*[a-f0-9]+:	66 48 50             	data32 push %rax
+[ 	]*[a-f0-9]+:	66 48 50             	data32 rex.W push %rax
 [ 	]*[a-f0-9]+:	58                   	pop    %rax
 [ 	]*[a-f0-9]+:	66 58                	pop    %ax
 [ 	]*[a-f0-9]+:	48 58                	rex.W pop %rax
-[ 	]*[a-f0-9]+:	66 48 58             	data32 pop %rax
+[ 	]*[a-f0-9]+:	66 48 58             	data32 rex.W pop %rax
 [ 	]*[a-f0-9]+:	8f c0                	pop    %rax
 [ 	]*[a-f0-9]+:	66 8f c0             	pop    %ax
 [ 	]*[a-f0-9]+:	48 8f c0             	rex.W pop %rax
-[ 	]*[a-f0-9]+:	66 48 8f c0          	data32 pop %rax
+[ 	]*[a-f0-9]+:	66 48 8f c0          	data32 rex.W pop %rax
 [ 	]*[a-f0-9]+:	8f 00                	popq   \(%rax\)
 [ 	]*[a-f0-9]+:	66 8f 00             	popw   \(%rax\)
 [ 	]*[a-f0-9]+:	48 8f 00             	rex.W popq \(%rax\)
-[ 	]*[a-f0-9]+:	66 48 8f 00          	data32 popq \(%rax\)
+[ 	]*[a-f0-9]+:	66 48 8f 00          	data32 rex.W popq \(%rax\)
 [ 	]*[a-f0-9]+:	ff d0                	callq  \*%rax
 [ 	]*[a-f0-9]+:	66 ff d0             	callw  \*%ax
 [ 	]*[a-f0-9]+:	48 ff d0             	rex.W callq \*%rax
-[ 	]*[a-f0-9]+:	66 48 ff d0          	data32 callq \*%rax
+[ 	]*[a-f0-9]+:	66 48 ff d0          	data32 rex.W callq \*%rax
 [ 	]*[a-f0-9]+:	ff 10                	callq  \*\(%rax\)
 [ 	]*[a-f0-9]+:	66 ff 10             	callw  \*\(%rax\)
 [ 	]*[a-f0-9]+:	48 ff 10             	rex.W callq \*\(%rax\)
-[ 	]*[a-f0-9]+:	66 48 ff 10          	data32 callq \*\(%rax\)
+[ 	]*[a-f0-9]+:	66 48 ff 10          	data32 rex.W callq \*\(%rax\)
 [ 	]*[a-f0-9]+:	ff e0                	jmpq   \*%rax
 [ 	]*[a-f0-9]+:	66 ff e0             	jmpw   \*%ax
 [ 	]*[a-f0-9]+:	48 ff e0             	rex.W jmpq \*%rax
-[ 	]*[a-f0-9]+:	66 48 ff e0          	data32 jmpq \*%rax
+[ 	]*[a-f0-9]+:	66 48 ff e0          	data32 rex.W jmpq \*%rax
 [ 	]*[a-f0-9]+:	ff 20                	jmpq   \*\(%rax\)
 [ 	]*[a-f0-9]+:	66 ff 20             	jmpw   \*\(%rax\)
 [ 	]*[a-f0-9]+:	48 ff 20             	rex.W jmpq \*\(%rax\)
-[ 	]*[a-f0-9]+:	66 48 ff 20          	data32 jmpq \*\(%rax\)
+[ 	]*[a-f0-9]+:	66 48 ff 20          	data32 rex.W jmpq \*\(%rax\)
 [ 	]*[a-f0-9]+:	ff f0                	push   %rax
 [ 	]*[a-f0-9]+:	66 ff f0             	push   %ax
 [ 	]*[a-f0-9]+:	48 ff f0             	rex.W push %rax
-[ 	]*[a-f0-9]+:	66 48 ff f0          	data32 push %rax
+[ 	]*[a-f0-9]+:	66 48 ff f0          	data32 rex.W push %rax
 [ 	]*[a-f0-9]+:	ff 30                	pushq  \(%rax\)
 [ 	]*[a-f0-9]+:	66 ff 30             	pushw  \(%rax\)
 [ 	]*[a-f0-9]+:	48 ff 30             	rex.W pushq \(%rax\)
-[ 	]*[a-f0-9]+:	66 48 ff 30          	data32 pushq \(%rax\)
+[ 	]*[a-f0-9]+:	66 48 ff 30          	data32 rex.W pushq \(%rax\)
+[ 	]*[a-f0-9]+:	6a ff                	pushq  \$0xffffffffffffffff
+[ 	]*[a-f0-9]+:	66 6a ff             	pushw  \$0xffff
+[ 	]*[a-f0-9]+:	48 6a ff             	rex.W pushq \$0xffffffffffffffff
+[ 	]*[a-f0-9]+:	66 48 6a ff          	data32 rex.W pushq \$0xffffffffffffffff
+[ 	]*[a-f0-9]+:	68 01 02 03 04       	pushq  \$0x4030201
+[ 	]*[a-f0-9]+:	66 68 01 02          	pushw  \$0x201
+[ 	]*[a-f0-9]+:	03 04 48             	add    \(%rax,%rcx,2\),%eax
+[ 	]*[a-f0-9]+:	68 01 02 03 04       	pushq  \$0x4030201
+[ 	]*[a-f0-9]+:	66 48 68 01 02 03 04 	data32 rex.W pushq \$0x4030201
+[ 	]*[a-f0-9]+:	90                   	nop
 #pass
diff --git a/gas/testsuite/gas/i386/x86-64-stack-intel.d
b/gas/testsuite/gas/i386/x86-64-stack-intel.d
index 4c54af7..cb9ee89 100644
--- a/gas/testsuite/gas/i386/x86-64-stack-intel.d
+++ b/gas/testsuite/gas/i386/x86-64-stack-intel.d
@@ -10,41 +10,51 @@ Disassembly of section .text:
 [ 	]*[a-f0-9]+:	50                   	push   rax
 [ 	]*[a-f0-9]+:	66 50                	push   ax
 [ 	]*[a-f0-9]+:	48 50                	rex.W push rax
-[ 	]*[a-f0-9]+:	66 48 50             	data32 push rax
+[ 	]*[a-f0-9]+:	66 48 50             	data32 rex.W push rax
 [ 	]*[a-f0-9]+:	58                   	pop    rax
 [ 	]*[a-f0-9]+:	66 58                	pop    ax
 [ 	]*[a-f0-9]+:	48 58                	rex.W pop rax
-[ 	]*[a-f0-9]+:	66 48 58             	data32 pop rax
+[ 	]*[a-f0-9]+:	66 48 58             	data32 rex.W pop rax
 [ 	]*[a-f0-9]+:	8f c0                	pop    rax
 [ 	]*[a-f0-9]+:	66 8f c0             	pop    ax
 [ 	]*[a-f0-9]+:	48 8f c0             	rex.W pop rax
-[ 	]*[a-f0-9]+:	66 48 8f c0          	data32 pop rax
+[ 	]*[a-f0-9]+:	66 48 8f c0          	data32 rex.W pop rax
 [ 	]*[a-f0-9]+:	8f 00                	pop    QWORD PTR \[rax\]
 [ 	]*[a-f0-9]+:	66 8f 00             	pop    WORD PTR \[rax\]
 [ 	]*[a-f0-9]+:	48 8f 00             	rex.W pop QWORD PTR \[rax\]
-[ 	]*[a-f0-9]+:	66 48 8f 00          	data32 pop QWORD PTR \[rax\]
+[ 	]*[a-f0-9]+:	66 48 8f 00          	data32 rex.W pop QWORD PTR \[rax\]
 [ 	]*[a-f0-9]+:	ff d0                	call   rax
 [ 	]*[a-f0-9]+:	66 ff d0             	call   ax
 [ 	]*[a-f0-9]+:	48 ff d0             	rex.W call rax
-[ 	]*[a-f0-9]+:	66 48 ff d0          	data32 call rax
+[ 	]*[a-f0-9]+:	66 48 ff d0          	data32 rex.W call rax
 [ 	]*[a-f0-9]+:	ff 10                	call   QWORD PTR \[rax\]
 [ 	]*[a-f0-9]+:	66 ff 10             	call   WORD PTR \[rax\]
 [ 	]*[a-f0-9]+:	48 ff 10             	rex.W call QWORD PTR \[rax\]
-[ 	]*[a-f0-9]+:	66 48 ff 10          	data32 call QWORD PTR \[rax\]
+[ 	]*[a-f0-9]+:	66 48 ff 10          	data32 rex.W call QWORD PTR \[rax\]
 [ 	]*[a-f0-9]+:	ff e0                	jmp    rax
 [ 	]*[a-f0-9]+:	66 ff e0             	jmp    ax
 [ 	]*[a-f0-9]+:	48 ff e0             	rex.W jmp rax
-[ 	]*[a-f0-9]+:	66 48 ff e0          	data32 jmp rax
+[ 	]*[a-f0-9]+:	66 48 ff e0          	data32 rex.W jmp rax
 [ 	]*[a-f0-9]+:	ff 20                	jmp    QWORD PTR \[rax\]
 [ 	]*[a-f0-9]+:	66 ff 20             	jmp    WORD PTR \[rax\]
 [ 	]*[a-f0-9]+:	48 ff 20             	rex.W jmp QWORD PTR \[rax\]
-[ 	]*[a-f0-9]+:	66 48 ff 20          	data32 jmp QWORD PTR \[rax\]
+[ 	]*[a-f0-9]+:	66 48 ff 20          	data32 rex.W jmp QWORD PTR \[rax\]
 [ 	]*[a-f0-9]+:	ff f0                	push   rax
 [ 	]*[a-f0-9]+:	66 ff f0             	push   ax
 [ 	]*[a-f0-9]+:	48 ff f0             	rex.W push rax
-[ 	]*[a-f0-9]+:	66 48 ff f0          	data32 push rax
+[ 	]*[a-f0-9]+:	66 48 ff f0          	data32 rex.W push rax
 [ 	]*[a-f0-9]+:	ff 30                	push   QWORD PTR \[rax\]
 [ 	]*[a-f0-9]+:	66 ff 30             	push   WORD PTR \[rax\]
 [ 	]*[a-f0-9]+:	48 ff 30             	rex.W push QWORD PTR \[rax\]
-[ 	]*[a-f0-9]+:	66 48 ff 30          	data32 push QWORD PTR \[rax\]
+[ 	]*[a-f0-9]+:	66 48 ff 30          	data32 rex.W push QWORD PTR \[rax\]
+[ 	]*[a-f0-9]+:	6a ff                	push   0xffffffffffffffff
+[ 	]*[a-f0-9]+:	66 6a ff             	pushw  0xffff
+[ 	]*[a-f0-9]+:	48 6a ff             	rex.W push 0xffffffffffffffff
+[ 	]*[a-f0-9]+:	66 48 6a ff          	data32 rex.W push 0xffffffffffffffff
+[ 	]*[a-f0-9]+:	68 01 02 03 04       	push   0x4030201
+[ 	]*[a-f0-9]+:	66 68 01 02          	pushw  0x201
+[ 	]*[a-f0-9]+:	03 04 48             	add    eax,DWORD PTR \[rax\+rcx\*2\]
+[ 	]*[a-f0-9]+:	68 01 02 03 04       	push   0x4030201
+[ 	]*[a-f0-9]+:	66 48 68 01 02 03 04 	data32 rex.W push 0x4030201
+[ 	]*[a-f0-9]+:	90                   	nop
 #pass
diff --git a/gas/testsuite/gas/i386/x86-64-stack-suffix.d
b/gas/testsuite/gas/i386/x86-64-stack-suffix.d
index 07bf79b..a0b94d0 100644
--- a/gas/testsuite/gas/i386/x86-64-stack-suffix.d
+++ b/gas/testsuite/gas/i386/x86-64-stack-suffix.d
@@ -10,41 +10,51 @@ Disassembly of section .text:
 [ 	]*[a-f0-9]+:	50                   	pushq  %rax
 [ 	]*[a-f0-9]+:	66 50                	pushw  %ax
 [ 	]*[a-f0-9]+:	48 50                	rex.W pushq %rax
-[ 	]*[a-f0-9]+:	66 48 50             	data32 pushq %rax
+[ 	]*[a-f0-9]+:	66 48 50             	data32 rex.W pushq %rax
 [ 	]*[a-f0-9]+:	58                   	popq   %rax
 [ 	]*[a-f0-9]+:	66 58                	popw   %ax
 [ 	]*[a-f0-9]+:	48 58                	rex.W popq %rax
-[ 	]*[a-f0-9]+:	66 48 58             	data32 popq %rax
+[ 	]*[a-f0-9]+:	66 48 58             	data32 rex.W popq %rax
 [ 	]*[a-f0-9]+:	8f c0                	popq   %rax
 [ 	]*[a-f0-9]+:	66 8f c0             	popw   %ax
 [ 	]*[a-f0-9]+:	48 8f c0             	rex.W popq %rax
-[ 	]*[a-f0-9]+:	66 48 8f c0          	data32 popq %rax
+[ 	]*[a-f0-9]+:	66 48 8f c0          	data32 rex.W popq %rax
 [ 	]*[a-f0-9]+:	8f 00                	popq   \(%rax\)
 [ 	]*[a-f0-9]+:	66 8f 00             	popw   \(%rax\)
 [ 	]*[a-f0-9]+:	48 8f 00             	rex.W popq \(%rax\)
-[ 	]*[a-f0-9]+:	66 48 8f 00          	data32 popq \(%rax\)
+[ 	]*[a-f0-9]+:	66 48 8f 00          	data32 rex.W popq \(%rax\)
 [ 	]*[a-f0-9]+:	ff d0                	callq  \*%rax
 [ 	]*[a-f0-9]+:	66 ff d0             	callw  \*%ax
 [ 	]*[a-f0-9]+:	48 ff d0             	rex.W callq \*%rax
-[ 	]*[a-f0-9]+:	66 48 ff d0          	data32 callq \*%rax
+[ 	]*[a-f0-9]+:	66 48 ff d0          	data32 rex.W callq \*%rax
 [ 	]*[a-f0-9]+:	ff 10                	callq  \*\(%rax\)
 [ 	]*[a-f0-9]+:	66 ff 10             	callw  \*\(%rax\)
 [ 	]*[a-f0-9]+:	48 ff 10             	rex.W callq \*\(%rax\)
-[ 	]*[a-f0-9]+:	66 48 ff 10          	data32 callq \*\(%rax\)
+[ 	]*[a-f0-9]+:	66 48 ff 10          	data32 rex.W callq \*\(%rax\)
 [ 	]*[a-f0-9]+:	ff e0                	jmpq   \*%rax
 [ 	]*[a-f0-9]+:	66 ff e0             	jmpw   \*%ax
 [ 	]*[a-f0-9]+:	48 ff e0             	rex.W jmpq \*%rax
-[ 	]*[a-f0-9]+:	66 48 ff e0          	data32 jmpq \*%rax
+[ 	]*[a-f0-9]+:	66 48 ff e0          	data32 rex.W jmpq \*%rax
 [ 	]*[a-f0-9]+:	ff 20                	jmpq   \*\(%rax\)
 [ 	]*[a-f0-9]+:	66 ff 20             	jmpw   \*\(%rax\)
 [ 	]*[a-f0-9]+:	48 ff 20             	rex.W jmpq \*\(%rax\)
-[ 	]*[a-f0-9]+:	66 48 ff 20          	data32 jmpq \*\(%rax\)
+[ 	]*[a-f0-9]+:	66 48 ff 20          	data32 rex.W jmpq \*\(%rax\)
 [ 	]*[a-f0-9]+:	ff f0                	pushq  %rax
 [ 	]*[a-f0-9]+:	66 ff f0             	pushw  %ax
 [ 	]*[a-f0-9]+:	48 ff f0             	rex.W pushq %rax
-[ 	]*[a-f0-9]+:	66 48 ff f0          	data32 pushq %rax
+[ 	]*[a-f0-9]+:	66 48 ff f0          	data32 rex.W pushq %rax
 [ 	]*[a-f0-9]+:	ff 30                	pushq  \(%rax\)
 [ 	]*[a-f0-9]+:	66 ff 30             	pushw  \(%rax\)
 [ 	]*[a-f0-9]+:	48 ff 30             	rex.W pushq \(%rax\)
-[ 	]*[a-f0-9]+:	66 48 ff 30          	data32 pushq \(%rax\)
+[ 	]*[a-f0-9]+:	66 48 ff 30          	data32 rex.W pushq \(%rax\)
+[ 	]*[a-f0-9]+:	6a ff                	pushq  \$0xffffffffffffffff
+[ 	]*[a-f0-9]+:	66 6a ff             	pushw  \$0xffff
+[ 	]*[a-f0-9]+:	48 6a ff             	rex.W pushq \$0xffffffffffffffff
+[ 	]*[a-f0-9]+:	66 48 6a ff          	data32 rex.W pushq \$0xffffffffffffffff
+[ 	]*[a-f0-9]+:	68 01 02 03 04       	pushq  \$0x4030201
+[ 	]*[a-f0-9]+:	66 68 01 02          	pushw  \$0x201
+[ 	]*[a-f0-9]+:	03 04 48             	addl   \(%rax,%rcx,2\),%eax
+[ 	]*[a-f0-9]+:	68 01 02 03 04       	pushq  \$0x4030201
+[ 	]*[a-f0-9]+:	66 48 68 01 02 03 04 	data32 rex.W pushq \$0x4030201
+[ 	]*[a-f0-9]+:	90                   	nop
 #pass
diff --git a/gas/testsuite/gas/i386/x86-64-stack.d
b/gas/testsuite/gas/i386/x86-64-stack.d
index 0ab339d..76f7151 100644
--- a/gas/testsuite/gas/i386/x86-64-stack.d
+++ b/gas/testsuite/gas/i386/x86-64-stack.d
@@ -9,41 +9,51 @@ Disassembly of section .text:
 [ 	]*[a-f0-9]+:	50                   	push   %rax
 [ 	]*[a-f0-9]+:	66 50                	push   %ax
 [ 	]*[a-f0-9]+:	48 50                	rex.W push %rax
-[ 	]*[a-f0-9]+:	66 48 50             	data32 push %rax
+[ 	]*[a-f0-9]+:	66 48 50             	data32 rex.W push %rax
 [ 	]*[a-f0-9]+:	58                   	pop    %rax
 [ 	]*[a-f0-9]+:	66 58                	pop    %ax
 [ 	]*[a-f0-9]+:	48 58                	rex.W pop %rax
-[ 	]*[a-f0-9]+:	66 48 58             	data32 pop %rax
+[ 	]*[a-f0-9]+:	66 48 58             	data32 rex.W pop %rax
 [ 	]*[a-f0-9]+:	8f c0                	pop    %rax
 [ 	]*[a-f0-9]+:	66 8f c0             	pop    %ax
 [ 	]*[a-f0-9]+:	48 8f c0             	rex.W pop %rax
-[ 	]*[a-f0-9]+:	66 48 8f c0          	data32 pop %rax
+[ 	]*[a-f0-9]+:	66 48 8f c0          	data32 rex.W pop %rax
 [ 	]*[a-f0-9]+:	8f 00                	popq   \(%rax\)
 [ 	]*[a-f0-9]+:	66 8f 00             	popw   \(%rax\)
 [ 	]*[a-f0-9]+:	48 8f 00             	rex.W popq \(%rax\)
-[ 	]*[a-f0-9]+:	66 48 8f 00          	data32 popq \(%rax\)
+[ 	]*[a-f0-9]+:	66 48 8f 00          	data32 rex.W popq \(%rax\)
 [ 	]*[a-f0-9]+:	ff d0                	callq  \*%rax
 [ 	]*[a-f0-9]+:	66 ff d0             	callw  \*%ax
 [ 	]*[a-f0-9]+:	48 ff d0             	rex.W callq \*%rax
-[ 	]*[a-f0-9]+:	66 48 ff d0          	data32 callq \*%rax
+[ 	]*[a-f0-9]+:	66 48 ff d0          	data32 rex.W callq \*%rax
 [ 	]*[a-f0-9]+:	ff 10                	callq  \*\(%rax\)
 [ 	]*[a-f0-9]+:	66 ff 10             	callw  \*\(%rax\)
 [ 	]*[a-f0-9]+:	48 ff 10             	rex.W callq \*\(%rax\)
-[ 	]*[a-f0-9]+:	66 48 ff 10          	data32 callq \*\(%rax\)
+[ 	]*[a-f0-9]+:	66 48 ff 10          	data32 rex.W callq \*\(%rax\)
 [ 	]*[a-f0-9]+:	ff e0                	jmpq   \*%rax
 [ 	]*[a-f0-9]+:	66 ff e0             	jmpw   \*%ax
 [ 	]*[a-f0-9]+:	48 ff e0             	rex.W jmpq \*%rax
-[ 	]*[a-f0-9]+:	66 48 ff e0          	data32 jmpq \*%rax
+[ 	]*[a-f0-9]+:	66 48 ff e0          	data32 rex.W jmpq \*%rax
 [ 	]*[a-f0-9]+:	ff 20                	jmpq   \*\(%rax\)
 [ 	]*[a-f0-9]+:	66 ff 20             	jmpw   \*\(%rax\)
 [ 	]*[a-f0-9]+:	48 ff 20             	rex.W jmpq \*\(%rax\)
-[ 	]*[a-f0-9]+:	66 48 ff 20          	data32 jmpq \*\(%rax\)
+[ 	]*[a-f0-9]+:	66 48 ff 20          	data32 rex.W jmpq \*\(%rax\)
 [ 	]*[a-f0-9]+:	ff f0                	push   %rax
 [ 	]*[a-f0-9]+:	66 ff f0             	push   %ax
 [ 	]*[a-f0-9]+:	48 ff f0             	rex.W push %rax
-[ 	]*[a-f0-9]+:	66 48 ff f0          	data32 push %rax
+[ 	]*[a-f0-9]+:	66 48 ff f0          	data32 rex.W push %rax
 [ 	]*[a-f0-9]+:	ff 30                	pushq  \(%rax\)
 [ 	]*[a-f0-9]+:	66 ff 30             	pushw  \(%rax\)
 [ 	]*[a-f0-9]+:	48 ff 30             	rex.W pushq \(%rax\)
-[ 	]*[a-f0-9]+:	66 48 ff 30          	data32 pushq \(%rax\)
+[ 	]*[a-f0-9]+:	66 48 ff 30          	data32 rex.W pushq \(%rax\)
+[ 	]*[a-f0-9]+:	6a ff                	pushq  \$0xffffffffffffffff
+[ 	]*[a-f0-9]+:	66 6a ff             	pushw  \$0xffff
+[ 	]*[a-f0-9]+:	48 6a ff             	rex.W pushq \$0xffffffffffffffff
+[ 	]*[a-f0-9]+:	66 48 6a ff          	data32 rex.W pushq \$0xffffffffffffffff
+[ 	]*[a-f0-9]+:	68 01 02 03 04       	pushq  \$0x4030201
+[ 	]*[a-f0-9]+:	66 68 01 02          	pushw  \$0x201
+[ 	]*[a-f0-9]+:	03 04 48             	add    \(%rax,%rcx,2\),%eax
+[ 	]*[a-f0-9]+:	68 01 02 03 04       	pushq  \$0x4030201
+[ 	]*[a-f0-9]+:	66 48 68 01 02 03 04 	data32 rex.W pushq \$0x4030201
+[ 	]*[a-f0-9]+:	90                   	nop
 #pass
diff --git a/gas/testsuite/gas/i386/x86-64-stack.s
b/gas/testsuite/gas/i386/x86-64-stack.s
index d114887..2da658b 100644
--- a/gas/testsuite/gas/i386/x86-64-stack.s
+++ b/gas/testsuite/gas/i386/x86-64-stack.s
@@ -22,3 +22,13 @@ _start:

 	try	0xff, 0xf0
 	try	0xff, 0x30
+
+	# push with a 1-byte immediate
+	try	0x6a, 0xff
+
+	# push with a 4-byte immediate
+	try	0x68, 0x01, 0x02, 0x03, 0x04
+
+	# This is just to synchronize the disassembly.
+	# Any new cases must come before this line!
+	nop
diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c
index 685e968..43d7ac3 100644
--- a/opcodes/i386-dis.c
+++ b/opcodes/i386-dis.c
@@ -1,6 +1,6 @@
 /* Print i386 instructions for GDB, the GNU debugger.
    Copyright 1988, 1989, 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-   2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
+   2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
    Free Software Foundation, Inc.

    This file is part of the GNU opcodes library.
@@ -12275,7 +12275,7 @@ case_L:
 	case 'T':
 	  if (!intel_syntax
 	      && address_mode == mode_64bit
-	      && (sizeflag & DFLAG))
+	      && ((sizeflag & DFLAG) || (rex & REX_W)))
 	    {
 	      *obufp++ = 'q';
 	      break;
@@ -12313,7 +12313,8 @@ case_L:
 	case 'U':
 	  if (intel_syntax)
 	    break;
-	  if (address_mode == mode_64bit && (sizeflag & DFLAG))
+	  if (address_mode == mode_64bit
+              && ((sizeflag & DFLAG) || (rex & REX_W)))
 	    {
 	      if (modrm.mod != 3 || (sizeflag & SUFFIX_ALWAYS))
 		*obufp++ = 'q';
@@ -12385,7 +12386,8 @@ case_Q:
 	    {
 	      if (intel_syntax)
 		break;
-	      if (address_mode == mode_64bit && (sizeflag & DFLAG))
+	      if (address_mode == mode_64bit
+                  && ((sizeflag & DFLAG) || (rex & REX_W)))
 		{
 		  if (sizeflag & SUFFIX_ALWAYS)
 		    *obufp++ = 'q';
@@ -12721,7 +12723,7 @@ intel_operand_size (int bytemode, int sizeflag)
       oappend ("WORD PTR ");
       break;
     case stack_v_mode:
-      if (address_mode == mode_64bit && (sizeflag & DFLAG))
+      if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
 	{
 	  oappend ("QWORD PTR ");
 	  break;
@@ -12998,7 +13000,7 @@ OP_E_register (int bytemode, int sizeflag)
       names = address_mode == mode_64bit ? names64 : names32;
       break;
     case stack_v_mode:
-      if (address_mode == mode_64bit && (sizeflag & DFLAG))
+      if (address_mode == mode_64bit && ((sizeflag & DFLAG) || (rex & REX_W)))
 	{
 	  names = names64;
 	  break;
@@ -13495,7 +13497,8 @@ OP_REG (int code, int sizeflag)
       break;
     case rAX_reg: case rCX_reg: case rDX_reg: case rBX_reg:
     case rSP_reg: case rBP_reg: case rSI_reg: case rDI_reg:
-      if (address_mode == mode_64bit && (sizeflag & DFLAG))
+      if (address_mode == mode_64bit
+          && ((sizeflag & DFLAG) || (rex & REX_W)))
 	{
 	  s = names64[code - rAX_reg + add];
 	  break;
@@ -13710,9 +13713,10 @@ OP_sI (int bytemode, int sizeflag)
       if (bytemode == b_T_mode)
 	{
 	  if (address_mode != mode_64bit
-	      || !(sizeflag & DFLAG))
+	      || !((sizeflag & DFLAG) || (rex & REX_W)))
 	    {
-	      if (sizeflag & DFLAG)
+              /* The operand-size prefix is overridden by a REX prefix.  */
+              if ((sizeflag & DFLAG) || (rex & REX_W))
 		op &= 0xffffffff;
 	      else
 		op &= 0xffff;
@@ -13730,7 +13734,8 @@ OP_sI (int bytemode, int sizeflag)
 	}
       break;
     case v_mode:
-      if (sizeflag & DFLAG)
+      /* The operand-size prefix is overridden by a REX prefix.  */
+      if ((sizeflag & DFLAG) || (rex & REX_W))
 	op = get32s ();
       else
 	op = get16 ();


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