This is the mail archive of the mailing list for the binutils project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] microMIPS insn32 mode support


 This change adds microMIPS insn32 mode support to GAS and LD.  This is 
required for some odd purposes I am told.  This mode prevents any 16-bit 
microMIPS instructions from being produced, affecting assembly and 
linker-generated code such as PLT entries, SVR4 lazy binding stubs, code 
produced in linker relaxation.

 To make people's life easier with existing microMIPS code three 16-bit 
microMIPS instructions that have no direct 32-bit counterparts have been 
converted to macros in the insn32 mode and produce the obvious equivalent 
multiple-instruction sequences.  These are JRADDIUSP, JRC and MOVEP.  
Forced-length or short-delay-slot instructions such as NOP16 or JALS are 
not permitted, nor are specific 16-bit microMIPS instruction mnemonics 
such as ADDIUS5.  The assumption here being any code using these 
instructions is likely to require special attention.

 New command-line options are added to GAS and LD to control the new mode, 
these are -minsn32/-mno-insn32 and --insn32/--no-insn32 respectively.  A 
new .set insn32/noinsn32 GAS control knob is also added.  The settings of 
the two tools are completely independent of each other; --insn32 in 
particular can be used with LD in the unlikely event the distance between 
PLT and GOTPLT overflows the range of the ADDIUPC instruction, to force 
the longer address calculation sequence.

 Preexisting microMIPS GAS test cases have been modified to provide full 
insn32 mode coverage of the instruction set.  I have a separate change to 
add LD test cases that cover the --insn32 option while at the same time 
verifying correct PLT generation.  As these extend the microMIPS PLT tests 
I posted previously that raised concerns I am going to modify the whole 
set accordingly and post both parts separately.

 No regressions across the usual MIPS targets.  Comments, questions, OK to 
apply (once the microMIPS PLT has been committed)?

2013-06-11  Maciej W. Rozycki  <>
            Paul Brook  <>

	* elfxx-mips.h (_bfd_mips_elf_insn32): New prototype.
	* elfxx-mips.c (mips_elf_link_hash_table): Add insn32 member.
	(micromips_insn32_o32_exec_plt0_entry): New variable.
	(micromips_insn32_o32_exec_plt_entry): Likewise.
	(_bfd_mips_elf_adjust_dynamic_symbol): Handle insn32 mode.
	(mips_elf_estimate_stub_size): Likewise.
	(_bfd_mips_elf_size_dynamic_sections): Likewise.
	(_bfd_mips_elf_finish_dynamic_symbol): Likewise.
	(mips_finish_exec_plt): Likewise.
	(_bfd_mips_elf_relax_section): Likewise.
	(_bfd_mips_elf_insn32): New function.
	(_bfd_mips_elf_get_synthetic_symtab): Handle insn32 PLT.

2013-06-11  Maciej W. Rozycki  <>

	* config/tc-mips.c (mips_set_options): Add insn32 member.
	(mips_opts): Initialize it.
	(NOP_INSN, NOP_INSN_SIZE): Handle insn32 mode.
	(is_size_valid): Likewise.
	(md_assemble): Pass instruction string down to macro.
	(brk_fmt): Add second dimension and insn32 mode initializers.
	(mfhl_fmt): Likewise.
	(BRK_FMT, MFHL_FMT): Handle insn32 mode.
	(macro_build) <'c'>: Handle microMIPS 32-bit BREAK encoding.
	(macro_build_jalr, move_register): Handle insn32 mode.
	(macro_build_branch_rs): Likewise.
	(macro): Handle insn32 mode.
	<M_JRADDIUSP>, <M_JRC>, <M_MOVEP>: New cases.
	(mips_ip): Handle insn32 mode.
	(options): Add OPTION_INSN32 and OPTION_NO_INSN32 enum values.
	(md_longopts): Add "minsn32" and "mno-insn32" options.
	(md_parse_option): Handle OPTION_INSN32 and OPTION_NO_INSN32.
	(s_mipsset): Handle "insn32" and "noinsn32" pseudo-ops.
	(mips_handle_align): Handle insn32 mode.
	(md_show_usage): Add -minsn32 and -mno-insn32.

	* doc/as.texinfo (Target MIPS options): Add -minsn32 and
	-mno-insn32 options.
	(-minsn32, -mno-insn32): New options.
	* doc/c-mips.texi (MIPS Opts): Add -minsn32 and -mno-insn32
	(MIPS assembly options): New node.  Document .set insn32 and
	.set noinsn32.
	(MIPS-Dependent): List the new node.

2013-06-11  Maciej W. Rozycki  <>

	* gas/mips/micromips-insn32.d: New test.
	* gas/mips/micromips-noinsn32.d: Likewise.
	* gas/mips/micromips.l: Rename to...
	* gas/mips/micromips-warn.l: ... this.
	* gas/mips/micromips.d: Update accordingly.
	* gas/mips/micromips-trap.d: Likewise.
	* gas/mips/micromips.l: New list test.
	* gas/mips/micromips.s: Add conditionals.
	* gas/mips/mips.exp: Run the new tests.

2013-06-11  Maciej W. Rozycki  <>

	* mips.h: Add M_JRADDIUSP, M_JRC and M_MOVEP anonymous enum

2013-06-11  Maciej W. Rozycki  <>

	* emultempl/mipself.em (insn32): New variable.
	(mips_create_output_section_statements): Handle insn32 mode.

	* gen-doc.texi: Set MIPS.
	* ld.texinfo: Likewise.
	(Options specific to MIPS targets): New section.
	(ld and MIPS family): New node.
	(Top, Machine Dependent): List the new node.

2013-06-11  Maciej W. Rozycki  <>

	* micromips-opc.c (micromips_opcodes): Add "jraddiusp", "jrc" and
	"movep" macros.


[Patch attached compressed due to its size.]

Attachment: binutils-umips-insn32.diff.bz2
Description: Binary data

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]