Contribute sh64-elf.
authorAlexandre Oliva <aoliva@redhat.com>
Fri, 8 Feb 2002 06:32:23 +0000 (06:32 +0000)
committerAlexandre Oliva <aoliva@redhat.com>
Fri, 8 Feb 2002 06:32:23 +0000 (06:32 +0000)
2002-02-08  Alexandre Oliva  <aoliva@redhat.com>
    Stephen Clarke <Stephen.Clarke@st.com>
* doc/c-sh64.texi: Fix citation of SH64 architecture manual.
2002-01-31  Alexandre Oliva  <aoliva@redhat.com>
* config/tc-sh.c (md_relax_table): Added default sizes for
non-PC-relative UNDEF_MOVI, and relaxation sequences for
MOVI_16, MOVI_32 and MOVI_48.
* config/tc-sh64.c (shmedia_md_apply_fix3): Fix warning.
(shmedia_md_convert_frag): Handle non-PC-relative UNDEF_MOVI
and MOVI_16.
(shmedia_md_estimate_size_before_relax): Remove redundant
blocks.  Set fragP->fr_var even if relaxation type unchanged.
Retain UNDEF_MOVI until expression decays to number.
2002-01-24  Alexandre Oliva  <aoliva@redhat.com>
* config/tc-sh64.c (shmedia_init_reloc): Handle new SHmedia PIC
relocation types.  Take fixP->fx_addnumber into account too.
(shmedia_md_apply_fix): Likewise.
(shmedia_md_convert_frag): Likewise.
(shmedia_build_Mytes): Likewise.
(sh64_consume_datalabel): Complain about nested datalabel.
Support PIC relocs.  Call sh_parse_name.
* config/tc-sh64.h (TC_RELOC_RTSYM_LOC_FIXUP): Extend definition
in tc-sh.h to SHmedia reloc types.
* config/tc-sh.c (SH64PCRELPLT, MOVI_PLT, MOVI_GOTOFF,
MOVI_GOTPC): New relaxation constants.
(md_relax_table): Introduce relaxation directives for PIC-related
constants.
(sh_PIC_related_p): Handle datalabel.
(sh_check_fixup): Choose SH5 PIC relocations.
(sh_cons_fix_new): Added BDF_RELOC_64.
(md_apply_fix3, sh_parse_name): Handle GOTPLT.
2002-01-18  Alexandre Oliva  <aoliva@redhat.com>
* config/tc-sh64.c (sh64_max_mem_for_rs_align_code): If the
current ISA is SHmedia, get 7 bytes.
2001-11-28  Nick Clifton  <nickc@cambridge.redhat.com>
* config/tc-sh.c (md_apply_fix3): Treat shmedia_md_apply_fix3 as a
void function.
* config/tc-sh64.c (shmedia_apply_fix): Rename to
shmedia_apply_fix3 and make void.
2001-05-17  Alexandre Oliva  <aoliva@redhat.com>
* config/tc-sh64.c (s_sh64_abi): Remove unused arguments passed to
as_bad.
2001-04-12  Alexandre Oliva  <aoliva@redhat.com>
* config/tc-sh64.h (md_parse_name): Take &c as argument.
2001-03-14  DJ Delorie <dj@redhat.com>
* doc/Makefile.am (CPU_DOCS): Added c-sh64.texi
* doc/Makefile.in(CPU_DOCS): Ditto.
* doc/c-sh64.texi: New file.
* doc/as.texinfo: Add SH64 support.
2001-03-13  DJ Delorie <dj@redhat.com>
* config/tc-sh64.c (shmedia_get_operands): Rename A_RESV_Fx to
A_REUSE_PREV so that its purpose is more obvious.
(shmedia_build_Mytes): Ditto.
2001-03-07  DJ Delorie <dj@redhat.com>
* config/tc-sh64.c (sh64_vtable_entry): New, strip datalabels
before processing.
(sh64_vtable_inherit): Ditto.
(strip_datalabels): New, strip "datalabel" from given line.
* config/tc-sh.c (md_pseudo_table): Add sh64-specific vtable
pseudos.
2001-03-06  Hans-Peter Nilsson <hpn@cygnus.com>
* config/tc-sh64.c (shmedia_md_assemble): Move dwarf2_emit_insn
call ...
(shmedia_build_Mytes): ... to here.
2001-03-06  DJ Delorie <dj@redhat.com>
* config/tc-sh.c: Remove sh64-specific uaquad now that there
is a generic one.
2001-01-21  Hans-Peter Nilsson <hpn@cygnus.com>
* config/tc-sh64.h (DWARF2_LINE_MIN_INSN_LENGTH): Override.
* config/tc-sh64.c (shmedia_md_assemble): Offset recorded insn
address by one in call to dwarf2_emit_insn.
2001-01-13  Hans-Peter Nilsson <hpn@cygnus.com>
Implement ".abi" pseudo and correct .cranges descriptors.  Correct
alignment handling broken by imported changes.
* config/tc-sh64.h (HANDLE_ALIGN): Override definition in tc-sh.h.
(sh64_handle_align): Declare.
(MAX_MEM_FOR_RS_ALIGN_CODE): Override definition in tc-sh.h.
(sh64_max_mem_for_rs_align_code): Declare.
(enum sh64_isa_values): Moved here from tc-sh64.c.
(md_do_align): Define.
(sh64_do_align): Declare.
(struct sh64_tc_frag_data): New.
(TC_FRAG_TYPE): Change to struct sh64_tc_frag_data.  Users
changed.
(TC_FRAG_INIT): Change to set new datatype.
(struct sh64_segment_info_type): Rename member
last_flushed_location to last_contents_mark.  All users changed.
(md_elf_section_change_hook, TC_CONS_FIX_NEW): Do not define.
(shmedia_elf_new_section, sh64_tc_cons_fix_new): Do not prototype.
* config/tc-sh.c (md_pseudo_table): Add ".abi".
(sh_elf_cons) [HAVE_SH64]: Call sh64_update_contents_mark instead
of unsetting seen_insn.
(md_assemble) [HAVE_SH64] <before new SHcompact sequence>: Also
call sh64_update_contents_mark.
(sh_handle_align): Remove HAVE_SH64-conditioned code.
* config/tc-sh64.c (sh64_isa_mode): Correct type from boolean to
enum sh64_isa_values.
(sh64_set_contents_type): Drop segT parameter. All callers changed.
(emitting_crange): Boolean guard moved to file scope from function
scope in sh64_set_contents_type.
(s_sh64_abi): New.
(sh64_update_contents_mark): New; most split out from
sh64_flush_pending_output.
(shmedia_md_end): Call sh64_update_contents_mark.  Set
sh64_isa_mode to sh64_isa_sh5_guard unless sh64_isa_unspecified.
(sh64_do_align): New function.
(sh64_max_mem_for_rs_align_code): New function.
(sh64_handle_align): Rename from shmedia_do_align.  Make
non-static.  Add head comment. Emit zero bytes for n bytes modulo
four.  Change return-type to void.
(shmedia_elf_new_section): Remove.
(shmedia_md_assemble): Call sh64_update_contents_mark.
(s_sh64_mode): Ditto.  Do not call md_flush_pending_output.  Make
new frag.  Call sh64_update_contents_mark after making the new
frag.
(sh64_flush_pending_output): Just call sh64_update_contents_mark
and sh_flush_pending_output.
(sh64_flag_output): Also call md_flush_pending_output, but add
condition on not emitting_crange.
(sh64_tc_cons_fix_new): Remove.
2001-01-12  Nick Clifton  <nickc@redhat.com>
* config/tc-sh64.c (shmedia_do_align): Fix to work with new
alignment handling scheme imported from sourceware.
2001-01-12  Hans-Peter Nilsson <hpn@cygnus.com>
* config/tc-sh64.h (TARGET_FORMAT): Define.
(sh64_target_format): Prototype.
* config/tc-sh64.c (sh64_target_mach): New function.
2001-01-07  Hans-Peter Nilsson <hpn@cygnus.com>
* config/tc-sh64.c (shmedia_md_end): When equating a symbol, use
zero_address_frag instead of copying the frag of the symbol.
(shmedia_frob_file_before_adjust): Ditto.
(shmedia_md_apply_fix) <case BFD_RELOC_SH_IMM_MEDLOW16>: Cast mask
to valueT to remove signedness.
(shmedia_md_convert_frag): Add parameter final.  Rename parameter
headers to output_bfd. Do not evaluate symbols if final is false;
do emit fixups.
(shmedia_md_estimate_size_before_relax) <case C (MOVI_IMM_32,
UNDEF_MOVI) et al>: If symbol cannot be modified to be PC-relative
to the current frag, call shmedia_md_convert_frag to emit fixups
and make frag_wane neutralize the frag.  Update comments.
* config/tc-sh.c (md_convert_frag): Change caller of
shmedia_md_convert_frag.
2001-01-06  Hans-Peter Nilsson <hpn@cygnus.com>
* config/tc-sh64.h: Tweak comments and correct formatting.
* config/tc-sh64.c: Ditto.
(shmedia_md_convert_frag) <PT/PTA/PTB 32, 48 and 64 bit
expansion, MOVI pcrel expansion>: Fix thinko calculating offset
for the no-relocation case.
(shmedia_check_limits): Fix range check being off-by-one for PTA.
* config/tc-sh.c: Ditto.  Add proper comments to #ifdef/#ifndef
wrappers.
(SH64PCREL16_F): Increment for proper max-PTA handling.  Update
comment.
(SH64PCREL16_M, MOVI_16_M): Correct range thinko.
(SH64PCREL48_M, MOVI_48_M): Similar; don't count in length of
expansion.
(SH64PCREL32_M, MOVI_32_M): Ditto; handle overflowing expression.
Correct comment.
2001-01-05  Hans-Peter Nilsson <hpn@cygnus.com>
* config/tc-sh64.c (shmedia_md_apply_fix) <second switch, case
BFD_RELOC_SH_PT_16>: Set lowest bit in field to be relocated to 1.
(shmedia_md_convert_frag) <case C (SH64PCREL16_32, SH64PCREL16) et
al>: Set lowest bit of field to relocate to 1 and rest to empty,
if reloc is emitted.
2000-12-31  Hans-Peter Nilsson <hpn@cygnus.com>
New options plus bugfixes.
* config/tc-sh.c (md_longopts): New options "-no-expand" and
"-expand-pt32".
(md_parse_option): Handle new options.
(md_show_usage): Add blurb for new options.
* config/tc-sh64.c (SHMEDIA_BFD_RELOC_PT): New macro.
(sh64_expand, sh64_pt32): New variables.
(shmedia_init_reloc): Handle BFD_RELOC_SH_PT_16.
(shmedia_md_apply_fix): Hold original fixP->fx_r_type in
orig_fx_r_type.  Change SHMEDIA_BFD_RELOC_PT into
BFD_RELOC_SH_PT_16.  Handle BFD_RELOC_SH_PT_16 as pc-relative.
<resolved previously-pc-relative relocs>: Handle
SHMEDIA_BFD_RELOC_PT and BFD_RELOC_SH_PT_16.
(shmedia_md_convert_frag) <case C (SH64PCREL16PT_64, SH64PCREL16),
case C (SH64PCREL16PT_32, SH64PCREL16)>: Modify to PTB if operand
points to SHcompact code.
<case C (SH64PCREL16_32, SH64PCREL16), case C (SH64PCREL16_64,
SH64PCREL16)>: Check that ISA of what operand points at and
PTA/PTB matches, or emit error.
(shmedia_check_limits): Handle BFD_RELOC_SH_PT_16 and
SHMEDIA_BFD_RELOC_PT.
(shmedia_immediate_op): If pcrel, emit fixup also for constant
operand.
(shmedia_build_Mytes) <case A_IMMS16>: Also check sh64_expand in
condition for MOVI expansion.
<case A_PCIMMS16BY4>: Handle expansion to 32 bits only, if
sh64_pt32.  Emit only a BFD_RELOC_SH_PT_16 fixup if not
sh64_expand.
<case A_PCIMMS16BY4_PT>: Likewise, but emit a SHMEDIA_BFD_RELOC_PT
fixup.
(sh64_target_format): Error-check setting of sh64_pt32 and
sh64_expand.  Fix typo in check for sh64_shcompact_const_crange.
(shmedia_md_pcrel_from_section): Handle BFD_RELOC_SH_PT_16 and
SHMEDIA_BFD_RELOC_PT as coming from SHmedia code.
2000-12-31  Hans-Peter Nilsson <hpn@cygnus.com>
* config/tc-sh64.c: Improve comments.
(shmedia_md_convert_frag): Remove inactive is_pt_variant code. Do
not say the linker will check correctness of PTA/PTB expansion.
(shmedia_md_end): Make non-static.
* config/tc-sh64.h (md_end): Define to shmedia_md_end. Add
prototype.
* config/tc-sh.c (sh_finalize): Remove.
* config/tc-sh.h (md_end): Do not define.
Remove prototype for sh_finalize.
2000-12-30  Hans-Peter Nilsson <hpn@cygnus.com>
* config/tc-sh64.c (shmedia_frob_section_type): Use a struct
sh64_section_data container when storing section type in tdata
field in elf_section_data.
* config/tc-sh.c (sh_elf_final_processing): Change from EF_SH64 to
EF_SH5.
* Makefile.am: Update dependencies.
* Makefile.in: Regenerate.
2000-12-22  Hans-Peter Nilsson <hpn@cygnus.com>
* config/tc-sh64.c (shmedia_md_assemble): Don't protect
dwarf2_emit_insn call with test on debug_type.
2000-12-19  Hans-Peter Nilsson <hpn@cygnus.com>
* config/tc-sh64.c (sh64_set_contents_type): Make contents-type
CRT_SH5_ISA32 sticky for 64-bit.
2000-12-18  Hans-Peter Nilsson <hpn@cygnus.com>
Generate .crange sections when switching ISA mode or emitting
constants in same section as code.
* config/tc-sh64.c: Reformat structure definitions.
(sh64_end_of_assembly, sh64_mix, sh64_shcompact_const_crange): New
variables.
(sh64_set_contents_type): Rename from sh64_init_section.  Rewrite
to emit a .cranges descriptor when contents type changes.  Only
emit error if changing contents type and -no-mix is in effect.
(sh64_emit_crange, sh64_flush_last_crange, sh64_flag_output,
sh64_flush_pending_output, sh64_tc_cons_fix_new): New functions.
(shmedia_md_end): Set sh64_end_of_assembly.  Pass
sh64_flush_last_crange over sections.
When checking main symbol of datalabel symbol, check for
STO_SH5_ISA32, not ISA type of section in definition.
(shmedia_frob_file_before_adjust): Check main symbol for
STO_SH5_ISA32; don't check ISA type of section in definition.
(shmedia_frob_section_type): Adjust for .cranges; set section flag
to SHF_SH5_ISA32_MIXED or SHF_SH5_ISA32 according to whether
.cranges entries have been output.
(shmedia_elf_new_section): Just call md_flush_pending_output.
(shmedia_md_assemble): Do not emit a BFD_RELOC_SH_SHMEDIA_CODE
fix.  Do not set tc_segment_info_data.in_code for section.  Call
sh64_set_contents_type for SHmedia code.
(s_sh64_mode): Do not call sh64_init_section or set seen_insn to
false. Call md_flush_pending_output.
(sh64_target_format): Check that -no-mix and
-shcompact-const-crange are used in sane combination with other
options.
(shmedia_md_pcrel_from_section): Check type of fix for how to
adjust pc-relative.
(sh64_consume_datalabel): Check symbol for having STO_SH5_ISA32,
not ISA type of section in definition.
* config/tc-sh64.h (struct sh64_segment_info_type): Rewrite to
hold contents-type state.
(md_flush_pending_output): Redefine to sh64_flush_pending_output.
(sh64_flush_pending_output): Declare.
(TC_CONS_FIX_NEW): Define to sh64_tc_cons_fix_new.
(sh64_tc_cons_fix_new): Declare.
* config/tc-sh.c (sh_elf_cons) [HAVE_SH64]: Unset seen_insn and
call sh64_flag_output.
(md_assemble) [HAVE_SH64]: Do not emit BFD_RELOC_SH_CODE.  Just
call sh64_set_contents_type to mark SHcompact code and set
seen_insn.
(md_longopts): New options "-no-mix" and
"-shcompact-const-crange".
(md_parse_option): Handle new options.
(md_show_usage): Add blurb for new options.
(md_number_to_chars) [HAVE_SH64]: Call sh64_flag_output.
2000-12-15  Hans-Peter Nilsson <hpn@cygnus.com>
* config/tc-sh64.c: Delete investigated and obsolete fixme:s.
(sh64_last_insn_frag): New.
(shmedia_md_convert_frag): Use tc_frag_data field of incoming frag
to get frag for insn opcode for generating fixups; do not assume it
is the same frag.
(shmedia_build_Mytes): Set sh64_last_insn_frag after growing frag
for new insn.
* config/tc-sh64.h (ELF_TC_SPECIAL_SECTIONS): Define for .cranges
section.
(TC_FRAG_TYPE): Define as fragS *.
(TC_FRAG_INIT): Define to set tc_frag_data to sh64_last_insn_frag.
(sh64_last_insn_frag): Declare.
(sh64_consume_datalabel): Fix typo; check for seginfo != NULL,
not == NULL before dereferencing.
2000-12-12  Hans-Peter Nilsson <hpn@cygnus.com>
Get rid of BFD section flag and EF_SH64_ABI64.
* config/tc-sh64.c (shmedia_frob_section_type): Use
elf_section_data (sec)->tdata, not a specific BFD section flag, to
communicate the section as containing SHmedia code.  Describe why.
* config/tc-sh.c (sh_elf_final_processing): Tweak comment.  Set
EF_SH64 regardless of ABI.
* config/tc-sh64.c (shmedia_md_apply_fix): Decapitalize "invalid"
in error message.  Handle resolved expressions for
BFD_RELOC_SH_IMMS10, BFD_RELOC_SH_IMMS10BY2,
BFD_RELOC_SH_IMMS10BY4 and BFD_RELOC_64.
(shmedia_check_limits): Handle BFD_RELOC_64.
(sh64_adjust_symtab): Do not decrement the GAS symbol value for
a STO_SH5_ISA32 symbol, only the BFD value.
2000-12-11  Ben Elliston  <bje@redhat.com>
* config/tc-sh64.c: Call dwarf2_emit_insn, not the defunct
dwarf2_generate_asm_lineno.
2000-12-11  Hans-Peter Nilsson <hpn@cygnus.com>
Handle PC-relative MOVI expansions with assembler relaxation.
Generate PC-relative relocs from 16-bit PC-relative expressions.
* config/tc-sh64.c (SHMEDIA_MD_PCREL_FROM_FIX): Break out from...
(shmedia_md_pcrel_from_section): ...here.
(shmedia_md_apply_fix): Handle fixups for 16-bit operands that has
turned completely resolved.  Adjust relocation type for 16-bit
immediate operands that has turned PC-relative.  Adjust back for
MD_PCREL_FROM_SECTION being applied twice.
(shmedia_md_convert_frag): Always emit reloc for expression with
global or weak symbol. Handle relaxation result for PC-relative
expressions.
(shmedia_md_estimate_size_before_relax): An expression with a weak
or global symbol can not be relaxed.  Break out tests for
relaxable symbol into variable sym_relaxable.
<cases C (MOVI_IMM_64, UNDEF_MOVI) and C (MOVI_IMM_32,
UNDEF_MOVI)>: Break out any PC-relative expression and change
relaxation type.
(shmedia_build_Mytes): CSE &operands->operands[j] into variable
opjp.
<case A_IMMS16>: Fix typo for initial minor relaxation type of
MOVI expansion.  If X_op_symbol of the immediate expression is
set, make an expression symbol for the argument to frag_var.
* config/tc-sh.c (MOVI_IMM_32_PCREL, MOVI_IMM_64_PCREL): New
relaxations.
(END): Adjust for new relaxations.
(md_relax_table): Add entries for new relaxations.
2000-12-07  Ben Elliston  <bje@redhat.com>
* config/tc-sh64.c (shmedia_parse_reg): Initialize variable len.
2000-12-07  Hans-Peter Nilsson <hpn@cygnus.com>
* config/tc-sh64.c (shmedia_md_convert_frag): Correct all MOVI and
SHORI operand offsets in PT/PTA/PTB expansions.
2000-12-05  Hans-Peter Nilsson <hpn@cygnus.com>
Implement DataLabel semantics.
* config/tc-sh.c (sh_frob_file) [HAVE_SH64]: Call
shmedia_frob_file_before_adjust.
* config/tc-sh64.c [! OBJ_ELF]: Emit #error.
(DATALABEL_SUFFIX): Define.
(shmedia_md_end) <before adjusting STO_SH5_ISA32 symbols>: Walk
symbol list to update "datalabel" symbols to their main symbol
counterparts.
(shmedia_frob_file_before_adjust): New.
(sh64_adjust_symtab): For remaining datalabel symbols, set to
undefined and set STT_DATALABEL.
(sh64_frob_label): Initialize TC symbol field.
(sh64_consume_datalabel): Actually implement semantics.  New
parameter operandf, call it instead of expression.
(sh64_exclude_symbol): New.
* config/tc-sh64.h (md_parse_name): Pass on the function operand
to sh64_consume_datalabel.
(tc_symbol_new_hook): Define to tc_frob_symbol.
(TC_SYMFIELD_TYPE): Define to symbolS *.
(tc_frob_symbol): Define to call sh64_exclude_symbol.
2000-12-01  Hans-Peter Nilsson <hpn@cygnus.com>
* config/tc-sh64.c (shmedia_init_reloc): Tweak comment for default
case.
(shmedia_md_assemble): Call dwarf2_generate_asm_lineno if
generating dwarf2 debug information.
2000-11-30  Hans-Peter Nilsson <hpn@cygnus.com>
* config/tc-sh64.c (sh64_target_format): Use elf64-sh64l and
elf64-sh64 for the 64-bit ABI.
* config/tc-sh.c (md_show_usage): Tweak usage output for -abi=*
option.
2000-11-29  Hans-Peter Nilsson <hpn@cygnus.com>
* config/tc-sh.c: Remove conditionalizing on HAVE_SH64 for
case-insensitivity.
2000-11-27  Hans-Peter Nilsson <hpn@cygnus.com>
* config/tc-sh64.c: Tweak comments, formatting and error messages.
(enum sh64_abi_values): New type.
(enum sh64_isa_values): New type.
(sh64_isa_mode): Replace shmedia_mode. All referers changed.
(seen_shcompact_mode, seen_shmedia_mode): Delete.
(sh64_abi): Replace shmedia_64.
(shmedia_md_convert_frag) <C (MOVI_IMM_64, MOVI_64),
C (MOVI_IMM_32, MOVI_32)>: Correct register number handling.
(s_sh64_mode): Check validity for this target.
(sh64_target_format): Initialize defaults for ISA and ABI.
Fallback to old object format if no SH64 ISA or ABI has been
specified.
* config/tc-sh.c (md_parse_option): Check combinations for errors.
(sh_elf_final_processing): Change to have EF_SH64_ABI64 for 64-bit
ABI and EF_SH64 for 32-bit ABI, if SH64 options are specified.
* config/tc-sh64.h: Fix typo in comment.
2000-11-25  Hans-Peter Nilsson <hpn@cygnus.com>
* config/tc-sh64.c (shmedia_md_estimate_size_before_relax)
<PT fixups for absolute values>: Size will be longest, not
shortest.
(shmedia_md_convert_frag): Disable PTB-warning machinery.  Correct
all MOVI and SHORI operand offsets in PT/PTA/PTB expansions.
* config/tc-sh.c (parse_reg) [HAVE_SH64]: Add local variables l0
and l1 to hold lowercase of two first characters.  Change all
remaining TO_LOWER to tolower.
* config/tc-sh64.c (TO_LOWER): Delete.
(shmedia_find_cooked_opcode): Use tolower, not TO_LOWER.
(md_parse_name): Define.
(sh64_consume_datalabel): Declare.
(DOLLAR_DOT): Define.
* config/tc-sh64.c (shmedia_parse_exp): New.
(sh64_consume_datalabel): New; just ignoring datalabel semantics.
(shmedia_parse_reg): Remove const from src
parameter.
(shmedia_get_operands): Ditto for args parameter and ptr variable.
(shmedia_md_assemble): Ditto for op_end variable.
(shmedia_get_operand): Ditto for ptr parameter and src variable.
Use shmedia_parse_exp, not parse_exp.
* config/tc-sh64.c (shmedia_parse_reg): Add shmedia_arg_type
parameter.  All callers changed.
(shmedia_get_operand): Add shmedia_arg_type parameter. All
callers changed.
(shmedia_parse_reg): Put first two character in local variables.
Use tolower, not TO_LOWER.  If no register is found and argtype
indicates a control register, scan shmedia_creg_table
case-insensitive.
2000-11-24  Hans-Peter Nilsson <hpn@cygnus.com>
* Makefile.am (CPU_TYPES): Add sh64.
(TARGET_CPU_CFILES): Add config/tc-sh64.c.
(TARGET_CPU_HFILES): Add config/tc-sh64.h.
Regenerate dependencies.
* Makefile.in: Regenerate.
* configure.in: Add support for sh64-*-elf*.
* configure: Regenerate.
* config/tc-sh64.h: New.
* config/tc-sh64.c: New.
* config/tc-sh.c (md_pseudo_table) [HAVE_SH64]: New pseudos
.mode, .isa and .uaquad.
[HAVE_SH64] (SH64PCREL16_32, SH64PCREL16_64, SH64PCREL16PT_32,
SH64PCREL16PT_64, MOVI_IMM_32, MOVI_IMM_64): Define.
[HAVE_SH64] (END): Define as 10.
[HAVE_SH64] (UNDEF_SH64PCREL, SH64PCREL16, SH64PCREL32,
SH64PCREL48, SH64PCREL64, UNDEF_MOVI, MOVI_16, MOVI_32, MOVI_48,
MOVI_64): Define.
[HAVE_SH64] (SH64PCREL16_F, SH64PCREL16_M, SH64PCREL16_LENGTH,
SH64PCREL32_F, SH64PCREL32_M, SH64PCREL32_LENGTH, SH64PCREL48_F,
SH64PCREL48_M, SH64PCREL48_LENGTH, SH64PCREL64_LENGTH,
MOVI_16_LENGTH, MOVI_32_LENGTH, MOVI_48_LENGTH, MOVI_64_LENGTH):
Define.
(md_relax_table) [HAVE_SH64]: Provide relaxations for SHmedia.
(md_begin) [HAVE_SH64]: Call shmedia_md_begin.
(parse_reg) [HAVE_SH64]: Parse register names case-insensitive.
(md_assemble) [HAVE_SH64]: Call shmedia_md_assemble if assembling
SHmedia instructions.  Handle state-change after switching to
SHcompact.
(md_longopts) [HAVE_SH64]: New options --isa=* and --abi=*.
(md_parse_option) [HAVE_SH64]: Parse new options.
(md_show_usage) [HAVE_SH64]: Show usage of new options.
(md_convert_frag) [HAVE_SH64] <default>: Call
shmedia_md_convert_frag instead of abort.
(sh_force_relocation) [HAVE_SH64]: Also force relocation for
BFD_RELOC_SH_SHMEDIA_CODE.
(sh_elf_final_processing) [HAVE_SH64]: Set flags identifying
SHcompact or SHmedia code.
(md_apply_fix) [HAVE_SH64] <default>: Return result from calling
shmedia_md_apply_fix instead of abort.
(md_estimate_size_before_relax) [HAVE_SH64] <default>: Return
result from calling shmedia_md_estimate_size_before_relax instead
of calling abort.
(sh_do_align) [HAVE_SH64]: If shmedia_mode, let shmedia_do_align
do the work.
(tc_gen_reloc) [HAVE_SH64]: For unrecognized relocs, call
shmedia_init_reloc and do nothing more if it returns non-zero.
(sh_finalize) [HAVE_SH64]: Call shmedia_md_end.
* po/POTFILES.in: Regenerate.
* po/gas.pot: Regenerate.

15 files changed:
gas/ChangeLog
gas/Makefile.am
gas/Makefile.in
gas/aclocal.m4
gas/config/tc-sh.c
gas/config/tc-sh64.c [new file with mode: 0644]
gas/config/tc-sh64.h [new file with mode: 0644]
gas/configure
gas/configure.in
gas/doc/Makefile.am
gas/doc/Makefile.in
gas/doc/as.texinfo
gas/doc/c-sh64.texi [new file with mode: 0644]
gas/po/POTFILES.in
gas/po/gas.pot

index 944108b8b05ce9e27252ed7ed3e65739f26a3846..080de45398958134198794c9c5aef2f8fea2970a 100644 (file)
@@ -1,3 +1,474 @@
+2002-02-08  Alexandre Oliva  <aoliva@redhat.com>
+
+       Contribute sh64-elf.
+       2002-02-08  Alexandre Oliva  <aoliva@redhat.com>
+                   Stephen Clarke <Stephen.Clarke@st.com>
+       * doc/c-sh64.texi: Fix citation of SH64 architecture manual.
+       2002-01-31  Alexandre Oliva  <aoliva@redhat.com>
+       * config/tc-sh.c (md_relax_table): Added default sizes for
+       non-PC-relative UNDEF_MOVI, and relaxation sequences for
+       MOVI_16, MOVI_32 and MOVI_48.
+       * config/tc-sh64.c (shmedia_md_apply_fix3): Fix warning.
+       (shmedia_md_convert_frag): Handle non-PC-relative UNDEF_MOVI
+       and MOVI_16.
+       (shmedia_md_estimate_size_before_relax): Remove redundant
+       blocks.  Set fragP->fr_var even if relaxation type unchanged.
+       Retain UNDEF_MOVI until expression decays to number.
+       2002-01-24  Alexandre Oliva  <aoliva@redhat.com>
+       * config/tc-sh64.c (shmedia_init_reloc): Handle new SHmedia PIC
+       relocation types.  Take fixP->fx_addnumber into account too.
+       (shmedia_md_apply_fix): Likewise.
+       (shmedia_md_convert_frag): Likewise.
+       (shmedia_build_Mytes): Likewise.
+       (sh64_consume_datalabel): Complain about nested datalabel.
+       Support PIC relocs.  Call sh_parse_name.
+       * config/tc-sh64.h (TC_RELOC_RTSYM_LOC_FIXUP): Extend definition
+       in tc-sh.h to SHmedia reloc types.
+       * config/tc-sh.c (SH64PCRELPLT, MOVI_PLT, MOVI_GOTOFF,
+       MOVI_GOTPC): New relaxation constants.
+       (md_relax_table): Introduce relaxation directives for PIC-related
+       constants.
+       (sh_PIC_related_p): Handle datalabel.
+       (sh_check_fixup): Choose SH5 PIC relocations.
+       (sh_cons_fix_new): Added BDF_RELOC_64.
+       (md_apply_fix3, sh_parse_name): Handle GOTPLT.
+       2002-01-18  Alexandre Oliva  <aoliva@redhat.com>
+       * config/tc-sh64.c (sh64_max_mem_for_rs_align_code): If the
+       current ISA is SHmedia, get 7 bytes.
+       2001-11-28  Nick Clifton  <nickc@cambridge.redhat.com>
+       * config/tc-sh.c (md_apply_fix3): Treat shmedia_md_apply_fix3 as a
+       void function.
+       * config/tc-sh64.c (shmedia_apply_fix): Rename to
+       shmedia_apply_fix3 and make void.
+       2001-05-17  Alexandre Oliva  <aoliva@redhat.com>
+       * config/tc-sh64.c (s_sh64_abi): Remove unused arguments passed to
+       as_bad.
+       2001-04-12  Alexandre Oliva  <aoliva@redhat.com>
+       * config/tc-sh64.h (md_parse_name): Take &c as argument.
+       2001-03-14  DJ Delorie  <dj@redhat.com>
+       * doc/Makefile.am (CPU_DOCS): Added c-sh64.texi
+       * doc/Makefile.in(CPU_DOCS): Ditto.
+       * doc/c-sh64.texi: New file.
+       * doc/as.texinfo: Add SH64 support.
+       2001-03-13  DJ Delorie  <dj@redhat.com>
+       * config/tc-sh64.c (shmedia_get_operands): Rename A_RESV_Fx to
+       A_REUSE_PREV so that its purpose is more obvious.
+       (shmedia_build_Mytes): Ditto.
+       2001-03-07  DJ Delorie  <dj@redhat.com>
+       * config/tc-sh64.c (sh64_vtable_entry): New, strip datalabels
+       before processing.
+       (sh64_vtable_inherit): Ditto.
+       (strip_datalabels): New, strip "datalabel" from given line.
+       * config/tc-sh.c (md_pseudo_table): Add sh64-specific vtable
+       pseudos.
+       2001-03-06  Hans-Peter Nilsson  <hpn@cygnus.com>
+       * config/tc-sh64.c (shmedia_md_assemble): Move dwarf2_emit_insn
+       call ...
+       (shmedia_build_Mytes): ... to here.
+       2001-03-06  DJ Delorie  <dj@redhat.com>
+       * config/tc-sh.c: Remove sh64-specific uaquad now that there
+       is a generic one.
+       2001-01-21  Hans-Peter Nilsson  <hpn@cygnus.com>
+       * config/tc-sh64.h (DWARF2_LINE_MIN_INSN_LENGTH): Override.
+       * config/tc-sh64.c (shmedia_md_assemble): Offset recorded insn
+       address by one in call to dwarf2_emit_insn.
+       2001-01-13  Hans-Peter Nilsson  <hpn@cygnus.com>
+       Implement ".abi" pseudo and correct .cranges descriptors.  Correct
+       alignment handling broken by imported changes.
+       * config/tc-sh64.h (HANDLE_ALIGN): Override definition in tc-sh.h.
+       (sh64_handle_align): Declare.
+       (MAX_MEM_FOR_RS_ALIGN_CODE): Override definition in tc-sh.h.
+       (sh64_max_mem_for_rs_align_code): Declare.
+       (enum sh64_isa_values): Moved here from tc-sh64.c.
+       (md_do_align): Define.
+       (sh64_do_align): Declare.
+       (struct sh64_tc_frag_data): New.
+       (TC_FRAG_TYPE): Change to struct sh64_tc_frag_data.  Users
+       changed.
+       (TC_FRAG_INIT): Change to set new datatype.
+       (struct sh64_segment_info_type): Rename member
+       last_flushed_location to last_contents_mark.  All users changed.
+       (md_elf_section_change_hook, TC_CONS_FIX_NEW): Do not define.
+       (shmedia_elf_new_section, sh64_tc_cons_fix_new): Do not prototype.
+       * config/tc-sh.c (md_pseudo_table): Add ".abi".
+       (sh_elf_cons) [HAVE_SH64]: Call sh64_update_contents_mark instead
+       of unsetting seen_insn.
+       (md_assemble) [HAVE_SH64] <before new SHcompact sequence>: Also
+       call sh64_update_contents_mark.
+       (sh_handle_align): Remove HAVE_SH64-conditioned code.
+       * config/tc-sh64.c (sh64_isa_mode): Correct type from boolean to
+       enum sh64_isa_values.
+       (sh64_set_contents_type): Drop segT parameter.  All callers changed.
+       (emitting_crange): Boolean guard moved to file scope from function
+       scope in sh64_set_contents_type.
+       (s_sh64_abi): New.
+       (sh64_update_contents_mark): New; most split out from
+       sh64_flush_pending_output.
+       (shmedia_md_end): Call sh64_update_contents_mark.  Set
+       sh64_isa_mode to sh64_isa_sh5_guard unless sh64_isa_unspecified.
+       (sh64_do_align): New function.
+       (sh64_max_mem_for_rs_align_code): New function.
+       (sh64_handle_align): Rename from shmedia_do_align.  Make
+       non-static.  Add head comment.  Emit zero bytes for n bytes modulo
+       four.  Change return-type to void.
+       (shmedia_elf_new_section): Remove.
+       (shmedia_md_assemble): Call sh64_update_contents_mark.
+       (s_sh64_mode): Ditto.  Do not call md_flush_pending_output.  Make
+       new frag.  Call sh64_update_contents_mark after making the new
+       frag.
+       (sh64_flush_pending_output): Just call sh64_update_contents_mark
+       and sh_flush_pending_output.
+       (sh64_flag_output): Also call md_flush_pending_output, but add
+       condition on not emitting_crange.
+       (sh64_tc_cons_fix_new): Remove.
+       2001-01-12  Nick Clifton  <nickc@redhat.com>
+       * config/tc-sh64.c (shmedia_do_align): Fix to work with new
+       alignment handling scheme imported from sourceware.
+       2001-01-12  Hans-Peter Nilsson  <hpn@cygnus.com>
+       * config/tc-sh64.h (TARGET_FORMAT): Define.
+       (sh64_target_format): Prototype.
+       * config/tc-sh64.c (sh64_target_mach): New function.
+       2001-01-07  Hans-Peter Nilsson  <hpn@cygnus.com>
+       * config/tc-sh64.c (shmedia_md_end): When equating a symbol, use
+       zero_address_frag instead of copying the frag of the symbol.
+       (shmedia_frob_file_before_adjust): Ditto.
+       (shmedia_md_apply_fix) <case BFD_RELOC_SH_IMM_MEDLOW16>: Cast mask
+       to valueT to remove signedness.
+       (shmedia_md_convert_frag): Add parameter final.  Rename parameter
+       headers to output_bfd.  Do not evaluate symbols if final is false;
+       do emit fixups.
+       (shmedia_md_estimate_size_before_relax) <case C (MOVI_IMM_32,
+       UNDEF_MOVI) et al>: If symbol cannot be modified to be PC-relative
+       to the current frag, call shmedia_md_convert_frag to emit fixups
+       and make frag_wane neutralize the frag.  Update comments.
+       * config/tc-sh.c (md_convert_frag): Change caller of
+       shmedia_md_convert_frag.
+       2001-01-06  Hans-Peter Nilsson  <hpn@cygnus.com>
+       * config/tc-sh64.h: Tweak comments and correct formatting.
+       * config/tc-sh64.c: Ditto.
+       (shmedia_md_convert_frag) <PT/PTA/PTB 32, 48 and 64 bit
+       expansion, MOVI pcrel expansion>: Fix thinko calculating offset
+       for the no-relocation case.
+       (shmedia_check_limits): Fix range check being off-by-one for PTA.
+       * config/tc-sh.c: Ditto.  Add proper comments to #ifdef/#ifndef
+       wrappers.
+       (SH64PCREL16_F): Increment for proper max-PTA handling.  Update
+       comment.
+       (SH64PCREL16_M, MOVI_16_M): Correct range thinko.
+       (SH64PCREL48_M, MOVI_48_M): Similar; don't count in length of
+       expansion.
+       (SH64PCREL32_M, MOVI_32_M): Ditto; handle overflowing expression.
+       Correct comment.
+       2001-01-05  Hans-Peter Nilsson  <hpn@cygnus.com>
+       * config/tc-sh64.c (shmedia_md_apply_fix) <second switch, case
+       BFD_RELOC_SH_PT_16>: Set lowest bit in field to be relocated to 1.
+       (shmedia_md_convert_frag) <case C (SH64PCREL16_32, SH64PCREL16) et
+       al>: Set lowest bit of field to relocate to 1 and rest to empty,
+       if reloc is emitted. 
+       2000-12-31  Hans-Peter Nilsson  <hpn@cygnus.com>
+       New options plus bugfixes.
+       * config/tc-sh.c (md_longopts): New options "-no-expand" and
+       "-expand-pt32".
+       (md_parse_option): Handle new options.
+       (md_show_usage): Add blurb for new options.
+       * config/tc-sh64.c (SHMEDIA_BFD_RELOC_PT): New macro.
+       (sh64_expand, sh64_pt32): New variables.
+       (shmedia_init_reloc): Handle BFD_RELOC_SH_PT_16.
+       (shmedia_md_apply_fix): Hold original fixP->fx_r_type in
+       orig_fx_r_type.  Change SHMEDIA_BFD_RELOC_PT into
+       BFD_RELOC_SH_PT_16.  Handle BFD_RELOC_SH_PT_16 as pc-relative.
+       <resolved previously-pc-relative relocs>: Handle
+       SHMEDIA_BFD_RELOC_PT and BFD_RELOC_SH_PT_16.
+       (shmedia_md_convert_frag) <case C (SH64PCREL16PT_64, SH64PCREL16),
+       case C (SH64PCREL16PT_32, SH64PCREL16)>: Modify to PTB if operand
+       points to SHcompact code.
+       <case C (SH64PCREL16_32, SH64PCREL16), case C (SH64PCREL16_64,
+       SH64PCREL16)>: Check that ISA of what operand points at and
+       PTA/PTB matches, or emit error.
+       (shmedia_check_limits): Handle BFD_RELOC_SH_PT_16 and
+       SHMEDIA_BFD_RELOC_PT.
+       (shmedia_immediate_op): If pcrel, emit fixup also for constant
+       operand.
+       (shmedia_build_Mytes) <case A_IMMS16>: Also check sh64_expand in
+       condition for MOVI expansion.
+       <case A_PCIMMS16BY4>: Handle expansion to 32 bits only, if
+       sh64_pt32.  Emit only a BFD_RELOC_SH_PT_16 fixup if not
+       sh64_expand.
+       <case A_PCIMMS16BY4_PT>: Likewise, but emit a SHMEDIA_BFD_RELOC_PT
+       fixup.
+       (sh64_target_format): Error-check setting of sh64_pt32 and
+       sh64_expand.  Fix typo in check for sh64_shcompact_const_crange.
+       (shmedia_md_pcrel_from_section): Handle BFD_RELOC_SH_PT_16 and
+       SHMEDIA_BFD_RELOC_PT as coming from SHmedia code.
+       2000-12-31  Hans-Peter Nilsson  <hpn@cygnus.com>
+       * config/tc-sh64.c: Improve comments.
+       (shmedia_md_convert_frag): Remove inactive is_pt_variant code.  Do
+       not say the linker will check correctness of PTA/PTB expansion.
+       (shmedia_md_end): Make non-static.
+       * config/tc-sh64.h (md_end): Define to shmedia_md_end.  Add
+       prototype.
+       * config/tc-sh.c (sh_finalize): Remove.
+       * config/tc-sh.h (md_end): Do not define.
+       Remove prototype for sh_finalize.
+       2000-12-30  Hans-Peter Nilsson  <hpn@cygnus.com>
+       * config/tc-sh64.c (shmedia_frob_section_type): Use a struct
+       sh64_section_data container when storing section type in tdata
+       field in elf_section_data.
+       * config/tc-sh.c (sh_elf_final_processing): Change from EF_SH64 to
+       EF_SH5.
+       * Makefile.am: Update dependencies.
+       * Makefile.in: Regenerate.
+       2000-12-22  Hans-Peter Nilsson  <hpn@cygnus.com>
+       * config/tc-sh64.c (shmedia_md_assemble): Don't protect
+       dwarf2_emit_insn call with test on debug_type.
+       2000-12-19  Hans-Peter Nilsson  <hpn@cygnus.com>
+       * config/tc-sh64.c (sh64_set_contents_type): Make contents-type
+       CRT_SH5_ISA32 sticky for 64-bit.
+       2000-12-18  Hans-Peter Nilsson  <hpn@cygnus.com>
+       Generate .crange sections when switching ISA mode or emitting
+       constants in same section as code.
+       * config/tc-sh64.c: Reformat structure definitions.
+       (sh64_end_of_assembly, sh64_mix, sh64_shcompact_const_crange): New
+       variables.
+       (sh64_set_contents_type): Rename from sh64_init_section.  Rewrite
+       to emit a .cranges descriptor when contents type changes.  Only
+       emit error if changing contents type and -no-mix is in effect.
+       (sh64_emit_crange, sh64_flush_last_crange, sh64_flag_output,
+       sh64_flush_pending_output, sh64_tc_cons_fix_new): New functions.
+       (shmedia_md_end): Set sh64_end_of_assembly.  Pass
+       sh64_flush_last_crange over sections.
+       When checking main symbol of datalabel symbol, check for
+       STO_SH5_ISA32, not ISA type of section in definition.
+       (shmedia_frob_file_before_adjust): Check main symbol for
+       STO_SH5_ISA32; don't check ISA type of section in definition.
+       (shmedia_frob_section_type): Adjust for .cranges; set section flag
+       to SHF_SH5_ISA32_MIXED or SHF_SH5_ISA32 according to whether
+       .cranges entries have been output.
+       (shmedia_elf_new_section): Just call md_flush_pending_output.
+       (shmedia_md_assemble): Do not emit a BFD_RELOC_SH_SHMEDIA_CODE
+       fix.  Do not set tc_segment_info_data.in_code for section.  Call
+       sh64_set_contents_type for SHmedia code.
+       (s_sh64_mode): Do not call sh64_init_section or set seen_insn to
+       false.  Call md_flush_pending_output.
+       (sh64_target_format): Check that -no-mix and
+       -shcompact-const-crange are used in sane combination with other
+       options.
+       (shmedia_md_pcrel_from_section): Check type of fix for how to
+       adjust pc-relative.
+       (sh64_consume_datalabel): Check symbol for having STO_SH5_ISA32,
+       not ISA type of section in definition.
+       * config/tc-sh64.h (struct sh64_segment_info_type): Rewrite to
+       hold contents-type state.
+       (md_flush_pending_output): Redefine to sh64_flush_pending_output.
+       (sh64_flush_pending_output): Declare.
+       (TC_CONS_FIX_NEW): Define to sh64_tc_cons_fix_new.
+       (sh64_tc_cons_fix_new): Declare.
+       * config/tc-sh.c (sh_elf_cons) [HAVE_SH64]: Unset seen_insn and
+       call sh64_flag_output.
+       (md_assemble) [HAVE_SH64]: Do not emit BFD_RELOC_SH_CODE.  Just
+       call sh64_set_contents_type to mark SHcompact code and set
+       seen_insn.
+       (md_longopts): New options "-no-mix" and
+       "-shcompact-const-crange".
+       (md_parse_option): Handle new options.
+       (md_show_usage): Add blurb for new options.
+       (md_number_to_chars) [HAVE_SH64]: Call sh64_flag_output.
+       2000-12-15  Hans-Peter Nilsson  <hpn@cygnus.com>
+       * config/tc-sh64.c: Delete investigated and obsolete fixme:s.
+       (sh64_last_insn_frag): New.
+       (shmedia_md_convert_frag): Use tc_frag_data field of incoming frag
+       to get frag for insn opcode for generating fixups; do not assume it
+       is the same frag.
+       (shmedia_build_Mytes): Set sh64_last_insn_frag after growing frag
+       for new insn.
+       * config/tc-sh64.h (ELF_TC_SPECIAL_SECTIONS): Define for .cranges
+       section.
+       (TC_FRAG_TYPE): Define as fragS *.
+       (TC_FRAG_INIT): Define to set tc_frag_data to sh64_last_insn_frag.
+       (sh64_last_insn_frag): Declare.
+       (sh64_consume_datalabel): Fix typo; check for seginfo != NULL,
+       not == NULL before dereferencing.
+       2000-12-12  Hans-Peter Nilsson  <hpn@cygnus.com>
+       Get rid of BFD section flag and EF_SH64_ABI64.
+       * config/tc-sh64.c (shmedia_frob_section_type): Use
+       elf_section_data (sec)->tdata, not a specific BFD section flag, to
+       communicate the section as containing SHmedia code.  Describe why.
+       * config/tc-sh.c (sh_elf_final_processing): Tweak comment.  Set
+       EF_SH64 regardless of ABI.
+       * config/tc-sh64.c (shmedia_md_apply_fix): Decapitalize "invalid"
+       in error message.  Handle resolved expressions for
+       BFD_RELOC_SH_IMMS10, BFD_RELOC_SH_IMMS10BY2,
+       BFD_RELOC_SH_IMMS10BY4 and BFD_RELOC_64.
+       (shmedia_check_limits): Handle BFD_RELOC_64.
+       (sh64_adjust_symtab): Do not decrement the GAS symbol value for
+       a STO_SH5_ISA32 symbol, only the BFD value.
+       2000-12-11  Ben Elliston  <bje@redhat.com>
+       * config/tc-sh64.c: Call dwarf2_emit_insn, not the defunct
+       dwarf2_generate_asm_lineno.
+       2000-12-11  Hans-Peter Nilsson  <hpn@cygnus.com>
+       Handle PC-relative MOVI expansions with assembler relaxation.
+       Generate PC-relative relocs from 16-bit PC-relative expressions.
+       * config/tc-sh64.c (SHMEDIA_MD_PCREL_FROM_FIX): Break out from...
+       (shmedia_md_pcrel_from_section): ...here.
+       (shmedia_md_apply_fix): Handle fixups for 16-bit operands that has
+       turned completely resolved.  Adjust relocation type for 16-bit
+       immediate operands that has turned PC-relative.  Adjust back for
+       MD_PCREL_FROM_SECTION being applied twice.
+       (shmedia_md_convert_frag): Always emit reloc for expression with
+       global or weak symbol.  Handle relaxation result for PC-relative
+       expressions.
+       (shmedia_md_estimate_size_before_relax): An expression with a weak
+       or global symbol can not be relaxed.  Break out tests for
+       relaxable symbol into variable sym_relaxable.
+       <cases C (MOVI_IMM_64, UNDEF_MOVI) and C (MOVI_IMM_32,
+       UNDEF_MOVI)>: Break out any PC-relative expression and change
+       relaxation type.
+       (shmedia_build_Mytes): CSE &operands->operands[j] into variable
+       opjp.
+       <case A_IMMS16>: Fix typo for initial minor relaxation type of
+       MOVI expansion.  If X_op_symbol of the immediate expression is
+       set, make an expression symbol for the argument to frag_var.
+       * config/tc-sh.c (MOVI_IMM_32_PCREL, MOVI_IMM_64_PCREL): New
+       relaxations.
+       (END): Adjust for new relaxations.
+       (md_relax_table): Add entries for new relaxations.
+       2000-12-07  Ben Elliston  <bje@redhat.com>
+       * config/tc-sh64.c (shmedia_parse_reg): Initialize variable len.
+       2000-12-07  Hans-Peter Nilsson  <hpn@cygnus.com>
+       * config/tc-sh64.c (shmedia_md_convert_frag): Correct all MOVI and
+       SHORI operand offsets in PT/PTA/PTB expansions.
+       2000-12-05  Hans-Peter Nilsson  <hpn@cygnus.com>
+       Implement DataLabel semantics.
+       * config/tc-sh.c (sh_frob_file) [HAVE_SH64]: Call
+       shmedia_frob_file_before_adjust.
+       * config/tc-sh64.c [! OBJ_ELF]: Emit #error.
+       (DATALABEL_SUFFIX): Define.
+       (shmedia_md_end) <before adjusting STO_SH5_ISA32 symbols>: Walk
+       symbol list to update "datalabel" symbols to their main symbol
+       counterparts.
+       (shmedia_frob_file_before_adjust): New.
+       (sh64_adjust_symtab): For remaining datalabel symbols, set to
+       undefined and set STT_DATALABEL.
+       (sh64_frob_label): Initialize TC symbol field.
+       (sh64_consume_datalabel): Actually implement semantics.  New
+       parameter operandf, call it instead of expression.
+       (sh64_exclude_symbol): New.
+       * config/tc-sh64.h (md_parse_name): Pass on the function operand
+       to sh64_consume_datalabel.
+       (tc_symbol_new_hook): Define to tc_frob_symbol.
+       (TC_SYMFIELD_TYPE): Define to symbolS *.
+       (tc_frob_symbol): Define to call sh64_exclude_symbol.
+       2000-12-01  Hans-Peter Nilsson  <hpn@cygnus.com>
+       * config/tc-sh64.c (shmedia_init_reloc): Tweak comment for default
+       case.
+       (shmedia_md_assemble): Call dwarf2_generate_asm_lineno if
+       generating dwarf2 debug information.
+       2000-11-30  Hans-Peter Nilsson  <hpn@cygnus.com>
+       * config/tc-sh64.c (sh64_target_format): Use elf64-sh64l and
+       elf64-sh64 for the 64-bit ABI.
+       * config/tc-sh.c (md_show_usage): Tweak usage output for -abi=*
+       option.
+       2000-11-29  Hans-Peter Nilsson  <hpn@cygnus.com>
+       * config/tc-sh.c: Remove conditionalizing on HAVE_SH64 for
+       case-insensitivity.
+       2000-11-27  Hans-Peter Nilsson  <hpn@cygnus.com>
+       * config/tc-sh64.c: Tweak comments, formatting and error messages.
+       (enum sh64_abi_values): New type.
+       (enum sh64_isa_values): New type.
+       (sh64_isa_mode): Replace shmedia_mode.  All referers changed.
+       (seen_shcompact_mode, seen_shmedia_mode): Delete.
+       (sh64_abi): Replace shmedia_64.
+       (shmedia_md_convert_frag) <C (MOVI_IMM_64, MOVI_64),
+       C (MOVI_IMM_32, MOVI_32)>: Correct register number handling.
+       (s_sh64_mode): Check validity for this target.
+       (sh64_target_format): Initialize defaults for ISA and ABI.
+       Fallback to old object format if no SH64 ISA or ABI has been
+       specified.
+       * config/tc-sh.c (md_parse_option): Check combinations for errors.
+       (sh_elf_final_processing): Change to have EF_SH64_ABI64 for 64-bit
+       ABI and EF_SH64 for 32-bit ABI, if SH64 options are specified.
+       * config/tc-sh64.h: Fix typo in comment.
+       2000-11-25  Hans-Peter Nilsson  <hpn@cygnus.com>
+       * config/tc-sh64.c (shmedia_md_estimate_size_before_relax)
+       <PT fixups for absolute values>: Size will be longest, not
+       shortest.
+       (shmedia_md_convert_frag): Disable PTB-warning machinery.  Correct
+       all MOVI and SHORI operand offsets in PT/PTA/PTB expansions.
+       * config/tc-sh.c (parse_reg) [HAVE_SH64]: Add local variables l0
+       and l1 to hold lowercase of two first characters.  Change all
+       remaining TO_LOWER to tolower.
+       * config/tc-sh64.c (TO_LOWER): Delete.
+       (shmedia_find_cooked_opcode): Use tolower, not TO_LOWER.
+       (md_parse_name): Define.
+       (sh64_consume_datalabel): Declare.
+       (DOLLAR_DOT): Define.
+       * config/tc-sh64.c (shmedia_parse_exp): New.
+       (sh64_consume_datalabel): New; just ignoring datalabel semantics.
+       (shmedia_parse_reg): Remove const from src
+       parameter.
+       (shmedia_get_operands): Ditto for args parameter and ptr variable.
+       (shmedia_md_assemble): Ditto for op_end variable.
+       (shmedia_get_operand): Ditto for ptr parameter and src variable.
+       Use shmedia_parse_exp, not parse_exp.
+       * config/tc-sh64.c (shmedia_parse_reg): Add shmedia_arg_type
+       parameter.  All callers changed.
+       (shmedia_get_operand): Add shmedia_arg_type parameter.  All
+       callers changed.
+       (shmedia_parse_reg): Put first two character in local variables.
+       Use tolower, not TO_LOWER.  If no register is found and argtype
+       indicates a control register, scan shmedia_creg_table
+       case-insensitive.
+       2000-11-24  Hans-Peter Nilsson  <hpn@cygnus.com>
+       * Makefile.am (CPU_TYPES): Add sh64.
+       (TARGET_CPU_CFILES): Add config/tc-sh64.c.
+       (TARGET_CPU_HFILES): Add config/tc-sh64.h.
+       Regenerate dependencies.
+       * Makefile.in: Regenerate.
+       * configure.in: Add support for sh64-*-elf*.
+       * configure: Regenerate.
+       * config/tc-sh64.h: New.
+       * config/tc-sh64.c: New.
+       * config/tc-sh.c (md_pseudo_table) [HAVE_SH64]: New pseudos
+       .mode, .isa and .uaquad.
+       [HAVE_SH64] (SH64PCREL16_32, SH64PCREL16_64, SH64PCREL16PT_32,
+       SH64PCREL16PT_64, MOVI_IMM_32, MOVI_IMM_64): Define.
+       [HAVE_SH64] (END): Define as 10.
+       [HAVE_SH64] (UNDEF_SH64PCREL, SH64PCREL16, SH64PCREL32,
+       SH64PCREL48, SH64PCREL64, UNDEF_MOVI, MOVI_16, MOVI_32, MOVI_48,
+       MOVI_64): Define.
+       [HAVE_SH64] (SH64PCREL16_F, SH64PCREL16_M, SH64PCREL16_LENGTH,
+       SH64PCREL32_F, SH64PCREL32_M, SH64PCREL32_LENGTH, SH64PCREL48_F,
+       SH64PCREL48_M, SH64PCREL48_LENGTH, SH64PCREL64_LENGTH,
+       MOVI_16_LENGTH, MOVI_32_LENGTH, MOVI_48_LENGTH, MOVI_64_LENGTH):
+       Define.
+       (md_relax_table) [HAVE_SH64]: Provide relaxations for SHmedia.
+       (md_begin) [HAVE_SH64]: Call shmedia_md_begin.
+       (parse_reg) [HAVE_SH64]: Parse register names case-insensitive.
+       (md_assemble) [HAVE_SH64]: Call shmedia_md_assemble if assembling
+       SHmedia instructions.  Handle state-change after switching to
+       SHcompact.
+       (md_longopts) [HAVE_SH64]: New options --isa=* and --abi=*.
+       (md_parse_option) [HAVE_SH64]: Parse new options.
+       (md_show_usage) [HAVE_SH64]: Show usage of new options.
+       (md_convert_frag) [HAVE_SH64] <default>: Call
+       shmedia_md_convert_frag instead of abort.
+       (sh_force_relocation) [HAVE_SH64]: Also force relocation for
+       BFD_RELOC_SH_SHMEDIA_CODE.
+       (sh_elf_final_processing) [HAVE_SH64]: Set flags identifying
+       SHcompact or SHmedia code.
+       (md_apply_fix) [HAVE_SH64] <default>: Return result from calling
+       shmedia_md_apply_fix instead of abort.
+       (md_estimate_size_before_relax) [HAVE_SH64] <default>: Return
+       result from calling shmedia_md_estimate_size_before_relax instead
+       of calling abort.
+       (sh_do_align) [HAVE_SH64]: If shmedia_mode, let shmedia_do_align
+       do the work.
+       (tc_gen_reloc) [HAVE_SH64]: For unrecognized relocs, call
+       shmedia_init_reloc and do nothing more if it returns non-zero.
+       (sh_finalize) [HAVE_SH64]: Call shmedia_md_end.
+       * po/POTFILES.in: Regenerate.
+       * po/gas.pot: Regenerate.
+
 2002-02-06  Alexandre Oliva  <aoliva@redhat.com>
 
        * config/tc-sh.c (parse_at): Install the correct version of
index 40ccbcc2a08f62615f08ec63f7f16a13a13157b4..a0262e823087a6ed3f3eb0660572bd0401e529fc 100644 (file)
@@ -79,6 +79,7 @@ CPU_TYPES = \
        vax \
        w65 \
        v850 \
+       sh64 \
        xstormy16 \
        z8k
 
@@ -258,6 +259,7 @@ TARGET_CPU_CFILES = \
        config/tc-ppc.c \
        config/tc-s390.c \
        config/tc-sh.c \
+       config/tc-sh64.c \
        config/tc-sparc.c \
        config/tc-tahoe.c \
        config/tc-tic30.c \
@@ -304,6 +306,7 @@ TARGET_CPU_HFILES = \
        config/tc-ppc.h \
        config/tc-s390.h \
        config/tc-sh.h \
+       config/tc-sh64.h \
        config/tc-sparc.h \
        config/tc-tahoe.h \
        config/tc-tic30.h \
@@ -1784,6 +1787,20 @@ DEPOBJ_sh_elf = $(INCDIR)/symcat.h $(srcdir)/config/obj-elf.h \
   $(INCDIR)/elf/external.h $(INCDIR)/bfdlink.h $(srcdir)/config/tc-sh.h \
   $(INCDIR)/safe-ctype.h subsegs.h $(INCDIR)/obstack.h \
   $(INCDIR)/aout/aout64.h
+DEPTC_sh64_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \
+  $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \
+  $(INCDIR)/bfdlink.h $(srcdir)/config/tc-sh64.h $(srcdir)/config/tc-sh.h \
+  $(srcdir)/../opcodes/sh64-opc.h $(srcdir)/config/tc-sh.c \
+  subsegs.h $(INCDIR)/obstack.h $(srcdir)/../opcodes/sh-opc.h \
+  struc-symbol.h $(INCDIR)/elf/sh.h $(INCDIR)/elf/reloc-macros.h \
+  dwarf2dbg.h $(INCDIR)/symcat.h
+DEPOBJ_sh64_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \
+  $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \
+  $(INCDIR)/bfdlink.h $(srcdir)/config/tc-sh64.h $(srcdir)/config/tc-sh.h \
+  subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h $(INCDIR)/elf/sh.h
+DEP_sh64_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \
+  $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \
+  $(INCDIR)/bfdlink.h $(srcdir)/config/tc-sh64.h $(srcdir)/config/tc-sh.h
 DEPOBJ_sparc_aout = $(INCDIR)/symcat.h $(srcdir)/config/obj-aout.h \
   $(srcdir)/config/tc-sparc.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \
   $(INCDIR)/aout/aout64.h $(INCDIR)/obstack.h
index 47f033472f9a631e57ec3eb6325243b2b6d18242..a184acf81b701781940e2b61837678c5343bcc37 100644 (file)
@@ -1,6 +1,6 @@
-# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
 
-# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -190,6 +190,7 @@ CPU_TYPES = \
        vax \
        w65 \
        v850 \
+       sh64 \
        xstormy16 \
        z8k
 
@@ -375,6 +376,7 @@ TARGET_CPU_CFILES = \
        config/tc-ppc.c \
        config/tc-s390.c \
        config/tc-sh.c \
+       config/tc-sh64.c \
        config/tc-sparc.c \
        config/tc-tahoe.c \
        config/tc-tic30.c \
@@ -422,6 +424,7 @@ TARGET_CPU_HFILES = \
        config/tc-ppc.h \
        config/tc-s390.h \
        config/tc-sh.h \
+       config/tc-sh64.h \
        config/tc-sparc.h \
        config/tc-tahoe.h \
        config/tc-tic30.h \
@@ -1674,6 +1677,23 @@ DEPOBJ_sh_elf = $(INCDIR)/symcat.h $(srcdir)/config/obj-elf.h \
   $(INCDIR)/safe-ctype.h subsegs.h $(INCDIR)/obstack.h \
   $(INCDIR)/aout/aout64.h
 
+DEPTC_sh64_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \
+  $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \
+  $(INCDIR)/bfdlink.h $(srcdir)/config/tc-sh64.h $(srcdir)/config/tc-sh.h \
+  $(srcdir)/../opcodes/sh64-opc.h $(srcdir)/config/tc-sh.c \
+  subsegs.h $(INCDIR)/obstack.h $(srcdir)/../opcodes/sh-opc.h \
+  struc-symbol.h $(INCDIR)/elf/sh.h $(INCDIR)/elf/reloc-macros.h \
+  dwarf2dbg.h $(INCDIR)/symcat.h
+
+DEPOBJ_sh64_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \
+  $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \
+  $(INCDIR)/bfdlink.h $(srcdir)/config/tc-sh64.h $(srcdir)/config/tc-sh.h \
+  subsegs.h $(INCDIR)/obstack.h $(INCDIR)/aout/aout64.h $(INCDIR)/elf/sh.h
+
+DEP_sh64_elf = $(srcdir)/config/obj-elf.h $(BFDDIR)/elf-bfd.h \
+  $(INCDIR)/elf/common.h $(INCDIR)/elf/internal.h $(INCDIR)/elf/external.h \
+  $(INCDIR)/bfdlink.h $(srcdir)/config/tc-sh64.h $(srcdir)/config/tc-sh.h
+
 DEPOBJ_sparc_aout = $(INCDIR)/symcat.h $(srcdir)/config/obj-aout.h \
   $(srcdir)/config/tc-sparc.h $(BFDDIR)/libaout.h $(INCDIR)/bfdlink.h \
   $(INCDIR)/aout/aout64.h $(INCDIR)/obstack.h
@@ -2262,7 +2282,7 @@ configure configure.in gdbinit.in itbl-lex.c itbl-parse.c
 
 DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST)
 
-TAR = tar
+TAR = gtar
 GZIP_ENV = --best
 SOURCES = $(itbl_test_SOURCES) $(as_new_SOURCES) $(EXTRA_as_new_SOURCES) $(gasp_new_SOURCES)
 OBJECTS = $(itbl_test_OBJECTS) $(as_new_OBJECTS) $(gasp_new_OBJECTS)
@@ -2423,7 +2443,7 @@ maintainer-clean-recursive:
        dot_seen=no; \
        rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \
          rev="$$subdir $$rev"; \
-         test "$$subdir" != "." || dot_seen=yes; \
+         test "$$subdir" = "." && dot_seen=yes; \
        done; \
        test "$$dot_seen" = "no" && rev=". $$rev"; \
        target=`echo $@ | sed s/-recursive//`; \
index 2a3ccb77f9d3f385ddc65a8c1de141a5818afc6a..be1c18853e65c3f8b598a4565cbc4151fcaf047f 100644 (file)
@@ -203,7 +203,7 @@ dnl AM_PROG_LEX
 dnl Look for flex, lex or missing, then run AC_PROG_LEX and AC_DECL_YYTEXT
 AC_DEFUN(AM_PROG_LEX,
 [missing_dir=ifelse([$1],,`cd $ac_aux_dir && pwd`,$1)
-AC_CHECK_PROGS(LEX, flex lex, "$missing_dir/missing flex")
+AC_CHECK_PROGS(LEX, flex lex, $missing_dir/missing flex)
 AC_PROG_LEX
 AC_DECL_YYTEXT])
 
index 80ff037a69db22bf8ef75b7b58c285ba24b15d77..11cc8334c425070ca905aedbbf972384ce0a4a03 100644 (file)
@@ -140,6 +140,18 @@ const pseudo_typeS md_pseudo_table[] =
   {"file", dwarf2_directive_file, 0 },
   {"loc", dwarf2_directive_loc, 0 },
 #endif
+#ifdef HAVE_SH64
+  {"mode", s_sh64_mode, 0 },
+
+  /* Have the old name too.  */
+  {"isa", s_sh64_mode, 0 },
+
+  /* Assert that the right ABI is used.  */
+  {"abi", s_sh64_abi, 0 },
+
+  { "vtable_inherit", sh64_vtable_inherit, 0 },
+  { "vtable_entry", sh64_vtable_entry, 0 },
+#endif /* HAVE_SH64 */
   {0, 0, 0}
 };
 
@@ -172,11 +184,37 @@ const char FLT_CHARS[] = "rRsSfFdDxXpP";
 #define GET_WHAT(x) ((x>>4))
 
 /* These are the three types of relaxable instrction.  */
+/* These are the types of relaxable instructions; except for END which is
+   a marker.  */
 #define COND_JUMP 1
 #define COND_JUMP_DELAY 2
 #define UNCOND_JUMP  3
+
+#ifdef HAVE_SH64
+
+/* A 16-bit (times four) pc-relative operand, at most expanded to 32 bits.  */
+#define SH64PCREL16_32 4
+/* A 16-bit (times four) pc-relative operand, at most expanded to 64 bits.  */
+#define SH64PCREL16_64 5
+
+/* Variants of the above for adjusting the insn to PTA or PTB according to
+   the label.  */
+#define SH64PCREL16PT_32 6
+#define SH64PCREL16PT_64 7
+
+/* A MOVI expansion, expanding to at most 32 or 64 bits.  */
+#define MOVI_IMM_32 8
+#define MOVI_IMM_32_PCREL 9
+#define MOVI_IMM_64 10
+#define MOVI_IMM_64_PCREL 11
+#define END 12
+
+#else  /* HAVE_SH64 */
+
 #define END 4
 
+#endif /* HAVE_SH64 */
+
 #define UNDEF_DISP 0
 #define COND8  1
 #define COND12 2
@@ -186,6 +224,24 @@ const char FLT_CHARS[] = "rRsSfFdDxXpP";
 #define UNCOND12 1
 #define UNCOND32 2
 
+#ifdef HAVE_SH64
+#define UNDEF_SH64PCREL 0
+#define SH64PCREL16 1
+#define SH64PCREL32 2
+#define SH64PCREL48 3
+#define SH64PCREL64 4
+#define SH64PCRELPLT 5
+
+#define UNDEF_MOVI 0
+#define MOVI_16 1
+#define MOVI_32 2
+#define MOVI_48 3
+#define MOVI_64 4
+#define MOVI_PLT 5
+#define MOVI_GOTOFF 6
+#define MOVI_GOTPC 7
+#endif /* HAVE_SH64 */
+
 /* Branch displacements are from the address of the branch plus
    four, thus all minimum and maximum values have 4 added to them.  */
 #define COND8_F 258
@@ -216,6 +272,85 @@ const char FLT_CHARS[] = "rRsSfFdDxXpP";
 #define UNCOND32_M -(1<<30)
 #define UNCOND32_LENGTH 14
 
+#ifdef HAVE_SH64
+/* The trivial expansion of a SH64PCREL16 relaxation is just a "PT label,
+   TRd" as is the current insn, so no extra length.  Note that the "reach"
+   is calculated from the address *after* that insn, but the offset in the
+   insn is calculated from the beginning of the insn.  We also need to
+   take into account the implicit 1 coded as the "A" in PTA when counting
+   forward.  If PTB reaches an odd address, we trap that as an error
+   elsewhere, so we don't have to have different relaxation entries.  We
+   don't add a one to the negative range, since PTB would then have the
+   farthest backward-reaching value skipped, not generated at relaxation.  */
+#define SH64PCREL16_F (32767 * 4 - 4 + 1)
+#define SH64PCREL16_M (-32768 * 4 - 4)
+#define SH64PCREL16_LENGTH 0
+
+/* The next step is to change that PT insn into
+     MOVI ((label - datalabel Ln) >> 16) & 65535, R25
+     SHORI (label - datalabel Ln) & 65535, R25
+    Ln:
+     PTREL R25,TRd
+   which means two extra insns, 8 extra bytes.  This is the limit for the
+   32-bit ABI.
+
+   The expressions look a bit bad since we have to adjust this to avoid overflow on a
+   32-bit host.  */
+#define SH64PCREL32_F ((((long) 1 << 30) - 1) * 2 + 1 - 4)
+#define SH64PCREL32_LENGTH (2 * 4)
+
+/* Similarly, we just change the MOVI and add a SHORI for the 48-bit
+   expansion.  */
+#if BFD_HOST_64BIT_LONG
+/* The "reach" type is long, so we can only do this for a 64-bit-long
+   host.  */
+#define SH64PCREL32_M (((long) -1 << 30) * 2 - 4)
+#define SH64PCREL48_F ((((long) 1 << 47) - 1) - 4)
+#define SH64PCREL48_M (((long) -1 << 47) - 4)
+#define SH64PCREL48_LENGTH (3 * 4)
+#else
+/* If the host does not have 64-bit longs, just make this state identical
+   in reach to the 32-bit state.  Note that we have a slightly incorrect
+   reach, but the correct one above will overflow a 32-bit number.  */
+#define SH64PCREL32_M (((long) -1 << 30) * 2)
+#define SH64PCREL48_F SH64PCREL32_F
+#define SH64PCREL48_M SH64PCREL32_M
+#define SH64PCREL48_LENGTH (3 * 4)
+#endif /* BFD_HOST_64BIT_LONG */
+
+/* And similarly for the 64-bit expansion; a MOVI + SHORI + SHORI + SHORI
+   + PTREL sequence.  */
+#define SH64PCREL64_LENGTH (4 * 4)
+
+/* For MOVI, we make the MOVI + SHORI... expansion you can see in the
+   SH64PCREL expansions.  The PCREL one is similar, but the other has no
+   pc-relative reach; it must be fully expanded in
+   shmedia_md_estimate_size_before_relax.  */
+#define MOVI_16_LENGTH 0
+#define MOVI_16_F (32767 - 4)
+#define MOVI_16_M (-32768 - 4)
+#define MOVI_32_LENGTH 4
+#define MOVI_32_F ((((long) 1 << 30) - 1) * 2 + 1 - 4)
+#define MOVI_48_LENGTH 8
+
+#if BFD_HOST_64BIT_LONG
+/* The "reach" type is long, so we can only do this for a 64-bit-long
+   host.  */
+#define MOVI_32_M (((long) -1 << 30) * 2 - 4)
+#define MOVI_48_F ((((long) 1 << 47) - 1) - 4)
+#define MOVI_48_M (((long) -1 << 47) - 4)
+#else
+/* If the host does not have 64-bit longs, just make this state identical
+   in reach to the 32-bit state.  Note that we have a slightly incorrect
+   reach, but the correct one above will overflow a 32-bit number.  */
+#define MOVI_32_M (((long) -1 << 30) * 2)
+#define MOVI_48_F MOVI_32_F
+#define MOVI_48_M MOVI_32_M
+#endif /* BFD_HOST_64BIT_LONG */
+
+#define MOVI_64_LENGTH 12
+#endif /* HAVE_SH64 */
+
 #define EMPTY { 0, 0, 0, 0 }
 
 const relax_typeS md_relax_table[C (END, 0)] = {
@@ -256,6 +391,118 @@ const relax_typeS md_relax_table[C (END, 0)] = {
   { 0, 0, UNCOND32_LENGTH, 0, },
   EMPTY, EMPTY, EMPTY,
   EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
+
+#ifdef HAVE_SH64
+  /* C (SH64PCREL16_32, SH64PCREL16) */
+  EMPTY,
+  { SH64PCREL16_F, SH64PCREL16_M, SH64PCREL16_LENGTH, C (SH64PCREL16_32, SH64PCREL32) },
+  /* C (SH64PCREL16_32, SH64PCREL32) */
+  { 0, 0, SH64PCREL32_LENGTH, 0 },
+  EMPTY, EMPTY,
+  /* C (SH64PCREL16_32, SH64PCRELPLT) */
+  { 0, 0, SH64PCREL32_LENGTH, 0 },
+  EMPTY, EMPTY,
+  EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
+
+  /* C (SH64PCREL16_64, SH64PCREL16) */
+  EMPTY,
+  { SH64PCREL16_F, SH64PCREL16_M, SH64PCREL16_LENGTH, C (SH64PCREL16_64, SH64PCREL32) },
+  /* C (SH64PCREL16_64, SH64PCREL32) */
+  { SH64PCREL32_F, SH64PCREL32_M, SH64PCREL32_LENGTH, C (SH64PCREL16_64, SH64PCREL48) },
+  /* C (SH64PCREL16_64, SH64PCREL48) */
+  { SH64PCREL48_F, SH64PCREL48_M, SH64PCREL48_LENGTH, C (SH64PCREL16_64, SH64PCREL64) },
+  /* C (SH64PCREL16_64, SH64PCREL64) */
+  { 0, 0, SH64PCREL64_LENGTH, 0 },
+  /* C (SH64PCREL16_64, SH64PCRELPLT) */
+  { 0, 0, SH64PCREL64_LENGTH, 0 },
+  EMPTY, EMPTY,
+  EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
+
+  /* C (SH64PCREL16PT_32, SH64PCREL16) */
+  EMPTY,
+  { SH64PCREL16_F, SH64PCREL16_M, SH64PCREL16_LENGTH, C (SH64PCREL16PT_32, SH64PCREL32) },
+  /* C (SH64PCREL16PT_32, SH64PCREL32) */
+  { 0, 0, SH64PCREL32_LENGTH, 0 },
+  EMPTY, EMPTY,
+  /* C (SH64PCREL16PT_32, SH64PCRELPLT) */
+  { 0, 0, SH64PCREL32_LENGTH, 0 },
+  EMPTY, EMPTY,
+  EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
+
+  /* C (SH64PCREL16PT_64, SH64PCREL16) */
+  EMPTY,
+  { SH64PCREL16_F, SH64PCREL16_M, SH64PCREL16_LENGTH, C (SH64PCREL16PT_64, SH64PCREL32) },
+  /* C (SH64PCREL16PT_64, SH64PCREL32) */
+  { SH64PCREL32_F,
+    SH64PCREL32_M, 
+    SH64PCREL32_LENGTH,
+    C (SH64PCREL16PT_64, SH64PCREL48) },
+  /* C (SH64PCREL16PT_64, SH64PCREL48) */
+  { SH64PCREL48_F, SH64PCREL48_M, SH64PCREL48_LENGTH, C (SH64PCREL16PT_64, SH64PCREL64) },
+  /* C (SH64PCREL16PT_64, SH64PCREL64) */
+  { 0, 0, SH64PCREL64_LENGTH, 0 },
+  /* C (SH64PCREL16PT_64, SH64PCRELPLT) */
+  { 0, 0, SH64PCREL64_LENGTH, 0},
+  EMPTY, EMPTY,
+  EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
+
+  /* C (MOVI_IMM_32, UNDEF_MOVI) */
+  { 0, 0, MOVI_32_LENGTH, 0 },
+  /* C (MOVI_IMM_32, MOVI_16) */
+  { MOVI_16_F, MOVI_16_M, MOVI_16_LENGTH, C (MOVI_IMM_32, MOVI_32) },
+  /* C (MOVI_IMM_32, MOVI_32) */
+  { MOVI_32_F, MOVI_32_M, MOVI_32_LENGTH, 0 },
+  EMPTY, EMPTY, EMPTY,
+  /* C (MOVI_IMM_32, MOVI_GOTOFF) */
+  { 0, 0, MOVI_32_LENGTH, 0 },
+  EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
+
+  /* C (MOVI_IMM_32_PCREL, MOVI_16) */
+  EMPTY,
+  { MOVI_16_F, MOVI_16_M, MOVI_16_LENGTH, C (MOVI_IMM_32_PCREL, MOVI_32) },
+  /* C (MOVI_IMM_32_PCREL, MOVI_32) */
+  { 0, 0, MOVI_32_LENGTH, 0 },
+  EMPTY, EMPTY,
+  /* C (MOVI_IMM_32_PCREL, MOVI_PLT) */
+  { 0, 0, MOVI_32_LENGTH, 0 },
+  EMPTY,
+  /* C (MOVI_IMM_32_PCREL, MOVI_GOTPC) */
+  { 0, 0, MOVI_32_LENGTH, 0 },
+  EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
+
+  /* C (MOVI_IMM_64, UNDEF_MOVI) */
+  { 0, 0, MOVI_64_LENGTH, 0 },
+  /* C (MOVI_IMM_64, MOVI_16) */
+  { MOVI_16_F, MOVI_16_M, MOVI_16_LENGTH, C (MOVI_IMM_64, MOVI_32) },
+  /* C (MOVI_IMM_64, MOVI_32) */
+  { MOVI_32_F, MOVI_32_M, MOVI_32_LENGTH, C (MOVI_IMM_64, MOVI_48) },
+  /* C (MOVI_IMM_64, MOVI_48) */
+  { MOVI_48_F, MOVI_48_M, MOVI_48_LENGTH, C (MOVI_IMM_64, MOVI_64) },
+  /* C (MOVI_IMM_64, MOVI_64) */
+  { 0, 0, MOVI_64_LENGTH, 0 },
+  EMPTY,
+  /* C (MOVI_IMM_64, MOVI_GOTOFF) */
+  { 0, 0, MOVI_64_LENGTH, 0 },
+  EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
+
+  /* C (MOVI_IMM_64_PCREL, MOVI_16) */
+  EMPTY,
+  { MOVI_16_F, MOVI_16_M, MOVI_16_LENGTH, C (MOVI_IMM_64_PCREL, MOVI_32) },
+  /* C (MOVI_IMM_64_PCREL, MOVI_32) */
+  { MOVI_32_F, MOVI_32_M, MOVI_32_LENGTH, C (MOVI_IMM_64_PCREL, MOVI_48) },
+  /* C (MOVI_IMM_64_PCREL, MOVI_48) */
+  { MOVI_48_F, MOVI_48_M, MOVI_48_LENGTH, C (MOVI_IMM_64_PCREL, MOVI_64) },
+  /* C (MOVI_IMM_64_PCREL, MOVI_64) */
+  { 0, 0, MOVI_64_LENGTH, 0 },
+  /* C (MOVI_IMM_64_PCREL, MOVI_PLT) */
+  { 0, 0, MOVI_64_LENGTH, 0 },
+  EMPTY,
+  /* C (MOVI_IMM_64_PCREL, MOVI_GOTPC) */
+  { 0, 0, MOVI_64_LENGTH, 0 },
+  EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, EMPTY,
+
+#endif /* HAVE_SH64 */
+
 };
 
 #undef EMPTY
@@ -278,6 +525,11 @@ sh_PIC_related_p (sym)
   if (sym == GOT_symbol)
     return 1;
 
+#ifdef HAVE_SH64
+  if (sh_PIC_related_p (*symbol_get_tc (sym)))
+    return 1;
+#endif
+
   exp = symbol_get_value_expression (sym);
 
   return (exp->X_op == O_PIC_reloc
@@ -341,11 +593,47 @@ sh_check_fixup (main_exp, r_type_p)
 
   if (exp->X_op == O_symbol || exp->X_op == O_add || exp->X_op == O_subtract)
     {
+#ifdef HAVE_SH64
+      if (exp->X_add_symbol
+         && (exp->X_add_symbol == GOT_symbol
+             || (GOT_symbol
+                 && *symbol_get_tc (exp->X_add_symbol) == GOT_symbol)))
+       {
+         switch (*r_type_p)
+           {
+           case BFD_RELOC_SH_IMM_LOW16:
+             *r_type_p = BFD_RELOC_SH_GOTPC_LOW16;
+             break;
+
+           case BFD_RELOC_SH_IMM_MEDLOW16:
+             *r_type_p = BFD_RELOC_SH_GOTPC_MEDLOW16;
+             break;
+
+           case BFD_RELOC_SH_IMM_MEDHI16:
+             *r_type_p = BFD_RELOC_SH_GOTPC_MEDHI16;
+             break;
+
+           case BFD_RELOC_SH_IMM_HI16:
+             *r_type_p = BFD_RELOC_SH_GOTPC_HI16;
+             break;
+
+           case BFD_RELOC_NONE:
+           case BFD_RELOC_UNUSED:
+             *r_type_p = BFD_RELOC_SH_GOTPC;
+             break;
+             
+           default:
+             abort ();
+           }
+         return 0;
+       }
+#else
       if (exp->X_add_symbol && exp->X_add_symbol == GOT_symbol)
        {
          *r_type_p = BFD_RELOC_SH_GOTPC;
          return 0;
        }
+#endif
       exp = symbol_get_value_expression (exp->X_add_symbol);
       if (! exp)
        return 0;
@@ -353,7 +641,116 @@ sh_check_fixup (main_exp, r_type_p)
 
   if (exp->X_op == O_PIC_reloc)
     {
+#ifdef HAVE_SH64
+      switch (*r_type_p)
+       {
+       case BFD_RELOC_NONE:
+       case BFD_RELOC_UNUSED:
+         *r_type_p = exp->X_md;
+         break;
+
+       case BFD_RELOC_SH_IMM_LOW16:
+         switch (exp->X_md)
+           {
+           case BFD_RELOC_32_GOTOFF:
+             *r_type_p = BFD_RELOC_SH_GOTOFF_LOW16;
+             break;
+             
+           case BFD_RELOC_SH_GOTPLT32:
+             *r_type_p = BFD_RELOC_SH_GOTPLT_LOW16;
+             break;
+             
+           case BFD_RELOC_32_GOT_PCREL:
+             *r_type_p = BFD_RELOC_SH_GOT_LOW16;
+             break;
+             
+           case BFD_RELOC_32_PLT_PCREL:
+             *r_type_p = BFD_RELOC_SH_PLT_LOW16;
+             break;
+
+           default:
+             abort ();
+           }
+         break;
+
+       case BFD_RELOC_SH_IMM_MEDLOW16:
+         switch (exp->X_md)
+           {
+           case BFD_RELOC_32_GOTOFF:
+             *r_type_p = BFD_RELOC_SH_GOTOFF_MEDLOW16;
+             break;
+             
+           case BFD_RELOC_SH_GOTPLT32:
+             *r_type_p = BFD_RELOC_SH_GOTPLT_MEDLOW16;
+             break;
+             
+           case BFD_RELOC_32_GOT_PCREL:
+             *r_type_p = BFD_RELOC_SH_GOT_MEDLOW16;
+             break;
+             
+           case BFD_RELOC_32_PLT_PCREL:
+             *r_type_p = BFD_RELOC_SH_PLT_MEDLOW16;
+             break;
+
+           default:
+             abort ();
+           }
+         break;
+
+       case BFD_RELOC_SH_IMM_MEDHI16:
+         switch (exp->X_md)
+           {
+           case BFD_RELOC_32_GOTOFF:
+             *r_type_p = BFD_RELOC_SH_GOTOFF_MEDHI16;
+             break;
+             
+           case BFD_RELOC_SH_GOTPLT32:
+             *r_type_p = BFD_RELOC_SH_GOTPLT_MEDHI16;
+             break;
+             
+           case BFD_RELOC_32_GOT_PCREL:
+             *r_type_p = BFD_RELOC_SH_GOT_MEDHI16;
+             break;
+             
+           case BFD_RELOC_32_PLT_PCREL:
+             *r_type_p = BFD_RELOC_SH_PLT_MEDHI16;
+             break;
+
+           default:
+             abort ();
+           }
+         break;
+
+       case BFD_RELOC_SH_IMM_HI16:
+         switch (exp->X_md)
+           {
+           case BFD_RELOC_32_GOTOFF:
+             *r_type_p = BFD_RELOC_SH_GOTOFF_HI16;
+             break;
+             
+           case BFD_RELOC_SH_GOTPLT32:
+             *r_type_p = BFD_RELOC_SH_GOTPLT_HI16;
+             break;
+             
+           case BFD_RELOC_32_GOT_PCREL:
+             *r_type_p = BFD_RELOC_SH_GOT_HI16;
+             break;
+             
+           case BFD_RELOC_32_PLT_PCREL:
+             *r_type_p = BFD_RELOC_SH_PLT_HI16;
+             break;
+
+           default:
+             abort ();
+           }
+         break;
+
+       default:
+         abort ();
+       }
+#else
       *r_type_p = exp->X_md;
+#endif
       if (exp == main_exp)
        exp->X_op = O_symbol;
       else
@@ -397,6 +794,12 @@ sh_cons_fix_new (frag, off, size, exp)
        r_type = BFD_RELOC_32;
        break;
 
+#ifdef HAVE_SH64
+      case 8:
+       r_type = BFD_RELOC_64;
+       break;
+#endif
+
       default:
        goto error;
       }
@@ -420,6 +823,16 @@ sh_elf_cons (nbytes)
 {
   expressionS exp;
 
+#ifdef HAVE_SH64
+
+  /* Update existing range to include a previous insn, if there was one.  */
+  sh64_update_contents_mark (true);
+
+  /* We need to make sure the contents type is set to data.  */
+  sh64_flag_output ();
+
+#endif /* HAVE_SH64 */
+
   if (is_it_end_of_statement ())
     {
       demand_empty_rest_of_line ();
@@ -457,6 +870,10 @@ md_begin ()
   target_arch = arch_sh1_up & ~(sh_dsp ? arch_sh3e_up : arch_sh_dsp_up);
   valid_arch = target_arch;
 
+#ifdef HAVE_SH64
+  shmedia_md_begin ();
+#endif
+
   opcode_hash_control = hash_new ();
 
   /* Insert unique names into hash table.  */
@@ -1908,6 +2325,26 @@ md_assemble (str)
   sh_opcode_info *opcode;
   unsigned int size = 0;
 
+#ifdef HAVE_SH64
+  if (sh64_isa_mode == sh64_isa_shmedia)
+    {
+      shmedia_md_assemble (str);
+      return;
+    }
+  else
+    {
+      /* If we've seen pseudo-directives, make sure any emitted data or
+        frags are marked as data.  */
+      if (seen_insn == false)
+       {
+         sh64_update_contents_mark (true);
+         sh64_set_contents_type (CRT_SH5_ISA16);
+       }
+
+      seen_insn = true;
+    }
+#endif /* HAVE_SH64 */
+
   opcode = find_cooked_opcode (&str);
   op_end = str;
 
@@ -2149,6 +2586,21 @@ struct option md_longopts[] =
   {"little", no_argument, NULL, OPTION_LITTLE},
   {"small", no_argument, NULL, OPTION_SMALL},
   {"dsp", no_argument, NULL, OPTION_DSP},
+#ifdef HAVE_SH64
+#define OPTION_ISA                    (OPTION_DSP + 1)
+#define OPTION_ABI                    (OPTION_ISA + 1)
+#define OPTION_NO_MIX                 (OPTION_ABI + 1)
+#define OPTION_SHCOMPACT_CONST_CRANGE (OPTION_NO_MIX + 1)
+#define OPTION_NO_EXPAND              (OPTION_SHCOMPACT_CONST_CRANGE + 1)
+#define OPTION_PT32                   (OPTION_NO_EXPAND + 1)
+  {"isa",                    required_argument, NULL, OPTION_ISA},
+  {"abi",                    required_argument, NULL, OPTION_ABI},
+  {"no-mix",                 no_argument, NULL, OPTION_NO_MIX},
+  {"shcompact-const-crange", no_argument, NULL, OPTION_SHCOMPACT_CONST_CRANGE},
+  {"no-expand",              no_argument, NULL, OPTION_NO_EXPAND},
+  {"expand-pt32",            no_argument, NULL, OPTION_PT32},
+#endif /* HAVE_SH64 */
+
   {NULL, no_argument, NULL, 0}
 };
 size_t md_longopts_size = sizeof (md_longopts);
@@ -2180,6 +2632,62 @@ md_parse_option (c, arg)
       sh_dsp = 1;
       break;
 
+#ifdef HAVE_SH64
+    case OPTION_ISA:
+      if (strcasecmp (arg, "shmedia") == 0)
+       {
+         if (sh64_isa_mode == sh64_isa_shcompact)
+           as_bad (_("Invalid combination: --isa=SHcompact with --isa=SHmedia"));
+         sh64_isa_mode = sh64_isa_shmedia;
+       }
+      else if (strcasecmp (arg, "shcompact") == 0)
+       {
+         if (sh64_isa_mode == sh64_isa_shmedia)
+           as_bad (_("Invalid combination: --isa=SHmedia with --isa=SHcompact"));
+         if (sh64_abi == sh64_abi_64)
+           as_bad (_("Invalid combination: --abi=64 with --isa=SHcompact"));
+         sh64_isa_mode = sh64_isa_shcompact;
+       }
+      else
+       as_bad ("Invalid argument to --isa option: %s", arg);
+      break;
+
+    case OPTION_ABI:
+      if (strcmp (arg, "32") == 0)
+       {
+         if (sh64_abi == sh64_abi_64)
+           as_bad (_("Invalid combination: --abi=32 with --abi=64"));
+         sh64_abi = sh64_abi_32;
+       }
+      else if (strcmp (arg, "64") == 0)
+       {
+         if (sh64_abi == sh64_abi_32)
+           as_bad (_("Invalid combination: --abi=64 with --abi=32"));
+         if (sh64_isa_mode == sh64_isa_shcompact)
+           as_bad (_("Invalid combination: --isa=SHcompact with --abi=64"));
+         sh64_abi = sh64_abi_64;
+       }
+      else
+       as_bad ("Invalid argument to --abi option: %s", arg);
+      break;
+
+    case OPTION_NO_MIX:
+      sh64_mix = false;
+      break;
+
+    case OPTION_SHCOMPACT_CONST_CRANGE:
+      sh64_shcompact_const_crange = true;
+      break;
+
+    case OPTION_NO_EXPAND:
+      sh64_expand = false;
+      break;
+
+    case OPTION_PT32:
+      sh64_pt32 = true;
+      break;
+#endif /* HAVE_SH64 */
+
     default:
       return 0;
     }
@@ -2198,6 +2706,22 @@ SH options:\n\
 -relax                 alter jump instructions for long displacements\n\
 -small                 align sections to 4 byte boundaries, not 16\n\
 -dsp                   enable sh-dsp insns, and disable sh3e / sh4 insns.\n"));
+#ifdef HAVE_SH64
+  fprintf (stream, _("\
+-isa=[shmedia          set default instruction set for SH64\n\
+      | SHmedia\n\
+      | shcompact\n\
+      | SHcompact]\n\
+-abi=[32|64]           set size of expanded SHmedia operands and object\n\
+                       file type\n\
+-shcompact-const-crange        emit code-range descriptors for constants in\n\
+                       SHcompact code sections\n\
+-no-mix                        disallow SHmedia code in the same section as\n\
+                       constants and SHcompact code\n\
+-no-expand             do not expand MOVI, PT, PTA or PTB instructions\n\
+-expand-pt32           with -abi=64, expand PT, PTA and PTB instructions\n\
+                       to 32 bits only"));
+#endif /* HAVE_SH64 */
 }
 \f
 /* This struct is used to pass arguments to sh_count_relocs through
@@ -2367,6 +2891,10 @@ sh_frob_section (abfd, sec, ignore)
 void
 sh_frob_file ()
 {
+#ifdef HAVE_SH64
+  shmedia_frob_file_before_adjust ();
+#endif
+
   if (! sh_relax)
     return;
 
@@ -2520,7 +3048,11 @@ md_convert_frag (headers, seg, fragP)
       break;
 
     default:
+#ifdef HAVE_SH64
+      shmedia_md_convert_frag (headers, seg, fragP, true);
+#else
       abort ();
+#endif
     }
 
   if (donerelax && !sh_relax)
@@ -2710,6 +3242,9 @@ sh_force_relocation (fix)
          || fix->fx_r_type == BFD_RELOC_SH_ALIGN
          || fix->fx_r_type == BFD_RELOC_SH_CODE
          || fix->fx_r_type == BFD_RELOC_SH_DATA
+#ifdef HAVE_SH64
+         || fix->fx_r_type == BFD_RELOC_SH_SHMEDIA_CODE
+#endif
          || fix->fx_r_type == BFD_RELOC_SH_LABEL);
 }
 
@@ -2750,6 +3285,13 @@ sh_elf_final_processing ()
 
   /* Set file-specific flags to indicate if this code needs
      a processor with the sh-dsp / sh3e ISA to execute.  */
+#ifdef HAVE_SH64
+  /* SH5 and above don't know about the valid_arch arch_sh* bits defined
+     in sh-opc.h, so check SH64 mode before checking valid_arch.  */
+  if (sh64_isa_mode != sh64_isa_unspecified)
+    val = EF_SH5;
+  else
+#endif /* HAVE_SH64 */
   if (valid_arch & arch_sh1)
     val = EF_SH1;
   else if (valid_arch & arch_sh2)
@@ -2998,6 +3540,7 @@ md_apply_fix3 (fixP, valP, seg)
       break;
 
     case BFD_RELOC_32_GOT_PCREL:
+    case BFD_RELOC_SH_GOTPLT32:
       * valP = 0; /* Fully resolved at runtime.  No addend.  */
       md_number_to_chars (buf, 0, 4);
       break;
@@ -3008,7 +3551,12 @@ md_apply_fix3 (fixP, valP, seg)
 #endif
 
     default:
+#ifdef HAVE_SH64
+      shmedia_md_apply_fix3 (fixP, valP);
+      return;
+#else
       abort ();
+#endif
     }
 
   if (shift != 0)
@@ -3041,7 +3589,12 @@ md_estimate_size_before_relax (fragP, segment_type)
   switch (fragP->fr_subtype)
     {
     default:
+#ifdef HAVE_SH64
+      return shmedia_md_estimate_size_before_relax (fragP, segment_type);
+#else
       abort ();
+#endif
+
 
     case C (UNCOND_JUMP, UNDEF_DISP):
       /* Used to be a branch to somewhere which was unknown.  */
@@ -3110,6 +3663,11 @@ md_number_to_chars (ptr, use, nbytes)
      valueT use;
      int nbytes;
 {
+#ifdef HAVE_SH64
+  /* We might need to set the contents type to data.  */
+  sh64_flag_output ();
+#endif
+
   if (! target_big_endian)
     number_to_chars_littleendian (ptr, use, nbytes);
   else
@@ -3355,6 +3913,10 @@ tc_gen_reloc (section, fixp)
       rel->addend = 0;
       rel->address = rel->addend = fixp->fx_offset;
     }
+#ifdef HAVE_SH64
+  else if (shmedia_init_reloc (rel, fixp))
+    ;
+#endif
   else if (fixp->fx_pcrel)
     rel->addend = fixp->fx_addnumber;
   else if (r_type == BFD_RELOC_32 || r_type == BFD_RELOC_32_GOTOFF)
@@ -3440,6 +4002,8 @@ sh_parse_name (name, exprP, nextcharP)
     goto no_suffix;
   else if ((next_end = sh_end_of_match (next + 1, "GOTOFF")))
     reloc_type = BFD_RELOC_32_GOTOFF;
+  else if ((next_end = sh_end_of_match (next + 1, "GOTPLT")))
+    reloc_type = BFD_RELOC_SH_GOTPLT32;
   else if ((next_end = sh_end_of_match (next + 1, "GOT")))
     reloc_type = BFD_RELOC_32_GOT_PCREL;
   else if ((next_end = sh_end_of_match (next + 1, "PLT")))
diff --git a/gas/config/tc-sh64.c b/gas/config/tc-sh64.c
new file mode 100644 (file)
index 0000000..20d4f09
--- /dev/null
@@ -0,0 +1,3513 @@
+/* tc-sh64.c -- Assemble code for the Hitachi Super-H SHcompact and SHmedia.
+   Copyright (C) 2000, 2001, 2002 Free Software Foundation.
+
+   This file is part of GAS, the GNU Assembler.
+
+   GAS is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   GAS is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with GAS; see the file COPYING.  If not, write to
+   the Free Software Foundation, 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/* This file defines SHmedia ISA-specific functions and includes tc-sh.c.
+   The SHcompact ISA is in all useful aspects the "old" sh4 as implemented
+   in tc-sh.c.  Not making this file part of tc-sh.c makes it easier to
+   keep a leaner sh[1-4]-only implementation.  */
+
+#define HAVE_SH64
+
+#include <stdio.h>
+#include "as.h"
+#include "safe-ctype.h"
+#include "opcodes/sh64-opc.h"
+
+#ifndef OBJ_ELF
+#error This file assumes object output is in the ELF format
+#endif
+
+/* Suffix used when we make "datalabel" symbol copies.  It must not
+   collide with anything that can normally appear in a symbol, "faked
+   symbol" or local symbol.  */
+#define DATALABEL_SUFFIX " DL"
+
+/* See shmedia_md_apply_fix3 and shmedia_md_pcrel_from_section for usage.  */
+#define SHMEDIA_MD_PCREL_FROM_FIX(FIXP) \
+ ((FIXP)->fx_size + (FIXP)->fx_where + (FIXP)->fx_frag->fr_address - 4)
+
+/* We use this internally to see which one is PT and which is a PTA/PTB
+   that should be error-checked.  We give it a better name here (but not
+   one that looks official).  Adding it to reloc.c would make it look too
+   much of a real reloc; it is just used temporarily as a fixup-type.  */
+#define SHMEDIA_BFD_RELOC_PT BFD_RELOC_12_PCREL
+
+typedef struct
+ {
+   shmedia_arg_type type;
+
+   /* These could go into a union, but that would uglify the code.  */
+   int reg;
+   expressionS immediate;
+
+   /* If IMMEDIATE was a shift-expression, like "(S >> N) & 65535", where
+      N = 0, 16, 32, 48, used to extract a certain 16-bit-field to make up
+      a MOVI or SHORI relocation for a symbol, then we put the
+      corresponding reloc-type here and modify the "immediate" expression
+      to S.  Otherwise, this is just BFD_RELOC_NONE.  */
+   bfd_reloc_code_real_type reloctype;
+ } shmedia_operand_info;
+
+/* Frag containing last base instruction.  This is put in the TC field in
+   a frag, so we can emit fixups for fr_opcode without needing to make
+   sure that the opcode is in the same frag as any variant operand.  */
+fragS *sh64_last_insn_frag = NULL;
+
+typedef struct
+ {
+   shmedia_operand_info operands[3];
+   unsigned long ops_val;
+ } shmedia_operands_info;
+
+enum sh64_abi_values
+ { sh64_abi_unspecified, sh64_abi_32, sh64_abi_64 };
+
+/* What ISA are we assembling code for?  */
+enum sh64_isa_values sh64_isa_mode = sh64_isa_unspecified;
+
+/* What ABI was specified, if any (implicitly or explicitly)?  */
+static enum sh64_abi_values sh64_abi = sh64_abi_unspecified;
+
+/* A note that says if we're in a sequence of insns without label
+   settings, segment or ISA mode changes or emitted data.  */
+static boolean seen_insn = false;
+
+/* This is set to true in shmedia_md_end, so that we don't emit any
+   .cranges entries when the assembler calls output functions while
+   grinding along after all input is seen.  */
+static boolean sh64_end_of_assembly = false;
+
+/* Controlled by the option -no-mix, this invalidates mixing SHcompact and
+   SHmedia code in the same section, and also invalidates mixing data and
+   SHmedia code in the same section.  No .cranges will therefore be
+   emitted, unless -shcompact-const-crange is specified and there is a
+   constant pool in SHcompact code.  */
+static boolean sh64_mix = true;
+
+static boolean sh64_shcompact_const_crange = false;
+
+/* Controlled by the option -no-expand, this says whether or not we expand
+   MOVI and PT/PTA/PTB.  When we do not expand these insns to fit an
+   operand, we will emit errors for operands out of range and generate the
+   basic instruction and reloc for an external symbol.  */
+static boolean sh64_expand = true;
+
+/* Controlled by the option -expand-pt32, this says whether we expand
+   PT/PTA/PTB of an external symbol to (only) 32 or (the full) 64 bits
+   when -abi=64 is in effect.  */
+static boolean sh64_pt32 = false;
+
+/* When emitting a .cranges descriptor, we want to avoid getting recursive
+   calls through emit_expr.  */
+static boolean emitting_crange = false;
+
+/* SHmedia mnemonics.  */
+static struct hash_control *shmedia_opcode_hash_control = NULL;
+
+static const unsigned char shmedia_big_nop_pattern[4] =
+ {
+   (SHMEDIA_NOP_OPC >> 24) & 255, (SHMEDIA_NOP_OPC >> 16) & 255,
+   (SHMEDIA_NOP_OPC >> 8) & 255, SHMEDIA_NOP_OPC & 255
+ };
+
+static const unsigned char shmedia_little_nop_pattern[4] =
+ {
+   SHMEDIA_NOP_OPC & 255, (SHMEDIA_NOP_OPC >> 8) & 255,
+   (SHMEDIA_NOP_OPC >> 16) & 255, (SHMEDIA_NOP_OPC >> 24) & 255
+ };
+
+static void shmedia_md_begin PARAMS ((void));
+static int shmedia_parse_reg PARAMS ((char *, int *, int *, shmedia_arg_type));
+static void shmedia_md_assemble PARAMS ((char *));
+static void shmedia_md_apply_fix3 PARAMS ((fixS *, valueT *));
+static int shmedia_md_estimate_size_before_relax PARAMS ((fragS *, segT));
+static int shmedia_init_reloc PARAMS ((arelent *, fixS *));
+static char *shmedia_get_operands PARAMS ((shmedia_opcode_info *, char *, shmedia_operands_info *));
+static void s_sh64_mode PARAMS ((int));
+static void s_sh64_abi PARAMS ((int));
+static void shmedia_md_convert_frag PARAMS ((bfd *, segT, fragS *, boolean));
+static void shmedia_check_limits PARAMS ((offsetT *, bfd_reloc_code_real_type, fixS *));
+static void sh64_set_contents_type PARAMS ((enum sh64_elf_cr_type));
+static void shmedia_get_operand PARAMS ((char **, shmedia_operand_info *, shmedia_arg_type));
+static unsigned long shmedia_immediate_op PARAMS ((char *, shmedia_operand_info *, int, bfd_reloc_code_real_type));
+static char *shmedia_parse_exp PARAMS ((char *, shmedia_operand_info *));
+static void shmedia_frob_file_before_adjust PARAMS ((void));
+static void sh64_emit_crange PARAMS ((symbolS *, symbolS *, enum sh64_elf_cr_type));
+static void sh64_flush_last_crange PARAMS ((bfd *, asection *, PTR));
+static void sh64_flag_output PARAMS ((void));
+static void sh64_update_contents_mark PARAMS ((boolean));
+static void sh64_vtable_entry PARAMS ((int));
+static void sh64_vtable_inherit  PARAMS ((int));
+static char * strip_datalabels PARAMS ((void));
+static int shmedia_build_Mytes PARAMS ((shmedia_opcode_info *, shmedia_operands_info *));
+static shmedia_opcode_info * shmedia_find_cooked_opcode PARAMS ((char **));
+static unsigned long shmedia_mask_number PARAMS ((unsigned long, bfd_reloc_code_real_type));
+
+#include "tc-sh.c"
+
+void
+shmedia_md_end ()
+{
+  symbolS *symp;
+
+  /* First, update the last range to include whatever data was last
+     emitted.  */
+  sh64_update_contents_mark (true);
+
+  /* Make sure frags generated after this point are not marked with the
+     wrong ISA; make them easily spottable.  We still want to distinguish
+     it from sh64_isa_unspecified when we compile for SHcompact or
+     SHmedia.  */
+  if (sh64_isa_mode != sh64_isa_unspecified)
+    sh64_isa_mode = sh64_isa_sh5_guard;
+
+  sh64_end_of_assembly = true;
+
+  bfd_map_over_sections (stdoutput, sh64_flush_last_crange, NULL);
+
+  /* Iterate over segments and emit the last .cranges descriptor.  */
+  for (symp = symbol_rootP; symp != NULL; symp = symp->sy_next)
+    {
+      symbolS *mainsym = *symbol_get_tc (symp);
+
+      /* Is this a datalabel symbol; does it have a pointer to the main
+        symbol?  */
+      if (mainsym != NULL)
+       {
+         /* If the datalabel symbol is undefined, check if the main
+            symbol has changed in that respect.  */
+         if (S_GET_SEGMENT (symp) == undefined_section)
+           {
+             segT symseg;
+
+             symseg = S_GET_SEGMENT (mainsym);
+
+             /* If the symbol is now defined to something that is not
+                global and without STO_SH5_ISA32, we just equate the
+                datalabel symbol to the main symbol, and the lack of
+                STO_SH5_ISA32 will handle the datalabelness.  */
+             if (symseg != undefined_section)
+               {
+                 if (S_GET_OTHER (mainsym) != STO_SH5_ISA32)
+                   {
+                     symp->sy_value.X_op = O_symbol;
+                     symp->sy_value.X_add_symbol = mainsym;
+                     symp->sy_value.X_op_symbol = NULL;
+                     symp->sy_value.X_add_number = 0;
+                     S_SET_SEGMENT (symp, S_GET_SEGMENT (mainsym));
+                     symbol_set_frag (symp, &zero_address_frag);
+                     copy_symbol_attributes (symp, mainsym);
+                   }
+                 else
+                   {
+                     /* An undefined symbol has since we saw it at
+                        "datalabel", been defined to a BranchTarget
+                        symbol.  What we need to do here is very similar
+                        to when we find the "datalabel" for a defined
+                        symbol.  FIXME: Break out to common function.  */
+                     symbol_set_value_expression (symp,
+                                                  symbol_get_value_expression
+                                                  (mainsym));
+                     S_SET_SEGMENT (symp, symseg);
+                     symbol_set_frag (symp, symbol_get_frag (mainsym));
+                     copy_symbol_attributes (symp, mainsym);
+
+                     /* Unset the BranchTarget mark that can be set at
+                        attribute-copying. */
+                     S_SET_OTHER (symp,
+                                  S_GET_OTHER (symp) & ~STO_SH5_ISA32); 
+
+                     /* The GLOBAL and WEAK attributes are not copied
+                        over by copy_symbol_attributes.  Do it here. */
+                     if (S_IS_WEAK (mainsym))
+                       S_SET_WEAK (symp);
+                     else if (S_IS_EXTERNAL (mainsym))
+                       S_SET_EXTERNAL (symp);
+                   }
+               }
+             else
+               {
+                 /* A symbol that was defined at the time we saw
+                    "datalabel" can since have been attributed with being
+                    weak or global.  */
+                 if (S_IS_WEAK (mainsym))
+                   S_SET_WEAK (symp);
+                 else if (S_IS_EXTERNAL (mainsym))
+                   S_SET_EXTERNAL (symp);
+               }
+           }
+       }
+    }
+
+  for (symp = symbol_rootP; symp != NULL; symp = symp->sy_next)
+    if (S_GET_OTHER (symp) & STO_SH5_ISA32)
+      symp->sy_value.X_add_number++;
+}
+
+/* When resolving symbols, the main assembler has done us a misfavour.  It
+   has removed the equation to the main symbol for a datalabel reference
+   that should be equal to the main symbol, e.g. when it's a global or
+   weak symbol and is a non-BranchTarget symbol anyway.  We change that
+   back, so that relocs are against the main symbol, not the local "section
+   + offset" value.  */
+
+static void
+shmedia_frob_file_before_adjust ()
+{
+  symbolS *symp;
+  for (symp = symbol_rootP; symp != NULL; symp = symp->sy_next)
+    {
+      symbolS *mainsym = *symbol_get_tc (symp);
+
+      if (mainsym != NULL
+         && S_GET_OTHER (mainsym) != STO_SH5_ISA32
+         && (S_IS_EXTERN (mainsym) || S_IS_WEAK (mainsym)))
+       {
+         symp->sy_value.X_op = O_symbol;
+         symp->sy_value.X_add_symbol = mainsym;
+         symp->sy_value.X_op_symbol = NULL;
+         symp->sy_value.X_add_number = 0;
+
+         /* For the "equation trick" to work, we have to set the section
+            to undefined.  */
+         S_SET_SEGMENT (symp, undefined_section);
+         symbol_set_frag (symp, &zero_address_frag);
+         copy_symbol_attributes (symp, mainsym);
+
+         /* Don't forget to remove the STO_SH5_ISA32 attribute after
+            copying the other attributes.  */
+         S_SET_OTHER (symp, S_GET_OTHER (symp) & ~STO_SH5_ISA32);
+       }
+    }
+}
+
+/* We need to mark the current location after the alignment.  This is
+   copied code the caller, do_align.  We mark the frag location before and
+   after as we need and arrange to skip the same code in do_align.
+
+   An alternative to code duplication is to call the do_align recursively,
+   arranging to fall through into do_align if we're already here.  That
+   would require do_align as an incoming function parameter, since it's
+   static in read.c.  That solution was discarded a too kludgy.  */
+
+void
+sh64_do_align (n, fill, len, max)
+     int n;
+     const char *fill;
+     int len;
+     int max;
+{
+  /* Update region, or put a data region in front.  */
+  sh64_update_contents_mark (true);
+
+  /* Only make a frag if we HAVE to...  */
+  if (n != 0 && !need_pass_2)
+    {
+      if (fill == NULL)
+       {
+         if (subseg_text_p (now_seg))
+           frag_align_code (n, max);
+         else
+           frag_align (n, 0, max);
+       }
+      else if (len <= 1)
+       frag_align (n, *fill, max);
+      else
+       frag_align_pattern (n, fill, len, max);
+    }
+
+  /* Update mark for current region with current type.  */
+  sh64_update_contents_mark (false);
+}
+
+/* The MAX_MEM_FOR_RS_ALIGN_CODE worker.  We have to find out the ISA of
+   the current segment at this position.  We can't look just at
+   sh64_isa_shmedia, and we can't look at frag_now.  This is brittle:
+   callers are currently frag_align_code from subsegs_finish in write.c
+   (end of assembly) and frag_align_code from do_align in read.c (during
+   assembly).  */
+
+int
+sh64_max_mem_for_rs_align_code ()
+{
+  segment_info_type *seginfo;
+  fragS *mode_start_frag;
+  seginfo = seg_info (now_seg);
+
+  /* We don't use the contents type we find at the tc_segment_info_data,
+     since that does not give us absolute information about the ISA; the
+     contents type can presumably be CRT_DATA and we'd be none the wiser.
+     Instead we use the information stored at the frag of the symbol at
+     the start of this range.  If any information is missing or NULL,
+     assume SHcompact.  */
+  return
+    /* If the current ISA mode is SHmedia, that's the mode that we're
+       going to assign to the new frag, so request enough memory for
+       it, even if we switch modes afterwards, otherwise we may
+       allocate too little memory and end up overflowing our buffer.  */
+    (sh64_isa_mode == sh64_isa_shmedia
+     || (sh64_isa_mode != sh64_isa_unspecified
+        && seginfo != NULL
+        && seginfo->tc_segment_info_data.mode_start_symbol != NULL
+        && ((mode_start_frag
+             = (symbol_get_frag
+                (seginfo->tc_segment_info_data.mode_start_symbol)))
+            != NULL)
+        && mode_start_frag->tc_frag_data.isa == sh64_isa_shmedia))
+    ? (3 + 4) : (2 + 1);
+}
+
+/* Put in SHmedia NOP:s if the alignment was created when in SHmedia mode.  */
+
+void
+sh64_handle_align (frag)
+     fragS * frag;
+{
+  int bytes = frag->fr_next->fr_address - frag->fr_address - frag->fr_fix;
+  char * p  = frag->fr_literal + frag->fr_fix;
+
+  if (frag->tc_frag_data.isa == sh64_isa_shmedia
+      && frag->fr_type == rs_align_code)
+    {
+      while (bytes & 3)
+       {
+         *p++ = 0;
+         bytes--;
+         frag->fr_fix += 1;
+       }
+
+      if (target_big_endian)
+       {
+         memcpy (p, shmedia_big_nop_pattern,
+                 sizeof shmedia_big_nop_pattern);
+         frag->fr_var = sizeof shmedia_big_nop_pattern;
+       }
+      else
+       {
+         memcpy (p, shmedia_little_nop_pattern,
+                 sizeof shmedia_little_nop_pattern);
+         frag->fr_var = sizeof shmedia_little_nop_pattern;
+       }
+    }
+  else
+    /* Punt to SHcompact function.  */
+    sh_handle_align (frag);
+}
+
+/* Set SEC_SH64_ISA32 for SHmedia sections.  */
+
+void
+shmedia_frob_section_type (sec)
+     asection *sec;
+{
+  segment_info_type *seginfo;
+  seginfo = seg_info (sec);
+
+  /* This and elf32-sh64.c:sh64_elf_fake_sections are the only places
+     where we use anything else than ELF header flags to communicate the
+     section as containing SHmedia or other contents.  BFD SEC_* section
+     flags are running out and should not be overloaded with
+     target-specific semantics.  This target is ELF only (semantics not
+     defined for other formats), so we use the target-specific pointer
+     field of the ELF section data.  */
+  if (seginfo)
+    {
+      struct sh64_section_data *sec_elf_data;
+      flagword sec_type = 0;
+
+      if (seginfo->tc_segment_info_data.emitted_ranges != 0)
+       sec_type = SHF_SH5_ISA32_MIXED;
+      else if (seginfo->tc_segment_info_data.contents_type == CRT_SH5_ISA32)
+       sec_type = SHF_SH5_ISA32;
+
+      sec_elf_data = sh64_elf_section_data (sec);
+      if (sec_elf_data == NULL)
+       {
+         sec_elf_data = xcalloc (1, sizeof (*sec_elf_data));
+         sh64_elf_section_data (sec) = sec_elf_data;
+       }
+
+      sec_elf_data->contents_flags = sec_type;
+    }
+}
+
+/* This function is called by write_object_file right before the symbol
+   table is written.  We subtract 1 from all symbols marked STO_SH5_ISA32,
+   as their values are temporarily incremented in shmedia_md_end, before
+   symbols values are used by relocs and fixups.
+
+   To increment all symbols and then decrement here is admittedly a
+   hackish solution.  The alternative is to add infrastructure and hooks
+   to symbol evaluation that evaluates symbols differently internally to
+   the value output into the object file, but at the moment that just
+   seems too much for little benefit.  */
+
+void
+sh64_adjust_symtab ()
+{
+  symbolS *symp;
+
+  for (symp = symbol_rootP; symp; symp = symbol_next (symp))
+    {
+      symbolS *main_symbol = *symbol_get_tc (symp);
+
+      if (main_symbol)
+       {
+         char *sym_name = (char *) S_GET_NAME (symp);
+         
+         /* All datalabels not used in relocs should be gone by now.
+
+            We change those remaining to have the name of the main
+            symbol, and we set the ELF type of the symbol of the reloc to
+            STT_DATALABEL.  */
+         sym_name[strlen (sym_name) - strlen (DATALABEL_SUFFIX)] = 0;
+         elf_symbol (symbol_get_bfdsym (symp))->internal_elf_sym.st_info
+           = STT_DATALABEL;
+
+         /* Also set this symbol to "undefined", so we'll have only one
+            definition.  */
+         S_SET_SEGMENT (symp, undefined_section);
+       }
+      else if (S_GET_OTHER (symp) & STO_SH5_ISA32)
+       {
+         /* It's important to change the BFD symbol value, since it is now
+            set to the GAS symbolS value.  */
+         symp->bsym->value--;
+
+         /* Note that we do *not* adjust symp->sy_value.X_add_number.  If
+            you do this, the test case in sh/sh64/immexpr2.s will fail.
+            This is because *after* symbols have been output but before
+            relocs are output, fixups are inspected one more time, and
+            some leftover expressions are resolved.  To resolve to the
+            same values, those expressions must have the same GAS symbol
+            values before as after symbols have been output.  We could
+            "symp->sy_value.X_add_number++" on the STO_SH5_ISA32 symbols
+            through tc_frob_file after symbols have been output, but that
+            would be too gross.  */
+       }
+    }
+}
+
+/* Fill-in an allocated arelent.  */
+
+static int
+shmedia_init_reloc (rel, fixP)
+     arelent *rel;
+     fixS *fixP;
+{
+  /* Adjust parts of *relp according to *fixp, and tell that it has been
+     done, so default initializations will not happen.   */
+  switch (fixP->fx_r_type)
+    {
+    case BFD_RELOC_64:
+    case BFD_RELOC_64_PCREL:
+    case BFD_RELOC_SH_IMM_LOW16:
+    case BFD_RELOC_SH_IMM_MEDLOW16:
+    case BFD_RELOC_SH_IMM_MEDHI16:
+    case BFD_RELOC_SH_IMM_HI16:
+    case BFD_RELOC_SH_IMM_LOW16_PCREL:
+    case BFD_RELOC_SH_IMM_MEDLOW16_PCREL:
+    case BFD_RELOC_SH_IMM_MEDHI16_PCREL:
+    case BFD_RELOC_SH_IMM_HI16_PCREL:
+    case BFD_RELOC_SH_IMMU5:
+    case BFD_RELOC_SH_IMMU6:
+    case BFD_RELOC_SH_IMMS6:
+    case BFD_RELOC_SH_IMMS10:
+    case BFD_RELOC_SH_IMMS10BY2:
+    case BFD_RELOC_SH_IMMS10BY4:
+    case BFD_RELOC_SH_IMMS10BY8:
+    case BFD_RELOC_SH_IMMS16:
+    case BFD_RELOC_SH_IMMU16:
+    case BFD_RELOC_SH_PT_16:
+    case BFD_RELOC_SH_GOT_LOW16:
+    case BFD_RELOC_SH_GOT_MEDLOW16:
+    case BFD_RELOC_SH_GOT_MEDHI16:
+    case BFD_RELOC_SH_GOT_HI16:
+    case BFD_RELOC_SH_GOT10BY4:
+    case BFD_RELOC_SH_GOT10BY8:
+    case BFD_RELOC_SH_GOTPLT_LOW16:
+    case BFD_RELOC_SH_GOTPLT_MEDLOW16:
+    case BFD_RELOC_SH_GOTPLT_MEDHI16:
+    case BFD_RELOC_SH_GOTPLT_HI16:
+    case BFD_RELOC_SH_GOTPLT10BY4:
+    case BFD_RELOC_SH_GOTPLT10BY8:
+    case BFD_RELOC_SH_GOTOFF_LOW16:
+    case BFD_RELOC_SH_GOTOFF_MEDLOW16:
+    case BFD_RELOC_SH_GOTOFF_MEDHI16:
+    case BFD_RELOC_SH_GOTOFF_HI16:
+    case BFD_RELOC_SH_GOTPC_LOW16:
+    case BFD_RELOC_SH_GOTPC_MEDLOW16:
+    case BFD_RELOC_SH_GOTPC_MEDHI16:
+    case BFD_RELOC_SH_GOTPC_HI16:
+    case BFD_RELOC_SH_PLT_LOW16:
+    case BFD_RELOC_SH_PLT_MEDLOW16:
+    case BFD_RELOC_SH_PLT_MEDHI16:
+    case BFD_RELOC_SH_PLT_HI16:
+      rel->addend = fixP->fx_addnumber + fixP->fx_offset;
+      return 1;
+
+    case BFD_RELOC_SH_IMMS6BY32:
+      /* This must be resolved in assembly; we do not support it as a
+        reloc in an object file.  */
+      as_bad_where (fixP->fx_file, fixP->fx_line,
+                   _("This operand must be constant at assembly time"));
+      break;
+
+      /* There are valid cases where we get here for other than SHmedia
+        relocs, so don't make a BAD_CASE out of this.  */
+    default:
+      ;
+    }
+
+  return 0;
+}
+
+/* Hook called from md_apply_fix3 in tc-sh.c.  */
+
+static void
+shmedia_md_apply_fix3 (fixP, valp)
+     fixS *fixP;
+     valueT *valp;
+{
+  offsetT val = *valp;
+  char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
+  unsigned long insn
+    = target_big_endian ? bfd_getb32 (buf) : bfd_getl32 (buf);
+  bfd_reloc_code_real_type orig_fx_r_type = fixP->fx_r_type;
+
+  /* Change a 64-bit pc-relative reloc into the correct type, just like
+     tc-sh.c:md_apply_fix.  */
+  if (fixP->fx_pcrel)
+    {
+      switch (orig_fx_r_type)
+       {
+       case BFD_RELOC_64:
+       case BFD_RELOC_SH_IMM_LOW16:
+       case BFD_RELOC_SH_IMM_MEDLOW16:
+       case BFD_RELOC_SH_IMM_MEDHI16:
+       case BFD_RELOC_SH_IMM_HI16:
+         /* Because write.c calls MD_PCREL_FROM_SECTION twice, we need to
+            undo one of the adjustments, if the relocation is not
+            actually for a symbol within the same segment (which we
+            cannot check, because we're not called from md_apply_fix3, so
+            we have to keep the reloc).  FIXME: This is a bug in
+            write.c:fixup_segment affecting most targets that change
+            ordinary relocs to pcrel relocs in md_apply_fix.  */
+         fixP->fx_offset
+           = *valp + SHMEDIA_MD_PCREL_FROM_FIX (fixP);
+         break;
+
+       case BFD_RELOC_SH_PLT_LOW16:
+       case BFD_RELOC_SH_PLT_MEDLOW16:
+       case BFD_RELOC_SH_PLT_MEDHI16:
+       case BFD_RELOC_SH_PLT_HI16:
+       case BFD_RELOC_SH_GOTPC_LOW16:
+       case BFD_RELOC_SH_GOTPC_MEDLOW16:
+       case BFD_RELOC_SH_GOTPC_MEDHI16:
+       case BFD_RELOC_SH_GOTPC_HI16:
+         *valp = 0;
+         return;
+
+       default:
+         ;
+       }
+
+      /* We might need to change some relocs into the corresponding
+        PC-relative one.  */
+      switch (orig_fx_r_type)
+       {
+       case BFD_RELOC_64:
+         fixP->fx_r_type = BFD_RELOC_64_PCREL;
+         break;
+
+       case BFD_RELOC_SH_IMM_LOW16:
+         fixP->fx_r_type = BFD_RELOC_SH_IMM_LOW16_PCREL;
+         break;
+
+       case BFD_RELOC_SH_IMM_MEDLOW16:
+         fixP->fx_r_type = BFD_RELOC_SH_IMM_MEDLOW16_PCREL;
+         break;
+
+       case BFD_RELOC_SH_IMM_MEDHI16:
+         fixP->fx_r_type = BFD_RELOC_SH_IMM_MEDHI16_PCREL;
+         break;
+
+       case BFD_RELOC_SH_IMM_HI16:
+         fixP->fx_r_type = BFD_RELOC_SH_IMM_HI16_PCREL;
+         break;
+
+       case SHMEDIA_BFD_RELOC_PT:
+         /* This is how we see a difference between PT and PTA when not
+            expanding (in which case we handle it in
+            shmedia_md_convert_frag).  Note that we don't see a
+            difference after the reloc is emitted.  */
+         fixP->fx_r_type = BFD_RELOC_SH_PT_16;
+         break;
+
+       case BFD_RELOC_SH_PT_16:
+         /* This tells us there was a PTA or PTB insn explicitly
+            expressed as such (not as PT).  We "or" in a 1 into the
+            lowest bit in the (unused) destination field to tell the
+            linker that it should check the right ISA type of the
+            destination and not just change a PTA to PTB (if necessary).  */
+         md_number_to_chars (buf, insn | (1 << 10), 4);
+         break;
+
+       case BFD_RELOC_64_PCREL:
+       case BFD_RELOC_SH_IMM_LOW16_PCREL:
+       case BFD_RELOC_SH_IMM_MEDLOW16_PCREL:
+       case BFD_RELOC_SH_IMM_MEDHI16_PCREL:
+       case BFD_RELOC_SH_IMM_HI16_PCREL:
+         /* Already handled.  */
+         break;
+
+       default:
+         /* Everything else that changes into a pc-relative relocation is
+            an error.  */
+         as_bad_where (fixP->fx_file, fixP->fx_line,
+                       _("Invalid operand expression"));
+         break;
+       }
+
+      return;
+    }
+
+  /* If an expression looked like it was PC-relative, but was completely
+     resolvable, we end up here with the result only in *VALP, and no
+     relocation will be emitted.  */
+  if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
+    {
+      /* Emit error for an out-of-range value.  */
+      shmedia_check_limits (valp, fixP->fx_r_type, fixP);
+
+      switch (fixP->fx_r_type)
+       {
+       case BFD_RELOC_SH_IMM_LOW16:
+         md_number_to_chars (buf, insn | ((val & 65535) << 10), 4);
+         break;
+
+       case BFD_RELOC_SH_IMM_MEDLOW16:
+         md_number_to_chars (buf,
+                             insn
+                             | ((valueT) (val & ((valueT) 65535 << 16))
+                                >> (16 - 10)), 4);
+         break;
+
+       case BFD_RELOC_SH_IMM_MEDHI16:
+         md_number_to_chars (buf,
+                             insn
+                             | ((valueT) (val & ((valueT) 65535 << 32))
+                                >> (32 - 10)), 4);
+         break;
+
+       case BFD_RELOC_SH_IMM_HI16:
+         md_number_to_chars (buf,
+                             insn
+                             | ((valueT) (val & ((valueT) 65535 << 48))
+                                >> (48 - 10)), 4);
+         break;
+
+       case BFD_RELOC_SH_IMMS16:
+       case BFD_RELOC_SH_IMMU16:
+         md_number_to_chars (buf, insn | ((val & 65535) << 10), 4);
+         break;
+
+       case BFD_RELOC_SH_IMMS10:
+         md_number_to_chars (buf, insn | ((val & 0x3ff) << 10), 4);
+         break;
+
+       case BFD_RELOC_SH_IMMS10BY2:
+         md_number_to_chars (buf,
+                             insn | ((val & (0x3ff << 1)) << (10 - 1)), 4);
+         break;
+
+       case BFD_RELOC_SH_IMMS10BY4:
+         md_number_to_chars (buf,
+                             insn | ((val & (0x3ff << 2)) << (10 - 2)), 4);
+         break;
+
+       case BFD_RELOC_SH_SHMEDIA_CODE:
+         /* We just ignore and remove this one for the moment.  FIXME:
+            Use it when implementing relaxing.  */
+         break;
+
+       case BFD_RELOC_64:
+         md_number_to_chars (buf, val, 8);
+         break;
+
+       case SHMEDIA_BFD_RELOC_PT:
+         /* Change a PT to PTB if the operand turned out to be SHcompact.
+            The basic opcode specified with PT is equivalent to PTA.  */
+         if ((val & 1) == 0)
+           insn |= SHMEDIA_PTB_BIT;
+         /* Fall through.  */
+
+       case BFD_RELOC_SH_PT_16:
+         if (! sh64_expand || sh_relax)
+           {
+             /* Check if the operand of a PTA or PTB was for the "wrong"
+                ISA.  A PT had an incoming fixup of SHMEDIA_BFD_RELOC_PT,
+                which we have changed to the right type above.  */
+             if (orig_fx_r_type != SHMEDIA_BFD_RELOC_PT)
+               {
+                 if ((insn & SHMEDIA_PTB_BIT) != 0 && (val & 1) != 0)
+                   as_bad_where (fixP->fx_file, fixP->fx_line,
+                                 _("PTB operand is a SHmedia symbol"));
+                 else if ((insn & SHMEDIA_PTB_BIT) == 0 && (val & 1) == 0)
+                   as_bad_where (fixP->fx_file, fixP->fx_line,
+                                 _("PTA operand is a SHcompact symbol"));
+               }
+
+             md_number_to_chars (buf,
+                                 insn | ((val & (0xffff << 2))
+                                         << (10 - 2)),
+                                 4);
+             break;
+           }
+         /* Fall through.  */
+
+       default:
+         /* This isn't a BAD_CASE, because presumably we can get here
+            from unexpected operands.  Since we don't handle them, make
+            them syntax errors.  */
+         as_bad_where (fixP->fx_file, fixP->fx_line,
+                       _("invalid expression in operand"));
+       }
+      fixP->fx_done = 1;
+    }
+}
+
+/* Hook called from md_convert_frag in tc-sh.c.  */
+
+static void
+shmedia_md_convert_frag (output_bfd, seg, fragP, final)
+     bfd *output_bfd ATTRIBUTE_UNUSED;
+     segT seg ATTRIBUTE_UNUSED;
+     fragS *fragP;
+     boolean final;
+{
+  /* Pointer to first byte in variable-sized part of the frag. */
+  char *var_partp;
+
+  /* Pointer to first opcode byte in frag.  */
+  char *opcodep;
+
+  /* Pointer to frag of opcode.  */
+  fragS *opc_fragP = fragP->tc_frag_data.opc_frag;
+
+  /* Size in bytes of variable-sized part of frag.  */
+  int var_part_size = 0;
+
+  /* This is part of *fragP.  It contains all information about addresses
+     and offsets to varying parts.  */
+  symbolS *symbolP = fragP->fr_symbol;
+
+  boolean reloc_needed
+    = (! final
+       || sh_relax
+       || symbolP == NULL
+       || ! S_IS_DEFINED (symbolP)
+       || S_IS_EXTERN (symbolP)
+       || S_IS_WEAK (symbolP)
+       || (S_GET_SEGMENT (fragP->fr_symbol) != absolute_section
+          && S_GET_SEGMENT (fragP->fr_symbol) != seg));
+
+  bfd_reloc_code_real_type reloctype = BFD_RELOC_NONE;
+
+  unsigned long var_part_offset;
+
+  /* Where, in file space, does addr point?  */
+  bfd_vma target_address;
+  bfd_vma opcode_address;
+
+  /* What was the insn?  */
+  unsigned long insn;
+  know (fragP->fr_type == rs_machine_dependent);
+
+  var_part_offset = fragP->fr_fix;
+  var_partp = fragP->fr_literal + var_part_offset;
+  opcodep = fragP->fr_opcode;
+
+  insn = target_big_endian ? bfd_getb32 (opcodep) : bfd_getl32 (opcodep);
+
+  target_address
+    = ((symbolP && final && ! sh_relax ? S_GET_VALUE (symbolP) : 0)
+       + fragP->fr_offset);
+
+  /* The opcode that would be extended is the last four "fixed" bytes.  */
+  opcode_address = fragP->fr_address + fragP->fr_fix - 4;
+
+  switch (fragP->fr_subtype)
+    {
+    case C (SH64PCREL16PT_64, SH64PCREL16):
+    case C (SH64PCREL16PT_32, SH64PCREL16):
+      /* We can get a PT to a relaxed SHcompact address if it is in the
+        same section; a mixed-ISA section.  Change the opcode to PTB if
+        so.  */
+      if ((target_address & 1) == 0)
+       insn |= SHMEDIA_PTB_BIT;
+      /* Fall through.  */
+
+    case C (SH64PCREL16_32, SH64PCREL16):
+    case C (SH64PCREL16_64, SH64PCREL16):
+      /* Check that a PTA or PTB points to the right type of target.  We
+        can get here for a SHcompact target if we are in a mixed-ISA
+        section.  */
+      if (((target_address & 1) == 0) && ((insn & SHMEDIA_PTB_BIT) == 0))
+       as_bad_where (fragP->fr_file, fragP->fr_line,
+                     _("PTA operand is a SHcompact symbol"));
+      if (((target_address & 1) != 0) && ((insn & SHMEDIA_PTB_BIT) != 0))
+       as_bad_where (fragP->fr_file, fragP->fr_line,
+                     _("PTB operand is a SHmedia symbol"));
+
+      /* When relaxing, we do not output the address in the insn, but
+        instead a 1 into the low bit.  This matches what the linker
+        expects to find for a BFD_RELOC_SH_PT_16 reloc, when it checks
+        correctness for PTA/PTB insn; used when the target address is
+        unknown (which is not the case here).  */
+      md_number_to_chars (opcodep,
+                         insn
+                         | (((sh_relax
+                              ? 1 : ((target_address - opcode_address) / 4))
+                             & ((1 << 16) - 1)) << 10),
+                         4);
+
+      /* Note that we do not emit info that this was originally a PT since
+        we have resolved to which one of PTA or PTB it will be.  */
+      if (sh_relax)
+       fix_new (opc_fragP, opcodep - opc_fragP->fr_literal, 4,
+                fragP->fr_symbol, fragP->fr_offset, 1, BFD_RELOC_SH_PT_16);
+      var_part_size = 0;
+      break;
+
+    case C (SH64PCREL16_32, SH64PCRELPLT):
+    case C (SH64PCREL16PT_32, SH64PCRELPLT):
+      reloctype = BFD_RELOC_32_PLT_PCREL;
+      reloc_needed = 1;
+      /* Fall through */
+
+    case C (SH64PCREL16_32, SH64PCREL32):
+    case C (SH64PCREL16_64, SH64PCREL32):
+    case C (SH64PCREL16PT_32, SH64PCREL32):
+    case C (SH64PCREL16PT_64, SH64PCREL32):
+      /* In the fixed bit, put in a MOVI.  */
+      md_number_to_chars (opcodep,
+                         SHMEDIA_MOVI_OPC
+                         | (SHMEDIA_TEMP_REG << 4)
+                         | ((((reloc_needed
+                               ? 0 : (target_address - (opcode_address + 8))
+                               ) >> 16) & 65535) << 10),
+                         4);
+
+      /* Fill in a SHORI for the low part.  */
+      md_number_to_chars (var_partp,
+                         SHMEDIA_SHORI_OPC
+                         | (SHMEDIA_TEMP_REG << 4)
+                         | (((reloc_needed
+                              ? 0 : (target_address - (opcode_address + 8)))
+                             & 65535) << 10),
+                         4);
+
+      /* End with a "PTREL R25,TRd".  */
+      md_number_to_chars (var_partp + 4,
+                         SHMEDIA_PTREL_OPC | (insn & SHMEDIA_LIKELY_BIT)
+                         | (SHMEDIA_TEMP_REG << 10)
+                         | (insn & (7 << 4)),
+                         4);
+
+      /* We need relocs only if the target symbol was undefined or if
+        we're relaxing.  */
+      if (reloc_needed)
+       {
+         fix_new (opc_fragP, opcodep - opc_fragP->fr_literal, 4,
+                  fragP->fr_symbol, fragP->fr_offset - 8, 1,
+                  reloctype == BFD_RELOC_32_PLT_PCREL
+                  ? BFD_RELOC_SH_PLT_MEDLOW16
+                  : BFD_RELOC_SH_IMM_MEDLOW16_PCREL);
+         fix_new (fragP, var_partp - fragP->fr_literal, 4, fragP->fr_symbol,
+                  fragP->fr_offset - 4, 1,
+                  reloctype == BFD_RELOC_32_PLT_PCREL
+                  ? BFD_RELOC_SH_PLT_LOW16
+                  : BFD_RELOC_SH_IMM_LOW16_PCREL);
+       }
+
+      var_part_size = 8;
+      break;
+
+    case C (SH64PCREL16_64, SH64PCREL48):
+    case C (SH64PCREL16PT_64, SH64PCREL48):
+      /* In the fixed bit, put in a MOVI.  */
+      md_number_to_chars (opcodep,
+                         SHMEDIA_MOVI_OPC
+                         | (SHMEDIA_TEMP_REG << 4)
+                         | ((((reloc_needed
+                               ? 0 : (target_address - (opcode_address + 12))
+                               ) >> 32) & 65535) << 10),
+                         4);
+
+      /* The first SHORI, for the medium part.  */
+      md_number_to_chars (var_partp,
+                         SHMEDIA_SHORI_OPC
+                         | (SHMEDIA_TEMP_REG << 4)
+                         | ((((reloc_needed
+                               ? 0 : (target_address - (opcode_address + 12))
+                               ) >> 16) & 65535) << 10),
+                         4);
+
+      /* Fill in a SHORI for the low part.  */
+      md_number_to_chars (var_partp + 4,
+                         SHMEDIA_SHORI_OPC
+                         | (SHMEDIA_TEMP_REG << 4)
+                         | (((reloc_needed
+                              ? 0 : (target_address - (opcode_address + 12)))
+                             & 65535) << 10),
+                         4);
+
+      /* End with a "PTREL R25,TRd".  */
+      md_number_to_chars (var_partp + 8,
+                         SHMEDIA_PTREL_OPC | (insn & SHMEDIA_LIKELY_BIT)
+                         | (SHMEDIA_TEMP_REG << 10)
+                         | (insn & (7 << 4)),
+                         4);
+
+      /* We need relocs only if the target symbol was undefined or if
+        we're relaxing.  */
+      if (reloc_needed)
+       {
+         fix_new (opc_fragP, opcodep - opc_fragP->fr_literal, 4,
+                  fragP->fr_symbol, fragP->fr_offset - 12, 1,
+                  reloctype == BFD_RELOC_32_PLT_PCREL
+                  ? BFD_RELOC_SH_PLT_MEDHI16
+                  : BFD_RELOC_SH_IMM_MEDHI16_PCREL);
+         fix_new (fragP, var_partp - fragP->fr_literal, 4, fragP->fr_symbol,
+                  fragP->fr_offset - 8, 1,
+                  reloctype == BFD_RELOC_32_PLT_PCREL
+                  ? BFD_RELOC_SH_PLT_MEDLOW16
+                  : BFD_RELOC_SH_IMM_MEDLOW16_PCREL);
+         fix_new (fragP, var_partp - fragP->fr_literal + 4, 4, fragP->fr_symbol,
+                  fragP->fr_offset - 4, 1,
+                  reloctype == BFD_RELOC_32_PLT_PCREL
+                  ? BFD_RELOC_SH_PLT_LOW16
+                  : BFD_RELOC_SH_IMM_LOW16_PCREL);
+       }
+
+      var_part_size = 12;
+      break;
+
+    case C (SH64PCREL16_64, SH64PCRELPLT):
+    case C (SH64PCREL16PT_64, SH64PCRELPLT):
+      reloctype = BFD_RELOC_32_PLT_PCREL;
+      reloc_needed = 1;
+      /* Fall through */
+
+    case C (SH64PCREL16_64, SH64PCREL64):
+    case C (SH64PCREL16PT_64, SH64PCREL64):
+      /* In the fixed bit, put in a MOVI.  */
+      md_number_to_chars (opcodep,
+                         SHMEDIA_MOVI_OPC
+                         | (SHMEDIA_TEMP_REG << 4)
+                         | ((((reloc_needed
+                               ? 0 : (target_address - (opcode_address + 16))
+                               ) >> 48) & 65535) << 10),
+                         4);
+
+      /* The first SHORI, for the medium-high part.  */
+      md_number_to_chars (var_partp,
+                         SHMEDIA_SHORI_OPC
+                         | (SHMEDIA_TEMP_REG << 4)
+                         | ((((reloc_needed
+                               ? 0 : (target_address - (opcode_address + 16))
+                               ) >> 32) & 65535) << 10),
+                         4);
+
+      /* A SHORI, for the medium-low part.  */
+      md_number_to_chars (var_partp + 4,
+                         SHMEDIA_SHORI_OPC
+                         | (SHMEDIA_TEMP_REG << 4)
+                         | ((((reloc_needed
+                               ? 0 : (target_address - (opcode_address + 16))
+                               ) >> 16) & 65535) << 10),
+                         4);
+
+      /* Fill in a SHORI for the low part.  */
+      md_number_to_chars (var_partp + 8,
+                         SHMEDIA_SHORI_OPC
+                         | (SHMEDIA_TEMP_REG << 4)
+                         | (((reloc_needed
+                              ? 0 : (target_address - (opcode_address + 16)))
+                             & 65535) << 10),
+                         4);
+
+      /* End with a "PTREL R25,TRd".  */
+      md_number_to_chars (var_partp + 12,
+                         SHMEDIA_PTREL_OPC | (insn & SHMEDIA_LIKELY_BIT)
+                         | (SHMEDIA_TEMP_REG << 10)
+                         | (insn & (7 << 4)),
+                         4);
+
+      /* We need relocs only if the target symbol was undefined or if
+        we're relaxing.  */
+      if (reloc_needed)
+       {
+         fix_new (opc_fragP, opcodep - opc_fragP->fr_literal, 4,
+                  fragP->fr_symbol, fragP->fr_offset - 16, 1,
+                  reloctype == BFD_RELOC_32_PLT_PCREL
+                  ? BFD_RELOC_SH_PLT_HI16
+                  : BFD_RELOC_SH_IMM_HI16_PCREL);
+         fix_new (fragP, var_partp - fragP->fr_literal, 4, fragP->fr_symbol,
+                  fragP->fr_offset - 12, 1,
+                  reloctype == BFD_RELOC_32_PLT_PCREL
+                  ? BFD_RELOC_SH_PLT_MEDHI16
+                  : BFD_RELOC_SH_IMM_MEDHI16_PCREL);
+         fix_new (fragP, var_partp - fragP->fr_literal + 4, 4, fragP->fr_symbol,
+                  fragP->fr_offset - 8, 1,
+                  reloctype == BFD_RELOC_32_PLT_PCREL
+                  ? BFD_RELOC_SH_PLT_MEDLOW16
+                  : BFD_RELOC_SH_IMM_MEDLOW16_PCREL);
+         fix_new (fragP, var_partp - fragP->fr_literal + 8, 4, fragP->fr_symbol,
+                  fragP->fr_offset - 4, 1,
+                  reloctype == BFD_RELOC_32_PLT_PCREL
+                  ? BFD_RELOC_SH_PLT_LOW16
+                  : BFD_RELOC_SH_IMM_LOW16_PCREL);
+       }
+
+      var_part_size = 16;
+      break;
+
+    case C (MOVI_IMM_64, MOVI_GOTOFF):
+      reloctype = BFD_RELOC_32_GOTOFF;
+      reloc_needed = 1;
+      /* Fall through.  */
+      
+    case C (MOVI_IMM_64, UNDEF_MOVI):
+    case C (MOVI_IMM_64, MOVI_64):
+      {
+       /* We only get here for undefined symbols, so we can simplify
+          handling compared to those above; we have 0 in the parts that
+          will be filled with the symbol parts.  */
+
+       int reg = (insn >> 4) & 0x3f;
+
+       /* In the fixed bit, put in a MOVI.  */
+       md_number_to_chars (opcodep, SHMEDIA_MOVI_OPC | (reg << 4), 4);
+       fix_new (opc_fragP, opcodep - opc_fragP->fr_literal, 4,
+                fragP->fr_symbol, fragP->fr_offset, 0,
+                reloctype == BFD_RELOC_NONE
+                ? BFD_RELOC_SH_IMM_HI16
+                : reloctype == BFD_RELOC_32_GOTOFF
+                ? BFD_RELOC_SH_GOTOFF_HI16
+                : (abort (), BFD_RELOC_SH_IMM_HI16));
+
+       /* The first SHORI, for the medium-high part.  */
+       md_number_to_chars (var_partp, SHMEDIA_SHORI_OPC | (reg << 4), 4);
+       fix_new (fragP, var_partp - fragP->fr_literal, 4, fragP->fr_symbol,
+                fragP->fr_offset, 0,
+                reloctype == BFD_RELOC_NONE
+                ? BFD_RELOC_SH_IMM_MEDHI16
+                : reloctype == BFD_RELOC_32_GOTOFF
+                ? BFD_RELOC_SH_GOTOFF_MEDHI16
+                : (abort (), BFD_RELOC_SH_IMM_MEDHI16));
+
+       /* A SHORI, for the medium-low part.  */
+       md_number_to_chars (var_partp + 4,
+                           SHMEDIA_SHORI_OPC | (reg << 4), 4);
+       fix_new (fragP, var_partp - fragP->fr_literal + 4, 4, fragP->fr_symbol,
+                fragP->fr_offset, 0,
+                reloctype == BFD_RELOC_NONE
+                ? BFD_RELOC_SH_IMM_MEDLOW16
+                : reloctype == BFD_RELOC_32_GOTOFF
+                ? BFD_RELOC_SH_GOTOFF_MEDLOW16
+                : (abort (), BFD_RELOC_SH_IMM_MEDLOW16));
+
+       /* Fill in a SHORI for the low part.  */
+       md_number_to_chars (var_partp + 8,
+                           SHMEDIA_SHORI_OPC | (reg << 4), 4);
+       fix_new (fragP, var_partp - fragP->fr_literal + 8, 4, fragP->fr_symbol,
+                fragP->fr_offset, 0,
+                reloctype == BFD_RELOC_NONE
+                ? BFD_RELOC_SH_IMM_LOW16
+                : reloctype == BFD_RELOC_32_GOTOFF
+                ? BFD_RELOC_SH_GOTOFF_LOW16
+                : (abort (), BFD_RELOC_SH_IMM_LOW16));
+
+       var_part_size = 12;
+       break;
+      }
+
+    case C (MOVI_IMM_32, MOVI_GOTOFF):
+      reloctype = BFD_RELOC_32_GOTOFF;
+      reloc_needed = 1;
+      /* Fall through.  */
+      
+    case C (MOVI_IMM_32, UNDEF_MOVI):
+    case C (MOVI_IMM_32, MOVI_32):
+      {
+       /* Note that we only get here for undefined symbols.  */
+
+       int reg = (insn >> 4) & 0x3f;
+
+       /* A MOVI, for the high part.  */
+       md_number_to_chars (opcodep, SHMEDIA_MOVI_OPC | (reg << 4), 4);
+       fix_new (opc_fragP, opcodep - opc_fragP->fr_literal, 4,
+                fragP->fr_symbol, fragP->fr_offset, 0,
+                reloctype == BFD_RELOC_NONE
+                ? BFD_RELOC_SH_IMM_MEDLOW16
+                : reloctype == BFD_RELOC_32_GOTOFF
+                ? BFD_RELOC_SH_GOTOFF_MEDLOW16
+                : reloctype == BFD_RELOC_SH_GOTPC
+                ? BFD_RELOC_SH_GOTPC_MEDLOW16
+                : reloctype == BFD_RELOC_32_PLT_PCREL
+                ? BFD_RELOC_SH_PLT_MEDLOW16
+                : (abort (), BFD_RELOC_SH_IMM_MEDLOW16));
+
+       /* Fill in a SHORI for the low part.  */
+       md_number_to_chars (var_partp,
+                           SHMEDIA_SHORI_OPC | (reg << 4), 4);
+       fix_new (fragP, var_partp - fragP->fr_literal, 4, fragP->fr_symbol,
+                fragP->fr_offset, 0,
+                reloctype == BFD_RELOC_NONE
+                ? BFD_RELOC_SH_IMM_LOW16
+                : reloctype == BFD_RELOC_32_GOTOFF
+                ? BFD_RELOC_SH_GOTOFF_LOW16
+                : reloctype == BFD_RELOC_SH_GOTPC
+                ? BFD_RELOC_SH_GOTPC_LOW16
+                : reloctype == BFD_RELOC_32_PLT_PCREL
+                ? BFD_RELOC_SH_PLT_LOW16
+                : (abort (), BFD_RELOC_SH_IMM_LOW16));
+
+       var_part_size = 4;
+       break;
+      }
+
+    case C (MOVI_IMM_32_PCREL, MOVI_16):
+    case C (MOVI_IMM_64_PCREL, MOVI_16):
+      md_number_to_chars (opcodep,
+                         insn
+                         | (((reloc_needed
+                              ? 0 : (target_address - opcode_address))
+                             & 65535) << 10),
+                         4);
+      if (reloc_needed)
+       fix_new (opc_fragP, opcodep - opc_fragP->fr_literal, 4,
+                fragP->fr_symbol, fragP->fr_offset, 1,
+                BFD_RELOC_SH_IMM_LOW16_PCREL);
+      var_part_size = 0;
+      break;
+
+    case C (MOVI_IMM_32, MOVI_16):
+    case C (MOVI_IMM_64, MOVI_16):
+      md_number_to_chars (opcodep,
+                         insn
+                         | (((reloc_needed ? 0 : target_address)
+                             & 65535) << 10),
+                         4);
+      if (reloc_needed)
+       abort ();
+      var_part_size = 0;
+      break;
+
+    case C (MOVI_IMM_32_PCREL, MOVI_PLT):
+      reloctype = BFD_RELOC_32_PLT_PCREL;
+      goto movi_imm_32_pcrel_reloc_needed;
+
+    case C (MOVI_IMM_32_PCREL, MOVI_GOTPC):
+      reloctype = BFD_RELOC_SH_GOTPC;
+      /* Fall through.  */
+
+    movi_imm_32_pcrel_reloc_needed:
+      reloc_needed = 1;
+      /* Fall through.  */
+
+    case C (MOVI_IMM_32_PCREL, MOVI_32):
+    case C (MOVI_IMM_64_PCREL, MOVI_32):
+      {
+       int reg = (insn >> 4) & 0x3f;
+
+       md_number_to_chars (opcodep,
+                           insn
+                           | (((((reloc_needed
+                                  ? 0 : (target_address - opcode_address)))
+                               >> 16) & 65535) << 10), 4);
+
+       /* A SHORI, for the low part.  */
+       md_number_to_chars (var_partp,
+                           SHMEDIA_SHORI_OPC
+                           | (reg << 4)
+                           | (((reloc_needed
+                                ? 0 : (target_address - opcode_address))
+                               & 65535) << 10), 4);
+       if (reloc_needed)
+         {
+           fix_new (opc_fragP, opcodep - opc_fragP->fr_literal, 4,
+                    fragP->fr_symbol, fragP->fr_offset, 1,
+                    reloctype == BFD_RELOC_NONE
+                    ? BFD_RELOC_SH_IMM_MEDLOW16_PCREL
+                    : reloctype == BFD_RELOC_SH_GOTPC
+                    ? BFD_RELOC_SH_GOTPC_MEDLOW16
+                    : reloctype == BFD_RELOC_32_PLT_PCREL
+                    ? BFD_RELOC_SH_PLT_MEDLOW16
+                    : (abort (), BFD_RELOC_SH_IMM_MEDLOW16_PCREL));
+           fix_new (fragP, var_partp - fragP->fr_literal, 4, fragP->fr_symbol,
+                    fragP->fr_offset + 4, 1,
+                    reloctype == BFD_RELOC_NONE
+                    ? BFD_RELOC_SH_IMM_LOW16_PCREL
+                    : reloctype == BFD_RELOC_SH_GOTPC
+                    ? BFD_RELOC_SH_GOTPC_LOW16
+                    : reloctype == BFD_RELOC_32_PLT_PCREL
+                    ? BFD_RELOC_SH_PLT_LOW16
+                    : (abort (), BFD_RELOC_SH_IMM_LOW16_PCREL));
+         }
+       var_part_size = 4;
+      }
+      break;
+
+    case C (MOVI_IMM_32_PCREL, MOVI_48):
+    case C (MOVI_IMM_64_PCREL, MOVI_48):
+      {
+       int reg = (insn >> 4) & 0x3f;
+
+       md_number_to_chars (opcodep,
+                           insn
+                           | (((((reloc_needed
+                                  ? 0 : (target_address - opcode_address)))
+                               >> 32) & 65535) << 10), 4);
+
+       /* A SHORI, for the medium part.  */
+       md_number_to_chars (var_partp,
+                           SHMEDIA_SHORI_OPC
+                           | (reg << 4)
+                           | ((((reloc_needed
+                                 ? 0 : (target_address - opcode_address))
+                                >> 16) & 65535) << 10), 4);
+
+       /* A SHORI, for the low part.  */
+       md_number_to_chars (var_partp + 4,
+                           SHMEDIA_SHORI_OPC
+                           | (reg << 4)
+                           | (((reloc_needed
+                                ? 0 : (target_address - opcode_address))
+                               & 65535) << 10), 4);
+       if (reloc_needed)
+         {
+           fix_new (opc_fragP, opcodep - opc_fragP->fr_literal, 4,
+                    fragP->fr_symbol, fragP->fr_offset, 1,
+                    BFD_RELOC_SH_IMM_MEDHI16_PCREL);
+           fix_new (fragP, var_partp - fragP->fr_literal, 4, fragP->fr_symbol,
+                    fragP->fr_offset + 4, 1, BFD_RELOC_SH_IMM_MEDLOW16_PCREL);
+           fix_new (fragP, var_partp - fragP->fr_literal + 4, 4, fragP->fr_symbol,
+                    fragP->fr_offset + 8, 1, BFD_RELOC_SH_IMM_LOW16_PCREL);
+         }
+       var_part_size = 8;
+      }
+      break;
+
+    case C (MOVI_IMM_64_PCREL, MOVI_PLT):
+      reloctype = BFD_RELOC_32_PLT_PCREL;
+      goto movi_imm_64_pcrel_reloc_needed;
+
+    case C (MOVI_IMM_64_PCREL, MOVI_GOTPC):
+      reloctype = BFD_RELOC_SH_GOTPC;
+      /* Fall through.  */
+
+    movi_imm_64_pcrel_reloc_needed:
+      reloc_needed = 1;
+      /* Fall through.  */
+    case C (MOVI_IMM_32_PCREL, MOVI_64):
+    case C (MOVI_IMM_64_PCREL, MOVI_64):
+      {
+       int reg = (insn >> 4) & 0x3f;
+
+       md_number_to_chars (opcodep,
+                           insn
+                           | (((((reloc_needed
+                                  ? 0 : (target_address - opcode_address)))
+                               >> 48) & 65535) << 10), 4);
+
+       /* A SHORI, for the medium-high part.  */
+       md_number_to_chars (var_partp,
+                           SHMEDIA_SHORI_OPC
+                           | (reg << 4)
+                           | ((((reloc_needed
+                                 ? 0 : (target_address - opcode_address))
+                                >> 32) & 65535) << 10), 4);
+
+       /* A SHORI, for the medium-low part.  */
+       md_number_to_chars (var_partp + 4,
+                           SHMEDIA_SHORI_OPC
+                           | (reg << 4)
+                           | ((((reloc_needed
+                                 ? 0 : (target_address - opcode_address))
+                                >> 16) & 65535) << 10), 4);
+
+       /* A SHORI, for the low part.  */
+       md_number_to_chars (var_partp + 8,
+                           SHMEDIA_SHORI_OPC
+                           | (reg << 4)
+                           | (((reloc_needed
+                                ? 0 : (target_address - opcode_address))
+                               & 65535) << 10), 4);
+       if (reloc_needed)
+         {
+           fix_new (opc_fragP, opcodep - opc_fragP->fr_literal, 4,
+                    fragP->fr_symbol, fragP->fr_offset, 1,
+                    reloctype == BFD_RELOC_NONE
+                    ? BFD_RELOC_SH_IMM_HI16_PCREL
+                    : reloctype == BFD_RELOC_SH_GOTPC
+                    ? BFD_RELOC_SH_GOTPC_HI16
+                    : reloctype == BFD_RELOC_32_PLT_PCREL
+                    ? BFD_RELOC_SH_PLT_HI16
+                    : (abort (), BFD_RELOC_SH_IMM_HI16_PCREL));
+           fix_new (fragP, var_partp - fragP->fr_literal, 4, fragP->fr_symbol,
+                    fragP->fr_offset + 4, 1,
+                    reloctype == BFD_RELOC_NONE
+                    ? BFD_RELOC_SH_IMM_MEDHI16_PCREL
+                    : reloctype == BFD_RELOC_SH_GOTPC
+                    ? BFD_RELOC_SH_GOTPC_MEDHI16
+                    : reloctype == BFD_RELOC_32_PLT_PCREL
+                    ? BFD_RELOC_SH_PLT_MEDHI16
+                    : (abort (), BFD_RELOC_SH_IMM_MEDHI16_PCREL));
+           fix_new (fragP, var_partp - fragP->fr_literal + 4, 4,
+                    fragP->fr_symbol,
+                    fragP->fr_offset + 8, 1,
+                    reloctype == BFD_RELOC_NONE
+                    ? BFD_RELOC_SH_IMM_MEDLOW16_PCREL
+                    : reloctype == BFD_RELOC_SH_GOTPC
+                    ? BFD_RELOC_SH_GOTPC_MEDLOW16
+                    : reloctype == BFD_RELOC_32_PLT_PCREL
+                    ? BFD_RELOC_SH_PLT_MEDLOW16
+                    : (abort (), BFD_RELOC_SH_IMM_MEDLOW16_PCREL));
+           fix_new (fragP, var_partp - fragP->fr_literal + 8, 4,
+                    fragP->fr_symbol,
+                    fragP->fr_offset + 12, 1,
+                    reloctype == BFD_RELOC_NONE
+                    ? BFD_RELOC_SH_IMM_LOW16_PCREL
+                    : reloctype == BFD_RELOC_SH_GOTPC
+                    ? BFD_RELOC_SH_GOTPC_LOW16
+                    : reloctype == BFD_RELOC_32_PLT_PCREL
+                    ? BFD_RELOC_SH_PLT_LOW16
+                    : (abort (), BFD_RELOC_SH_IMM_LOW16_PCREL));
+         }
+       var_part_size = 12;
+      }
+      break;
+
+    default:
+      BAD_CASE (fragP->fr_subtype);
+    }
+
+  fragP->fr_fix += var_part_size;
+  fragP->fr_var = 0;
+}
+
+/* Mask NUMBER (originating from a signed number) corresponding to the HOW
+   reloc.  */
+
+static unsigned long
+shmedia_mask_number (number, how)
+     unsigned long number;
+     bfd_reloc_code_real_type how;
+{
+  switch (how)
+    {
+    case BFD_RELOC_SH_IMMU5:
+      number &= (1 << 5) - 1;
+      break;
+
+    case BFD_RELOC_SH_IMMS6:
+    case BFD_RELOC_SH_IMMU6:
+      number &= (1 << 6) - 1;
+      break;
+
+    case BFD_RELOC_SH_IMMS6BY32:
+      number = (number & ((1 << (6 + 5)) - 1)) >> 5;
+      break;
+
+    case BFD_RELOC_SH_IMMS10:
+      number &= (1 << 10) - 1;
+      break;
+
+    case BFD_RELOC_SH_IMMS10BY2:
+      number = (number & ((1 << (10 + 1)) - 1)) >> 1;
+      break;
+
+    case BFD_RELOC_SH_IMMS10BY4:
+      number = (number & ((1 << (10 + 2)) - 1)) >> 2;
+      break;
+
+    case BFD_RELOC_SH_IMMS10BY8:
+      number = (number & ((1 << (10 + 3)) - 1)) >> 3;
+      break;
+
+    case BFD_RELOC_SH_IMMS16:
+    case BFD_RELOC_SH_IMMU16:
+      number &= (1 << 16) - 1;
+      break;
+
+    default:
+      BAD_CASE (how);
+    }
+
+  return number;
+}
+
+/* Emit errors for values out-of-range, using as_bad_where if FRAGP is
+   non-NULL, as_bad otherwise.  */
+
+static void
+shmedia_check_limits (valp, reloc, fixp)
+     offsetT *valp;
+     bfd_reloc_code_real_type reloc;
+     fixS *fixp;
+{
+  offsetT val = *valp;
+
+  char *msg = NULL;
+
+  switch (reloc)
+    {
+    case BFD_RELOC_SH_IMMU5:
+      if (val < 0 || val > (1 << 5) - 1)
+       msg = _("invalid operand, not a 5-bit unsigned value: %d");
+      break;
+
+    case BFD_RELOC_SH_IMMS6:
+      if (val < -(1 << 5) || val > (1 << 5) - 1)
+       msg = _("invalid operand, not a 6-bit signed value: %d");
+      break;
+
+    case BFD_RELOC_SH_IMMU6:
+      if (val < 0 || val > (1 << 6) - 1)
+       msg = _("invalid operand, not a 6-bit unsigned value: %d");
+      break;
+
+    case BFD_RELOC_SH_IMMS6BY32:
+      if (val < -(1 << 10) || val > (1 << 10) - 1)
+       msg = _("invalid operand, not a 11-bit signed value: %d");
+      else if (val & 31)
+       msg = _("invalid operand, not a multiple of 32: %d");
+      break;
+
+    case BFD_RELOC_SH_IMMS10:
+      if (val < -(1 << 9) || val > (1 << 9) - 1)
+       msg = _("invalid operand, not a 10-bit signed value: %d");
+      break;
+
+    case BFD_RELOC_SH_IMMS10BY2:
+      if (val < -(1 << 10) || val > (1 << 10) - 1)
+       msg = _("invalid operand, not a 11-bit signed value: %d");
+      else if (val & 1)
+       msg = _("invalid operand, not an even value: %d");
+      break;
+
+    case BFD_RELOC_SH_IMMS10BY4:
+      if (val < -(1 << 11) || val > (1 << 11) - 1)
+       msg = _("invalid operand, not a 12-bit signed value: %d");
+      else if (val & 3)
+       msg = _("invalid operand, not a multiple of 4: %d");
+      break;
+
+    case BFD_RELOC_SH_IMMS10BY8:
+      if (val < -(1 << 12) || val > (1 << 12) - 1)
+       msg = _("invalid operand, not a 13-bit signed value: %d");
+      else if (val & 7)
+       msg = _("invalid operand, not a multiple of 8: %d");
+      break;
+
+    case BFD_RELOC_SH_IMMS16:
+      if (val < -(1 << 15) || val > (1 << 15) - 1)
+       msg = _("invalid operand, not a 16-bit signed value: %d");
+      break;
+
+    case BFD_RELOC_SH_IMMU16:
+      if (val < 0 || val > (1 << 16) - 1)
+       msg = _("invalid operand, not an 16-bit unsigned value: %d");
+      break;
+
+    case BFD_RELOC_SH_PT_16:
+    case SHMEDIA_BFD_RELOC_PT:
+      if (val < -(1 << 15) * 4 || val > ((1 << 15) - 1) * 4 + 1)
+       msg = _("operand out of range for PT, PTA and PTB");
+      else if ((val % 4) != 0 && ((val - 1) % 4) != 0)
+       msg = _("operand not a multiple of 4 for PT, PTA or PTB: %d");
+      break;
+
+      /* These have no limits; they take a 16-bit slice of a 32- or 64-bit
+        number.  */
+    case BFD_RELOC_SH_IMM_HI16:
+    case BFD_RELOC_SH_IMM_MEDHI16:
+    case BFD_RELOC_SH_IMM_MEDLOW16:
+    case BFD_RELOC_SH_IMM_LOW16:
+    case BFD_RELOC_SH_IMM_HI16_PCREL:
+    case BFD_RELOC_SH_IMM_MEDHI16_PCREL:
+    case BFD_RELOC_SH_IMM_MEDLOW16_PCREL:
+    case BFD_RELOC_SH_IMM_LOW16_PCREL:
+
+    case BFD_RELOC_SH_SHMEDIA_CODE:
+      break;
+
+      /* This one has limits out of our reach.  */
+    case BFD_RELOC_64:
+      break;
+
+    default:
+      BAD_CASE (reloc);
+    }
+
+  if (msg)
+    {
+      if (fixp)
+       as_bad_where (fixp->fx_file, fixp->fx_line, msg, val);
+      else
+       as_bad (msg, val);
+    }
+}
+
+/* Handle an immediate operand by checking limits and noting it for later
+   evaluation if not computable yet, and return a bitfield suitable to
+   "or" into the opcode (non-zero if the value was a constant number).  */
+
+static unsigned long
+shmedia_immediate_op (where, op, pcrel, how)
+     char *where;
+     shmedia_operand_info *op;
+     int pcrel;
+     bfd_reloc_code_real_type how;
+{
+  unsigned long retval = 0;
+
+  /* If this is not an absolute number, make it a fixup.  A constant in
+     place of a pc-relative operand also needs a fixup.  */
+  if (op->immediate.X_op != O_constant || pcrel)
+    fix_new_exp (frag_now,
+                where - frag_now->fr_literal,
+                4,
+                &op->immediate,
+                pcrel,
+                how);
+  else
+    {
+      /* Check that the number is within limits as represented by the
+        reloc, and return the number.  */
+      shmedia_check_limits (&op->immediate.X_add_number, how, NULL);
+
+      retval
+       = shmedia_mask_number ((unsigned long) op->immediate.X_add_number,
+                              how);
+    }
+
+  return retval << 10;
+}
+
+/* Try and parse a register name case-insensitively, return the number of
+   chars consumed.  */
+
+static int
+shmedia_parse_reg (src, mode, reg, argtype)
+     char *src;
+     int *mode;
+     int *reg;
+     shmedia_arg_type argtype;
+{
+  int l0 = TOLOWER (src[0]);
+  int l1 = l0 ? TOLOWER (src[1]) : 0;
+
+  if (l0 == 'r')
+    {
+      if (src[1] >= '1' && src[1] <= '5')
+       {
+         if (src[2] >= '0' && src[2] <= '9'
+             && ! IDENT_CHAR ((unsigned char) src[3]))
+           {
+             *mode = A_GREG_M;
+             *reg = 10 * (src[1] - '0') + src[2] - '0';
+             return 3;
+           }
+       }
+
+      if (src[1] == '6')
+       {
+         if (src[2] >= '0' && src[2] <= '3'
+             && ! IDENT_CHAR ((unsigned char) src[3]))
+           {
+             *mode = A_GREG_M;
+             *reg = 60 + src[2] - '0';
+             return 3;
+           }
+       }
+
+      if (src[1] >= '0' && src[1] <= '9'
+         && ! IDENT_CHAR ((unsigned char) src[2]))
+       {
+         *mode = A_GREG_M;
+         *reg = (src[1] - '0');
+         return 2;
+       }
+    }
+
+  if (l0 == 't' && l1 == 'r')
+    {
+      if (src[2] >= '0' && src[2] <= '7'
+         && ! IDENT_CHAR ((unsigned char) src[3]))
+       {
+         *mode = A_TREG_B;
+         *reg = (src[2] - '0');
+         return 3;
+       }
+    }
+
+  if (l0 == 'f' && l1 == 'r')
+    {
+      if (src[2] >= '1' && src[2] <= '5')
+       {
+         if (src[3] >= '0' && src[3] <= '9'
+             && ! IDENT_CHAR ((unsigned char) src[4]))
+           {
+             *mode = A_FREG_G;
+             *reg = 10 * (src[2] - '0') + src[3] - '0';
+             return 4;
+           }
+       }
+      if (src[2] == '6')
+       {
+         if (src[3] >= '0' && src[3] <= '3'
+             && ! IDENT_CHAR ((unsigned char) src[4]))
+           {
+             *mode = A_FREG_G;
+             *reg = 60 + src[3] - '0';
+             return 4;
+           }
+       }
+      if (src[2] >= '0' && src[2] <= '9'
+         && ! IDENT_CHAR ((unsigned char) src[3]))
+       {
+         *mode = A_FREG_G;
+         *reg = (src[2] - '0');
+         return 3;
+       }
+    }
+
+  if (l0 == 'f' && l1 == 'v')
+    {
+      if (src[2] >= '1' && src[2] <= '5')
+       {
+         if (src[3] >= '0' && src[3] <= '9'
+             && ((10 * (src[2] - '0') + src[3] - '0') % 4) == 0
+             && ! IDENT_CHAR ((unsigned char) src[4]))
+           {
+             *mode = A_FVREG_G;
+             *reg = 10 * (src[2] - '0') + src[3] - '0';
+             return 4;
+           }
+       }
+      if (src[2] == '6')
+       {
+         if (src[3] == '0'
+             && ! IDENT_CHAR ((unsigned char) src[4]))
+           {
+             *mode = A_FVREG_G;
+             *reg = 60 + src[3] - '0';
+             return 4;
+           }
+       }
+      if (src[2] >= '0' && src[2] <= '9'
+         && ((src[2] - '0') % 4) == 0
+         && ! IDENT_CHAR ((unsigned char) src[3]))
+       {
+         *mode = A_FVREG_G;
+         *reg = (src[2] - '0');
+         return 3;
+       }
+    }
+
+  if (l0 == 'd' && l1 == 'r')
+    {
+      if (src[2] >= '1' && src[2] <= '5')
+       {
+         if (src[3] >= '0' && src[3] <= '9'
+             && ((src[3] - '0') % 2) == 0
+             && ! IDENT_CHAR ((unsigned char) src[4]))
+           {
+             *mode = A_DREG_G;
+             *reg = 10 * (src[2] - '0') + src[3] - '0';
+             return 4;
+           }
+       }
+
+      if (src[2] == '6')
+       {
+         if ((src[3] == '0' || src[3] == '2')
+             && ! IDENT_CHAR ((unsigned char) src[4]))
+           {
+             *mode = A_DREG_G;
+             *reg = 60 + src[3] - '0';
+             return 4;
+           }
+       }
+
+      if (src[2] >= '0' && src[2] <= '9'
+         && ((src[2] - '0') % 2) == 0
+         && ! IDENT_CHAR ((unsigned char) src[3]))
+       {
+         *mode = A_DREG_G;
+         *reg = (src[2] - '0');
+         return 3;
+       }
+    }
+
+  if (l0 == 'f' && l1 == 'p')
+    {
+      if (src[2] >= '1' && src[2] <= '5')
+       {
+         if (src[3] >= '0' && src[3] <= '9'
+             && ((src[3] - '0') % 2) == 0
+             && ! IDENT_CHAR ((unsigned char) src[4]))
+           {
+             *mode = A_FPREG_G;
+             *reg = 10 * (src[2] - '0') + src[3] - '0';
+             return 4;
+           }
+       }
+
+      if (src[2] == '6')
+       {
+         if ((src[3] == '0' || src[3] == '2')
+             && ! IDENT_CHAR ((unsigned char) src[4]))
+           {
+             *mode = A_FPREG_G;
+             *reg = 60 + src[3] - '0';
+             return 4;
+           }
+       }
+
+      if (src[2] >= '0' && src[2] <= '9'
+         && ((src[2] - '0') % 2) == 0
+         && ! IDENT_CHAR ((unsigned char) src[3]))
+       {
+         *mode = A_FPREG_G;
+         *reg = (src[2] - '0');
+         return 3;
+       }
+    }
+
+  if (l0 == 'm' && strncasecmp (src, "mtrx", 4) == 0)
+    {
+      if (src[4] == '0' && ! IDENT_CHAR ((unsigned char) src[5]))
+       {
+         *mode = A_FMREG_G;
+         *reg = 0;
+         return 5;
+       }
+
+      if (src[4] == '1' && src[5] == '6'
+         && ! IDENT_CHAR ((unsigned char) src[6]))
+       {
+         *mode = A_FMREG_G;
+         *reg = 16;
+         return 6;
+       }
+
+      if (src[4] == '3' && src[5] == '2'
+         && ! IDENT_CHAR ((unsigned char) src[6]))
+       {
+         *mode = A_FMREG_G;
+         *reg = 32;
+         return 6;
+       }
+
+      if (src[4] == '4' && src[5] == '8'
+         && ! IDENT_CHAR ((unsigned char) src[6]))
+       {
+         *mode = A_FMREG_G;
+         *reg = 48;
+         return 6;
+       }
+    }
+
+  if (l0 == 'c' && l1 == 'r')
+    {
+      if (src[2] >= '1' && src[2] <= '5')
+       {
+         if (src[3] >= '0' && src[3] <= '9'
+             && ! IDENT_CHAR ((unsigned char) src[4]))
+           {
+             *mode = A_CREG_K;
+             *reg = 10 * (src[2] - '0') + src[3] - '0';
+             return 4;
+           }
+       }
+      if (src[2] == '6')
+       {
+         if (src[3] >= '0' && src[3] <= '3'
+             && ! IDENT_CHAR ((unsigned char) src[4]))
+           {
+             *mode = A_CREG_K;
+             *reg = 60 + src[3] - '0';
+             return 4;
+           }
+       }
+      if (src[2] >= '0' && src[2] <= '9'
+         && ! IDENT_CHAR ((unsigned char) src[3]))
+       {
+         *mode = A_CREG_K;
+         *reg = (src[2] - '0');
+         return 3;
+       }
+    }
+
+  /* We either have an error, a symbol or a control register by predefined
+     name.  To keep things simple but still fast for normal cases, we do
+     linear search in the (not to big) table of predefined control
+     registers.  We only do this when we *expect* a control register.
+     Those instructions should be rare enough that linear searching is ok.
+     Or just read them into a hash-table in shmedia_md_begin.  Since they
+     cannot be specified in the same place of symbol operands, don't add
+     them there to the *main* symbol table as being in "reg_section".  */
+  if (argtype == A_CREG_J || argtype == A_CREG_K)
+    {
+      const shmedia_creg_info *cregp;
+      int len = 0;
+
+      for (cregp = shmedia_creg_table; cregp->name != NULL; cregp++)
+       {
+         len = strlen (cregp->name);
+         if (strncasecmp (cregp->name, src, len) == 0
+             && ! IDENT_CHAR (src[len]))
+           break;
+       }
+
+      if (cregp->name != NULL)
+       {
+         *mode = A_CREG_K;
+         *reg = cregp->cregno;
+         return len;
+       }
+    }
+
+  return 0;
+}
+
+/* Called from md_estimate_size_before_relax in tc-sh.c  */
+
+static int
+shmedia_md_estimate_size_before_relax (fragP, segment_type)
+     fragS *fragP;
+     segT segment_type ATTRIBUTE_UNUSED;
+{
+  int old_fr_fix;
+  expressionS *exp;
+
+  /* For ELF, we can't relax externally visible symbols; see tc-i386.c.  */
+  boolean sym_relaxable
+    = (fragP->fr_symbol
+       && S_GET_SEGMENT (fragP->fr_symbol) == segment_type
+       && ! S_IS_EXTERNAL (fragP->fr_symbol)
+       && ! S_IS_WEAK (fragP->fr_symbol));
+
+  old_fr_fix = fragP->fr_fix;
+
+  switch (fragP->fr_subtype)
+    {
+    case C (SH64PCREL16_32, UNDEF_SH64PCREL):
+    case C (SH64PCREL16PT_32, UNDEF_SH64PCREL):
+      /* Used to be to somewhere which was unknown.  */
+      if (sym_relaxable)
+       {
+         int what = GET_WHAT (fragP->fr_subtype);
+
+         /* In this segment, so head for shortest.  */
+         fragP->fr_subtype = C (what, SH64PCREL16);
+       }
+      else
+       {
+         int what = GET_WHAT (fragP->fr_subtype);
+         /* We know the abs value, but we don't know where we will be
+            linked, so we must make it the longest.  Presumably we could
+            switch to a non-pcrel representation, but having absolute
+            values in PT operands should be rare enough not to be worth
+            adding that code.  */
+         fragP->fr_subtype = C (what, SH64PCREL32);
+       }
+      fragP->fr_var = md_relax_table[fragP->fr_subtype].rlx_length;
+      break;
+
+    case C (SH64PCREL16_64, UNDEF_SH64PCREL):
+    case C (SH64PCREL16PT_64, UNDEF_SH64PCREL):
+      /* Used to be to somewhere which was unknown.  */
+      if (sym_relaxable)
+       {
+         int what = GET_WHAT (fragP->fr_subtype);
+
+         /* In this segment, so head for shortest.  */
+         fragP->fr_subtype = C (what, SH64PCREL16);
+       }
+      else
+       {
+         int what = GET_WHAT (fragP->fr_subtype);
+         /* We know the abs value, but we don't know where we will be
+            linked, so we must make it the longest.  Presumably we could
+            switch to a non-pcrel representation, but having absolute
+            values in PT operands should be rare enough not to be worth
+            adding that code.  */
+         fragP->fr_subtype = C (what, SH64PCREL64);
+       }
+      fragP->fr_var = md_relax_table[fragP->fr_subtype].rlx_length;
+      break;
+
+    case C (MOVI_IMM_64, UNDEF_MOVI):
+    case C (MOVI_IMM_32, UNDEF_MOVI):
+      exp = NULL;
+
+      /* Look inside the "symbol".  If we find a PC-relative expression,
+        change this to a PC-relative, relaxable expression.  */
+      if (fragP->fr_symbol != NULL
+         && (exp = symbol_get_value_expression (fragP->fr_symbol)) != NULL
+         && exp->X_op == O_subtract
+         && exp->X_op_symbol != NULL
+         && S_GET_SEGMENT (exp->X_op_symbol) == segment_type)
+       {
+         int what = GET_WHAT (fragP->fr_subtype);
+         int what_high = what == MOVI_IMM_32 ? MOVI_32 : MOVI_64;
+         expressionS *opexp
+           = symbol_get_value_expression (exp->X_op_symbol);
+         expressionS *addexp
+           = symbol_get_value_expression (exp->X_add_symbol);
+
+         /* Change the MOVI expression to the "X" in "X - Y" and subtract
+            Y:s offset to this location from X.  Note that we can only
+            allow an Y which is offset from this frag.  */
+         if (opexp != NULL
+             && addexp != NULL
+             && opexp->X_op == O_constant
+             && fragP == symbol_get_frag (exp->X_op_symbol))
+           {
+             /* At this point, before relaxing, the add-number of opexp
+                is the offset from the fr_fix part.  */
+             fragP->fr_offset
+               = (exp->X_add_number
+                  - (opexp->X_add_number - (fragP->fr_fix - 4)));
+             fragP->fr_symbol = exp->X_add_symbol;
+
+             what = what == MOVI_IMM_32
+               ? MOVI_IMM_32_PCREL : MOVI_IMM_64_PCREL;
+
+             /* Check the "X" symbol to estimate the size of this
+                PC-relative expression.  */
+             if (S_GET_SEGMENT (exp->X_add_symbol) == segment_type
+                 && ! S_IS_EXTERNAL (exp->X_add_symbol)
+                 && ! S_IS_WEAK (exp->X_add_symbol))
+               fragP->fr_subtype = C (what, MOVI_16);
+             else
+               fragP->fr_subtype = C (what, what_high);
+
+             /* This is now a PC-relative expression, fit to be relaxed.  */
+           }
+         else
+           fragP->fr_subtype = C (what, what_high);
+       }
+      else if (fragP->fr_symbol == NULL
+              || (S_GET_SEGMENT (fragP->fr_symbol) == absolute_section
+                  && exp->X_op == O_constant))
+       {
+         unsigned long insn
+           = (target_big_endian
+              ? bfd_getb32 (fragP->fr_opcode)
+              : bfd_getl32 (fragP->fr_opcode));
+         offsetT one = (offsetT) 1;
+         offsetT value = fragP->fr_offset
+           + (fragP->fr_symbol == NULL ? 0 : S_GET_VALUE (fragP->fr_symbol));
+
+         if (value >= ((offsetT) -1 << 15) && value < ((offsetT) 1 << 15))
+           {
+             /* Fits in 16-bit signed number.  */
+             int what = GET_WHAT (fragP->fr_subtype);
+             fragP->fr_subtype = C (what, MOVI_16);
+
+             /* Just "or" in the value.  */
+             md_number_to_chars (fragP->fr_opcode,
+                                 insn | ((value & ((1 << 16) - 1)) << 10),
+                                 4);
+           }
+         else if (value >= -(one << 31)
+                  && (value < (one << 31)
+                      || (sh64_abi == sh64_abi_32 && value < (one << 32))))
+           {
+             /* The value fits in a 32-bit signed number.  */
+             int reg = (insn >> 4) & 0x3f;
+
+             /* Just "or" in the high bits of the value, making the first
+                MOVI.  */
+             md_number_to_chars (fragP->fr_opcode,
+                                 insn
+                                 | (((value >> 16) & ((1 << 16) - 1)) << 10),
+                                 4);
+
+             /* Add a SHORI with the low bits.  Note that this insn lives
+                in the variable fragment part.  */
+             md_number_to_chars (fragP->fr_literal + old_fr_fix,
+                                 SHMEDIA_SHORI_OPC
+                                 | (reg << 4)
+                                 | ((value & ((1 << 16) - 1)) << 10),
+                                 4);
+
+             /* We took a piece of the variable part.  */
+             fragP->fr_fix += 4;
+           }
+         else if (GET_WHAT (fragP->fr_subtype) == MOVI_IMM_32)
+           {
+             /* Value out of range.  */
+             as_bad_where (fragP->fr_file, fragP->fr_line,
+                           _("MOVI operand is not a 32-bit signed value: 0x%8x%08x"),
+                           ((unsigned int) (value >> 32)
+                            & (unsigned int) 0xffffffff),
+                           (unsigned int) value & (unsigned int) 0xffffffff);
+
+             /* Must advance size, or we will get internal inconsistency
+                and fall into an assert.  */
+             fragP->fr_fix += 4;
+           }
+         /* Now we know we are allowed to expand to 48- and 64-bit values.  */
+         else if (value >= -(one << 47) && value < (one << 47))
+           {
+             /* The value fits in a 48-bit signed number.  */
+             int reg = (insn >> 4) & 0x3f;
+
+             /* Just "or" in the high bits of the value, making the first
+                MOVI.  */
+             md_number_to_chars (fragP->fr_opcode,
+                                 insn
+                                 | (((value >> 32) & ((1 << 16) - 1)) << 10),
+                                 4);
+
+             /* Add a SHORI with the middle bits.  Note that this insn lives
+                in the variable fragment part.  */
+             md_number_to_chars (fragP->fr_literal + old_fr_fix,
+                                 SHMEDIA_SHORI_OPC
+                                 | (reg << 4)
+                                 | (((value >> 16) & ((1 << 16) - 1)) << 10),
+                                 4);
+
+             /* Add a SHORI with the low bits.  */
+             md_number_to_chars (fragP->fr_literal + old_fr_fix + 4,
+                                 SHMEDIA_SHORI_OPC
+                                 | (reg << 4)
+                                 | ((value & ((1 << 16) - 1)) << 10),
+                                 4);
+
+             /* We took a piece of the variable part.  */
+             fragP->fr_fix += 8;
+           }
+         else
+           {
+             /* A 64-bit number.  */
+             int reg = (insn >> 4) & 0x3f;
+
+             /* Just "or" in the high bits of the value, making the first
+                MOVI.  */
+             md_number_to_chars (fragP->fr_opcode,
+                                 insn
+                                 | (((value >> 48) & ((1 << 16) - 1)) << 10),
+                                 4);
+
+             /* Add a SHORI with the midhigh bits.  Note that this insn lives
+                in the variable fragment part.  */
+             md_number_to_chars (fragP->fr_literal + old_fr_fix,
+                                 SHMEDIA_SHORI_OPC
+                                 | (reg << 4)
+                                 | (((value >> 32) & ((1 << 16) - 1)) << 10),
+                                 4);
+
+             /* Add a SHORI with the midlow bits.  */
+             md_number_to_chars (fragP->fr_literal + old_fr_fix + 4,
+                                 SHMEDIA_SHORI_OPC
+                                 | (reg << 4)
+                                 | (((value >> 16) & ((1 << 16) - 1)) << 10),
+                                 4);
+
+             /* Add a SHORI with the low bits.  */
+             md_number_to_chars (fragP->fr_literal + old_fr_fix + 8,
+                                 SHMEDIA_SHORI_OPC
+                                 | (reg << 4)
+                                 | ((value & ((1 << 16) - 1)) << 10), 4);
+             /* We took all of the variable part.  */
+             fragP->fr_fix += 12;
+           }
+
+         /* MOVI expansions that get here have not been converted to
+            PC-relative frags, but instead expanded by
+            md_number_to_chars or by calling shmedia_md_convert_frag
+            with final == false.  We must not have them around as
+            frags anymore; symbols would be prematurely evaluated
+            when relaxing.  We will not need to have md_convert_frag
+            called again with them; any further handling is through
+            the already emitted fixups.  */
+         frag_wane (fragP);
+         break;
+       }
+      fragP->fr_var = md_relax_table[fragP->fr_subtype].rlx_length;
+      break;
+
+      /* For relaxation states that remain unchanged, report the
+         estimated length.  */
+    case C (SH64PCREL16_32, SH64PCREL16):
+    case C (SH64PCREL16PT_32, SH64PCREL16):
+    case C (SH64PCREL16_32, SH64PCREL32):
+    case C (SH64PCREL16PT_32, SH64PCREL32):
+    case C (SH64PCREL16_32, SH64PCRELPLT):
+    case C (SH64PCREL16PT_32, SH64PCRELPLT):
+    case C (SH64PCREL16_64, SH64PCREL16):
+    case C (SH64PCREL16PT_64, SH64PCREL16):
+    case C (SH64PCREL16_64, SH64PCREL32):
+    case C (SH64PCREL16PT_64, SH64PCREL32):
+    case C (SH64PCREL16_64, SH64PCREL48):
+    case C (SH64PCREL16PT_64, SH64PCREL48):
+    case C (SH64PCREL16_64, SH64PCREL64):
+    case C (SH64PCREL16PT_64, SH64PCREL64):
+    case C (SH64PCREL16_64, SH64PCRELPLT):
+    case C (SH64PCREL16PT_64, SH64PCRELPLT):
+    case C (MOVI_IMM_32, MOVI_16):
+    case C (MOVI_IMM_32, MOVI_32):
+    case C (MOVI_IMM_32, MOVI_GOTOFF):
+    case C (MOVI_IMM_32_PCREL, MOVI_16):
+    case C (MOVI_IMM_32_PCREL, MOVI_32):
+    case C (MOVI_IMM_32_PCREL, MOVI_PLT):
+    case C (MOVI_IMM_32_PCREL, MOVI_GOTPC):
+    case C (MOVI_IMM_64, MOVI_16):
+    case C (MOVI_IMM_64, MOVI_32):
+    case C (MOVI_IMM_64, MOVI_48):
+    case C (MOVI_IMM_64, MOVI_64):
+    case C (MOVI_IMM_64, MOVI_GOTOFF):
+    case C (MOVI_IMM_64_PCREL, MOVI_16):
+    case C (MOVI_IMM_64_PCREL, MOVI_32):
+    case C (MOVI_IMM_64_PCREL, MOVI_48):
+    case C (MOVI_IMM_64_PCREL, MOVI_64):
+    case C (MOVI_IMM_64_PCREL, MOVI_PLT):
+    case C (MOVI_IMM_64_PCREL, MOVI_GOTPC):
+      fragP->fr_var = md_relax_table[fragP->fr_subtype].rlx_length;
+      break;
+      
+    default:
+      abort ();
+    }
+
+  return fragP->fr_var + (fragP->fr_fix - old_fr_fix);
+}
+
+/* Parse an expression, SH64-style.  Copied from tc-sh.c, but with
+   datatypes adjusted.  */
+
+static char *
+shmedia_parse_exp (s, op)
+     char *s;
+     shmedia_operand_info *op;
+{
+  char *save;
+  char *new;
+
+  save = input_line_pointer;
+  input_line_pointer = s;
+  expression (&op->immediate);
+  if (op->immediate.X_op == O_absent)
+    as_bad (_("missing operand"));
+  new = input_line_pointer;
+  input_line_pointer = save;
+  return new;
+}
+
+/* Parse an operand.  Store pointer to next character in *PTR.  */
+
+static void
+shmedia_get_operand (ptr, op, argtype)
+     char **ptr;
+     shmedia_operand_info *op;
+     shmedia_arg_type argtype;
+{
+  char *src = *ptr;
+  int mode = -1;
+  unsigned int len;
+
+  len = shmedia_parse_reg (src, &mode, &(op->reg), argtype);
+  if (len)
+    {
+      *ptr = src + len;
+      op->type = mode;
+    }
+  else
+    {
+      /* Not a reg, so it must be a displacement.  */
+      *ptr = shmedia_parse_exp (src, op);
+      op->type = A_IMMM;
+
+      /* This is just an initialization; shmedia_get_operands will change
+        as needed.  */
+      op->reloctype = BFD_RELOC_NONE;
+    }
+}
+
+/* Parse the operands for this insn; return NULL if invalid, else return
+   how much text was consumed.  */
+
+static char *
+shmedia_get_operands (info, args, operands)
+     shmedia_opcode_info *info;
+     char *args;
+     shmedia_operands_info *operands;
+{
+  char *ptr = args;
+  int i;
+
+  if (*ptr == ' ')
+    ptr++;
+
+  for (i = 0; info->arg[i] != 0; i++)
+    {
+      memset (operands->operands + i, 0, sizeof (operands->operands[0]));
+
+      /* No operand to get for these fields.  */
+      if (info->arg[i] == A_REUSE_PREV)
+       continue;
+
+      shmedia_get_operand (&ptr, &operands->operands[i], info->arg[i]);
+
+      /* Check operands type match.  */
+      switch (info->arg[i])
+       {
+       case A_GREG_M:
+       case A_GREG_N:
+       case A_GREG_D:
+         if (operands->operands[i].type != A_GREG_M)
+           return NULL;
+         break;
+
+       case A_FREG_G:
+       case A_FREG_H:
+       case A_FREG_F:
+         if (operands->operands[i].type != A_FREG_G)
+           return NULL;
+         break;
+
+       case A_FVREG_G:
+       case A_FVREG_H:
+       case A_FVREG_F:
+         if (operands->operands[i].type != A_FVREG_G)
+           return NULL;
+         break;
+
+       case A_FMREG_G:
+       case A_FMREG_H:
+       case A_FMREG_F:
+         if (operands->operands[i].type != A_FMREG_G)
+           return NULL;
+         break;
+
+       case A_FPREG_G:
+       case A_FPREG_H:
+       case A_FPREG_F:
+         if (operands->operands[i].type != A_FPREG_G)
+           return NULL;
+         break;
+
+       case A_DREG_G:
+       case A_DREG_H:
+       case A_DREG_F:
+         if (operands->operands[i].type != A_DREG_G)
+           return NULL;
+         break;
+
+       case A_TREG_A:
+       case A_TREG_B:
+         if (operands->operands[i].type != A_TREG_B)
+           return NULL;
+         break;
+
+       case A_CREG_J:
+       case A_CREG_K:
+         if (operands->operands[i].type != A_CREG_K)
+           return NULL;
+         break;
+
+       case A_IMMS16:
+       case A_IMMU16:
+         /* Check for an expression that looks like S & 65535 or
+            (S >> N) & 65535, where N = 0, 16, 32, 48.
+
+            Get the S and put at operands->operands[i].immediate, and
+            adjust operands->operands[i].reloctype.  */
+         {
+           expressionS *imm_expr = &operands->operands[i].immediate;
+           expressionS *right_expr;
+
+           if (operands->operands[i].type == A_IMMM
+               && imm_expr->X_op == O_bit_and
+               && imm_expr->X_op_symbol != NULL
+               && ((right_expr
+                    = symbol_get_value_expression (imm_expr->X_op_symbol))
+                   ->X_op == O_constant)
+               && right_expr->X_add_number == 0xffff)
+             {
+               symbolS *inner = imm_expr->X_add_symbol;
+               bfd_reloc_code_real_type reloctype = BFD_RELOC_SH_IMM_LOW16;
+               expressionS *inner_expr
+                 = symbol_get_value_expression (inner);
+
+               if (inner_expr->X_op == O_right_shift)
+                 {
+                   expressionS *inner_right;
+
+                   if (inner_expr->X_op_symbol != NULL
+                     && ((inner_right
+                          = symbol_get_value_expression (inner_expr
+                                                         ->X_op_symbol))
+                         ->X_op == O_constant))
+                     {
+                       offsetT addnum
+                         = inner_right->X_add_number;
+
+                       if (addnum == 0 || addnum == 16 || addnum == 32
+                           || addnum == 48)
+                         {
+                           reloctype
+                             = (addnum == 0
+                                ? BFD_RELOC_SH_IMM_LOW16
+                                : (addnum == 16
+                                   ? BFD_RELOC_SH_IMM_MEDLOW16
+                                   : (addnum == 32
+                                      ? BFD_RELOC_SH_IMM_MEDHI16
+                                      : BFD_RELOC_SH_IMM_HI16)));
+
+                           inner = inner_expr->X_add_symbol;
+                           inner_expr = symbol_get_value_expression (inner);
+                         }
+                     }
+                 }
+
+               /* I'm not sure I understand the logic, but evidently the
+                  inner expression of a lone symbol is O_constant, with
+                  the actual symbol in expr_section.  For a constant, the
+                  section would be absolute_section.  For sym+offset,
+                  it's O_symbol as always.  See expr.c:make_expr_symbol,
+                  first statements.  */
+
+               if (inner_expr->X_op == O_constant
+                   && S_GET_SEGMENT (inner) != absolute_section)
+                 {
+                   operands->operands[i].immediate.X_op = O_symbol;
+                   operands->operands[i].immediate.X_add_symbol = inner;
+                   operands->operands[i].immediate.X_add_number = 0;
+                 }
+               else
+                 operands->operands[i].immediate
+                   = *symbol_get_value_expression (inner);
+
+               operands->operands[i].reloctype = reloctype;
+             }
+         }
+         /* Fall through.  */
+       case A_IMMS6:
+       case A_IMMS6BY32:
+       case A_IMMS10:
+       case A_IMMS10BY1:
+       case A_IMMS10BY2:
+       case A_IMMS10BY4:
+       case A_IMMS10BY8:
+       case A_PCIMMS16BY4:
+       case A_PCIMMS16BY4_PT:
+       case A_IMMU5:
+       case A_IMMU6:
+         if (operands->operands[i].type != A_IMMM)
+           return NULL;
+
+         if (sh_check_fixup (&operands->operands[i].immediate,
+                             &operands->operands[i].reloctype))
+           {
+             as_bad (_("invalid PIC reference"));
+             return NULL;
+           }
+
+         break;
+
+       default:
+         BAD_CASE (info->arg[i]);
+       }
+
+      if (*ptr == ',' && info->arg[i + 1])
+       ptr++;
+    }
+  return ptr;
+}
+
+
+/* Find an opcode at the start of *STR_P in the hash table, and set
+   *STR_P to the first character after the last one read.  */
+
+static shmedia_opcode_info *
+shmedia_find_cooked_opcode (str_p)
+     char **str_p;
+{
+  char *str = *str_p;
+  char *op_start;
+  char *op_end;
+  char name[20];
+  unsigned int nlen = 0;
+
+  /* Drop leading whitespace.  */
+  while (*str == ' ')
+    str++;
+
+  /* Find the op code end.  */
+  for (op_start = op_end = str;
+       *op_end
+       && nlen < sizeof (name) - 1
+       && ! is_end_of_line[(unsigned char) *op_end]
+       && ! ISSPACE ((unsigned char) *op_end);
+       op_end++)
+    {
+      unsigned char c = op_start[nlen];
+
+      /* The machine independent code will convert CMP/EQ into cmp/EQ
+        because it thinks the '/' is the end of the symbol.  Moreover,
+        all but the first sub-insn is a parallel processing insn won't
+        be capitailzed.  Instead of hacking up the machine independent
+        code, we just deal with it here.  */
+      c = TOLOWER (c);
+      name[nlen] = c;
+      nlen++;
+    }
+
+  name[nlen] = 0;
+  *str_p = op_end;
+
+  if (nlen == 0)
+    as_bad (_("can't find opcode"));
+
+  return
+    (shmedia_opcode_info *) hash_find (shmedia_opcode_hash_control, name);
+}
+
+/* Build up an instruction, including allocating the frag.  */
+
+static int
+shmedia_build_Mytes (opcode, operands)
+     shmedia_opcode_info *opcode;
+     shmedia_operands_info *operands;
+{
+  unsigned long insn = opcode->opcode_base;
+  int i, j;
+  char *insn_loc = frag_more (4);
+
+  /* The parameter to dwarf2_emit_insn is actually the offset to the start
+     of the insn from the fix piece of instruction that was emitted.
+     Since we want .debug_line addresses to record (address | 1) for
+     SHmedia insns, we get the wanted effect by taking one off the size,
+     knowing it's a multiple of 4.  We count from the first fix piece of
+     the insn.  There must be no frags changes (frag_more or frag_var)
+     calls in-between the frag_more call we account for, and this
+     dwarf2_emit_insn call.  */
+  dwarf2_emit_insn (3);
+
+  /* This is stored into any frag_var operand.  */
+  sh64_last_insn_frag = frag_now;
+
+  /* Loop over opcode info, emit an instruction.  */
+  for (i = 0, j = 0; opcode->arg[i]; i++)
+    {
+      shmedia_arg_type argtype = opcode->arg[i];
+      shmedia_operand_info *opjp = &operands->operands[j];
+      switch (argtype)
+       {
+       case A_TREG_A:
+       case A_TREG_B:
+       case A_GREG_M:
+       case A_GREG_N:
+       case A_GREG_D:
+       case A_FREG_G:
+       case A_FREG_H:
+       case A_FREG_F:
+       case A_FVREG_G:
+       case A_FVREG_H:
+       case A_FVREG_F:
+       case A_FMREG_G:
+       case A_FMREG_H:
+       case A_FMREG_F:
+       case A_FPREG_G:
+       case A_FPREG_H:
+       case A_FPREG_F:
+       case A_DREG_G:
+       case A_DREG_H:
+       case A_DREG_F:
+       case A_CREG_J:
+       case A_CREG_K:
+         /* Six-bit register fields.  They just get filled with the
+            parsed register number.  */
+         insn |= (opjp->reg << opcode->nibbles[i]);
+         j++;
+         break;
+
+       case A_REUSE_PREV:
+         /* Copy the register for the previous operand to this position.  */
+         insn |= (operands->operands[j - 1].reg << opcode->nibbles[i]);
+         j++;
+         break;
+
+       case A_IMMS6:
+         insn |= shmedia_immediate_op (insn_loc, opjp, 0,
+                                       BFD_RELOC_SH_IMMS6);
+         j++;
+         break;
+
+       case A_IMMS6BY32:
+         insn |= shmedia_immediate_op (insn_loc, opjp, 0,
+                                       BFD_RELOC_SH_IMMS6BY32);
+         j++;
+         break;
+
+       case A_IMMS10BY1:
+       case A_IMMS10:
+         insn |= shmedia_immediate_op (insn_loc, opjp, 0,
+                                       BFD_RELOC_SH_IMMS10);
+         j++;
+         break;
+
+       case A_IMMS10BY2:
+         insn |= shmedia_immediate_op (insn_loc, opjp, 0,
+                                       BFD_RELOC_SH_IMMS10BY2);
+         j++;
+         break;
+
+       case A_IMMS10BY4:
+         if (opjp->reloctype == BFD_RELOC_NONE)
+           insn |= shmedia_immediate_op (insn_loc, opjp, 0,
+                                         BFD_RELOC_SH_IMMS10BY4);
+         else if (opjp->reloctype == BFD_RELOC_SH_GOTPLT32)
+           insn |= shmedia_immediate_op (insn_loc, opjp, 0,
+                                         BFD_RELOC_SH_GOTPLT10BY4);
+         else if (opjp->reloctype == BFD_RELOC_32_GOT_PCREL)
+           insn |= shmedia_immediate_op (insn_loc, opjp, 0,
+                                         BFD_RELOC_SH_GOT10BY4);
+         else
+           as_bad (_("invalid PIC reference"));
+         j++;
+         break;
+
+       case A_IMMS10BY8:
+         if (opjp->reloctype == BFD_RELOC_NONE)
+           insn |= shmedia_immediate_op (insn_loc, opjp, 0,
+                                         BFD_RELOC_SH_IMMS10BY8);
+         else if (opjp->reloctype == BFD_RELOC_SH_GOTPLT32)
+           insn |= shmedia_immediate_op (insn_loc, opjp, 0,
+                                         BFD_RELOC_SH_GOTPLT10BY8);
+         else if (opjp->reloctype == BFD_RELOC_32_GOT_PCREL)
+           insn |= shmedia_immediate_op (insn_loc, opjp, 0,
+                                         BFD_RELOC_SH_GOT10BY8);
+         else
+           as_bad (_("invalid PIC reference"));
+         j++;
+         break;
+
+       case A_IMMS16:
+         /* Sneak a peek if this is the MOVI insn.  If so, check if we
+            should expand it.  */
+         if (opjp->reloctype == BFD_RELOC_32_GOT_PCREL)
+           opjp->reloctype = BFD_RELOC_SH_GOT_LOW16;
+         else if (opjp->reloctype == BFD_RELOC_SH_GOTPLT32)
+           opjp->reloctype = BFD_RELOC_SH_GOTPLT_LOW16;
+           
+         if ((opjp->reloctype == BFD_RELOC_NONE
+              || opjp->reloctype == BFD_RELOC_32_GOTOFF
+              || opjp->reloctype == BFD_RELOC_32_PLT_PCREL
+              || opjp->reloctype == BFD_RELOC_SH_GOTPC)
+             && opcode->opcode_base == SHMEDIA_MOVI_OPC
+             && (opjp->immediate.X_op != O_constant
+                 || opjp->immediate.X_add_number < -32768
+                 || opjp->immediate.X_add_number > 32767)
+             && (sh64_expand
+                 || opjp->reloctype == BFD_RELOC_32_GOTOFF
+                 || opjp->reloctype == BFD_RELOC_32_PLT_PCREL
+                 || opjp->reloctype == BFD_RELOC_SH_GOTPC))
+           {
+             int what = sh64_abi == sh64_abi_64 ? MOVI_IMM_64 : MOVI_IMM_32;
+             offsetT max = sh64_abi == sh64_abi_64 ? MOVI_64 : MOVI_32;
+             offsetT min = MOVI_16;
+             offsetT init = UNDEF_MOVI;
+             valueT addvalue
+               = opjp->immediate.X_op_symbol != NULL
+               ? 0 : opjp->immediate.X_add_number;
+             symbolS *sym
+               = opjp->immediate.X_op_symbol != NULL
+               ? make_expr_symbol (&opjp->immediate)
+               : opjp->immediate.X_add_symbol;
+
+             if (opjp->reloctype == BFD_RELOC_32_GOTOFF)
+               init = max = min = MOVI_GOTOFF;
+             else if (opjp->reloctype == BFD_RELOC_32_PLT_PCREL)
+               {
+                 init = max = min = MOVI_PLT;
+                 what = (sh64_abi == sh64_abi_64
+                         ? MOVI_IMM_64_PCREL
+                         : MOVI_IMM_32_PCREL);
+               }
+             else if (opjp->reloctype == BFD_RELOC_SH_GOTPC)
+               {
+                 init = max = min = MOVI_GOTPC;
+                 what = (sh64_abi == sh64_abi_64
+                         ? MOVI_IMM_64_PCREL
+                         : MOVI_IMM_32_PCREL);
+               }
+
+             frag_var (rs_machine_dependent,
+                       md_relax_table[C (what, max)].rlx_length,
+                       md_relax_table[C (what, min)].rlx_length,
+                       C (what, init), sym, addvalue, insn_loc);
+           }
+         else
+           insn |= shmedia_immediate_op (insn_loc, opjp, 0,
+                                         (opjp->reloctype
+                                          == BFD_RELOC_NONE)
+                                         ? BFD_RELOC_SH_IMMS16
+                                         : opjp->reloctype);
+         j++;
+         break;
+
+       case A_PCIMMS16BY4:
+         {
+           int what
+             = ((sh64_abi == sh64_abi_64 && ! sh64_pt32)
+                ? SH64PCREL16_64 : SH64PCREL16_32);
+           offsetT max
+             = ((sh64_abi == sh64_abi_64 && ! sh64_pt32)
+                ? SH64PCREL64 : SH64PCREL32);
+           offsetT min = SH64PCREL16;
+           offsetT init = UNDEF_SH64PCREL;
+
+           /* Don't allow complex expressions here.  */
+           if (opjp->immediate.X_op_symbol != NULL)
+             return 0;
+
+           if (opjp->reloctype == BFD_RELOC_32_PLT_PCREL)
+             init = max = min = SH64PCRELPLT;
+
+           /* If we're not expanding, then just emit a fixup.  */
+           if (sh64_expand || opjp->reloctype != BFD_RELOC_NONE)
+             frag_var (rs_machine_dependent,
+                       md_relax_table[C (what, max)].rlx_length,
+                       md_relax_table[C (what, min)].rlx_length,
+                       C (what, init),
+                       opjp->immediate.X_add_symbol,
+                       opjp->immediate.X_add_number,
+                       insn_loc);
+           else
+             insn |= shmedia_immediate_op (insn_loc, opjp, 1,
+                                           opjp->reloctype == BFD_RELOC_NONE
+                                           ? BFD_RELOC_SH_PT_16
+                                           : opjp->reloctype);
+             
+           j++;
+           break;
+         }
+
+       case A_PCIMMS16BY4_PT:
+         {
+           int what
+             = ((sh64_abi == sh64_abi_64 && ! sh64_pt32)
+                ? SH64PCREL16PT_64 : SH64PCREL16PT_32);
+           offsetT max
+             = ((sh64_abi == sh64_abi_64 && ! sh64_pt32)
+                ? SH64PCREL64 : SH64PCREL32);
+           offsetT min = SH64PCREL16;
+           offsetT init = UNDEF_SH64PCREL;
+
+           /* Don't allow complex expressions here.  */
+           if (opjp->immediate.X_op_symbol != NULL)
+             return 0;
+
+           if (opjp->reloctype == BFD_RELOC_32_PLT_PCREL)
+             init = max = min = SH64PCRELPLT;
+
+           /* If we're not expanding, then just emit a fixup.  */
+           if (sh64_expand || opjp->reloctype != BFD_RELOC_NONE)
+             frag_var (rs_machine_dependent,
+                       md_relax_table[C (what, max)].rlx_length,
+                       md_relax_table[C (what, min)].rlx_length,
+                       C (what, init),
+                       opjp->immediate.X_add_symbol,
+                       opjp->immediate.X_add_number,
+                       insn_loc);
+           else
+             /* This reloc-type is just temporary, so we can distinguish
+                PTA from PT.  It is changed in shmedia_md_apply_fix3 to
+                BFD_RELOC_SH_PT_16.  */
+             insn |= shmedia_immediate_op (insn_loc, opjp, 1,
+                                           opjp->reloctype == BFD_RELOC_NONE
+                                           ? SHMEDIA_BFD_RELOC_PT
+                                           : opjp->reloctype);
+             
+           j++;
+           break;
+         }
+
+       case A_IMMU5:
+         insn |= shmedia_immediate_op (insn_loc, opjp, 0,
+                                       BFD_RELOC_SH_IMMU5);
+         j++;
+         break;
+
+       case A_IMMU6:
+         insn |= shmedia_immediate_op (insn_loc, opjp, 0,
+                                       BFD_RELOC_SH_IMMU6);
+         j++;
+         break;
+
+       case A_IMMU16:
+         insn |= shmedia_immediate_op (insn_loc, opjp, 0,
+                                       (opjp->reloctype
+                                        == BFD_RELOC_NONE)
+                                       ? BFD_RELOC_SH_IMMU16
+                                       : opjp->reloctype);
+         j++;
+         break;
+
+       default:
+         BAD_CASE (argtype);
+       }
+    }
+
+  md_number_to_chars (insn_loc, insn, 4);
+  return 4;
+}
+
+/* Assemble a SHmedia instruction.  */
+
+static void
+shmedia_md_assemble (str)
+     char *str;
+{
+  char *op_end;
+  shmedia_opcode_info *opcode;
+  shmedia_operands_info operands;
+  int size;
+
+  opcode = shmedia_find_cooked_opcode (&str);
+  op_end = str;
+
+  if (opcode == NULL)
+    {
+      as_bad (_("unknown opcode"));
+      return;
+    }
+
+  /* Start a SHmedia code region, if there has been pseudoinsns or similar
+     seen since the last one.  */
+  if (seen_insn == false)
+    {
+      sh64_update_contents_mark (true);
+      sh64_set_contents_type (CRT_SH5_ISA32);
+      seen_insn = true;
+    }
+
+  op_end = shmedia_get_operands (opcode, op_end, &operands);
+
+  if (op_end == NULL)
+    {
+      as_bad (_("invalid operands to %s"), opcode->name);
+      return;
+    }
+
+  if (*op_end)
+    {
+      as_bad (_("excess operands to %s"), opcode->name);
+      return;
+    }
+
+  size = shmedia_build_Mytes (opcode, &operands);
+  if (size == 0)
+    return;
+}
+
+/* Hook called from md_begin in tc-sh.c.  */
+
+void
+shmedia_md_begin ()
+{
+  const shmedia_opcode_info *shmedia_opcode;
+  shmedia_opcode_hash_control = hash_new ();
+
+  /* Create opcode table for SHmedia mnemonics.  */
+  for (shmedia_opcode = shmedia_table;
+       shmedia_opcode->name;
+       shmedia_opcode++)
+    hash_insert (shmedia_opcode_hash_control, shmedia_opcode->name,
+                (char *) shmedia_opcode);
+}
+
+/* Switch instruction set.  Only valid if one of the --isa or --abi
+   options was specified.  */
+
+static void
+s_sh64_mode (ignore)
+    int ignore ATTRIBUTE_UNUSED;
+{
+  char *name = input_line_pointer, ch;
+
+  /* Make sure data up to this location is handled according to the
+     previous ISA.  */
+  sh64_update_contents_mark (true);
+
+  while (!is_end_of_line[(unsigned char) *input_line_pointer])
+    input_line_pointer++;
+  ch = *input_line_pointer;
+  *input_line_pointer = '\0';
+
+  /* If the mode was not set before, explicitly or implicitly, then we're
+     not emitting SH64 code, so this pseudo is invalid.  */
+  if (sh64_isa_mode == sh64_isa_unspecified)
+    as_bad (_("The `.mode %s' directive is not valid with this architecture"),
+           name);
+
+  if (strcasecmp (name, "shcompact") == 0)
+    sh64_isa_mode = sh64_isa_shcompact;
+  else if (strcasecmp (name, "shmedia") == 0)
+    sh64_isa_mode = sh64_isa_shmedia;
+  else
+    as_bad (_("Invalid argument to .mode: %s"), name);
+
+  /* Make a new frag, marking it with the supposedly-changed ISA.  */
+  frag_wane (frag_now);
+  frag_new (0);
+
+  /* Contents type up to this new point is the same as before; don't add a
+     data region just because the new frag we created.  */
+  sh64_update_contents_mark (false);
+
+  *input_line_pointer = ch;
+  demand_empty_rest_of_line ();
+}
+
+/* Check that the right ABI is used.  Only valid if one of the --isa or
+   --abi options was specified.  */
+
+static void
+s_sh64_abi (ignore)
+    int ignore ATTRIBUTE_UNUSED;
+{
+  char *name = input_line_pointer, ch;
+
+  while (!is_end_of_line[(unsigned char) *input_line_pointer])
+    input_line_pointer++;
+  ch = *input_line_pointer;
+  *input_line_pointer = '\0';
+
+  /* If the mode was not set before, explicitly or implicitly, then we're
+     not emitting SH64 code, so this pseudo is invalid.  */
+  if (sh64_abi == sh64_abi_unspecified)
+    as_bad (_("The `.abi %s' directive is not valid with this architecture"),
+           name);
+
+  if (strcmp (name, "64") == 0)
+    {
+      if (sh64_abi != sh64_abi_64)
+       as_bad (_("`.abi 64' but command-line options do not specify 64-bit ABI"));
+    }
+  else if (strcmp (name, "32") == 0)
+    {
+      if (sh64_abi != sh64_abi_32)
+       as_bad (_("`.abi 32' but command-line options do not specify 32-bit ABI"));
+    }
+  else
+    as_bad (_("Invalid argument to .abi: %s"), name);
+
+  *input_line_pointer = ch;
+  demand_empty_rest_of_line ();
+}
+
+/* This function is the first target-specific function called after
+   parsing command-line options.  Therefore we set default values from
+   command-line options here and do some sanity checking we couldn't do
+   when options were being parsed.  */
+
+const char *
+sh64_target_format ()
+{
+#ifdef TE_LINUX
+  return "FIXME: No linux target yet";
+#endif
+
+  if (sh64_abi == sh64_abi_64 && sh64_isa_mode == sh64_isa_unspecified)
+    sh64_isa_mode = sh64_isa_shmedia;
+
+  if (sh64_abi == sh64_abi_32 && sh64_isa_mode == sh64_isa_unspecified)
+    sh64_isa_mode = sh64_isa_shcompact;
+
+  if (sh64_isa_mode == sh64_isa_shcompact
+      && sh64_abi == sh64_abi_unspecified)
+    sh64_abi = sh64_abi_32;
+
+  if (sh64_isa_mode == sh64_isa_shmedia
+      && sh64_abi == sh64_abi_unspecified)
+    sh64_abi = sh64_abi_64;
+
+  if (sh64_isa_mode == sh64_isa_unspecified && ! sh64_mix)
+    as_bad (_("-no-mix is invalid without specifying SHcompact or SHmedia"));
+
+  if ((sh64_isa_mode == sh64_isa_unspecified
+       || sh64_isa_mode == sh64_isa_shmedia)
+      && sh64_shcompact_const_crange)
+    as_bad (_("-shcompact-const-crange is invalid without SHcompact"));
+
+  if (sh64_pt32 && sh64_abi != sh64_abi_64)
+    as_bad (_("-expand-pt32 only valid with -abi=64"));
+
+  if (! sh64_expand && sh64_isa_mode == sh64_isa_unspecified)
+    as_bad (_("-no-expand only valid with SHcompact or SHmedia"));
+
+  if (sh64_pt32 && ! sh64_expand)
+    as_bad (_("-expand-pt32 invalid together with -no-expand"));
+
+  /* When the ISA is not one of SHmedia or SHcompact, use the old SH
+     object format.  */
+  if (sh64_isa_mode == sh64_isa_unspecified)
+    return (target_big_endian ? "elf32-sh" : "elf32-shl");
+  else if (sh64_abi == sh64_abi_64)
+    return (target_big_endian ? "elf64-sh64" : "elf64-sh64l");
+  else
+    return (target_big_endian ? "elf32-sh64" : "elf32-sh64l");
+}
+
+/* The worker function of TARGET_MACH.  */
+
+int
+sh64_target_mach ()
+{
+  /* We need to explicitly set bfd_mach_sh5 instead of the default 0.  But
+     we only do this for the 64-bit ABI: if we do it for the 32-bit ABI,
+     the SH5 info in the bfd_arch_info structure will be selected.
+     However correct, as the machine has 64-bit addresses, functions
+     expected to emit 32-bit data for addresses will start failing.  For
+     example, the dwarf2dbg.c functions will emit 64-bit debugging format,
+     and we don't want that in the 32-bit ABI.
+
+     We could have two bfd_arch_info structures for SH64; one for the
+     32-bit ABI and one for the rest (64-bit ABI).  But that would be a
+     bigger kludge: it's a flaw in the BFD design, and we need to just
+     work around it by having the default machine set here in the
+     assembler.  For everything else but the assembler, the various bfd
+     functions will set the machine type right to bfd_mach_sh5 from object
+     file header flags regardless of the 0 here.  */
+
+  return (sh64_abi == sh64_abi_64) ? bfd_mach_sh5 : 0;
+}
+
+/* This is MD_PCREL_FROM_SECTION, we we define so it is called instead of
+   md_pcrel_from (in tc-sh.c).  */
+
+valueT
+shmedia_md_pcrel_from_section (fixP, sec)
+     struct fix *fixP;
+     segT sec ATTRIBUTE_UNUSED;
+{
+  know (fixP->fx_frag->fr_type == rs_machine_dependent);
+
+  /* Use the ISA for the instruction to decide which offset to use.  We
+     can glean it from the fisup type.  */
+  switch (fixP->fx_r_type)
+    {
+    case BFD_RELOC_SH_IMM_LOW16:
+    case BFD_RELOC_SH_IMM_MEDLOW16:
+    case BFD_RELOC_SH_IMM_MEDHI16:
+    case BFD_RELOC_SH_IMM_HI16:
+    case BFD_RELOC_SH_IMM_LOW16_PCREL:
+    case BFD_RELOC_SH_IMM_MEDLOW16_PCREL:
+    case BFD_RELOC_SH_IMM_MEDHI16_PCREL:
+    case BFD_RELOC_SH_IMM_HI16_PCREL:
+    case BFD_RELOC_SH_IMMU5:
+    case BFD_RELOC_SH_IMMU6:
+    case BFD_RELOC_SH_IMMS6:
+    case BFD_RELOC_SH_IMMS10:
+    case BFD_RELOC_SH_IMMS10BY2:
+    case BFD_RELOC_SH_IMMS10BY4:
+    case BFD_RELOC_SH_IMMS10BY8:
+    case BFD_RELOC_SH_IMMS16:
+    case BFD_RELOC_SH_IMMU16:
+    case BFD_RELOC_SH_PT_16:
+    case SHMEDIA_BFD_RELOC_PT:
+      /* PC-relative relocs are relative to the address of the last generated
+        instruction, i.e. fx_size - 4.  */
+      return SHMEDIA_MD_PCREL_FROM_FIX (fixP);
+
+    case BFD_RELOC_64:
+    case BFD_RELOC_64_PCREL:
+      know (0 /* Shouldn't get here.  */);
+      break;
+
+    default:
+      /* If section was SHcompact, use its function.  */
+      return (valueT) md_pcrel_from_section (fixP, sec);
+    }
+
+  know (0 /* Shouldn't get here.  */);
+  return 0;
+}
+
+/* Create one .cranges descriptor from two symbols, STARTSYM marking begin
+   and ENDSYM marking end, and CR_TYPE specifying the type.  */
+
+static void
+sh64_emit_crange (startsym, endsym, cr_type)
+     symbolS *startsym;
+     symbolS *endsym;
+     enum sh64_elf_cr_type cr_type;
+{
+  expressionS exp;
+  segT current_seg = now_seg;
+  subsegT current_subseg = now_subseg;
+
+  asection *cranges
+    = bfd_make_section_old_way (stdoutput,
+                               SH64_CRANGES_SECTION_NAME);
+
+  /* Temporarily change to the .cranges section.  */
+  subseg_set (cranges, 0);
+
+  /* Emit the cr_addr part.  */
+  exp.X_op = O_symbol;
+  exp.X_add_number = 0;
+  exp.X_op_symbol = NULL;
+  exp.X_add_symbol = startsym;
+  emit_expr (&exp, 4);
+
+  /* Emit the cr_size part.  */
+  exp.X_op = O_subtract;
+  exp.X_add_number = 0;
+  exp.X_add_symbol = endsym;
+  exp.X_op_symbol = startsym;
+  emit_expr (&exp, 4);
+
+  /* Emit the cr_size part. */
+  exp.X_op = O_constant;
+  exp.X_add_number = cr_type;
+  exp.X_add_symbol = NULL;
+  exp.X_op_symbol = NULL;
+  emit_expr (&exp, 2);
+
+  /* Now back to our regular program.  */
+  subseg_set (current_seg, current_subseg);
+}
+
+/* Called when the assembler is about to emit contents of some type into
+   SEG, so it is *known* that the type of that new contents is in
+   NEW_CONTENTS_TYPE.  If just switching back and forth between different
+   contents types (for example, with consecutive .mode pseudos), then this
+   function isn't called.  */
+
+static void
+sh64_set_contents_type (new_contents_type)
+     enum sh64_elf_cr_type new_contents_type;
+{
+  segment_info_type *seginfo;
+
+  /* We will not be called when emitting .cranges output, since callers
+     stop that.  Validize that assumption.  */
+  know (emitting_crange == false);
+
+  seginfo = seg_info (now_seg);
+
+  if (seginfo)
+    {
+      symbolS *symp = seginfo->tc_segment_info_data.last_contents_mark;
+
+      enum sh64_elf_cr_type contents_type
+       = seginfo->tc_segment_info_data.contents_type;
+
+      /* If it was just SHcompact switching between code and constant
+        pool, don't change contents type.  Just make sure we don't set
+        the contents type to data, as that would join with a data-region
+        in SHmedia mode.  */
+      if (sh64_isa_mode == sh64_isa_shcompact
+         && ! sh64_shcompact_const_crange)
+       new_contents_type = CRT_SH5_ISA16;
+
+      /* If nothing changed, stop here.  */
+      if (contents_type == new_contents_type)
+       return;
+
+      /* If we're in 64-bit ABI mode, we do not emit .cranges, as it is
+        only specified for 32-bit addresses.  It could presumably be
+        extended, but in 64-bit ABI mode we don't have SHcompact code, so
+        we would only use it to mark code and data.  */
+      if (sh64_abi == sh64_abi_64)
+       {
+         /* Make the code type "sticky".  We don't want to set the
+            sections contents type to data if there's any code in it as
+            we don't have .cranges in 64-bit mode to notice the
+            difference.  */
+         seginfo->tc_segment_info_data.contents_type
+           = (new_contents_type == CRT_SH5_ISA32
+              || contents_type == CRT_SH5_ISA32)
+           ? CRT_SH5_ISA32 : new_contents_type;
+         return;
+       }
+
+      /* If none was marked, create a start symbol for this range and
+        perhaps as a closing symbol for the old one.  */
+      if (symp == NULL)
+       symp = symbol_new (FAKE_LABEL_NAME, now_seg, (valueT) frag_now_fix (),
+                          frag_now);
+
+      /* We will use this symbol, so don't leave a pointer behind.  */
+      seginfo->tc_segment_info_data.last_contents_mark = NULL;
+
+      /* We'll be making only datalabel references to it, if we emit a
+        .cranges descriptor, so remove any code flag.  */
+      S_SET_OTHER (symp, S_GET_OTHER (symp) & ~STO_SH5_ISA32);
+
+      /* If we have already marked the start of a range, we need to close
+        and emit it before marking a new one, so emit a new .cranges
+        descriptor into the .cranges section.  */
+      if (seginfo->tc_segment_info_data.mode_start_symbol)
+       {
+         /* If we're not supposed to emit mixed-mode sections, make it an
+            error, but continue processing.  */
+         if (! sh64_mix
+             && (new_contents_type == CRT_SH5_ISA32
+                 || contents_type == CRT_SH5_ISA32))
+           as_bad (
+_("SHmedia code not allowed in same section as constants and SHcompact code"));
+
+         emitting_crange = true;
+         sh64_emit_crange (seginfo->tc_segment_info_data.mode_start_symbol,
+                           symp, contents_type);
+         emitting_crange = false;
+         seginfo->tc_segment_info_data.emitted_ranges++;
+       }
+
+      seginfo->tc_segment_info_data.mode_start_symbol = symp;
+      seginfo->tc_segment_info_data.mode_start_subseg = now_subseg;
+      seginfo->tc_segment_info_data.contents_type = new_contents_type;
+
+      /* Always reset this, so the SHcompact code will emit a reloc when
+        it prepares to relax.  */
+      seginfo->tc_segment_info_data.in_code = 0;
+    }
+  else
+    as_bad (_("No segment info for current section"));
+}
+
+/* Hook when defining symbols and labels.  We set the ST_OTHER field if
+   the symbol is "shmedia" (with "bitor 1" automatically applied).  Simple
+   semantics for a label being "shmedia" : It was defined when .mode
+   SHmedia was in effect, and it was defined in a code section.  It
+   doesn't matter whether or not an assembled opcode is nearby.  */
+
+void
+sh64_frob_label (symp)
+     symbolS *symp;
+{
+  segT seg = S_GET_SEGMENT (symp);
+  static const symbolS *null = NULL;
+
+  /* Reset the tc marker for all newly created symbols.  */
+  symbol_set_tc (symp, (symbolS **) &null);
+
+  if (seg != NULL && sh64_isa_mode == sh64_isa_shmedia && subseg_text_p (seg))
+    S_SET_OTHER (symp, S_GET_OTHER (symp) | STO_SH5_ISA32);
+}
+
+/* Handle the "datalabel" qualifier.  We need to call "operand", but it's
+   static, so a function pointer is passed here instead.  FIXME: A target
+   hook for qualifiers is needed; we currently use the md_parse_name
+   symbol hook.  */
+
+int
+sh64_consume_datalabel (name, exp, cp, operandf)
+     const char *name;
+     expressionS *exp;
+     char *cp;
+     segT (*operandf) PARAMS ((expressionS *));
+{
+  static int parsing_datalabel = 0;
+
+  if (strcasecmp (name, "datalabel") == 0)
+    {
+      int save_parsing_datalabel = parsing_datalabel;
+
+      if (parsing_datalabel)
+       as_bad (_("duplicate datalabel operator ignored"));
+
+      *input_line_pointer = *cp;
+      parsing_datalabel = 1;
+      (*operandf) (exp);
+      parsing_datalabel = save_parsing_datalabel;
+
+      if (exp->X_op == O_symbol || exp->X_op == O_PIC_reloc)
+       {
+         symbolS *symp = exp->X_add_symbol;
+         segT symseg = S_GET_SEGMENT (symp);
+
+         /* If the symbol is defined to something that is already a
+            datalabel, we don't need to bother with any special handling.  */
+         if (symseg != undefined_section
+             && S_GET_OTHER (symp) != STO_SH5_ISA32)
+           /* Do nothing.  */
+           ;
+         else
+           {
+             symbolS *dl_symp;
+             const char *name = S_GET_NAME (symp);
+             char *dl_name
+               = xmalloc (strlen (name) + sizeof (DATALABEL_SUFFIX));
+
+             /* Now we copy the datalabel-qualified symbol into a symbol
+                with the same name, but with " DL" appended.  We mark the
+                symbol using the TC_SYMFIELD_TYPE field with a pointer to
+                the main symbol, so we don't have to inspect all symbol
+                names.  Note that use of "datalabel" is not expected to
+                be a common case.  */
+             strcpy (dl_name, name);
+             strcat (dl_name, DATALABEL_SUFFIX);
+
+             /* A FAKE_LABEL_NAME marks "$" or ".".  There can be any
+                number of them and all have the same (faked) name; we
+                must make a new one each time.  */
+             if (strcmp (name, FAKE_LABEL_NAME) == 0)
+               dl_symp = symbol_make (dl_name);
+             else
+               dl_symp = symbol_find_or_make (dl_name);
+
+             free (dl_name);
+             symbol_set_value_expression (dl_symp,
+                                          symbol_get_value_expression (symp));
+             S_SET_SEGMENT (dl_symp, symseg);
+             symbol_set_frag (dl_symp, symbol_get_frag (symp));
+             symbol_set_tc (dl_symp, &symp);
+             copy_symbol_attributes (dl_symp, symp);
+             exp->X_add_symbol = dl_symp;
+
+             /* Unset the BranchTarget mark that can be set at symbol
+                creation or attributes copying. */
+             S_SET_OTHER (dl_symp, S_GET_OTHER (dl_symp) & ~STO_SH5_ISA32);
+
+             /* The GLOBAL and WEAK attributes are not copied over by
+                copy_symbol_attributes.  Do it here. */
+             if (S_IS_WEAK (symp))
+               S_SET_WEAK (dl_symp);
+             else if (S_IS_EXTERNAL (symp))
+               S_SET_EXTERNAL (dl_symp);
+           }
+       }
+      /* Complain about other types of operands than symbol, unless they
+        have already been complained about.  A constant is always a
+        datalabel.  Removing the low bit would therefore be wrong.
+        Complaining about it would also be wrong.  */
+      else if (exp->X_op != O_illegal
+              && exp->X_op != O_absent
+              && exp->X_op != O_constant)
+       as_bad (_("Invalid DataLabel expression"));
+
+      *cp = *input_line_pointer;
+
+      return 1;
+    }
+
+  return sh_parse_name (name, exp, cp);
+}
+
+/* This function is called just before symbols are being output.  It
+   returns zero when a symbol must be output, non-zero otherwise.
+   Datalabel references that were fully resolved to local symbols are not
+   necessary to output.  We also do not want to output undefined symbols
+   that are not used in relocs.  For symbols that are used in a reloc, it
+   does not matter what we set here.  If it is *not* used in a reloc, then
+   it was probably the datalabel counterpart that was used in a reloc;
+   then we need not output the main symbol.  */
+
+int
+sh64_exclude_symbol (symp)
+     symbolS *symp;
+{
+  symbolS *main_symbol = *symbol_get_tc (symp);
+
+  return main_symbol != NULL || ! S_IS_DEFINED (symp);
+}
+
+/* If we haven't seen an insn since the last update, and location
+   indicators have moved (a new frag, new location within frag) we have
+   emitted data, so change contents type to data.  Forget that we have
+   seen a sequence of insns and store the current location so we can mark
+   a new region if needed.  */
+
+static void
+sh64_update_contents_mark (update_type)
+     boolean update_type;
+{
+  segment_info_type *seginfo;
+  seginfo = seg_info (now_seg);
+
+  if (seginfo != NULL)
+    {
+      symbolS *symp = seginfo->tc_segment_info_data.last_contents_mark;
+
+      if (symp == NULL)
+       {
+         symp = symbol_new (FAKE_LABEL_NAME, now_seg,
+                            (valueT) frag_now_fix (), frag_now);
+         seginfo->tc_segment_info_data.last_contents_mark = symp;
+       }
+      else
+       {
+         /* If we have moved location since last flush, we need to emit a
+            data range.  The previous contents type ended at the location
+            of the last update.  */
+         if ((S_GET_VALUE (symp) != frag_now_fix ()
+              || symbol_get_frag (symp) != frag_now))
+           {
+             enum sh64_elf_cr_type contents_type
+               = seginfo->tc_segment_info_data.contents_type;
+
+             if (update_type
+                 && contents_type != CRT_DATA
+                 && contents_type != CRT_NONE
+                 && ! seen_insn)
+               {
+                 sh64_set_contents_type (CRT_DATA);
+                 symp = seginfo->tc_segment_info_data.last_contents_mark;
+               }
+
+             /* If the symbol wasn't used up to make up a new range
+                descriptor, update it to this new location.  */
+             if (symp)
+               {
+                 S_SET_VALUE (symp, (valueT) frag_now_fix ());
+                 symbol_set_frag (symp, frag_now);
+               }
+           }
+       }
+    }
+
+  seen_insn = false;
+}
+
+/* Called when the assembler is about to output some data, or maybe it's
+   just switching segments.  */
+
+void
+sh64_flush_pending_output ()
+{
+  sh64_update_contents_mark (true);
+  sh_flush_pending_output ();
+}
+
+/* Flush out the last crange descriptor after all insns have been emitted.  */
+
+static void
+sh64_flush_last_crange (abfd, seg, countparg)
+     bfd *abfd ATTRIBUTE_UNUSED;
+     asection *seg;
+     PTR countparg ATTRIBUTE_UNUSED;
+{
+  segment_info_type *seginfo;
+
+  seginfo = seg_info (seg);
+
+  if (seginfo
+      /* Only emit .cranges descriptors if we would make it more than one.  */
+      && seginfo->tc_segment_info_data.emitted_ranges != 0)
+    {
+      symbolS *symp;
+
+      /* We need a closing symbol, so switch to the indicated section and
+        emit it.  */
+
+      /* Change to the section we're about to handle.  */
+      subseg_set (seg, seginfo->tc_segment_info_data.mode_start_subseg);
+
+      symp = symbol_new (FAKE_LABEL_NAME, now_seg, (valueT) frag_now_fix (),
+                        frag_now);
+
+      /* We'll be making a datalabel reference to it, so remove any code
+         flag.  */
+      S_SET_OTHER (symp, S_GET_OTHER (symp) & ~STO_SH5_ISA32);
+
+      sh64_emit_crange (seginfo->tc_segment_info_data.mode_start_symbol,
+                       symp,
+                       seginfo->tc_segment_info_data.contents_type);
+    }
+}
+
+/* If and only if we see a call to md_number_to_chars without flagging the
+   start of an insn, we set the contents type to CRT_DATA, and only when
+   in SHmedia mode.  Note that by default we don't bother changing when
+   going from SHcompact to data, as the constant pools in GCC-generated
+   SHcompact code would create an inordinate amount of .cranges
+   descriptors.  */
+
+static void
+sh64_flag_output ()
+{
+  if (sh64_isa_mode != sh64_isa_unspecified
+      && seen_insn == false
+      && sh64_end_of_assembly == false
+      && ! emitting_crange)
+    {
+      md_flush_pending_output ();
+      sh64_set_contents_type (CRT_DATA);
+    }
+}
+
+/* Vtables don't need "datalabel" but we allow it by simply deleting
+   any we find. */
+
+static char *
+strip_datalabels ()
+{
+  char *src, *dest, *start=input_line_pointer;
+
+  for (src=input_line_pointer, dest=input_line_pointer; *src != '\n'; )
+    {
+      if (strncasecmp (src, "datalabel", 9) == 0
+         && ISSPACE (src[9])
+         && (src == start || !(ISALNUM (src[-1])) || src[-1] == '_'))
+       src += 10;
+      else
+       *dest++ = *src++;
+    }
+
+  if (dest < src)
+    *dest = '\n';
+  return src + 1;
+}
+
+static void
+sh64_vtable_entry (ignore)
+     int ignore ATTRIBUTE_UNUSED;
+{
+  char *eol = strip_datalabels ();
+
+  obj_elf_vtable_entry (0);
+  input_line_pointer = eol;
+}
+
+static void
+sh64_vtable_inherit (ignore)
+     int ignore ATTRIBUTE_UNUSED;
+{
+  char *eol = strip_datalabels ();
+
+  obj_elf_vtable_inherit (0);
+  input_line_pointer = eol;
+}
diff --git a/gas/config/tc-sh64.h b/gas/config/tc-sh64.h
new file mode 100644 (file)
index 0000000..a8dc1f2
--- /dev/null
@@ -0,0 +1,212 @@
+/* This file is tc-sh64.h
+   Copyright (C) 2000, 2001 Free Software Foundation, Inc.
+
+   This file is part of GAS, the GNU Assembler.
+
+   GAS is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   GAS is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with GAS; see the file COPYING.  If not, write to
+   the Free Software Foundation, 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#define TC_SH64
+#include "config/tc-sh.h"
+#include "elf/sh.h"
+
+/* We need to override the tc-sh.h settings of HANDLE_ALIGN and
+   MAX_MEM_FOR_RS_ALIGN_CODE; we might need to put in SHmedia NOP:s, not
+   SHcompact NOP:s.  */
+#undef  HANDLE_ALIGN
+#define HANDLE_ALIGN(frag) sh64_handle_align (frag)
+extern void sh64_handle_align PARAMS ((fragS *));
+
+#undef  MAX_MEM_FOR_RS_ALIGN_CODE
+#define MAX_MEM_FOR_RS_ALIGN_CODE sh64_max_mem_for_rs_align_code ()
+extern int sh64_max_mem_for_rs_align_code PARAMS ((void));
+
+#undef  LISTING_HEADER
+#define LISTING_HEADER                                 \
+  (target_big_endian ?                                 \
+     "Hitachi SHcompact/SHmedia Big Endian GAS"                \
+   : "Hitachi SHcompact/SHmedia Little Endian GAS")
+
+/* We need to record the new frag position after an .align.  */
+extern void sh64_do_align PARAMS ((int, const char *, int, int));
+#define md_do_align(n, fill, len, max, l) \
+ do { sh64_do_align (n, fill, len, max); goto l; } while (0)
+
+struct sh64_segment_info_type
+{
+  /* The type of the section is initialized when the range_start_symbol
+     member is non-NULL.  */
+  symbolS *mode_start_symbol;
+  subsegT mode_start_subseg;
+
+  /* A stored symbol indicating location of last call of
+     "md_flush_pending_output".  It is NULLed when we actually use it;
+     otherwise the contents is just filled in with segment, frag and
+     offset within frag.  */
+  symbolS *last_contents_mark;
+
+  unsigned int emitted_ranges;
+  enum sh64_elf_cr_type contents_type;
+
+  /* This is used by the SH1-4 parts; we set it to 0 for SHmedia code and
+     data.  */
+  unsigned int in_code : 1;
+};
+
+#undef  TC_SEGMENT_INFO_TYPE
+#define TC_SEGMENT_INFO_TYPE struct sh64_segment_info_type
+
+#undef  TARGET_FORMAT
+#define TARGET_FORMAT sh64_target_format ()
+extern const char *sh64_target_format PARAMS ((void));
+
+#define TARGET_MACH sh64_target_mach ()
+extern int sh64_target_mach PARAMS ((void));
+
+#undef TC_RELOC_RTSYM_LOC_FIXUP
+#define TC_RELOC_RTSYM_LOC_FIXUP(FIX)                          \
+  ((FIX)->fx_r_type != BFD_RELOC_32_PLT_PCREL                  \
+   && (FIX)->fx_r_type != BFD_RELOC_SH_PLT_LOW16               \
+   && (FIX)->fx_r_type != BFD_RELOC_SH_PLT_MEDLOW16            \
+   && (FIX)->fx_r_type != BFD_RELOC_SH_PLT_MEDHI16             \
+   && (FIX)->fx_r_type != BFD_RELOC_SH_PLT_HI16                        \
+   && (FIX)->fx_r_type != BFD_RELOC_32_GOT_PCREL               \
+   && (FIX)->fx_r_type != BFD_RELOC_SH_GOT_LOW16               \
+   && (FIX)->fx_r_type != BFD_RELOC_SH_GOT_MEDLOW16            \
+   && (FIX)->fx_r_type != BFD_RELOC_SH_GOT_MEDHI16             \
+   && (FIX)->fx_r_type != BFD_RELOC_SH_GOT_HI16                        \
+   && (FIX)->fx_r_type != BFD_RELOC_SH_GOT10BY4                        \
+   && (FIX)->fx_r_type != BFD_RELOC_SH_GOT10BY8                        \
+   && (FIX)->fx_r_type != BFD_RELOC_SH_GOTPLT32                        \
+   && (FIX)->fx_r_type != BFD_RELOC_SH_GOTPLT_LOW16            \
+   && (FIX)->fx_r_type != BFD_RELOC_SH_GOTPLT_MEDLOW16         \
+   && (FIX)->fx_r_type != BFD_RELOC_SH_GOTPLT_MEDHI16          \
+   && (FIX)->fx_r_type != BFD_RELOC_SH_GOTPLT_HI16             \
+   && (FIX)->fx_r_type != BFD_RELOC_SH_GOTPLT10BY4             \
+   && (FIX)->fx_r_type != BFD_RELOC_SH_GOTPLT10BY8             \
+   && (FIX)->fx_r_type != BFD_RELOC_SH_GOTPC                   \
+   && (FIX)->fx_r_type != BFD_RELOC_SH_GOTPC_LOW16             \
+   && (FIX)->fx_r_type != BFD_RELOC_SH_GOTPC_MEDLOW16          \
+   && (FIX)->fx_r_type != BFD_RELOC_SH_GOTPC_MEDHI16           \
+   && (FIX)->fx_r_type != BFD_RELOC_SH_GOTPC_HI16              \
+   && ((FIX)->fx_addsy == NULL                                 \
+       || (! S_IS_EXTERNAL ((FIX)->fx_addsy)                   \
+          && ! S_IS_WEAK ((FIX)->fx_addsy)                     \
+          && S_IS_DEFINED ((FIX)->fx_addsy)                    \
+          && ! S_IS_COMMON ((FIX)->fx_addsy))))
+
+/* Note the kludge: we want to put back C, and we also want to consume the
+   expression, since we have handled it ourselves.  FIXME: What we really
+   need is a new GAS infrastructure feature: md_qualifier.  */
+#undef md_parse_name
+#define md_parse_name(NAME, EXP, CP) \
+ sh64_consume_datalabel (NAME, EXP, CP, operand)
+extern int sh64_consume_datalabel
+ PARAMS ((const char *, expressionS *, char *, segT (*) (expressionS *)));
+
+/* Saying "$" is the same as saying ".".  */
+#define DOLLAR_DOT
+
+#define MD_PCREL_FROM_SECTION(FIXP, SEC)               \
+  shmedia_md_pcrel_from_section (FIXP, SEC)
+
+extern valueT shmedia_md_pcrel_from_section PARAMS ((struct fix *, segT));
+
+/* We need to mark this symbol as a BranchTarget; setting st_other for it
+   and adding 1 to its value (temporarily).  */
+extern void sh64_frob_label PARAMS ((symbolS *));
+
+#undef  tc_frob_label
+#define tc_frob_label(sym) \
+  do { sh_frob_label (); sh64_frob_label (sym); } while (0)
+
+#define tc_symbol_new_hook(s) sh64_frob_label (s)
+
+/* We use this to mark our "datalabel" symbol copies.  The "mark" is NULL
+   for an ordinary symbol, and the pointer to the "ordinary" symbol for a
+   datalabel symbol.  */
+#define TC_SYMFIELD_TYPE symbolS *
+
+#define tc_frob_symbol(symp, punt)             \
+ do                                            \
+   {                                           \
+     punt = sh64_exclude_symbol (symp);                \
+   }                                           \
+ while (0)
+
+extern int sh64_exclude_symbol PARAMS ((symbolS *));
+
+extern void sh64_adjust_symtab PARAMS ((void));
+#define tc_adjust_symtab sh64_adjust_symtab
+
+#undef  md_flush_pending_output
+#define md_flush_pending_output() sh64_flush_pending_output ()
+extern void sh64_flush_pending_output PARAMS ((void));
+
+/* Note that tc-sh.c has a sh_frob_section, but it's called from
+   tc_frob_file_before_adjust.  */
+#define tc_frob_section(sec) shmedia_frob_section_type (sec)
+extern void shmedia_frob_section_type PARAMS ((asection *));
+
+#define ELF_TC_SPECIAL_SECTIONS \
+  { ".cranges",        SHT_PROGBITS,   0 },
+
+/* We need to emit fixups relative to the frag in which the instruction
+   resides.  Safest way without calculating max fragment growth or making
+   it a fixed number is to provide a pointer to the opcode frag.
+
+   We also need to emit the right NOP pattern in .align frags.  This is
+   done after the text-to-bits assembly pass, so we need to mark it with
+   the ISA setting at the time the .align was assembled.  */
+#define TC_FRAG_TYPE struct sh64_tc_frag_data
+
+enum sh64_isa_values
+ {
+   sh64_isa_unspecified,
+   sh64_isa_shcompact,
+   sh64_isa_shmedia,
+
+   /* Special guard value used in contexts when we don't know which ISA it
+      is, just that it's specified (not sh64_isa_unspecified).  */
+   sh64_isa_sh5_guard
+ };
+
+struct sh64_tc_frag_data
+{
+  fragS *opc_frag;
+  enum sh64_isa_values isa;
+};
+
+extern enum sh64_isa_values sh64_isa_mode;
+
+#define TC_FRAG_INIT(FRAGP)                                    \
+ do                                                            \
+   {                                                           \
+     (FRAGP)->tc_frag_data.opc_frag = sh64_last_insn_frag;     \
+     (FRAGP)->tc_frag_data.isa = sh64_isa_mode;                        \
+   }                                                           \
+ while (0)
+
+/* This variable is set whenever we generate (or grow) a new opcode frag
+   in shmedia_build_Mytes.  */
+extern fragS *sh64_last_insn_frag;
+
+#define md_end() shmedia_md_end ()
+void shmedia_md_end PARAMS ((void));
+
+/* Because we make .debug_line hold the SHmedia instruction address | 1,
+   we have to say we only have minimum byte-size insns.  */
+#undef  DWARF2_LINE_MIN_INSN_LENGTH
+#define DWARF2_LINE_MIN_INSN_LENGTH 1
index 46f1361e3351f5d30b760734fa950055ad0b9434..568d9d97eb805620ef1a111333c867a8a9a1e4f3 100755 (executable)
@@ -55,6 +55,7 @@ program_suffix=NONE
 program_transform_name=s,x,x,
 silent=
 site=
+sitefile=
 srcdir=
 target=NONE
 verbose=
@@ -169,6 +170,7 @@ Configuration:
   --help                  print this message
   --no-create             do not create output files
   --quiet, --silent       do not print \`checking...' messages
+  --site-file=FILE        use FILE as the site file
   --version               print the version of autoconf that created configure
 Directory and file names:
   --prefix=PREFIX         install architecture-independent files in PREFIX
@@ -339,6 +341,11 @@ EOF
   -site=* | --site=* | --sit=*)
     site="$ac_optarg" ;;
 
+  -site-file | --site-file | --site-fil | --site-fi | --site-f)
+    ac_prev=sitefile ;;
+  -site-file=* | --site-file=* | --site-fil=* | --site-fi=* | --site-f=*)
+    sitefile="$ac_optarg" ;;
+
   -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
     ac_prev=srcdir ;;
   -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
@@ -504,12 +511,16 @@ fi
 srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
 
 # Prefer explicitly selected file to automatically selected ones.
-if test -z "$CONFIG_SITE"; then
-  if test "x$prefix" != xNONE; then
-    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
-  else
-    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+if test -z "$sitefile"; then
+  if test -z "$CONFIG_SITE"; then
+    if test "x$prefix" != xNONE; then
+      CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+    else
+      CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+    fi
   fi
+else
+  CONFIG_SITE="$sitefile"
 fi
 for ac_site_file in $CONFIG_SITE; do
   if test -r "$ac_site_file"; then
@@ -548,12 +559,12 @@ else
 fi
 
 echo $ac_n "checking for Cygwin environment""... $ac_c" 1>&6
-echo "configure:552: checking for Cygwin environment" >&5
+echo "configure:563: checking for Cygwin environment" >&5
 if eval "test \"`echo '$''{'ac_cv_cygwin'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 557 "configure"
+#line 568 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -564,7 +575,7 @@ int main() {
 return __CYGWIN__;
 ; return 0; }
 EOF
-if { (eval echo configure:568: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:579: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_cygwin=yes
 else
@@ -581,19 +592,19 @@ echo "$ac_t""$ac_cv_cygwin" 1>&6
 CYGWIN=
 test "$ac_cv_cygwin" = yes && CYGWIN=yes
 echo $ac_n "checking for mingw32 environment""... $ac_c" 1>&6
-echo "configure:585: checking for mingw32 environment" >&5
+echo "configure:596: checking for mingw32 environment" >&5
 if eval "test \"`echo '$''{'ac_cv_mingw32'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 590 "configure"
+#line 601 "configure"
 #include "confdefs.h"
 
 int main() {
 return __MINGW32__;
 ; return 0; }
 EOF
-if { (eval echo configure:597: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:608: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_mingw32=yes
 else
@@ -658,7 +669,7 @@ else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
 fi
 
 echo $ac_n "checking host system type""... $ac_c" 1>&6
-echo "configure:662: checking host system type" >&5
+echo "configure:673: checking host system type" >&5
 
 host_alias=$host
 case "$host_alias" in
@@ -679,7 +690,7 @@ host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
 echo "$ac_t""$host" 1>&6
 
 echo $ac_n "checking target system type""... $ac_c" 1>&6
-echo "configure:683: checking target system type" >&5
+echo "configure:694: checking target system type" >&5
 
 target_alias=$target
 case "$target_alias" in
@@ -697,7 +708,7 @@ target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
 echo "$ac_t""$target" 1>&6
 
 echo $ac_n "checking build system type""... $ac_c" 1>&6
-echo "configure:701: checking build system type" >&5
+echo "configure:712: checking build system type" >&5
 
 build_alias=$build
 case "$build_alias" in
@@ -722,7 +733,7 @@ test "$host_alias" != "$target_alias" &&
 # Extract the first word of "gcc", so it can be a program name with args.
 set dummy gcc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:726: checking for $ac_word" >&5
+echo "configure:737: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -752,7 +763,7 @@ if test -z "$CC"; then
   # Extract the first word of "cc", so it can be a program name with args.
 set dummy cc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:756: checking for $ac_word" >&5
+echo "configure:767: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -803,7 +814,7 @@ fi
       # Extract the first word of "cl", so it can be a program name with args.
 set dummy cl; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:807: checking for $ac_word" >&5
+echo "configure:818: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -835,7 +846,7 @@ fi
 fi
 
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:839: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+echo "configure:850: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
 
 ac_ext=c
 # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
@@ -846,12 +857,12 @@ cross_compiling=$ac_cv_prog_cc_cross
 
 cat > conftest.$ac_ext << EOF
 
-#line 850 "configure"
+#line 861 "configure"
 #include "confdefs.h"
 
 main(){return(0);}
 EOF
-if { (eval echo configure:855: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:866: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   ac_cv_prog_cc_works=yes
   # If we can't run a trivial program, we are probably using a cross compiler.
   if (./conftest; exit) 2>/dev/null; then
@@ -877,12 +888,12 @@ if test $ac_cv_prog_cc_works = no; then
   { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
 fi
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:881: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "configure:892: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
 cross_compiling=$ac_cv_prog_cc_cross
 
 echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:886: checking whether we are using GNU C" >&5
+echo "configure:897: checking whether we are using GNU C" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -891,7 +902,7 @@ else
   yes;
 #endif
 EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:895: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:906: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
   ac_cv_prog_gcc=yes
 else
   ac_cv_prog_gcc=no
@@ -910,7 +921,7 @@ ac_test_CFLAGS="${CFLAGS+set}"
 ac_save_CFLAGS="$CFLAGS"
 CFLAGS=
 echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:914: checking whether ${CC-cc} accepts -g" >&5
+echo "configure:925: checking whether ${CC-cc} accepts -g" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -942,7 +953,7 @@ else
 fi
 
 echo $ac_n "checking for POSIXized ISC""... $ac_c" 1>&6
-echo "configure:946: checking for POSIXized ISC" >&5
+echo "configure:957: checking for POSIXized ISC" >&5
 if test -d /etc/conf/kconfig.d &&
   grep _POSIX_VERSION /usr/include/sys/unistd.h >/dev/null 2>&1
 then
@@ -976,7 +987,7 @@ BFD_VERSION=`sed -n -e 's/^.._INIT_AUTOMAKE.*,[     ]*\([^  ]*\)[   ]*).*/\1/p' < ${
 # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
 # ./install, which can be erroneously created by make from ./install.sh.
 echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
-echo "configure:980: checking for a BSD compatible install" >&5
+echo "configure:991: checking for a BSD compatible install" >&5
 if test -z "$INSTALL"; then
 if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1029,7 +1040,7 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
 test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
 
 echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6
-echo "configure:1033: checking whether build environment is sane" >&5
+echo "configure:1044: checking whether build environment is sane" >&5
 # Just in case
 sleep 1
 echo timestamp > conftestfile
@@ -1086,7 +1097,7 @@ test "$program_suffix" != NONE &&
 test "$program_transform_name" = "" && program_transform_name="s,x,x,"
 
 echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
-echo "configure:1090: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo "configure:1101: checking whether ${MAKE-make} sets \${MAKE}" >&5
 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1132,7 +1143,7 @@ EOF
 
 missing_dir=`cd $ac_aux_dir && pwd`
 echo $ac_n "checking for working aclocal""... $ac_c" 1>&6
-echo "configure:1136: checking for working aclocal" >&5
+echo "configure:1147: checking for working aclocal" >&5
 # Run test in a subshell; some versions of sh will print an error if
 # an executable is not found, even if stderr is redirected.
 # Redirect stdin to placate older versions of autoconf.  Sigh.
@@ -1145,7 +1156,7 @@ else
 fi
 
 echo $ac_n "checking for working autoconf""... $ac_c" 1>&6
-echo "configure:1149: checking for working autoconf" >&5
+echo "configure:1160: checking for working autoconf" >&5
 # Run test in a subshell; some versions of sh will print an error if
 # an executable is not found, even if stderr is redirected.
 # Redirect stdin to placate older versions of autoconf.  Sigh.
@@ -1158,7 +1169,7 @@ else
 fi
 
 echo $ac_n "checking for working automake""... $ac_c" 1>&6
-echo "configure:1162: checking for working automake" >&5
+echo "configure:1173: checking for working automake" >&5
 # Run test in a subshell; some versions of sh will print an error if
 # an executable is not found, even if stderr is redirected.
 # Redirect stdin to placate older versions of autoconf.  Sigh.
@@ -1171,7 +1182,7 @@ else
 fi
 
 echo $ac_n "checking for working autoheader""... $ac_c" 1>&6
-echo "configure:1175: checking for working autoheader" >&5
+echo "configure:1186: checking for working autoheader" >&5
 # Run test in a subshell; some versions of sh will print an error if
 # an executable is not found, even if stderr is redirected.
 # Redirect stdin to placate older versions of autoconf.  Sigh.
@@ -1184,7 +1195,7 @@ else
 fi
 
 echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6
-echo "configure:1188: checking for working makeinfo" >&5
+echo "configure:1199: checking for working makeinfo" >&5
 # Run test in a subshell; some versions of sh will print an error if
 # an executable is not found, even if stderr is redirected.
 # Redirect stdin to placate older versions of autoconf.  Sigh.
@@ -1279,7 +1290,7 @@ ac_prog=ld
 if test "$GCC" = yes; then
   # Check if gcc -print-prog-name=ld gives a path.
   echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6
-echo "configure:1283: checking for ld used by GCC" >&5
+echo "configure:1294: checking for ld used by GCC" >&5
   case $host in
   *-*-mingw*)
     # gcc leaves a trailing carriage return which upsets mingw
@@ -1309,10 +1320,10 @@ echo "configure:1283: checking for ld used by GCC" >&5
   esac
 elif test "$with_gnu_ld" = yes; then
   echo $ac_n "checking for GNU ld""... $ac_c" 1>&6
-echo "configure:1313: checking for GNU ld" >&5
+echo "configure:1324: checking for GNU ld" >&5
 else
   echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6
-echo "configure:1316: checking for non-GNU ld" >&5
+echo "configure:1327: checking for non-GNU ld" >&5
 fi
 if eval "test \"`echo '$''{'lt_cv_path_LD'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -1347,7 +1358,7 @@ else
 fi
 test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; }
 echo $ac_n "checking if the linker ($LD) is GNU ld""... $ac_c" 1>&6
-echo "configure:1351: checking if the linker ($LD) is GNU ld" >&5
+echo "configure:1362: checking if the linker ($LD) is GNU ld" >&5
 if eval "test \"`echo '$''{'lt_cv_prog_gnu_ld'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1364,7 +1375,7 @@ with_gnu_ld=$lt_cv_prog_gnu_ld
 
 
 echo $ac_n "checking for $LD option to reload object files""... $ac_c" 1>&6
-echo "configure:1368: checking for $LD option to reload object files" >&5
+echo "configure:1379: checking for $LD option to reload object files" >&5
 if eval "test \"`echo '$''{'lt_cv_ld_reload_flag'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1376,7 +1387,7 @@ reload_flag=$lt_cv_ld_reload_flag
 test -n "$reload_flag" && reload_flag=" $reload_flag"
 
 echo $ac_n "checking for BSD-compatible nm""... $ac_c" 1>&6
-echo "configure:1380: checking for BSD-compatible nm" >&5
+echo "configure:1391: checking for BSD-compatible nm" >&5
 if eval "test \"`echo '$''{'lt_cv_path_NM'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1414,7 +1425,7 @@ NM="$lt_cv_path_NM"
 echo "$ac_t""$NM" 1>&6
 
 echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
-echo "configure:1418: checking whether ln -s works" >&5
+echo "configure:1429: checking whether ln -s works" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1435,7 +1446,7 @@ else
 fi
 
 echo $ac_n "checking how to recognise dependant libraries""... $ac_c" 1>&6
-echo "configure:1439: checking how to recognise dependant libraries" >&5
+echo "configure:1450: checking how to recognise dependant libraries" >&5
 if eval "test \"`echo '$''{'lt_cv_deplibs_check_method'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1608,13 +1619,13 @@ file_magic_cmd=$lt_cv_file_magic_cmd
 deplibs_check_method=$lt_cv_deplibs_check_method
 
 echo $ac_n "checking for object suffix""... $ac_c" 1>&6
-echo "configure:1612: checking for object suffix" >&5
+echo "configure:1623: checking for object suffix" >&5
 if eval "test \"`echo '$''{'ac_cv_objext'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   rm -f conftest*
 echo 'int i = 1;' > conftest.$ac_ext
-if { (eval echo configure:1618: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1629: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   for ac_file in conftest.*; do
     case $ac_file in
     *.c) ;;
@@ -1634,7 +1645,7 @@ ac_objext=$ac_cv_objext
 
 
 echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
-echo "configure:1638: checking for executable suffix" >&5
+echo "configure:1649: checking for executable suffix" >&5
 if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1644,10 +1655,10 @@ else
   rm -f conftest*
   echo 'int main () { return 0; }' > conftest.$ac_ext
   ac_cv_exeext=
-  if { (eval echo configure:1648: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+  if { (eval echo configure:1659: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
     for file in conftest.*; do
       case $file in
-      *.c | *.o | *.obj) ;;
+      *.c | *.o | *.obj | *.ilk | *.pdb) ;;
       *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;;
       esac
     done
@@ -1677,7 +1688,7 @@ case $deplibs_check_method in
 file_magic*)
   if test "$file_magic_cmd" = '$MAGIC_CMD'; then
     echo $ac_n "checking for ${ac_tool_prefix}file""... $ac_c" 1>&6
-echo "configure:1681: checking for ${ac_tool_prefix}file" >&5
+echo "configure:1692: checking for ${ac_tool_prefix}file" >&5
 if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1739,7 +1750,7 @@ fi
 if test -z "$lt_cv_path_MAGIC_CMD"; then
   if test -n "$ac_tool_prefix"; then
     echo $ac_n "checking for file""... $ac_c" 1>&6
-echo "configure:1743: checking for file" >&5
+echo "configure:1754: checking for file" >&5
 if eval "test \"`echo '$''{'lt_cv_path_MAGIC_CMD'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1810,7 +1821,7 @@ esac
 # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
 set dummy ${ac_tool_prefix}ranlib; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1814: checking for $ac_word" >&5
+echo "configure:1825: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1842,7 +1853,7 @@ if test -n "$ac_tool_prefix"; then
   # Extract the first word of "ranlib", so it can be a program name with args.
 set dummy ranlib; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1846: checking for $ac_word" >&5
+echo "configure:1857: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1877,7 +1888,7 @@ fi
 # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
 set dummy ${ac_tool_prefix}strip; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1881: checking for $ac_word" >&5
+echo "configure:1892: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1909,7 +1920,7 @@ if test -n "$ac_tool_prefix"; then
   # Extract the first word of "strip", so it can be a program name with args.
 set dummy strip; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:1913: checking for $ac_word" >&5
+echo "configure:1924: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1976,8 +1987,8 @@ test x"$pic_mode" = xno && libtool_flags="$libtool_flags --prefer-non-pic"
 case $host in
 *-*-irix6*)
   # Find out which ABI we are using.
-  echo '#line 1980 "configure"' > conftest.$ac_ext
-  if { (eval echo configure:1981: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  echo '#line 1991 "configure"' > conftest.$ac_ext
+  if { (eval echo configure:1992: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
     case `/usr/bin/file conftest.$ac_objext` in
     *32-bit*)
       LD="${LD-ld} -32"
@@ -1996,7 +2007,7 @@ case $host in
 ia64-*-hpux*)
   # Find out which ABI we are using.
   echo 'int i;' > conftest.$ac_ext
-  if { (eval echo configure:2000: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  if { (eval echo configure:2011: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
     case "`/usr/bin/file conftest.o`" in
     *ELF-32*)
       HPUX_IA64_MODE="32"
@@ -2014,7 +2025,7 @@ ia64-*-hpux*)
   SAVE_CFLAGS="$CFLAGS"
   CFLAGS="$CFLAGS -belf"
   echo $ac_n "checking whether the C compiler needs -belf""... $ac_c" 1>&6
-echo "configure:2018: checking whether the C compiler needs -belf" >&5
+echo "configure:2029: checking whether the C compiler needs -belf" >&5
 if eval "test \"`echo '$''{'lt_cv_cc_needs_belf'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2027,14 +2038,14 @@ ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$a
 cross_compiling=$ac_cv_prog_cc_cross
 
      cat > conftest.$ac_ext <<EOF
-#line 2031 "configure"
+#line 2042 "configure"
 #include "confdefs.h"
 
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:2038: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:2049: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   lt_cv_cc_needs_belf=yes
 else
@@ -2295,6 +2306,7 @@ for this_target in $target $canon_targets ; do
       rs6000*)         cpu_type=ppc ;;
       s390x*)          cpu_type=s390 arch=s390x ;;
       s390*)           cpu_type=s390 arch=s390 ;;
+      sh64*)            cpu_type=sh64 endian=big;;
       sh*le)           cpu_type=sh endian=little ;;
       sh*)             cpu_type=sh endian=big ;;
       sparclite*)      cpu_type=sparc arch=sparclite ;;
@@ -2580,6 +2592,7 @@ EOF
       sh-*-rtemself*)       fmt=elf ;;
       sh-*-rtems*)         fmt=coff bfd_gas=yes;;
 
+      sh64-*-elf*)         fmt=elf ;;
       ns32k-pc532-mach* | ns32k-pc532-ux*)    fmt=aout em=pc532mach ;;
       ns32k-pc532-netbsd* | ns32k-pc532-lites*)  fmt=aout em=nbsd532 ;;
       ns32k-pc532-openbsd*) fmt=aout em=nbsd532 ;;
@@ -3138,7 +3151,7 @@ EOF
 # Extract the first word of "gcc", so it can be a program name with args.
 set dummy gcc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3142: checking for $ac_word" >&5
+echo "configure:3155: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3168,7 +3181,7 @@ if test -z "$CC"; then
   # Extract the first word of "cc", so it can be a program name with args.
 set dummy cc; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3172: checking for $ac_word" >&5
+echo "configure:3185: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3219,7 +3232,7 @@ fi
       # Extract the first word of "cl", so it can be a program name with args.
 set dummy cl; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3223: checking for $ac_word" >&5
+echo "configure:3236: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3251,7 +3264,7 @@ fi
 fi
 
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
-echo "configure:3255: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+echo "configure:3268: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
 
 ac_ext=c
 # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
@@ -3262,12 +3275,12 @@ cross_compiling=$ac_cv_prog_cc_cross
 
 cat > conftest.$ac_ext << EOF
 
-#line 3266 "configure"
+#line 3279 "configure"
 #include "confdefs.h"
 
 main(){return(0);}
 EOF
-if { (eval echo configure:3271: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3284: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   ac_cv_prog_cc_works=yes
   # If we can't run a trivial program, we are probably using a cross compiler.
   if (./conftest; exit) 2>/dev/null; then
@@ -3293,12 +3306,12 @@ if test $ac_cv_prog_cc_works = no; then
   { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
 fi
 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
-echo "configure:3297: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "configure:3310: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
 cross_compiling=$ac_cv_prog_cc_cross
 
 echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
-echo "configure:3302: checking whether we are using GNU C" >&5
+echo "configure:3315: checking whether we are using GNU C" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3307,7 +3320,7 @@ else
   yes;
 #endif
 EOF
-if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:3311: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:3324: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
   ac_cv_prog_gcc=yes
 else
   ac_cv_prog_gcc=no
@@ -3326,7 +3339,7 @@ ac_test_CFLAGS="${CFLAGS+set}"
 ac_save_CFLAGS="$CFLAGS"
 CFLAGS=
 echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
-echo "configure:3330: checking whether ${CC-cc} accepts -g" >&5
+echo "configure:3343: checking whether ${CC-cc} accepts -g" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3363,7 +3376,7 @@ do
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3367: checking for $ac_word" >&5
+echo "configure:3380: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_YACC'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3394,7 +3407,7 @@ done
 test -n "$YACC" || YACC="yacc"
 
 echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
-echo "configure:3398: checking how to run the C preprocessor" >&5
+echo "configure:3411: checking how to run the C preprocessor" >&5
 # On Suns, sometimes $CPP names a directory.
 if test -n "$CPP" && test -d "$CPP"; then
   CPP=
@@ -3409,13 +3422,13 @@ else
   # On the NeXT, cc -E runs the code through the compiler's parser,
   # not just through cpp.
   cat > conftest.$ac_ext <<EOF
-#line 3413 "configure"
+#line 3426 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3419: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3432: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   :
@@ -3426,13 +3439,13 @@ else
   rm -rf conftest*
   CPP="${CC-cc} -E -traditional-cpp"
   cat > conftest.$ac_ext <<EOF
-#line 3430 "configure"
+#line 3443 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3436: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3449: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   :
@@ -3443,13 +3456,13 @@ else
   rm -rf conftest*
   CPP="${CC-cc} -nologo -E"
   cat > conftest.$ac_ext <<EOF
-#line 3447 "configure"
+#line 3460 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3453: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3466: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   :
@@ -3479,7 +3492,7 @@ do
 # Extract the first word of "$ac_prog", so it can be a program name with args.
 set dummy $ac_prog; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3483: checking for $ac_word" >&5
+echo "configure:3496: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_LEX'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3507,12 +3520,12 @@ fi
 
 test -n "$LEX" && break
 done
-test -n "$LEX" || LEX=""$missing_dir/missing flex""
+test -n "$LEX" || LEX="$missing_dir/missing flex"
 
 # Extract the first word of "flex", so it can be a program name with args.
 set dummy flex; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3516: checking for $ac_word" >&5
+echo "configure:3529: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_LEX'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3546,7 +3559,7 @@ then
   *) ac_lib=l ;;
   esac
   echo $ac_n "checking for yywrap in -l$ac_lib""... $ac_c" 1>&6
-echo "configure:3550: checking for yywrap in -l$ac_lib" >&5
+echo "configure:3563: checking for yywrap in -l$ac_lib" >&5
 ac_lib_var=`echo $ac_lib'_'yywrap | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -3554,7 +3567,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-l$ac_lib  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 3558 "configure"
+#line 3571 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -3565,7 +3578,7 @@ int main() {
 yywrap()
 ; return 0; }
 EOF
-if { (eval echo configure:3569: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3582: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -3588,7 +3601,7 @@ fi
 fi
 
 echo $ac_n "checking lex output file root""... $ac_c" 1>&6
-echo "configure:3592: checking lex output file root" >&5
+echo "configure:3605: checking lex output file root" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_lex_root'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3609,7 +3622,7 @@ echo "$ac_t""$ac_cv_prog_lex_root" 1>&6
 LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root
 
 echo $ac_n "checking whether yytext is a pointer""... $ac_c" 1>&6
-echo "configure:3613: checking whether yytext is a pointer" >&5
+echo "configure:3626: checking whether yytext is a pointer" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_lex_yytext_pointer'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3621,14 +3634,14 @@ echo 'extern char *yytext;' >>$LEX_OUTPUT_ROOT.c
 ac_save_LIBS="$LIBS"
 LIBS="$LIBS $LEXLIB"
 cat > conftest.$ac_ext <<EOF
-#line 3625 "configure"
+#line 3638 "configure"
 #include "confdefs.h"
 `cat $LEX_OUTPUT_ROOT.c`
 int main() {
 
 ; return 0; }
 EOF
-if { (eval echo configure:3632: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3645: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_cv_prog_lex_yytext_pointer=yes
 else
@@ -3654,7 +3667,7 @@ ALL_LINGUAS="fr tr"
 # Extract the first word of "ranlib", so it can be a program name with args.
 set dummy ranlib; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:3658: checking for $ac_word" >&5
+echo "configure:3671: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -3682,12 +3695,12 @@ else
 fi
 
 echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
-echo "configure:3686: checking for ANSI C header files" >&5
+echo "configure:3699: checking for ANSI C header files" >&5
 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3691 "configure"
+#line 3704 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 #include <stdarg.h>
@@ -3695,7 +3708,7 @@ else
 #include <float.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:3699: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:3712: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -3712,7 +3725,7 @@ rm -f conftest*
 if test $ac_cv_header_stdc = yes; then
   # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 3716 "configure"
+#line 3729 "configure"
 #include "confdefs.h"
 #include <string.h>
 EOF
@@ -3730,7 +3743,7 @@ fi
 if test $ac_cv_header_stdc = yes; then
   # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
 cat > conftest.$ac_ext <<EOF
-#line 3734 "configure"
+#line 3747 "configure"
 #include "confdefs.h"
 #include <stdlib.h>
 EOF
@@ -3751,7 +3764,7 @@ if test "$cross_compiling" = yes; then
   :
 else
   cat > conftest.$ac_ext <<EOF
-#line 3755 "configure"
+#line 3768 "configure"
 #include "confdefs.h"
 #include <ctype.h>
 #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
@@ -3762,7 +3775,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
 exit (0); }
 
 EOF
-if { (eval echo configure:3766: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:3779: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   :
 else
@@ -3786,12 +3799,12 @@ EOF
 fi
 
 echo $ac_n "checking for working const""... $ac_c" 1>&6
-echo "configure:3790: checking for working const" >&5
+echo "configure:3803: checking for working const" >&5
 if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3795 "configure"
+#line 3808 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -3840,7 +3853,7 @@ ccp = (char const *const *) p;
 
 ; return 0; }
 EOF
-if { (eval echo configure:3844: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3857: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_const=yes
 else
@@ -3861,21 +3874,21 @@ EOF
 fi
 
 echo $ac_n "checking for inline""... $ac_c" 1>&6
-echo "configure:3865: checking for inline" >&5
+echo "configure:3878: checking for inline" >&5
 if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   ac_cv_c_inline=no
 for ac_kw in inline __inline__ __inline; do
   cat > conftest.$ac_ext <<EOF
-#line 3872 "configure"
+#line 3885 "configure"
 #include "confdefs.h"
 
 int main() {
 } $ac_kw foo() {
 ; return 0; }
 EOF
-if { (eval echo configure:3879: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:3892: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_inline=$ac_kw; break
 else
@@ -3901,12 +3914,12 @@ EOF
 esac
 
 echo $ac_n "checking for off_t""... $ac_c" 1>&6
-echo "configure:3905: checking for off_t" >&5
+echo "configure:3918: checking for off_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3910 "configure"
+#line 3923 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -3934,12 +3947,12 @@ EOF
 fi
 
 echo $ac_n "checking for size_t""... $ac_c" 1>&6
-echo "configure:3938: checking for size_t" >&5
+echo "configure:3951: checking for size_t" >&5
 if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3943 "configure"
+#line 3956 "configure"
 #include "confdefs.h"
 #include <sys/types.h>
 #if STDC_HEADERS
@@ -3969,19 +3982,19 @@ fi
 # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
 # for constant arguments.  Useless!
 echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
-echo "configure:3973: checking for working alloca.h" >&5
+echo "configure:3986: checking for working alloca.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 3978 "configure"
+#line 3991 "configure"
 #include "confdefs.h"
 #include <alloca.h>
 int main() {
 char *p = alloca(2 * sizeof(int));
 ; return 0; }
 EOF
-if { (eval echo configure:3985: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:3998: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_cv_header_alloca_h=yes
 else
@@ -4002,12 +4015,12 @@ EOF
 fi
 
 echo $ac_n "checking for alloca""... $ac_c" 1>&6
-echo "configure:4006: checking for alloca" >&5
+echo "configure:4019: checking for alloca" >&5
 if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4011 "configure"
+#line 4024 "configure"
 #include "confdefs.h"
 
 #ifdef __GNUC__
@@ -4035,7 +4048,7 @@ int main() {
 char *p = (char *) alloca(1);
 ; return 0; }
 EOF
-if { (eval echo configure:4039: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4052: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_cv_func_alloca_works=yes
 else
@@ -4067,12 +4080,12 @@ EOF
 
 
 echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
-echo "configure:4071: checking whether alloca needs Cray hooks" >&5
+echo "configure:4084: checking whether alloca needs Cray hooks" >&5
 if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4076 "configure"
+#line 4089 "configure"
 #include "confdefs.h"
 #if defined(CRAY) && ! defined(CRAY2)
 webecray
@@ -4097,12 +4110,12 @@ echo "$ac_t""$ac_cv_os_cray" 1>&6
 if test $ac_cv_os_cray = yes; then
 for ac_func in _getb67 GETB67 getb67; do
   echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:4101: checking for $ac_func" >&5
+echo "configure:4114: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4106 "configure"
+#line 4119 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -4125,7 +4138,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:4129: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4142: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -4152,7 +4165,7 @@ done
 fi
 
 echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
-echo "configure:4156: checking stack direction for C alloca" >&5
+echo "configure:4169: checking stack direction for C alloca" >&5
 if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4160,7 +4173,7 @@ else
   ac_cv_c_stack_direction=0
 else
   cat > conftest.$ac_ext <<EOF
-#line 4164 "configure"
+#line 4177 "configure"
 #include "confdefs.h"
 find_stack_direction ()
 {
@@ -4179,7 +4192,7 @@ main ()
   exit (find_stack_direction() < 0);
 }
 EOF
-if { (eval echo configure:4183: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:4196: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ac_cv_c_stack_direction=1
 else
@@ -4204,17 +4217,17 @@ for ac_hdr in unistd.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:4208: checking for $ac_hdr" >&5
+echo "configure:4221: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4213 "configure"
+#line 4226 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4218: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4231: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -4243,12 +4256,12 @@ done
 for ac_func in getpagesize
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:4247: checking for $ac_func" >&5
+echo "configure:4260: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4252 "configure"
+#line 4265 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -4271,7 +4284,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:4275: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4288: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -4296,7 +4309,7 @@ fi
 done
 
 echo $ac_n "checking for working mmap""... $ac_c" 1>&6
-echo "configure:4300: checking for working mmap" >&5
+echo "configure:4313: checking for working mmap" >&5
 if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4304,7 +4317,7 @@ else
   ac_cv_func_mmap_fixed_mapped=no
 else
   cat > conftest.$ac_ext <<EOF
-#line 4308 "configure"
+#line 4321 "configure"
 #include "confdefs.h"
 
 /* Thanks to Mike Haertel and Jim Avera for this test.
@@ -4444,7 +4457,7 @@ main()
 }
 
 EOF
-if { (eval echo configure:4448: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:4461: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ac_cv_func_mmap_fixed_mapped=yes
 else
@@ -4472,17 +4485,17 @@ unistd.h values.h sys/param.h
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:4476: checking for $ac_hdr" >&5
+echo "configure:4489: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4481 "configure"
+#line 4494 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4486: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4499: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -4512,12 +4525,12 @@ done
 __argz_count __argz_stringify __argz_next
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:4516: checking for $ac_func" >&5
+echo "configure:4529: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4521 "configure"
+#line 4534 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -4540,7 +4553,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:4544: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4557: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -4569,12 +4582,12 @@ done
      for ac_func in stpcpy
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:4573: checking for $ac_func" >&5
+echo "configure:4586: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4578 "configure"
+#line 4591 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -4597,7 +4610,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:4601: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4614: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -4631,19 +4644,19 @@ EOF
 
    if test $ac_cv_header_locale_h = yes; then
     echo $ac_n "checking for LC_MESSAGES""... $ac_c" 1>&6
-echo "configure:4635: checking for LC_MESSAGES" >&5
+echo "configure:4648: checking for LC_MESSAGES" >&5
 if eval "test \"`echo '$''{'am_cv_val_LC_MESSAGES'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4640 "configure"
+#line 4653 "configure"
 #include "confdefs.h"
 #include <locale.h>
 int main() {
 return LC_MESSAGES
 ; return 0; }
 EOF
-if { (eval echo configure:4647: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4660: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   am_cv_val_LC_MESSAGES=yes
 else
@@ -4664,7 +4677,7 @@ EOF
     fi
   fi
    echo $ac_n "checking whether NLS is requested""... $ac_c" 1>&6
-echo "configure:4668: checking whether NLS is requested" >&5
+echo "configure:4681: checking whether NLS is requested" >&5
         # Check whether --enable-nls or --disable-nls was given.
 if test "${enable_nls+set}" = set; then
   enableval="$enable_nls"
@@ -4684,7 +4697,7 @@ fi
 EOF
 
       echo $ac_n "checking whether included gettext is requested""... $ac_c" 1>&6
-echo "configure:4688: checking whether included gettext is requested" >&5
+echo "configure:4701: checking whether included gettext is requested" >&5
       # Check whether --with-included-gettext or --without-included-gettext was given.
 if test "${with_included_gettext+set}" = set; then
   withval="$with_included_gettext"
@@ -4703,17 +4716,17 @@ fi
 
        ac_safe=`echo "libintl.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for libintl.h""... $ac_c" 1>&6
-echo "configure:4707: checking for libintl.h" >&5
+echo "configure:4720: checking for libintl.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4712 "configure"
+#line 4725 "configure"
 #include "confdefs.h"
 #include <libintl.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:4717: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:4730: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -4730,19 +4743,19 @@ fi
 if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
   echo "$ac_t""yes" 1>&6
   echo $ac_n "checking for gettext in libc""... $ac_c" 1>&6
-echo "configure:4734: checking for gettext in libc" >&5
+echo "configure:4747: checking for gettext in libc" >&5
 if eval "test \"`echo '$''{'gt_cv_func_gettext_libc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4739 "configure"
+#line 4752 "configure"
 #include "confdefs.h"
 #include <libintl.h>
 int main() {
 return (int) gettext ("")
 ; return 0; }
 EOF
-if { (eval echo configure:4746: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4759: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   gt_cv_func_gettext_libc=yes
 else
@@ -4758,7 +4771,7 @@ echo "$ac_t""$gt_cv_func_gettext_libc" 1>&6
 
           if test "$gt_cv_func_gettext_libc" != "yes"; then
             echo $ac_n "checking for bindtextdomain in -lintl""... $ac_c" 1>&6
-echo "configure:4762: checking for bindtextdomain in -lintl" >&5
+echo "configure:4775: checking for bindtextdomain in -lintl" >&5
 ac_lib_var=`echo intl'_'bindtextdomain | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -4766,7 +4779,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lintl  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 4770 "configure"
+#line 4783 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -4777,7 +4790,7 @@ int main() {
 bindtextdomain()
 ; return 0; }
 EOF
-if { (eval echo configure:4781: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4794: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -4793,19 +4806,19 @@ fi
 if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
   echo "$ac_t""yes" 1>&6
   echo $ac_n "checking for gettext in libintl""... $ac_c" 1>&6
-echo "configure:4797: checking for gettext in libintl" >&5
+echo "configure:4810: checking for gettext in libintl" >&5
 if eval "test \"`echo '$''{'gt_cv_func_gettext_libintl'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4802 "configure"
+#line 4815 "configure"
 #include "confdefs.h"
 
 int main() {
 return (int) gettext ("")
 ; return 0; }
 EOF
-if { (eval echo configure:4809: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4822: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   gt_cv_func_gettext_libintl=yes
 else
@@ -4833,7 +4846,7 @@ EOF
              # Extract the first word of "msgfmt", so it can be a program name with args.
 set dummy msgfmt; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4837: checking for $ac_word" >&5
+echo "configure:4850: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4867,12 +4880,12 @@ fi
                for ac_func in dcgettext
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:4871: checking for $ac_func" >&5
+echo "configure:4884: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 4876 "configure"
+#line 4889 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -4895,7 +4908,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:4899: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:4912: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -4922,7 +4935,7 @@ done
                # Extract the first word of "gmsgfmt", so it can be a program name with args.
 set dummy gmsgfmt; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4926: checking for $ac_word" >&5
+echo "configure:4939: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4958,7 +4971,7 @@ fi
                # Extract the first word of "xgettext", so it can be a program name with args.
 set dummy xgettext; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:4962: checking for $ac_word" >&5
+echo "configure:4975: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -4990,7 +5003,7 @@ else
 fi
 
                cat > conftest.$ac_ext <<EOF
-#line 4994 "configure"
+#line 5007 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -4998,7 +5011,7 @@ extern int _nl_msg_cat_cntr;
                               return _nl_msg_cat_cntr
 ; return 0; }
 EOF
-if { (eval echo configure:5002: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5015: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   CATOBJEXT=.gmo
                   DATADIRNAME=share
@@ -5030,7 +5043,7 @@ fi
         # Extract the first word of "msgfmt", so it can be a program name with args.
 set dummy msgfmt; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:5034: checking for $ac_word" >&5
+echo "configure:5047: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5064,7 +5077,7 @@ fi
         # Extract the first word of "gmsgfmt", so it can be a program name with args.
 set dummy gmsgfmt; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:5068: checking for $ac_word" >&5
+echo "configure:5081: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5100,7 +5113,7 @@ fi
         # Extract the first word of "xgettext", so it can be a program name with args.
 set dummy xgettext; ac_word=$2
 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
-echo "configure:5104: checking for $ac_word" >&5
+echo "configure:5117: checking for $ac_word" >&5
 if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5190,7 +5203,7 @@ fi
        LINGUAS=
      else
        echo $ac_n "checking for catalogs to be installed""... $ac_c" 1>&6
-echo "configure:5194: checking for catalogs to be installed" >&5
+echo "configure:5207: checking for catalogs to be installed" >&5
        NEW_LINGUAS=
        for lang in ${LINGUAS=$ALL_LINGUAS}; do
          case "$ALL_LINGUAS" in
@@ -5218,17 +5231,17 @@ echo "configure:5194: checking for catalogs to be installed" >&5
       if test "$CATOBJEXT" = ".cat"; then
         ac_safe=`echo "linux/version.h" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for linux/version.h""... $ac_c" 1>&6
-echo "configure:5222: checking for linux/version.h" >&5
+echo "configure:5235: checking for linux/version.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5227 "configure"
+#line 5240 "configure"
 #include "confdefs.h"
 #include <linux/version.h>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5232: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5245: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -5291,7 +5304,7 @@ fi
   
 
 echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles""... $ac_c" 1>&6
-echo "configure:5295: checking whether to enable maintainer-specific portions of Makefiles" >&5
+echo "configure:5308: checking whether to enable maintainer-specific portions of Makefiles" >&5
     # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given.
 if test "${enable_maintainer_mode+set}" = set; then
   enableval="$enable_maintainer_mode"
@@ -5316,7 +5329,7 @@ fi
 
 
 echo $ac_n "checking for executable suffix""... $ac_c" 1>&6
-echo "configure:5320: checking for executable suffix" >&5
+echo "configure:5333: checking for executable suffix" >&5
 if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5326,10 +5339,10 @@ else
   rm -f conftest*
   echo 'int main () { return 0; }' > conftest.$ac_ext
   ac_cv_exeext=
-  if { (eval echo configure:5330: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+  if { (eval echo configure:5343: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
     for file in conftest.*; do
       case $file in
-      *.c | *.o | *.obj) ;;
+      *.c | *.o | *.obj | *.ilk | *.pdb) ;;
       *) ac_cv_exeext=`echo $file | sed -e s/conftest//` ;;
       esac
     done
@@ -5351,17 +5364,17 @@ for ac_hdr in string.h stdlib.h memory.h strings.h unistd.h stdarg.h varargs.h e
 do
 ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
 echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
-echo "configure:5355: checking for $ac_hdr" >&5
+echo "configure:5368: checking for $ac_hdr" >&5
 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5360 "configure"
+#line 5373 "configure"
 #include "confdefs.h"
 #include <$ac_hdr>
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:5365: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:5378: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
 if test -z "$ac_err"; then
   rm -rf conftest*
@@ -5391,7 +5404,7 @@ done
 # Put this here so that autoconf's "cross-compiling" message doesn't confuse
 # people who are not cross-compiling but are compiling cross-assemblers.
 echo $ac_n "checking whether compiling a cross-assembler""... $ac_c" 1>&6
-echo "configure:5395: checking whether compiling a cross-assembler" >&5
+echo "configure:5408: checking whether compiling a cross-assembler" >&5
 if test "${host}" = "${target}"; then
   cross_gas=no
 else
@@ -5406,19 +5419,19 @@ echo "$ac_t""$cross_gas" 1>&6
 # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
 # for constant arguments.  Useless!
 echo $ac_n "checking for working alloca.h""... $ac_c" 1>&6
-echo "configure:5410: checking for working alloca.h" >&5
+echo "configure:5423: checking for working alloca.h" >&5
 if eval "test \"`echo '$''{'ac_cv_header_alloca_h'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5415 "configure"
+#line 5428 "configure"
 #include "confdefs.h"
 #include <alloca.h>
 int main() {
 char *p = alloca(2 * sizeof(int));
 ; return 0; }
 EOF
-if { (eval echo configure:5422: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5435: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_cv_header_alloca_h=yes
 else
@@ -5439,12 +5452,12 @@ EOF
 fi
 
 echo $ac_n "checking for alloca""... $ac_c" 1>&6
-echo "configure:5443: checking for alloca" >&5
+echo "configure:5456: checking for alloca" >&5
 if eval "test \"`echo '$''{'ac_cv_func_alloca_works'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5448 "configure"
+#line 5461 "configure"
 #include "confdefs.h"
 
 #ifdef __GNUC__
@@ -5472,7 +5485,7 @@ int main() {
 char *p = (char *) alloca(1);
 ; return 0; }
 EOF
-if { (eval echo configure:5476: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5489: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   ac_cv_func_alloca_works=yes
 else
@@ -5504,12 +5517,12 @@ EOF
 
 
 echo $ac_n "checking whether alloca needs Cray hooks""... $ac_c" 1>&6
-echo "configure:5508: checking whether alloca needs Cray hooks" >&5
+echo "configure:5521: checking whether alloca needs Cray hooks" >&5
 if eval "test \"`echo '$''{'ac_cv_os_cray'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5513 "configure"
+#line 5526 "configure"
 #include "confdefs.h"
 #if defined(CRAY) && ! defined(CRAY2)
 webecray
@@ -5534,12 +5547,12 @@ echo "$ac_t""$ac_cv_os_cray" 1>&6
 if test $ac_cv_os_cray = yes; then
 for ac_func in _getb67 GETB67 getb67; do
   echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:5538: checking for $ac_func" >&5
+echo "configure:5551: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5543 "configure"
+#line 5556 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -5562,7 +5575,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:5566: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5579: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -5589,7 +5602,7 @@ done
 fi
 
 echo $ac_n "checking stack direction for C alloca""... $ac_c" 1>&6
-echo "configure:5593: checking stack direction for C alloca" >&5
+echo "configure:5606: checking stack direction for C alloca" >&5
 if eval "test \"`echo '$''{'ac_cv_c_stack_direction'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -5597,7 +5610,7 @@ else
   ac_cv_c_stack_direction=0
 else
   cat > conftest.$ac_ext <<EOF
-#line 5601 "configure"
+#line 5614 "configure"
 #include "confdefs.h"
 find_stack_direction ()
 {
@@ -5616,7 +5629,7 @@ main ()
   exit (find_stack_direction() < 0);
 }
 EOF
-if { (eval echo configure:5620: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+if { (eval echo configure:5633: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
 then
   ac_cv_c_stack_direction=1
 else
@@ -5638,21 +5651,21 @@ EOF
 fi
 
 echo $ac_n "checking for inline""... $ac_c" 1>&6
-echo "configure:5642: checking for inline" >&5
+echo "configure:5655: checking for inline" >&5
 if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   ac_cv_c_inline=no
 for ac_kw in inline __inline__ __inline; do
   cat > conftest.$ac_ext <<EOF
-#line 5649 "configure"
+#line 5662 "configure"
 #include "confdefs.h"
 
 int main() {
 } $ac_kw foo() {
 ; return 0; }
 EOF
-if { (eval echo configure:5656: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:5669: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   ac_cv_c_inline=$ac_kw; break
 else
@@ -5682,12 +5695,12 @@ esac
 for ac_func in unlink remove
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:5686: checking for $ac_func" >&5
+echo "configure:5699: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5691 "configure"
+#line 5704 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -5710,7 +5723,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:5714: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5727: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -5739,12 +5752,12 @@ done
 for ac_func in sbrk
 do
 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
-echo "configure:5743: checking for $ac_func" >&5
+echo "configure:5756: checking for $ac_func" >&5
 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5748 "configure"
+#line 5761 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -5767,7 +5780,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:5771: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5784: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_func_$ac_func=yes"
 else
@@ -5802,7 +5815,7 @@ case $host in
   ;;
 *-ncr-sysv4.3*)
   echo $ac_n "checking for _mwvalidcheckl in -lmw""... $ac_c" 1>&6
-echo "configure:5806: checking for _mwvalidcheckl in -lmw" >&5
+echo "configure:5819: checking for _mwvalidcheckl in -lmw" >&5
 ac_lib_var=`echo mw'_'_mwvalidcheckl | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -5810,7 +5823,7 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lmw  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 5814 "configure"
+#line 5827 "configure"
 #include "confdefs.h"
 /* Override any gcc2 internal prototype to avoid an error.  */
 /* We use char because int might match the return type of a gcc2
@@ -5821,7 +5834,7 @@ int main() {
 _mwvalidcheckl()
 ; return 0; }
 EOF
-if { (eval echo configure:5825: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5838: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5842,7 +5855,7 @@ else
 fi
 
   echo $ac_n "checking for main in -lm""... $ac_c" 1>&6
-echo "configure:5846: checking for main in -lm" >&5
+echo "configure:5859: checking for main in -lm" >&5
 ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -5850,14 +5863,14 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lm  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 5854 "configure"
+#line 5867 "configure"
 #include "confdefs.h"
 
 int main() {
 main()
 ; return 0; }
 EOF
-if { (eval echo configure:5861: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5874: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5880,7 +5893,7 @@ fi
   ;;
 *)
   echo $ac_n "checking for main in -lm""... $ac_c" 1>&6
-echo "configure:5884: checking for main in -lm" >&5
+echo "configure:5897: checking for main in -lm" >&5
 ac_lib_var=`echo m'_'main | sed 'y%./+-%__p_%'`
 if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
@@ -5888,14 +5901,14 @@ else
   ac_save_LIBS="$LIBS"
 LIBS="-lm  $LIBS"
 cat > conftest.$ac_ext <<EOF
-#line 5892 "configure"
+#line 5905 "configure"
 #include "confdefs.h"
 
 int main() {
 main()
 ; return 0; }
 EOF
-if { (eval echo configure:5899: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5912: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   eval "ac_cv_lib_$ac_lib_var=yes"
 else
@@ -5926,12 +5939,12 @@ esac
 # enough, but on some of those systems, the assert macro relies on requoting
 # working properly!
 echo $ac_n "checking for working assert macro""... $ac_c" 1>&6
-echo "configure:5930: checking for working assert macro" >&5
+echo "configure:5943: checking for working assert macro" >&5
 if eval "test \"`echo '$''{'gas_cv_assert_ok'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5935 "configure"
+#line 5948 "configure"
 #include "confdefs.h"
 #include <assert.h>
 #include <stdio.h>
@@ -5947,7 +5960,7 @@ assert (a == b
 
 ; return 0; }
 EOF
-if { (eval echo configure:5951: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:5964: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   gas_cv_assert_ok=yes
 else
@@ -5988,12 +6001,12 @@ gas_test_headers="
 "
 
 echo $ac_n "checking whether declaration is required for strstr""... $ac_c" 1>&6
-echo "configure:5992: checking whether declaration is required for strstr" >&5
+echo "configure:6005: checking whether declaration is required for strstr" >&5
 if eval "test \"`echo '$''{'gas_cv_decl_needed_strstr'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 5997 "configure"
+#line 6010 "configure"
 #include "confdefs.h"
 $gas_test_headers
 int main() {
@@ -6004,7 +6017,7 @@ x = (f) strstr;
 
 ; return 0; }
 EOF
-if { (eval echo configure:6008: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6021: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   gas_cv_decl_needed_strstr=no
 else
@@ -6025,12 +6038,12 @@ fi
 
 
 echo $ac_n "checking whether declaration is required for malloc""... $ac_c" 1>&6
-echo "configure:6029: checking whether declaration is required for malloc" >&5
+echo "configure:6042: checking whether declaration is required for malloc" >&5
 if eval "test \"`echo '$''{'gas_cv_decl_needed_malloc'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6034 "configure"
+#line 6047 "configure"
 #include "confdefs.h"
 $gas_test_headers
 int main() {
@@ -6041,7 +6054,7 @@ x = (f) malloc;
 
 ; return 0; }
 EOF
-if { (eval echo configure:6045: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6058: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   gas_cv_decl_needed_malloc=no
 else
@@ -6062,12 +6075,12 @@ fi
 
 
 echo $ac_n "checking whether declaration is required for free""... $ac_c" 1>&6
-echo "configure:6066: checking whether declaration is required for free" >&5
+echo "configure:6079: checking whether declaration is required for free" >&5
 if eval "test \"`echo '$''{'gas_cv_decl_needed_free'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6071 "configure"
+#line 6084 "configure"
 #include "confdefs.h"
 $gas_test_headers
 int main() {
@@ -6078,7 +6091,7 @@ x = (f) free;
 
 ; return 0; }
 EOF
-if { (eval echo configure:6082: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6095: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   gas_cv_decl_needed_free=no
 else
@@ -6099,12 +6112,12 @@ fi
 
 
 echo $ac_n "checking whether declaration is required for sbrk""... $ac_c" 1>&6
-echo "configure:6103: checking whether declaration is required for sbrk" >&5
+echo "configure:6116: checking whether declaration is required for sbrk" >&5
 if eval "test \"`echo '$''{'gas_cv_decl_needed_sbrk'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6108 "configure"
+#line 6121 "configure"
 #include "confdefs.h"
 $gas_test_headers
 int main() {
@@ -6115,7 +6128,7 @@ x = (f) sbrk;
 
 ; return 0; }
 EOF
-if { (eval echo configure:6119: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6132: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   gas_cv_decl_needed_sbrk=no
 else
@@ -6136,12 +6149,12 @@ fi
 
 
 echo $ac_n "checking whether declaration is required for environ""... $ac_c" 1>&6
-echo "configure:6140: checking whether declaration is required for environ" >&5
+echo "configure:6153: checking whether declaration is required for environ" >&5
 if eval "test \"`echo '$''{'gas_cv_decl_needed_environ'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6145 "configure"
+#line 6158 "configure"
 #include "confdefs.h"
 $gas_test_headers
 int main() {
@@ -6152,7 +6165,7 @@ x = (f) environ;
 
 ; return 0; }
 EOF
-if { (eval echo configure:6156: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6169: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   gas_cv_decl_needed_environ=no
 else
@@ -6176,12 +6189,12 @@ fi
 # for it?
 
 echo $ac_n "checking whether declaration is required for errno""... $ac_c" 1>&6
-echo "configure:6180: checking whether declaration is required for errno" >&5
+echo "configure:6193: checking whether declaration is required for errno" >&5
 if eval "test \"`echo '$''{'gas_cv_decl_needed_errno'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 6185 "configure"
+#line 6198 "configure"
 #include "confdefs.h"
 
 #ifdef HAVE_ERRNO_H
@@ -6196,7 +6209,7 @@ x = (f) errno;
 
 ; return 0; }
 EOF
-if { (eval echo configure:6200: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+if { (eval echo configure:6213: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
   rm -rf conftest*
   gas_cv_decl_needed_errno=no
 else
index 01e3e93f337d3c41956a8f1e51ff551470a457d2..e1a078953cf3d1dab3f7a00583e2019350048f41 100644 (file)
@@ -145,6 +145,7 @@ changequote([,])dnl
       rs6000*)         cpu_type=ppc ;;
       s390x*)          cpu_type=s390 arch=s390x ;;
       s390*)           cpu_type=s390 arch=s390 ;;
+      sh64*)            cpu_type=sh64 endian=big;;
       sh*le)           cpu_type=sh endian=little ;;
       sh*)             cpu_type=sh endian=big ;;
       sparclite*)      cpu_type=sparc arch=sparclite ;;
@@ -425,6 +426,7 @@ changequote([,])dnl
       sh-*-rtemself*)       fmt=elf ;;
       sh-*-rtems*)         fmt=coff bfd_gas=yes;;
 
+      sh64-*-elf*)         fmt=elf ;;
       ns32k-pc532-mach* | ns32k-pc532-ux*)    fmt=aout em=pc532mach ;;
       ns32k-pc532-netbsd* | ns32k-pc532-lites*)  fmt=aout em=nbsd532 ;;
       ns32k-pc532-openbsd*) fmt=aout em=nbsd532 ;;
index d8c94e4cfec2b39d79de7cc344de3dc2559d748a..3b2b38365d49e81364ce67f9a3f3bfd779cb6c7e 100644 (file)
@@ -46,6 +46,7 @@ CPU_DOCS = \
        c-pj.texi \
        c-ppc.texi \
        c-sh.texi \
+       c-sh64.texi \
        c-sparc.texi \
         c-tic54x.texi \
        c-vax.texi \
index 456e6906c978584bc13e23dff6e518170538101c..209ae65caf9fd04dd03156e231bd761a81fa2c62 100644 (file)
@@ -1,6 +1,6 @@
-# Makefile.in generated automatically by automake 1.4-p5 from Makefile.am
+# Makefile.in generated automatically by automake 1.4 from Makefile.am
 
-# Copyright (C) 1994, 1995-8, 1999, 2001 Free Software Foundation, Inc.
+# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc.
 # This Makefile.in is free software; the Free Software Foundation
 # gives unlimited permission to copy and/or distribute it,
 # with or without modifications, as long as this notice is preserved.
@@ -157,6 +157,7 @@ CPU_DOCS = \
        c-pj.texi \
        c-ppc.texi \
        c-sh.texi \
+       c-sh64.texi \
        c-sparc.texi \
         c-tic54x.texi \
        c-vax.texi \
@@ -278,7 +279,7 @@ uninstall-info:
        else ii=; fi; \
        list='$(INFO_DEPS)'; \
        for file in $$list; do \
-         test -z "$$ii" \
+         test -z "$ii" \
            || install-info --info-dir=$(DESTDIR)$(infodir) --remove $$file; \
        done
        @$(NORMAL_UNINSTALL)
index 6d04ac44ffe3c3b86836d22d09b97139933b0d77..f2376949545276e6b1b335e9a4c34f4078ab05bb 100644 (file)
@@ -5625,6 +5625,7 @@ subject, see the hardware manufacturer's manual.
 @end ifset
 @ifset SH
 * SH-Dependent::                Hitachi SH Dependent Features
+* SH64-Dependent::              Hitachi SH64 Dependent Features
 @end ifset
 @ifset PDP11
 * PDP-11-Dependent::            PDP-11 Dependent Features
@@ -5772,6 +5773,7 @@ family.
 
 @ifset SH
 @include c-sh.texi
+@include c-sh64.texi
 @end ifset
 
 @ifset SPARC
diff --git a/gas/doc/c-sh64.texi b/gas/doc/c-sh64.texi
new file mode 100644 (file)
index 0000000..02045a8
--- /dev/null
@@ -0,0 +1,207 @@
+@c Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+@c This is part of the GAS manual.
+@c For copying conditions, see the file as.texinfo.
+@page
+@node SH64-Dependent
+@chapter Hitachi SH64 Dependent Features
+
+@cindex SH64 support
+@menu
+* SH64 Options::              Options
+* SH64 Syntax::               Syntax
+* SH64 Directives::           SH64 Machine Directives
+* SH64 Opcodes::              Opcodes
+@end menu
+
+@node SH64 Options
+@section Options
+
+@cindex SH64 options
+@cindex options, SH64
+@table @code
+
+@cindex SH64 ISA options
+@cindex ISA options, SH64
+@item -isa=shmedia | -isa=shcompact
+Specify the default instruction set.  @code{SHmedia} specifies the
+32-bit opcodes, and @code{SHcompact} specifies the 16-bit opcodes
+compatible with previous SH families.  The default depends on the ABI
+selected; the default for the 64-bit ABI is SHmedia, and the default for
+the 32-bit ABI is SHcompact.  If neither the ABI nor the ISA is
+specified, the default is 32-bit SHcompact.
+
+Note that the @code{.mode} pseudo-op is not permitted if the ISA is not
+specified on the command line.
+
+@cindex SH64 ABI options
+@cindex ABI options, SH64
+@item -abi=32 | -abi=64
+Specify the default ABI.  If the ISA is specified and the ABI is not,
+the default ABI depends on the ISA, with SHmedia defaulting to 64-bit
+and SHcompact defaulting to 32-bit.
+
+Note that the @code{.abi} pseudo-op is not permitted if the ABI is not
+specified on the command line.  When the ABI is specified on the command
+line, any @code{.abi} pseudo-ops in the source must match it.
+
+@item -shcompact-const-crange
+Emit code-range descriptors for constants in SHcompact code sections.
+
+@item -no-mix
+Disallow SHmedia code in the same section as constants and SHcompact
+code.
+
+@item -no-expand
+Do not expand MOVI, PT, PTA or PTB instructions.
+
+@item -expand-pt32
+With -abi=64, expand PT, PTA and PTB instructions to 32 bits only.
+
+@end table
+
+@node SH64 Syntax
+@section Syntax
+
+@menu
+* SH64-Chars::                Special Characters
+* SH64-Regs::                 Register Names
+* SH64-Addressing::           Addressing Modes
+@end menu
+
+@node SH64-Chars
+@subsection Special Characters
+
+@cindex line comment character, SH64
+@cindex SH64 line comment character
+@samp{!} is the line comment character.
+
+@cindex line separator, SH64
+@cindex statement separator, SH64
+@cindex SH64 line separator
+You can use @samp{;} instead of a newline to separate statements.
+
+@cindex symbol names, @samp{$} in
+@cindex @code{$} in symbol names
+Since @samp{$} has no special meaning, you may use it in symbol names.
+
+@node SH64-Regs
+@subsection Register Names
+
+@cindex SH64 registers
+@cindex registers, SH64
+You can use the predefined symbols @samp{r0} through @samp{r63} to refer
+to the SH64 general registers, @samp{cr0} through @code{cr63} for
+control registers, @samp{tr0} through @samp{tr7} for target address
+registers, @samp{fr0} through @samp{fr63} for single-precision floating
+point registers, @samp{dr0} through @samp{dr62} (even numbered registers
+only) for double-precision floating point registers, @samp{fv0} through
+@samp{fv60} (multiples of four only) for single-precision floating point
+vectors, @samp{fp0} through @samp{fp62} (even numbered registers only)
+for single-precision floating point pairs, @samp{mtrx0} through
+@samp{mtrx48} (multiples of 16 only) for 4x4 matrices of
+single-precision floating point registers, @samp{pc} for the program
+counter, and @samp{fpscr} for the floating point status and control
+register.
+
+You can also refer to the control registers by the mnemonics @samp{sr},
+@samp{ssr}, @samp{pssr}, @samp{intevt}, @samp{expevt}, @samp{pexpevt},
+@samp{tra}, @samp{spc}, @samp{pspc}, @samp{resvec}, @samp{vbr},
+@samp{tea}, @samp{dcr}, @samp{kcr0}, @samp{kcr1}, @samp{ctc}, and
+@samp{usr}.
+
+@node SH64-Addressing
+@subsection Addressing Modes
+
+@cindex addressing modes, SH64
+@cindex SH64 addressing modes
+
+SH64 operands consist of either a register or immediate value.  The
+immediate value can be a constant or label reference (or portion of a
+label reference), as in this example:
+
+@example
+       movi    4,r2
+       pt      function, tr4
+       movi    (function >> 16) & 65535,r0
+       shori   function & 65535, r0
+       ld.l    r0,4,r0
+@end example
+
+@cindex datalabel, SH64
+Instruction label references can reference labels in either SHmedia or
+SHcompact.  To differentiate between the two, labels in SHmedia sections
+will always have the least significant bit set (i.e. they will be odd),
+which SHcompact labels will have the least significant bit reset
+(i.e. they will be even).  If you need to reference the actual address
+of a label, you can use the @code{datalabel} modifier, as in this
+example:
+
+@example
+       .long   function
+       .long   datalabel function
+@end example
+
+In that example, the first longword may or may not have the least
+significant bit set depending on whether the label is an SHmedia label
+or an SHcompact label.  The second longword will be the actual address
+of the label, regardless of what type of lable it is.
+
+@node SH64 Directives
+@section SH64 Machine Directives
+
+In addition to the SH directives, the SH64 provides the following
+directives:
+
+@cindex SH64 machine directives
+@cindex machine directives, SH64
+
+@table @code
+
+@item .mode [shmedia|shcompact]
+@itemx .isa [shmedia|shcompact]
+Specify the ISA for the following instructions (the two directives are
+equivalent).  Note that programs such as @code{objdump} rely on symbolic
+labels to determine when such mode switches occur (by checking the least
+significant bit of the label's address), so such mode/isa changes should
+always be followed by a label (in practice, this is true anyway).  Note
+that you cannot use these directives if you didn't specify an ISA on the
+command line.
+
+@item .abi [32|64]
+Specify the ABI for the following instructions.  Note that you cannot use
+this directive unless you specified an ABI on the command line, and the 
+ABIs specified must match.
+
+@item .uaquad
+Like .uaword and .ualong, this allows you to specify an intenionally
+unaligned quadword (64 bit word).
+
+@end table
+
+@node SH64 Opcodes
+@section Opcodes
+
+@cindex SH64 opcode summary
+@cindex opcode summary, SH64
+@cindex mnemonics, SH64
+@cindex instruction summary, SH64
+For detailed information on the SH64 machine instruction set, see
+@cite{SuperH 64 bit RISC Series Architecture Manual} (SuperH, Inc.).
+
+@code{@value{AS}} implements all the standard SH64 opcodes.  In
+addition, the following pseudo-opcodes may be expanded into one or more
+alternate opcodes:
+
+@table @code
+
+@item movi
+If the value doesn't fit into a standard @code{movi} opcode,
+@code{@value{AS}} will replace the @code{movi} with a sequence of
+@code{movi} and @code{shori} opcodes.
+
+@item pt
+This expands to a sequence of @code{movi} and @code{shori} opcode,
+followed by a @code{ptrel} opcode, or to a @code{pta} or @code{ptb}
+opcode, depending on the label referenced.
+
+@end table
index 0fb4fcdf82a5378c138bccdaed1c4f097805fa49..9003f27d7127ea1b948ef3914bddd7fc1dbac9f0 100644 (file)
@@ -108,6 +108,8 @@ config/tc-s390.c
 config/tc-s390.h
 config/tc-sh.c
 config/tc-sh.h
+config/tc-sh64.c
+config/tc-sh64.h
 config/tc-sparc.c
 config/tc-sparc.h
 config/tc-tahoe.c
index 3a0fd05a7e83c50d37bd422228ff4b040f60ed84..cf361859cced8494f9a02b8558fc31bd820d6afb 100644 (file)
@@ -6,7 +6,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2002-01-31 17:13+0000\n"
+"POT-Creation-Date: 2002-02-08 04:20-0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -690,7 +690,7 @@ msgstr ""
 msgid "common alignment not a power of 2"
 msgstr ""
 
-#: config/obj-elf.c:438 config/tc-sparc.c:3832 config/tc-v850.c:565
+#: config/obj-elf.c:438 config/tc-sparc.c:3832 config/tc-v850.c:450
 #, c-format
 msgid "bad .common segment %s"
 msgstr ""
@@ -1017,11 +1017,11 @@ msgstr ""
 
 #: config/tc-a29k.c:375 config/tc-avr.c:1131 config/tc-d10v.c:540
 #: config/tc-d30v.c:552 config/tc-h8300.c:313 config/tc-h8500.c:284
-#: config/tc-mcore.c:655 config/tc-mmix.c:468 config/tc-mn10200.c:940
+#: config/tc-mcore.c:655 config/tc-mmix.c:475 config/tc-mn10200.c:940
 #: config/tc-mn10300.c:1311 config/tc-or32.c:336 config/tc-or32.c:392
-#: config/tc-ppc.c:2106 config/tc-s390.c:1054 config/tc-sh.c:870
-#: config/tc-tic80.c:283 config/tc-v850.c:2073 config/tc-w65.c:241
-#: config/tc-z8k.c:343
+#: config/tc-ppc.c:2106 config/tc-s390.c:1054 config/tc-sh.c:1287
+#: config/tc-sh64.c:2228 config/tc-tic80.c:283 config/tc-v850.c:1984
+#: config/tc-w65.c:241 config/tc-z8k.c:343
 msgid "missing operand"
 msgstr ""
 
@@ -1213,8 +1213,8 @@ msgstr ""
 #: config/tc-alpha.c:2338 config/tc-alpha.c:2362 config/tc-d10v.c:629
 #: config/tc-d30v.c:640 config/tc-mn10200.c:995 config/tc-mn10300.c:1382
 #: config/tc-ppc.c:2072 config/tc-ppc.c:2256 config/tc-ppc.c:2268
-#: config/tc-s390.c:1064 config/tc-s390.c:1121 config/tc-v850.c:1853
-#: config/tc-v850.c:1876 config/tc-v850.c:2096
+#: config/tc-s390.c:1064 config/tc-s390.c:1121 config/tc-v850.c:1764
+#: config/tc-v850.c:1787 config/tc-v850.c:2007
 msgid "too many fixups"
 msgstr ""
 
@@ -1295,7 +1295,7 @@ msgstr ""
 msgid ".COMMon length (%ld.) <0! Ignored."
 msgstr ""
 
-#: config/tc-alpha.c:4071 config/tc-sparc.c:3700 config/tc-v850.c:283
+#: config/tc-alpha.c:4071 config/tc-sparc.c:3700 config/tc-v850.c:254
 msgid "Ignoring attempt to re-define symbol"
 msgstr ""
 
@@ -1730,7 +1730,7 @@ msgid "invalid immediate shift"
 msgstr ""
 
 #: config/tc-arm.c:4777 config/tc-arm.c:5194 config/tc-arm.c:5529
-#: config/tc-arm.c:6138 config/tc-v850.c:1956 config/tc-v850.c:1977
+#: config/tc-arm.c:6138 config/tc-v850.c:1867 config/tc-v850.c:1888
 msgid "constant expression expected"
 msgstr ""
 
@@ -1810,7 +1810,7 @@ msgstr ""
 #: config/tc-avr.c:860 config/tc-cris.c:3006 config/tc-d10v.c:1563
 #: config/tc-d30v.c:1863 config/tc-mips.c:3641 config/tc-mips.c:4630
 #: config/tc-mips.c:5486 config/tc-mips.c:6091 config/tc-ppc.c:5143
-#: config/tc-v850.c:2376 config/tc-xstormy16.c:479
+#: config/tc-v850.c:2287 config/tc-xstormy16.c:479
 msgid "expression too complex"
 msgstr ""
 
@@ -1948,7 +1948,7 @@ msgstr ""
 msgid "offset expected"
 msgstr ""
 
-#: config/tc-arm.c:8463 config/tc-pj.c:528 config/tc-sh.c:3021
+#: config/tc-arm.c:8463 config/tc-pj.c:528 config/tc-sh.c:3573
 msgid "offset out of range"
 msgstr ""
 
@@ -2127,7 +2127,7 @@ msgid "internal_relocation (type %d) not fixed up (OFFSET_IMM)"
 msgstr ""
 
 #: config/tc-arm.c:10302 config/tc-cris.c:2940 config/tc-mcore.c:2104
-#: config/tc-mmix.c:2840 config/tc-ns32k.c:2350
+#: config/tc-mmix.c:2868 config/tc-ns32k.c:2350
 msgid "<unknown>"
 msgstr ""
 
@@ -2539,9 +2539,9 @@ msgid "redefinition of mcu type `%s' to `%s'"
 msgstr ""
 
 #: config/tc-avr.c:384 config/tc-d10v.c:314 config/tc-d30v.c:366
-#: config/tc-mips.c:9586 config/tc-mmix.c:2233 config/tc-mn10200.c:361
-#: config/tc-pj.c:357 config/tc-ppc.c:4803 config/tc-sh.c:2079
-#: config/tc-v850.c:1292
+#: config/tc-mips.c:9586 config/tc-mmix.c:2249 config/tc-mn10200.c:361
+#: config/tc-pj.c:357 config/tc-ppc.c:4803 config/tc-sh.c:2518
+#: config/tc-v850.c:1194
 msgid "bad call to md_atof"
 msgstr ""
 
@@ -2636,14 +2636,14 @@ msgstr ""
 
 #: config/tc-avr.c:1067 config/tc-d10v.c:1498 config/tc-d30v.c:1807
 #: config/tc-mn10200.c:1240 config/tc-mn10300.c:1774 config/tc-or32.c:1622
-#: config/tc-ppc.c:5534 config/tc-v850.c:2296
+#: config/tc-ppc.c:5534 config/tc-v850.c:2207
 #, c-format
 msgid "reloc %d not supported by object file format"
 msgstr ""
 
 #: config/tc-avr.c:1091 config/tc-d10v.c:1100 config/tc-d10v.c:1114
 #: config/tc-h8300.c:1283 config/tc-h8500.c:1088 config/tc-mcore.c:988
-#: config/tc-pj.c:266 config/tc-sh.c:1677 config/tc-z8k.c:1192
+#: config/tc-pj.c:266 config/tc-sh.c:2096 config/tc-z8k.c:1192
 msgid "can't find opcode "
 msgstr ""
 
@@ -2892,7 +2892,7 @@ msgstr ""
 
 #: config/tc-d10v.c:538 config/tc-d30v.c:550 config/tc-mn10200.c:937
 #: config/tc-mn10300.c:1308 config/tc-ppc.c:2104 config/tc-s390.c:1052
-#: config/tc-tic80.c:279 config/tc-v850.c:2070
+#: config/tc-tic80.c:279 config/tc-v850.c:1981
 msgid "illegal operand"
 msgstr ""
 
@@ -3219,14 +3219,15 @@ msgstr ""
 
 #. This seems more sane than saying "too many operands".  We'll
 #. get here only if the trailing trash starts with a comma.
-#: config/tc-h8300.c:1243 config/tc-mmix.c:452 config/tc-mmix.c:464
-#: config/tc-mmix.c:2485 config/tc-mmix.c:2509 config/tc-mmix.c:2774
+#: config/tc-h8300.c:1243 config/tc-mmix.c:459 config/tc-mmix.c:471
+#: config/tc-mmix.c:2501 config/tc-mmix.c:2525 config/tc-mmix.c:2802
 #: config/tc-or32.c:642 config/tc-or32.c:856
 msgid "invalid operands"
 msgstr ""
 
 #: config/tc-h8300.c:1294 config/tc-h8500.c:1094 config/tc-mips.c:8649
-#: config/tc-sh.c:1914 config/tc-w65.c:733 config/tc-z8k.c:1202
+#: config/tc-sh.c:2353 config/tc-sh64.c:2811 config/tc-w65.c:733
+#: config/tc-z8k.c:1202
 msgid "unknown opcode"
 msgstr ""
 
@@ -3234,12 +3235,12 @@ msgstr ""
 msgid "mismatch between opcode size and operand size"
 msgstr ""
 
-#: config/tc-h8300.c:1352 config/tc-h8500.c:1121 config/tc-sh.c:2034
+#: config/tc-h8300.c:1352 config/tc-h8500.c:1121 config/tc-sh.c:2473
 #: config/tc-w65.c:763 config/tc-z8k.c:1255
 msgid "call to tc_crawl_symbol_chain \n"
 msgstr ""
 
-#: config/tc-h8300.c:1368 config/tc-h8500.c:1135 config/tc-sh.c:2041
+#: config/tc-h8300.c:1368 config/tc-h8500.c:1135 config/tc-sh.c:2480
 #: config/tc-w65.c:777 config/tc-z8k.c:1269
 msgid "call to tc_headers_hook \n"
 msgstr ""
@@ -3257,7 +3258,7 @@ msgid "call tomd_estimate_size_before_relax \n"
 msgstr ""
 
 #: config/tc-h8300.c:1657 config/tc-mcore.c:2413 config/tc-pj.c:572
-#: config/tc-sh.c:3365
+#: config/tc-sh.c:3931
 #, c-format
 msgid "Cannot represent relocation type %s"
 msgstr ""
@@ -3290,7 +3291,7 @@ msgstr ""
 msgid "@Rn needs word register"
 msgstr ""
 
-#: config/tc-h8500.c:828 config/tc-sh.c:1410
+#: config/tc-h8500.c:828 config/tc-sh.c:1827
 #, c-format
 msgid "unhandled %d\n"
 msgstr ""
@@ -3300,12 +3301,12 @@ msgstr ""
 msgid "operand must be absolute in range %d..%d"
 msgstr ""
 
-#: config/tc-h8500.c:945 config/tc-sh.c:1617
+#: config/tc-h8500.c:945 config/tc-sh.c:2036
 #, c-format
 msgid "failed for %d\n"
 msgstr ""
 
-#: config/tc-h8500.c:1110 config/tc-sh.c:1718 config/tc-sh.c:1963
+#: config/tc-h8500.c:1110 config/tc-sh.c:2137 config/tc-sh.c:2402
 #: config/tc-w65.c:752
 msgid "invalid operands for opcode"
 msgstr ""
@@ -4691,7 +4692,7 @@ msgstr ""
 msgid "ignoring bad alignment"
 msgstr ""
 
-#: config/tc-m32r.c:1288 config/tc-ppc.c:1630 config/tc-v850.c:383
+#: config/tc-m32r.c:1288 config/tc-ppc.c:1630 config/tc-v850.c:333
 msgid "Common alignment not a power of 2"
 msgstr ""
 
@@ -5093,7 +5094,7 @@ msgid "operands mismatch"
 msgstr ""
 
 #: config/tc-m68k.c:1949 config/tc-m68k.c:1955 config/tc-m68k.c:1961
-#: config/tc-mmix.c:2448 config/tc-mmix.c:2472
+#: config/tc-mmix.c:2464 config/tc-mmix.c:2488
 msgid "operand out of range"
 msgstr ""
 
@@ -6277,7 +6278,7 @@ msgstr ""
 msgid "Double check fx_r_type in tc-mips.c:tc_gen_reloc"
 msgstr ""
 
-#: config/tc-mips.c:12472 config/tc-sh.c:3209
+#: config/tc-mips.c:12472 config/tc-sh.c:3771
 #, c-format
 msgid "Can not represent %s relocation in this object file format"
 msgstr ""
@@ -6339,231 +6340,239 @@ msgstr ""
 msgid "Bad .mask/.fmask directive"
 msgstr ""
 
-#: config/tc-mmix.c:669
+#: config/tc-mmix.c:681
 msgid " MMIX-specific command line options:\n"
 msgstr ""
 
-#: config/tc-mmix.c:670
+#: config/tc-mmix.c:682
 msgid ""
 "  -fixed-special-register-names\n"
 "                          Allow only the original special register names.\n"
 msgstr ""
 
-#: config/tc-mmix.c:673
+#: config/tc-mmix.c:685
 msgid "  -globalize-symbols      Make all symbols global.\n"
 msgstr ""
 
-#: config/tc-mmix.c:675
+#: config/tc-mmix.c:687
 msgid "  -gnu-syntax             Turn off mmixal syntax compatibility.\n"
 msgstr ""
 
-#: config/tc-mmix.c:677
+#: config/tc-mmix.c:689
 msgid "  -relax                  Create linker relaxable code.\n"
 msgstr ""
 
-#: config/tc-mmix.c:679
+#: config/tc-mmix.c:691
 msgid ""
 "  -no-predefined-syms     Do not provide mmixal built-in constants.\n"
 "                          Implies -fixed-special-register-names.\n"
 msgstr ""
 
-#: config/tc-mmix.c:682
+#: config/tc-mmix.c:694
 msgid ""
 "  -no-expand              Do not expand GETA, branches, PUSHJ or JUMP\n"
 "                          into multiple instructions.\n"
 msgstr ""
 
-#: config/tc-mmix.c:685
+#: config/tc-mmix.c:697
 msgid ""
 "  -no-merge-gregs         Do not merge GREG definitions with nearby values.\n"
 msgstr ""
 
-#: config/tc-mmix.c:687
+#: config/tc-mmix.c:699
+msgid ""
+"  -linker-allocated-gregs If there's no suitable GREG definition for "
+"the                          operands of an instruction, let the linker "
+"resolve.\n"
+msgstr ""
+
+#: config/tc-mmix.c:702
 msgid ""
 "  -x                      Do not warn when an operand to GETA, a branch,\n"
 "                          PUSHJ or JUMP is not known to be within range.\n"
-"                          The linker will catch any errors.\n"
+"                          The linker will catch any errors.  Implies\n"
+"                          -linker-allocated-gregs."
 msgstr ""
 
-#: config/tc-mmix.c:813
+#: config/tc-mmix.c:829
 #, c-format
 msgid "unknown opcode: `%s'"
 msgstr ""
 
-#: config/tc-mmix.c:935 config/tc-mmix.c:950
+#: config/tc-mmix.c:951 config/tc-mmix.c:966
 msgid "specified location wasn't TETRA-aligned"
 msgstr ""
 
-#: config/tc-mmix.c:937 config/tc-mmix.c:952 config/tc-mmix.c:4055
-#: config/tc-mmix.c:4071
+#: config/tc-mmix.c:953 config/tc-mmix.c:968 config/tc-mmix.c:4085
+#: config/tc-mmix.c:4101
 msgid "unaligned data at an absolute location is not supported"
 msgstr ""
 
-#: config/tc-mmix.c:1062
+#: config/tc-mmix.c:1078
 #, c-format
 msgid "invalid operand to opcode %s: `%s'"
 msgstr ""
 
-#: config/tc-mmix.c:1084 config/tc-mmix.c:1111 config/tc-mmix.c:1144
-#: config/tc-mmix.c:1152 config/tc-mmix.c:1169 config/tc-mmix.c:1197
-#: config/tc-mmix.c:1218 config/tc-mmix.c:1243 config/tc-mmix.c:1291
-#: config/tc-mmix.c:1389 config/tc-mmix.c:1414 config/tc-mmix.c:1446
-#: config/tc-mmix.c:1478 config/tc-mmix.c:1508 config/tc-mmix.c:1561
-#: config/tc-mmix.c:1578 config/tc-mmix.c:1605 config/tc-mmix.c:1633
-#: config/tc-mmix.c:1660 config/tc-mmix.c:1686 config/tc-mmix.c:1702
-#: config/tc-mmix.c:1728 config/tc-mmix.c:1744 config/tc-mmix.c:1760
-#: config/tc-mmix.c:1823 config/tc-mmix.c:1839
+#: config/tc-mmix.c:1100 config/tc-mmix.c:1127 config/tc-mmix.c:1160
+#: config/tc-mmix.c:1168 config/tc-mmix.c:1185 config/tc-mmix.c:1213
+#: config/tc-mmix.c:1234 config/tc-mmix.c:1259 config/tc-mmix.c:1307
+#: config/tc-mmix.c:1405 config/tc-mmix.c:1430 config/tc-mmix.c:1462
+#: config/tc-mmix.c:1494 config/tc-mmix.c:1524 config/tc-mmix.c:1577
+#: config/tc-mmix.c:1594 config/tc-mmix.c:1621 config/tc-mmix.c:1649
+#: config/tc-mmix.c:1676 config/tc-mmix.c:1702 config/tc-mmix.c:1718
+#: config/tc-mmix.c:1744 config/tc-mmix.c:1760 config/tc-mmix.c:1776
+#: config/tc-mmix.c:1839 config/tc-mmix.c:1855
 #, c-format
 msgid "invalid operands to opcode %s: `%s'"
 msgstr ""
 
-#: config/tc-mmix.c:1816
+#: config/tc-mmix.c:1832
 #, c-format
 msgid "unsupported operands to %s: `%s'"
 msgstr ""
 
-#: config/tc-mmix.c:1944
+#: config/tc-mmix.c:1960
 msgid "internal: mmix_prefix_name but empty prefix"
 msgstr ""
 
-#: config/tc-mmix.c:1989
+#: config/tc-mmix.c:2005
 #, c-format
 msgid "too many GREG registers allocated (max %d)"
 msgstr ""
 
-#: config/tc-mmix.c:2049
+#: config/tc-mmix.c:2065
 msgid "BSPEC already active.  Nesting is not supported."
 msgstr ""
 
-#: config/tc-mmix.c:2058
+#: config/tc-mmix.c:2074
 msgid "invalid BSPEC expression"
 msgstr ""
 
-#: config/tc-mmix.c:2074
+#: config/tc-mmix.c:2090
 #, c-format
 msgid "can't create section %s"
 msgstr ""
 
-#: config/tc-mmix.c:2079
+#: config/tc-mmix.c:2095
 #, c-format
 msgid "can't set section flags for section %s"
 msgstr ""
 
-#: config/tc-mmix.c:2101
+#: config/tc-mmix.c:2117
 msgid "ESPEC without preceding BSPEC"
 msgstr ""
 
-#: config/tc-mmix.c:2131
+#: config/tc-mmix.c:2147
 msgid "missing local expression"
 msgstr ""
 
-#: config/tc-mmix.c:2346
+#: config/tc-mmix.c:2362
 msgid "operand out of range, instruction expanded"
 msgstr ""
 
 #. The BFD_RELOC_MMIX_LOCAL-specific message is supposed to be
 #. user-friendly, though a little bit non-substantial.
-#: config/tc-mmix.c:2598
+#: config/tc-mmix.c:2620
 msgid "directive LOCAL must be placed in code or data"
 msgstr ""
 
-#: config/tc-mmix.c:2599
+#: config/tc-mmix.c:2621
 msgid "internal confusion: relocation in a section without contents"
 msgstr ""
 
-#: config/tc-mmix.c:2714
+#: config/tc-mmix.c:2734
 msgid "internal: BFD_RELOC_MMIX_BASE_PLUS_OFFSET not resolved to section"
 msgstr ""
 
-#: config/tc-mmix.c:2754
+#: config/tc-mmix.c:2782
 msgid "no suitable GREG definition for operands"
 msgstr ""
 
-#: config/tc-mmix.c:2813
+#: config/tc-mmix.c:2841
 msgid "operands were not reducible at assembly-time"
 msgstr ""
 
-#: config/tc-mmix.c:2841
+#: config/tc-mmix.c:2869
 #, c-format
 msgid "cannot generate relocation type for symbol %s, code %s"
 msgstr ""
 
-#: config/tc-mmix.c:2861
+#: config/tc-mmix.c:2889
 #, c-format
 msgid "internal: unhandled label %s"
 msgstr ""
 
-#: config/tc-mmix.c:2915
+#: config/tc-mmix.c:2943
 msgid "[0-9]H labels may not appear alone on a line"
 msgstr ""
 
-#: config/tc-mmix.c:2924
+#: config/tc-mmix.c:2952
 msgid "[0-9]H labels do not mix with dot-pseudos"
 msgstr ""
 
-#: config/tc-mmix.c:2988
+#: config/tc-mmix.c:3016
 msgid "invalid characters in input"
 msgstr ""
 
-#: config/tc-mmix.c:3092
+#: config/tc-mmix.c:3120
 msgid "empty label field for IS"
 msgstr ""
 
-#: config/tc-mmix.c:3342
+#: config/tc-mmix.c:3370
 #, c-format
 msgid "internal: unexpected relax type %d:%d"
 msgstr ""
 
-#: config/tc-mmix.c:3364
+#: config/tc-mmix.c:3392
 msgid "BSPEC without ESPEC."
 msgstr ""
 
-#: config/tc-mmix.c:3566
+#: config/tc-mmix.c:3594
 msgid "GREG expression too complicated"
 msgstr ""
 
-#: config/tc-mmix.c:3579
+#: config/tc-mmix.c:3609
 msgid "internal: GREG expression not resolved to section"
 msgstr ""
 
-#: config/tc-mmix.c:3630
+#: config/tc-mmix.c:3660
 msgid "register section has contents\n"
 msgstr ""
 
-#: config/tc-mmix.c:3808
+#: config/tc-mmix.c:3838
 msgid "section change from within a BSPEC/ESPEC pair is not supported"
 msgstr ""
 
-#: config/tc-mmix.c:3830
+#: config/tc-mmix.c:3860
 msgid "directive LOC from within a BSPEC/ESPEC pair is not supported"
 msgstr ""
 
-#: config/tc-mmix.c:3841
+#: config/tc-mmix.c:3871
 msgid "invalid LOC expression"
 msgstr ""
 
-#: config/tc-mmix.c:3866 config/tc-mmix.c:3892
+#: config/tc-mmix.c:3896 config/tc-mmix.c:3922
 msgid "LOC expression stepping backwards is not supported"
 msgstr ""
 
 #. We will only get here in rare cases involving #NO_APP,
 #. where the unterminated string is not recognized by the
 #. preformatting pass.
-#: config/tc-mmix.c:3976 config/tc-mmix.c:4137
+#: config/tc-mmix.c:4006 config/tc-mmix.c:4167
 msgid "unterminated string"
 msgstr ""
 
-#: config/tc-mmix.c:3993
+#: config/tc-mmix.c:4023
 msgid "BYTE expression not a pure number"
 msgstr ""
 
 #. Note that mmixal does not allow negative numbers in
 #. BYTE sequences, so neither should we.
-#: config/tc-mmix.c:4002
+#: config/tc-mmix.c:4032
 msgid "BYTE expression not in the range 0..255"
 msgstr ""
 
-#: config/tc-mmix.c:4053 config/tc-mmix.c:4069
+#: config/tc-mmix.c:4083 config/tc-mmix.c:4099
 msgid "data item with alignment larger than location"
 msgstr ""
 
@@ -6580,19 +6589,19 @@ msgid ""
 msgstr ""
 
 #: config/tc-mn10200.c:793 config/tc-mn10300.c:929 config/tc-ppc.c:1867
-#: config/tc-s390.c:1290 config/tc-v850.c:1725
+#: config/tc-s390.c:1290 config/tc-v850.c:1636
 #, c-format
 msgid "Unrecognized opcode: `%s'"
 msgstr ""
 
 #: config/tc-mn10200.c:1036 config/tc-mn10300.c:1452 config/tc-ppc.c:2305
-#: config/tc-s390.c:1216 config/tc-v850.c:2149
+#: config/tc-s390.c:1216 config/tc-v850.c:2060
 #, c-format
 msgid "junk at end of line: `%s'"
 msgstr ""
 
 #: config/tc-mn10200.c:1349 config/tc-mn10300.c:2076 config/tc-ppc.c:1299
-#: config/tc-v850.c:1654
+#: config/tc-v850.c:1565
 #, c-format
 msgid "operand out of range (%s not between %ld and %ld)"
 msgstr ""
@@ -6844,8 +6853,8 @@ msgid ""
 "-big\t\t\tgenerate big endian code\n"
 msgstr ""
 
-#: config/tc-pj.c:460 config/tc-sh.c:2910 config/tc-sh.c:2917
-#: config/tc-sh.c:2924 config/tc-sh.c:2931
+#: config/tc-pj.c:460 config/tc-sh.c:3454 config/tc-sh.c:3461
+#: config/tc-sh.c:3468 config/tc-sh.c:3475
 msgid "pcrel too far"
 msgstr ""
 
@@ -7079,7 +7088,7 @@ msgstr ""
 msgid "symbol in .toc does not match any .tc"
 msgstr ""
 
-#: config/tc-ppc.c:5246 config/tc-s390.c:1797 config/tc-v850.c:2420
+#: config/tc-ppc.c:5246 config/tc-s390.c:1797 config/tc-v850.c:2331
 #: config/tc-xstormy16.c:536
 msgid "unresolved expression that must be resolved"
 msgstr ""
@@ -7211,122 +7220,146 @@ msgstr ""
 msgid "directive .little encountered when option -little required"
 msgstr ""
 
-#: config/tc-sh.c:383
+#: config/tc-sh.c:780
 msgid "Invalid PIC expression."
 msgstr ""
 
-#: config/tc-sh.c:406 read.c:3749
+#: config/tc-sh.c:809 read.c:3749
 #, c-format
 msgid "unsupported BFD relocation size %u"
 msgstr ""
 
-#: config/tc-sh.c:875
+#: config/tc-sh.c:1292
 msgid "misplaced PIC operand"
 msgstr ""
 
-#: config/tc-sh.c:916
+#: config/tc-sh.c:1333
 msgid "illegal register after @-"
 msgstr ""
 
-#: config/tc-sh.c:932
+#: config/tc-sh.c:1349
 msgid "must be @(r0,...)"
 msgstr ""
 
-#: config/tc-sh.c:956
+#: config/tc-sh.c:1373
 msgid "syntax error in @(r0,...)"
 msgstr ""
 
-#: config/tc-sh.c:961
+#: config/tc-sh.c:1378
 msgid "syntax error in @(r0...)"
 msgstr ""
 
-#: config/tc-sh.c:994 config/tc-sh.c:999
+#: config/tc-sh.c:1408 config/tc-sh.c:1413
 msgid "syntax error in @(disp,[Rn, gbr, pc])"
 msgstr ""
 
-#: config/tc-sh.c:1004
+#: config/tc-sh.c:1418
 msgid "expecting )"
 msgstr ""
 
-#: config/tc-sh.c:1012
+#: config/tc-sh.c:1426
 msgid "illegal register after @"
 msgstr ""
 
-#: config/tc-sh.c:1560
+#: config/tc-sh.c:1977
 #, c-format
 msgid "Invalid register: 'r%d'"
 msgstr ""
 
-#: config/tc-sh.c:1723
+#: config/tc-sh.c:2142
 msgid "insn can't be combined with parallel processing insn"
 msgstr ""
 
-#: config/tc-sh.c:1730 config/tc-sh.c:1741
+#: config/tc-sh.c:2149 config/tc-sh.c:2160
 msgid "multiple movx specifications"
 msgstr ""
 
-#: config/tc-sh.c:1735 config/tc-sh.c:1762
+#: config/tc-sh.c:2154 config/tc-sh.c:2181
 msgid "multiple movy specifications"
 msgstr ""
 
-#: config/tc-sh.c:1743
+#: config/tc-sh.c:2162
 msgid "invalid movx address register"
 msgstr ""
 
-#: config/tc-sh.c:1749 config/tc-sh.c:1754
+#: config/tc-sh.c:2168 config/tc-sh.c:2173
 msgid "invalid movx dsp register"
 msgstr ""
 
-#: config/tc-sh.c:1771 config/tc-sh.c:1776
+#: config/tc-sh.c:2190 config/tc-sh.c:2195
 msgid "invalid movy dsp register"
 msgstr ""
 
-#: config/tc-sh.c:1780
+#: config/tc-sh.c:2199
 msgid "invalid movy address register"
 msgstr ""
 
-#: config/tc-sh.c:1786
+#: config/tc-sh.c:2205
 msgid "dsp immediate shift value not constant"
 msgstr ""
 
-#: config/tc-sh.c:1793 config/tc-sh.c:1806
+#: config/tc-sh.c:2212 config/tc-sh.c:2225
 msgid "multiple parallel processing specifications"
 msgstr ""
 
-#: config/tc-sh.c:1799
+#: config/tc-sh.c:2218
 msgid "multiple condition specifications"
 msgstr ""
 
-#: config/tc-sh.c:1815
+#: config/tc-sh.c:2234
 msgid "insn cannot be combined with pmuls"
 msgstr ""
 
-#: config/tc-sh.c:1832
+#: config/tc-sh.c:2251
 msgid "bad padd / psub pmuls output operand"
 msgstr ""
 
-#: config/tc-sh.c:1842
+#: config/tc-sh.c:2261
 msgid "condition not followed by conditionalizable insn"
 msgstr ""
 
-#: config/tc-sh.c:1852
+#: config/tc-sh.c:2271
 msgid "unrecognized characters at end of parallel processing insn"
 msgstr ""
 
-#: config/tc-sh.c:1968
+#: config/tc-sh.c:2407
 #, c-format
 msgid "excess operands: '%s'"
 msgstr ""
 
-#: config/tc-sh.c:2120
+#: config/tc-sh.c:2559
 msgid ".uses pseudo-op seen when not relaxing"
 msgstr ""
 
-#: config/tc-sh.c:2126
+#: config/tc-sh.c:2565
 msgid "bad .uses format"
 msgstr ""
 
-#: config/tc-sh.c:2192
+#: config/tc-sh.c:2640
+msgid "Invalid combination: --isa=SHcompact with --isa=SHmedia"
+msgstr ""
+
+#: config/tc-sh.c:2646
+msgid "Invalid combination: --isa=SHmedia with --isa=SHcompact"
+msgstr ""
+
+#: config/tc-sh.c:2648
+msgid "Invalid combination: --abi=64 with --isa=SHcompact"
+msgstr ""
+
+#: config/tc-sh.c:2659
+msgid "Invalid combination: --abi=32 with --abi=64"
+msgstr ""
+
+#: config/tc-sh.c:2665
+msgid "Invalid combination: --abi=64 with --abi=32"
+msgstr ""
+
+#: config/tc-sh.c:2667
+msgid "Invalid combination: --isa=SHcompact with --abi=64"
+msgstr ""
+
+#: config/tc-sh.c:2702
 msgid ""
 "SH options:\n"
 "-little\t\t\tgenerate little endian code\n"
@@ -7336,60 +7369,259 @@ msgid ""
 "-dsp\t\t\tenable sh-dsp insns, and disable sh3e / sh4 insns.\n"
 msgstr ""
 
-#: config/tc-sh.c:2281
+#: config/tc-sh.c:2710
+msgid ""
+"-isa=[shmedia\t\tset default instruction set for SH64\n"
+"      | SHmedia\n"
+"      | shcompact\n"
+"      | SHcompact]\n"
+"-abi=[32|64]\t\tset size of expanded SHmedia operands and object\n"
+"\t\t\tfile type\n"
+"-shcompact-const-crange\temit code-range descriptors for constants in\n"
+"\t\t\tSHcompact code sections\n"
+"-no-mix\t\t\tdisallow SHmedia code in the same section as\n"
+"\t\t\tconstants and SHcompact code\n"
+"-no-expand\t\tdo not expand MOVI, PT, PTA or PTB instructions\n"
+"-expand-pt32\t\twith -abi=64, expand PT, PTA and PTB instructions\n"
+"\t\t\tto 32 bits only"
+msgstr ""
+
+#: config/tc-sh.c:2807
 msgid ".uses does not refer to a local symbol in the same section"
 msgstr ""
 
-#: config/tc-sh.c:2300
+#: config/tc-sh.c:2826
 msgid "can't find fixup pointed to by .uses"
 msgstr ""
 
-#: config/tc-sh.c:2323
+#: config/tc-sh.c:2849
 msgid ".uses target does not refer to a local symbol in the same section"
 msgstr ""
 
-#: config/tc-sh.c:2421
+#: config/tc-sh.c:2951
 msgid "displacement overflows 12-bit field"
 msgstr ""
 
-#: config/tc-sh.c:2424
+#: config/tc-sh.c:2954
 #, c-format
 msgid "displacement to defined symbol %s overflows 12-bit field"
 msgstr ""
 
-#: config/tc-sh.c:2428
+#: config/tc-sh.c:2958
 #, c-format
 msgid "displacement to undefined symbol %s overflows 12-bit field"
 msgstr ""
 
-#: config/tc-sh.c:2506
+#: config/tc-sh.c:3036
 msgid "displacement overflows 8-bit field"
 msgstr ""
 
-#: config/tc-sh.c:2509
+#: config/tc-sh.c:3039
 #, c-format
 msgid "displacement to defined symbol %s overflows 8-bit field"
 msgstr ""
 
-#: config/tc-sh.c:2513
+#: config/tc-sh.c:3043
 #, c-format
 msgid "displacement to undefined symbol %s overflows 8-bit field "
 msgstr ""
 
-#: config/tc-sh.c:2526
+#: config/tc-sh.c:3060
 #, c-format
 msgid "overflow in branch to %s; converted into longer instruction sequence"
 msgstr ""
 
-#: config/tc-sh.c:2601 config/tc-sh.c:2649 config/tc-sparc.c:4093
+#: config/tc-sh.c:3135 config/tc-sh.c:3183 config/tc-sparc.c:4093
 #: config/tc-sparc.c:4118
 msgid "misaligned data"
 msgstr ""
 
-#: config/tc-sh.c:3013
+#: config/tc-sh.c:3565
 msgid "misaligned offset"
 msgstr ""
 
+#: config/tc-sh64.c:570
+msgid "This operand must be constant at assembly time"
+msgstr ""
+
+#: config/tc-sh64.c:685
+msgid "Invalid operand expression"
+msgstr ""
+
+#: config/tc-sh64.c:772 config/tc-sh64.c:878
+msgid "PTB operand is a SHmedia symbol"
+msgstr ""
+
+#: config/tc-sh64.c:775 config/tc-sh64.c:875
+msgid "PTA operand is a SHcompact symbol"
+msgstr ""
+
+#: config/tc-sh64.c:791
+msgid "invalid expression in operand"
+msgstr ""
+
+#: config/tc-sh64.c:1488
+#, c-format
+msgid "invalid operand, not a 5-bit unsigned value: %d"
+msgstr ""
+
+#: config/tc-sh64.c:1493
+#, c-format
+msgid "invalid operand, not a 6-bit signed value: %d"
+msgstr ""
+
+#: config/tc-sh64.c:1498
+#, c-format
+msgid "invalid operand, not a 6-bit unsigned value: %d"
+msgstr ""
+
+#: config/tc-sh64.c:1503 config/tc-sh64.c:1515
+#, c-format
+msgid "invalid operand, not a 11-bit signed value: %d"
+msgstr ""
+
+#: config/tc-sh64.c:1505
+#, c-format
+msgid "invalid operand, not a multiple of 32: %d"
+msgstr ""
+
+#: config/tc-sh64.c:1510
+#, c-format
+msgid "invalid operand, not a 10-bit signed value: %d"
+msgstr ""
+
+#: config/tc-sh64.c:1517
+#, c-format
+msgid "invalid operand, not an even value: %d"
+msgstr ""
+
+#: config/tc-sh64.c:1522
+#, c-format
+msgid "invalid operand, not a 12-bit signed value: %d"
+msgstr ""
+
+#: config/tc-sh64.c:1524
+#, c-format
+msgid "invalid operand, not a multiple of 4: %d"
+msgstr ""
+
+#: config/tc-sh64.c:1529
+#, c-format
+msgid "invalid operand, not a 13-bit signed value: %d"
+msgstr ""
+
+#: config/tc-sh64.c:1531
+#, c-format
+msgid "invalid operand, not a multiple of 8: %d"
+msgstr ""
+
+#: config/tc-sh64.c:1536
+#, c-format
+msgid "invalid operand, not a 16-bit signed value: %d"
+msgstr ""
+
+#: config/tc-sh64.c:1541
+#, c-format
+msgid "invalid operand, not an 16-bit unsigned value: %d"
+msgstr ""
+
+#: config/tc-sh64.c:1547
+msgid "operand out of range for PT, PTA and PTB"
+msgstr ""
+
+#: config/tc-sh64.c:1549
+#, c-format
+msgid "operand not a multiple of 4 for PT, PTA or PTB: %d"
+msgstr ""
+
+#: config/tc-sh64.c:2077
+#, c-format
+msgid "MOVI operand is not a 32-bit signed value: 0x%8x%08x"
+msgstr ""
+
+#: config/tc-sh64.c:2440 config/tc-sh64.c:2605 config/tc-sh64.c:2620
+msgid "invalid PIC reference"
+msgstr ""
+
+#: config/tc-sh64.c:2498
+msgid "can't find opcode"
+msgstr ""
+
+#: config/tc-sh64.c:2828
+#, c-format
+msgid "invalid operands to %s"
+msgstr ""
+
+#: config/tc-sh64.c:2834
+#, c-format
+msgid "excess operands to %s"
+msgstr ""
+
+#: config/tc-sh64.c:2880
+#, c-format
+msgid "The `.mode %s' directive is not valid with this architecture"
+msgstr ""
+
+#: config/tc-sh64.c:2888
+#, c-format
+msgid "Invalid argument to .mode: %s"
+msgstr ""
+
+#: config/tc-sh64.c:2919
+#, c-format
+msgid "The `.abi %s' directive is not valid with this architecture"
+msgstr ""
+
+#: config/tc-sh64.c:2925
+msgid "`.abi 64' but command-line options do not specify 64-bit ABI"
+msgstr ""
+
+#: config/tc-sh64.c:2930
+msgid "`.abi 32' but command-line options do not specify 32-bit ABI"
+msgstr ""
+
+#: config/tc-sh64.c:2933
+#, c-format
+msgid "Invalid argument to .abi: %s"
+msgstr ""
+
+#: config/tc-sh64.c:2966
+msgid "-no-mix is invalid without specifying SHcompact or SHmedia"
+msgstr ""
+
+#: config/tc-sh64.c:2971
+msgid "-shcompact-const-crange is invalid without SHcompact"
+msgstr ""
+
+#: config/tc-sh64.c:2974
+msgid "-expand-pt32 only valid with -abi=64"
+msgstr ""
+
+#: config/tc-sh64.c:2977
+msgid "-no-expand only valid with SHcompact or SHmedia"
+msgstr ""
+
+#: config/tc-sh64.c:2980
+msgid "-expand-pt32 invalid together with -no-expand"
+msgstr ""
+
+#: config/tc-sh64.c:3190
+msgid ""
+"SHmedia code not allowed in same section as constants and SHcompact code"
+msgstr ""
+
+#: config/tc-sh64.c:3208
+msgid "No segment info for current section"
+msgstr ""
+
+#: config/tc-sh64.c:3250
+msgid "duplicate datalabel operator ignored"
+msgstr ""
+
+#: config/tc-sh64.c:3320
+msgid "Invalid DataLabel expression"
+msgstr ""
+
 #: config/tc-sparc.c:281
 msgid "Invalid default architecture, broken assembler."
 msgstr ""
@@ -7706,11 +7938,11 @@ msgstr ""
 msgid "alignment not a power of 2"
 msgstr ""
 
-#: config/tc-sparc.c:3680 config/tc-v850.c:260
+#: config/tc-sparc.c:3680 config/tc-v850.c:231
 msgid "Expected comma after symbol-name"
 msgstr ""
 
-#: config/tc-sparc.c:3708 config/tc-v850.c:293
+#: config/tc-sparc.c:3708 config/tc-v850.c:264
 #, c-format
 msgid "Length of .comm \"%s\" is already %ld. Not changed to %d."
 msgstr ""
@@ -8517,162 +8749,162 @@ msgstr ""
 msgid "md_convert_frag() not implemented yet"
 msgstr ""
 
-#: config/tc-v850.c:271
+#: config/tc-v850.c:242
 #, c-format
 msgid ".COMMon length (%d.) < 0! Ignored."
 msgstr ""
 
-#: config/tc-v850.c:320
+#: config/tc-v850.c:291
 msgid "Common alignment negative; 0 assumed"
 msgstr ""
 
-#: config/tc-v850.c:1014
+#: config/tc-v850.c:916
 #, c-format
 msgid "unknown operand shift: %x\n"
 msgstr ""
 
-#: config/tc-v850.c:1015
+#: config/tc-v850.c:917
 msgid "internal failure in parse_register_list"
 msgstr ""
 
-#: config/tc-v850.c:1032
+#: config/tc-v850.c:934
 msgid "constant expression or register list expected"
 msgstr ""
 
-#: config/tc-v850.c:1037 config/tc-v850.c:1050 config/tc-v850.c:1069
+#: config/tc-v850.c:939 config/tc-v850.c:952 config/tc-v850.c:971
 msgid "high bits set in register list expression"
 msgstr ""
 
-#: config/tc-v850.c:1109 config/tc-v850.c:1173
+#: config/tc-v850.c:1011 config/tc-v850.c:1075
 msgid "illegal register included in list"
 msgstr ""
 
-#: config/tc-v850.c:1116
+#: config/tc-v850.c:1018
 msgid "system registers cannot be included in list"
 msgstr ""
 
-#: config/tc-v850.c:1121
+#: config/tc-v850.c:1023
 msgid "PSW cannot be included in list"
 msgstr ""
 
-#: config/tc-v850.c:1128
+#: config/tc-v850.c:1030
 msgid "High value system registers cannot be included in list"
 msgstr ""
 
-#: config/tc-v850.c:1152
+#: config/tc-v850.c:1054
 msgid "second register should follow dash in register list"
 msgstr ""
 
-#: config/tc-v850.c:1199
+#: config/tc-v850.c:1101
 msgid " V850 options:\n"
 msgstr ""
 
-#: config/tc-v850.c:1200
+#: config/tc-v850.c:1102
 msgid "  -mwarn-signed-overflow    Warn if signed immediate values overflow\n"
 msgstr ""
 
-#: config/tc-v850.c:1201
+#: config/tc-v850.c:1103
 msgid ""
 "  -mwarn-unsigned-overflow  Warn if unsigned immediate values overflow\n"
 msgstr ""
 
-#: config/tc-v850.c:1202
+#: config/tc-v850.c:1104
 msgid "  -mv850                    The code is targeted at the v850\n"
 msgstr ""
 
-#: config/tc-v850.c:1203
+#: config/tc-v850.c:1105
 msgid "  -mv850e                   The code is targeted at the v850e\n"
 msgstr ""
 
-#: config/tc-v850.c:1204
+#: config/tc-v850.c:1106
 msgid "  -mv850ea                  The code is targeted at the v850ea\n"
 msgstr ""
 
-#: config/tc-v850.c:1205
+#: config/tc-v850.c:1107
 msgid ""
 "  -mv850any                 The code is generic, despite any processor "
 "specific instructions\n"
 msgstr ""
 
-#: config/tc-v850.c:1217 config/tc-v850.c:1255
+#: config/tc-v850.c:1119 config/tc-v850.c:1157
 #, c-format
 msgid "unknown command line option: -%c%s\n"
 msgstr ""
 
-#: config/tc-v850.c:1405
+#: config/tc-v850.c:1306
 #, c-format
 msgid "Unable to determine default target processor from string: %s"
 msgstr ""
 
-#: config/tc-v850.c:1453
+#: config/tc-v850.c:1344
 msgid "ctoff() relocation used on an instruction which does not support it"
 msgstr ""
 
-#: config/tc-v850.c:1475
+#: config/tc-v850.c:1370
 msgid "sdaoff() relocation used on an instruction which does not support it"
 msgstr ""
 
-#: config/tc-v850.c:1497
+#: config/tc-v850.c:1396
 msgid "zdaoff() relocation used on an instruction which does not support it"
 msgstr ""
 
-#: config/tc-v850.c:1530
+#: config/tc-v850.c:1433
 msgid "tdaoff() relocation used on an instruction which does not support it"
 msgstr ""
 
-#: config/tc-v850.c:1746
+#: config/tc-v850.c:1657
 msgid "Target processor does not support this instruction."
 msgstr ""
 
-#: config/tc-v850.c:1836 config/tc-v850.c:1866 config/tc-v850.c:2054
+#: config/tc-v850.c:1747 config/tc-v850.c:1777 config/tc-v850.c:1965
 msgid "immediate operand is too large"
 msgstr ""
 
-#: config/tc-v850.c:1848
+#: config/tc-v850.c:1759
 msgid "AAARG -> unhandled constant reloc"
 msgstr ""
 
-#: config/tc-v850.c:1892
+#: config/tc-v850.c:1803
 msgid "invalid register name"
 msgstr ""
 
-#: config/tc-v850.c:1897
+#: config/tc-v850.c:1808
 msgid "register r0 cannot be used here"
 msgstr ""
 
-#: config/tc-v850.c:1909
+#: config/tc-v850.c:1820
 msgid "invalid system register name"
 msgstr ""
 
-#: config/tc-v850.c:1922
+#: config/tc-v850.c:1833
 msgid "expected EP register"
 msgstr ""
 
-#: config/tc-v850.c:1939
+#: config/tc-v850.c:1850
 msgid "invalid condition code name"
 msgstr ""
 
-#: config/tc-v850.c:1960 config/tc-v850.c:1964
+#: config/tc-v850.c:1871 config/tc-v850.c:1875
 msgid "constant too big to fit into instruction"
 msgstr ""
 
-#: config/tc-v850.c:2017
+#: config/tc-v850.c:1928
 msgid "syntax error: value is missing before the register name"
 msgstr ""
 
-#: config/tc-v850.c:2019
+#: config/tc-v850.c:1930
 msgid "syntax error: register not expected"
 msgstr ""
 
-#: config/tc-v850.c:2033
+#: config/tc-v850.c:1944
 msgid "syntax error: system register not expected"
 msgstr ""
 
-#: config/tc-v850.c:2038
+#: config/tc-v850.c:1949
 msgid "syntax error: condition code not expected"
 msgstr ""
 
-#: config/tc-v850.c:2079
+#: config/tc-v850.c:1990
 msgid "invalid operand"
 msgstr ""