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