diff options
-rw-r--r-- | gas/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/x86-64-xsave-intel.d | 42 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/x86-64-xsave.d | 42 | ||||
-rw-r--r-- | gas/testsuite/gas/i386/x86-64-xsave.s | 43 | ||||
-rw-r--r-- | opcodes/ChangeLog | 7 | ||||
-rw-r--r-- | opcodes/i386-dis.c | 6 | ||||
-rw-r--r-- | opcodes/i386-opc.tbl | 2 | ||||
-rw-r--r-- | opcodes/i386-tbl.h | 20 |
8 files changed, 154 insertions, 15 deletions
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 28b4713..925191e 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2010-02-21 H.J. Lu <hongjiu.lu@intel.com> + + * gas/i386/x86-64-xsave.s: Add tests for xsave64 and xrstor64. + + * gas/i386/x86-64-xsave-intel.d: Updated. + * gas/i386/x86-64-xsave.d: Likewise. + 2010-01-20 Nick Clifton <nickc@redhat.com> PR 11109 diff --git a/gas/testsuite/gas/i386/x86-64-xsave-intel.d b/gas/testsuite/gas/i386/x86-64-xsave-intel.d index 4659a2e..ae506d6 100644 --- a/gas/testsuite/gas/i386/x86-64-xsave-intel.d +++ b/gas/testsuite/gas/i386/x86-64-xsave-intel.d @@ -8,10 +8,44 @@ Disassembly of section .text: 0+ <_start>: -[ ]*[a-f0-9]+: 41 0f ae 29 xrstor \[r9\] -[ ]*[a-f0-9]+: 41 0f ae 21 xsave \[r9\] [ ]*[a-f0-9]+: 0f 01 d0 xgetbv [ ]*[a-f0-9]+: 0f 01 d1 xsetbv -[ ]*[a-f0-9]+: 0f ae 29 xrstor \[rcx\] -[ ]*[a-f0-9]+: 0f ae 21 xsave \[rcx\] +[ ]*[a-f0-9]+: 0f ae 20 xsave \[rax\] +[ ]*[a-f0-9]+: 41 0f ae 20 xsave \[r8\] +[ ]*[a-f0-9]+: 41 0f ae 24 00 xsave \[r8\+rax\*1\] +[ ]*[a-f0-9]+: 42 0f ae 24 00 xsave \[rax\+r8\*1\] +[ ]*[a-f0-9]+: 43 0f ae 24 38 xsave \[r8\+r15\*1\] +[ ]*[a-f0-9]+: 48 0f ae 20 xsave64 \[rax\] +[ ]*[a-f0-9]+: 49 0f ae 20 xsave64 \[r8\] +[ ]*[a-f0-9]+: 49 0f ae 24 00 xsave64 \[r8\+rax\*1\] +[ ]*[a-f0-9]+: 4a 0f ae 24 00 xsave64 \[rax\+r8\*1\] +[ ]*[a-f0-9]+: 0f ae 28 xrstor \[rax\] +[ ]*[a-f0-9]+: 41 0f ae 28 xrstor \[r8\] +[ ]*[a-f0-9]+: 41 0f ae 2c 00 xrstor \[r8\+rax\*1\] +[ ]*[a-f0-9]+: 42 0f ae 2c 00 xrstor \[rax\+r8\*1\] +[ ]*[a-f0-9]+: 43 0f ae 2c 38 xrstor \[r8\+r15\*1\] +[ ]*[a-f0-9]+: 48 0f ae 28 xrstor64 \[rax\] +[ ]*[a-f0-9]+: 49 0f ae 28 xrstor64 \[r8\] +[ ]*[a-f0-9]+: 49 0f ae 2c 00 xrstor64 \[r8\+rax\*1\] +[ ]*[a-f0-9]+: 4a 0f ae 2c 00 xrstor64 \[rax\+r8\*1\] +[ ]*[a-f0-9]+: 4b 0f ae 2c 38 xrstor64 \[r8\+r15\*1\] +[ ]*[a-f0-9]+: 0f ae 20 xsave \[rax\] +[ ]*[a-f0-9]+: 41 0f ae 20 xsave \[r8\] +[ ]*[a-f0-9]+: 41 0f ae 24 00 xsave \[r8\+rax\*1\] +[ ]*[a-f0-9]+: 42 0f ae 24 00 xsave \[rax\+r8\*1\] +[ ]*[a-f0-9]+: 43 0f ae 24 38 xsave \[r8\+r15\*1\] +[ ]*[a-f0-9]+: 48 0f ae 20 xsave64 \[rax\] +[ ]*[a-f0-9]+: 49 0f ae 20 xsave64 \[r8\] +[ ]*[a-f0-9]+: 49 0f ae 24 00 xsave64 \[r8\+rax\*1\] +[ ]*[a-f0-9]+: 4a 0f ae 24 00 xsave64 \[rax\+r8\*1\] +[ ]*[a-f0-9]+: 0f ae 28 xrstor \[rax\] +[ ]*[a-f0-9]+: 41 0f ae 28 xrstor \[r8\] +[ ]*[a-f0-9]+: 41 0f ae 2c 00 xrstor \[r8\+rax\*1\] +[ ]*[a-f0-9]+: 42 0f ae 2c 00 xrstor \[rax\+r8\*1\] +[ ]*[a-f0-9]+: 43 0f ae 2c 38 xrstor \[r8\+r15\*1\] +[ ]*[a-f0-9]+: 48 0f ae 28 xrstor64 \[rax\] +[ ]*[a-f0-9]+: 49 0f ae 28 xrstor64 \[r8\] +[ ]*[a-f0-9]+: 49 0f ae 2c 00 xrstor64 \[r8\+rax\*1\] +[ ]*[a-f0-9]+: 4a 0f ae 2c 00 xrstor64 \[rax\+r8\*1\] +[ ]*[a-f0-9]+: 4b 0f ae 2c 38 xrstor64 \[r8\+r15\*1\] #pass diff --git a/gas/testsuite/gas/i386/x86-64-xsave.d b/gas/testsuite/gas/i386/x86-64-xsave.d index cf07cda..05114fb 100644 --- a/gas/testsuite/gas/i386/x86-64-xsave.d +++ b/gas/testsuite/gas/i386/x86-64-xsave.d @@ -6,10 +6,44 @@ Disassembly of section .text: 0+ <_start>: -[ ]*[a-f0-9]+: 41 0f ae 29 xrstor \(%r9\) -[ ]*[a-f0-9]+: 41 0f ae 21 xsave \(%r9\) [ ]*[a-f0-9]+: 0f 01 d0 xgetbv [ ]*[a-f0-9]+: 0f 01 d1 xsetbv -[ ]*[a-f0-9]+: 0f ae 29 xrstor \(%rcx\) -[ ]*[a-f0-9]+: 0f ae 21 xsave \(%rcx\) +[ ]*[a-f0-9]+: 0f ae 20 xsave \(%rax\) +[ ]*[a-f0-9]+: 41 0f ae 20 xsave \(%r8\) +[ ]*[a-f0-9]+: 41 0f ae 24 00 xsave \(%r8,%rax,1\) +[ ]*[a-f0-9]+: 42 0f ae 24 00 xsave \(%rax,%r8,1\) +[ ]*[a-f0-9]+: 43 0f ae 24 38 xsave \(%r8,%r15,1\) +[ ]*[a-f0-9]+: 48 0f ae 20 xsave64 \(%rax\) +[ ]*[a-f0-9]+: 49 0f ae 20 xsave64 \(%r8\) +[ ]*[a-f0-9]+: 49 0f ae 24 00 xsave64 \(%r8,%rax,1\) +[ ]*[a-f0-9]+: 4a 0f ae 24 00 xsave64 \(%rax,%r8,1\) +[ ]*[a-f0-9]+: 0f ae 28 xrstor \(%rax\) +[ ]*[a-f0-9]+: 41 0f ae 28 xrstor \(%r8\) +[ ]*[a-f0-9]+: 41 0f ae 2c 00 xrstor \(%r8,%rax,1\) +[ ]*[a-f0-9]+: 42 0f ae 2c 00 xrstor \(%rax,%r8,1\) +[ ]*[a-f0-9]+: 43 0f ae 2c 38 xrstor \(%r8,%r15,1\) +[ ]*[a-f0-9]+: 48 0f ae 28 xrstor64 \(%rax\) +[ ]*[a-f0-9]+: 49 0f ae 28 xrstor64 \(%r8\) +[ ]*[a-f0-9]+: 49 0f ae 2c 00 xrstor64 \(%r8,%rax,1\) +[ ]*[a-f0-9]+: 4a 0f ae 2c 00 xrstor64 \(%rax,%r8,1\) +[ ]*[a-f0-9]+: 4b 0f ae 2c 38 xrstor64 \(%r8,%r15,1\) +[ ]*[a-f0-9]+: 0f ae 20 xsave \(%rax\) +[ ]*[a-f0-9]+: 41 0f ae 20 xsave \(%r8\) +[ ]*[a-f0-9]+: 41 0f ae 24 00 xsave \(%r8,%rax,1\) +[ ]*[a-f0-9]+: 42 0f ae 24 00 xsave \(%rax,%r8,1\) +[ ]*[a-f0-9]+: 43 0f ae 24 38 xsave \(%r8,%r15,1\) +[ ]*[a-f0-9]+: 48 0f ae 20 xsave64 \(%rax\) +[ ]*[a-f0-9]+: 49 0f ae 20 xsave64 \(%r8\) +[ ]*[a-f0-9]+: 49 0f ae 24 00 xsave64 \(%r8,%rax,1\) +[ ]*[a-f0-9]+: 4a 0f ae 24 00 xsave64 \(%rax,%r8,1\) +[ ]*[a-f0-9]+: 0f ae 28 xrstor \(%rax\) +[ ]*[a-f0-9]+: 41 0f ae 28 xrstor \(%r8\) +[ ]*[a-f0-9]+: 41 0f ae 2c 00 xrstor \(%r8,%rax,1\) +[ ]*[a-f0-9]+: 42 0f ae 2c 00 xrstor \(%rax,%r8,1\) +[ ]*[a-f0-9]+: 43 0f ae 2c 38 xrstor \(%r8,%r15,1\) +[ ]*[a-f0-9]+: 48 0f ae 28 xrstor64 \(%rax\) +[ ]*[a-f0-9]+: 49 0f ae 28 xrstor64 \(%r8\) +[ ]*[a-f0-9]+: 49 0f ae 2c 00 xrstor64 \(%r8,%rax,1\) +[ ]*[a-f0-9]+: 4a 0f ae 2c 00 xrstor64 \(%rax,%r8,1\) +[ ]*[a-f0-9]+: 4b 0f ae 2c 38 xrstor64 \(%r8,%r15,1\) #pass diff --git a/gas/testsuite/gas/i386/x86-64-xsave.s b/gas/testsuite/gas/i386/x86-64-xsave.s index 076706f..b32dc6e 100644 --- a/gas/testsuite/gas/i386/x86-64-xsave.s +++ b/gas/testsuite/gas/i386/x86-64-xsave.s @@ -1,11 +1,46 @@ # Check 64bit xsave/xrstor .text _start: - xrstor (%r9) - xsave (%r9) xgetbv xsetbv + xsave (%rax) + xsave (%r8) + xsave (%r8, %rax) + xsave (%rax, %r8) + xsave (%r8, %r15) + xsave64 (%rax) + xsave64 (%r8) + xsave64 (%r8, %rax) + xsave64 (%rax, %r8) + xrstor (%rax) + xrstor (%r8) + xrstor (%r8, %rax) + xrstor (%rax, %r8) + xrstor (%r8, %r15) + xrstor64 (%rax) + xrstor64 (%r8) + xrstor64 (%r8, %rax) + xrstor64 (%rax, %r8) + xrstor64 (%r8, %r15) + .intel_syntax noprefix - xrstor [rcx] - xsave [rcx] + xsave [rax] + xsave [r8] + xsave [r8+rax*1] + xsave [rax+r8*1] + xsave [r8+r15*1] + xsave64 [rax] + xsave64 [r8] + xsave64 [r8+rax*1] + xsave64 [rax+r8*1] + xrstor [rax] + xrstor [r8] + xrstor [r8+rax*1] + xrstor [rax+r8*1] + xrstor [r8+r15*1] + xrstor64 [rax] + xrstor64 [r8] + xrstor64 [r8+rax*1] + xrstor64 [rax+r8*1] + xrstor64 [r8+r15*1] diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index a403d40..b126987 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,10 @@ +2010-02-21 H.J. Lu <hongjiu.lu@intel.com> + + * i386-dis.c (mod_table): Use FXSAVE on xsave and xrstor. + + * i386-opc.tbl: Add xsave64 and xrstor64. + * i386-tbl.h: Regenerated. + 2010-01-20 Nick Clifton <nickc@redhat.com> PR 11170 diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c index 72e39a1..20decd1 100644 --- a/opcodes/i386-dis.c +++ b/opcodes/i386-dis.c @@ -11127,17 +11127,17 @@ static const struct dis386 mod_table[][2] = { }, { /* MOD_0FAE_REG_4 */ - { "xsave", { M } }, + { "xsave", { FXSAVE } }, { "(bad)", { XX } }, }, { /* MOD_0FAE_REG_5 */ - { "xrstor", { M } }, + { "xrstor", { FXSAVE } }, { RM_TABLE (RM_0FAE_REG_5) }, }, { /* MOD_0FAE_REG_6 */ - { "xsaveopt", { M } }, + { "(bad)", { XX } }, { RM_TABLE (RM_0FAE_REG_6) }, }, { diff --git a/opcodes/i386-opc.tbl b/opcodes/i386-opc.tbl index 05e4e10..8119556 100644 --- a/opcodes/i386-opc.tbl +++ b/opcodes/i386-opc.tbl @@ -1748,7 +1748,9 @@ crc32, 2, 0xf20f38f0, None, 3, CpuSSE4_2|Cpu64, Modrm|No_wSuf|No_lSuf|No_sSuf|No // xsave/xrstor New Instructions. xsave, 1, 0xfae, 0x4, 2, CpuXsave, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_ldSuf, { Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S } +xsave64, 1, 0xfae, 0x4, 2, CpuXsave|Cpu64, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_ldSuf|Rex64, { Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S } xrstor, 1, 0xfae, 0x5, 2, CpuXsave, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_ldSuf, { Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S } +xrstor64, 1, 0xfae, 0x5, 2, CpuXsave|Cpu64, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_ldSuf|Rex64, { Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S } xgetbv, 0, 0xf01, 0xd0, 2, CpuXsave, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|ImmExt, { 0 } xsetbv, 0, 0xf01, 0xd1, 2, CpuXsave, No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf|ImmExt, { 0 } diff --git a/opcodes/i386-tbl.h b/opcodes/i386-tbl.h index 79d71a7..461ffe3 100644 --- a/opcodes/i386-tbl.h +++ b/opcodes/i386-tbl.h @@ -17798,6 +17798,16 @@ 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, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 } } } }, + { "xsave64", 1, 0xfae, 0x4, 2, + { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0 } }, + { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0 } } } }, { "xrstor", 1, 0xfae, 0x5, 2, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -17808,6 +17818,16 @@ 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, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 } } } }, + { "xrstor64", 1, 0xfae, 0x5, 2, + { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0 } }, + { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0 } } } }, { "xgetbv", 0, 0xf01, 0xd0, 2, { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, |