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