diff options
Diffstat (limited to 'opcodes')
-rw-r--r-- | opcodes/ChangeLog | 5 | ||||
-rw-r--r-- | opcodes/i386-dis.c | 16 |
2 files changed, 16 insertions, 5 deletions
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 47790f3..545c37b 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,8 @@ +2004-03-12 Alan Modra <amodra@bigpond.net.au> + + * i386-dis.c (grps): Use clflush by default for 0x0fae/7. + (OP_E): Twiddle clflush to sfence here. + 2004-03-08 Nick Clifton <nickc@redhat.com> * po/de.po: Updated German translation. diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c index f9a0a9b..067c750 100644 --- a/opcodes/i386-dis.c +++ b/opcodes/i386-dis.c @@ -1426,8 +1426,7 @@ static const struct dis386 grps[][8] = { { "(bad)", XX, XX, XX }, { "lfence", None, XX, XX }, { "mfence", None, XX, XX }, - { "sfence", None, XX, XX }, - /* FIXME: the sfence with memory operand is clflush! */ + { "clflush", None, XX, XX }, }, /* GRP14 */ { @@ -3034,9 +3033,16 @@ OP_E (int bytemode, int sizeflag) used_prefixes |= (prefixes & PREFIX_DATA); break; case 0: - if (!(codep[-2] == 0xAE && codep[-1] == 0xF8 /* sfence */) - && !(codep[-2] == 0xAE && codep[-1] == 0xF0 /* mfence */) - && !(codep[-2] == 0xAE && codep[-1] == 0xe8 /* lfence */)) + if (codep[-2] == 0xAE && codep[-1] == 0xF8) + /* sfence */ + strcpy (obuf + strlen (obuf) - sizeof ("clflush") + 1, "sfence"); + else if (codep[-2] == 0xAE && codep[-1] == 0xF0) + /* mfence */ + ; + else if (codep[-2] == 0xAE && codep[-1] == 0xe8) + /* lfence */ + ; + else BadOp (); /* bad sfence,lea,lds,les,lfs,lgs,lss modrm */ break; default: |