diff options
author | Ulrich Drepper <[email protected]> | 2008-01-11 07:18:44 +0000 |
---|---|---|
committer | Ulrich Drepper <[email protected]> | 2008-01-11 07:18:44 +0000 |
commit | 9dc49f58df3307f26c59b6eaa218c7cf7a2eca36 (patch) | |
tree | 25169550df4e756dc0eb1a1c5a12f8dbbac30436 /libcpu | |
parent | 6bc105fc2c2eb312d08db00b50f419ffbcc189f7 (diff) |
More immediate operand fixes for x86 disassembler.
Diffstat (limited to 'libcpu')
-rw-r--r-- | libcpu/i386_data.h | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/libcpu/i386_data.h b/libcpu/i386_data.h index c1f2d5e7..5f66c610 100644 --- a/libcpu/i386_data.h +++ b/libcpu/i386_data.h @@ -507,7 +507,11 @@ FCT_ax (struct output_data *d) bufp[(*bufcntp)++] = '%'; if (! is_16bit) - bufp[(*bufcntp)++] = 'e'; + bufp[(*bufcntp)++] = ( +#ifdef X86_64 + (*d->prefixes & has_rex_w) ? 'r' : +#endif + 'e'); bufp[(*bufcntp)++] = 'a'; bufp[(*bufcntp)++] = 'x'; @@ -694,8 +698,14 @@ FCT_imm (struct output_data *d) { if (*d->param_start + 4 > d->end) return -1; - uint32_t word = read_4ubyte_unaligned_inc (*d->param_start); - needed = snprintf (&d->bufp[*bufcntp], avail, "$0x%" PRIx32, word); + int32_t word = read_4sbyte_unaligned_inc (*d->param_start); +#ifdef X86_64 + if (*d->prefixes & has_rex_w) + needed = snprintf (&d->bufp[*bufcntp], avail, "$0x%" PRIx64, + (int64_t) word); + else +#endif + needed = snprintf (&d->bufp[*bufcntp], avail, "$0x%" PRIx32, word); } if ((size_t) needed > avail) return (size_t) needed - avail; |