+ if (fragP->tc_frag_data.flag & NDS32_FRAG_RELAXABLE_BRANCH)
+ {
+ relax_info = hash_find (nds32_relax_info_hash, opcode->opcode);
+
+ if (relax_info == NULL)
+ return;
+
+ i = BR_RANGE_S256;
+ while (i < BR_RANGE_NUM
+ && relax_info->relax_code_size[i]
+ != (fragP->tc_frag_data.flag & NDS32_FRAG_RELAXED ? 4 : 2))
+ i++;
+
+ if (i >= BR_RANGE_NUM)
+ as_bad ("Internal error: Cannot find relocation of"
+ "relaxable branch.");
+
+ exp.X_op = O_symbol;
+ exp.X_add_symbol = branch_symbol;
+ exp.X_add_number = branch_offset;
+ pcrel = ((relax_info->relax_fixup[i][0].ramp & NDS32_PCREL) != 0) ? 1 : 0;
+ fr_where = fragP->fr_fix - 2;
+ fixP = fix_new_exp (fragP, fr_where, relax_info->relax_fixup[i][0].size,
+ &exp, pcrel, relax_info->relax_fixup[i][0].r_type);
+ fixP->fx_addnumber = fixP->fx_offset;
+
+ if (fragP->tc_frag_data.flag & NDS32_FRAG_RELAXED)
+ {
+ insn_16 = fragP->tc_frag_data.insn;
+ nds32_convert_16_to_32 (stdoutput, insn_16, &insn);
+ fr_buffer = fragP->fr_literal + fr_where;
+ fragP->fr_fix += 2;
+ exp.X_op = O_symbol;
+ exp.X_add_symbol = abs_section_sym;
+ exp.X_add_number = 0;
+ fix_new_exp (fragP, fr_where, 4,
+ &exp, 0, BFD_RELOC_NDS32_INSN16);
+ number_to_chars_bigendian (fr_buffer, insn, 4);
+ }
+ }
+ else if (fragP->tc_frag_data.flag & NDS32_FRAG_RELAXED)