From: H.J. Lu Date: Mon, 22 Sep 2014 16:38:53 +0000 (-0700) Subject: Ignore MOD field for control/debug register move X-Git-Tag: binutils-2_25~269 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=68f34464821105e0c74a0ce16c5d26d4c3e1d20c;p=platform%2Fupstream%2Fbinutils.git Ignore MOD field for control/debug register move This patch ignores the MOD field in control/debug register move instructions. gas/testsuite/ * gas/i386/cdr.d: New file. * gas/i386/cdr.s: Likewise. * gas/i386/x86-64-cdr.d: Likewise. * gas/i386/i386.exp: Run cdr and x86-64-cdr. opcodes/ * i386-dis.c (MOD_0F20): Removed. (MOD_0F21): Likewise. (MOD_0F22): Likewise. (MOD_0F23): Likewise. (dis386_twobyte): Replace MOD_0F20, MOD_0F21, MOD_0F22 and MOD_0F23 with "movZ". (mod_table): Remove MOD_0F20, MOD_0F21, MOD_0F22 and MOD_0F23. (OP_R): Check mod/rm byte and call OP_E_register. --- diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 9bee24c..f8a85bc 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2014-09-22 H.J. Lu + + * gas/i386/cdr.d: New file. + * gas/i386/cdr.s: Likewise. + * gas/i386/x86-64-cdr.d: Likewise. + + * gas/i386/i386.exp: Run cdr and x86-64-cdr. + 2014-09-16 Ilya Tocar * gas/i386/avx512dq-rcig.s: New. diff --git a/gas/testsuite/gas/i386/cdr.d b/gas/testsuite/gas/i386/cdr.d new file mode 100644 index 0000000..b63b2a6 --- /dev/null +++ b/gas/testsuite/gas/i386/cdr.d @@ -0,0 +1,13 @@ +#objdump: -dw +#name: i386 control/debug register with ignored MOD field + +.*: +file format .* + +Disassembly of section .text: + +0+ : +[ ]*[a-f0-9]+: 0f 22 1f mov %edi,%cr3 +[ ]*[a-f0-9]+: 0f 20 1f mov %cr3,%edi +[ ]*[a-f0-9]+: 0f 21 1f mov %db3,%edi +[ ]*[a-f0-9]+: 0f 23 1f mov %edi,%db3 +#pass diff --git a/gas/testsuite/gas/i386/cdr.s b/gas/testsuite/gas/i386/cdr.s new file mode 100644 index 0000000..fb7c5a0 --- /dev/null +++ b/gas/testsuite/gas/i386/cdr.s @@ -0,0 +1,14 @@ + .text +start: + .byte 0x0f + .byte 0x22 + .byte 0x1f + .byte 0x0f + .byte 0x20 + .byte 0x1f + .byte 0x0f + .byte 0x21 + .byte 0x1f + .byte 0x0f + .byte 0x23 + .byte 0x1f diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp index 55fb8e6..7549a40 100644 --- a/gas/testsuite/gas/i386/i386.exp +++ b/gas/testsuite/gas/i386/i386.exp @@ -80,6 +80,7 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_32_check]] run_dump_test "padlock" run_dump_test "crx" run_list_test "cr-err" "" + run_dump_test "cdr" run_dump_test "svme" run_dump_test "amdfam10" run_dump_test "ssse3" @@ -449,6 +450,7 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_64_check]] t run_dump_test "x86-64-crx-suffix" run_dump_test "x86-64-drx" run_dump_test "x86-64-drx-suffix" + run_dump_test "x86-64-cdr" run_dump_test "x86-64-ssse3" run_dump_test "x86-64-rep" run_dump_test "x86-64-rep-suffix" diff --git a/gas/testsuite/gas/i386/x86-64-cdr.d b/gas/testsuite/gas/i386/x86-64-cdr.d new file mode 100644 index 0000000..5365d50 --- /dev/null +++ b/gas/testsuite/gas/i386/x86-64-cdr.d @@ -0,0 +1,14 @@ +#objdump: -dw +#name: x86-64 control/debug register with ignored MOD field +#source: cdr.s + +.*: +file format .* + +Disassembly of section .text: + +0+ : +[ ]*[a-f0-9]+: 0f 22 1f mov %rdi,%cr3 +[ ]*[a-f0-9]+: 0f 20 1f mov %cr3,%rdi +[ ]*[a-f0-9]+: 0f 21 1f mov %db3,%rdi +[ ]*[a-f0-9]+: 0f 23 1f mov %rdi,%db3 +#pass diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 42e09dd..e5bcb13 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,14 @@ +2014-09-22 H.J. Lu + + * i386-dis.c (MOD_0F20): Removed. + (MOD_0F21): Likewise. + (MOD_0F22): Likewise. + (MOD_0F23): Likewise. + (dis386_twobyte): Replace MOD_0F20, MOD_0F21, MOD_0F22 and + MOD_0F23 with "movZ". + (mod_table): Remove MOD_0F20, MOD_0F21, MOD_0F22 and MOD_0F23. + (OP_R): Check mod/rm byte and call OP_E_register. + 2014-09-16 Kuan-Lin Chen * nds32-asm.c (nds32_opcodes, operand_fields, keyword_im5_i, diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c index 79abe09..c7cfb55 100644 --- a/opcodes/i386-dis.c +++ b/opcodes/i386-dis.c @@ -753,10 +753,6 @@ enum MOD_0F1A_PREFIX_0, MOD_0F1B_PREFIX_0, MOD_0F1B_PREFIX_1, - MOD_0F20, - MOD_0F21, - MOD_0F22, - MOD_0F23, MOD_0F24, MOD_0F26, MOD_0F2B_PREFIX_0, @@ -2736,10 +2732,10 @@ static const struct dis386 dis386_twobyte[] = { { "nopQ", { Ev } }, { "nopQ", { Ev } }, /* 20 */ - { MOD_TABLE (MOD_0F20) }, - { MOD_TABLE (MOD_0F21) }, - { MOD_TABLE (MOD_0F22) }, - { MOD_TABLE (MOD_0F23) }, + { "movZ", { Rm, Cm } }, + { "movZ", { Rm, Dm } }, + { "movZ", { Cm, Rm } }, + { "movZ", { Dm, Rm } }, { MOD_TABLE (MOD_0F24) }, { Bad_Opcode }, { MOD_TABLE (MOD_0F26) }, @@ -11642,26 +11638,6 @@ static const struct dis386 mod_table[][2] = { { "nopQ", { Ev } }, }, { - /* MOD_0F20 */ - { Bad_Opcode }, - { "movZ", { Rm, Cm } }, - }, - { - /* MOD_0F21 */ - { Bad_Opcode }, - { "movZ", { Rm, Dm } }, - }, - { - /* MOD_0F22 */ - { Bad_Opcode }, - { "movZ", { Cm, Rm } }, - }, - { - /* MOD_0F23 */ - { Bad_Opcode }, - { "movZ", { Dm, Rm } }, - }, - { /* MOD_0F24 */ { Bad_Opcode }, { "movL", { Rd, Td } }, @@ -15892,10 +15868,10 @@ OP_T (int dummy ATTRIBUTE_UNUSED, int sizeflag ATTRIBUTE_UNUSED) static void OP_R (int bytemode, int sizeflag) { - if (modrm.mod == 3) - OP_E (bytemode, sizeflag); - else - BadOp (); + /* Skip mod/rm byte. */ + MODRM_CHECK; + codep++; + OP_E_register (bytemode, sizeflag); } static void