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