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