summaryrefslogtreecommitdiff
path: root/opcodes
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2005-01-25 20:22:41 +0000
committerAlexandre Oliva <aoliva@redhat.com>2005-01-25 20:22:41 +0000
commit4cb7e1e6c95f468af31e606d8c9282aa2498734c (patch)
tree09469e2bcf4fb79481e43d5b073b5967d01b5f40 /opcodes
parentf0ecd4743f522e0ebcc6cbca0b727cb908a1c730 (diff)
downloadgdb-4cb7e1e6c95f468af31e606d8c9282aa2498734c.tar.gz
bfd/ChangeLog:
2004-12-10 Alexandre Oliva <aoliva@redhat.com> * elf32-frv.c (elf32_frv_relocate_section): Force local binding for TLSMOFF. * reloc.c: Add R_FRV_TLSMOFF. * elf32-frv.c (elf32_frv_howto_table): Likewise. (frv_reloc_map, frv_reloc_type_lookup): Map it. (elf32_frv_relocate_section): Handle it. (elf32_frv_check_relocs): Likewise. * libbfd.h, bfd-in2.h: Rebuilt. 2004-11-26 Alexandre Oliva <aoliva@redhat.com> * elf32-frv.c (_frvfdpic_emit_got_relocs_plt_entries): Don't crash when given an undefweak TLS symbol. Fix constant TLS PLT entries such that they return the constant in gr9. (_frvfdpic_relax_tls_entries): Don't crash for undefweak TLS symbols. (_frvfdpic_size_got_plt): Set _cooked_size of dynamic sections. too, such that they shrink on relaxation. (elf32_frvfdpic_finish_dynamic_sections): Check __ROFIXUP_END__ as marking the position right past the _GLOBAL_OFFSET_TABLE_ value. (_frvfdpic_assign_plt_entries): Shrink constant TLS PLT entries if we can guarantee the use of 16-bit constants. 2004-11-10 Alexandre Oliva <aoliva@redhat.com> Introduce TLS support for FR-V FDPIC. * reloc.c: Add TLS relocations. * elf32-frv.c (elf32_frv_howto_table): Add TLS relocations. (elf32_frv_rel_tlsdesc_value_howto): New. (elf32_frv_rel_tlsoff_howto): New. (frv_reloc_map): Add new mappings. (struct frvfdpic_elf_link_hash_table): Add pointer to summary reloc information. (frvfdpic_dynamic_got_plt_info): New. (frvfdpic_plt_tls_ret_offset): New. (ELF_DYNAMIC_INTERPRETER, DEFAULT_STACK_SIZE): Move earlier. (struct _frvfdpic_dynamic_got_info): Likewise. Add TLS members. (struct _frvfdpic_dynamic_got_plt_info): Likewise. (FRVFDPIC_SYM_LOCAL): Regard symbols defined in the absolute section as local. (struct frvfdpic_relocs_info): Add TLS fields. (frvfdpic_relocs_info_hash): Warning clean up. (frvfdpic_relocs_info_find): Initialize tlsplt_entry. (frvfdpic_pic_merge_early_relocs_info): Merge TLS fields. (FRVFDPIC_TLS_BIAS): Define. (tls_biased_base): New. (_frvfdpic_emit_got_relocs_plt_entries): Deal with TLS relocations. (frv_reloc_type_lookup): Likewise. (frvfdpic_info_to_howto_rel): Likewise. (elf32_frv_relocate_section): Likewise. (_frv_create_got_section): Create the PLT section here. (elf32_frvfdpic_create_dynamic_sections): Not here. (_frvfdpic_count_nontls_entries): Move out of... (_frvfdpic_count_got_plt_entries): ... here. (_frvfdpic_count_tls_entries): Likewise. Add TLS support. (_frvfdpic_count_relocs_fixups): Likewise. Add relaxation support. (_frvfdpic_relax_tls_entries): New. (_frvfdpic_compute_got_alloc_data): Add TLS support. (_frvfdpic_get_tlsdesc_entry): New. (_frvfdpic_assign_got_entries): Add TLS support. (_frvfdpic_assign_plt_entries): Likewise. (_frvfdpic_reset_got_plt_entries): New. (_frvfdpic_size_got_plt): Move out of... (elf32_frvfdpic_size_dynamic_sections): ... here. (_frvfdpic_relax_got_plt_entries): New. (elf32_frvfdpic_relax_section): New. (elf32_frvfdpic_finish_dynamic_sections): Add TLS sanity check. (elf32_frv_check_relocs): Add TLS support. (bfd_elf32_bfd_relax_section): Define for FDPIC. * libbfd.h, bfd-in2.h: Rebuilt. cpu/ChangeLog: 2004-11-10 Alexandre Oliva <aoliva@redhat.com> * frv.cpu: Add support for TLS annotations in loads and calll. * frv.opc (parse_symbolic_address): New. (parse_ldd_annotation): New. (parse_call_annotation): New. (parse_ld_annotation): New. (parse_ulo16, parse_uslo16): Use parse_symbolic_address. Introduce TLS relocations. (parse_d12, parse_s12, parse_u12): Likewise. (parse_uhi16): Likewise. Fix constant checking on 64-bit host. (parse_call_label, print_at): New. gas/ChangeLog: * config/tc-frv.c (md_apply_fix3): Mark TLS symbols as such. 2004-12-10 Alexandre Oliva <aoliva@redhat.com> * config/tc-frv.c (frv_pic_ptr): Add tlsmoff support. 2004-11-10 Alexandre Oliva <aoliva@redhat.com> * cgen.c (gas_cgen_parse_operand): Handle CGEN_PARSE_OPERAND_SYMBOLIC. * config/tc-frv.c (md_cgen_lookup_reloc): Handle TLS relocations. (frv_force_relocation): Likewise. Fix handling of PIC relocations. (md_apply_fix3): Likewise. include/elf/ChangeLog: 2004-12-10 Alexandre Oliva <aoliva@redhat.com> * frv.h: Add R_FRV_TLSMOFF. 2004-11-10 Alexandre Oliva <aoliva@redhat.com> * frv.h: Add TLS relocations. include/opcode/ChangeLog: 2004-11-10 Alexandre Oliva <aoliva@redhat.com> * cgen.h (enum cgen_parse_operand_type): Add CGEN_PARSE_OPERAND_SYMBOLIC. ld/testsuite/ChangeLog: * ld-frv/fdpic.exp: Add -mfdpic to ASFLAGS. * ld-frv/tls.exp: Likewise. 2004-11-26 Alexandre Oliva <aoliva@redhat.com> * ld-frv/tls-3.s: New. * ld-frv/tls-static-3.d: New. * ld-frv/tls-dynamic-3.d: New. * ld-frv/tls-pie-3.d: New. * ld-frv/tls-shared-3.d: New. * ld-frv/tls-relax-static-3.d: New. * ld-frv/tls-relax-dynamic-3.d: New. * ld-frv/tls-relax-pie-3.d: New. * ld-frv/tls-relax-shared-3.d: New. * ld-frv/tls.exp: Run the new tests. * ld-frv/tls-dynamic-2.d: Adjust for improved relaxation. * ld-frv/tls-relax-dynamic-2.d: Likewise. * ld-frv/tls-relax-initial-shared-2.d: Likewise. 2004-11-10 Alexandre Oliva <aoliva@redhat.com> * ld-frv/tls-1-dep.s: New. * ld-frv/tls-1-shared.lds: New. * ld-frv/tls-1.s: New. * ld-frv/tls-2.s: New. * ld-frv/tls-dynamic-1.d: New. * ld-frv/tls-dynamic-2.d: New. * ld-frv/tls-initial-shared-2.d: New. * ld-frv/tls-pie-1.d: New. * ld-frv/tls-relax-dynamic-1.d: New. * ld-frv/tls-relax-dynamic-2.d: New. * ld-frv/tls-relax-initial-shared-2.d: New. * ld-frv/tls-relax-pie-1.d: New. * ld-frv/tls-relax-shared-1.d: New. * ld-frv/tls-relax-shared-2.d: New. * ld-frv/tls-relax-static-1.d: New. * ld-frv/tls-shared-1-fail.d: New. * ld-frv/tls-shared-1.d: New. * ld-frv/tls-shared-2.d: New. * ld-frv/tls-static-1.d: New. * ld-frv/tls.exp: New. * ld-frv/fdpic-pie-1.d: Adjust for 64-bit host. * ld-frv/fdpic-pie-2.d: Likewise. * ld-frv/fdpic-pie-6.d: Likewise. * ld-frv/fdpic-pie-7.d: Likewise. * ld-frv/fdpic-pie-8.d: Likewise. * ld-frv/fdpic-shared-1.d: Likewise. * ld-frv/fdpic-shared-2.d: Likewise. * ld-frv/fdpic-shared-3.d: Likewise. * ld-frv/fdpic-shared-4.d: Likewise. * ld-frv/fdpic-shared-5.d: Likewise. * ld-frv/fdpic-shared-6.d: Likewise. * ld-frv/fdpic-shared-7.d: Likewise. * ld-frv/fdpic-shared-8.d: Likewise. * ld-frv/fdpic-shared-local-2.d: Likewise. * ld-frv/fdpic-shared-local-8.d: Likewise. * ld-frv/fdpic-static-1.d: Likewise. * ld-frv/fdpic-static-2.d: Likewise. * ld-frv/fdpic-static-6.d: Likewise. * ld-frv/fdpic-static-7.d: Likewise. * ld-frv/fdpic-static-8.d: Likewise. opcodes/ChangeLog: 2004-11-10 Alexandre Oliva <aoliva@redhat.com> * frv-asm.c: Rebuilt. * frv-desc.c: Rebuilt. * frv-desc.h: Rebuilt. * frv-dis.c: Rebuilt. * frv-ibld.c: Rebuilt. * frv-opc.c: Rebuilt. * frv-opc.h: Rebuilt.
Diffstat (limited to 'opcodes')
-rw-r--r--opcodes/ChangeLog11
-rw-r--r--opcodes/frv-asm.c665
-rw-r--r--opcodes/frv-desc.c28
-rw-r--r--opcodes/frv-desc.h41
-rw-r--r--opcodes/frv-dis.c22
-rw-r--r--opcodes/frv-ibld.c54
-rw-r--r--opcodes/frv-opc.c12
-rw-r--r--opcodes/frv-opc.h1
8 files changed, 634 insertions, 200 deletions
diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog
index 02e25532d05..b91673f64d0 100644
--- a/opcodes/ChangeLog
+++ b/opcodes/ChangeLog
@@ -1,3 +1,14 @@
+2005-01-25 Alexandre Oliva <aoliva@redhat.com>
+
+ 2004-11-10 Alexandre Oliva <aoliva@redhat.com>
+ * frv-asm.c: Rebuilt.
+ * frv-desc.c: Rebuilt.
+ * frv-desc.h: Rebuilt.
+ * frv-dis.c: Rebuilt.
+ * frv-ibld.c: Rebuilt.
+ * frv-opc.c: Rebuilt.
+ * frv-opc.h: Rebuilt.
+
2005-01-24 Andrew Cagney <cagney@gnu.org>
* configure: Regenerate, ../gettext.m4 was updated.
diff --git a/opcodes/frv-asm.c b/opcodes/frv-asm.c
index 98df36bf458..52d3bc117e3 100644
--- a/opcodes/frv-asm.c
+++ b/opcodes/frv-asm.c
@@ -73,6 +73,146 @@ static const char * parse_A1
static const char * parse_A
PARAMS ((CGEN_CPU_DESC, const char **, int, long *, long));
+inline static const char *
+parse_symbolic_address (CGEN_CPU_DESC cd,
+ const char **strp,
+ int opindex,
+ int opinfo,
+ enum cgen_parse_operand_result *resultp,
+ bfd_vma *valuep)
+{
+ enum cgen_parse_operand_result result_type;
+ const char *errmsg = (* cd->parse_operand_fn)
+ (cd, CGEN_PARSE_OPERAND_SYMBOLIC, strp, opindex, opinfo,
+ &result_type, valuep);
+
+ if (errmsg == NULL
+ && result_type != CGEN_PARSE_OPERAND_RESULT_QUEUED)
+ return "symbolic expression required";
+
+ if (resultp)
+ *resultp = result_type;
+
+ return errmsg;
+}
+
+static const char *
+parse_ldd_annotation (CGEN_CPU_DESC cd,
+ const char **strp,
+ int opindex,
+ long *valuep)
+{
+ const char *errmsg;
+ enum cgen_parse_operand_result result_type;
+ bfd_vma value;
+
+ if (**strp == '#' || **strp == '%')
+ {
+ if (strncasecmp (*strp + 1, "tlsdesc(", 8) == 0)
+ {
+ *strp += 9;
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_TLSDESC_RELAX,
+ &result_type, &value);
+ if (**strp != ')')
+ return "missing ')'";
+ if (valuep)
+ *valuep = value;
+ ++*strp;
+ if (errmsg)
+ return errmsg;
+ }
+ }
+
+ while (**strp == ' ' || **strp == '\t')
+ ++*strp;
+
+ if (**strp != '@')
+ return "missing `@'";
+
+ ++*strp;
+
+ return NULL;
+}
+
+static const char *
+parse_call_annotation (CGEN_CPU_DESC cd,
+ const char **strp,
+ int opindex,
+ long *valuep)
+{
+ const char *errmsg;
+ enum cgen_parse_operand_result result_type;
+ bfd_vma value;
+
+ if (**strp == '#' || **strp == '%')
+ {
+ if (strncasecmp (*strp + 1, "gettlsoff(", 10) == 0)
+ {
+ *strp += 11;
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_GETTLSOFF_RELAX,
+ &result_type, &value);
+ if (**strp != ')')
+ return "missing ')'";
+ if (valuep)
+ *valuep = value;
+ ++*strp;
+ if (errmsg)
+ return errmsg;
+ }
+ }
+
+ while (**strp == ' ' || **strp == '\t')
+ ++*strp;
+
+ if (**strp != '@')
+ return "missing `@'";
+
+ ++*strp;
+
+ return NULL;
+}
+
+static const char *
+parse_ld_annotation (CGEN_CPU_DESC cd,
+ const char **strp,
+ int opindex,
+ long *valuep)
+{
+ const char *errmsg;
+ enum cgen_parse_operand_result result_type;
+ bfd_vma value;
+
+ if (**strp == '#' || **strp == '%')
+ {
+ if (strncasecmp (*strp + 1, "tlsoff(", 7) == 0)
+ {
+ *strp += 8;
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_TLSOFF_RELAX,
+ &result_type, &value);
+ if (**strp != ')')
+ return "missing ')'";
+ if (valuep)
+ *valuep = value;
+ ++*strp;
+ if (errmsg)
+ return errmsg;
+ }
+ }
+
+ while (**strp == ' ' || **strp == '\t')
+ ++*strp;
+
+ if (**strp != '@')
+ return "missing `@'";
+
+ ++*strp;
+
+ return NULL;
+}
+
static const char *
parse_ulo16 (cd, strp, opindex, valuep)
CGEN_CPU_DESC cd;
@@ -103,73 +243,96 @@ parse_ulo16 (cd, strp, opindex, valuep)
if (strncasecmp (*strp + 1, "gprello(", 8) == 0)
{
*strp += 9;
- errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_FRV_GPRELLO,
- &result_type, &value);
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_GPRELLO,
+ &result_type, &value);
if (**strp != ')')
return "missing ')'";
++*strp;
- if (errmsg == NULL
- && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
- value &= 0xffff;
*valuep = value;
return errmsg;
}
else if (strncasecmp (*strp + 1, "gotlo(", 6) == 0)
{
*strp += 7;
- errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_FRV_GOTLO,
- &result_type, &value);
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_GOTLO,
+ &result_type, &value);
if (**strp != ')')
return "missing ')'";
++*strp;
- if (errmsg == NULL
- && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
- value &= 0xffff;
*valuep = value;
return errmsg;
}
else if (strncasecmp (*strp + 1, "gotfuncdesclo(", 14) == 0)
{
*strp += 15;
- errmsg = cgen_parse_address (cd, strp, opindex,
- BFD_RELOC_FRV_FUNCDESC_GOTLO,
- &result_type, &value);
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_FUNCDESC_GOTLO,
+ &result_type, &value);
if (**strp != ')')
return "missing ')'";
++*strp;
- if (errmsg == NULL
- && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
- value &= 0xffff;
*valuep = value;
return errmsg;
}
else if (strncasecmp (*strp + 1, "gotofflo(", 9) == 0)
{
*strp += 10;
- errmsg = cgen_parse_address (cd, strp, opindex,
- BFD_RELOC_FRV_GOTOFFLO,
- &result_type, &value);
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_GOTOFFLO,
+ &result_type, &value);
if (**strp != ')')
return "missing ')'";
++*strp;
- if (errmsg == NULL
- && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
- value &= 0xffff;
*valuep = value;
return errmsg;
}
else if (strncasecmp (*strp + 1, "gotofffuncdesclo(", 17) == 0)
{
*strp += 18;
- errmsg = cgen_parse_address (cd, strp, opindex,
- BFD_RELOC_FRV_FUNCDESC_GOTOFFLO,
- &result_type, &value);
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_FUNCDESC_GOTOFFLO,
+ &result_type, &value);
+ if (**strp != ')')
+ return "missing ')'";
+ ++*strp;
+ *valuep = value;
+ return errmsg;
+ }
+ else if (strncasecmp (*strp + 1, "gottlsdesclo(", 13) == 0)
+ {
+ *strp += 14;
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_GOTTLSDESCLO,
+ &result_type, &value);
+ if (**strp != ')')
+ return "missing ')'";
+ ++*strp;
+ *valuep = value;
+ return errmsg;
+ }
+ else if (strncasecmp (*strp + 1, "tlsmofflo(", 10) == 0)
+ {
+ *strp += 11;
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_TLSMOFFLO,
+ &result_type, &value);
+ if (**strp != ')')
+ return "missing ')'";
+ ++*strp;
+ *valuep = value;
+ return errmsg;
+ }
+ else if (strncasecmp (*strp + 1, "gottlsofflo(", 12) == 0)
+ {
+ *strp += 13;
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_GOTTLSOFFLO,
+ &result_type, &value);
if (**strp != ')')
return "missing ')'";
++*strp;
- if (errmsg == NULL
- && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
- value &= 0xffff;
*valuep = value;
return errmsg;
}
@@ -207,73 +370,96 @@ parse_uslo16 (cd, strp, opindex, valuep)
else if (strncasecmp (*strp + 1, "gprello(", 8) == 0)
{
*strp += 9;
- errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_FRV_GPRELLO,
- &result_type, &value);
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_GPRELLO,
+ &result_type, &value);
if (**strp != ')')
return "missing ')'";
++*strp;
- if (errmsg == NULL
- && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
- value &= 0xffff;
*valuep = value;
return errmsg;
}
else if (strncasecmp (*strp + 1, "gotlo(", 6) == 0)
{
*strp += 7;
- errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_FRV_GOTLO,
- &result_type, &value);
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_GOTLO,
+ &result_type, &value);
if (**strp != ')')
return "missing ')'";
++*strp;
- if (errmsg == NULL
- && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
- value &= 0xffff;
*valuep = value;
return errmsg;
}
else if (strncasecmp (*strp + 1, "gotfuncdesclo(", 14) == 0)
{
*strp += 15;
- errmsg = cgen_parse_address (cd, strp, opindex,
- BFD_RELOC_FRV_FUNCDESC_GOTLO,
- &result_type, &value);
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_FUNCDESC_GOTLO,
+ &result_type, &value);
if (**strp != ')')
return "missing ')'";
++*strp;
- if (errmsg == NULL
- && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
- value &= 0xffff;
*valuep = value;
return errmsg;
}
else if (strncasecmp (*strp + 1, "gotofflo(", 9) == 0)
{
*strp += 10;
- errmsg = cgen_parse_address (cd, strp, opindex,
- BFD_RELOC_FRV_GOTOFFLO,
- &result_type, &value);
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_GOTOFFLO,
+ &result_type, &value);
if (**strp != ')')
return "missing ')'";
++*strp;
- if (errmsg == NULL
- && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
- value &= 0xffff;
*valuep = value;
return errmsg;
}
else if (strncasecmp (*strp + 1, "gotofffuncdesclo(", 17) == 0)
{
*strp += 18;
- errmsg = cgen_parse_address (cd, strp, opindex,
- BFD_RELOC_FRV_FUNCDESC_GOTOFFLO,
- &result_type, &value);
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_FUNCDESC_GOTOFFLO,
+ &result_type, &value);
+ if (**strp != ')')
+ return "missing ')'";
+ ++*strp;
+ *valuep = value;
+ return errmsg;
+ }
+ else if (strncasecmp (*strp + 1, "gottlsdesclo(", 13) == 0)
+ {
+ *strp += 14;
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_GOTTLSDESCLO,
+ &result_type, &value);
+ if (**strp != ')')
+ return "missing ')'";
+ ++*strp;
+ *valuep = value;
+ return errmsg;
+ }
+ else if (strncasecmp (*strp + 1, "tlsmofflo(", 10) == 0)
+ {
+ *strp += 11;
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_TLSMOFFLO,
+ &result_type, &value);
+ if (**strp != ')')
+ return "missing ')'";
+ ++*strp;
+ *valuep = value;
+ return errmsg;
+ }
+ else if (strncasecmp (*strp + 1, "gottlsofflo(", 12) == 0)
+ {
+ *strp += 13;
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_GOTTLSOFFLO,
+ &result_type, &value);
if (**strp != ')')
return "missing ')'";
++*strp;
- if (errmsg == NULL
- && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
- value &= 0xffff;
*valuep = value;
return errmsg;
}
@@ -304,80 +490,110 @@ parse_uhi16 (cd, strp, opindex, valuep)
++*strp;
if (errmsg == NULL
&& result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
- value >>= 16;
+ {
+ /* If bfd_vma is wider than 32 bits, but we have a sign-
+ or zero-extension, truncate it. */
+ if (value >= - ((bfd_vma)1 << 31)
+ || value <= ((bfd_vma)1 << 31) - (bfd_vma)1)
+ value &= (((bfd_vma)1 << 16) << 16) - 1;
+ value >>= 16;
+ }
*valuep = value;
return errmsg;
}
else if (strncasecmp (*strp + 1, "gprelhi(", 8) == 0)
{
*strp += 9;
- errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_FRV_GPRELHI,
- &result_type, &value);
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_GPRELHI,
+ &result_type, &value);
if (**strp != ')')
return "missing ')'";
++*strp;
- if (errmsg == NULL
- && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
- value >>= 16;
*valuep = value;
return errmsg;
}
else if (strncasecmp (*strp + 1, "gothi(", 6) == 0)
{
*strp += 7;
- errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_FRV_GOTHI,
- &result_type, &value);
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_GOTHI,
+ &result_type, &value);
if (**strp != ')')
return "missing ')'";
++*strp;
- if (errmsg == NULL
- && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
- value >>= 16;
*valuep = value;
return errmsg;
}
else if (strncasecmp (*strp + 1, "gotfuncdeschi(", 14) == 0)
{
*strp += 15;
- errmsg = cgen_parse_address (cd, strp, opindex,
- BFD_RELOC_FRV_FUNCDESC_GOTHI,
- &result_type, &value);
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_FUNCDESC_GOTHI,
+ &result_type, &value);
if (**strp != ')')
return "missing ')'";
++*strp;
- if (errmsg == NULL
- && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
- value >>= 16;
*valuep = value;
return errmsg;
}
else if (strncasecmp (*strp + 1, "gotoffhi(", 9) == 0)
{
*strp += 10;
- errmsg = cgen_parse_address (cd, strp, opindex,
- BFD_RELOC_FRV_GOTOFFHI,
- &result_type, &value);
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_GOTOFFHI,
+ &result_type, &value);
if (**strp != ')')
return "missing ')'";
++*strp;
- if (errmsg == NULL
- && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
- value >>= 16;
*valuep = value;
return errmsg;
}
else if (strncasecmp (*strp + 1, "gotofffuncdeschi(", 17) == 0)
{
*strp += 18;
- errmsg = cgen_parse_address (cd, strp, opindex,
- BFD_RELOC_FRV_FUNCDESC_GOTOFFHI,
- &result_type, &value);
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_FUNCDESC_GOTOFFHI,
+ &result_type, &value);
+ if (**strp != ')')
+ return "missing ')'";
+ ++*strp;
+ *valuep = value;
+ return errmsg;
+ }
+ else if (strncasecmp (*strp + 1, "gottlsdeschi(", 13) == 0)
+ {
+ *strp += 14;
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_GOTTLSDESCHI,
+ &result_type, &value);
+ if (**strp != ')')
+ return "missing ')'";
+ ++*strp;
+ *valuep = value;
+ return errmsg;
+ }
+ else if (strncasecmp (*strp + 1, "tlsmoffhi(", 10) == 0)
+ {
+ *strp += 11;
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_TLSMOFFHI,
+ &result_type, &value);
+ if (**strp != ')')
+ return "missing ')'";
+ ++*strp;
+ *valuep = value;
+ return errmsg;
+ }
+ else if (strncasecmp (*strp + 1, "gottlsoffhi(", 12) == 0)
+ {
+ *strp += 13;
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_GOTTLSOFFHI,
+ &result_type, &value);
if (**strp != ')')
return "missing ')'";
++*strp;
- if (errmsg == NULL
- && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
- value >>= 16;
*valuep = value;
return errmsg;
}
@@ -455,8 +671,9 @@ parse_d12 (cd, strp, opindex, valuep)
if (strncasecmp (*strp + 1, "gprel12(", 8) == 0)
{
*strp += 9;
- errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_FRV_GPREL12,
- &result_type, &value);
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_GPREL12,
+ &result_type, &value);
if (**strp != ')')
return "missing `)'";
++*strp;
@@ -466,8 +683,9 @@ parse_d12 (cd, strp, opindex, valuep)
else if (strncasecmp (*strp + 1, "got12(", 6) == 0)
{
*strp += 7;
- errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_FRV_GOT12,
- &result_type, &value);
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_GOT12,
+ &result_type, &value);
if (**strp != ')')
return "missing ')'";
++*strp;
@@ -477,9 +695,9 @@ parse_d12 (cd, strp, opindex, valuep)
else if (strncasecmp (*strp + 1, "gotfuncdesc12(", 14) == 0)
{
*strp += 15;
- errmsg = cgen_parse_address (cd, strp, opindex,
- BFD_RELOC_FRV_FUNCDESC_GOT12,
- &result_type, &value);
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_FUNCDESC_GOT12,
+ &result_type, &value);
if (**strp != ')')
return "missing ')'";
++*strp;
@@ -489,9 +707,9 @@ parse_d12 (cd, strp, opindex, valuep)
else if (strncasecmp (*strp + 1, "gotoff12(", 9) == 0)
{
*strp += 10;
- errmsg = cgen_parse_address (cd, strp, opindex,
- BFD_RELOC_FRV_GOTOFF12,
- &result_type, &value);
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_GOTOFF12,
+ &result_type, &value);
if (**strp != ')')
return "missing ')'";
++*strp;
@@ -501,9 +719,45 @@ parse_d12 (cd, strp, opindex, valuep)
else if (strncasecmp (*strp + 1, "gotofffuncdesc12(", 17) == 0)
{
*strp += 18;
- errmsg = cgen_parse_address (cd, strp, opindex,
- BFD_RELOC_FRV_FUNCDESC_GOTOFF12,
- &result_type, &value);
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_FUNCDESC_GOTOFF12,
+ &result_type, &value);
+ if (**strp != ')')
+ return "missing ')'";
+ ++*strp;
+ *valuep = value;
+ return errmsg;
+ }
+ else if (strncasecmp (*strp + 1, "gottlsdesc12(", 13) == 0)
+ {
+ *strp += 14;
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_GOTTLSDESC12,
+ &result_type, &value);
+ if (**strp != ')')
+ return "missing ')'";
+ ++*strp;
+ *valuep = value;
+ return errmsg;
+ }
+ else if (strncasecmp (*strp + 1, "tlsmoff12(", 10) == 0)
+ {
+ *strp += 11;
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_TLSMOFF12,
+ &result_type, &value);
+ if (**strp != ')')
+ return "missing ')'";
+ ++*strp;
+ *valuep = value;
+ return errmsg;
+ }
+ else if (strncasecmp (*strp + 1, "gottlsoff12(", 12) == 0)
+ {
+ *strp += 13;
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_GOTTLSOFF12,
+ &result_type, &value);
if (**strp != ')')
return "missing ')'";
++*strp;
@@ -526,74 +780,109 @@ parse_s12 (cd, strp, opindex, valuep)
bfd_vma value;
/* Check for small data reference. */
- if ((**strp == '#' || **strp == '%')
- && strncasecmp (*strp + 1, "gprel12(", 8) == 0)
- {
- *strp += 9;
- errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_FRV_GPREL12,
- &result_type, &value);
- if (**strp != ')')
- return "missing `)'";
- ++*strp;
- *valuep = value;
- return errmsg;
- }
- else if ((**strp == '#' || **strp == '%')
- && strncasecmp (*strp + 1, "got12(", 6) == 0)
- {
- *strp += 7;
- errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_FRV_GOT12,
- &result_type, &value);
- if (**strp != ')')
- return "missing ')'";
- ++*strp;
- *valuep = value;
- return errmsg;
- }
- else if ((**strp == '#' || **strp == '%')
- && strncasecmp (*strp + 1, "gotfuncdesc12(", 14) == 0)
- {
- *strp += 15;
- errmsg = cgen_parse_address (cd, strp, opindex,
- BFD_RELOC_FRV_FUNCDESC_GOT12,
- &result_type, &value);
- if (**strp != ')')
- return "missing ')'";
- ++*strp;
- *valuep = value;
- return errmsg;
- }
- else if ((**strp == '#' || **strp == '%')
- && strncasecmp (*strp + 1, "gotoff12(", 9) == 0)
- {
- *strp += 10;
- errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_FRV_GOTOFF12,
- &result_type, &value);
- if (**strp != ')')
- return "missing ')'";
- ++*strp;
- *valuep = value;
- return errmsg;
- }
- else if ((**strp == '#' || **strp == '%')
- && strncasecmp (*strp + 1, "gotofffuncdesc12(", 17) == 0)
- {
- *strp += 18;
- errmsg = cgen_parse_address (cd, strp, opindex,
- BFD_RELOC_FRV_FUNCDESC_GOTOFF12,
- &result_type, &value);
- if (**strp != ')')
- return "missing ')'";
- ++*strp;
- *valuep = value;
- return errmsg;
- }
- else
+ if (**strp == '#' || **strp == '%')
{
- if (**strp == '#')
- ++*strp;
- return cgen_parse_signed_integer (cd, strp, opindex, valuep);
+ if (strncasecmp (*strp + 1, "gprel12(", 8) == 0)
+ {
+ *strp += 9;
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_GPREL12,
+ &result_type, &value);
+ if (**strp != ')')
+ return "missing `)'";
+ ++*strp;
+ *valuep = value;
+ return errmsg;
+ }
+ else if (strncasecmp (*strp + 1, "got12(", 6) == 0)
+ {
+ *strp += 7;
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_GOT12,
+ &result_type, &value);
+ if (**strp != ')')
+ return "missing ')'";
+ ++*strp;
+ *valuep = value;
+ return errmsg;
+ }
+ else if (strncasecmp (*strp + 1, "gotfuncdesc12(", 14) == 0)
+ {
+ *strp += 15;
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_FUNCDESC_GOT12,
+ &result_type, &value);
+ if (**strp != ')')
+ return "missing ')'";
+ ++*strp;
+ *valuep = value;
+ return errmsg;
+ }
+ else if (strncasecmp (*strp + 1, "gotoff12(", 9) == 0)
+ {
+ *strp += 10;
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_GOTOFF12,
+ &result_type, &value);
+ if (**strp != ')')
+ return "missing ')'";
+ ++*strp;
+ *valuep = value;
+ return errmsg;
+ }
+ else if (strncasecmp (*strp + 1, "gotofffuncdesc12(", 17) == 0)
+ {
+ *strp += 18;
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_FUNCDESC_GOTOFF12,
+ &result_type, &value);
+ if (**strp != ')')
+ return "missing ')'";
+ ++*strp;
+ *valuep = value;
+ return errmsg;
+ }
+ else if (strncasecmp (*strp + 1, "gottlsdesc12(", 13) == 0)
+ {
+ *strp += 14;
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_GOTTLSDESC12,
+ &result_type, &value);
+ if (**strp != ')')
+ return "missing ')'";
+ ++*strp;
+ *valuep = value;
+ return errmsg;
+ }
+ else if (strncasecmp (*strp + 1, "tlsmoff12(", 10) == 0)
+ {
+ *strp += 11;
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_TLSMOFF12,
+ &result_type, &value);
+ if (**strp != ')')
+ return "missing ')'";
+ ++*strp;
+ *valuep = value;
+ return errmsg;
+ }
+ else if (strncasecmp (*strp + 1, "gottlsoff12(", 12) == 0)
+ {
+ *strp += 13;
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_GOTTLSOFF12,
+ &result_type, &value);
+ if (**strp != ')')
+ return "missing ')'";
+ ++*strp;
+ *valuep = value;
+ return errmsg;
+ }
}
+
+ if (**strp == '#')
+ ++*strp;
+ return cgen_parse_signed_integer (cd, strp, opindex, valuep);
}
static const char *
@@ -612,8 +901,9 @@ parse_u12 (cd, strp, opindex, valuep)
&& strncasecmp (*strp + 1, "gprel12(", 8) == 0)
{
*strp += 9;
- errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_FRV_GPRELU12,
- &result_type, &value);
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_GPRELU12,
+ &result_type, &value);
if (**strp != ')')
return "missing `)'";
++*strp;
@@ -691,6 +981,38 @@ parse_even_register (cd, strP, tableP, valueP)
return errmsg;
}
+
+static const char *
+parse_call_label (CGEN_CPU_DESC cd,
+ const char **strp,
+ int opindex,
+ int opinfo,
+ enum cgen_parse_operand_result *resultp,
+ bfd_vma *valuep)
+{
+ const char *errmsg;
+ bfd_vma value;
+
+ /* Check for small data reference. */
+ if (opinfo == 0 && (**strp == '#' || **strp == '%'))
+ {
+ if (strncasecmp (*strp + 1, "gettlsoff(", 10) == 0)
+ {
+ *strp += 11;
+ errmsg = parse_symbolic_address (cd, strp, opindex,
+ BFD_RELOC_FRV_GETTLSOFF,
+ resultp, &value);
+ if (**strp != ')')
+ return "missing `)'";
+ ++*strp;
+ *valuep = value;
+ return errmsg;
+ }
+ }
+
+ return cgen_parse_address (cd, strp, opindex, opinfo, resultp, valuep);
+}
+
/* -- */
const char * frv_cgen_parse_operand
@@ -878,6 +1200,9 @@ frv_cgen_parse_operand (cd, opindex, strp, fields)
case FRV_OPERAND_AE :
errmsg = cgen_parse_unsigned_integer (cd, strp, FRV_OPERAND_AE, &fields->f_ae);
break;
+ case FRV_OPERAND_CALLANN :
+ errmsg = parse_call_annotation (cd, strp, FRV_OPERAND_CALLANN, &fields->f_reloc_ann);
+ break;
case FRV_OPERAND_CCOND :
errmsg = cgen_parse_unsigned_integer (cd, strp, FRV_OPERAND_CCOND, &fields->f_ccond);
break;
@@ -912,10 +1237,16 @@ frv_cgen_parse_operand (cd, opindex, strp, fields)
case FRV_OPERAND_LABEL24 :
{
bfd_vma value;
- errmsg = cgen_parse_address (cd, strp, FRV_OPERAND_LABEL24, 0, NULL, & value);
+ errmsg = parse_call_label (cd, strp, FRV_OPERAND_LABEL24, 0, NULL, & value);
fields->f_label24 = value;
}
break;
+ case FRV_OPERAND_LDANN :
+ errmsg = parse_ld_annotation (cd, strp, FRV_OPERAND_LDANN, &fields->f_reloc_ann);
+ break;
+ case FRV_OPERAND_LDDANN :
+ errmsg = parse_ldd_annotation (cd, strp, FRV_OPERAND_LDDANN, &fields->f_reloc_ann);
+ break;
case FRV_OPERAND_LOCK :
errmsg = cgen_parse_unsigned_integer (cd, strp, FRV_OPERAND_LOCK, &fields->f_lock);
break;
diff --git a/opcodes/frv-desc.c b/opcodes/frv-desc.c
index 91f8ccadfec..af49bd0faae 100644
--- a/opcodes/frv-desc.c
+++ b/opcodes/frv-desc.c
@@ -1825,6 +1825,7 @@ const CGEN_HW_ENTRY frv_cgen_hw_table[] =
{ "h-uint", HW_H_UINT, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
{ "h-addr", HW_H_ADDR, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
{ "h-iaddr", HW_H_IADDR, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
+ { "h-reloc-ann", HW_H_RELOC_ANN, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
{ "h-pc", HW_H_PC, CGEN_ASM_NONE, 0, { 0|A(PROFILE)|A(PC), { (1<<MACH_BASE) } } },
{ "h-psr_imple", HW_H_PSR_IMPLE, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
{ "h-psr_ver", HW_H_PSR_VER, CGEN_ASM_NONE, 0, { 0, { (1<<MACH_BASE) } } },
@@ -1989,6 +1990,7 @@ const CGEN_IFLD frv_cgen_ifld_table[] =
{ FRV_F_TLBPR_NULL, "f-TLBPR-null", 0, 32, 30, 2, { 0|A(RESERVED), { (1<<MACH_BASE) } } },
{ FRV_F_LI_OFF, "f-LI-off", 0, 32, 25, 1, { 0|A(RESERVED), { (1<<MACH_BASE) } } },
{ FRV_F_LI_ON, "f-LI-on", 0, 32, 25, 1, { 0|A(RESERVED), { (1<<MACH_BASE) } } },
+ { FRV_F_RELOC_ANN, "f-reloc-ann", 0, 32, 0, 0, { 0, { (1<<MACH_BASE) } } },
{ 0, 0, 0, 0, 0, 0, {0, {0}} }
};
@@ -2279,10 +2281,6 @@ const CGEN_OPERAND frv_cgen_operand_table[] =
{ "label16", FRV_OPERAND_LABEL16, HW_H_IADDR, 15, 16,
{ 0, { (const PTR) &frv_cgen_ifld_table[FRV_F_LABEL16] } },
{ 0|A(PCREL_ADDR), { (1<<MACH_BASE) } } },
-/* label24: 26 bit pc relative address */
- { "label24", FRV_OPERAND_LABEL24, HW_H_IADDR, 17, 24,
- { 2, { (const PTR) &FRV_F_LABEL24_MULTI_IFIELD[0] } },
- { 0|A(PCREL_ADDR)|A(VIRTUAL), { (1<<MACH_BASE) } } },
/* LRAE: Load Real Address E flag */
{ "LRAE", FRV_OPERAND_LRAE, HW_H_UINT, 5, 1,
{ 0, { (const PTR) &frv_cgen_ifld_table[FRV_F_LRAE] } },
@@ -2351,6 +2349,10 @@ const CGEN_OPERAND frv_cgen_operand_table[] =
{ "uhi16", FRV_OPERAND_UHI16, HW_H_UINT, 15, 16,
{ 0, { (const PTR) &frv_cgen_ifld_table[FRV_F_U16] } },
{ 0, { (1<<MACH_BASE) } } },
+/* label24: 26 bit pc relative address */
+ { "label24", FRV_OPERAND_LABEL24, HW_H_IADDR, 17, 24,
+ { 2, { (const PTR) &FRV_F_LABEL24_MULTI_IFIELD[0] } },
+ { 0|A(PCREL_ADDR)|A(VIRTUAL), { (1<<MACH_BASE) } } },
/* psr_esr: PSR.ESR bit */
{ "psr_esr", FRV_OPERAND_PSR_ESR, HW_H_PSR_ESR, 0, 0,
{ 0, { (const PTR) 0 } },
@@ -2383,6 +2385,18 @@ const CGEN_OPERAND frv_cgen_operand_table[] =
{ "tbr_tt", FRV_OPERAND_TBR_TT, HW_H_TBR_TT, 0, 0,
{ 0, { (const PTR) 0 } },
{ 0|A(SEM_ONLY), { (1<<MACH_BASE) } } },
+/* ldann: ld annotation */
+ { "ldann", FRV_OPERAND_LDANN, HW_H_RELOC_ANN, 0, 0,
+ { 0, { (const PTR) &frv_cgen_ifld_table[FRV_F_RELOC_ANN] } },
+ { 0, { (1<<MACH_BASE) } } },
+/* lddann: ldd annotation */
+ { "lddann", FRV_OPERAND_LDDANN, HW_H_RELOC_ANN, 0, 0,
+ { 0, { (const PTR) &frv_cgen_ifld_table[FRV_F_RELOC_ANN] } },
+ { 0, { (1<<MACH_BASE) } } },
+/* callann: call annotation */
+ { "callann", FRV_OPERAND_CALLANN, HW_H_RELOC_ANN, 0, 0,
+ { 0, { (const PTR) &frv_cgen_ifld_table[FRV_F_RELOC_ANN] } },
+ { 0, { (1<<MACH_BASE) } } },
/* sentinel */
{ 0, 0, 0, 0, 0,
{ 0, { (const PTR) 0 } },
@@ -2892,7 +2906,7 @@ static const CGEN_IBASE frv_cgen_insn_table[MAX_INSNS] =
FRV_INSN_LDUH, "lduh", "lduh", 32,
{ 0, { (1<<MACH_BASE), UNIT_LOAD, FR400_MAJOR_I_2, FR450_MAJOR_I_2, FR500_MAJOR_I_2, FR550_MAJOR_I_3 } }
},
-/* ld$pack @($GRi,$GRj),$GRk */
+/* ld$pack $ldann($GRi,$GRj),$GRk */
{
FRV_INSN_LD, "ld", "ld", 32,
{ 0, { (1<<MACH_BASE), UNIT_LOAD, FR400_MAJOR_I_2, FR450_MAJOR_I_2, FR500_MAJOR_I_2, FR550_MAJOR_I_3 } }
@@ -2957,7 +2971,7 @@ static const CGEN_IBASE frv_cgen_insn_table[MAX_INSNS] =
FRV_INSN_NLDF, "nldf", "nldf", 32,
{ 0|A(FR_ACCESS)|A(NON_EXCEPTING), { (1<<MACH_SIMPLE)|(1<<MACH_TOMCAT)|(1<<MACH_FR500)|(1<<MACH_FR550)|(1<<MACH_FRV), UNIT_LOAD, FR400_MAJOR_NONE, FR450_MAJOR_NONE, FR500_MAJOR_I_2, FR550_MAJOR_I_3 } }
},
-/* ldd$pack @($GRi,$GRj),$GRdoublek */
+/* ldd$pack $lddann($GRi,$GRj),$GRdoublek */
{
FRV_INSN_LDD, "ldd", "ldd", 32,
{ 0, { (1<<MACH_BASE), UNIT_LOAD, FR400_MAJOR_I_2, FR450_MAJOR_I_2, FR500_MAJOR_I_2, FR550_MAJOR_I_3 } }
@@ -4197,7 +4211,7 @@ static const CGEN_IBASE frv_cgen_insn_table[MAX_INSNS] =
FRV_INSN_JMPL, "jmpl", "jmpl", 32,
{ 0|A(UNCOND_CTI), { (1<<MACH_BASE), UNIT_I0, FR400_MAJOR_I_5, FR450_MAJOR_I_5, FR500_MAJOR_I_5, FR550_MAJOR_I_6 } }
},
-/* calll$pack @($GRi,$GRj) */
+/* calll$pack $callann($GRi,$GRj) */
{
FRV_INSN_CALLL, "calll", "calll", 32,
{ 0|A(UNCOND_CTI), { (1<<MACH_BASE), UNIT_I0, FR400_MAJOR_I_5, FR450_MAJOR_I_5, FR500_MAJOR_I_5, FR550_MAJOR_I_6 } }
diff --git a/opcodes/frv-desc.h b/opcodes/frv-desc.h
index 4e9b446da6c..7fe94f70e6f 100644
--- a/opcodes/frv-desc.h
+++ b/opcodes/frv-desc.h
@@ -647,7 +647,7 @@ typedef enum ifield_type {
, FRV_F_MISC_NULL_4, FRV_F_MISC_NULL_5, FRV_F_MISC_NULL_6, FRV_F_MISC_NULL_7
, FRV_F_MISC_NULL_8, FRV_F_MISC_NULL_9, FRV_F_MISC_NULL_10, FRV_F_MISC_NULL_11
, FRV_F_LRA_NULL, FRV_F_TLBPR_NULL, FRV_F_LI_OFF, FRV_F_LI_ON
- , FRV_F_MAX
+ , FRV_F_RELOC_ANN, FRV_F_MAX
} IFIELD_TYPE;
#define MAX_IFLD ((int) FRV_F_MAX)
@@ -666,18 +666,18 @@ typedef enum cgen_hw_attr {
/* Enum declaration for frv hardware types. */
typedef enum cgen_hw_type {
HW_H_MEMORY, HW_H_SINT, HW_H_UINT, HW_H_ADDR
- , HW_H_IADDR, HW_H_PC, HW_H_PSR_IMPLE, HW_H_PSR_VER
- , HW_H_PSR_ICE, HW_H_PSR_NEM, HW_H_PSR_CM, HW_H_PSR_BE
- , HW_H_PSR_ESR, HW_H_PSR_EF, HW_H_PSR_EM, HW_H_PSR_PIL
- , HW_H_PSR_PS, HW_H_PSR_ET, HW_H_PSR_S, HW_H_TBR_TBA
- , HW_H_TBR_TT, HW_H_BPSR_BS, HW_H_BPSR_BET, HW_H_GR
- , HW_H_GR_DOUBLE, HW_H_GR_HI, HW_H_GR_LO, HW_H_FR
- , HW_H_FR_DOUBLE, HW_H_FR_INT, HW_H_FR_HI, HW_H_FR_LO
- , HW_H_FR_0, HW_H_FR_1, HW_H_FR_2, HW_H_FR_3
- , HW_H_CPR, HW_H_CPR_DOUBLE, HW_H_SPR, HW_H_ACCG
- , HW_H_ACC40S, HW_H_ACC40U, HW_H_IACC0, HW_H_ICCR
- , HW_H_FCCR, HW_H_CCCR, HW_H_PACK, HW_H_HINT_TAKEN
- , HW_H_HINT_NOT_TAKEN, HW_MAX
+ , HW_H_IADDR, HW_H_RELOC_ANN, HW_H_PC, HW_H_PSR_IMPLE
+ , HW_H_PSR_VER, HW_H_PSR_ICE, HW_H_PSR_NEM, HW_H_PSR_CM
+ , HW_H_PSR_BE, HW_H_PSR_ESR, HW_H_PSR_EF, HW_H_PSR_EM
+ , HW_H_PSR_PIL, HW_H_PSR_PS, HW_H_PSR_ET, HW_H_PSR_S
+ , HW_H_TBR_TBA, HW_H_TBR_TT, HW_H_BPSR_BS, HW_H_BPSR_BET
+ , HW_H_GR, HW_H_GR_DOUBLE, HW_H_GR_HI, HW_H_GR_LO
+ , HW_H_FR, HW_H_FR_DOUBLE, HW_H_FR_INT, HW_H_FR_HI
+ , HW_H_FR_LO, HW_H_FR_0, HW_H_FR_1, HW_H_FR_2
+ , HW_H_FR_3, HW_H_CPR, HW_H_CPR_DOUBLE, HW_H_SPR
+ , HW_H_ACCG, HW_H_ACC40S, HW_H_ACC40U, HW_H_IACC0
+ , HW_H_ICCR, HW_H_FCCR, HW_H_CCCR, HW_H_PACK
+ , HW_H_HINT_TAKEN, HW_H_HINT_NOT_TAKEN, HW_MAX
} CGEN_HW_TYPE;
#define MAX_HW ((int) HW_MAX)
@@ -712,17 +712,18 @@ typedef enum cgen_operand_type {
, FRV_OPERAND_U6, FRV_OPERAND_S5, FRV_OPERAND_COND, FRV_OPERAND_CCOND
, FRV_OPERAND_HINT, FRV_OPERAND_HINT_TAKEN, FRV_OPERAND_HINT_NOT_TAKEN, FRV_OPERAND_LI
, FRV_OPERAND_LOCK, FRV_OPERAND_DEBUG, FRV_OPERAND_AE, FRV_OPERAND_LABEL16
- , FRV_OPERAND_LABEL24, FRV_OPERAND_LRAE, FRV_OPERAND_LRAD, FRV_OPERAND_LRAS
- , FRV_OPERAND_TLBPROPX, FRV_OPERAND_TLBPRL, FRV_OPERAND_A0, FRV_OPERAND_A1
- , FRV_OPERAND_FRINTIEVEN, FRV_OPERAND_FRINTJEVEN, FRV_OPERAND_FRINTKEVEN, FRV_OPERAND_D12
- , FRV_OPERAND_S12, FRV_OPERAND_U12, FRV_OPERAND_SPR, FRV_OPERAND_ULO16
- , FRV_OPERAND_SLO16, FRV_OPERAND_UHI16, FRV_OPERAND_PSR_ESR, FRV_OPERAND_PSR_S
+ , FRV_OPERAND_LRAE, FRV_OPERAND_LRAD, FRV_OPERAND_LRAS, FRV_OPERAND_TLBPROPX
+ , FRV_OPERAND_TLBPRL, FRV_OPERAND_A0, FRV_OPERAND_A1, FRV_OPERAND_FRINTIEVEN
+ , FRV_OPERAND_FRINTJEVEN, FRV_OPERAND_FRINTKEVEN, FRV_OPERAND_D12, FRV_OPERAND_S12
+ , FRV_OPERAND_U12, FRV_OPERAND_SPR, FRV_OPERAND_ULO16, FRV_OPERAND_SLO16
+ , FRV_OPERAND_UHI16, FRV_OPERAND_LABEL24, FRV_OPERAND_PSR_ESR, FRV_OPERAND_PSR_S
, FRV_OPERAND_PSR_PS, FRV_OPERAND_PSR_ET, FRV_OPERAND_BPSR_BS, FRV_OPERAND_BPSR_BET
- , FRV_OPERAND_TBR_TBA, FRV_OPERAND_TBR_TT, FRV_OPERAND_MAX
+ , FRV_OPERAND_TBR_TBA, FRV_OPERAND_TBR_TT, FRV_OPERAND_LDANN, FRV_OPERAND_LDDANN
+ , FRV_OPERAND_CALLANN, FRV_OPERAND_MAX
} CGEN_OPERAND_TYPE;
/* Number of operands types. */
-#define MAX_OPERANDS 86
+#define MAX_OPERANDS 89
/* Maximum number of operands referenced by any insn. */
#define MAX_OPERAND_INSTANCES 8
diff --git a/opcodes/frv-dis.c b/opcodes/frv-dis.c
index 81af34307dd..7e0ca3f2a2d 100644
--- a/opcodes/frv-dis.c
+++ b/opcodes/frv-dis.c
@@ -67,6 +67,19 @@ static void print_lo
PARAMS ((CGEN_CPU_DESC, PTR, long, unsigned, bfd_vma, int));
static void
+print_at (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
+ PTR dis_info,
+ CGEN_KEYWORD *names ATTRIBUTE_UNUSED,
+ long value ATTRIBUTE_UNUSED,
+ bfd_vma pc ATTRIBUTE_UNUSED,
+ int length ATTRIBUTE_UNUSED
+ )
+{
+ disassemble_info *info = (disassemble_info *) dis_info;
+ (*info->fprintf_func) (info->stream, "@");
+}
+
+static void
print_spr (cd, dis_info, names, regno, attrs)
CGEN_CPU_DESC cd;
PTR dis_info;
@@ -307,6 +320,9 @@ frv_cgen_print_operand (cd, opindex, xinfo, fields, attrs, pc, length)
case FRV_OPERAND_AE :
print_normal (cd, info, fields->f_ae, 0|(1<<CGEN_OPERAND_HASH_PREFIX), pc, length);
break;
+ case FRV_OPERAND_CALLANN :
+ print_at (cd, info, fields->f_reloc_ann, 0, pc, length);
+ break;
case FRV_OPERAND_CCOND :
print_normal (cd, info, fields->f_ccond, 0|(1<<CGEN_OPERAND_HASH_PREFIX), pc, length);
break;
@@ -337,6 +353,12 @@ frv_cgen_print_operand (cd, opindex, xinfo, fields, attrs, pc, length)
case FRV_OPERAND_LABEL24 :
print_address (cd, info, fields->f_label24, 0|(1<<CGEN_OPERAND_PCREL_ADDR)|(1<<CGEN_OPERAND_VIRTUAL), pc, length);
break;
+ case FRV_OPERAND_LDANN :
+ print_at (cd, info, fields->f_reloc_ann, 0, pc, length);
+ break;
+ case FRV_OPERAND_LDDANN :
+ print_at (cd, info, fields->f_reloc_ann, 0, pc, length);
+ break;
case FRV_OPERAND_LOCK :
print_normal (cd, info, fields->f_lock, 0|(1<<CGEN_OPERAND_HASH_PREFIX), pc, length);
break;
diff --git a/opcodes/frv-ibld.c b/opcodes/frv-ibld.c
index 03686f8bcfd..81aef09ec4d 100644
--- a/opcodes/frv-ibld.c
+++ b/opcodes/frv-ibld.c
@@ -731,6 +731,9 @@ frv_cgen_insert_operand (cd, opindex, fields, buffer, pc)
case FRV_OPERAND_AE :
errmsg = insert_normal (cd, fields->f_ae, 0, 0, 25, 1, 32, total_length, buffer);
break;
+ case FRV_OPERAND_CALLANN :
+ errmsg = insert_normal (cd, fields->f_reloc_ann, 0, 0, 0, 0, 32, total_length, buffer);
+ break;
case FRV_OPERAND_CCOND :
errmsg = insert_normal (cd, fields->f_ccond, 0, 0, 12, 1, 32, total_length, buffer);
break;
@@ -776,6 +779,12 @@ frv_cgen_insert_operand (cd, opindex, fields, buffer, pc)
break;
}
break;
+ case FRV_OPERAND_LDANN :
+ errmsg = insert_normal (cd, fields->f_reloc_ann, 0, 0, 0, 0, 32, total_length, buffer);
+ break;
+ case FRV_OPERAND_LDDANN :
+ errmsg = insert_normal (cd, fields->f_reloc_ann, 0, 0, 0, 0, 32, total_length, buffer);
+ break;
case FRV_OPERAND_LOCK :
errmsg = insert_normal (cd, fields->f_lock, 0, 0, 25, 1, 32, total_length, buffer);
break;
@@ -1049,6 +1058,9 @@ frv_cgen_extract_operand (cd, opindex, ex_info, insn_value, fields, pc)
case FRV_OPERAND_AE :
length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_ae);
break;
+ case FRV_OPERAND_CALLANN :
+ length = extract_normal (cd, ex_info, insn_value, 0, 0, 0, 0, 32, total_length, pc, & fields->f_reloc_ann);
+ break;
case FRV_OPERAND_CCOND :
length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 1, 32, total_length, pc, & fields->f_ccond);
break;
@@ -1092,6 +1104,12 @@ frv_cgen_extract_operand (cd, opindex, ex_info, insn_value, fields, pc)
}
}
break;
+ case FRV_OPERAND_LDANN :
+ length = extract_normal (cd, ex_info, insn_value, 0, 0, 0, 0, 32, total_length, pc, & fields->f_reloc_ann);
+ break;
+ case FRV_OPERAND_LDDANN :
+ length = extract_normal (cd, ex_info, insn_value, 0, 0, 0, 0, 32, total_length, pc, & fields->f_reloc_ann);
+ break;
case FRV_OPERAND_LOCK :
length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_lock);
break;
@@ -1350,6 +1368,9 @@ frv_cgen_get_int_operand (cd, opindex, fields)
case FRV_OPERAND_AE :
value = fields->f_ae;
break;
+ case FRV_OPERAND_CALLANN :
+ value = fields->f_reloc_ann;
+ break;
case FRV_OPERAND_CCOND :
value = fields->f_ccond;
break;
@@ -1380,6 +1401,12 @@ frv_cgen_get_int_operand (cd, opindex, fields)
case FRV_OPERAND_LABEL24 :
value = fields->f_label24;
break;
+ case FRV_OPERAND_LDANN :
+ value = fields->f_reloc_ann;
+ break;
+ case FRV_OPERAND_LDDANN :
+ value = fields->f_reloc_ann;
+ break;
case FRV_OPERAND_LOCK :
value = fields->f_lock;
break;
@@ -1602,6 +1629,9 @@ frv_cgen_get_vma_operand (cd, opindex, fields)
case FRV_OPERAND_AE :
value = fields->f_ae;
break;
+ case FRV_OPERAND_CALLANN :
+ value = fields->f_reloc_ann;
+ break;
case FRV_OPERAND_CCOND :
value = fields->f_ccond;
break;
@@ -1632,6 +1662,12 @@ frv_cgen_get_vma_operand (cd, opindex, fields)
case FRV_OPERAND_LABEL24 :
value = fields->f_label24;
break;
+ case FRV_OPERAND_LDANN :
+ value = fields->f_reloc_ann;
+ break;
+ case FRV_OPERAND_LDDANN :
+ value = fields->f_reloc_ann;
+ break;
case FRV_OPERAND_LOCK :
value = fields->f_lock;
break;
@@ -1863,6 +1899,9 @@ frv_cgen_set_int_operand (cd, opindex, fields, value)
case FRV_OPERAND_AE :
fields->f_ae = value;
break;
+ case FRV_OPERAND_CALLANN :
+ fields->f_reloc_ann = value;
+ break;
case FRV_OPERAND_CCOND :
fields->f_ccond = value;
break;
@@ -1893,6 +1932,12 @@ frv_cgen_set_int_operand (cd, opindex, fields, value)
case FRV_OPERAND_LABEL24 :
fields->f_label24 = value;
break;
+ case FRV_OPERAND_LDANN :
+ fields->f_reloc_ann = value;
+ break;
+ case FRV_OPERAND_LDDANN :
+ fields->f_reloc_ann = value;
+ break;
case FRV_OPERAND_LOCK :
fields->f_lock = value;
break;
@@ -2112,6 +2157,9 @@ frv_cgen_set_vma_operand (cd, opindex, fields, value)
case FRV_OPERAND_AE :
fields->f_ae = value;
break;
+ case FRV_OPERAND_CALLANN :
+ fields->f_reloc_ann = value;
+ break;
case FRV_OPERAND_CCOND :
fields->f_ccond = value;
break;
@@ -2142,6 +2190,12 @@ frv_cgen_set_vma_operand (cd, opindex, fields, value)
case FRV_OPERAND_LABEL24 :
fields->f_label24 = value;
break;
+ case FRV_OPERAND_LDANN :
+ fields->f_reloc_ann = value;
+ break;
+ case FRV_OPERAND_LDDANN :
+ fields->f_reloc_ann = value;
+ break;
case FRV_OPERAND_LOCK :
fields->f_lock = value;
break;
diff --git a/opcodes/frv-opc.c b/opcodes/frv-opc.c
index f220799bbfd..f7d9358268c 100644
--- a/opcodes/frv-opc.c
+++ b/opcodes/frv-opc.c
@@ -2125,10 +2125,10 @@ static const CGEN_OPCODE frv_cgen_insn_opcode_table[MAX_INSNS] =
{ { MNEM, OP (PACK), ' ', '@', '(', OP (GRI), ',', OP (GRJ), ')', ',', OP (GRK), 0 } },
& ifmt_slass, { 0x800c0 }
},
-/* ld$pack @($GRi,$GRj),$GRk */
+/* ld$pack $ldann($GRi,$GRj),$GRk */
{
{ 0, 0, 0, 0 },
- { { MNEM, OP (PACK), ' ', '@', '(', OP (GRI), ',', OP (GRJ), ')', ',', OP (GRK), 0 } },
+ { { MNEM, OP (PACK), ' ', OP (LDANN), '(', OP (GRI), ',', OP (GRJ), ')', ',', OP (GRK), 0 } },
& ifmt_slass, { 0x80100 }
},
/* ldbf$pack @($GRi,$GRj),$FRintk */
@@ -2203,10 +2203,10 @@ static const CGEN_OPCODE frv_cgen_insn_opcode_table[MAX_INSNS] =
{ { MNEM, OP (PACK), ' ', '@', '(', OP (GRI), ',', OP (GRJ), ')', ',', OP (FRINTK), 0 } },
& ifmt_ldbf, { 0x80a80 }
},
-/* ldd$pack @($GRi,$GRj),$GRdoublek */
+/* ldd$pack $lddann($GRi,$GRj),$GRdoublek */
{
{ 0, 0, 0, 0 },
- { { MNEM, OP (PACK), ' ', '@', '(', OP (GRI), ',', OP (GRJ), ')', ',', OP (GRDOUBLEK), 0 } },
+ { { MNEM, OP (PACK), ' ', OP (LDDANN), '(', OP (GRI), ',', OP (GRJ), ')', ',', OP (GRDOUBLEK), 0 } },
& ifmt_ldd, { 0x80140 }
},
/* lddf$pack @($GRi,$GRj),$FRdoublek */
@@ -3691,10 +3691,10 @@ static const CGEN_OPCODE frv_cgen_insn_opcode_table[MAX_INSNS] =
{ { MNEM, OP (PACK), ' ', '@', '(', OP (GRI), ',', OP (GRJ), ')', 0 } },
& ifmt_jmpl, { 0x300000 }
},
-/* calll$pack @($GRi,$GRj) */
+/* calll$pack $callann($GRi,$GRj) */
{
{ 0, 0, 0, 0 },
- { { MNEM, OP (PACK), ' ', '@', '(', OP (GRI), ',', OP (GRJ), ')', 0 } },
+ { { MNEM, OP (PACK), ' ', OP (CALLANN), '(', OP (GRI), ',', OP (GRJ), ')', 0 } },
& ifmt_calll, { 0x2300000 }
},
/* jmpil$pack @($GRi,$s12) */
diff --git a/opcodes/frv-opc.h b/opcodes/frv-opc.h
index c0a52dc4169..8dc09545197 100644
--- a/opcodes/frv-opc.h
+++ b/opcodes/frv-opc.h
@@ -366,6 +366,7 @@ struct cgen_fields
long f_TLBPR_null;
long f_LI_off;
long f_LI_on;
+ long f_reloc_ann;
};
#define CGEN_INIT_PARSE(od) \