From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 6906 invoked by alias); 21 Feb 2011 15:35:39 -0000 Received: (qmail 5545 invoked by uid 22791); 21 Feb 2011 15:35:28 -0000 X-SWARE-Spam-Status: No, hits=-0.3 required=5.0 tests=AWL,BAYES_50,LOTS_OF_MONEY,TW_DB,TW_EQ,TW_FX,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (38.113.113.100) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 21 Feb 2011 15:35:08 +0000 Received: (qmail 3081 invoked from network); 21 Feb 2011 15:35:02 -0000 Received: from unknown (HELO tp.orcam.me.uk) (macro@127.0.0.2) by mail.codesourcery.com with ESMTPA; 21 Feb 2011 15:35:02 -0000 Date: Mon, 21 Feb 2011 15:35:00 -0000 From: "Maciej W. Rozycki" To: Richard Sandiford cc: binutils@sourceware.org, Chao-ying Fu , Rich Fuhler , David Lau , Kevin Mills , Ilie Garbacea , Catherine Moore , Nathan Sidwell , Joseph Myers , Nathan Froyd Subject: Re: [PATCH] MIPS: microMIPS ASE support In-Reply-To: <8739pb1qs5.fsf@firetop.home> Message-ID: References: <87y6fa9u3t.fsf@firetop.home> <876302kqvu.fsf@firetop.home> <8739pb1qs5.fsf@firetop.home> User-Agent: Alpine 1.10 (DEB 962 2008-03-14) MIME-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="8323328-299903771-1298302502=:20460" Mailing-List: contact binutils-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: binutils-owner@sourceware.org X-SW-Source: 2011-02/txt/msg00258.txt.bz2 This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. --8323328-299903771-1298302502=:20460 Content-Type: TEXT/PLAIN; charset=US-ASCII Content-length: 95960 Hi Richard & all, I am back at last with updates to the change and I have combined two e-mails here again. I hope this covers all the outstanding concerns and nothing from earlier correspondence has been lost unaddressed. Chao-ying, there are a couple of questions for you throughout -- would you please give them a thought? And anyone, of course, please feel free to comment as you like. > "Maciej W. Rozycki" writes: > > > > Well, if we have code like this: > > > > branch ... > > LUI ... > > insn [...] > > > > (where for the purpose of this consideration BRANCH may also be a jump) > > then LUI cannot be entirely deleted and INSN moved into the slot of BRANCH > > no matter if INSN is a branch or an computational instruction. All we can > > do in this case is to see if there is a corresponding BRANCHC instruction > > and use it to swap BRANCH with and then delete the LUI if so, or otherwise > > shrink the LUI to a 16-bit NOP if BRANCH permits or can be swapped with > > BRANCHS to permit a 16-bit delay-slot instruction. If neither is > > possible, then the LUI is merely substituted with a 32-bit NOP (although > > the effect is purely cosmetical in this case; perhaps we should just back > > out). > > Yeah, I see your point. I was thinking that the code claims to "know" > that the LUI and "insn" are both part of the same load address. So if > the branch was taken, the target of the LUI ought to be dead. However, > I agree that (even though the code does seem to assume that to some extent) > the assumption is wrong. > > E.g. you could have: > > beqz $2,1f > lui $4,%hi(foo) <-- A > > addiu $4,$4,%lo(foo) <-- B > ... > jr $31 > 2: ... > lui $4,%hi(foo) <-- C > ... > 1: addiu $4,$4,%lo(foo) <-- D > > In this case, the LO16 reloc for D might follow the HI16 reloc for C, > and the LO16 reloc for B might follow the HI16 reloc for A. AIUI, we'd > consider relaxing A/B but not C/D. In this case, turning A into a NOP > is wrong, because $4 is still live at D. If you agree then... > > > Also with the recent update to LUI relaxation code I think we should > > simply disallow the optimisation if a LUI is in a delay slot of an > > unconditional branch -- we have no way to verify the corresponding LO16 > > reloc really belongs to this LUI instruction in that case. This will let > > us simplify code (which has become a little bit hairy by now IMO) a little > > bit I would guess. [FIXME] > > ...maybe it would be simpler to drop the optimisation if the LUI is any > kind of delay slot. I think this would simply the code, and I don't think > we'd then need to check for branch relocs. We'd just have *_norel-like > functions (although not called that any more) to check for every kind > of branch. I have implemented these changes now, dropping the unsafe part of optimisation for the scenario you have listed. I still have two concerns about this optimisation, but the optional nature of linker relaxation makes them reasonably unimportant IMO: 1. The resulting change of alignment may cause the linker produce bad code or abort the process if microMIPS and standard MIPS code is mixed in one object file and the latter turns out to become unaligned, e.g. .set micromips .set noreorder .align 2 .globl foo .ent foo foo: beqz32 $4, 0f nop16 0: jalx bar nop .end foo .set nomicromips .align 2 .globl bar .ent bar bar: nop .end bar The piece above will fail to link, because BEQZ will be converted to a BEQZC and the 16-bit NOP from its delay slot taken out. As a result bar() will become misaligned and the JALX will not be allowed. If there was no JALX, then linking might succeed if there were only indirect calls to bar(), but the function would not be properly aligned for standard MIPS execution. 2. Broken code is produced for cases like this: .set noreorder lui $4, 0x1234 lui $2, %hi(foo) bnez $3, 0f addiu $2, %lo(foo) ... lui $4, %hi(foo) 0: jal bar addiu $4, %lo(foo) where the resulting code: .set noreorder lui $4, 0x1234 bnez $3, 0f addiu $2, $pc, foo - . ... 0: jal bar addiu $4, $pc, foo - . obviously not being the same. Such usage of HI16/LO16 relocations is non-standard, but not disallowed. OTOH searching the symbol tables for the label (we could disable this relaxation if there's one at the instruction a LO16 relocation is against) is expensive. What do you think? [FIXME] On Sun, 2 Jan 2011, Richard Sandiford wrote: > This is the second and final part of the review. > > First of all, thanks for the great effort you've made to integrate the > microMIPS macro code into macro(). This is much, much better than before, > and should be far less of a maintenance burden. I hope so too and thanks for your extensive effort too. > FWIW, I plan to review the follow-up patch based purely on whether > it deals with the review comments. Anything that we've collectively > missed this far (and there's bound to be something) will just have to > be fixed when someone trips over it. OK. > I think the only change of any significant size that needs to be made > is to move the place where we convert to microMIPS relocs (see below). > Everything else is pretty small. Honestly the reloc conversion change was probably the smallest of all (barring formatting fixes). :/ > > @@ -1821,6 +1830,8 @@ the target word. These are used on the > > ENUM > > BFD_RELOC_GPREL16 > > ENUMX > > + BFD_RELOC_MICROMIPS_GPREL16 > > +ENUMX > > BFD_RELOC_GPREL32 > > ENUMDOC > > For systems that allocate a Global Pointer register, these are > > You've now moved most of the new relocs into MIPS-specific areas, thanks, > but some, like the one above, are still in generic lists. Let's put: > > ENUM > BFD_RELOC_MICROMIPS_7_PCREL_S1 > ENUMX > BFD_RELOC_MICROMIPS_10_PCREL_S1 > ENUMX > BFD_RELOC_MICROMIPS_16_PCREL_S1 > ENUMDOC > MicroMIPS PC-relative relocations. > > before the main "MIPS ELF relocations." section, followed > by a new section: > > ENUM > BFD_RELOC_MICROMIPS_GPREL16 > ENUMX > BFD_RELOC_MICROMIPS_HI16 > ENUMX > BFD_RELOC_MICROMIPS_HI16_S > ENUMX > BFD_RELOC_MICROMIPS_LO16 > ENUMDOC > MicroMIPS versions of generic BFD relocs. > > Also, let's combine this: > > > @@ -2182,6 +2193,11 @@ ENUMDOC > > simple reloc otherwise. > > > > ENUM > > + BFD_RELOC_MICROMIPS_JMP > > +ENUMDOC > > + The microMIPS jump instruction. > > + > > +ENUM > > BFD_RELOC_MIPS16_JMP > > ENUMDOC > > The MIPS16 jump instruction. > > with the MIPS_JMP entry, since you're doing the same with the other > microMIPS versions of MIPS relocs. OK, but I had to remove the original documentation note. The immediate argument is only shifted left by one bit in the microMIPS mode. > > + /* Whether we are assembling for the mipsMIPS processor. 0 if we are > > + not, 1 if we are, and -1 if the value has not been initialized. > > + Changed by `.set micromips' and `.set nomicromips', and the -mmicromips > > + and -mno-micromips command line options, and the default CPU. */ > > + int micromips; > > Blind cut-&-paste. "microMIPS ASE". > > Let's leave the -1 case and: > > > +/* Return true if the given CPU supports microMIPS. */ > > +#define CPU_HAS_MICROMIPS(cpu) 0 > > out. I think the CPU_HAS_MIPS16 stuff is derived from the original LSI > TinyRisc support and wouldn't be used for ASEs. The microMIPS ASE provides for processors that do not support the standard MIPS instruction set. These I think should default to the microMIPS mode. I suspect someone will eventually implement such a processor as since we've got this code implemented here already I'd like to leave it as a placeholder. I think it's not much of a burden, is it? > > @@ -495,9 +515,11 @@ static int mips_32bitmode = 0; > > require nops to be inserted. This applies to instructions marked > > INSN_LOAD_MEMORY_DELAY. These nops are only required at MIPS ISA > > level I. */ > > -#define gpr_interlocks \ > > - (mips_opts.isa != ISA_MIPS1 \ > > - || mips_opts.arch == CPU_R3900) > > +#define gpr_interlocks \ > > + (mips_opts.isa != ISA_MIPS1 \ > > + || mips_opts.arch == CPU_R3900 \ > > + || mips_opts.micromips \ > > + ) > > > > /* Whether the processor uses hardware interlocks to avoid delays > > required by coprocessor instructions, and thus does not require > > @@ -512,6 +534,7 @@ static int mips_32bitmode = 0; > > && mips_opts.isa != ISA_MIPS2 \ > > && mips_opts.isa != ISA_MIPS3) \ > > || mips_opts.arch == CPU_R4300 \ > > + || mips_opts.micromips \ > > ) > > > > /* Whether the processor uses hardware interlocks to protect reads > > @@ -519,7 +542,10 @@ static int mips_32bitmode = 0; > > thus does not require nops to be inserted. This applies to > > instructions marked INSN_COPROC_MEMORY_DELAY. These nops are only > > requires at MIPS ISA level I. */ > > -#define cop_mem_interlocks (mips_opts.isa != ISA_MIPS1) > > +#define cop_mem_interlocks \ > > + (mips_opts.isa != ISA_MIPS1 \ > > + || mips_opts.micromips \ > > + ) > > > > /* Is this a mfhi or mflo instruction? */ > > #define MF_HILO_INSN(PINFO) \ > > These changes are OK if they make life easier, but please add a comment > saying why they do. No interlocks are ever needed for microMIPS code, even if building with -mips1 (the default). I have added a note to this effect to the relevant comments. > > +#define RELAX_MICROMIPS_ENCODE(type, is_16bit, uncond, link, toofar) \ > > + (0x40000000 \ > > + | ((type) & 0xff) \ > > + | ((is_16bit) ? 0x100 : 0) \ > > + | ((uncond) ? 0x200 : 0) \ > > + | ((link) ? 0x400 : 0) \ > > + | ((toofar) ? 0x800 : 0)) > > +#define RELAX_MICROMIPS_P(i) (((i) & 0xc0000000) == 0x40000000) > > +#define RELAX_MICROMIPS_TYPE(i) ((i) & 0xff) > > +#define RELAX_MICROMIPS_USER_16BIT(i) (((i) & 0x100) != 0) > > +#define RELAX_MICROMIPS_UNCOND(i) (((i) & 0x200) != 0) > > +#define RELAX_MICROMIPS_LINK(i) (((i) & 0x400) != 0) > > +#define RELAX_MICROMIPS_TOOFAR(i) (((i) & 0x800) != 0) > > +#define RELAX_MICROMIPS_MARK_TOOFAR(i) ((i) | 0x800) > > +#define RELAX_MICROMIPS_CLEAR_TOOFAR(i) ((i) & ~0x800) > > Is there a need to create variant frags when the user has explicitly > specified the instruction size? I wouldn't have expected any relaxation > to be necessary in that case, and it looks like the relaxation code does > indeed return 2 whenever USER_16BIT is true. I suspect this has been copied over from MIPS16 code. RELAX_MIPS16_USER_SMALL seems to be used in a similar fashion. Do you happen to know for sure why it has been implemented this way for MIPS16 assembly? My suspicion is we want to keep the relocation until the final relaxation so that if the final value turns out to fit afterwards (but not until then) in the forced-truncated immediate field of the instruction nothing is lost. > If the bit really is needed, let's call the parameter "user_16bit" > rather than "is_16bit", to match the use. Fixed. > Add a comment saying what RELAX_MICROMIPS_TYPE is. See the MIPS16 > comment as an example. > > > +#define RELAX_MICROMIPS_EXTENDED(i) (((i) & 0x10000) != 0) > > +#define RELAX_MICROMIPS_MARK_EXTENDED(i) ((i) | 0x10000) > > +#define RELAX_MICROMIPS_CLEAR_EXTENDED(i) ((i) & ~0x10000) > > Any particular reason why 0x10000 rather than 0x1000, which seems > to be the first unused bit? I would prefer to pack the used bits > together so that it's easier to tell what's left. These weren't used anywhere. I have discarded these macros. > > + /* True if the macro is in a 16-bit branch delay slot. */ > > + bfd_boolean delay_slot_16bit_p; > > + > > + /* True if the macro is in a 32-bit branch delay slot. */ > > + bfd_boolean delay_slot_32bit_p; > > I think it would be cleaner to have: > > /* If the macro is in a delay slot that requires a specific length > of instruction, this is that length, otherwise it is zero. */ > unsigned int delay_slot_length; Yes, marginally. As this is similar to updates I have made elsewhere already, I have implemented your suggestion now. > > + /* For relaxable macros, fsize[0] is the length of the first instruction > > + of the first alternative in bytes and fsize[1] is the length of the > > + first instruction of the second alternative. > > + For non-relaxable macros, both elements give the length of the > > + first instruction in bytes. */ > > + unsigned int fsize[2]; > > Rename to "first_insn_sizes" ("sizes" rather than "size" because the > plurality comes from having two alternatives). Also add: > > The fields are zero if we haven't yet seen the first instruction. Fixed. > > @@ -2374,22 +2736,21 @@ s_is_linkonce (symbolS *sym, segT from_s > > return linkonce; > > } > > > > -/* Mark instruction labels in mips16 mode. This permits the linker to > > - handle them specially, such as generating jalx instructions when > > - needed. We also make them odd for the duration of the assembly, in > > - order to generate the right sort of code. We will make them even > > +/* Mark instruction labels in MIPS16/microMIPS mode. This permits the > > + linker to handle them specially, such as generating jalx instructions > > + when needed. We also make them odd for the duration of the assembly, > > + in order to generate the right sort of code. We will make them even > > in the adjust_symtab routine, while leaving them marked. This is > > convenient for the debugger and the disassembler. The linker knows > > to make them odd again. */ > > > > static void > > -mips16_mark_labels (void) > > +mips_compressed_mark_labels (void) > > { > > segment_info_type *si = seg_info (now_seg); > > struct insn_label_list *l; > > > > - if (!mips_opts.mips16) > > - return; > > + gas_assert (HAVE_CODE_COMPRESSION); > > > > for (l = si->label_list; l != NULL; l = l->next) > > { > > @@ -2397,16 +2758,22 @@ mips16_mark_labels (void) > > > > #if defined(OBJ_ELF) || defined(OBJ_MAYBE_ELF) > > if (IS_ELF) > > - S_SET_OTHER (label, ELF_ST_SET_MIPS16 (S_GET_OTHER (label))); > > + { > > + if (mips_opts.mips16) > > + S_SET_OTHER (label, ELF_ST_SET_MIPS16 (S_GET_OTHER (label))); > > + else if (mips_opts.micromips) > > + S_SET_OTHER (label, ELF_ST_SET_MICROMIPS (S_GET_OTHER (label))); > > + } > > #endif > > if ((S_GET_VALUE (label) & 1) == 0 > > /* Don't adjust the address if the label is global or weak, or > > in a link-once section, since we'll be emitting symbol reloc > > references to it which will be patched up by the linker, and > > - the final value of the symbol may or may not be MIPS16. */ > > + the final value of the symbol may or may not be MIPS16/microMIPS. */ > > && ! S_IS_WEAK (label) > > && ! S_IS_EXTERNAL (label) > > - && ! s_is_linkonce (label, now_seg)) > > + && ! s_is_linkonce (label, now_seg) > > + && HAVE_CODE_COMPRESSION) > > S_SET_VALUE (label, S_GET_VALUE (label) | 1); > > } > > } > > Looks like the addition of HAVE_CODE_COMPRESSION is redundant here, > you've already asserted it in the previous hunk. Yes, cut & paste error, fixed. > > +static char * > > +micromips_label_name (void) > > +{ > > + char *p = micromips_target_name; > > + char symbol_name_temporary[24]; > > + unsigned long l; > > + int i; > > + > > + if (*p) > > + return p; > > + > > + i = 0; > > + l = micromips_target_label; > > +#ifdef LOCAL_LABEL_PREFIX > > + *p++ = LOCAL_LABEL_PREFIX; > > +#endif > [...] > > +int > > +mips_label_is_local (const char *name) > > +{ > > + return strchr (name, MICROMIPS_LABEL_CHAR) != NULL; > > +} > > Why is this change needed? The default local-label detection should be > enough for ELF targets, which always have a LOCAL_LABEL_PREFIX. I fail to see a justification, so I have removed this function. Chao-ying, do you have anything to add? > > @@ -2915,7 +3367,8 @@ append_insn (struct mips_cl_insn *ip, ex > > out that the branch was out-of-range, we'll get an error. */ > > && !mips_opts.warn_about_macros > > && (mips_opts.at || mips_pic == NO_PIC) > > - && !mips_opts.mips16) > > + && !mips_opts.mips16 > > + && !mips_opts.micromips) > > { > > relaxed_branch = TRUE; > > add_relaxed_insn (ip, (relaxed_branch_length > > !HAVE_CODE_COMPRESSION Obviously. > > + if (mips_relax.sequence) > > + abort (); > > gas_assert (!mips_relax.sequence); I sort of wonder why it is needed here in the first place, but not in any of the other blocks throughout this conditional, hmm... > > + /* For microMIPS, disable reordering. */ > > + || mips_opts.micromips > > You should say whether this is for simplicity or by specification. > Either way, a bit more detail would be welcome. E.g. something like: > > /* microMIPS assembly language does not allow the assembler > to reorder instructions, even in .set reorder mode. > Delay slots are always filled with nops when .set reorder > is in effect. */ > > (adjusted as appropriate if my guess is wrong). I believe the concerns are the same as with MIPS16 code -- so far we have failed to develop means to update DWARF-2 records accordingly and if a 32-bit branch/jump is swapped with a 16-bit delay-slot instruction (or vice versa as it's permitted in microMIPS code, though not in MIPS16 one) then substandard debugging experience results from software breakpoints placed mid-through an instruction. So as much as we'd love to reorder we really can't without fixing GAS elsewhere. Hmm, it looks like the piece of code to disable MIPS16 reordering has never made its way upstream. It should, unless we have a volunteer to fix GAS immediately, so while holding my breath and hoping that people won't fight over this challenge I extracted this piece now and updated this change accordingly. It makes no sense to keep the two pieces separate. It also looks to me we shouldn't be checking for INSN_SYNC (that's a waste of one of the precious flags we're just running out of), INSN_ERET and INSN_DERET here explicitly. These instructions should have their INSN_TRAP flag set instead -- and the flag should be renamed as I said previously to avoid confusion and reflect its actual meaning, i.e. "this instruction is forbidden in a branch delay slot". > > + /* If both delay slots are out of size, then emit the warning now. */ > > + if ((subtype & (RELAX_DELAY_SLOT_SIZE_FIRST | RELAX_DELAY_SLOT_SIZE_SECOND)) > > + == (RELAX_DELAY_SLOT_SIZE_FIRST | RELAX_DELAY_SLOT_SIZE_SECOND)) > > /* If both alternatives fail to fill a delay slot correctly, > emit the warning now. */ > if ((subtype & RELAX_DELAY_SLOT_SIZE_FIRST) != 0 > && (subtype & RELAX_DELAY_SLOT_SIZE_SECOND) != 0) I expect that to produce marginally worse code, but I won't insist. The comment update is OK of course. > > + hash = !mips_opts.micromips ? op_hash : micromips_op_hash; > > hash = mips_opts.micromips ? micromips_op_hash : op_hash; Applied. > > @@ -3640,13 +4407,32 @@ macro_build (expressionS *ep, const char > > /* Search until we get a match for NAME. It is assumed here that > > macros will never generate MDMX, MIPS-3D, or MT instructions. */ > > if (strcmp (fmt, mo->args) == 0 > > - && mo->pinfo != INSN_MACRO > > - && is_opcode_valid (mo)) > > - break; > > + && mo->pinfo != INSN_MACRO) > > + { > > + bfd_boolean ok; > > + bfd_boolean size_ok; > > + bfd_boolean delay_slot_ok; > > + > > + ok = is_opcode_valid (mo); > > + size_ok = is_size_valid (mo); > > + delay_slot_ok = is_delay_slot_valid (mo); > > + if (ok && size_ok && (delay_slot_ok || secondpass)) > > + break; > > + if (!delay_slot_ok && !twopass) > > + { > > + firstmo = mo; > > + twopass = TRUE; > > + } > > + } > > > > ++mo; > > - gas_assert (mo->name); > > - gas_assert (strcmp (name, mo->name) == 0); > > + if (!mo->name || strcmp (name, mo->name) != 0) > > + { > > + gas_assert (twopass); > > + gas_assert (!secondpass); > > + secondpass = TRUE; > > + mo = firstmo; > > + } > > } > > > > create_insn (&insn, mo); > > Do we really need to do two passes here? I would have expected > to see something like: > > if (strcmp (fmt, mo->args) == 0 > && mo->pinfo != INSN_MACRO > && is_opcode_valid (mo) > && is_size_valid (mo)) > { > if (is_delay_slot_valid (mo)) > break; > else if (!reserve_mo) > reserve_mo = mo; > } > > if (!mo->name || strcmp (name, mo->name) != 0) > { > /* All usable candidates violate the delay slot requirements > of the previous instruction. Pick the first such candidate > anyway; we will issue an appropriate warning later. */ > gcc_assert (reserve_mo); > mo = reserve_mo; > break; > } > > which IMO is simpler and clearer. Good point. I have simplified it yet further though. > > + if (!mips_opts.micromips) > > + INSERT_OPERAND (0, RD, insn, va_arg (args, int)); > > + else > > + INSERT_OPERAND (1, RS, insn, va_arg (args, int)); > > if (mips_opts.micromips) > INSERT_OPERAND (1, RS, insn, va_arg (args, int)); > else > INSERT_OPERAND (0, RD, insn, va_arg (args, int)); You don't like negative statements, do you? ;) > > case 'i': > > case 'j': > > macro_read_relocs (&args, r); > > - gas_assert (*r == BFD_RELOC_GPREL16 > > + gas_assert (mips_opts.micromips > > + || *r == BFD_RELOC_GPREL16 > > || *r == BFD_RELOC_MIPS_HIGHER > > || *r == BFD_RELOC_HI16_S > > || *r == BFD_RELOC_LO16 > > || *r == BFD_RELOC_MIPS_GOT_OFST); > > + gas_assert (!mips_opts.micromips > > + || *r == BFD_RELOC_MICROMIPS_GPREL16 > > + || *r == BFD_RELOC_MICROMIPS_HIGHER > > + || *r == BFD_RELOC_MICROMIPS_HI16_S > > + || *r == BFD_RELOC_MICROMIPS_LO16 > > + || *r == BFD_RELOC_MICROMIPS_GOT_OFST); > > Let's move the macro_read_relocs stuff inside append_insn rather than > leaving the conversion to the callers. You could then make append_insn > keep a record of the original (non-microMIPS) reloc_type[0] too, > which would simply some of the logic. E.g. these changes would > no longer be needed: > > > - /* Tag symbols that have a R_MIPS16_26 relocation against them. */ > > - if (reloc_type[0] == BFD_RELOC_MIPS16_JMP > > + /* Tag symbols that have a R_MIPS16_26 or R_MICROMIPS_26_S1 > > + relocation against them. */ > > + if ((reloc_type[0] == BFD_RELOC_MIPS16_JMP > > + || reloc_type[0] == BFD_RELOC_MICROMIPS_JMP) > > && ip->fixp[0]->fx_addsy) > > *symbol_get_tc (ip->fixp[0]->fx_addsy) = 1; This actually would -- note that's BFD_RELOC_MIPS16_JMP and not BFD_RELOC_MIPS_JMP there. > > @@ -3105,6 +3638,13 @@ append_insn (struct mips_cl_insn *ip, ex > > || reloc_type[0] == BFD_RELOC_MIPS_SCN_DISP > > || reloc_type[0] == BFD_RELOC_MIPS_REL16 > > || reloc_type[0] == BFD_RELOC_MIPS_RELGOT > > + || reloc_type[0] == BFD_RELOC_MICROMIPS_JMP > > + || reloc_type[0] == BFD_RELOC_MICROMIPS_GPREL16 > > + || reloc_type[0] == BFD_RELOC_MICROMIPS_LITERAL > > + || reloc_type[0] == BFD_RELOC_MICROMIPS_SUB > > + || reloc_type[0] == BFD_RELOC_MICROMIPS_HIGHEST > > + || reloc_type[0] == BFD_RELOC_MICROMIPS_HIGHER > > + || reloc_type[0] == BFD_RELOC_MICROMIPS_SCN_DISP > > || reloc_type[0] == BFD_RELOC_MIPS16_GPREL > > || hi16_reloc_p (reloc_type[0]) > > || lo16_reloc_p (reloc_type[0]))) > > You also wouldn't need micromips_percent_op. Done. As this is a self-contained change and may possibly need further tweaks, I have made it a separate patch to apply on top of the rest of the fixes (and the original change). BTW, do you happen to know what the issue about BFD_RELOC_MIPS_SCN_DISP is? We refer to it in a couple of places throughout GAS, but never actually generate it. I realise BFD may have to handle the reloc for compatibility with other tools, but GAS? > Sorry, I know this isn't what I said first time round, but it was much > harder to see the wood for the trees before you'd integrated the macro > code properly. Hmm, what can I say? > > + /* For microMIPS, check if the current instruction is not in > > + a delay slot that requires a 32-bit instruction. */ > > + if (mips_opts.micromips > > + && !(history[0].insn_mo->pinfo2 & INSN2_BRANCH_DELAY_32BIT)) > > /* Prefer to use a 16-bit microMIPS instruction unless the previous > instruction specifically requires a 32-bit one. */ OK. > > + if CALL is set. In the reorder mode the delay slot would be filled > > + with a nop anyway, so code produced is simply: > > + BR , > > Add an explicit nop, since the code does. Good point. > > +/* Emit a coprocessor branch macro specified by TYPE, using CC as > > + the condition code tested. EP specifies the branch target. */ > > "branch-likely macro". OK. > > +/* Emit a two-argument branch macro specified by TYPE, using SREG as > > + the register tested. EP specifies the branch target. */ > > + > > +static void > > +macro_build_branch_rs (int type, expressionS *ep, unsigned int sreg) > > +{ > > + const char *brneg; > > + const char *br; > > + int likely = 0; > > + int call = 0; > > + > > + switch (type) > > + { > > + case M_BGEZ: > > + br = "bgez"; > > + break; > > + case M_BGEZL: > > + br = mips_opts.micromips ? "bgez" : "bgezl"; > > + brneg = "bltz"; > > + likely = 1; > > + break; > > + case M_BGEZALL: > > + gas_assert (mips_opts.micromips); > > + br = "bgezals"; > > + brneg = "bltz"; > > + likely = 1; > > + call = 1; > > + break; > > + case M_BGTZ: > > + br = "bgtz"; > > + break; > > + case M_BGTZL: > > + br = mips_opts.micromips ? "bgtz" : "bgtzl"; > > + brneg = "blez"; > > + likely = 1; > > + break; > > + case M_BLEZ: > > + br = "blez"; > > + break; > > + case M_BLEZL: > > + br = mips_opts.micromips ? "blez" : "blezl"; > > + brneg = "bgtz"; > > + likely = 1; > > + break; > > + case M_BLTZ: > > + br = "bltz"; > > + break; > > + case M_BLTZL: > > + br = mips_opts.micromips ? "bltz" : "bltzl"; > > + brneg = "bgez"; > > + likely = 1; > > + break; > > + case M_BLTZALL: > > + gas_assert (mips_opts.micromips); > > + br = "bltzals"; > > + brneg = "bgez"; > > + likely = 1; > > + call = 1; > > + break; > > + default: > > + abort (); > > + } > > + if (mips_opts.micromips && likely) > > + macro_build_branch_likely (br, brneg, call, ep, "s,p", sreg, ZERO); > > + else > > + macro_build (ep, br, "s,p", sreg); > > +} > > No need for "likely". Just initialise "brneg" to NULL and check for that. > Same for macro_build_branch_rsrt. I'm not sure that is clearer, but I won't insist. Adjusted. > > + if (!mips_opts.micromips) > > + label_expr.X_add_number = 8; > > + else > > + micromips_label_expr (&label_expr); > > if (mips_opts.micromips) > micromips_label_expr (&label_expr); > else > label_expr.X_add_number = 8; > > (several occurences) Yes, same as somewhere above. I've swapped all the negative conditions I could spot. > > - macro_build (NULL, "jalr", "d,s", dreg, sreg); > > + s = (!mips_opts.micromips || (mips_opts.noreorder && !cprestore) > > + ? "jalr" : "jalrs"); > > + if (mips_opts.micromips && dreg == RA) > > + macro_build (NULL, s, "mj", sreg); > > + else > > + macro_build (NULL, s, JALR_FMT, dreg, sreg); > > Since we can use JALRS for mips_opts.noreorder && cprestore, I suppose > the cprestore nop: > > if (mips_opts.noreorder) > macro_build (NULL, "nop", ""); > > ought to be conditional on !mips_opts.micromips. No, the delay slot always has to be explicitly filled here. Otherwise you'll end up with LW $gp there (the instruction has a 16-bit variation too) -- that I fixed not so long ago. For the avoidance of doubt: all the call (linked jump/branch) instructions have a fixed-length delay slot that takes either 4 bytes (as with BGEZAL, BLTZAL, JAL, JALR and JALX instructions) or 2 bytes (as with BGEZALS, BLTZALS, JALS and JALRS). All the other jump/branch instructions have an any-length delay slot except from compact jump/branch instructions that have none (these are BEQZC, BNEZC and JRC). Overall the "S" suffix stands for a short delay slot and the "C" one means a compact jump/branch, i.e. no delay slot. > > + /* A 12-bit offset field is too narrow to be used for a low-part > > + relocation, so use the auxiliary register to load the full > > + address provided if the A(b) format has been requested; > > + load_address will produce the necessary relocations as code > > + used with 16-bit offsets below would do. Otherwise the o(b) > > + format has been selected, so load the low part only and the > > + relocation requested will have already been provided in > > + offset_reloc, so just use that. */ > > /* A 12-bit offset field is too narrow to be used for a low-part > relocation, so load the whole address into the auxillary > register. In the case of "A(b)" addresses, we first load > absolute address "A" into the register and then add base > register "b". In the case of "o(b)" addresses, we simply > need to add 16-bit offset "o" to base register "b", and > offset_reloc already contains the relocations associated > with "o". */ OK. > > + hash = !mips_opts.micromips ? op_hash : micromips_op_hash; > > + past = (!mips_opts.micromips ? &mips_opcodes[NUMOPCODES] > > + : µmips_opcodes[bfd_micromips_num_opcodes]); > > if (mips_opts.micromips) > { > hash = micromips_op_hash; > past = µmips_opcodes[bfd_micromips_num_opcodes]; > } > else > { > hash = op_hash; > past = &mips_opcodes[NUMOPCODES]; > } Not sure this is any better, but OK. > > @@ -8688,32 +10234,50 @@ mips_ip (char *str, struct mips_cl_insn > > argsStart = s = str + end; > > for (;;) > > { > > + bfd_boolean delay_slot_ok; > > + bfd_boolean size_ok; > > bfd_boolean ok; > > > > gas_assert (strcmp (insn->name, name) == 0); > > > > ok = is_opcode_valid (insn); > > - if (! ok) > > + size_ok = is_size_valid (insn); > > + delay_slot_ok = is_delay_slot_valid (insn); > > + if (!delay_slot_ok && !twopass) > > { > > - if (insn + 1 < &mips_opcodes[NUMOPCODES] > > - && strcmp (insn->name, insn[1].name) == 0) > > + firstinsn = insn; > > + twopass = TRUE; > > + } > > + if (!ok || !size_ok || (!delay_slot_ok && !secondpass)) > > + { > > + static char buf[256]; > > + > > + if (insn + 1 < past && strcmp (insn->name, insn[1].name) == 0) > > { > > ++insn; > > continue; > > } > > - else > > + if (twopass && !secondpass) > > { > > - if (!insn_error) > > - { > > - static char buf[100]; > > - sprintf (buf, > > - _("opcode not supported on this processor: %s (%s)"), > > - mips_cpu_info_from_arch (mips_opts.arch)->name, > > - mips_cpu_info_from_isa (mips_opts.isa)->name); > > - insn_error = buf; > > - } > > - return; > > + gas_assert (firstinsn); > > + secondpass = TRUE; > > + insn = firstinsn; > > + continue; > > } > > + > > + if (insn_error) > > + return; > > + > > + if (!ok) > > + sprintf (buf, _("opcode not supported on this processor: %s (%s)"), > > + mips_cpu_info_from_arch (mips_opts.arch)->name, > > + mips_cpu_info_from_isa (mips_opts.isa)->name); > > + else > > + sprintf (buf, _("Unrecognized %u-bit version of microMIPS opcode"), > > + 8 * forced_insn_length); > > + insn_error = buf; > > + > > + return; > > } > > > > create_insn (ip, insn); > > Same two-pass comment as before. Obviously this case is different as we have to pass all the matching instructions through the loop with the huge switch statement for argument matching too. So it's not enough to pick the first one that does not meet the delay slot requirement and get away with that. And the switch statement in its current form is not designed to make two successful parses possible. But having written that, I agree there is some room for improvement here even without redesigning the switch statement as in the second pass we do not have to pass instructions to the loop that were already checked in the firs pass. I have updated this piece accordingly. > > + unsigned long mask = (!mips_opts.micromips > > + ? OP_MASK_CODE > > + : MICROMIPSOP_MASK_CODE); > > > unsigned long mask = (mips_opts.micromips > ? MICROMIPSOP_MASK_CODE > : OP_MASK_CODE); > > Several other cases. As above. > > + case 'J': > > + if (!mips_opts.micromips) > > + { /* 19-bit WAIT code. */ > > + my_getExpression (&imm_expr, s); > > + check_absolute_expr (ip, &imm_expr); > > + if ((unsigned long) imm_expr.X_add_number > OP_MASK_CODE19) > > + { > > + as_warn (_("Illegal 19-bit code (%lu)"), > > + (unsigned long) imm_expr.X_add_number); > > + imm_expr.X_add_number &= OP_MASK_CODE19; > > + } > > + INSERT_OPERAND (0, CODE19, *ip, imm_expr.X_add_number); > > + imm_expr.X_op = O_absent; > > + s = expr_end; > > + continue; > > } > > - INSERT_OPERAND (CODE19, *ip, imm_expr.X_add_number); > > - imm_expr.X_op = O_absent; > > - s = expr_end; > > - continue; > > + goto do_reg; /* ALNV.PS source register. */ > > So 'J' is used for different things depending on micromips mode? > Couldn't we use a different letter instead? Picked 'y' then. While doing this I noticed we have a bug. In a sequence like this: alnv.ps $f0, $f1, $f2, $3 jalr $3, $2 the ALNV.PS will get reordered into the delay slot. This is obviously wrong. I'll post a trivial fix for standard MIPS code separately. For microMIPS code we'd have to take one of the precious pinfo flags (which we've run out of, although one can be reclaimed with the SYNC change I mentioned above) for the purpose of this lone instruction and we don't do branch swapping anyway, so I've just disabled ALNV.PS reordering altogether. > > + if (!mips_opts.micromips) > > + INSERT_OPERAND (0, RD, *ip, regno); > > + else > > + INSERT_OPERAND (1, RS, *ip, regno); > > if (mips_opts.micromips) > INSERT_OPERAND (1, RS, *ip, regno); > else > INSERT_OPERAND (0, RD, *ip, regno); Ditto. > > + if (!ok) > > + { > > + switch (*args++) > > I realise you've copied this from elsewhere, but why "++"? > The "for" loop increments "args", doesn't it? This is the same as for 'r', etc. (i.e. a register that's optional in the source if the destination is the same as the target). Otherwise code like: andi16 $7, 65535 addiu16 $31, 7 fails to assemble. The thing is once we get to "65535", we still have a "," unconsumed in args. I have rewritten it more properly though, adding a check for that "," too. > > + if (c == 'e') > > + { > > + regno = lastregno; > > + s = s_reset; > > + ++args; > > + } > > + else if (c == 't') > > + { > > + s = s_reset; > > + ++args; > > + continue; > > + } > > I don't really understand these "args" adjustments either. Likewise: subu16 $2, $3 xor16 $2, $3 > > + i = my_getSmallExpression (&imm_expr, imm_reloc, s); > > + if ((i == 0 && (imm_expr.X_op != O_constant > > + || (imm_expr.X_add_number & 3) != 0 > > + || imm_expr.X_add_number > (63 << 2) > > + || imm_expr.X_add_number < (-64 << 2))) > > + || i > 0) > > + { > > + imm_expr.X_op = O_absent; > > + break; > > + } > > + immed = imm_expr.X_add_number >> 2; > > + INSERT_OPERAND (1, IMMA, *ip, immed); > > + imm_expr.X_op = O_absent; > > + s = expr_end; > > + continue; > > Why set X_op to O_absent when rejecting this alternative? What breaks > if you leave the constant in imm_expr? I couldn't see any similar > error-handling code in this function. I believe the reason is if the offset does not fit for the purpose of this 16-bit encoding, then we'll fall back to a 32-bit one that uses offset_expr instead. So we have to mark imm_expr absent not to confuse code elsewhere (in md_assemble(), presumably). Yeah, I know in this case both should be equal, but it looks sloppy to me to use a stale value from a previous pass. And obviously you wouldn't see this case before as no standard MIPS instruction switches from imm_expr to offset_expr between encodings. That written, I have given it some thinking and decided to use local variables instead removing any references to imm_expr and thus any issue about its usage. We don't pass the results up to append_insn() from here in any case. > Also: > > if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0 > && imm_expr.X_op == O_constant > && (imm_expr.X_add_number & 3) == 0 > && imm_expr.X_add_number >= (-64 << 2) > && imm_expr.X_add_number <= (63 << 2)) > { > immed = imm_expr.X_add_number >> 2; > INSERT_OPERAND (1, IMMA, *ip, immed); > imm_expr.X_op = O_absent; > s = expr_end; > continue; > } > break; > > seems more in keeping with other my_getSmallExpression users. I disagree, see 'i'/'j', 'o', etc. The path of acceptance in almost all the case selectors of this switch statement is fall-through. Any failure breaks midway through. I have adjusted this sequence slightly though and factored out conditions around the expression as the pattern repeats on and on throughout this switch statement. This has led to quite nice code IMO. > > + i = my_getSmallExpression (&imm_expr, imm_reloc, s); > > + > > + for (immb = 0; immb < 8; immb++) > > + { > > + if (micromips_imm_b_map[immb] > > + == imm_expr.X_add_number) > > + break; > > + } > > + if ((i == 0 && (imm_expr.X_op != O_constant || immb == 8)) > > + || i > 0) > > + { > > + imm_expr.X_op = O_absent; > > + break; > > + } > > + INSERT_OPERAND (1, IMMB, *ip, immb); > > + imm_expr.X_op = O_absent; > > + s = expr_end; > > + continue; > > Here too I'd prefer something like: > > if (my_getSmallExpression (&imm_expr, imm_reloc, s) == 0 > && imm_expr.X_op == O_constant) > { > for (immb = 0; immb < 8; immb++) > if (micromips_imm_b_map[immb] > == imm_expr.X_add_number) > break; > if (immb < 8) > { > INSERT_OPERAND (1, IMMB, *ip, immb); > imm_expr.X_op = O_absent; > s = expr_end; > continue; > } > } > break; > > which has the added benefit of only using X_add_number once we've > established that it's meaningful. Similar changes in the rest > of the function. Likewise. I agree about the imm_expr's usage and have taken it into account. > > + /* If users want relax branch and don't specify to use > > + 16-bit instructions, we will not match this pattern. > > + This will lead to matching 32-bit instructions, that > > + will be relaxed later. */ > > + if (mips_relax_branch && forced_insn_length != 2) > > + break; > > This seems a bit lame. It should be easy to relax the 16-bit form > in the same way as the 32-bit form. We could use a bit in the > relaxation opcode to say whether the extra relaxation should be > enabled or not, i.e. a bit to record the relevant parts of this > condition: > > + && (pinfo & INSN_UNCOND_BRANCH_DELAY > + || pinfo & INSN_COND_BRANCH_DELAY) > + && mips_relax_branch > + /* Don't try branch relaxation within .set nomacro, or within > + .set noat if we use $at for PIC computations. If it turns > + out that the branch was out-of-range, we'll get an error. */ > + && !mips_opts.warn_about_macros > + && (mips_opts.at || mips_pic == NO_PIC) > + && mips_opts.micromips > + /* Don't try branch relaxation, when users specify 16-bit/32-bit > + instructions. */ > + && !forced_insn_length) > > No need to do that as part of this patch, but let's at least put in > a FIXME. Indeed; we have a preexisting bug here as well -- mips_opts.at may well be != ATREG. (A similar bug is present in fix_loongson2f_jump() BTW). Actually I've thought it's lame enough to implement it. In the course of which I discovered (and fixed) other three bugs, so I think it was worth the effort. Sent as a sepate patch for the same reasons as the reloc change above. > > + case 'N': /* Register list for lwm and swm. */ > > + { > > + unsigned int reg_list = 0; > > + int immed = 0; > > + unsigned int reg1 = 33; > > Why 33 rather than 32? Seems INVALID_REG could be used here for a bit > of extra readability. No idea; this piece is now gone anyway. > > + /* s0, ra > > + s0, s1, ra > > + s0, s1, s2, ra > > + s0, s1, s2, s3, ra > > + s0-s1, ra > > + s0-s2, ra > > + s0-s3, ra */ > > You also allow: > > s1, ra, s2, s0 > > (rightly IMO), so I don't think we gain much by listing the split-out ranges. > Just: > > /* s0, ra > s0-s1, ra > s0-s2, ra > s0-s3, ra */ > > would be OK. I have rewritten it adding an explanatory comment. > > + s_reset = s; > > + SKIP_SPACE_TABS (s); > > + if (*s == ',') > > + { > > + reg1 = 33; > > + ++s; > > + } > > + else if (*s == '-') > > + { > > + reg1 = regno; > > + ++s; > > + } > > + SKIP_SPACE_TABS (s); > > + ok = reg_lookup (&s, RTYPE_NUM | RTYPE_GP, ®no); > > + if (!ok) > > + { > > + s = s_reset; > > + break; > > + } > > Shouldn't we break out if *s isn't ',' or '-' and treat it as a syntax > error ("reg_list = 0; break;")? We should break out, but that's not a syntax error as far as this handler is concerned. It's up to code elsewhere to decide what the token to follow, if any, has to be based on args. This is now handled properly. > > + if (regno <= reg1) > > + { > > + reg_list = 0; > > + break; > > + } > > Add a comment saying that this is an error condition. But is there > really anything wrong with $4-$4 (regno == reg1)? The range is closed > after all. Agreed, I have now allowed it under the "be liberal what you accept" principle. > > + } > > + if (i == 0 && imm_expr.X_op == O_constant > > + && (imm_expr.X_add_number & 3) == 0 > > + && imm_expr.X_add_number >= (-4194304 << 2) > > + && imm_expr.X_add_number <= (4194303 << 2)) > > I'm ashamed to say this decimal number wasn't in my mental power-of-2 list. > Maybe a hex constant or (1 << n) would be better? Feel free to leave it > if you disagree though. I don't, actually. Offhand, the decimal value is meaningless to me too. > > + case 'n': /* Register list for 32-bit lwm and swm. */ > > + gas_assert (mips_opts.micromips); > > + { > > + unsigned int reg_list = 0; > > + int immed = 0; > > + unsigned int reg1 = 33; > > + > > This register-range code needs to be split out into a separate function. > It's the same as for 'N' above (except for the s8 handling, which would > be OK-but-redundant for 'n' too), has the same apparent bug regarding > syntax checking, and has the same questionable behaviour about > single-register ranges. Agreed. I have now reimplemented is almost from scratch. While doing it I have noticed the arguments are actually wiped of whitespace at this point, so I have removed references to SKIP_SPACE_TABS(). It looks to me the macro and its two references in mips16_ip() can be removed altogether. > > + /* s0, ra > > + s0, s1, ra > > + s0, s1, s2, ra > > + s0, s1, s2, s3, ra > > + s0, s1, s2, s3, s4, ra > > + s0, s1, s2, s3, s4, s5, ra > > + s0, s1, s2, s3, s4, s5, s6, ra > > + s0, s1, s2, s3, s4, s5, s6, s7, ra > > + s0, s1, s2, s3, s4, s5, s6, s7, s8, ra > > + ra, > > + s0-s1, ra > > + s0-s2, ra > > + s0-s3, ra > > + s0-s4, ra > > + s0-s5, ra > > + s0-s6, ra > > + s0-s7, ra > > + s0-s8, ra */ > > I'm hampered by the spec not being public yet, but it looks from the > code as though RA's actually optional when S0 is present. The comment > implies otherwise. Also: Both are optional, except at least one register has to be present and the range of static registers has to start at s0 and be contiguous. (Though as a side note I'm not sure why a single register is officially supported by the ASE for this instruction at all -- being equivalent to LD/LW/SD/SW it could well be a reserved encoding.) > > + if (reg_list == 0x00010000) > > + immed = 1; > > + else if (reg_list == 0x00030000) > > + immed = 2; > > + else if (reg_list == 0x00070000) > > + immed = 3; > > + else if (reg_list == 0x000f0000) > > + immed = 4; > > + else if (reg_list == 0x001f0000) > > + immed = 5; > > + else if (reg_list == 0x003f0000) > > + immed = 6; > > + else if (reg_list == 0x007f0000) > > + immed = 7; > > + else if (reg_list == 0x00ff0000) > > + immed = 8; > > + else if (reg_list == 0x40ff0000) > > + immed = 9; > > + else if (reg_list == 0x80000000) > > + immed = 16; > > + else if (reg_list == 0x80010000) > > + immed = 17; > > + else if (reg_list == 0x80030000) > > + immed = 18; > > + else if (reg_list == 0x80070000) > > + immed = 19; > > + else if (reg_list == 0x800f0000) > > + immed = 20; > > + else if (reg_list == 0x801f0000) > > + immed = 21; > > + else if (reg_list == 0x803f0000) > > + immed = 22; > > + else if (reg_list == 0x807f0000) > > + immed = 23; > > + else if (reg_list == 0x80ff0000) > > + immed = 24; > > + else if (reg_list == 0xc0ff0000) > > + immed = 25; > > + else > > + break; > > this could at least be simplified by testing the Sn and RA registers > separately, then rejecting immed == 0. But maybe the split-out function > could return the Sn range in a more easily digestible form. No need to. This can be easily dealt with with ffs(), benefitting hosts that have good support for this operation, such as MIPS architecture processors and their CLZ instruction :) (x86 has BSF and we care even less about any others, don't we?). > > + /* For microMIPS we need to save the value to buf + 2. */ > > + if (target_big_endian || fixP->fx_r_type == BFD_RELOC_MICROMIPS_LO16) > > buf += 2; > > /* 32-bit microMIPS instructions are divided into two 16-bit pieces. > Relocations always refer to the second piece, regardless of > endianness. */ > > or something like that. I'm sure there's a better term than "piece" here, > what does the spec call it? Halfword. > > + fragp->fr_subtype > > + = toofar ? RELAX_MICROMIPS_MARK_TOOFAR (fragp->fr_subtype) > > + : RELAX_MICROMIPS_CLEAR_TOOFAR (fragp->fr_subtype); > > Non-standard alignment for ":" > > fragp->fr_subtype = (toofar > ? RELAX_MICROMIPS_MARK_TOOFAR (fragp->fr_subtype) > : RELAX_MICROMIPS_CLEAR_TOOFAR (fragp->fr_subtype); Fixed. > > + /* 00000000 : > > + 0: 405e 0006 bgez $30,10 > > + 4: 0c00 nop > > + 6: fc3c 0002 lw $1,2($28) > > + 6: R_MIPS_GOT16 .text > > + a: 3021 0011 addiu $1,$1,17 > > + a: R_MIPS_LO16 .text > > + e: 4721 jalr $1 > > + ... > > + > > + 00020010 : > > + 20010: 0c00 nop > > + 20012: 0c00 nop > > + */ > > + > > + if (!fragp && update > 0) > > + length += 6; > > + > > + if (mips_pic != NO_PIC) > > + { > > + /* Additional space for PIC loading of target address. */ > > + length += 6; > > + } > > + > > + /* If branch is conditional. */ > > + if (fragp ? !RELAX_MICROMIPS_UNCOND (fragp->fr_subtype) : (update >= 0)) > > + length += 6; > > + } > > This really isn't written very clearly. The comment has a single > long-branch form, while the code has three if statements. Say what > you're counting in each case. The first conditional is bogus and also dead code. It looks like it was copied from relaxed_branch_length() where it is used to handle branch-likely relaxation, further adjusted towards removal and then left. I have removed it altogether now. I've cooked up some comments for the remaining cases. I decided to switch to the source notation and quoted instruction byte counts explicitly. > > + /* For microMIPS PC relative relocations, we cannot convert it to > > + against a section. If we do, it will mess up the fixp->fx_offset. */ > > if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT > > - || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY) > > + || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY > > + || fixp->fx_r_type == BFD_RELOC_MICROMIPS_7_PCREL_S1 > > + || fixp->fx_r_type == BFD_RELOC_MICROMIPS_10_PCREL_S1 > > + || fixp->fx_r_type == BFD_RELOC_MICROMIPS_16_PCREL_S1) > > "to be against a section". That's not a helpful comment though. > _How_ will it mess up fixp->fx_offset? Give the reader a clue why > the problem applies to BFD_RELOC_MICROMIPS_16_PCREL_S1 but not > to something like BFD_RELOC_16_PCREL_S2. I have failed to spot any problems with this hunk reverted and I'm not sure what I should be looking for. Therefore I feel a bit uneasy about removing it and only rephrased the comment without actually changing its meaning. Chao-ying, do you have anything to add? > > + if (RELAX_MICROMIPS_UNCOND (fragp->fr_subtype)) > > + goto uncond_micromips; > > Ugh. Either split out the code for unconditional branches into a subfunction, > or put intervening code into a: > > if (!RELAX_MICROMIPS_UNCOND (fragp->fr_subtype)) > > block. (Yes, I know the current relaxation code has the same kind of goto, > but I would have raised just the same objection there. If cut-&-paste really > is necessary, the new code should still be defendable in its own right.) Fixed. > > + buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix; > > Missing space before "fragp->fr_literal". A few other occurences. Fixed. > > + if (RELAX_MICROMIPS_LINK (fragp->fr_subtype)) > > + { > > + /* Clear the and-link bit. */ > > + gas_assert ((insn & 0xffa00000) == 0x40200000); > > + > > + /* bltzal 0x04100000 bgezal 0x04110000 */ > > + insn &= ~0x00200000; > > + } > > Excess cut-&-paste. The opcodes in the comment are from the normal MIPS > encoding, not the microMIPS one. (Wondered at first why we were clearing > a bit that, according to the comment, wasn't supposed to be set in the > first place.) Worse yet, we don't handle BGEZALS and BLTZALS correctly. Fixed that as well (and adjusted test cases to include these instructions). > > + /* How many bytes in instructions we've already emitted? */ > > + i = buf - (bfd_byte *)fragp->fr_literal - fragp->fr_fix; > > + /* How many bytes in instructions from here to the end? */ > > + i = fragp->fr_var - i; > > I don't get this. "buf" still equals "fragp->fr_literal + fragp->fr_fix", > doesn't it? We haven't emitted anything yet. Seems to me that this is > (and should be) the same as "i = fragp->fr_var". We fail to use compact branches here and rely on linker relaxation to do so. This is inferior (especially as linker relaxation is optional; it doesn't handle all the cases either), but better than nothing. It relies on the presence of relocations though, so I have rewritten this sequence to emit labels and use them as branch targets instead, getting rid of this piece you're questioning as a side effect altogether. For compact branches to be used here I think we need to add another flag to RELAX_MICROMIPS_ENCODE() so that relaxed_micromips_32bit_branch_length() can calculate the correct length (contrary to generic documentation the original opcode is not available in md_relax_frag() on the MIPS target and when we get to md_convert_frag() it's already too late for shrinking the frag. The lack of use of compact branches here does not make code produced incorrect though, so that makes it an option for future improvement and I will not work on it now. [FIXME] > > + uncond_micromips: > > + if (mips_pic == NO_PIC) > > + { > > + /* j or jal. */ > > "j(al) R_MICROMIPS_26_S1" > > to match the style of the other comments (and to give a bit more info). Adjusted as reasonable (though I fail to see a consistent style throughout this function). > > + /* lw/ld $at, ($gp) R_MIPS_GOT16 */ > > + insn = 0xfc3c0000; > > + exp.X_op = O_symbol; > > + exp.X_add_symbol = fragp->fr_symbol; > > + exp.X_add_number = fragp->fr_offset; > > Add the "ld" case or fix the comment. Also s/R_MIPS_GOT16/R_MICROMIPS_LO16/. > > > + /* d/addiu $at, $at, R_MIPS_LO16 */ > > + insn = 0x30210000; > > Likewise "daddiu". I have added the alternative encodings. Overall 64-bit support is quite rudimentary at most. > > + gas_assert (buf == (bfd_byte *)fragp->fr_literal > > + + fragp->fr_fix + fragp->fr_var); > > The "+" isn't indented far enough. There was a pair of brackets missing here actually. > > Index: binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/mips1-fp.d > > =================================================================== > > --- binutils-fsf-trunk-quilt.orig/gas/testsuite/gas/mips/mips1-fp.d 2010-12-07 00:05:05.000000000 +0000 > > +++ binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/mips1-fp.d 2010-12-07 00:14:47.000000000 +0000 > > @@ -9,4 +9,4 @@ > > [0-9a-f]+ <.*>: > > .*: 46041000 add.s \$f0,\$f2,\$f4 > > .*: 44420000 cfc1 \$2,\$0 > > -#pass > > + \.\.\. > > Index: binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/mips1-fp.s > > =================================================================== > > --- binutils-fsf-trunk-quilt.orig/gas/testsuite/gas/mips/mips1-fp.s 2010-12-07 00:05:05.000000000 +0000 > > +++ binutils-fsf-trunk-quilt/gas/testsuite/gas/mips/mips1-fp.s 2010-12-07 00:14:47.000000000 +0000 > > @@ -5,3 +5,7 @@ > > foo: > > add.s $f0,$f2,$f4 > > cfc1 $2,$0 > > + > > +# Force at least 8 (non-delay-slot) zero bytes, to make 'objdump' print ... > > + .align 2 > > + .space 8 > > Leave out this kind of change. I realise it's not the style you prefer, > but what's there now is fine. Same for: > > * gas/testsuite/gas/mips/mips32r2-fp32.d > * gas/testsuite/gas/mips/mips64.d Well, that's not merely a matter of style as #pass simply ignores any following rubbish GAS may have produced. This forces a corresponding update to gas/testsuite/gas/mips/micromips@mips1-fp.d as the results differ between Linux and bare-iron targets. I'd prefer to avoid adding new instances of #pass although I've just noticed the original change included some other too, so I've applied your suggestion reluctantly. These test cases should really be all audited and unjustified uses of #pass removed -- I realise some people have difficulties following all the details of and good ways to deal with subtleties in this area and follow the path of least resistance, but we shouldn't be encouraging this kind of behaviour. Especially as you seem to be quite picky elsewhere. ;) > > msubu $11, $12 > > mul $13, $14, $15 > > pref 4, ($16) > > + .set at > > pref 4, 32767($17) > > pref 4, -32768($18) > > + .set noat > > ssnop > > > > > > # privileged instructions > > > > cache 5, ($1) > > + .set at > > cache 5, 32767($2) > > cache 5, -32768($3) > > - .set at > > cache 5, 32768($4) > > cache 5, -32769($5) > > cache 5, 32768 > > We should really have separate noat tests for the prefs and caches > that are no longer in a noat block (a bit like you did for the > wait and sdbbp tests whose immediates have changed). > > > -#define STO_MIPS_PLT 0x8 > > +#define STO_MIPS_PLT (1 << 3) > > Don't change the definitions of the existing constants; use hex constants > for the new stuff instead. Well, STO_OPTIONAL already uses a shifted bit and I find this notation clearer. Since code is already inconsistent I have updated it not to change the existing definitions, but kept newly-added ones as shifted bitfields. I'm happy to keep code consistent, but if a piece is not, I will choose the style that suits me better, sorry. > > /* This value is used to mark PIC functions in an object that mixes > > - PIC and non-PIC. */ > > -#define STO_MIPS_PIC 0x20 > > -#define ELF_ST_IS_MIPS_PIC(OTHER) \ > > - (((OTHER) & ~ELF_ST_VISIBILITY (-1)) == STO_MIPS_PIC) > > -#define ELF_ST_SET_MIPS_PIC(OTHER) \ > > - (STO_MIPS_PIC | ELF_ST_VISIBILITY (OTHER)) > > + PIC and non-PIC. Note this bit overlaps with STO_MIPS16. */ > > +#define STO_MIPS_PIC (1 << 5) > > +#define ELF_ST_IS_MIPS_PIC(other) (((other) & STO_MIPS_FLAGS) == STO_MIPS_PIC) > > +#define ELF_ST_SET_MIPS_PIC(other) (((other) & ~STO_MIPS_FLAGS) | STO_MIPS_PIC) > > /* This value is used to mark PIC functions in an object that mixes > PIC and non-PIC. Note that this bit overlaps with STO_MIPS16, > although MIPS16 symbols are never considered to be MIPS_PIC. */ Applied. > > +/* Whether code compression (either of the MIPS16 or the microMIPS ASEs) > > + has been indicated for a .text symbol. */ > > +#define ELF_ST_IS_COMPRESSED(other) \ > > + (ELF_ST_IS_MIPS16(other) || ELF_ST_IS_MICROMIPS(other)) > > The last line is missing a space before each "(other)". Fixed. > > +/* microMIPS placeholders. */ > > Should be a bit more descriptive. E.g.: > > /* Every MICROMIPSOP_X definition requires a corresponding OP_X > definition, and vice versa. This simplifies various parts > of the operand handling in GAS. The fields below only exist in > the microMIPS encoding, so define each one to have an empty range. */ > > if indeed that's accurate. Yes, thanks. Updated INSERT_OPERAND() and EXTRACT_OPERAND() macros rely on these definitions for cases where the ISA selector is hardcoded as code has to be syntactically correct even if optimised away. > > +/* These are the bitmasks and shift counts used for the different > > + fields in the instruction formats. Other than OP, no masks are > > + provided for the fixed portions of an instruction, since they are > > + not needed. */ > > Seems like too much cut-&-paste: there isn't an OP field here. > "Other than TARGET", perhaps, unless there are other opcode masks here. This looks like copied verbatim from the MIPS16 part. The two parts are functionally equivalent and my understanding of the comment is no masks are provided for the non-operand parts of instruction. I've left the comment as is; I'm not sure what TARGET might mean in this context, please elaborate. > > +/* MIPS placeholders. */ > > /* Placeholders for fields that only exist in the traditional 32-bit > instruction encoding; see the comment above for details. */ Thanks. > > + "mg" 3-bit MIPS registers 2-7, 16, 17 (MICROMIPSOP_*_MG) at bit 0 > > + "mg" 3-bit MIPS registers 2-7, 16, 17 (MICROMIPSOP_*_MG) at bit 0 > > Doubled line. Fixed. > > - Elf_Internal_Ehdr *header; > > + Elf_Internal_Ehdr *header = elf_elfheader (info->section->owner); > > > > - header = elf_elfheader (info->section->owner); > > What's there now is fine. Adjusted. > > + else > > + iprintf (is, "UNKNOWN"); > > Excess indentation. Fixed. > > + In microMIPS, we need to match instructions (mfc0, mtc0) > > + by hand. */ > > Something like: > > The microMIPS encoding does not have a coprocessor > identifier field as such, so we must work out the > coprocessor number by looking at the opcode. */ > > might be more descriptive. OK, thanks. > > +/* Return 1 if a symbol associated with the location being disassembled > > + indicates a compressed mode, either MIPS16 or microMIPS one. Otherwise, > > + return 0. */ > > Reads more naturally to me without "one". Both MIPS16 and microMIPS are adjectives; they need a noun or a pronoun. I realise this requirement is not met everywhere, but that doesn't mean we should add new such places IMO. > > + for (i = 0; i < info->num_symbols; i++) > > + { > > + pos = info->symtab_pos + i; > > + > > + if (bfd_asymbol_flavour (info->symtab[pos]) != bfd_target_elf_flavour) > > + continue; > > + > > + symbol = (elf_symbol_type *) info->symtab[pos]; > > + if ((!micromips_ase > > + && ELF_ST_IS_MIPS16 (symbol->internal_elf_sym.st_other)) > > + || (micromips_ase > > + && ELF_ST_IS_MICROMIPS (symbol->internal_elf_sym.st_other))) > > + return 1; > > + } > > Why is a search necessary here, when the previous code was happy to > look only at the first symbol? I'm not saying the code is wrong, > but a bit of commentary would be good. My feeling is previous code was not "happy", but simply untested (or to be more accurate, not tested satisfactorily). Symbols sharing the same address are sorted alphabetically here which becomes a problem when they include both objects and functions (or symbols derived from standard MIPS functions defined elsewhere). Disassembly shouldn't yield different results based merely on the names of symbols chosen and given the semantics of the compressed annotation (it is only added to a function symbol if a genuine instruction has been emitted following immediately in the source code) I think it should take precedence, so we check if any symbol has one. Perhaps we should only check function symbols in case st_other is overloaded for object symbols, but I think that would be overengineering. Whoever adds any overlapping flags should be required to audit existing code; that shouldn't be too difficult to do. > What problem is the ld-lib.exp change fixing? Currently you can't build the same source file multiple times with different flags. See ld/testsuite/ld-mips-elf/mips16-and-micromips.d for a use case (and try it with the ld-lib.exp piece reverted). I think the framework shouldn't be limiting the developer like this and making a copy of the source to work around the limitation sounds to me like the wrong direction to go. I made several adjustments and bug fixes as I saw fit on my own too and for documentation purposes included a commented out microMIPS64 48-bit LI instruction that takes a 32-bit signed immediate argument. While support for 64-bit microMIPS is only rudimentary and I don't plan to work on any improvement at the moment long-term we need to think about how to handle this instruction; the most straightforward approach would be to reliably extend match/mask to 64 bits. Our 64-bit integer type support on 32-bit hosts seem to be lacking though and there are several places throughout GAS where such values are truncated. It would increase the amount of space taken by opcode tables noticeably on 32-bit hosts too (but we already waste a lot of space by using a "long" type on 64-bit hosts where unnecessary). What fits best here are ISO C9x types -- do you happen to know if binutils maintainers ever plan to deploy them? We've been using autoconf since the beginning of time and it has straightforward ways to define replacement types of a required width and target code frequently operates on quantities that have a predefined width so making use of fixed-width types seems natural. I have made several obvious changes to the original diff to address modifications made to repository that are not included here as they were required for the patch to apply at all after a tree update in the first place. All of them were mechanical; most notably INSN2_* have been renumbered according to additional flag consumption. As mentioned earlier, we're running out of these flags now. Finally, for a reference, I'm including updated ChangeLogs. They refer to the whole set of changes combined as the updates are not meant to be committed separately. None of the separate bug fixes mentioned throughout are covered though; I'll be sending them with their corresponding entries and descriptions on their own shortly. Maciej binutils-20110221-umips-fix.diff binutils-20110221-umips-relax16.diff binutils-20110221-umips-fix-reloc.diff [Patches attached compressed due to their size.] bfd/ 2011-02-21 Chao-ying Fu Ilie Garbacea Maciej W. Rozycki Joseph Myers Catherine Moore * archures.c (bfd_mach_mips_micromips): New macro. * cpu-mips.c (I_micromips): New enum value. (arch_info_struct): Add bfd_mach_mips_micromips. * elfxx-mips.h (_bfd_mips_elf_is_target_special_symbol): New prototype. (_bfd_mips_elf_relax_section): Likewise. (_bfd_mips16_elf_reloc_unshuffle): Rename to... (_bfd_mips_elf_reloc_unshuffle): ... this. Handle microMIPS ASE. (_bfd_mips16_elf_reloc_shuffle): Rename to... (_bfd_mips_elf_reloc_shuffle): ... this. Handle microMIPS ASE. (gprel16_reloc_p): Handle microMIPS ASE. (literal_reloc_p): New function. * elf32-mips.c (elf_micromips_howto_table_rel): New variable. (_bfd_mips_elf32_gprel16_reloc): Handle microMIPS ASE. (mips16_gprel_reloc): Update for _bfd_mips_elf_reloc_unshuffle and _bfd_mips_elf_reloc_shuffle changes. (mips_elf_gprel32_reloc): Update comment. (micromips_reloc_map): New variable. (bfd_elf32_bfd_reloc_type_lookup): Handle microMIPS ASE. (mips_elf32_rtype_to_howto): Likewise. (mips_info_to_howto_rel): Likewise. (bfd_elf32_bfd_is_target_special_symbol): Define. (bfd_elf32_bfd_relax_section): Likewise. * elf64-mips.c (micromips_elf64_howto_table_rel): New variable. (micromips_elf64_howto_table_rela): Likewise. (mips16_gprel_reloc): Update for _bfd_mips_elf_reloc_unshuffle and _bfd_mips_elf_reloc_shuffle changes. (micromips_reloc_map): Likewise. (bfd_elf64_bfd_reloc_type_lookup): Handle microMIPS ASE. (bfd_elf64_bfd_reloc_name_lookup): Likewise. (mips_elf64_rtype_to_howto): Likewise. (bfd_elf64_bfd_is_target_special_symbol): Define. * elfn32-mips.c (elf_micromips_howto_table_rel): New variable. (elf_micromips_howto_table_rela): Likewise. (mips16_gprel_reloc): Update for _bfd_mips_elf_reloc_unshuffle and _bfd_mips_elf_reloc_shuffle changes. (micromips_reloc_map): Likewise. (bfd_elf32_bfd_reloc_type_lookup): Handle microMIPS ASE. (bfd_elf32_bfd_reloc_name_lookup): Likewise. (mips_elf_n32_rtype_to_howto): Likewise. (bfd_elf32_bfd_is_target_special_symbol): Define. * elfxx-mips.c (LA25_LUI_MICROMIPS_1): New macro. (LA25_LUI_MICROMIPS_2): Likewise. (LA25_J_MICROMIPS_1, LA25_J_MICROMIPS_2): Likewise. (LA25_ADDIU_MICROMIPS_1, LA25_ADDIU_MICROMIPS_2): Likewise. (TLS_RELOC_P): Handle microMIPS ASE. (mips_elf_create_stub_symbol): Adjust value of stub symbol if target is a microMIPS function. (micromips_reloc_p): New function. (micromips_reloc_shuffle_p): Likewise. (got16_reloc_p, call16_reloc_p): Handle microMIPS ASE. (got_disp_reloc_p, got_page_reloc_p): New functions. (got_ofst_reloc_p): Likewise. (got_hi16_reloc_p, got_lo16_reloc_p): Likewise. (call_hi16_reloc_p, call_lo16_reloc_p): Likewise. (hi16_reloc_p, lo16_reloc_p, jal_reloc_p): Handle microMIPS ASE. (micromips_branch_reloc_p): New function. (tls_gd_reloc_p, tls_ldm_reloc_p): Likewise. (tls_gottprel_reloc_p): Likewise. (_bfd_mips16_elf_reloc_unshuffle): Rename to... (_bfd_mips_elf_reloc_unshuffle): ... this. Handle microMIPS ASE. (_bfd_mips16_elf_reloc_shuffle): Rename to... (_bfd_mips_elf_reloc_shuffle): ... this. Handle microMIPS ASE. (_bfd_mips_elf_lo16_reloc): Handle microMIPS ASE. (mips_tls_got_index, mips_elf_got_page): Likewise. (mips_elf_create_local_got_entry): Likewise. (mips_elf_relocation_needs_la25_stub): Likewise. (mips_elf_calculate_relocation): Likewise. (mips_elf_perform_relocation): Likewise. (_bfd_mips_elf_symbol_processing): Likewise. (_bfd_mips_elf_add_symbol_hook): Likewise. (_bfd_mips_elf_link_output_symbol_hook): Likewise. (mips_elf_add_lo16_rel_addend): Likewise. (_bfd_mips_elf_check_relocs): Likewise. (mips_elf_adjust_addend): Likewise. (_bfd_mips_elf_relocate_section): Likewise. (mips_elf_create_la25_stub): Likewise. (_bfd_mips_vxworks_finish_dynamic_symbol): Likewise. (_bfd_mips_elf_gc_sweep_hook): Likewise. (_bfd_mips_elf_is_target_special_symbol): New function. (mips_elf_relax_delete_bytes): Likewise. (opcode_descriptor): New structure. (RA): New macro. (OP32_SREG, OP32_TREG, OP16_VALID_REG): Likewise. (b_insns_32, bc_insn_32, bz_insn_32, bzal_insn_32): New variables. (beq_insn_32): Likewise. (b_insn_16, bz_insn_16): New variables. (BZC32_REG_FIELD): New macro. (bz_rs_insns_32, bz_rt_insns_32): New variables. (bzc_insns_32, bz_insns_16):Likewise. (BZ16_REG, BZ16_REG_FIELD): New macros. (jal_insn_32_bd16, jal_insn_32_bd32): New variables. (jal_x_insn_32_bd32): Likewise. (j_insn_32, jalr_insn_32): Likewise. (ds_insns_32_bd16, ds_insns_32_bd32): Likewise. (jalr_insn_16_bd16, jalr_insn_16_bd32, jr_insn_16): Likewise. (JR16_REG): New macro. (ds_insns_16_bd16): New variable. (lui_insn): Likewise. (addiu_insn, addiupc_insn): Likewise. (ADDIUPC_REG_FIELD): New macro. (MOVE32_RD, MOVE32_RS): Likewise. (MOVE16_RD_FIELD, MOVE16_RS_FIELD): Likewise. (move_insns_32, move_insns_16): New variables. (nop_insn_32, nop_insn_16): Likewise. (MATCH): New macro. (find_match): New function. (check_br16_dslot, check_br32_dslot): Likewise. (check_br16, check_br32): Likewise. (IS_BITSIZE): New macro. (_bfd_mips_elf_relax_section): New function. (_bfd_mips_elf_merge_private_bfd_data): Disallow linking MIPS16 and microMIPS modules together. (_bfd_mips_elf_print_private_bfd_data): Handle microMIPS ASE. * reloc.c (BFD_RELOC_MICROMIPS_7_PCREL_S1): New relocation. (BFD_RELOC_MICROMIPS_10_PCREL_S1): Likewise. (BFD_RELOC_MICROMIPS_16_PCREL_S1): Likewise. (BFD_RELOC_MICROMIPS_GPREL16): Likewise. (BFD_RELOC_MICROMIPS_JMP, BFD_RELOC_MICROMIPS_HI16): Likewise. (BFD_RELOC_MICROMIPS_HI16_S): Likewise. (BFD_RELOC_MICROMIPS_LO16): Likewise. (BFD_RELOC_MICROMIPS_LITERAL): Likewise. (BFD_RELOC_MICROMIPS_GOT16): Likewise. (BFD_RELOC_MICROMIPS_CALL16): Likewise. (BFD_RELOC_MICROMIPS_GOT_HI16): Likewise. (BFD_RELOC_MICROMIPS_GOT_LO16): Likewise. (BFD_RELOC_MICROMIPS_CALL_HI16): Likewise. (BFD_RELOC_MICROMIPS_CALL_LO16): Likewise. (BFD_RELOC_MICROMIPS_SUB): Likewise. (BFD_RELOC_MICROMIPS_GOT_PAGE): Likewise. (BFD_RELOC_MICROMIPS_GOT_OFST): Likewise. (BFD_RELOC_MICROMIPS_GOT_DISP): Likewise. (BFD_RELOC_MICROMIPS_HIGHEST): Likewise. (BFD_RELOC_MICROMIPS_HIGHER): Likewise. (BFD_RELOC_MICROMIPS_SCN_DISP): Likewise. (BFD_RELOC_MICROMIPS_JALR): Likewise. (BFD_RELOC_MICROMIPS_TLS_GD): Likewise. (BFD_RELOC_MICROMIPS_TLS_LDM): Likewise. (BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16): Likewise. (BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16): Likewise. (BFD_RELOC_MICROMIPS_TLS_GOTTPREL): Likewise. (BFD_RELOC_MICROMIPS_TLS_TPREL_HI16): Likewise. (BFD_RELOC_MICROMIPS_TLS_TPREL_LO16): Likewise. * bfd-in2.h: Regenerate. * libbfd.h: Regenerate. binutils/ 2011-02-21 Chao-ying Fu Maciej W. Rozycki * readelf.c (get_machine_flags): Handle microMIPS ASE. (get_mips_symbol_other): Likewise. gas/ 2011-02-21 Maciej W. Rozycki Chao-ying Fu * config/tc-mips.h (mips_segment_info): Add one bit for microMIPS. (TC_LABEL_IS_LOCAL): New macro. (mips_label_is_local): New prototype. * config/tc-mips.c (S0, S7): New macros. (emit_branch_likely_macro): New variable. (mips_set_options): Add micromips. (mips_opts): Initialise micromips to -1. (file_ase_micromips): New variable. (CPU_HAS_MICROMIPS): New macro. (hilo_interlocks): Set for microMIPS too. (gpr_interlocks): Likewise. (cop_interlocks): Likewise. (cop_mem_interlocks): Likewise. (HAVE_CODE_COMPRESSION): New macro. (micromips_op_hash): New variable. (micromips_nop16_insn, micromips_nop32_insn): New variables. (NOP_INSN): Handle microMIPS ASE. (mips32_to_micromips_reg_b_map): New macro. (mips32_to_micromips_reg_c_map): Likewise. (mips32_to_micromips_reg_d_map): Likewise. (mips32_to_micromips_reg_e_map): Likewise. (mips32_to_micromips_reg_f_map): Likewise. (mips32_to_micromips_reg_g_map): Likewise. (mips32_to_micromips_reg_l_map): Likewise. (mips32_to_micromips_reg_n_map): Likewise. (mips32_to_micromips_reg_h_map): New variable. (mips32_to_micromips_reg_m_map): Likewise. (mips32_to_micromips_reg_q_map): Likewise. (micromips_to_32_reg_h_map): New variable. (micromips_to_32_reg_i_map): Likewise. (micromips_to_32_reg_m_map): Likewise. (micromips_to_32_reg_q_map): Likewise. (micromips_to_32_reg_b_map): New macro. (micromips_to_32_reg_c_map): Likewise. (micromips_to_32_reg_d_map): Likewise. (micromips_to_32_reg_e_map): Likewise. (micromips_to_32_reg_f_map): Likewise. (micromips_to_32_reg_g_map): Likewise. (micromips_to_32_reg_l_map): Likewise. (micromips_to_32_reg_n_map): Likewise. (micromips_imm_b_map, micromips_imm_c_map): New macros. (RELAX_DELAY_SLOT_16BIT): New macro. (RELAX_DELAY_SLOT_SIZE_FIRST): Likewise. (RELAX_DELAY_SLOT_SIZE_SECOND): Likewise. (RELAX_MICROMIPS_ENCODE, RELAX_MICROMIPS_P): New macros. (RELAX_MICROMIPS_TYPE, RELAX_MICROMIPS_AT): Likewise. (RELAX_MICROMIPS_U16BIT, RELAX_MICROMIPS_UNCOND): Likewise. (RELAX_MICROMIPS_COMPACT, RELAX_MICROMIPS_LINK): Likewise. (RELAX_MICROMIPS_RELAX32, RELAX_MICROMIPS_TOOFAR16): Likewise. (RELAX_MICROMIPS_MARK_TOOFAR16): Likewise. (RELAX_MICROMIPS_CLEAR_TOOFAR16): Likewise. (RELAX_MICROMIPS_TOOFAR32): Likewise. (RELAX_MICROMIPS_MARK_TOOFAR32): Likewise. (RELAX_MICROMIPS_CLEAR_TOOFAR32): Likewise. (INSERT_OPERAND, EXTRACT_OPERAND): Handle microMIPS ASE. (mips_macro_warning): Add delay_slot_16bit_p, delay_slot_32bit_p, fsize and insns. (mips_mark_labels): New function. (mips16_small, mips16_ext): Remove variables, replacing with... (forced_insn_size): ... this. (append_insn, mips16_ip): Update accordingly. (micromips_insn_length): New function. (insn_length): Return the length of microMIPS instructions. (mips_record_mips16_mode): Rename to... (mips_record_compressed_mode): ... this. Handle microMIPS ASE. (install_insn): Handle microMIPS ASE. (reglist_lookup): New function. (is_size_valid, is_delay_slot_valid): Likewise. (md_begin): Handle microMIPS ASE. (md_assemble): Likewise. Update for append_insn interface change. (micromips_reloc_p): New function. (got16_reloc_p): Handle microMIPS ASE. (hi16_reloc_p): Likewise. (lo16_reloc_p): Likewise. (matching_lo_reloc): Likewise. (insn_uses_reg, reg_needs_delay): Likewise. (mips_move_labels): Likewise. (mips16_mark_labels): Rename to... (mips_compressed_mark_labels): ... this. Handle microMIPS ASE. (insns_between, nops_for_vr4130, nops_for_insn): Likewise. (fix_loongson2f_nop, fix_loongson2f_jump): Likewise. (MICROMIPS_LABEL_CHAR): New macro. (micromips_target_label, micromips_target_name): New variables. (micromips_label_name, micromips_label_expr): New functions. (micromips_label_inc, micromips_add_label): Likewise. (mips_label_is_local): Likewise. (micromips_map_reloc): Likewise. (append_insn): Add expansionp argument. Handle microMIPS ASE. (start_noreorder, end_noreorder): Handle microMIPS ASE. (macro_start, macro_warning, macro_end): Likewise. (brk_fmt, cop12_fmt, jalr_fmt, lui_fmt): New variables. (mem12_fmt, mfhl_fmt, shft_fmt, trap_fmt): Likewise. (BRK_FMT, COP12_FMT, JALR_FMT, LUI_FMT): New macros. (MEM12_FMT, MFHL_FMT, SHFT_FMT, TRAP_FMT): Likewise. (macro_build): Handle microMIPS ASE. Update for append_insn interface change. (mips16_macro_build): Update for append_insn interface change. (macro_build_jalr): Handle microMIPS ASE. (macro_build_lui): Likewise. Simplify. (load_register): Handle microMIPS ASE. (load_address): Likewise. (move_register): Likewise. (macro_build_branch_likely): New function. (macro_build_branch_ccl): Likewise. (macro_build_branch_rs): Likewise. (macro_build_branch_rsrt): Likewise. (macro): Handle microMIPS ASE. (validate_micromips_insn): New function. (expr_const_in_range): Likewise. (mips_ip): Handle microMIPS ASE. (options): Add OPTION_MICROMIPS and OPTION_NO_MICROMIPS. (md_longopts): Add mmicromips and mno-micromips. (md_parse_option): Handle OPTION_MICROMIPS and OPTION_NO_MICROMIPS. (mips_after_parse_args): Handle microMIPS ASE. (md_pcrel_from): Handle microMIPS relocations. (mips_force_relocation): Likewise. (md_apply_fix): Likewise. (mips_align): Handle microMIPS ASE. (s_mipsset): Likewise. (s_cpload, s_cpsetup, s_cpreturn): Use relocation wrappers. (s_dtprel_internal): Likewise. (s_gpword, s_gpdword): Likewise. (s_insn): Handle microMIPS ASE. (s_mips_stab): Likewise. (relaxed_micromips_32bit_branch_length): New function. (relaxed_micromips_16bit_branch_length): New function. (md_estimate_size_before_relax): Handle microMIPS ASE. (mips_fix_adjustable): Likewise. (tc_gen_reloc): Handle microMIPS relocations. (mips_relax_frag): Handle microMIPS ASE. (md_convert_frag): Likewise. (mips_frob_file_after_relocs): Likewise. (mips_elf_final_processing): Likewise. (mips_nop_opcode): Likewise. (mips_handle_align): Likewise. (md_show_usage): Handle microMIPS options. * symbols.c (TC_LABEL_IS_LOCAL): New macro. (S_IS_LOCAL): Add a TC_LABEL_IS_LOCAL check. * doc/as.texinfo (Target MIPS options): Add -mmicromips and -mno-micromips. (-mmicromips, -mno-micromips): New options. * doc/c-mips.texi (-mmicromips, -mno-micromips): New options. (MIPS ISA): Document .set micromips and .set nomicromips. (MIPS insn): Update for microMIPS support. gas/testsuite/ 2011-02-21 Maciej W. Rozycki Chao-ying Fu * gas/mips/micromips.d: New test. * gas/mips/micromips-branch-delay.d: Likewise. * gas/mips/micromips-branch-relax.d: Likewise. * gas/mips/micromips-branch-relax-pic.d: Likewise. * gas/mips/micromips-size-1.d: Likewise. * gas/mips/micromips-trap.d: Likewise. * gas/mips/micromips.l: New stderr output. * gas/mips/micromips-branch-delay.l: Likewise. * gas/mips/micromips-branch-relax.l: Likewise. * gas/mips/micromips-branch-relax-pic.l: Likewise. * gas/mips/micromips-size-0.l: New list test. * gas/mips/micromips-size-1.l: New stderr output. * gas/mips/micromips.s: New test source. * gas/mips/micromips-branch-delay.s: Likewise. * gas/mips/micromips-branch-relax.s: Likewise. * gas/mips/micromips-size-0.s: Likewise. * gas/mips/micromips-size-1.s: Likewise. * gas/mips/mips.exp: Run the new tests. * gas/mips/elf_ase_micromips.d: New test. * gas/mips/elf_ase_micromips-2.d: Likewise. * gas/mips/micromips@abs.d: Likewise. * gas/mips/micromips@add.d: Likewise. * gas/mips/micromips@and.d: Likewise. * gas/mips/micromips@beq.d: Likewise. * gas/mips/micromips@bge.d: Likewise. * gas/mips/micromips@bgeu.d: Likewise. * gas/mips/micromips@blt.d: Likewise. * gas/mips/micromips@bltu.d: Likewise. * gas/mips/micromips@branch-likely.d: Likewise. * gas/mips/micromips@branch-misc-1.d: Likewise. * gas/mips/micromips@branch-misc-2-64.d: Likewise. * gas/mips/micromips@branch-misc-2.d: Likewise. * gas/mips/micromips@branch-misc-2pic-64.d: Likewise. * gas/mips/micromips@branch-misc-2pic.d: Likewise. * gas/mips/micromips@branch-self.d: Likewise. * gas/mips/micromips@cache.d: Likewise. * gas/mips/micromips@daddi.d: Likewise. * gas/mips/micromips@dli.d: Likewise. * gas/mips/micromips@elf-jal.d: Likewise. * gas/mips/micromips@elf-rel2.d: Likewise. * gas/mips/micromips@elf-rel4.d: Likewise. * gas/mips/micromips@jal-svr4pic.d: Likewise. * gas/mips/micromips@jal-svr4pic-noreorder.d: Likewise. * gas/mips/micromips@lb-svr4pic-ilocks.d: Likewise. * gas/mips/micromips@li.d: Likewise. * gas/mips/micromips@mips1-fp.d: Likewise. * gas/mips/micromips@mips32-cp2.d: Likewise. * gas/mips/micromips@mips32-imm.d: Likewise. * gas/mips/micromips@mips32-sf32.d: Likewise. * gas/mips/micromips@mips32.d: Likewise. * gas/mips/micromips@mips32r2-cp2.d: Likewise. * gas/mips/micromips@mips32r2-fp32.d: Likewise. * gas/mips/micromips@mips32r2.d: Likewise. * gas/mips/micromips@mips4-branch-likely.d: Likewise. * gas/mips/micromips@mips4-fp.d: Likewise. * gas/mips/micromips@mips4.d: Likewise. * gas/mips/micromips@mips5.d: Likewise. * gas/mips/micromips@mips64-cp2.d: Likewise. * gas/mips/micromips@mips64.d: Likewise. * gas/mips/micromips@mips64r2.d: Likewise. * gas/mips/micromips@pref.d: Likewise. * gas/mips/micromips@rol-hw.d: Likewise. * gas/mips/micromips@uld2-eb.d: Likewise. * gas/mips/micromips@uld2-el.d: Likewise. * gas/mips/micromips@ulh2-eb.d: Likewise. * gas/mips/micromips@ulh2-el.d: Likewise. * gas/mips/micromips@ulw2-eb-ilocks.d: Likewise. * gas/mips/micromips@ulw2-el-ilocks.d: Likewise. * gas/mips/cache.d: Likewise. * gas/mips/daddi.d: Likewise. * gas/mips/mips32-imm.d: Likewise. * gas/mips/pref.d: Likewise. * gas/mips/elf-rel27.d: Handle microMIPS ASE. * gas/mips/l_d.d: Likewise. * gas/mips/l_d-n32.d: Likewise. * gas/mips/l_d-n64.d: Likewise. * gas/mips/ld.d: Likewise. * gas/mips/ld-n32.d: Likewise. * gas/mips/ld-n64.d: Likewise. * gas/mips/s_d.d: Likewise. * gas/mips/s_d-n32.d: Likewise. * gas/mips/s_d-n64.d: Likewise. * gas/mips/sd.d: Likewise. * gas/mips/sd-n32.d: Likewise. * gas/mips/sd-n64.d: Likewise. * gas/mips/mips32.d: Update immediates. * gas/mips/micromips@mips32-cp2.s: New test source. * gas/mips/micromips@mips32-imm.s: Likewise. * gas/mips/micromips@mips32r2-cp2.s: Likewise. * gas/mips/micromips@mips64-cp2.s: Likewise. * gas/mips/cache.s: Likewise. * gas/mips/daddi.s: Likewise. * gas/mips/mips32-imm.s: Likewise. * gas/mips/elf-rel4.s: Handle microMIPS ASE. * gas/mips/lb-pic.s: Likewise. * gas/mips/ld.s: Likewise. * gas/mips/mips32.s: Likewise. * gas/mips/mips.exp: Add the micromips arch. Exclude mips16e from micromips. Run mips32-imm. * gas/mips/jal-mask-11.d: New test. * gas/mips/jal-mask-12.d: Likewise. * gas/mips/micromips@jal-mask-11.d: Likewise. * gas/mips/jal-mask-1.s: Source for the new tests. * gas/mips/jal-mask-21.d: New test. * gas/mips/jal-mask-22.d: Likewise. * gas/mips/micromips@jal-mask-12.d: Likewise. * gas/mips/jal-mask-2.s: Source for the new tests. * gas/mips/mips.exp: Run the new tests. * gas/mips/mips16-e.d: Add --special-syms to `objdump'. * gas/mips/tmips16-e.d: Likewise. * gas/mips/and.s: Adjust padding. * gas/mips/beq.s: Likewise. * gas/mips/bge.s: Likewise. * gas/mips/bgeu.s: Likewise. * gas/mips/blt.s: Likewise. * gas/mips/bltu.s: Likewise. * gas/mips/branch-misc-2.s: Likewise. * gas/mips/jal.s: Likewise. * gas/mips/li.s: Likewise. * gas/mips/mips1-fp.s: Likewise. * gas/mips/mips32r2-fp32.s: Likewise. * gas/mips/mips64.s: Likewise. * gas/mips/mips4.s: Likewise. * gas/mips/mips4-fp.s: Likewise. * gas/mips/and.d: Update accordingly. * gas/mips/elf-jal.d: Likewise. * gas/mips/jal.d: Likewise. * gas/mips/li.d: Likewise. * gas/mips/mips1-fp.d: Likewise. * gas/mips/mips32r2-fp32.d: Likewise. * gas/mips/mips64.d: Likewise. include/elf/ 2011-02-21 Chao-ying Fu Maciej W. Rozycki * mips.h (R_MICROMIPS_min): New relocations. (R_MICROMIPS_26_S1): Likewise. (R_MICROMIPS_HI16, R_MICROMIPS_LO16): Likewise. (R_MICROMIPS_GPREL16, R_MICROMIPS_LITERAL): Likewise. (R_MICROMIPS_GOT16, R_MICROMIPS_PC7_S1): Likewise. (R_MICROMIPS_PC10_S1, R_MICROMIPS_PC16_S1): Likewise. (R_MICROMIPS_CALL16, R_MICROMIPS_GOT_DISP): Likewise. (R_MICROMIPS_GOT_PAGE, R_MICROMIPS_GOT_OFST): Likewise. (R_MICROMIPS_GOT_HI16, R_MICROMIPS_GOT_LO16): Likewise. (R_MICROMIPS_SUB, R_MICROMIPS_HIGHER): Likewise. (R_MICROMIPS_HIGHEST, R_MICROMIPS_CALL_HI16): Likewise. (R_MICROMIPS_CALL_LO16, R_MICROMIPS_SCN_DISP): Likewise. (R_MICROMIPS_JALR, R_MICROMIPS_HI0_LO16): Likewise. (R_MICROMIPS_TLS_GD, R_MICROMIPS_TLS_LDM): Likewise. (R_MICROMIPS_TLS_DTPREL_HI, R_MICROMIPS_TLS_DTPREL_LO): Likewise. (R_MICROMIPS_TLS_GOTTPREL): Likewise. (R_MICROMIPS_TLS_TPREL_HI16): Likewise. (R_MICROMIPS_TLS_TPREL_LO16): Likewise. (R_MICROMIPS_GPREL7_S2, R_MICROMIPS_PC23_S2): Likewise. (R_MICROMIPS_max): Likewise. (EF_MIPS_ARCH_ASE_MICROMIPS): New macro. (STO_MIPS_ISA, STO_MIPS_FLAGS): Likewise. (ELF_ST_IS_MIPS_PLT, ELF_ST_SET_MIPS_PLT): Likewise. (STO_MICROMIPS): Likewise. (ELF_ST_IS_MICROMIPS, ELF_ST_SET_MICROMIPS): Likewise. (ELF_ST_IS_COMPRESSED): Likewise. (STO_MIPS_PLT, STO_MIPS_PIC): Rework. (ELF_ST_IS_MIPS_PIC, ELF_ST_SET_MIPS_PIC): Likewise. (STO_MIPS16, ELF_ST_IS_MIPS16, ELF_ST_SET_MIPS16): Likewise. include/opcode/ 2011-02-21 Chao-ying Fu Maciej W. Rozycki * mips.h (OP_MASK_EXTLSB, OP_SH_EXTLSB): New macros. (OP_MASK_STYPE, OP_SH_STYPE): Likewise. (OP_MASK_CODE10, OP_SH_CODE10): Likewise. (OP_MASK_TRAP, OP_SH_TRAP): Likewise. (OP_MASK_OFFSET12, OP_SH_OFFSET12): Likewise. (OP_MASK_OFFSET10, OP_SH_OFFSET10): Likewise. (OP_MASK_RS3, OP_SH_RS3): Likewise. (OP_MASK_MB, OP_SH_MB, OP_MASK_MC, OP_SH_MC): Likewise. (OP_MASK_MD, OP_SH_MD, OP_MASK_ME, OP_SH_ME): Likewise. (OP_MASK_MF, OP_SH_MF, OP_MASK_MG, OP_SH_MG): Likewise. (OP_MASK_MJ, OP_SH_MJ, OP_MASK_ML, OP_SH_ML): Likewise. (OP_MASK_MP, OP_SH_MP, OP_MASK_MQ, OP_SH_MQ): Likewise. (OP_MASK_IMMA, OP_SH_IMMA, OP_MASK_IMMB, OP_SH_IMMB): Likewise. (OP_MASK_IMMC, OP_SH_IMMC, OP_MASK_IMMF, OP_SH_IMMF): Likewise. (OP_MASK_IMMG, OP_SH_IMMG, OP_MASK_IMMH, OP_SH_IMMH): Likewise. (OP_MASK_IMMI, OP_SH_IMMI, OP_MASK_IMMJ, OP_SH_IMMJ): Likewise. (OP_MASK_IMML, OP_SH_IMML, OP_MASK_IMMM, OP_SH_IMMM): Likewise. (OP_MASK_IMMN, OP_SH_IMMN, OP_MASK_IMMO, OP_SH_IMMO): Likewise. (OP_MASK_IMMP, OP_SH_IMMP, OP_MASK_IMMQ, OP_SH_IMMQ): Likewise. (OP_MASK_IMMU, OP_SH_IMMU, OP_MASK_IMMW, OP_SH_IMMW): Likewise. (OP_MASK_IMMX, OP_SH_IMMX, OP_MASK_IMMY, OP_SH_IMMY): Likewise. (INSN2_BRANCH_DELAY_16BIT, INSN2_BRANCH_DELAY_32BIT): New macros. (INSN2_WRITE_GPR_S, INSN2_READ_FPR_D): Likewise. (INSN2_MOD_GPR_MB, INSN2_MOD_GPR_MC, INSN2_MOD_GPR_MD): Likewise. (INSN2_MOD_GPR_ME, INSN2_MOD_GPR_MF, INSN2_MOD_GPR_MG): Likewise. (INSN2_MOD_GPR_MJ, INSN2_MOD_GPR_MP, INSN2_MOD_GPR_MQ): Likewise. (INSN2_MOD_SP, INSN2_READ_GPR_31): Likewise. (INSN2_READ_GP, INSN2_READ_PC): Likewise. (CPU_MICROMIPS): New macro. (M_BC1FL, M_BC1TL, M_BC2FL, M_BC2TL): New enum values. (M_BEQL, M_BGEZ, M_BGEZL, M_BGEZALL, M_BGTZ, M_BGTZL): Likewise. (M_BLEZ, M_BLEZL, M_BLTZ, M_BLTZL, M_BLTZALL, M_BNEL): Likewise. (M_CACHE_OB, M_JALS_1, M_JALS_2, M_JALS_A): Likewise. (M_LDC2_OB, M_LDL_OB, M_LDM_AB, M_LDM_OB): Likewise. (M_LDP_AB, M_LDP_OB, M_LDR_OB, M_LL_OB, M_LLD_OB): Likewise. (M_LWC2_OB, M_LWL_OB, M_LWM_AB, M_LWM_OB): Likewise. (M_LWP_AB, M_LWP_OB, M_LWR_OB): Likewise. (M_LWU_OB, M_PREF_OB, M_SC_OB, M_SCD_OB): Likewise. (M_SDC2_OB, M_SDL_OB, M_SDM_AB, M_SDM_OB): Likewise. (M_SDP_AB, M_SDP_OB, M_SDR_OB): Likewise. (M_SWC2_OB, M_SWL_OB, M_SWM_AB, M_SWM_OB): Likewise. (M_SWP_AB, M_SWP_OB, M_SWR_OB): Likewise. (MICROMIPSOP_MASK_MAJOR, MICROMIPSOP_SH_MAJOR): New macros. (MICROMIPSOP_MASK_IMMEDIATE, MICROMIPSOP_SH_IMMEDIATE): Likewise. (MICROMIPSOP_MASK_DELTA, MICROMIPSOP_SH_DELTA): Likewise. (MICROMIPSOP_MASK_CODE10, MICROMIPSOP_SH_CODE10): Likewise. (MICROMIPSOP_MASK_TRAP, MICROMIPSOP_SH_TRAP): Likewise. (MICROMIPSOP_MASK_SHAMT, MICROMIPSOP_SH_SHAMT): Likewise. (MICROMIPSOP_MASK_TARGET, MICROMIPSOP_SH_TARGET): Likewise. (MICROMIPSOP_MASK_EXTLSB, MICROMIPSOP_SH_EXTLSB): Likewise. (MICROMIPSOP_MASK_EXTMSBD, MICROMIPSOP_SH_EXTMSBD): Likewise. (MICROMIPSOP_MASK_INSMSB, MICROMIPSOP_SH_INSMSB): Likewise. (MICROMIPSOP_MASK_CODE, MICROMIPSOP_SH_CODE): Likewise. (MICROMIPSOP_MASK_CODE2, MICROMIPSOP_SH_CODE2): Likewise. (MICROMIPSOP_MASK_CACHE, MICROMIPSOP_SH_CACHE): Likewise. (MICROMIPSOP_MASK_SEL, MICROMIPSOP_SH_SEL): Likewise. (MICROMIPSOP_MASK_OFFSET12, MICROMIPSOP_SH_OFFSET12): Likewise. (MICROMIPSOP_MASK_3BITPOS, MICROMIPSOP_SH_3BITPOS): Likewise. (MICROMIPSOP_MASK_STYPE, MICROMIPSOP_SH_STYPE): Likewise. (MICROMIPSOP_MASK_OFFSET10, MICROMIPSOP_SH_OFFSET10): Likewise. (MICROMIPSOP_MASK_RS, MICROMIPSOP_SH_RS): Likewise. (MICROMIPSOP_MASK_RT, MICROMIPSOP_SH_RT): Likewise. (MICROMIPSOP_MASK_RD, MICROMIPSOP_SH_RD): Likewise. (MICROMIPSOP_MASK_FS, MICROMIPSOP_SH_FS): Likewise. (MICROMIPSOP_MASK_FT, MICROMIPSOP_SH_FT): Likewise. (MICROMIPSOP_MASK_FD, MICROMIPSOP_SH_FD): Likewise. (MICROMIPSOP_MASK_FR, MICROMIPSOP_SH_FR): Likewise. (MICROMIPSOP_MASK_RS3, MICROMIPSOP_SH_RS3): Likewise. (MICROMIPSOP_MASK_PREFX, MICROMIPSOP_SH_PREFX): Likewise. (MICROMIPSOP_MASK_BCC, MICROMIPSOP_SH_BCC): Likewise. (MICROMIPSOP_MASK_CCC, MICROMIPSOP_SH_CCC): Likewise. (MICROMIPSOP_MASK_COPZ, MICROMIPSOP_SH_COPZ): Likewise. (MICROMIPSOP_MASK_MB, MICROMIPSOP_SH_MB): Likewise. (MICROMIPSOP_MASK_MC, MICROMIPSOP_SH_MC): Likewise. (MICROMIPSOP_MASK_MD, MICROMIPSOP_SH_MD): Likewise. (MICROMIPSOP_MASK_ME, MICROMIPSOP_SH_ME): Likewise. (MICROMIPSOP_MASK_MF, MICROMIPSOP_SH_MF): Likewise. (MICROMIPSOP_MASK_MG, MICROMIPSOP_SH_MG): Likewise. (MICROMIPSOP_MASK_MJ, MICROMIPSOP_SH_MJ): Likewise. (MICROMIPSOP_MASK_ML, MICROMIPSOP_SH_ML): Likewise. (MICROMIPSOP_MASK_MP, MICROMIPSOP_SH_MP): Likewise. (MICROMIPSOP_MASK_MQ, MICROMIPSOP_SH_MQ): Likewise. (MICROMIPSOP_MASK_IMMA, MICROMIPSOP_SH_IMMA): Likewise. (MICROMIPSOP_MASK_IMMB, MICROMIPSOP_SH_IMMB): Likewise. (MICROMIPSOP_MASK_IMMC, MICROMIPSOP_SH_IMMC): Likewise. (MICROMIPSOP_MASK_IMMD, MICROMIPSOP_SH_IMMD): Likewise. (MICROMIPSOP_MASK_IMME, MICROMIPSOP_SH_IMME): Likewise. (MICROMIPSOP_MASK_IMMF, MICROMIPSOP_SH_IMMF): Likewise. (MICROMIPSOP_MASK_IMMG, MICROMIPSOP_SH_IMMG): Likewise. (MICROMIPSOP_MASK_IMMH, MICROMIPSOP_SH_IMMH): Likewise. (MICROMIPSOP_MASK_IMMI, MICROMIPSOP_SH_IMMI): Likewise. (MICROMIPSOP_MASK_IMMJ, MICROMIPSOP_SH_IMMJ): Likewise. (MICROMIPSOP_MASK_IMML, MICROMIPSOP_SH_IMML): Likewise. (MICROMIPSOP_MASK_IMMM, MICROMIPSOP_SH_IMMM): Likewise. (MICROMIPSOP_MASK_IMMN, MICROMIPSOP_SH_IMMN): Likewise. (MICROMIPSOP_MASK_IMMO, MICROMIPSOP_SH_IMMO): Likewise. (MICROMIPSOP_MASK_IMMP, MICROMIPSOP_SH_IMMP): Likewise. (MICROMIPSOP_MASK_IMMQ, MICROMIPSOP_SH_IMMQ): Likewise. (MICROMIPSOP_MASK_IMMU, MICROMIPSOP_SH_IMMU): Likewise. (MICROMIPSOP_MASK_IMMW, MICROMIPSOP_SH_IMMW): Likewise. (MICROMIPSOP_MASK_IMMX, MICROMIPSOP_SH_IMMX): Likewise. (MICROMIPSOP_MASK_IMMY, MICROMIPSOP_SH_IMMY): Likewise. (MICROMIPSOP_MASK_CODE, MICROMIPSOP_SH_CODE): Likewise. (MICROMIPSOP_MASK_CODE2, MICROMIPSOP_SH_CODE2): Likewise. (MICROMIPSOP_MASK_CACHE, MICROMIPSOP_SH_CACHE): Likewise. (MICROMIPSOP_MASK_CODE20, MICROMIPSOP_SH_CODE20): Likewise. (MICROMIPSOP_MASK_PERFREG, MICROMIPSOP_SH_PERFREG): Likewise. (MICROMIPSOP_MASK_CODE19, MICROMIPSOP_SH_CODE19): Likewise. (MICROMIPSOP_MASK_ALN, MICROMIPSOP_SH_ALN): Likewise. (MICROMIPSOP_MASK_VECBYTE, MICROMIPSOP_SH_VECBYTE): Likewise. (MICROMIPSOP_MASK_VECALIGN, MICROMIPSOP_SH_VECALIGN): Likewise. (MICROMIPSOP_MASK_DSPACC, MICROMIPSOP_SH_DSPACC): Likewise. (MICROMIPSOP_MASK_DSPACC_S, MICROMIPSOP_SH_DSPACC_S): Likewise. (MICROMIPSOP_MASK_DSPSFT, MICROMIPSOP_SH_DSPSFT): Likewise. (MICROMIPSOP_MASK_DSPSFT_7, MICROMIPSOP_SH_DSPSFT_7): Likewise. (MICROMIPSOP_MASK_SA3, MICROMIPSOP_SH_SA3): Likewise. (MICROMIPSOP_MASK_SA4, MICROMIPSOP_SH_SA4): Likewise. (MICROMIPSOP_MASK_IMM8, MICROMIPSOP_SH_IMM8): Likewise. (MICROMIPSOP_MASK_IMM10, MICROMIPSOP_SH_IMM10): Likewise. (MICROMIPSOP_MASK_WRDSP, MICROMIPSOP_SH_WRDSP): Likewise. (MICROMIPSOP_MASK_RDDSP, MICROMIPSOP_SH_RDDSP): Likewise. (MICROMIPSOP_MASK_BP, MICROMIPSOP_SH_BP): Likewise. (MICROMIPSOP_MASK_MT_U, MICROMIPSOP_SH_MT_U): Likewise. (MICROMIPSOP_MASK_MT_H, MICROMIPSOP_SH_MT_H): Likewise. (MICROMIPSOP_MASK_MTACC_T, MICROMIPSOP_SH_MTACC_T): Likewise. (MICROMIPSOP_MASK_MTACC_D, MICROMIPSOP_SH_MTACC_D): Likewise. (MICROMIPSOP_MASK_BBITIND, MICROMIPSOP_SH_BBITIND): Likewise. (MICROMIPSOP_MASK_CINSPOS, MICROMIPSOP_SH_CINSPOS): Likewise. (MICROMIPSOP_MASK_CINSLM1, MICROMIPSOP_SH_CINSLM1): Likewise. (MICROMIPSOP_MASK_SEQI, MICROMIPSOP_SH_SEQI): Likewise. (micromips_opcodes): New declaration. (bfd_micromips_num_opcodes): Likewise. * mips.h (INSN2_UNCOND_BRANCH, INSN2_COND_BRANCH): New macros. * mips.h (INSN2_MOD_GPR_MHI): New macro. (INSN2_MOD_GPR_MM, INSN2_MOD_GPR_MN): Likewise. (MICROMIPSOP_MASK_MH, MICROMIPSOP_SH_MH): Likewise. (MICROMIPSOP_MASK_MI, MICROMIPSOP_SH_MI): Likewise. (MICROMIPSOP_MASK_MM, MICROMIPSOP_SH_MM): Likewise. (MICROMIPSOP_MASK_MN, MICROMIPSOP_SH_MN): Likewise. ld/testsuite/ 2011-02-21 Catherine Moore Chao-ying Fu Maciej W. Rozycki * lib/ld-lib.exp (run_dump_test): Support distinct assembler flags for the same source named multiple times. * ld-mips-elf/jalx-1.s: New test source. * ld-mips-elf/jalx-1.d: New test output. * ld-mips-elf/jalx-1.ld: New test linker script. * ld-mips-elf/jalx-2-main.s: New test source. * ld-mips-elf/jalx-2-ex.s: Likewise. * ld-mips-elf/jalx-2-printf.s: Likewise. * ld-mips-elf/jalx-2.dd: New test output. * ld-mips-elf/jalx-2.ld: New test linker script. * ld-mips-elf/mips16-and-micromips.d: New test. * ld-mips-elf/mips-elf.exp: Run the new tests opcodes/ 2011-02-21 Chao-ying Fu Maciej W. Rozycki * micromips-opc.c: New file. * mips-dis.c (micromips_to_32_reg_b_map): New array. (micromips_to_32_reg_c_map, micromips_to_32_reg_d_map): Likewise. (micromips_to_32_reg_e_map, micromips_to_32_reg_f_map): Likewise. (micromips_to_32_reg_g_map, micromips_to_32_reg_l_map): Likewise. (micromips_to_32_reg_q_map): Likewise. (micromips_imm_b_map, micromips_imm_c_map): Likewise. (micromips_ase): New variable. (is_micromips): New function. (set_default_mips_dis_options): Handle microMIPS ASE. (print_insn_micromips): New function. (is_compressed_mode_p): Likewise. (_print_insn_mips): Handle microMIPS instructions. * Makefile.am (CFILES): Add micromips-opc.c. * configure.in (bfd_mips_arch): Add micromips-opc.lo. * Makefile.in: Regenerate. * configure: Regenerate. * mips-dis.c (micromips_to_32_reg_h_map): New variable. (micromips_to_32_reg_i_map): Likewise. (micromips_to_32_reg_m_map): Likewise. (micromips_to_32_reg_n_map): New macro. --8323328-299903771-1298302502=:20460 Content-Type: APPLICATION/octet-stream; name=binutils-20110221-umips-fix.diff.bz2 Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: attachment; filename=binutils-20110221-umips-fix.diff.bz2 Content-length: 42936 QlpoOTFBWSZTWd4wS0UAtWN/gH/8JmR///////////////9gqx7vo3zKAH3s AAA4emxnc5rnzb4724631vbzkfbvTXnduWdt9edbnnd6+3X3muxnL77p2dNA hFve96AG9b75c+vus3jCR03Ge63r65vPvvd9K6Ls91TrIW27Nbm27m7Ebb2u c3WeuLvXdTne8e97OjW9ZCrtvZ3vdejAiVHriHb4jyXk6ckuAD0ApLAIXYBW 7fR7gBPUeH0199Bz33u9d4RvvtqPu59i9gC589ne2fd13z7nvZnt9uzc57AZ 3d571uaK6AB7MevvYOvQKD7k97gO9h7YffID2+7Z0G5Z22nvu71bKpsDNX1n JNenHWKSXJpR3qSrNtoU953eWdiirzZKfT0HbN6zmYW27ue9133Hbnc3r69T ztutQ0Z8ZuqfWfWfXezPRqR9N33btTPdre7cbG3mzrLe6c12zbENtW6uVidW 43In32976drZltGXr3d3j2z0xkGW11L7nvA9pm13QbG3dfbnvQ1a3Wr7D3a2 0K2+3yne612270Lz1XbckBqt3u3j3u5S7R105977z5znRVyfImm3mO5rGW0m 1qiXd2w1u2HwlCCNAAQAhoEwQaTCaMhpAaYSZiU8FMgND1NGgSmggIhAmQCa mI0GqfpNlMp+ppqD1HqDRoNGgAAGmjQCTRRKKhqZpomm1HoRp6JoMT1PUGm1 DTQA0BoAANAAASaSRBBMg00CMmmqeRk9BTAEBPFMMk9T1NHoRozUGnpNNGCJ IhGgTCAmIAJiJgJPRkaYmKaYmmaSemmp6o2JpDQ2QRIkEAIp4U2mmTSZJ6Ce qn4in6nqnqB5T1NGj001AAAAyAHaeUUP8hIorBIoGsFYsKCjoEcMkuSEWNoU slCsYshYGGkVsJCJH3xocRQSQRBJFFCkB7dEWBiCLIAkjBjBhLCMkBYWIEgi AQEIgCAwGEQKoqpAVVVYQrAYMIUQAkaYixjBiJGJURBKgMBQiEoSED2e3KtC SoUBCwG/9z6TWhDQpwAykKdWtE0wC1bSqNBSqKNqDbRiolI0qCCJalJUi2iF trX/T+/2Ex0A6qeotLDfhQEo5sEQBJWgQoJKVZApJSvRUaS5DVVVVVVVVVFl pZApcTbSA2yCQKlJBSRGAmspATFgFAIkBIFxTOi0SkBVK4VFlsrrrblMosmz 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 --8323328-299903771-1298302502=:20460 Content-Type: APPLICATION/octet-stream; name=binutils-20110221-umips-relax16.diff.bz2 Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: attachment; filename=binutils-20110221-umips-relax16.diff.bz2 Content-length: 9484 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 TBRooggqOE/+LuSKcKEgkrTnag== --8323328-299903771-1298302502=:20460 Content-Type: APPLICATION/octet-stream; name=binutils-20110221-umips-fix-reloc.diff.bz2 Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: Content-Disposition: attachment; filename=binutils-20110221-umips-fix-reloc.diff.bz2 Content-length: 5539 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 --8323328-299903771-1298302502=:20460--