aboutsummaryrefslogtreecommitdiff
path: root/opcodes/ft32-dis.c
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2017-09-22 17:00:33 -0300
committerAlexandre Oliva <aoliva@redhat.com>2017-09-22 17:00:33 -0300
commit9e0703de64a6dd4deae2ebd569955f14337f2710 (patch)
treecec45139f1febef6441deabae142c3fb3f2c61f3 /opcodes/ft32-dis.c
parent13b9f79a1904081d984a64037af6457c1e3ff7b6 (diff)
parent43573013c9836f2b91b74b9b29dac35fdb41e06b (diff)
downloadgdb-9e0703de64a6dd4deae2ebd569955f14337f2710.zip
gdb-9e0703de64a6dd4deae2ebd569955f14337f2710.tar.gz
gdb-9e0703de64a6dd4deae2ebd569955f14337f2710.tar.bz2
Merge remote-tracking branch 'remotes/master' into users/aoliva/SFN
Updated local changes to binutils/testsuite/binutils-all/readelf.exp to match the unresolved (failed to assemble) messages introduced by Alan Modra.
Diffstat (limited to 'opcodes/ft32-dis.c')
-rw-r--r--opcodes/ft32-dis.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/opcodes/ft32-dis.c b/opcodes/ft32-dis.c
index 0384073..93339a1 100644
--- a/opcodes/ft32-dis.c
+++ b/opcodes/ft32-dis.c
@@ -32,6 +32,13 @@ extern const ft32_opc_info_t ft32_opc_info[128];
static fprintf_ftype fpr;
static void *stream;
+static int
+sign_extend(int bit, int value)
+{
+ int onebit = (1 << bit);
+ return (value & (onebit - 1)) - (value & onebit);
+}
+
int
print_insn_ft32 (bfd_vma addr, struct disassemble_info *info)
{
@@ -118,7 +125,7 @@ print_insn_ft32 (bfd_vma addr, struct disassemble_info *info)
case FT32_FLD_RIMM:
imm = (iword >> FT32_FLD_RIMM_BIT) & ((1 << FT32_FLD_RIMM_SIZ) - 1);
if (imm & 0x400)
- info->print_address_func ((bfd_vma) imm & 0x3ff, info);
+ fpr(stream, "%d", sign_extend(9, imm));
else
fpr(stream, "$r%d", imm & 0x1f);
break;
@@ -127,7 +134,7 @@ print_insn_ft32 (bfd_vma addr, struct disassemble_info *info)
break;
case FT32_FLD_K20:
imm = iword & ((1 << FT32_FLD_K20_SIZ) - 1);
- info->print_address_func ((bfd_vma) imm, info);
+ fpr(stream, "%d", sign_extend(19, imm));
break;
case FT32_FLD_PA:
imm = (iword & ((1 << FT32_FLD_PA_SIZ) - 1)) << 2;
@@ -135,17 +142,15 @@ print_insn_ft32 (bfd_vma addr, struct disassemble_info *info)
break;
case FT32_FLD_AA:
imm = iword & ((1 << FT32_FLD_AA_SIZ) - 1);
- info->print_address_func ((bfd_vma) imm, info);
- break;
+ info->print_address_func ((1 << 23) | (bfd_vma) imm, info);
break;
case FT32_FLD_K16:
imm = iword & ((1 << FT32_FLD_K16_SIZ) - 1);
- info->print_address_func ((bfd_vma) imm, info);
+ fpr(stream, "%d", imm);
break;
case FT32_FLD_K8:
imm = iword & ((1 << FT32_FLD_K8_SIZ) - 1);
- info->print_address_func ((bfd_vma) imm, info);
- break;
+ fpr(stream, "%d", sign_extend(7, imm));
break;
case FT32_FLD_R_D_POST:
fpr(stream, "$r%d", (iword >> FT32_FLD_R_D_BIT) & 0x1f);