summaryrefslogtreecommitdiffstats
path: root/libcpu
diff options
context:
space:
mode:
authorUlrich Drepper <[email protected]>2008-01-11 07:18:44 +0000
committerUlrich Drepper <[email protected]>2008-01-11 07:18:44 +0000
commit9dc49f58df3307f26c59b6eaa218c7cf7a2eca36 (patch)
tree25169550df4e756dc0eb1a1c5a12f8dbbac30436 /libcpu
parent6bc105fc2c2eb312d08db00b50f419ffbcc189f7 (diff)
More immediate operand fixes for x86 disassembler.
Diffstat (limited to 'libcpu')
-rw-r--r--libcpu/i386_data.h16
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;