X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=opcodes%2Fft32-dis.c;h=5f42fff4f514b36619a60b07f9c535b30c2bb6aa;hb=a501eb446f5149c1133dbc99f86743b8dd614fa4;hp=5978123de853e526323c2b01025a044c59b30042;hpb=6f2750feaf2827ef8a1a0a5b2f90c1e9a6cabbd1;p=deliverable%2Fbinutils-gdb.git diff --git a/opcodes/ft32-dis.c b/opcodes/ft32-dis.c index 5978123de8..5f42fff4f5 100644 --- a/opcodes/ft32-dis.c +++ b/opcodes/ft32-dis.c @@ -1,5 +1,5 @@ /* Disassemble ft32 instructions. - Copyright (C) 2013-2016 Free Software Foundation, Inc. + Copyright (C) 2013-2020 Free Software Foundation, Inc. Contributed by FTDI (support@ftdichip.com) This file is part of the GNU opcodes library. @@ -25,39 +25,45 @@ #define DEFINE_TABLE #include "opcode/ft32.h" -#include "dis-asm.h" +#include "disassemble.h" extern const ft32_opc_info_t ft32_opc_info[128]; static fprintf_ftype fpr; static void *stream; -int -print_insn_ft32 (bfd_vma addr, struct disassemble_info *info) +static int +sign_extend(int bit, int value) { - int status; - stream = info->stream; - bfd_byte buffer[4]; - unsigned int iword; - const ft32_opc_info_t *oo; - - fpr = info->fprintf_func; - - if ((status = info->read_memory_func (addr, buffer, 4, info))) - goto fail; + int onebit = (1 << bit); + return (value & (onebit - 1)) - (value & onebit); +} - iword = bfd_getl32 (buffer); +static void +ft32_opcode(bfd_vma addr ATTRIBUTE_UNUSED, + unsigned int iword, + struct disassemble_info *info) +{ + const ft32_opc_info_t *oo; for (oo = ft32_opc_info; oo->name; oo++) if ((iword & oo->mask) == oo->bits) break; + unsigned int sc[2]; + if (ft32_decode_shortcode((unsigned int)addr, iword, sc)) + { + ft32_opcode(addr, sc[0], info); + fpr (stream, " ; "); + ft32_opcode(addr, sc[1], info); + } + if (oo->name) { int f = oo->fields; int imm; - fpr (stream, "%08x %s", iword, oo->name); + fpr (stream, "%s", oo->name); if (oo->dw) { fpr (stream, ".%c ", "bsl"[(iword >> FT32_FLD_DW_BIT) & 3]); @@ -118,7 +124,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 +133,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 +141,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); - break; - case FT32_FLD_K8: - imm = iword & ((1 << FT32_FLD_K8_SIZ) - 1); - info->print_address_func ((bfd_vma) imm, info); + fpr(stream, "%d", imm); break; + case FT32_FLD_K15: + imm = iword & ((1 << FT32_FLD_K15_SIZ) - 1); + fpr(stream, "%d", sign_extend(14, imm)); break; case FT32_FLD_R_D_POST: fpr(stream, "$r%d", (iword >> FT32_FLD_R_D_BIT) & 0x1f); @@ -166,8 +170,28 @@ print_insn_ft32 (bfd_vma addr, struct disassemble_info *info) } else { - fpr (stream, "%08x!", iword); + fpr (stream, "!"); } +} + +int +print_insn_ft32 (bfd_vma addr, struct disassemble_info *info) +{ + int status; + stream = info->stream; + bfd_byte buffer[4]; + unsigned int iword; + + fpr = info->fprintf_func; + + if ((status = info->read_memory_func (addr, buffer, 4, info))) + goto fail; + + iword = bfd_getl32 (buffer); + + fpr (stream, "%08x ", iword); + + ft32_opcode(addr, iword, info); return 4;