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