xref: /netbsd-src/external/gpl3/binutils/dist/gas/config/tc-xtensa.c (revision 7788a0781fe6ff2cce37368b4578a7ade0850cb1)
1 /* tc-xtensa.c -- Assemble Xtensa instructions.
2    Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
3    Free Software Foundation, Inc.
4 
5    This file is part of GAS, the GNU Assembler.
6 
7    GAS is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3, or (at your option)
10    any later version.
11 
12    GAS is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16 
17    You should have received a copy of the GNU General Public License
18    along with GAS; see the file COPYING.  If not, write to
19    the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
20    MA 02110-1301, USA.  */
21 
22 #include <limits.h>
23 #include "as.h"
24 #include "sb.h"
25 #include "safe-ctype.h"
26 #include "tc-xtensa.h"
27 #include "subsegs.h"
28 #include "xtensa-relax.h"
29 #include "dwarf2dbg.h"
30 #include "xtensa-istack.h"
31 #include "struc-symbol.h"
32 #include "xtensa-config.h"
33 
34 /* Provide default values for new configuration settings.  */
35 #ifndef XSHAL_ABI
36 #define XSHAL_ABI 0
37 #endif
38 
39 #ifndef uint32
40 #define uint32 unsigned int
41 #endif
42 #ifndef int32
43 #define int32 signed int
44 #endif
45 
46 /* Notes:
47 
48    Naming conventions (used somewhat inconsistently):
49       The xtensa_ functions are exported
50       The xg_ functions are internal
51 
52    We also have a couple of different extensibility mechanisms.
53    1) The idiom replacement:
54       This is used when a line is first parsed to
55       replace an instruction pattern with another instruction
56       It is currently limited to replacements of instructions
57       with constant operands.
58    2) The xtensa-relax.c mechanism that has stronger instruction
59       replacement patterns.  When an instruction's immediate field
60       does not fit the next instruction sequence is attempted.
61       In addition, "narrow" opcodes are supported this way.  */
62 
63 
64 /* Define characters with special meanings to GAS.  */
65 const char comment_chars[] = "#";
66 const char line_comment_chars[] = "#";
67 const char line_separator_chars[] = ";";
68 const char EXP_CHARS[] = "eE";
69 const char FLT_CHARS[] = "rRsSfFdDxXpP";
70 
71 
72 /* Flags to indicate whether the hardware supports the density and
73    absolute literals options.  */
74 
75 bfd_boolean density_supported = XCHAL_HAVE_DENSITY;
76 bfd_boolean absolute_literals_supported = XSHAL_USE_ABSOLUTE_LITERALS;
77 
78 static vliw_insn cur_vinsn;
79 
80 unsigned xtensa_num_pipe_stages;
81 unsigned xtensa_fetch_width = XCHAL_INST_FETCH_WIDTH;
82 
83 static enum debug_info_type xt_saved_debug_type = DEBUG_NONE;
84 
85 /* Some functions are only valid in the front end.  This variable
86    allows us to assert that we haven't crossed over into the
87    back end.  */
88 static bfd_boolean past_xtensa_end = FALSE;
89 
90 /* Flags for properties of the last instruction in a segment.  */
91 #define FLAG_IS_A0_WRITER	0x1
92 #define FLAG_IS_BAD_LOOPEND	0x2
93 
94 
95 /* We define a special segment names ".literal" to place literals
96    into.  The .fini and .init sections are special because they
97    contain code that is moved together by the linker.  We give them
98    their own special .fini.literal and .init.literal sections.  */
99 
100 #define LITERAL_SECTION_NAME		xtensa_section_rename (".literal")
101 #define LIT4_SECTION_NAME		xtensa_section_rename (".lit4")
102 #define INIT_SECTION_NAME		xtensa_section_rename (".init")
103 #define FINI_SECTION_NAME		xtensa_section_rename (".fini")
104 
105 
106 /* This type is used for the directive_stack to keep track of the
107    state of the literal collection pools.  If lit_prefix is set, it is
108    used to determine the literal section names; otherwise, the literal
109    sections are determined based on the current text section.  The
110    lit_seg and lit4_seg fields cache these literal sections, with the
111    current_text_seg field used a tag to indicate whether the cached
112    values are valid.  */
113 
114 typedef struct lit_state_struct
115 {
116   char *lit_prefix;
117   segT current_text_seg;
118   segT lit_seg;
119   segT lit4_seg;
120 } lit_state;
121 
122 static lit_state default_lit_sections;
123 
124 
125 /* We keep a list of literal segments.  The seg_list type is the node
126    for this list.  The literal_head pointer is the head of the list,
127    with the literal_head_h dummy node at the start.  */
128 
129 typedef struct seg_list_struct
130 {
131   struct seg_list_struct *next;
132   segT seg;
133 } seg_list;
134 
135 static seg_list literal_head_h;
136 static seg_list *literal_head = &literal_head_h;
137 
138 
139 /* Lists of symbols.  We keep a list of symbols that label the current
140    instruction, so that we can adjust the symbols when inserting alignment
141    for various instructions.  We also keep a list of all the symbols on
142    literals, so that we can fix up those symbols when the literals are
143    later moved into the text sections.  */
144 
145 typedef struct sym_list_struct
146 {
147   struct sym_list_struct *next;
148   symbolS *sym;
149 } sym_list;
150 
151 static sym_list *insn_labels = NULL;
152 static sym_list *free_insn_labels = NULL;
153 static sym_list *saved_insn_labels = NULL;
154 
155 static sym_list *literal_syms;
156 
157 
158 /* Flags to determine whether to prefer const16 or l32r
159    if both options are available.  */
160 int prefer_const16 = 0;
161 int prefer_l32r = 0;
162 
163 /* Global flag to indicate when we are emitting literals.  */
164 int generating_literals = 0;
165 
166 /* The following PROPERTY table definitions are copied from
167    <elf/xtensa.h> and must be kept in sync with the code there.  */
168 
169 /* Flags in the property tables to specify whether blocks of memory
170    are literals, instructions, data, or unreachable.  For
171    instructions, blocks that begin loop targets and branch targets are
172    designated.  Blocks that do not allow density, instruction
173    reordering or transformation are also specified.  Finally, for
174    branch targets, branch target alignment priority is included.
175    Alignment of the next block is specified in the current block
176    and the size of the current block does not include any fill required
177    to align to the next block.  */
178 
179 #define XTENSA_PROP_LITERAL		0x00000001
180 #define XTENSA_PROP_INSN		0x00000002
181 #define XTENSA_PROP_DATA		0x00000004
182 #define XTENSA_PROP_UNREACHABLE		0x00000008
183 /* Instruction only properties at beginning of code.  */
184 #define XTENSA_PROP_INSN_LOOP_TARGET	0x00000010
185 #define XTENSA_PROP_INSN_BRANCH_TARGET	0x00000020
186 /* Instruction only properties about code.  */
187 #define XTENSA_PROP_INSN_NO_DENSITY	0x00000040
188 #define XTENSA_PROP_INSN_NO_REORDER	0x00000080
189 /* Historically, NO_TRANSFORM was a property of instructions,
190    but it should apply to literals under certain circumstances.  */
191 #define XTENSA_PROP_NO_TRANSFORM	0x00000100
192 
193 /*  Branch target alignment information.  This transmits information
194     to the linker optimization about the priority of aligning a
195     particular block for branch target alignment: None, low priority,
196     high priority, or required.  These only need to be checked in
197     instruction blocks marked as XTENSA_PROP_INSN_BRANCH_TARGET.
198     Common usage is
199 
200     switch (GET_XTENSA_PROP_BT_ALIGN (flags))
201     case XTENSA_PROP_BT_ALIGN_NONE:
202     case XTENSA_PROP_BT_ALIGN_LOW:
203     case XTENSA_PROP_BT_ALIGN_HIGH:
204     case XTENSA_PROP_BT_ALIGN_REQUIRE:
205 */
206 #define XTENSA_PROP_BT_ALIGN_MASK       0x00000600
207 
208 /* No branch target alignment.  */
209 #define XTENSA_PROP_BT_ALIGN_NONE       0x0
210 /* Low priority branch target alignment.  */
211 #define XTENSA_PROP_BT_ALIGN_LOW        0x1
212 /* High priority branch target alignment.  */
213 #define XTENSA_PROP_BT_ALIGN_HIGH       0x2
214 /* Required branch target alignment.  */
215 #define XTENSA_PROP_BT_ALIGN_REQUIRE    0x3
216 
217 #define GET_XTENSA_PROP_BT_ALIGN(flag) \
218   (((unsigned) ((flag) & (XTENSA_PROP_BT_ALIGN_MASK))) >> 9)
219 #define SET_XTENSA_PROP_BT_ALIGN(flag, align) \
220   (((flag) & (~XTENSA_PROP_BT_ALIGN_MASK)) | \
221     (((align) << 9) & XTENSA_PROP_BT_ALIGN_MASK))
222 
223 
224 /* Alignment is specified in the block BEFORE the one that needs
225    alignment.  Up to 5 bits.  Use GET_XTENSA_PROP_ALIGNMENT(flags) to
226    get the required alignment specified as a power of 2.  Use
227    SET_XTENSA_PROP_ALIGNMENT(flags, pow2) to set the required
228    alignment.  Be careful of side effects since the SET will evaluate
229    flags twice.  Also, note that the SIZE of a block in the property
230    table does not include the alignment size, so the alignment fill
231    must be calculated to determine if two blocks are contiguous.
232    TEXT_ALIGN is not currently implemented but is a placeholder for a
233    possible future implementation.  */
234 
235 #define XTENSA_PROP_ALIGN		0x00000800
236 
237 #define XTENSA_PROP_ALIGNMENT_MASK      0x0001f000
238 
239 #define GET_XTENSA_PROP_ALIGNMENT(flag) \
240   (((unsigned) ((flag) & (XTENSA_PROP_ALIGNMENT_MASK))) >> 12)
241 #define SET_XTENSA_PROP_ALIGNMENT(flag, align) \
242   (((flag) & (~XTENSA_PROP_ALIGNMENT_MASK)) | \
243     (((align) << 12) & XTENSA_PROP_ALIGNMENT_MASK))
244 
245 #define XTENSA_PROP_INSN_ABSLIT 0x00020000
246 
247 
248 /* Structure for saving instruction and alignment per-fragment data
249    that will be written to the object file.  This structure is
250    equivalent to the actual data that will be written out to the file
251    but is easier to use.   We provide a conversion to file flags
252    in frag_flags_to_number.  */
253 
254 typedef struct frag_flags_struct frag_flags;
255 
256 struct frag_flags_struct
257 {
258   /* is_literal should only be used after xtensa_move_literals.
259      If you need to check if you are generating a literal fragment,
260      then use the generating_literals global.  */
261 
262   unsigned is_literal : 1;
263   unsigned is_insn : 1;
264   unsigned is_data : 1;
265   unsigned is_unreachable : 1;
266 
267   /* is_specific_opcode implies no_transform.  */
268   unsigned is_no_transform : 1;
269 
270   struct
271   {
272     unsigned is_loop_target : 1;
273     unsigned is_branch_target : 1; /* Branch targets have a priority.  */
274     unsigned bt_align_priority : 2;
275 
276     unsigned is_no_density : 1;
277     /* no_longcalls flag does not need to be placed in the object file.  */
278 
279     unsigned is_no_reorder : 1;
280 
281     /* Uses absolute literal addressing for l32r.  */
282     unsigned is_abslit : 1;
283   } insn;
284   unsigned is_align : 1;
285   unsigned alignment : 5;
286 };
287 
288 
289 /* Structure for saving information about a block of property data
290    for frags that have the same flags.  */
291 struct xtensa_block_info_struct
292 {
293   segT sec;
294   bfd_vma offset;
295   size_t size;
296   frag_flags flags;
297   struct xtensa_block_info_struct *next;
298 };
299 
300 
301 /* Structure for saving the current state before emitting literals.  */
302 typedef struct emit_state_struct
303 {
304   const char *name;
305   segT now_seg;
306   subsegT now_subseg;
307   int generating_literals;
308 } emit_state;
309 
310 
311 /* Opcode placement information */
312 
313 typedef unsigned long long bitfield;
314 #define bit_is_set(bit, bf)	((bf) & (0x01ll << (bit)))
315 #define set_bit(bit, bf)	((bf) |= (0x01ll << (bit)))
316 #define clear_bit(bit, bf)	((bf) &= ~(0x01ll << (bit)))
317 
318 #define MAX_FORMATS 32
319 
320 typedef struct op_placement_info_struct
321 {
322   int num_formats;
323   /* A number describing how restrictive the issue is for this
324      opcode.  For example, an opcode that fits lots of different
325      formats has a high freedom, as does an opcode that fits
326      only one format but many slots in that format.  The most
327      restrictive is the opcode that fits only one slot in one
328      format.  */
329   int issuef;
330   xtensa_format narrowest;
331   char narrowest_size;
332   char narrowest_slot;
333 
334   /* formats is a bitfield with the Nth bit set
335      if the opcode fits in the Nth xtensa_format.  */
336   bitfield formats;
337 
338   /* slots[N]'s Mth bit is set if the op fits in the
339      Mth slot of the Nth xtensa_format.  */
340   bitfield slots[MAX_FORMATS];
341 
342   /* A count of the number of slots in a given format
343      an op can fit (i.e., the bitcount of the slot field above).  */
344   char slots_in_format[MAX_FORMATS];
345 
346 } op_placement_info, *op_placement_info_table;
347 
348 op_placement_info_table op_placement_table;
349 
350 
351 /* Extra expression types.  */
352 
353 #define O_pltrel	O_md1	/* like O_symbol but use a PLT reloc */
354 #define O_hi16		O_md2	/* use high 16 bits of symbolic value */
355 #define O_lo16		O_md3	/* use low 16 bits of symbolic value */
356 #define O_pcrel		O_md4	/* value is a PC-relative offset */
357 #define O_tlsfunc	O_md5	/* TLS_FUNC/TLSDESC_FN relocation */
358 #define O_tlsarg	O_md6	/* TLS_ARG/TLSDESC_ARG relocation */
359 #define O_tlscall	O_md7	/* TLS_CALL relocation */
360 #define O_tpoff		O_md8	/* TPOFF relocation */
361 #define O_dtpoff	O_md9	/* DTPOFF relocation */
362 
363 struct suffix_reloc_map
364 {
365   char *suffix;
366   int length;
367   bfd_reloc_code_real_type reloc;
368   unsigned char operator;
369 };
370 
371 #define SUFFIX_MAP(str, reloc, op) { str, sizeof (str) - 1, reloc, op }
372 
373 static struct suffix_reloc_map suffix_relocs[] =
374 {
375   SUFFIX_MAP ("l",	BFD_RELOC_LO16,			O_lo16),
376   SUFFIX_MAP ("h",	BFD_RELOC_HI16,			O_hi16),
377   SUFFIX_MAP ("plt",	BFD_RELOC_XTENSA_PLT,		O_pltrel),
378   SUFFIX_MAP ("pcrel",	BFD_RELOC_32_PCREL,		O_pcrel),
379   SUFFIX_MAP ("tlsfunc", BFD_RELOC_XTENSA_TLS_FUNC,	O_tlsfunc),
380   SUFFIX_MAP ("tlsarg",	BFD_RELOC_XTENSA_TLS_ARG,	O_tlsarg),
381   SUFFIX_MAP ("tlscall", BFD_RELOC_XTENSA_TLS_CALL,	O_tlscall),
382   SUFFIX_MAP ("tpoff",	BFD_RELOC_XTENSA_TLS_TPOFF,	O_tpoff),
383   SUFFIX_MAP ("dtpoff",	BFD_RELOC_XTENSA_TLS_DTPOFF,	O_dtpoff),
384   { (char *) 0, 0,	BFD_RELOC_UNUSED,		0 }
385 };
386 
387 
388 /* Directives.  */
389 
390 typedef enum
391 {
392   directive_none = 0,
393   directive_literal,
394   directive_density,
395   directive_transform,
396   directive_freeregs,
397   directive_longcalls,
398   directive_literal_prefix,
399   directive_schedule,
400   directive_absolute_literals,
401   directive_last_directive
402 } directiveE;
403 
404 typedef struct
405 {
406   const char *name;
407   bfd_boolean can_be_negated;
408 } directive_infoS;
409 
410 const directive_infoS directive_info[] =
411 {
412   { "none",		FALSE },
413   { "literal",		FALSE },
414   { "density",		TRUE },
415   { "transform",	TRUE },
416   { "freeregs",		FALSE },
417   { "longcalls",	TRUE },
418   { "literal_prefix",	FALSE },
419   { "schedule",		TRUE },
420   { "absolute-literals", TRUE }
421 };
422 
423 bfd_boolean directive_state[] =
424 {
425   FALSE,			/* none */
426   FALSE,			/* literal */
427 #if !XCHAL_HAVE_DENSITY
428   FALSE,			/* density */
429 #else
430   TRUE,				/* density */
431 #endif
432   TRUE,				/* transform */
433   FALSE,			/* freeregs */
434   FALSE,			/* longcalls */
435   FALSE,			/* literal_prefix */
436   FALSE,			/* schedule */
437 #if XSHAL_USE_ABSOLUTE_LITERALS
438   TRUE				/* absolute_literals */
439 #else
440   FALSE				/* absolute_literals */
441 #endif
442 };
443 
444 
445 /* Directive functions.  */
446 
447 static void xtensa_begin_directive (int);
448 static void xtensa_end_directive (int);
449 static void xtensa_literal_prefix (void);
450 static void xtensa_literal_position (int);
451 static void xtensa_literal_pseudo (int);
452 static void xtensa_frequency_pseudo (int);
453 static void xtensa_elf_cons (int);
454 static void xtensa_leb128 (int);
455 
456 /* Parsing and Idiom Translation.  */
457 
458 static bfd_reloc_code_real_type xtensa_elf_suffix (char **, expressionS *);
459 
460 /* Various Other Internal Functions.  */
461 
462 extern bfd_boolean xg_is_single_relaxable_insn (TInsn *, TInsn *, bfd_boolean);
463 static bfd_boolean xg_build_to_insn (TInsn *, TInsn *, BuildInstr *);
464 static void xtensa_mark_literal_pool_location (void);
465 static addressT get_expanded_loop_offset (xtensa_opcode);
466 static fragS *get_literal_pool_location (segT);
467 static void set_literal_pool_location (segT, fragS *);
468 static void xtensa_set_frag_assembly_state (fragS *);
469 static void finish_vinsn (vliw_insn *);
470 static bfd_boolean emit_single_op (TInsn *);
471 static int total_frag_text_expansion (fragS *);
472 
473 /* Alignment Functions.  */
474 
475 static int get_text_align_power (unsigned);
476 static int get_text_align_max_fill_size (int, bfd_boolean, bfd_boolean);
477 static int branch_align_power (segT);
478 
479 /* Helpers for xtensa_relax_frag().  */
480 
481 static long relax_frag_add_nop (fragS *);
482 
483 /* Accessors for additional per-subsegment information.  */
484 
485 static unsigned get_last_insn_flags (segT, subsegT);
486 static void set_last_insn_flags (segT, subsegT, unsigned, bfd_boolean);
487 static float get_subseg_total_freq (segT, subsegT);
488 static float get_subseg_target_freq (segT, subsegT);
489 static void set_subseg_freq (segT, subsegT, float, float);
490 
491 /* Segment list functions.  */
492 
493 static void xtensa_move_literals (void);
494 static void xtensa_reorder_segments (void);
495 static void xtensa_switch_to_literal_fragment (emit_state *);
496 static void xtensa_switch_to_non_abs_literal_fragment (emit_state *);
497 static void xtensa_switch_section_emit_state (emit_state *, segT, subsegT);
498 static void xtensa_restore_emit_state (emit_state *);
499 static segT cache_literal_section (bfd_boolean);
500 
501 /* Import from elf32-xtensa.c in BFD library.  */
502 
503 extern asection *xtensa_make_property_section (asection *, const char *);
504 
505 /* op_placement_info functions.  */
506 
507 static void init_op_placement_info_table (void);
508 extern bfd_boolean opcode_fits_format_slot (xtensa_opcode, xtensa_format, int);
509 static int xg_get_single_size (xtensa_opcode);
510 static xtensa_format xg_get_single_format (xtensa_opcode);
511 static int xg_get_single_slot (xtensa_opcode);
512 
513 /* TInsn and IStack functions.  */
514 
515 static bfd_boolean tinsn_has_symbolic_operands (const TInsn *);
516 static bfd_boolean tinsn_has_invalid_symbolic_operands (const TInsn *);
517 static bfd_boolean tinsn_has_complex_operands (const TInsn *);
518 static bfd_boolean tinsn_to_insnbuf (TInsn *, xtensa_insnbuf);
519 static bfd_boolean tinsn_check_arguments (const TInsn *);
520 static void tinsn_from_chars (TInsn *, char *, int);
521 static void tinsn_immed_from_frag (TInsn *, fragS *, int);
522 static int get_num_stack_text_bytes (IStack *);
523 static int get_num_stack_literal_bytes (IStack *);
524 
525 /* vliw_insn functions.  */
526 
527 static void xg_init_vinsn (vliw_insn *);
528 static void xg_copy_vinsn (vliw_insn *, vliw_insn *);
529 static void xg_clear_vinsn (vliw_insn *);
530 static bfd_boolean vinsn_has_specific_opcodes (vliw_insn *);
531 static void xg_free_vinsn (vliw_insn *);
532 static bfd_boolean vinsn_to_insnbuf
533   (vliw_insn *, char *, fragS *, bfd_boolean);
534 static void vinsn_from_chars (vliw_insn *, char *);
535 
536 /* Expression Utilities.  */
537 
538 bfd_boolean expr_is_const (const expressionS *);
539 offsetT get_expr_const (const expressionS *);
540 void set_expr_const (expressionS *, offsetT);
541 bfd_boolean expr_is_register (const expressionS *);
542 offsetT get_expr_register (const expressionS *);
543 void set_expr_symbol_offset (expressionS *, symbolS *, offsetT);
544 bfd_boolean expr_is_equal (expressionS *, expressionS *);
545 static void copy_expr (expressionS *, const expressionS *);
546 
547 /* Section renaming.  */
548 
549 static void build_section_rename (const char *);
550 
551 
552 /* ISA imported from bfd.  */
553 extern xtensa_isa xtensa_default_isa;
554 
555 extern int target_big_endian;
556 
557 static xtensa_opcode xtensa_addi_opcode;
558 static xtensa_opcode xtensa_addmi_opcode;
559 static xtensa_opcode xtensa_call0_opcode;
560 static xtensa_opcode xtensa_call4_opcode;
561 static xtensa_opcode xtensa_call8_opcode;
562 static xtensa_opcode xtensa_call12_opcode;
563 static xtensa_opcode xtensa_callx0_opcode;
564 static xtensa_opcode xtensa_callx4_opcode;
565 static xtensa_opcode xtensa_callx8_opcode;
566 static xtensa_opcode xtensa_callx12_opcode;
567 static xtensa_opcode xtensa_const16_opcode;
568 static xtensa_opcode xtensa_entry_opcode;
569 static xtensa_opcode xtensa_extui_opcode;
570 static xtensa_opcode xtensa_movi_opcode;
571 static xtensa_opcode xtensa_movi_n_opcode;
572 static xtensa_opcode xtensa_isync_opcode;
573 static xtensa_opcode xtensa_j_opcode;
574 static xtensa_opcode xtensa_jx_opcode;
575 static xtensa_opcode xtensa_l32r_opcode;
576 static xtensa_opcode xtensa_loop_opcode;
577 static xtensa_opcode xtensa_loopnez_opcode;
578 static xtensa_opcode xtensa_loopgtz_opcode;
579 static xtensa_opcode xtensa_nop_opcode;
580 static xtensa_opcode xtensa_nop_n_opcode;
581 static xtensa_opcode xtensa_or_opcode;
582 static xtensa_opcode xtensa_ret_opcode;
583 static xtensa_opcode xtensa_ret_n_opcode;
584 static xtensa_opcode xtensa_retw_opcode;
585 static xtensa_opcode xtensa_retw_n_opcode;
586 static xtensa_opcode xtensa_rsr_lcount_opcode;
587 static xtensa_opcode xtensa_waiti_opcode;
588 static int config_max_slots = 0;
589 
590 
591 /* Command-line Options.  */
592 
593 bfd_boolean use_literal_section = TRUE;
594 enum flix_level produce_flix = FLIX_ALL;
595 static bfd_boolean align_targets = TRUE;
596 static bfd_boolean warn_unaligned_branch_targets = FALSE;
597 static bfd_boolean has_a0_b_retw = FALSE;
598 static bfd_boolean workaround_a0_b_retw = FALSE;
599 static bfd_boolean workaround_b_j_loop_end = FALSE;
600 static bfd_boolean workaround_short_loop = FALSE;
601 static bfd_boolean maybe_has_short_loop = FALSE;
602 static bfd_boolean workaround_close_loop_end = FALSE;
603 static bfd_boolean maybe_has_close_loop_end = FALSE;
604 static bfd_boolean enforce_three_byte_loop_align = FALSE;
605 
606 /* When workaround_short_loops is TRUE, all loops with early exits must
607    have at least 3 instructions.  workaround_all_short_loops is a modifier
608    to the workaround_short_loop flag.  In addition to the
609    workaround_short_loop actions, all straightline loopgtz and loopnez
610    must have at least 3 instructions.  */
611 
612 static bfd_boolean workaround_all_short_loops = FALSE;
613 
614 
615 static void
616 xtensa_setup_hw_workarounds (int earliest, int latest)
617 {
618   if (earliest > latest)
619     as_fatal (_("illegal range of target hardware versions"));
620 
621   /* Enable all workarounds for pre-T1050.0 hardware.  */
622   if (earliest < 105000 || latest < 105000)
623     {
624       workaround_a0_b_retw |= TRUE;
625       workaround_b_j_loop_end |= TRUE;
626       workaround_short_loop |= TRUE;
627       workaround_close_loop_end |= TRUE;
628       workaround_all_short_loops |= TRUE;
629       enforce_three_byte_loop_align = TRUE;
630     }
631 }
632 
633 
634 enum
635 {
636   option_density = OPTION_MD_BASE,
637   option_no_density,
638 
639   option_flix,
640   option_no_generate_flix,
641   option_no_flix,
642 
643   option_relax,
644   option_no_relax,
645 
646   option_link_relax,
647   option_no_link_relax,
648 
649   option_generics,
650   option_no_generics,
651 
652   option_transform,
653   option_no_transform,
654 
655   option_text_section_literals,
656   option_no_text_section_literals,
657 
658   option_absolute_literals,
659   option_no_absolute_literals,
660 
661   option_align_targets,
662   option_no_align_targets,
663 
664   option_warn_unaligned_targets,
665 
666   option_longcalls,
667   option_no_longcalls,
668 
669   option_workaround_a0_b_retw,
670   option_no_workaround_a0_b_retw,
671 
672   option_workaround_b_j_loop_end,
673   option_no_workaround_b_j_loop_end,
674 
675   option_workaround_short_loop,
676   option_no_workaround_short_loop,
677 
678   option_workaround_all_short_loops,
679   option_no_workaround_all_short_loops,
680 
681   option_workaround_close_loop_end,
682   option_no_workaround_close_loop_end,
683 
684   option_no_workarounds,
685 
686   option_rename_section_name,
687 
688   option_prefer_l32r,
689   option_prefer_const16,
690 
691   option_target_hardware
692 };
693 
694 const char *md_shortopts = "";
695 
696 struct option md_longopts[] =
697 {
698   { "density", no_argument, NULL, option_density },
699   { "no-density", no_argument, NULL, option_no_density },
700 
701   { "flix", no_argument, NULL, option_flix },
702   { "no-generate-flix", no_argument, NULL, option_no_generate_flix },
703   { "no-allow-flix", no_argument, NULL, option_no_flix },
704 
705   /* Both "relax" and "generics" are deprecated and treated as equivalent
706      to the "transform" option.  */
707   { "relax", no_argument, NULL, option_relax },
708   { "no-relax", no_argument, NULL, option_no_relax },
709   { "generics", no_argument, NULL, option_generics },
710   { "no-generics", no_argument, NULL, option_no_generics },
711 
712   { "transform", no_argument, NULL, option_transform },
713   { "no-transform", no_argument, NULL, option_no_transform },
714   { "text-section-literals", no_argument, NULL, option_text_section_literals },
715   { "no-text-section-literals", no_argument, NULL,
716     option_no_text_section_literals },
717   { "absolute-literals", no_argument, NULL, option_absolute_literals },
718   { "no-absolute-literals", no_argument, NULL, option_no_absolute_literals },
719   /* This option was changed from -align-target to -target-align
720      because it conflicted with the "-al" option.  */
721   { "target-align", no_argument, NULL, option_align_targets },
722   { "no-target-align", no_argument, NULL, option_no_align_targets },
723   { "warn-unaligned-targets", no_argument, NULL,
724     option_warn_unaligned_targets },
725   { "longcalls", no_argument, NULL, option_longcalls },
726   { "no-longcalls", no_argument, NULL, option_no_longcalls },
727 
728   { "no-workaround-a0-b-retw", no_argument, NULL,
729     option_no_workaround_a0_b_retw },
730   { "workaround-a0-b-retw", no_argument, NULL, option_workaround_a0_b_retw },
731 
732   { "no-workaround-b-j-loop-end", no_argument, NULL,
733     option_no_workaround_b_j_loop_end },
734   { "workaround-b-j-loop-end", no_argument, NULL,
735     option_workaround_b_j_loop_end },
736 
737   { "no-workaround-short-loops", no_argument, NULL,
738     option_no_workaround_short_loop },
739   { "workaround-short-loops", no_argument, NULL,
740     option_workaround_short_loop },
741 
742   { "no-workaround-all-short-loops", no_argument, NULL,
743     option_no_workaround_all_short_loops },
744   { "workaround-all-short-loop", no_argument, NULL,
745     option_workaround_all_short_loops },
746 
747   { "prefer-l32r", no_argument, NULL, option_prefer_l32r },
748   { "prefer-const16", no_argument, NULL, option_prefer_const16 },
749 
750   { "no-workarounds", no_argument, NULL, option_no_workarounds },
751 
752   { "no-workaround-close-loop-end", no_argument, NULL,
753     option_no_workaround_close_loop_end },
754   { "workaround-close-loop-end", no_argument, NULL,
755     option_workaround_close_loop_end },
756 
757   { "rename-section", required_argument, NULL, option_rename_section_name },
758 
759   { "link-relax", no_argument, NULL, option_link_relax },
760   { "no-link-relax", no_argument, NULL, option_no_link_relax },
761 
762   { "target-hardware", required_argument, NULL, option_target_hardware },
763 
764   { NULL, no_argument, NULL, 0 }
765 };
766 
767 size_t md_longopts_size = sizeof md_longopts;
768 
769 
770 int
771 md_parse_option (int c, char *arg)
772 {
773   switch (c)
774     {
775     case option_density:
776       as_warn (_("--density option is ignored"));
777       return 1;
778     case option_no_density:
779       as_warn (_("--no-density option is ignored"));
780       return 1;
781     case option_link_relax:
782       linkrelax = 1;
783       return 1;
784     case option_no_link_relax:
785       linkrelax = 0;
786       return 1;
787     case option_flix:
788       produce_flix = FLIX_ALL;
789       return 1;
790     case option_no_generate_flix:
791       produce_flix = FLIX_NO_GENERATE;
792       return 1;
793     case option_no_flix:
794       produce_flix = FLIX_NONE;
795       return 1;
796     case option_generics:
797       as_warn (_("--generics is deprecated; use --transform instead"));
798       return md_parse_option (option_transform, arg);
799     case option_no_generics:
800       as_warn (_("--no-generics is deprecated; use --no-transform instead"));
801       return md_parse_option (option_no_transform, arg);
802     case option_relax:
803       as_warn (_("--relax is deprecated; use --transform instead"));
804       return md_parse_option (option_transform, arg);
805     case option_no_relax:
806       as_warn (_("--no-relax is deprecated; use --no-transform instead"));
807       return md_parse_option (option_no_transform, arg);
808     case option_longcalls:
809       directive_state[directive_longcalls] = TRUE;
810       return 1;
811     case option_no_longcalls:
812       directive_state[directive_longcalls] = FALSE;
813       return 1;
814     case option_text_section_literals:
815       use_literal_section = FALSE;
816       return 1;
817     case option_no_text_section_literals:
818       use_literal_section = TRUE;
819       return 1;
820     case option_absolute_literals:
821       if (!absolute_literals_supported)
822 	{
823 	  as_fatal (_("--absolute-literals option not supported in this Xtensa configuration"));
824 	  return 0;
825 	}
826       directive_state[directive_absolute_literals] = TRUE;
827       return 1;
828     case option_no_absolute_literals:
829       directive_state[directive_absolute_literals] = FALSE;
830       return 1;
831 
832     case option_workaround_a0_b_retw:
833       workaround_a0_b_retw = TRUE;
834       return 1;
835     case option_no_workaround_a0_b_retw:
836       workaround_a0_b_retw = FALSE;
837       return 1;
838     case option_workaround_b_j_loop_end:
839       workaround_b_j_loop_end = TRUE;
840       return 1;
841     case option_no_workaround_b_j_loop_end:
842       workaround_b_j_loop_end = FALSE;
843       return 1;
844 
845     case option_workaround_short_loop:
846       workaround_short_loop = TRUE;
847       return 1;
848     case option_no_workaround_short_loop:
849       workaround_short_loop = FALSE;
850       return 1;
851 
852     case option_workaround_all_short_loops:
853       workaround_all_short_loops = TRUE;
854       return 1;
855     case option_no_workaround_all_short_loops:
856       workaround_all_short_loops = FALSE;
857       return 1;
858 
859     case option_workaround_close_loop_end:
860       workaround_close_loop_end = TRUE;
861       return 1;
862     case option_no_workaround_close_loop_end:
863       workaround_close_loop_end = FALSE;
864       return 1;
865 
866     case option_no_workarounds:
867       workaround_a0_b_retw = FALSE;
868       workaround_b_j_loop_end = FALSE;
869       workaround_short_loop = FALSE;
870       workaround_all_short_loops = FALSE;
871       workaround_close_loop_end = FALSE;
872       return 1;
873 
874     case option_align_targets:
875       align_targets = TRUE;
876       return 1;
877     case option_no_align_targets:
878       align_targets = FALSE;
879       return 1;
880 
881     case option_warn_unaligned_targets:
882       warn_unaligned_branch_targets = TRUE;
883       return 1;
884 
885     case option_rename_section_name:
886       build_section_rename (arg);
887       return 1;
888 
889     case 'Q':
890       /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
891          should be emitted or not.  FIXME: Not implemented.  */
892       return 1;
893 
894     case option_prefer_l32r:
895       if (prefer_const16)
896 	as_fatal (_("prefer-l32r conflicts with prefer-const16"));
897       prefer_l32r = 1;
898       return 1;
899 
900     case option_prefer_const16:
901       if (prefer_l32r)
902 	as_fatal (_("prefer-const16 conflicts with prefer-l32r"));
903       prefer_const16 = 1;
904       return 1;
905 
906     case option_target_hardware:
907       {
908 	int earliest, latest = 0;
909 	if (*arg == 0 || *arg == '-')
910 	  as_fatal (_("invalid target hardware version"));
911 
912 	earliest = strtol (arg, &arg, 0);
913 
914 	if (*arg == 0)
915 	  latest = earliest;
916 	else if (*arg == '-')
917 	  {
918 	    if (*++arg == 0)
919 	      as_fatal (_("invalid target hardware version"));
920 	    latest = strtol (arg, &arg, 0);
921 	  }
922 	if (*arg != 0)
923 	  as_fatal (_("invalid target hardware version"));
924 
925 	xtensa_setup_hw_workarounds (earliest, latest);
926 	return 1;
927       }
928 
929     case option_transform:
930       /* This option has no affect other than to use the defaults,
931 	 which are already set.  */
932       return 1;
933 
934     case option_no_transform:
935       /* This option turns off all transformations of any kind.
936 	 However, because we want to preserve the state of other
937 	 directives, we only change its own field.  Thus, before
938 	 you perform any transformation, always check if transform
939 	 is available.  If you use the functions we provide for this
940 	 purpose, you will be ok.  */
941       directive_state[directive_transform] = FALSE;
942       return 1;
943 
944     default:
945       return 0;
946     }
947 }
948 
949 
950 void
951 md_show_usage (FILE *stream)
952 {
953   fputs ("\n\
954 Xtensa options:\n\
955   --[no-]text-section-literals\n\
956                           [Do not] put literals in the text section\n\
957   --[no-]absolute-literals\n\
958                           [Do not] default to use non-PC-relative literals\n\
959   --[no-]target-align     [Do not] try to align branch targets\n\
960   --[no-]longcalls        [Do not] emit 32-bit call sequences\n\
961   --[no-]transform        [Do not] transform instructions\n\
962   --flix                  both allow hand-written and generate flix bundles\n\
963   --no-generate-flix      allow hand-written but do not generate\n\
964                           flix bundles\n\
965   --no-allow-flix         neither allow hand-written nor generate\n\
966                           flix bundles\n\
967   --rename-section old=new Rename section 'old' to 'new'\n", stream);
968 }
969 
970 
971 /* Functions related to the list of current label symbols.  */
972 
973 static void
974 xtensa_add_insn_label (symbolS *sym)
975 {
976   sym_list *l;
977 
978   if (!free_insn_labels)
979     l = (sym_list *) xmalloc (sizeof (sym_list));
980   else
981     {
982       l = free_insn_labels;
983       free_insn_labels = l->next;
984     }
985 
986   l->sym = sym;
987   l->next = insn_labels;
988   insn_labels = l;
989 }
990 
991 
992 static void
993 xtensa_clear_insn_labels (void)
994 {
995   sym_list **pl;
996 
997   for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
998     ;
999   *pl = insn_labels;
1000   insn_labels = NULL;
1001 }
1002 
1003 
1004 static void
1005 xtensa_move_labels (fragS *new_frag, valueT new_offset)
1006 {
1007   sym_list *lit;
1008 
1009   for (lit = insn_labels; lit; lit = lit->next)
1010     {
1011       symbolS *lit_sym = lit->sym;
1012       S_SET_VALUE (lit_sym, new_offset);
1013       symbol_set_frag (lit_sym, new_frag);
1014     }
1015 }
1016 
1017 
1018 /* Directive data and functions.  */
1019 
1020 typedef struct state_stackS_struct
1021 {
1022   directiveE directive;
1023   bfd_boolean negated;
1024   bfd_boolean old_state;
1025   const char *file;
1026   unsigned int line;
1027   const void *datum;
1028   struct state_stackS_struct *prev;
1029 } state_stackS;
1030 
1031 state_stackS *directive_state_stack;
1032 
1033 const pseudo_typeS md_pseudo_table[] =
1034 {
1035   { "align", s_align_bytes, 0 }, /* Defaulting is invalid (0).  */
1036   { "literal_position", xtensa_literal_position, 0 },
1037   { "frame", s_ignore, 0 },	/* Formerly used for STABS debugging.  */
1038   { "long", xtensa_elf_cons, 4 },
1039   { "word", xtensa_elf_cons, 4 },
1040   { "4byte", xtensa_elf_cons, 4 },
1041   { "short", xtensa_elf_cons, 2 },
1042   { "2byte", xtensa_elf_cons, 2 },
1043   { "sleb128", xtensa_leb128, 1},
1044   { "uleb128", xtensa_leb128, 0},
1045   { "begin", xtensa_begin_directive, 0 },
1046   { "end", xtensa_end_directive, 0 },
1047   { "literal", xtensa_literal_pseudo, 0 },
1048   { "frequency", xtensa_frequency_pseudo, 0 },
1049   { NULL, 0, 0 },
1050 };
1051 
1052 
1053 static bfd_boolean
1054 use_transform (void)
1055 {
1056   /* After md_end, you should be checking frag by frag, rather
1057      than state directives.  */
1058   gas_assert (!past_xtensa_end);
1059   return directive_state[directive_transform];
1060 }
1061 
1062 
1063 static bfd_boolean
1064 do_align_targets (void)
1065 {
1066   /* Do not use this function after md_end; just look at align_targets
1067      instead.  There is no target-align directive, so alignment is either
1068      enabled for all frags or not done at all.  */
1069   gas_assert (!past_xtensa_end);
1070   return align_targets && use_transform ();
1071 }
1072 
1073 
1074 static void
1075 directive_push (directiveE directive, bfd_boolean negated, const void *datum)
1076 {
1077   char *file;
1078   unsigned int line;
1079   state_stackS *stack = (state_stackS *) xmalloc (sizeof (state_stackS));
1080 
1081   as_where (&file, &line);
1082 
1083   stack->directive = directive;
1084   stack->negated = negated;
1085   stack->old_state = directive_state[directive];
1086   stack->file = file;
1087   stack->line = line;
1088   stack->datum = datum;
1089   stack->prev = directive_state_stack;
1090   directive_state_stack = stack;
1091 
1092   directive_state[directive] = !negated;
1093 }
1094 
1095 
1096 static void
1097 directive_pop (directiveE *directive,
1098 	       bfd_boolean *negated,
1099 	       const char **file,
1100 	       unsigned int *line,
1101 	       const void **datum)
1102 {
1103   state_stackS *top = directive_state_stack;
1104 
1105   if (!directive_state_stack)
1106     {
1107       as_bad (_("unmatched end directive"));
1108       *directive = directive_none;
1109       return;
1110     }
1111 
1112   directive_state[directive_state_stack->directive] = top->old_state;
1113   *directive = top->directive;
1114   *negated = top->negated;
1115   *file = top->file;
1116   *line = top->line;
1117   *datum = top->datum;
1118   directive_state_stack = top->prev;
1119   free (top);
1120 }
1121 
1122 
1123 static void
1124 directive_balance (void)
1125 {
1126   while (directive_state_stack)
1127     {
1128       directiveE directive;
1129       bfd_boolean negated;
1130       const char *file;
1131       unsigned int line;
1132       const void *datum;
1133 
1134       directive_pop (&directive, &negated, &file, &line, &datum);
1135       as_warn_where ((char *) file, line,
1136 		     _(".begin directive with no matching .end directive"));
1137     }
1138 }
1139 
1140 
1141 static bfd_boolean
1142 inside_directive (directiveE dir)
1143 {
1144   state_stackS *top = directive_state_stack;
1145 
1146   while (top && top->directive != dir)
1147     top = top->prev;
1148 
1149   return (top != NULL);
1150 }
1151 
1152 
1153 static void
1154 get_directive (directiveE *directive, bfd_boolean *negated)
1155 {
1156   int len;
1157   unsigned i;
1158   char *directive_string;
1159 
1160   if (strncmp (input_line_pointer, "no-", 3) != 0)
1161     *negated = FALSE;
1162   else
1163     {
1164       *negated = TRUE;
1165       input_line_pointer += 3;
1166     }
1167 
1168   len = strspn (input_line_pointer,
1169 		"abcdefghijklmnopqrstuvwxyz_-/0123456789.");
1170 
1171   /* This code is a hack to make .begin [no-][generics|relax] exactly
1172      equivalent to .begin [no-]transform.  We should remove it when
1173      we stop accepting those options.  */
1174 
1175   if (strncmp (input_line_pointer, "generics", strlen ("generics")) == 0)
1176     {
1177       as_warn (_("[no-]generics is deprecated; use [no-]transform instead"));
1178       directive_string = "transform";
1179     }
1180   else if (strncmp (input_line_pointer, "relax", strlen ("relax")) == 0)
1181     {
1182       as_warn (_("[no-]relax is deprecated; use [no-]transform instead"));
1183       directive_string = "transform";
1184     }
1185   else
1186     directive_string = input_line_pointer;
1187 
1188   for (i = 0; i < sizeof (directive_info) / sizeof (*directive_info); ++i)
1189     {
1190       if (strncmp (directive_string, directive_info[i].name, len) == 0)
1191 	{
1192 	  input_line_pointer += len;
1193 	  *directive = (directiveE) i;
1194 	  if (*negated && !directive_info[i].can_be_negated)
1195 	    as_bad (_("directive %s cannot be negated"),
1196 		    directive_info[i].name);
1197 	  return;
1198 	}
1199     }
1200 
1201   as_bad (_("unknown directive"));
1202   *directive = (directiveE) XTENSA_UNDEFINED;
1203 }
1204 
1205 
1206 static void
1207 xtensa_begin_directive (int ignore ATTRIBUTE_UNUSED)
1208 {
1209   directiveE directive;
1210   bfd_boolean negated;
1211   emit_state *state;
1212   lit_state *ls;
1213 
1214   get_directive (&directive, &negated);
1215   if (directive == (directiveE) XTENSA_UNDEFINED)
1216     {
1217       discard_rest_of_line ();
1218       return;
1219     }
1220 
1221   if (cur_vinsn.inside_bundle)
1222     as_bad (_("directives are not valid inside bundles"));
1223 
1224   switch (directive)
1225     {
1226     case directive_literal:
1227       if (!inside_directive (directive_literal))
1228 	{
1229 	  /* Previous labels go with whatever follows this directive, not with
1230 	     the literal, so save them now.  */
1231 	  saved_insn_labels = insn_labels;
1232 	  insn_labels = NULL;
1233 	}
1234       as_warn (_(".begin literal is deprecated; use .literal instead"));
1235       state = (emit_state *) xmalloc (sizeof (emit_state));
1236       xtensa_switch_to_literal_fragment (state);
1237       directive_push (directive_literal, negated, state);
1238       break;
1239 
1240     case directive_literal_prefix:
1241       /* Have to flush pending output because a movi relaxed to an l32r
1242 	 might produce a literal.  */
1243       md_flush_pending_output ();
1244       /* Check to see if the current fragment is a literal
1245 	 fragment.  If it is, then this operation is not allowed.  */
1246       if (generating_literals)
1247 	{
1248 	  as_bad (_("cannot set literal_prefix inside literal fragment"));
1249 	  return;
1250 	}
1251 
1252       /* Allocate the literal state for this section and push
1253 	 onto the directive stack.  */
1254       ls = xmalloc (sizeof (lit_state));
1255       gas_assert (ls);
1256 
1257       *ls = default_lit_sections;
1258       directive_push (directive_literal_prefix, negated, ls);
1259 
1260       /* Process the new prefix.  */
1261       xtensa_literal_prefix ();
1262       break;
1263 
1264     case directive_freeregs:
1265       /* This information is currently unused, but we'll accept the statement
1266          and just discard the rest of the line.  This won't check the syntax,
1267          but it will accept every correct freeregs directive.  */
1268       input_line_pointer += strcspn (input_line_pointer, "\n");
1269       directive_push (directive_freeregs, negated, 0);
1270       break;
1271 
1272     case directive_schedule:
1273       md_flush_pending_output ();
1274       frag_var (rs_fill, 0, 0, frag_now->fr_subtype,
1275 		frag_now->fr_symbol, frag_now->fr_offset, NULL);
1276       directive_push (directive_schedule, negated, 0);
1277       xtensa_set_frag_assembly_state (frag_now);
1278       break;
1279 
1280     case directive_density:
1281       as_warn (_(".begin [no-]density is ignored"));
1282       break;
1283 
1284     case directive_absolute_literals:
1285       md_flush_pending_output ();
1286       if (!absolute_literals_supported && !negated)
1287 	{
1288 	  as_warn (_("Xtensa absolute literals option not supported; ignored"));
1289 	  break;
1290 	}
1291       xtensa_set_frag_assembly_state (frag_now);
1292       directive_push (directive, negated, 0);
1293       break;
1294 
1295     default:
1296       md_flush_pending_output ();
1297       xtensa_set_frag_assembly_state (frag_now);
1298       directive_push (directive, negated, 0);
1299       break;
1300     }
1301 
1302   demand_empty_rest_of_line ();
1303 }
1304 
1305 
1306 static void
1307 xtensa_end_directive (int ignore ATTRIBUTE_UNUSED)
1308 {
1309   directiveE begin_directive, end_directive;
1310   bfd_boolean begin_negated, end_negated;
1311   const char *file;
1312   unsigned int line;
1313   emit_state *state;
1314   emit_state **state_ptr;
1315   lit_state *s;
1316 
1317   if (cur_vinsn.inside_bundle)
1318     as_bad (_("directives are not valid inside bundles"));
1319 
1320   get_directive (&end_directive, &end_negated);
1321 
1322   md_flush_pending_output ();
1323 
1324   switch ((int) end_directive)
1325     {
1326     case XTENSA_UNDEFINED:
1327       discard_rest_of_line ();
1328       return;
1329 
1330     case (int) directive_density:
1331       as_warn (_(".end [no-]density is ignored"));
1332       demand_empty_rest_of_line ();
1333       break;
1334 
1335     case (int) directive_absolute_literals:
1336       if (!absolute_literals_supported && !end_negated)
1337 	{
1338 	  as_warn (_("Xtensa absolute literals option not supported; ignored"));
1339 	  demand_empty_rest_of_line ();
1340 	  return;
1341 	}
1342       break;
1343 
1344     default:
1345       break;
1346     }
1347 
1348   state_ptr = &state; /* use state_ptr to avoid type-punning warning */
1349   directive_pop (&begin_directive, &begin_negated, &file, &line,
1350 		 (const void **) state_ptr);
1351 
1352   if (begin_directive != directive_none)
1353     {
1354       if (begin_directive != end_directive || begin_negated != end_negated)
1355 	{
1356 	  as_bad (_("does not match begin %s%s at %s:%d"),
1357 		  begin_negated ? "no-" : "",
1358 		  directive_info[begin_directive].name, file, line);
1359 	}
1360       else
1361 	{
1362 	  switch (end_directive)
1363 	    {
1364 	    case directive_literal:
1365 	      frag_var (rs_fill, 0, 0, 0, NULL, 0, NULL);
1366 	      xtensa_restore_emit_state (state);
1367 	      xtensa_set_frag_assembly_state (frag_now);
1368 	      free (state);
1369 	      if (!inside_directive (directive_literal))
1370 		{
1371 		  /* Restore the list of current labels.  */
1372 		  xtensa_clear_insn_labels ();
1373 		  insn_labels = saved_insn_labels;
1374 		}
1375 	      break;
1376 
1377 	    case directive_literal_prefix:
1378 	      /* Restore the default collection sections from saved state.  */
1379 	      s = (lit_state *) state;
1380 	      gas_assert (s);
1381 	      default_lit_sections = *s;
1382 
1383 	      /* Free the state storage.  */
1384 	      free (s->lit_prefix);
1385 	      free (s);
1386 	      break;
1387 
1388 	    case directive_schedule:
1389 	    case directive_freeregs:
1390 	      break;
1391 
1392 	    default:
1393 	      xtensa_set_frag_assembly_state (frag_now);
1394 	      break;
1395 	    }
1396 	}
1397     }
1398 
1399   demand_empty_rest_of_line ();
1400 }
1401 
1402 
1403 /* Place an aligned literal fragment at the current location.  */
1404 
1405 static void
1406 xtensa_literal_position (int ignore ATTRIBUTE_UNUSED)
1407 {
1408   md_flush_pending_output ();
1409 
1410   if (inside_directive (directive_literal))
1411     as_warn (_(".literal_position inside literal directive; ignoring"));
1412   xtensa_mark_literal_pool_location ();
1413 
1414   demand_empty_rest_of_line ();
1415   xtensa_clear_insn_labels ();
1416 }
1417 
1418 
1419 /* Support .literal label, expr, ...  */
1420 
1421 static void
1422 xtensa_literal_pseudo (int ignored ATTRIBUTE_UNUSED)
1423 {
1424   emit_state state;
1425   char *p, *base_name;
1426   char c;
1427   segT dest_seg;
1428 
1429   if (inside_directive (directive_literal))
1430     {
1431       as_bad (_(".literal not allowed inside .begin literal region"));
1432       ignore_rest_of_line ();
1433       return;
1434     }
1435 
1436   md_flush_pending_output ();
1437 
1438   /* Previous labels go with whatever follows this directive, not with
1439      the literal, so save them now.  */
1440   saved_insn_labels = insn_labels;
1441   insn_labels = NULL;
1442 
1443   /* If we are using text-section literals, then this is the right value... */
1444   dest_seg = now_seg;
1445 
1446   base_name = input_line_pointer;
1447 
1448   xtensa_switch_to_literal_fragment (&state);
1449 
1450   /* ...but if we aren't using text-section-literals, then we
1451      need to put them in the section we just switched to.  */
1452   if (use_literal_section || directive_state[directive_absolute_literals])
1453     dest_seg = now_seg;
1454 
1455   /* FIXME, despite the previous comments, dest_seg is unused...  */
1456   (void) dest_seg;
1457 
1458   /* All literals are aligned to four-byte boundaries.  */
1459   frag_align (2, 0, 0);
1460   record_alignment (now_seg, 2);
1461 
1462   c = get_symbol_end ();
1463   /* Just after name is now '\0'.  */
1464   p = input_line_pointer;
1465   *p = c;
1466   SKIP_WHITESPACE ();
1467 
1468   if (*input_line_pointer != ',' && *input_line_pointer != ':')
1469     {
1470       as_bad (_("expected comma or colon after symbol name; "
1471 		"rest of line ignored"));
1472       ignore_rest_of_line ();
1473       xtensa_restore_emit_state (&state);
1474       return;
1475     }
1476   *p = 0;
1477 
1478   colon (base_name);
1479 
1480   *p = c;
1481   input_line_pointer++;		/* skip ',' or ':' */
1482 
1483   xtensa_elf_cons (4);
1484 
1485   xtensa_restore_emit_state (&state);
1486 
1487   /* Restore the list of current labels.  */
1488   xtensa_clear_insn_labels ();
1489   insn_labels = saved_insn_labels;
1490 }
1491 
1492 
1493 static void
1494 xtensa_literal_prefix (void)
1495 {
1496   char *name;
1497   int len;
1498 
1499   /* Parse the new prefix from the input_line_pointer.  */
1500   SKIP_WHITESPACE ();
1501   len = strspn (input_line_pointer,
1502 		"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
1503 		"abcdefghijklmnopqrstuvwxyz_/0123456789.$");
1504 
1505   /* Get a null-terminated copy of the name.  */
1506   name = xmalloc (len + 1);
1507   gas_assert (name);
1508   strncpy (name, input_line_pointer, len);
1509   name[len] = 0;
1510 
1511   /* Skip the name in the input line.  */
1512   input_line_pointer += len;
1513 
1514   default_lit_sections.lit_prefix = name;
1515 
1516   /* Clear cached literal sections, since the prefix has changed.  */
1517   default_lit_sections.lit_seg = NULL;
1518   default_lit_sections.lit4_seg = NULL;
1519 }
1520 
1521 
1522 /* Support ".frequency branch_target_frequency fall_through_frequency".  */
1523 
1524 static void
1525 xtensa_frequency_pseudo (int ignored ATTRIBUTE_UNUSED)
1526 {
1527   float fall_through_f, target_f;
1528 
1529   fall_through_f = (float) strtod (input_line_pointer, &input_line_pointer);
1530   if (fall_through_f < 0)
1531     {
1532       as_bad (_("fall through frequency must be greater than 0"));
1533       ignore_rest_of_line ();
1534       return;
1535     }
1536 
1537   target_f = (float) strtod (input_line_pointer, &input_line_pointer);
1538   if (target_f < 0)
1539     {
1540       as_bad (_("branch target frequency must be greater than 0"));
1541       ignore_rest_of_line ();
1542       return;
1543     }
1544 
1545   set_subseg_freq (now_seg, now_subseg, target_f + fall_through_f, target_f);
1546 
1547   demand_empty_rest_of_line ();
1548 }
1549 
1550 
1551 /* Like normal .long/.short/.word, except support @plt, etc.
1552    Clobbers input_line_pointer, checks end-of-line.  */
1553 
1554 static void
1555 xtensa_elf_cons (int nbytes)
1556 {
1557   expressionS exp;
1558   bfd_reloc_code_real_type reloc;
1559 
1560   md_flush_pending_output ();
1561 
1562   if (cur_vinsn.inside_bundle)
1563     as_bad (_("directives are not valid inside bundles"));
1564 
1565   if (is_it_end_of_statement ())
1566     {
1567       demand_empty_rest_of_line ();
1568       return;
1569     }
1570 
1571   do
1572     {
1573       expression (&exp);
1574       if (exp.X_op == O_symbol
1575 	  && *input_line_pointer == '@'
1576 	  && ((reloc = xtensa_elf_suffix (&input_line_pointer, &exp))
1577 	      != BFD_RELOC_NONE))
1578 	{
1579 	  reloc_howto_type *reloc_howto =
1580 	    bfd_reloc_type_lookup (stdoutput, reloc);
1581 
1582 	  if (reloc == BFD_RELOC_UNUSED || !reloc_howto)
1583 	    as_bad (_("unsupported relocation"));
1584 	  else if ((reloc >= BFD_RELOC_XTENSA_SLOT0_OP
1585 		    && reloc <= BFD_RELOC_XTENSA_SLOT14_OP)
1586 		   || (reloc >= BFD_RELOC_XTENSA_SLOT0_ALT
1587 		       && reloc <= BFD_RELOC_XTENSA_SLOT14_ALT))
1588 	    as_bad (_("opcode-specific %s relocation used outside "
1589 		      "an instruction"), reloc_howto->name);
1590 	  else if (nbytes != (int) bfd_get_reloc_size (reloc_howto))
1591 	    as_bad (_("%s relocations do not fit in %d bytes"),
1592 		    reloc_howto->name, nbytes);
1593 	  else if (reloc == BFD_RELOC_XTENSA_TLS_FUNC
1594 		   || reloc == BFD_RELOC_XTENSA_TLS_ARG
1595 		   || reloc == BFD_RELOC_XTENSA_TLS_CALL)
1596 	    as_bad (_("invalid use of %s relocation"), reloc_howto->name);
1597 	  else
1598 	    {
1599 	      char *p = frag_more ((int) nbytes);
1600 	      xtensa_set_frag_assembly_state (frag_now);
1601 	      fix_new_exp (frag_now, p - frag_now->fr_literal,
1602 			   nbytes, &exp, reloc_howto->pc_relative, reloc);
1603 	    }
1604 	}
1605       else
1606 	{
1607 	  xtensa_set_frag_assembly_state (frag_now);
1608 	  emit_expr (&exp, (unsigned int) nbytes);
1609 	}
1610     }
1611   while (*input_line_pointer++ == ',');
1612 
1613   input_line_pointer--;		/* Put terminator back into stream.  */
1614   demand_empty_rest_of_line ();
1615 }
1616 
1617 static bfd_boolean is_leb128_expr;
1618 
1619 static void
1620 xtensa_leb128 (int sign)
1621 {
1622   is_leb128_expr = TRUE;
1623   s_leb128 (sign);
1624   is_leb128_expr = FALSE;
1625 }
1626 
1627 
1628 /* Parsing and Idiom Translation.  */
1629 
1630 /* Parse @plt, etc. and return the desired relocation.  */
1631 static bfd_reloc_code_real_type
1632 xtensa_elf_suffix (char **str_p, expressionS *exp_p)
1633 {
1634   char ident[20];
1635   char *str = *str_p;
1636   char *str2;
1637   int ch;
1638   int len;
1639   struct suffix_reloc_map *ptr;
1640 
1641   if (*str++ != '@')
1642     return BFD_RELOC_NONE;
1643 
1644   for (ch = *str, str2 = ident;
1645        (str2 < ident + sizeof (ident) - 1
1646 	&& (ISALNUM (ch) || ch == '@'));
1647        ch = *++str)
1648     {
1649       *str2++ = (ISLOWER (ch)) ? ch : TOLOWER (ch);
1650     }
1651 
1652   *str2 = '\0';
1653   len = str2 - ident;
1654 
1655   ch = ident[0];
1656   for (ptr = &suffix_relocs[0]; ptr->length > 0; ptr++)
1657     if (ch == ptr->suffix[0]
1658 	&& len == ptr->length
1659 	&& memcmp (ident, ptr->suffix, ptr->length) == 0)
1660       {
1661 	/* Now check for "identifier@suffix+constant".  */
1662 	if (*str == '-' || *str == '+')
1663 	  {
1664 	    char *orig_line = input_line_pointer;
1665 	    expressionS new_exp;
1666 
1667 	    input_line_pointer = str;
1668 	    expression (&new_exp);
1669 	    if (new_exp.X_op == O_constant)
1670 	      {
1671 		exp_p->X_add_number += new_exp.X_add_number;
1672 		str = input_line_pointer;
1673 	      }
1674 
1675 	    if (&input_line_pointer != str_p)
1676 	      input_line_pointer = orig_line;
1677 	  }
1678 
1679 	*str_p = str;
1680 	return ptr->reloc;
1681       }
1682 
1683   return BFD_RELOC_UNUSED;
1684 }
1685 
1686 
1687 /* Find the matching operator type.  */
1688 static unsigned char
1689 map_suffix_reloc_to_operator (bfd_reloc_code_real_type reloc)
1690 {
1691   struct suffix_reloc_map *sfx;
1692   unsigned char operator = (unsigned char) -1;
1693 
1694   for (sfx = &suffix_relocs[0]; sfx->suffix; sfx++)
1695     {
1696       if (sfx->reloc == reloc)
1697 	{
1698 	  operator = sfx->operator;
1699 	  break;
1700 	}
1701     }
1702   gas_assert (operator != (unsigned char) -1);
1703   return operator;
1704 }
1705 
1706 
1707 /* Find the matching reloc type.  */
1708 static bfd_reloc_code_real_type
1709 map_operator_to_reloc (unsigned char operator, bfd_boolean is_literal)
1710 {
1711   struct suffix_reloc_map *sfx;
1712   bfd_reloc_code_real_type reloc = BFD_RELOC_UNUSED;
1713 
1714   for (sfx = &suffix_relocs[0]; sfx->suffix; sfx++)
1715     {
1716       if (sfx->operator == operator)
1717 	{
1718 	  reloc = sfx->reloc;
1719 	  break;
1720 	}
1721     }
1722 
1723   if (is_literal)
1724     {
1725       if (reloc == BFD_RELOC_XTENSA_TLS_FUNC)
1726 	return BFD_RELOC_XTENSA_TLSDESC_FN;
1727       else if (reloc == BFD_RELOC_XTENSA_TLS_ARG)
1728 	return BFD_RELOC_XTENSA_TLSDESC_ARG;
1729     }
1730 
1731   if (reloc == BFD_RELOC_UNUSED)
1732     return BFD_RELOC_32;
1733 
1734   return reloc;
1735 }
1736 
1737 
1738 static const char *
1739 expression_end (const char *name)
1740 {
1741   while (1)
1742     {
1743       switch (*name)
1744 	{
1745 	case '}':
1746 	case ';':
1747 	case '\0':
1748 	case ',':
1749 	case ':':
1750 	  return name;
1751 	case ' ':
1752 	case '\t':
1753 	  ++name;
1754 	  continue;
1755 	default:
1756 	  return 0;
1757 	}
1758     }
1759 }
1760 
1761 
1762 #define ERROR_REG_NUM ((unsigned) -1)
1763 
1764 static unsigned
1765 tc_get_register (const char *prefix)
1766 {
1767   unsigned reg;
1768   const char *next_expr;
1769   const char *old_line_pointer;
1770 
1771   SKIP_WHITESPACE ();
1772   old_line_pointer = input_line_pointer;
1773 
1774   if (*input_line_pointer == '$')
1775     ++input_line_pointer;
1776 
1777   /* Accept "sp" as a synonym for "a1".  */
1778   if (input_line_pointer[0] == 's' && input_line_pointer[1] == 'p'
1779       && expression_end (input_line_pointer + 2))
1780     {
1781       input_line_pointer += 2;
1782       return 1;  /* AR[1] */
1783     }
1784 
1785   while (*input_line_pointer++ == *prefix++)
1786     ;
1787   --input_line_pointer;
1788   --prefix;
1789 
1790   if (*prefix)
1791     {
1792       as_bad (_("bad register name: %s"), old_line_pointer);
1793       return ERROR_REG_NUM;
1794     }
1795 
1796   if (!ISDIGIT ((unsigned char) *input_line_pointer))
1797     {
1798       as_bad (_("bad register number: %s"), input_line_pointer);
1799       return ERROR_REG_NUM;
1800     }
1801 
1802   reg = 0;
1803 
1804   while (ISDIGIT ((int) *input_line_pointer))
1805     reg = reg * 10 + *input_line_pointer++ - '0';
1806 
1807   if (!(next_expr = expression_end (input_line_pointer)))
1808     {
1809       as_bad (_("bad register name: %s"), old_line_pointer);
1810       return ERROR_REG_NUM;
1811     }
1812 
1813   input_line_pointer = (char *) next_expr;
1814 
1815   return reg;
1816 }
1817 
1818 
1819 static void
1820 expression_maybe_register (xtensa_opcode opc, int opnd, expressionS *tok)
1821 {
1822   xtensa_isa isa = xtensa_default_isa;
1823 
1824   /* Check if this is an immediate operand.  */
1825   if (xtensa_operand_is_register (isa, opc, opnd) == 0)
1826     {
1827       bfd_reloc_code_real_type reloc;
1828       segT t = expression (tok);
1829 
1830       if (t == absolute_section
1831 	  && xtensa_operand_is_PCrelative (isa, opc, opnd) == 1)
1832 	{
1833 	  gas_assert (tok->X_op == O_constant);
1834 	  tok->X_op = O_symbol;
1835 	  tok->X_add_symbol = &abs_symbol;
1836 	}
1837 
1838       if ((tok->X_op == O_constant || tok->X_op == O_symbol)
1839 	  && ((reloc = xtensa_elf_suffix (&input_line_pointer, tok))
1840 	      != BFD_RELOC_NONE))
1841 	{
1842 	  switch (reloc)
1843 	    {
1844 	    case BFD_RELOC_LO16:
1845 	      if (tok->X_op == O_constant)
1846 		{
1847 		  tok->X_add_number &= 0xffff;
1848 		  return;
1849 		}
1850 	      break;
1851 	    case BFD_RELOC_HI16:
1852 	      if (tok->X_op == O_constant)
1853 		{
1854 		  tok->X_add_number = ((unsigned) tok->X_add_number) >> 16;
1855 		  return;
1856 		}
1857 	      break;
1858 	    case BFD_RELOC_UNUSED:
1859 	      as_bad (_("unsupported relocation"));
1860 	      return;
1861 	    case BFD_RELOC_32_PCREL:
1862 	      as_bad (_("pcrel relocation not allowed in an instruction"));
1863 	      return;
1864 	    default:
1865 	      break;
1866 	    }
1867 	  tok->X_op = map_suffix_reloc_to_operator (reloc);
1868 	}
1869     }
1870   else
1871     {
1872       xtensa_regfile opnd_rf = xtensa_operand_regfile (isa, opc, opnd);
1873       unsigned reg = tc_get_register (xtensa_regfile_shortname (isa, opnd_rf));
1874 
1875       if (reg != ERROR_REG_NUM)	/* Already errored */
1876 	{
1877 	  uint32 buf = reg;
1878 	  if (xtensa_operand_encode (isa, opc, opnd, &buf))
1879 	    as_bad (_("register number out of range"));
1880 	}
1881 
1882       tok->X_op = O_register;
1883       tok->X_add_symbol = 0;
1884       tok->X_add_number = reg;
1885     }
1886 }
1887 
1888 
1889 /* Split up the arguments for an opcode or pseudo-op.  */
1890 
1891 static int
1892 tokenize_arguments (char **args, char *str)
1893 {
1894   char *old_input_line_pointer;
1895   bfd_boolean saw_comma = FALSE;
1896   bfd_boolean saw_arg = FALSE;
1897   bfd_boolean saw_colon = FALSE;
1898   int num_args = 0;
1899   char *arg_end, *arg;
1900   int arg_len;
1901 
1902   /* Save and restore input_line_pointer around this function.  */
1903   old_input_line_pointer = input_line_pointer;
1904   input_line_pointer = str;
1905 
1906   while (*input_line_pointer)
1907     {
1908       SKIP_WHITESPACE ();
1909       switch (*input_line_pointer)
1910 	{
1911 	case '\0':
1912 	case '}':
1913 	  goto fini;
1914 
1915 	case ':':
1916 	  input_line_pointer++;
1917 	  if (saw_comma || saw_colon || !saw_arg)
1918 	    goto err;
1919 	  saw_colon = TRUE;
1920 	  break;
1921 
1922 	case ',':
1923 	  input_line_pointer++;
1924 	  if (saw_comma || saw_colon || !saw_arg)
1925 	    goto err;
1926 	  saw_comma = TRUE;
1927 	  break;
1928 
1929 	default:
1930 	  if (!saw_comma && !saw_colon && saw_arg)
1931 	    goto err;
1932 
1933 	  arg_end = input_line_pointer + 1;
1934 	  while (!expression_end (arg_end))
1935 	    arg_end += 1;
1936 
1937 	  arg_len = arg_end - input_line_pointer;
1938 	  arg = (char *) xmalloc ((saw_colon ? 1 : 0) + arg_len + 1);
1939 	  args[num_args] = arg;
1940 
1941 	  if (saw_colon)
1942 	    *arg++ = ':';
1943 	  strncpy (arg, input_line_pointer, arg_len);
1944 	  arg[arg_len] = '\0';
1945 
1946 	  input_line_pointer = arg_end;
1947 	  num_args += 1;
1948 	  saw_comma = FALSE;
1949 	  saw_colon = FALSE;
1950 	  saw_arg = TRUE;
1951 	  break;
1952 	}
1953     }
1954 
1955 fini:
1956   if (saw_comma || saw_colon)
1957     goto err;
1958   input_line_pointer = old_input_line_pointer;
1959   return num_args;
1960 
1961 err:
1962   if (saw_comma)
1963     as_bad (_("extra comma"));
1964   else if (saw_colon)
1965     as_bad (_("extra colon"));
1966   else if (!saw_arg)
1967     as_bad (_("missing argument"));
1968   else
1969     as_bad (_("missing comma or colon"));
1970   input_line_pointer = old_input_line_pointer;
1971   return -1;
1972 }
1973 
1974 
1975 /* Parse the arguments to an opcode.  Return TRUE on error.  */
1976 
1977 static bfd_boolean
1978 parse_arguments (TInsn *insn, int num_args, char **arg_strings)
1979 {
1980   expressionS *tok, *last_tok;
1981   xtensa_opcode opcode = insn->opcode;
1982   bfd_boolean had_error = TRUE;
1983   xtensa_isa isa = xtensa_default_isa;
1984   int n, num_regs = 0;
1985   int opcode_operand_count;
1986   int opnd_cnt, last_opnd_cnt;
1987   unsigned int next_reg = 0;
1988   char *old_input_line_pointer;
1989 
1990   if (insn->insn_type == ITYPE_LITERAL)
1991     opcode_operand_count = 1;
1992   else
1993     opcode_operand_count = xtensa_opcode_num_operands (isa, opcode);
1994 
1995   tok = insn->tok;
1996   memset (tok, 0, sizeof (*tok) * MAX_INSN_ARGS);
1997 
1998   /* Save and restore input_line_pointer around this function.  */
1999   old_input_line_pointer = input_line_pointer;
2000 
2001   last_tok = 0;
2002   last_opnd_cnt = -1;
2003   opnd_cnt = 0;
2004 
2005   /* Skip invisible operands.  */
2006   while (xtensa_operand_is_visible (isa, opcode, opnd_cnt) == 0)
2007     {
2008       opnd_cnt += 1;
2009       tok++;
2010     }
2011 
2012   for (n = 0; n < num_args; n++)
2013     {
2014       input_line_pointer = arg_strings[n];
2015       if (*input_line_pointer == ':')
2016 	{
2017 	  xtensa_regfile opnd_rf;
2018 	  input_line_pointer++;
2019 	  if (num_regs == 0)
2020 	    goto err;
2021 	  gas_assert (opnd_cnt > 0);
2022 	  num_regs--;
2023 	  opnd_rf = xtensa_operand_regfile (isa, opcode, last_opnd_cnt);
2024 	  if (next_reg
2025 	      != tc_get_register (xtensa_regfile_shortname (isa, opnd_rf)))
2026 	    as_warn (_("incorrect register number, ignoring"));
2027 	  next_reg++;
2028 	}
2029       else
2030 	{
2031 	  if (opnd_cnt >= opcode_operand_count)
2032 	    {
2033 	      as_warn (_("too many arguments"));
2034 	      goto err;
2035 	    }
2036 	  gas_assert (opnd_cnt < MAX_INSN_ARGS);
2037 
2038 	  expression_maybe_register (opcode, opnd_cnt, tok);
2039 	  next_reg = tok->X_add_number + 1;
2040 
2041 	  if (tok->X_op == O_illegal || tok->X_op == O_absent)
2042 	    goto err;
2043 	  if (xtensa_operand_is_register (isa, opcode, opnd_cnt) == 1)
2044 	    {
2045 	      num_regs = xtensa_operand_num_regs (isa, opcode, opnd_cnt) - 1;
2046 	      /* minus 1 because we are seeing one right now */
2047 	    }
2048 	  else
2049 	    num_regs = 0;
2050 
2051 	  last_tok = tok;
2052 	  last_opnd_cnt = opnd_cnt;
2053 	  demand_empty_rest_of_line ();
2054 
2055 	  do
2056 	    {
2057 	      opnd_cnt += 1;
2058 	      tok++;
2059 	    }
2060 	  while (xtensa_operand_is_visible (isa, opcode, opnd_cnt) == 0);
2061 	}
2062     }
2063 
2064   if (num_regs > 0 && ((int) next_reg != last_tok->X_add_number + 1))
2065     goto err;
2066 
2067   insn->ntok = tok - insn->tok;
2068   had_error = FALSE;
2069 
2070  err:
2071   input_line_pointer = old_input_line_pointer;
2072   return had_error;
2073 }
2074 
2075 
2076 static int
2077 get_invisible_operands (TInsn *insn)
2078 {
2079   xtensa_isa isa = xtensa_default_isa;
2080   static xtensa_insnbuf slotbuf = NULL;
2081   xtensa_format fmt;
2082   xtensa_opcode opc = insn->opcode;
2083   int slot, opnd, fmt_found;
2084   unsigned val;
2085 
2086   if (!slotbuf)
2087     slotbuf = xtensa_insnbuf_alloc (isa);
2088 
2089   /* Find format/slot where this can be encoded.  */
2090   fmt_found = 0;
2091   slot = 0;
2092   for (fmt = 0; fmt < xtensa_isa_num_formats (isa); fmt++)
2093     {
2094       for (slot = 0; slot < xtensa_format_num_slots (isa, fmt); slot++)
2095 	{
2096 	  if (xtensa_opcode_encode (isa, fmt, slot, slotbuf, opc) == 0)
2097 	    {
2098 	      fmt_found = 1;
2099 	      break;
2100 	    }
2101 	}
2102       if (fmt_found) break;
2103     }
2104 
2105   if (!fmt_found)
2106     {
2107       as_bad (_("cannot encode opcode \"%s\""), xtensa_opcode_name (isa, opc));
2108       return -1;
2109     }
2110 
2111   /* First encode all the visible operands
2112      (to deal with shared field operands).  */
2113   for (opnd = 0; opnd < insn->ntok; opnd++)
2114     {
2115       if (xtensa_operand_is_visible (isa, opc, opnd) == 1
2116 	  && (insn->tok[opnd].X_op == O_register
2117 	      || insn->tok[opnd].X_op == O_constant))
2118 	{
2119 	  val = insn->tok[opnd].X_add_number;
2120 	  xtensa_operand_encode (isa, opc, opnd, &val);
2121 	  xtensa_operand_set_field (isa, opc, opnd, fmt, slot, slotbuf, val);
2122 	}
2123     }
2124 
2125   /* Then pull out the values for the invisible ones.  */
2126   for (opnd = 0; opnd < insn->ntok; opnd++)
2127     {
2128       if (xtensa_operand_is_visible (isa, opc, opnd) == 0)
2129 	{
2130 	  xtensa_operand_get_field (isa, opc, opnd, fmt, slot, slotbuf, &val);
2131 	  xtensa_operand_decode (isa, opc, opnd, &val);
2132 	  insn->tok[opnd].X_add_number = val;
2133 	  if (xtensa_operand_is_register (isa, opc, opnd) == 1)
2134 	    insn->tok[opnd].X_op = O_register;
2135 	  else
2136 	    insn->tok[opnd].X_op = O_constant;
2137 	}
2138     }
2139 
2140   return 0;
2141 }
2142 
2143 
2144 static void
2145 xg_reverse_shift_count (char **cnt_argp)
2146 {
2147   char *cnt_arg, *new_arg;
2148   cnt_arg = *cnt_argp;
2149 
2150   /* replace the argument with "31-(argument)" */
2151   new_arg = (char *) xmalloc (strlen (cnt_arg) + 6);
2152   sprintf (new_arg, "31-(%s)", cnt_arg);
2153 
2154   free (cnt_arg);
2155   *cnt_argp = new_arg;
2156 }
2157 
2158 
2159 /* If "arg" is a constant expression, return non-zero with the value
2160    in *valp.  */
2161 
2162 static int
2163 xg_arg_is_constant (char *arg, offsetT *valp)
2164 {
2165   expressionS exp;
2166   char *save_ptr = input_line_pointer;
2167 
2168   input_line_pointer = arg;
2169   expression (&exp);
2170   input_line_pointer = save_ptr;
2171 
2172   if (exp.X_op == O_constant)
2173     {
2174       *valp = exp.X_add_number;
2175       return 1;
2176     }
2177 
2178   return 0;
2179 }
2180 
2181 
2182 static void
2183 xg_replace_opname (char **popname, char *newop)
2184 {
2185   free (*popname);
2186   *popname = (char *) xmalloc (strlen (newop) + 1);
2187   strcpy (*popname, newop);
2188 }
2189 
2190 
2191 static int
2192 xg_check_num_args (int *pnum_args,
2193 		   int expected_num,
2194 		   char *opname,
2195 		   char **arg_strings)
2196 {
2197   int num_args = *pnum_args;
2198 
2199   if (num_args < expected_num)
2200     {
2201       as_bad (_("not enough operands (%d) for '%s'; expected %d"),
2202 	      num_args, opname, expected_num);
2203       return -1;
2204     }
2205 
2206   if (num_args > expected_num)
2207     {
2208       as_warn (_("too many operands (%d) for '%s'; expected %d"),
2209 	       num_args, opname, expected_num);
2210       while (num_args-- > expected_num)
2211 	{
2212 	  free (arg_strings[num_args]);
2213 	  arg_strings[num_args] = 0;
2214 	}
2215       *pnum_args = expected_num;
2216       return -1;
2217     }
2218 
2219   return 0;
2220 }
2221 
2222 
2223 /* If the register is not specified as part of the opcode,
2224    then get it from the operand and move it to the opcode.  */
2225 
2226 static int
2227 xg_translate_sysreg_op (char **popname, int *pnum_args, char **arg_strings)
2228 {
2229   xtensa_isa isa = xtensa_default_isa;
2230   xtensa_sysreg sr;
2231   char *opname, *new_opname;
2232   const char *sr_name;
2233   int is_user, is_write;
2234 
2235   opname = *popname;
2236   if (*opname == '_')
2237     opname += 1;
2238   is_user = (opname[1] == 'u');
2239   is_write = (opname[0] == 'w');
2240 
2241   /* Opname == [rw]ur or [rwx]sr... */
2242 
2243   if (xg_check_num_args (pnum_args, 2, opname, arg_strings))
2244     return -1;
2245 
2246   /* Check if the argument is a symbolic register name.  */
2247   sr = xtensa_sysreg_lookup_name (isa, arg_strings[1]);
2248   /* Handle WSR to "INTSET" as a special case.  */
2249   if (sr == XTENSA_UNDEFINED && is_write && !is_user
2250       && !strcasecmp (arg_strings[1], "intset"))
2251     sr = xtensa_sysreg_lookup_name (isa, "interrupt");
2252   if (sr == XTENSA_UNDEFINED
2253       || (xtensa_sysreg_is_user (isa, sr) == 1) != is_user)
2254     {
2255       /* Maybe it's a register number.... */
2256       offsetT val;
2257       if (!xg_arg_is_constant (arg_strings[1], &val))
2258 	{
2259 	  as_bad (_("invalid register '%s' for '%s' instruction"),
2260 		  arg_strings[1], opname);
2261 	  return -1;
2262 	}
2263       sr = xtensa_sysreg_lookup (isa, val, is_user);
2264       if (sr == XTENSA_UNDEFINED)
2265 	{
2266 	  as_bad (_("invalid register number (%ld) for '%s' instruction"),
2267 		  (long) val, opname);
2268 	  return -1;
2269 	}
2270     }
2271 
2272   /* Remove the last argument, which is now part of the opcode.  */
2273   free (arg_strings[1]);
2274   arg_strings[1] = 0;
2275   *pnum_args = 1;
2276 
2277   /* Translate the opcode.  */
2278   sr_name = xtensa_sysreg_name (isa, sr);
2279   /* Another special case for "WSR.INTSET"....  */
2280   if (is_write && !is_user && !strcasecmp ("interrupt", sr_name))
2281     sr_name = "intset";
2282   new_opname = (char *) xmalloc (strlen (sr_name) + 6);
2283   sprintf (new_opname, "%s.%s", *popname, sr_name);
2284   free (*popname);
2285   *popname = new_opname;
2286 
2287   return 0;
2288 }
2289 
2290 
2291 static int
2292 xtensa_translate_old_userreg_ops (char **popname)
2293 {
2294   xtensa_isa isa = xtensa_default_isa;
2295   xtensa_sysreg sr;
2296   char *opname, *new_opname;
2297   const char *sr_name;
2298   bfd_boolean has_underbar = FALSE;
2299 
2300   opname = *popname;
2301   if (opname[0] == '_')
2302     {
2303       has_underbar = TRUE;
2304       opname += 1;
2305     }
2306 
2307   sr = xtensa_sysreg_lookup_name (isa, opname + 1);
2308   if (sr != XTENSA_UNDEFINED)
2309     {
2310       /* The new default name ("nnn") is different from the old default
2311 	 name ("URnnn").  The old default is handled below, and we don't
2312 	 want to recognize [RW]nnn, so do nothing if the name is the (new)
2313 	 default.  */
2314       static char namebuf[10];
2315       sprintf (namebuf, "%d", xtensa_sysreg_number (isa, sr));
2316       if (strcmp (namebuf, opname + 1) == 0)
2317 	return 0;
2318     }
2319   else
2320     {
2321       offsetT val;
2322       char *end;
2323 
2324       /* Only continue if the reg name is "URnnn".  */
2325       if (opname[1] != 'u' || opname[2] != 'r')
2326 	return 0;
2327       val = strtoul (opname + 3, &end, 10);
2328       if (*end != '\0')
2329 	return 0;
2330 
2331       sr = xtensa_sysreg_lookup (isa, val, 1);
2332       if (sr == XTENSA_UNDEFINED)
2333 	{
2334 	  as_bad (_("invalid register number (%ld) for '%s'"),
2335 		  (long) val, opname);
2336 	  return -1;
2337 	}
2338     }
2339 
2340   /* Translate the opcode.  */
2341   sr_name = xtensa_sysreg_name (isa, sr);
2342   new_opname = (char *) xmalloc (strlen (sr_name) + 6);
2343   sprintf (new_opname, "%s%cur.%s", (has_underbar ? "_" : ""),
2344 	   opname[0], sr_name);
2345   free (*popname);
2346   *popname = new_opname;
2347 
2348   return 0;
2349 }
2350 
2351 
2352 static int
2353 xtensa_translate_zero_immed (char *old_op,
2354 			     char *new_op,
2355 			     char **popname,
2356 			     int *pnum_args,
2357 			     char **arg_strings)
2358 {
2359   char *opname;
2360   offsetT val;
2361 
2362   opname = *popname;
2363   gas_assert (opname[0] != '_');
2364 
2365   if (strcmp (opname, old_op) != 0)
2366     return 0;
2367 
2368   if (xg_check_num_args (pnum_args, 3, opname, arg_strings))
2369     return -1;
2370   if (xg_arg_is_constant (arg_strings[1], &val) && val == 0)
2371     {
2372       xg_replace_opname (popname, new_op);
2373       free (arg_strings[1]);
2374       arg_strings[1] = arg_strings[2];
2375       arg_strings[2] = 0;
2376       *pnum_args = 2;
2377     }
2378 
2379   return 0;
2380 }
2381 
2382 
2383 /* If the instruction is an idiom (i.e., a built-in macro), translate it.
2384    Returns non-zero if an error was found.  */
2385 
2386 static int
2387 xg_translate_idioms (char **popname, int *pnum_args, char **arg_strings)
2388 {
2389   char *opname = *popname;
2390   bfd_boolean has_underbar = FALSE;
2391 
2392   if (*opname == '_')
2393     {
2394       has_underbar = TRUE;
2395       opname += 1;
2396     }
2397 
2398   if (strcmp (opname, "mov") == 0)
2399     {
2400       if (use_transform () && !has_underbar && density_supported)
2401 	xg_replace_opname (popname, "mov.n");
2402       else
2403 	{
2404 	  if (xg_check_num_args (pnum_args, 2, opname, arg_strings))
2405 	    return -1;
2406 	  xg_replace_opname (popname, (has_underbar ? "_or" : "or"));
2407 	  arg_strings[2] = (char *) xmalloc (strlen (arg_strings[1]) + 1);
2408 	  strcpy (arg_strings[2], arg_strings[1]);
2409 	  *pnum_args = 3;
2410 	}
2411       return 0;
2412     }
2413 
2414   if (strcmp (opname, "bbsi.l") == 0)
2415     {
2416       if (xg_check_num_args (pnum_args, 3, opname, arg_strings))
2417 	return -1;
2418       xg_replace_opname (popname, (has_underbar ? "_bbsi" : "bbsi"));
2419       if (target_big_endian)
2420 	xg_reverse_shift_count (&arg_strings[1]);
2421       return 0;
2422     }
2423 
2424   if (strcmp (opname, "bbci.l") == 0)
2425     {
2426       if (xg_check_num_args (pnum_args, 3, opname, arg_strings))
2427 	return -1;
2428       xg_replace_opname (popname, (has_underbar ? "_bbci" : "bbci"));
2429       if (target_big_endian)
2430 	xg_reverse_shift_count (&arg_strings[1]);
2431       return 0;
2432     }
2433 
2434   /* Don't do anything special with NOPs inside FLIX instructions.  They
2435      are handled elsewhere.  Real NOP instructions are always available
2436      in configurations with FLIX, so this should never be an issue but
2437      check for it anyway.  */
2438   if (!cur_vinsn.inside_bundle && xtensa_nop_opcode == XTENSA_UNDEFINED
2439       && strcmp (opname, "nop") == 0)
2440     {
2441       if (use_transform () && !has_underbar && density_supported)
2442 	xg_replace_opname (popname, "nop.n");
2443       else
2444 	{
2445 	  if (xg_check_num_args (pnum_args, 0, opname, arg_strings))
2446 	    return -1;
2447 	  xg_replace_opname (popname, (has_underbar ? "_or" : "or"));
2448 	  arg_strings[0] = (char *) xmalloc (3);
2449 	  arg_strings[1] = (char *) xmalloc (3);
2450 	  arg_strings[2] = (char *) xmalloc (3);
2451 	  strcpy (arg_strings[0], "a1");
2452 	  strcpy (arg_strings[1], "a1");
2453 	  strcpy (arg_strings[2], "a1");
2454 	  *pnum_args = 3;
2455 	}
2456       return 0;
2457     }
2458 
2459   /* Recognize [RW]UR and [RWX]SR.  */
2460   if ((((opname[0] == 'r' || opname[0] == 'w')
2461 	&& (opname[1] == 'u' || opname[1] == 's'))
2462        || (opname[0] == 'x' && opname[1] == 's'))
2463       && opname[2] == 'r'
2464       && opname[3] == '\0')
2465     return xg_translate_sysreg_op (popname, pnum_args, arg_strings);
2466 
2467   /* Backward compatibility for RUR and WUR: Recognize [RW]UR<nnn> and
2468      [RW]<name> if <name> is the non-default name of a user register.  */
2469   if ((opname[0] == 'r' || opname[0] == 'w')
2470       && xtensa_opcode_lookup (xtensa_default_isa, opname) == XTENSA_UNDEFINED)
2471     return xtensa_translate_old_userreg_ops (popname);
2472 
2473   /* Relax branches that don't allow comparisons against an immediate value
2474      of zero to the corresponding branches with implicit zero immediates.  */
2475   if (!has_underbar && use_transform ())
2476     {
2477       if (xtensa_translate_zero_immed ("bnei", "bnez", popname,
2478 				       pnum_args, arg_strings))
2479 	return -1;
2480 
2481       if (xtensa_translate_zero_immed ("beqi", "beqz", popname,
2482 				       pnum_args, arg_strings))
2483 	return -1;
2484 
2485       if (xtensa_translate_zero_immed ("bgei", "bgez", popname,
2486 				       pnum_args, arg_strings))
2487 	return -1;
2488 
2489       if (xtensa_translate_zero_immed ("blti", "bltz", popname,
2490 				       pnum_args, arg_strings))
2491 	return -1;
2492     }
2493 
2494   return 0;
2495 }
2496 
2497 
2498 /* Functions for dealing with the Xtensa ISA.  */
2499 
2500 /* Currently the assembler only allows us to use a single target per
2501    fragment.  Because of this, only one operand for a given
2502    instruction may be symbolic.  If there is a PC-relative operand,
2503    the last one is chosen.  Otherwise, the result is the number of the
2504    last immediate operand, and if there are none of those, we fail and
2505    return -1.  */
2506 
2507 static int
2508 get_relaxable_immed (xtensa_opcode opcode)
2509 {
2510   int last_immed = -1;
2511   int noperands, opi;
2512 
2513   if (opcode == XTENSA_UNDEFINED)
2514     return -1;
2515 
2516   noperands = xtensa_opcode_num_operands (xtensa_default_isa, opcode);
2517   for (opi = noperands - 1; opi >= 0; opi--)
2518     {
2519       if (xtensa_operand_is_visible (xtensa_default_isa, opcode, opi) == 0)
2520 	continue;
2521       if (xtensa_operand_is_PCrelative (xtensa_default_isa, opcode, opi) == 1)
2522 	return opi;
2523       if (last_immed == -1
2524 	  && xtensa_operand_is_register (xtensa_default_isa, opcode, opi) == 0)
2525 	last_immed = opi;
2526     }
2527   return last_immed;
2528 }
2529 
2530 
2531 static xtensa_opcode
2532 get_opcode_from_buf (const char *buf, int slot)
2533 {
2534   static xtensa_insnbuf insnbuf = NULL;
2535   static xtensa_insnbuf slotbuf = NULL;
2536   xtensa_isa isa = xtensa_default_isa;
2537   xtensa_format fmt;
2538 
2539   if (!insnbuf)
2540     {
2541       insnbuf = xtensa_insnbuf_alloc (isa);
2542       slotbuf = xtensa_insnbuf_alloc (isa);
2543     }
2544 
2545   xtensa_insnbuf_from_chars (isa, insnbuf, (const unsigned char *) buf, 0);
2546   fmt = xtensa_format_decode (isa, insnbuf);
2547   if (fmt == XTENSA_UNDEFINED)
2548     return XTENSA_UNDEFINED;
2549 
2550   if (slot >= xtensa_format_num_slots (isa, fmt))
2551     return XTENSA_UNDEFINED;
2552 
2553   xtensa_format_get_slot (isa, fmt, slot, insnbuf, slotbuf);
2554   return xtensa_opcode_decode (isa, fmt, slot, slotbuf);
2555 }
2556 
2557 
2558 #ifdef TENSILICA_DEBUG
2559 
2560 /* For debugging, print out the mapping of opcode numbers to opcodes.  */
2561 
2562 static void
2563 xtensa_print_insn_table (void)
2564 {
2565   int num_opcodes, num_operands;
2566   xtensa_opcode opcode;
2567   xtensa_isa isa = xtensa_default_isa;
2568 
2569   num_opcodes = xtensa_isa_num_opcodes (xtensa_default_isa);
2570   for (opcode = 0; opcode < num_opcodes; opcode++)
2571     {
2572       int opn;
2573       fprintf (stderr, "%d: %s: ", opcode, xtensa_opcode_name (isa, opcode));
2574       num_operands = xtensa_opcode_num_operands (isa, opcode);
2575       for (opn = 0; opn < num_operands; opn++)
2576 	{
2577 	  if (xtensa_operand_is_visible (isa, opcode, opn) == 0)
2578 	    continue;
2579 	  if (xtensa_operand_is_register (isa, opcode, opn) == 1)
2580 	    {
2581 	      xtensa_regfile opnd_rf =
2582 		xtensa_operand_regfile (isa, opcode, opn);
2583 	      fprintf (stderr, "%s ", xtensa_regfile_shortname (isa, opnd_rf));
2584 	    }
2585 	  else if (xtensa_operand_is_PCrelative (isa, opcode, opn) == 1)
2586 	    fputs ("[lLr] ", stderr);
2587 	  else
2588 	    fputs ("i ", stderr);
2589 	}
2590       fprintf (stderr, "\n");
2591     }
2592 }
2593 
2594 
2595 static void
2596 print_vliw_insn (xtensa_insnbuf vbuf)
2597 {
2598   xtensa_isa isa = xtensa_default_isa;
2599   xtensa_format f = xtensa_format_decode (isa, vbuf);
2600   xtensa_insnbuf sbuf = xtensa_insnbuf_alloc (isa);
2601   int op;
2602 
2603   fprintf (stderr, "format = %d\n", f);
2604 
2605   for (op = 0; op < xtensa_format_num_slots (isa, f); op++)
2606     {
2607       xtensa_opcode opcode;
2608       const char *opname;
2609       int operands;
2610 
2611       xtensa_format_get_slot (isa, f, op, vbuf, sbuf);
2612       opcode = xtensa_opcode_decode (isa, f, op, sbuf);
2613       opname = xtensa_opcode_name (isa, opcode);
2614 
2615       fprintf (stderr, "op in slot %i is %s;\n", op, opname);
2616       fprintf (stderr, "   operands = ");
2617       for (operands = 0;
2618 	   operands < xtensa_opcode_num_operands (isa, opcode);
2619 	   operands++)
2620 	{
2621 	  unsigned int val;
2622 	  if (xtensa_operand_is_visible (isa, opcode, operands) == 0)
2623 	    continue;
2624 	  xtensa_operand_get_field (isa, opcode, operands, f, op, sbuf, &val);
2625 	  xtensa_operand_decode (isa, opcode, operands, &val);
2626 	  fprintf (stderr, "%d ", val);
2627 	}
2628       fprintf (stderr, "\n");
2629     }
2630   xtensa_insnbuf_free (isa, sbuf);
2631 }
2632 
2633 #endif /* TENSILICA_DEBUG */
2634 
2635 
2636 static bfd_boolean
2637 is_direct_call_opcode (xtensa_opcode opcode)
2638 {
2639   xtensa_isa isa = xtensa_default_isa;
2640   int n, num_operands;
2641 
2642   if (xtensa_opcode_is_call (isa, opcode) != 1)
2643     return FALSE;
2644 
2645   num_operands = xtensa_opcode_num_operands (isa, opcode);
2646   for (n = 0; n < num_operands; n++)
2647     {
2648       if (xtensa_operand_is_register (isa, opcode, n) == 0
2649 	  && xtensa_operand_is_PCrelative (isa, opcode, n) == 1)
2650 	return TRUE;
2651     }
2652   return FALSE;
2653 }
2654 
2655 
2656 /* Convert from BFD relocation type code to slot and operand number.
2657    Returns non-zero on failure.  */
2658 
2659 static int
2660 decode_reloc (bfd_reloc_code_real_type reloc, int *slot, bfd_boolean *is_alt)
2661 {
2662   if (reloc >= BFD_RELOC_XTENSA_SLOT0_OP
2663       && reloc <= BFD_RELOC_XTENSA_SLOT14_OP)
2664     {
2665       *slot = reloc - BFD_RELOC_XTENSA_SLOT0_OP;
2666       *is_alt = FALSE;
2667     }
2668   else if (reloc >= BFD_RELOC_XTENSA_SLOT0_ALT
2669       && reloc <= BFD_RELOC_XTENSA_SLOT14_ALT)
2670     {
2671       *slot = reloc - BFD_RELOC_XTENSA_SLOT0_ALT;
2672       *is_alt = TRUE;
2673     }
2674   else
2675     return -1;
2676 
2677   return 0;
2678 }
2679 
2680 
2681 /* Convert from slot number to BFD relocation type code for the
2682    standard PC-relative relocations.  Return BFD_RELOC_NONE on
2683    failure.  */
2684 
2685 static bfd_reloc_code_real_type
2686 encode_reloc (int slot)
2687 {
2688   if (slot < 0 || slot > 14)
2689     return BFD_RELOC_NONE;
2690 
2691   return BFD_RELOC_XTENSA_SLOT0_OP + slot;
2692 }
2693 
2694 
2695 /* Convert from slot numbers to BFD relocation type code for the
2696    "alternate" relocations.  Return BFD_RELOC_NONE on failure.  */
2697 
2698 static bfd_reloc_code_real_type
2699 encode_alt_reloc (int slot)
2700 {
2701   if (slot < 0 || slot > 14)
2702     return BFD_RELOC_NONE;
2703 
2704   return BFD_RELOC_XTENSA_SLOT0_ALT + slot;
2705 }
2706 
2707 
2708 static void
2709 xtensa_insnbuf_set_operand (xtensa_insnbuf slotbuf,
2710 			    xtensa_format fmt,
2711 			    int slot,
2712 			    xtensa_opcode opcode,
2713 			    int operand,
2714 			    uint32 value,
2715 			    const char *file,
2716 			    unsigned int line)
2717 {
2718   uint32 valbuf = value;
2719 
2720   if (xtensa_operand_encode (xtensa_default_isa, opcode, operand, &valbuf))
2721     {
2722       if (xtensa_operand_is_PCrelative (xtensa_default_isa, opcode, operand)
2723 	  == 1)
2724 	as_bad_where ((char *) file, line,
2725 		      _("operand %d of '%s' has out of range value '%u'"),
2726 		      operand + 1,
2727 		      xtensa_opcode_name (xtensa_default_isa, opcode),
2728 		      value);
2729       else
2730 	as_bad_where ((char *) file, line,
2731 		      _("operand %d of '%s' has invalid value '%u'"),
2732 		      operand + 1,
2733 		      xtensa_opcode_name (xtensa_default_isa, opcode),
2734 		      value);
2735       return;
2736     }
2737 
2738   xtensa_operand_set_field (xtensa_default_isa, opcode, operand, fmt, slot,
2739 			    slotbuf, valbuf);
2740 }
2741 
2742 
2743 static uint32
2744 xtensa_insnbuf_get_operand (xtensa_insnbuf slotbuf,
2745 			    xtensa_format fmt,
2746 			    int slot,
2747 			    xtensa_opcode opcode,
2748 			    int opnum)
2749 {
2750   uint32 val = 0;
2751   (void) xtensa_operand_get_field (xtensa_default_isa, opcode, opnum,
2752 				   fmt, slot, slotbuf, &val);
2753   (void) xtensa_operand_decode (xtensa_default_isa, opcode, opnum, &val);
2754   return val;
2755 }
2756 
2757 
2758 /* Checks for rules from xtensa-relax tables.  */
2759 
2760 /* The routine xg_instruction_matches_option_term must return TRUE
2761    when a given option term is true.  The meaning of all of the option
2762    terms is given interpretation by this function.  */
2763 
2764 static bfd_boolean
2765 xg_instruction_matches_option_term (TInsn *insn, const ReqOrOption *option)
2766 {
2767   if (strcmp (option->option_name, "realnop") == 0
2768       || strncmp (option->option_name, "IsaUse", 6) == 0)
2769     {
2770       /* These conditions were evaluated statically when building the
2771 	 relaxation table.  There's no need to reevaluate them now.  */
2772       return TRUE;
2773     }
2774   else if (strcmp (option->option_name, "FREEREG") == 0)
2775     return insn->extra_arg.X_op == O_register;
2776   else
2777     {
2778       as_fatal (_("internal error: unknown option name '%s'"),
2779 		option->option_name);
2780     }
2781 }
2782 
2783 
2784 static bfd_boolean
2785 xg_instruction_matches_or_options (TInsn *insn,
2786 				   const ReqOrOptionList *or_option)
2787 {
2788   const ReqOrOption *option;
2789   /* Must match each of the AND terms.  */
2790   for (option = or_option; option != NULL; option = option->next)
2791     {
2792       if (xg_instruction_matches_option_term (insn, option))
2793 	return TRUE;
2794     }
2795   return FALSE;
2796 }
2797 
2798 
2799 static bfd_boolean
2800 xg_instruction_matches_options (TInsn *insn, const ReqOptionList *options)
2801 {
2802   const ReqOption *req_options;
2803   /* Must match each of the AND terms.  */
2804   for (req_options = options;
2805        req_options != NULL;
2806        req_options = req_options->next)
2807     {
2808       /* Must match one of the OR clauses.  */
2809       if (!xg_instruction_matches_or_options (insn,
2810 					      req_options->or_option_terms))
2811 	return FALSE;
2812     }
2813   return TRUE;
2814 }
2815 
2816 
2817 /* Return the transition rule that matches or NULL if none matches.  */
2818 
2819 static bfd_boolean
2820 xg_instruction_matches_rule (TInsn *insn, TransitionRule *rule)
2821 {
2822   PreconditionList *condition_l;
2823 
2824   if (rule->opcode != insn->opcode)
2825     return FALSE;
2826 
2827   for (condition_l = rule->conditions;
2828        condition_l != NULL;
2829        condition_l = condition_l->next)
2830     {
2831       expressionS *exp1;
2832       expressionS *exp2;
2833       Precondition *cond = condition_l->precond;
2834 
2835       switch (cond->typ)
2836 	{
2837 	case OP_CONSTANT:
2838 	  /* The expression must be the constant.  */
2839 	  gas_assert (cond->op_num < insn->ntok);
2840 	  exp1 = &insn->tok[cond->op_num];
2841 	  if (expr_is_const (exp1))
2842 	    {
2843 	      switch (cond->cmp)
2844 		{
2845 		case OP_EQUAL:
2846 		  if (get_expr_const (exp1) != cond->op_data)
2847 		    return FALSE;
2848 		  break;
2849 		case OP_NOTEQUAL:
2850 		  if (get_expr_const (exp1) == cond->op_data)
2851 		    return FALSE;
2852 		  break;
2853 		default:
2854 		  return FALSE;
2855 		}
2856 	    }
2857 	  else if (expr_is_register (exp1))
2858 	    {
2859 	      switch (cond->cmp)
2860 		{
2861 		case OP_EQUAL:
2862 		  if (get_expr_register (exp1) != cond->op_data)
2863 		    return FALSE;
2864 		  break;
2865 		case OP_NOTEQUAL:
2866 		  if (get_expr_register (exp1) == cond->op_data)
2867 		    return FALSE;
2868 		  break;
2869 		default:
2870 		  return FALSE;
2871 		}
2872 	    }
2873 	  else
2874 	    return FALSE;
2875 	  break;
2876 
2877 	case OP_OPERAND:
2878 	  gas_assert (cond->op_num < insn->ntok);
2879 	  gas_assert (cond->op_data < insn->ntok);
2880 	  exp1 = &insn->tok[cond->op_num];
2881 	  exp2 = &insn->tok[cond->op_data];
2882 
2883 	  switch (cond->cmp)
2884 	    {
2885 	    case OP_EQUAL:
2886 	      if (!expr_is_equal (exp1, exp2))
2887 		return FALSE;
2888 	      break;
2889 	    case OP_NOTEQUAL:
2890 	      if (expr_is_equal (exp1, exp2))
2891 		return FALSE;
2892 	      break;
2893 	    }
2894 	  break;
2895 
2896 	case OP_LITERAL:
2897 	case OP_LABEL:
2898 	default:
2899 	  return FALSE;
2900 	}
2901     }
2902   if (!xg_instruction_matches_options (insn, rule->options))
2903     return FALSE;
2904 
2905   return TRUE;
2906 }
2907 
2908 
2909 static int
2910 transition_rule_cmp (const TransitionRule *a, const TransitionRule *b)
2911 {
2912   bfd_boolean a_greater = FALSE;
2913   bfd_boolean b_greater = FALSE;
2914 
2915   ReqOptionList *l_a = a->options;
2916   ReqOptionList *l_b = b->options;
2917 
2918   /* We only care if they both are the same except for
2919      a const16 vs. an l32r.  */
2920 
2921   while (l_a && l_b && ((l_a->next == NULL) == (l_b->next == NULL)))
2922     {
2923       ReqOrOptionList *l_or_a = l_a->or_option_terms;
2924       ReqOrOptionList *l_or_b = l_b->or_option_terms;
2925       while (l_or_a && l_or_b && ((l_a->next == NULL) == (l_b->next == NULL)))
2926 	{
2927 	  if (l_or_a->is_true != l_or_b->is_true)
2928 	    return 0;
2929 	  if (strcmp (l_or_a->option_name, l_or_b->option_name) != 0)
2930 	    {
2931 	      /* This is the case we care about.  */
2932 	      if (strcmp (l_or_a->option_name, "IsaUseConst16") == 0
2933 		  && strcmp (l_or_b->option_name, "IsaUseL32R") == 0)
2934 		{
2935 		  if (prefer_const16)
2936 		    a_greater = TRUE;
2937 		  else
2938 		    b_greater = TRUE;
2939 		}
2940 	      else if (strcmp (l_or_a->option_name, "IsaUseL32R") == 0
2941 		       && strcmp (l_or_b->option_name, "IsaUseConst16") == 0)
2942 		{
2943 		  if (prefer_const16)
2944 		    b_greater = TRUE;
2945 		  else
2946 		    a_greater = TRUE;
2947 		}
2948 	      else
2949 		return 0;
2950 	    }
2951 	  l_or_a = l_or_a->next;
2952 	  l_or_b = l_or_b->next;
2953 	}
2954       if (l_or_a || l_or_b)
2955 	return 0;
2956 
2957       l_a = l_a->next;
2958       l_b = l_b->next;
2959     }
2960   if (l_a || l_b)
2961     return 0;
2962 
2963   /* Incomparable if the substitution was used differently in two cases.  */
2964   if (a_greater && b_greater)
2965     return 0;
2966 
2967   if (b_greater)
2968     return 1;
2969   if (a_greater)
2970     return -1;
2971 
2972   return 0;
2973 }
2974 
2975 
2976 static TransitionRule *
2977 xg_instruction_match (TInsn *insn)
2978 {
2979   TransitionTable *table = xg_build_simplify_table (&transition_rule_cmp);
2980   TransitionList *l;
2981   gas_assert (insn->opcode < table->num_opcodes);
2982 
2983   /* Walk through all of the possible transitions.  */
2984   for (l = table->table[insn->opcode]; l != NULL; l = l->next)
2985     {
2986       TransitionRule *rule = l->rule;
2987       if (xg_instruction_matches_rule (insn, rule))
2988 	return rule;
2989     }
2990   return NULL;
2991 }
2992 
2993 
2994 /* Various Other Internal Functions.  */
2995 
2996 static bfd_boolean
2997 is_unique_insn_expansion (TransitionRule *r)
2998 {
2999   if (!r->to_instr || r->to_instr->next != NULL)
3000     return FALSE;
3001   if (r->to_instr->typ != INSTR_INSTR)
3002     return FALSE;
3003   return TRUE;
3004 }
3005 
3006 
3007 /* Check if there is exactly one relaxation for INSN that converts it to
3008    another instruction of equal or larger size.  If so, and if TARG is
3009    non-null, go ahead and generate the relaxed instruction into TARG.  If
3010    NARROW_ONLY is true, then only consider relaxations that widen a narrow
3011    instruction, i.e., ignore relaxations that convert to an instruction of
3012    equal size.  In some contexts where this function is used, only
3013    a single widening is allowed and the NARROW_ONLY argument is used to
3014    exclude cases like ADDI being "widened" to an ADDMI, which may
3015    later be relaxed to an ADDMI/ADDI pair.  */
3016 
3017 bfd_boolean
3018 xg_is_single_relaxable_insn (TInsn *insn, TInsn *targ, bfd_boolean narrow_only)
3019 {
3020   TransitionTable *table = xg_build_widen_table (&transition_rule_cmp);
3021   TransitionList *l;
3022   TransitionRule *match = 0;
3023 
3024   gas_assert (insn->insn_type == ITYPE_INSN);
3025   gas_assert (insn->opcode < table->num_opcodes);
3026 
3027   for (l = table->table[insn->opcode]; l != NULL; l = l->next)
3028     {
3029       TransitionRule *rule = l->rule;
3030 
3031       if (xg_instruction_matches_rule (insn, rule)
3032 	  && is_unique_insn_expansion (rule)
3033 	  && (xg_get_single_size (insn->opcode) + (narrow_only ? 1 : 0)
3034 	      <= xg_get_single_size (rule->to_instr->opcode)))
3035 	{
3036 	  if (match)
3037 	    return FALSE;
3038 	  match = rule;
3039 	}
3040     }
3041   if (!match)
3042     return FALSE;
3043 
3044   if (targ)
3045     xg_build_to_insn (targ, insn, match->to_instr);
3046   return TRUE;
3047 }
3048 
3049 
3050 /* Return the maximum number of bytes this opcode can expand to.  */
3051 
3052 static int
3053 xg_get_max_insn_widen_size (xtensa_opcode opcode)
3054 {
3055   TransitionTable *table = xg_build_widen_table (&transition_rule_cmp);
3056   TransitionList *l;
3057   int max_size = xg_get_single_size (opcode);
3058 
3059   gas_assert (opcode < table->num_opcodes);
3060 
3061   for (l = table->table[opcode]; l != NULL; l = l->next)
3062     {
3063       TransitionRule *rule = l->rule;
3064       BuildInstr *build_list;
3065       int this_size = 0;
3066 
3067       if (!rule)
3068 	continue;
3069       build_list = rule->to_instr;
3070       if (is_unique_insn_expansion (rule))
3071 	{
3072 	  gas_assert (build_list->typ == INSTR_INSTR);
3073 	  this_size = xg_get_max_insn_widen_size (build_list->opcode);
3074 	}
3075       else
3076 	for (; build_list != NULL; build_list = build_list->next)
3077 	  {
3078 	    switch (build_list->typ)
3079 	      {
3080 	      case INSTR_INSTR:
3081 		this_size += xg_get_single_size (build_list->opcode);
3082 		break;
3083 	      case INSTR_LITERAL_DEF:
3084 	      case INSTR_LABEL_DEF:
3085 	      default:
3086 		break;
3087 	      }
3088 	  }
3089       if (this_size > max_size)
3090 	max_size = this_size;
3091     }
3092   return max_size;
3093 }
3094 
3095 
3096 /* Return the maximum number of literal bytes this opcode can generate.  */
3097 
3098 static int
3099 xg_get_max_insn_widen_literal_size (xtensa_opcode opcode)
3100 {
3101   TransitionTable *table = xg_build_widen_table (&transition_rule_cmp);
3102   TransitionList *l;
3103   int max_size = 0;
3104 
3105   gas_assert (opcode < table->num_opcodes);
3106 
3107   for (l = table->table[opcode]; l != NULL; l = l->next)
3108     {
3109       TransitionRule *rule = l->rule;
3110       BuildInstr *build_list;
3111       int this_size = 0;
3112 
3113       if (!rule)
3114 	continue;
3115       build_list = rule->to_instr;
3116       if (is_unique_insn_expansion (rule))
3117 	{
3118 	  gas_assert (build_list->typ == INSTR_INSTR);
3119 	  this_size = xg_get_max_insn_widen_literal_size (build_list->opcode);
3120 	}
3121       else
3122 	for (; build_list != NULL; build_list = build_list->next)
3123 	  {
3124 	    switch (build_list->typ)
3125 	      {
3126 	      case INSTR_LITERAL_DEF:
3127 		/* Hard-coded 4-byte literal.  */
3128 		this_size += 4;
3129 		break;
3130 	      case INSTR_INSTR:
3131 	      case INSTR_LABEL_DEF:
3132 	      default:
3133 		break;
3134 	      }
3135 	  }
3136       if (this_size > max_size)
3137 	max_size = this_size;
3138     }
3139   return max_size;
3140 }
3141 
3142 
3143 static bfd_boolean
3144 xg_is_relaxable_insn (TInsn *insn, int lateral_steps)
3145 {
3146   int steps_taken = 0;
3147   TransitionTable *table = xg_build_widen_table (&transition_rule_cmp);
3148   TransitionList *l;
3149 
3150   gas_assert (insn->insn_type == ITYPE_INSN);
3151   gas_assert (insn->opcode < table->num_opcodes);
3152 
3153   for (l = table->table[insn->opcode]; l != NULL; l = l->next)
3154     {
3155       TransitionRule *rule = l->rule;
3156 
3157       if (xg_instruction_matches_rule (insn, rule))
3158 	{
3159 	  if (steps_taken == lateral_steps)
3160 	    return TRUE;
3161 	  steps_taken++;
3162 	}
3163     }
3164   return FALSE;
3165 }
3166 
3167 
3168 static symbolS *
3169 get_special_literal_symbol (void)
3170 {
3171   static symbolS *sym = NULL;
3172 
3173   if (sym == NULL)
3174     sym = symbol_find_or_make ("SPECIAL_LITERAL0\001");
3175   return sym;
3176 }
3177 
3178 
3179 static symbolS *
3180 get_special_label_symbol (void)
3181 {
3182   static symbolS *sym = NULL;
3183 
3184   if (sym == NULL)
3185     sym = symbol_find_or_make ("SPECIAL_LABEL0\001");
3186   return sym;
3187 }
3188 
3189 
3190 static bfd_boolean
3191 xg_valid_literal_expression (const expressionS *exp)
3192 {
3193   switch (exp->X_op)
3194     {
3195     case O_constant:
3196     case O_symbol:
3197     case O_big:
3198     case O_uminus:
3199     case O_subtract:
3200     case O_pltrel:
3201     case O_pcrel:
3202     case O_tlsfunc:
3203     case O_tlsarg:
3204     case O_tpoff:
3205     case O_dtpoff:
3206       return TRUE;
3207     default:
3208       return FALSE;
3209     }
3210 }
3211 
3212 
3213 /* This will check to see if the value can be converted into the
3214    operand type.  It will return TRUE if it does not fit.  */
3215 
3216 static bfd_boolean
3217 xg_check_operand (int32 value, xtensa_opcode opcode, int operand)
3218 {
3219   uint32 valbuf = value;
3220   if (xtensa_operand_encode (xtensa_default_isa, opcode, operand, &valbuf))
3221     return TRUE;
3222   return FALSE;
3223 }
3224 
3225 
3226 /* Assumes: All immeds are constants.  Check that all constants fit
3227    into their immeds; return FALSE if not.  */
3228 
3229 static bfd_boolean
3230 xg_immeds_fit (const TInsn *insn)
3231 {
3232   xtensa_isa isa = xtensa_default_isa;
3233   int i;
3234 
3235   int n = insn->ntok;
3236   gas_assert (insn->insn_type == ITYPE_INSN);
3237   for (i = 0; i < n; ++i)
3238     {
3239       const expressionS *exp = &insn->tok[i];
3240 
3241       if (xtensa_operand_is_register (isa, insn->opcode, i) == 1)
3242 	continue;
3243 
3244       switch (exp->X_op)
3245 	{
3246 	case O_register:
3247 	case O_constant:
3248 	  if (xg_check_operand (exp->X_add_number, insn->opcode, i))
3249 	    return FALSE;
3250 	  break;
3251 
3252 	default:
3253 	  /* The symbol should have a fixup associated with it.  */
3254 	  gas_assert (FALSE);
3255 	  break;
3256 	}
3257     }
3258   return TRUE;
3259 }
3260 
3261 
3262 /* This should only be called after we have an initial
3263    estimate of the addresses.  */
3264 
3265 static bfd_boolean
3266 xg_symbolic_immeds_fit (const TInsn *insn,
3267 			segT pc_seg,
3268 			fragS *pc_frag,
3269 			offsetT pc_offset,
3270 			long stretch)
3271 {
3272   xtensa_isa isa = xtensa_default_isa;
3273   symbolS *symbolP;
3274   fragS *sym_frag;
3275   offsetT target, pc;
3276   uint32 new_offset;
3277   int i;
3278   int n = insn->ntok;
3279 
3280   gas_assert (insn->insn_type == ITYPE_INSN);
3281 
3282   for (i = 0; i < n; ++i)
3283     {
3284       const expressionS *exp = &insn->tok[i];
3285 
3286       if (xtensa_operand_is_register (isa, insn->opcode, i) == 1)
3287 	continue;
3288 
3289       switch (exp->X_op)
3290 	{
3291 	case O_register:
3292 	case O_constant:
3293 	  if (xg_check_operand (exp->X_add_number, insn->opcode, i))
3294 	    return FALSE;
3295 	  break;
3296 
3297 	case O_lo16:
3298 	case O_hi16:
3299 	  /* Check for the worst case.  */
3300 	  if (xg_check_operand (0xffff, insn->opcode, i))
3301 	    return FALSE;
3302 	  break;
3303 
3304 	case O_symbol:
3305 	  /* We only allow symbols for PC-relative references.
3306 	     If pc_frag == 0, then we don't have frag locations yet.  */
3307 	  if (pc_frag == 0
3308 	      || xtensa_operand_is_PCrelative (isa, insn->opcode, i) == 0)
3309 	    return FALSE;
3310 
3311 	  /* If it is a weak symbol or a symbol in a different section,
3312 	     it cannot be known to fit at assembly time.  */
3313 	  if (S_IS_WEAK (exp->X_add_symbol)
3314 	      || S_GET_SEGMENT (exp->X_add_symbol) != pc_seg)
3315 	    {
3316 	      /* For a direct call with --no-longcalls, be optimistic and
3317 		 assume it will be in range.  If the symbol is weak and
3318 		 undefined, it may remain undefined at link-time, in which
3319 		 case it will have a zero value and almost certainly be out
3320 		 of range for a direct call; thus, relax for undefined weak
3321 		 symbols even if longcalls is not enabled.  */
3322 	      if (is_direct_call_opcode (insn->opcode)
3323 		  && ! pc_frag->tc_frag_data.use_longcalls
3324 		  && (! S_IS_WEAK (exp->X_add_symbol)
3325 		      || S_IS_DEFINED (exp->X_add_symbol)))
3326 		return TRUE;
3327 
3328 	      return FALSE;
3329 	    }
3330 
3331 	  symbolP = exp->X_add_symbol;
3332 	  sym_frag = symbol_get_frag (symbolP);
3333 	  target = S_GET_VALUE (symbolP) + exp->X_add_number;
3334 	  pc = pc_frag->fr_address + pc_offset;
3335 
3336 	  /* If frag has yet to be reached on this pass, assume it
3337 	     will move by STRETCH just as we did.  If this is not so,
3338 	     it will be because some frag between grows, and that will
3339 	     force another pass.  Beware zero-length frags.  There
3340 	     should be a faster way to do this.  */
3341 
3342 	  if (stretch != 0
3343 	      && sym_frag->relax_marker != pc_frag->relax_marker
3344 	      && S_GET_SEGMENT (symbolP) == pc_seg)
3345 	    {
3346 	      target += stretch;
3347 	    }
3348 
3349 	  new_offset = target;
3350 	  xtensa_operand_do_reloc (isa, insn->opcode, i, &new_offset, pc);
3351 	  if (xg_check_operand (new_offset, insn->opcode, i))
3352 	    return FALSE;
3353 	  break;
3354 
3355 	default:
3356 	  /* The symbol should have a fixup associated with it.  */
3357 	  return FALSE;
3358 	}
3359     }
3360 
3361   return TRUE;
3362 }
3363 
3364 
3365 /* Return TRUE on success.  */
3366 
3367 static bfd_boolean
3368 xg_build_to_insn (TInsn *targ, TInsn *insn, BuildInstr *bi)
3369 {
3370   BuildOp *op;
3371   symbolS *sym;
3372 
3373   tinsn_init (targ);
3374   targ->debug_line = insn->debug_line;
3375   targ->loc_directive_seen = insn->loc_directive_seen;
3376   switch (bi->typ)
3377     {
3378     case INSTR_INSTR:
3379       op = bi->ops;
3380       targ->opcode = bi->opcode;
3381       targ->insn_type = ITYPE_INSN;
3382       targ->is_specific_opcode = FALSE;
3383 
3384       for (; op != NULL; op = op->next)
3385 	{
3386 	  int op_num = op->op_num;
3387 	  int op_data = op->op_data;
3388 
3389 	  gas_assert (op->op_num < MAX_INSN_ARGS);
3390 
3391 	  if (targ->ntok <= op_num)
3392 	    targ->ntok = op_num + 1;
3393 
3394 	  switch (op->typ)
3395 	    {
3396 	    case OP_CONSTANT:
3397 	      set_expr_const (&targ->tok[op_num], op_data);
3398 	      break;
3399 	    case OP_OPERAND:
3400 	      gas_assert (op_data < insn->ntok);
3401 	      copy_expr (&targ->tok[op_num], &insn->tok[op_data]);
3402 	      break;
3403 	    case OP_FREEREG:
3404 	      if (insn->extra_arg.X_op != O_register)
3405 		return FALSE;
3406 	      copy_expr (&targ->tok[op_num], &insn->extra_arg);
3407 	      break;
3408 	    case OP_LITERAL:
3409 	      sym = get_special_literal_symbol ();
3410 	      set_expr_symbol_offset (&targ->tok[op_num], sym, 0);
3411 	      if (insn->tok[op_data].X_op == O_tlsfunc
3412 		  || insn->tok[op_data].X_op == O_tlsarg)
3413 		copy_expr (&targ->extra_arg, &insn->tok[op_data]);
3414 	      break;
3415 	    case OP_LABEL:
3416 	      sym = get_special_label_symbol ();
3417 	      set_expr_symbol_offset (&targ->tok[op_num], sym, 0);
3418 	      break;
3419 	    case OP_OPERAND_HI16U:
3420 	    case OP_OPERAND_LOW16U:
3421 	      gas_assert (op_data < insn->ntok);
3422 	      if (expr_is_const (&insn->tok[op_data]))
3423 		{
3424 		  long val;
3425 		  copy_expr (&targ->tok[op_num], &insn->tok[op_data]);
3426 		  val = xg_apply_userdef_op_fn (op->typ,
3427 						targ->tok[op_num].
3428 						X_add_number);
3429 		  targ->tok[op_num].X_add_number = val;
3430 		}
3431 	      else
3432 		{
3433 		  /* For const16 we can create relocations for these.  */
3434 		  if (targ->opcode == XTENSA_UNDEFINED
3435 		      || (targ->opcode != xtensa_const16_opcode))
3436 		    return FALSE;
3437 		  gas_assert (op_data < insn->ntok);
3438 		  /* Need to build a O_lo16 or O_hi16.  */
3439 		  copy_expr (&targ->tok[op_num], &insn->tok[op_data]);
3440 		  if (targ->tok[op_num].X_op == O_symbol)
3441 		    {
3442 		      if (op->typ == OP_OPERAND_HI16U)
3443 			targ->tok[op_num].X_op = O_hi16;
3444 		      else if (op->typ == OP_OPERAND_LOW16U)
3445 			targ->tok[op_num].X_op = O_lo16;
3446 		      else
3447 			return FALSE;
3448 		    }
3449 		}
3450 	      break;
3451 	    default:
3452 	      /* currently handles:
3453 		 OP_OPERAND_LOW8
3454 		 OP_OPERAND_HI24S
3455 		 OP_OPERAND_F32MINUS */
3456 	      if (xg_has_userdef_op_fn (op->typ))
3457 		{
3458 		  gas_assert (op_data < insn->ntok);
3459 		  if (expr_is_const (&insn->tok[op_data]))
3460 		    {
3461 		      long val;
3462 		      copy_expr (&targ->tok[op_num], &insn->tok[op_data]);
3463 		      val = xg_apply_userdef_op_fn (op->typ,
3464 						    targ->tok[op_num].
3465 						    X_add_number);
3466 		      targ->tok[op_num].X_add_number = val;
3467 		    }
3468 		  else
3469 		    return FALSE; /* We cannot use a relocation for this.  */
3470 		  break;
3471 		}
3472 	      gas_assert (0);
3473 	      break;
3474 	    }
3475 	}
3476       break;
3477 
3478     case INSTR_LITERAL_DEF:
3479       op = bi->ops;
3480       targ->opcode = XTENSA_UNDEFINED;
3481       targ->insn_type = ITYPE_LITERAL;
3482       targ->is_specific_opcode = FALSE;
3483       for (; op != NULL; op = op->next)
3484 	{
3485 	  int op_num = op->op_num;
3486 	  int op_data = op->op_data;
3487 	  gas_assert (op->op_num < MAX_INSN_ARGS);
3488 
3489 	  if (targ->ntok <= op_num)
3490 	    targ->ntok = op_num + 1;
3491 
3492 	  switch (op->typ)
3493 	    {
3494 	    case OP_OPERAND:
3495 	      gas_assert (op_data < insn->ntok);
3496 	      /* We can only pass resolvable literals through.  */
3497 	      if (!xg_valid_literal_expression (&insn->tok[op_data]))
3498 		return FALSE;
3499 	      copy_expr (&targ->tok[op_num], &insn->tok[op_data]);
3500 	      break;
3501 	    case OP_LITERAL:
3502 	    case OP_CONSTANT:
3503 	    case OP_LABEL:
3504 	    default:
3505 	      gas_assert (0);
3506 	      break;
3507 	    }
3508 	}
3509       break;
3510 
3511     case INSTR_LABEL_DEF:
3512       op = bi->ops;
3513       targ->opcode = XTENSA_UNDEFINED;
3514       targ->insn_type = ITYPE_LABEL;
3515       targ->is_specific_opcode = FALSE;
3516       /* Literal with no ops is a label?  */
3517       gas_assert (op == NULL);
3518       break;
3519 
3520     default:
3521       gas_assert (0);
3522     }
3523 
3524   return TRUE;
3525 }
3526 
3527 
3528 /* Return TRUE on success.  */
3529 
3530 static bfd_boolean
3531 xg_build_to_stack (IStack *istack, TInsn *insn, BuildInstr *bi)
3532 {
3533   for (; bi != NULL; bi = bi->next)
3534     {
3535       TInsn *next_insn = istack_push_space (istack);
3536 
3537       if (!xg_build_to_insn (next_insn, insn, bi))
3538 	return FALSE;
3539     }
3540   return TRUE;
3541 }
3542 
3543 
3544 /* Return TRUE on valid expansion.  */
3545 
3546 static bfd_boolean
3547 xg_expand_to_stack (IStack *istack, TInsn *insn, int lateral_steps)
3548 {
3549   int stack_size = istack->ninsn;
3550   int steps_taken = 0;
3551   TransitionTable *table = xg_build_widen_table (&transition_rule_cmp);
3552   TransitionList *l;
3553 
3554   gas_assert (insn->insn_type == ITYPE_INSN);
3555   gas_assert (insn->opcode < table->num_opcodes);
3556 
3557   for (l = table->table[insn->opcode]; l != NULL; l = l->next)
3558     {
3559       TransitionRule *rule = l->rule;
3560 
3561       if (xg_instruction_matches_rule (insn, rule))
3562 	{
3563 	  if (lateral_steps == steps_taken)
3564 	    {
3565 	      int i;
3566 
3567 	      /* This is it.  Expand the rule to the stack.  */
3568 	      if (!xg_build_to_stack (istack, insn, rule->to_instr))
3569 		return FALSE;
3570 
3571 	      /* Check to see if it fits.  */
3572 	      for (i = stack_size; i < istack->ninsn; i++)
3573 		{
3574 		  TInsn *tinsn = &istack->insn[i];
3575 
3576 		  if (tinsn->insn_type == ITYPE_INSN
3577 		      && !tinsn_has_symbolic_operands (tinsn)
3578 		      && !xg_immeds_fit (tinsn))
3579 		    {
3580 		      istack->ninsn = stack_size;
3581 		      return FALSE;
3582 		    }
3583 		}
3584 	      return TRUE;
3585 	    }
3586 	  steps_taken++;
3587 	}
3588     }
3589   return FALSE;
3590 }
3591 
3592 
3593 /* Relax the assembly instruction at least "min_steps".
3594    Return the number of steps taken.
3595 
3596    For relaxation to correctly terminate, every relaxation chain must
3597    terminate in one of two ways:
3598 
3599    1.  If the chain from one instruction to the next consists entirely of
3600        single instructions, then the chain *must* handle all possible
3601        immediates without failing.  It must not ever fail because an
3602        immediate is out of range.  The MOVI.N -> MOVI -> L32R relaxation
3603        chain is one example.  L32R loads 32 bits, and there cannot be an
3604        immediate larger than 32 bits, so it satisfies this condition.
3605        Single instruction relaxation chains are as defined by
3606        xg_is_single_relaxable_instruction.
3607 
3608    2.  Otherwise, the chain must end in a multi-instruction expansion: e.g.,
3609        BNEZ.N -> BNEZ -> BNEZ.W15 -> BENZ.N/J
3610 
3611    Strictly speaking, in most cases you can violate condition 1 and be OK
3612    -- in particular when the last two instructions have the same single
3613    size.  But nevertheless, you should guarantee the above two conditions.
3614 
3615    We could fix this so that single-instruction expansions correctly
3616    terminate when they can't handle the range, but the error messages are
3617    worse, and it actually turns out that in every case but one (18-bit wide
3618    branches), you need a multi-instruction expansion to get the full range
3619    anyway.  And because 18-bit branches are handled identically to 15-bit
3620    branches, there isn't any point in changing it.  */
3621 
3622 static int
3623 xg_assembly_relax (IStack *istack,
3624 		   TInsn *insn,
3625 		   segT pc_seg,
3626 		   fragS *pc_frag,	/* if pc_frag == 0, not pc-relative */
3627 		   offsetT pc_offset,	/* offset in fragment */
3628 		   int min_steps,	/* minimum conversion steps */
3629 		   long stretch)	/* number of bytes stretched so far */
3630 {
3631   int steps_taken = 0;
3632 
3633   /* Some of its immeds don't fit.  Try to build a relaxed version.
3634      This may go through a couple of stages of single instruction
3635      transformations before we get there.  */
3636 
3637   TInsn single_target;
3638   TInsn current_insn;
3639   int lateral_steps = 0;
3640   int istack_size = istack->ninsn;
3641 
3642   if (xg_symbolic_immeds_fit (insn, pc_seg, pc_frag, pc_offset, stretch)
3643       && steps_taken >= min_steps)
3644     {
3645       istack_push (istack, insn);
3646       return steps_taken;
3647     }
3648   current_insn = *insn;
3649 
3650   /* Walk through all of the single instruction expansions.  */
3651   while (xg_is_single_relaxable_insn (&current_insn, &single_target, FALSE))
3652     {
3653       steps_taken++;
3654       if (xg_symbolic_immeds_fit (&single_target, pc_seg, pc_frag, pc_offset,
3655 				  stretch))
3656 	{
3657 	  if (steps_taken >= min_steps)
3658 	    {
3659 	      istack_push (istack, &single_target);
3660 	      return steps_taken;
3661 	    }
3662 	}
3663       current_insn = single_target;
3664     }
3665 
3666   /* Now check for a multi-instruction expansion.  */
3667   while (xg_is_relaxable_insn (&current_insn, lateral_steps))
3668     {
3669       if (xg_symbolic_immeds_fit (&current_insn, pc_seg, pc_frag, pc_offset,
3670 				  stretch))
3671 	{
3672 	  if (steps_taken >= min_steps)
3673 	    {
3674 	      istack_push (istack, &current_insn);
3675 	      return steps_taken;
3676 	    }
3677 	}
3678       steps_taken++;
3679       if (xg_expand_to_stack (istack, &current_insn, lateral_steps))
3680 	{
3681 	  if (steps_taken >= min_steps)
3682 	    return steps_taken;
3683 	}
3684       lateral_steps++;
3685       istack->ninsn = istack_size;
3686     }
3687 
3688   /* It's not going to work -- use the original.  */
3689   istack_push (istack, insn);
3690   return steps_taken;
3691 }
3692 
3693 
3694 static void
3695 xg_finish_frag (char *last_insn,
3696 		enum xtensa_relax_statesE frag_state,
3697 		enum xtensa_relax_statesE slot0_state,
3698 		int max_growth,
3699 		bfd_boolean is_insn)
3700 {
3701   /* Finish off this fragment so that it has at LEAST the desired
3702      max_growth.  If it doesn't fit in this fragment, close this one
3703      and start a new one.  In either case, return a pointer to the
3704      beginning of the growth area.  */
3705 
3706   fragS *old_frag;
3707 
3708   frag_grow (max_growth);
3709   old_frag = frag_now;
3710 
3711   frag_now->fr_opcode = last_insn;
3712   if (is_insn)
3713     frag_now->tc_frag_data.is_insn = TRUE;
3714 
3715   frag_var (rs_machine_dependent, max_growth, max_growth,
3716 	    frag_state, frag_now->fr_symbol, frag_now->fr_offset, last_insn);
3717 
3718   old_frag->tc_frag_data.slot_subtypes[0] = slot0_state;
3719   xtensa_set_frag_assembly_state (frag_now);
3720 
3721   /* Just to make sure that we did not split it up.  */
3722   gas_assert (old_frag->fr_next == frag_now);
3723 }
3724 
3725 
3726 /* Return TRUE if the target frag is one of the next non-empty frags.  */
3727 
3728 static bfd_boolean
3729 is_next_frag_target (const fragS *fragP, const fragS *target)
3730 {
3731   if (fragP == NULL)
3732     return FALSE;
3733 
3734   for (; fragP; fragP = fragP->fr_next)
3735     {
3736       if (fragP == target)
3737 	return TRUE;
3738       if (fragP->fr_fix != 0)
3739 	return FALSE;
3740       if (fragP->fr_type == rs_fill && fragP->fr_offset != 0)
3741 	return FALSE;
3742       if ((fragP->fr_type == rs_align || fragP->fr_type == rs_align_code)
3743 	  && ((fragP->fr_address % (1 << fragP->fr_offset)) != 0))
3744 	return FALSE;
3745       if (fragP->fr_type == rs_space)
3746 	return FALSE;
3747     }
3748   return FALSE;
3749 }
3750 
3751 
3752 static bfd_boolean
3753 is_branch_jmp_to_next (TInsn *insn, fragS *fragP)
3754 {
3755   xtensa_isa isa = xtensa_default_isa;
3756   int i;
3757   int num_ops = xtensa_opcode_num_operands (isa, insn->opcode);
3758   int target_op = -1;
3759   symbolS *sym;
3760   fragS *target_frag;
3761 
3762   if (xtensa_opcode_is_branch (isa, insn->opcode) != 1
3763       && xtensa_opcode_is_jump (isa, insn->opcode) != 1)
3764     return FALSE;
3765 
3766   for (i = 0; i < num_ops; i++)
3767     {
3768       if (xtensa_operand_is_PCrelative (isa, insn->opcode, i) == 1)
3769 	{
3770 	  target_op = i;
3771 	  break;
3772 	}
3773     }
3774   if (target_op == -1)
3775     return FALSE;
3776 
3777   if (insn->ntok <= target_op)
3778     return FALSE;
3779 
3780   if (insn->tok[target_op].X_op != O_symbol)
3781     return FALSE;
3782 
3783   sym = insn->tok[target_op].X_add_symbol;
3784   if (sym == NULL)
3785     return FALSE;
3786 
3787   if (insn->tok[target_op].X_add_number != 0)
3788     return FALSE;
3789 
3790   target_frag = symbol_get_frag (sym);
3791   if (target_frag == NULL)
3792     return FALSE;
3793 
3794   if (is_next_frag_target (fragP->fr_next, target_frag)
3795       && S_GET_VALUE (sym) == target_frag->fr_address)
3796     return TRUE;
3797 
3798   return FALSE;
3799 }
3800 
3801 
3802 static void
3803 xg_add_branch_and_loop_targets (TInsn *insn)
3804 {
3805   xtensa_isa isa = xtensa_default_isa;
3806   int num_ops = xtensa_opcode_num_operands (isa, insn->opcode);
3807 
3808   if (xtensa_opcode_is_loop (isa, insn->opcode) == 1)
3809     {
3810       int i = 1;
3811       if (xtensa_operand_is_PCrelative (isa, insn->opcode, i) == 1
3812 	  && insn->tok[i].X_op == O_symbol)
3813 	symbol_get_tc (insn->tok[i].X_add_symbol)->is_loop_target = TRUE;
3814       return;
3815     }
3816 
3817   if (xtensa_opcode_is_branch (isa, insn->opcode) == 1
3818       || xtensa_opcode_is_loop (isa, insn->opcode) == 1)
3819     {
3820       int i;
3821 
3822       for (i = 0; i < insn->ntok && i < num_ops; i++)
3823 	{
3824 	  if (xtensa_operand_is_PCrelative (isa, insn->opcode, i) == 1
3825 	      && insn->tok[i].X_op == O_symbol)
3826 	    {
3827 	      symbolS *sym = insn->tok[i].X_add_symbol;
3828 	      symbol_get_tc (sym)->is_branch_target = TRUE;
3829 	      if (S_IS_DEFINED (sym))
3830 		symbol_get_frag (sym)->tc_frag_data.is_branch_target = TRUE;
3831 	    }
3832 	}
3833     }
3834 }
3835 
3836 
3837 /* Return FALSE if no error.  */
3838 
3839 static bfd_boolean
3840 xg_build_token_insn (BuildInstr *instr_spec, TInsn *old_insn, TInsn *new_insn)
3841 {
3842   int num_ops = 0;
3843   BuildOp *b_op;
3844 
3845   switch (instr_spec->typ)
3846     {
3847     case INSTR_INSTR:
3848       new_insn->insn_type = ITYPE_INSN;
3849       new_insn->opcode = instr_spec->opcode;
3850       break;
3851     case INSTR_LITERAL_DEF:
3852       new_insn->insn_type = ITYPE_LITERAL;
3853       new_insn->opcode = XTENSA_UNDEFINED;
3854       break;
3855     case INSTR_LABEL_DEF:
3856       abort ();
3857     }
3858   new_insn->is_specific_opcode = FALSE;
3859   new_insn->debug_line = old_insn->debug_line;
3860   new_insn->loc_directive_seen = old_insn->loc_directive_seen;
3861 
3862   for (b_op = instr_spec->ops; b_op != NULL; b_op = b_op->next)
3863     {
3864       expressionS *exp;
3865       const expressionS *src_exp;
3866 
3867       num_ops++;
3868       switch (b_op->typ)
3869 	{
3870 	case OP_CONSTANT:
3871 	  /* The expression must be the constant.  */
3872 	  gas_assert (b_op->op_num < MAX_INSN_ARGS);
3873 	  exp = &new_insn->tok[b_op->op_num];
3874 	  set_expr_const (exp, b_op->op_data);
3875 	  break;
3876 
3877 	case OP_OPERAND:
3878 	  gas_assert (b_op->op_num < MAX_INSN_ARGS);
3879 	  gas_assert (b_op->op_data < (unsigned) old_insn->ntok);
3880 	  src_exp = &old_insn->tok[b_op->op_data];
3881 	  exp = &new_insn->tok[b_op->op_num];
3882 	  copy_expr (exp, src_exp);
3883 	  break;
3884 
3885 	case OP_LITERAL:
3886 	case OP_LABEL:
3887 	  as_bad (_("can't handle generation of literal/labels yet"));
3888 	  gas_assert (0);
3889 
3890 	default:
3891 	  as_bad (_("can't handle undefined OP TYPE"));
3892 	  gas_assert (0);
3893 	}
3894     }
3895 
3896   new_insn->ntok = num_ops;
3897   return FALSE;
3898 }
3899 
3900 
3901 /* Return TRUE if it was simplified.  */
3902 
3903 static bfd_boolean
3904 xg_simplify_insn (TInsn *old_insn, TInsn *new_insn)
3905 {
3906   TransitionRule *rule;
3907   BuildInstr *insn_spec;
3908 
3909   if (old_insn->is_specific_opcode || !density_supported)
3910     return FALSE;
3911 
3912   rule = xg_instruction_match (old_insn);
3913   if (rule == NULL)
3914     return FALSE;
3915 
3916   insn_spec = rule->to_instr;
3917   /* There should only be one.  */
3918   gas_assert (insn_spec != NULL);
3919   gas_assert (insn_spec->next == NULL);
3920   if (insn_spec->next != NULL)
3921     return FALSE;
3922 
3923   xg_build_token_insn (insn_spec, old_insn, new_insn);
3924 
3925   return TRUE;
3926 }
3927 
3928 
3929 /* xg_expand_assembly_insn: (1) Simplify the instruction, i.e., l32i ->
3930    l32i.n. (2) Check the number of operands.  (3) Place the instruction
3931    tokens into the stack or relax it and place multiple
3932    instructions/literals onto the stack.  Return FALSE if no error.  */
3933 
3934 static bfd_boolean
3935 xg_expand_assembly_insn (IStack *istack, TInsn *orig_insn)
3936 {
3937   int noperands;
3938   TInsn new_insn;
3939   bfd_boolean do_expand;
3940 
3941   tinsn_init (&new_insn);
3942 
3943   /* Narrow it if we can.  xg_simplify_insn now does all the
3944      appropriate checking (e.g., for the density option).  */
3945   if (xg_simplify_insn (orig_insn, &new_insn))
3946     orig_insn = &new_insn;
3947 
3948   noperands = xtensa_opcode_num_operands (xtensa_default_isa,
3949 					  orig_insn->opcode);
3950   if (orig_insn->ntok < noperands)
3951     {
3952       as_bad (_("found %d operands for '%s':  Expected %d"),
3953 	      orig_insn->ntok,
3954 	      xtensa_opcode_name (xtensa_default_isa, orig_insn->opcode),
3955 	      noperands);
3956       return TRUE;
3957     }
3958   if (orig_insn->ntok > noperands)
3959     as_warn (_("found too many (%d) operands for '%s':  Expected %d"),
3960 	     orig_insn->ntok,
3961 	     xtensa_opcode_name (xtensa_default_isa, orig_insn->opcode),
3962 	     noperands);
3963 
3964   /* If there are not enough operands, we will assert above.  If there
3965      are too many, just cut out the extras here.  */
3966   orig_insn->ntok = noperands;
3967 
3968   if (tinsn_has_invalid_symbolic_operands (orig_insn))
3969     return TRUE;
3970 
3971   /* Special case for extui opcode which has constraints not handled
3972      by the ordinary operand encoding checks.  The number of operands
3973      and related syntax issues have already been checked.  */
3974   if (orig_insn->opcode == xtensa_extui_opcode)
3975     {
3976       int shiftimm = orig_insn->tok[2].X_add_number;
3977       int maskimm = orig_insn->tok[3].X_add_number;
3978       if (shiftimm + maskimm > 32)
3979 	{
3980 	  as_bad (_("immediate operands sum to greater than 32"));
3981 	  return TRUE;
3982 	}
3983     }
3984 
3985   /* If the instruction will definitely need to be relaxed, it is better
3986      to expand it now for better scheduling.  Decide whether to expand
3987      now....  */
3988   do_expand = (!orig_insn->is_specific_opcode && use_transform ());
3989 
3990   /* Calls should be expanded to longcalls only in the backend relaxation
3991      so that the assembly scheduler will keep the L32R/CALLX instructions
3992      adjacent.  */
3993   if (is_direct_call_opcode (orig_insn->opcode))
3994     do_expand = FALSE;
3995 
3996   if (tinsn_has_symbolic_operands (orig_insn))
3997     {
3998       /* The values of symbolic operands are not known yet, so only expand
3999 	 now if an operand is "complex" (e.g., difference of symbols) and
4000 	 will have to be stored as a literal regardless of the value.  */
4001       if (!tinsn_has_complex_operands (orig_insn))
4002 	do_expand = FALSE;
4003     }
4004   else if (xg_immeds_fit (orig_insn))
4005     do_expand = FALSE;
4006 
4007   if (do_expand)
4008     xg_assembly_relax (istack, orig_insn, 0, 0, 0, 0, 0);
4009   else
4010     istack_push (istack, orig_insn);
4011 
4012   return FALSE;
4013 }
4014 
4015 
4016 /* Return TRUE if the section flags are marked linkonce
4017    or the name is .gnu.linkonce.*.  */
4018 
4019 static int linkonce_len = sizeof (".gnu.linkonce.") - 1;
4020 
4021 static bfd_boolean
4022 get_is_linkonce_section (bfd *abfd ATTRIBUTE_UNUSED, segT sec)
4023 {
4024   flagword flags, link_once_flags;
4025 
4026   flags = bfd_get_section_flags (abfd, sec);
4027   link_once_flags = (flags & SEC_LINK_ONCE);
4028 
4029   /* Flags might not be set yet.  */
4030   if (!link_once_flags
4031       && strncmp (segment_name (sec), ".gnu.linkonce.", linkonce_len) == 0)
4032     link_once_flags = SEC_LINK_ONCE;
4033 
4034   return (link_once_flags != 0);
4035 }
4036 
4037 
4038 static void
4039 xtensa_add_literal_sym (symbolS *sym)
4040 {
4041   sym_list *l;
4042 
4043   l = (sym_list *) xmalloc (sizeof (sym_list));
4044   l->sym = sym;
4045   l->next = literal_syms;
4046   literal_syms = l;
4047 }
4048 
4049 
4050 static symbolS *
4051 xtensa_create_literal_symbol (segT sec, fragS *frag)
4052 {
4053   static int lit_num = 0;
4054   static char name[256];
4055   symbolS *symbolP;
4056 
4057   sprintf (name, ".L_lit_sym%d", lit_num);
4058 
4059   /* Create a local symbol.  If it is in a linkonce section, we have to
4060      be careful to make sure that if it is used in a relocation that the
4061      symbol will be in the output file.  */
4062   if (get_is_linkonce_section (stdoutput, sec))
4063     {
4064       symbolP = symbol_new (name, sec, 0, frag);
4065       S_CLEAR_EXTERNAL (symbolP);
4066       /* symbolP->local = 1; */
4067     }
4068   else
4069     symbolP = symbol_new (name, sec, 0, frag);
4070 
4071   xtensa_add_literal_sym (symbolP);
4072 
4073   lit_num++;
4074   return symbolP;
4075 }
4076 
4077 
4078 /* Currently all literals that are generated here are 32-bit L32R targets.  */
4079 
4080 static symbolS *
4081 xg_assemble_literal (/* const */ TInsn *insn)
4082 {
4083   emit_state state;
4084   symbolS *lit_sym = NULL;
4085   bfd_reloc_code_real_type reloc;
4086   bfd_boolean pcrel = FALSE;
4087   char *p;
4088 
4089   /* size = 4 for L32R.  It could easily be larger when we move to
4090      larger constants.  Add a parameter later.  */
4091   offsetT litsize = 4;
4092   offsetT litalign = 2;		/* 2^2 = 4 */
4093   expressionS saved_loc;
4094   expressionS * emit_val;
4095 
4096   set_expr_symbol_offset (&saved_loc, frag_now->fr_symbol, frag_now_fix ());
4097 
4098   gas_assert (insn->insn_type == ITYPE_LITERAL);
4099   gas_assert (insn->ntok == 1);	/* must be only one token here */
4100 
4101   xtensa_switch_to_literal_fragment (&state);
4102 
4103   emit_val = &insn->tok[0];
4104   if (emit_val->X_op == O_big)
4105     {
4106       int size = emit_val->X_add_number * CHARS_PER_LITTLENUM;
4107       if (size > litsize)
4108 	{
4109 	  /* This happens when someone writes a "movi a2, big_number".  */
4110 	  as_bad_where (frag_now->fr_file, frag_now->fr_line,
4111 			_("invalid immediate"));
4112 	  xtensa_restore_emit_state (&state);
4113 	  return NULL;
4114 	}
4115     }
4116 
4117   /* Force a 4-byte align here.  Note that this opens a new frag, so all
4118      literals done with this function have a frag to themselves.  That's
4119      important for the way text section literals work.  */
4120   frag_align (litalign, 0, 0);
4121   record_alignment (now_seg, litalign);
4122 
4123   switch (emit_val->X_op)
4124     {
4125     case O_pcrel:
4126       pcrel = TRUE;
4127       /* fall through */
4128     case O_pltrel:
4129     case O_tlsfunc:
4130     case O_tlsarg:
4131     case O_tpoff:
4132     case O_dtpoff:
4133       p = frag_more (litsize);
4134       xtensa_set_frag_assembly_state (frag_now);
4135       reloc = map_operator_to_reloc (emit_val->X_op, TRUE);
4136       if (emit_val->X_add_symbol)
4137 	emit_val->X_op = O_symbol;
4138       else
4139 	emit_val->X_op = O_constant;
4140       fix_new_exp (frag_now, p - frag_now->fr_literal,
4141 		   litsize, emit_val, pcrel, reloc);
4142       break;
4143 
4144     default:
4145       emit_expr (emit_val, litsize);
4146       break;
4147     }
4148 
4149   gas_assert (frag_now->tc_frag_data.literal_frag == NULL);
4150   frag_now->tc_frag_data.literal_frag = get_literal_pool_location (now_seg);
4151   frag_now->fr_symbol = xtensa_create_literal_symbol (now_seg, frag_now);
4152   lit_sym = frag_now->fr_symbol;
4153 
4154   /* Go back.  */
4155   xtensa_restore_emit_state (&state);
4156   return lit_sym;
4157 }
4158 
4159 
4160 static void
4161 xg_assemble_literal_space (/* const */ int size, int slot)
4162 {
4163   emit_state state;
4164   /* We might have to do something about this alignment.  It only
4165      takes effect if something is placed here.  */
4166   offsetT litalign = 2;		/* 2^2 = 4 */
4167   fragS *lit_saved_frag;
4168 
4169   gas_assert (size % 4 == 0);
4170 
4171   xtensa_switch_to_literal_fragment (&state);
4172 
4173   /* Force a 4-byte align here.  */
4174   frag_align (litalign, 0, 0);
4175   record_alignment (now_seg, litalign);
4176 
4177   frag_grow (size);
4178 
4179   lit_saved_frag = frag_now;
4180   frag_now->tc_frag_data.literal_frag = get_literal_pool_location (now_seg);
4181   frag_now->fr_symbol = xtensa_create_literal_symbol (now_seg, frag_now);
4182   xg_finish_frag (0, RELAX_LITERAL, 0, size, FALSE);
4183 
4184   /* Go back.  */
4185   xtensa_restore_emit_state (&state);
4186   frag_now->tc_frag_data.literal_frags[slot] = lit_saved_frag;
4187 }
4188 
4189 
4190 /* Put in a fixup record based on the opcode.
4191    Return TRUE on success.  */
4192 
4193 static bfd_boolean
4194 xg_add_opcode_fix (TInsn *tinsn,
4195 		   int opnum,
4196 		   xtensa_format fmt,
4197 		   int slot,
4198 		   expressionS *exp,
4199 		   fragS *fragP,
4200 		   offsetT offset)
4201 {
4202   xtensa_opcode opcode = tinsn->opcode;
4203   bfd_reloc_code_real_type reloc;
4204   reloc_howto_type *howto;
4205   int fmt_length;
4206   fixS *the_fix;
4207 
4208   reloc = BFD_RELOC_NONE;
4209 
4210   /* First try the special cases for "alternate" relocs.  */
4211   if (opcode == xtensa_l32r_opcode)
4212     {
4213       if (fragP->tc_frag_data.use_absolute_literals)
4214 	reloc = encode_alt_reloc (slot);
4215     }
4216   else if (opcode == xtensa_const16_opcode)
4217     {
4218       if (exp->X_op == O_lo16)
4219 	{
4220 	  reloc = encode_reloc (slot);
4221 	  exp->X_op = O_symbol;
4222 	}
4223       else if (exp->X_op == O_hi16)
4224 	{
4225 	  reloc = encode_alt_reloc (slot);
4226 	  exp->X_op = O_symbol;
4227 	}
4228     }
4229 
4230   if (opnum != get_relaxable_immed (opcode))
4231     {
4232       as_bad (_("invalid relocation for operand %i of '%s'"),
4233 	      opnum + 1, xtensa_opcode_name (xtensa_default_isa, opcode));
4234       return FALSE;
4235     }
4236 
4237   /* Handle erroneous "@h" and "@l" expressions here before they propagate
4238      into the symbol table where the generic portions of the assembler
4239      won't know what to do with them.  */
4240   if (exp->X_op == O_lo16 || exp->X_op == O_hi16)
4241     {
4242       as_bad (_("invalid expression for operand %i of '%s'"),
4243 	      opnum + 1, xtensa_opcode_name (xtensa_default_isa, opcode));
4244       return FALSE;
4245     }
4246 
4247   /* Next try the generic relocs.  */
4248   if (reloc == BFD_RELOC_NONE)
4249     reloc = encode_reloc (slot);
4250   if (reloc == BFD_RELOC_NONE)
4251     {
4252       as_bad (_("invalid relocation in instruction slot %i"), slot);
4253       return FALSE;
4254     }
4255 
4256   howto = bfd_reloc_type_lookup (stdoutput, reloc);
4257   if (!howto)
4258     {
4259       as_bad (_("undefined symbol for opcode \"%s\""),
4260 	      xtensa_opcode_name (xtensa_default_isa, opcode));
4261       return FALSE;
4262     }
4263 
4264   fmt_length = xtensa_format_length (xtensa_default_isa, fmt);
4265   the_fix = fix_new_exp (fragP, offset, fmt_length, exp,
4266 			 howto->pc_relative, reloc);
4267   the_fix->fx_no_overflow = 1;
4268   the_fix->tc_fix_data.X_add_symbol = exp->X_add_symbol;
4269   the_fix->tc_fix_data.X_add_number = exp->X_add_number;
4270   the_fix->tc_fix_data.slot = slot;
4271 
4272   return TRUE;
4273 }
4274 
4275 
4276 static bfd_boolean
4277 xg_emit_insn_to_buf (TInsn *tinsn,
4278 		     char *buf,
4279 		     fragS *fragP,
4280 		     offsetT offset,
4281 		     bfd_boolean build_fix)
4282 {
4283   static xtensa_insnbuf insnbuf = NULL;
4284   bfd_boolean has_symbolic_immed = FALSE;
4285   bfd_boolean ok = TRUE;
4286 
4287   if (!insnbuf)
4288     insnbuf = xtensa_insnbuf_alloc (xtensa_default_isa);
4289 
4290   has_symbolic_immed = tinsn_to_insnbuf (tinsn, insnbuf);
4291   if (has_symbolic_immed && build_fix)
4292     {
4293       /* Add a fixup.  */
4294       xtensa_format fmt = xg_get_single_format (tinsn->opcode);
4295       int slot = xg_get_single_slot (tinsn->opcode);
4296       int opnum = get_relaxable_immed (tinsn->opcode);
4297       expressionS *exp = &tinsn->tok[opnum];
4298 
4299       if (!xg_add_opcode_fix (tinsn, opnum, fmt, slot, exp, fragP, offset))
4300 	ok = FALSE;
4301     }
4302   fragP->tc_frag_data.is_insn = TRUE;
4303   xtensa_insnbuf_to_chars (xtensa_default_isa, insnbuf,
4304 			   (unsigned char *) buf, 0);
4305   return ok;
4306 }
4307 
4308 
4309 static void
4310 xg_resolve_literals (TInsn *insn, symbolS *lit_sym)
4311 {
4312   symbolS *sym = get_special_literal_symbol ();
4313   int i;
4314   if (lit_sym == 0)
4315     return;
4316   gas_assert (insn->insn_type == ITYPE_INSN);
4317   for (i = 0; i < insn->ntok; i++)
4318     if (insn->tok[i].X_add_symbol == sym)
4319       insn->tok[i].X_add_symbol = lit_sym;
4320 
4321 }
4322 
4323 
4324 static void
4325 xg_resolve_labels (TInsn *insn, symbolS *label_sym)
4326 {
4327   symbolS *sym = get_special_label_symbol ();
4328   int i;
4329   for (i = 0; i < insn->ntok; i++)
4330     if (insn->tok[i].X_add_symbol == sym)
4331       insn->tok[i].X_add_symbol = label_sym;
4332 
4333 }
4334 
4335 
4336 /* Return TRUE if the instruction can write to the specified
4337    integer register.  */
4338 
4339 static bfd_boolean
4340 is_register_writer (const TInsn *insn, const char *regset, int regnum)
4341 {
4342   int i;
4343   int num_ops;
4344   xtensa_isa isa = xtensa_default_isa;
4345 
4346   num_ops = xtensa_opcode_num_operands (isa, insn->opcode);
4347 
4348   for (i = 0; i < num_ops; i++)
4349     {
4350       char inout;
4351       inout = xtensa_operand_inout (isa, insn->opcode, i);
4352       if ((inout == 'o' || inout == 'm')
4353 	  && xtensa_operand_is_register (isa, insn->opcode, i) == 1)
4354 	{
4355 	  xtensa_regfile opnd_rf =
4356 	    xtensa_operand_regfile (isa, insn->opcode, i);
4357 	  if (!strcmp (xtensa_regfile_shortname (isa, opnd_rf), regset))
4358 	    {
4359 	      if ((insn->tok[i].X_op == O_register)
4360 		  && (insn->tok[i].X_add_number == regnum))
4361 		return TRUE;
4362 	    }
4363 	}
4364     }
4365   return FALSE;
4366 }
4367 
4368 
4369 static bfd_boolean
4370 is_bad_loopend_opcode (const TInsn *tinsn)
4371 {
4372   xtensa_opcode opcode = tinsn->opcode;
4373 
4374   if (opcode == XTENSA_UNDEFINED)
4375     return FALSE;
4376 
4377   if (opcode == xtensa_call0_opcode
4378       || opcode == xtensa_callx0_opcode
4379       || opcode == xtensa_call4_opcode
4380       || opcode == xtensa_callx4_opcode
4381       || opcode == xtensa_call8_opcode
4382       || opcode == xtensa_callx8_opcode
4383       || opcode == xtensa_call12_opcode
4384       || opcode == xtensa_callx12_opcode
4385       || opcode == xtensa_isync_opcode
4386       || opcode == xtensa_ret_opcode
4387       || opcode == xtensa_ret_n_opcode
4388       || opcode == xtensa_retw_opcode
4389       || opcode == xtensa_retw_n_opcode
4390       || opcode == xtensa_waiti_opcode
4391       || opcode == xtensa_rsr_lcount_opcode)
4392     return TRUE;
4393 
4394   return FALSE;
4395 }
4396 
4397 
4398 /* Labels that begin with ".Ln" or ".LM"  are unaligned.
4399    This allows the debugger to add unaligned labels.
4400    Also, the assembler generates stabs labels that need
4401    not be aligned:  FAKE_LABEL_NAME . {"F", "L", "endfunc"}.  */
4402 
4403 static bfd_boolean
4404 is_unaligned_label (symbolS *sym)
4405 {
4406   const char *name = S_GET_NAME (sym);
4407   static size_t fake_size = 0;
4408 
4409   if (name
4410       && name[0] == '.'
4411       && name[1] == 'L' && (name[2] == 'n' || name[2] == 'M'))
4412     return TRUE;
4413 
4414   /* FAKE_LABEL_NAME followed by "F", "L" or "endfunc" */
4415   if (fake_size == 0)
4416     fake_size = strlen (FAKE_LABEL_NAME);
4417 
4418   if (name
4419       && strncmp (FAKE_LABEL_NAME, name, fake_size) == 0
4420       && (name[fake_size] == 'F'
4421 	  || name[fake_size] == 'L'
4422 	  || (name[fake_size] == 'e'
4423 	      && strncmp ("endfunc", name+fake_size, 7) == 0)))
4424     return TRUE;
4425 
4426   return FALSE;
4427 }
4428 
4429 
4430 static fragS *
4431 next_non_empty_frag (const fragS *fragP)
4432 {
4433   fragS *next_fragP = fragP->fr_next;
4434 
4435   /* Sometimes an empty will end up here due storage allocation issues.
4436      So we have to skip until we find something legit.  */
4437   while (next_fragP && next_fragP->fr_fix == 0)
4438     next_fragP = next_fragP->fr_next;
4439 
4440   if (next_fragP == NULL || next_fragP->fr_fix == 0)
4441     return NULL;
4442 
4443   return next_fragP;
4444 }
4445 
4446 
4447 static bfd_boolean
4448 next_frag_opcode_is_loop (const fragS *fragP, xtensa_opcode *opcode)
4449 {
4450   xtensa_opcode out_opcode;
4451   const fragS *next_fragP = next_non_empty_frag (fragP);
4452 
4453   if (next_fragP == NULL)
4454     return FALSE;
4455 
4456   out_opcode = get_opcode_from_buf (next_fragP->fr_literal, 0);
4457   if (xtensa_opcode_is_loop (xtensa_default_isa, out_opcode) == 1)
4458     {
4459       *opcode = out_opcode;
4460       return TRUE;
4461     }
4462   return FALSE;
4463 }
4464 
4465 
4466 static int
4467 frag_format_size (const fragS *fragP)
4468 {
4469   static xtensa_insnbuf insnbuf = NULL;
4470   xtensa_isa isa = xtensa_default_isa;
4471   xtensa_format fmt;
4472   int fmt_size;
4473 
4474   if (!insnbuf)
4475     insnbuf = xtensa_insnbuf_alloc (isa);
4476 
4477   if (fragP == NULL)
4478     return XTENSA_UNDEFINED;
4479 
4480   xtensa_insnbuf_from_chars (isa, insnbuf,
4481 			     (unsigned char *) fragP->fr_literal, 0);
4482 
4483   fmt = xtensa_format_decode (isa, insnbuf);
4484   if (fmt == XTENSA_UNDEFINED)
4485     return XTENSA_UNDEFINED;
4486   fmt_size = xtensa_format_length (isa, fmt);
4487 
4488   /* If the next format won't be changing due to relaxation, just
4489      return the length of the first format.  */
4490   if (fragP->fr_opcode != fragP->fr_literal)
4491     return fmt_size;
4492 
4493   /* If during relaxation we have to pull an instruction out of a
4494      multi-slot instruction, we will return the more conservative
4495      number.  This works because alignment on bigger instructions
4496      is more restrictive than alignment on smaller instructions.
4497      This is more conservative than we would like, but it happens
4498      infrequently.  */
4499 
4500   if (xtensa_format_num_slots (xtensa_default_isa, fmt) > 1)
4501     return fmt_size;
4502 
4503   /* If we aren't doing one of our own relaxations or it isn't
4504      slot-based, then the insn size won't change.  */
4505   if (fragP->fr_type != rs_machine_dependent)
4506     return fmt_size;
4507   if (fragP->fr_subtype != RELAX_SLOTS)
4508     return fmt_size;
4509 
4510   /* If an instruction is about to grow, return the longer size.  */
4511   if (fragP->tc_frag_data.slot_subtypes[0] == RELAX_IMMED_STEP1
4512       || fragP->tc_frag_data.slot_subtypes[0] == RELAX_IMMED_STEP2
4513       || fragP->tc_frag_data.slot_subtypes[0] == RELAX_IMMED_STEP3)
4514     {
4515       /* For most frags at RELAX_IMMED_STEPX, with X > 0, the first
4516 	 instruction in the relaxed version is of length 3.  (The case
4517 	 where we have to pull the instruction out of a FLIX bundle
4518 	 is handled conservatively above.)  However, frags with opcodes
4519 	 that are expanding to wide branches end up having formats that
4520 	 are not determinable by the RELAX_IMMED_STEPX enumeration, and
4521 	 we can't tell directly what format the relaxer picked.  This
4522 	 is a wart in the design of the relaxer that should someday be
4523 	 fixed, but would require major changes, or at least should
4524 	 be accompanied by major changes to make use of that data.
4525 
4526 	 In any event, we can tell that we are expanding from a single-slot
4527 	 format to a wider one with the logic below.  */
4528 
4529       int i;
4530       int relaxed_size = fmt_size + fragP->tc_frag_data.text_expansion[0];
4531 
4532       for (i = 0; i < xtensa_isa_num_formats (isa); i++)
4533 	{
4534 	  if (relaxed_size == xtensa_format_length (isa, i))
4535 	    return relaxed_size;
4536 	}
4537 
4538       return 3;
4539     }
4540 
4541   if (fragP->tc_frag_data.slot_subtypes[0] == RELAX_NARROW)
4542     return 2 + fragP->tc_frag_data.text_expansion[0];
4543 
4544   return fmt_size;
4545 }
4546 
4547 
4548 static int
4549 next_frag_format_size (const fragS *fragP)
4550 {
4551   const fragS *next_fragP = next_non_empty_frag (fragP);
4552   return frag_format_size (next_fragP);
4553 }
4554 
4555 
4556 /* In early Xtensa Processors, for reasons that are unclear, the ISA
4557    required two-byte instructions to be treated as three-byte instructions
4558    for loop instruction alignment.  This restriction was removed beginning
4559    with Xtensa LX.  Now the only requirement on loop instruction alignment
4560    is that the first instruction of the loop must appear at an address that
4561    does not cross a fetch boundary.  */
4562 
4563 static int
4564 get_loop_align_size (int insn_size)
4565 {
4566   if (insn_size == XTENSA_UNDEFINED)
4567     return xtensa_fetch_width;
4568 
4569   if (enforce_three_byte_loop_align && insn_size == 2)
4570     return 3;
4571 
4572   return insn_size;
4573 }
4574 
4575 
4576 /* If the next legit fragment is an end-of-loop marker,
4577    switch its state so it will instantiate a NOP.  */
4578 
4579 static void
4580 update_next_frag_state (fragS *fragP)
4581 {
4582   fragS *next_fragP = fragP->fr_next;
4583   fragS *new_target = NULL;
4584 
4585   if (align_targets)
4586     {
4587       /* We are guaranteed there will be one of these...   */
4588       while (!(next_fragP->fr_type == rs_machine_dependent
4589 	       && (next_fragP->fr_subtype == RELAX_MAYBE_UNREACHABLE
4590 		   || next_fragP->fr_subtype == RELAX_UNREACHABLE)))
4591 	next_fragP = next_fragP->fr_next;
4592 
4593       gas_assert (next_fragP->fr_type == rs_machine_dependent
4594 	      && (next_fragP->fr_subtype == RELAX_MAYBE_UNREACHABLE
4595 		  || next_fragP->fr_subtype == RELAX_UNREACHABLE));
4596 
4597       /* ...and one of these.  */
4598       new_target = next_fragP->fr_next;
4599       while (!(new_target->fr_type == rs_machine_dependent
4600 	       && (new_target->fr_subtype == RELAX_MAYBE_DESIRE_ALIGN
4601 		   || new_target->fr_subtype == RELAX_DESIRE_ALIGN)))
4602 	new_target = new_target->fr_next;
4603 
4604       gas_assert (new_target->fr_type == rs_machine_dependent
4605 	      && (new_target->fr_subtype == RELAX_MAYBE_DESIRE_ALIGN
4606 		  || new_target->fr_subtype == RELAX_DESIRE_ALIGN));
4607     }
4608 
4609   while (next_fragP && next_fragP->fr_fix == 0)
4610     {
4611       if (next_fragP->fr_type == rs_machine_dependent
4612 	  && next_fragP->fr_subtype == RELAX_LOOP_END)
4613 	{
4614 	  next_fragP->fr_subtype = RELAX_LOOP_END_ADD_NOP;
4615 	  return;
4616 	}
4617 
4618       next_fragP = next_fragP->fr_next;
4619     }
4620 }
4621 
4622 
4623 static bfd_boolean
4624 next_frag_is_branch_target (const fragS *fragP)
4625 {
4626   /* Sometimes an empty will end up here due to storage allocation issues,
4627      so we have to skip until we find something legit.  */
4628   for (fragP = fragP->fr_next; fragP; fragP = fragP->fr_next)
4629     {
4630       if (fragP->tc_frag_data.is_branch_target)
4631 	return TRUE;
4632       if (fragP->fr_fix != 0)
4633 	break;
4634     }
4635   return FALSE;
4636 }
4637 
4638 
4639 static bfd_boolean
4640 next_frag_is_loop_target (const fragS *fragP)
4641 {
4642   /* Sometimes an empty will end up here due storage allocation issues.
4643      So we have to skip until we find something legit. */
4644   for (fragP = fragP->fr_next; fragP; fragP = fragP->fr_next)
4645     {
4646       if (fragP->tc_frag_data.is_loop_target)
4647 	return TRUE;
4648       if (fragP->fr_fix != 0)
4649 	break;
4650     }
4651   return FALSE;
4652 }
4653 
4654 
4655 /* As specified in the relaxation table, when a loop instruction is
4656    relaxed, there are 24 bytes between the loop instruction itself and
4657    the first instruction in the loop.  */
4658 
4659 #define RELAXED_LOOP_INSN_BYTES 24
4660 
4661 static addressT
4662 next_frag_pre_opcode_bytes (const fragS *fragp)
4663 {
4664   const fragS *next_fragp = fragp->fr_next;
4665   xtensa_opcode next_opcode;
4666 
4667   if (!next_frag_opcode_is_loop (fragp, &next_opcode))
4668     return 0;
4669 
4670   /* Sometimes an empty will end up here due to storage allocation issues,
4671      so we have to skip until we find something legit.  */
4672   while (next_fragp->fr_fix == 0)
4673     next_fragp = next_fragp->fr_next;
4674 
4675   if (next_fragp->fr_type != rs_machine_dependent)
4676     return 0;
4677 
4678   /* There is some implicit knowledge encoded in here.
4679      The LOOP instructions that are NOT RELAX_IMMED have
4680      been relaxed.  Note that we can assume that the LOOP
4681      instruction is in slot 0 because loops aren't bundleable.  */
4682   if (next_fragp->tc_frag_data.slot_subtypes[0] > RELAX_IMMED)
4683       return get_expanded_loop_offset (next_opcode) + RELAXED_LOOP_INSN_BYTES;
4684 
4685   return 0;
4686 }
4687 
4688 
4689 /* Mark a location where we can later insert literal frags.  Update
4690    the section's literal_pool_loc, so subsequent literals can be
4691    placed nearest to their use.  */
4692 
4693 static void
4694 xtensa_mark_literal_pool_location (void)
4695 {
4696   /* Any labels pointing to the current location need
4697      to be adjusted to after the literal pool.  */
4698   emit_state s;
4699   fragS *pool_location;
4700 
4701   if (use_literal_section)
4702     return;
4703 
4704   /* We stash info in these frags so we can later move the literal's
4705      fixes into this frchain's fix list.  */
4706   pool_location = frag_now;
4707   frag_now->tc_frag_data.lit_frchain = frchain_now;
4708   frag_now->tc_frag_data.literal_frag = frag_now;
4709   frag_variant (rs_machine_dependent, 0, 0,
4710 		RELAX_LITERAL_POOL_BEGIN, NULL, 0, NULL);
4711   xtensa_set_frag_assembly_state (frag_now);
4712   frag_now->tc_frag_data.lit_seg = now_seg;
4713   frag_variant (rs_machine_dependent, 0, 0,
4714 		RELAX_LITERAL_POOL_END, NULL, 0, NULL);
4715   xtensa_set_frag_assembly_state (frag_now);
4716 
4717   /* Now put a frag into the literal pool that points to this location.  */
4718   set_literal_pool_location (now_seg, pool_location);
4719   xtensa_switch_to_non_abs_literal_fragment (&s);
4720   frag_align (2, 0, 0);
4721   record_alignment (now_seg, 2);
4722 
4723   /* Close whatever frag is there.  */
4724   frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
4725   xtensa_set_frag_assembly_state (frag_now);
4726   frag_now->tc_frag_data.literal_frag = pool_location;
4727   frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
4728   xtensa_restore_emit_state (&s);
4729   xtensa_set_frag_assembly_state (frag_now);
4730 }
4731 
4732 
4733 /* Build a nop of the correct size into tinsn.  */
4734 
4735 static void
4736 build_nop (TInsn *tinsn, int size)
4737 {
4738   tinsn_init (tinsn);
4739   switch (size)
4740     {
4741     case 2:
4742       tinsn->opcode = xtensa_nop_n_opcode;
4743       tinsn->ntok = 0;
4744       if (tinsn->opcode == XTENSA_UNDEFINED)
4745 	as_fatal (_("opcode 'NOP.N' unavailable in this configuration"));
4746       break;
4747 
4748     case 3:
4749       if (xtensa_nop_opcode == XTENSA_UNDEFINED)
4750 	{
4751 	  tinsn->opcode = xtensa_or_opcode;
4752 	  set_expr_const (&tinsn->tok[0], 1);
4753 	  set_expr_const (&tinsn->tok[1], 1);
4754 	  set_expr_const (&tinsn->tok[2], 1);
4755 	  tinsn->ntok = 3;
4756 	}
4757       else
4758 	tinsn->opcode = xtensa_nop_opcode;
4759 
4760       gas_assert (tinsn->opcode != XTENSA_UNDEFINED);
4761     }
4762 }
4763 
4764 
4765 /* Assemble a NOP of the requested size in the buffer.  User must have
4766    allocated "buf" with at least "size" bytes.  */
4767 
4768 static void
4769 assemble_nop (int size, char *buf)
4770 {
4771   static xtensa_insnbuf insnbuf = NULL;
4772   TInsn tinsn;
4773 
4774   build_nop (&tinsn, size);
4775 
4776   if (!insnbuf)
4777     insnbuf = xtensa_insnbuf_alloc (xtensa_default_isa);
4778 
4779   tinsn_to_insnbuf (&tinsn, insnbuf);
4780   xtensa_insnbuf_to_chars (xtensa_default_isa, insnbuf,
4781 			   (unsigned char *) buf, 0);
4782 }
4783 
4784 
4785 /* Return the number of bytes for the offset of the expanded loop
4786    instruction.  This should be incorporated into the relaxation
4787    specification but is hard-coded here.  This is used to auto-align
4788    the loop instruction.  It is invalid to call this function if the
4789    configuration does not have loops or if the opcode is not a loop
4790    opcode.  */
4791 
4792 static addressT
4793 get_expanded_loop_offset (xtensa_opcode opcode)
4794 {
4795   /* This is the OFFSET of the loop instruction in the expanded loop.
4796      This MUST correspond directly to the specification of the loop
4797      expansion.  It will be validated on fragment conversion.  */
4798   gas_assert (opcode != XTENSA_UNDEFINED);
4799   if (opcode == xtensa_loop_opcode)
4800     return 0;
4801   if (opcode == xtensa_loopnez_opcode)
4802     return 3;
4803   if (opcode == xtensa_loopgtz_opcode)
4804     return 6;
4805   as_fatal (_("get_expanded_loop_offset: invalid opcode"));
4806   return 0;
4807 }
4808 
4809 
4810 static fragS *
4811 get_literal_pool_location (segT seg)
4812 {
4813   return seg_info (seg)->tc_segment_info_data.literal_pool_loc;
4814 }
4815 
4816 
4817 static void
4818 set_literal_pool_location (segT seg, fragS *literal_pool_loc)
4819 {
4820   seg_info (seg)->tc_segment_info_data.literal_pool_loc = literal_pool_loc;
4821 }
4822 
4823 
4824 /* Set frag assembly state should be called when a new frag is
4825    opened and after a frag has been closed.  */
4826 
4827 static void
4828 xtensa_set_frag_assembly_state (fragS *fragP)
4829 {
4830   if (!density_supported)
4831     fragP->tc_frag_data.is_no_density = TRUE;
4832 
4833   /* This function is called from subsegs_finish, which is called
4834      after xtensa_end, so we can't use "use_transform" or
4835      "use_schedule" here.  */
4836   if (!directive_state[directive_transform])
4837     fragP->tc_frag_data.is_no_transform = TRUE;
4838   if (directive_state[directive_longcalls])
4839     fragP->tc_frag_data.use_longcalls = TRUE;
4840   fragP->tc_frag_data.use_absolute_literals =
4841     directive_state[directive_absolute_literals];
4842   fragP->tc_frag_data.is_assembly_state_set = TRUE;
4843 }
4844 
4845 
4846 static bfd_boolean
4847 relaxable_section (asection *sec)
4848 {
4849   return ((sec->flags & SEC_DEBUGGING) == 0
4850 	  && strcmp (sec->name, ".eh_frame") != 0);
4851 }
4852 
4853 
4854 static void
4855 xtensa_mark_frags_for_org (void)
4856 {
4857   segT *seclist;
4858 
4859   /* Walk over each fragment of all of the current segments.  If we find
4860      a .org frag in any of the segments, mark all frags prior to it as
4861      "no transform", which will prevent linker optimizations from messing
4862      up the .org distance.  This should be done after
4863      xtensa_find_unmarked_state_frags, because we don't want to worry here
4864      about that function trashing the data we save here.  */
4865 
4866   for (seclist = &stdoutput->sections;
4867        seclist && *seclist;
4868        seclist = &(*seclist)->next)
4869     {
4870       segT sec = *seclist;
4871       segment_info_type *seginfo;
4872       fragS *fragP;
4873       flagword flags;
4874       flags = bfd_get_section_flags (stdoutput, sec);
4875       if (flags & SEC_DEBUGGING)
4876 	continue;
4877       if (!(flags & SEC_ALLOC))
4878 	continue;
4879 
4880       seginfo = seg_info (sec);
4881       if (seginfo && seginfo->frchainP)
4882 	{
4883 	  fragS *last_fragP = seginfo->frchainP->frch_root;
4884 	  for (fragP = seginfo->frchainP->frch_root; fragP;
4885 	       fragP = fragP->fr_next)
4886 	    {
4887 	      /* cvt_frag_to_fill has changed the fr_type of org frags to
4888 		 rs_fill, so use the value as cached in rs_subtype here.  */
4889 	      if (fragP->fr_subtype == RELAX_ORG)
4890 		{
4891 		  while (last_fragP != fragP->fr_next)
4892 		    {
4893 		      last_fragP->tc_frag_data.is_no_transform = TRUE;
4894 		      last_fragP = last_fragP->fr_next;
4895 		    }
4896 		}
4897 	    }
4898 	}
4899     }
4900 }
4901 
4902 
4903 static void
4904 xtensa_find_unmarked_state_frags (void)
4905 {
4906   segT *seclist;
4907 
4908   /* Walk over each fragment of all of the current segments.  For each
4909      unmarked fragment, mark it with the same info as the previous
4910      fragment.  */
4911   for (seclist = &stdoutput->sections;
4912        seclist && *seclist;
4913        seclist = &(*seclist)->next)
4914     {
4915       segT sec = *seclist;
4916       segment_info_type *seginfo;
4917       fragS *fragP;
4918       flagword flags;
4919       flags = bfd_get_section_flags (stdoutput, sec);
4920       if (flags & SEC_DEBUGGING)
4921 	continue;
4922       if (!(flags & SEC_ALLOC))
4923 	continue;
4924 
4925       seginfo = seg_info (sec);
4926       if (seginfo && seginfo->frchainP)
4927 	{
4928 	  fragS *last_fragP = 0;
4929 	  for (fragP = seginfo->frchainP->frch_root; fragP;
4930 	       fragP = fragP->fr_next)
4931 	    {
4932 	      if (fragP->fr_fix != 0
4933 		  && !fragP->tc_frag_data.is_assembly_state_set)
4934 		{
4935 		  if (last_fragP == 0)
4936 		    {
4937 		      as_warn_where (fragP->fr_file, fragP->fr_line,
4938 				     _("assembly state not set for first frag in section %s"),
4939 				     sec->name);
4940 		    }
4941 		  else
4942 		    {
4943 		      fragP->tc_frag_data.is_assembly_state_set = TRUE;
4944 		      fragP->tc_frag_data.is_no_density =
4945 			last_fragP->tc_frag_data.is_no_density;
4946 		      fragP->tc_frag_data.is_no_transform =
4947 			last_fragP->tc_frag_data.is_no_transform;
4948 		      fragP->tc_frag_data.use_longcalls =
4949 			last_fragP->tc_frag_data.use_longcalls;
4950 		      fragP->tc_frag_data.use_absolute_literals =
4951 			last_fragP->tc_frag_data.use_absolute_literals;
4952 		    }
4953 		}
4954 	      if (fragP->tc_frag_data.is_assembly_state_set)
4955 		last_fragP = fragP;
4956 	    }
4957 	}
4958     }
4959 }
4960 
4961 
4962 static void
4963 xtensa_find_unaligned_branch_targets (bfd *abfd ATTRIBUTE_UNUSED,
4964 				      asection *sec,
4965 				      void *unused ATTRIBUTE_UNUSED)
4966 {
4967   flagword flags = bfd_get_section_flags (abfd, sec);
4968   segment_info_type *seginfo = seg_info (sec);
4969   fragS *frag = seginfo->frchainP->frch_root;
4970 
4971   if (flags & SEC_CODE)
4972     {
4973       xtensa_isa isa = xtensa_default_isa;
4974       xtensa_insnbuf insnbuf = xtensa_insnbuf_alloc (isa);
4975       while (frag != NULL)
4976 	{
4977 	  if (frag->tc_frag_data.is_branch_target)
4978 	    {
4979 	      int op_size;
4980 	      addressT branch_align, frag_addr;
4981 	      xtensa_format fmt;
4982 
4983 	      xtensa_insnbuf_from_chars
4984 		(isa, insnbuf, (unsigned char *) frag->fr_literal, 0);
4985 	      fmt = xtensa_format_decode (isa, insnbuf);
4986 	      op_size = xtensa_format_length (isa, fmt);
4987 	      branch_align = 1 << branch_align_power (sec);
4988 	      frag_addr = frag->fr_address % branch_align;
4989 	      if (frag_addr + op_size > branch_align)
4990 		as_warn_where (frag->fr_file, frag->fr_line,
4991 			       _("unaligned branch target: %d bytes at 0x%lx"),
4992 			       op_size, (long) frag->fr_address);
4993 	    }
4994 	  frag = frag->fr_next;
4995 	}
4996       xtensa_insnbuf_free (isa, insnbuf);
4997     }
4998 }
4999 
5000 
5001 static void
5002 xtensa_find_unaligned_loops (bfd *abfd ATTRIBUTE_UNUSED,
5003 			     asection *sec,
5004 			     void *unused ATTRIBUTE_UNUSED)
5005 {
5006   flagword flags = bfd_get_section_flags (abfd, sec);
5007   segment_info_type *seginfo = seg_info (sec);
5008   fragS *frag = seginfo->frchainP->frch_root;
5009   xtensa_isa isa = xtensa_default_isa;
5010 
5011   if (flags & SEC_CODE)
5012     {
5013       xtensa_insnbuf insnbuf = xtensa_insnbuf_alloc (isa);
5014       while (frag != NULL)
5015 	{
5016 	  if (frag->tc_frag_data.is_first_loop_insn)
5017 	    {
5018 	      int op_size;
5019 	      addressT frag_addr;
5020 	      xtensa_format fmt;
5021 
5022 	      if (frag->fr_fix == 0)
5023 		frag = next_non_empty_frag (frag);
5024 
5025 	      if (frag)
5026 		{
5027 		  xtensa_insnbuf_from_chars
5028 		    (isa, insnbuf, (unsigned char *) frag->fr_literal, 0);
5029 		  fmt = xtensa_format_decode (isa, insnbuf);
5030 		  op_size = xtensa_format_length (isa, fmt);
5031 		  frag_addr = frag->fr_address % xtensa_fetch_width;
5032 
5033 		  if (frag_addr + op_size > xtensa_fetch_width)
5034 		    as_warn_where (frag->fr_file, frag->fr_line,
5035 				   _("unaligned loop: %d bytes at 0x%lx"),
5036 				   op_size, (long) frag->fr_address);
5037 		}
5038 	    }
5039 	  frag = frag->fr_next;
5040 	}
5041       xtensa_insnbuf_free (isa, insnbuf);
5042     }
5043 }
5044 
5045 
5046 static int
5047 xg_apply_fix_value (fixS *fixP, valueT val)
5048 {
5049   xtensa_isa isa = xtensa_default_isa;
5050   static xtensa_insnbuf insnbuf = NULL;
5051   static xtensa_insnbuf slotbuf = NULL;
5052   xtensa_format fmt;
5053   int slot;
5054   bfd_boolean alt_reloc;
5055   xtensa_opcode opcode;
5056   char *const fixpos = fixP->fx_frag->fr_literal + fixP->fx_where;
5057 
5058   if (decode_reloc (fixP->fx_r_type, &slot, &alt_reloc)
5059       || alt_reloc)
5060     as_fatal (_("unexpected fix"));
5061 
5062   if (!insnbuf)
5063     {
5064       insnbuf = xtensa_insnbuf_alloc (isa);
5065       slotbuf = xtensa_insnbuf_alloc (isa);
5066     }
5067 
5068   xtensa_insnbuf_from_chars (isa, insnbuf, (unsigned char *) fixpos, 0);
5069   fmt = xtensa_format_decode (isa, insnbuf);
5070   if (fmt == XTENSA_UNDEFINED)
5071     as_fatal (_("undecodable fix"));
5072   xtensa_format_get_slot (isa, fmt, slot, insnbuf, slotbuf);
5073   opcode = xtensa_opcode_decode (isa, fmt, slot, slotbuf);
5074   if (opcode == XTENSA_UNDEFINED)
5075     as_fatal (_("undecodable fix"));
5076 
5077   /* CONST16 immediates are not PC-relative, despite the fact that we
5078      reuse the normal PC-relative operand relocations for the low part
5079      of a CONST16 operand.  */
5080   if (opcode == xtensa_const16_opcode)
5081     return 0;
5082 
5083   xtensa_insnbuf_set_operand (slotbuf, fmt, slot, opcode,
5084 			      get_relaxable_immed (opcode), val,
5085 			      fixP->fx_file, fixP->fx_line);
5086 
5087   xtensa_format_set_slot (isa, fmt, slot, insnbuf, slotbuf);
5088   xtensa_insnbuf_to_chars (isa, insnbuf, (unsigned char *) fixpos, 0);
5089 
5090   return 1;
5091 }
5092 
5093 
5094 /* External Functions and Other GAS Hooks.  */
5095 
5096 const char *
5097 xtensa_target_format (void)
5098 {
5099   return (target_big_endian ? "elf32-xtensa-be" : "elf32-xtensa-le");
5100 }
5101 
5102 
5103 void
5104 xtensa_file_arch_init (bfd *abfd)
5105 {
5106   bfd_set_private_flags (abfd, 0x100 | 0x200);
5107 }
5108 
5109 
5110 void
5111 md_number_to_chars (char *buf, valueT val, int n)
5112 {
5113   if (target_big_endian)
5114     number_to_chars_bigendian (buf, val, n);
5115   else
5116     number_to_chars_littleendian (buf, val, n);
5117 }
5118 
5119 
5120 /* This function is called once, at assembler startup time.  It should
5121    set up all the tables, etc. that the MD part of the assembler will
5122    need.  */
5123 
5124 void
5125 md_begin (void)
5126 {
5127   segT current_section = now_seg;
5128   int current_subsec = now_subseg;
5129   xtensa_isa isa;
5130   int i;
5131 
5132   xtensa_default_isa = xtensa_isa_init (0, 0);
5133   isa = xtensa_default_isa;
5134 
5135   linkrelax = 1;
5136 
5137   /* Set up the literal sections.  */
5138   memset (&default_lit_sections, 0, sizeof (default_lit_sections));
5139 
5140   subseg_set (current_section, current_subsec);
5141 
5142   xtensa_addi_opcode = xtensa_opcode_lookup (isa, "addi");
5143   xtensa_addmi_opcode = xtensa_opcode_lookup (isa, "addmi");
5144   xtensa_call0_opcode = xtensa_opcode_lookup (isa, "call0");
5145   xtensa_call4_opcode = xtensa_opcode_lookup (isa, "call4");
5146   xtensa_call8_opcode = xtensa_opcode_lookup (isa, "call8");
5147   xtensa_call12_opcode = xtensa_opcode_lookup (isa, "call12");
5148   xtensa_callx0_opcode = xtensa_opcode_lookup (isa, "callx0");
5149   xtensa_callx4_opcode = xtensa_opcode_lookup (isa, "callx4");
5150   xtensa_callx8_opcode = xtensa_opcode_lookup (isa, "callx8");
5151   xtensa_callx12_opcode = xtensa_opcode_lookup (isa, "callx12");
5152   xtensa_const16_opcode = xtensa_opcode_lookup (isa, "const16");
5153   xtensa_entry_opcode = xtensa_opcode_lookup (isa, "entry");
5154   xtensa_extui_opcode = xtensa_opcode_lookup (isa, "extui");
5155   xtensa_movi_opcode = xtensa_opcode_lookup (isa, "movi");
5156   xtensa_movi_n_opcode = xtensa_opcode_lookup (isa, "movi.n");
5157   xtensa_isync_opcode = xtensa_opcode_lookup (isa, "isync");
5158   xtensa_j_opcode = xtensa_opcode_lookup (isa, "j");
5159   xtensa_jx_opcode = xtensa_opcode_lookup (isa, "jx");
5160   xtensa_l32r_opcode = xtensa_opcode_lookup (isa, "l32r");
5161   xtensa_loop_opcode = xtensa_opcode_lookup (isa, "loop");
5162   xtensa_loopnez_opcode = xtensa_opcode_lookup (isa, "loopnez");
5163   xtensa_loopgtz_opcode = xtensa_opcode_lookup (isa, "loopgtz");
5164   xtensa_nop_opcode = xtensa_opcode_lookup (isa, "nop");
5165   xtensa_nop_n_opcode = xtensa_opcode_lookup (isa, "nop.n");
5166   xtensa_or_opcode = xtensa_opcode_lookup (isa, "or");
5167   xtensa_ret_opcode = xtensa_opcode_lookup (isa, "ret");
5168   xtensa_ret_n_opcode = xtensa_opcode_lookup (isa, "ret.n");
5169   xtensa_retw_opcode = xtensa_opcode_lookup (isa, "retw");
5170   xtensa_retw_n_opcode = xtensa_opcode_lookup (isa, "retw.n");
5171   xtensa_rsr_lcount_opcode = xtensa_opcode_lookup (isa, "rsr.lcount");
5172   xtensa_waiti_opcode = xtensa_opcode_lookup (isa, "waiti");
5173 
5174   for (i = 0; i < xtensa_isa_num_formats (isa); i++)
5175     {
5176       int format_slots = xtensa_format_num_slots (isa, i);
5177       if (format_slots > config_max_slots)
5178 	config_max_slots = format_slots;
5179     }
5180 
5181   xg_init_vinsn (&cur_vinsn);
5182 
5183   xtensa_num_pipe_stages = xtensa_isa_num_pipe_stages (isa);
5184 
5185   init_op_placement_info_table ();
5186 
5187   /* Set up the assembly state.  */
5188   if (!frag_now->tc_frag_data.is_assembly_state_set)
5189     xtensa_set_frag_assembly_state (frag_now);
5190 }
5191 
5192 
5193 /* TC_INIT_FIX_DATA hook */
5194 
5195 void
5196 xtensa_init_fix_data (fixS *x)
5197 {
5198   x->tc_fix_data.slot = 0;
5199   x->tc_fix_data.X_add_symbol = NULL;
5200   x->tc_fix_data.X_add_number = 0;
5201 }
5202 
5203 
5204 /* tc_frob_label hook */
5205 
5206 void
5207 xtensa_frob_label (symbolS *sym)
5208 {
5209   float freq;
5210 
5211   if (cur_vinsn.inside_bundle)
5212     {
5213       as_bad (_("labels are not valid inside bundles"));
5214       return;
5215     }
5216 
5217   freq = get_subseg_target_freq (now_seg, now_subseg);
5218 
5219   /* Since the label was already attached to a frag associated with the
5220      previous basic block, it now needs to be reset to the current frag.  */
5221   symbol_set_frag (sym, frag_now);
5222   S_SET_VALUE (sym, (valueT) frag_now_fix ());
5223 
5224   if (generating_literals)
5225     xtensa_add_literal_sym (sym);
5226   else
5227     xtensa_add_insn_label (sym);
5228 
5229   if (symbol_get_tc (sym)->is_loop_target)
5230     {
5231       if ((get_last_insn_flags (now_seg, now_subseg)
5232 	  & FLAG_IS_BAD_LOOPEND) != 0)
5233 	as_bad (_("invalid last instruction for a zero-overhead loop"));
5234 
5235       xtensa_set_frag_assembly_state (frag_now);
5236       frag_var (rs_machine_dependent, 4, 4, RELAX_LOOP_END,
5237 		frag_now->fr_symbol, frag_now->fr_offset, NULL);
5238 
5239       xtensa_set_frag_assembly_state (frag_now);
5240       xtensa_move_labels (frag_now, 0);
5241     }
5242 
5243   /* No target aligning in the absolute section.  */
5244   if (now_seg != absolute_section
5245       && !is_unaligned_label (sym)
5246       && !generating_literals)
5247     {
5248       xtensa_set_frag_assembly_state (frag_now);
5249 
5250       if (do_align_targets ())
5251 	frag_var (rs_machine_dependent, 0, (int) freq,
5252 		  RELAX_DESIRE_ALIGN_IF_TARGET, frag_now->fr_symbol,
5253 		  frag_now->fr_offset, NULL);
5254       else
5255 	frag_var (rs_fill, 0, 0, frag_now->fr_subtype,
5256 		  frag_now->fr_symbol, frag_now->fr_offset, NULL);
5257       xtensa_set_frag_assembly_state (frag_now);
5258       xtensa_move_labels (frag_now, 0);
5259     }
5260 
5261   /* We need to mark the following properties even if we aren't aligning.  */
5262 
5263   /* If the label is already known to be a branch target, i.e., a
5264      forward branch, mark the frag accordingly.  Backward branches
5265      are handled by xg_add_branch_and_loop_targets.  */
5266   if (symbol_get_tc (sym)->is_branch_target)
5267     symbol_get_frag (sym)->tc_frag_data.is_branch_target = TRUE;
5268 
5269   /* Loops only go forward, so they can be identified here.  */
5270   if (symbol_get_tc (sym)->is_loop_target)
5271     symbol_get_frag (sym)->tc_frag_data.is_loop_target = TRUE;
5272 
5273   dwarf2_emit_label (sym);
5274 }
5275 
5276 
5277 /* tc_unrecognized_line hook */
5278 
5279 int
5280 xtensa_unrecognized_line (int ch)
5281 {
5282   switch (ch)
5283     {
5284     case '{' :
5285       if (cur_vinsn.inside_bundle == 0)
5286 	{
5287 	  /* PR8110: Cannot emit line number info inside a FLIX bundle
5288 	     when using --gstabs.  Temporarily disable debug info.  */
5289 	  generate_lineno_debug ();
5290 	  if (debug_type == DEBUG_STABS)
5291 	    {
5292 	      xt_saved_debug_type = debug_type;
5293 	      debug_type = DEBUG_NONE;
5294 	    }
5295 
5296 	  cur_vinsn.inside_bundle = 1;
5297 	}
5298       else
5299 	{
5300 	  as_bad (_("extra opening brace"));
5301 	  return 0;
5302 	}
5303       break;
5304 
5305     case '}' :
5306       if (cur_vinsn.inside_bundle)
5307 	finish_vinsn (&cur_vinsn);
5308       else
5309 	{
5310 	  as_bad (_("extra closing brace"));
5311 	  return 0;
5312 	}
5313       break;
5314     default:
5315       as_bad (_("syntax error"));
5316       return 0;
5317     }
5318   return 1;
5319 }
5320 
5321 
5322 /* md_flush_pending_output hook */
5323 
5324 void
5325 xtensa_flush_pending_output (void)
5326 {
5327   /* This line fixes a bug where automatically generated gstabs info
5328      separates a function label from its entry instruction, ending up
5329      with the literal position between the function label and the entry
5330      instruction and crashing code.  It only happens with --gstabs and
5331      --text-section-literals, and when several other obscure relaxation
5332      conditions are met.  */
5333   if (outputting_stabs_line_debug)
5334     return;
5335 
5336   if (cur_vinsn.inside_bundle)
5337     as_bad (_("missing closing brace"));
5338 
5339   /* If there is a non-zero instruction fragment, close it.  */
5340   if (frag_now_fix () != 0 && frag_now->tc_frag_data.is_insn)
5341     {
5342       frag_wane (frag_now);
5343       frag_new (0);
5344       xtensa_set_frag_assembly_state (frag_now);
5345     }
5346   frag_now->tc_frag_data.is_insn = FALSE;
5347 
5348   xtensa_clear_insn_labels ();
5349 }
5350 
5351 
5352 /* We had an error while parsing an instruction.  The string might look
5353    like this: "insn arg1, arg2 }".  If so, we need to see the closing
5354    brace and reset some fields.  Otherwise, the vinsn never gets closed
5355    and the num_slots field will grow past the end of the array of slots,
5356    and bad things happen.  */
5357 
5358 static void
5359 error_reset_cur_vinsn (void)
5360 {
5361   if (cur_vinsn.inside_bundle)
5362     {
5363       if (*input_line_pointer == '}'
5364 	  || *(input_line_pointer - 1) == '}'
5365 	  || *(input_line_pointer - 2) == '}')
5366 	xg_clear_vinsn (&cur_vinsn);
5367     }
5368 }
5369 
5370 
5371 void
5372 md_assemble (char *str)
5373 {
5374   xtensa_isa isa = xtensa_default_isa;
5375   char *opname;
5376   unsigned opnamelen;
5377   bfd_boolean has_underbar = FALSE;
5378   char *arg_strings[MAX_INSN_ARGS];
5379   int num_args;
5380   TInsn orig_insn;		/* Original instruction from the input.  */
5381 
5382   tinsn_init (&orig_insn);
5383 
5384   /* Split off the opcode.  */
5385   opnamelen = strspn (str, "abcdefghijklmnopqrstuvwxyz_/0123456789.");
5386   opname = xmalloc (opnamelen + 1);
5387   memcpy (opname, str, opnamelen);
5388   opname[opnamelen] = '\0';
5389 
5390   num_args = tokenize_arguments (arg_strings, str + opnamelen);
5391   if (num_args == -1)
5392     {
5393       as_bad (_("syntax error"));
5394       return;
5395     }
5396 
5397   if (xg_translate_idioms (&opname, &num_args, arg_strings))
5398     return;
5399 
5400   /* Check for an underbar prefix.  */
5401   if (*opname == '_')
5402     {
5403       has_underbar = TRUE;
5404       opname += 1;
5405     }
5406 
5407   orig_insn.insn_type = ITYPE_INSN;
5408   orig_insn.ntok = 0;
5409   orig_insn.is_specific_opcode = (has_underbar || !use_transform ());
5410   orig_insn.opcode = xtensa_opcode_lookup (isa, opname);
5411 
5412   /* Special case: Check for "CALLXn.TLS" psuedo op.  If found, grab its
5413      extra argument and set the opcode to "CALLXn".  */
5414   if (orig_insn.opcode == XTENSA_UNDEFINED
5415       && strncasecmp (opname, "callx", 5) == 0)
5416     {
5417       unsigned long window_size;
5418       char *suffix;
5419 
5420       window_size = strtoul (opname + 5, &suffix, 10);
5421       if (suffix != opname + 5
5422 	  && (window_size == 0
5423 	      || window_size == 4
5424 	      || window_size == 8
5425 	      || window_size == 12)
5426 	  && strcasecmp (suffix, ".tls") == 0)
5427 	{
5428 	  switch (window_size)
5429 	    {
5430 	    case 0: orig_insn.opcode = xtensa_callx0_opcode; break;
5431 	    case 4: orig_insn.opcode = xtensa_callx4_opcode; break;
5432 	    case 8: orig_insn.opcode = xtensa_callx8_opcode; break;
5433 	    case 12: orig_insn.opcode = xtensa_callx12_opcode; break;
5434 	    }
5435 
5436 	  if (num_args != 2)
5437 	    as_bad (_("wrong number of operands for '%s'"), opname);
5438 	  else
5439 	    {
5440 	      bfd_reloc_code_real_type reloc;
5441 	      char *old_input_line_pointer;
5442 	      expressionS *tok = &orig_insn.extra_arg;
5443 
5444 	      old_input_line_pointer = input_line_pointer;
5445 	      input_line_pointer = arg_strings[num_args - 1];
5446 
5447 	      expression (tok);
5448 	      if (tok->X_op == O_symbol
5449 		  && ((reloc = xtensa_elf_suffix (&input_line_pointer, tok))
5450 		      == BFD_RELOC_XTENSA_TLS_CALL))
5451 		tok->X_op = map_suffix_reloc_to_operator (reloc);
5452 	      else
5453 		as_bad (_("bad relocation expression for '%s'"), opname);
5454 
5455 	      input_line_pointer = old_input_line_pointer;
5456 	      num_args -= 1;
5457 	    }
5458 	}
5459     }
5460 
5461   /* Special case: Check for "j.l" psuedo op.  */
5462   if (orig_insn.opcode == XTENSA_UNDEFINED
5463       && strncasecmp (opname, "j.l", 3) == 0)
5464     {
5465       if (num_args != 2)
5466 	as_bad (_("wrong number of operands for '%s'"), opname);
5467       else
5468 	{
5469 	  char *old_input_line_pointer;
5470 	  expressionS *tok = &orig_insn.extra_arg;
5471 
5472 	  old_input_line_pointer = input_line_pointer;
5473 	  input_line_pointer = arg_strings[num_args - 1];
5474 
5475 	  expression_maybe_register (xtensa_jx_opcode, 0, tok);
5476 	  input_line_pointer = old_input_line_pointer;
5477 
5478 	  num_args -= 1;
5479 	  orig_insn.opcode = xtensa_j_opcode;
5480 	}
5481     }
5482 
5483   if (orig_insn.opcode == XTENSA_UNDEFINED)
5484     {
5485       xtensa_format fmt = xtensa_format_lookup (isa, opname);
5486       if (fmt == XTENSA_UNDEFINED)
5487 	{
5488 	  as_bad (_("unknown opcode or format name '%s'"), opname);
5489 	  error_reset_cur_vinsn ();
5490 	  return;
5491 	}
5492       if (!cur_vinsn.inside_bundle)
5493 	{
5494 	  as_bad (_("format names only valid inside bundles"));
5495 	  error_reset_cur_vinsn ();
5496 	  return;
5497 	}
5498       if (cur_vinsn.format != XTENSA_UNDEFINED)
5499 	as_warn (_("multiple formats specified for one bundle; using '%s'"),
5500 		 opname);
5501       cur_vinsn.format = fmt;
5502       free (has_underbar ? opname - 1 : opname);
5503       error_reset_cur_vinsn ();
5504       return;
5505     }
5506 
5507   /* Parse the arguments.  */
5508   if (parse_arguments (&orig_insn, num_args, arg_strings))
5509     {
5510       as_bad (_("syntax error"));
5511       error_reset_cur_vinsn ();
5512       return;
5513     }
5514 
5515   /* Free the opcode and argument strings, now that they've been parsed.  */
5516   free (has_underbar ? opname - 1 : opname);
5517   opname = 0;
5518   while (num_args-- > 0)
5519     free (arg_strings[num_args]);
5520 
5521   /* Get expressions for invisible operands.  */
5522   if (get_invisible_operands (&orig_insn))
5523     {
5524       error_reset_cur_vinsn ();
5525       return;
5526     }
5527 
5528   /* Check for the right number and type of arguments.  */
5529   if (tinsn_check_arguments (&orig_insn))
5530     {
5531       error_reset_cur_vinsn ();
5532       return;
5533     }
5534 
5535   /* Record the line number for each TInsn, because a FLIX bundle may be
5536      spread across multiple input lines and individual instructions may be
5537      moved around in some cases.  */
5538   orig_insn.loc_directive_seen = dwarf2_loc_directive_seen;
5539   dwarf2_where (&orig_insn.debug_line);
5540   dwarf2_consume_line_info ();
5541 
5542   xg_add_branch_and_loop_targets (&orig_insn);
5543 
5544   /* Check that immediate value for ENTRY is >= 16.  */
5545   if (orig_insn.opcode == xtensa_entry_opcode && orig_insn.ntok >= 3)
5546     {
5547       expressionS *exp = &orig_insn.tok[2];
5548       if (exp->X_op == O_constant && exp->X_add_number < 16)
5549 	as_warn (_("entry instruction with stack decrement < 16"));
5550     }
5551 
5552   /* Finish it off:
5553      assemble_tokens (opcode, tok, ntok);
5554      expand the tokens from the orig_insn into the
5555      stack of instructions that will not expand
5556      unless required at relaxation time.  */
5557 
5558   if (!cur_vinsn.inside_bundle)
5559     emit_single_op (&orig_insn);
5560   else /* We are inside a bundle.  */
5561     {
5562       cur_vinsn.slots[cur_vinsn.num_slots] = orig_insn;
5563       cur_vinsn.num_slots++;
5564       if (*input_line_pointer == '}'
5565 	  || *(input_line_pointer - 1) == '}'
5566 	  || *(input_line_pointer - 2) == '}')
5567 	finish_vinsn (&cur_vinsn);
5568     }
5569 
5570   /* We've just emitted a new instruction so clear the list of labels.  */
5571   xtensa_clear_insn_labels ();
5572 }
5573 
5574 
5575 /* HANDLE_ALIGN hook */
5576 
5577 /* For a .align directive, we mark the previous block with the alignment
5578    information.  This will be placed in the object file in the
5579    property section corresponding to this section.  */
5580 
5581 void
5582 xtensa_handle_align (fragS *fragP)
5583 {
5584   if (linkrelax
5585       && ! fragP->tc_frag_data.is_literal
5586       && (fragP->fr_type == rs_align
5587 	  || fragP->fr_type == rs_align_code)
5588       && fragP->fr_address + fragP->fr_fix > 0
5589       && fragP->fr_offset > 0
5590       && now_seg != bss_section)
5591     {
5592       fragP->tc_frag_data.is_align = TRUE;
5593       fragP->tc_frag_data.alignment = fragP->fr_offset;
5594     }
5595 
5596   if (fragP->fr_type == rs_align_test)
5597     {
5598       int count;
5599       count = fragP->fr_next->fr_address - fragP->fr_address - fragP->fr_fix;
5600       if (count != 0)
5601 	as_bad_where (fragP->fr_file, fragP->fr_line,
5602 		      _("unaligned entry instruction"));
5603     }
5604 
5605   if (linkrelax && fragP->fr_type == rs_org)
5606     fragP->fr_subtype = RELAX_ORG;
5607 }
5608 
5609 
5610 /* TC_FRAG_INIT hook */
5611 
5612 void
5613 xtensa_frag_init (fragS *frag)
5614 {
5615   xtensa_set_frag_assembly_state (frag);
5616 }
5617 
5618 
5619 symbolS *
5620 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
5621 {
5622   return NULL;
5623 }
5624 
5625 
5626 /* Round up a section size to the appropriate boundary.  */
5627 
5628 valueT
5629 md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
5630 {
5631   return size;			/* Byte alignment is fine.  */
5632 }
5633 
5634 
5635 long
5636 md_pcrel_from (fixS *fixP)
5637 {
5638   char *insn_p;
5639   static xtensa_insnbuf insnbuf = NULL;
5640   static xtensa_insnbuf slotbuf = NULL;
5641   int opnum;
5642   uint32 opnd_value;
5643   xtensa_opcode opcode;
5644   xtensa_format fmt;
5645   int slot;
5646   xtensa_isa isa = xtensa_default_isa;
5647   valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
5648   bfd_boolean alt_reloc;
5649 
5650   if (fixP->fx_r_type == BFD_RELOC_XTENSA_ASM_EXPAND)
5651     return 0;
5652 
5653   if (fixP->fx_r_type == BFD_RELOC_32_PCREL)
5654     return addr;
5655 
5656   if (!insnbuf)
5657     {
5658       insnbuf = xtensa_insnbuf_alloc (isa);
5659       slotbuf = xtensa_insnbuf_alloc (isa);
5660     }
5661 
5662   insn_p = &fixP->fx_frag->fr_literal[fixP->fx_where];
5663   xtensa_insnbuf_from_chars (isa, insnbuf, (unsigned char *) insn_p, 0);
5664   fmt = xtensa_format_decode (isa, insnbuf);
5665 
5666   if (fmt == XTENSA_UNDEFINED)
5667     as_fatal (_("bad instruction format"));
5668 
5669   if (decode_reloc (fixP->fx_r_type, &slot, &alt_reloc) != 0)
5670     as_fatal (_("invalid relocation"));
5671 
5672   xtensa_format_get_slot (isa, fmt, slot, insnbuf, slotbuf);
5673   opcode = xtensa_opcode_decode (isa, fmt, slot, slotbuf);
5674 
5675   /* Check for "alternate" relocations (operand not specified).  None
5676      of the current uses for these are really PC-relative.  */
5677   if (alt_reloc || opcode == xtensa_const16_opcode)
5678     {
5679       if (opcode != xtensa_l32r_opcode
5680 	  && opcode != xtensa_const16_opcode)
5681 	as_fatal (_("invalid relocation for '%s' instruction"),
5682 		  xtensa_opcode_name (isa, opcode));
5683       return 0;
5684     }
5685 
5686   opnum = get_relaxable_immed (opcode);
5687   opnd_value = 0;
5688   if (xtensa_operand_is_PCrelative (isa, opcode, opnum) != 1
5689       || xtensa_operand_do_reloc (isa, opcode, opnum, &opnd_value, addr))
5690     {
5691       as_bad_where (fixP->fx_file,
5692 		    fixP->fx_line,
5693 		    _("invalid relocation for operand %d of '%s'"),
5694 		    opnum, xtensa_opcode_name (isa, opcode));
5695       return 0;
5696     }
5697   return 0 - opnd_value;
5698 }
5699 
5700 
5701 /* TC_FORCE_RELOCATION hook */
5702 
5703 int
5704 xtensa_force_relocation (fixS *fix)
5705 {
5706   switch (fix->fx_r_type)
5707     {
5708     case BFD_RELOC_XTENSA_ASM_EXPAND:
5709     case BFD_RELOC_XTENSA_SLOT0_ALT:
5710     case BFD_RELOC_XTENSA_SLOT1_ALT:
5711     case BFD_RELOC_XTENSA_SLOT2_ALT:
5712     case BFD_RELOC_XTENSA_SLOT3_ALT:
5713     case BFD_RELOC_XTENSA_SLOT4_ALT:
5714     case BFD_RELOC_XTENSA_SLOT5_ALT:
5715     case BFD_RELOC_XTENSA_SLOT6_ALT:
5716     case BFD_RELOC_XTENSA_SLOT7_ALT:
5717     case BFD_RELOC_XTENSA_SLOT8_ALT:
5718     case BFD_RELOC_XTENSA_SLOT9_ALT:
5719     case BFD_RELOC_XTENSA_SLOT10_ALT:
5720     case BFD_RELOC_XTENSA_SLOT11_ALT:
5721     case BFD_RELOC_XTENSA_SLOT12_ALT:
5722     case BFD_RELOC_XTENSA_SLOT13_ALT:
5723     case BFD_RELOC_XTENSA_SLOT14_ALT:
5724       return 1;
5725     default:
5726       break;
5727     }
5728 
5729   if (linkrelax && fix->fx_addsy
5730       && relaxable_section (S_GET_SEGMENT (fix->fx_addsy)))
5731     return 1;
5732 
5733   return generic_force_reloc (fix);
5734 }
5735 
5736 
5737 /* TC_VALIDATE_FIX_SUB hook */
5738 
5739 int
5740 xtensa_validate_fix_sub (fixS *fix)
5741 {
5742   segT add_symbol_segment, sub_symbol_segment;
5743 
5744   /* The difference of two symbols should be resolved by the assembler when
5745      linkrelax is not set.  If the linker may relax the section containing
5746      the symbols, then an Xtensa DIFF relocation must be generated so that
5747      the linker knows to adjust the difference value.  */
5748   if (!linkrelax || fix->fx_addsy == NULL)
5749     return 0;
5750 
5751   /* Make sure both symbols are in the same segment, and that segment is
5752      "normal" and relaxable.  If the segment is not "normal", then the
5753      fix is not valid.  If the segment is not "relaxable", then the fix
5754      should have been handled earlier.  */
5755   add_symbol_segment = S_GET_SEGMENT (fix->fx_addsy);
5756   if (! SEG_NORMAL (add_symbol_segment) ||
5757       ! relaxable_section (add_symbol_segment))
5758     return 0;
5759   sub_symbol_segment = S_GET_SEGMENT (fix->fx_subsy);
5760   return (sub_symbol_segment == add_symbol_segment);
5761 }
5762 
5763 
5764 /* NO_PSEUDO_DOT hook */
5765 
5766 /* This function has nothing to do with pseudo dots, but this is the
5767    nearest macro to where the check needs to take place.  FIXME: This
5768    seems wrong.  */
5769 
5770 bfd_boolean
5771 xtensa_check_inside_bundle (void)
5772 {
5773   if (cur_vinsn.inside_bundle && input_line_pointer[-1] == '.')
5774     as_bad (_("directives are not valid inside bundles"));
5775 
5776   /* This function must always return FALSE because it is called via a
5777      macro that has nothing to do with bundling.  */
5778   return FALSE;
5779 }
5780 
5781 
5782 /* md_elf_section_change_hook */
5783 
5784 void
5785 xtensa_elf_section_change_hook (void)
5786 {
5787   /* Set up the assembly state.  */
5788   if (!frag_now->tc_frag_data.is_assembly_state_set)
5789     xtensa_set_frag_assembly_state (frag_now);
5790 }
5791 
5792 
5793 /* tc_fix_adjustable hook */
5794 
5795 bfd_boolean
5796 xtensa_fix_adjustable (fixS *fixP)
5797 {
5798   /* We need the symbol name for the VTABLE entries.  */
5799   if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
5800       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
5801     return 0;
5802 
5803   return 1;
5804 }
5805 
5806 
5807 /* tc_symbol_new_hook */
5808 
5809 symbolS *expr_symbols = NULL;
5810 
5811 void
5812 xtensa_symbol_new_hook (symbolS *sym)
5813 {
5814   if (is_leb128_expr && S_GET_SEGMENT (sym) == expr_section)
5815     {
5816       symbol_get_tc (sym)->next_expr_symbol = expr_symbols;
5817       expr_symbols = sym;
5818     }
5819 }
5820 
5821 
5822 void
5823 md_apply_fix (fixS *fixP, valueT *valP, segT seg)
5824 {
5825   char *const fixpos = fixP->fx_frag->fr_literal + fixP->fx_where;
5826   valueT val = 0;
5827 
5828   /* Subtracted symbols are only allowed for a few relocation types, and
5829      unless linkrelax is enabled, they should not make it to this point.  */
5830   if (fixP->fx_subsy && !(linkrelax && (fixP->fx_r_type == BFD_RELOC_32
5831 					|| fixP->fx_r_type == BFD_RELOC_16
5832 					|| fixP->fx_r_type == BFD_RELOC_8)))
5833     as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
5834 
5835   switch (fixP->fx_r_type)
5836     {
5837     case BFD_RELOC_32_PCREL:
5838     case BFD_RELOC_32:
5839     case BFD_RELOC_16:
5840     case BFD_RELOC_8:
5841       if (fixP->fx_subsy)
5842 	{
5843 	  switch (fixP->fx_r_type)
5844 	    {
5845 	    case BFD_RELOC_8:
5846 	      fixP->fx_r_type = BFD_RELOC_XTENSA_DIFF8;
5847 	      break;
5848 	    case BFD_RELOC_16:
5849 	      fixP->fx_r_type = BFD_RELOC_XTENSA_DIFF16;
5850 	      break;
5851 	    case BFD_RELOC_32:
5852 	      fixP->fx_r_type = BFD_RELOC_XTENSA_DIFF32;
5853 	      break;
5854 	    default:
5855 	      break;
5856 	    }
5857 
5858 	  val = (S_GET_VALUE (fixP->fx_addsy) + fixP->fx_offset
5859 		 - S_GET_VALUE (fixP->fx_subsy));
5860 
5861 	  /* The difference value gets written out, and the DIFF reloc
5862 	     identifies the address of the subtracted symbol (i.e., the one
5863 	     with the lowest address).  */
5864 	  *valP = val;
5865 	  fixP->fx_offset -= val;
5866 	  fixP->fx_subsy = NULL;
5867 	}
5868       else if (! fixP->fx_addsy)
5869 	{
5870 	  val = *valP;
5871 	  fixP->fx_done = 1;
5872 	}
5873       /* fall through */
5874 
5875     case BFD_RELOC_XTENSA_PLT:
5876       md_number_to_chars (fixpos, val, fixP->fx_size);
5877       fixP->fx_no_overflow = 0; /* Use the standard overflow check.  */
5878       break;
5879 
5880     case BFD_RELOC_XTENSA_TLSDESC_FN:
5881     case BFD_RELOC_XTENSA_TLSDESC_ARG:
5882     case BFD_RELOC_XTENSA_TLS_TPOFF:
5883     case BFD_RELOC_XTENSA_TLS_DTPOFF:
5884       S_SET_THREAD_LOCAL (fixP->fx_addsy);
5885       md_number_to_chars (fixpos, 0, fixP->fx_size);
5886       fixP->fx_no_overflow = 0; /* Use the standard overflow check.  */
5887       break;
5888 
5889     case BFD_RELOC_XTENSA_SLOT0_OP:
5890     case BFD_RELOC_XTENSA_SLOT1_OP:
5891     case BFD_RELOC_XTENSA_SLOT2_OP:
5892     case BFD_RELOC_XTENSA_SLOT3_OP:
5893     case BFD_RELOC_XTENSA_SLOT4_OP:
5894     case BFD_RELOC_XTENSA_SLOT5_OP:
5895     case BFD_RELOC_XTENSA_SLOT6_OP:
5896     case BFD_RELOC_XTENSA_SLOT7_OP:
5897     case BFD_RELOC_XTENSA_SLOT8_OP:
5898     case BFD_RELOC_XTENSA_SLOT9_OP:
5899     case BFD_RELOC_XTENSA_SLOT10_OP:
5900     case BFD_RELOC_XTENSA_SLOT11_OP:
5901     case BFD_RELOC_XTENSA_SLOT12_OP:
5902     case BFD_RELOC_XTENSA_SLOT13_OP:
5903     case BFD_RELOC_XTENSA_SLOT14_OP:
5904       if (linkrelax)
5905 	{
5906 	  /* Write the tentative value of a PC-relative relocation to a
5907 	     local symbol into the instruction.  The value will be ignored
5908 	     by the linker, and it makes the object file disassembly
5909 	     readable when all branch targets are encoded in relocations.  */
5910 
5911 	  gas_assert (fixP->fx_addsy);
5912 	  if (S_GET_SEGMENT (fixP->fx_addsy) == seg
5913 	      && !S_FORCE_RELOC (fixP->fx_addsy, 1))
5914 	    {
5915 	      val = (S_GET_VALUE (fixP->fx_addsy) + fixP->fx_offset
5916 		     - md_pcrel_from (fixP));
5917 	      (void) xg_apply_fix_value (fixP, val);
5918 	    }
5919 	}
5920       else if (! fixP->fx_addsy)
5921 	{
5922 	  val = *valP;
5923 	  if (xg_apply_fix_value (fixP, val))
5924 	    fixP->fx_done = 1;
5925 	}
5926       break;
5927 
5928     case BFD_RELOC_XTENSA_ASM_EXPAND:
5929     case BFD_RELOC_XTENSA_TLS_FUNC:
5930     case BFD_RELOC_XTENSA_TLS_ARG:
5931     case BFD_RELOC_XTENSA_TLS_CALL:
5932     case BFD_RELOC_XTENSA_SLOT0_ALT:
5933     case BFD_RELOC_XTENSA_SLOT1_ALT:
5934     case BFD_RELOC_XTENSA_SLOT2_ALT:
5935     case BFD_RELOC_XTENSA_SLOT3_ALT:
5936     case BFD_RELOC_XTENSA_SLOT4_ALT:
5937     case BFD_RELOC_XTENSA_SLOT5_ALT:
5938     case BFD_RELOC_XTENSA_SLOT6_ALT:
5939     case BFD_RELOC_XTENSA_SLOT7_ALT:
5940     case BFD_RELOC_XTENSA_SLOT8_ALT:
5941     case BFD_RELOC_XTENSA_SLOT9_ALT:
5942     case BFD_RELOC_XTENSA_SLOT10_ALT:
5943     case BFD_RELOC_XTENSA_SLOT11_ALT:
5944     case BFD_RELOC_XTENSA_SLOT12_ALT:
5945     case BFD_RELOC_XTENSA_SLOT13_ALT:
5946     case BFD_RELOC_XTENSA_SLOT14_ALT:
5947       /* These all need to be resolved at link-time.  Do nothing now.  */
5948       break;
5949 
5950     case BFD_RELOC_VTABLE_INHERIT:
5951     case BFD_RELOC_VTABLE_ENTRY:
5952       fixP->fx_done = 0;
5953       break;
5954 
5955     default:
5956       as_bad (_("unhandled local relocation fix %s"),
5957 	      bfd_get_reloc_code_name (fixP->fx_r_type));
5958     }
5959 }
5960 
5961 
5962 char *
5963 md_atof (int type, char *litP, int *sizeP)
5964 {
5965   return ieee_md_atof (type, litP, sizeP, target_big_endian);
5966 }
5967 
5968 
5969 int
5970 md_estimate_size_before_relax (fragS *fragP, segT seg ATTRIBUTE_UNUSED)
5971 {
5972   return total_frag_text_expansion (fragP);
5973 }
5974 
5975 
5976 /* Translate internal representation of relocation info to BFD target
5977    format.  */
5978 
5979 arelent *
5980 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
5981 {
5982   arelent *reloc;
5983 
5984   reloc = (arelent *) xmalloc (sizeof (arelent));
5985   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
5986   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
5987   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
5988 
5989   /* Make sure none of our internal relocations make it this far.
5990      They'd better have been fully resolved by this point.  */
5991   gas_assert ((int) fixp->fx_r_type > 0);
5992 
5993   reloc->addend = fixp->fx_offset;
5994 
5995   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
5996   if (reloc->howto == NULL)
5997     {
5998       as_bad_where (fixp->fx_file, fixp->fx_line,
5999 		    _("cannot represent `%s' relocation in object file"),
6000 		    bfd_get_reloc_code_name (fixp->fx_r_type));
6001       free (reloc->sym_ptr_ptr);
6002       free (reloc);
6003       return NULL;
6004     }
6005 
6006   if (!fixp->fx_pcrel != !reloc->howto->pc_relative)
6007     as_fatal (_("internal error; cannot generate `%s' relocation"),
6008 	      bfd_get_reloc_code_name (fixp->fx_r_type));
6009 
6010   return reloc;
6011 }
6012 
6013 
6014 /* Checks for resource conflicts between instructions.  */
6015 
6016 /* The func unit stuff could be implemented as bit-vectors rather
6017    than the iterative approach here.  If it ends up being too
6018    slow, we will switch it.  */
6019 
6020 resource_table *
6021 new_resource_table (void *data,
6022 		    int cycles,
6023 		    int nu,
6024 		    unit_num_copies_func uncf,
6025 		    opcode_num_units_func onuf,
6026 		    opcode_funcUnit_use_unit_func ouuf,
6027 		    opcode_funcUnit_use_stage_func ousf)
6028 {
6029   int i;
6030   resource_table *rt = (resource_table *) xmalloc (sizeof (resource_table));
6031   rt->data = data;
6032   rt->cycles = cycles;
6033   rt->allocated_cycles = cycles;
6034   rt->num_units = nu;
6035   rt->unit_num_copies = uncf;
6036   rt->opcode_num_units = onuf;
6037   rt->opcode_unit_use = ouuf;
6038   rt->opcode_unit_stage = ousf;
6039 
6040   rt->units = (unsigned char **) xcalloc (cycles, sizeof (unsigned char *));
6041   for (i = 0; i < cycles; i++)
6042     rt->units[i] = (unsigned char *) xcalloc (nu, sizeof (unsigned char));
6043 
6044   return rt;
6045 }
6046 
6047 
6048 void
6049 clear_resource_table (resource_table *rt)
6050 {
6051   int i, j;
6052   for (i = 0; i < rt->allocated_cycles; i++)
6053     for (j = 0; j < rt->num_units; j++)
6054       rt->units[i][j] = 0;
6055 }
6056 
6057 
6058 /* We never shrink it, just fake it into thinking so.  */
6059 
6060 void
6061 resize_resource_table (resource_table *rt, int cycles)
6062 {
6063   int i, old_cycles;
6064 
6065   rt->cycles = cycles;
6066   if (cycles <= rt->allocated_cycles)
6067     return;
6068 
6069   old_cycles = rt->allocated_cycles;
6070   rt->allocated_cycles = cycles;
6071 
6072   rt->units = xrealloc (rt->units,
6073 			rt->allocated_cycles * sizeof (unsigned char *));
6074   for (i = 0; i < old_cycles; i++)
6075     rt->units[i] = xrealloc (rt->units[i],
6076 			     rt->num_units * sizeof (unsigned char));
6077   for (i = old_cycles; i < cycles; i++)
6078     rt->units[i] = xcalloc (rt->num_units, sizeof (unsigned char));
6079 }
6080 
6081 
6082 bfd_boolean
6083 resources_available (resource_table *rt, xtensa_opcode opcode, int cycle)
6084 {
6085   int i;
6086   int uses = (rt->opcode_num_units) (rt->data, opcode);
6087 
6088   for (i = 0; i < uses; i++)
6089     {
6090       xtensa_funcUnit unit = (rt->opcode_unit_use) (rt->data, opcode, i);
6091       int stage = (rt->opcode_unit_stage) (rt->data, opcode, i);
6092       int copies_in_use = rt->units[stage + cycle][unit];
6093       int copies = (rt->unit_num_copies) (rt->data, unit);
6094       if (copies_in_use >= copies)
6095 	return FALSE;
6096     }
6097   return TRUE;
6098 }
6099 
6100 
6101 void
6102 reserve_resources (resource_table *rt, xtensa_opcode opcode, int cycle)
6103 {
6104   int i;
6105   int uses = (rt->opcode_num_units) (rt->data, opcode);
6106 
6107   for (i = 0; i < uses; i++)
6108     {
6109       xtensa_funcUnit unit = (rt->opcode_unit_use) (rt->data, opcode, i);
6110       int stage = (rt->opcode_unit_stage) (rt->data, opcode, i);
6111       /* Note that this allows resources to be oversubscribed.  That's
6112 	 essential to the way the optional scheduler works.
6113 	 resources_available reports when a resource is over-subscribed,
6114 	 so it's easy to tell.  */
6115       rt->units[stage + cycle][unit]++;
6116     }
6117 }
6118 
6119 
6120 void
6121 release_resources (resource_table *rt, xtensa_opcode opcode, int cycle)
6122 {
6123   int i;
6124   int uses = (rt->opcode_num_units) (rt->data, opcode);
6125 
6126   for (i = 0; i < uses; i++)
6127     {
6128       xtensa_funcUnit unit = (rt->opcode_unit_use) (rt->data, opcode, i);
6129       int stage = (rt->opcode_unit_stage) (rt->data, opcode, i);
6130       gas_assert (rt->units[stage + cycle][unit] > 0);
6131       rt->units[stage + cycle][unit]--;
6132     }
6133 }
6134 
6135 
6136 /* Wrapper functions make parameterized resource reservation
6137    more convenient.  */
6138 
6139 int
6140 opcode_funcUnit_use_unit (void *data, xtensa_opcode opcode, int idx)
6141 {
6142   xtensa_funcUnit_use *use = xtensa_opcode_funcUnit_use (data, opcode, idx);
6143   return use->unit;
6144 }
6145 
6146 
6147 int
6148 opcode_funcUnit_use_stage (void *data, xtensa_opcode opcode, int idx)
6149 {
6150   xtensa_funcUnit_use *use = xtensa_opcode_funcUnit_use (data, opcode, idx);
6151   return use->stage;
6152 }
6153 
6154 
6155 /* Note that this function does not check issue constraints, but
6156    solely whether the hardware is available to execute the given
6157    instructions together.  It also doesn't check if the tinsns
6158    write the same state, or access the same tieports.  That is
6159    checked by check_t1_t2_reads_and_writes.  */
6160 
6161 static bfd_boolean
6162 resources_conflict (vliw_insn *vinsn)
6163 {
6164   int i;
6165   static resource_table *rt = NULL;
6166 
6167   /* This is the most common case by far.  Optimize it.  */
6168   if (vinsn->num_slots == 1)
6169     return FALSE;
6170 
6171   if (rt == NULL)
6172     {
6173       xtensa_isa isa = xtensa_default_isa;
6174       rt = new_resource_table
6175 	(isa, xtensa_num_pipe_stages,
6176 	 xtensa_isa_num_funcUnits (isa),
6177 	 (unit_num_copies_func) xtensa_funcUnit_num_copies,
6178 	 (opcode_num_units_func) xtensa_opcode_num_funcUnit_uses,
6179 	 opcode_funcUnit_use_unit,
6180 	 opcode_funcUnit_use_stage);
6181     }
6182 
6183   clear_resource_table (rt);
6184 
6185   for (i = 0; i < vinsn->num_slots; i++)
6186     {
6187       if (!resources_available (rt, vinsn->slots[i].opcode, 0))
6188 	return TRUE;
6189       reserve_resources (rt, vinsn->slots[i].opcode, 0);
6190     }
6191 
6192   return FALSE;
6193 }
6194 
6195 
6196 /* finish_vinsn, emit_single_op and helper functions.  */
6197 
6198 static bfd_boolean find_vinsn_conflicts (vliw_insn *);
6199 static xtensa_format xg_find_narrowest_format (vliw_insn *);
6200 static void xg_assemble_vliw_tokens (vliw_insn *);
6201 
6202 
6203 /* We have reached the end of a bundle; emit into the frag.  */
6204 
6205 static void
6206 finish_vinsn (vliw_insn *vinsn)
6207 {
6208   IStack slotstack;
6209   int i;
6210   char *file_name;
6211   unsigned line;
6212 
6213   if (find_vinsn_conflicts (vinsn))
6214     {
6215       xg_clear_vinsn (vinsn);
6216       return;
6217     }
6218 
6219   /* First, find a format that works.  */
6220   if (vinsn->format == XTENSA_UNDEFINED)
6221     vinsn->format = xg_find_narrowest_format (vinsn);
6222 
6223   if (xtensa_format_num_slots (xtensa_default_isa, vinsn->format) > 1
6224       && produce_flix == FLIX_NONE)
6225     {
6226       as_bad (_("The option \"--no-allow-flix\" prohibits multi-slot flix."));
6227       xg_clear_vinsn (vinsn);
6228       return;
6229     }
6230 
6231   if (vinsn->format == XTENSA_UNDEFINED)
6232     {
6233       as_where (&file_name, &line);
6234       as_bad_where (file_name, line,
6235 		    _("couldn't find a valid instruction format"));
6236       fprintf (stderr, _("    ops were: "));
6237       for (i = 0; i < vinsn->num_slots; i++)
6238 	fprintf (stderr, _(" %s;"),
6239 		 xtensa_opcode_name (xtensa_default_isa,
6240 				     vinsn->slots[i].opcode));
6241       fprintf (stderr, _("\n"));
6242       xg_clear_vinsn (vinsn);
6243       return;
6244     }
6245 
6246   if (vinsn->num_slots
6247       != xtensa_format_num_slots (xtensa_default_isa, vinsn->format))
6248     {
6249       as_bad (_("format '%s' allows %d slots, but there are %d opcodes"),
6250 	      xtensa_format_name (xtensa_default_isa, vinsn->format),
6251 	      xtensa_format_num_slots (xtensa_default_isa, vinsn->format),
6252 	      vinsn->num_slots);
6253       xg_clear_vinsn (vinsn);
6254       return;
6255     }
6256 
6257   if (resources_conflict (vinsn))
6258     {
6259       as_where (&file_name, &line);
6260       as_bad_where (file_name, line, _("illegal resource usage in bundle"));
6261       fprintf (stderr, "    ops were: ");
6262       for (i = 0; i < vinsn->num_slots; i++)
6263 	fprintf (stderr, " %s;",
6264 		 xtensa_opcode_name (xtensa_default_isa,
6265 				     vinsn->slots[i].opcode));
6266       fprintf (stderr, "\n");
6267       xg_clear_vinsn (vinsn);
6268       return;
6269     }
6270 
6271   for (i = 0; i < vinsn->num_slots; i++)
6272     {
6273       if (vinsn->slots[i].opcode != XTENSA_UNDEFINED)
6274 	{
6275 	  symbolS *lit_sym = NULL;
6276 	  int j;
6277 	  bfd_boolean e = FALSE;
6278 	  bfd_boolean saved_density = density_supported;
6279 
6280 	  /* We don't want to narrow ops inside multi-slot bundles.  */
6281 	  if (vinsn->num_slots > 1)
6282 	    density_supported = FALSE;
6283 
6284 	  istack_init (&slotstack);
6285 	  if (vinsn->slots[i].opcode == xtensa_nop_opcode)
6286 	    {
6287 	      vinsn->slots[i].opcode =
6288 		xtensa_format_slot_nop_opcode (xtensa_default_isa,
6289 					       vinsn->format, i);
6290 	      vinsn->slots[i].ntok = 0;
6291 	    }
6292 
6293 	  if (xg_expand_assembly_insn (&slotstack, &vinsn->slots[i]))
6294 	    {
6295 	      e = TRUE;
6296 	      continue;
6297 	    }
6298 
6299 	  density_supported = saved_density;
6300 
6301 	  if (e)
6302 	    {
6303 	      xg_clear_vinsn (vinsn);
6304 	      return;
6305 	    }
6306 
6307 	  for (j = 0; j < slotstack.ninsn; j++)
6308 	    {
6309 	      TInsn *insn = &slotstack.insn[j];
6310 	      if (insn->insn_type == ITYPE_LITERAL)
6311 		{
6312 		  gas_assert (lit_sym == NULL);
6313 		  lit_sym = xg_assemble_literal (insn);
6314 		}
6315 	      else
6316 		{
6317 		  gas_assert (insn->insn_type == ITYPE_INSN);
6318 		  if (lit_sym)
6319 		    xg_resolve_literals (insn, lit_sym);
6320 		  if (j != slotstack.ninsn - 1)
6321 		    emit_single_op (insn);
6322 		}
6323 	    }
6324 
6325 	  if (vinsn->num_slots > 1)
6326 	    {
6327 	      if (opcode_fits_format_slot
6328 		  (slotstack.insn[slotstack.ninsn - 1].opcode,
6329 		   vinsn->format, i))
6330 		{
6331 		  vinsn->slots[i] = slotstack.insn[slotstack.ninsn - 1];
6332 		}
6333 	      else
6334 		{
6335 		  emit_single_op (&slotstack.insn[slotstack.ninsn - 1]);
6336 		  if (vinsn->format == XTENSA_UNDEFINED)
6337 		    vinsn->slots[i].opcode = xtensa_nop_opcode;
6338 		  else
6339 		    vinsn->slots[i].opcode
6340 		      = xtensa_format_slot_nop_opcode (xtensa_default_isa,
6341 						       vinsn->format, i);
6342 
6343 		  vinsn->slots[i].ntok = 0;
6344 		}
6345 	    }
6346 	  else
6347 	    {
6348 	      vinsn->slots[0] = slotstack.insn[slotstack.ninsn - 1];
6349 	      vinsn->format = XTENSA_UNDEFINED;
6350 	    }
6351 	}
6352     }
6353 
6354   /* Now check resource conflicts on the modified bundle.  */
6355   if (resources_conflict (vinsn))
6356     {
6357       as_where (&file_name, &line);
6358       as_bad_where (file_name, line, _("illegal resource usage in bundle"));
6359       fprintf (stderr, "    ops were: ");
6360       for (i = 0; i < vinsn->num_slots; i++)
6361 	fprintf (stderr, " %s;",
6362 		 xtensa_opcode_name (xtensa_default_isa,
6363 				     vinsn->slots[i].opcode));
6364       fprintf (stderr, "\n");
6365       xg_clear_vinsn (vinsn);
6366       return;
6367     }
6368 
6369   /* First, find a format that works.  */
6370   if (vinsn->format == XTENSA_UNDEFINED)
6371       vinsn->format = xg_find_narrowest_format (vinsn);
6372 
6373   xg_assemble_vliw_tokens (vinsn);
6374 
6375   xg_clear_vinsn (vinsn);
6376 }
6377 
6378 
6379 /* Given an vliw instruction, what conflicts are there in register
6380    usage and in writes to states and queues?
6381 
6382    This function does two things:
6383    1. Reports an error when a vinsn contains illegal combinations
6384       of writes to registers states or queues.
6385    2. Marks individual tinsns as not relaxable if the combination
6386       contains antidependencies.
6387 
6388    Job 2 handles things like swap semantics in instructions that need
6389    to be relaxed.  For example,
6390 
6391 	addi a0, a1, 100000
6392 
6393    normally would be relaxed to
6394 
6395 	l32r a0, some_label
6396 	add a0, a1, a0
6397 
6398    _but_, if the above instruction is bundled with an a0 reader, e.g.,
6399 
6400 	{ addi a0, a1, 10000 ; add a2, a0, a4 ; }
6401 
6402    then we can't relax it into
6403 
6404 	l32r a0, some_label
6405 	{ add a0, a1, a0 ; add a2, a0, a4 ; }
6406 
6407    because the value of a0 is trashed before the second add can read it.  */
6408 
6409 static char check_t1_t2_reads_and_writes (TInsn *, TInsn *);
6410 
6411 static bfd_boolean
6412 find_vinsn_conflicts (vliw_insn *vinsn)
6413 {
6414   int i, j;
6415   int branches = 0;
6416   xtensa_isa isa = xtensa_default_isa;
6417 
6418   gas_assert (!past_xtensa_end);
6419 
6420   for (i = 0 ; i < vinsn->num_slots; i++)
6421     {
6422       TInsn *op1 = &vinsn->slots[i];
6423       if (op1->is_specific_opcode)
6424 	op1->keep_wide = TRUE;
6425       else
6426 	op1->keep_wide = FALSE;
6427     }
6428 
6429   for (i = 0 ; i < vinsn->num_slots; i++)
6430     {
6431       TInsn *op1 = &vinsn->slots[i];
6432 
6433       if (xtensa_opcode_is_branch (isa, op1->opcode) == 1)
6434 	branches++;
6435 
6436       for (j = 0; j < vinsn->num_slots; j++)
6437 	{
6438 	  if (i != j)
6439 	    {
6440 	      TInsn *op2 = &vinsn->slots[j];
6441 	      char conflict_type = check_t1_t2_reads_and_writes (op1, op2);
6442 	      switch (conflict_type)
6443 		{
6444 		case 'c':
6445 		  as_bad (_("opcodes '%s' (slot %d) and '%s' (slot %d) write the same register"),
6446 			  xtensa_opcode_name (isa, op1->opcode), i,
6447 			  xtensa_opcode_name (isa, op2->opcode), j);
6448 		  return TRUE;
6449 		case 'd':
6450 		  as_bad (_("opcodes '%s' (slot %d) and '%s' (slot %d) write the same state"),
6451 			  xtensa_opcode_name (isa, op1->opcode), i,
6452 			  xtensa_opcode_name (isa, op2->opcode), j);
6453 		  return TRUE;
6454 		case 'e':
6455 		  as_bad (_("opcodes '%s' (slot %d) and '%s' (slot %d) write the same port"),
6456 			  xtensa_opcode_name (isa, op1->opcode), i,
6457 			  xtensa_opcode_name (isa, op2->opcode), j);
6458 		  return TRUE;
6459 		case 'f':
6460 		  as_bad (_("opcodes '%s' (slot %d) and '%s' (slot %d) both have volatile port accesses"),
6461 			  xtensa_opcode_name (isa, op1->opcode), i,
6462 			  xtensa_opcode_name (isa, op2->opcode), j);
6463 		  return TRUE;
6464 		default:
6465 		  /* Everything is OK.  */
6466 		  break;
6467 		}
6468 	      op2->is_specific_opcode = (op2->is_specific_opcode
6469 					 || conflict_type == 'a');
6470 	    }
6471 	}
6472     }
6473 
6474   if (branches > 1)
6475     {
6476       as_bad (_("multiple branches or jumps in the same bundle"));
6477       return TRUE;
6478     }
6479 
6480   return FALSE;
6481 }
6482 
6483 
6484 /* Check how the state used by t1 and t2 relate.
6485    Cases found are:
6486 
6487    case A: t1 reads a register t2 writes (an antidependency within a bundle)
6488    case B: no relationship between what is read and written (both could
6489            read the same reg though)
6490    case C: t1 writes a register t2 writes (a register conflict within a
6491            bundle)
6492    case D: t1 writes a state that t2 also writes
6493    case E: t1 writes a tie queue that t2 also writes
6494    case F: two volatile queue accesses
6495 */
6496 
6497 static char
6498 check_t1_t2_reads_and_writes (TInsn *t1, TInsn *t2)
6499 {
6500   xtensa_isa isa = xtensa_default_isa;
6501   xtensa_regfile t1_regfile, t2_regfile;
6502   int t1_reg, t2_reg;
6503   int t1_base_reg, t1_last_reg;
6504   int t2_base_reg, t2_last_reg;
6505   char t1_inout, t2_inout;
6506   int i, j;
6507   char conflict = 'b';
6508   int t1_states;
6509   int t2_states;
6510   int t1_interfaces;
6511   int t2_interfaces;
6512   bfd_boolean t1_volatile = FALSE;
6513   bfd_boolean t2_volatile = FALSE;
6514 
6515   /* Check registers.  */
6516   for (j = 0; j < t2->ntok; j++)
6517     {
6518       if (xtensa_operand_is_register (isa, t2->opcode, j) != 1)
6519 	continue;
6520 
6521       t2_regfile = xtensa_operand_regfile (isa, t2->opcode, j);
6522       t2_base_reg = t2->tok[j].X_add_number;
6523       t2_last_reg = t2_base_reg + xtensa_operand_num_regs (isa, t2->opcode, j);
6524 
6525       for (i = 0; i < t1->ntok; i++)
6526 	{
6527 	  if (xtensa_operand_is_register (isa, t1->opcode, i) != 1)
6528 	    continue;
6529 
6530 	  t1_regfile = xtensa_operand_regfile (isa, t1->opcode, i);
6531 
6532 	  if (t1_regfile != t2_regfile)
6533 	    continue;
6534 
6535 	  t1_inout = xtensa_operand_inout (isa, t1->opcode, i);
6536 	  t2_inout = xtensa_operand_inout (isa, t2->opcode, j);
6537 
6538 	  if (xtensa_operand_is_known_reg (isa, t1->opcode, i) == 0
6539 	      || xtensa_operand_is_known_reg (isa, t2->opcode, j) == 0)
6540 	    {
6541 	      if (t1_inout == 'm' || t1_inout == 'o'
6542 		  || t2_inout == 'm' || t2_inout == 'o')
6543 		{
6544 		  conflict = 'a';
6545 		  continue;
6546 		}
6547 	    }
6548 
6549 	  t1_base_reg = t1->tok[i].X_add_number;
6550 	  t1_last_reg = (t1_base_reg
6551 			 + xtensa_operand_num_regs (isa, t1->opcode, i));
6552 
6553 	  for (t1_reg = t1_base_reg; t1_reg < t1_last_reg; t1_reg++)
6554 	    {
6555 	      for (t2_reg = t2_base_reg; t2_reg < t2_last_reg; t2_reg++)
6556 		{
6557 		  if (t1_reg != t2_reg)
6558 		    continue;
6559 
6560 		  if (t2_inout == 'i' && (t1_inout == 'm' || t1_inout == 'o'))
6561 		    {
6562 		      conflict = 'a';
6563 		      continue;
6564 		    }
6565 
6566 		  if (t1_inout == 'i' && (t2_inout == 'm' || t2_inout == 'o'))
6567 		    {
6568 		      conflict = 'a';
6569 		      continue;
6570 		    }
6571 
6572 		  if (t1_inout != 'i' && t2_inout != 'i')
6573 		    return 'c';
6574 		}
6575 	    }
6576 	}
6577     }
6578 
6579   /* Check states.  */
6580   t1_states = xtensa_opcode_num_stateOperands (isa, t1->opcode);
6581   t2_states = xtensa_opcode_num_stateOperands (isa, t2->opcode);
6582   for (j = 0; j < t2_states; j++)
6583     {
6584       xtensa_state t2_so = xtensa_stateOperand_state (isa, t2->opcode, j);
6585       t2_inout = xtensa_stateOperand_inout (isa, t2->opcode, j);
6586       for (i = 0; i < t1_states; i++)
6587 	{
6588 	  xtensa_state t1_so = xtensa_stateOperand_state (isa, t1->opcode, i);
6589 	  t1_inout = xtensa_stateOperand_inout (isa, t1->opcode, i);
6590 	  if (t1_so != t2_so || xtensa_state_is_shared_or (isa, t1_so) == 1)
6591 	    continue;
6592 
6593 	  if (t2_inout == 'i' && (t1_inout == 'm' || t1_inout == 'o'))
6594 	    {
6595 	      conflict = 'a';
6596 	      continue;
6597 	    }
6598 
6599 	  if (t1_inout == 'i' && (t2_inout == 'm' || t2_inout == 'o'))
6600 	    {
6601 	      conflict = 'a';
6602 	      continue;
6603 	    }
6604 
6605 	  if (t1_inout != 'i' && t2_inout != 'i')
6606 	    return 'd';
6607 	}
6608     }
6609 
6610   /* Check tieports.  */
6611   t1_interfaces = xtensa_opcode_num_interfaceOperands (isa, t1->opcode);
6612   t2_interfaces = xtensa_opcode_num_interfaceOperands (isa, t2->opcode);
6613   for (j = 0; j < t2_interfaces; j++)
6614     {
6615       xtensa_interface t2_int
6616 	= xtensa_interfaceOperand_interface (isa, t2->opcode, j);
6617       int t2_class = xtensa_interface_class_id (isa, t2_int);
6618 
6619       t2_inout = xtensa_interface_inout (isa, t2_int);
6620       if (xtensa_interface_has_side_effect (isa, t2_int) == 1)
6621 	t2_volatile = TRUE;
6622 
6623       for (i = 0; i < t1_interfaces; i++)
6624 	{
6625 	  xtensa_interface t1_int
6626 	    = xtensa_interfaceOperand_interface (isa, t1->opcode, j);
6627 	  int t1_class = xtensa_interface_class_id (isa, t1_int);
6628 
6629 	  t1_inout = xtensa_interface_inout (isa, t1_int);
6630 	  if (xtensa_interface_has_side_effect (isa, t1_int) == 1)
6631 	    t1_volatile = TRUE;
6632 
6633 	  if (t1_volatile && t2_volatile && (t1_class == t2_class))
6634 	    return 'f';
6635 
6636 	  if (t1_int != t2_int)
6637 	    continue;
6638 
6639 	  if (t2_inout == 'i' && t1_inout == 'o')
6640 	    {
6641 	      conflict = 'a';
6642 	      continue;
6643 	    }
6644 
6645 	  if (t1_inout == 'i' && t2_inout == 'o')
6646 	    {
6647 	      conflict = 'a';
6648 	      continue;
6649 	    }
6650 
6651 	  if (t1_inout != 'i' && t2_inout != 'i')
6652 	    return 'e';
6653 	}
6654     }
6655 
6656   return conflict;
6657 }
6658 
6659 
6660 static xtensa_format
6661 xg_find_narrowest_format (vliw_insn *vinsn)
6662 {
6663   /* Right now we assume that the ops within the vinsn are properly
6664      ordered for the slots that the programmer wanted them in.  In
6665      other words, we don't rearrange the ops in hopes of finding a
6666      better format.  The scheduler handles that.  */
6667 
6668   xtensa_isa isa = xtensa_default_isa;
6669   xtensa_format format;
6670   xtensa_opcode nop_opcode = xtensa_nop_opcode;
6671 
6672   if (vinsn->num_slots == 1)
6673     return xg_get_single_format (vinsn->slots[0].opcode);
6674 
6675   for (format = 0; format < xtensa_isa_num_formats (isa); format++)
6676     {
6677       vliw_insn v_copy;
6678       xg_copy_vinsn (&v_copy, vinsn);
6679       if (xtensa_format_num_slots (isa, format) == v_copy.num_slots)
6680 	{
6681 	  int slot;
6682 	  int fit = 0;
6683 	  for (slot = 0; slot < v_copy.num_slots; slot++)
6684 	    {
6685 	      if (v_copy.slots[slot].opcode == nop_opcode)
6686 		{
6687 		  v_copy.slots[slot].opcode =
6688 		    xtensa_format_slot_nop_opcode (isa, format, slot);
6689 		  v_copy.slots[slot].ntok = 0;
6690 		}
6691 
6692 	      if (opcode_fits_format_slot (v_copy.slots[slot].opcode,
6693 					   format, slot))
6694 		fit++;
6695 	      else if (v_copy.num_slots > 1)
6696 		{
6697 		  TInsn widened;
6698 		  /* Try the widened version.  */
6699 		  if (!v_copy.slots[slot].keep_wide
6700 		      && !v_copy.slots[slot].is_specific_opcode
6701 		      && xg_is_single_relaxable_insn (&v_copy.slots[slot],
6702 						      &widened, TRUE)
6703 		      && opcode_fits_format_slot (widened.opcode,
6704 						  format, slot))
6705 		    {
6706 		      v_copy.slots[slot] = widened;
6707 		      fit++;
6708 		    }
6709 		}
6710 	    }
6711 	  if (fit == v_copy.num_slots)
6712 	    {
6713 	      xg_copy_vinsn (vinsn, &v_copy);
6714 	      xtensa_format_encode (isa, format, vinsn->insnbuf);
6715 	      vinsn->format = format;
6716 	      break;
6717 	    }
6718 	}
6719     }
6720 
6721   if (format == xtensa_isa_num_formats (isa))
6722     return XTENSA_UNDEFINED;
6723 
6724   return format;
6725 }
6726 
6727 
6728 /* Return the additional space needed in a frag
6729    for possible relaxations of any ops in a VLIW insn.
6730    Also fill out the relaxations that might be required of
6731    each tinsn in the vinsn.  */
6732 
6733 static int
6734 relaxation_requirements (vliw_insn *vinsn, bfd_boolean *pfinish_frag)
6735 {
6736   bfd_boolean finish_frag = FALSE;
6737   int extra_space = 0;
6738   int slot;
6739 
6740   for (slot = 0; slot < vinsn->num_slots; slot++)
6741     {
6742       TInsn *tinsn = &vinsn->slots[slot];
6743       if (!tinsn_has_symbolic_operands (tinsn))
6744 	{
6745 	  /* A narrow instruction could be widened later to help
6746 	     alignment issues.  */
6747 	  if (xg_is_single_relaxable_insn (tinsn, 0, TRUE)
6748 	      && !tinsn->is_specific_opcode
6749 	      && vinsn->num_slots == 1)
6750 	    {
6751 	      /* Difference in bytes between narrow and wide insns...  */
6752 	      extra_space += 1;
6753 	      tinsn->subtype = RELAX_NARROW;
6754 	    }
6755 	}
6756       else
6757 	{
6758 	  if (workaround_b_j_loop_end
6759 	      && tinsn->opcode == xtensa_jx_opcode
6760 	      && use_transform ())
6761 	    {
6762 	      /* Add 2 of these.  */
6763 	      extra_space += 3; /* for the nop size */
6764 	      tinsn->subtype = RELAX_ADD_NOP_IF_PRE_LOOP_END;
6765 	    }
6766 
6767 	  /* Need to assemble it with space for the relocation.  */
6768 	  if (xg_is_relaxable_insn (tinsn, 0)
6769 	      && !tinsn->is_specific_opcode)
6770 	    {
6771 	      int max_size = xg_get_max_insn_widen_size (tinsn->opcode);
6772 	      int max_literal_size =
6773 		xg_get_max_insn_widen_literal_size (tinsn->opcode);
6774 
6775 	      tinsn->literal_space = max_literal_size;
6776 
6777 	      tinsn->subtype = RELAX_IMMED;
6778 	      extra_space += max_size;
6779 	    }
6780 	  else
6781 	    {
6782 	      /* A fix record will be added for this instruction prior
6783 		 to relaxation, so make it end the frag.  */
6784 	      finish_frag = TRUE;
6785 	    }
6786 	}
6787     }
6788   *pfinish_frag = finish_frag;
6789   return extra_space;
6790 }
6791 
6792 
6793 static void
6794 bundle_tinsn (TInsn *tinsn, vliw_insn *vinsn)
6795 {
6796   xtensa_isa isa = xtensa_default_isa;
6797   int slot, chosen_slot;
6798 
6799   vinsn->format = xg_get_single_format (tinsn->opcode);
6800   gas_assert (vinsn->format != XTENSA_UNDEFINED);
6801   vinsn->num_slots = xtensa_format_num_slots (isa, vinsn->format);
6802 
6803   chosen_slot = xg_get_single_slot (tinsn->opcode);
6804   for (slot = 0; slot < vinsn->num_slots; slot++)
6805     {
6806       if (slot == chosen_slot)
6807 	vinsn->slots[slot] = *tinsn;
6808       else
6809 	{
6810 	  vinsn->slots[slot].opcode =
6811 	    xtensa_format_slot_nop_opcode (isa, vinsn->format, slot);
6812 	  vinsn->slots[slot].ntok = 0;
6813 	  vinsn->slots[slot].insn_type = ITYPE_INSN;
6814 	}
6815     }
6816 }
6817 
6818 
6819 static bfd_boolean
6820 emit_single_op (TInsn *orig_insn)
6821 {
6822   int i;
6823   IStack istack;		/* put instructions into here */
6824   symbolS *lit_sym = NULL;
6825   symbolS *label_sym = NULL;
6826 
6827   istack_init (&istack);
6828 
6829   /* Special-case for "movi aX, foo" which is guaranteed to need relaxing.
6830      Because the scheduling and bundling characteristics of movi and
6831      l32r or const16 are so different, we can do much better if we relax
6832      it prior to scheduling and bundling, rather than after.  */
6833   if ((orig_insn->opcode == xtensa_movi_opcode
6834        || orig_insn->opcode == xtensa_movi_n_opcode)
6835       && !cur_vinsn.inside_bundle
6836       && (orig_insn->tok[1].X_op == O_symbol
6837 	  || orig_insn->tok[1].X_op == O_pltrel
6838 	  || orig_insn->tok[1].X_op == O_tlsfunc
6839 	  || orig_insn->tok[1].X_op == O_tlsarg
6840 	  || orig_insn->tok[1].X_op == O_tpoff
6841 	  || orig_insn->tok[1].X_op == O_dtpoff)
6842       && !orig_insn->is_specific_opcode && use_transform ())
6843     xg_assembly_relax (&istack, orig_insn, now_seg, frag_now, 0, 1, 0);
6844   else
6845     if (xg_expand_assembly_insn (&istack, orig_insn))
6846       return TRUE;
6847 
6848   for (i = 0; i < istack.ninsn; i++)
6849     {
6850       TInsn *insn = &istack.insn[i];
6851       switch (insn->insn_type)
6852 	{
6853 	case ITYPE_LITERAL:
6854 	  gas_assert (lit_sym == NULL);
6855 	  lit_sym = xg_assemble_literal (insn);
6856 	  break;
6857 	case ITYPE_LABEL:
6858 	  {
6859 	    static int relaxed_sym_idx = 0;
6860 	    char *label = xmalloc (strlen (FAKE_LABEL_NAME) + 12);
6861 	    sprintf (label, "%s_rl_%x", FAKE_LABEL_NAME, relaxed_sym_idx++);
6862 	    colon (label);
6863 	    gas_assert (label_sym == NULL);
6864 	    label_sym = symbol_find_or_make (label);
6865 	    gas_assert (label_sym);
6866 	    free (label);
6867 	  }
6868 	  break;
6869 	case ITYPE_INSN:
6870 	  {
6871 	    vliw_insn v;
6872 	    if (lit_sym)
6873 	      xg_resolve_literals (insn, lit_sym);
6874 	    if (label_sym)
6875 	      xg_resolve_labels (insn, label_sym);
6876 	    xg_init_vinsn (&v);
6877 	    bundle_tinsn (insn, &v);
6878 	    finish_vinsn (&v);
6879 	    xg_free_vinsn (&v);
6880 	  }
6881 	  break;
6882 	default:
6883 	  gas_assert (0);
6884 	  break;
6885 	}
6886     }
6887   return FALSE;
6888 }
6889 
6890 
6891 static int
6892 total_frag_text_expansion (fragS *fragP)
6893 {
6894   int slot;
6895   int total_expansion = 0;
6896 
6897   for (slot = 0; slot < config_max_slots; slot++)
6898     total_expansion += fragP->tc_frag_data.text_expansion[slot];
6899 
6900   return total_expansion;
6901 }
6902 
6903 
6904 /* Emit a vliw instruction to the current fragment.  */
6905 
6906 static void
6907 xg_assemble_vliw_tokens (vliw_insn *vinsn)
6908 {
6909   bfd_boolean finish_frag;
6910   bfd_boolean is_jump = FALSE;
6911   bfd_boolean is_branch = FALSE;
6912   xtensa_isa isa = xtensa_default_isa;
6913   int insn_size;
6914   int extra_space;
6915   char *f = NULL;
6916   int slot;
6917   struct dwarf2_line_info debug_line;
6918   bfd_boolean loc_directive_seen = FALSE;
6919   TInsn *tinsn;
6920 
6921   memset (&debug_line, 0, sizeof (struct dwarf2_line_info));
6922 
6923   if (generating_literals)
6924     {
6925       static int reported = 0;
6926       if (reported < 4)
6927 	as_bad_where (frag_now->fr_file, frag_now->fr_line,
6928 		      _("cannot assemble into a literal fragment"));
6929       if (reported == 3)
6930 	as_bad (_("..."));
6931       reported++;
6932       return;
6933     }
6934 
6935   if (frag_now_fix () != 0
6936       && (! frag_now->tc_frag_data.is_insn
6937  	  || (vinsn_has_specific_opcodes (vinsn) && use_transform ())
6938  	  || !use_transform () != frag_now->tc_frag_data.is_no_transform
6939  	  || (directive_state[directive_longcalls]
6940 	      != frag_now->tc_frag_data.use_longcalls)
6941  	  || (directive_state[directive_absolute_literals]
6942 	      != frag_now->tc_frag_data.use_absolute_literals)))
6943     {
6944       frag_wane (frag_now);
6945       frag_new (0);
6946       xtensa_set_frag_assembly_state (frag_now);
6947     }
6948 
6949   if (workaround_a0_b_retw
6950       && vinsn->num_slots == 1
6951       && (get_last_insn_flags (now_seg, now_subseg) & FLAG_IS_A0_WRITER) != 0
6952       && xtensa_opcode_is_branch (isa, vinsn->slots[0].opcode) == 1
6953       && use_transform ())
6954     {
6955       has_a0_b_retw = TRUE;
6956 
6957       /* Mark this fragment with the special RELAX_ADD_NOP_IF_A0_B_RETW.
6958 	 After the first assembly pass we will check all of them and
6959 	 add a nop if needed.  */
6960       frag_now->tc_frag_data.is_insn = TRUE;
6961       frag_var (rs_machine_dependent, 4, 4,
6962 		RELAX_ADD_NOP_IF_A0_B_RETW,
6963 		frag_now->fr_symbol,
6964 		frag_now->fr_offset,
6965 		NULL);
6966       xtensa_set_frag_assembly_state (frag_now);
6967       frag_now->tc_frag_data.is_insn = TRUE;
6968       frag_var (rs_machine_dependent, 4, 4,
6969 		RELAX_ADD_NOP_IF_A0_B_RETW,
6970 		frag_now->fr_symbol,
6971 		frag_now->fr_offset,
6972 		NULL);
6973       xtensa_set_frag_assembly_state (frag_now);
6974     }
6975 
6976   for (slot = 0; slot < vinsn->num_slots; slot++)
6977     {
6978       tinsn = &vinsn->slots[slot];
6979 
6980       /* See if the instruction implies an aligned section.  */
6981       if (xtensa_opcode_is_loop (isa, tinsn->opcode) == 1)
6982 	record_alignment (now_seg, 2);
6983 
6984       /* Determine the best line number for debug info.  */
6985       if ((tinsn->loc_directive_seen || !loc_directive_seen)
6986 	  && (tinsn->debug_line.filenum != debug_line.filenum
6987 	      || tinsn->debug_line.line < debug_line.line
6988 	      || tinsn->debug_line.column < debug_line.column))
6989 	debug_line = tinsn->debug_line;
6990       if (tinsn->loc_directive_seen)
6991 	loc_directive_seen = TRUE;
6992     }
6993 
6994   /* Special cases for instructions that force an alignment... */
6995   /* None of these opcodes are bundle-able.  */
6996   if (xtensa_opcode_is_loop (isa, vinsn->slots[0].opcode) == 1)
6997     {
6998       int max_fill;
6999 
7000       /* Remember the symbol that marks the end of the loop in the frag
7001 	 that marks the start of the loop.  This way we can easily find
7002 	 the end of the loop at the beginning, without adding special code
7003 	 to mark the loop instructions themselves.  */
7004       symbolS *target_sym = NULL;
7005       if (vinsn->slots[0].tok[1].X_op == O_symbol)
7006 	target_sym = vinsn->slots[0].tok[1].X_add_symbol;
7007 
7008       xtensa_set_frag_assembly_state (frag_now);
7009       frag_now->tc_frag_data.is_insn = TRUE;
7010 
7011       max_fill = get_text_align_max_fill_size
7012 	(get_text_align_power (xtensa_fetch_width),
7013 	 TRUE, frag_now->tc_frag_data.is_no_density);
7014 
7015       if (use_transform ())
7016 	frag_var (rs_machine_dependent, max_fill, max_fill,
7017 		  RELAX_ALIGN_NEXT_OPCODE, target_sym, 0, NULL);
7018       else
7019 	frag_var (rs_machine_dependent, 0, 0,
7020 		  RELAX_CHECK_ALIGN_NEXT_OPCODE, target_sym, 0, NULL);
7021       xtensa_set_frag_assembly_state (frag_now);
7022     }
7023 
7024   if (vinsn->slots[0].opcode == xtensa_entry_opcode
7025       && !vinsn->slots[0].is_specific_opcode)
7026     {
7027       xtensa_mark_literal_pool_location ();
7028       xtensa_move_labels (frag_now, 0);
7029       frag_var (rs_align_test, 1, 1, 0, NULL, 2, NULL);
7030     }
7031 
7032   if (vinsn->num_slots == 1)
7033     {
7034       if (workaround_a0_b_retw && use_transform ())
7035 	set_last_insn_flags (now_seg, now_subseg, FLAG_IS_A0_WRITER,
7036 			     is_register_writer (&vinsn->slots[0], "a", 0));
7037 
7038       set_last_insn_flags (now_seg, now_subseg, FLAG_IS_BAD_LOOPEND,
7039 			   is_bad_loopend_opcode (&vinsn->slots[0]));
7040     }
7041   else
7042     set_last_insn_flags (now_seg, now_subseg, FLAG_IS_BAD_LOOPEND, FALSE);
7043 
7044   insn_size = xtensa_format_length (isa, vinsn->format);
7045 
7046   extra_space = relaxation_requirements (vinsn, &finish_frag);
7047 
7048   /* vinsn_to_insnbuf will produce the error.  */
7049   if (vinsn->format != XTENSA_UNDEFINED)
7050     {
7051       f = frag_more (insn_size + extra_space);
7052       xtensa_set_frag_assembly_state (frag_now);
7053       frag_now->tc_frag_data.is_insn = TRUE;
7054     }
7055 
7056   vinsn_to_insnbuf (vinsn, f, frag_now, FALSE);
7057   if (vinsn->format == XTENSA_UNDEFINED)
7058     return;
7059 
7060   xtensa_insnbuf_to_chars (isa, vinsn->insnbuf, (unsigned char *) f, 0);
7061 
7062   if (debug_type == DEBUG_DWARF2 || loc_directive_seen)
7063     dwarf2_gen_line_info (frag_now_fix () - (insn_size + extra_space),
7064 			  &debug_line);
7065 
7066   for (slot = 0; slot < vinsn->num_slots; slot++)
7067     {
7068       tinsn = &vinsn->slots[slot];
7069       frag_now->tc_frag_data.slot_subtypes[slot] = tinsn->subtype;
7070       frag_now->tc_frag_data.slot_symbols[slot] = tinsn->symbol;
7071       frag_now->tc_frag_data.slot_offsets[slot] = tinsn->offset;
7072       frag_now->tc_frag_data.literal_frags[slot] = tinsn->literal_frag;
7073       if (tinsn->literal_space != 0)
7074 	xg_assemble_literal_space (tinsn->literal_space, slot);
7075       frag_now->tc_frag_data.free_reg[slot] = tinsn->extra_arg;
7076 
7077       if (tinsn->subtype == RELAX_NARROW)
7078 	gas_assert (vinsn->num_slots == 1);
7079       if (xtensa_opcode_is_jump (isa, tinsn->opcode) == 1)
7080 	is_jump = TRUE;
7081       if (xtensa_opcode_is_branch (isa, tinsn->opcode) == 1)
7082 	is_branch = TRUE;
7083 
7084       if (tinsn->subtype || tinsn->symbol || tinsn->offset
7085 	  || tinsn->literal_frag || is_jump || is_branch)
7086 	finish_frag = TRUE;
7087     }
7088 
7089   if (vinsn_has_specific_opcodes (vinsn) && use_transform ())
7090     frag_now->tc_frag_data.is_specific_opcode = TRUE;
7091 
7092   if (finish_frag)
7093     {
7094       frag_variant (rs_machine_dependent,
7095 		    extra_space, extra_space, RELAX_SLOTS,
7096 		    frag_now->fr_symbol, frag_now->fr_offset, f);
7097       xtensa_set_frag_assembly_state (frag_now);
7098     }
7099 
7100   /* Special cases for loops:
7101      close_loop_end should be inserted AFTER short_loop.
7102      Make sure that CLOSE loops are processed BEFORE short_loops
7103      when converting them.  */
7104 
7105   /* "short_loop": Add a NOP if the loop is < 4 bytes.  */
7106   if (xtensa_opcode_is_loop (isa, vinsn->slots[0].opcode) == 1
7107       && !vinsn->slots[0].is_specific_opcode)
7108     {
7109       if (workaround_short_loop && use_transform ())
7110 	{
7111 	  maybe_has_short_loop = TRUE;
7112 	  frag_now->tc_frag_data.is_insn = TRUE;
7113 	  frag_var (rs_machine_dependent, 4, 4,
7114 		    RELAX_ADD_NOP_IF_SHORT_LOOP,
7115 		    frag_now->fr_symbol, frag_now->fr_offset, NULL);
7116 	  frag_now->tc_frag_data.is_insn = TRUE;
7117 	  frag_var (rs_machine_dependent, 4, 4,
7118 		    RELAX_ADD_NOP_IF_SHORT_LOOP,
7119 		    frag_now->fr_symbol, frag_now->fr_offset, NULL);
7120 	}
7121 
7122       /* "close_loop_end": Add up to 12 bytes of NOPs to keep a
7123 	 loop at least 12 bytes away from another loop's end.  */
7124       if (workaround_close_loop_end && use_transform ())
7125 	{
7126 	  maybe_has_close_loop_end = TRUE;
7127 	  frag_now->tc_frag_data.is_insn = TRUE;
7128 	  frag_var (rs_machine_dependent, 12, 12,
7129 		    RELAX_ADD_NOP_IF_CLOSE_LOOP_END,
7130 		    frag_now->fr_symbol, frag_now->fr_offset, NULL);
7131 	}
7132     }
7133 
7134   if (use_transform ())
7135     {
7136       if (is_jump)
7137 	{
7138 	  gas_assert (finish_frag);
7139 	  frag_var (rs_machine_dependent,
7140 		    xtensa_fetch_width, xtensa_fetch_width,
7141 		    RELAX_UNREACHABLE,
7142 		    frag_now->fr_symbol, frag_now->fr_offset, NULL);
7143 	  xtensa_set_frag_assembly_state (frag_now);
7144 	}
7145       else if (is_branch && do_align_targets ())
7146 	{
7147 	  gas_assert (finish_frag);
7148 	  frag_var (rs_machine_dependent,
7149 		    xtensa_fetch_width, xtensa_fetch_width,
7150 		    RELAX_MAYBE_UNREACHABLE,
7151 		    frag_now->fr_symbol, frag_now->fr_offset, NULL);
7152 	  xtensa_set_frag_assembly_state (frag_now);
7153 	  frag_var (rs_machine_dependent,
7154 		    0, 0,
7155 		    RELAX_MAYBE_DESIRE_ALIGN,
7156 		    frag_now->fr_symbol, frag_now->fr_offset, NULL);
7157 	  xtensa_set_frag_assembly_state (frag_now);
7158 	}
7159     }
7160 
7161   /* Now, if the original opcode was a call...  */
7162   if (do_align_targets ()
7163       && xtensa_opcode_is_call (isa, vinsn->slots[0].opcode) == 1)
7164     {
7165       float freq = get_subseg_total_freq (now_seg, now_subseg);
7166       frag_now->tc_frag_data.is_insn = TRUE;
7167       frag_var (rs_machine_dependent, 4, (int) freq, RELAX_DESIRE_ALIGN,
7168 		frag_now->fr_symbol, frag_now->fr_offset, NULL);
7169       xtensa_set_frag_assembly_state (frag_now);
7170     }
7171 
7172   if (vinsn_has_specific_opcodes (vinsn) && use_transform ())
7173     {
7174       frag_wane (frag_now);
7175       frag_new (0);
7176       xtensa_set_frag_assembly_state (frag_now);
7177     }
7178 }
7179 
7180 
7181 /* xtensa_end and helper functions.  */
7182 
7183 static void xtensa_cleanup_align_frags (void);
7184 static void xtensa_fix_target_frags (void);
7185 static void xtensa_mark_narrow_branches (void);
7186 static void xtensa_mark_zcl_first_insns (void);
7187 static void xtensa_mark_difference_of_two_symbols (void);
7188 static void xtensa_fix_a0_b_retw_frags (void);
7189 static void xtensa_fix_b_j_loop_end_frags (void);
7190 static void xtensa_fix_close_loop_end_frags (void);
7191 static void xtensa_fix_short_loop_frags (void);
7192 static void xtensa_sanity_check (void);
7193 static void xtensa_add_config_info (void);
7194 
7195 void
7196 xtensa_end (void)
7197 {
7198   directive_balance ();
7199   xtensa_flush_pending_output ();
7200 
7201   past_xtensa_end = TRUE;
7202 
7203   xtensa_move_literals ();
7204 
7205   xtensa_reorder_segments ();
7206   xtensa_cleanup_align_frags ();
7207   xtensa_fix_target_frags ();
7208   if (workaround_a0_b_retw && has_a0_b_retw)
7209     xtensa_fix_a0_b_retw_frags ();
7210   if (workaround_b_j_loop_end)
7211     xtensa_fix_b_j_loop_end_frags ();
7212 
7213   /* "close_loop_end" should be processed BEFORE "short_loop".  */
7214   if (workaround_close_loop_end && maybe_has_close_loop_end)
7215     xtensa_fix_close_loop_end_frags ();
7216 
7217   if (workaround_short_loop && maybe_has_short_loop)
7218     xtensa_fix_short_loop_frags ();
7219   if (align_targets)
7220     xtensa_mark_narrow_branches ();
7221   xtensa_mark_zcl_first_insns ();
7222 
7223   xtensa_sanity_check ();
7224 
7225   xtensa_add_config_info ();
7226 }
7227 
7228 
7229 static void
7230 xtensa_cleanup_align_frags (void)
7231 {
7232   frchainS *frchP;
7233   asection *s;
7234 
7235   for (s = stdoutput->sections; s; s = s->next)
7236     for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
7237       {
7238 	fragS *fragP;
7239 	/* Walk over all of the fragments in a subsection.  */
7240 	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
7241 	  {
7242 	    if ((fragP->fr_type == rs_align
7243 		 || fragP->fr_type == rs_align_code
7244 		 || (fragP->fr_type == rs_machine_dependent
7245 		     && (fragP->fr_subtype == RELAX_DESIRE_ALIGN
7246 			 || fragP->fr_subtype == RELAX_DESIRE_ALIGN_IF_TARGET)))
7247 		&& fragP->fr_fix == 0)
7248 	      {
7249 		fragS *next = fragP->fr_next;
7250 
7251 		while (next
7252 		       && next->fr_fix == 0
7253 		       && next->fr_type == rs_machine_dependent
7254 		       && next->fr_subtype == RELAX_DESIRE_ALIGN_IF_TARGET)
7255 		  {
7256 		    frag_wane (next);
7257 		    next = next->fr_next;
7258 		  }
7259 	      }
7260 	    /* If we don't widen branch targets, then they
7261 	       will be easier to align.  */
7262 	    if (fragP->tc_frag_data.is_branch_target
7263 		&& fragP->fr_opcode == fragP->fr_literal
7264 		&& fragP->fr_type == rs_machine_dependent
7265 		&& fragP->fr_subtype == RELAX_SLOTS
7266 		&& fragP->tc_frag_data.slot_subtypes[0] == RELAX_NARROW)
7267 	      frag_wane (fragP);
7268 	    if (fragP->fr_type == rs_machine_dependent
7269 		&& fragP->fr_subtype == RELAX_UNREACHABLE)
7270 	      fragP->tc_frag_data.is_unreachable = TRUE;
7271 	  }
7272       }
7273 }
7274 
7275 
7276 /* Re-process all of the fragments looking to convert all of the
7277    RELAX_DESIRE_ALIGN_IF_TARGET fragments.  If there is a branch
7278    target in the next fragment, convert this to RELAX_DESIRE_ALIGN.
7279    Otherwise, convert to a .fill 0.  */
7280 
7281 static void
7282 xtensa_fix_target_frags (void)
7283 {
7284   frchainS *frchP;
7285   asection *s;
7286 
7287   /* When this routine is called, all of the subsections are still intact
7288      so we walk over subsections instead of sections.  */
7289   for (s = stdoutput->sections; s; s = s->next)
7290     for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
7291       {
7292 	fragS *fragP;
7293 
7294 	/* Walk over all of the fragments in a subsection.  */
7295 	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
7296 	  {
7297 	    if (fragP->fr_type == rs_machine_dependent
7298 		&& fragP->fr_subtype == RELAX_DESIRE_ALIGN_IF_TARGET)
7299 	      {
7300 		if (next_frag_is_branch_target (fragP))
7301 		  fragP->fr_subtype = RELAX_DESIRE_ALIGN;
7302 		else
7303 		  frag_wane (fragP);
7304 	      }
7305 	  }
7306       }
7307 }
7308 
7309 
7310 static bfd_boolean is_narrow_branch_guaranteed_in_range (fragS *, TInsn *);
7311 
7312 static void
7313 xtensa_mark_narrow_branches (void)
7314 {
7315   frchainS *frchP;
7316   asection *s;
7317 
7318   for (s = stdoutput->sections; s; s = s->next)
7319     for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
7320       {
7321 	fragS *fragP;
7322 	/* Walk over all of the fragments in a subsection.  */
7323 	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
7324 	  {
7325 	    if (fragP->fr_type == rs_machine_dependent
7326 		&& fragP->fr_subtype == RELAX_SLOTS
7327 		&& fragP->tc_frag_data.slot_subtypes[0] == RELAX_IMMED)
7328 	      {
7329 		vliw_insn vinsn;
7330 
7331 		vinsn_from_chars (&vinsn, fragP->fr_opcode);
7332 		tinsn_immed_from_frag (&vinsn.slots[0], fragP, 0);
7333 
7334 		if (vinsn.num_slots == 1
7335 		    && xtensa_opcode_is_branch (xtensa_default_isa,
7336 						vinsn.slots[0].opcode) == 1
7337 		    && xg_get_single_size (vinsn.slots[0].opcode) == 2
7338 		    && is_narrow_branch_guaranteed_in_range (fragP,
7339 							     &vinsn.slots[0]))
7340 		  {
7341 		    fragP->fr_subtype = RELAX_SLOTS;
7342 		    fragP->tc_frag_data.slot_subtypes[0] = RELAX_NARROW;
7343 		    fragP->tc_frag_data.is_aligning_branch = 1;
7344 		  }
7345 	      }
7346 	  }
7347       }
7348 }
7349 
7350 
7351 /* A branch is typically widened only when its target is out of
7352    range.  However, we would like to widen them to align a subsequent
7353    branch target when possible.
7354 
7355    Because the branch relaxation code is so convoluted, the optimal solution
7356    (combining the two cases) is difficult to get right in all circumstances.
7357    We therefore go with an "almost as good" solution, where we only
7358    use for alignment narrow branches that definitely will not expand to a
7359    jump and a branch.  These functions find and mark these cases.  */
7360 
7361 /* The range in bytes of BNEZ.N and BEQZ.N.  The target operand is encoded
7362    as PC + 4 + imm6, where imm6 is a 6-bit immediate ranging from 0 to 63.
7363    We start counting beginning with the frag after the 2-byte branch, so the
7364    maximum offset is (4 - 2) + 63 = 65.  */
7365 #define MAX_IMMED6 65
7366 
7367 static offsetT unrelaxed_frag_max_size (fragS *);
7368 
7369 static bfd_boolean
7370 is_narrow_branch_guaranteed_in_range (fragS *fragP, TInsn *tinsn)
7371 {
7372   const expressionS *exp = &tinsn->tok[1];
7373   symbolS *symbolP = exp->X_add_symbol;
7374   offsetT max_distance = exp->X_add_number;
7375   fragS *target_frag;
7376 
7377   if (exp->X_op != O_symbol)
7378     return FALSE;
7379 
7380   target_frag = symbol_get_frag (symbolP);
7381 
7382   max_distance += (S_GET_VALUE (symbolP) - target_frag->fr_address);
7383   if (is_branch_jmp_to_next (tinsn, fragP))
7384     return FALSE;
7385 
7386   /* The branch doesn't branch over it's own frag,
7387      but over the subsequent ones.  */
7388   fragP = fragP->fr_next;
7389   while (fragP != NULL && fragP != target_frag && max_distance <= MAX_IMMED6)
7390     {
7391       max_distance += unrelaxed_frag_max_size (fragP);
7392       fragP = fragP->fr_next;
7393     }
7394   if (max_distance <= MAX_IMMED6 && fragP == target_frag)
7395     return TRUE;
7396   return FALSE;
7397 }
7398 
7399 
7400 static void
7401 xtensa_mark_zcl_first_insns (void)
7402 {
7403   frchainS *frchP;
7404   asection *s;
7405 
7406   for (s = stdoutput->sections; s; s = s->next)
7407     for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
7408       {
7409 	fragS *fragP;
7410 	/* Walk over all of the fragments in a subsection.  */
7411 	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
7412 	  {
7413 	    if (fragP->fr_type == rs_machine_dependent
7414 		&& (fragP->fr_subtype == RELAX_ALIGN_NEXT_OPCODE
7415 		    || fragP->fr_subtype == RELAX_CHECK_ALIGN_NEXT_OPCODE))
7416 	      {
7417 		/* Find the loop frag.  */
7418 		fragS *loop_frag = next_non_empty_frag (fragP);
7419 		/* Find the first insn frag.  */
7420 		fragS *targ_frag = next_non_empty_frag (loop_frag);
7421 
7422 	      /* Handle a corner case that comes up in hardware
7423 		 diagnostics.  The original assembly looks like this:
7424 
7425 		 loop aX, LabelA
7426 		 <empty_frag>--not found by next_non_empty_frag
7427 		 loop aY, LabelB
7428 
7429 		 Depending on the start address, the assembler may or
7430 		 may not change it to look something like this:
7431 
7432 		 loop aX, LabelA
7433 		 nop--frag isn't empty anymore
7434 		 loop aY, LabelB
7435 
7436 		 So set up to check the alignment of the nop if it
7437 		 exists  */
7438 		while (loop_frag != targ_frag)
7439 		  {
7440 		    if (loop_frag->fr_type == rs_machine_dependent
7441 			&& (loop_frag->fr_subtype == RELAX_ALIGN_NEXT_OPCODE
7442 			    || loop_frag->fr_subtype
7443 			    == RELAX_CHECK_ALIGN_NEXT_OPCODE))
7444 		      targ_frag = loop_frag;
7445 		    else
7446 		      loop_frag = loop_frag->fr_next;
7447 		  }
7448 
7449 		/* Of course, sometimes (mostly for toy test cases) a
7450 		   zero-cost loop instruction is the last in a section.  */
7451 		if (targ_frag)
7452 		  {
7453 		    targ_frag->tc_frag_data.is_first_loop_insn = TRUE;
7454 		    /* Do not widen a frag that is the first instruction of a
7455 		       zero-cost loop.  It makes that loop harder to align.  */
7456 		    if (targ_frag->fr_type == rs_machine_dependent
7457 			&& targ_frag->fr_subtype == RELAX_SLOTS
7458 			&& (targ_frag->tc_frag_data.slot_subtypes[0]
7459 			    == RELAX_NARROW))
7460 		      {
7461 			if (targ_frag->tc_frag_data.is_aligning_branch)
7462 			  targ_frag->tc_frag_data.slot_subtypes[0] = RELAX_IMMED;
7463 			else
7464 			  {
7465 			    frag_wane (targ_frag);
7466 			    targ_frag->tc_frag_data.slot_subtypes[0] = 0;
7467 			  }
7468 		      }
7469 		  }
7470 		if (fragP->fr_subtype == RELAX_CHECK_ALIGN_NEXT_OPCODE)
7471 		  frag_wane (fragP);
7472 	      }
7473 	  }
7474       }
7475 }
7476 
7477 
7478 /* When a difference-of-symbols expression is encoded as a uleb128 or
7479    sleb128 value, the linker is unable to adjust that value to account for
7480    link-time relaxation.  Mark all the code between such symbols so that
7481    its size cannot be changed by linker relaxation.  */
7482 
7483 static void
7484 xtensa_mark_difference_of_two_symbols (void)
7485 {
7486   symbolS *expr_sym;
7487 
7488   for (expr_sym = expr_symbols; expr_sym;
7489        expr_sym = symbol_get_tc (expr_sym)->next_expr_symbol)
7490     {
7491       expressionS *exp = symbol_get_value_expression (expr_sym);
7492 
7493       if (exp->X_op == O_subtract)
7494 	{
7495 	  symbolS *left = exp->X_add_symbol;
7496 	  symbolS *right = exp->X_op_symbol;
7497 
7498 	  /* Difference of two symbols not in the same section
7499 	     are handled with relocations in the linker.  */
7500 	  if (S_GET_SEGMENT (left) == S_GET_SEGMENT (right))
7501 	    {
7502 	      fragS *start;
7503 	      fragS *end;
7504 	      fragS *walk;
7505 
7506 	      if (symbol_get_frag (left)->fr_address
7507 		  <= symbol_get_frag (right)->fr_address)
7508 		{
7509 		  start = symbol_get_frag (left);
7510 		  end = symbol_get_frag (right);
7511 		}
7512 	      else
7513 		{
7514 		  start = symbol_get_frag (right);
7515 		  end = symbol_get_frag (left);
7516 		}
7517 
7518 	      if (start->tc_frag_data.no_transform_end != NULL)
7519 		walk = start->tc_frag_data.no_transform_end;
7520 	      else
7521 		walk = start;
7522 	      do
7523 		{
7524 		  walk->tc_frag_data.is_no_transform = 1;
7525 		  walk = walk->fr_next;
7526 		}
7527 	      while (walk && walk->fr_address < end->fr_address);
7528 
7529 	      start->tc_frag_data.no_transform_end = walk;
7530 	    }
7531 	}
7532     }
7533 }
7534 
7535 
7536 /* Re-process all of the fragments looking to convert all of the
7537    RELAX_ADD_NOP_IF_A0_B_RETW.  If the next instruction is a
7538    conditional branch or a retw/retw.n, convert this frag to one that
7539    will generate a NOP.  In any case close it off with a .fill 0.  */
7540 
7541 static bfd_boolean next_instrs_are_b_retw (fragS *);
7542 
7543 static void
7544 xtensa_fix_a0_b_retw_frags (void)
7545 {
7546   frchainS *frchP;
7547   asection *s;
7548 
7549   /* When this routine is called, all of the subsections are still intact
7550      so we walk over subsections instead of sections.  */
7551   for (s = stdoutput->sections; s; s = s->next)
7552     for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
7553       {
7554 	fragS *fragP;
7555 
7556 	/* Walk over all of the fragments in a subsection.  */
7557 	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
7558 	  {
7559 	    if (fragP->fr_type == rs_machine_dependent
7560 		&& fragP->fr_subtype == RELAX_ADD_NOP_IF_A0_B_RETW)
7561 	      {
7562 		if (next_instrs_are_b_retw (fragP))
7563 		  {
7564 		    if (fragP->tc_frag_data.is_no_transform)
7565 		      as_bad (_("instruction sequence (write a0, branch, retw) may trigger hardware errata"));
7566 		    else
7567 		      relax_frag_add_nop (fragP);
7568 		  }
7569 		frag_wane (fragP);
7570 	      }
7571 	  }
7572       }
7573 }
7574 
7575 
7576 static bfd_boolean
7577 next_instrs_are_b_retw (fragS *fragP)
7578 {
7579   xtensa_opcode opcode;
7580   xtensa_format fmt;
7581   const fragS *next_fragP = next_non_empty_frag (fragP);
7582   static xtensa_insnbuf insnbuf = NULL;
7583   static xtensa_insnbuf slotbuf = NULL;
7584   xtensa_isa isa = xtensa_default_isa;
7585   int offset = 0;
7586   int slot;
7587   bfd_boolean branch_seen = FALSE;
7588 
7589   if (!insnbuf)
7590     {
7591       insnbuf = xtensa_insnbuf_alloc (isa);
7592       slotbuf = xtensa_insnbuf_alloc (isa);
7593     }
7594 
7595   if (next_fragP == NULL)
7596     return FALSE;
7597 
7598   /* Check for the conditional branch.  */
7599   xtensa_insnbuf_from_chars
7600     (isa, insnbuf, (unsigned char *) &next_fragP->fr_literal[offset], 0);
7601   fmt = xtensa_format_decode (isa, insnbuf);
7602   if (fmt == XTENSA_UNDEFINED)
7603     return FALSE;
7604 
7605   for (slot = 0; slot < xtensa_format_num_slots (isa, fmt); slot++)
7606     {
7607       xtensa_format_get_slot (isa, fmt, slot, insnbuf, slotbuf);
7608       opcode = xtensa_opcode_decode (isa, fmt, slot, slotbuf);
7609 
7610       branch_seen = (branch_seen
7611 		     || xtensa_opcode_is_branch (isa, opcode) == 1);
7612     }
7613 
7614   if (!branch_seen)
7615     return FALSE;
7616 
7617   offset += xtensa_format_length (isa, fmt);
7618   if (offset == next_fragP->fr_fix)
7619     {
7620       next_fragP = next_non_empty_frag (next_fragP);
7621       offset = 0;
7622     }
7623 
7624   if (next_fragP == NULL)
7625     return FALSE;
7626 
7627   /* Check for the retw/retw.n.  */
7628   xtensa_insnbuf_from_chars
7629     (isa, insnbuf, (unsigned char *) &next_fragP->fr_literal[offset], 0);
7630   fmt = xtensa_format_decode (isa, insnbuf);
7631 
7632   /* Because RETW[.N] is not bundleable, a VLIW bundle here means that we
7633      have no problems.  */
7634   if (fmt == XTENSA_UNDEFINED
7635       || xtensa_format_num_slots (isa, fmt) != 1)
7636     return FALSE;
7637 
7638   xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf);
7639   opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
7640 
7641   if (opcode == xtensa_retw_opcode || opcode == xtensa_retw_n_opcode)
7642     return TRUE;
7643 
7644   return FALSE;
7645 }
7646 
7647 
7648 /* Re-process all of the fragments looking to convert all of the
7649    RELAX_ADD_NOP_IF_PRE_LOOP_END.  If there is one instruction and a
7650    loop end label, convert this frag to one that will generate a NOP.
7651    In any case close it off with a .fill 0.  */
7652 
7653 static bfd_boolean next_instr_is_loop_end (fragS *);
7654 
7655 static void
7656 xtensa_fix_b_j_loop_end_frags (void)
7657 {
7658   frchainS *frchP;
7659   asection *s;
7660 
7661   /* When this routine is called, all of the subsections are still intact
7662      so we walk over subsections instead of sections.  */
7663   for (s = stdoutput->sections; s; s = s->next)
7664     for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
7665       {
7666 	fragS *fragP;
7667 
7668 	/* Walk over all of the fragments in a subsection.  */
7669 	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
7670 	  {
7671 	    if (fragP->fr_type == rs_machine_dependent
7672 		&& fragP->fr_subtype == RELAX_ADD_NOP_IF_PRE_LOOP_END)
7673 	      {
7674 		if (next_instr_is_loop_end (fragP))
7675 		  {
7676 		    if (fragP->tc_frag_data.is_no_transform)
7677 		      as_bad (_("branching or jumping to a loop end may trigger hardware errata"));
7678 		    else
7679 		      relax_frag_add_nop (fragP);
7680 		  }
7681 		frag_wane (fragP);
7682 	      }
7683 	  }
7684       }
7685 }
7686 
7687 
7688 static bfd_boolean
7689 next_instr_is_loop_end (fragS *fragP)
7690 {
7691   const fragS *next_fragP;
7692 
7693   if (next_frag_is_loop_target (fragP))
7694     return FALSE;
7695 
7696   next_fragP = next_non_empty_frag (fragP);
7697   if (next_fragP == NULL)
7698     return FALSE;
7699 
7700   if (!next_frag_is_loop_target (next_fragP))
7701     return FALSE;
7702 
7703   /* If the size is >= 3 then there is more than one instruction here.
7704      The hardware bug will not fire.  */
7705   if (next_fragP->fr_fix > 3)
7706     return FALSE;
7707 
7708   return TRUE;
7709 }
7710 
7711 
7712 /* Re-process all of the fragments looking to convert all of the
7713    RELAX_ADD_NOP_IF_CLOSE_LOOP_END.  If there is an loop end that is
7714    not MY loop's loop end within 12 bytes, add enough nops here to
7715    make it at least 12 bytes away.  In any case close it off with a
7716    .fill 0.  */
7717 
7718 static offsetT min_bytes_to_other_loop_end
7719   (fragS *, fragS *, offsetT);
7720 
7721 static void
7722 xtensa_fix_close_loop_end_frags (void)
7723 {
7724   frchainS *frchP;
7725   asection *s;
7726 
7727   /* When this routine is called, all of the subsections are still intact
7728      so we walk over subsections instead of sections.  */
7729   for (s = stdoutput->sections; s; s = s->next)
7730     for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
7731       {
7732 	fragS *fragP;
7733 
7734 	fragS *current_target = NULL;
7735 
7736 	/* Walk over all of the fragments in a subsection.  */
7737 	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
7738 	  {
7739 	    if (fragP->fr_type == rs_machine_dependent
7740 		&& ((fragP->fr_subtype == RELAX_ALIGN_NEXT_OPCODE)
7741 		    || (fragP->fr_subtype == RELAX_CHECK_ALIGN_NEXT_OPCODE)))
7742 	      current_target = symbol_get_frag (fragP->fr_symbol);
7743 
7744 	    if (current_target
7745 		&& fragP->fr_type == rs_machine_dependent
7746 		&& fragP->fr_subtype == RELAX_ADD_NOP_IF_CLOSE_LOOP_END)
7747 	      {
7748 		offsetT min_bytes;
7749 		int bytes_added = 0;
7750 
7751 #define REQUIRED_LOOP_DIVIDING_BYTES 12
7752 		/* Max out at 12.  */
7753 		min_bytes = min_bytes_to_other_loop_end
7754 		  (fragP->fr_next, current_target, REQUIRED_LOOP_DIVIDING_BYTES);
7755 
7756 		if (min_bytes < REQUIRED_LOOP_DIVIDING_BYTES)
7757 		  {
7758 		    if (fragP->tc_frag_data.is_no_transform)
7759 		      as_bad (_("loop end too close to another loop end may trigger hardware errata"));
7760 		    else
7761 		      {
7762 			while (min_bytes + bytes_added
7763 			       < REQUIRED_LOOP_DIVIDING_BYTES)
7764 			  {
7765 			    int length = 3;
7766 
7767 			    if (fragP->fr_var < length)
7768 			      as_fatal (_("fr_var %lu < length %d"),
7769 					(long) fragP->fr_var, length);
7770 			    else
7771 			      {
7772 				assemble_nop (length,
7773 					      fragP->fr_literal + fragP->fr_fix);
7774 				fragP->fr_fix += length;
7775 				fragP->fr_var -= length;
7776 			      }
7777 			    bytes_added += length;
7778 			  }
7779 		      }
7780 		  }
7781 		frag_wane (fragP);
7782 	      }
7783 	    gas_assert (fragP->fr_type != rs_machine_dependent
7784 		    || fragP->fr_subtype != RELAX_ADD_NOP_IF_CLOSE_LOOP_END);
7785 	  }
7786       }
7787 }
7788 
7789 
7790 static offsetT unrelaxed_frag_min_size (fragS *);
7791 
7792 static offsetT
7793 min_bytes_to_other_loop_end (fragS *fragP,
7794 			     fragS *current_target,
7795 			     offsetT max_size)
7796 {
7797   offsetT offset = 0;
7798   fragS *current_fragP;
7799 
7800   for (current_fragP = fragP;
7801        current_fragP;
7802        current_fragP = current_fragP->fr_next)
7803     {
7804       if (current_fragP->tc_frag_data.is_loop_target
7805 	  && current_fragP != current_target)
7806 	return offset;
7807 
7808       offset += unrelaxed_frag_min_size (current_fragP);
7809 
7810       if (offset >= max_size)
7811 	return max_size;
7812     }
7813   return max_size;
7814 }
7815 
7816 
7817 static offsetT
7818 unrelaxed_frag_min_size (fragS *fragP)
7819 {
7820   offsetT size = fragP->fr_fix;
7821 
7822   /* Add fill size.  */
7823   if (fragP->fr_type == rs_fill)
7824     size += fragP->fr_offset;
7825 
7826   return size;
7827 }
7828 
7829 
7830 static offsetT
7831 unrelaxed_frag_max_size (fragS *fragP)
7832 {
7833   offsetT size = fragP->fr_fix;
7834   switch (fragP->fr_type)
7835     {
7836     case 0:
7837       /* Empty frags created by the obstack allocation scheme
7838 	 end up with type 0.  */
7839       break;
7840     case rs_fill:
7841     case rs_org:
7842     case rs_space:
7843       size += fragP->fr_offset;
7844       break;
7845     case rs_align:
7846     case rs_align_code:
7847     case rs_align_test:
7848     case rs_leb128:
7849     case rs_cfa:
7850     case rs_dwarf2dbg:
7851       /* No further adjustments needed.  */
7852       break;
7853     case rs_machine_dependent:
7854       if (fragP->fr_subtype != RELAX_DESIRE_ALIGN)
7855 	size += fragP->fr_var;
7856       break;
7857     default:
7858       /* We had darn well better know how big it is.  */
7859       gas_assert (0);
7860       break;
7861     }
7862 
7863   return size;
7864 }
7865 
7866 
7867 /* Re-process all of the fragments looking to convert all
7868    of the RELAX_ADD_NOP_IF_SHORT_LOOP.  If:
7869 
7870    A)
7871      1) the instruction size count to the loop end label
7872         is too short (<= 2 instructions),
7873      2) loop has a jump or branch in it
7874 
7875    or B)
7876      1) workaround_all_short_loops is TRUE
7877      2) The generating loop was a  'loopgtz' or 'loopnez'
7878      3) the instruction size count to the loop end label is too short
7879         (<= 2 instructions)
7880    then convert this frag (and maybe the next one) to generate a NOP.
7881    In any case close it off with a .fill 0.  */
7882 
7883 static int count_insns_to_loop_end (fragS *, bfd_boolean, int);
7884 static bfd_boolean branch_before_loop_end (fragS *);
7885 
7886 static void
7887 xtensa_fix_short_loop_frags (void)
7888 {
7889   frchainS *frchP;
7890   asection *s;
7891 
7892   /* When this routine is called, all of the subsections are still intact
7893      so we walk over subsections instead of sections.  */
7894   for (s = stdoutput->sections; s; s = s->next)
7895     for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
7896       {
7897 	fragS *fragP;
7898 	xtensa_opcode current_opcode = XTENSA_UNDEFINED;
7899 
7900 	/* Walk over all of the fragments in a subsection.  */
7901 	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
7902 	  {
7903 	    if (fragP->fr_type == rs_machine_dependent
7904 		&& ((fragP->fr_subtype == RELAX_ALIGN_NEXT_OPCODE)
7905 		    || (fragP->fr_subtype == RELAX_CHECK_ALIGN_NEXT_OPCODE)))
7906 	      {
7907 		TInsn t_insn;
7908 		fragS *loop_frag = next_non_empty_frag (fragP);
7909 		tinsn_from_chars (&t_insn, loop_frag->fr_opcode, 0);
7910 		current_opcode = t_insn.opcode;
7911 		gas_assert (xtensa_opcode_is_loop (xtensa_default_isa,
7912 					       current_opcode) == 1);
7913 	      }
7914 
7915 	    if (fragP->fr_type == rs_machine_dependent
7916 		&& fragP->fr_subtype == RELAX_ADD_NOP_IF_SHORT_LOOP)
7917 	      {
7918 		if (count_insns_to_loop_end (fragP->fr_next, TRUE, 3) < 3
7919 		    && (branch_before_loop_end (fragP->fr_next)
7920 			|| (workaround_all_short_loops
7921 			    && current_opcode != XTENSA_UNDEFINED
7922 			    && current_opcode != xtensa_loop_opcode)))
7923 		  {
7924 		    if (fragP->tc_frag_data.is_no_transform)
7925 		      as_bad (_("loop containing less than three instructions may trigger hardware errata"));
7926 		    else
7927 		      relax_frag_add_nop (fragP);
7928 		  }
7929 		frag_wane (fragP);
7930 	      }
7931 	  }
7932       }
7933 }
7934 
7935 
7936 static int unrelaxed_frag_min_insn_count (fragS *);
7937 
7938 static int
7939 count_insns_to_loop_end (fragS *base_fragP,
7940 			 bfd_boolean count_relax_add,
7941 			 int max_count)
7942 {
7943   fragS *fragP = NULL;
7944   int insn_count = 0;
7945 
7946   fragP = base_fragP;
7947 
7948   for (; fragP && !fragP->tc_frag_data.is_loop_target; fragP = fragP->fr_next)
7949     {
7950       insn_count += unrelaxed_frag_min_insn_count (fragP);
7951       if (insn_count >= max_count)
7952 	return max_count;
7953 
7954       if (count_relax_add)
7955 	{
7956 	  if (fragP->fr_type == rs_machine_dependent
7957 	      && fragP->fr_subtype == RELAX_ADD_NOP_IF_SHORT_LOOP)
7958 	    {
7959 	      /* In order to add the appropriate number of
7960 	         NOPs, we count an instruction for downstream
7961 	         occurrences.  */
7962 	      insn_count++;
7963 	      if (insn_count >= max_count)
7964 		return max_count;
7965 	    }
7966 	}
7967     }
7968   return insn_count;
7969 }
7970 
7971 
7972 static int
7973 unrelaxed_frag_min_insn_count (fragS *fragP)
7974 {
7975   xtensa_isa isa = xtensa_default_isa;
7976   static xtensa_insnbuf insnbuf = NULL;
7977   int insn_count = 0;
7978   int offset = 0;
7979 
7980   if (!fragP->tc_frag_data.is_insn)
7981     return insn_count;
7982 
7983   if (!insnbuf)
7984     insnbuf = xtensa_insnbuf_alloc (isa);
7985 
7986   /* Decode the fixed instructions.  */
7987   while (offset < fragP->fr_fix)
7988     {
7989       xtensa_format fmt;
7990 
7991       xtensa_insnbuf_from_chars
7992 	(isa, insnbuf, (unsigned char *) fragP->fr_literal + offset, 0);
7993       fmt = xtensa_format_decode (isa, insnbuf);
7994 
7995       if (fmt == XTENSA_UNDEFINED)
7996 	{
7997 	  as_fatal (_("undecodable instruction in instruction frag"));
7998 	  return insn_count;
7999 	}
8000       offset += xtensa_format_length (isa, fmt);
8001       insn_count++;
8002     }
8003 
8004   return insn_count;
8005 }
8006 
8007 
8008 static bfd_boolean unrelaxed_frag_has_b_j (fragS *);
8009 
8010 static bfd_boolean
8011 branch_before_loop_end (fragS *base_fragP)
8012 {
8013   fragS *fragP;
8014 
8015   for (fragP = base_fragP;
8016        fragP && !fragP->tc_frag_data.is_loop_target;
8017        fragP = fragP->fr_next)
8018     {
8019       if (unrelaxed_frag_has_b_j (fragP))
8020 	return TRUE;
8021     }
8022   return FALSE;
8023 }
8024 
8025 
8026 static bfd_boolean
8027 unrelaxed_frag_has_b_j (fragS *fragP)
8028 {
8029   static xtensa_insnbuf insnbuf = NULL;
8030   xtensa_isa isa = xtensa_default_isa;
8031   int offset = 0;
8032 
8033   if (!fragP->tc_frag_data.is_insn)
8034     return FALSE;
8035 
8036   if (!insnbuf)
8037     insnbuf = xtensa_insnbuf_alloc (isa);
8038 
8039   /* Decode the fixed instructions.  */
8040   while (offset < fragP->fr_fix)
8041     {
8042       xtensa_format fmt;
8043       int slot;
8044 
8045       xtensa_insnbuf_from_chars
8046 	(isa, insnbuf, (unsigned char *) fragP->fr_literal + offset, 0);
8047       fmt = xtensa_format_decode (isa, insnbuf);
8048       if (fmt == XTENSA_UNDEFINED)
8049 	return FALSE;
8050 
8051       for (slot = 0; slot < xtensa_format_num_slots (isa, fmt); slot++)
8052 	{
8053 	  xtensa_opcode opcode =
8054 	    get_opcode_from_buf (fragP->fr_literal + offset, slot);
8055 	  if (xtensa_opcode_is_branch (isa, opcode) == 1
8056 	      || xtensa_opcode_is_jump (isa, opcode) == 1)
8057 	    return TRUE;
8058 	}
8059       offset += xtensa_format_length (isa, fmt);
8060     }
8061   return FALSE;
8062 }
8063 
8064 
8065 /* Checks to be made after initial assembly but before relaxation.  */
8066 
8067 static bfd_boolean is_empty_loop (const TInsn *, fragS *);
8068 static bfd_boolean is_local_forward_loop (const TInsn *, fragS *);
8069 
8070 static void
8071 xtensa_sanity_check (void)
8072 {
8073   char *file_name;
8074   unsigned line;
8075   frchainS *frchP;
8076   asection *s;
8077 
8078   as_where (&file_name, &line);
8079   for (s = stdoutput->sections; s; s = s->next)
8080     for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
8081       {
8082 	fragS *fragP;
8083 
8084 	/* Walk over all of the fragments in a subsection.  */
8085 	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
8086 	  {
8087 	    if (fragP->fr_type == rs_machine_dependent
8088 		&& fragP->fr_subtype == RELAX_SLOTS
8089 		&& fragP->tc_frag_data.slot_subtypes[0] == RELAX_IMMED)
8090 	      {
8091 		static xtensa_insnbuf insnbuf = NULL;
8092 		TInsn t_insn;
8093 
8094 		if (fragP->fr_opcode != NULL)
8095 		  {
8096 		    if (!insnbuf)
8097 		      insnbuf = xtensa_insnbuf_alloc (xtensa_default_isa);
8098 		    tinsn_from_chars (&t_insn, fragP->fr_opcode, 0);
8099 		    tinsn_immed_from_frag (&t_insn, fragP, 0);
8100 
8101 		    if (xtensa_opcode_is_loop (xtensa_default_isa,
8102 					       t_insn.opcode) == 1)
8103 		      {
8104 			if (is_empty_loop (&t_insn, fragP))
8105 			  {
8106 			    new_logical_line (fragP->fr_file, fragP->fr_line);
8107 			    as_bad (_("invalid empty loop"));
8108 			  }
8109 			if (!is_local_forward_loop (&t_insn, fragP))
8110 			  {
8111 			    new_logical_line (fragP->fr_file, fragP->fr_line);
8112 			    as_bad (_("loop target does not follow "
8113 				      "loop instruction in section"));
8114 			  }
8115 		      }
8116 		  }
8117 	      }
8118 	  }
8119       }
8120   new_logical_line (file_name, line);
8121 }
8122 
8123 
8124 #define LOOP_IMMED_OPN 1
8125 
8126 /* Return TRUE if the loop target is the next non-zero fragment.  */
8127 
8128 static bfd_boolean
8129 is_empty_loop (const TInsn *insn, fragS *fragP)
8130 {
8131   const expressionS *exp;
8132   symbolS *symbolP;
8133   fragS *next_fragP;
8134 
8135   if (insn->insn_type != ITYPE_INSN)
8136     return FALSE;
8137 
8138   if (xtensa_opcode_is_loop (xtensa_default_isa, insn->opcode) != 1)
8139     return FALSE;
8140 
8141   if (insn->ntok <= LOOP_IMMED_OPN)
8142     return FALSE;
8143 
8144   exp = &insn->tok[LOOP_IMMED_OPN];
8145 
8146   if (exp->X_op != O_symbol)
8147     return FALSE;
8148 
8149   symbolP = exp->X_add_symbol;
8150   if (!symbolP)
8151     return FALSE;
8152 
8153   if (symbol_get_frag (symbolP) == NULL)
8154     return FALSE;
8155 
8156   if (S_GET_VALUE (symbolP) != 0)
8157     return FALSE;
8158 
8159   /* Walk through the zero-size fragments from this one.  If we find
8160      the target fragment, then this is a zero-size loop.  */
8161 
8162   for (next_fragP = fragP->fr_next;
8163        next_fragP != NULL;
8164        next_fragP = next_fragP->fr_next)
8165     {
8166       if (next_fragP == symbol_get_frag (symbolP))
8167 	return TRUE;
8168       if (next_fragP->fr_fix != 0)
8169 	return FALSE;
8170     }
8171   return FALSE;
8172 }
8173 
8174 
8175 static bfd_boolean
8176 is_local_forward_loop (const TInsn *insn, fragS *fragP)
8177 {
8178   const expressionS *exp;
8179   symbolS *symbolP;
8180   fragS *next_fragP;
8181 
8182   if (insn->insn_type != ITYPE_INSN)
8183     return FALSE;
8184 
8185   if (xtensa_opcode_is_loop (xtensa_default_isa, insn->opcode) != 1)
8186     return FALSE;
8187 
8188   if (insn->ntok <= LOOP_IMMED_OPN)
8189     return FALSE;
8190 
8191   exp = &insn->tok[LOOP_IMMED_OPN];
8192 
8193   if (exp->X_op != O_symbol)
8194     return FALSE;
8195 
8196   symbolP = exp->X_add_symbol;
8197   if (!symbolP)
8198     return FALSE;
8199 
8200   if (symbol_get_frag (symbolP) == NULL)
8201     return FALSE;
8202 
8203   /* Walk through fragments until we find the target.
8204      If we do not find the target, then this is an invalid loop.  */
8205 
8206   for (next_fragP = fragP->fr_next;
8207        next_fragP != NULL;
8208        next_fragP = next_fragP->fr_next)
8209     {
8210       if (next_fragP == symbol_get_frag (symbolP))
8211 	return TRUE;
8212     }
8213 
8214   return FALSE;
8215 }
8216 
8217 
8218 #define XTINFO_NAME "Xtensa_Info"
8219 #define XTINFO_NAMESZ 12
8220 #define XTINFO_TYPE 1
8221 
8222 static void
8223 xtensa_add_config_info (void)
8224 {
8225   asection *info_sec;
8226   char *data, *p;
8227   int sz;
8228 
8229   info_sec = subseg_new (".xtensa.info", 0);
8230   bfd_set_section_flags (stdoutput, info_sec, SEC_HAS_CONTENTS | SEC_READONLY);
8231 
8232   data = xmalloc (100);
8233   sprintf (data, "USE_ABSOLUTE_LITERALS=%d\nABI=%d\n",
8234 	   XSHAL_USE_ABSOLUTE_LITERALS, XSHAL_ABI);
8235   sz = strlen (data) + 1;
8236 
8237   /* Add enough null terminators to pad to a word boundary.  */
8238   do
8239     data[sz++] = 0;
8240   while ((sz & 3) != 0);
8241 
8242   /* Follow the standard note section layout:
8243      First write the length of the name string.  */
8244   p = frag_more (4);
8245   md_number_to_chars (p, (valueT) XTINFO_NAMESZ, 4);
8246 
8247   /* Next comes the length of the "descriptor", i.e., the actual data.  */
8248   p = frag_more (4);
8249   md_number_to_chars (p, (valueT) sz, 4);
8250 
8251   /* Write the note type.  */
8252   p = frag_more (4);
8253   md_number_to_chars (p, (valueT) XTINFO_TYPE, 4);
8254 
8255   /* Write the name field.  */
8256   p = frag_more (XTINFO_NAMESZ);
8257   memcpy (p, XTINFO_NAME, XTINFO_NAMESZ);
8258 
8259   /* Finally, write the descriptor.  */
8260   p = frag_more (sz);
8261   memcpy (p, data, sz);
8262 
8263   free (data);
8264 }
8265 
8266 
8267 /* Alignment Functions.  */
8268 
8269 static int
8270 get_text_align_power (unsigned target_size)
8271 {
8272   if (target_size <= 4)
8273     return 2;
8274 
8275   if (target_size <= 8)
8276     return 3;
8277 
8278   if (target_size <= 16)
8279     return 4;
8280 
8281   if (target_size <= 32)
8282     return 5;
8283 
8284   if (target_size <= 64)
8285     return 6;
8286 
8287   if (target_size <= 128)
8288     return 7;
8289 
8290   if (target_size <= 256)
8291     return 8;
8292 
8293   if (target_size <= 512)
8294     return 9;
8295 
8296   if (target_size <= 1024)
8297     return 10;
8298 
8299   gas_assert (0);
8300   return 0;
8301 }
8302 
8303 
8304 static int
8305 get_text_align_max_fill_size (int align_pow,
8306 			      bfd_boolean use_nops,
8307 			      bfd_boolean use_no_density)
8308 {
8309   if (!use_nops)
8310     return (1 << align_pow);
8311   if (use_no_density)
8312     return 3 * (1 << align_pow);
8313 
8314   return 1 + (1 << align_pow);
8315 }
8316 
8317 
8318 /* Calculate the minimum bytes of fill needed at "address" to align a
8319    target instruction of size "target_size" so that it does not cross a
8320    power-of-two boundary specified by "align_pow".  If "use_nops" is FALSE,
8321    the fill can be an arbitrary number of bytes.  Otherwise, the space must
8322    be filled by NOP instructions.  */
8323 
8324 static int
8325 get_text_align_fill_size (addressT address,
8326 			  int align_pow,
8327 			  int target_size,
8328 			  bfd_boolean use_nops,
8329 			  bfd_boolean use_no_density)
8330 {
8331   addressT alignment, fill, fill_limit, fill_step;
8332   bfd_boolean skip_one = FALSE;
8333 
8334   alignment = (1 << align_pow);
8335   gas_assert (target_size > 0 && alignment >= (addressT) target_size);
8336 
8337   if (!use_nops)
8338     {
8339       fill_limit = alignment;
8340       fill_step = 1;
8341     }
8342   else if (!use_no_density)
8343     {
8344       /* Combine 2- and 3-byte NOPs to fill anything larger than one.  */
8345       fill_limit = alignment * 2;
8346       fill_step = 1;
8347       skip_one = TRUE;
8348     }
8349   else
8350     {
8351       /* Fill with 3-byte NOPs -- can only fill multiples of 3.  */
8352       fill_limit = alignment * 3;
8353       fill_step = 3;
8354     }
8355 
8356   /* Try all fill sizes until finding one that works.  */
8357   for (fill = 0; fill < fill_limit; fill += fill_step)
8358     {
8359       if (skip_one && fill == 1)
8360 	continue;
8361       if ((address + fill) >> align_pow
8362 	  == (address + fill + target_size - 1) >> align_pow)
8363 	return fill;
8364     }
8365   gas_assert (0);
8366   return 0;
8367 }
8368 
8369 
8370 static int
8371 branch_align_power (segT sec)
8372 {
8373   /* If the Xtensa processor has a fetch width of X, and
8374      the section is aligned to at least that boundary, then a branch
8375      target need only fit within that aligned block of memory to avoid
8376      a stall.  Otherwise, try to fit branch targets within 4-byte
8377      aligned blocks (which may be insufficient, e.g., if the section
8378      has no alignment, but it's good enough).  */
8379   int fetch_align = get_text_align_power(xtensa_fetch_width);
8380   int sec_align = get_recorded_alignment (sec);
8381 
8382   if (sec_align >= fetch_align)
8383     return fetch_align;
8384 
8385   return 2;
8386 }
8387 
8388 
8389 /* This will assert if it is not possible.  */
8390 
8391 static int
8392 get_text_align_nop_count (offsetT fill_size, bfd_boolean use_no_density)
8393 {
8394   int count = 0;
8395 
8396   if (use_no_density)
8397     {
8398       gas_assert (fill_size % 3 == 0);
8399       return (fill_size / 3);
8400     }
8401 
8402   gas_assert (fill_size != 1);	/* Bad argument.  */
8403 
8404   while (fill_size > 1)
8405     {
8406       int insn_size = 3;
8407       if (fill_size == 2 || fill_size == 4)
8408 	insn_size = 2;
8409       fill_size -= insn_size;
8410       count++;
8411     }
8412   gas_assert (fill_size != 1);	/* Bad algorithm.  */
8413   return count;
8414 }
8415 
8416 
8417 static int
8418 get_text_align_nth_nop_size (offsetT fill_size,
8419 			     int n,
8420 			     bfd_boolean use_no_density)
8421 {
8422   int count = 0;
8423 
8424   if (use_no_density)
8425     return 3;
8426 
8427   gas_assert (fill_size != 1);	/* Bad argument.  */
8428 
8429   while (fill_size > 1)
8430     {
8431       int insn_size = 3;
8432       if (fill_size == 2 || fill_size == 4)
8433 	insn_size = 2;
8434       fill_size -= insn_size;
8435       count++;
8436       if (n + 1 == count)
8437 	return insn_size;
8438     }
8439   gas_assert (0);
8440   return 0;
8441 }
8442 
8443 
8444 /* For the given fragment, find the appropriate address
8445    for it to begin at if we are using NOPs to align it.  */
8446 
8447 static addressT
8448 get_noop_aligned_address (fragS *fragP, addressT address)
8449 {
8450   /* The rule is: get next fragment's FIRST instruction.  Find
8451      the smallest number of bytes that need to be added to
8452      ensure that the next fragment's FIRST instruction will fit
8453      in a single word.
8454 
8455      E.G.,   2 bytes : 0, 1, 2 mod 4
8456 	     3 bytes: 0, 1 mod 4
8457 
8458      If the FIRST instruction MIGHT be relaxed,
8459      assume that it will become a 3-byte instruction.
8460 
8461      Note again here that LOOP instructions are not bundleable,
8462      and this relaxation only applies to LOOP opcodes.  */
8463 
8464   int fill_size = 0;
8465   int first_insn_size;
8466   int loop_insn_size;
8467   addressT pre_opcode_bytes;
8468   int align_power;
8469   fragS *first_insn;
8470   xtensa_opcode opcode;
8471   bfd_boolean is_loop;
8472 
8473   gas_assert (fragP->fr_type == rs_machine_dependent);
8474   gas_assert (fragP->fr_subtype == RELAX_ALIGN_NEXT_OPCODE);
8475 
8476   /* Find the loop frag.  */
8477   first_insn = next_non_empty_frag (fragP);
8478   /* Now find the first insn frag.  */
8479   first_insn = next_non_empty_frag (first_insn);
8480 
8481   is_loop = next_frag_opcode_is_loop (fragP, &opcode);
8482   gas_assert (is_loop);
8483   loop_insn_size = xg_get_single_size (opcode);
8484 
8485   pre_opcode_bytes = next_frag_pre_opcode_bytes (fragP);
8486   pre_opcode_bytes += loop_insn_size;
8487 
8488   /* For loops, the alignment depends on the size of the
8489      instruction following the loop, not the LOOP instruction.  */
8490 
8491   if (first_insn == NULL)
8492     first_insn_size = xtensa_fetch_width;
8493   else
8494     first_insn_size = get_loop_align_size (frag_format_size (first_insn));
8495 
8496   /* If it was 8, then we'll need a larger alignment for the section.  */
8497   align_power = get_text_align_power (first_insn_size);
8498   record_alignment (now_seg, align_power);
8499 
8500   fill_size = get_text_align_fill_size
8501     (address + pre_opcode_bytes, align_power, first_insn_size, TRUE,
8502      fragP->tc_frag_data.is_no_density);
8503 
8504   return address + fill_size;
8505 }
8506 
8507 
8508 /* 3 mechanisms for relaxing an alignment:
8509 
8510    Align to a power of 2.
8511    Align so the next fragment's instruction does not cross a word boundary.
8512    Align the current instruction so that if the next instruction
8513        were 3 bytes, it would not cross a word boundary.
8514 
8515    We can align with:
8516 
8517    zeros    - This is easy; always insert zeros.
8518    nops     - 3-byte and 2-byte instructions
8519               2 - 2-byte nop
8520               3 - 3-byte nop
8521               4 - 2 2-byte nops
8522               >=5 : 3-byte instruction + fn (n-3)
8523    widening - widen previous instructions.  */
8524 
8525 static offsetT
8526 get_aligned_diff (fragS *fragP, addressT address, offsetT *max_diff)
8527 {
8528   addressT target_address, loop_insn_offset;
8529   int target_size;
8530   xtensa_opcode loop_opcode;
8531   bfd_boolean is_loop;
8532   int align_power;
8533   offsetT opt_diff;
8534   offsetT branch_align;
8535   fragS *loop_frag;
8536 
8537   gas_assert (fragP->fr_type == rs_machine_dependent);
8538   switch (fragP->fr_subtype)
8539     {
8540     case RELAX_DESIRE_ALIGN:
8541       target_size = next_frag_format_size (fragP);
8542       if (target_size == XTENSA_UNDEFINED)
8543 	target_size = 3;
8544       align_power = branch_align_power (now_seg);
8545       branch_align = 1 << align_power;
8546       /* Don't count on the section alignment being as large as the target.  */
8547       if (target_size > branch_align)
8548 	target_size = branch_align;
8549       opt_diff = get_text_align_fill_size (address, align_power,
8550 					   target_size, FALSE, FALSE);
8551 
8552       *max_diff = (opt_diff + branch_align
8553 		   - (target_size + ((address + opt_diff) % branch_align)));
8554       gas_assert (*max_diff >= opt_diff);
8555       return opt_diff;
8556 
8557     case RELAX_ALIGN_NEXT_OPCODE:
8558       /* The next non-empty frag after this one holds the LOOP instruction
8559 	 that needs to be aligned.  The required alignment depends on the
8560 	 size of the next non-empty frag after the loop frag, i.e., the
8561 	 first instruction in the loop.  */
8562       loop_frag = next_non_empty_frag (fragP);
8563       target_size = get_loop_align_size (next_frag_format_size (loop_frag));
8564       loop_insn_offset = 0;
8565       is_loop = next_frag_opcode_is_loop (fragP, &loop_opcode);
8566       gas_assert (is_loop);
8567 
8568       /* If the loop has been expanded then the LOOP instruction
8569 	 could be at an offset from this fragment.  */
8570       if (loop_frag->tc_frag_data.slot_subtypes[0] != RELAX_IMMED)
8571 	loop_insn_offset = get_expanded_loop_offset (loop_opcode);
8572 
8573       /* In an ideal world, which is what we are shooting for here,
8574 	 we wouldn't need to use any NOPs immediately prior to the
8575 	 LOOP instruction.  If this approach fails, relax_frag_loop_align
8576 	 will call get_noop_aligned_address.  */
8577       target_address =
8578 	address + loop_insn_offset + xg_get_single_size (loop_opcode);
8579       align_power = get_text_align_power (target_size);
8580       opt_diff = get_text_align_fill_size (target_address, align_power,
8581 					   target_size, FALSE, FALSE);
8582 
8583       *max_diff = xtensa_fetch_width
8584 	- ((target_address + opt_diff) % xtensa_fetch_width)
8585 	- target_size + opt_diff;
8586       gas_assert (*max_diff >= opt_diff);
8587       return opt_diff;
8588 
8589     default:
8590       break;
8591     }
8592   gas_assert (0);
8593   return 0;
8594 }
8595 
8596 
8597 /* md_relax_frag Hook and Helper Functions.  */
8598 
8599 static long relax_frag_loop_align (fragS *, long);
8600 static long relax_frag_for_align (fragS *, long);
8601 static long relax_frag_immed
8602   (segT, fragS *, long, int, xtensa_format, int, int *, bfd_boolean);
8603 
8604 
8605 /* Return the number of bytes added to this fragment, given that the
8606    input has been stretched already by "stretch".  */
8607 
8608 long
8609 xtensa_relax_frag (fragS *fragP, long stretch, int *stretched_p)
8610 {
8611   xtensa_isa isa = xtensa_default_isa;
8612   int unreported = fragP->tc_frag_data.unreported_expansion;
8613   long new_stretch = 0;
8614   char *file_name;
8615   unsigned line;
8616   int lit_size;
8617   static xtensa_insnbuf vbuf = NULL;
8618   int slot, num_slots;
8619   xtensa_format fmt;
8620 
8621   as_where (&file_name, &line);
8622   new_logical_line (fragP->fr_file, fragP->fr_line);
8623 
8624   fragP->tc_frag_data.unreported_expansion = 0;
8625 
8626   switch (fragP->fr_subtype)
8627     {
8628     case RELAX_ALIGN_NEXT_OPCODE:
8629       /* Always convert.  */
8630       if (fragP->tc_frag_data.relax_seen)
8631 	new_stretch = relax_frag_loop_align (fragP, stretch);
8632       break;
8633 
8634     case RELAX_LOOP_END:
8635       /* Do nothing.  */
8636       break;
8637 
8638     case RELAX_LOOP_END_ADD_NOP:
8639       /* Add a NOP and switch to .fill 0.  */
8640       new_stretch = relax_frag_add_nop (fragP);
8641       frag_wane (fragP);
8642       break;
8643 
8644     case RELAX_DESIRE_ALIGN:
8645       /* Do nothing. The narrowing before this frag will either align
8646          it or not.  */
8647       break;
8648 
8649     case RELAX_LITERAL:
8650     case RELAX_LITERAL_FINAL:
8651       return 0;
8652 
8653     case RELAX_LITERAL_NR:
8654       lit_size = 4;
8655       fragP->fr_subtype = RELAX_LITERAL_FINAL;
8656       gas_assert (unreported == lit_size);
8657       memset (&fragP->fr_literal[fragP->fr_fix], 0, 4);
8658       fragP->fr_var -= lit_size;
8659       fragP->fr_fix += lit_size;
8660       new_stretch = 4;
8661       break;
8662 
8663     case RELAX_SLOTS:
8664       if (vbuf == NULL)
8665 	vbuf = xtensa_insnbuf_alloc (isa);
8666 
8667       xtensa_insnbuf_from_chars
8668 	(isa, vbuf, (unsigned char *) fragP->fr_opcode, 0);
8669       fmt = xtensa_format_decode (isa, vbuf);
8670       num_slots = xtensa_format_num_slots (isa, fmt);
8671 
8672       for (slot = 0; slot < num_slots; slot++)
8673 	{
8674 	  switch (fragP->tc_frag_data.slot_subtypes[slot])
8675 	    {
8676 	    case RELAX_NARROW:
8677 	      if (fragP->tc_frag_data.relax_seen)
8678 		new_stretch += relax_frag_for_align (fragP, stretch);
8679 	      break;
8680 
8681 	    case RELAX_IMMED:
8682 	    case RELAX_IMMED_STEP1:
8683 	    case RELAX_IMMED_STEP2:
8684 	    case RELAX_IMMED_STEP3:
8685 	      /* Place the immediate.  */
8686 	      new_stretch += relax_frag_immed
8687 		(now_seg, fragP, stretch,
8688 		 fragP->tc_frag_data.slot_subtypes[slot] - RELAX_IMMED,
8689 		 fmt, slot, stretched_p, FALSE);
8690 	      break;
8691 
8692 	    default:
8693 	      /* This is OK; see the note in xg_assemble_vliw_tokens.  */
8694 	      break;
8695 	    }
8696 	}
8697       break;
8698 
8699     case RELAX_LITERAL_POOL_BEGIN:
8700     case RELAX_LITERAL_POOL_END:
8701     case RELAX_MAYBE_UNREACHABLE:
8702     case RELAX_MAYBE_DESIRE_ALIGN:
8703       /* No relaxation required.  */
8704       break;
8705 
8706     case RELAX_FILL_NOP:
8707     case RELAX_UNREACHABLE:
8708       if (fragP->tc_frag_data.relax_seen)
8709 	new_stretch += relax_frag_for_align (fragP, stretch);
8710       break;
8711 
8712     default:
8713       as_bad (_("bad relaxation state"));
8714     }
8715 
8716   /* Tell gas we need another relaxation pass.  */
8717   if (! fragP->tc_frag_data.relax_seen)
8718     {
8719       fragP->tc_frag_data.relax_seen = TRUE;
8720       *stretched_p = 1;
8721     }
8722 
8723   new_logical_line (file_name, line);
8724   return new_stretch;
8725 }
8726 
8727 
8728 static long
8729 relax_frag_loop_align (fragS *fragP, long stretch)
8730 {
8731   addressT old_address, old_next_address, old_size;
8732   addressT new_address, new_next_address, new_size;
8733   addressT growth;
8734 
8735   /* All the frags with relax_frag_for_alignment prior to this one in the
8736      section have been done, hopefully eliminating the need for a NOP here.
8737      But, this will put it in if necessary.  */
8738 
8739   /* Calculate the old address of this fragment and the next fragment.  */
8740   old_address = fragP->fr_address - stretch;
8741   old_next_address = (fragP->fr_address - stretch + fragP->fr_fix +
8742 		      fragP->tc_frag_data.text_expansion[0]);
8743   old_size = old_next_address - old_address;
8744 
8745   /* Calculate the new address of this fragment and the next fragment.  */
8746   new_address = fragP->fr_address;
8747   new_next_address =
8748     get_noop_aligned_address (fragP, fragP->fr_address + fragP->fr_fix);
8749   new_size = new_next_address - new_address;
8750 
8751   growth = new_size - old_size;
8752 
8753   /* Fix up the text_expansion field and return the new growth.  */
8754   fragP->tc_frag_data.text_expansion[0] += growth;
8755   return growth;
8756 }
8757 
8758 
8759 /* Add a NOP instruction.  */
8760 
8761 static long
8762 relax_frag_add_nop (fragS *fragP)
8763 {
8764   char *nop_buf = fragP->fr_literal + fragP->fr_fix;
8765   int length = fragP->tc_frag_data.is_no_density ? 3 : 2;
8766   assemble_nop (length, nop_buf);
8767   fragP->tc_frag_data.is_insn = TRUE;
8768 
8769   if (fragP->fr_var < length)
8770     {
8771       as_fatal (_("fr_var (%ld) < length (%d)"), (long) fragP->fr_var, length);
8772       return 0;
8773     }
8774 
8775   fragP->fr_fix += length;
8776   fragP->fr_var -= length;
8777   return length;
8778 }
8779 
8780 
8781 static long future_alignment_required (fragS *, long);
8782 
8783 static long
8784 relax_frag_for_align (fragS *fragP, long stretch)
8785 {
8786   /* Overview of the relaxation procedure for alignment:
8787      We can widen with NOPs or by widening instructions or by filling
8788      bytes after jump instructions.  Find the opportune places and widen
8789      them if necessary.  */
8790 
8791   long stretch_me;
8792   long diff;
8793 
8794   gas_assert (fragP->fr_subtype == RELAX_FILL_NOP
8795 	  || fragP->fr_subtype == RELAX_UNREACHABLE
8796 	  || (fragP->fr_subtype == RELAX_SLOTS
8797 	      && fragP->tc_frag_data.slot_subtypes[0] == RELAX_NARROW));
8798 
8799   stretch_me = future_alignment_required (fragP, stretch);
8800   diff = stretch_me - fragP->tc_frag_data.text_expansion[0];
8801   if (diff == 0)
8802     return 0;
8803 
8804   if (diff < 0)
8805     {
8806       /* We expanded on a previous pass.  Can we shrink now?  */
8807       long shrink = fragP->tc_frag_data.text_expansion[0] - stretch_me;
8808       if (shrink <= stretch && stretch > 0)
8809 	{
8810 	  fragP->tc_frag_data.text_expansion[0] = stretch_me;
8811 	  return -shrink;
8812 	}
8813       return 0;
8814     }
8815 
8816   /* Below here, diff > 0.  */
8817   fragP->tc_frag_data.text_expansion[0] = stretch_me;
8818 
8819   return diff;
8820 }
8821 
8822 
8823 /* Return the address of the next frag that should be aligned.
8824 
8825    By "address" we mean the address it _would_ be at if there
8826    is no action taken to align it between here and the target frag.
8827    In other words, if no narrows and no fill nops are used between
8828    here and the frag to align, _even_if_ some of the frags we use
8829    to align targets have already expanded on a previous relaxation
8830    pass.
8831 
8832    Also, count each frag that may be used to help align the target.
8833 
8834    Return 0 if there are no frags left in the chain that need to be
8835    aligned.  */
8836 
8837 static addressT
8838 find_address_of_next_align_frag (fragS **fragPP,
8839 				 int *wide_nops,
8840 				 int *narrow_nops,
8841 				 int *widens,
8842 				 bfd_boolean *paddable)
8843 {
8844   fragS *fragP = *fragPP;
8845   addressT address = fragP->fr_address;
8846 
8847   /* Do not reset the counts to 0.  */
8848 
8849   while (fragP)
8850     {
8851       /* Limit this to a small search.  */
8852       if (*widens >= (int) xtensa_fetch_width)
8853 	{
8854 	  *fragPP = fragP;
8855 	  return 0;
8856 	}
8857       address += fragP->fr_fix;
8858 
8859       if (fragP->fr_type == rs_fill)
8860 	address += fragP->fr_offset * fragP->fr_var;
8861       else if (fragP->fr_type == rs_machine_dependent)
8862 	{
8863 	  switch (fragP->fr_subtype)
8864 	    {
8865 	    case RELAX_UNREACHABLE:
8866 	      *paddable = TRUE;
8867 	      break;
8868 
8869 	    case RELAX_FILL_NOP:
8870 	      (*wide_nops)++;
8871 	      if (!fragP->tc_frag_data.is_no_density)
8872 		(*narrow_nops)++;
8873 	      break;
8874 
8875 	    case RELAX_SLOTS:
8876 	      if (fragP->tc_frag_data.slot_subtypes[0] == RELAX_NARROW)
8877 		{
8878 		  (*widens)++;
8879 		  break;
8880 		}
8881 	      address += total_frag_text_expansion (fragP);;
8882 	      break;
8883 
8884 	    case RELAX_IMMED:
8885 	      address += fragP->tc_frag_data.text_expansion[0];
8886 	      break;
8887 
8888 	    case RELAX_ALIGN_NEXT_OPCODE:
8889 	    case RELAX_DESIRE_ALIGN:
8890 	      *fragPP = fragP;
8891 	      return address;
8892 
8893 	    case RELAX_MAYBE_UNREACHABLE:
8894 	    case RELAX_MAYBE_DESIRE_ALIGN:
8895 	      /* Do nothing.  */
8896 	      break;
8897 
8898 	    default:
8899 	      /* Just punt if we don't know the type.  */
8900 	      *fragPP = fragP;
8901 	      return 0;
8902 	    }
8903 	}
8904       else
8905 	{
8906 	  /* Just punt if we don't know the type.  */
8907 	  *fragPP = fragP;
8908 	  return 0;
8909 	}
8910       fragP = fragP->fr_next;
8911     }
8912 
8913   *fragPP = fragP;
8914   return 0;
8915 }
8916 
8917 
8918 static long bytes_to_stretch (fragS *, int, int, int, int);
8919 
8920 static long
8921 future_alignment_required (fragS *fragP, long stretch ATTRIBUTE_UNUSED)
8922 {
8923   fragS *this_frag = fragP;
8924   long address;
8925   int num_widens = 0;
8926   int wide_nops = 0;
8927   int narrow_nops = 0;
8928   bfd_boolean paddable = FALSE;
8929   offsetT local_opt_diff;
8930   offsetT opt_diff;
8931   offsetT max_diff;
8932   int stretch_amount = 0;
8933   int local_stretch_amount;
8934   int global_stretch_amount;
8935 
8936   address = find_address_of_next_align_frag
8937     (&fragP, &wide_nops, &narrow_nops, &num_widens, &paddable);
8938 
8939   if (!address)
8940     {
8941       if (this_frag->tc_frag_data.is_aligning_branch)
8942 	this_frag->tc_frag_data.slot_subtypes[0] = RELAX_IMMED;
8943       else
8944 	frag_wane (this_frag);
8945     }
8946   else
8947     {
8948       local_opt_diff = get_aligned_diff (fragP, address, &max_diff);
8949       opt_diff = local_opt_diff;
8950       gas_assert (opt_diff >= 0);
8951       gas_assert (max_diff >= opt_diff);
8952       if (max_diff == 0)
8953 	return 0;
8954 
8955       if (fragP)
8956 	fragP = fragP->fr_next;
8957 
8958       while (fragP && opt_diff < max_diff && address)
8959 	{
8960 	  /* We only use these to determine if we can exit early
8961 	     because there will be plenty of ways to align future
8962 	     align frags.  */
8963 	  int glob_widens = 0;
8964 	  int dnn = 0;
8965 	  int dw = 0;
8966 	  bfd_boolean glob_pad = 0;
8967 	  address = find_address_of_next_align_frag
8968 	    (&fragP, &glob_widens, &dnn, &dw, &glob_pad);
8969 	  /* If there is a padable portion, then skip.  */
8970 	  if (glob_pad || glob_widens >= (1 << branch_align_power (now_seg)))
8971 	    address = 0;
8972 
8973 	  if (address)
8974 	    {
8975 	      offsetT next_m_diff;
8976 	      offsetT next_o_diff;
8977 
8978 	      /* Downrange frags haven't had stretch added to them yet.  */
8979 	      address += stretch;
8980 
8981 	      /* The address also includes any text expansion from this
8982 		 frag in a previous pass, but we don't want that.  */
8983 	      address -= this_frag->tc_frag_data.text_expansion[0];
8984 
8985 	      /* Assume we are going to move at least opt_diff.  In
8986 		 reality, we might not be able to, but assuming that
8987 		 we will helps catch cases where moving opt_diff pushes
8988 		 the next target from aligned to unaligned.  */
8989 	      address += opt_diff;
8990 
8991 	      next_o_diff = get_aligned_diff (fragP, address, &next_m_diff);
8992 
8993 	      /* Now cleanup for the adjustments to address.  */
8994 	      next_o_diff += opt_diff;
8995 	      next_m_diff += opt_diff;
8996 	      if (next_o_diff <= max_diff && next_o_diff > opt_diff)
8997 		opt_diff = next_o_diff;
8998 	      if (next_m_diff < max_diff)
8999 		max_diff = next_m_diff;
9000 	      fragP = fragP->fr_next;
9001 	    }
9002 	}
9003 
9004       /* If there are enough wideners in between, do it.  */
9005       if (paddable)
9006 	{
9007 	  if (this_frag->fr_subtype == RELAX_UNREACHABLE)
9008 	    {
9009 	      gas_assert (opt_diff <= (signed) xtensa_fetch_width);
9010 	      return opt_diff;
9011 	    }
9012 	  return 0;
9013 	}
9014       local_stretch_amount
9015 	= bytes_to_stretch (this_frag, wide_nops, narrow_nops,
9016 			    num_widens, local_opt_diff);
9017       global_stretch_amount
9018 	= bytes_to_stretch (this_frag, wide_nops, narrow_nops,
9019 			    num_widens, opt_diff);
9020       /* If the condition below is true, then the frag couldn't
9021 	 stretch the correct amount for the global case, so we just
9022 	 optimize locally.  We'll rely on the subsequent frags to get
9023 	 the correct alignment in the global case.  */
9024       if (global_stretch_amount < local_stretch_amount)
9025 	stretch_amount = local_stretch_amount;
9026       else
9027 	stretch_amount = global_stretch_amount;
9028 
9029       if (this_frag->fr_subtype == RELAX_SLOTS
9030 	  && this_frag->tc_frag_data.slot_subtypes[0] == RELAX_NARROW)
9031 	gas_assert (stretch_amount <= 1);
9032       else if (this_frag->fr_subtype == RELAX_FILL_NOP)
9033 	{
9034 	  if (this_frag->tc_frag_data.is_no_density)
9035 	    gas_assert (stretch_amount == 3 || stretch_amount == 0);
9036 	  else
9037 	    gas_assert (stretch_amount <= 3);
9038 	}
9039     }
9040   return stretch_amount;
9041 }
9042 
9043 
9044 /* The idea: widen everything you can to get a target or loop aligned,
9045    then start using NOPs.
9046 
9047    wide_nops   = the number of wide NOPs available for aligning
9048    narrow_nops = the number of narrow NOPs available for aligning
9049 		 (a subset of wide_nops)
9050    widens      = the number of narrow instructions that should be widened
9051 
9052 */
9053 
9054 static long
9055 bytes_to_stretch (fragS *this_frag,
9056 		  int wide_nops,
9057 		  int narrow_nops,
9058 		  int num_widens,
9059 		  int desired_diff)
9060 {
9061   int nops_needed;
9062   int nop_bytes;
9063   int extra_bytes;
9064   int bytes_short = desired_diff - num_widens;
9065 
9066   gas_assert (desired_diff >= 0
9067 	      && desired_diff < (signed) xtensa_fetch_width);
9068   if (desired_diff == 0)
9069     return 0;
9070 
9071   gas_assert (wide_nops > 0 || num_widens > 0);
9072 
9073   /* Always prefer widening to NOP-filling.  */
9074   if (bytes_short < 0)
9075     {
9076       /* There are enough RELAX_NARROW frags after this one
9077 	 to align the target without widening this frag in any way.  */
9078       return 0;
9079     }
9080 
9081   if (bytes_short == 0)
9082     {
9083       /* Widen every narrow between here and the align target
9084 	 and the align target will be properly aligned.  */
9085       if (this_frag->fr_subtype == RELAX_FILL_NOP)
9086 	return 0;
9087       else
9088 	return 1;
9089     }
9090 
9091   /* From here we will need at least one NOP to get an alignment.
9092      However, we may not be able to align at all, in which case,
9093      don't widen.  */
9094   nops_needed = desired_diff / 3;
9095 
9096   /* If there aren't enough nops, don't widen.  */
9097   if (nops_needed > wide_nops)
9098     return 0;
9099 
9100   /* First try it with all wide nops.  */
9101   nop_bytes = nops_needed * 3;
9102   extra_bytes = desired_diff - nop_bytes;
9103 
9104   if (nop_bytes + num_widens >= desired_diff)
9105     {
9106       if (this_frag->fr_subtype == RELAX_FILL_NOP)
9107 	return 3;
9108       else if (num_widens == extra_bytes)
9109 	return 1;
9110       return 0;
9111     }
9112 
9113   /* Add a narrow nop.  */
9114   nops_needed++;
9115   nop_bytes += 2;
9116   extra_bytes -= 2;
9117   if (narrow_nops == 0 || nops_needed > wide_nops)
9118     return 0;
9119 
9120   if (nop_bytes + num_widens >= desired_diff && extra_bytes >= 0)
9121     {
9122       if (this_frag->fr_subtype == RELAX_FILL_NOP)
9123 	return !this_frag->tc_frag_data.is_no_density ? 2 : 3;
9124       else if (num_widens == extra_bytes)
9125 	return 1;
9126       return 0;
9127     }
9128 
9129   /* Replace a wide nop with a narrow nop--we can get here if
9130      extra_bytes was negative in the previous conditional.  */
9131   if (narrow_nops == 1)
9132     return 0;
9133   nop_bytes--;
9134   extra_bytes++;
9135   if (nop_bytes + num_widens >= desired_diff)
9136     {
9137       if (this_frag->fr_subtype == RELAX_FILL_NOP)
9138 	return !this_frag->tc_frag_data.is_no_density ? 2 : 3;
9139       else if (num_widens == extra_bytes)
9140 	return 1;
9141       return 0;
9142     }
9143 
9144   /* If we can't satisfy any of the above cases, then we can't align
9145      using padding or fill nops.  */
9146   return 0;
9147 }
9148 
9149 
9150 static long
9151 relax_frag_immed (segT segP,
9152 		  fragS *fragP,
9153 		  long stretch,
9154 		  int min_steps,
9155 		  xtensa_format fmt,
9156 		  int slot,
9157 		  int *stretched_p,
9158 		  bfd_boolean estimate_only)
9159 {
9160   TInsn tinsn;
9161   int old_size;
9162   bfd_boolean negatable_branch = FALSE;
9163   bfd_boolean branch_jmp_to_next = FALSE;
9164   bfd_boolean from_wide_insn = FALSE;
9165   xtensa_isa isa = xtensa_default_isa;
9166   IStack istack;
9167   offsetT frag_offset;
9168   int num_steps;
9169   int num_text_bytes, num_literal_bytes;
9170   int literal_diff, total_text_diff, this_text_diff;
9171 
9172   gas_assert (fragP->fr_opcode != NULL);
9173 
9174   xg_clear_vinsn (&cur_vinsn);
9175   vinsn_from_chars (&cur_vinsn, fragP->fr_opcode);
9176   if (cur_vinsn.num_slots > 1)
9177     from_wide_insn = TRUE;
9178 
9179   tinsn = cur_vinsn.slots[slot];
9180   tinsn_immed_from_frag (&tinsn, fragP, slot);
9181 
9182   if (estimate_only && xtensa_opcode_is_loop (isa, tinsn.opcode) == 1)
9183     return 0;
9184 
9185   if (workaround_b_j_loop_end && ! fragP->tc_frag_data.is_no_transform)
9186     branch_jmp_to_next = is_branch_jmp_to_next (&tinsn, fragP);
9187 
9188   negatable_branch = (xtensa_opcode_is_branch (isa, tinsn.opcode) == 1);
9189 
9190   old_size = xtensa_format_length (isa, fmt);
9191 
9192   /* Special case: replace a branch to the next instruction with a NOP.
9193      This is required to work around a hardware bug in T1040.0 and also
9194      serves as an optimization.  */
9195 
9196   if (branch_jmp_to_next
9197       && ((old_size == 2) || (old_size == 3))
9198       && !next_frag_is_loop_target (fragP))
9199     return 0;
9200 
9201   /* Here is the fun stuff: Get the immediate field from this
9202      instruction.  If it fits, we are done.  If not, find the next
9203      instruction sequence that fits.  */
9204 
9205   frag_offset = fragP->fr_opcode - fragP->fr_literal;
9206   istack_init (&istack);
9207   num_steps = xg_assembly_relax (&istack, &tinsn, segP, fragP, frag_offset,
9208 				 min_steps, stretch);
9209   gas_assert (num_steps >= min_steps && num_steps <= RELAX_IMMED_MAXSTEPS);
9210 
9211   fragP->tc_frag_data.slot_subtypes[slot] = (int) RELAX_IMMED + num_steps;
9212 
9213   /* Figure out the number of bytes needed.  */
9214   num_literal_bytes = get_num_stack_literal_bytes (&istack);
9215   literal_diff
9216     = num_literal_bytes - fragP->tc_frag_data.literal_expansion[slot];
9217   num_text_bytes = get_num_stack_text_bytes (&istack);
9218 
9219   if (from_wide_insn)
9220     {
9221       int first = 0;
9222       while (istack.insn[first].opcode == XTENSA_UNDEFINED)
9223 	first++;
9224 
9225       num_text_bytes += old_size;
9226       if (opcode_fits_format_slot (istack.insn[first].opcode, fmt, slot))
9227 	num_text_bytes -= xg_get_single_size (istack.insn[first].opcode);
9228       else
9229 	{
9230 	  /* The first instruction in the relaxed sequence will go after
9231 	     the current wide instruction, and thus its symbolic immediates
9232 	     might not fit.  */
9233 
9234 	  istack_init (&istack);
9235 	  num_steps = xg_assembly_relax (&istack, &tinsn, segP, fragP,
9236 					 frag_offset + old_size,
9237 					 min_steps, stretch + old_size);
9238 	  gas_assert (num_steps >= min_steps && num_steps <= RELAX_IMMED_MAXSTEPS);
9239 
9240 	  fragP->tc_frag_data.slot_subtypes[slot]
9241 	    = (int) RELAX_IMMED + num_steps;
9242 
9243 	  num_literal_bytes = get_num_stack_literal_bytes (&istack);
9244 	  literal_diff
9245 	    = num_literal_bytes - fragP->tc_frag_data.literal_expansion[slot];
9246 
9247 	  num_text_bytes = get_num_stack_text_bytes (&istack) + old_size;
9248 	}
9249     }
9250 
9251   total_text_diff = num_text_bytes - old_size;
9252   this_text_diff = total_text_diff - fragP->tc_frag_data.text_expansion[slot];
9253 
9254   /* It MUST get larger.  If not, we could get an infinite loop.  */
9255   gas_assert (num_text_bytes >= 0);
9256   gas_assert (literal_diff >= 0);
9257   gas_assert (total_text_diff >= 0);
9258 
9259   fragP->tc_frag_data.text_expansion[slot] = total_text_diff;
9260   fragP->tc_frag_data.literal_expansion[slot] = num_literal_bytes;
9261   gas_assert (fragP->tc_frag_data.text_expansion[slot] >= 0);
9262   gas_assert (fragP->tc_frag_data.literal_expansion[slot] >= 0);
9263 
9264   /* Find the associated expandable literal for this.  */
9265   if (literal_diff != 0)
9266     {
9267       fragS *lit_fragP = fragP->tc_frag_data.literal_frags[slot];
9268       if (lit_fragP)
9269 	{
9270 	  gas_assert (literal_diff == 4);
9271 	  lit_fragP->tc_frag_data.unreported_expansion += literal_diff;
9272 
9273 	  /* We expect that the literal section state has NOT been
9274 	     modified yet.  */
9275 	  gas_assert (lit_fragP->fr_type == rs_machine_dependent
9276 		  && lit_fragP->fr_subtype == RELAX_LITERAL);
9277 	  lit_fragP->fr_subtype = RELAX_LITERAL_NR;
9278 
9279 	  /* We need to mark this section for another iteration
9280 	     of relaxation.  */
9281 	  (*stretched_p)++;
9282 	}
9283     }
9284 
9285   if (negatable_branch && istack.ninsn > 1)
9286     update_next_frag_state (fragP);
9287 
9288   return this_text_diff;
9289 }
9290 
9291 
9292 /* md_convert_frag Hook and Helper Functions.  */
9293 
9294 static void convert_frag_align_next_opcode (fragS *);
9295 static void convert_frag_narrow (segT, fragS *, xtensa_format, int);
9296 static void convert_frag_fill_nop (fragS *);
9297 static void convert_frag_immed (segT, fragS *, int, xtensa_format, int);
9298 
9299 void
9300 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT sec, fragS *fragp)
9301 {
9302   static xtensa_insnbuf vbuf = NULL;
9303   xtensa_isa isa = xtensa_default_isa;
9304   int slot;
9305   int num_slots;
9306   xtensa_format fmt;
9307   char *file_name;
9308   unsigned line;
9309 
9310   as_where (&file_name, &line);
9311   new_logical_line (fragp->fr_file, fragp->fr_line);
9312 
9313   switch (fragp->fr_subtype)
9314     {
9315     case RELAX_ALIGN_NEXT_OPCODE:
9316       /* Always convert.  */
9317       convert_frag_align_next_opcode (fragp);
9318       break;
9319 
9320     case RELAX_DESIRE_ALIGN:
9321       /* Do nothing.  If not aligned already, too bad.  */
9322       break;
9323 
9324     case RELAX_LITERAL:
9325     case RELAX_LITERAL_FINAL:
9326       break;
9327 
9328     case RELAX_SLOTS:
9329       if (vbuf == NULL)
9330 	vbuf = xtensa_insnbuf_alloc (isa);
9331 
9332       xtensa_insnbuf_from_chars
9333 	(isa, vbuf, (unsigned char *) fragp->fr_opcode, 0);
9334       fmt = xtensa_format_decode (isa, vbuf);
9335       num_slots = xtensa_format_num_slots (isa, fmt);
9336 
9337       for (slot = 0; slot < num_slots; slot++)
9338 	{
9339 	  switch (fragp->tc_frag_data.slot_subtypes[slot])
9340 	    {
9341 	    case RELAX_NARROW:
9342 	      convert_frag_narrow (sec, fragp, fmt, slot);
9343 	      break;
9344 
9345 	    case RELAX_IMMED:
9346 	    case RELAX_IMMED_STEP1:
9347 	    case RELAX_IMMED_STEP2:
9348 	    case RELAX_IMMED_STEP3:
9349 	      /* Place the immediate.  */
9350 	      convert_frag_immed
9351 		(sec, fragp,
9352 		 fragp->tc_frag_data.slot_subtypes[slot] - RELAX_IMMED,
9353 		 fmt, slot);
9354 	      break;
9355 
9356 	    default:
9357 	      /* This is OK because some slots could have
9358 		 relaxations and others have none.  */
9359 	      break;
9360 	    }
9361 	}
9362       break;
9363 
9364     case RELAX_UNREACHABLE:
9365       memset (&fragp->fr_literal[fragp->fr_fix], 0, fragp->fr_var);
9366       fragp->fr_fix += fragp->tc_frag_data.text_expansion[0];
9367       fragp->fr_var -= fragp->tc_frag_data.text_expansion[0];
9368       frag_wane (fragp);
9369       break;
9370 
9371     case RELAX_MAYBE_UNREACHABLE:
9372     case RELAX_MAYBE_DESIRE_ALIGN:
9373       frag_wane (fragp);
9374       break;
9375 
9376     case RELAX_FILL_NOP:
9377       convert_frag_fill_nop (fragp);
9378       break;
9379 
9380     case RELAX_LITERAL_NR:
9381       if (use_literal_section)
9382 	{
9383 	  /* This should have been handled during relaxation.  When
9384 	     relaxing a code segment, literals sometimes need to be
9385 	     added to the corresponding literal segment.  If that
9386 	     literal segment has already been relaxed, then we end up
9387 	     in this situation.  Marking the literal segments as data
9388 	     would make this happen less often (since GAS always relaxes
9389 	     code before data), but we could still get into trouble if
9390 	     there are instructions in a segment that is not marked as
9391 	     containing code.  Until we can implement a better solution,
9392 	     cheat and adjust the addresses of all the following frags.
9393 	     This could break subsequent alignments, but the linker's
9394 	     literal coalescing will do that anyway.  */
9395 
9396 	  fragS *f;
9397 	  fragp->fr_subtype = RELAX_LITERAL_FINAL;
9398 	  gas_assert (fragp->tc_frag_data.unreported_expansion == 4);
9399 	  memset (&fragp->fr_literal[fragp->fr_fix], 0, 4);
9400 	  fragp->fr_var -= 4;
9401 	  fragp->fr_fix += 4;
9402 	  for (f = fragp->fr_next; f; f = f->fr_next)
9403 	    f->fr_address += 4;
9404 	}
9405       else
9406 	as_bad (_("invalid relaxation fragment result"));
9407       break;
9408     }
9409 
9410   fragp->fr_var = 0;
9411   new_logical_line (file_name, line);
9412 }
9413 
9414 
9415 static void
9416 convert_frag_align_next_opcode (fragS *fragp)
9417 {
9418   char *nop_buf;		/* Location for Writing.  */
9419   bfd_boolean use_no_density = fragp->tc_frag_data.is_no_density;
9420   addressT aligned_address;
9421   offsetT fill_size;
9422   int nop, nop_count;
9423 
9424   aligned_address = get_noop_aligned_address (fragp, fragp->fr_address +
9425 					      fragp->fr_fix);
9426   fill_size = aligned_address - (fragp->fr_address + fragp->fr_fix);
9427   nop_count = get_text_align_nop_count (fill_size, use_no_density);
9428   nop_buf = fragp->fr_literal + fragp->fr_fix;
9429 
9430   for (nop = 0; nop < nop_count; nop++)
9431     {
9432       int nop_size;
9433       nop_size = get_text_align_nth_nop_size (fill_size, nop, use_no_density);
9434 
9435       assemble_nop (nop_size, nop_buf);
9436       nop_buf += nop_size;
9437     }
9438 
9439   fragp->fr_fix += fill_size;
9440   fragp->fr_var -= fill_size;
9441 }
9442 
9443 
9444 static void
9445 convert_frag_narrow (segT segP, fragS *fragP, xtensa_format fmt, int slot)
9446 {
9447   TInsn tinsn, single_target;
9448   int size, old_size, diff;
9449   offsetT frag_offset;
9450 
9451   gas_assert (slot == 0);
9452   tinsn_from_chars (&tinsn, fragP->fr_opcode, 0);
9453 
9454   if (fragP->tc_frag_data.is_aligning_branch == 1)
9455     {
9456       gas_assert (fragP->tc_frag_data.text_expansion[0] == 1
9457 	      || fragP->tc_frag_data.text_expansion[0] == 0);
9458       convert_frag_immed (segP, fragP, fragP->tc_frag_data.text_expansion[0],
9459 			  fmt, slot);
9460       return;
9461     }
9462 
9463   if (fragP->tc_frag_data.text_expansion[0] == 0)
9464     {
9465       /* No conversion.  */
9466       fragP->fr_var = 0;
9467       return;
9468     }
9469 
9470   gas_assert (fragP->fr_opcode != NULL);
9471 
9472   /* Frags in this relaxation state should only contain
9473      single instruction bundles.  */
9474   tinsn_immed_from_frag (&tinsn, fragP, 0);
9475 
9476   /* Just convert it to a wide form....  */
9477   size = 0;
9478   old_size = xg_get_single_size (tinsn.opcode);
9479 
9480   tinsn_init (&single_target);
9481   frag_offset = fragP->fr_opcode - fragP->fr_literal;
9482 
9483   if (! xg_is_single_relaxable_insn (&tinsn, &single_target, FALSE))
9484     {
9485       as_bad (_("unable to widen instruction"));
9486       return;
9487     }
9488 
9489   size = xg_get_single_size (single_target.opcode);
9490   xg_emit_insn_to_buf (&single_target, fragP->fr_opcode, fragP,
9491 		       frag_offset, TRUE);
9492 
9493   diff = size - old_size;
9494   gas_assert (diff >= 0);
9495   gas_assert (diff <= fragP->fr_var);
9496   fragP->fr_var -= diff;
9497   fragP->fr_fix += diff;
9498 
9499   /* clean it up */
9500   fragP->fr_var = 0;
9501 }
9502 
9503 
9504 static void
9505 convert_frag_fill_nop (fragS *fragP)
9506 {
9507   char *loc = &fragP->fr_literal[fragP->fr_fix];
9508   int size = fragP->tc_frag_data.text_expansion[0];
9509   gas_assert ((unsigned) size == (fragP->fr_next->fr_address
9510 			      - fragP->fr_address - fragP->fr_fix));
9511   if (size == 0)
9512     {
9513       /* No conversion.  */
9514       fragP->fr_var = 0;
9515       return;
9516     }
9517   assemble_nop (size, loc);
9518   fragP->tc_frag_data.is_insn = TRUE;
9519   fragP->fr_var -= size;
9520   fragP->fr_fix += size;
9521   frag_wane (fragP);
9522 }
9523 
9524 
9525 static fixS *fix_new_exp_in_seg
9526   (segT, subsegT, fragS *, int, int, expressionS *, int,
9527    bfd_reloc_code_real_type);
9528 static void convert_frag_immed_finish_loop (segT, fragS *, TInsn *);
9529 
9530 static void
9531 convert_frag_immed (segT segP,
9532 		    fragS *fragP,
9533 		    int min_steps,
9534 		    xtensa_format fmt,
9535 		    int slot)
9536 {
9537   char *immed_instr = fragP->fr_opcode;
9538   TInsn orig_tinsn;
9539   bfd_boolean expanded = FALSE;
9540   bfd_boolean branch_jmp_to_next = FALSE;
9541   char *fr_opcode = fragP->fr_opcode;
9542   xtensa_isa isa = xtensa_default_isa;
9543   bfd_boolean from_wide_insn = FALSE;
9544   int bytes;
9545   bfd_boolean is_loop;
9546 
9547   gas_assert (fr_opcode != NULL);
9548 
9549   xg_clear_vinsn (&cur_vinsn);
9550 
9551   vinsn_from_chars (&cur_vinsn, fr_opcode);
9552   if (cur_vinsn.num_slots > 1)
9553     from_wide_insn = TRUE;
9554 
9555   orig_tinsn = cur_vinsn.slots[slot];
9556   tinsn_immed_from_frag (&orig_tinsn, fragP, slot);
9557 
9558   is_loop = xtensa_opcode_is_loop (xtensa_default_isa, orig_tinsn.opcode) == 1;
9559 
9560   if (workaround_b_j_loop_end && ! fragP->tc_frag_data.is_no_transform)
9561     branch_jmp_to_next = is_branch_jmp_to_next (&orig_tinsn, fragP);
9562 
9563   if (branch_jmp_to_next && !next_frag_is_loop_target (fragP))
9564     {
9565       /* Conversion just inserts a NOP and marks the fix as completed.  */
9566       bytes = xtensa_format_length (isa, fmt);
9567       if (bytes >= 4)
9568 	{
9569 	  cur_vinsn.slots[slot].opcode =
9570 	    xtensa_format_slot_nop_opcode (isa, cur_vinsn.format, slot);
9571 	  cur_vinsn.slots[slot].ntok = 0;
9572 	}
9573       else
9574 	{
9575 	  bytes += fragP->tc_frag_data.text_expansion[0];
9576 	  gas_assert (bytes == 2 || bytes == 3);
9577 	  build_nop (&cur_vinsn.slots[0], bytes);
9578 	  fragP->fr_fix += fragP->tc_frag_data.text_expansion[0];
9579 	}
9580       vinsn_to_insnbuf (&cur_vinsn, fr_opcode, frag_now, TRUE);
9581       xtensa_insnbuf_to_chars
9582 	(isa, cur_vinsn.insnbuf, (unsigned char *) fr_opcode, 0);
9583       fragP->fr_var = 0;
9584     }
9585   else
9586     {
9587       /* Here is the fun stuff:  Get the immediate field from this
9588 	 instruction.  If it fits, we're done.  If not, find the next
9589 	 instruction sequence that fits.  */
9590 
9591       IStack istack;
9592       int i;
9593       symbolS *lit_sym = NULL;
9594       int total_size = 0;
9595       int target_offset = 0;
9596       int old_size;
9597       int diff;
9598       symbolS *gen_label = NULL;
9599       offsetT frag_offset;
9600       bfd_boolean first = TRUE;
9601 
9602       /* It does not fit.  Find something that does and
9603          convert immediately.  */
9604       frag_offset = fr_opcode - fragP->fr_literal;
9605       istack_init (&istack);
9606       xg_assembly_relax (&istack, &orig_tinsn,
9607 			 segP, fragP, frag_offset, min_steps, 0);
9608 
9609       old_size = xtensa_format_length (isa, fmt);
9610 
9611       /* Assemble this right inline.  */
9612 
9613       /* First, create the mapping from a label name to the REAL label.  */
9614       target_offset = 0;
9615       for (i = 0; i < istack.ninsn; i++)
9616 	{
9617 	  TInsn *tinsn = &istack.insn[i];
9618 	  fragS *lit_frag;
9619 
9620 	  switch (tinsn->insn_type)
9621 	    {
9622 	    case ITYPE_LITERAL:
9623 	      if (lit_sym != NULL)
9624 		as_bad (_("multiple literals in expansion"));
9625 	      /* First find the appropriate space in the literal pool.  */
9626 	      lit_frag = fragP->tc_frag_data.literal_frags[slot];
9627 	      if (lit_frag == NULL)
9628 		as_bad (_("no registered fragment for literal"));
9629 	      if (tinsn->ntok != 1)
9630 		as_bad (_("number of literal tokens != 1"));
9631 
9632 	      /* Set the literal symbol and add a fixup.  */
9633 	      lit_sym = lit_frag->fr_symbol;
9634 	      break;
9635 
9636 	    case ITYPE_LABEL:
9637 	      if (align_targets && !is_loop)
9638 		{
9639 		  fragS *unreach = fragP->fr_next;
9640 		  while (!(unreach->fr_type == rs_machine_dependent
9641 			   && (unreach->fr_subtype == RELAX_MAYBE_UNREACHABLE
9642 			       || unreach->fr_subtype == RELAX_UNREACHABLE)))
9643 		    {
9644 		      unreach = unreach->fr_next;
9645 		    }
9646 
9647 		  gas_assert (unreach->fr_type == rs_machine_dependent
9648 			  && (unreach->fr_subtype == RELAX_MAYBE_UNREACHABLE
9649 			      || unreach->fr_subtype == RELAX_UNREACHABLE));
9650 
9651 		  target_offset += unreach->tc_frag_data.text_expansion[0];
9652 		}
9653 	      gas_assert (gen_label == NULL);
9654 	      gen_label = symbol_new (FAKE_LABEL_NAME, now_seg,
9655 				      fr_opcode - fragP->fr_literal
9656 				      + target_offset, fragP);
9657 	      break;
9658 
9659 	    case ITYPE_INSN:
9660 	      if (first && from_wide_insn)
9661 		{
9662 		  target_offset += xtensa_format_length (isa, fmt);
9663 		  first = FALSE;
9664 		  if (!opcode_fits_format_slot (tinsn->opcode, fmt, slot))
9665 		    target_offset += xg_get_single_size (tinsn->opcode);
9666 		}
9667 	      else
9668 		target_offset += xg_get_single_size (tinsn->opcode);
9669 	      break;
9670 	    }
9671 	}
9672 
9673       total_size = 0;
9674       first = TRUE;
9675       for (i = 0; i < istack.ninsn; i++)
9676 	{
9677 	  TInsn *tinsn = &istack.insn[i];
9678 	  fragS *lit_frag;
9679 	  int size;
9680 	  segT target_seg;
9681 	  bfd_reloc_code_real_type reloc_type;
9682 
9683 	  switch (tinsn->insn_type)
9684 	    {
9685 	    case ITYPE_LITERAL:
9686 	      lit_frag = fragP->tc_frag_data.literal_frags[slot];
9687 	      /* Already checked.  */
9688 	      gas_assert (lit_frag != NULL);
9689 	      gas_assert (lit_sym != NULL);
9690 	      gas_assert (tinsn->ntok == 1);
9691 	      /* Add a fixup.  */
9692 	      target_seg = S_GET_SEGMENT (lit_sym);
9693 	      gas_assert (target_seg);
9694 	      reloc_type = map_operator_to_reloc (tinsn->tok[0].X_op, TRUE);
9695 	      fix_new_exp_in_seg (target_seg, 0, lit_frag, 0, 4,
9696 				  &tinsn->tok[0], FALSE, reloc_type);
9697 	      break;
9698 
9699 	    case ITYPE_LABEL:
9700 	      break;
9701 
9702 	    case ITYPE_INSN:
9703 	      xg_resolve_labels (tinsn, gen_label);
9704 	      xg_resolve_literals (tinsn, lit_sym);
9705 	      if (from_wide_insn && first)
9706 		{
9707 		  first = FALSE;
9708 		  if (opcode_fits_format_slot (tinsn->opcode, fmt, slot))
9709 		    {
9710 		      cur_vinsn.slots[slot] = *tinsn;
9711 		    }
9712 		  else
9713 		    {
9714 		      cur_vinsn.slots[slot].opcode =
9715 			xtensa_format_slot_nop_opcode (isa, fmt, slot);
9716 		      cur_vinsn.slots[slot].ntok = 0;
9717 		    }
9718 		  vinsn_to_insnbuf (&cur_vinsn, immed_instr, fragP, TRUE);
9719 		  xtensa_insnbuf_to_chars (isa, cur_vinsn.insnbuf,
9720 					   (unsigned char *) immed_instr, 0);
9721 		  fragP->tc_frag_data.is_insn = TRUE;
9722 		  size = xtensa_format_length (isa, fmt);
9723 		  if (!opcode_fits_format_slot (tinsn->opcode, fmt, slot))
9724 		    {
9725 		      xg_emit_insn_to_buf
9726 			(tinsn, immed_instr + size, fragP,
9727 			 immed_instr - fragP->fr_literal + size, TRUE);
9728 		      size += xg_get_single_size (tinsn->opcode);
9729 		    }
9730 		}
9731 	      else
9732 		{
9733 		  size = xg_get_single_size (tinsn->opcode);
9734 		  xg_emit_insn_to_buf (tinsn, immed_instr, fragP,
9735 				       immed_instr - fragP->fr_literal, TRUE);
9736 		}
9737 	      immed_instr += size;
9738 	      total_size += size;
9739 	      break;
9740 	    }
9741 	}
9742 
9743       diff = total_size - old_size;
9744       gas_assert (diff >= 0);
9745       if (diff != 0)
9746 	expanded = TRUE;
9747       gas_assert (diff <= fragP->fr_var);
9748       fragP->fr_var -= diff;
9749       fragP->fr_fix += diff;
9750     }
9751 
9752   /* Check for undefined immediates in LOOP instructions.  */
9753   if (is_loop)
9754     {
9755       symbolS *sym;
9756       sym = orig_tinsn.tok[1].X_add_symbol;
9757       if (sym != NULL && !S_IS_DEFINED (sym))
9758 	{
9759 	  as_bad (_("unresolved loop target symbol: %s"), S_GET_NAME (sym));
9760 	  return;
9761 	}
9762       sym = orig_tinsn.tok[1].X_op_symbol;
9763       if (sym != NULL && !S_IS_DEFINED (sym))
9764 	{
9765 	  as_bad (_("unresolved loop target symbol: %s"), S_GET_NAME (sym));
9766 	  return;
9767 	}
9768     }
9769 
9770   if (expanded && xtensa_opcode_is_loop (isa, orig_tinsn.opcode) == 1)
9771     convert_frag_immed_finish_loop (segP, fragP, &orig_tinsn);
9772 
9773   if (expanded && is_direct_call_opcode (orig_tinsn.opcode))
9774     {
9775       /* Add an expansion note on the expanded instruction.  */
9776       fix_new_exp_in_seg (now_seg, 0, fragP, fr_opcode - fragP->fr_literal, 4,
9777 			  &orig_tinsn.tok[0], TRUE,
9778 			  BFD_RELOC_XTENSA_ASM_EXPAND);
9779     }
9780 }
9781 
9782 
9783 /* Add a new fix expression into the desired segment.  We have to
9784    switch to that segment to do this.  */
9785 
9786 static fixS *
9787 fix_new_exp_in_seg (segT new_seg,
9788 		    subsegT new_subseg,
9789 		    fragS *frag,
9790 		    int where,
9791 		    int size,
9792 		    expressionS *exp,
9793 		    int pcrel,
9794 		    bfd_reloc_code_real_type r_type)
9795 {
9796   fixS *new_fix;
9797   segT seg = now_seg;
9798   subsegT subseg = now_subseg;
9799 
9800   gas_assert (new_seg != 0);
9801   subseg_set (new_seg, new_subseg);
9802 
9803   new_fix = fix_new_exp (frag, where, size, exp, pcrel, r_type);
9804   subseg_set (seg, subseg);
9805   return new_fix;
9806 }
9807 
9808 
9809 /* Relax a loop instruction so that it can span loop >256 bytes.
9810 
9811                   loop    as, .L1
9812           .L0:
9813                   rsr     as, LEND
9814                   wsr     as, LBEG
9815                   addi    as, as, lo8 (label-.L1)
9816                   addmi   as, as, mid8 (label-.L1)
9817                   wsr     as, LEND
9818                   isync
9819                   rsr     as, LCOUNT
9820                   addi    as, as, 1
9821           .L1:
9822                   <<body>>
9823           label:
9824 */
9825 
9826 static void
9827 convert_frag_immed_finish_loop (segT segP, fragS *fragP, TInsn *tinsn)
9828 {
9829   TInsn loop_insn;
9830   TInsn addi_insn;
9831   TInsn addmi_insn;
9832   unsigned long target;
9833   static xtensa_insnbuf insnbuf = NULL;
9834   unsigned int loop_length, loop_length_hi, loop_length_lo;
9835   xtensa_isa isa = xtensa_default_isa;
9836   addressT loop_offset;
9837   addressT addi_offset = 9;
9838   addressT addmi_offset = 12;
9839   fragS *next_fragP;
9840   int target_count;
9841 
9842   if (!insnbuf)
9843     insnbuf = xtensa_insnbuf_alloc (isa);
9844 
9845   /* Get the loop offset.  */
9846   loop_offset = get_expanded_loop_offset (tinsn->opcode);
9847 
9848   /* Validate that there really is a LOOP at the loop_offset.  Because
9849      loops are not bundleable, we can assume that the instruction will be
9850      in slot 0.  */
9851   tinsn_from_chars (&loop_insn, fragP->fr_opcode + loop_offset, 0);
9852   tinsn_immed_from_frag (&loop_insn, fragP, 0);
9853 
9854   gas_assert (xtensa_opcode_is_loop (isa, loop_insn.opcode) == 1);
9855   addi_offset += loop_offset;
9856   addmi_offset += loop_offset;
9857 
9858   gas_assert (tinsn->ntok == 2);
9859   if (tinsn->tok[1].X_op == O_constant)
9860     target = tinsn->tok[1].X_add_number;
9861   else if (tinsn->tok[1].X_op == O_symbol)
9862     {
9863       /* Find the fragment.  */
9864       symbolS *sym = tinsn->tok[1].X_add_symbol;
9865       gas_assert (S_GET_SEGMENT (sym) == segP
9866 	      || S_GET_SEGMENT (sym) == absolute_section);
9867       target = (S_GET_VALUE (sym) + tinsn->tok[1].X_add_number);
9868     }
9869   else
9870     {
9871       as_bad (_("invalid expression evaluation type %d"), tinsn->tok[1].X_op);
9872       target = 0;
9873     }
9874 
9875   loop_length = target - (fragP->fr_address + fragP->fr_fix);
9876   loop_length_hi = loop_length & ~0x0ff;
9877   loop_length_lo = loop_length & 0x0ff;
9878   if (loop_length_lo >= 128)
9879     {
9880       loop_length_lo -= 256;
9881       loop_length_hi += 256;
9882     }
9883 
9884   /* Because addmi sign-extends the immediate, 'loop_length_hi' can be at most
9885      32512.  If the loop is larger than that, then we just fail.  */
9886   if (loop_length_hi > 32512)
9887     as_bad_where (fragP->fr_file, fragP->fr_line,
9888 		  _("loop too long for LOOP instruction"));
9889 
9890   tinsn_from_chars (&addi_insn, fragP->fr_opcode + addi_offset, 0);
9891   gas_assert (addi_insn.opcode == xtensa_addi_opcode);
9892 
9893   tinsn_from_chars (&addmi_insn, fragP->fr_opcode + addmi_offset, 0);
9894   gas_assert (addmi_insn.opcode == xtensa_addmi_opcode);
9895 
9896   set_expr_const (&addi_insn.tok[2], loop_length_lo);
9897   tinsn_to_insnbuf (&addi_insn, insnbuf);
9898 
9899   fragP->tc_frag_data.is_insn = TRUE;
9900   xtensa_insnbuf_to_chars
9901     (isa, insnbuf, (unsigned char *) fragP->fr_opcode + addi_offset, 0);
9902 
9903   set_expr_const (&addmi_insn.tok[2], loop_length_hi);
9904   tinsn_to_insnbuf (&addmi_insn, insnbuf);
9905   xtensa_insnbuf_to_chars
9906     (isa, insnbuf, (unsigned char *) fragP->fr_opcode + addmi_offset, 0);
9907 
9908   /* Walk through all of the frags from here to the loop end
9909      and mark them as no_transform to keep them from being modified
9910      by the linker.  If we ever have a relocation for the
9911      addi/addmi of the difference of two symbols we can remove this.  */
9912 
9913   target_count = 0;
9914   for (next_fragP = fragP; next_fragP != NULL;
9915        next_fragP = next_fragP->fr_next)
9916     {
9917       next_fragP->tc_frag_data.is_no_transform = TRUE;
9918       if (next_fragP->tc_frag_data.is_loop_target)
9919 	target_count++;
9920       if (target_count == 2)
9921 	break;
9922     }
9923 }
9924 
9925 
9926 /* A map that keeps information on a per-subsegment basis.  This is
9927    maintained during initial assembly, but is invalid once the
9928    subsegments are smashed together.  I.E., it cannot be used during
9929    the relaxation.  */
9930 
9931 typedef struct subseg_map_struct
9932 {
9933   /* the key */
9934   segT seg;
9935   subsegT subseg;
9936 
9937   /* the data */
9938   unsigned flags;
9939   float total_freq;	/* fall-through + branch target frequency */
9940   float target_freq;	/* branch target frequency alone */
9941 
9942   struct subseg_map_struct *next;
9943 } subseg_map;
9944 
9945 
9946 static subseg_map *sseg_map = NULL;
9947 
9948 static subseg_map *
9949 get_subseg_info (segT seg, subsegT subseg)
9950 {
9951   subseg_map *subseg_e;
9952 
9953   for (subseg_e = sseg_map; subseg_e; subseg_e = subseg_e->next)
9954     {
9955       if (seg == subseg_e->seg && subseg == subseg_e->subseg)
9956 	break;
9957     }
9958   return subseg_e;
9959 }
9960 
9961 
9962 static subseg_map *
9963 add_subseg_info (segT seg, subsegT subseg)
9964 {
9965   subseg_map *subseg_e = (subseg_map *) xmalloc (sizeof (subseg_map));
9966   memset (subseg_e, 0, sizeof (subseg_map));
9967   subseg_e->seg = seg;
9968   subseg_e->subseg = subseg;
9969   subseg_e->flags = 0;
9970   /* Start off considering every branch target very important.  */
9971   subseg_e->target_freq = 1.0;
9972   subseg_e->total_freq = 1.0;
9973   subseg_e->next = sseg_map;
9974   sseg_map = subseg_e;
9975   return subseg_e;
9976 }
9977 
9978 
9979 static unsigned
9980 get_last_insn_flags (segT seg, subsegT subseg)
9981 {
9982   subseg_map *subseg_e = get_subseg_info (seg, subseg);
9983   if (subseg_e)
9984     return subseg_e->flags;
9985   return 0;
9986 }
9987 
9988 
9989 static void
9990 set_last_insn_flags (segT seg,
9991 		     subsegT subseg,
9992 		     unsigned fl,
9993 		     bfd_boolean val)
9994 {
9995   subseg_map *subseg_e = get_subseg_info (seg, subseg);
9996   if (! subseg_e)
9997     subseg_e = add_subseg_info (seg, subseg);
9998   if (val)
9999     subseg_e->flags |= fl;
10000   else
10001     subseg_e->flags &= ~fl;
10002 }
10003 
10004 
10005 static float
10006 get_subseg_total_freq (segT seg, subsegT subseg)
10007 {
10008   subseg_map *subseg_e = get_subseg_info (seg, subseg);
10009   if (subseg_e)
10010     return subseg_e->total_freq;
10011   return 1.0;
10012 }
10013 
10014 
10015 static float
10016 get_subseg_target_freq (segT seg, subsegT subseg)
10017 {
10018   subseg_map *subseg_e = get_subseg_info (seg, subseg);
10019   if (subseg_e)
10020     return subseg_e->target_freq;
10021   return 1.0;
10022 }
10023 
10024 
10025 static void
10026 set_subseg_freq (segT seg, subsegT subseg, float total_f, float target_f)
10027 {
10028   subseg_map *subseg_e = get_subseg_info (seg, subseg);
10029   if (! subseg_e)
10030     subseg_e = add_subseg_info (seg, subseg);
10031   subseg_e->total_freq = total_f;
10032   subseg_e->target_freq = target_f;
10033 }
10034 
10035 
10036 /* Segment Lists and emit_state Stuff.  */
10037 
10038 static void
10039 xtensa_move_seg_list_to_beginning (seg_list *head)
10040 {
10041   head = head->next;
10042   while (head)
10043     {
10044       segT literal_section = head->seg;
10045 
10046       /* Move the literal section to the front of the section list.  */
10047       gas_assert (literal_section);
10048       if (literal_section != stdoutput->sections)
10049 	{
10050 	  bfd_section_list_remove (stdoutput, literal_section);
10051 	  bfd_section_list_prepend (stdoutput, literal_section);
10052 	}
10053       head = head->next;
10054     }
10055 }
10056 
10057 
10058 static void mark_literal_frags (seg_list *);
10059 
10060 static void
10061 xtensa_move_literals (void)
10062 {
10063   seg_list *segment;
10064   frchainS *frchain_from, *frchain_to;
10065   fragS *search_frag, *next_frag, *literal_pool, *insert_after;
10066   fragS **frag_splice;
10067   emit_state state;
10068   segT dest_seg;
10069   fixS *fix, *next_fix, **fix_splice;
10070   sym_list *lit;
10071 
10072   mark_literal_frags (literal_head->next);
10073 
10074   if (use_literal_section)
10075     return;
10076 
10077   for (segment = literal_head->next; segment; segment = segment->next)
10078     {
10079       /* Keep the literals for .init and .fini in separate sections.  */
10080       if (!strcmp (segment_name (segment->seg), INIT_SECTION_NAME)
10081 	  || !strcmp (segment_name (segment->seg), FINI_SECTION_NAME))
10082 	continue;
10083 
10084       frchain_from = seg_info (segment->seg)->frchainP;
10085       search_frag = frchain_from->frch_root;
10086       literal_pool = NULL;
10087       frchain_to = NULL;
10088       frag_splice = &(frchain_from->frch_root);
10089 
10090       while (!search_frag->tc_frag_data.literal_frag)
10091 	{
10092 	  gas_assert (search_frag->fr_fix == 0
10093 		  || search_frag->fr_type == rs_align);
10094 	  search_frag = search_frag->fr_next;
10095 	}
10096 
10097       gas_assert (search_frag->tc_frag_data.literal_frag->fr_subtype
10098 	      == RELAX_LITERAL_POOL_BEGIN);
10099       xtensa_switch_section_emit_state (&state, segment->seg, 0);
10100 
10101       /* Make sure that all the frags in this series are closed, and
10102 	 that there is at least one left over of zero-size.  This
10103 	 prevents us from making a segment with an frchain without any
10104 	 frags in it.  */
10105       frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
10106       xtensa_set_frag_assembly_state (frag_now);
10107       frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
10108       xtensa_set_frag_assembly_state (frag_now);
10109 
10110       while (search_frag != frag_now)
10111 	{
10112 	  next_frag = search_frag->fr_next;
10113 
10114 	  /* First, move the frag out of the literal section and
10115 	     to the appropriate place.  */
10116 	  if (search_frag->tc_frag_data.literal_frag)
10117 	    {
10118 	      literal_pool = search_frag->tc_frag_data.literal_frag;
10119 	      gas_assert (literal_pool->fr_subtype == RELAX_LITERAL_POOL_BEGIN);
10120 	      frchain_to = literal_pool->tc_frag_data.lit_frchain;
10121 	      gas_assert (frchain_to);
10122 	    }
10123 	  insert_after = literal_pool->tc_frag_data.literal_frag;
10124 	  dest_seg = insert_after->fr_next->tc_frag_data.lit_seg;
10125 
10126 	  *frag_splice = next_frag;
10127 	  search_frag->fr_next = insert_after->fr_next;
10128 	  insert_after->fr_next = search_frag;
10129 	  search_frag->tc_frag_data.lit_seg = dest_seg;
10130 	  literal_pool->tc_frag_data.literal_frag = search_frag;
10131 
10132 	  /* Now move any fixups associated with this frag to the
10133 	     right section.  */
10134 	  fix = frchain_from->fix_root;
10135 	  fix_splice = &(frchain_from->fix_root);
10136 	  while (fix)
10137 	    {
10138 	      next_fix = fix->fx_next;
10139 	      if (fix->fx_frag == search_frag)
10140 		{
10141 		  *fix_splice = next_fix;
10142 		  fix->fx_next = frchain_to->fix_root;
10143 		  frchain_to->fix_root = fix;
10144 		  if (frchain_to->fix_tail == NULL)
10145 		    frchain_to->fix_tail = fix;
10146 		}
10147 	      else
10148 		fix_splice = &(fix->fx_next);
10149 	      fix = next_fix;
10150 	    }
10151 	  search_frag = next_frag;
10152 	}
10153 
10154       if (frchain_from->fix_root != NULL)
10155 	{
10156 	  frchain_from = seg_info (segment->seg)->frchainP;
10157 	  as_warn (_("fixes not all moved from %s"), segment->seg->name);
10158 
10159 	  gas_assert (frchain_from->fix_root == NULL);
10160 	}
10161       frchain_from->fix_tail = NULL;
10162       xtensa_restore_emit_state (&state);
10163     }
10164 
10165   /* Now fix up the SEGMENT value for all the literal symbols.  */
10166   for (lit = literal_syms; lit; lit = lit->next)
10167     {
10168       symbolS *lit_sym = lit->sym;
10169       segT dseg = symbol_get_frag (lit_sym)->tc_frag_data.lit_seg;
10170       if (dseg)
10171 	S_SET_SEGMENT (lit_sym, dseg);
10172     }
10173 }
10174 
10175 
10176 /* Walk over all the frags for segments in a list and mark them as
10177    containing literals.  As clunky as this is, we can't rely on frag_var
10178    and frag_variant to get called in all situations.  */
10179 
10180 static void
10181 mark_literal_frags (seg_list *segment)
10182 {
10183   frchainS *frchain_from;
10184   fragS *search_frag;
10185 
10186   while (segment)
10187     {
10188       frchain_from = seg_info (segment->seg)->frchainP;
10189       search_frag = frchain_from->frch_root;
10190       while (search_frag)
10191 	{
10192 	  search_frag->tc_frag_data.is_literal = TRUE;
10193 	  search_frag = search_frag->fr_next;
10194 	}
10195       segment = segment->next;
10196     }
10197 }
10198 
10199 
10200 static void
10201 xtensa_reorder_seg_list (seg_list *head, segT after)
10202 {
10203   /* Move all of the sections in the section list to come
10204      after "after" in the gnu segment list.  */
10205 
10206   head = head->next;
10207   while (head)
10208     {
10209       segT literal_section = head->seg;
10210 
10211       /* Move the literal section after "after".  */
10212       gas_assert (literal_section);
10213       if (literal_section != after)
10214 	{
10215 	  bfd_section_list_remove (stdoutput, literal_section);
10216 	  bfd_section_list_insert_after (stdoutput, after, literal_section);
10217 	}
10218 
10219       head = head->next;
10220     }
10221 }
10222 
10223 
10224 /* Push all the literal segments to the end of the gnu list.  */
10225 
10226 static void
10227 xtensa_reorder_segments (void)
10228 {
10229   segT sec;
10230   segT last_sec = 0;
10231   int old_count = 0;
10232   int new_count = 0;
10233 
10234   for (sec = stdoutput->sections; sec != NULL; sec = sec->next)
10235     {
10236       last_sec = sec;
10237       old_count++;
10238     }
10239 
10240   /* Now that we have the last section, push all the literal
10241      sections to the end.  */
10242   xtensa_reorder_seg_list (literal_head, last_sec);
10243 
10244   /* Now perform the final error check.  */
10245   for (sec = stdoutput->sections; sec != NULL; sec = sec->next)
10246     new_count++;
10247   gas_assert (new_count == old_count);
10248 }
10249 
10250 
10251 /* Change the emit state (seg, subseg, and frag related stuff) to the
10252    correct location.  Return a emit_state which can be passed to
10253    xtensa_restore_emit_state to return to current fragment.  */
10254 
10255 static void
10256 xtensa_switch_to_literal_fragment (emit_state *result)
10257 {
10258   if (directive_state[directive_absolute_literals])
10259     {
10260       segT lit4_seg = cache_literal_section (TRUE);
10261       xtensa_switch_section_emit_state (result, lit4_seg, 0);
10262     }
10263   else
10264     xtensa_switch_to_non_abs_literal_fragment (result);
10265 
10266   /* Do a 4-byte align here.  */
10267   frag_align (2, 0, 0);
10268   record_alignment (now_seg, 2);
10269 }
10270 
10271 
10272 static void
10273 xtensa_switch_to_non_abs_literal_fragment (emit_state *result)
10274 {
10275   static bfd_boolean recursive = FALSE;
10276   fragS *pool_location = get_literal_pool_location (now_seg);
10277   segT lit_seg;
10278   bfd_boolean is_init =
10279     (now_seg && !strcmp (segment_name (now_seg), INIT_SECTION_NAME));
10280   bfd_boolean is_fini =
10281     (now_seg && !strcmp (segment_name (now_seg), FINI_SECTION_NAME));
10282 
10283   if (pool_location == NULL
10284       && !use_literal_section
10285       && !recursive
10286       && !is_init && ! is_fini)
10287     {
10288       as_bad (_("literal pool location required for text-section-literals; specify with .literal_position"));
10289 
10290       /* When we mark a literal pool location, we want to put a frag in
10291 	 the literal pool that points to it.  But to do that, we want to
10292 	 switch_to_literal_fragment.  But literal sections don't have
10293 	 literal pools, so their location is always null, so we would
10294 	 recurse forever.  This is kind of hacky, but it works.  */
10295 
10296       recursive = TRUE;
10297       xtensa_mark_literal_pool_location ();
10298       recursive = FALSE;
10299     }
10300 
10301   lit_seg = cache_literal_section (FALSE);
10302   xtensa_switch_section_emit_state (result, lit_seg, 0);
10303 
10304   if (!use_literal_section
10305       && !is_init && !is_fini
10306       && get_literal_pool_location (now_seg) != pool_location)
10307     {
10308       /* Close whatever frag is there.  */
10309       frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
10310       xtensa_set_frag_assembly_state (frag_now);
10311       frag_now->tc_frag_data.literal_frag = pool_location;
10312       frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
10313       xtensa_set_frag_assembly_state (frag_now);
10314     }
10315 }
10316 
10317 
10318 /* Call this function before emitting data into the literal section.
10319    This is a helper function for xtensa_switch_to_literal_fragment.
10320    This is similar to a .section new_now_seg subseg. */
10321 
10322 static void
10323 xtensa_switch_section_emit_state (emit_state *state,
10324 				  segT new_now_seg,
10325 				  subsegT new_now_subseg)
10326 {
10327   state->name = now_seg->name;
10328   state->now_seg = now_seg;
10329   state->now_subseg = now_subseg;
10330   state->generating_literals = generating_literals;
10331   generating_literals++;
10332   subseg_set (new_now_seg, new_now_subseg);
10333 }
10334 
10335 
10336 /* Use to restore the emitting into the normal place.  */
10337 
10338 static void
10339 xtensa_restore_emit_state (emit_state *state)
10340 {
10341   generating_literals = state->generating_literals;
10342   subseg_set (state->now_seg, state->now_subseg);
10343 }
10344 
10345 
10346 /* Predicate function used to look up a section in a particular group.  */
10347 
10348 static bfd_boolean
10349 match_section_group (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *inf)
10350 {
10351   const char *gname = inf;
10352   const char *group_name = elf_group_name (sec);
10353 
10354   return (group_name == gname
10355 	  || (group_name != NULL
10356 	      && gname != NULL
10357 	      && strcmp (group_name, gname) == 0));
10358 }
10359 
10360 
10361 /* Get the literal section to be used for the current text section.
10362    The result may be cached in the default_lit_sections structure.  */
10363 
10364 static segT
10365 cache_literal_section (bfd_boolean use_abs_literals)
10366 {
10367   const char *text_name, *group_name = 0;
10368   char *base_name, *name, *suffix;
10369   segT *pcached;
10370   segT seg, current_section;
10371   int current_subsec;
10372   bfd_boolean linkonce = FALSE;
10373 
10374   /* Save the current section/subsection.  */
10375   current_section = now_seg;
10376   current_subsec = now_subseg;
10377 
10378   /* Clear the cached values if they are no longer valid.  */
10379   if (now_seg != default_lit_sections.current_text_seg)
10380     {
10381       default_lit_sections.current_text_seg = now_seg;
10382       default_lit_sections.lit_seg = NULL;
10383       default_lit_sections.lit4_seg = NULL;
10384     }
10385 
10386   /* Check if the literal section is already cached.  */
10387   if (use_abs_literals)
10388     pcached = &default_lit_sections.lit4_seg;
10389   else
10390     pcached = &default_lit_sections.lit_seg;
10391 
10392   if (*pcached)
10393     return *pcached;
10394 
10395   text_name = default_lit_sections.lit_prefix;
10396   if (! text_name || ! *text_name)
10397     {
10398       text_name = segment_name (current_section);
10399       group_name = elf_group_name (current_section);
10400       linkonce = (current_section->flags & SEC_LINK_ONCE) != 0;
10401     }
10402 
10403   base_name = use_abs_literals ? ".lit4" : ".literal";
10404   if (group_name)
10405     {
10406       name = xmalloc (strlen (base_name) + strlen (group_name) + 2);
10407       sprintf (name, "%s.%s", base_name, group_name);
10408     }
10409   else if (strncmp (text_name, ".gnu.linkonce.", linkonce_len) == 0)
10410     {
10411       suffix = strchr (text_name + linkonce_len, '.');
10412 
10413       name = xmalloc (linkonce_len + strlen (base_name) + 1
10414 		      + (suffix ? strlen (suffix) : 0));
10415       strcpy (name, ".gnu.linkonce");
10416       strcat (name, base_name);
10417       if (suffix)
10418 	strcat (name, suffix);
10419       linkonce = TRUE;
10420     }
10421   else
10422     {
10423       /* If the section name begins or ends with ".text", then replace
10424 	 that portion instead of appending an additional suffix.  */
10425       size_t len = strlen (text_name);
10426       if (len >= 5
10427 	  && (strcmp (text_name + len - 5, ".text") == 0
10428 	      || strncmp (text_name, ".text", 5) == 0))
10429 	len -= 5;
10430 
10431       name = xmalloc (len + strlen (base_name) + 1);
10432       if (strncmp (text_name, ".text", 5) == 0)
10433 	{
10434 	  strcpy (name, base_name);
10435 	  strcat (name, text_name + 5);
10436 	}
10437       else
10438 	{
10439 	  strcpy (name, text_name);
10440 	  strcpy (name + len, base_name);
10441 	}
10442     }
10443 
10444   /* Canonicalize section names to allow renaming literal sections.
10445      The group name, if any, came from the current text section and
10446      has already been canonicalized.  */
10447   name = tc_canonicalize_symbol_name (name);
10448 
10449   seg = bfd_get_section_by_name_if (stdoutput, name, match_section_group,
10450 				    (void *) group_name);
10451   if (! seg)
10452     {
10453       flagword flags;
10454 
10455       seg = subseg_force_new (name, 0);
10456 
10457       if (! use_abs_literals)
10458 	{
10459 	  /* Add the newly created literal segment to the list.  */
10460 	  seg_list *n = (seg_list *) xmalloc (sizeof (seg_list));
10461 	  n->seg = seg;
10462 	  n->next = literal_head->next;
10463 	  literal_head->next = n;
10464 	}
10465 
10466       flags = (SEC_HAS_CONTENTS | SEC_READONLY | SEC_ALLOC | SEC_LOAD
10467 	       | (linkonce ? (SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD) : 0)
10468 	       | (use_abs_literals ? SEC_DATA : SEC_CODE));
10469 
10470       elf_group_name (seg) = group_name;
10471 
10472       bfd_set_section_flags (stdoutput, seg, flags);
10473       bfd_set_section_alignment (stdoutput, seg, 2);
10474     }
10475 
10476   *pcached = seg;
10477   subseg_set (current_section, current_subsec);
10478   return seg;
10479 }
10480 
10481 
10482 /* Property Tables Stuff.  */
10483 
10484 #define XTENSA_INSN_SEC_NAME ".xt.insn"
10485 #define XTENSA_LIT_SEC_NAME ".xt.lit"
10486 #define XTENSA_PROP_SEC_NAME ".xt.prop"
10487 
10488 typedef bfd_boolean (*frag_predicate) (const fragS *);
10489 typedef void (*frag_flags_fn) (const fragS *, frag_flags *);
10490 
10491 static bfd_boolean get_frag_is_literal (const fragS *);
10492 static void xtensa_create_property_segments
10493   (frag_predicate, frag_predicate, const char *, xt_section_type);
10494 static void xtensa_create_xproperty_segments
10495   (frag_flags_fn, const char *, xt_section_type);
10496 static bfd_boolean exclude_section_from_property_tables (segT);
10497 static bfd_boolean section_has_property (segT, frag_predicate);
10498 static bfd_boolean section_has_xproperty (segT, frag_flags_fn);
10499 static void add_xt_block_frags
10500   (segT, xtensa_block_info **, frag_predicate, frag_predicate);
10501 static bfd_boolean xtensa_frag_flags_is_empty (const frag_flags *);
10502 static void xtensa_frag_flags_init (frag_flags *);
10503 static void get_frag_property_flags (const fragS *, frag_flags *);
10504 static flagword frag_flags_to_number (const frag_flags *);
10505 static void add_xt_prop_frags (segT, xtensa_block_info **, frag_flags_fn);
10506 
10507 /* Set up property tables after relaxation.  */
10508 
10509 void
10510 xtensa_post_relax_hook (void)
10511 {
10512   xtensa_move_seg_list_to_beginning (literal_head);
10513 
10514   xtensa_find_unmarked_state_frags ();
10515   xtensa_mark_frags_for_org ();
10516   xtensa_mark_difference_of_two_symbols ();
10517 
10518   xtensa_create_property_segments (get_frag_is_literal,
10519 				   NULL,
10520 				   XTENSA_LIT_SEC_NAME,
10521 				   xt_literal_sec);
10522   xtensa_create_xproperty_segments (get_frag_property_flags,
10523 				    XTENSA_PROP_SEC_NAME,
10524 				    xt_prop_sec);
10525 
10526   if (warn_unaligned_branch_targets)
10527     bfd_map_over_sections (stdoutput, xtensa_find_unaligned_branch_targets, 0);
10528   bfd_map_over_sections (stdoutput, xtensa_find_unaligned_loops, 0);
10529 }
10530 
10531 
10532 /* This function is only meaningful after xtensa_move_literals.  */
10533 
10534 static bfd_boolean
10535 get_frag_is_literal (const fragS *fragP)
10536 {
10537   gas_assert (fragP != NULL);
10538   return fragP->tc_frag_data.is_literal;
10539 }
10540 
10541 
10542 static void
10543 xtensa_create_property_segments (frag_predicate property_function,
10544 				 frag_predicate end_property_function,
10545 				 const char *section_name_base,
10546 				 xt_section_type sec_type)
10547 {
10548   segT *seclist;
10549 
10550   /* Walk over all of the current segments.
10551      Walk over each fragment
10552      For each non-empty fragment,
10553      Build a property record (append where possible).  */
10554 
10555   for (seclist = &stdoutput->sections;
10556        seclist && *seclist;
10557        seclist = &(*seclist)->next)
10558     {
10559       segT sec = *seclist;
10560 
10561       if (exclude_section_from_property_tables (sec))
10562 	continue;
10563 
10564       if (section_has_property (sec, property_function))
10565 	{
10566 	  segment_info_type *xt_seg_info;
10567 	  xtensa_block_info **xt_blocks;
10568 	  segT prop_sec = xtensa_make_property_section (sec, section_name_base);
10569 
10570 	  prop_sec->output_section = prop_sec;
10571 	  subseg_set (prop_sec, 0);
10572 	  xt_seg_info = seg_info (prop_sec);
10573 	  xt_blocks = &xt_seg_info->tc_segment_info_data.blocks[sec_type];
10574 
10575 	  /* Walk over all of the frchains here and add new sections.  */
10576 	  add_xt_block_frags (sec, xt_blocks, property_function,
10577 			      end_property_function);
10578 	}
10579     }
10580 
10581   /* Now we fill them out....  */
10582 
10583   for (seclist = &stdoutput->sections;
10584        seclist && *seclist;
10585        seclist = &(*seclist)->next)
10586     {
10587       segment_info_type *seginfo;
10588       xtensa_block_info *block;
10589       segT sec = *seclist;
10590 
10591       seginfo = seg_info (sec);
10592       block = seginfo->tc_segment_info_data.blocks[sec_type];
10593 
10594       if (block)
10595 	{
10596 	  xtensa_block_info *cur_block;
10597 	  int num_recs = 0;
10598 	  bfd_size_type rec_size;
10599 
10600 	  for (cur_block = block; cur_block; cur_block = cur_block->next)
10601 	    num_recs++;
10602 
10603 	  rec_size = num_recs * 8;
10604 	  bfd_set_section_size (stdoutput, sec, rec_size);
10605 
10606 	  if (num_recs)
10607 	    {
10608 	      char *frag_data;
10609 	      int i;
10610 
10611 	      subseg_set (sec, 0);
10612 	      frag_data = frag_more (rec_size);
10613 	      cur_block = block;
10614 	      for (i = 0; i < num_recs; i++)
10615 		{
10616 		  fixS *fix;
10617 
10618 		  /* Write the fixup.  */
10619 		  gas_assert (cur_block);
10620 		  fix = fix_new (frag_now, i * 8, 4,
10621 				 section_symbol (cur_block->sec),
10622 				 cur_block->offset,
10623 				 FALSE, BFD_RELOC_32);
10624 		  fix->fx_file = "<internal>";
10625 		  fix->fx_line = 0;
10626 
10627 		  /* Write the length.  */
10628 		  md_number_to_chars (&frag_data[4 + i * 8],
10629 				      cur_block->size, 4);
10630 		  cur_block = cur_block->next;
10631 		}
10632 	      frag_wane (frag_now);
10633 	      frag_new (0);
10634 	      frag_wane (frag_now);
10635 	    }
10636 	}
10637     }
10638 }
10639 
10640 
10641 static void
10642 xtensa_create_xproperty_segments (frag_flags_fn flag_fn,
10643 				  const char *section_name_base,
10644 				  xt_section_type sec_type)
10645 {
10646   segT *seclist;
10647 
10648   /* Walk over all of the current segments.
10649      Walk over each fragment.
10650      For each fragment that has instructions,
10651      build an instruction record (append where possible).  */
10652 
10653   for (seclist = &stdoutput->sections;
10654        seclist && *seclist;
10655        seclist = &(*seclist)->next)
10656     {
10657       segT sec = *seclist;
10658 
10659       if (exclude_section_from_property_tables (sec))
10660 	continue;
10661 
10662       if (section_has_xproperty (sec, flag_fn))
10663 	{
10664 	  segment_info_type *xt_seg_info;
10665 	  xtensa_block_info **xt_blocks;
10666 	  segT prop_sec = xtensa_make_property_section (sec, section_name_base);
10667 
10668 	  prop_sec->output_section = prop_sec;
10669 	  subseg_set (prop_sec, 0);
10670 	  xt_seg_info = seg_info (prop_sec);
10671 	  xt_blocks = &xt_seg_info->tc_segment_info_data.blocks[sec_type];
10672 
10673 	  /* Walk over all of the frchains here and add new sections.  */
10674 	  add_xt_prop_frags (sec, xt_blocks, flag_fn);
10675 	}
10676     }
10677 
10678   /* Now we fill them out....  */
10679 
10680   for (seclist = &stdoutput->sections;
10681        seclist && *seclist;
10682        seclist = &(*seclist)->next)
10683     {
10684       segment_info_type *seginfo;
10685       xtensa_block_info *block;
10686       segT sec = *seclist;
10687 
10688       seginfo = seg_info (sec);
10689       block = seginfo->tc_segment_info_data.blocks[sec_type];
10690 
10691       if (block)
10692 	{
10693 	  xtensa_block_info *cur_block;
10694 	  int num_recs = 0;
10695 	  bfd_size_type rec_size;
10696 
10697 	  for (cur_block = block; cur_block; cur_block = cur_block->next)
10698 	    num_recs++;
10699 
10700 	  rec_size = num_recs * (8 + 4);
10701 	  bfd_set_section_size (stdoutput, sec, rec_size);
10702 	  /* elf_section_data (sec)->this_hdr.sh_entsize = 12; */
10703 
10704 	  if (num_recs)
10705 	    {
10706 	      char *frag_data;
10707 	      int i;
10708 
10709 	      subseg_set (sec, 0);
10710 	      frag_data = frag_more (rec_size);
10711 	      cur_block = block;
10712 	      for (i = 0; i < num_recs; i++)
10713 		{
10714 		  fixS *fix;
10715 
10716 		  /* Write the fixup.  */
10717 		  gas_assert (cur_block);
10718 		  fix = fix_new (frag_now, i * 12, 4,
10719 				 section_symbol (cur_block->sec),
10720 				 cur_block->offset,
10721 				 FALSE, BFD_RELOC_32);
10722 		  fix->fx_file = "<internal>";
10723 		  fix->fx_line = 0;
10724 
10725 		  /* Write the length.  */
10726 		  md_number_to_chars (&frag_data[4 + i * 12],
10727 				      cur_block->size, 4);
10728 		  md_number_to_chars (&frag_data[8 + i * 12],
10729 				      frag_flags_to_number (&cur_block->flags),
10730 				      sizeof (flagword));
10731 		  cur_block = cur_block->next;
10732 		}
10733 	      frag_wane (frag_now);
10734 	      frag_new (0);
10735 	      frag_wane (frag_now);
10736 	    }
10737 	}
10738     }
10739 }
10740 
10741 
10742 static bfd_boolean
10743 exclude_section_from_property_tables (segT sec)
10744 {
10745   flagword flags = bfd_get_section_flags (stdoutput, sec);
10746 
10747   /* Sections that don't contribute to the memory footprint are excluded.  */
10748   if ((flags & SEC_DEBUGGING)
10749       || !(flags & SEC_ALLOC)
10750       || (flags & SEC_MERGE))
10751     return TRUE;
10752 
10753   /* Linker cie and fde optimizations mess up property entries for
10754      eh_frame sections, but there is nothing inside them relevant to
10755      property tables anyway.  */
10756   if (strcmp (sec->name, ".eh_frame") == 0)
10757     return TRUE;
10758 
10759   return FALSE;
10760 }
10761 
10762 
10763 static bfd_boolean
10764 section_has_property (segT sec, frag_predicate property_function)
10765 {
10766   segment_info_type *seginfo = seg_info (sec);
10767   fragS *fragP;
10768 
10769   if (seginfo && seginfo->frchainP)
10770     {
10771       for (fragP = seginfo->frchainP->frch_root; fragP; fragP = fragP->fr_next)
10772 	{
10773 	  if (property_function (fragP)
10774 	      && (fragP->fr_type != rs_fill || fragP->fr_fix != 0))
10775 	    return TRUE;
10776 	}
10777     }
10778   return FALSE;
10779 }
10780 
10781 
10782 static bfd_boolean
10783 section_has_xproperty (segT sec, frag_flags_fn property_function)
10784 {
10785   segment_info_type *seginfo = seg_info (sec);
10786   fragS *fragP;
10787 
10788   if (seginfo && seginfo->frchainP)
10789     {
10790       for (fragP = seginfo->frchainP->frch_root; fragP; fragP = fragP->fr_next)
10791 	{
10792 	  frag_flags prop_flags;
10793 	  property_function (fragP, &prop_flags);
10794 	  if (!xtensa_frag_flags_is_empty (&prop_flags))
10795 	    return TRUE;
10796 	}
10797     }
10798   return FALSE;
10799 }
10800 
10801 
10802 /* Two types of block sections exist right now: literal and insns.  */
10803 
10804 static void
10805 add_xt_block_frags (segT sec,
10806 		    xtensa_block_info **xt_block,
10807 		    frag_predicate property_function,
10808 		    frag_predicate end_property_function)
10809 {
10810   fragS *fragP;
10811 
10812   /* Build it if needed.  */
10813   while (*xt_block != NULL)
10814     xt_block = &(*xt_block)->next;
10815   /* We are either at NULL at the beginning or at the end.  */
10816 
10817   /* Walk through the frags.  */
10818   if (seg_info (sec)->frchainP)
10819     {
10820       for (fragP = seg_info (sec)->frchainP->frch_root;
10821 	   fragP;
10822 	   fragP = fragP->fr_next)
10823 	{
10824 	  if (property_function (fragP)
10825 	      && (fragP->fr_type != rs_fill || fragP->fr_fix != 0))
10826 	    {
10827 	      if (*xt_block != NULL)
10828 		{
10829 		  if ((*xt_block)->offset + (*xt_block)->size
10830 		      == fragP->fr_address)
10831 		    (*xt_block)->size += fragP->fr_fix;
10832 		  else
10833 		    xt_block = &((*xt_block)->next);
10834 		}
10835 	      if (*xt_block == NULL)
10836 		{
10837 		  xtensa_block_info *new_block = (xtensa_block_info *)
10838 		    xmalloc (sizeof (xtensa_block_info));
10839 		  new_block->sec = sec;
10840 		  new_block->offset = fragP->fr_address;
10841 		  new_block->size = fragP->fr_fix;
10842 		  new_block->next = NULL;
10843 		  xtensa_frag_flags_init (&new_block->flags);
10844 		  *xt_block = new_block;
10845 		}
10846 	      if (end_property_function
10847 		  && end_property_function (fragP))
10848 		{
10849 		  xt_block = &((*xt_block)->next);
10850 		}
10851 	    }
10852 	}
10853     }
10854 }
10855 
10856 
10857 /* Break the encapsulation of add_xt_prop_frags here.  */
10858 
10859 static bfd_boolean
10860 xtensa_frag_flags_is_empty (const frag_flags *prop_flags)
10861 {
10862   if (prop_flags->is_literal
10863       || prop_flags->is_insn
10864       || prop_flags->is_data
10865       || prop_flags->is_unreachable)
10866     return FALSE;
10867   return TRUE;
10868 }
10869 
10870 
10871 static void
10872 xtensa_frag_flags_init (frag_flags *prop_flags)
10873 {
10874   memset (prop_flags, 0, sizeof (frag_flags));
10875 }
10876 
10877 
10878 static void
10879 get_frag_property_flags (const fragS *fragP, frag_flags *prop_flags)
10880 {
10881   xtensa_frag_flags_init (prop_flags);
10882   if (fragP->tc_frag_data.is_literal)
10883     prop_flags->is_literal = TRUE;
10884   if (fragP->tc_frag_data.is_specific_opcode
10885       || fragP->tc_frag_data.is_no_transform)
10886     {
10887       prop_flags->is_no_transform = TRUE;
10888       if (xtensa_frag_flags_is_empty (prop_flags))
10889 	prop_flags->is_data = TRUE;
10890     }
10891   if (fragP->tc_frag_data.is_unreachable)
10892     prop_flags->is_unreachable = TRUE;
10893   else if (fragP->tc_frag_data.is_insn)
10894     {
10895       prop_flags->is_insn = TRUE;
10896       if (fragP->tc_frag_data.is_loop_target)
10897 	prop_flags->insn.is_loop_target = TRUE;
10898       if (fragP->tc_frag_data.is_branch_target)
10899 	prop_flags->insn.is_branch_target = TRUE;
10900       if (fragP->tc_frag_data.is_no_density)
10901 	prop_flags->insn.is_no_density = TRUE;
10902       if (fragP->tc_frag_data.use_absolute_literals)
10903 	prop_flags->insn.is_abslit = TRUE;
10904     }
10905   if (fragP->tc_frag_data.is_align)
10906     {
10907       prop_flags->is_align = TRUE;
10908       prop_flags->alignment = fragP->tc_frag_data.alignment;
10909       if (xtensa_frag_flags_is_empty (prop_flags))
10910 	prop_flags->is_data = TRUE;
10911     }
10912 }
10913 
10914 
10915 static flagword
10916 frag_flags_to_number (const frag_flags *prop_flags)
10917 {
10918   flagword num = 0;
10919   if (prop_flags->is_literal)
10920     num |= XTENSA_PROP_LITERAL;
10921   if (prop_flags->is_insn)
10922     num |= XTENSA_PROP_INSN;
10923   if (prop_flags->is_data)
10924     num |= XTENSA_PROP_DATA;
10925   if (prop_flags->is_unreachable)
10926     num |= XTENSA_PROP_UNREACHABLE;
10927   if (prop_flags->insn.is_loop_target)
10928     num |= XTENSA_PROP_INSN_LOOP_TARGET;
10929   if (prop_flags->insn.is_branch_target)
10930     {
10931       num |= XTENSA_PROP_INSN_BRANCH_TARGET;
10932       num = SET_XTENSA_PROP_BT_ALIGN (num, prop_flags->insn.bt_align_priority);
10933     }
10934 
10935   if (prop_flags->insn.is_no_density)
10936     num |= XTENSA_PROP_INSN_NO_DENSITY;
10937   if (prop_flags->is_no_transform)
10938     num |= XTENSA_PROP_NO_TRANSFORM;
10939   if (prop_flags->insn.is_no_reorder)
10940     num |= XTENSA_PROP_INSN_NO_REORDER;
10941   if (prop_flags->insn.is_abslit)
10942     num |= XTENSA_PROP_INSN_ABSLIT;
10943 
10944   if (prop_flags->is_align)
10945     {
10946       num |= XTENSA_PROP_ALIGN;
10947       num = SET_XTENSA_PROP_ALIGNMENT (num, prop_flags->alignment);
10948     }
10949 
10950   return num;
10951 }
10952 
10953 
10954 static bfd_boolean
10955 xtensa_frag_flags_combinable (const frag_flags *prop_flags_1,
10956 			      const frag_flags *prop_flags_2)
10957 {
10958   /* Cannot combine with an end marker.  */
10959 
10960   if (prop_flags_1->is_literal != prop_flags_2->is_literal)
10961     return FALSE;
10962   if (prop_flags_1->is_insn != prop_flags_2->is_insn)
10963     return FALSE;
10964   if (prop_flags_1->is_data != prop_flags_2->is_data)
10965     return FALSE;
10966 
10967   if (prop_flags_1->is_insn)
10968     {
10969       /* Properties of the beginning of the frag.  */
10970       if (prop_flags_2->insn.is_loop_target)
10971 	return FALSE;
10972       if (prop_flags_2->insn.is_branch_target)
10973 	return FALSE;
10974       if (prop_flags_1->insn.is_no_density !=
10975 	  prop_flags_2->insn.is_no_density)
10976 	return FALSE;
10977       if (prop_flags_1->is_no_transform !=
10978 	  prop_flags_2->is_no_transform)
10979 	return FALSE;
10980       if (prop_flags_1->insn.is_no_reorder !=
10981 	  prop_flags_2->insn.is_no_reorder)
10982 	return FALSE;
10983       if (prop_flags_1->insn.is_abslit !=
10984 	  prop_flags_2->insn.is_abslit)
10985 	return FALSE;
10986     }
10987 
10988   if (prop_flags_1->is_align)
10989     return FALSE;
10990 
10991   return TRUE;
10992 }
10993 
10994 
10995 static bfd_vma
10996 xt_block_aligned_size (const xtensa_block_info *xt_block)
10997 {
10998   bfd_vma end_addr;
10999   unsigned align_bits;
11000 
11001   if (!xt_block->flags.is_align)
11002     return xt_block->size;
11003 
11004   end_addr = xt_block->offset + xt_block->size;
11005   align_bits = xt_block->flags.alignment;
11006   end_addr = ((end_addr + ((1 << align_bits) -1)) >> align_bits) << align_bits;
11007   return end_addr - xt_block->offset;
11008 }
11009 
11010 
11011 static bfd_boolean
11012 xtensa_xt_block_combine (xtensa_block_info *xt_block,
11013 			 const xtensa_block_info *xt_block_2)
11014 {
11015   if (xt_block->sec != xt_block_2->sec)
11016     return FALSE;
11017   if (xt_block->offset + xt_block_aligned_size (xt_block)
11018       != xt_block_2->offset)
11019     return FALSE;
11020 
11021   if (xt_block_2->size == 0
11022       && (!xt_block_2->flags.is_unreachable
11023 	  || xt_block->flags.is_unreachable))
11024     {
11025       if (xt_block_2->flags.is_align
11026 	  && xt_block->flags.is_align)
11027 	{
11028 	  /* Nothing needed.  */
11029 	  if (xt_block->flags.alignment >= xt_block_2->flags.alignment)
11030 	    return TRUE;
11031 	}
11032       else
11033 	{
11034 	  if (xt_block_2->flags.is_align)
11035 	    {
11036 	      /* Push alignment to previous entry.  */
11037 	      xt_block->flags.is_align = xt_block_2->flags.is_align;
11038 	      xt_block->flags.alignment = xt_block_2->flags.alignment;
11039 	    }
11040 	  return TRUE;
11041 	}
11042     }
11043   if (!xtensa_frag_flags_combinable (&xt_block->flags,
11044 				     &xt_block_2->flags))
11045     return FALSE;
11046 
11047   xt_block->size += xt_block_2->size;
11048 
11049   if (xt_block_2->flags.is_align)
11050     {
11051       xt_block->flags.is_align = TRUE;
11052       xt_block->flags.alignment = xt_block_2->flags.alignment;
11053     }
11054 
11055   return TRUE;
11056 }
11057 
11058 
11059 static void
11060 add_xt_prop_frags (segT sec,
11061 		   xtensa_block_info **xt_block,
11062 		   frag_flags_fn property_function)
11063 {
11064   fragS *fragP;
11065 
11066   /* Build it if needed.  */
11067   while (*xt_block != NULL)
11068     {
11069       xt_block = &(*xt_block)->next;
11070     }
11071   /* We are either at NULL at the beginning or at the end.  */
11072 
11073   /* Walk through the frags.  */
11074   if (seg_info (sec)->frchainP)
11075     {
11076       for (fragP = seg_info (sec)->frchainP->frch_root; fragP;
11077 	   fragP = fragP->fr_next)
11078 	{
11079 	  xtensa_block_info tmp_block;
11080 	  tmp_block.sec = sec;
11081 	  tmp_block.offset = fragP->fr_address;
11082 	  tmp_block.size = fragP->fr_fix;
11083 	  tmp_block.next = NULL;
11084 	  property_function (fragP, &tmp_block.flags);
11085 
11086 	  if (!xtensa_frag_flags_is_empty (&tmp_block.flags))
11087 	    /* && fragP->fr_fix != 0) */
11088 	    {
11089 	      if ((*xt_block) == NULL
11090 		  || !xtensa_xt_block_combine (*xt_block, &tmp_block))
11091 		{
11092 		  xtensa_block_info *new_block;
11093 		  if ((*xt_block) != NULL)
11094 		    xt_block = &(*xt_block)->next;
11095 		  new_block = (xtensa_block_info *)
11096 		    xmalloc (sizeof (xtensa_block_info));
11097 		  *new_block = tmp_block;
11098 		  *xt_block = new_block;
11099 		}
11100 	    }
11101 	}
11102     }
11103 }
11104 
11105 
11106 /* op_placement_info_table */
11107 
11108 /* op_placement_info makes it easier to determine which
11109    ops can go in which slots.  */
11110 
11111 static void
11112 init_op_placement_info_table (void)
11113 {
11114   xtensa_isa isa = xtensa_default_isa;
11115   xtensa_insnbuf ibuf = xtensa_insnbuf_alloc (isa);
11116   xtensa_opcode opcode;
11117   xtensa_format fmt;
11118   int slot;
11119   int num_opcodes = xtensa_isa_num_opcodes (isa);
11120 
11121   op_placement_table = (op_placement_info_table)
11122     xmalloc (sizeof (op_placement_info) * num_opcodes);
11123   gas_assert (xtensa_isa_num_formats (isa) < MAX_FORMATS);
11124 
11125   for (opcode = 0; opcode < num_opcodes; opcode++)
11126     {
11127       op_placement_info *opi = &op_placement_table[opcode];
11128       /* FIXME: Make tinsn allocation dynamic.  */
11129       if (xtensa_opcode_num_operands (isa, opcode) > MAX_INSN_ARGS)
11130 	as_fatal (_("too many operands in instruction"));
11131       opi->narrowest = XTENSA_UNDEFINED;
11132       opi->narrowest_size = 0x7F;
11133       opi->narrowest_slot = 0;
11134       opi->formats = 0;
11135       opi->num_formats = 0;
11136       opi->issuef = 0;
11137       for (fmt = 0; fmt < xtensa_isa_num_formats (isa); fmt++)
11138 	{
11139 	  opi->slots[fmt] = 0;
11140 	  for (slot = 0; slot < xtensa_format_num_slots (isa, fmt); slot++)
11141 	    {
11142 	      if (xtensa_opcode_encode (isa, fmt, slot, ibuf, opcode) == 0)
11143 		{
11144 		  int fmt_length = xtensa_format_length (isa, fmt);
11145 		  opi->issuef++;
11146 		  set_bit (fmt, opi->formats);
11147 		  set_bit (slot, opi->slots[fmt]);
11148 		  if (fmt_length < opi->narrowest_size
11149 		      || (fmt_length == opi->narrowest_size
11150 			  && (xtensa_format_num_slots (isa, fmt)
11151 			      < xtensa_format_num_slots (isa,
11152 							 opi->narrowest))))
11153 		    {
11154 		      opi->narrowest = fmt;
11155 		      opi->narrowest_size = fmt_length;
11156 		      opi->narrowest_slot = slot;
11157 		    }
11158 		}
11159 	    }
11160 	  if (opi->formats)
11161 	    opi->num_formats++;
11162 	}
11163     }
11164   xtensa_insnbuf_free (isa, ibuf);
11165 }
11166 
11167 
11168 bfd_boolean
11169 opcode_fits_format_slot (xtensa_opcode opcode, xtensa_format fmt, int slot)
11170 {
11171   return bit_is_set (slot, op_placement_table[opcode].slots[fmt]);
11172 }
11173 
11174 
11175 /* If the opcode is available in a single slot format, return its size.  */
11176 
11177 static int
11178 xg_get_single_size (xtensa_opcode opcode)
11179 {
11180   return op_placement_table[opcode].narrowest_size;
11181 }
11182 
11183 
11184 static xtensa_format
11185 xg_get_single_format (xtensa_opcode opcode)
11186 {
11187   return op_placement_table[opcode].narrowest;
11188 }
11189 
11190 
11191 static int
11192 xg_get_single_slot (xtensa_opcode opcode)
11193 {
11194   return op_placement_table[opcode].narrowest_slot;
11195 }
11196 
11197 
11198 /* Instruction Stack Functions (from "xtensa-istack.h").  */
11199 
11200 void
11201 istack_init (IStack *stack)
11202 {
11203   stack->ninsn = 0;
11204 }
11205 
11206 
11207 bfd_boolean
11208 istack_empty (IStack *stack)
11209 {
11210   return (stack->ninsn == 0);
11211 }
11212 
11213 
11214 bfd_boolean
11215 istack_full (IStack *stack)
11216 {
11217   return (stack->ninsn == MAX_ISTACK);
11218 }
11219 
11220 
11221 /* Return a pointer to the top IStack entry.
11222    It is an error to call this if istack_empty () is TRUE. */
11223 
11224 TInsn *
11225 istack_top (IStack *stack)
11226 {
11227   int rec = stack->ninsn - 1;
11228   gas_assert (!istack_empty (stack));
11229   return &stack->insn[rec];
11230 }
11231 
11232 
11233 /* Add a new TInsn to an IStack.
11234    It is an error to call this if istack_full () is TRUE.  */
11235 
11236 void
11237 istack_push (IStack *stack, TInsn *insn)
11238 {
11239   int rec = stack->ninsn;
11240   gas_assert (!istack_full (stack));
11241   stack->insn[rec] = *insn;
11242   stack->ninsn++;
11243 }
11244 
11245 
11246 /* Clear space for the next TInsn on the IStack and return a pointer
11247    to it.  It is an error to call this if istack_full () is TRUE.  */
11248 
11249 TInsn *
11250 istack_push_space (IStack *stack)
11251 {
11252   int rec = stack->ninsn;
11253   TInsn *insn;
11254   gas_assert (!istack_full (stack));
11255   insn = &stack->insn[rec];
11256   tinsn_init (insn);
11257   stack->ninsn++;
11258   return insn;
11259 }
11260 
11261 
11262 /* Remove the last pushed instruction.  It is an error to call this if
11263    istack_empty () returns TRUE.  */
11264 
11265 void
11266 istack_pop (IStack *stack)
11267 {
11268   int rec = stack->ninsn - 1;
11269   gas_assert (!istack_empty (stack));
11270   stack->ninsn--;
11271   tinsn_init (&stack->insn[rec]);
11272 }
11273 
11274 
11275 /* TInsn functions.  */
11276 
11277 void
11278 tinsn_init (TInsn *dst)
11279 {
11280   memset (dst, 0, sizeof (TInsn));
11281 }
11282 
11283 
11284 /* Return TRUE if ANY of the operands in the insn are symbolic.  */
11285 
11286 static bfd_boolean
11287 tinsn_has_symbolic_operands (const TInsn *insn)
11288 {
11289   int i;
11290   int n = insn->ntok;
11291 
11292   gas_assert (insn->insn_type == ITYPE_INSN);
11293 
11294   for (i = 0; i < n; ++i)
11295     {
11296       switch (insn->tok[i].X_op)
11297 	{
11298 	case O_register:
11299 	case O_constant:
11300 	  break;
11301 	default:
11302 	  return TRUE;
11303 	}
11304     }
11305   return FALSE;
11306 }
11307 
11308 
11309 bfd_boolean
11310 tinsn_has_invalid_symbolic_operands (const TInsn *insn)
11311 {
11312   xtensa_isa isa = xtensa_default_isa;
11313   int i;
11314   int n = insn->ntok;
11315 
11316   gas_assert (insn->insn_type == ITYPE_INSN);
11317 
11318   for (i = 0; i < n; ++i)
11319     {
11320       switch (insn->tok[i].X_op)
11321 	{
11322 	case O_register:
11323 	case O_constant:
11324 	  break;
11325 	case O_big:
11326 	case O_illegal:
11327 	case O_absent:
11328 	  /* Errors for these types are caught later.  */
11329 	  break;
11330 	case O_hi16:
11331 	case O_lo16:
11332 	default:
11333 	  /* Symbolic immediates are only allowed on the last immediate
11334 	     operand.  At this time, CONST16 is the only opcode where we
11335 	     support non-PC-relative relocations.  */
11336 	  if (i != get_relaxable_immed (insn->opcode)
11337 	      || (xtensa_operand_is_PCrelative (isa, insn->opcode, i) != 1
11338 		  && insn->opcode != xtensa_const16_opcode))
11339 	    {
11340 	      as_bad (_("invalid symbolic operand"));
11341 	      return TRUE;
11342 	    }
11343 	}
11344     }
11345   return FALSE;
11346 }
11347 
11348 
11349 /* For assembly code with complex expressions (e.g. subtraction),
11350    we have to build them in the literal pool so that
11351    their results are calculated correctly after relaxation.
11352    The relaxation only handles expressions that
11353    boil down to SYMBOL + OFFSET.  */
11354 
11355 static bfd_boolean
11356 tinsn_has_complex_operands (const TInsn *insn)
11357 {
11358   int i;
11359   int n = insn->ntok;
11360   gas_assert (insn->insn_type == ITYPE_INSN);
11361   for (i = 0; i < n; ++i)
11362     {
11363       switch (insn->tok[i].X_op)
11364 	{
11365 	case O_register:
11366 	case O_constant:
11367 	case O_symbol:
11368 	case O_lo16:
11369 	case O_hi16:
11370 	  break;
11371 	default:
11372 	  return TRUE;
11373 	}
11374     }
11375   return FALSE;
11376 }
11377 
11378 
11379 /* Encode a TInsn opcode and its constant operands into slotbuf.
11380    Return TRUE if there is a symbol in the immediate field.  This
11381    function assumes that:
11382    1) The number of operands are correct.
11383    2) The insn_type is ITYPE_INSN.
11384    3) The opcode can be encoded in the specified format and slot.
11385    4) Operands are either O_constant or O_symbol, and all constants fit.  */
11386 
11387 static bfd_boolean
11388 tinsn_to_slotbuf (xtensa_format fmt,
11389 		  int slot,
11390 		  TInsn *tinsn,
11391 		  xtensa_insnbuf slotbuf)
11392 {
11393   xtensa_isa isa = xtensa_default_isa;
11394   xtensa_opcode opcode = tinsn->opcode;
11395   bfd_boolean has_fixup = FALSE;
11396   int noperands = xtensa_opcode_num_operands (isa, opcode);
11397   int i;
11398 
11399   gas_assert (tinsn->insn_type == ITYPE_INSN);
11400   if (noperands != tinsn->ntok)
11401     as_fatal (_("operand number mismatch"));
11402 
11403   if (xtensa_opcode_encode (isa, fmt, slot, slotbuf, opcode))
11404     {
11405       as_bad (_("cannot encode opcode \"%s\" in the given format \"%s\""),
11406 	      xtensa_opcode_name (isa, opcode), xtensa_format_name (isa, fmt));
11407       return FALSE;
11408     }
11409 
11410   for (i = 0; i < noperands; i++)
11411     {
11412       expressionS *exp = &tinsn->tok[i];
11413       int rc;
11414       unsigned line;
11415       char *file_name;
11416       uint32 opnd_value;
11417 
11418       switch (exp->X_op)
11419 	{
11420 	case O_register:
11421 	  if (xtensa_operand_is_visible (isa, opcode, i) == 0)
11422 	    break;
11423 	  /* The register number has already been checked in
11424 	     expression_maybe_register, so we don't need to check here.  */
11425 	  opnd_value = exp->X_add_number;
11426 	  (void) xtensa_operand_encode (isa, opcode, i, &opnd_value);
11427 	  rc = xtensa_operand_set_field (isa, opcode, i, fmt, slot, slotbuf,
11428 					 opnd_value);
11429 	  if (rc != 0)
11430 	    as_warn (_("xtensa-isa failure: %s"), xtensa_isa_error_msg (isa));
11431 	  break;
11432 
11433 	case O_constant:
11434 	  if (xtensa_operand_is_visible (isa, opcode, i) == 0)
11435 	    break;
11436 	  as_where (&file_name, &line);
11437 	  /* It is a constant and we called this function
11438 	     then we have to try to fit it.  */
11439 	  xtensa_insnbuf_set_operand (slotbuf, fmt, slot, opcode, i,
11440 				      exp->X_add_number, file_name, line);
11441 	  break;
11442 
11443 	default:
11444 	  has_fixup = TRUE;
11445 	  break;
11446 	}
11447     }
11448 
11449   return has_fixup;
11450 }
11451 
11452 
11453 /* Encode a single TInsn into an insnbuf.  If the opcode can only be encoded
11454    into a multi-slot instruction, fill the other slots with NOPs.
11455    Return TRUE if there is a symbol in the immediate field.  See also the
11456    assumptions listed for tinsn_to_slotbuf.  */
11457 
11458 static bfd_boolean
11459 tinsn_to_insnbuf (TInsn *tinsn, xtensa_insnbuf insnbuf)
11460 {
11461   static xtensa_insnbuf slotbuf = 0;
11462   static vliw_insn vinsn;
11463   xtensa_isa isa = xtensa_default_isa;
11464   bfd_boolean has_fixup = FALSE;
11465   int i;
11466 
11467   if (!slotbuf)
11468     {
11469       slotbuf = xtensa_insnbuf_alloc (isa);
11470       xg_init_vinsn (&vinsn);
11471     }
11472 
11473   xg_clear_vinsn (&vinsn);
11474 
11475   bundle_tinsn (tinsn, &vinsn);
11476 
11477   xtensa_format_encode (isa, vinsn.format, insnbuf);
11478 
11479   for (i = 0; i < vinsn.num_slots; i++)
11480     {
11481       /* Only one slot may have a fix-up because the rest contains NOPs.  */
11482       has_fixup |=
11483 	tinsn_to_slotbuf (vinsn.format, i, &vinsn.slots[i], vinsn.slotbuf[i]);
11484       xtensa_format_set_slot (isa, vinsn.format, i, insnbuf, vinsn.slotbuf[i]);
11485     }
11486 
11487   return has_fixup;
11488 }
11489 
11490 
11491 /* Check the instruction arguments.  Return TRUE on failure.  */
11492 
11493 static bfd_boolean
11494 tinsn_check_arguments (const TInsn *insn)
11495 {
11496   xtensa_isa isa = xtensa_default_isa;
11497   xtensa_opcode opcode = insn->opcode;
11498   xtensa_regfile t1_regfile, t2_regfile;
11499   int t1_reg, t2_reg;
11500   int t1_base_reg, t1_last_reg;
11501   int t2_base_reg, t2_last_reg;
11502   char t1_inout, t2_inout;
11503   int i, j;
11504 
11505   if (opcode == XTENSA_UNDEFINED)
11506     {
11507       as_bad (_("invalid opcode"));
11508       return TRUE;
11509     }
11510 
11511   if (xtensa_opcode_num_operands (isa, opcode) > insn->ntok)
11512     {
11513       as_bad (_("too few operands"));
11514       return TRUE;
11515     }
11516 
11517   if (xtensa_opcode_num_operands (isa, opcode) < insn->ntok)
11518     {
11519       as_bad (_("too many operands"));
11520       return TRUE;
11521     }
11522 
11523   /* Check registers.  */
11524   for (j = 0; j < insn->ntok; j++)
11525     {
11526       if (xtensa_operand_is_register (isa, insn->opcode, j) != 1)
11527 	continue;
11528 
11529       t2_regfile = xtensa_operand_regfile (isa, insn->opcode, j);
11530       t2_base_reg = insn->tok[j].X_add_number;
11531       t2_last_reg
11532 	= t2_base_reg + xtensa_operand_num_regs (isa, insn->opcode, j);
11533 
11534       for (i = 0; i < insn->ntok; i++)
11535 	{
11536 	  if (i == j)
11537 	    continue;
11538 
11539 	  if (xtensa_operand_is_register (isa, insn->opcode, i) != 1)
11540 	    continue;
11541 
11542 	  t1_regfile = xtensa_operand_regfile (isa, insn->opcode, i);
11543 
11544 	  if (t1_regfile != t2_regfile)
11545 	    continue;
11546 
11547 	  t1_inout = xtensa_operand_inout (isa, insn->opcode, i);
11548 	  t2_inout = xtensa_operand_inout (isa, insn->opcode, j);
11549 
11550 	  t1_base_reg = insn->tok[i].X_add_number;
11551 	  t1_last_reg = (t1_base_reg
11552 			 + xtensa_operand_num_regs (isa, insn->opcode, i));
11553 
11554 	  for (t1_reg = t1_base_reg; t1_reg < t1_last_reg; t1_reg++)
11555 	    {
11556 	      for (t2_reg = t2_base_reg; t2_reg < t2_last_reg; t2_reg++)
11557 		{
11558 		  if (t1_reg != t2_reg)
11559 		    continue;
11560 
11561 		  if (t1_inout != 'i' && t2_inout != 'i')
11562 		    {
11563 		      as_bad (_("multiple writes to the same register"));
11564 		      return TRUE;
11565 		    }
11566 		}
11567 	    }
11568 	}
11569     }
11570   return FALSE;
11571 }
11572 
11573 
11574 /* Load an instruction from its encoded form.  */
11575 
11576 static void
11577 tinsn_from_chars (TInsn *tinsn, char *f, int slot)
11578 {
11579   vliw_insn vinsn;
11580 
11581   xg_init_vinsn (&vinsn);
11582   vinsn_from_chars (&vinsn, f);
11583 
11584   *tinsn = vinsn.slots[slot];
11585   xg_free_vinsn (&vinsn);
11586 }
11587 
11588 
11589 static void
11590 tinsn_from_insnbuf (TInsn *tinsn,
11591 		    xtensa_insnbuf slotbuf,
11592 		    xtensa_format fmt,
11593 		    int slot)
11594 {
11595   int i;
11596   xtensa_isa isa = xtensa_default_isa;
11597 
11598   /* Find the immed.  */
11599   tinsn_init (tinsn);
11600   tinsn->insn_type = ITYPE_INSN;
11601   tinsn->is_specific_opcode = FALSE;	/* must not be specific */
11602   tinsn->opcode = xtensa_opcode_decode (isa, fmt, slot, slotbuf);
11603   tinsn->ntok = xtensa_opcode_num_operands (isa, tinsn->opcode);
11604   for (i = 0; i < tinsn->ntok; i++)
11605     {
11606       set_expr_const (&tinsn->tok[i],
11607 		      xtensa_insnbuf_get_operand (slotbuf, fmt, slot,
11608 						  tinsn->opcode, i));
11609     }
11610 }
11611 
11612 
11613 /* Read the value of the relaxable immed from the fr_symbol and fr_offset.  */
11614 
11615 static void
11616 tinsn_immed_from_frag (TInsn *tinsn, fragS *fragP, int slot)
11617 {
11618   xtensa_opcode opcode = tinsn->opcode;
11619   int opnum;
11620 
11621   if (fragP->tc_frag_data.slot_symbols[slot])
11622     {
11623       opnum = get_relaxable_immed (opcode);
11624       gas_assert (opnum >= 0);
11625       set_expr_symbol_offset (&tinsn->tok[opnum],
11626 			      fragP->tc_frag_data.slot_symbols[slot],
11627 			      fragP->tc_frag_data.slot_offsets[slot]);
11628     }
11629   tinsn->extra_arg = fragP->tc_frag_data.free_reg[slot];
11630 }
11631 
11632 
11633 static int
11634 get_num_stack_text_bytes (IStack *istack)
11635 {
11636   int i;
11637   int text_bytes = 0;
11638 
11639   for (i = 0; i < istack->ninsn; i++)
11640     {
11641       TInsn *tinsn = &istack->insn[i];
11642       if (tinsn->insn_type == ITYPE_INSN)
11643 	text_bytes += xg_get_single_size (tinsn->opcode);
11644     }
11645   return text_bytes;
11646 }
11647 
11648 
11649 static int
11650 get_num_stack_literal_bytes (IStack *istack)
11651 {
11652   int i;
11653   int lit_bytes = 0;
11654 
11655   for (i = 0; i < istack->ninsn; i++)
11656     {
11657       TInsn *tinsn = &istack->insn[i];
11658       if (tinsn->insn_type == ITYPE_LITERAL && tinsn->ntok == 1)
11659 	lit_bytes += 4;
11660     }
11661   return lit_bytes;
11662 }
11663 
11664 
11665 /* vliw_insn functions.  */
11666 
11667 static void
11668 xg_init_vinsn (vliw_insn *v)
11669 {
11670   int i;
11671   xtensa_isa isa = xtensa_default_isa;
11672 
11673   xg_clear_vinsn (v);
11674 
11675   v->insnbuf = xtensa_insnbuf_alloc (isa);
11676   if (v->insnbuf == NULL)
11677     as_fatal (_("out of memory"));
11678 
11679   for (i = 0; i < config_max_slots; i++)
11680     {
11681       v->slotbuf[i] = xtensa_insnbuf_alloc (isa);
11682       if (v->slotbuf[i] == NULL)
11683 	as_fatal (_("out of memory"));
11684     }
11685 }
11686 
11687 
11688 static void
11689 xg_clear_vinsn (vliw_insn *v)
11690 {
11691   int i;
11692 
11693   memset (v, 0, offsetof (vliw_insn, slots)
11694                 + sizeof(TInsn) * config_max_slots);
11695 
11696   v->format = XTENSA_UNDEFINED;
11697   v->num_slots = 0;
11698   v->inside_bundle = FALSE;
11699 
11700   if (xt_saved_debug_type != DEBUG_NONE)
11701     debug_type = xt_saved_debug_type;
11702 
11703   for (i = 0; i < config_max_slots; i++)
11704     v->slots[i].opcode = XTENSA_UNDEFINED;
11705 }
11706 
11707 
11708 static void
11709 xg_copy_vinsn (vliw_insn *dst, vliw_insn *src)
11710 {
11711   memcpy (dst, src,
11712 	  offsetof(vliw_insn, slots) + src->num_slots * sizeof(TInsn));
11713   dst->insnbuf = src->insnbuf;
11714   memcpy (dst->slotbuf, src->slotbuf, src->num_slots * sizeof(xtensa_insnbuf));
11715 }
11716 
11717 
11718 static bfd_boolean
11719 vinsn_has_specific_opcodes (vliw_insn *v)
11720 {
11721   int i;
11722 
11723   for (i = 0; i < v->num_slots; i++)
11724     {
11725       if (v->slots[i].is_specific_opcode)
11726 	return TRUE;
11727     }
11728   return FALSE;
11729 }
11730 
11731 
11732 static void
11733 xg_free_vinsn (vliw_insn *v)
11734 {
11735   int i;
11736   xtensa_insnbuf_free (xtensa_default_isa, v->insnbuf);
11737   for (i = 0; i < config_max_slots; i++)
11738     xtensa_insnbuf_free (xtensa_default_isa, v->slotbuf[i]);
11739 }
11740 
11741 
11742 /* Encode a vliw_insn into an insnbuf.  Return TRUE if there are any symbolic
11743    operands.  See also the assumptions listed for tinsn_to_slotbuf.  */
11744 
11745 static bfd_boolean
11746 vinsn_to_insnbuf (vliw_insn *vinsn,
11747 		  char *frag_offset,
11748 		  fragS *fragP,
11749 		  bfd_boolean record_fixup)
11750 {
11751   xtensa_isa isa = xtensa_default_isa;
11752   xtensa_format fmt = vinsn->format;
11753   xtensa_insnbuf insnbuf = vinsn->insnbuf;
11754   int slot;
11755   bfd_boolean has_fixup = FALSE;
11756 
11757   xtensa_format_encode (isa, fmt, insnbuf);
11758 
11759   for (slot = 0; slot < vinsn->num_slots; slot++)
11760     {
11761       TInsn *tinsn = &vinsn->slots[slot];
11762       expressionS *extra_arg = &tinsn->extra_arg;
11763       bfd_boolean tinsn_has_fixup =
11764 	tinsn_to_slotbuf (vinsn->format, slot, tinsn,
11765 			  vinsn->slotbuf[slot]);
11766 
11767       xtensa_format_set_slot (isa, fmt, slot,
11768 			      insnbuf, vinsn->slotbuf[slot]);
11769       if (extra_arg->X_op != O_illegal && extra_arg->X_op != O_register)
11770 	{
11771 	  if (vinsn->num_slots != 1)
11772 	    as_bad (_("TLS relocation not allowed in FLIX bundle"));
11773 	  else if (record_fixup)
11774 	    /* Instructions that generate TLS relocations should always be
11775 	       relaxed in the front-end.  If "record_fixup" is set, then this
11776 	       function is being called during back-end relaxation, so flag
11777 	       the unexpected behavior as an error.  */
11778 	    as_bad (_("unexpected TLS relocation"));
11779 	  else
11780 	    fix_new (fragP, frag_offset - fragP->fr_literal,
11781 		     xtensa_format_length (isa, fmt),
11782 		     extra_arg->X_add_symbol, extra_arg->X_add_number,
11783 		     FALSE, map_operator_to_reloc (extra_arg->X_op, FALSE));
11784 	}
11785       if (tinsn_has_fixup)
11786 	{
11787 	  int i;
11788 	  xtensa_opcode opcode = tinsn->opcode;
11789 	  int noperands = xtensa_opcode_num_operands (isa, opcode);
11790 	  has_fixup = TRUE;
11791 
11792 	  for (i = 0; i < noperands; i++)
11793 	    {
11794 	      expressionS* exp = &tinsn->tok[i];
11795 	      switch (exp->X_op)
11796 		{
11797 		case O_symbol:
11798 		case O_lo16:
11799 		case O_hi16:
11800 		  if (get_relaxable_immed (opcode) == i)
11801 		    {
11802 		      /* Add a fix record for the instruction, except if this
11803 			 function is being called prior to relaxation, i.e.,
11804 			 if record_fixup is false, and the instruction might
11805 			 be relaxed later.  */
11806 		      if (record_fixup
11807 			  || tinsn->is_specific_opcode
11808 			  || !xg_is_relaxable_insn (tinsn, 0))
11809 			{
11810 			  xg_add_opcode_fix (tinsn, i, fmt, slot, exp, fragP,
11811 					     frag_offset - fragP->fr_literal);
11812 			}
11813 		      else
11814 			{
11815 			  if (exp->X_op != O_symbol)
11816 			    as_bad (_("invalid operand"));
11817 			  tinsn->symbol = exp->X_add_symbol;
11818 			  tinsn->offset = exp->X_add_number;
11819 			}
11820 		    }
11821 		  else
11822 		    as_bad (_("symbolic operand not allowed"));
11823 		  break;
11824 
11825 		case O_constant:
11826 		case O_register:
11827 		  break;
11828 
11829 		default:
11830 		  as_bad (_("expression too complex"));
11831 		  break;
11832 		}
11833 	    }
11834 	}
11835     }
11836 
11837   return has_fixup;
11838 }
11839 
11840 
11841 static void
11842 vinsn_from_chars (vliw_insn *vinsn, char *f)
11843 {
11844   static xtensa_insnbuf insnbuf = NULL;
11845   static xtensa_insnbuf slotbuf = NULL;
11846   int i;
11847   xtensa_format fmt;
11848   xtensa_isa isa = xtensa_default_isa;
11849 
11850   if (!insnbuf)
11851     {
11852       insnbuf = xtensa_insnbuf_alloc (isa);
11853       slotbuf = xtensa_insnbuf_alloc (isa);
11854     }
11855 
11856   xtensa_insnbuf_from_chars (isa, insnbuf, (unsigned char *) f, 0);
11857   fmt = xtensa_format_decode (isa, insnbuf);
11858   if (fmt == XTENSA_UNDEFINED)
11859     as_fatal (_("cannot decode instruction format"));
11860   vinsn->format = fmt;
11861   vinsn->num_slots = xtensa_format_num_slots (isa, fmt);
11862 
11863   for (i = 0; i < vinsn->num_slots; i++)
11864     {
11865       TInsn *tinsn = &vinsn->slots[i];
11866       xtensa_format_get_slot (isa, fmt, i, insnbuf, slotbuf);
11867       tinsn_from_insnbuf (tinsn, slotbuf, fmt, i);
11868     }
11869 }
11870 
11871 
11872 /* Expression utilities.  */
11873 
11874 /* Return TRUE if the expression is an integer constant.  */
11875 
11876 bfd_boolean
11877 expr_is_const (const expressionS *s)
11878 {
11879   return (s->X_op == O_constant);
11880 }
11881 
11882 
11883 /* Get the expression constant.
11884    Calling this is illegal if expr_is_const () returns TRUE.  */
11885 
11886 offsetT
11887 get_expr_const (const expressionS *s)
11888 {
11889   gas_assert (expr_is_const (s));
11890   return s->X_add_number;
11891 }
11892 
11893 
11894 /* Set the expression to a constant value.  */
11895 
11896 void
11897 set_expr_const (expressionS *s, offsetT val)
11898 {
11899   s->X_op = O_constant;
11900   s->X_add_number = val;
11901   s->X_add_symbol = NULL;
11902   s->X_op_symbol = NULL;
11903 }
11904 
11905 
11906 bfd_boolean
11907 expr_is_register (const expressionS *s)
11908 {
11909   return (s->X_op == O_register);
11910 }
11911 
11912 
11913 /* Get the expression constant.
11914    Calling this is illegal if expr_is_const () returns TRUE.  */
11915 
11916 offsetT
11917 get_expr_register (const expressionS *s)
11918 {
11919   gas_assert (expr_is_register (s));
11920   return s->X_add_number;
11921 }
11922 
11923 
11924 /* Set the expression to a symbol + constant offset.  */
11925 
11926 void
11927 set_expr_symbol_offset (expressionS *s, symbolS *sym, offsetT offset)
11928 {
11929   s->X_op = O_symbol;
11930   s->X_add_symbol = sym;
11931   s->X_op_symbol = NULL;	/* unused */
11932   s->X_add_number = offset;
11933 }
11934 
11935 
11936 /* Return TRUE if the two expressions are equal.  */
11937 
11938 bfd_boolean
11939 expr_is_equal (expressionS *s1, expressionS *s2)
11940 {
11941   if (s1->X_op != s2->X_op)
11942     return FALSE;
11943   if (s1->X_add_symbol != s2->X_add_symbol)
11944     return FALSE;
11945   if (s1->X_op_symbol != s2->X_op_symbol)
11946     return FALSE;
11947   if (s1->X_add_number != s2->X_add_number)
11948     return FALSE;
11949   return TRUE;
11950 }
11951 
11952 
11953 static void
11954 copy_expr (expressionS *dst, const expressionS *src)
11955 {
11956   memcpy (dst, src, sizeof (expressionS));
11957 }
11958 
11959 
11960 /* Support for the "--rename-section" option.  */
11961 
11962 struct rename_section_struct
11963 {
11964   char *old_name;
11965   char *new_name;
11966   struct rename_section_struct *next;
11967 };
11968 
11969 static struct rename_section_struct *section_rename;
11970 
11971 
11972 /* Parse the string "oldname=new_name(:oldname2=new_name2)*" and add
11973    entries to the section_rename list.  Note: Specifying multiple
11974    renamings separated by colons is not documented and is retained only
11975    for backward compatibility.  */
11976 
11977 static void
11978 build_section_rename (const char *arg)
11979 {
11980   struct rename_section_struct *r;
11981   char *this_arg = NULL;
11982   char *next_arg = NULL;
11983 
11984   for (this_arg = xstrdup (arg); this_arg != NULL; this_arg = next_arg)
11985     {
11986       char *old_name, *new_name;
11987 
11988       if (this_arg)
11989 	{
11990 	  next_arg = strchr (this_arg, ':');
11991 	  if (next_arg)
11992 	    {
11993 	      *next_arg = '\0';
11994 	      next_arg++;
11995 	    }
11996 	}
11997 
11998       old_name = this_arg;
11999       new_name = strchr (this_arg, '=');
12000 
12001       if (*old_name == '\0')
12002 	{
12003 	  as_warn (_("ignoring extra '-rename-section' delimiter ':'"));
12004 	  continue;
12005 	}
12006       if (!new_name || new_name[1] == '\0')
12007 	{
12008 	  as_warn (_("ignoring invalid '-rename-section' specification: '%s'"),
12009 		   old_name);
12010 	  continue;
12011 	}
12012       *new_name = '\0';
12013       new_name++;
12014 
12015       /* Check for invalid section renaming.  */
12016       for (r = section_rename; r != NULL; r = r->next)
12017 	{
12018 	  if (strcmp (r->old_name, old_name) == 0)
12019 	    as_bad (_("section %s renamed multiple times"), old_name);
12020 	  if (strcmp (r->new_name, new_name) == 0)
12021 	    as_bad (_("multiple sections remapped to output section %s"),
12022 		    new_name);
12023 	}
12024 
12025       /* Now add it.  */
12026       r = (struct rename_section_struct *)
12027 	xmalloc (sizeof (struct rename_section_struct));
12028       r->old_name = xstrdup (old_name);
12029       r->new_name = xstrdup (new_name);
12030       r->next = section_rename;
12031       section_rename = r;
12032     }
12033 }
12034 
12035 
12036 char *
12037 xtensa_section_rename (char *name)
12038 {
12039   struct rename_section_struct *r = section_rename;
12040 
12041   for (r = section_rename; r != NULL; r = r->next)
12042     {
12043       if (strcmp (r->old_name, name) == 0)
12044 	return r->new_name;
12045     }
12046 
12047   return name;
12048 }
12049