Home | History | Annotate | Line # | Download | only in config
tc-xtensa.c revision 1.1
      1  1.1  skrll /* tc-xtensa.c -- Assemble Xtensa instructions.
      2  1.1  skrll    Copyright 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
      3  1.1  skrll 
      4  1.1  skrll    This file is part of GAS, the GNU Assembler.
      5  1.1  skrll 
      6  1.1  skrll    GAS is free software; you can redistribute it and/or modify
      7  1.1  skrll    it under the terms of the GNU General Public License as published by
      8  1.1  skrll    the Free Software Foundation; either version 3, or (at your option)
      9  1.1  skrll    any later version.
     10  1.1  skrll 
     11  1.1  skrll    GAS is distributed in the hope that it will be useful,
     12  1.1  skrll    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13  1.1  skrll    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14  1.1  skrll    GNU General Public License for more details.
     15  1.1  skrll 
     16  1.1  skrll    You should have received a copy of the GNU General Public License
     17  1.1  skrll    along with GAS; see the file COPYING.  If not, write to
     18  1.1  skrll    the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
     19  1.1  skrll    MA 02110-1301, USA.  */
     20  1.1  skrll 
     21  1.1  skrll #include <limits.h>
     22  1.1  skrll #include "as.h"
     23  1.1  skrll #include "sb.h"
     24  1.1  skrll #include "safe-ctype.h"
     25  1.1  skrll #include "tc-xtensa.h"
     26  1.1  skrll #include "subsegs.h"
     27  1.1  skrll #include "xtensa-relax.h"
     28  1.1  skrll #include "dwarf2dbg.h"
     29  1.1  skrll #include "xtensa-istack.h"
     30  1.1  skrll #include "struc-symbol.h"
     31  1.1  skrll #include "xtensa-config.h"
     32  1.1  skrll 
     33  1.1  skrll /* Provide default values for new configuration settings.  */
     34  1.1  skrll #ifndef XSHAL_ABI
     35  1.1  skrll #define XSHAL_ABI 0
     36  1.1  skrll #endif
     37  1.1  skrll 
     38  1.1  skrll #ifndef uint32
     39  1.1  skrll #define uint32 unsigned int
     40  1.1  skrll #endif
     41  1.1  skrll #ifndef int32
     42  1.1  skrll #define int32 signed int
     43  1.1  skrll #endif
     44  1.1  skrll 
     45  1.1  skrll /* Notes:
     46  1.1  skrll 
     47  1.1  skrll    Naming conventions (used somewhat inconsistently):
     48  1.1  skrll       The xtensa_ functions are exported
     49  1.1  skrll       The xg_ functions are internal
     50  1.1  skrll 
     51  1.1  skrll    We also have a couple of different extensibility mechanisms.
     52  1.1  skrll    1) The idiom replacement:
     53  1.1  skrll       This is used when a line is first parsed to
     54  1.1  skrll       replace an instruction pattern with another instruction
     55  1.1  skrll       It is currently limited to replacements of instructions
     56  1.1  skrll       with constant operands.
     57  1.1  skrll    2) The xtensa-relax.c mechanism that has stronger instruction
     58  1.1  skrll       replacement patterns.  When an instruction's immediate field
     59  1.1  skrll       does not fit the next instruction sequence is attempted.
     60  1.1  skrll       In addition, "narrow" opcodes are supported this way.  */
     61  1.1  skrll 
     62  1.1  skrll 
     63  1.1  skrll /* Define characters with special meanings to GAS.  */
     64  1.1  skrll const char comment_chars[] = "#";
     65  1.1  skrll const char line_comment_chars[] = "#";
     66  1.1  skrll const char line_separator_chars[] = ";";
     67  1.1  skrll const char EXP_CHARS[] = "eE";
     68  1.1  skrll const char FLT_CHARS[] = "rRsSfFdDxXpP";
     69  1.1  skrll 
     70  1.1  skrll 
     71  1.1  skrll /* Flags to indicate whether the hardware supports the density and
     72  1.1  skrll    absolute literals options.  */
     73  1.1  skrll 
     74  1.1  skrll bfd_boolean density_supported = XCHAL_HAVE_DENSITY;
     75  1.1  skrll bfd_boolean absolute_literals_supported = XSHAL_USE_ABSOLUTE_LITERALS;
     76  1.1  skrll 
     77  1.1  skrll /* Maximum width we would pad an unreachable frag to get alignment.  */
     78  1.1  skrll #define UNREACHABLE_MAX_WIDTH  8
     79  1.1  skrll 
     80  1.1  skrll static vliw_insn cur_vinsn;
     81  1.1  skrll 
     82  1.1  skrll unsigned xtensa_num_pipe_stages;
     83  1.1  skrll unsigned xtensa_fetch_width = XCHAL_INST_FETCH_WIDTH;
     84  1.1  skrll 
     85  1.1  skrll static enum debug_info_type xt_saved_debug_type = DEBUG_NONE;
     86  1.1  skrll 
     87  1.1  skrll /* Some functions are only valid in the front end.  This variable
     88  1.1  skrll    allows us to assert that we haven't crossed over into the
     89  1.1  skrll    back end.  */
     90  1.1  skrll static bfd_boolean past_xtensa_end = FALSE;
     91  1.1  skrll 
     92  1.1  skrll /* Flags for properties of the last instruction in a segment.  */
     93  1.1  skrll #define FLAG_IS_A0_WRITER	0x1
     94  1.1  skrll #define FLAG_IS_BAD_LOOPEND	0x2
     95  1.1  skrll 
     96  1.1  skrll 
     97  1.1  skrll /* We define a special segment names ".literal" to place literals
     98  1.1  skrll    into.  The .fini and .init sections are special because they
     99  1.1  skrll    contain code that is moved together by the linker.  We give them
    100  1.1  skrll    their own special .fini.literal and .init.literal sections.  */
    101  1.1  skrll 
    102  1.1  skrll #define LITERAL_SECTION_NAME		xtensa_section_rename (".literal")
    103  1.1  skrll #define LIT4_SECTION_NAME		xtensa_section_rename (".lit4")
    104  1.1  skrll #define INIT_SECTION_NAME		xtensa_section_rename (".init")
    105  1.1  skrll #define FINI_SECTION_NAME		xtensa_section_rename (".fini")
    106  1.1  skrll 
    107  1.1  skrll 
    108  1.1  skrll /* This type is used for the directive_stack to keep track of the
    109  1.1  skrll    state of the literal collection pools.  If lit_prefix is set, it is
    110  1.1  skrll    used to determine the literal section names; otherwise, the literal
    111  1.1  skrll    sections are determined based on the current text section.  The
    112  1.1  skrll    lit_seg and lit4_seg fields cache these literal sections, with the
    113  1.1  skrll    current_text_seg field used a tag to indicate whether the cached
    114  1.1  skrll    values are valid.  */
    115  1.1  skrll 
    116  1.1  skrll typedef struct lit_state_struct
    117  1.1  skrll {
    118  1.1  skrll   char *lit_prefix;
    119  1.1  skrll   segT current_text_seg;
    120  1.1  skrll   segT lit_seg;
    121  1.1  skrll   segT lit4_seg;
    122  1.1  skrll } lit_state;
    123  1.1  skrll 
    124  1.1  skrll static lit_state default_lit_sections;
    125  1.1  skrll 
    126  1.1  skrll 
    127  1.1  skrll /* We keep a list of literal segments.  The seg_list type is the node
    128  1.1  skrll    for this list.  The literal_head pointer is the head of the list,
    129  1.1  skrll    with the literal_head_h dummy node at the start.  */
    130  1.1  skrll 
    131  1.1  skrll typedef struct seg_list_struct
    132  1.1  skrll {
    133  1.1  skrll   struct seg_list_struct *next;
    134  1.1  skrll   segT seg;
    135  1.1  skrll } seg_list;
    136  1.1  skrll 
    137  1.1  skrll static seg_list literal_head_h;
    138  1.1  skrll static seg_list *literal_head = &literal_head_h;
    139  1.1  skrll 
    140  1.1  skrll 
    141  1.1  skrll /* Lists of symbols.  We keep a list of symbols that label the current
    142  1.1  skrll    instruction, so that we can adjust the symbols when inserting alignment
    143  1.1  skrll    for various instructions.  We also keep a list of all the symbols on
    144  1.1  skrll    literals, so that we can fix up those symbols when the literals are
    145  1.1  skrll    later moved into the text sections.  */
    146  1.1  skrll 
    147  1.1  skrll typedef struct sym_list_struct
    148  1.1  skrll {
    149  1.1  skrll   struct sym_list_struct *next;
    150  1.1  skrll   symbolS *sym;
    151  1.1  skrll } sym_list;
    152  1.1  skrll 
    153  1.1  skrll static sym_list *insn_labels = NULL;
    154  1.1  skrll static sym_list *free_insn_labels = NULL;
    155  1.1  skrll static sym_list *saved_insn_labels = NULL;
    156  1.1  skrll 
    157  1.1  skrll static sym_list *literal_syms;
    158  1.1  skrll 
    159  1.1  skrll 
    160  1.1  skrll /* Flags to determine whether to prefer const16 or l32r
    161  1.1  skrll    if both options are available.  */
    162  1.1  skrll int prefer_const16 = 0;
    163  1.1  skrll int prefer_l32r = 0;
    164  1.1  skrll 
    165  1.1  skrll /* Global flag to indicate when we are emitting literals.  */
    166  1.1  skrll int generating_literals = 0;
    167  1.1  skrll 
    168  1.1  skrll /* The following PROPERTY table definitions are copied from
    169  1.1  skrll    <elf/xtensa.h> and must be kept in sync with the code there.  */
    170  1.1  skrll 
    171  1.1  skrll /* Flags in the property tables to specify whether blocks of memory
    172  1.1  skrll    are literals, instructions, data, or unreachable.  For
    173  1.1  skrll    instructions, blocks that begin loop targets and branch targets are
    174  1.1  skrll    designated.  Blocks that do not allow density, instruction
    175  1.1  skrll    reordering or transformation are also specified.  Finally, for
    176  1.1  skrll    branch targets, branch target alignment priority is included.
    177  1.1  skrll    Alignment of the next block is specified in the current block
    178  1.1  skrll    and the size of the current block does not include any fill required
    179  1.1  skrll    to align to the next block.  */
    180  1.1  skrll 
    181  1.1  skrll #define XTENSA_PROP_LITERAL		0x00000001
    182  1.1  skrll #define XTENSA_PROP_INSN		0x00000002
    183  1.1  skrll #define XTENSA_PROP_DATA		0x00000004
    184  1.1  skrll #define XTENSA_PROP_UNREACHABLE		0x00000008
    185  1.1  skrll /* Instruction only properties at beginning of code.  */
    186  1.1  skrll #define XTENSA_PROP_INSN_LOOP_TARGET	0x00000010
    187  1.1  skrll #define XTENSA_PROP_INSN_BRANCH_TARGET	0x00000020
    188  1.1  skrll /* Instruction only properties about code.  */
    189  1.1  skrll #define XTENSA_PROP_INSN_NO_DENSITY	0x00000040
    190  1.1  skrll #define XTENSA_PROP_INSN_NO_REORDER	0x00000080
    191  1.1  skrll /* Historically, NO_TRANSFORM was a property of instructions,
    192  1.1  skrll    but it should apply to literals under certain circumstances.  */
    193  1.1  skrll #define XTENSA_PROP_NO_TRANSFORM	0x00000100
    194  1.1  skrll 
    195  1.1  skrll /*  Branch target alignment information.  This transmits information
    196  1.1  skrll     to the linker optimization about the priority of aligning a
    197  1.1  skrll     particular block for branch target alignment: None, low priority,
    198  1.1  skrll     high priority, or required.  These only need to be checked in
    199  1.1  skrll     instruction blocks marked as XTENSA_PROP_INSN_BRANCH_TARGET.
    200  1.1  skrll     Common usage is
    201  1.1  skrll 
    202  1.1  skrll     switch (GET_XTENSA_PROP_BT_ALIGN (flags))
    203  1.1  skrll     case XTENSA_PROP_BT_ALIGN_NONE:
    204  1.1  skrll     case XTENSA_PROP_BT_ALIGN_LOW:
    205  1.1  skrll     case XTENSA_PROP_BT_ALIGN_HIGH:
    206  1.1  skrll     case XTENSA_PROP_BT_ALIGN_REQUIRE:
    207  1.1  skrll */
    208  1.1  skrll #define XTENSA_PROP_BT_ALIGN_MASK       0x00000600
    209  1.1  skrll 
    210  1.1  skrll /* No branch target alignment.  */
    211  1.1  skrll #define XTENSA_PROP_BT_ALIGN_NONE       0x0
    212  1.1  skrll /* Low priority branch target alignment.  */
    213  1.1  skrll #define XTENSA_PROP_BT_ALIGN_LOW        0x1
    214  1.1  skrll /* High priority branch target alignment.  */
    215  1.1  skrll #define XTENSA_PROP_BT_ALIGN_HIGH       0x2
    216  1.1  skrll /* Required branch target alignment.  */
    217  1.1  skrll #define XTENSA_PROP_BT_ALIGN_REQUIRE    0x3
    218  1.1  skrll 
    219  1.1  skrll #define GET_XTENSA_PROP_BT_ALIGN(flag) \
    220  1.1  skrll   (((unsigned) ((flag) & (XTENSA_PROP_BT_ALIGN_MASK))) >> 9)
    221  1.1  skrll #define SET_XTENSA_PROP_BT_ALIGN(flag, align) \
    222  1.1  skrll   (((flag) & (~XTENSA_PROP_BT_ALIGN_MASK)) | \
    223  1.1  skrll     (((align) << 9) & XTENSA_PROP_BT_ALIGN_MASK))
    224  1.1  skrll 
    225  1.1  skrll 
    226  1.1  skrll /* Alignment is specified in the block BEFORE the one that needs
    227  1.1  skrll    alignment.  Up to 5 bits.  Use GET_XTENSA_PROP_ALIGNMENT(flags) to
    228  1.1  skrll    get the required alignment specified as a power of 2.  Use
    229  1.1  skrll    SET_XTENSA_PROP_ALIGNMENT(flags, pow2) to set the required
    230  1.1  skrll    alignment.  Be careful of side effects since the SET will evaluate
    231  1.1  skrll    flags twice.  Also, note that the SIZE of a block in the property
    232  1.1  skrll    table does not include the alignment size, so the alignment fill
    233  1.1  skrll    must be calculated to determine if two blocks are contiguous.
    234  1.1  skrll    TEXT_ALIGN is not currently implemented but is a placeholder for a
    235  1.1  skrll    possible future implementation.  */
    236  1.1  skrll 
    237  1.1  skrll #define XTENSA_PROP_ALIGN		0x00000800
    238  1.1  skrll 
    239  1.1  skrll #define XTENSA_PROP_ALIGNMENT_MASK      0x0001f000
    240  1.1  skrll 
    241  1.1  skrll #define GET_XTENSA_PROP_ALIGNMENT(flag) \
    242  1.1  skrll   (((unsigned) ((flag) & (XTENSA_PROP_ALIGNMENT_MASK))) >> 12)
    243  1.1  skrll #define SET_XTENSA_PROP_ALIGNMENT(flag, align) \
    244  1.1  skrll   (((flag) & (~XTENSA_PROP_ALIGNMENT_MASK)) | \
    245  1.1  skrll     (((align) << 12) & XTENSA_PROP_ALIGNMENT_MASK))
    246  1.1  skrll 
    247  1.1  skrll #define XTENSA_PROP_INSN_ABSLIT 0x00020000
    248  1.1  skrll 
    249  1.1  skrll 
    250  1.1  skrll /* Structure for saving instruction and alignment per-fragment data
    251  1.1  skrll    that will be written to the object file.  This structure is
    252  1.1  skrll    equivalent to the actual data that will be written out to the file
    253  1.1  skrll    but is easier to use.   We provide a conversion to file flags
    254  1.1  skrll    in frag_flags_to_number.  */
    255  1.1  skrll 
    256  1.1  skrll typedef struct frag_flags_struct frag_flags;
    257  1.1  skrll 
    258  1.1  skrll struct frag_flags_struct
    259  1.1  skrll {
    260  1.1  skrll   /* is_literal should only be used after xtensa_move_literals.
    261  1.1  skrll      If you need to check if you are generating a literal fragment,
    262  1.1  skrll      then use the generating_literals global.  */
    263  1.1  skrll 
    264  1.1  skrll   unsigned is_literal : 1;
    265  1.1  skrll   unsigned is_insn : 1;
    266  1.1  skrll   unsigned is_data : 1;
    267  1.1  skrll   unsigned is_unreachable : 1;
    268  1.1  skrll 
    269  1.1  skrll   /* is_specific_opcode implies no_transform.  */
    270  1.1  skrll   unsigned is_no_transform : 1;
    271  1.1  skrll 
    272  1.1  skrll   struct
    273  1.1  skrll   {
    274  1.1  skrll     unsigned is_loop_target : 1;
    275  1.1  skrll     unsigned is_branch_target : 1; /* Branch targets have a priority.  */
    276  1.1  skrll     unsigned bt_align_priority : 2;
    277  1.1  skrll 
    278  1.1  skrll     unsigned is_no_density : 1;
    279  1.1  skrll     /* no_longcalls flag does not need to be placed in the object file.  */
    280  1.1  skrll 
    281  1.1  skrll     unsigned is_no_reorder : 1;
    282  1.1  skrll 
    283  1.1  skrll     /* Uses absolute literal addressing for l32r.  */
    284  1.1  skrll     unsigned is_abslit : 1;
    285  1.1  skrll   } insn;
    286  1.1  skrll   unsigned is_align : 1;
    287  1.1  skrll   unsigned alignment : 5;
    288  1.1  skrll };
    289  1.1  skrll 
    290  1.1  skrll 
    291  1.1  skrll /* Structure for saving information about a block of property data
    292  1.1  skrll    for frags that have the same flags.  */
    293  1.1  skrll struct xtensa_block_info_struct
    294  1.1  skrll {
    295  1.1  skrll   segT sec;
    296  1.1  skrll   bfd_vma offset;
    297  1.1  skrll   size_t size;
    298  1.1  skrll   frag_flags flags;
    299  1.1  skrll   struct xtensa_block_info_struct *next;
    300  1.1  skrll };
    301  1.1  skrll 
    302  1.1  skrll 
    303  1.1  skrll /* Structure for saving the current state before emitting literals.  */
    304  1.1  skrll typedef struct emit_state_struct
    305  1.1  skrll {
    306  1.1  skrll   const char *name;
    307  1.1  skrll   segT now_seg;
    308  1.1  skrll   subsegT now_subseg;
    309  1.1  skrll   int generating_literals;
    310  1.1  skrll } emit_state;
    311  1.1  skrll 
    312  1.1  skrll 
    313  1.1  skrll /* Opcode placement information */
    314  1.1  skrll 
    315  1.1  skrll typedef unsigned long long bitfield;
    316  1.1  skrll #define bit_is_set(bit, bf)	((bf) & (0x01ll << (bit)))
    317  1.1  skrll #define set_bit(bit, bf)	((bf) |= (0x01ll << (bit)))
    318  1.1  skrll #define clear_bit(bit, bf)	((bf) &= ~(0x01ll << (bit)))
    319  1.1  skrll 
    320  1.1  skrll #define MAX_FORMATS 32
    321  1.1  skrll 
    322  1.1  skrll typedef struct op_placement_info_struct
    323  1.1  skrll {
    324  1.1  skrll   int num_formats;
    325  1.1  skrll   /* A number describing how restrictive the issue is for this
    326  1.1  skrll      opcode.  For example, an opcode that fits lots of different
    327  1.1  skrll      formats has a high freedom, as does an opcode that fits
    328  1.1  skrll      only one format but many slots in that format.  The most
    329  1.1  skrll      restrictive is the opcode that fits only one slot in one
    330  1.1  skrll      format.  */
    331  1.1  skrll   int issuef;
    332  1.1  skrll   xtensa_format narrowest;
    333  1.1  skrll   char narrowest_size;
    334  1.1  skrll   char narrowest_slot;
    335  1.1  skrll 
    336  1.1  skrll   /* formats is a bitfield with the Nth bit set
    337  1.1  skrll      if the opcode fits in the Nth xtensa_format.  */
    338  1.1  skrll   bitfield formats;
    339  1.1  skrll 
    340  1.1  skrll   /* slots[N]'s Mth bit is set if the op fits in the
    341  1.1  skrll      Mth slot of the Nth xtensa_format.  */
    342  1.1  skrll   bitfield slots[MAX_FORMATS];
    343  1.1  skrll 
    344  1.1  skrll   /* A count of the number of slots in a given format
    345  1.1  skrll      an op can fit (i.e., the bitcount of the slot field above).  */
    346  1.1  skrll   char slots_in_format[MAX_FORMATS];
    347  1.1  skrll 
    348  1.1  skrll } op_placement_info, *op_placement_info_table;
    349  1.1  skrll 
    350  1.1  skrll op_placement_info_table op_placement_table;
    351  1.1  skrll 
    352  1.1  skrll 
    353  1.1  skrll /* Extra expression types.  */
    354  1.1  skrll 
    355  1.1  skrll #define O_pltrel	O_md1	/* like O_symbol but use a PLT reloc */
    356  1.1  skrll #define O_hi16		O_md2	/* use high 16 bits of symbolic value */
    357  1.1  skrll #define O_lo16		O_md3	/* use low 16 bits of symbolic value */
    358  1.1  skrll #define O_pcrel		O_md4	/* value is a PC-relative offset */
    359  1.1  skrll #define O_tlsfunc	O_md5	/* TLS_FUNC/TLSDESC_FN relocation */
    360  1.1  skrll #define O_tlsarg	O_md6	/* TLS_ARG/TLSDESC_ARG relocation */
    361  1.1  skrll #define O_tlscall	O_md7	/* TLS_CALL relocation */
    362  1.1  skrll #define O_tpoff		O_md8	/* TPOFF relocation */
    363  1.1  skrll #define O_dtpoff	O_md9	/* DTPOFF relocation */
    364  1.1  skrll 
    365  1.1  skrll struct suffix_reloc_map
    366  1.1  skrll {
    367  1.1  skrll   char *suffix;
    368  1.1  skrll   int length;
    369  1.1  skrll   bfd_reloc_code_real_type reloc;
    370  1.1  skrll   unsigned char operator;
    371  1.1  skrll };
    372  1.1  skrll 
    373  1.1  skrll #define SUFFIX_MAP(str, reloc, op) { str, sizeof (str) - 1, reloc, op }
    374  1.1  skrll 
    375  1.1  skrll static struct suffix_reloc_map suffix_relocs[] =
    376  1.1  skrll {
    377  1.1  skrll   SUFFIX_MAP ("l",	BFD_RELOC_LO16,			O_lo16),
    378  1.1  skrll   SUFFIX_MAP ("h",	BFD_RELOC_HI16,			O_hi16),
    379  1.1  skrll   SUFFIX_MAP ("plt",	BFD_RELOC_XTENSA_PLT,		O_pltrel),
    380  1.1  skrll   SUFFIX_MAP ("pcrel",	BFD_RELOC_32_PCREL,		O_pcrel),
    381  1.1  skrll   SUFFIX_MAP ("tlsfunc", BFD_RELOC_XTENSA_TLS_FUNC,	O_tlsfunc),
    382  1.1  skrll   SUFFIX_MAP ("tlsarg",	BFD_RELOC_XTENSA_TLS_ARG,	O_tlsarg),
    383  1.1  skrll   SUFFIX_MAP ("tlscall", BFD_RELOC_XTENSA_TLS_CALL,	O_tlscall),
    384  1.1  skrll   SUFFIX_MAP ("tpoff",	BFD_RELOC_XTENSA_TLS_TPOFF,	O_tpoff),
    385  1.1  skrll   SUFFIX_MAP ("dtpoff",	BFD_RELOC_XTENSA_TLS_DTPOFF,	O_dtpoff),
    386  1.1  skrll   { (char *) 0, 0,	BFD_RELOC_UNUSED,		0 }
    387  1.1  skrll };
    388  1.1  skrll 
    389  1.1  skrll 
    390  1.1  skrll /* Directives.  */
    391  1.1  skrll 
    392  1.1  skrll typedef enum
    393  1.1  skrll {
    394  1.1  skrll   directive_none = 0,
    395  1.1  skrll   directive_literal,
    396  1.1  skrll   directive_density,
    397  1.1  skrll   directive_transform,
    398  1.1  skrll   directive_freeregs,
    399  1.1  skrll   directive_longcalls,
    400  1.1  skrll   directive_literal_prefix,
    401  1.1  skrll   directive_schedule,
    402  1.1  skrll   directive_absolute_literals,
    403  1.1  skrll   directive_last_directive
    404  1.1  skrll } directiveE;
    405  1.1  skrll 
    406  1.1  skrll typedef struct
    407  1.1  skrll {
    408  1.1  skrll   const char *name;
    409  1.1  skrll   bfd_boolean can_be_negated;
    410  1.1  skrll } directive_infoS;
    411  1.1  skrll 
    412  1.1  skrll const directive_infoS directive_info[] =
    413  1.1  skrll {
    414  1.1  skrll   { "none",		FALSE },
    415  1.1  skrll   { "literal",		FALSE },
    416  1.1  skrll   { "density",		TRUE },
    417  1.1  skrll   { "transform",	TRUE },
    418  1.1  skrll   { "freeregs",		FALSE },
    419  1.1  skrll   { "longcalls",	TRUE },
    420  1.1  skrll   { "literal_prefix",	FALSE },
    421  1.1  skrll   { "schedule",		TRUE },
    422  1.1  skrll   { "absolute-literals", TRUE }
    423  1.1  skrll };
    424  1.1  skrll 
    425  1.1  skrll bfd_boolean directive_state[] =
    426  1.1  skrll {
    427  1.1  skrll   FALSE,			/* none */
    428  1.1  skrll   FALSE,			/* literal */
    429  1.1  skrll #if !XCHAL_HAVE_DENSITY
    430  1.1  skrll   FALSE,			/* density */
    431  1.1  skrll #else
    432  1.1  skrll   TRUE,				/* density */
    433  1.1  skrll #endif
    434  1.1  skrll   TRUE,				/* transform */
    435  1.1  skrll   FALSE,			/* freeregs */
    436  1.1  skrll   FALSE,			/* longcalls */
    437  1.1  skrll   FALSE,			/* literal_prefix */
    438  1.1  skrll   FALSE,			/* schedule */
    439  1.1  skrll #if XSHAL_USE_ABSOLUTE_LITERALS
    440  1.1  skrll   TRUE				/* absolute_literals */
    441  1.1  skrll #else
    442  1.1  skrll   FALSE				/* absolute_literals */
    443  1.1  skrll #endif
    444  1.1  skrll };
    445  1.1  skrll 
    446  1.1  skrll 
    447  1.1  skrll /* Directive functions.  */
    448  1.1  skrll 
    449  1.1  skrll static void xtensa_begin_directive (int);
    450  1.1  skrll static void xtensa_end_directive (int);
    451  1.1  skrll static void xtensa_literal_prefix (void);
    452  1.1  skrll static void xtensa_literal_position (int);
    453  1.1  skrll static void xtensa_literal_pseudo (int);
    454  1.1  skrll static void xtensa_frequency_pseudo (int);
    455  1.1  skrll static void xtensa_elf_cons (int);
    456  1.1  skrll static void xtensa_leb128 (int);
    457  1.1  skrll 
    458  1.1  skrll /* Parsing and Idiom Translation.  */
    459  1.1  skrll 
    460  1.1  skrll static bfd_reloc_code_real_type xtensa_elf_suffix (char **, expressionS *);
    461  1.1  skrll 
    462  1.1  skrll /* Various Other Internal Functions.  */
    463  1.1  skrll 
    464  1.1  skrll extern bfd_boolean xg_is_single_relaxable_insn (TInsn *, TInsn *, bfd_boolean);
    465  1.1  skrll static bfd_boolean xg_build_to_insn (TInsn *, TInsn *, BuildInstr *);
    466  1.1  skrll static void xtensa_mark_literal_pool_location (void);
    467  1.1  skrll static addressT get_expanded_loop_offset (xtensa_opcode);
    468  1.1  skrll static fragS *get_literal_pool_location (segT);
    469  1.1  skrll static void set_literal_pool_location (segT, fragS *);
    470  1.1  skrll static void xtensa_set_frag_assembly_state (fragS *);
    471  1.1  skrll static void finish_vinsn (vliw_insn *);
    472  1.1  skrll static bfd_boolean emit_single_op (TInsn *);
    473  1.1  skrll static int total_frag_text_expansion (fragS *);
    474  1.1  skrll 
    475  1.1  skrll /* Alignment Functions.  */
    476  1.1  skrll 
    477  1.1  skrll static int get_text_align_power (unsigned);
    478  1.1  skrll static int get_text_align_max_fill_size (int, bfd_boolean, bfd_boolean);
    479  1.1  skrll static int branch_align_power (segT);
    480  1.1  skrll 
    481  1.1  skrll /* Helpers for xtensa_relax_frag().  */
    482  1.1  skrll 
    483  1.1  skrll static long relax_frag_add_nop (fragS *);
    484  1.1  skrll 
    485  1.1  skrll /* Accessors for additional per-subsegment information.  */
    486  1.1  skrll 
    487  1.1  skrll static unsigned get_last_insn_flags (segT, subsegT);
    488  1.1  skrll static void set_last_insn_flags (segT, subsegT, unsigned, bfd_boolean);
    489  1.1  skrll static float get_subseg_total_freq (segT, subsegT);
    490  1.1  skrll static float get_subseg_target_freq (segT, subsegT);
    491  1.1  skrll static void set_subseg_freq (segT, subsegT, float, float);
    492  1.1  skrll 
    493  1.1  skrll /* Segment list functions.  */
    494  1.1  skrll 
    495  1.1  skrll static void xtensa_move_literals (void);
    496  1.1  skrll static void xtensa_reorder_segments (void);
    497  1.1  skrll static void xtensa_switch_to_literal_fragment (emit_state *);
    498  1.1  skrll static void xtensa_switch_to_non_abs_literal_fragment (emit_state *);
    499  1.1  skrll static void xtensa_switch_section_emit_state (emit_state *, segT, subsegT);
    500  1.1  skrll static void xtensa_restore_emit_state (emit_state *);
    501  1.1  skrll static segT cache_literal_section (bfd_boolean);
    502  1.1  skrll 
    503  1.1  skrll /* Import from elf32-xtensa.c in BFD library.  */
    504  1.1  skrll 
    505  1.1  skrll extern asection *xtensa_make_property_section (asection *, const char *);
    506  1.1  skrll 
    507  1.1  skrll /* op_placement_info functions.  */
    508  1.1  skrll 
    509  1.1  skrll static void init_op_placement_info_table (void);
    510  1.1  skrll extern bfd_boolean opcode_fits_format_slot (xtensa_opcode, xtensa_format, int);
    511  1.1  skrll static int xg_get_single_size (xtensa_opcode);
    512  1.1  skrll static xtensa_format xg_get_single_format (xtensa_opcode);
    513  1.1  skrll static int xg_get_single_slot (xtensa_opcode);
    514  1.1  skrll 
    515  1.1  skrll /* TInsn and IStack functions.  */
    516  1.1  skrll 
    517  1.1  skrll static bfd_boolean tinsn_has_symbolic_operands (const TInsn *);
    518  1.1  skrll static bfd_boolean tinsn_has_invalid_symbolic_operands (const TInsn *);
    519  1.1  skrll static bfd_boolean tinsn_has_complex_operands (const TInsn *);
    520  1.1  skrll static bfd_boolean tinsn_to_insnbuf (TInsn *, xtensa_insnbuf);
    521  1.1  skrll static bfd_boolean tinsn_check_arguments (const TInsn *);
    522  1.1  skrll static void tinsn_from_chars (TInsn *, char *, int);
    523  1.1  skrll static void tinsn_immed_from_frag (TInsn *, fragS *, int);
    524  1.1  skrll static int get_num_stack_text_bytes (IStack *);
    525  1.1  skrll static int get_num_stack_literal_bytes (IStack *);
    526  1.1  skrll 
    527  1.1  skrll /* vliw_insn functions.  */
    528  1.1  skrll 
    529  1.1  skrll static void xg_init_vinsn (vliw_insn *);
    530  1.1  skrll static void xg_clear_vinsn (vliw_insn *);
    531  1.1  skrll static bfd_boolean vinsn_has_specific_opcodes (vliw_insn *);
    532  1.1  skrll static void xg_free_vinsn (vliw_insn *);
    533  1.1  skrll static bfd_boolean vinsn_to_insnbuf
    534  1.1  skrll   (vliw_insn *, char *, fragS *, bfd_boolean);
    535  1.1  skrll static void vinsn_from_chars (vliw_insn *, char *);
    536  1.1  skrll 
    537  1.1  skrll /* Expression Utilities.  */
    538  1.1  skrll 
    539  1.1  skrll bfd_boolean expr_is_const (const expressionS *);
    540  1.1  skrll offsetT get_expr_const (const expressionS *);
    541  1.1  skrll void set_expr_const (expressionS *, offsetT);
    542  1.1  skrll bfd_boolean expr_is_register (const expressionS *);
    543  1.1  skrll offsetT get_expr_register (const expressionS *);
    544  1.1  skrll void set_expr_symbol_offset (expressionS *, symbolS *, offsetT);
    545  1.1  skrll bfd_boolean expr_is_equal (expressionS *, expressionS *);
    546  1.1  skrll static void copy_expr (expressionS *, const expressionS *);
    547  1.1  skrll 
    548  1.1  skrll /* Section renaming.  */
    549  1.1  skrll 
    550  1.1  skrll static void build_section_rename (const char *);
    551  1.1  skrll 
    552  1.1  skrll 
    553  1.1  skrll /* ISA imported from bfd.  */
    554  1.1  skrll extern xtensa_isa xtensa_default_isa;
    555  1.1  skrll 
    556  1.1  skrll extern int target_big_endian;
    557  1.1  skrll 
    558  1.1  skrll static xtensa_opcode xtensa_addi_opcode;
    559  1.1  skrll static xtensa_opcode xtensa_addmi_opcode;
    560  1.1  skrll static xtensa_opcode xtensa_call0_opcode;
    561  1.1  skrll static xtensa_opcode xtensa_call4_opcode;
    562  1.1  skrll static xtensa_opcode xtensa_call8_opcode;
    563  1.1  skrll static xtensa_opcode xtensa_call12_opcode;
    564  1.1  skrll static xtensa_opcode xtensa_callx0_opcode;
    565  1.1  skrll static xtensa_opcode xtensa_callx4_opcode;
    566  1.1  skrll static xtensa_opcode xtensa_callx8_opcode;
    567  1.1  skrll static xtensa_opcode xtensa_callx12_opcode;
    568  1.1  skrll static xtensa_opcode xtensa_const16_opcode;
    569  1.1  skrll static xtensa_opcode xtensa_entry_opcode;
    570  1.1  skrll static xtensa_opcode xtensa_extui_opcode;
    571  1.1  skrll static xtensa_opcode xtensa_movi_opcode;
    572  1.1  skrll static xtensa_opcode xtensa_movi_n_opcode;
    573  1.1  skrll static xtensa_opcode xtensa_isync_opcode;
    574  1.1  skrll static xtensa_opcode xtensa_jx_opcode;
    575  1.1  skrll static xtensa_opcode xtensa_l32r_opcode;
    576  1.1  skrll static xtensa_opcode xtensa_loop_opcode;
    577  1.1  skrll static xtensa_opcode xtensa_loopnez_opcode;
    578  1.1  skrll static xtensa_opcode xtensa_loopgtz_opcode;
    579  1.1  skrll static xtensa_opcode xtensa_nop_opcode;
    580  1.1  skrll static xtensa_opcode xtensa_nop_n_opcode;
    581  1.1  skrll static xtensa_opcode xtensa_or_opcode;
    582  1.1  skrll static xtensa_opcode xtensa_ret_opcode;
    583  1.1  skrll static xtensa_opcode xtensa_ret_n_opcode;
    584  1.1  skrll static xtensa_opcode xtensa_retw_opcode;
    585  1.1  skrll static xtensa_opcode xtensa_retw_n_opcode;
    586  1.1  skrll static xtensa_opcode xtensa_rsr_lcount_opcode;
    587  1.1  skrll static xtensa_opcode xtensa_waiti_opcode;
    588  1.1  skrll 
    589  1.1  skrll 
    590  1.1  skrll /* Command-line Options.  */
    592  1.1  skrll 
    593  1.1  skrll bfd_boolean use_literal_section = TRUE;
    594  1.1  skrll static bfd_boolean align_targets = TRUE;
    595  1.1  skrll static bfd_boolean warn_unaligned_branch_targets = FALSE;
    596  1.1  skrll static bfd_boolean has_a0_b_retw = FALSE;
    597  1.1  skrll static bfd_boolean workaround_a0_b_retw = FALSE;
    598  1.1  skrll static bfd_boolean workaround_b_j_loop_end = FALSE;
    599  1.1  skrll static bfd_boolean workaround_short_loop = FALSE;
    600  1.1  skrll static bfd_boolean maybe_has_short_loop = FALSE;
    601  1.1  skrll static bfd_boolean workaround_close_loop_end = FALSE;
    602  1.1  skrll static bfd_boolean maybe_has_close_loop_end = FALSE;
    603  1.1  skrll static bfd_boolean enforce_three_byte_loop_align = FALSE;
    604  1.1  skrll 
    605  1.1  skrll /* When workaround_short_loops is TRUE, all loops with early exits must
    606  1.1  skrll    have at least 3 instructions.  workaround_all_short_loops is a modifier
    607  1.1  skrll    to the workaround_short_loop flag.  In addition to the
    608  1.1  skrll    workaround_short_loop actions, all straightline loopgtz and loopnez
    609  1.1  skrll    must have at least 3 instructions.  */
    610  1.1  skrll 
    611  1.1  skrll static bfd_boolean workaround_all_short_loops = FALSE;
    612  1.1  skrll 
    613  1.1  skrll 
    614  1.1  skrll static void
    615  1.1  skrll xtensa_setup_hw_workarounds (int earliest, int latest)
    616  1.1  skrll {
    617  1.1  skrll   if (earliest > latest)
    618  1.1  skrll     as_fatal (_("illegal range of target hardware versions"));
    619  1.1  skrll 
    620  1.1  skrll   /* Enable all workarounds for pre-T1050.0 hardware.  */
    621  1.1  skrll   if (earliest < 105000 || latest < 105000)
    622  1.1  skrll     {
    623  1.1  skrll       workaround_a0_b_retw |= TRUE;
    624  1.1  skrll       workaround_b_j_loop_end |= TRUE;
    625  1.1  skrll       workaround_short_loop |= TRUE;
    626  1.1  skrll       workaround_close_loop_end |= TRUE;
    627  1.1  skrll       workaround_all_short_loops |= TRUE;
    628  1.1  skrll       enforce_three_byte_loop_align = TRUE;
    629  1.1  skrll     }
    630  1.1  skrll }
    631  1.1  skrll 
    632  1.1  skrll 
    633  1.1  skrll enum
    634  1.1  skrll {
    635  1.1  skrll   option_density = OPTION_MD_BASE,
    636  1.1  skrll   option_no_density,
    637  1.1  skrll 
    638  1.1  skrll   option_relax,
    639  1.1  skrll   option_no_relax,
    640  1.1  skrll 
    641  1.1  skrll   option_link_relax,
    642  1.1  skrll   option_no_link_relax,
    643  1.1  skrll 
    644  1.1  skrll   option_generics,
    645  1.1  skrll   option_no_generics,
    646  1.1  skrll 
    647  1.1  skrll   option_transform,
    648  1.1  skrll   option_no_transform,
    649  1.1  skrll 
    650  1.1  skrll   option_text_section_literals,
    651  1.1  skrll   option_no_text_section_literals,
    652  1.1  skrll 
    653  1.1  skrll   option_absolute_literals,
    654  1.1  skrll   option_no_absolute_literals,
    655  1.1  skrll 
    656  1.1  skrll   option_align_targets,
    657  1.1  skrll   option_no_align_targets,
    658  1.1  skrll 
    659  1.1  skrll   option_warn_unaligned_targets,
    660  1.1  skrll 
    661  1.1  skrll   option_longcalls,
    662  1.1  skrll   option_no_longcalls,
    663  1.1  skrll 
    664  1.1  skrll   option_workaround_a0_b_retw,
    665  1.1  skrll   option_no_workaround_a0_b_retw,
    666  1.1  skrll 
    667  1.1  skrll   option_workaround_b_j_loop_end,
    668  1.1  skrll   option_no_workaround_b_j_loop_end,
    669  1.1  skrll 
    670  1.1  skrll   option_workaround_short_loop,
    671  1.1  skrll   option_no_workaround_short_loop,
    672  1.1  skrll 
    673  1.1  skrll   option_workaround_all_short_loops,
    674  1.1  skrll   option_no_workaround_all_short_loops,
    675  1.1  skrll 
    676  1.1  skrll   option_workaround_close_loop_end,
    677  1.1  skrll   option_no_workaround_close_loop_end,
    678  1.1  skrll 
    679  1.1  skrll   option_no_workarounds,
    680  1.1  skrll 
    681  1.1  skrll   option_rename_section_name,
    682  1.1  skrll 
    683  1.1  skrll   option_prefer_l32r,
    684  1.1  skrll   option_prefer_const16,
    685  1.1  skrll 
    686  1.1  skrll   option_target_hardware
    687  1.1  skrll };
    688  1.1  skrll 
    689  1.1  skrll const char *md_shortopts = "";
    690  1.1  skrll 
    691  1.1  skrll struct option md_longopts[] =
    692  1.1  skrll {
    693  1.1  skrll   { "density", no_argument, NULL, option_density },
    694  1.1  skrll   { "no-density", no_argument, NULL, option_no_density },
    695  1.1  skrll 
    696  1.1  skrll   /* Both "relax" and "generics" are deprecated and treated as equivalent
    697  1.1  skrll      to the "transform" option.  */
    698  1.1  skrll   { "relax", no_argument, NULL, option_relax },
    699  1.1  skrll   { "no-relax", no_argument, NULL, option_no_relax },
    700  1.1  skrll   { "generics", no_argument, NULL, option_generics },
    701  1.1  skrll   { "no-generics", no_argument, NULL, option_no_generics },
    702  1.1  skrll 
    703  1.1  skrll   { "transform", no_argument, NULL, option_transform },
    704  1.1  skrll   { "no-transform", no_argument, NULL, option_no_transform },
    705  1.1  skrll   { "text-section-literals", no_argument, NULL, option_text_section_literals },
    706  1.1  skrll   { "no-text-section-literals", no_argument, NULL,
    707  1.1  skrll     option_no_text_section_literals },
    708  1.1  skrll   { "absolute-literals", no_argument, NULL, option_absolute_literals },
    709  1.1  skrll   { "no-absolute-literals", no_argument, NULL, option_no_absolute_literals },
    710  1.1  skrll   /* This option was changed from -align-target to -target-align
    711  1.1  skrll      because it conflicted with the "-al" option.  */
    712  1.1  skrll   { "target-align", no_argument, NULL, option_align_targets },
    713  1.1  skrll   { "no-target-align", no_argument, NULL, option_no_align_targets },
    714  1.1  skrll   { "warn-unaligned-targets", no_argument, NULL,
    715  1.1  skrll     option_warn_unaligned_targets },
    716  1.1  skrll   { "longcalls", no_argument, NULL, option_longcalls },
    717  1.1  skrll   { "no-longcalls", no_argument, NULL, option_no_longcalls },
    718  1.1  skrll 
    719  1.1  skrll   { "no-workaround-a0-b-retw", no_argument, NULL,
    720  1.1  skrll     option_no_workaround_a0_b_retw },
    721  1.1  skrll   { "workaround-a0-b-retw", no_argument, NULL, option_workaround_a0_b_retw },
    722  1.1  skrll 
    723  1.1  skrll   { "no-workaround-b-j-loop-end", no_argument, NULL,
    724  1.1  skrll     option_no_workaround_b_j_loop_end },
    725  1.1  skrll   { "workaround-b-j-loop-end", no_argument, NULL,
    726  1.1  skrll     option_workaround_b_j_loop_end },
    727  1.1  skrll 
    728  1.1  skrll   { "no-workaround-short-loops", no_argument, NULL,
    729  1.1  skrll     option_no_workaround_short_loop },
    730  1.1  skrll   { "workaround-short-loops", no_argument, NULL,
    731  1.1  skrll     option_workaround_short_loop },
    732  1.1  skrll 
    733  1.1  skrll   { "no-workaround-all-short-loops", no_argument, NULL,
    734  1.1  skrll     option_no_workaround_all_short_loops },
    735  1.1  skrll   { "workaround-all-short-loop", no_argument, NULL,
    736  1.1  skrll     option_workaround_all_short_loops },
    737  1.1  skrll 
    738  1.1  skrll   { "prefer-l32r", no_argument, NULL, option_prefer_l32r },
    739  1.1  skrll   { "prefer-const16", no_argument, NULL, option_prefer_const16 },
    740  1.1  skrll 
    741  1.1  skrll   { "no-workarounds", no_argument, NULL, option_no_workarounds },
    742  1.1  skrll 
    743  1.1  skrll   { "no-workaround-close-loop-end", no_argument, NULL,
    744  1.1  skrll     option_no_workaround_close_loop_end },
    745  1.1  skrll   { "workaround-close-loop-end", no_argument, NULL,
    746  1.1  skrll     option_workaround_close_loop_end },
    747  1.1  skrll 
    748  1.1  skrll   { "rename-section", required_argument, NULL, option_rename_section_name },
    749  1.1  skrll 
    750  1.1  skrll   { "link-relax", no_argument, NULL, option_link_relax },
    751  1.1  skrll   { "no-link-relax", no_argument, NULL, option_no_link_relax },
    752  1.1  skrll 
    753  1.1  skrll   { "target-hardware", required_argument, NULL, option_target_hardware },
    754  1.1  skrll 
    755  1.1  skrll   { NULL, no_argument, NULL, 0 }
    756  1.1  skrll };
    757  1.1  skrll 
    758  1.1  skrll size_t md_longopts_size = sizeof md_longopts;
    759  1.1  skrll 
    760  1.1  skrll 
    761  1.1  skrll int
    762  1.1  skrll md_parse_option (int c, char *arg)
    763  1.1  skrll {
    764  1.1  skrll   switch (c)
    765  1.1  skrll     {
    766  1.1  skrll     case option_density:
    767  1.1  skrll       as_warn (_("--density option is ignored"));
    768  1.1  skrll       return 1;
    769  1.1  skrll     case option_no_density:
    770  1.1  skrll       as_warn (_("--no-density option is ignored"));
    771  1.1  skrll       return 1;
    772  1.1  skrll     case option_link_relax:
    773  1.1  skrll       linkrelax = 1;
    774  1.1  skrll       return 1;
    775  1.1  skrll     case option_no_link_relax:
    776  1.1  skrll       linkrelax = 0;
    777  1.1  skrll       return 1;
    778  1.1  skrll     case option_generics:
    779  1.1  skrll       as_warn (_("--generics is deprecated; use --transform instead"));
    780  1.1  skrll       return md_parse_option (option_transform, arg);
    781  1.1  skrll     case option_no_generics:
    782  1.1  skrll       as_warn (_("--no-generics is deprecated; use --no-transform instead"));
    783  1.1  skrll       return md_parse_option (option_no_transform, arg);
    784  1.1  skrll     case option_relax:
    785  1.1  skrll       as_warn (_("--relax is deprecated; use --transform instead"));
    786  1.1  skrll       return md_parse_option (option_transform, arg);
    787  1.1  skrll     case option_no_relax:
    788  1.1  skrll       as_warn (_("--no-relax is deprecated; use --no-transform instead"));
    789  1.1  skrll       return md_parse_option (option_no_transform, arg);
    790  1.1  skrll     case option_longcalls:
    791  1.1  skrll       directive_state[directive_longcalls] = TRUE;
    792  1.1  skrll       return 1;
    793  1.1  skrll     case option_no_longcalls:
    794  1.1  skrll       directive_state[directive_longcalls] = FALSE;
    795  1.1  skrll       return 1;
    796  1.1  skrll     case option_text_section_literals:
    797  1.1  skrll       use_literal_section = FALSE;
    798  1.1  skrll       return 1;
    799  1.1  skrll     case option_no_text_section_literals:
    800  1.1  skrll       use_literal_section = TRUE;
    801  1.1  skrll       return 1;
    802  1.1  skrll     case option_absolute_literals:
    803  1.1  skrll       if (!absolute_literals_supported)
    804  1.1  skrll 	{
    805  1.1  skrll 	  as_fatal (_("--absolute-literals option not supported in this Xtensa configuration"));
    806  1.1  skrll 	  return 0;
    807  1.1  skrll 	}
    808  1.1  skrll       directive_state[directive_absolute_literals] = TRUE;
    809  1.1  skrll       return 1;
    810  1.1  skrll     case option_no_absolute_literals:
    811  1.1  skrll       directive_state[directive_absolute_literals] = FALSE;
    812  1.1  skrll       return 1;
    813  1.1  skrll 
    814  1.1  skrll     case option_workaround_a0_b_retw:
    815  1.1  skrll       workaround_a0_b_retw = TRUE;
    816  1.1  skrll       return 1;
    817  1.1  skrll     case option_no_workaround_a0_b_retw:
    818  1.1  skrll       workaround_a0_b_retw = FALSE;
    819  1.1  skrll       return 1;
    820  1.1  skrll     case option_workaround_b_j_loop_end:
    821  1.1  skrll       workaround_b_j_loop_end = TRUE;
    822  1.1  skrll       return 1;
    823  1.1  skrll     case option_no_workaround_b_j_loop_end:
    824  1.1  skrll       workaround_b_j_loop_end = FALSE;
    825  1.1  skrll       return 1;
    826  1.1  skrll 
    827  1.1  skrll     case option_workaround_short_loop:
    828  1.1  skrll       workaround_short_loop = TRUE;
    829  1.1  skrll       return 1;
    830  1.1  skrll     case option_no_workaround_short_loop:
    831  1.1  skrll       workaround_short_loop = FALSE;
    832  1.1  skrll       return 1;
    833  1.1  skrll 
    834  1.1  skrll     case option_workaround_all_short_loops:
    835  1.1  skrll       workaround_all_short_loops = TRUE;
    836  1.1  skrll       return 1;
    837  1.1  skrll     case option_no_workaround_all_short_loops:
    838  1.1  skrll       workaround_all_short_loops = FALSE;
    839  1.1  skrll       return 1;
    840  1.1  skrll 
    841  1.1  skrll     case option_workaround_close_loop_end:
    842  1.1  skrll       workaround_close_loop_end = TRUE;
    843  1.1  skrll       return 1;
    844  1.1  skrll     case option_no_workaround_close_loop_end:
    845  1.1  skrll       workaround_close_loop_end = FALSE;
    846  1.1  skrll       return 1;
    847  1.1  skrll 
    848  1.1  skrll     case option_no_workarounds:
    849  1.1  skrll       workaround_a0_b_retw = FALSE;
    850  1.1  skrll       workaround_b_j_loop_end = FALSE;
    851  1.1  skrll       workaround_short_loop = FALSE;
    852  1.1  skrll       workaround_all_short_loops = FALSE;
    853  1.1  skrll       workaround_close_loop_end = FALSE;
    854  1.1  skrll       return 1;
    855  1.1  skrll 
    856  1.1  skrll     case option_align_targets:
    857  1.1  skrll       align_targets = TRUE;
    858  1.1  skrll       return 1;
    859  1.1  skrll     case option_no_align_targets:
    860  1.1  skrll       align_targets = FALSE;
    861  1.1  skrll       return 1;
    862  1.1  skrll 
    863  1.1  skrll     case option_warn_unaligned_targets:
    864  1.1  skrll       warn_unaligned_branch_targets = TRUE;
    865  1.1  skrll       return 1;
    866  1.1  skrll 
    867  1.1  skrll     case option_rename_section_name:
    868  1.1  skrll       build_section_rename (arg);
    869  1.1  skrll       return 1;
    870  1.1  skrll 
    871  1.1  skrll     case 'Q':
    872  1.1  skrll       /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
    873  1.1  skrll          should be emitted or not.  FIXME: Not implemented.  */
    874  1.1  skrll       return 1;
    875  1.1  skrll 
    876  1.1  skrll     case option_prefer_l32r:
    877  1.1  skrll       if (prefer_const16)
    878  1.1  skrll 	as_fatal (_("prefer-l32r conflicts with prefer-const16"));
    879  1.1  skrll       prefer_l32r = 1;
    880  1.1  skrll       return 1;
    881  1.1  skrll 
    882  1.1  skrll     case option_prefer_const16:
    883  1.1  skrll       if (prefer_l32r)
    884  1.1  skrll 	as_fatal (_("prefer-const16 conflicts with prefer-l32r"));
    885  1.1  skrll       prefer_const16 = 1;
    886  1.1  skrll       return 1;
    887  1.1  skrll 
    888  1.1  skrll     case option_target_hardware:
    889  1.1  skrll       {
    890  1.1  skrll 	int earliest, latest = 0;
    891  1.1  skrll 	if (*arg == 0 || *arg == '-')
    892  1.1  skrll 	  as_fatal (_("invalid target hardware version"));
    893  1.1  skrll 
    894  1.1  skrll 	earliest = strtol (arg, &arg, 0);
    895  1.1  skrll 
    896  1.1  skrll 	if (*arg == 0)
    897  1.1  skrll 	  latest = earliest;
    898  1.1  skrll 	else if (*arg == '-')
    899  1.1  skrll 	  {
    900  1.1  skrll 	    if (*++arg == 0)
    901  1.1  skrll 	      as_fatal (_("invalid target hardware version"));
    902  1.1  skrll 	    latest = strtol (arg, &arg, 0);
    903  1.1  skrll 	  }
    904  1.1  skrll 	if (*arg != 0)
    905  1.1  skrll 	  as_fatal (_("invalid target hardware version"));
    906  1.1  skrll 
    907  1.1  skrll 	xtensa_setup_hw_workarounds (earliest, latest);
    908  1.1  skrll 	return 1;
    909  1.1  skrll       }
    910  1.1  skrll 
    911  1.1  skrll     case option_transform:
    912  1.1  skrll       /* This option has no affect other than to use the defaults,
    913  1.1  skrll 	 which are already set.  */
    914  1.1  skrll       return 1;
    915  1.1  skrll 
    916  1.1  skrll     case option_no_transform:
    917  1.1  skrll       /* This option turns off all transformations of any kind.
    918  1.1  skrll 	 However, because we want to preserve the state of other
    919  1.1  skrll 	 directives, we only change its own field.  Thus, before
    920  1.1  skrll 	 you perform any transformation, always check if transform
    921  1.1  skrll 	 is available.  If you use the functions we provide for this
    922  1.1  skrll 	 purpose, you will be ok.  */
    923  1.1  skrll       directive_state[directive_transform] = FALSE;
    924  1.1  skrll       return 1;
    925  1.1  skrll 
    926  1.1  skrll     default:
    927  1.1  skrll       return 0;
    928  1.1  skrll     }
    929  1.1  skrll }
    930  1.1  skrll 
    931  1.1  skrll 
    932  1.1  skrll void
    933  1.1  skrll md_show_usage (FILE *stream)
    934  1.1  skrll {
    935  1.1  skrll   fputs ("\n\
    936  1.1  skrll Xtensa options:\n\
    937  1.1  skrll   --[no-]text-section-literals\n\
    938  1.1  skrll                           [Do not] put literals in the text section\n\
    939  1.1  skrll   --[no-]absolute-literals\n\
    940  1.1  skrll                           [Do not] default to use non-PC-relative literals\n\
    941  1.1  skrll   --[no-]target-align     [Do not] try to align branch targets\n\
    942  1.1  skrll   --[no-]longcalls        [Do not] emit 32-bit call sequences\n\
    943  1.1  skrll   --[no-]transform        [Do not] transform instructions\n\
    944  1.1  skrll   --rename-section old=new Rename section 'old' to 'new'\n", stream);
    945  1.1  skrll }
    946  1.1  skrll 
    947  1.1  skrll 
    948  1.1  skrll /* Functions related to the list of current label symbols.  */
    950  1.1  skrll 
    951  1.1  skrll static void
    952  1.1  skrll xtensa_add_insn_label (symbolS *sym)
    953  1.1  skrll {
    954  1.1  skrll   sym_list *l;
    955  1.1  skrll 
    956  1.1  skrll   if (!free_insn_labels)
    957  1.1  skrll     l = (sym_list *) xmalloc (sizeof (sym_list));
    958  1.1  skrll   else
    959  1.1  skrll     {
    960  1.1  skrll       l = free_insn_labels;
    961  1.1  skrll       free_insn_labels = l->next;
    962  1.1  skrll     }
    963  1.1  skrll 
    964  1.1  skrll   l->sym = sym;
    965  1.1  skrll   l->next = insn_labels;
    966  1.1  skrll   insn_labels = l;
    967  1.1  skrll }
    968  1.1  skrll 
    969  1.1  skrll 
    970  1.1  skrll static void
    971  1.1  skrll xtensa_clear_insn_labels (void)
    972  1.1  skrll {
    973  1.1  skrll   sym_list **pl;
    974  1.1  skrll 
    975  1.1  skrll   for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
    976  1.1  skrll     ;
    977  1.1  skrll   *pl = insn_labels;
    978  1.1  skrll   insn_labels = NULL;
    979  1.1  skrll }
    980  1.1  skrll 
    981  1.1  skrll 
    982  1.1  skrll static void
    983  1.1  skrll xtensa_move_labels (fragS *new_frag, valueT new_offset)
    984  1.1  skrll {
    985  1.1  skrll   sym_list *lit;
    986  1.1  skrll 
    987  1.1  skrll   for (lit = insn_labels; lit; lit = lit->next)
    988  1.1  skrll     {
    989  1.1  skrll       symbolS *lit_sym = lit->sym;
    990  1.1  skrll       S_SET_VALUE (lit_sym, new_offset);
    991  1.1  skrll       symbol_set_frag (lit_sym, new_frag);
    992  1.1  skrll     }
    993  1.1  skrll }
    994  1.1  skrll 
    995  1.1  skrll 
    996  1.1  skrll /* Directive data and functions.  */
    998  1.1  skrll 
    999  1.1  skrll typedef struct state_stackS_struct
   1000  1.1  skrll {
   1001  1.1  skrll   directiveE directive;
   1002  1.1  skrll   bfd_boolean negated;
   1003  1.1  skrll   bfd_boolean old_state;
   1004  1.1  skrll   const char *file;
   1005  1.1  skrll   unsigned int line;
   1006  1.1  skrll   const void *datum;
   1007  1.1  skrll   struct state_stackS_struct *prev;
   1008  1.1  skrll } state_stackS;
   1009  1.1  skrll 
   1010  1.1  skrll state_stackS *directive_state_stack;
   1011  1.1  skrll 
   1012  1.1  skrll const pseudo_typeS md_pseudo_table[] =
   1013  1.1  skrll {
   1014  1.1  skrll   { "align", s_align_bytes, 0 }, /* Defaulting is invalid (0).  */
   1015  1.1  skrll   { "literal_position", xtensa_literal_position, 0 },
   1016  1.1  skrll   { "frame", s_ignore, 0 },	/* Formerly used for STABS debugging.  */
   1017  1.1  skrll   { "long", xtensa_elf_cons, 4 },
   1018  1.1  skrll   { "word", xtensa_elf_cons, 4 },
   1019  1.1  skrll   { "4byte", xtensa_elf_cons, 4 },
   1020  1.1  skrll   { "short", xtensa_elf_cons, 2 },
   1021  1.1  skrll   { "2byte", xtensa_elf_cons, 2 },
   1022  1.1  skrll   { "sleb128", xtensa_leb128, 1},
   1023  1.1  skrll   { "uleb128", xtensa_leb128, 0},
   1024  1.1  skrll   { "begin", xtensa_begin_directive, 0 },
   1025  1.1  skrll   { "end", xtensa_end_directive, 0 },
   1026  1.1  skrll   { "literal", xtensa_literal_pseudo, 0 },
   1027  1.1  skrll   { "frequency", xtensa_frequency_pseudo, 0 },
   1028  1.1  skrll   { NULL, 0, 0 },
   1029  1.1  skrll };
   1030  1.1  skrll 
   1031  1.1  skrll 
   1032  1.1  skrll static bfd_boolean
   1033  1.1  skrll use_transform (void)
   1034  1.1  skrll {
   1035  1.1  skrll   /* After md_end, you should be checking frag by frag, rather
   1036  1.1  skrll      than state directives.  */
   1037  1.1  skrll   assert (!past_xtensa_end);
   1038  1.1  skrll   return directive_state[directive_transform];
   1039  1.1  skrll }
   1040  1.1  skrll 
   1041  1.1  skrll 
   1042  1.1  skrll static bfd_boolean
   1043  1.1  skrll do_align_targets (void)
   1044  1.1  skrll {
   1045  1.1  skrll   /* Do not use this function after md_end; just look at align_targets
   1046  1.1  skrll      instead.  There is no target-align directive, so alignment is either
   1047  1.1  skrll      enabled for all frags or not done at all.  */
   1048  1.1  skrll   assert (!past_xtensa_end);
   1049  1.1  skrll   return align_targets && use_transform ();
   1050  1.1  skrll }
   1051  1.1  skrll 
   1052  1.1  skrll 
   1053  1.1  skrll static void
   1054  1.1  skrll directive_push (directiveE directive, bfd_boolean negated, const void *datum)
   1055  1.1  skrll {
   1056  1.1  skrll   char *file;
   1057  1.1  skrll   unsigned int line;
   1058  1.1  skrll   state_stackS *stack = (state_stackS *) xmalloc (sizeof (state_stackS));
   1059  1.1  skrll 
   1060  1.1  skrll   as_where (&file, &line);
   1061  1.1  skrll 
   1062  1.1  skrll   stack->directive = directive;
   1063  1.1  skrll   stack->negated = negated;
   1064  1.1  skrll   stack->old_state = directive_state[directive];
   1065  1.1  skrll   stack->file = file;
   1066  1.1  skrll   stack->line = line;
   1067  1.1  skrll   stack->datum = datum;
   1068  1.1  skrll   stack->prev = directive_state_stack;
   1069  1.1  skrll   directive_state_stack = stack;
   1070  1.1  skrll 
   1071  1.1  skrll   directive_state[directive] = !negated;
   1072  1.1  skrll }
   1073  1.1  skrll 
   1074  1.1  skrll 
   1075  1.1  skrll static void
   1076  1.1  skrll directive_pop (directiveE *directive,
   1077  1.1  skrll 	       bfd_boolean *negated,
   1078  1.1  skrll 	       const char **file,
   1079  1.1  skrll 	       unsigned int *line,
   1080  1.1  skrll 	       const void **datum)
   1081  1.1  skrll {
   1082  1.1  skrll   state_stackS *top = directive_state_stack;
   1083  1.1  skrll 
   1084  1.1  skrll   if (!directive_state_stack)
   1085  1.1  skrll     {
   1086  1.1  skrll       as_bad (_("unmatched end directive"));
   1087  1.1  skrll       *directive = directive_none;
   1088  1.1  skrll       return;
   1089  1.1  skrll     }
   1090  1.1  skrll 
   1091  1.1  skrll   directive_state[directive_state_stack->directive] = top->old_state;
   1092  1.1  skrll   *directive = top->directive;
   1093  1.1  skrll   *negated = top->negated;
   1094  1.1  skrll   *file = top->file;
   1095  1.1  skrll   *line = top->line;
   1096  1.1  skrll   *datum = top->datum;
   1097  1.1  skrll   directive_state_stack = top->prev;
   1098  1.1  skrll   free (top);
   1099  1.1  skrll }
   1100  1.1  skrll 
   1101  1.1  skrll 
   1102  1.1  skrll static void
   1103  1.1  skrll directive_balance (void)
   1104  1.1  skrll {
   1105  1.1  skrll   while (directive_state_stack)
   1106  1.1  skrll     {
   1107  1.1  skrll       directiveE directive;
   1108  1.1  skrll       bfd_boolean negated;
   1109  1.1  skrll       const char *file;
   1110  1.1  skrll       unsigned int line;
   1111  1.1  skrll       const void *datum;
   1112  1.1  skrll 
   1113  1.1  skrll       directive_pop (&directive, &negated, &file, &line, &datum);
   1114  1.1  skrll       as_warn_where ((char *) file, line,
   1115  1.1  skrll 		     _(".begin directive with no matching .end directive"));
   1116  1.1  skrll     }
   1117  1.1  skrll }
   1118  1.1  skrll 
   1119  1.1  skrll 
   1120  1.1  skrll static bfd_boolean
   1121  1.1  skrll inside_directive (directiveE dir)
   1122  1.1  skrll {
   1123  1.1  skrll   state_stackS *top = directive_state_stack;
   1124  1.1  skrll 
   1125  1.1  skrll   while (top && top->directive != dir)
   1126  1.1  skrll     top = top->prev;
   1127  1.1  skrll 
   1128  1.1  skrll   return (top != NULL);
   1129  1.1  skrll }
   1130  1.1  skrll 
   1131  1.1  skrll 
   1132  1.1  skrll static void
   1133  1.1  skrll get_directive (directiveE *directive, bfd_boolean *negated)
   1134  1.1  skrll {
   1135  1.1  skrll   int len;
   1136  1.1  skrll   unsigned i;
   1137  1.1  skrll   char *directive_string;
   1138  1.1  skrll 
   1139  1.1  skrll   if (strncmp (input_line_pointer, "no-", 3) != 0)
   1140  1.1  skrll     *negated = FALSE;
   1141  1.1  skrll   else
   1142  1.1  skrll     {
   1143  1.1  skrll       *negated = TRUE;
   1144  1.1  skrll       input_line_pointer += 3;
   1145  1.1  skrll     }
   1146  1.1  skrll 
   1147  1.1  skrll   len = strspn (input_line_pointer,
   1148  1.1  skrll 		"abcdefghijklmnopqrstuvwxyz_-/0123456789.");
   1149  1.1  skrll 
   1150  1.1  skrll   /* This code is a hack to make .begin [no-][generics|relax] exactly
   1151  1.1  skrll      equivalent to .begin [no-]transform.  We should remove it when
   1152  1.1  skrll      we stop accepting those options.  */
   1153  1.1  skrll 
   1154  1.1  skrll   if (strncmp (input_line_pointer, "generics", strlen ("generics")) == 0)
   1155  1.1  skrll     {
   1156  1.1  skrll       as_warn (_("[no-]generics is deprecated; use [no-]transform instead"));
   1157  1.1  skrll       directive_string = "transform";
   1158  1.1  skrll     }
   1159  1.1  skrll   else if (strncmp (input_line_pointer, "relax", strlen ("relax")) == 0)
   1160  1.1  skrll     {
   1161  1.1  skrll       as_warn (_("[no-]relax is deprecated; use [no-]transform instead"));
   1162  1.1  skrll       directive_string = "transform";
   1163  1.1  skrll     }
   1164  1.1  skrll   else
   1165  1.1  skrll     directive_string = input_line_pointer;
   1166  1.1  skrll 
   1167  1.1  skrll   for (i = 0; i < sizeof (directive_info) / sizeof (*directive_info); ++i)
   1168  1.1  skrll     {
   1169  1.1  skrll       if (strncmp (directive_string, directive_info[i].name, len) == 0)
   1170  1.1  skrll 	{
   1171  1.1  skrll 	  input_line_pointer += len;
   1172  1.1  skrll 	  *directive = (directiveE) i;
   1173  1.1  skrll 	  if (*negated && !directive_info[i].can_be_negated)
   1174  1.1  skrll 	    as_bad (_("directive %s cannot be negated"),
   1175  1.1  skrll 		    directive_info[i].name);
   1176  1.1  skrll 	  return;
   1177  1.1  skrll 	}
   1178  1.1  skrll     }
   1179  1.1  skrll 
   1180  1.1  skrll   as_bad (_("unknown directive"));
   1181  1.1  skrll   *directive = (directiveE) XTENSA_UNDEFINED;
   1182  1.1  skrll }
   1183  1.1  skrll 
   1184  1.1  skrll 
   1185  1.1  skrll static void
   1186  1.1  skrll xtensa_begin_directive (int ignore ATTRIBUTE_UNUSED)
   1187  1.1  skrll {
   1188  1.1  skrll   directiveE directive;
   1189  1.1  skrll   bfd_boolean negated;
   1190  1.1  skrll   emit_state *state;
   1191  1.1  skrll   lit_state *ls;
   1192  1.1  skrll 
   1193  1.1  skrll   get_directive (&directive, &negated);
   1194  1.1  skrll   if (directive == (directiveE) XTENSA_UNDEFINED)
   1195  1.1  skrll     {
   1196  1.1  skrll       discard_rest_of_line ();
   1197  1.1  skrll       return;
   1198  1.1  skrll     }
   1199  1.1  skrll 
   1200  1.1  skrll   if (cur_vinsn.inside_bundle)
   1201  1.1  skrll     as_bad (_("directives are not valid inside bundles"));
   1202  1.1  skrll 
   1203  1.1  skrll   switch (directive)
   1204  1.1  skrll     {
   1205  1.1  skrll     case directive_literal:
   1206  1.1  skrll       if (!inside_directive (directive_literal))
   1207  1.1  skrll 	{
   1208  1.1  skrll 	  /* Previous labels go with whatever follows this directive, not with
   1209  1.1  skrll 	     the literal, so save them now.  */
   1210  1.1  skrll 	  saved_insn_labels = insn_labels;
   1211  1.1  skrll 	  insn_labels = NULL;
   1212  1.1  skrll 	}
   1213  1.1  skrll       as_warn (_(".begin literal is deprecated; use .literal instead"));
   1214  1.1  skrll       state = (emit_state *) xmalloc (sizeof (emit_state));
   1215  1.1  skrll       xtensa_switch_to_literal_fragment (state);
   1216  1.1  skrll       directive_push (directive_literal, negated, state);
   1217  1.1  skrll       break;
   1218  1.1  skrll 
   1219  1.1  skrll     case directive_literal_prefix:
   1220  1.1  skrll       /* Have to flush pending output because a movi relaxed to an l32r
   1221  1.1  skrll 	 might produce a literal.  */
   1222  1.1  skrll       md_flush_pending_output ();
   1223  1.1  skrll       /* Check to see if the current fragment is a literal
   1224  1.1  skrll 	 fragment.  If it is, then this operation is not allowed.  */
   1225  1.1  skrll       if (generating_literals)
   1226  1.1  skrll 	{
   1227  1.1  skrll 	  as_bad (_("cannot set literal_prefix inside literal fragment"));
   1228  1.1  skrll 	  return;
   1229  1.1  skrll 	}
   1230  1.1  skrll 
   1231  1.1  skrll       /* Allocate the literal state for this section and push
   1232  1.1  skrll 	 onto the directive stack.  */
   1233  1.1  skrll       ls = xmalloc (sizeof (lit_state));
   1234  1.1  skrll       assert (ls);
   1235  1.1  skrll 
   1236  1.1  skrll       *ls = default_lit_sections;
   1237  1.1  skrll       directive_push (directive_literal_prefix, negated, ls);
   1238  1.1  skrll 
   1239  1.1  skrll       /* Process the new prefix.  */
   1240  1.1  skrll       xtensa_literal_prefix ();
   1241  1.1  skrll       break;
   1242  1.1  skrll 
   1243  1.1  skrll     case directive_freeregs:
   1244  1.1  skrll       /* This information is currently unused, but we'll accept the statement
   1245  1.1  skrll          and just discard the rest of the line.  This won't check the syntax,
   1246  1.1  skrll          but it will accept every correct freeregs directive.  */
   1247  1.1  skrll       input_line_pointer += strcspn (input_line_pointer, "\n");
   1248  1.1  skrll       directive_push (directive_freeregs, negated, 0);
   1249  1.1  skrll       break;
   1250  1.1  skrll 
   1251  1.1  skrll     case directive_schedule:
   1252  1.1  skrll       md_flush_pending_output ();
   1253  1.1  skrll       frag_var (rs_fill, 0, 0, frag_now->fr_subtype,
   1254  1.1  skrll 		frag_now->fr_symbol, frag_now->fr_offset, NULL);
   1255  1.1  skrll       directive_push (directive_schedule, negated, 0);
   1256  1.1  skrll       xtensa_set_frag_assembly_state (frag_now);
   1257  1.1  skrll       break;
   1258  1.1  skrll 
   1259  1.1  skrll     case directive_density:
   1260  1.1  skrll       as_warn (_(".begin [no-]density is ignored"));
   1261  1.1  skrll       break;
   1262  1.1  skrll 
   1263  1.1  skrll     case directive_absolute_literals:
   1264  1.1  skrll       md_flush_pending_output ();
   1265  1.1  skrll       if (!absolute_literals_supported && !negated)
   1266  1.1  skrll 	{
   1267  1.1  skrll 	  as_warn (_("Xtensa absolute literals option not supported; ignored"));
   1268  1.1  skrll 	  break;
   1269  1.1  skrll 	}
   1270  1.1  skrll       xtensa_set_frag_assembly_state (frag_now);
   1271  1.1  skrll       directive_push (directive, negated, 0);
   1272  1.1  skrll       break;
   1273  1.1  skrll 
   1274  1.1  skrll     default:
   1275  1.1  skrll       md_flush_pending_output ();
   1276  1.1  skrll       xtensa_set_frag_assembly_state (frag_now);
   1277  1.1  skrll       directive_push (directive, negated, 0);
   1278  1.1  skrll       break;
   1279  1.1  skrll     }
   1280  1.1  skrll 
   1281  1.1  skrll   demand_empty_rest_of_line ();
   1282  1.1  skrll }
   1283  1.1  skrll 
   1284  1.1  skrll 
   1285  1.1  skrll static void
   1286  1.1  skrll xtensa_end_directive (int ignore ATTRIBUTE_UNUSED)
   1287  1.1  skrll {
   1288  1.1  skrll   directiveE begin_directive, end_directive;
   1289  1.1  skrll   bfd_boolean begin_negated, end_negated;
   1290  1.1  skrll   const char *file;
   1291  1.1  skrll   unsigned int line;
   1292  1.1  skrll   emit_state *state;
   1293  1.1  skrll   emit_state **state_ptr;
   1294  1.1  skrll   lit_state *s;
   1295  1.1  skrll 
   1296  1.1  skrll   if (cur_vinsn.inside_bundle)
   1297  1.1  skrll     as_bad (_("directives are not valid inside bundles"));
   1298  1.1  skrll 
   1299  1.1  skrll   get_directive (&end_directive, &end_negated);
   1300  1.1  skrll 
   1301  1.1  skrll   md_flush_pending_output ();
   1302  1.1  skrll 
   1303  1.1  skrll   switch (end_directive)
   1304  1.1  skrll     {
   1305  1.1  skrll     case (directiveE) XTENSA_UNDEFINED:
   1306  1.1  skrll       discard_rest_of_line ();
   1307  1.1  skrll       return;
   1308  1.1  skrll 
   1309  1.1  skrll     case directive_density:
   1310  1.1  skrll       as_warn (_(".end [no-]density is ignored"));
   1311  1.1  skrll       demand_empty_rest_of_line ();
   1312  1.1  skrll       break;
   1313  1.1  skrll 
   1314  1.1  skrll     case directive_absolute_literals:
   1315  1.1  skrll       if (!absolute_literals_supported && !end_negated)
   1316  1.1  skrll 	{
   1317  1.1  skrll 	  as_warn (_("Xtensa absolute literals option not supported; ignored"));
   1318  1.1  skrll 	  demand_empty_rest_of_line ();
   1319  1.1  skrll 	  return;
   1320  1.1  skrll 	}
   1321  1.1  skrll       break;
   1322  1.1  skrll 
   1323  1.1  skrll     default:
   1324  1.1  skrll       break;
   1325  1.1  skrll     }
   1326  1.1  skrll 
   1327  1.1  skrll   state_ptr = &state; /* use state_ptr to avoid type-punning warning */
   1328  1.1  skrll   directive_pop (&begin_directive, &begin_negated, &file, &line,
   1329  1.1  skrll 		 (const void **) state_ptr);
   1330  1.1  skrll 
   1331  1.1  skrll   if (begin_directive != directive_none)
   1332  1.1  skrll     {
   1333  1.1  skrll       if (begin_directive != end_directive || begin_negated != end_negated)
   1334  1.1  skrll 	{
   1335  1.1  skrll 	  as_bad (_("does not match begin %s%s at %s:%d"),
   1336  1.1  skrll 		  begin_negated ? "no-" : "",
   1337  1.1  skrll 		  directive_info[begin_directive].name, file, line);
   1338  1.1  skrll 	}
   1339  1.1  skrll       else
   1340  1.1  skrll 	{
   1341  1.1  skrll 	  switch (end_directive)
   1342  1.1  skrll 	    {
   1343  1.1  skrll 	    case directive_literal:
   1344  1.1  skrll 	      frag_var (rs_fill, 0, 0, 0, NULL, 0, NULL);
   1345  1.1  skrll 	      xtensa_restore_emit_state (state);
   1346  1.1  skrll 	      xtensa_set_frag_assembly_state (frag_now);
   1347  1.1  skrll 	      free (state);
   1348  1.1  skrll 	      if (!inside_directive (directive_literal))
   1349  1.1  skrll 		{
   1350  1.1  skrll 		  /* Restore the list of current labels.  */
   1351  1.1  skrll 		  xtensa_clear_insn_labels ();
   1352  1.1  skrll 		  insn_labels = saved_insn_labels;
   1353  1.1  skrll 		}
   1354  1.1  skrll 	      break;
   1355  1.1  skrll 
   1356  1.1  skrll 	    case directive_literal_prefix:
   1357  1.1  skrll 	      /* Restore the default collection sections from saved state.  */
   1358  1.1  skrll 	      s = (lit_state *) state;
   1359  1.1  skrll 	      assert (s);
   1360  1.1  skrll 	      default_lit_sections = *s;
   1361  1.1  skrll 
   1362  1.1  skrll 	      /* Free the state storage.  */
   1363  1.1  skrll 	      free (s->lit_prefix);
   1364  1.1  skrll 	      free (s);
   1365  1.1  skrll 	      break;
   1366  1.1  skrll 
   1367  1.1  skrll 	    case directive_schedule:
   1368  1.1  skrll 	    case directive_freeregs:
   1369  1.1  skrll 	      break;
   1370  1.1  skrll 
   1371  1.1  skrll 	    default:
   1372  1.1  skrll 	      xtensa_set_frag_assembly_state (frag_now);
   1373  1.1  skrll 	      break;
   1374  1.1  skrll 	    }
   1375  1.1  skrll 	}
   1376  1.1  skrll     }
   1377  1.1  skrll 
   1378  1.1  skrll   demand_empty_rest_of_line ();
   1379  1.1  skrll }
   1380  1.1  skrll 
   1381  1.1  skrll 
   1382  1.1  skrll /* Place an aligned literal fragment at the current location.  */
   1383  1.1  skrll 
   1384  1.1  skrll static void
   1385  1.1  skrll xtensa_literal_position (int ignore ATTRIBUTE_UNUSED)
   1386  1.1  skrll {
   1387  1.1  skrll   md_flush_pending_output ();
   1388  1.1  skrll 
   1389  1.1  skrll   if (inside_directive (directive_literal))
   1390  1.1  skrll     as_warn (_(".literal_position inside literal directive; ignoring"));
   1391  1.1  skrll   xtensa_mark_literal_pool_location ();
   1392  1.1  skrll 
   1393  1.1  skrll   demand_empty_rest_of_line ();
   1394  1.1  skrll   xtensa_clear_insn_labels ();
   1395  1.1  skrll }
   1396  1.1  skrll 
   1397  1.1  skrll 
   1398  1.1  skrll /* Support .literal label, expr, ...  */
   1399  1.1  skrll 
   1400  1.1  skrll static void
   1401  1.1  skrll xtensa_literal_pseudo (int ignored ATTRIBUTE_UNUSED)
   1402  1.1  skrll {
   1403  1.1  skrll   emit_state state;
   1404  1.1  skrll   char *p, *base_name;
   1405  1.1  skrll   char c;
   1406  1.1  skrll   segT dest_seg;
   1407  1.1  skrll 
   1408  1.1  skrll   if (inside_directive (directive_literal))
   1409  1.1  skrll     {
   1410  1.1  skrll       as_bad (_(".literal not allowed inside .begin literal region"));
   1411  1.1  skrll       ignore_rest_of_line ();
   1412  1.1  skrll       return;
   1413  1.1  skrll     }
   1414  1.1  skrll 
   1415  1.1  skrll   md_flush_pending_output ();
   1416  1.1  skrll 
   1417  1.1  skrll   /* Previous labels go with whatever follows this directive, not with
   1418  1.1  skrll      the literal, so save them now.  */
   1419  1.1  skrll   saved_insn_labels = insn_labels;
   1420  1.1  skrll   insn_labels = NULL;
   1421  1.1  skrll 
   1422  1.1  skrll   /* If we are using text-section literals, then this is the right value... */
   1423  1.1  skrll   dest_seg = now_seg;
   1424  1.1  skrll 
   1425  1.1  skrll   base_name = input_line_pointer;
   1426  1.1  skrll 
   1427  1.1  skrll   xtensa_switch_to_literal_fragment (&state);
   1428  1.1  skrll 
   1429  1.1  skrll   /* ...but if we aren't using text-section-literals, then we
   1430  1.1  skrll      need to put them in the section we just switched to.  */
   1431  1.1  skrll   if (use_literal_section || directive_state[directive_absolute_literals])
   1432  1.1  skrll     dest_seg = now_seg;
   1433  1.1  skrll 
   1434  1.1  skrll   /* All literals are aligned to four-byte boundaries.  */
   1435  1.1  skrll   frag_align (2, 0, 0);
   1436  1.1  skrll   record_alignment (now_seg, 2);
   1437  1.1  skrll 
   1438  1.1  skrll   c = get_symbol_end ();
   1439  1.1  skrll   /* Just after name is now '\0'.  */
   1440  1.1  skrll   p = input_line_pointer;
   1441  1.1  skrll   *p = c;
   1442  1.1  skrll   SKIP_WHITESPACE ();
   1443  1.1  skrll 
   1444  1.1  skrll   if (*input_line_pointer != ',' && *input_line_pointer != ':')
   1445  1.1  skrll     {
   1446  1.1  skrll       as_bad (_("expected comma or colon after symbol name; "
   1447  1.1  skrll 		"rest of line ignored"));
   1448  1.1  skrll       ignore_rest_of_line ();
   1449  1.1  skrll       xtensa_restore_emit_state (&state);
   1450  1.1  skrll       return;
   1451  1.1  skrll     }
   1452  1.1  skrll   *p = 0;
   1453  1.1  skrll 
   1454  1.1  skrll   colon (base_name);
   1455  1.1  skrll 
   1456  1.1  skrll   *p = c;
   1457  1.1  skrll   input_line_pointer++;		/* skip ',' or ':' */
   1458  1.1  skrll 
   1459  1.1  skrll   xtensa_elf_cons (4);
   1460  1.1  skrll 
   1461  1.1  skrll   xtensa_restore_emit_state (&state);
   1462  1.1  skrll 
   1463  1.1  skrll   /* Restore the list of current labels.  */
   1464  1.1  skrll   xtensa_clear_insn_labels ();
   1465  1.1  skrll   insn_labels = saved_insn_labels;
   1466  1.1  skrll }
   1467  1.1  skrll 
   1468  1.1  skrll 
   1469  1.1  skrll static void
   1470  1.1  skrll xtensa_literal_prefix (void)
   1471  1.1  skrll {
   1472  1.1  skrll   char *name;
   1473  1.1  skrll   int len;
   1474  1.1  skrll 
   1475  1.1  skrll   /* Parse the new prefix from the input_line_pointer.  */
   1476  1.1  skrll   SKIP_WHITESPACE ();
   1477  1.1  skrll   len = strspn (input_line_pointer,
   1478  1.1  skrll 		"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
   1479  1.1  skrll 		"abcdefghijklmnopqrstuvwxyz_/0123456789.$");
   1480  1.1  skrll 
   1481  1.1  skrll   /* Get a null-terminated copy of the name.  */
   1482  1.1  skrll   name = xmalloc (len + 1);
   1483  1.1  skrll   assert (name);
   1484  1.1  skrll   strncpy (name, input_line_pointer, len);
   1485  1.1  skrll   name[len] = 0;
   1486  1.1  skrll 
   1487  1.1  skrll   /* Skip the name in the input line.  */
   1488  1.1  skrll   input_line_pointer += len;
   1489  1.1  skrll 
   1490  1.1  skrll   default_lit_sections.lit_prefix = name;
   1491  1.1  skrll 
   1492  1.1  skrll   /* Clear cached literal sections, since the prefix has changed.  */
   1493  1.1  skrll   default_lit_sections.lit_seg = NULL;
   1494  1.1  skrll   default_lit_sections.lit4_seg = NULL;
   1495  1.1  skrll }
   1496  1.1  skrll 
   1497  1.1  skrll 
   1498  1.1  skrll /* Support ".frequency branch_target_frequency fall_through_frequency".  */
   1499  1.1  skrll 
   1500  1.1  skrll static void
   1501  1.1  skrll xtensa_frequency_pseudo (int ignored ATTRIBUTE_UNUSED)
   1502  1.1  skrll {
   1503  1.1  skrll   float fall_through_f, target_f;
   1504  1.1  skrll 
   1505  1.1  skrll   fall_through_f = (float) strtod (input_line_pointer, &input_line_pointer);
   1506  1.1  skrll   if (fall_through_f < 0)
   1507  1.1  skrll     {
   1508  1.1  skrll       as_bad (_("fall through frequency must be greater than 0"));
   1509  1.1  skrll       ignore_rest_of_line ();
   1510  1.1  skrll       return;
   1511  1.1  skrll     }
   1512  1.1  skrll 
   1513  1.1  skrll   target_f = (float) strtod (input_line_pointer, &input_line_pointer);
   1514  1.1  skrll   if (target_f < 0)
   1515  1.1  skrll     {
   1516  1.1  skrll       as_bad (_("branch target frequency must be greater than 0"));
   1517  1.1  skrll       ignore_rest_of_line ();
   1518  1.1  skrll       return;
   1519  1.1  skrll     }
   1520  1.1  skrll 
   1521  1.1  skrll   set_subseg_freq (now_seg, now_subseg, target_f + fall_through_f, target_f);
   1522  1.1  skrll 
   1523  1.1  skrll   demand_empty_rest_of_line ();
   1524  1.1  skrll }
   1525  1.1  skrll 
   1526  1.1  skrll 
   1527  1.1  skrll /* Like normal .long/.short/.word, except support @plt, etc.
   1528  1.1  skrll    Clobbers input_line_pointer, checks end-of-line.  */
   1529  1.1  skrll 
   1530  1.1  skrll static void
   1531  1.1  skrll xtensa_elf_cons (int nbytes)
   1532  1.1  skrll {
   1533  1.1  skrll   expressionS exp;
   1534  1.1  skrll   bfd_reloc_code_real_type reloc;
   1535  1.1  skrll 
   1536  1.1  skrll   md_flush_pending_output ();
   1537  1.1  skrll 
   1538  1.1  skrll   if (cur_vinsn.inside_bundle)
   1539  1.1  skrll     as_bad (_("directives are not valid inside bundles"));
   1540  1.1  skrll 
   1541  1.1  skrll   if (is_it_end_of_statement ())
   1542  1.1  skrll     {
   1543  1.1  skrll       demand_empty_rest_of_line ();
   1544  1.1  skrll       return;
   1545  1.1  skrll     }
   1546  1.1  skrll 
   1547  1.1  skrll   do
   1548  1.1  skrll     {
   1549  1.1  skrll       expression (&exp);
   1550  1.1  skrll       if (exp.X_op == O_symbol
   1551  1.1  skrll 	  && *input_line_pointer == '@'
   1552  1.1  skrll 	  && ((reloc = xtensa_elf_suffix (&input_line_pointer, &exp))
   1553  1.1  skrll 	      != BFD_RELOC_NONE))
   1554  1.1  skrll 	{
   1555  1.1  skrll 	  reloc_howto_type *reloc_howto =
   1556  1.1  skrll 	    bfd_reloc_type_lookup (stdoutput, reloc);
   1557  1.1  skrll 
   1558  1.1  skrll 	  if (reloc == BFD_RELOC_UNUSED || !reloc_howto)
   1559  1.1  skrll 	    as_bad (_("unsupported relocation"));
   1560  1.1  skrll 	  else if ((reloc >= BFD_RELOC_XTENSA_SLOT0_OP
   1561  1.1  skrll 		    && reloc <= BFD_RELOC_XTENSA_SLOT14_OP)
   1562  1.1  skrll 		   || (reloc >= BFD_RELOC_XTENSA_SLOT0_ALT
   1563  1.1  skrll 		       && reloc <= BFD_RELOC_XTENSA_SLOT14_ALT))
   1564  1.1  skrll 	    as_bad (_("opcode-specific %s relocation used outside "
   1565  1.1  skrll 		      "an instruction"), reloc_howto->name);
   1566  1.1  skrll 	  else if (nbytes != (int) bfd_get_reloc_size (reloc_howto))
   1567  1.1  skrll 	    as_bad (_("%s relocations do not fit in %d bytes"),
   1568  1.1  skrll 		    reloc_howto->name, nbytes);
   1569  1.1  skrll 	  else if (reloc == BFD_RELOC_XTENSA_TLS_FUNC
   1570  1.1  skrll 		   || reloc == BFD_RELOC_XTENSA_TLS_ARG
   1571  1.1  skrll 		   || reloc == BFD_RELOC_XTENSA_TLS_CALL)
   1572  1.1  skrll 	    as_bad (_("invalid use of %s relocation"), reloc_howto->name);
   1573  1.1  skrll 	  else
   1574  1.1  skrll 	    {
   1575  1.1  skrll 	      char *p = frag_more ((int) nbytes);
   1576  1.1  skrll 	      xtensa_set_frag_assembly_state (frag_now);
   1577  1.1  skrll 	      fix_new_exp (frag_now, p - frag_now->fr_literal,
   1578  1.1  skrll 			   nbytes, &exp, reloc_howto->pc_relative, reloc);
   1579  1.1  skrll 	    }
   1580  1.1  skrll 	}
   1581  1.1  skrll       else
   1582  1.1  skrll 	{
   1583  1.1  skrll 	  xtensa_set_frag_assembly_state (frag_now);
   1584  1.1  skrll 	  emit_expr (&exp, (unsigned int) nbytes);
   1585  1.1  skrll 	}
   1586  1.1  skrll     }
   1587  1.1  skrll   while (*input_line_pointer++ == ',');
   1588  1.1  skrll 
   1589  1.1  skrll   input_line_pointer--;		/* Put terminator back into stream.  */
   1590  1.1  skrll   demand_empty_rest_of_line ();
   1591  1.1  skrll }
   1592  1.1  skrll 
   1593  1.1  skrll static bfd_boolean is_leb128_expr;
   1594  1.1  skrll 
   1595  1.1  skrll static void
   1596  1.1  skrll xtensa_leb128 (int sign)
   1597  1.1  skrll {
   1598  1.1  skrll   is_leb128_expr = TRUE;
   1599  1.1  skrll   s_leb128 (sign);
   1600  1.1  skrll   is_leb128_expr = FALSE;
   1601  1.1  skrll }
   1602  1.1  skrll 
   1603  1.1  skrll 
   1604  1.1  skrll /* Parsing and Idiom Translation.  */
   1606  1.1  skrll 
   1607  1.1  skrll /* Parse @plt, etc. and return the desired relocation.  */
   1608  1.1  skrll static bfd_reloc_code_real_type
   1609  1.1  skrll xtensa_elf_suffix (char **str_p, expressionS *exp_p)
   1610  1.1  skrll {
   1611  1.1  skrll   char ident[20];
   1612  1.1  skrll   char *str = *str_p;
   1613  1.1  skrll   char *str2;
   1614  1.1  skrll   int ch;
   1615  1.1  skrll   int len;
   1616  1.1  skrll   struct suffix_reloc_map *ptr;
   1617  1.1  skrll 
   1618  1.1  skrll   if (*str++ != '@')
   1619  1.1  skrll     return BFD_RELOC_NONE;
   1620  1.1  skrll 
   1621  1.1  skrll   for (ch = *str, str2 = ident;
   1622  1.1  skrll        (str2 < ident + sizeof (ident) - 1
   1623  1.1  skrll 	&& (ISALNUM (ch) || ch == '@'));
   1624  1.1  skrll        ch = *++str)
   1625  1.1  skrll     {
   1626  1.1  skrll       *str2++ = (ISLOWER (ch)) ? ch : TOLOWER (ch);
   1627  1.1  skrll     }
   1628  1.1  skrll 
   1629  1.1  skrll   *str2 = '\0';
   1630  1.1  skrll   len = str2 - ident;
   1631  1.1  skrll 
   1632  1.1  skrll   ch = ident[0];
   1633  1.1  skrll   for (ptr = &suffix_relocs[0]; ptr->length > 0; ptr++)
   1634  1.1  skrll     if (ch == ptr->suffix[0]
   1635  1.1  skrll 	&& len == ptr->length
   1636  1.1  skrll 	&& memcmp (ident, ptr->suffix, ptr->length) == 0)
   1637  1.1  skrll       {
   1638  1.1  skrll 	/* Now check for "identifier@suffix+constant".  */
   1639  1.1  skrll 	if (*str == '-' || *str == '+')
   1640  1.1  skrll 	  {
   1641  1.1  skrll 	    char *orig_line = input_line_pointer;
   1642  1.1  skrll 	    expressionS new_exp;
   1643  1.1  skrll 
   1644  1.1  skrll 	    input_line_pointer = str;
   1645  1.1  skrll 	    expression (&new_exp);
   1646  1.1  skrll 	    if (new_exp.X_op == O_constant)
   1647  1.1  skrll 	      {
   1648  1.1  skrll 		exp_p->X_add_number += new_exp.X_add_number;
   1649  1.1  skrll 		str = input_line_pointer;
   1650  1.1  skrll 	      }
   1651  1.1  skrll 
   1652  1.1  skrll 	    if (&input_line_pointer != str_p)
   1653  1.1  skrll 	      input_line_pointer = orig_line;
   1654  1.1  skrll 	  }
   1655  1.1  skrll 
   1656  1.1  skrll 	*str_p = str;
   1657  1.1  skrll 	return ptr->reloc;
   1658  1.1  skrll       }
   1659  1.1  skrll 
   1660  1.1  skrll   return BFD_RELOC_UNUSED;
   1661  1.1  skrll }
   1662  1.1  skrll 
   1663  1.1  skrll 
   1664  1.1  skrll /* Find the matching operator type.  */
   1665  1.1  skrll static unsigned char
   1666  1.1  skrll map_suffix_reloc_to_operator (bfd_reloc_code_real_type reloc)
   1667  1.1  skrll {
   1668  1.1  skrll   struct suffix_reloc_map *sfx;
   1669  1.1  skrll   unsigned char operator = (unsigned char) -1;
   1670  1.1  skrll 
   1671  1.1  skrll   for (sfx = &suffix_relocs[0]; sfx->suffix; sfx++)
   1672  1.1  skrll     {
   1673  1.1  skrll       if (sfx->reloc == reloc)
   1674  1.1  skrll 	{
   1675  1.1  skrll 	  operator = sfx->operator;
   1676  1.1  skrll 	  break;
   1677  1.1  skrll 	}
   1678  1.1  skrll     }
   1679  1.1  skrll   assert (operator != (unsigned char) -1);
   1680  1.1  skrll   return operator;
   1681  1.1  skrll }
   1682  1.1  skrll 
   1683  1.1  skrll 
   1684  1.1  skrll /* Find the matching reloc type.  */
   1685  1.1  skrll static bfd_reloc_code_real_type
   1686  1.1  skrll map_operator_to_reloc (unsigned char operator, bfd_boolean is_literal)
   1687  1.1  skrll {
   1688  1.1  skrll   struct suffix_reloc_map *sfx;
   1689  1.1  skrll   bfd_reloc_code_real_type reloc = BFD_RELOC_UNUSED;
   1690  1.1  skrll 
   1691  1.1  skrll   for (sfx = &suffix_relocs[0]; sfx->suffix; sfx++)
   1692  1.1  skrll     {
   1693  1.1  skrll       if (sfx->operator == operator)
   1694  1.1  skrll 	{
   1695  1.1  skrll 	  reloc = sfx->reloc;
   1696  1.1  skrll 	  break;
   1697  1.1  skrll 	}
   1698  1.1  skrll     }
   1699  1.1  skrll 
   1700  1.1  skrll   if (is_literal)
   1701  1.1  skrll     {
   1702  1.1  skrll       if (reloc == BFD_RELOC_XTENSA_TLS_FUNC)
   1703  1.1  skrll 	return BFD_RELOC_XTENSA_TLSDESC_FN;
   1704  1.1  skrll       else if (reloc == BFD_RELOC_XTENSA_TLS_ARG)
   1705  1.1  skrll 	return BFD_RELOC_XTENSA_TLSDESC_ARG;
   1706  1.1  skrll     }
   1707  1.1  skrll 
   1708  1.1  skrll   if (reloc == BFD_RELOC_UNUSED)
   1709  1.1  skrll     return BFD_RELOC_32;
   1710  1.1  skrll 
   1711  1.1  skrll   return reloc;
   1712  1.1  skrll }
   1713  1.1  skrll 
   1714  1.1  skrll 
   1715  1.1  skrll static const char *
   1716  1.1  skrll expression_end (const char *name)
   1717  1.1  skrll {
   1718  1.1  skrll   while (1)
   1719  1.1  skrll     {
   1720  1.1  skrll       switch (*name)
   1721  1.1  skrll 	{
   1722  1.1  skrll 	case '}':
   1723  1.1  skrll 	case ';':
   1724  1.1  skrll 	case '\0':
   1725  1.1  skrll 	case ',':
   1726  1.1  skrll 	case ':':
   1727  1.1  skrll 	  return name;
   1728  1.1  skrll 	case ' ':
   1729  1.1  skrll 	case '\t':
   1730  1.1  skrll 	  ++name;
   1731  1.1  skrll 	  continue;
   1732  1.1  skrll 	default:
   1733  1.1  skrll 	  return 0;
   1734  1.1  skrll 	}
   1735  1.1  skrll     }
   1736  1.1  skrll }
   1737  1.1  skrll 
   1738  1.1  skrll 
   1739  1.1  skrll #define ERROR_REG_NUM ((unsigned) -1)
   1740  1.1  skrll 
   1741  1.1  skrll static unsigned
   1742  1.1  skrll tc_get_register (const char *prefix)
   1743  1.1  skrll {
   1744  1.1  skrll   unsigned reg;
   1745  1.1  skrll   const char *next_expr;
   1746  1.1  skrll   const char *old_line_pointer;
   1747  1.1  skrll 
   1748  1.1  skrll   SKIP_WHITESPACE ();
   1749  1.1  skrll   old_line_pointer = input_line_pointer;
   1750  1.1  skrll 
   1751  1.1  skrll   if (*input_line_pointer == '$')
   1752  1.1  skrll     ++input_line_pointer;
   1753  1.1  skrll 
   1754  1.1  skrll   /* Accept "sp" as a synonym for "a1".  */
   1755  1.1  skrll   if (input_line_pointer[0] == 's' && input_line_pointer[1] == 'p'
   1756  1.1  skrll       && expression_end (input_line_pointer + 2))
   1757  1.1  skrll     {
   1758  1.1  skrll       input_line_pointer += 2;
   1759  1.1  skrll       return 1;  /* AR[1] */
   1760  1.1  skrll     }
   1761  1.1  skrll 
   1762  1.1  skrll   while (*input_line_pointer++ == *prefix++)
   1763  1.1  skrll     ;
   1764  1.1  skrll   --input_line_pointer;
   1765  1.1  skrll   --prefix;
   1766  1.1  skrll 
   1767  1.1  skrll   if (*prefix)
   1768  1.1  skrll     {
   1769  1.1  skrll       as_bad (_("bad register name: %s"), old_line_pointer);
   1770  1.1  skrll       return ERROR_REG_NUM;
   1771  1.1  skrll     }
   1772  1.1  skrll 
   1773  1.1  skrll   if (!ISDIGIT ((unsigned char) *input_line_pointer))
   1774  1.1  skrll     {
   1775  1.1  skrll       as_bad (_("bad register number: %s"), input_line_pointer);
   1776  1.1  skrll       return ERROR_REG_NUM;
   1777  1.1  skrll     }
   1778  1.1  skrll 
   1779  1.1  skrll   reg = 0;
   1780  1.1  skrll 
   1781  1.1  skrll   while (ISDIGIT ((int) *input_line_pointer))
   1782  1.1  skrll     reg = reg * 10 + *input_line_pointer++ - '0';
   1783  1.1  skrll 
   1784  1.1  skrll   if (!(next_expr = expression_end (input_line_pointer)))
   1785  1.1  skrll     {
   1786  1.1  skrll       as_bad (_("bad register name: %s"), old_line_pointer);
   1787  1.1  skrll       return ERROR_REG_NUM;
   1788  1.1  skrll     }
   1789  1.1  skrll 
   1790  1.1  skrll   input_line_pointer = (char *) next_expr;
   1791  1.1  skrll 
   1792  1.1  skrll   return reg;
   1793  1.1  skrll }
   1794  1.1  skrll 
   1795  1.1  skrll 
   1796  1.1  skrll static void
   1797  1.1  skrll expression_maybe_register (xtensa_opcode opc, int opnd, expressionS *tok)
   1798  1.1  skrll {
   1799  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   1800  1.1  skrll 
   1801  1.1  skrll   /* Check if this is an immediate operand.  */
   1802  1.1  skrll   if (xtensa_operand_is_register (isa, opc, opnd) == 0)
   1803  1.1  skrll     {
   1804  1.1  skrll       bfd_reloc_code_real_type reloc;
   1805  1.1  skrll       segT t = expression (tok);
   1806  1.1  skrll       if (t == absolute_section
   1807  1.1  skrll 	  && xtensa_operand_is_PCrelative (isa, opc, opnd) == 1)
   1808  1.1  skrll 	{
   1809  1.1  skrll 	  assert (tok->X_op == O_constant);
   1810  1.1  skrll 	  tok->X_op = O_symbol;
   1811  1.1  skrll 	  tok->X_add_symbol = &abs_symbol;
   1812  1.1  skrll 	}
   1813  1.1  skrll 
   1814  1.1  skrll       if ((tok->X_op == O_constant || tok->X_op == O_symbol)
   1815  1.1  skrll 	  && ((reloc = xtensa_elf_suffix (&input_line_pointer, tok))
   1816  1.1  skrll 	      != BFD_RELOC_NONE))
   1817  1.1  skrll 	{
   1818  1.1  skrll 	  switch (reloc)
   1819  1.1  skrll 	    {
   1820  1.1  skrll 	    case BFD_RELOC_LO16:
   1821  1.1  skrll 	      if (tok->X_op == O_constant)
   1822  1.1  skrll 		{
   1823  1.1  skrll 		  tok->X_add_number &= 0xffff;
   1824  1.1  skrll 		  return;
   1825  1.1  skrll 		}
   1826  1.1  skrll 	      break;
   1827  1.1  skrll 	    case BFD_RELOC_HI16:
   1828  1.1  skrll 	      if (tok->X_op == O_constant)
   1829  1.1  skrll 		{
   1830  1.1  skrll 		  tok->X_add_number = ((unsigned) tok->X_add_number) >> 16;
   1831  1.1  skrll 		  return;
   1832  1.1  skrll 		}
   1833  1.1  skrll 	      break;
   1834  1.1  skrll 	    case BFD_RELOC_UNUSED:
   1835  1.1  skrll 	      as_bad (_("unsupported relocation"));
   1836  1.1  skrll 	      return;
   1837  1.1  skrll 	    case BFD_RELOC_32_PCREL:
   1838  1.1  skrll 	      as_bad (_("pcrel relocation not allowed in an instruction"));
   1839  1.1  skrll 	      return;
   1840  1.1  skrll 	    default:
   1841  1.1  skrll 	      break;
   1842  1.1  skrll 	    }
   1843  1.1  skrll 	  tok->X_op = map_suffix_reloc_to_operator (reloc);
   1844  1.1  skrll 	}
   1845  1.1  skrll     }
   1846  1.1  skrll   else
   1847  1.1  skrll     {
   1848  1.1  skrll       xtensa_regfile opnd_rf = xtensa_operand_regfile (isa, opc, opnd);
   1849  1.1  skrll       unsigned reg = tc_get_register (xtensa_regfile_shortname (isa, opnd_rf));
   1850  1.1  skrll 
   1851  1.1  skrll       if (reg != ERROR_REG_NUM)	/* Already errored */
   1852  1.1  skrll 	{
   1853  1.1  skrll 	  uint32 buf = reg;
   1854  1.1  skrll 	  if (xtensa_operand_encode (isa, opc, opnd, &buf))
   1855  1.1  skrll 	    as_bad (_("register number out of range"));
   1856  1.1  skrll 	}
   1857  1.1  skrll 
   1858  1.1  skrll       tok->X_op = O_register;
   1859  1.1  skrll       tok->X_add_symbol = 0;
   1860  1.1  skrll       tok->X_add_number = reg;
   1861  1.1  skrll     }
   1862  1.1  skrll }
   1863  1.1  skrll 
   1864  1.1  skrll 
   1865  1.1  skrll /* Split up the arguments for an opcode or pseudo-op.  */
   1866  1.1  skrll 
   1867  1.1  skrll static int
   1868  1.1  skrll tokenize_arguments (char **args, char *str)
   1869  1.1  skrll {
   1870  1.1  skrll   char *old_input_line_pointer;
   1871  1.1  skrll   bfd_boolean saw_comma = FALSE;
   1872  1.1  skrll   bfd_boolean saw_arg = FALSE;
   1873  1.1  skrll   bfd_boolean saw_colon = FALSE;
   1874  1.1  skrll   int num_args = 0;
   1875  1.1  skrll   char *arg_end, *arg;
   1876  1.1  skrll   int arg_len;
   1877  1.1  skrll 
   1878  1.1  skrll   /* Save and restore input_line_pointer around this function.  */
   1879  1.1  skrll   old_input_line_pointer = input_line_pointer;
   1880  1.1  skrll   input_line_pointer = str;
   1881  1.1  skrll 
   1882  1.1  skrll   while (*input_line_pointer)
   1883  1.1  skrll     {
   1884  1.1  skrll       SKIP_WHITESPACE ();
   1885  1.1  skrll       switch (*input_line_pointer)
   1886  1.1  skrll 	{
   1887  1.1  skrll 	case '\0':
   1888  1.1  skrll 	case '}':
   1889  1.1  skrll 	  goto fini;
   1890  1.1  skrll 
   1891  1.1  skrll 	case ':':
   1892  1.1  skrll 	  input_line_pointer++;
   1893  1.1  skrll 	  if (saw_comma || saw_colon || !saw_arg)
   1894  1.1  skrll 	    goto err;
   1895  1.1  skrll 	  saw_colon = TRUE;
   1896  1.1  skrll 	  break;
   1897  1.1  skrll 
   1898  1.1  skrll 	case ',':
   1899  1.1  skrll 	  input_line_pointer++;
   1900  1.1  skrll 	  if (saw_comma || saw_colon || !saw_arg)
   1901  1.1  skrll 	    goto err;
   1902  1.1  skrll 	  saw_comma = TRUE;
   1903  1.1  skrll 	  break;
   1904  1.1  skrll 
   1905  1.1  skrll 	default:
   1906  1.1  skrll 	  if (!saw_comma && !saw_colon && saw_arg)
   1907  1.1  skrll 	    goto err;
   1908  1.1  skrll 
   1909  1.1  skrll 	  arg_end = input_line_pointer + 1;
   1910  1.1  skrll 	  while (!expression_end (arg_end))
   1911  1.1  skrll 	    arg_end += 1;
   1912  1.1  skrll 
   1913  1.1  skrll 	  arg_len = arg_end - input_line_pointer;
   1914  1.1  skrll 	  arg = (char *) xmalloc ((saw_colon ? 1 : 0) + arg_len + 1);
   1915  1.1  skrll 	  args[num_args] = arg;
   1916  1.1  skrll 
   1917  1.1  skrll 	  if (saw_colon)
   1918  1.1  skrll 	    *arg++ = ':';
   1919  1.1  skrll 	  strncpy (arg, input_line_pointer, arg_len);
   1920  1.1  skrll 	  arg[arg_len] = '\0';
   1921  1.1  skrll 
   1922  1.1  skrll 	  input_line_pointer = arg_end;
   1923  1.1  skrll 	  num_args += 1;
   1924  1.1  skrll 	  saw_comma = FALSE;
   1925  1.1  skrll 	  saw_colon = FALSE;
   1926  1.1  skrll 	  saw_arg = TRUE;
   1927  1.1  skrll 	  break;
   1928  1.1  skrll 	}
   1929  1.1  skrll     }
   1930  1.1  skrll 
   1931  1.1  skrll fini:
   1932  1.1  skrll   if (saw_comma || saw_colon)
   1933  1.1  skrll     goto err;
   1934  1.1  skrll   input_line_pointer = old_input_line_pointer;
   1935  1.1  skrll   return num_args;
   1936  1.1  skrll 
   1937  1.1  skrll err:
   1938  1.1  skrll   if (saw_comma)
   1939  1.1  skrll     as_bad (_("extra comma"));
   1940  1.1  skrll   else if (saw_colon)
   1941  1.1  skrll     as_bad (_("extra colon"));
   1942  1.1  skrll   else if (!saw_arg)
   1943  1.1  skrll     as_bad (_("missing argument"));
   1944  1.1  skrll   else
   1945  1.1  skrll     as_bad (_("missing comma or colon"));
   1946  1.1  skrll   input_line_pointer = old_input_line_pointer;
   1947  1.1  skrll   return -1;
   1948  1.1  skrll }
   1949  1.1  skrll 
   1950  1.1  skrll 
   1951  1.1  skrll /* Parse the arguments to an opcode.  Return TRUE on error.  */
   1952  1.1  skrll 
   1953  1.1  skrll static bfd_boolean
   1954  1.1  skrll parse_arguments (TInsn *insn, int num_args, char **arg_strings)
   1955  1.1  skrll {
   1956  1.1  skrll   expressionS *tok, *last_tok;
   1957  1.1  skrll   xtensa_opcode opcode = insn->opcode;
   1958  1.1  skrll   bfd_boolean had_error = TRUE;
   1959  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   1960  1.1  skrll   int n, num_regs = 0;
   1961  1.1  skrll   int opcode_operand_count;
   1962  1.1  skrll   int opnd_cnt, last_opnd_cnt;
   1963  1.1  skrll   unsigned int next_reg = 0;
   1964  1.1  skrll   char *old_input_line_pointer;
   1965  1.1  skrll 
   1966  1.1  skrll   if (insn->insn_type == ITYPE_LITERAL)
   1967  1.1  skrll     opcode_operand_count = 1;
   1968  1.1  skrll   else
   1969  1.1  skrll     opcode_operand_count = xtensa_opcode_num_operands (isa, opcode);
   1970  1.1  skrll 
   1971  1.1  skrll   tok = insn->tok;
   1972  1.1  skrll   memset (tok, 0, sizeof (*tok) * MAX_INSN_ARGS);
   1973  1.1  skrll 
   1974  1.1  skrll   /* Save and restore input_line_pointer around this function.  */
   1975  1.1  skrll   old_input_line_pointer = input_line_pointer;
   1976  1.1  skrll 
   1977  1.1  skrll   last_tok = 0;
   1978  1.1  skrll   last_opnd_cnt = -1;
   1979  1.1  skrll   opnd_cnt = 0;
   1980  1.1  skrll 
   1981  1.1  skrll   /* Skip invisible operands.  */
   1982  1.1  skrll   while (xtensa_operand_is_visible (isa, opcode, opnd_cnt) == 0)
   1983  1.1  skrll     {
   1984  1.1  skrll       opnd_cnt += 1;
   1985  1.1  skrll       tok++;
   1986  1.1  skrll     }
   1987  1.1  skrll 
   1988  1.1  skrll   for (n = 0; n < num_args; n++)
   1989  1.1  skrll     {
   1990  1.1  skrll       input_line_pointer = arg_strings[n];
   1991  1.1  skrll       if (*input_line_pointer == ':')
   1992  1.1  skrll 	{
   1993  1.1  skrll 	  xtensa_regfile opnd_rf;
   1994  1.1  skrll 	  input_line_pointer++;
   1995  1.1  skrll 	  if (num_regs == 0)
   1996  1.1  skrll 	    goto err;
   1997  1.1  skrll 	  assert (opnd_cnt > 0);
   1998  1.1  skrll 	  num_regs--;
   1999  1.1  skrll 	  opnd_rf = xtensa_operand_regfile (isa, opcode, last_opnd_cnt);
   2000  1.1  skrll 	  if (next_reg
   2001  1.1  skrll 	      != tc_get_register (xtensa_regfile_shortname (isa, opnd_rf)))
   2002  1.1  skrll 	    as_warn (_("incorrect register number, ignoring"));
   2003  1.1  skrll 	  next_reg++;
   2004  1.1  skrll 	}
   2005  1.1  skrll       else
   2006  1.1  skrll 	{
   2007  1.1  skrll 	  if (opnd_cnt >= opcode_operand_count)
   2008  1.1  skrll 	    {
   2009  1.1  skrll 	      as_warn (_("too many arguments"));
   2010  1.1  skrll 	      goto err;
   2011  1.1  skrll 	    }
   2012  1.1  skrll 	  assert (opnd_cnt < MAX_INSN_ARGS);
   2013  1.1  skrll 
   2014  1.1  skrll 	  expression_maybe_register (opcode, opnd_cnt, tok);
   2015  1.1  skrll 	  next_reg = tok->X_add_number + 1;
   2016  1.1  skrll 
   2017  1.1  skrll 	  if (tok->X_op == O_illegal || tok->X_op == O_absent)
   2018  1.1  skrll 	    goto err;
   2019  1.1  skrll 	  if (xtensa_operand_is_register (isa, opcode, opnd_cnt) == 1)
   2020  1.1  skrll 	    {
   2021  1.1  skrll 	      num_regs = xtensa_operand_num_regs (isa, opcode, opnd_cnt) - 1;
   2022  1.1  skrll 	      /* minus 1 because we are seeing one right now */
   2023  1.1  skrll 	    }
   2024  1.1  skrll 	  else
   2025  1.1  skrll 	    num_regs = 0;
   2026  1.1  skrll 
   2027  1.1  skrll 	  last_tok = tok;
   2028  1.1  skrll 	  last_opnd_cnt = opnd_cnt;
   2029  1.1  skrll 
   2030  1.1  skrll 	  do
   2031  1.1  skrll 	    {
   2032  1.1  skrll 	      opnd_cnt += 1;
   2033  1.1  skrll 	      tok++;
   2034  1.1  skrll 	    }
   2035  1.1  skrll 	  while (xtensa_operand_is_visible (isa, opcode, opnd_cnt) == 0);
   2036  1.1  skrll 	}
   2037  1.1  skrll     }
   2038  1.1  skrll 
   2039  1.1  skrll   if (num_regs > 0 && ((int) next_reg != last_tok->X_add_number + 1))
   2040  1.1  skrll     goto err;
   2041  1.1  skrll 
   2042  1.1  skrll   insn->ntok = tok - insn->tok;
   2043  1.1  skrll   had_error = FALSE;
   2044  1.1  skrll 
   2045  1.1  skrll  err:
   2046  1.1  skrll   input_line_pointer = old_input_line_pointer;
   2047  1.1  skrll   return had_error;
   2048  1.1  skrll }
   2049  1.1  skrll 
   2050  1.1  skrll 
   2051  1.1  skrll static int
   2052  1.1  skrll get_invisible_operands (TInsn *insn)
   2053  1.1  skrll {
   2054  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   2055  1.1  skrll   static xtensa_insnbuf slotbuf = NULL;
   2056  1.1  skrll   xtensa_format fmt;
   2057  1.1  skrll   xtensa_opcode opc = insn->opcode;
   2058  1.1  skrll   int slot, opnd, fmt_found;
   2059  1.1  skrll   unsigned val;
   2060  1.1  skrll 
   2061  1.1  skrll   if (!slotbuf)
   2062  1.1  skrll     slotbuf = xtensa_insnbuf_alloc (isa);
   2063  1.1  skrll 
   2064  1.1  skrll   /* Find format/slot where this can be encoded.  */
   2065  1.1  skrll   fmt_found = 0;
   2066  1.1  skrll   slot = 0;
   2067  1.1  skrll   for (fmt = 0; fmt < xtensa_isa_num_formats (isa); fmt++)
   2068  1.1  skrll     {
   2069  1.1  skrll       for (slot = 0; slot < xtensa_format_num_slots (isa, fmt); slot++)
   2070  1.1  skrll 	{
   2071  1.1  skrll 	  if (xtensa_opcode_encode (isa, fmt, slot, slotbuf, opc) == 0)
   2072  1.1  skrll 	    {
   2073  1.1  skrll 	      fmt_found = 1;
   2074  1.1  skrll 	      break;
   2075  1.1  skrll 	    }
   2076  1.1  skrll 	}
   2077  1.1  skrll       if (fmt_found) break;
   2078  1.1  skrll     }
   2079  1.1  skrll 
   2080  1.1  skrll   if (!fmt_found)
   2081  1.1  skrll     {
   2082  1.1  skrll       as_bad (_("cannot encode opcode \"%s\""), xtensa_opcode_name (isa, opc));
   2083  1.1  skrll       return -1;
   2084  1.1  skrll     }
   2085  1.1  skrll 
   2086  1.1  skrll   /* First encode all the visible operands
   2087  1.1  skrll      (to deal with shared field operands).  */
   2088  1.1  skrll   for (opnd = 0; opnd < insn->ntok; opnd++)
   2089  1.1  skrll     {
   2090  1.1  skrll       if (xtensa_operand_is_visible (isa, opc, opnd) == 1
   2091  1.1  skrll 	  && (insn->tok[opnd].X_op == O_register
   2092  1.1  skrll 	      || insn->tok[opnd].X_op == O_constant))
   2093  1.1  skrll 	{
   2094  1.1  skrll 	  val = insn->tok[opnd].X_add_number;
   2095  1.1  skrll 	  xtensa_operand_encode (isa, opc, opnd, &val);
   2096  1.1  skrll 	  xtensa_operand_set_field (isa, opc, opnd, fmt, slot, slotbuf, val);
   2097  1.1  skrll 	}
   2098  1.1  skrll     }
   2099  1.1  skrll 
   2100  1.1  skrll   /* Then pull out the values for the invisible ones.  */
   2101  1.1  skrll   for (opnd = 0; opnd < insn->ntok; opnd++)
   2102  1.1  skrll     {
   2103  1.1  skrll       if (xtensa_operand_is_visible (isa, opc, opnd) == 0)
   2104  1.1  skrll 	{
   2105  1.1  skrll 	  xtensa_operand_get_field (isa, opc, opnd, fmt, slot, slotbuf, &val);
   2106  1.1  skrll 	  xtensa_operand_decode (isa, opc, opnd, &val);
   2107  1.1  skrll 	  insn->tok[opnd].X_add_number = val;
   2108  1.1  skrll 	  if (xtensa_operand_is_register (isa, opc, opnd) == 1)
   2109  1.1  skrll 	    insn->tok[opnd].X_op = O_register;
   2110  1.1  skrll 	  else
   2111  1.1  skrll 	    insn->tok[opnd].X_op = O_constant;
   2112  1.1  skrll 	}
   2113  1.1  skrll     }
   2114  1.1  skrll 
   2115  1.1  skrll   return 0;
   2116  1.1  skrll }
   2117  1.1  skrll 
   2118  1.1  skrll 
   2119  1.1  skrll static void
   2120  1.1  skrll xg_reverse_shift_count (char **cnt_argp)
   2121  1.1  skrll {
   2122  1.1  skrll   char *cnt_arg, *new_arg;
   2123  1.1  skrll   cnt_arg = *cnt_argp;
   2124  1.1  skrll 
   2125  1.1  skrll   /* replace the argument with "31-(argument)" */
   2126  1.1  skrll   new_arg = (char *) xmalloc (strlen (cnt_arg) + 6);
   2127  1.1  skrll   sprintf (new_arg, "31-(%s)", cnt_arg);
   2128  1.1  skrll 
   2129  1.1  skrll   free (cnt_arg);
   2130  1.1  skrll   *cnt_argp = new_arg;
   2131  1.1  skrll }
   2132  1.1  skrll 
   2133  1.1  skrll 
   2134  1.1  skrll /* If "arg" is a constant expression, return non-zero with the value
   2135  1.1  skrll    in *valp.  */
   2136  1.1  skrll 
   2137  1.1  skrll static int
   2138  1.1  skrll xg_arg_is_constant (char *arg, offsetT *valp)
   2139  1.1  skrll {
   2140  1.1  skrll   expressionS exp;
   2141  1.1  skrll   char *save_ptr = input_line_pointer;
   2142  1.1  skrll 
   2143  1.1  skrll   input_line_pointer = arg;
   2144  1.1  skrll   expression (&exp);
   2145  1.1  skrll   input_line_pointer = save_ptr;
   2146  1.1  skrll 
   2147  1.1  skrll   if (exp.X_op == O_constant)
   2148  1.1  skrll     {
   2149  1.1  skrll       *valp = exp.X_add_number;
   2150  1.1  skrll       return 1;
   2151  1.1  skrll     }
   2152  1.1  skrll 
   2153  1.1  skrll   return 0;
   2154  1.1  skrll }
   2155  1.1  skrll 
   2156  1.1  skrll 
   2157  1.1  skrll static void
   2158  1.1  skrll xg_replace_opname (char **popname, char *newop)
   2159  1.1  skrll {
   2160  1.1  skrll   free (*popname);
   2161  1.1  skrll   *popname = (char *) xmalloc (strlen (newop) + 1);
   2162  1.1  skrll   strcpy (*popname, newop);
   2163  1.1  skrll }
   2164  1.1  skrll 
   2165  1.1  skrll 
   2166  1.1  skrll static int
   2167  1.1  skrll xg_check_num_args (int *pnum_args,
   2168  1.1  skrll 		   int expected_num,
   2169  1.1  skrll 		   char *opname,
   2170  1.1  skrll 		   char **arg_strings)
   2171  1.1  skrll {
   2172  1.1  skrll   int num_args = *pnum_args;
   2173  1.1  skrll 
   2174  1.1  skrll   if (num_args < expected_num)
   2175  1.1  skrll     {
   2176  1.1  skrll       as_bad (_("not enough operands (%d) for '%s'; expected %d"),
   2177  1.1  skrll 	      num_args, opname, expected_num);
   2178  1.1  skrll       return -1;
   2179  1.1  skrll     }
   2180  1.1  skrll 
   2181  1.1  skrll   if (num_args > expected_num)
   2182  1.1  skrll     {
   2183  1.1  skrll       as_warn (_("too many operands (%d) for '%s'; expected %d"),
   2184  1.1  skrll 	       num_args, opname, expected_num);
   2185  1.1  skrll       while (num_args-- > expected_num)
   2186  1.1  skrll 	{
   2187  1.1  skrll 	  free (arg_strings[num_args]);
   2188  1.1  skrll 	  arg_strings[num_args] = 0;
   2189  1.1  skrll 	}
   2190  1.1  skrll       *pnum_args = expected_num;
   2191  1.1  skrll       return -1;
   2192  1.1  skrll     }
   2193  1.1  skrll 
   2194  1.1  skrll   return 0;
   2195  1.1  skrll }
   2196  1.1  skrll 
   2197  1.1  skrll 
   2198  1.1  skrll /* If the register is not specified as part of the opcode,
   2199  1.1  skrll    then get it from the operand and move it to the opcode.  */
   2200  1.1  skrll 
   2201  1.1  skrll static int
   2202  1.1  skrll xg_translate_sysreg_op (char **popname, int *pnum_args, char **arg_strings)
   2203  1.1  skrll {
   2204  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   2205  1.1  skrll   xtensa_sysreg sr;
   2206  1.1  skrll   char *opname, *new_opname;
   2207  1.1  skrll   const char *sr_name;
   2208  1.1  skrll   int is_user, is_write;
   2209  1.1  skrll 
   2210  1.1  skrll   opname = *popname;
   2211  1.1  skrll   if (*opname == '_')
   2212  1.1  skrll     opname += 1;
   2213  1.1  skrll   is_user = (opname[1] == 'u');
   2214  1.1  skrll   is_write = (opname[0] == 'w');
   2215  1.1  skrll 
   2216  1.1  skrll   /* Opname == [rw]ur or [rwx]sr... */
   2217  1.1  skrll 
   2218  1.1  skrll   if (xg_check_num_args (pnum_args, 2, opname, arg_strings))
   2219  1.1  skrll     return -1;
   2220  1.1  skrll 
   2221  1.1  skrll   /* Check if the argument is a symbolic register name.  */
   2222  1.1  skrll   sr = xtensa_sysreg_lookup_name (isa, arg_strings[1]);
   2223  1.1  skrll   /* Handle WSR to "INTSET" as a special case.  */
   2224  1.1  skrll   if (sr == XTENSA_UNDEFINED && is_write && !is_user
   2225  1.1  skrll       && !strcasecmp (arg_strings[1], "intset"))
   2226  1.1  skrll     sr = xtensa_sysreg_lookup_name (isa, "interrupt");
   2227  1.1  skrll   if (sr == XTENSA_UNDEFINED
   2228  1.1  skrll       || (xtensa_sysreg_is_user (isa, sr) == 1) != is_user)
   2229  1.1  skrll     {
   2230  1.1  skrll       /* Maybe it's a register number.... */
   2231  1.1  skrll       offsetT val;
   2232  1.1  skrll       if (!xg_arg_is_constant (arg_strings[1], &val))
   2233  1.1  skrll 	{
   2234  1.1  skrll 	  as_bad (_("invalid register '%s' for '%s' instruction"),
   2235  1.1  skrll 		  arg_strings[1], opname);
   2236  1.1  skrll 	  return -1;
   2237  1.1  skrll 	}
   2238  1.1  skrll       sr = xtensa_sysreg_lookup (isa, val, is_user);
   2239  1.1  skrll       if (sr == XTENSA_UNDEFINED)
   2240  1.1  skrll 	{
   2241  1.1  skrll 	  as_bad (_("invalid register number (%ld) for '%s' instruction"),
   2242  1.1  skrll 		  (long) val, opname);
   2243  1.1  skrll 	  return -1;
   2244  1.1  skrll 	}
   2245  1.1  skrll     }
   2246  1.1  skrll 
   2247  1.1  skrll   /* Remove the last argument, which is now part of the opcode.  */
   2248  1.1  skrll   free (arg_strings[1]);
   2249  1.1  skrll   arg_strings[1] = 0;
   2250  1.1  skrll   *pnum_args = 1;
   2251  1.1  skrll 
   2252  1.1  skrll   /* Translate the opcode.  */
   2253  1.1  skrll   sr_name = xtensa_sysreg_name (isa, sr);
   2254  1.1  skrll   /* Another special case for "WSR.INTSET"....  */
   2255  1.1  skrll   if (is_write && !is_user && !strcasecmp ("interrupt", sr_name))
   2256  1.1  skrll     sr_name = "intset";
   2257  1.1  skrll   new_opname = (char *) xmalloc (strlen (sr_name) + 6);
   2258  1.1  skrll   sprintf (new_opname, "%s.%s", *popname, sr_name);
   2259  1.1  skrll   free (*popname);
   2260  1.1  skrll   *popname = new_opname;
   2261  1.1  skrll 
   2262  1.1  skrll   return 0;
   2263  1.1  skrll }
   2264  1.1  skrll 
   2265  1.1  skrll 
   2266  1.1  skrll static int
   2267  1.1  skrll xtensa_translate_old_userreg_ops (char **popname)
   2268  1.1  skrll {
   2269  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   2270  1.1  skrll   xtensa_sysreg sr;
   2271  1.1  skrll   char *opname, *new_opname;
   2272  1.1  skrll   const char *sr_name;
   2273  1.1  skrll   bfd_boolean has_underbar = FALSE;
   2274  1.1  skrll 
   2275  1.1  skrll   opname = *popname;
   2276  1.1  skrll   if (opname[0] == '_')
   2277  1.1  skrll     {
   2278  1.1  skrll       has_underbar = TRUE;
   2279  1.1  skrll       opname += 1;
   2280  1.1  skrll     }
   2281  1.1  skrll 
   2282  1.1  skrll   sr = xtensa_sysreg_lookup_name (isa, opname + 1);
   2283  1.1  skrll   if (sr != XTENSA_UNDEFINED)
   2284  1.1  skrll     {
   2285  1.1  skrll       /* The new default name ("nnn") is different from the old default
   2286  1.1  skrll 	 name ("URnnn").  The old default is handled below, and we don't
   2287  1.1  skrll 	 want to recognize [RW]nnn, so do nothing if the name is the (new)
   2288  1.1  skrll 	 default.  */
   2289  1.1  skrll       static char namebuf[10];
   2290  1.1  skrll       sprintf (namebuf, "%d", xtensa_sysreg_number (isa, sr));
   2291  1.1  skrll       if (strcmp (namebuf, opname + 1) == 0)
   2292  1.1  skrll 	return 0;
   2293  1.1  skrll     }
   2294  1.1  skrll   else
   2295  1.1  skrll     {
   2296  1.1  skrll       offsetT val;
   2297  1.1  skrll       char *end;
   2298  1.1  skrll 
   2299  1.1  skrll       /* Only continue if the reg name is "URnnn".  */
   2300  1.1  skrll       if (opname[1] != 'u' || opname[2] != 'r')
   2301  1.1  skrll 	return 0;
   2302  1.1  skrll       val = strtoul (opname + 3, &end, 10);
   2303  1.1  skrll       if (*end != '\0')
   2304  1.1  skrll 	return 0;
   2305  1.1  skrll 
   2306  1.1  skrll       sr = xtensa_sysreg_lookup (isa, val, 1);
   2307  1.1  skrll       if (sr == XTENSA_UNDEFINED)
   2308  1.1  skrll 	{
   2309  1.1  skrll 	  as_bad (_("invalid register number (%ld) for '%s'"),
   2310  1.1  skrll 		  (long) val, opname);
   2311  1.1  skrll 	  return -1;
   2312  1.1  skrll 	}
   2313  1.1  skrll     }
   2314  1.1  skrll 
   2315  1.1  skrll   /* Translate the opcode.  */
   2316  1.1  skrll   sr_name = xtensa_sysreg_name (isa, sr);
   2317  1.1  skrll   new_opname = (char *) xmalloc (strlen (sr_name) + 6);
   2318  1.1  skrll   sprintf (new_opname, "%s%cur.%s", (has_underbar ? "_" : ""),
   2319  1.1  skrll 	   opname[0], sr_name);
   2320  1.1  skrll   free (*popname);
   2321  1.1  skrll   *popname = new_opname;
   2322  1.1  skrll 
   2323  1.1  skrll   return 0;
   2324  1.1  skrll }
   2325  1.1  skrll 
   2326  1.1  skrll 
   2327  1.1  skrll static int
   2328  1.1  skrll xtensa_translate_zero_immed (char *old_op,
   2329  1.1  skrll 			     char *new_op,
   2330  1.1  skrll 			     char **popname,
   2331  1.1  skrll 			     int *pnum_args,
   2332  1.1  skrll 			     char **arg_strings)
   2333  1.1  skrll {
   2334  1.1  skrll   char *opname;
   2335  1.1  skrll   offsetT val;
   2336  1.1  skrll 
   2337  1.1  skrll   opname = *popname;
   2338  1.1  skrll   assert (opname[0] != '_');
   2339  1.1  skrll 
   2340  1.1  skrll   if (strcmp (opname, old_op) != 0)
   2341  1.1  skrll     return 0;
   2342  1.1  skrll 
   2343  1.1  skrll   if (xg_check_num_args (pnum_args, 3, opname, arg_strings))
   2344  1.1  skrll     return -1;
   2345  1.1  skrll   if (xg_arg_is_constant (arg_strings[1], &val) && val == 0)
   2346  1.1  skrll     {
   2347  1.1  skrll       xg_replace_opname (popname, new_op);
   2348  1.1  skrll       free (arg_strings[1]);
   2349  1.1  skrll       arg_strings[1] = arg_strings[2];
   2350  1.1  skrll       arg_strings[2] = 0;
   2351  1.1  skrll       *pnum_args = 2;
   2352  1.1  skrll     }
   2353  1.1  skrll 
   2354  1.1  skrll   return 0;
   2355  1.1  skrll }
   2356  1.1  skrll 
   2357  1.1  skrll 
   2358  1.1  skrll /* If the instruction is an idiom (i.e., a built-in macro), translate it.
   2359  1.1  skrll    Returns non-zero if an error was found.  */
   2360  1.1  skrll 
   2361  1.1  skrll static int
   2362  1.1  skrll xg_translate_idioms (char **popname, int *pnum_args, char **arg_strings)
   2363  1.1  skrll {
   2364  1.1  skrll   char *opname = *popname;
   2365  1.1  skrll   bfd_boolean has_underbar = FALSE;
   2366  1.1  skrll 
   2367  1.1  skrll   if (*opname == '_')
   2368  1.1  skrll     {
   2369  1.1  skrll       has_underbar = TRUE;
   2370  1.1  skrll       opname += 1;
   2371  1.1  skrll     }
   2372  1.1  skrll 
   2373  1.1  skrll   if (strcmp (opname, "mov") == 0)
   2374  1.1  skrll     {
   2375  1.1  skrll       if (use_transform () && !has_underbar && density_supported)
   2376  1.1  skrll 	xg_replace_opname (popname, "mov.n");
   2377  1.1  skrll       else
   2378  1.1  skrll 	{
   2379  1.1  skrll 	  if (xg_check_num_args (pnum_args, 2, opname, arg_strings))
   2380  1.1  skrll 	    return -1;
   2381  1.1  skrll 	  xg_replace_opname (popname, (has_underbar ? "_or" : "or"));
   2382  1.1  skrll 	  arg_strings[2] = (char *) xmalloc (strlen (arg_strings[1]) + 1);
   2383  1.1  skrll 	  strcpy (arg_strings[2], arg_strings[1]);
   2384  1.1  skrll 	  *pnum_args = 3;
   2385  1.1  skrll 	}
   2386  1.1  skrll       return 0;
   2387  1.1  skrll     }
   2388  1.1  skrll 
   2389  1.1  skrll   if (strcmp (opname, "bbsi.l") == 0)
   2390  1.1  skrll     {
   2391  1.1  skrll       if (xg_check_num_args (pnum_args, 3, opname, arg_strings))
   2392  1.1  skrll 	return -1;
   2393  1.1  skrll       xg_replace_opname (popname, (has_underbar ? "_bbsi" : "bbsi"));
   2394  1.1  skrll       if (target_big_endian)
   2395  1.1  skrll 	xg_reverse_shift_count (&arg_strings[1]);
   2396  1.1  skrll       return 0;
   2397  1.1  skrll     }
   2398  1.1  skrll 
   2399  1.1  skrll   if (strcmp (opname, "bbci.l") == 0)
   2400  1.1  skrll     {
   2401  1.1  skrll       if (xg_check_num_args (pnum_args, 3, opname, arg_strings))
   2402  1.1  skrll 	return -1;
   2403  1.1  skrll       xg_replace_opname (popname, (has_underbar ? "_bbci" : "bbci"));
   2404  1.1  skrll       if (target_big_endian)
   2405  1.1  skrll 	xg_reverse_shift_count (&arg_strings[1]);
   2406  1.1  skrll       return 0;
   2407  1.1  skrll     }
   2408  1.1  skrll 
   2409  1.1  skrll   /* Don't do anything special with NOPs inside FLIX instructions.  They
   2410  1.1  skrll      are handled elsewhere.  Real NOP instructions are always available
   2411  1.1  skrll      in configurations with FLIX, so this should never be an issue but
   2412  1.1  skrll      check for it anyway.  */
   2413  1.1  skrll   if (!cur_vinsn.inside_bundle && xtensa_nop_opcode == XTENSA_UNDEFINED
   2414  1.1  skrll       && strcmp (opname, "nop") == 0)
   2415  1.1  skrll     {
   2416  1.1  skrll       if (use_transform () && !has_underbar && density_supported)
   2417  1.1  skrll 	xg_replace_opname (popname, "nop.n");
   2418  1.1  skrll       else
   2419  1.1  skrll 	{
   2420  1.1  skrll 	  if (xg_check_num_args (pnum_args, 0, opname, arg_strings))
   2421  1.1  skrll 	    return -1;
   2422  1.1  skrll 	  xg_replace_opname (popname, (has_underbar ? "_or" : "or"));
   2423  1.1  skrll 	  arg_strings[0] = (char *) xmalloc (3);
   2424  1.1  skrll 	  arg_strings[1] = (char *) xmalloc (3);
   2425  1.1  skrll 	  arg_strings[2] = (char *) xmalloc (3);
   2426  1.1  skrll 	  strcpy (arg_strings[0], "a1");
   2427  1.1  skrll 	  strcpy (arg_strings[1], "a1");
   2428  1.1  skrll 	  strcpy (arg_strings[2], "a1");
   2429  1.1  skrll 	  *pnum_args = 3;
   2430  1.1  skrll 	}
   2431  1.1  skrll       return 0;
   2432  1.1  skrll     }
   2433  1.1  skrll 
   2434  1.1  skrll   /* Recognize [RW]UR and [RWX]SR.  */
   2435  1.1  skrll   if ((((opname[0] == 'r' || opname[0] == 'w')
   2436  1.1  skrll 	&& (opname[1] == 'u' || opname[1] == 's'))
   2437  1.1  skrll        || (opname[0] == 'x' && opname[1] == 's'))
   2438  1.1  skrll       && opname[2] == 'r'
   2439  1.1  skrll       && opname[3] == '\0')
   2440  1.1  skrll     return xg_translate_sysreg_op (popname, pnum_args, arg_strings);
   2441  1.1  skrll 
   2442  1.1  skrll   /* Backward compatibility for RUR and WUR: Recognize [RW]UR<nnn> and
   2443  1.1  skrll      [RW]<name> if <name> is the non-default name of a user register.  */
   2444  1.1  skrll   if ((opname[0] == 'r' || opname[0] == 'w')
   2445  1.1  skrll       && xtensa_opcode_lookup (xtensa_default_isa, opname) == XTENSA_UNDEFINED)
   2446  1.1  skrll     return xtensa_translate_old_userreg_ops (popname);
   2447  1.1  skrll 
   2448  1.1  skrll   /* Relax branches that don't allow comparisons against an immediate value
   2449  1.1  skrll      of zero to the corresponding branches with implicit zero immediates.  */
   2450  1.1  skrll   if (!has_underbar && use_transform ())
   2451  1.1  skrll     {
   2452  1.1  skrll       if (xtensa_translate_zero_immed ("bnei", "bnez", popname,
   2453  1.1  skrll 				       pnum_args, arg_strings))
   2454  1.1  skrll 	return -1;
   2455  1.1  skrll 
   2456  1.1  skrll       if (xtensa_translate_zero_immed ("beqi", "beqz", popname,
   2457  1.1  skrll 				       pnum_args, arg_strings))
   2458  1.1  skrll 	return -1;
   2459  1.1  skrll 
   2460  1.1  skrll       if (xtensa_translate_zero_immed ("bgei", "bgez", popname,
   2461  1.1  skrll 				       pnum_args, arg_strings))
   2462  1.1  skrll 	return -1;
   2463  1.1  skrll 
   2464  1.1  skrll       if (xtensa_translate_zero_immed ("blti", "bltz", popname,
   2465  1.1  skrll 				       pnum_args, arg_strings))
   2466  1.1  skrll 	return -1;
   2467  1.1  skrll     }
   2468  1.1  skrll 
   2469  1.1  skrll   return 0;
   2470  1.1  skrll }
   2471  1.1  skrll 
   2472  1.1  skrll 
   2473  1.1  skrll /* Functions for dealing with the Xtensa ISA.  */
   2475  1.1  skrll 
   2476  1.1  skrll /* Currently the assembler only allows us to use a single target per
   2477  1.1  skrll    fragment.  Because of this, only one operand for a given
   2478  1.1  skrll    instruction may be symbolic.  If there is a PC-relative operand,
   2479  1.1  skrll    the last one is chosen.  Otherwise, the result is the number of the
   2480  1.1  skrll    last immediate operand, and if there are none of those, we fail and
   2481  1.1  skrll    return -1.  */
   2482  1.1  skrll 
   2483  1.1  skrll static int
   2484  1.1  skrll get_relaxable_immed (xtensa_opcode opcode)
   2485  1.1  skrll {
   2486  1.1  skrll   int last_immed = -1;
   2487  1.1  skrll   int noperands, opi;
   2488  1.1  skrll 
   2489  1.1  skrll   if (opcode == XTENSA_UNDEFINED)
   2490  1.1  skrll     return -1;
   2491  1.1  skrll 
   2492  1.1  skrll   noperands = xtensa_opcode_num_operands (xtensa_default_isa, opcode);
   2493  1.1  skrll   for (opi = noperands - 1; opi >= 0; opi--)
   2494  1.1  skrll     {
   2495  1.1  skrll       if (xtensa_operand_is_visible (xtensa_default_isa, opcode, opi) == 0)
   2496  1.1  skrll 	continue;
   2497  1.1  skrll       if (xtensa_operand_is_PCrelative (xtensa_default_isa, opcode, opi) == 1)
   2498  1.1  skrll 	return opi;
   2499  1.1  skrll       if (last_immed == -1
   2500  1.1  skrll 	  && xtensa_operand_is_register (xtensa_default_isa, opcode, opi) == 0)
   2501  1.1  skrll 	last_immed = opi;
   2502  1.1  skrll     }
   2503  1.1  skrll   return last_immed;
   2504  1.1  skrll }
   2505  1.1  skrll 
   2506  1.1  skrll 
   2507  1.1  skrll static xtensa_opcode
   2508  1.1  skrll get_opcode_from_buf (const char *buf, int slot)
   2509  1.1  skrll {
   2510  1.1  skrll   static xtensa_insnbuf insnbuf = NULL;
   2511  1.1  skrll   static xtensa_insnbuf slotbuf = NULL;
   2512  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   2513  1.1  skrll   xtensa_format fmt;
   2514  1.1  skrll 
   2515  1.1  skrll   if (!insnbuf)
   2516  1.1  skrll     {
   2517  1.1  skrll       insnbuf = xtensa_insnbuf_alloc (isa);
   2518  1.1  skrll       slotbuf = xtensa_insnbuf_alloc (isa);
   2519  1.1  skrll     }
   2520  1.1  skrll 
   2521  1.1  skrll   xtensa_insnbuf_from_chars (isa, insnbuf, (const unsigned char *) buf, 0);
   2522  1.1  skrll   fmt = xtensa_format_decode (isa, insnbuf);
   2523  1.1  skrll   if (fmt == XTENSA_UNDEFINED)
   2524  1.1  skrll     return XTENSA_UNDEFINED;
   2525  1.1  skrll 
   2526  1.1  skrll   if (slot >= xtensa_format_num_slots (isa, fmt))
   2527  1.1  skrll     return XTENSA_UNDEFINED;
   2528  1.1  skrll 
   2529  1.1  skrll   xtensa_format_get_slot (isa, fmt, slot, insnbuf, slotbuf);
   2530  1.1  skrll   return xtensa_opcode_decode (isa, fmt, slot, slotbuf);
   2531  1.1  skrll }
   2532  1.1  skrll 
   2533  1.1  skrll 
   2534  1.1  skrll #ifdef TENSILICA_DEBUG
   2535  1.1  skrll 
   2536  1.1  skrll /* For debugging, print out the mapping of opcode numbers to opcodes.  */
   2537  1.1  skrll 
   2538  1.1  skrll static void
   2539  1.1  skrll xtensa_print_insn_table (void)
   2540  1.1  skrll {
   2541  1.1  skrll   int num_opcodes, num_operands;
   2542  1.1  skrll   xtensa_opcode opcode;
   2543  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   2544  1.1  skrll 
   2545  1.1  skrll   num_opcodes = xtensa_isa_num_opcodes (xtensa_default_isa);
   2546  1.1  skrll   for (opcode = 0; opcode < num_opcodes; opcode++)
   2547  1.1  skrll     {
   2548  1.1  skrll       int opn;
   2549  1.1  skrll       fprintf (stderr, "%d: %s: ", opcode, xtensa_opcode_name (isa, opcode));
   2550  1.1  skrll       num_operands = xtensa_opcode_num_operands (isa, opcode);
   2551  1.1  skrll       for (opn = 0; opn < num_operands; opn++)
   2552  1.1  skrll 	{
   2553  1.1  skrll 	  if (xtensa_operand_is_visible (isa, opcode, opn) == 0)
   2554  1.1  skrll 	    continue;
   2555  1.1  skrll 	  if (xtensa_operand_is_register (isa, opcode, opn) == 1)
   2556  1.1  skrll 	    {
   2557  1.1  skrll 	      xtensa_regfile opnd_rf =
   2558  1.1  skrll 		xtensa_operand_regfile (isa, opcode, opn);
   2559  1.1  skrll 	      fprintf (stderr, "%s ", xtensa_regfile_shortname (isa, opnd_rf));
   2560  1.1  skrll 	    }
   2561  1.1  skrll 	  else if (xtensa_operand_is_PCrelative (isa, opcode, opn) == 1)
   2562  1.1  skrll 	    fputs ("[lLr] ", stderr);
   2563  1.1  skrll 	  else
   2564  1.1  skrll 	    fputs ("i ", stderr);
   2565  1.1  skrll 	}
   2566  1.1  skrll       fprintf (stderr, "\n");
   2567  1.1  skrll     }
   2568  1.1  skrll }
   2569  1.1  skrll 
   2570  1.1  skrll 
   2571  1.1  skrll static void
   2572  1.1  skrll print_vliw_insn (xtensa_insnbuf vbuf)
   2573  1.1  skrll {
   2574  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   2575  1.1  skrll   xtensa_format f = xtensa_format_decode (isa, vbuf);
   2576  1.1  skrll   xtensa_insnbuf sbuf = xtensa_insnbuf_alloc (isa);
   2577  1.1  skrll   int op;
   2578  1.1  skrll 
   2579  1.1  skrll   fprintf (stderr, "format = %d\n", f);
   2580  1.1  skrll 
   2581  1.1  skrll   for (op = 0; op < xtensa_format_num_slots (isa, f); op++)
   2582  1.1  skrll     {
   2583  1.1  skrll       xtensa_opcode opcode;
   2584  1.1  skrll       const char *opname;
   2585  1.1  skrll       int operands;
   2586  1.1  skrll 
   2587  1.1  skrll       xtensa_format_get_slot (isa, f, op, vbuf, sbuf);
   2588  1.1  skrll       opcode = xtensa_opcode_decode (isa, f, op, sbuf);
   2589  1.1  skrll       opname = xtensa_opcode_name (isa, opcode);
   2590  1.1  skrll 
   2591  1.1  skrll       fprintf (stderr, "op in slot %i is %s;\n", op, opname);
   2592  1.1  skrll       fprintf (stderr, "   operands = ");
   2593  1.1  skrll       for (operands = 0;
   2594  1.1  skrll 	   operands < xtensa_opcode_num_operands (isa, opcode);
   2595  1.1  skrll 	   operands++)
   2596  1.1  skrll 	{
   2597  1.1  skrll 	  unsigned int val;
   2598  1.1  skrll 	  if (xtensa_operand_is_visible (isa, opcode, operands) == 0)
   2599  1.1  skrll 	    continue;
   2600  1.1  skrll 	  xtensa_operand_get_field (isa, opcode, operands, f, op, sbuf, &val);
   2601  1.1  skrll 	  xtensa_operand_decode (isa, opcode, operands, &val);
   2602  1.1  skrll 	  fprintf (stderr, "%d ", val);
   2603  1.1  skrll 	}
   2604  1.1  skrll       fprintf (stderr, "\n");
   2605  1.1  skrll     }
   2606  1.1  skrll   xtensa_insnbuf_free (isa, sbuf);
   2607  1.1  skrll }
   2608  1.1  skrll 
   2609  1.1  skrll #endif /* TENSILICA_DEBUG */
   2610  1.1  skrll 
   2611  1.1  skrll 
   2612  1.1  skrll static bfd_boolean
   2613  1.1  skrll is_direct_call_opcode (xtensa_opcode opcode)
   2614  1.1  skrll {
   2615  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   2616  1.1  skrll   int n, num_operands;
   2617  1.1  skrll 
   2618  1.1  skrll   if (xtensa_opcode_is_call (isa, opcode) != 1)
   2619  1.1  skrll     return FALSE;
   2620  1.1  skrll 
   2621  1.1  skrll   num_operands = xtensa_opcode_num_operands (isa, opcode);
   2622  1.1  skrll   for (n = 0; n < num_operands; n++)
   2623  1.1  skrll     {
   2624  1.1  skrll       if (xtensa_operand_is_register (isa, opcode, n) == 0
   2625  1.1  skrll 	  && xtensa_operand_is_PCrelative (isa, opcode, n) == 1)
   2626  1.1  skrll 	return TRUE;
   2627  1.1  skrll     }
   2628  1.1  skrll   return FALSE;
   2629  1.1  skrll }
   2630  1.1  skrll 
   2631  1.1  skrll 
   2632  1.1  skrll /* Convert from BFD relocation type code to slot and operand number.
   2633  1.1  skrll    Returns non-zero on failure.  */
   2634  1.1  skrll 
   2635  1.1  skrll static int
   2636  1.1  skrll decode_reloc (bfd_reloc_code_real_type reloc, int *slot, bfd_boolean *is_alt)
   2637  1.1  skrll {
   2638  1.1  skrll   if (reloc >= BFD_RELOC_XTENSA_SLOT0_OP
   2639  1.1  skrll       && reloc <= BFD_RELOC_XTENSA_SLOT14_OP)
   2640  1.1  skrll     {
   2641  1.1  skrll       *slot = reloc - BFD_RELOC_XTENSA_SLOT0_OP;
   2642  1.1  skrll       *is_alt = FALSE;
   2643  1.1  skrll     }
   2644  1.1  skrll   else if (reloc >= BFD_RELOC_XTENSA_SLOT0_ALT
   2645  1.1  skrll       && reloc <= BFD_RELOC_XTENSA_SLOT14_ALT)
   2646  1.1  skrll     {
   2647  1.1  skrll       *slot = reloc - BFD_RELOC_XTENSA_SLOT0_ALT;
   2648  1.1  skrll       *is_alt = TRUE;
   2649  1.1  skrll     }
   2650  1.1  skrll   else
   2651  1.1  skrll     return -1;
   2652  1.1  skrll 
   2653  1.1  skrll   return 0;
   2654  1.1  skrll }
   2655  1.1  skrll 
   2656  1.1  skrll 
   2657  1.1  skrll /* Convert from slot number to BFD relocation type code for the
   2658  1.1  skrll    standard PC-relative relocations.  Return BFD_RELOC_NONE on
   2659  1.1  skrll    failure.  */
   2660  1.1  skrll 
   2661  1.1  skrll static bfd_reloc_code_real_type
   2662  1.1  skrll encode_reloc (int slot)
   2663  1.1  skrll {
   2664  1.1  skrll   if (slot < 0 || slot > 14)
   2665  1.1  skrll     return BFD_RELOC_NONE;
   2666  1.1  skrll 
   2667  1.1  skrll   return BFD_RELOC_XTENSA_SLOT0_OP + slot;
   2668  1.1  skrll }
   2669  1.1  skrll 
   2670  1.1  skrll 
   2671  1.1  skrll /* Convert from slot numbers to BFD relocation type code for the
   2672  1.1  skrll    "alternate" relocations.  Return BFD_RELOC_NONE on failure.  */
   2673  1.1  skrll 
   2674  1.1  skrll static bfd_reloc_code_real_type
   2675  1.1  skrll encode_alt_reloc (int slot)
   2676  1.1  skrll {
   2677  1.1  skrll   if (slot < 0 || slot > 14)
   2678  1.1  skrll     return BFD_RELOC_NONE;
   2679  1.1  skrll 
   2680  1.1  skrll   return BFD_RELOC_XTENSA_SLOT0_ALT + slot;
   2681  1.1  skrll }
   2682  1.1  skrll 
   2683  1.1  skrll 
   2684  1.1  skrll static void
   2685  1.1  skrll xtensa_insnbuf_set_operand (xtensa_insnbuf slotbuf,
   2686  1.1  skrll 			    xtensa_format fmt,
   2687  1.1  skrll 			    int slot,
   2688  1.1  skrll 			    xtensa_opcode opcode,
   2689  1.1  skrll 			    int operand,
   2690  1.1  skrll 			    uint32 value,
   2691  1.1  skrll 			    const char *file,
   2692  1.1  skrll 			    unsigned int line)
   2693  1.1  skrll {
   2694  1.1  skrll   uint32 valbuf = value;
   2695  1.1  skrll 
   2696  1.1  skrll   if (xtensa_operand_encode (xtensa_default_isa, opcode, operand, &valbuf))
   2697  1.1  skrll     {
   2698  1.1  skrll       if (xtensa_operand_is_PCrelative (xtensa_default_isa, opcode, operand)
   2699  1.1  skrll 	  == 1)
   2700  1.1  skrll 	as_bad_where ((char *) file, line,
   2701  1.1  skrll 		      _("operand %d of '%s' has out of range value '%u'"),
   2702  1.1  skrll 		      operand + 1,
   2703  1.1  skrll 		      xtensa_opcode_name (xtensa_default_isa, opcode),
   2704  1.1  skrll 		      value);
   2705  1.1  skrll       else
   2706  1.1  skrll 	as_bad_where ((char *) file, line,
   2707  1.1  skrll 		      _("operand %d of '%s' has invalid value '%u'"),
   2708  1.1  skrll 		      operand + 1,
   2709  1.1  skrll 		      xtensa_opcode_name (xtensa_default_isa, opcode),
   2710  1.1  skrll 		      value);
   2711  1.1  skrll       return;
   2712  1.1  skrll     }
   2713  1.1  skrll 
   2714  1.1  skrll   xtensa_operand_set_field (xtensa_default_isa, opcode, operand, fmt, slot,
   2715  1.1  skrll 			    slotbuf, valbuf);
   2716  1.1  skrll }
   2717  1.1  skrll 
   2718  1.1  skrll 
   2719  1.1  skrll static uint32
   2720  1.1  skrll xtensa_insnbuf_get_operand (xtensa_insnbuf slotbuf,
   2721  1.1  skrll 			    xtensa_format fmt,
   2722  1.1  skrll 			    int slot,
   2723  1.1  skrll 			    xtensa_opcode opcode,
   2724  1.1  skrll 			    int opnum)
   2725  1.1  skrll {
   2726  1.1  skrll   uint32 val = 0;
   2727  1.1  skrll   (void) xtensa_operand_get_field (xtensa_default_isa, opcode, opnum,
   2728  1.1  skrll 				   fmt, slot, slotbuf, &val);
   2729  1.1  skrll   (void) xtensa_operand_decode (xtensa_default_isa, opcode, opnum, &val);
   2730  1.1  skrll   return val;
   2731  1.1  skrll }
   2732  1.1  skrll 
   2733  1.1  skrll 
   2734  1.1  skrll /* Checks for rules from xtensa-relax tables.  */
   2736  1.1  skrll 
   2737  1.1  skrll /* The routine xg_instruction_matches_option_term must return TRUE
   2738  1.1  skrll    when a given option term is true.  The meaning of all of the option
   2739  1.1  skrll    terms is given interpretation by this function.  This is needed when
   2740  1.1  skrll    an option depends on the state of a directive, but there are no such
   2741  1.1  skrll    options in use right now.  */
   2742  1.1  skrll 
   2743  1.1  skrll static bfd_boolean
   2744  1.1  skrll xg_instruction_matches_option_term (TInsn *insn ATTRIBUTE_UNUSED,
   2745  1.1  skrll 				    const ReqOrOption *option)
   2746  1.1  skrll {
   2747  1.1  skrll   if (strcmp (option->option_name, "realnop") == 0
   2748  1.1  skrll       || strncmp (option->option_name, "IsaUse", 6) == 0)
   2749  1.1  skrll     {
   2750  1.1  skrll       /* These conditions were evaluated statically when building the
   2751  1.1  skrll 	 relaxation table.  There's no need to reevaluate them now.  */
   2752  1.1  skrll       return TRUE;
   2753  1.1  skrll     }
   2754  1.1  skrll   else
   2755  1.1  skrll     {
   2756  1.1  skrll       as_fatal (_("internal error: unknown option name '%s'"),
   2757  1.1  skrll 		option->option_name);
   2758  1.1  skrll     }
   2759  1.1  skrll }
   2760  1.1  skrll 
   2761  1.1  skrll 
   2762  1.1  skrll static bfd_boolean
   2763  1.1  skrll xg_instruction_matches_or_options (TInsn *insn,
   2764  1.1  skrll 				   const ReqOrOptionList *or_option)
   2765  1.1  skrll {
   2766  1.1  skrll   const ReqOrOption *option;
   2767  1.1  skrll   /* Must match each of the AND terms.  */
   2768  1.1  skrll   for (option = or_option; option != NULL; option = option->next)
   2769  1.1  skrll     {
   2770  1.1  skrll       if (xg_instruction_matches_option_term (insn, option))
   2771  1.1  skrll 	return TRUE;
   2772  1.1  skrll     }
   2773  1.1  skrll   return FALSE;
   2774  1.1  skrll }
   2775  1.1  skrll 
   2776  1.1  skrll 
   2777  1.1  skrll static bfd_boolean
   2778  1.1  skrll xg_instruction_matches_options (TInsn *insn, const ReqOptionList *options)
   2779  1.1  skrll {
   2780  1.1  skrll   const ReqOption *req_options;
   2781  1.1  skrll   /* Must match each of the AND terms.  */
   2782  1.1  skrll   for (req_options = options;
   2783  1.1  skrll        req_options != NULL;
   2784  1.1  skrll        req_options = req_options->next)
   2785  1.1  skrll     {
   2786  1.1  skrll       /* Must match one of the OR clauses.  */
   2787  1.1  skrll       if (!xg_instruction_matches_or_options (insn,
   2788  1.1  skrll 					      req_options->or_option_terms))
   2789  1.1  skrll 	return FALSE;
   2790  1.1  skrll     }
   2791  1.1  skrll   return TRUE;
   2792  1.1  skrll }
   2793  1.1  skrll 
   2794  1.1  skrll 
   2795  1.1  skrll /* Return the transition rule that matches or NULL if none matches.  */
   2796  1.1  skrll 
   2797  1.1  skrll static bfd_boolean
   2798  1.1  skrll xg_instruction_matches_rule (TInsn *insn, TransitionRule *rule)
   2799  1.1  skrll {
   2800  1.1  skrll   PreconditionList *condition_l;
   2801  1.1  skrll 
   2802  1.1  skrll   if (rule->opcode != insn->opcode)
   2803  1.1  skrll     return FALSE;
   2804  1.1  skrll 
   2805  1.1  skrll   for (condition_l = rule->conditions;
   2806  1.1  skrll        condition_l != NULL;
   2807  1.1  skrll        condition_l = condition_l->next)
   2808  1.1  skrll     {
   2809  1.1  skrll       expressionS *exp1;
   2810  1.1  skrll       expressionS *exp2;
   2811  1.1  skrll       Precondition *cond = condition_l->precond;
   2812  1.1  skrll 
   2813  1.1  skrll       switch (cond->typ)
   2814  1.1  skrll 	{
   2815  1.1  skrll 	case OP_CONSTANT:
   2816  1.1  skrll 	  /* The expression must be the constant.  */
   2817  1.1  skrll 	  assert (cond->op_num < insn->ntok);
   2818  1.1  skrll 	  exp1 = &insn->tok[cond->op_num];
   2819  1.1  skrll 	  if (expr_is_const (exp1))
   2820  1.1  skrll 	    {
   2821  1.1  skrll 	      switch (cond->cmp)
   2822  1.1  skrll 		{
   2823  1.1  skrll 		case OP_EQUAL:
   2824  1.1  skrll 		  if (get_expr_const (exp1) != cond->op_data)
   2825  1.1  skrll 		    return FALSE;
   2826  1.1  skrll 		  break;
   2827  1.1  skrll 		case OP_NOTEQUAL:
   2828  1.1  skrll 		  if (get_expr_const (exp1) == cond->op_data)
   2829  1.1  skrll 		    return FALSE;
   2830  1.1  skrll 		  break;
   2831  1.1  skrll 		default:
   2832  1.1  skrll 		  return FALSE;
   2833  1.1  skrll 		}
   2834  1.1  skrll 	    }
   2835  1.1  skrll 	  else if (expr_is_register (exp1))
   2836  1.1  skrll 	    {
   2837  1.1  skrll 	      switch (cond->cmp)
   2838  1.1  skrll 		{
   2839  1.1  skrll 		case OP_EQUAL:
   2840  1.1  skrll 		  if (get_expr_register (exp1) != cond->op_data)
   2841  1.1  skrll 		    return FALSE;
   2842  1.1  skrll 		  break;
   2843  1.1  skrll 		case OP_NOTEQUAL:
   2844  1.1  skrll 		  if (get_expr_register (exp1) == cond->op_data)
   2845  1.1  skrll 		    return FALSE;
   2846  1.1  skrll 		  break;
   2847  1.1  skrll 		default:
   2848  1.1  skrll 		  return FALSE;
   2849  1.1  skrll 		}
   2850  1.1  skrll 	    }
   2851  1.1  skrll 	  else
   2852  1.1  skrll 	    return FALSE;
   2853  1.1  skrll 	  break;
   2854  1.1  skrll 
   2855  1.1  skrll 	case OP_OPERAND:
   2856  1.1  skrll 	  assert (cond->op_num < insn->ntok);
   2857  1.1  skrll 	  assert (cond->op_data < insn->ntok);
   2858  1.1  skrll 	  exp1 = &insn->tok[cond->op_num];
   2859  1.1  skrll 	  exp2 = &insn->tok[cond->op_data];
   2860  1.1  skrll 
   2861  1.1  skrll 	  switch (cond->cmp)
   2862  1.1  skrll 	    {
   2863  1.1  skrll 	    case OP_EQUAL:
   2864  1.1  skrll 	      if (!expr_is_equal (exp1, exp2))
   2865  1.1  skrll 		return FALSE;
   2866  1.1  skrll 	      break;
   2867  1.1  skrll 	    case OP_NOTEQUAL:
   2868  1.1  skrll 	      if (expr_is_equal (exp1, exp2))
   2869  1.1  skrll 		return FALSE;
   2870  1.1  skrll 	      break;
   2871  1.1  skrll 	    }
   2872  1.1  skrll 	  break;
   2873  1.1  skrll 
   2874  1.1  skrll 	case OP_LITERAL:
   2875  1.1  skrll 	case OP_LABEL:
   2876  1.1  skrll 	default:
   2877  1.1  skrll 	  return FALSE;
   2878  1.1  skrll 	}
   2879  1.1  skrll     }
   2880  1.1  skrll   if (!xg_instruction_matches_options (insn, rule->options))
   2881  1.1  skrll     return FALSE;
   2882  1.1  skrll 
   2883  1.1  skrll   return TRUE;
   2884  1.1  skrll }
   2885  1.1  skrll 
   2886  1.1  skrll 
   2887  1.1  skrll static int
   2888  1.1  skrll transition_rule_cmp (const TransitionRule *a, const TransitionRule *b)
   2889  1.1  skrll {
   2890  1.1  skrll   bfd_boolean a_greater = FALSE;
   2891  1.1  skrll   bfd_boolean b_greater = FALSE;
   2892  1.1  skrll 
   2893  1.1  skrll   ReqOptionList *l_a = a->options;
   2894  1.1  skrll   ReqOptionList *l_b = b->options;
   2895  1.1  skrll 
   2896  1.1  skrll   /* We only care if they both are the same except for
   2897  1.1  skrll      a const16 vs. an l32r.  */
   2898  1.1  skrll 
   2899  1.1  skrll   while (l_a && l_b && ((l_a->next == NULL) == (l_b->next == NULL)))
   2900  1.1  skrll     {
   2901  1.1  skrll       ReqOrOptionList *l_or_a = l_a->or_option_terms;
   2902  1.1  skrll       ReqOrOptionList *l_or_b = l_b->or_option_terms;
   2903  1.1  skrll       while (l_or_a && l_or_b && ((l_a->next == NULL) == (l_b->next == NULL)))
   2904  1.1  skrll 	{
   2905  1.1  skrll 	  if (l_or_a->is_true != l_or_b->is_true)
   2906  1.1  skrll 	    return 0;
   2907  1.1  skrll 	  if (strcmp (l_or_a->option_name, l_or_b->option_name) != 0)
   2908  1.1  skrll 	    {
   2909  1.1  skrll 	      /* This is the case we care about.  */
   2910  1.1  skrll 	      if (strcmp (l_or_a->option_name, "IsaUseConst16") == 0
   2911  1.1  skrll 		  && strcmp (l_or_b->option_name, "IsaUseL32R") == 0)
   2912  1.1  skrll 		{
   2913  1.1  skrll 		  if (prefer_const16)
   2914  1.1  skrll 		    a_greater = TRUE;
   2915  1.1  skrll 		  else
   2916  1.1  skrll 		    b_greater = TRUE;
   2917  1.1  skrll 		}
   2918  1.1  skrll 	      else if (strcmp (l_or_a->option_name, "IsaUseL32R") == 0
   2919  1.1  skrll 		       && strcmp (l_or_b->option_name, "IsaUseConst16") == 0)
   2920  1.1  skrll 		{
   2921  1.1  skrll 		  if (prefer_const16)
   2922  1.1  skrll 		    b_greater = TRUE;
   2923  1.1  skrll 		  else
   2924  1.1  skrll 		    a_greater = TRUE;
   2925  1.1  skrll 		}
   2926  1.1  skrll 	      else
   2927  1.1  skrll 		return 0;
   2928  1.1  skrll 	    }
   2929  1.1  skrll 	  l_or_a = l_or_a->next;
   2930  1.1  skrll 	  l_or_b = l_or_b->next;
   2931  1.1  skrll 	}
   2932  1.1  skrll       if (l_or_a || l_or_b)
   2933  1.1  skrll 	return 0;
   2934  1.1  skrll 
   2935  1.1  skrll       l_a = l_a->next;
   2936  1.1  skrll       l_b = l_b->next;
   2937  1.1  skrll     }
   2938  1.1  skrll   if (l_a || l_b)
   2939  1.1  skrll     return 0;
   2940  1.1  skrll 
   2941  1.1  skrll   /* Incomparable if the substitution was used differently in two cases.  */
   2942  1.1  skrll   if (a_greater && b_greater)
   2943  1.1  skrll     return 0;
   2944  1.1  skrll 
   2945  1.1  skrll   if (b_greater)
   2946  1.1  skrll     return 1;
   2947  1.1  skrll   if (a_greater)
   2948  1.1  skrll     return -1;
   2949  1.1  skrll 
   2950  1.1  skrll   return 0;
   2951  1.1  skrll }
   2952  1.1  skrll 
   2953  1.1  skrll 
   2954  1.1  skrll static TransitionRule *
   2955  1.1  skrll xg_instruction_match (TInsn *insn)
   2956  1.1  skrll {
   2957  1.1  skrll   TransitionTable *table = xg_build_simplify_table (&transition_rule_cmp);
   2958  1.1  skrll   TransitionList *l;
   2959  1.1  skrll   assert (insn->opcode < table->num_opcodes);
   2960  1.1  skrll 
   2961  1.1  skrll   /* Walk through all of the possible transitions.  */
   2962  1.1  skrll   for (l = table->table[insn->opcode]; l != NULL; l = l->next)
   2963  1.1  skrll     {
   2964  1.1  skrll       TransitionRule *rule = l->rule;
   2965  1.1  skrll       if (xg_instruction_matches_rule (insn, rule))
   2966  1.1  skrll 	return rule;
   2967  1.1  skrll     }
   2968  1.1  skrll   return NULL;
   2969  1.1  skrll }
   2970  1.1  skrll 
   2971  1.1  skrll 
   2972  1.1  skrll /* Various Other Internal Functions.  */
   2974  1.1  skrll 
   2975  1.1  skrll static bfd_boolean
   2976  1.1  skrll is_unique_insn_expansion (TransitionRule *r)
   2977  1.1  skrll {
   2978  1.1  skrll   if (!r->to_instr || r->to_instr->next != NULL)
   2979  1.1  skrll     return FALSE;
   2980  1.1  skrll   if (r->to_instr->typ != INSTR_INSTR)
   2981  1.1  skrll     return FALSE;
   2982  1.1  skrll   return TRUE;
   2983  1.1  skrll }
   2984  1.1  skrll 
   2985  1.1  skrll 
   2986  1.1  skrll /* Check if there is exactly one relaxation for INSN that converts it to
   2987  1.1  skrll    another instruction of equal or larger size.  If so, and if TARG is
   2988  1.1  skrll    non-null, go ahead and generate the relaxed instruction into TARG.  If
   2989  1.1  skrll    NARROW_ONLY is true, then only consider relaxations that widen a narrow
   2990  1.1  skrll    instruction, i.e., ignore relaxations that convert to an instruction of
   2991  1.1  skrll    equal size.  In some contexts where this function is used, only
   2992  1.1  skrll    a single widening is allowed and the NARROW_ONLY argument is used to
   2993  1.1  skrll    exclude cases like ADDI being "widened" to an ADDMI, which may
   2994  1.1  skrll    later be relaxed to an ADDMI/ADDI pair.  */
   2995  1.1  skrll 
   2996  1.1  skrll bfd_boolean
   2997  1.1  skrll xg_is_single_relaxable_insn (TInsn *insn, TInsn *targ, bfd_boolean narrow_only)
   2998  1.1  skrll {
   2999  1.1  skrll   TransitionTable *table = xg_build_widen_table (&transition_rule_cmp);
   3000  1.1  skrll   TransitionList *l;
   3001  1.1  skrll   TransitionRule *match = 0;
   3002  1.1  skrll 
   3003  1.1  skrll   assert (insn->insn_type == ITYPE_INSN);
   3004  1.1  skrll   assert (insn->opcode < table->num_opcodes);
   3005  1.1  skrll 
   3006  1.1  skrll   for (l = table->table[insn->opcode]; l != NULL; l = l->next)
   3007  1.1  skrll     {
   3008  1.1  skrll       TransitionRule *rule = l->rule;
   3009  1.1  skrll 
   3010  1.1  skrll       if (xg_instruction_matches_rule (insn, rule)
   3011  1.1  skrll 	  && is_unique_insn_expansion (rule)
   3012  1.1  skrll 	  && (xg_get_single_size (insn->opcode) + (narrow_only ? 1 : 0)
   3013  1.1  skrll 	      <= xg_get_single_size (rule->to_instr->opcode)))
   3014  1.1  skrll 	{
   3015  1.1  skrll 	  if (match)
   3016  1.1  skrll 	    return FALSE;
   3017  1.1  skrll 	  match = rule;
   3018  1.1  skrll 	}
   3019  1.1  skrll     }
   3020  1.1  skrll   if (!match)
   3021  1.1  skrll     return FALSE;
   3022  1.1  skrll 
   3023  1.1  skrll   if (targ)
   3024  1.1  skrll     xg_build_to_insn (targ, insn, match->to_instr);
   3025  1.1  skrll   return TRUE;
   3026  1.1  skrll }
   3027  1.1  skrll 
   3028  1.1  skrll 
   3029  1.1  skrll /* Return the maximum number of bytes this opcode can expand to.  */
   3030  1.1  skrll 
   3031  1.1  skrll static int
   3032  1.1  skrll xg_get_max_insn_widen_size (xtensa_opcode opcode)
   3033  1.1  skrll {
   3034  1.1  skrll   TransitionTable *table = xg_build_widen_table (&transition_rule_cmp);
   3035  1.1  skrll   TransitionList *l;
   3036  1.1  skrll   int max_size = xg_get_single_size (opcode);
   3037  1.1  skrll 
   3038  1.1  skrll   assert (opcode < table->num_opcodes);
   3039  1.1  skrll 
   3040  1.1  skrll   for (l = table->table[opcode]; l != NULL; l = l->next)
   3041  1.1  skrll     {
   3042  1.1  skrll       TransitionRule *rule = l->rule;
   3043  1.1  skrll       BuildInstr *build_list;
   3044  1.1  skrll       int this_size = 0;
   3045  1.1  skrll 
   3046  1.1  skrll       if (!rule)
   3047  1.1  skrll 	continue;
   3048  1.1  skrll       build_list = rule->to_instr;
   3049  1.1  skrll       if (is_unique_insn_expansion (rule))
   3050  1.1  skrll 	{
   3051  1.1  skrll 	  assert (build_list->typ == INSTR_INSTR);
   3052  1.1  skrll 	  this_size = xg_get_max_insn_widen_size (build_list->opcode);
   3053  1.1  skrll 	}
   3054  1.1  skrll       else
   3055  1.1  skrll 	for (; build_list != NULL; build_list = build_list->next)
   3056  1.1  skrll 	  {
   3057  1.1  skrll 	    switch (build_list->typ)
   3058  1.1  skrll 	      {
   3059  1.1  skrll 	      case INSTR_INSTR:
   3060  1.1  skrll 		this_size += xg_get_single_size (build_list->opcode);
   3061  1.1  skrll 		break;
   3062  1.1  skrll 	      case INSTR_LITERAL_DEF:
   3063  1.1  skrll 	      case INSTR_LABEL_DEF:
   3064  1.1  skrll 	      default:
   3065  1.1  skrll 		break;
   3066  1.1  skrll 	      }
   3067  1.1  skrll 	  }
   3068  1.1  skrll       if (this_size > max_size)
   3069  1.1  skrll 	max_size = this_size;
   3070  1.1  skrll     }
   3071  1.1  skrll   return max_size;
   3072  1.1  skrll }
   3073  1.1  skrll 
   3074  1.1  skrll 
   3075  1.1  skrll /* Return the maximum number of literal bytes this opcode can generate.  */
   3076  1.1  skrll 
   3077  1.1  skrll static int
   3078  1.1  skrll xg_get_max_insn_widen_literal_size (xtensa_opcode opcode)
   3079  1.1  skrll {
   3080  1.1  skrll   TransitionTable *table = xg_build_widen_table (&transition_rule_cmp);
   3081  1.1  skrll   TransitionList *l;
   3082  1.1  skrll   int max_size = 0;
   3083  1.1  skrll 
   3084  1.1  skrll   assert (opcode < table->num_opcodes);
   3085  1.1  skrll 
   3086  1.1  skrll   for (l = table->table[opcode]; l != NULL; l = l->next)
   3087  1.1  skrll     {
   3088  1.1  skrll       TransitionRule *rule = l->rule;
   3089  1.1  skrll       BuildInstr *build_list;
   3090  1.1  skrll       int this_size = 0;
   3091  1.1  skrll 
   3092  1.1  skrll       if (!rule)
   3093  1.1  skrll 	continue;
   3094  1.1  skrll       build_list = rule->to_instr;
   3095  1.1  skrll       if (is_unique_insn_expansion (rule))
   3096  1.1  skrll 	{
   3097  1.1  skrll 	  assert (build_list->typ == INSTR_INSTR);
   3098  1.1  skrll 	  this_size = xg_get_max_insn_widen_literal_size (build_list->opcode);
   3099  1.1  skrll 	}
   3100  1.1  skrll       else
   3101  1.1  skrll 	for (; build_list != NULL; build_list = build_list->next)
   3102  1.1  skrll 	  {
   3103  1.1  skrll 	    switch (build_list->typ)
   3104  1.1  skrll 	      {
   3105  1.1  skrll 	      case INSTR_LITERAL_DEF:
   3106  1.1  skrll 		/* Hard-coded 4-byte literal.  */
   3107  1.1  skrll 		this_size += 4;
   3108  1.1  skrll 		break;
   3109  1.1  skrll 	      case INSTR_INSTR:
   3110  1.1  skrll 	      case INSTR_LABEL_DEF:
   3111  1.1  skrll 	      default:
   3112  1.1  skrll 		break;
   3113  1.1  skrll 	      }
   3114  1.1  skrll 	  }
   3115  1.1  skrll       if (this_size > max_size)
   3116  1.1  skrll 	max_size = this_size;
   3117  1.1  skrll     }
   3118  1.1  skrll   return max_size;
   3119  1.1  skrll }
   3120  1.1  skrll 
   3121  1.1  skrll 
   3122  1.1  skrll static bfd_boolean
   3123  1.1  skrll xg_is_relaxable_insn (TInsn *insn, int lateral_steps)
   3124  1.1  skrll {
   3125  1.1  skrll   int steps_taken = 0;
   3126  1.1  skrll   TransitionTable *table = xg_build_widen_table (&transition_rule_cmp);
   3127  1.1  skrll   TransitionList *l;
   3128  1.1  skrll 
   3129  1.1  skrll   assert (insn->insn_type == ITYPE_INSN);
   3130  1.1  skrll   assert (insn->opcode < table->num_opcodes);
   3131  1.1  skrll 
   3132  1.1  skrll   for (l = table->table[insn->opcode]; l != NULL; l = l->next)
   3133  1.1  skrll     {
   3134  1.1  skrll       TransitionRule *rule = l->rule;
   3135  1.1  skrll 
   3136  1.1  skrll       if (xg_instruction_matches_rule (insn, rule))
   3137  1.1  skrll 	{
   3138  1.1  skrll 	  if (steps_taken == lateral_steps)
   3139  1.1  skrll 	    return TRUE;
   3140  1.1  skrll 	  steps_taken++;
   3141  1.1  skrll 	}
   3142  1.1  skrll     }
   3143  1.1  skrll   return FALSE;
   3144  1.1  skrll }
   3145  1.1  skrll 
   3146  1.1  skrll 
   3147  1.1  skrll static symbolS *
   3148  1.1  skrll get_special_literal_symbol (void)
   3149  1.1  skrll {
   3150  1.1  skrll   static symbolS *sym = NULL;
   3151  1.1  skrll 
   3152  1.1  skrll   if (sym == NULL)
   3153  1.1  skrll     sym = symbol_find_or_make ("SPECIAL_LITERAL0\001");
   3154  1.1  skrll   return sym;
   3155  1.1  skrll }
   3156  1.1  skrll 
   3157  1.1  skrll 
   3158  1.1  skrll static symbolS *
   3159  1.1  skrll get_special_label_symbol (void)
   3160  1.1  skrll {
   3161  1.1  skrll   static symbolS *sym = NULL;
   3162  1.1  skrll 
   3163  1.1  skrll   if (sym == NULL)
   3164  1.1  skrll     sym = symbol_find_or_make ("SPECIAL_LABEL0\001");
   3165  1.1  skrll   return sym;
   3166  1.1  skrll }
   3167  1.1  skrll 
   3168  1.1  skrll 
   3169  1.1  skrll static bfd_boolean
   3170  1.1  skrll xg_valid_literal_expression (const expressionS *exp)
   3171  1.1  skrll {
   3172  1.1  skrll   switch (exp->X_op)
   3173  1.1  skrll     {
   3174  1.1  skrll     case O_constant:
   3175  1.1  skrll     case O_symbol:
   3176  1.1  skrll     case O_big:
   3177  1.1  skrll     case O_uminus:
   3178  1.1  skrll     case O_subtract:
   3179  1.1  skrll     case O_pltrel:
   3180  1.1  skrll     case O_pcrel:
   3181  1.1  skrll     case O_tlsfunc:
   3182  1.1  skrll     case O_tlsarg:
   3183  1.1  skrll     case O_tpoff:
   3184  1.1  skrll     case O_dtpoff:
   3185  1.1  skrll       return TRUE;
   3186  1.1  skrll     default:
   3187  1.1  skrll       return FALSE;
   3188  1.1  skrll     }
   3189  1.1  skrll }
   3190  1.1  skrll 
   3191  1.1  skrll 
   3192  1.1  skrll /* This will check to see if the value can be converted into the
   3193  1.1  skrll    operand type.  It will return TRUE if it does not fit.  */
   3194  1.1  skrll 
   3195  1.1  skrll static bfd_boolean
   3196  1.1  skrll xg_check_operand (int32 value, xtensa_opcode opcode, int operand)
   3197  1.1  skrll {
   3198  1.1  skrll   uint32 valbuf = value;
   3199  1.1  skrll   if (xtensa_operand_encode (xtensa_default_isa, opcode, operand, &valbuf))
   3200  1.1  skrll     return TRUE;
   3201  1.1  skrll   return FALSE;
   3202  1.1  skrll }
   3203  1.1  skrll 
   3204  1.1  skrll 
   3205  1.1  skrll /* Assumes: All immeds are constants.  Check that all constants fit
   3206  1.1  skrll    into their immeds; return FALSE if not.  */
   3207  1.1  skrll 
   3208  1.1  skrll static bfd_boolean
   3209  1.1  skrll xg_immeds_fit (const TInsn *insn)
   3210  1.1  skrll {
   3211  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   3212  1.1  skrll   int i;
   3213  1.1  skrll 
   3214  1.1  skrll   int n = insn->ntok;
   3215  1.1  skrll   assert (insn->insn_type == ITYPE_INSN);
   3216  1.1  skrll   for (i = 0; i < n; ++i)
   3217  1.1  skrll     {
   3218  1.1  skrll       const expressionS *expr = &insn->tok[i];
   3219  1.1  skrll       if (xtensa_operand_is_register (isa, insn->opcode, i) == 1)
   3220  1.1  skrll 	continue;
   3221  1.1  skrll 
   3222  1.1  skrll       switch (expr->X_op)
   3223  1.1  skrll 	{
   3224  1.1  skrll 	case O_register:
   3225  1.1  skrll 	case O_constant:
   3226  1.1  skrll 	  if (xg_check_operand (expr->X_add_number, insn->opcode, i))
   3227  1.1  skrll 	    return FALSE;
   3228  1.1  skrll 	  break;
   3229  1.1  skrll 
   3230  1.1  skrll 	default:
   3231  1.1  skrll 	  /* The symbol should have a fixup associated with it.  */
   3232  1.1  skrll 	  assert (FALSE);
   3233  1.1  skrll 	  break;
   3234  1.1  skrll 	}
   3235  1.1  skrll     }
   3236  1.1  skrll   return TRUE;
   3237  1.1  skrll }
   3238  1.1  skrll 
   3239  1.1  skrll 
   3240  1.1  skrll /* This should only be called after we have an initial
   3241  1.1  skrll    estimate of the addresses.  */
   3242  1.1  skrll 
   3243  1.1  skrll static bfd_boolean
   3244  1.1  skrll xg_symbolic_immeds_fit (const TInsn *insn,
   3245  1.1  skrll 			segT pc_seg,
   3246  1.1  skrll 			fragS *pc_frag,
   3247  1.1  skrll 			offsetT pc_offset,
   3248  1.1  skrll 			long stretch)
   3249  1.1  skrll {
   3250  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   3251  1.1  skrll   symbolS *symbolP;
   3252  1.1  skrll   fragS *sym_frag;
   3253  1.1  skrll   offsetT target, pc;
   3254  1.1  skrll   uint32 new_offset;
   3255  1.1  skrll   int i;
   3256  1.1  skrll   int n = insn->ntok;
   3257  1.1  skrll 
   3258  1.1  skrll   assert (insn->insn_type == ITYPE_INSN);
   3259  1.1  skrll 
   3260  1.1  skrll   for (i = 0; i < n; ++i)
   3261  1.1  skrll     {
   3262  1.1  skrll       const expressionS *expr = &insn->tok[i];
   3263  1.1  skrll       if (xtensa_operand_is_register (isa, insn->opcode, i) == 1)
   3264  1.1  skrll 	continue;
   3265  1.1  skrll 
   3266  1.1  skrll       switch (expr->X_op)
   3267  1.1  skrll 	{
   3268  1.1  skrll 	case O_register:
   3269  1.1  skrll 	case O_constant:
   3270  1.1  skrll 	  if (xg_check_operand (expr->X_add_number, insn->opcode, i))
   3271  1.1  skrll 	    return FALSE;
   3272  1.1  skrll 	  break;
   3273  1.1  skrll 
   3274  1.1  skrll 	case O_lo16:
   3275  1.1  skrll 	case O_hi16:
   3276  1.1  skrll 	  /* Check for the worst case.  */
   3277  1.1  skrll 	  if (xg_check_operand (0xffff, insn->opcode, i))
   3278  1.1  skrll 	    return FALSE;
   3279  1.1  skrll 	  break;
   3280  1.1  skrll 
   3281  1.1  skrll 	case O_symbol:
   3282  1.1  skrll 	  /* We only allow symbols for PC-relative references.
   3283  1.1  skrll 	     If pc_frag == 0, then we don't have frag locations yet.  */
   3284  1.1  skrll 	  if (pc_frag == 0
   3285  1.1  skrll 	      || xtensa_operand_is_PCrelative (isa, insn->opcode, i) == 0)
   3286  1.1  skrll 	    return FALSE;
   3287  1.1  skrll 
   3288  1.1  skrll 	  /* If it is a weak symbol or a symbol in a different section,
   3289  1.1  skrll 	     it cannot be known to fit at assembly time.  */
   3290  1.1  skrll 	  if (S_IS_WEAK (expr->X_add_symbol)
   3291  1.1  skrll 	      || S_GET_SEGMENT (expr->X_add_symbol) != pc_seg)
   3292  1.1  skrll 	    {
   3293  1.1  skrll 	      /* For a direct call with --no-longcalls, be optimistic and
   3294  1.1  skrll 		 assume it will be in range.  If the symbol is weak and
   3295  1.1  skrll 		 undefined, it may remain undefined at link-time, in which
   3296  1.1  skrll 		 case it will have a zero value and almost certainly be out
   3297  1.1  skrll 		 of range for a direct call; thus, relax for undefined weak
   3298  1.1  skrll 		 symbols even if longcalls is not enabled.  */
   3299  1.1  skrll 	      if (is_direct_call_opcode (insn->opcode)
   3300  1.1  skrll 		  && ! pc_frag->tc_frag_data.use_longcalls
   3301  1.1  skrll 		  && (! S_IS_WEAK (expr->X_add_symbol)
   3302  1.1  skrll 		      || S_IS_DEFINED (expr->X_add_symbol)))
   3303  1.1  skrll 		return TRUE;
   3304  1.1  skrll 
   3305  1.1  skrll 	      return FALSE;
   3306  1.1  skrll 	    }
   3307  1.1  skrll 
   3308  1.1  skrll 	  symbolP = expr->X_add_symbol;
   3309  1.1  skrll 	  sym_frag = symbol_get_frag (symbolP);
   3310  1.1  skrll 	  target = S_GET_VALUE (symbolP) + expr->X_add_number;
   3311  1.1  skrll 	  pc = pc_frag->fr_address + pc_offset;
   3312  1.1  skrll 
   3313  1.1  skrll 	  /* If frag has yet to be reached on this pass, assume it
   3314  1.1  skrll 	     will move by STRETCH just as we did.  If this is not so,
   3315  1.1  skrll 	     it will be because some frag between grows, and that will
   3316  1.1  skrll 	     force another pass.  Beware zero-length frags.  There
   3317  1.1  skrll 	     should be a faster way to do this.  */
   3318  1.1  skrll 
   3319  1.1  skrll 	  if (stretch != 0
   3320  1.1  skrll 	      && sym_frag->relax_marker != pc_frag->relax_marker
   3321  1.1  skrll 	      && S_GET_SEGMENT (symbolP) == pc_seg)
   3322  1.1  skrll 	    {
   3323  1.1  skrll 	      target += stretch;
   3324  1.1  skrll 	    }
   3325  1.1  skrll 
   3326  1.1  skrll 	  new_offset = target;
   3327  1.1  skrll 	  xtensa_operand_do_reloc (isa, insn->opcode, i, &new_offset, pc);
   3328  1.1  skrll 	  if (xg_check_operand (new_offset, insn->opcode, i))
   3329  1.1  skrll 	    return FALSE;
   3330  1.1  skrll 	  break;
   3331  1.1  skrll 
   3332  1.1  skrll 	default:
   3333  1.1  skrll 	  /* The symbol should have a fixup associated with it.  */
   3334  1.1  skrll 	  return FALSE;
   3335  1.1  skrll 	}
   3336  1.1  skrll     }
   3337  1.1  skrll 
   3338  1.1  skrll   return TRUE;
   3339  1.1  skrll }
   3340  1.1  skrll 
   3341  1.1  skrll 
   3342  1.1  skrll /* Return TRUE on success.  */
   3343  1.1  skrll 
   3344  1.1  skrll static bfd_boolean
   3345  1.1  skrll xg_build_to_insn (TInsn *targ, TInsn *insn, BuildInstr *bi)
   3346  1.1  skrll {
   3347  1.1  skrll   BuildOp *op;
   3348  1.1  skrll   symbolS *sym;
   3349  1.1  skrll 
   3350  1.1  skrll   tinsn_init (targ);
   3351  1.1  skrll   targ->debug_line = insn->debug_line;
   3352  1.1  skrll   targ->loc_directive_seen = insn->loc_directive_seen;
   3353  1.1  skrll   switch (bi->typ)
   3354  1.1  skrll     {
   3355  1.1  skrll     case INSTR_INSTR:
   3356  1.1  skrll       op = bi->ops;
   3357  1.1  skrll       targ->opcode = bi->opcode;
   3358  1.1  skrll       targ->insn_type = ITYPE_INSN;
   3359  1.1  skrll       targ->is_specific_opcode = FALSE;
   3360  1.1  skrll 
   3361  1.1  skrll       for (; op != NULL; op = op->next)
   3362  1.1  skrll 	{
   3363  1.1  skrll 	  int op_num = op->op_num;
   3364  1.1  skrll 	  int op_data = op->op_data;
   3365  1.1  skrll 
   3366  1.1  skrll 	  assert (op->op_num < MAX_INSN_ARGS);
   3367  1.1  skrll 
   3368  1.1  skrll 	  if (targ->ntok <= op_num)
   3369  1.1  skrll 	    targ->ntok = op_num + 1;
   3370  1.1  skrll 
   3371  1.1  skrll 	  switch (op->typ)
   3372  1.1  skrll 	    {
   3373  1.1  skrll 	    case OP_CONSTANT:
   3374  1.1  skrll 	      set_expr_const (&targ->tok[op_num], op_data);
   3375  1.1  skrll 	      break;
   3376  1.1  skrll 	    case OP_OPERAND:
   3377  1.1  skrll 	      assert (op_data < insn->ntok);
   3378  1.1  skrll 	      copy_expr (&targ->tok[op_num], &insn->tok[op_data]);
   3379  1.1  skrll 	      break;
   3380  1.1  skrll 	    case OP_LITERAL:
   3381  1.1  skrll 	      sym = get_special_literal_symbol ();
   3382  1.1  skrll 	      set_expr_symbol_offset (&targ->tok[op_num], sym, 0);
   3383  1.1  skrll 	      if (insn->tok[op_data].X_op == O_tlsfunc
   3384  1.1  skrll 		  || insn->tok[op_data].X_op == O_tlsarg)
   3385  1.1  skrll 		copy_expr (&targ->tls_reloc, &insn->tok[op_data]);
   3386  1.1  skrll 	      break;
   3387  1.1  skrll 	    case OP_LABEL:
   3388  1.1  skrll 	      sym = get_special_label_symbol ();
   3389  1.1  skrll 	      set_expr_symbol_offset (&targ->tok[op_num], sym, 0);
   3390  1.1  skrll 	      break;
   3391  1.1  skrll 	    case OP_OPERAND_HI16U:
   3392  1.1  skrll 	    case OP_OPERAND_LOW16U:
   3393  1.1  skrll 	      assert (op_data < insn->ntok);
   3394  1.1  skrll 	      if (expr_is_const (&insn->tok[op_data]))
   3395  1.1  skrll 		{
   3396  1.1  skrll 		  long val;
   3397  1.1  skrll 		  copy_expr (&targ->tok[op_num], &insn->tok[op_data]);
   3398  1.1  skrll 		  val = xg_apply_userdef_op_fn (op->typ,
   3399  1.1  skrll 						targ->tok[op_num].
   3400  1.1  skrll 						X_add_number);
   3401  1.1  skrll 		  targ->tok[op_num].X_add_number = val;
   3402  1.1  skrll 		}
   3403  1.1  skrll 	      else
   3404  1.1  skrll 		{
   3405  1.1  skrll 		  /* For const16 we can create relocations for these.  */
   3406  1.1  skrll 		  if (targ->opcode == XTENSA_UNDEFINED
   3407  1.1  skrll 		      || (targ->opcode != xtensa_const16_opcode))
   3408  1.1  skrll 		    return FALSE;
   3409  1.1  skrll 		  assert (op_data < insn->ntok);
   3410  1.1  skrll 		  /* Need to build a O_lo16 or O_hi16.  */
   3411  1.1  skrll 		  copy_expr (&targ->tok[op_num], &insn->tok[op_data]);
   3412  1.1  skrll 		  if (targ->tok[op_num].X_op == O_symbol)
   3413  1.1  skrll 		    {
   3414  1.1  skrll 		      if (op->typ == OP_OPERAND_HI16U)
   3415  1.1  skrll 			targ->tok[op_num].X_op = O_hi16;
   3416  1.1  skrll 		      else if (op->typ == OP_OPERAND_LOW16U)
   3417  1.1  skrll 			targ->tok[op_num].X_op = O_lo16;
   3418  1.1  skrll 		      else
   3419  1.1  skrll 			return FALSE;
   3420  1.1  skrll 		    }
   3421  1.1  skrll 		}
   3422  1.1  skrll 	      break;
   3423  1.1  skrll 	    default:
   3424  1.1  skrll 	      /* currently handles:
   3425  1.1  skrll 		 OP_OPERAND_LOW8
   3426  1.1  skrll 		 OP_OPERAND_HI24S
   3427  1.1  skrll 		 OP_OPERAND_F32MINUS */
   3428  1.1  skrll 	      if (xg_has_userdef_op_fn (op->typ))
   3429  1.1  skrll 		{
   3430  1.1  skrll 		  assert (op_data < insn->ntok);
   3431  1.1  skrll 		  if (expr_is_const (&insn->tok[op_data]))
   3432  1.1  skrll 		    {
   3433  1.1  skrll 		      long val;
   3434  1.1  skrll 		      copy_expr (&targ->tok[op_num], &insn->tok[op_data]);
   3435  1.1  skrll 		      val = xg_apply_userdef_op_fn (op->typ,
   3436  1.1  skrll 						    targ->tok[op_num].
   3437  1.1  skrll 						    X_add_number);
   3438  1.1  skrll 		      targ->tok[op_num].X_add_number = val;
   3439  1.1  skrll 		    }
   3440  1.1  skrll 		  else
   3441  1.1  skrll 		    return FALSE; /* We cannot use a relocation for this.  */
   3442  1.1  skrll 		  break;
   3443  1.1  skrll 		}
   3444  1.1  skrll 	      assert (0);
   3445  1.1  skrll 	      break;
   3446  1.1  skrll 	    }
   3447  1.1  skrll 	}
   3448  1.1  skrll       break;
   3449  1.1  skrll 
   3450  1.1  skrll     case INSTR_LITERAL_DEF:
   3451  1.1  skrll       op = bi->ops;
   3452  1.1  skrll       targ->opcode = XTENSA_UNDEFINED;
   3453  1.1  skrll       targ->insn_type = ITYPE_LITERAL;
   3454  1.1  skrll       targ->is_specific_opcode = FALSE;
   3455  1.1  skrll       for (; op != NULL; op = op->next)
   3456  1.1  skrll 	{
   3457  1.1  skrll 	  int op_num = op->op_num;
   3458  1.1  skrll 	  int op_data = op->op_data;
   3459  1.1  skrll 	  assert (op->op_num < MAX_INSN_ARGS);
   3460  1.1  skrll 
   3461  1.1  skrll 	  if (targ->ntok <= op_num)
   3462  1.1  skrll 	    targ->ntok = op_num + 1;
   3463  1.1  skrll 
   3464  1.1  skrll 	  switch (op->typ)
   3465  1.1  skrll 	    {
   3466  1.1  skrll 	    case OP_OPERAND:
   3467  1.1  skrll 	      assert (op_data < insn->ntok);
   3468  1.1  skrll 	      /* We can only pass resolvable literals through.  */
   3469  1.1  skrll 	      if (!xg_valid_literal_expression (&insn->tok[op_data]))
   3470  1.1  skrll 		return FALSE;
   3471  1.1  skrll 	      copy_expr (&targ->tok[op_num], &insn->tok[op_data]);
   3472  1.1  skrll 	      break;
   3473  1.1  skrll 	    case OP_LITERAL:
   3474  1.1  skrll 	    case OP_CONSTANT:
   3475  1.1  skrll 	    case OP_LABEL:
   3476  1.1  skrll 	    default:
   3477  1.1  skrll 	      assert (0);
   3478  1.1  skrll 	      break;
   3479  1.1  skrll 	    }
   3480  1.1  skrll 	}
   3481  1.1  skrll       break;
   3482  1.1  skrll 
   3483  1.1  skrll     case INSTR_LABEL_DEF:
   3484  1.1  skrll       op = bi->ops;
   3485  1.1  skrll       targ->opcode = XTENSA_UNDEFINED;
   3486  1.1  skrll       targ->insn_type = ITYPE_LABEL;
   3487  1.1  skrll       targ->is_specific_opcode = FALSE;
   3488  1.1  skrll       /* Literal with no ops is a label?  */
   3489  1.1  skrll       assert (op == NULL);
   3490  1.1  skrll       break;
   3491  1.1  skrll 
   3492  1.1  skrll     default:
   3493  1.1  skrll       assert (0);
   3494  1.1  skrll     }
   3495  1.1  skrll 
   3496  1.1  skrll   return TRUE;
   3497  1.1  skrll }
   3498  1.1  skrll 
   3499  1.1  skrll 
   3500  1.1  skrll /* Return TRUE on success.  */
   3501  1.1  skrll 
   3502  1.1  skrll static bfd_boolean
   3503  1.1  skrll xg_build_to_stack (IStack *istack, TInsn *insn, BuildInstr *bi)
   3504  1.1  skrll {
   3505  1.1  skrll   for (; bi != NULL; bi = bi->next)
   3506  1.1  skrll     {
   3507  1.1  skrll       TInsn *next_insn = istack_push_space (istack);
   3508  1.1  skrll 
   3509  1.1  skrll       if (!xg_build_to_insn (next_insn, insn, bi))
   3510  1.1  skrll 	return FALSE;
   3511  1.1  skrll     }
   3512  1.1  skrll   return TRUE;
   3513  1.1  skrll }
   3514  1.1  skrll 
   3515  1.1  skrll 
   3516  1.1  skrll /* Return TRUE on valid expansion.  */
   3517  1.1  skrll 
   3518  1.1  skrll static bfd_boolean
   3519  1.1  skrll xg_expand_to_stack (IStack *istack, TInsn *insn, int lateral_steps)
   3520  1.1  skrll {
   3521  1.1  skrll   int stack_size = istack->ninsn;
   3522  1.1  skrll   int steps_taken = 0;
   3523  1.1  skrll   TransitionTable *table = xg_build_widen_table (&transition_rule_cmp);
   3524  1.1  skrll   TransitionList *l;
   3525  1.1  skrll 
   3526  1.1  skrll   assert (insn->insn_type == ITYPE_INSN);
   3527  1.1  skrll   assert (insn->opcode < table->num_opcodes);
   3528  1.1  skrll 
   3529  1.1  skrll   for (l = table->table[insn->opcode]; l != NULL; l = l->next)
   3530  1.1  skrll     {
   3531  1.1  skrll       TransitionRule *rule = l->rule;
   3532  1.1  skrll 
   3533  1.1  skrll       if (xg_instruction_matches_rule (insn, rule))
   3534  1.1  skrll 	{
   3535  1.1  skrll 	  if (lateral_steps == steps_taken)
   3536  1.1  skrll 	    {
   3537  1.1  skrll 	      int i;
   3538  1.1  skrll 
   3539  1.1  skrll 	      /* This is it.  Expand the rule to the stack.  */
   3540  1.1  skrll 	      if (!xg_build_to_stack (istack, insn, rule->to_instr))
   3541  1.1  skrll 		return FALSE;
   3542  1.1  skrll 
   3543  1.1  skrll 	      /* Check to see if it fits.  */
   3544  1.1  skrll 	      for (i = stack_size; i < istack->ninsn; i++)
   3545  1.1  skrll 		{
   3546  1.1  skrll 		  TInsn *insn = &istack->insn[i];
   3547  1.1  skrll 
   3548  1.1  skrll 		  if (insn->insn_type == ITYPE_INSN
   3549  1.1  skrll 		      && !tinsn_has_symbolic_operands (insn)
   3550  1.1  skrll 		      && !xg_immeds_fit (insn))
   3551  1.1  skrll 		    {
   3552  1.1  skrll 		      istack->ninsn = stack_size;
   3553  1.1  skrll 		      return FALSE;
   3554  1.1  skrll 		    }
   3555  1.1  skrll 		}
   3556  1.1  skrll 	      return TRUE;
   3557  1.1  skrll 	    }
   3558  1.1  skrll 	  steps_taken++;
   3559  1.1  skrll 	}
   3560  1.1  skrll     }
   3561  1.1  skrll   return FALSE;
   3562  1.1  skrll }
   3563  1.1  skrll 
   3564  1.1  skrll 
   3565  1.1  skrll /* Relax the assembly instruction at least "min_steps".
   3567  1.1  skrll    Return the number of steps taken.
   3568  1.1  skrll 
   3569  1.1  skrll    For relaxation to correctly terminate, every relaxation chain must
   3570  1.1  skrll    terminate in one of two ways:
   3571  1.1  skrll 
   3572  1.1  skrll    1.  If the chain from one instruction to the next consists entirely of
   3573  1.1  skrll        single instructions, then the chain *must* handle all possible
   3574  1.1  skrll        immediates without failing.  It must not ever fail because an
   3575  1.1  skrll        immediate is out of range.  The MOVI.N -> MOVI -> L32R relaxation
   3576  1.1  skrll        chain is one example.  L32R loads 32 bits, and there cannot be an
   3577  1.1  skrll        immediate larger than 32 bits, so it satisfies this condition.
   3578  1.1  skrll        Single instruction relaxation chains are as defined by
   3579  1.1  skrll        xg_is_single_relaxable_instruction.
   3580  1.1  skrll 
   3581  1.1  skrll    2.  Otherwise, the chain must end in a multi-instruction expansion: e.g.,
   3582  1.1  skrll        BNEZ.N -> BNEZ -> BNEZ.W15 -> BENZ.N/J
   3583  1.1  skrll 
   3584  1.1  skrll    Strictly speaking, in most cases you can violate condition 1 and be OK
   3585  1.1  skrll    -- in particular when the last two instructions have the same single
   3586  1.1  skrll    size.  But nevertheless, you should guarantee the above two conditions.
   3587  1.1  skrll 
   3588  1.1  skrll    We could fix this so that single-instruction expansions correctly
   3589  1.1  skrll    terminate when they can't handle the range, but the error messages are
   3590  1.1  skrll    worse, and it actually turns out that in every case but one (18-bit wide
   3591  1.1  skrll    branches), you need a multi-instruction expansion to get the full range
   3592  1.1  skrll    anyway.  And because 18-bit branches are handled identically to 15-bit
   3593  1.1  skrll    branches, there isn't any point in changing it.  */
   3594  1.1  skrll 
   3595  1.1  skrll static int
   3596  1.1  skrll xg_assembly_relax (IStack *istack,
   3597  1.1  skrll 		   TInsn *insn,
   3598  1.1  skrll 		   segT pc_seg,
   3599  1.1  skrll 		   fragS *pc_frag,	/* if pc_frag == 0, not pc-relative */
   3600  1.1  skrll 		   offsetT pc_offset,	/* offset in fragment */
   3601  1.1  skrll 		   int min_steps,	/* minimum conversion steps */
   3602  1.1  skrll 		   long stretch)	/* number of bytes stretched so far */
   3603  1.1  skrll {
   3604  1.1  skrll   int steps_taken = 0;
   3605  1.1  skrll 
   3606  1.1  skrll   /* Some of its immeds don't fit.  Try to build a relaxed version.
   3607  1.1  skrll      This may go through a couple of stages of single instruction
   3608  1.1  skrll      transformations before we get there.  */
   3609  1.1  skrll 
   3610  1.1  skrll   TInsn single_target;
   3611  1.1  skrll   TInsn current_insn;
   3612  1.1  skrll   int lateral_steps = 0;
   3613  1.1  skrll   int istack_size = istack->ninsn;
   3614  1.1  skrll 
   3615  1.1  skrll   if (xg_symbolic_immeds_fit (insn, pc_seg, pc_frag, pc_offset, stretch)
   3616  1.1  skrll       && steps_taken >= min_steps)
   3617  1.1  skrll     {
   3618  1.1  skrll       istack_push (istack, insn);
   3619  1.1  skrll       return steps_taken;
   3620  1.1  skrll     }
   3621  1.1  skrll   current_insn = *insn;
   3622  1.1  skrll 
   3623  1.1  skrll   /* Walk through all of the single instruction expansions.  */
   3624  1.1  skrll   while (xg_is_single_relaxable_insn (&current_insn, &single_target, FALSE))
   3625  1.1  skrll     {
   3626  1.1  skrll       steps_taken++;
   3627  1.1  skrll       if (xg_symbolic_immeds_fit (&single_target, pc_seg, pc_frag, pc_offset,
   3628  1.1  skrll 				  stretch))
   3629  1.1  skrll 	{
   3630  1.1  skrll 	  if (steps_taken >= min_steps)
   3631  1.1  skrll 	    {
   3632  1.1  skrll 	      istack_push (istack, &single_target);
   3633  1.1  skrll 	      return steps_taken;
   3634  1.1  skrll 	    }
   3635  1.1  skrll 	}
   3636  1.1  skrll       current_insn = single_target;
   3637  1.1  skrll     }
   3638  1.1  skrll 
   3639  1.1  skrll   /* Now check for a multi-instruction expansion.  */
   3640  1.1  skrll   while (xg_is_relaxable_insn (&current_insn, lateral_steps))
   3641  1.1  skrll     {
   3642  1.1  skrll       if (xg_symbolic_immeds_fit (&current_insn, pc_seg, pc_frag, pc_offset,
   3643  1.1  skrll 				  stretch))
   3644  1.1  skrll 	{
   3645  1.1  skrll 	  if (steps_taken >= min_steps)
   3646  1.1  skrll 	    {
   3647  1.1  skrll 	      istack_push (istack, &current_insn);
   3648  1.1  skrll 	      return steps_taken;
   3649  1.1  skrll 	    }
   3650  1.1  skrll 	}
   3651  1.1  skrll       steps_taken++;
   3652  1.1  skrll       if (xg_expand_to_stack (istack, &current_insn, lateral_steps))
   3653  1.1  skrll 	{
   3654  1.1  skrll 	  if (steps_taken >= min_steps)
   3655  1.1  skrll 	    return steps_taken;
   3656  1.1  skrll 	}
   3657  1.1  skrll       lateral_steps++;
   3658  1.1  skrll       istack->ninsn = istack_size;
   3659  1.1  skrll     }
   3660  1.1  skrll 
   3661  1.1  skrll   /* It's not going to work -- use the original.  */
   3662  1.1  skrll   istack_push (istack, insn);
   3663  1.1  skrll   return steps_taken;
   3664  1.1  skrll }
   3665  1.1  skrll 
   3666  1.1  skrll 
   3667  1.1  skrll static void
   3668  1.1  skrll xg_finish_frag (char *last_insn,
   3669  1.1  skrll 		enum xtensa_relax_statesE frag_state,
   3670  1.1  skrll 		enum xtensa_relax_statesE slot0_state,
   3671  1.1  skrll 		int max_growth,
   3672  1.1  skrll 		bfd_boolean is_insn)
   3673  1.1  skrll {
   3674  1.1  skrll   /* Finish off this fragment so that it has at LEAST the desired
   3675  1.1  skrll      max_growth.  If it doesn't fit in this fragment, close this one
   3676  1.1  skrll      and start a new one.  In either case, return a pointer to the
   3677  1.1  skrll      beginning of the growth area.  */
   3678  1.1  skrll 
   3679  1.1  skrll   fragS *old_frag;
   3680  1.1  skrll 
   3681  1.1  skrll   frag_grow (max_growth);
   3682  1.1  skrll   old_frag = frag_now;
   3683  1.1  skrll 
   3684  1.1  skrll   frag_now->fr_opcode = last_insn;
   3685  1.1  skrll   if (is_insn)
   3686  1.1  skrll     frag_now->tc_frag_data.is_insn = TRUE;
   3687  1.1  skrll 
   3688  1.1  skrll   frag_var (rs_machine_dependent, max_growth, max_growth,
   3689  1.1  skrll 	    frag_state, frag_now->fr_symbol, frag_now->fr_offset, last_insn);
   3690  1.1  skrll 
   3691  1.1  skrll   old_frag->tc_frag_data.slot_subtypes[0] = slot0_state;
   3692  1.1  skrll   xtensa_set_frag_assembly_state (frag_now);
   3693  1.1  skrll 
   3694  1.1  skrll   /* Just to make sure that we did not split it up.  */
   3695  1.1  skrll   assert (old_frag->fr_next == frag_now);
   3696  1.1  skrll }
   3697  1.1  skrll 
   3698  1.1  skrll 
   3699  1.1  skrll /* Return TRUE if the target frag is one of the next non-empty frags.  */
   3700  1.1  skrll 
   3701  1.1  skrll static bfd_boolean
   3702  1.1  skrll is_next_frag_target (const fragS *fragP, const fragS *target)
   3703  1.1  skrll {
   3704  1.1  skrll   if (fragP == NULL)
   3705  1.1  skrll     return FALSE;
   3706  1.1  skrll 
   3707  1.1  skrll   for (; fragP; fragP = fragP->fr_next)
   3708  1.1  skrll     {
   3709  1.1  skrll       if (fragP == target)
   3710  1.1  skrll 	return TRUE;
   3711  1.1  skrll       if (fragP->fr_fix != 0)
   3712  1.1  skrll 	return FALSE;
   3713  1.1  skrll       if (fragP->fr_type == rs_fill && fragP->fr_offset != 0)
   3714  1.1  skrll 	return FALSE;
   3715  1.1  skrll       if ((fragP->fr_type == rs_align || fragP->fr_type == rs_align_code)
   3716  1.1  skrll 	  && ((fragP->fr_address % (1 << fragP->fr_offset)) != 0))
   3717  1.1  skrll 	return FALSE;
   3718  1.1  skrll       if (fragP->fr_type == rs_space)
   3719  1.1  skrll 	return FALSE;
   3720  1.1  skrll     }
   3721  1.1  skrll   return FALSE;
   3722  1.1  skrll }
   3723  1.1  skrll 
   3724  1.1  skrll 
   3725  1.1  skrll static bfd_boolean
   3726  1.1  skrll is_branch_jmp_to_next (TInsn *insn, fragS *fragP)
   3727  1.1  skrll {
   3728  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   3729  1.1  skrll   int i;
   3730  1.1  skrll   int num_ops = xtensa_opcode_num_operands (isa, insn->opcode);
   3731  1.1  skrll   int target_op = -1;
   3732  1.1  skrll   symbolS *sym;
   3733  1.1  skrll   fragS *target_frag;
   3734  1.1  skrll 
   3735  1.1  skrll   if (xtensa_opcode_is_branch (isa, insn->opcode) != 1
   3736  1.1  skrll       && xtensa_opcode_is_jump (isa, insn->opcode) != 1)
   3737  1.1  skrll     return FALSE;
   3738  1.1  skrll 
   3739  1.1  skrll   for (i = 0; i < num_ops; i++)
   3740  1.1  skrll     {
   3741  1.1  skrll       if (xtensa_operand_is_PCrelative (isa, insn->opcode, i) == 1)
   3742  1.1  skrll 	{
   3743  1.1  skrll 	  target_op = i;
   3744  1.1  skrll 	  break;
   3745  1.1  skrll 	}
   3746  1.1  skrll     }
   3747  1.1  skrll   if (target_op == -1)
   3748  1.1  skrll     return FALSE;
   3749  1.1  skrll 
   3750  1.1  skrll   if (insn->ntok <= target_op)
   3751  1.1  skrll     return FALSE;
   3752  1.1  skrll 
   3753  1.1  skrll   if (insn->tok[target_op].X_op != O_symbol)
   3754  1.1  skrll     return FALSE;
   3755  1.1  skrll 
   3756  1.1  skrll   sym = insn->tok[target_op].X_add_symbol;
   3757  1.1  skrll   if (sym == NULL)
   3758  1.1  skrll     return FALSE;
   3759  1.1  skrll 
   3760  1.1  skrll   if (insn->tok[target_op].X_add_number != 0)
   3761  1.1  skrll     return FALSE;
   3762  1.1  skrll 
   3763  1.1  skrll   target_frag = symbol_get_frag (sym);
   3764  1.1  skrll   if (target_frag == NULL)
   3765  1.1  skrll     return FALSE;
   3766  1.1  skrll 
   3767  1.1  skrll   if (is_next_frag_target (fragP->fr_next, target_frag)
   3768  1.1  skrll       && S_GET_VALUE (sym) == target_frag->fr_address)
   3769  1.1  skrll     return TRUE;
   3770  1.1  skrll 
   3771  1.1  skrll   return FALSE;
   3772  1.1  skrll }
   3773  1.1  skrll 
   3774  1.1  skrll 
   3775  1.1  skrll static void
   3776  1.1  skrll xg_add_branch_and_loop_targets (TInsn *insn)
   3777  1.1  skrll {
   3778  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   3779  1.1  skrll   int num_ops = xtensa_opcode_num_operands (isa, insn->opcode);
   3780  1.1  skrll 
   3781  1.1  skrll   if (xtensa_opcode_is_loop (isa, insn->opcode) == 1)
   3782  1.1  skrll     {
   3783  1.1  skrll       int i = 1;
   3784  1.1  skrll       if (xtensa_operand_is_PCrelative (isa, insn->opcode, i) == 1
   3785  1.1  skrll 	  && insn->tok[i].X_op == O_symbol)
   3786  1.1  skrll 	symbol_get_tc (insn->tok[i].X_add_symbol)->is_loop_target = TRUE;
   3787  1.1  skrll       return;
   3788  1.1  skrll     }
   3789  1.1  skrll 
   3790  1.1  skrll   if (xtensa_opcode_is_branch (isa, insn->opcode) == 1
   3791  1.1  skrll       || xtensa_opcode_is_loop (isa, insn->opcode) == 1)
   3792  1.1  skrll     {
   3793  1.1  skrll       int i;
   3794  1.1  skrll 
   3795  1.1  skrll       for (i = 0; i < insn->ntok && i < num_ops; i++)
   3796  1.1  skrll 	{
   3797  1.1  skrll 	  if (xtensa_operand_is_PCrelative (isa, insn->opcode, i) == 1
   3798  1.1  skrll 	      && insn->tok[i].X_op == O_symbol)
   3799  1.1  skrll 	    {
   3800  1.1  skrll 	      symbolS *sym = insn->tok[i].X_add_symbol;
   3801  1.1  skrll 	      symbol_get_tc (sym)->is_branch_target = TRUE;
   3802  1.1  skrll 	      if (S_IS_DEFINED (sym))
   3803  1.1  skrll 		symbol_get_frag (sym)->tc_frag_data.is_branch_target = TRUE;
   3804  1.1  skrll 	    }
   3805  1.1  skrll 	}
   3806  1.1  skrll     }
   3807  1.1  skrll }
   3808  1.1  skrll 
   3809  1.1  skrll 
   3810  1.1  skrll /* Return FALSE if no error.  */
   3811  1.1  skrll 
   3812  1.1  skrll static bfd_boolean
   3813  1.1  skrll xg_build_token_insn (BuildInstr *instr_spec, TInsn *old_insn, TInsn *new_insn)
   3814  1.1  skrll {
   3815  1.1  skrll   int num_ops = 0;
   3816  1.1  skrll   BuildOp *b_op;
   3817  1.1  skrll 
   3818  1.1  skrll   switch (instr_spec->typ)
   3819  1.1  skrll     {
   3820  1.1  skrll     case INSTR_INSTR:
   3821  1.1  skrll       new_insn->insn_type = ITYPE_INSN;
   3822  1.1  skrll       new_insn->opcode = instr_spec->opcode;
   3823  1.1  skrll       break;
   3824  1.1  skrll     case INSTR_LITERAL_DEF:
   3825  1.1  skrll       new_insn->insn_type = ITYPE_LITERAL;
   3826  1.1  skrll       new_insn->opcode = XTENSA_UNDEFINED;
   3827  1.1  skrll       break;
   3828  1.1  skrll     case INSTR_LABEL_DEF:
   3829  1.1  skrll       abort ();
   3830  1.1  skrll     }
   3831  1.1  skrll   new_insn->is_specific_opcode = FALSE;
   3832  1.1  skrll   new_insn->debug_line = old_insn->debug_line;
   3833  1.1  skrll   new_insn->loc_directive_seen = old_insn->loc_directive_seen;
   3834  1.1  skrll 
   3835  1.1  skrll   for (b_op = instr_spec->ops; b_op != NULL; b_op = b_op->next)
   3836  1.1  skrll     {
   3837  1.1  skrll       expressionS *exp;
   3838  1.1  skrll       const expressionS *src_exp;
   3839  1.1  skrll 
   3840  1.1  skrll       num_ops++;
   3841  1.1  skrll       switch (b_op->typ)
   3842  1.1  skrll 	{
   3843  1.1  skrll 	case OP_CONSTANT:
   3844  1.1  skrll 	  /* The expression must be the constant.  */
   3845  1.1  skrll 	  assert (b_op->op_num < MAX_INSN_ARGS);
   3846  1.1  skrll 	  exp = &new_insn->tok[b_op->op_num];
   3847  1.1  skrll 	  set_expr_const (exp, b_op->op_data);
   3848  1.1  skrll 	  break;
   3849  1.1  skrll 
   3850  1.1  skrll 	case OP_OPERAND:
   3851  1.1  skrll 	  assert (b_op->op_num < MAX_INSN_ARGS);
   3852  1.1  skrll 	  assert (b_op->op_data < (unsigned) old_insn->ntok);
   3853  1.1  skrll 	  src_exp = &old_insn->tok[b_op->op_data];
   3854  1.1  skrll 	  exp = &new_insn->tok[b_op->op_num];
   3855  1.1  skrll 	  copy_expr (exp, src_exp);
   3856  1.1  skrll 	  break;
   3857  1.1  skrll 
   3858  1.1  skrll 	case OP_LITERAL:
   3859  1.1  skrll 	case OP_LABEL:
   3860  1.1  skrll 	  as_bad (_("can't handle generation of literal/labels yet"));
   3861  1.1  skrll 	  assert (0);
   3862  1.1  skrll 
   3863  1.1  skrll 	default:
   3864  1.1  skrll 	  as_bad (_("can't handle undefined OP TYPE"));
   3865  1.1  skrll 	  assert (0);
   3866  1.1  skrll 	}
   3867  1.1  skrll     }
   3868  1.1  skrll 
   3869  1.1  skrll   new_insn->ntok = num_ops;
   3870  1.1  skrll   return FALSE;
   3871  1.1  skrll }
   3872  1.1  skrll 
   3873  1.1  skrll 
   3874  1.1  skrll /* Return TRUE if it was simplified.  */
   3875  1.1  skrll 
   3876  1.1  skrll static bfd_boolean
   3877  1.1  skrll xg_simplify_insn (TInsn *old_insn, TInsn *new_insn)
   3878  1.1  skrll {
   3879  1.1  skrll   TransitionRule *rule;
   3880  1.1  skrll   BuildInstr *insn_spec;
   3881  1.1  skrll 
   3882  1.1  skrll   if (old_insn->is_specific_opcode || !density_supported)
   3883  1.1  skrll     return FALSE;
   3884  1.1  skrll 
   3885  1.1  skrll   rule = xg_instruction_match (old_insn);
   3886  1.1  skrll   if (rule == NULL)
   3887  1.1  skrll     return FALSE;
   3888  1.1  skrll 
   3889  1.1  skrll   insn_spec = rule->to_instr;
   3890  1.1  skrll   /* There should only be one.  */
   3891  1.1  skrll   assert (insn_spec != NULL);
   3892  1.1  skrll   assert (insn_spec->next == NULL);
   3893  1.1  skrll   if (insn_spec->next != NULL)
   3894  1.1  skrll     return FALSE;
   3895  1.1  skrll 
   3896  1.1  skrll   xg_build_token_insn (insn_spec, old_insn, new_insn);
   3897  1.1  skrll 
   3898  1.1  skrll   return TRUE;
   3899  1.1  skrll }
   3900  1.1  skrll 
   3901  1.1  skrll 
   3902  1.1  skrll /* xg_expand_assembly_insn: (1) Simplify the instruction, i.e., l32i ->
   3903  1.1  skrll    l32i.n. (2) Check the number of operands.  (3) Place the instruction
   3904  1.1  skrll    tokens into the stack or relax it and place multiple
   3905  1.1  skrll    instructions/literals onto the stack.  Return FALSE if no error.  */
   3906  1.1  skrll 
   3907  1.1  skrll static bfd_boolean
   3908  1.1  skrll xg_expand_assembly_insn (IStack *istack, TInsn *orig_insn)
   3909  1.1  skrll {
   3910  1.1  skrll   int noperands;
   3911  1.1  skrll   TInsn new_insn;
   3912  1.1  skrll   bfd_boolean do_expand;
   3913  1.1  skrll 
   3914  1.1  skrll   tinsn_init (&new_insn);
   3915  1.1  skrll 
   3916  1.1  skrll   /* Narrow it if we can.  xg_simplify_insn now does all the
   3917  1.1  skrll      appropriate checking (e.g., for the density option).  */
   3918  1.1  skrll   if (xg_simplify_insn (orig_insn, &new_insn))
   3919  1.1  skrll     orig_insn = &new_insn;
   3920  1.1  skrll 
   3921  1.1  skrll   noperands = xtensa_opcode_num_operands (xtensa_default_isa,
   3922  1.1  skrll 					  orig_insn->opcode);
   3923  1.1  skrll   if (orig_insn->ntok < noperands)
   3924  1.1  skrll     {
   3925  1.1  skrll       as_bad (_("found %d operands for '%s':  Expected %d"),
   3926  1.1  skrll 	      orig_insn->ntok,
   3927  1.1  skrll 	      xtensa_opcode_name (xtensa_default_isa, orig_insn->opcode),
   3928  1.1  skrll 	      noperands);
   3929  1.1  skrll       return TRUE;
   3930  1.1  skrll     }
   3931  1.1  skrll   if (orig_insn->ntok > noperands)
   3932  1.1  skrll     as_warn (_("found too many (%d) operands for '%s':  Expected %d"),
   3933  1.1  skrll 	     orig_insn->ntok,
   3934  1.1  skrll 	     xtensa_opcode_name (xtensa_default_isa, orig_insn->opcode),
   3935  1.1  skrll 	     noperands);
   3936  1.1  skrll 
   3937  1.1  skrll   /* If there are not enough operands, we will assert above.  If there
   3938  1.1  skrll      are too many, just cut out the extras here.  */
   3939  1.1  skrll   orig_insn->ntok = noperands;
   3940  1.1  skrll 
   3941  1.1  skrll   if (tinsn_has_invalid_symbolic_operands (orig_insn))
   3942  1.1  skrll     return TRUE;
   3943  1.1  skrll 
   3944  1.1  skrll   /* Special case for extui opcode which has constraints not handled
   3945  1.1  skrll      by the ordinary operand encoding checks.  The number of operands
   3946  1.1  skrll      and related syntax issues have already been checked.  */
   3947  1.1  skrll   if (orig_insn->opcode == xtensa_extui_opcode)
   3948  1.1  skrll     {
   3949  1.1  skrll       int shiftimm = orig_insn->tok[2].X_add_number;
   3950  1.1  skrll       int maskimm = orig_insn->tok[3].X_add_number;
   3951  1.1  skrll       if (shiftimm + maskimm > 32)
   3952  1.1  skrll 	{
   3953  1.1  skrll 	  as_bad (_("immediate operands sum to greater than 32"));
   3954  1.1  skrll 	  return TRUE;
   3955  1.1  skrll 	}
   3956  1.1  skrll     }
   3957  1.1  skrll 
   3958  1.1  skrll   /* If the instruction will definitely need to be relaxed, it is better
   3959  1.1  skrll      to expand it now for better scheduling.  Decide whether to expand
   3960  1.1  skrll      now....  */
   3961  1.1  skrll   do_expand = (!orig_insn->is_specific_opcode && use_transform ());
   3962  1.1  skrll 
   3963  1.1  skrll   /* Calls should be expanded to longcalls only in the backend relaxation
   3964  1.1  skrll      so that the assembly scheduler will keep the L32R/CALLX instructions
   3965  1.1  skrll      adjacent.  */
   3966  1.1  skrll   if (is_direct_call_opcode (orig_insn->opcode))
   3967  1.1  skrll     do_expand = FALSE;
   3968  1.1  skrll 
   3969  1.1  skrll   if (tinsn_has_symbolic_operands (orig_insn))
   3970  1.1  skrll     {
   3971  1.1  skrll       /* The values of symbolic operands are not known yet, so only expand
   3972  1.1  skrll 	 now if an operand is "complex" (e.g., difference of symbols) and
   3973  1.1  skrll 	 will have to be stored as a literal regardless of the value.  */
   3974  1.1  skrll       if (!tinsn_has_complex_operands (orig_insn))
   3975  1.1  skrll 	do_expand = FALSE;
   3976  1.1  skrll     }
   3977  1.1  skrll   else if (xg_immeds_fit (orig_insn))
   3978  1.1  skrll     do_expand = FALSE;
   3979  1.1  skrll 
   3980  1.1  skrll   if (do_expand)
   3981  1.1  skrll     xg_assembly_relax (istack, orig_insn, 0, 0, 0, 0, 0);
   3982  1.1  skrll   else
   3983  1.1  skrll     istack_push (istack, orig_insn);
   3984  1.1  skrll 
   3985  1.1  skrll   return FALSE;
   3986  1.1  skrll }
   3987  1.1  skrll 
   3988  1.1  skrll 
   3989  1.1  skrll /* Return TRUE if the section flags are marked linkonce
   3990  1.1  skrll    or the name is .gnu.linkonce.*.  */
   3991  1.1  skrll 
   3992  1.1  skrll static int linkonce_len = sizeof (".gnu.linkonce.") - 1;
   3993  1.1  skrll 
   3994  1.1  skrll static bfd_boolean
   3995  1.1  skrll get_is_linkonce_section (bfd *abfd ATTRIBUTE_UNUSED, segT sec)
   3996  1.1  skrll {
   3997  1.1  skrll   flagword flags, link_once_flags;
   3998  1.1  skrll 
   3999  1.1  skrll   flags = bfd_get_section_flags (abfd, sec);
   4000  1.1  skrll   link_once_flags = (flags & SEC_LINK_ONCE);
   4001  1.1  skrll 
   4002  1.1  skrll   /* Flags might not be set yet.  */
   4003  1.1  skrll   if (!link_once_flags
   4004  1.1  skrll       && strncmp (segment_name (sec), ".gnu.linkonce.", linkonce_len) == 0)
   4005  1.1  skrll     link_once_flags = SEC_LINK_ONCE;
   4006  1.1  skrll 
   4007  1.1  skrll   return (link_once_flags != 0);
   4008  1.1  skrll }
   4009  1.1  skrll 
   4010  1.1  skrll 
   4011  1.1  skrll static void
   4012  1.1  skrll xtensa_add_literal_sym (symbolS *sym)
   4013  1.1  skrll {
   4014  1.1  skrll   sym_list *l;
   4015  1.1  skrll 
   4016  1.1  skrll   l = (sym_list *) xmalloc (sizeof (sym_list));
   4017  1.1  skrll   l->sym = sym;
   4018  1.1  skrll   l->next = literal_syms;
   4019  1.1  skrll   literal_syms = l;
   4020  1.1  skrll }
   4021  1.1  skrll 
   4022  1.1  skrll 
   4023  1.1  skrll static symbolS *
   4024  1.1  skrll xtensa_create_literal_symbol (segT sec, fragS *frag)
   4025  1.1  skrll {
   4026  1.1  skrll   static int lit_num = 0;
   4027  1.1  skrll   static char name[256];
   4028  1.1  skrll   symbolS *symbolP;
   4029  1.1  skrll 
   4030  1.1  skrll   sprintf (name, ".L_lit_sym%d", lit_num);
   4031  1.1  skrll 
   4032  1.1  skrll   /* Create a local symbol.  If it is in a linkonce section, we have to
   4033  1.1  skrll      be careful to make sure that if it is used in a relocation that the
   4034  1.1  skrll      symbol will be in the output file.  */
   4035  1.1  skrll   if (get_is_linkonce_section (stdoutput, sec))
   4036  1.1  skrll     {
   4037  1.1  skrll       symbolP = symbol_new (name, sec, 0, frag);
   4038  1.1  skrll       S_CLEAR_EXTERNAL (symbolP);
   4039  1.1  skrll       /* symbolP->local = 1; */
   4040  1.1  skrll     }
   4041  1.1  skrll   else
   4042  1.1  skrll     symbolP = symbol_new (name, sec, 0, frag);
   4043  1.1  skrll 
   4044  1.1  skrll   xtensa_add_literal_sym (symbolP);
   4045  1.1  skrll 
   4046  1.1  skrll   lit_num++;
   4047  1.1  skrll   return symbolP;
   4048  1.1  skrll }
   4049  1.1  skrll 
   4050  1.1  skrll 
   4051  1.1  skrll /* Currently all literals that are generated here are 32-bit L32R targets.  */
   4052  1.1  skrll 
   4053  1.1  skrll static symbolS *
   4054  1.1  skrll xg_assemble_literal (/* const */ TInsn *insn)
   4055  1.1  skrll {
   4056  1.1  skrll   emit_state state;
   4057  1.1  skrll   symbolS *lit_sym = NULL;
   4058  1.1  skrll   bfd_reloc_code_real_type reloc;
   4059  1.1  skrll   bfd_boolean pcrel = FALSE;
   4060  1.1  skrll   char *p;
   4061  1.1  skrll 
   4062  1.1  skrll   /* size = 4 for L32R.  It could easily be larger when we move to
   4063  1.1  skrll      larger constants.  Add a parameter later.  */
   4064  1.1  skrll   offsetT litsize = 4;
   4065  1.1  skrll   offsetT litalign = 2;		/* 2^2 = 4 */
   4066  1.1  skrll   expressionS saved_loc;
   4067  1.1  skrll   expressionS * emit_val;
   4068  1.1  skrll 
   4069  1.1  skrll   set_expr_symbol_offset (&saved_loc, frag_now->fr_symbol, frag_now_fix ());
   4070  1.1  skrll 
   4071  1.1  skrll   assert (insn->insn_type == ITYPE_LITERAL);
   4072  1.1  skrll   assert (insn->ntok == 1);	/* must be only one token here */
   4073  1.1  skrll 
   4074  1.1  skrll   xtensa_switch_to_literal_fragment (&state);
   4075  1.1  skrll 
   4076  1.1  skrll   emit_val = &insn->tok[0];
   4077  1.1  skrll   if (emit_val->X_op == O_big)
   4078  1.1  skrll     {
   4079  1.1  skrll       int size = emit_val->X_add_number * CHARS_PER_LITTLENUM;
   4080  1.1  skrll       if (size > litsize)
   4081  1.1  skrll 	{
   4082  1.1  skrll 	  /* This happens when someone writes a "movi a2, big_number".  */
   4083  1.1  skrll 	  as_bad_where (frag_now->fr_file, frag_now->fr_line,
   4084  1.1  skrll 			_("invalid immediate"));
   4085  1.1  skrll 	  xtensa_restore_emit_state (&state);
   4086  1.1  skrll 	  return NULL;
   4087  1.1  skrll 	}
   4088  1.1  skrll     }
   4089  1.1  skrll 
   4090  1.1  skrll   /* Force a 4-byte align here.  Note that this opens a new frag, so all
   4091  1.1  skrll      literals done with this function have a frag to themselves.  That's
   4092  1.1  skrll      important for the way text section literals work.  */
   4093  1.1  skrll   frag_align (litalign, 0, 0);
   4094  1.1  skrll   record_alignment (now_seg, litalign);
   4095  1.1  skrll 
   4096  1.1  skrll   switch (emit_val->X_op)
   4097  1.1  skrll     {
   4098  1.1  skrll     case O_pcrel:
   4099  1.1  skrll       pcrel = TRUE;
   4100  1.1  skrll       /* fall through */
   4101  1.1  skrll     case O_pltrel:
   4102  1.1  skrll     case O_tlsfunc:
   4103  1.1  skrll     case O_tlsarg:
   4104  1.1  skrll     case O_tpoff:
   4105  1.1  skrll     case O_dtpoff:
   4106  1.1  skrll       p = frag_more (litsize);
   4107  1.1  skrll       xtensa_set_frag_assembly_state (frag_now);
   4108  1.1  skrll       reloc = map_operator_to_reloc (emit_val->X_op, TRUE);
   4109  1.1  skrll       if (emit_val->X_add_symbol)
   4110  1.1  skrll 	emit_val->X_op = O_symbol;
   4111  1.1  skrll       else
   4112  1.1  skrll 	emit_val->X_op = O_constant;
   4113  1.1  skrll       fix_new_exp (frag_now, p - frag_now->fr_literal,
   4114  1.1  skrll 		   litsize, emit_val, pcrel, reloc);
   4115  1.1  skrll       break;
   4116  1.1  skrll 
   4117  1.1  skrll     default:
   4118  1.1  skrll       emit_expr (emit_val, litsize);
   4119  1.1  skrll       break;
   4120  1.1  skrll     }
   4121  1.1  skrll 
   4122  1.1  skrll   assert (frag_now->tc_frag_data.literal_frag == NULL);
   4123  1.1  skrll   frag_now->tc_frag_data.literal_frag = get_literal_pool_location (now_seg);
   4124  1.1  skrll   frag_now->fr_symbol = xtensa_create_literal_symbol (now_seg, frag_now);
   4125  1.1  skrll   lit_sym = frag_now->fr_symbol;
   4126  1.1  skrll 
   4127  1.1  skrll   /* Go back.  */
   4128  1.1  skrll   xtensa_restore_emit_state (&state);
   4129  1.1  skrll   return lit_sym;
   4130  1.1  skrll }
   4131  1.1  skrll 
   4132  1.1  skrll 
   4133  1.1  skrll static void
   4134  1.1  skrll xg_assemble_literal_space (/* const */ int size, int slot)
   4135  1.1  skrll {
   4136  1.1  skrll   emit_state state;
   4137  1.1  skrll   /* We might have to do something about this alignment.  It only
   4138  1.1  skrll      takes effect if something is placed here.  */
   4139  1.1  skrll   offsetT litalign = 2;		/* 2^2 = 4 */
   4140  1.1  skrll   fragS *lit_saved_frag;
   4141  1.1  skrll 
   4142  1.1  skrll   assert (size % 4 == 0);
   4143  1.1  skrll 
   4144  1.1  skrll   xtensa_switch_to_literal_fragment (&state);
   4145  1.1  skrll 
   4146  1.1  skrll   /* Force a 4-byte align here.  */
   4147  1.1  skrll   frag_align (litalign, 0, 0);
   4148  1.1  skrll   record_alignment (now_seg, litalign);
   4149  1.1  skrll 
   4150  1.1  skrll   frag_grow (size);
   4151  1.1  skrll 
   4152  1.1  skrll   lit_saved_frag = frag_now;
   4153  1.1  skrll   frag_now->tc_frag_data.literal_frag = get_literal_pool_location (now_seg);
   4154  1.1  skrll   frag_now->fr_symbol = xtensa_create_literal_symbol (now_seg, frag_now);
   4155  1.1  skrll   xg_finish_frag (0, RELAX_LITERAL, 0, size, FALSE);
   4156  1.1  skrll 
   4157  1.1  skrll   /* Go back.  */
   4158  1.1  skrll   xtensa_restore_emit_state (&state);
   4159  1.1  skrll   frag_now->tc_frag_data.literal_frags[slot] = lit_saved_frag;
   4160  1.1  skrll }
   4161  1.1  skrll 
   4162  1.1  skrll 
   4163  1.1  skrll /* Put in a fixup record based on the opcode.
   4164  1.1  skrll    Return TRUE on success.  */
   4165  1.1  skrll 
   4166  1.1  skrll static bfd_boolean
   4167  1.1  skrll xg_add_opcode_fix (TInsn *tinsn,
   4168  1.1  skrll 		   int opnum,
   4169  1.1  skrll 		   xtensa_format fmt,
   4170  1.1  skrll 		   int slot,
   4171  1.1  skrll 		   expressionS *expr,
   4172  1.1  skrll 		   fragS *fragP,
   4173  1.1  skrll 		   offsetT offset)
   4174  1.1  skrll {
   4175  1.1  skrll   xtensa_opcode opcode = tinsn->opcode;
   4176  1.1  skrll   bfd_reloc_code_real_type reloc;
   4177  1.1  skrll   reloc_howto_type *howto;
   4178  1.1  skrll   int fmt_length;
   4179  1.1  skrll   fixS *the_fix;
   4180  1.1  skrll 
   4181  1.1  skrll   reloc = BFD_RELOC_NONE;
   4182  1.1  skrll 
   4183  1.1  skrll   /* First try the special cases for "alternate" relocs.  */
   4184  1.1  skrll   if (opcode == xtensa_l32r_opcode)
   4185  1.1  skrll     {
   4186  1.1  skrll       if (fragP->tc_frag_data.use_absolute_literals)
   4187  1.1  skrll 	reloc = encode_alt_reloc (slot);
   4188  1.1  skrll     }
   4189  1.1  skrll   else if (opcode == xtensa_const16_opcode)
   4190  1.1  skrll     {
   4191  1.1  skrll       if (expr->X_op == O_lo16)
   4192  1.1  skrll 	{
   4193  1.1  skrll 	  reloc = encode_reloc (slot);
   4194  1.1  skrll 	  expr->X_op = O_symbol;
   4195  1.1  skrll 	}
   4196  1.1  skrll       else if (expr->X_op == O_hi16)
   4197  1.1  skrll 	{
   4198  1.1  skrll 	  reloc = encode_alt_reloc (slot);
   4199  1.1  skrll 	  expr->X_op = O_symbol;
   4200  1.1  skrll 	}
   4201  1.1  skrll     }
   4202  1.1  skrll 
   4203  1.1  skrll   if (opnum != get_relaxable_immed (opcode))
   4204  1.1  skrll     {
   4205  1.1  skrll       as_bad (_("invalid relocation for operand %i of '%s'"),
   4206  1.1  skrll 	      opnum + 1, xtensa_opcode_name (xtensa_default_isa, opcode));
   4207  1.1  skrll       return FALSE;
   4208  1.1  skrll     }
   4209  1.1  skrll 
   4210  1.1  skrll   /* Handle erroneous "@h" and "@l" expressions here before they propagate
   4211  1.1  skrll      into the symbol table where the generic portions of the assembler
   4212  1.1  skrll      won't know what to do with them.  */
   4213  1.1  skrll   if (expr->X_op == O_lo16 || expr->X_op == O_hi16)
   4214  1.1  skrll     {
   4215  1.1  skrll       as_bad (_("invalid expression for operand %i of '%s'"),
   4216  1.1  skrll 	      opnum + 1, xtensa_opcode_name (xtensa_default_isa, opcode));
   4217  1.1  skrll       return FALSE;
   4218  1.1  skrll     }
   4219  1.1  skrll 
   4220  1.1  skrll   /* Next try the generic relocs.  */
   4221  1.1  skrll   if (reloc == BFD_RELOC_NONE)
   4222  1.1  skrll     reloc = encode_reloc (slot);
   4223  1.1  skrll   if (reloc == BFD_RELOC_NONE)
   4224  1.1  skrll     {
   4225  1.1  skrll       as_bad (_("invalid relocation in instruction slot %i"), slot);
   4226  1.1  skrll       return FALSE;
   4227  1.1  skrll     }
   4228  1.1  skrll 
   4229  1.1  skrll   howto = bfd_reloc_type_lookup (stdoutput, reloc);
   4230  1.1  skrll   if (!howto)
   4231  1.1  skrll     {
   4232  1.1  skrll       as_bad (_("undefined symbol for opcode \"%s\""),
   4233  1.1  skrll 	      xtensa_opcode_name (xtensa_default_isa, opcode));
   4234  1.1  skrll       return FALSE;
   4235  1.1  skrll     }
   4236  1.1  skrll 
   4237  1.1  skrll   fmt_length = xtensa_format_length (xtensa_default_isa, fmt);
   4238  1.1  skrll   the_fix = fix_new_exp (fragP, offset, fmt_length, expr,
   4239  1.1  skrll 			 howto->pc_relative, reloc);
   4240  1.1  skrll   the_fix->fx_no_overflow = 1;
   4241  1.1  skrll   the_fix->tc_fix_data.X_add_symbol = expr->X_add_symbol;
   4242  1.1  skrll   the_fix->tc_fix_data.X_add_number = expr->X_add_number;
   4243  1.1  skrll   the_fix->tc_fix_data.slot = slot;
   4244  1.1  skrll 
   4245  1.1  skrll   return TRUE;
   4246  1.1  skrll }
   4247  1.1  skrll 
   4248  1.1  skrll 
   4249  1.1  skrll static bfd_boolean
   4250  1.1  skrll xg_emit_insn_to_buf (TInsn *tinsn,
   4251  1.1  skrll 		     char *buf,
   4252  1.1  skrll 		     fragS *fragP,
   4253  1.1  skrll 		     offsetT offset,
   4254  1.1  skrll 		     bfd_boolean build_fix)
   4255  1.1  skrll {
   4256  1.1  skrll   static xtensa_insnbuf insnbuf = NULL;
   4257  1.1  skrll   bfd_boolean has_symbolic_immed = FALSE;
   4258  1.1  skrll   bfd_boolean ok = TRUE;
   4259  1.1  skrll 
   4260  1.1  skrll   if (!insnbuf)
   4261  1.1  skrll     insnbuf = xtensa_insnbuf_alloc (xtensa_default_isa);
   4262  1.1  skrll 
   4263  1.1  skrll   has_symbolic_immed = tinsn_to_insnbuf (tinsn, insnbuf);
   4264  1.1  skrll   if (has_symbolic_immed && build_fix)
   4265  1.1  skrll     {
   4266  1.1  skrll       /* Add a fixup.  */
   4267  1.1  skrll       xtensa_format fmt = xg_get_single_format (tinsn->opcode);
   4268  1.1  skrll       int slot = xg_get_single_slot (tinsn->opcode);
   4269  1.1  skrll       int opnum = get_relaxable_immed (tinsn->opcode);
   4270  1.1  skrll       expressionS *exp = &tinsn->tok[opnum];
   4271  1.1  skrll 
   4272  1.1  skrll       if (!xg_add_opcode_fix (tinsn, opnum, fmt, slot, exp, fragP, offset))
   4273  1.1  skrll 	ok = FALSE;
   4274  1.1  skrll     }
   4275  1.1  skrll   fragP->tc_frag_data.is_insn = TRUE;
   4276  1.1  skrll   xtensa_insnbuf_to_chars (xtensa_default_isa, insnbuf,
   4277  1.1  skrll 			   (unsigned char *) buf, 0);
   4278  1.1  skrll   return ok;
   4279  1.1  skrll }
   4280  1.1  skrll 
   4281  1.1  skrll 
   4282  1.1  skrll static void
   4283  1.1  skrll xg_resolve_literals (TInsn *insn, symbolS *lit_sym)
   4284  1.1  skrll {
   4285  1.1  skrll   symbolS *sym = get_special_literal_symbol ();
   4286  1.1  skrll   int i;
   4287  1.1  skrll   if (lit_sym == 0)
   4288  1.1  skrll     return;
   4289  1.1  skrll   assert (insn->insn_type == ITYPE_INSN);
   4290  1.1  skrll   for (i = 0; i < insn->ntok; i++)
   4291  1.1  skrll     if (insn->tok[i].X_add_symbol == sym)
   4292  1.1  skrll       insn->tok[i].X_add_symbol = lit_sym;
   4293  1.1  skrll 
   4294  1.1  skrll }
   4295  1.1  skrll 
   4296  1.1  skrll 
   4297  1.1  skrll static void
   4298  1.1  skrll xg_resolve_labels (TInsn *insn, symbolS *label_sym)
   4299  1.1  skrll {
   4300  1.1  skrll   symbolS *sym = get_special_label_symbol ();
   4301  1.1  skrll   int i;
   4302  1.1  skrll   for (i = 0; i < insn->ntok; i++)
   4303  1.1  skrll     if (insn->tok[i].X_add_symbol == sym)
   4304  1.1  skrll       insn->tok[i].X_add_symbol = label_sym;
   4305  1.1  skrll 
   4306  1.1  skrll }
   4307  1.1  skrll 
   4308  1.1  skrll 
   4309  1.1  skrll /* Return TRUE if the instruction can write to the specified
   4310  1.1  skrll    integer register.  */
   4311  1.1  skrll 
   4312  1.1  skrll static bfd_boolean
   4313  1.1  skrll is_register_writer (const TInsn *insn, const char *regset, int regnum)
   4314  1.1  skrll {
   4315  1.1  skrll   int i;
   4316  1.1  skrll   int num_ops;
   4317  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   4318  1.1  skrll 
   4319  1.1  skrll   num_ops = xtensa_opcode_num_operands (isa, insn->opcode);
   4320  1.1  skrll 
   4321  1.1  skrll   for (i = 0; i < num_ops; i++)
   4322  1.1  skrll     {
   4323  1.1  skrll       char inout;
   4324  1.1  skrll       inout = xtensa_operand_inout (isa, insn->opcode, i);
   4325  1.1  skrll       if ((inout == 'o' || inout == 'm')
   4326  1.1  skrll 	  && xtensa_operand_is_register (isa, insn->opcode, i) == 1)
   4327  1.1  skrll 	{
   4328  1.1  skrll 	  xtensa_regfile opnd_rf =
   4329  1.1  skrll 	    xtensa_operand_regfile (isa, insn->opcode, i);
   4330  1.1  skrll 	  if (!strcmp (xtensa_regfile_shortname (isa, opnd_rf), regset))
   4331  1.1  skrll 	    {
   4332  1.1  skrll 	      if ((insn->tok[i].X_op == O_register)
   4333  1.1  skrll 		  && (insn->tok[i].X_add_number == regnum))
   4334  1.1  skrll 		return TRUE;
   4335  1.1  skrll 	    }
   4336  1.1  skrll 	}
   4337  1.1  skrll     }
   4338  1.1  skrll   return FALSE;
   4339  1.1  skrll }
   4340  1.1  skrll 
   4341  1.1  skrll 
   4342  1.1  skrll static bfd_boolean
   4343  1.1  skrll is_bad_loopend_opcode (const TInsn *tinsn)
   4344  1.1  skrll {
   4345  1.1  skrll   xtensa_opcode opcode = tinsn->opcode;
   4346  1.1  skrll 
   4347  1.1  skrll   if (opcode == XTENSA_UNDEFINED)
   4348  1.1  skrll     return FALSE;
   4349  1.1  skrll 
   4350  1.1  skrll   if (opcode == xtensa_call0_opcode
   4351  1.1  skrll       || opcode == xtensa_callx0_opcode
   4352  1.1  skrll       || opcode == xtensa_call4_opcode
   4353  1.1  skrll       || opcode == xtensa_callx4_opcode
   4354  1.1  skrll       || opcode == xtensa_call8_opcode
   4355  1.1  skrll       || opcode == xtensa_callx8_opcode
   4356  1.1  skrll       || opcode == xtensa_call12_opcode
   4357  1.1  skrll       || opcode == xtensa_callx12_opcode
   4358  1.1  skrll       || opcode == xtensa_isync_opcode
   4359  1.1  skrll       || opcode == xtensa_ret_opcode
   4360  1.1  skrll       || opcode == xtensa_ret_n_opcode
   4361  1.1  skrll       || opcode == xtensa_retw_opcode
   4362  1.1  skrll       || opcode == xtensa_retw_n_opcode
   4363  1.1  skrll       || opcode == xtensa_waiti_opcode
   4364  1.1  skrll       || opcode == xtensa_rsr_lcount_opcode)
   4365  1.1  skrll     return TRUE;
   4366  1.1  skrll 
   4367  1.1  skrll   return FALSE;
   4368  1.1  skrll }
   4369  1.1  skrll 
   4370  1.1  skrll 
   4371  1.1  skrll /* Labels that begin with ".Ln" or ".LM"  are unaligned.
   4372  1.1  skrll    This allows the debugger to add unaligned labels.
   4373  1.1  skrll    Also, the assembler generates stabs labels that need
   4374  1.1  skrll    not be aligned:  FAKE_LABEL_NAME . {"F", "L", "endfunc"}.  */
   4375  1.1  skrll 
   4376  1.1  skrll static bfd_boolean
   4377  1.1  skrll is_unaligned_label (symbolS *sym)
   4378  1.1  skrll {
   4379  1.1  skrll   const char *name = S_GET_NAME (sym);
   4380  1.1  skrll   static size_t fake_size = 0;
   4381  1.1  skrll 
   4382  1.1  skrll   if (name
   4383  1.1  skrll       && name[0] == '.'
   4384  1.1  skrll       && name[1] == 'L' && (name[2] == 'n' || name[2] == 'M'))
   4385  1.1  skrll     return TRUE;
   4386  1.1  skrll 
   4387  1.1  skrll   /* FAKE_LABEL_NAME followed by "F", "L" or "endfunc" */
   4388  1.1  skrll   if (fake_size == 0)
   4389  1.1  skrll     fake_size = strlen (FAKE_LABEL_NAME);
   4390  1.1  skrll 
   4391  1.1  skrll   if (name
   4392  1.1  skrll       && strncmp (FAKE_LABEL_NAME, name, fake_size) == 0
   4393  1.1  skrll       && (name[fake_size] == 'F'
   4394  1.1  skrll 	  || name[fake_size] == 'L'
   4395  1.1  skrll 	  || (name[fake_size] == 'e'
   4396  1.1  skrll 	      && strncmp ("endfunc", name+fake_size, 7) == 0)))
   4397  1.1  skrll     return TRUE;
   4398  1.1  skrll 
   4399  1.1  skrll   return FALSE;
   4400  1.1  skrll }
   4401  1.1  skrll 
   4402  1.1  skrll 
   4403  1.1  skrll static fragS *
   4404  1.1  skrll next_non_empty_frag (const fragS *fragP)
   4405  1.1  skrll {
   4406  1.1  skrll   fragS *next_fragP = fragP->fr_next;
   4407  1.1  skrll 
   4408  1.1  skrll   /* Sometimes an empty will end up here due storage allocation issues.
   4409  1.1  skrll      So we have to skip until we find something legit.  */
   4410  1.1  skrll   while (next_fragP && next_fragP->fr_fix == 0)
   4411  1.1  skrll     next_fragP = next_fragP->fr_next;
   4412  1.1  skrll 
   4413  1.1  skrll   if (next_fragP == NULL || next_fragP->fr_fix == 0)
   4414  1.1  skrll     return NULL;
   4415  1.1  skrll 
   4416  1.1  skrll   return next_fragP;
   4417  1.1  skrll }
   4418  1.1  skrll 
   4419  1.1  skrll 
   4420  1.1  skrll static bfd_boolean
   4421  1.1  skrll next_frag_opcode_is_loop (const fragS *fragP, xtensa_opcode *opcode)
   4422  1.1  skrll {
   4423  1.1  skrll   xtensa_opcode out_opcode;
   4424  1.1  skrll   const fragS *next_fragP = next_non_empty_frag (fragP);
   4425  1.1  skrll 
   4426  1.1  skrll   if (next_fragP == NULL)
   4427  1.1  skrll     return FALSE;
   4428  1.1  skrll 
   4429  1.1  skrll   out_opcode = get_opcode_from_buf (next_fragP->fr_literal, 0);
   4430  1.1  skrll   if (xtensa_opcode_is_loop (xtensa_default_isa, out_opcode) == 1)
   4431  1.1  skrll     {
   4432  1.1  skrll       *opcode = out_opcode;
   4433  1.1  skrll       return TRUE;
   4434  1.1  skrll     }
   4435  1.1  skrll   return FALSE;
   4436  1.1  skrll }
   4437  1.1  skrll 
   4438  1.1  skrll 
   4439  1.1  skrll static int
   4440  1.1  skrll frag_format_size (const fragS *fragP)
   4441  1.1  skrll {
   4442  1.1  skrll   static xtensa_insnbuf insnbuf = NULL;
   4443  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   4444  1.1  skrll   xtensa_format fmt;
   4445  1.1  skrll   int fmt_size;
   4446  1.1  skrll 
   4447  1.1  skrll   if (!insnbuf)
   4448  1.1  skrll     insnbuf = xtensa_insnbuf_alloc (isa);
   4449  1.1  skrll 
   4450  1.1  skrll   if (fragP == NULL)
   4451  1.1  skrll     return XTENSA_UNDEFINED;
   4452  1.1  skrll 
   4453  1.1  skrll   xtensa_insnbuf_from_chars (isa, insnbuf,
   4454  1.1  skrll 			     (unsigned char *) fragP->fr_literal, 0);
   4455  1.1  skrll 
   4456  1.1  skrll   fmt = xtensa_format_decode (isa, insnbuf);
   4457  1.1  skrll   if (fmt == XTENSA_UNDEFINED)
   4458  1.1  skrll     return XTENSA_UNDEFINED;
   4459  1.1  skrll   fmt_size = xtensa_format_length (isa, fmt);
   4460  1.1  skrll 
   4461  1.1  skrll   /* If the next format won't be changing due to relaxation, just
   4462  1.1  skrll      return the length of the first format.  */
   4463  1.1  skrll   if (fragP->fr_opcode != fragP->fr_literal)
   4464  1.1  skrll     return fmt_size;
   4465  1.1  skrll 
   4466  1.1  skrll   /* If during relaxation we have to pull an instruction out of a
   4467  1.1  skrll      multi-slot instruction, we will return the more conservative
   4468  1.1  skrll      number.  This works because alignment on bigger instructions
   4469  1.1  skrll      is more restrictive than alignment on smaller instructions.
   4470  1.1  skrll      This is more conservative than we would like, but it happens
   4471  1.1  skrll      infrequently.  */
   4472  1.1  skrll 
   4473  1.1  skrll   if (xtensa_format_num_slots (xtensa_default_isa, fmt) > 1)
   4474  1.1  skrll     return fmt_size;
   4475  1.1  skrll 
   4476  1.1  skrll   /* If we aren't doing one of our own relaxations or it isn't
   4477  1.1  skrll      slot-based, then the insn size won't change.  */
   4478  1.1  skrll   if (fragP->fr_type != rs_machine_dependent)
   4479  1.1  skrll     return fmt_size;
   4480  1.1  skrll   if (fragP->fr_subtype != RELAX_SLOTS)
   4481  1.1  skrll     return fmt_size;
   4482  1.1  skrll 
   4483  1.1  skrll   /* If an instruction is about to grow, return the longer size.  */
   4484  1.1  skrll   if (fragP->tc_frag_data.slot_subtypes[0] == RELAX_IMMED_STEP1
   4485  1.1  skrll       || fragP->tc_frag_data.slot_subtypes[0] == RELAX_IMMED_STEP2
   4486  1.1  skrll       || fragP->tc_frag_data.slot_subtypes[0] == RELAX_IMMED_STEP3)
   4487  1.1  skrll     {
   4488  1.1  skrll       /* For most frags at RELAX_IMMED_STEPX, with X > 0, the first
   4489  1.1  skrll 	 instruction in the relaxed version is of length 3.  (The case
   4490  1.1  skrll 	 where we have to pull the instruction out of a FLIX bundle
   4491  1.1  skrll 	 is handled conservatively above.)  However, frags with opcodes
   4492  1.1  skrll 	 that are expanding to wide branches end up having formats that
   4493  1.1  skrll 	 are not determinable by the RELAX_IMMED_STEPX enumeration, and
   4494  1.1  skrll 	 we can't tell directly what format the relaxer picked.  This
   4495  1.1  skrll 	 is a wart in the design of the relaxer that should someday be
   4496  1.1  skrll 	 fixed, but would require major changes, or at least should
   4497  1.1  skrll 	 be accompanied by major changes to make use of that data.
   4498  1.1  skrll 
   4499  1.1  skrll 	 In any event, we can tell that we are expanding from a single-slot
   4500  1.1  skrll 	 three-byte format to a wider one with the logic below.  */
   4501  1.1  skrll 
   4502  1.1  skrll       if (fmt_size <= 3 && fragP->tc_frag_data.text_expansion[0] != 3)
   4503  1.1  skrll 	return 3 + fragP->tc_frag_data.text_expansion[0];
   4504  1.1  skrll       else
   4505  1.1  skrll 	return 3;
   4506  1.1  skrll     }
   4507  1.1  skrll 
   4508  1.1  skrll   if (fragP->tc_frag_data.slot_subtypes[0] == RELAX_NARROW)
   4509  1.1  skrll     return 2 + fragP->tc_frag_data.text_expansion[0];
   4510  1.1  skrll 
   4511  1.1  skrll   return fmt_size;
   4512  1.1  skrll }
   4513  1.1  skrll 
   4514  1.1  skrll 
   4515  1.1  skrll static int
   4516  1.1  skrll next_frag_format_size (const fragS *fragP)
   4517  1.1  skrll {
   4518  1.1  skrll   const fragS *next_fragP = next_non_empty_frag (fragP);
   4519  1.1  skrll   return frag_format_size (next_fragP);
   4520  1.1  skrll }
   4521  1.1  skrll 
   4522  1.1  skrll 
   4523  1.1  skrll /* In early Xtensa Processors, for reasons that are unclear, the ISA
   4524  1.1  skrll    required two-byte instructions to be treated as three-byte instructions
   4525  1.1  skrll    for loop instruction alignment.  This restriction was removed beginning
   4526  1.1  skrll    with Xtensa LX.  Now the only requirement on loop instruction alignment
   4527  1.1  skrll    is that the first instruction of the loop must appear at an address that
   4528  1.1  skrll    does not cross a fetch boundary.  */
   4529  1.1  skrll 
   4530  1.1  skrll static int
   4531  1.1  skrll get_loop_align_size (int insn_size)
   4532  1.1  skrll {
   4533  1.1  skrll   if (insn_size == XTENSA_UNDEFINED)
   4534  1.1  skrll     return xtensa_fetch_width;
   4535  1.1  skrll 
   4536  1.1  skrll   if (enforce_three_byte_loop_align && insn_size == 2)
   4537  1.1  skrll     return 3;
   4538  1.1  skrll 
   4539  1.1  skrll   return insn_size;
   4540  1.1  skrll }
   4541  1.1  skrll 
   4542  1.1  skrll 
   4543  1.1  skrll /* If the next legit fragment is an end-of-loop marker,
   4544  1.1  skrll    switch its state so it will instantiate a NOP.  */
   4545  1.1  skrll 
   4546  1.1  skrll static void
   4547  1.1  skrll update_next_frag_state (fragS *fragP)
   4548  1.1  skrll {
   4549  1.1  skrll   fragS *next_fragP = fragP->fr_next;
   4550  1.1  skrll   fragS *new_target = NULL;
   4551  1.1  skrll 
   4552  1.1  skrll   if (align_targets)
   4553  1.1  skrll     {
   4554  1.1  skrll       /* We are guaranteed there will be one of these...   */
   4555  1.1  skrll       while (!(next_fragP->fr_type == rs_machine_dependent
   4556  1.1  skrll 	       && (next_fragP->fr_subtype == RELAX_MAYBE_UNREACHABLE
   4557  1.1  skrll 		   || next_fragP->fr_subtype == RELAX_UNREACHABLE)))
   4558  1.1  skrll 	next_fragP = next_fragP->fr_next;
   4559  1.1  skrll 
   4560  1.1  skrll       assert (next_fragP->fr_type == rs_machine_dependent
   4561  1.1  skrll 	      && (next_fragP->fr_subtype == RELAX_MAYBE_UNREACHABLE
   4562  1.1  skrll 		  || next_fragP->fr_subtype == RELAX_UNREACHABLE));
   4563  1.1  skrll 
   4564  1.1  skrll       /* ...and one of these.  */
   4565  1.1  skrll       new_target = next_fragP->fr_next;
   4566  1.1  skrll       while (!(new_target->fr_type == rs_machine_dependent
   4567  1.1  skrll 	       && (new_target->fr_subtype == RELAX_MAYBE_DESIRE_ALIGN
   4568  1.1  skrll 		   || new_target->fr_subtype == RELAX_DESIRE_ALIGN)))
   4569  1.1  skrll 	new_target = new_target->fr_next;
   4570  1.1  skrll 
   4571  1.1  skrll       assert (new_target->fr_type == rs_machine_dependent
   4572  1.1  skrll 	      && (new_target->fr_subtype == RELAX_MAYBE_DESIRE_ALIGN
   4573  1.1  skrll 		  || new_target->fr_subtype == RELAX_DESIRE_ALIGN));
   4574  1.1  skrll     }
   4575  1.1  skrll 
   4576  1.1  skrll   while (next_fragP && next_fragP->fr_fix == 0)
   4577  1.1  skrll     {
   4578  1.1  skrll       if (next_fragP->fr_type == rs_machine_dependent
   4579  1.1  skrll 	  && next_fragP->fr_subtype == RELAX_LOOP_END)
   4580  1.1  skrll 	{
   4581  1.1  skrll 	  next_fragP->fr_subtype = RELAX_LOOP_END_ADD_NOP;
   4582  1.1  skrll 	  return;
   4583  1.1  skrll 	}
   4584  1.1  skrll 
   4585  1.1  skrll       next_fragP = next_fragP->fr_next;
   4586  1.1  skrll     }
   4587  1.1  skrll }
   4588  1.1  skrll 
   4589  1.1  skrll 
   4590  1.1  skrll static bfd_boolean
   4591  1.1  skrll next_frag_is_branch_target (const fragS *fragP)
   4592  1.1  skrll {
   4593  1.1  skrll   /* Sometimes an empty will end up here due to storage allocation issues,
   4594  1.1  skrll      so we have to skip until we find something legit.  */
   4595  1.1  skrll   for (fragP = fragP->fr_next; fragP; fragP = fragP->fr_next)
   4596  1.1  skrll     {
   4597  1.1  skrll       if (fragP->tc_frag_data.is_branch_target)
   4598  1.1  skrll 	return TRUE;
   4599  1.1  skrll       if (fragP->fr_fix != 0)
   4600  1.1  skrll 	break;
   4601  1.1  skrll     }
   4602  1.1  skrll   return FALSE;
   4603  1.1  skrll }
   4604  1.1  skrll 
   4605  1.1  skrll 
   4606  1.1  skrll static bfd_boolean
   4607  1.1  skrll next_frag_is_loop_target (const fragS *fragP)
   4608  1.1  skrll {
   4609  1.1  skrll   /* Sometimes an empty will end up here due storage allocation issues.
   4610  1.1  skrll      So we have to skip until we find something legit. */
   4611  1.1  skrll   for (fragP = fragP->fr_next; fragP; fragP = fragP->fr_next)
   4612  1.1  skrll     {
   4613  1.1  skrll       if (fragP->tc_frag_data.is_loop_target)
   4614  1.1  skrll 	return TRUE;
   4615  1.1  skrll       if (fragP->fr_fix != 0)
   4616  1.1  skrll 	break;
   4617  1.1  skrll     }
   4618  1.1  skrll   return FALSE;
   4619  1.1  skrll }
   4620  1.1  skrll 
   4621  1.1  skrll 
   4622  1.1  skrll static addressT
   4623  1.1  skrll next_frag_pre_opcode_bytes (const fragS *fragp)
   4624  1.1  skrll {
   4625  1.1  skrll   const fragS *next_fragp = fragp->fr_next;
   4626  1.1  skrll   xtensa_opcode next_opcode;
   4627  1.1  skrll 
   4628  1.1  skrll   if (!next_frag_opcode_is_loop (fragp, &next_opcode))
   4629  1.1  skrll     return 0;
   4630  1.1  skrll 
   4631  1.1  skrll   /* Sometimes an empty will end up here due to storage allocation issues,
   4632  1.1  skrll      so we have to skip until we find something legit.  */
   4633  1.1  skrll   while (next_fragp->fr_fix == 0)
   4634  1.1  skrll     next_fragp = next_fragp->fr_next;
   4635  1.1  skrll 
   4636  1.1  skrll   if (next_fragp->fr_type != rs_machine_dependent)
   4637  1.1  skrll     return 0;
   4638  1.1  skrll 
   4639  1.1  skrll   /* There is some implicit knowledge encoded in here.
   4640  1.1  skrll      The LOOP instructions that are NOT RELAX_IMMED have
   4641  1.1  skrll      been relaxed.  Note that we can assume that the LOOP
   4642  1.1  skrll      instruction is in slot 0 because loops aren't bundleable.  */
   4643  1.1  skrll   if (next_fragp->tc_frag_data.slot_subtypes[0] > RELAX_IMMED)
   4644  1.1  skrll       return get_expanded_loop_offset (next_opcode);
   4645  1.1  skrll 
   4646  1.1  skrll   return 0;
   4647  1.1  skrll }
   4648  1.1  skrll 
   4649  1.1  skrll 
   4650  1.1  skrll /* Mark a location where we can later insert literal frags.  Update
   4651  1.1  skrll    the section's literal_pool_loc, so subsequent literals can be
   4652  1.1  skrll    placed nearest to their use.  */
   4653  1.1  skrll 
   4654  1.1  skrll static void
   4655  1.1  skrll xtensa_mark_literal_pool_location (void)
   4656  1.1  skrll {
   4657  1.1  skrll   /* Any labels pointing to the current location need
   4658  1.1  skrll      to be adjusted to after the literal pool.  */
   4659  1.1  skrll   emit_state s;
   4660  1.1  skrll   fragS *pool_location;
   4661  1.1  skrll 
   4662  1.1  skrll   if (use_literal_section)
   4663  1.1  skrll     return;
   4664  1.1  skrll 
   4665  1.1  skrll   /* We stash info in these frags so we can later move the literal's
   4666  1.1  skrll      fixes into this frchain's fix list.  */
   4667  1.1  skrll   pool_location = frag_now;
   4668  1.1  skrll   frag_now->tc_frag_data.lit_frchain = frchain_now;
   4669  1.1  skrll   frag_now->tc_frag_data.literal_frag = frag_now;
   4670  1.1  skrll   frag_variant (rs_machine_dependent, 0, 0,
   4671  1.1  skrll 		RELAX_LITERAL_POOL_BEGIN, NULL, 0, NULL);
   4672  1.1  skrll   xtensa_set_frag_assembly_state (frag_now);
   4673  1.1  skrll   frag_now->tc_frag_data.lit_seg = now_seg;
   4674  1.1  skrll   frag_variant (rs_machine_dependent, 0, 0,
   4675  1.1  skrll 		RELAX_LITERAL_POOL_END, NULL, 0, NULL);
   4676  1.1  skrll   xtensa_set_frag_assembly_state (frag_now);
   4677  1.1  skrll 
   4678  1.1  skrll   /* Now put a frag into the literal pool that points to this location.  */
   4679  1.1  skrll   set_literal_pool_location (now_seg, pool_location);
   4680  1.1  skrll   xtensa_switch_to_non_abs_literal_fragment (&s);
   4681  1.1  skrll   frag_align (2, 0, 0);
   4682  1.1  skrll   record_alignment (now_seg, 2);
   4683  1.1  skrll 
   4684  1.1  skrll   /* Close whatever frag is there.  */
   4685  1.1  skrll   frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
   4686  1.1  skrll   xtensa_set_frag_assembly_state (frag_now);
   4687  1.1  skrll   frag_now->tc_frag_data.literal_frag = pool_location;
   4688  1.1  skrll   frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
   4689  1.1  skrll   xtensa_restore_emit_state (&s);
   4690  1.1  skrll   xtensa_set_frag_assembly_state (frag_now);
   4691  1.1  skrll }
   4692  1.1  skrll 
   4693  1.1  skrll 
   4694  1.1  skrll /* Build a nop of the correct size into tinsn.  */
   4695  1.1  skrll 
   4696  1.1  skrll static void
   4697  1.1  skrll build_nop (TInsn *tinsn, int size)
   4698  1.1  skrll {
   4699  1.1  skrll   tinsn_init (tinsn);
   4700  1.1  skrll   switch (size)
   4701  1.1  skrll     {
   4702  1.1  skrll     case 2:
   4703  1.1  skrll       tinsn->opcode = xtensa_nop_n_opcode;
   4704  1.1  skrll       tinsn->ntok = 0;
   4705  1.1  skrll       if (tinsn->opcode == XTENSA_UNDEFINED)
   4706  1.1  skrll 	as_fatal (_("opcode 'NOP.N' unavailable in this configuration"));
   4707  1.1  skrll       break;
   4708  1.1  skrll 
   4709  1.1  skrll     case 3:
   4710  1.1  skrll       if (xtensa_nop_opcode == XTENSA_UNDEFINED)
   4711  1.1  skrll 	{
   4712  1.1  skrll 	  tinsn->opcode = xtensa_or_opcode;
   4713  1.1  skrll 	  set_expr_const (&tinsn->tok[0], 1);
   4714  1.1  skrll 	  set_expr_const (&tinsn->tok[1], 1);
   4715  1.1  skrll 	  set_expr_const (&tinsn->tok[2], 1);
   4716  1.1  skrll 	  tinsn->ntok = 3;
   4717  1.1  skrll 	}
   4718  1.1  skrll       else
   4719  1.1  skrll 	tinsn->opcode = xtensa_nop_opcode;
   4720  1.1  skrll 
   4721  1.1  skrll       assert (tinsn->opcode != XTENSA_UNDEFINED);
   4722  1.1  skrll     }
   4723  1.1  skrll }
   4724  1.1  skrll 
   4725  1.1  skrll 
   4726  1.1  skrll /* Assemble a NOP of the requested size in the buffer.  User must have
   4727  1.1  skrll    allocated "buf" with at least "size" bytes.  */
   4728  1.1  skrll 
   4729  1.1  skrll static void
   4730  1.1  skrll assemble_nop (int size, char *buf)
   4731  1.1  skrll {
   4732  1.1  skrll   static xtensa_insnbuf insnbuf = NULL;
   4733  1.1  skrll   TInsn tinsn;
   4734  1.1  skrll 
   4735  1.1  skrll   build_nop (&tinsn, size);
   4736  1.1  skrll 
   4737  1.1  skrll   if (!insnbuf)
   4738  1.1  skrll     insnbuf = xtensa_insnbuf_alloc (xtensa_default_isa);
   4739  1.1  skrll 
   4740  1.1  skrll   tinsn_to_insnbuf (&tinsn, insnbuf);
   4741  1.1  skrll   xtensa_insnbuf_to_chars (xtensa_default_isa, insnbuf,
   4742  1.1  skrll 			   (unsigned char *) buf, 0);
   4743  1.1  skrll }
   4744  1.1  skrll 
   4745  1.1  skrll 
   4746  1.1  skrll /* Return the number of bytes for the offset of the expanded loop
   4747  1.1  skrll    instruction.  This should be incorporated into the relaxation
   4748  1.1  skrll    specification but is hard-coded here.  This is used to auto-align
   4749  1.1  skrll    the loop instruction.  It is invalid to call this function if the
   4750  1.1  skrll    configuration does not have loops or if the opcode is not a loop
   4751  1.1  skrll    opcode.  */
   4752  1.1  skrll 
   4753  1.1  skrll static addressT
   4754  1.1  skrll get_expanded_loop_offset (xtensa_opcode opcode)
   4755  1.1  skrll {
   4756  1.1  skrll   /* This is the OFFSET of the loop instruction in the expanded loop.
   4757  1.1  skrll      This MUST correspond directly to the specification of the loop
   4758  1.1  skrll      expansion.  It will be validated on fragment conversion.  */
   4759  1.1  skrll   assert (opcode != XTENSA_UNDEFINED);
   4760  1.1  skrll   if (opcode == xtensa_loop_opcode)
   4761  1.1  skrll     return 0;
   4762  1.1  skrll   if (opcode == xtensa_loopnez_opcode)
   4763  1.1  skrll     return 3;
   4764  1.1  skrll   if (opcode == xtensa_loopgtz_opcode)
   4765  1.1  skrll     return 6;
   4766  1.1  skrll   as_fatal (_("get_expanded_loop_offset: invalid opcode"));
   4767  1.1  skrll   return 0;
   4768  1.1  skrll }
   4769  1.1  skrll 
   4770  1.1  skrll 
   4771  1.1  skrll static fragS *
   4772  1.1  skrll get_literal_pool_location (segT seg)
   4773  1.1  skrll {
   4774  1.1  skrll   return seg_info (seg)->tc_segment_info_data.literal_pool_loc;
   4775  1.1  skrll }
   4776  1.1  skrll 
   4777  1.1  skrll 
   4778  1.1  skrll static void
   4779  1.1  skrll set_literal_pool_location (segT seg, fragS *literal_pool_loc)
   4780  1.1  skrll {
   4781  1.1  skrll   seg_info (seg)->tc_segment_info_data.literal_pool_loc = literal_pool_loc;
   4782  1.1  skrll }
   4783  1.1  skrll 
   4784  1.1  skrll 
   4785  1.1  skrll /* Set frag assembly state should be called when a new frag is
   4786  1.1  skrll    opened and after a frag has been closed.  */
   4787  1.1  skrll 
   4788  1.1  skrll static void
   4789  1.1  skrll xtensa_set_frag_assembly_state (fragS *fragP)
   4790  1.1  skrll {
   4791  1.1  skrll   if (!density_supported)
   4792  1.1  skrll     fragP->tc_frag_data.is_no_density = TRUE;
   4793  1.1  skrll 
   4794  1.1  skrll   /* This function is called from subsegs_finish, which is called
   4795  1.1  skrll      after xtensa_end, so we can't use "use_transform" or
   4796  1.1  skrll      "use_schedule" here.  */
   4797  1.1  skrll   if (!directive_state[directive_transform])
   4798  1.1  skrll     fragP->tc_frag_data.is_no_transform = TRUE;
   4799  1.1  skrll   if (directive_state[directive_longcalls])
   4800  1.1  skrll     fragP->tc_frag_data.use_longcalls = TRUE;
   4801  1.1  skrll   fragP->tc_frag_data.use_absolute_literals =
   4802  1.1  skrll     directive_state[directive_absolute_literals];
   4803  1.1  skrll   fragP->tc_frag_data.is_assembly_state_set = TRUE;
   4804  1.1  skrll }
   4805  1.1  skrll 
   4806  1.1  skrll 
   4807  1.1  skrll static bfd_boolean
   4808  1.1  skrll relaxable_section (asection *sec)
   4809  1.1  skrll {
   4810  1.1  skrll   return ((sec->flags & SEC_DEBUGGING) == 0
   4811  1.1  skrll 	  && strcmp (sec->name, ".eh_frame") != 0);
   4812  1.1  skrll }
   4813  1.1  skrll 
   4814  1.1  skrll 
   4815  1.1  skrll static void
   4816  1.1  skrll xtensa_mark_frags_for_org (void)
   4817  1.1  skrll {
   4818  1.1  skrll   segT *seclist;
   4819  1.1  skrll 
   4820  1.1  skrll   /* Walk over each fragment of all of the current segments.  If we find
   4821  1.1  skrll      a .org frag in any of the segments, mark all frags prior to it as
   4822  1.1  skrll      "no transform", which will prevent linker optimizations from messing
   4823  1.1  skrll      up the .org distance.  This should be done after
   4824  1.1  skrll      xtensa_find_unmarked_state_frags, because we don't want to worry here
   4825  1.1  skrll      about that function trashing the data we save here.  */
   4826  1.1  skrll 
   4827  1.1  skrll   for (seclist = &stdoutput->sections;
   4828  1.1  skrll        seclist && *seclist;
   4829  1.1  skrll        seclist = &(*seclist)->next)
   4830  1.1  skrll     {
   4831  1.1  skrll       segT sec = *seclist;
   4832  1.1  skrll       segment_info_type *seginfo;
   4833  1.1  skrll       fragS *fragP;
   4834  1.1  skrll       flagword flags;
   4835  1.1  skrll       flags = bfd_get_section_flags (stdoutput, sec);
   4836  1.1  skrll       if (flags & SEC_DEBUGGING)
   4837  1.1  skrll 	continue;
   4838  1.1  skrll       if (!(flags & SEC_ALLOC))
   4839  1.1  skrll 	continue;
   4840  1.1  skrll 
   4841  1.1  skrll       seginfo = seg_info (sec);
   4842  1.1  skrll       if (seginfo && seginfo->frchainP)
   4843  1.1  skrll 	{
   4844  1.1  skrll 	  fragS *last_fragP = seginfo->frchainP->frch_root;
   4845  1.1  skrll 	  for (fragP = seginfo->frchainP->frch_root; fragP;
   4846  1.1  skrll 	       fragP = fragP->fr_next)
   4847  1.1  skrll 	    {
   4848  1.1  skrll 	      /* cvt_frag_to_fill has changed the fr_type of org frags to
   4849  1.1  skrll 		 rs_fill, so use the value as cached in rs_subtype here.  */
   4850  1.1  skrll 	      if (fragP->fr_subtype == RELAX_ORG)
   4851  1.1  skrll 		{
   4852  1.1  skrll 		  while (last_fragP != fragP->fr_next)
   4853  1.1  skrll 		    {
   4854  1.1  skrll 		      last_fragP->tc_frag_data.is_no_transform = TRUE;
   4855  1.1  skrll 		      last_fragP = last_fragP->fr_next;
   4856  1.1  skrll 		    }
   4857  1.1  skrll 		}
   4858  1.1  skrll 	    }
   4859  1.1  skrll 	}
   4860  1.1  skrll     }
   4861  1.1  skrll }
   4862  1.1  skrll 
   4863  1.1  skrll 
   4864  1.1  skrll static void
   4865  1.1  skrll xtensa_find_unmarked_state_frags (void)
   4866  1.1  skrll {
   4867  1.1  skrll   segT *seclist;
   4868  1.1  skrll 
   4869  1.1  skrll   /* Walk over each fragment of all of the current segments.  For each
   4870  1.1  skrll      unmarked fragment, mark it with the same info as the previous
   4871  1.1  skrll      fragment.  */
   4872  1.1  skrll   for (seclist = &stdoutput->sections;
   4873  1.1  skrll        seclist && *seclist;
   4874  1.1  skrll        seclist = &(*seclist)->next)
   4875  1.1  skrll     {
   4876  1.1  skrll       segT sec = *seclist;
   4877  1.1  skrll       segment_info_type *seginfo;
   4878  1.1  skrll       fragS *fragP;
   4879  1.1  skrll       flagword flags;
   4880  1.1  skrll       flags = bfd_get_section_flags (stdoutput, sec);
   4881  1.1  skrll       if (flags & SEC_DEBUGGING)
   4882  1.1  skrll 	continue;
   4883  1.1  skrll       if (!(flags & SEC_ALLOC))
   4884  1.1  skrll 	continue;
   4885  1.1  skrll 
   4886  1.1  skrll       seginfo = seg_info (sec);
   4887  1.1  skrll       if (seginfo && seginfo->frchainP)
   4888  1.1  skrll 	{
   4889  1.1  skrll 	  fragS *last_fragP = 0;
   4890  1.1  skrll 	  for (fragP = seginfo->frchainP->frch_root; fragP;
   4891  1.1  skrll 	       fragP = fragP->fr_next)
   4892  1.1  skrll 	    {
   4893  1.1  skrll 	      if (fragP->fr_fix != 0
   4894  1.1  skrll 		  && !fragP->tc_frag_data.is_assembly_state_set)
   4895  1.1  skrll 		{
   4896  1.1  skrll 		  if (last_fragP == 0)
   4897  1.1  skrll 		    {
   4898  1.1  skrll 		      as_warn_where (fragP->fr_file, fragP->fr_line,
   4899  1.1  skrll 				     _("assembly state not set for first frag in section %s"),
   4900  1.1  skrll 				     sec->name);
   4901  1.1  skrll 		    }
   4902  1.1  skrll 		  else
   4903  1.1  skrll 		    {
   4904  1.1  skrll 		      fragP->tc_frag_data.is_assembly_state_set = TRUE;
   4905  1.1  skrll 		      fragP->tc_frag_data.is_no_density =
   4906  1.1  skrll 			last_fragP->tc_frag_data.is_no_density;
   4907  1.1  skrll 		      fragP->tc_frag_data.is_no_transform =
   4908  1.1  skrll 			last_fragP->tc_frag_data.is_no_transform;
   4909  1.1  skrll 		      fragP->tc_frag_data.use_longcalls =
   4910  1.1  skrll 			last_fragP->tc_frag_data.use_longcalls;
   4911  1.1  skrll 		      fragP->tc_frag_data.use_absolute_literals =
   4912  1.1  skrll 			last_fragP->tc_frag_data.use_absolute_literals;
   4913  1.1  skrll 		    }
   4914  1.1  skrll 		}
   4915  1.1  skrll 	      if (fragP->tc_frag_data.is_assembly_state_set)
   4916  1.1  skrll 		last_fragP = fragP;
   4917  1.1  skrll 	    }
   4918  1.1  skrll 	}
   4919  1.1  skrll     }
   4920  1.1  skrll }
   4921  1.1  skrll 
   4922  1.1  skrll 
   4923  1.1  skrll static void
   4924  1.1  skrll xtensa_find_unaligned_branch_targets (bfd *abfd ATTRIBUTE_UNUSED,
   4925  1.1  skrll 				      asection *sec,
   4926  1.1  skrll 				      void *unused ATTRIBUTE_UNUSED)
   4927  1.1  skrll {
   4928  1.1  skrll   flagword flags = bfd_get_section_flags (abfd, sec);
   4929  1.1  skrll   segment_info_type *seginfo = seg_info (sec);
   4930  1.1  skrll   fragS *frag = seginfo->frchainP->frch_root;
   4931  1.1  skrll 
   4932  1.1  skrll   if (flags & SEC_CODE)
   4933  1.1  skrll     {
   4934  1.1  skrll       xtensa_isa isa = xtensa_default_isa;
   4935  1.1  skrll       xtensa_insnbuf insnbuf = xtensa_insnbuf_alloc (isa);
   4936  1.1  skrll       while (frag != NULL)
   4937  1.1  skrll 	{
   4938  1.1  skrll 	  if (frag->tc_frag_data.is_branch_target)
   4939  1.1  skrll 	    {
   4940  1.1  skrll 	      int op_size;
   4941  1.1  skrll 	      addressT branch_align, frag_addr;
   4942  1.1  skrll 	      xtensa_format fmt;
   4943  1.1  skrll 
   4944  1.1  skrll 	      xtensa_insnbuf_from_chars
   4945  1.1  skrll 		(isa, insnbuf, (unsigned char *) frag->fr_literal, 0);
   4946  1.1  skrll 	      fmt = xtensa_format_decode (isa, insnbuf);
   4947  1.1  skrll 	      op_size = xtensa_format_length (isa, fmt);
   4948  1.1  skrll 	      branch_align = 1 << branch_align_power (sec);
   4949  1.1  skrll 	      frag_addr = frag->fr_address % branch_align;
   4950  1.1  skrll 	      if (frag_addr + op_size > branch_align)
   4951  1.1  skrll 		as_warn_where (frag->fr_file, frag->fr_line,
   4952  1.1  skrll 			       _("unaligned branch target: %d bytes at 0x%lx"),
   4953  1.1  skrll 			       op_size, (long) frag->fr_address);
   4954  1.1  skrll 	    }
   4955  1.1  skrll 	  frag = frag->fr_next;
   4956  1.1  skrll 	}
   4957  1.1  skrll       xtensa_insnbuf_free (isa, insnbuf);
   4958  1.1  skrll     }
   4959  1.1  skrll }
   4960  1.1  skrll 
   4961  1.1  skrll 
   4962  1.1  skrll static void
   4963  1.1  skrll xtensa_find_unaligned_loops (bfd *abfd ATTRIBUTE_UNUSED,
   4964  1.1  skrll 			     asection *sec,
   4965  1.1  skrll 			     void *unused ATTRIBUTE_UNUSED)
   4966  1.1  skrll {
   4967  1.1  skrll   flagword flags = bfd_get_section_flags (abfd, sec);
   4968  1.1  skrll   segment_info_type *seginfo = seg_info (sec);
   4969  1.1  skrll   fragS *frag = seginfo->frchainP->frch_root;
   4970  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   4971  1.1  skrll 
   4972  1.1  skrll   if (flags & SEC_CODE)
   4973  1.1  skrll     {
   4974  1.1  skrll       xtensa_insnbuf insnbuf = xtensa_insnbuf_alloc (isa);
   4975  1.1  skrll       while (frag != NULL)
   4976  1.1  skrll 	{
   4977  1.1  skrll 	  if (frag->tc_frag_data.is_first_loop_insn)
   4978  1.1  skrll 	    {
   4979  1.1  skrll 	      int op_size;
   4980  1.1  skrll 	      addressT frag_addr;
   4981  1.1  skrll 	      xtensa_format fmt;
   4982  1.1  skrll 
   4983  1.1  skrll 	      xtensa_insnbuf_from_chars
   4984  1.1  skrll 		(isa, insnbuf, (unsigned char *) frag->fr_literal, 0);
   4985  1.1  skrll 	      fmt = xtensa_format_decode (isa, insnbuf);
   4986  1.1  skrll 	      op_size = xtensa_format_length (isa, fmt);
   4987  1.1  skrll 	      frag_addr = frag->fr_address % xtensa_fetch_width;
   4988  1.1  skrll 
   4989  1.1  skrll 	      if (frag_addr + op_size > xtensa_fetch_width)
   4990  1.1  skrll 		as_warn_where (frag->fr_file, frag->fr_line,
   4991  1.1  skrll 			       _("unaligned loop: %d bytes at 0x%lx"),
   4992  1.1  skrll 			       op_size, (long) frag->fr_address);
   4993  1.1  skrll 	    }
   4994  1.1  skrll 	  frag = frag->fr_next;
   4995  1.1  skrll 	}
   4996  1.1  skrll       xtensa_insnbuf_free (isa, insnbuf);
   4997  1.1  skrll     }
   4998  1.1  skrll }
   4999  1.1  skrll 
   5000  1.1  skrll 
   5001  1.1  skrll static int
   5002  1.1  skrll xg_apply_fix_value (fixS *fixP, valueT val)
   5003  1.1  skrll {
   5004  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   5005  1.1  skrll   static xtensa_insnbuf insnbuf = NULL;
   5006  1.1  skrll   static xtensa_insnbuf slotbuf = NULL;
   5007  1.1  skrll   xtensa_format fmt;
   5008  1.1  skrll   int slot;
   5009  1.1  skrll   bfd_boolean alt_reloc;
   5010  1.1  skrll   xtensa_opcode opcode;
   5011  1.1  skrll   char *const fixpos = fixP->fx_frag->fr_literal + fixP->fx_where;
   5012  1.1  skrll 
   5013  1.1  skrll   if (decode_reloc (fixP->fx_r_type, &slot, &alt_reloc)
   5014  1.1  skrll       || alt_reloc)
   5015  1.1  skrll     as_fatal (_("unexpected fix"));
   5016  1.1  skrll 
   5017  1.1  skrll   if (!insnbuf)
   5018  1.1  skrll     {
   5019  1.1  skrll       insnbuf = xtensa_insnbuf_alloc (isa);
   5020  1.1  skrll       slotbuf = xtensa_insnbuf_alloc (isa);
   5021  1.1  skrll     }
   5022  1.1  skrll 
   5023  1.1  skrll   xtensa_insnbuf_from_chars (isa, insnbuf, (unsigned char *) fixpos, 0);
   5024  1.1  skrll   fmt = xtensa_format_decode (isa, insnbuf);
   5025  1.1  skrll   if (fmt == XTENSA_UNDEFINED)
   5026  1.1  skrll     as_fatal (_("undecodable fix"));
   5027  1.1  skrll   xtensa_format_get_slot (isa, fmt, slot, insnbuf, slotbuf);
   5028  1.1  skrll   opcode = xtensa_opcode_decode (isa, fmt, slot, slotbuf);
   5029  1.1  skrll   if (opcode == XTENSA_UNDEFINED)
   5030  1.1  skrll     as_fatal (_("undecodable fix"));
   5031  1.1  skrll 
   5032  1.1  skrll   /* CONST16 immediates are not PC-relative, despite the fact that we
   5033  1.1  skrll      reuse the normal PC-relative operand relocations for the low part
   5034  1.1  skrll      of a CONST16 operand.  */
   5035  1.1  skrll   if (opcode == xtensa_const16_opcode)
   5036  1.1  skrll     return 0;
   5037  1.1  skrll 
   5038  1.1  skrll   xtensa_insnbuf_set_operand (slotbuf, fmt, slot, opcode,
   5039  1.1  skrll 			      get_relaxable_immed (opcode), val,
   5040  1.1  skrll 			      fixP->fx_file, fixP->fx_line);
   5041  1.1  skrll 
   5042  1.1  skrll   xtensa_format_set_slot (isa, fmt, slot, insnbuf, slotbuf);
   5043  1.1  skrll   xtensa_insnbuf_to_chars (isa, insnbuf, (unsigned char *) fixpos, 0);
   5044  1.1  skrll 
   5045  1.1  skrll   return 1;
   5046  1.1  skrll }
   5047  1.1  skrll 
   5048  1.1  skrll 
   5049  1.1  skrll /* External Functions and Other GAS Hooks.  */
   5051  1.1  skrll 
   5052  1.1  skrll const char *
   5053  1.1  skrll xtensa_target_format (void)
   5054  1.1  skrll {
   5055  1.1  skrll   return (target_big_endian ? "elf32-xtensa-be" : "elf32-xtensa-le");
   5056  1.1  skrll }
   5057  1.1  skrll 
   5058  1.1  skrll 
   5059  1.1  skrll void
   5060  1.1  skrll xtensa_file_arch_init (bfd *abfd)
   5061  1.1  skrll {
   5062  1.1  skrll   bfd_set_private_flags (abfd, 0x100 | 0x200);
   5063  1.1  skrll }
   5064  1.1  skrll 
   5065  1.1  skrll 
   5066  1.1  skrll void
   5067  1.1  skrll md_number_to_chars (char *buf, valueT val, int n)
   5068  1.1  skrll {
   5069  1.1  skrll   if (target_big_endian)
   5070  1.1  skrll     number_to_chars_bigendian (buf, val, n);
   5071  1.1  skrll   else
   5072  1.1  skrll     number_to_chars_littleendian (buf, val, n);
   5073  1.1  skrll }
   5074  1.1  skrll 
   5075  1.1  skrll 
   5076  1.1  skrll /* This function is called once, at assembler startup time.  It should
   5077  1.1  skrll    set up all the tables, etc. that the MD part of the assembler will
   5078  1.1  skrll    need.  */
   5079  1.1  skrll 
   5080  1.1  skrll void
   5081  1.1  skrll md_begin (void)
   5082  1.1  skrll {
   5083  1.1  skrll   segT current_section = now_seg;
   5084  1.1  skrll   int current_subsec = now_subseg;
   5085  1.1  skrll   xtensa_isa isa;
   5086  1.1  skrll 
   5087  1.1  skrll   xtensa_default_isa = xtensa_isa_init (0, 0);
   5088  1.1  skrll   isa = xtensa_default_isa;
   5089  1.1  skrll 
   5090  1.1  skrll   linkrelax = 1;
   5091  1.1  skrll 
   5092  1.1  skrll   /* Set up the literal sections.  */
   5093  1.1  skrll   memset (&default_lit_sections, 0, sizeof (default_lit_sections));
   5094  1.1  skrll 
   5095  1.1  skrll   subseg_set (current_section, current_subsec);
   5096  1.1  skrll 
   5097  1.1  skrll   xg_init_vinsn (&cur_vinsn);
   5098  1.1  skrll 
   5099  1.1  skrll   xtensa_addi_opcode = xtensa_opcode_lookup (isa, "addi");
   5100  1.1  skrll   xtensa_addmi_opcode = xtensa_opcode_lookup (isa, "addmi");
   5101  1.1  skrll   xtensa_call0_opcode = xtensa_opcode_lookup (isa, "call0");
   5102  1.1  skrll   xtensa_call4_opcode = xtensa_opcode_lookup (isa, "call4");
   5103  1.1  skrll   xtensa_call8_opcode = xtensa_opcode_lookup (isa, "call8");
   5104  1.1  skrll   xtensa_call12_opcode = xtensa_opcode_lookup (isa, "call12");
   5105  1.1  skrll   xtensa_callx0_opcode = xtensa_opcode_lookup (isa, "callx0");
   5106  1.1  skrll   xtensa_callx4_opcode = xtensa_opcode_lookup (isa, "callx4");
   5107  1.1  skrll   xtensa_callx8_opcode = xtensa_opcode_lookup (isa, "callx8");
   5108  1.1  skrll   xtensa_callx12_opcode = xtensa_opcode_lookup (isa, "callx12");
   5109  1.1  skrll   xtensa_const16_opcode = xtensa_opcode_lookup (isa, "const16");
   5110  1.1  skrll   xtensa_entry_opcode = xtensa_opcode_lookup (isa, "entry");
   5111  1.1  skrll   xtensa_extui_opcode = xtensa_opcode_lookup (isa, "extui");
   5112  1.1  skrll   xtensa_movi_opcode = xtensa_opcode_lookup (isa, "movi");
   5113  1.1  skrll   xtensa_movi_n_opcode = xtensa_opcode_lookup (isa, "movi.n");
   5114  1.1  skrll   xtensa_isync_opcode = xtensa_opcode_lookup (isa, "isync");
   5115  1.1  skrll   xtensa_jx_opcode = xtensa_opcode_lookup (isa, "jx");
   5116  1.1  skrll   xtensa_l32r_opcode = xtensa_opcode_lookup (isa, "l32r");
   5117  1.1  skrll   xtensa_loop_opcode = xtensa_opcode_lookup (isa, "loop");
   5118  1.1  skrll   xtensa_loopnez_opcode = xtensa_opcode_lookup (isa, "loopnez");
   5119  1.1  skrll   xtensa_loopgtz_opcode = xtensa_opcode_lookup (isa, "loopgtz");
   5120  1.1  skrll   xtensa_nop_opcode = xtensa_opcode_lookup (isa, "nop");
   5121  1.1  skrll   xtensa_nop_n_opcode = xtensa_opcode_lookup (isa, "nop.n");
   5122  1.1  skrll   xtensa_or_opcode = xtensa_opcode_lookup (isa, "or");
   5123  1.1  skrll   xtensa_ret_opcode = xtensa_opcode_lookup (isa, "ret");
   5124  1.1  skrll   xtensa_ret_n_opcode = xtensa_opcode_lookup (isa, "ret.n");
   5125  1.1  skrll   xtensa_retw_opcode = xtensa_opcode_lookup (isa, "retw");
   5126  1.1  skrll   xtensa_retw_n_opcode = xtensa_opcode_lookup (isa, "retw.n");
   5127  1.1  skrll   xtensa_rsr_lcount_opcode = xtensa_opcode_lookup (isa, "rsr.lcount");
   5128  1.1  skrll   xtensa_waiti_opcode = xtensa_opcode_lookup (isa, "waiti");
   5129  1.1  skrll 
   5130  1.1  skrll   xtensa_num_pipe_stages = xtensa_isa_num_pipe_stages (isa);
   5131  1.1  skrll 
   5132  1.1  skrll   init_op_placement_info_table ();
   5133  1.1  skrll 
   5134  1.1  skrll   /* Set up the assembly state.  */
   5135  1.1  skrll   if (!frag_now->tc_frag_data.is_assembly_state_set)
   5136  1.1  skrll     xtensa_set_frag_assembly_state (frag_now);
   5137  1.1  skrll }
   5138  1.1  skrll 
   5139  1.1  skrll 
   5140  1.1  skrll /* TC_INIT_FIX_DATA hook */
   5141  1.1  skrll 
   5142  1.1  skrll void
   5143  1.1  skrll xtensa_init_fix_data (fixS *x)
   5144  1.1  skrll {
   5145  1.1  skrll   x->tc_fix_data.slot = 0;
   5146  1.1  skrll   x->tc_fix_data.X_add_symbol = NULL;
   5147  1.1  skrll   x->tc_fix_data.X_add_number = 0;
   5148  1.1  skrll }
   5149  1.1  skrll 
   5150  1.1  skrll 
   5151  1.1  skrll /* tc_frob_label hook */
   5152  1.1  skrll 
   5153  1.1  skrll void
   5154  1.1  skrll xtensa_frob_label (symbolS *sym)
   5155  1.1  skrll {
   5156  1.1  skrll   float freq;
   5157  1.1  skrll 
   5158  1.1  skrll   if (cur_vinsn.inside_bundle)
   5159  1.1  skrll     {
   5160  1.1  skrll       as_bad (_("labels are not valid inside bundles"));
   5161  1.1  skrll       return;
   5162  1.1  skrll     }
   5163  1.1  skrll 
   5164  1.1  skrll   freq = get_subseg_target_freq (now_seg, now_subseg);
   5165  1.1  skrll 
   5166  1.1  skrll   /* Since the label was already attached to a frag associated with the
   5167  1.1  skrll      previous basic block, it now needs to be reset to the current frag.  */
   5168  1.1  skrll   symbol_set_frag (sym, frag_now);
   5169  1.1  skrll   S_SET_VALUE (sym, (valueT) frag_now_fix ());
   5170  1.1  skrll 
   5171  1.1  skrll   if (generating_literals)
   5172  1.1  skrll     xtensa_add_literal_sym (sym);
   5173  1.1  skrll   else
   5174  1.1  skrll     xtensa_add_insn_label (sym);
   5175  1.1  skrll 
   5176  1.1  skrll   if (symbol_get_tc (sym)->is_loop_target)
   5177  1.1  skrll     {
   5178  1.1  skrll       if ((get_last_insn_flags (now_seg, now_subseg)
   5179  1.1  skrll 	  & FLAG_IS_BAD_LOOPEND) != 0)
   5180  1.1  skrll 	as_bad (_("invalid last instruction for a zero-overhead loop"));
   5181  1.1  skrll 
   5182  1.1  skrll       xtensa_set_frag_assembly_state (frag_now);
   5183  1.1  skrll       frag_var (rs_machine_dependent, 4, 4, RELAX_LOOP_END,
   5184  1.1  skrll 		frag_now->fr_symbol, frag_now->fr_offset, NULL);
   5185  1.1  skrll 
   5186  1.1  skrll       xtensa_set_frag_assembly_state (frag_now);
   5187  1.1  skrll       xtensa_move_labels (frag_now, 0);
   5188  1.1  skrll     }
   5189  1.1  skrll 
   5190  1.1  skrll   /* No target aligning in the absolute section.  */
   5191  1.1  skrll   if (now_seg != absolute_section
   5192  1.1  skrll       && do_align_targets ()
   5193  1.1  skrll       && !is_unaligned_label (sym)
   5194  1.1  skrll       && !generating_literals)
   5195  1.1  skrll     {
   5196  1.1  skrll       xtensa_set_frag_assembly_state (frag_now);
   5197  1.1  skrll 
   5198  1.1  skrll       frag_var (rs_machine_dependent,
   5199  1.1  skrll 		0, (int) freq,
   5200  1.1  skrll 		RELAX_DESIRE_ALIGN_IF_TARGET,
   5201  1.1  skrll 		frag_now->fr_symbol, frag_now->fr_offset, NULL);
   5202  1.1  skrll       xtensa_set_frag_assembly_state (frag_now);
   5203  1.1  skrll       xtensa_move_labels (frag_now, 0);
   5204  1.1  skrll     }
   5205  1.1  skrll 
   5206  1.1  skrll   /* We need to mark the following properties even if we aren't aligning.  */
   5207  1.1  skrll 
   5208  1.1  skrll   /* If the label is already known to be a branch target, i.e., a
   5209  1.1  skrll      forward branch, mark the frag accordingly.  Backward branches
   5210  1.1  skrll      are handled by xg_add_branch_and_loop_targets.  */
   5211  1.1  skrll   if (symbol_get_tc (sym)->is_branch_target)
   5212  1.1  skrll     symbol_get_frag (sym)->tc_frag_data.is_branch_target = TRUE;
   5213  1.1  skrll 
   5214  1.1  skrll   /* Loops only go forward, so they can be identified here.  */
   5215  1.1  skrll   if (symbol_get_tc (sym)->is_loop_target)
   5216  1.1  skrll     symbol_get_frag (sym)->tc_frag_data.is_loop_target = TRUE;
   5217  1.1  skrll 
   5218  1.1  skrll   dwarf2_emit_label (sym);
   5219  1.1  skrll }
   5220  1.1  skrll 
   5221  1.1  skrll 
   5222  1.1  skrll /* tc_unrecognized_line hook */
   5223  1.1  skrll 
   5224  1.1  skrll int
   5225  1.1  skrll xtensa_unrecognized_line (int ch)
   5226  1.1  skrll {
   5227  1.1  skrll   switch (ch)
   5228  1.1  skrll     {
   5229  1.1  skrll     case '{' :
   5230  1.1  skrll       if (cur_vinsn.inside_bundle == 0)
   5231  1.1  skrll 	{
   5232  1.1  skrll 	  /* PR8110: Cannot emit line number info inside a FLIX bundle
   5233  1.1  skrll 	     when using --gstabs.  Temporarily disable debug info.  */
   5234  1.1  skrll 	  generate_lineno_debug ();
   5235  1.1  skrll 	  if (debug_type == DEBUG_STABS)
   5236  1.1  skrll 	    {
   5237  1.1  skrll 	      xt_saved_debug_type = debug_type;
   5238  1.1  skrll 	      debug_type = DEBUG_NONE;
   5239  1.1  skrll 	    }
   5240  1.1  skrll 
   5241  1.1  skrll 	  cur_vinsn.inside_bundle = 1;
   5242  1.1  skrll 	}
   5243  1.1  skrll       else
   5244  1.1  skrll 	{
   5245  1.1  skrll 	  as_bad (_("extra opening brace"));
   5246  1.1  skrll 	  return 0;
   5247  1.1  skrll 	}
   5248  1.1  skrll       break;
   5249  1.1  skrll 
   5250  1.1  skrll     case '}' :
   5251  1.1  skrll       if (cur_vinsn.inside_bundle)
   5252  1.1  skrll 	finish_vinsn (&cur_vinsn);
   5253  1.1  skrll       else
   5254  1.1  skrll 	{
   5255  1.1  skrll 	  as_bad (_("extra closing brace"));
   5256  1.1  skrll 	  return 0;
   5257  1.1  skrll 	}
   5258  1.1  skrll       break;
   5259  1.1  skrll     default:
   5260  1.1  skrll       as_bad (_("syntax error"));
   5261  1.1  skrll       return 0;
   5262  1.1  skrll     }
   5263  1.1  skrll   return 1;
   5264  1.1  skrll }
   5265  1.1  skrll 
   5266  1.1  skrll 
   5267  1.1  skrll /* md_flush_pending_output hook */
   5268  1.1  skrll 
   5269  1.1  skrll void
   5270  1.1  skrll xtensa_flush_pending_output (void)
   5271  1.1  skrll {
   5272  1.1  skrll   /* This line fixes a bug where automatically generated gstabs info
   5273  1.1  skrll      separates a function label from its entry instruction, ending up
   5274  1.1  skrll      with the literal position between the function label and the entry
   5275  1.1  skrll      instruction and crashing code.  It only happens with --gstabs and
   5276  1.1  skrll      --text-section-literals, and when several other obscure relaxation
   5277  1.1  skrll      conditions are met.  */
   5278  1.1  skrll   if (outputting_stabs_line_debug)
   5279  1.1  skrll     return;
   5280  1.1  skrll 
   5281  1.1  skrll   if (cur_vinsn.inside_bundle)
   5282  1.1  skrll     as_bad (_("missing closing brace"));
   5283  1.1  skrll 
   5284  1.1  skrll   /* If there is a non-zero instruction fragment, close it.  */
   5285  1.1  skrll   if (frag_now_fix () != 0 && frag_now->tc_frag_data.is_insn)
   5286  1.1  skrll     {
   5287  1.1  skrll       frag_wane (frag_now);
   5288  1.1  skrll       frag_new (0);
   5289  1.1  skrll       xtensa_set_frag_assembly_state (frag_now);
   5290  1.1  skrll     }
   5291  1.1  skrll   frag_now->tc_frag_data.is_insn = FALSE;
   5292  1.1  skrll 
   5293  1.1  skrll   xtensa_clear_insn_labels ();
   5294  1.1  skrll }
   5295  1.1  skrll 
   5296  1.1  skrll 
   5297  1.1  skrll /* We had an error while parsing an instruction.  The string might look
   5298  1.1  skrll    like this: "insn arg1, arg2 }".  If so, we need to see the closing
   5299  1.1  skrll    brace and reset some fields.  Otherwise, the vinsn never gets closed
   5300  1.1  skrll    and the num_slots field will grow past the end of the array of slots,
   5301  1.1  skrll    and bad things happen.  */
   5302  1.1  skrll 
   5303  1.1  skrll static void
   5304  1.1  skrll error_reset_cur_vinsn (void)
   5305  1.1  skrll {
   5306  1.1  skrll   if (cur_vinsn.inside_bundle)
   5307  1.1  skrll     {
   5308  1.1  skrll       if (*input_line_pointer == '}'
   5309  1.1  skrll 	  || *(input_line_pointer - 1) == '}'
   5310  1.1  skrll 	  || *(input_line_pointer - 2) == '}')
   5311  1.1  skrll 	xg_clear_vinsn (&cur_vinsn);
   5312  1.1  skrll     }
   5313  1.1  skrll }
   5314  1.1  skrll 
   5315  1.1  skrll 
   5316  1.1  skrll void
   5317  1.1  skrll md_assemble (char *str)
   5318  1.1  skrll {
   5319  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   5320  1.1  skrll   char *opname;
   5321  1.1  skrll   unsigned opnamelen;
   5322  1.1  skrll   bfd_boolean has_underbar = FALSE;
   5323  1.1  skrll   char *arg_strings[MAX_INSN_ARGS];
   5324  1.1  skrll   int num_args;
   5325  1.1  skrll   TInsn orig_insn;		/* Original instruction from the input.  */
   5326  1.1  skrll 
   5327  1.1  skrll   tinsn_init (&orig_insn);
   5328  1.1  skrll 
   5329  1.1  skrll   /* Split off the opcode.  */
   5330  1.1  skrll   opnamelen = strspn (str, "abcdefghijklmnopqrstuvwxyz_/0123456789.");
   5331  1.1  skrll   opname = xmalloc (opnamelen + 1);
   5332  1.1  skrll   memcpy (opname, str, opnamelen);
   5333  1.1  skrll   opname[opnamelen] = '\0';
   5334  1.1  skrll 
   5335  1.1  skrll   num_args = tokenize_arguments (arg_strings, str + opnamelen);
   5336  1.1  skrll   if (num_args == -1)
   5337  1.1  skrll     {
   5338  1.1  skrll       as_bad (_("syntax error"));
   5339  1.1  skrll       return;
   5340  1.1  skrll     }
   5341  1.1  skrll 
   5342  1.1  skrll   if (xg_translate_idioms (&opname, &num_args, arg_strings))
   5343  1.1  skrll     return;
   5344  1.1  skrll 
   5345  1.1  skrll   /* Check for an underbar prefix.  */
   5346  1.1  skrll   if (*opname == '_')
   5347  1.1  skrll     {
   5348  1.1  skrll       has_underbar = TRUE;
   5349  1.1  skrll       opname += 1;
   5350  1.1  skrll     }
   5351  1.1  skrll 
   5352  1.1  skrll   orig_insn.insn_type = ITYPE_INSN;
   5353  1.1  skrll   orig_insn.ntok = 0;
   5354  1.1  skrll   orig_insn.is_specific_opcode = (has_underbar || !use_transform ());
   5355  1.1  skrll   orig_insn.opcode = xtensa_opcode_lookup (isa, opname);
   5356  1.1  skrll 
   5357  1.1  skrll   /* Special case: Check for "CALLXn.TLS" psuedo op.  If found, grab its
   5358  1.1  skrll      extra argument and set the opcode to "CALLXn".  */
   5359  1.1  skrll   if (orig_insn.opcode == XTENSA_UNDEFINED
   5360  1.1  skrll       && strncasecmp (opname, "callx", 5) == 0)
   5361  1.1  skrll     {
   5362  1.1  skrll       unsigned long window_size;
   5363  1.1  skrll       char *suffix;
   5364  1.1  skrll 
   5365  1.1  skrll       window_size = strtoul (opname + 5, &suffix, 10);
   5366  1.1  skrll       if (suffix != opname + 5
   5367  1.1  skrll 	  && (window_size == 0
   5368  1.1  skrll 	      || window_size == 4
   5369  1.1  skrll 	      || window_size == 8
   5370  1.1  skrll 	      || window_size == 12)
   5371  1.1  skrll 	  && strcasecmp (suffix, ".tls") == 0)
   5372  1.1  skrll 	{
   5373  1.1  skrll 	  switch (window_size)
   5374  1.1  skrll 	    {
   5375  1.1  skrll 	    case 0: orig_insn.opcode = xtensa_callx0_opcode; break;
   5376  1.1  skrll 	    case 4: orig_insn.opcode = xtensa_callx4_opcode; break;
   5377  1.1  skrll 	    case 8: orig_insn.opcode = xtensa_callx8_opcode; break;
   5378  1.1  skrll 	    case 12: orig_insn.opcode = xtensa_callx12_opcode; break;
   5379  1.1  skrll 	    }
   5380  1.1  skrll 
   5381  1.1  skrll 	  if (num_args != 2)
   5382  1.1  skrll 	    as_bad (_("wrong number of operands for '%s'"), opname);
   5383  1.1  skrll 	  else
   5384  1.1  skrll 	    {
   5385  1.1  skrll 	      bfd_reloc_code_real_type reloc;
   5386  1.1  skrll 	      char *old_input_line_pointer;
   5387  1.1  skrll 	      expressionS *tok = &orig_insn.tls_reloc;
   5388  1.1  skrll 	      segT t;
   5389  1.1  skrll 
   5390  1.1  skrll 	      old_input_line_pointer = input_line_pointer;
   5391  1.1  skrll 	      input_line_pointer = arg_strings[num_args - 1];
   5392  1.1  skrll 
   5393  1.1  skrll 	      t = expression (tok);
   5394  1.1  skrll 	      if (tok->X_op == O_symbol
   5395  1.1  skrll 		  && ((reloc = xtensa_elf_suffix (&input_line_pointer, tok))
   5396  1.1  skrll 		      == BFD_RELOC_XTENSA_TLS_CALL))
   5397  1.1  skrll 		tok->X_op = map_suffix_reloc_to_operator (reloc);
   5398  1.1  skrll 	      else
   5399  1.1  skrll 		as_bad (_("bad relocation expression for '%s'"), opname);
   5400  1.1  skrll 
   5401  1.1  skrll 	      input_line_pointer = old_input_line_pointer;
   5402  1.1  skrll 	      num_args -= 1;
   5403  1.1  skrll 	    }
   5404  1.1  skrll 	}
   5405  1.1  skrll     }
   5406  1.1  skrll 
   5407  1.1  skrll   if (orig_insn.opcode == XTENSA_UNDEFINED)
   5408  1.1  skrll     {
   5409  1.1  skrll       xtensa_format fmt = xtensa_format_lookup (isa, opname);
   5410  1.1  skrll       if (fmt == XTENSA_UNDEFINED)
   5411  1.1  skrll 	{
   5412  1.1  skrll 	  as_bad (_("unknown opcode or format name '%s'"), opname);
   5413  1.1  skrll 	  error_reset_cur_vinsn ();
   5414  1.1  skrll 	  return;
   5415  1.1  skrll 	}
   5416  1.1  skrll       if (!cur_vinsn.inside_bundle)
   5417  1.1  skrll 	{
   5418  1.1  skrll 	  as_bad (_("format names only valid inside bundles"));
   5419  1.1  skrll 	  error_reset_cur_vinsn ();
   5420  1.1  skrll 	  return;
   5421  1.1  skrll 	}
   5422  1.1  skrll       if (cur_vinsn.format != XTENSA_UNDEFINED)
   5423  1.1  skrll 	as_warn (_("multiple formats specified for one bundle; using '%s'"),
   5424  1.1  skrll 		 opname);
   5425  1.1  skrll       cur_vinsn.format = fmt;
   5426  1.1  skrll       free (has_underbar ? opname - 1 : opname);
   5427  1.1  skrll       error_reset_cur_vinsn ();
   5428  1.1  skrll       return;
   5429  1.1  skrll     }
   5430  1.1  skrll 
   5431  1.1  skrll   /* Parse the arguments.  */
   5432  1.1  skrll   if (parse_arguments (&orig_insn, num_args, arg_strings))
   5433  1.1  skrll     {
   5434  1.1  skrll       as_bad (_("syntax error"));
   5435  1.1  skrll       error_reset_cur_vinsn ();
   5436  1.1  skrll       return;
   5437  1.1  skrll     }
   5438  1.1  skrll 
   5439  1.1  skrll   /* Free the opcode and argument strings, now that they've been parsed.  */
   5440  1.1  skrll   free (has_underbar ? opname - 1 : opname);
   5441  1.1  skrll   opname = 0;
   5442  1.1  skrll   while (num_args-- > 0)
   5443  1.1  skrll     free (arg_strings[num_args]);
   5444  1.1  skrll 
   5445  1.1  skrll   /* Get expressions for invisible operands.  */
   5446  1.1  skrll   if (get_invisible_operands (&orig_insn))
   5447  1.1  skrll     {
   5448  1.1  skrll       error_reset_cur_vinsn ();
   5449  1.1  skrll       return;
   5450  1.1  skrll     }
   5451  1.1  skrll 
   5452  1.1  skrll   /* Check for the right number and type of arguments.  */
   5453  1.1  skrll   if (tinsn_check_arguments (&orig_insn))
   5454  1.1  skrll     {
   5455  1.1  skrll       error_reset_cur_vinsn ();
   5456  1.1  skrll       return;
   5457  1.1  skrll     }
   5458  1.1  skrll 
   5459  1.1  skrll   /* Record the line number for each TInsn, because a FLIX bundle may be
   5460  1.1  skrll      spread across multiple input lines and individual instructions may be
   5461  1.1  skrll      moved around in some cases.  */
   5462  1.1  skrll   orig_insn.loc_directive_seen = dwarf2_loc_directive_seen;
   5463  1.1  skrll   dwarf2_where (&orig_insn.debug_line);
   5464  1.1  skrll   dwarf2_consume_line_info ();
   5465  1.1  skrll 
   5466  1.1  skrll   xg_add_branch_and_loop_targets (&orig_insn);
   5467  1.1  skrll 
   5468  1.1  skrll   /* Check that immediate value for ENTRY is >= 16.  */
   5469  1.1  skrll   if (orig_insn.opcode == xtensa_entry_opcode && orig_insn.ntok >= 3)
   5470  1.1  skrll     {
   5471  1.1  skrll       expressionS *exp = &orig_insn.tok[2];
   5472  1.1  skrll       if (exp->X_op == O_constant && exp->X_add_number < 16)
   5473  1.1  skrll 	as_warn (_("entry instruction with stack decrement < 16"));
   5474  1.1  skrll     }
   5475  1.1  skrll 
   5476  1.1  skrll   /* Finish it off:
   5477  1.1  skrll      assemble_tokens (opcode, tok, ntok);
   5478  1.1  skrll      expand the tokens from the orig_insn into the
   5479  1.1  skrll      stack of instructions that will not expand
   5480  1.1  skrll      unless required at relaxation time.  */
   5481  1.1  skrll 
   5482  1.1  skrll   if (!cur_vinsn.inside_bundle)
   5483  1.1  skrll     emit_single_op (&orig_insn);
   5484  1.1  skrll   else /* We are inside a bundle.  */
   5485  1.1  skrll     {
   5486  1.1  skrll       cur_vinsn.slots[cur_vinsn.num_slots] = orig_insn;
   5487  1.1  skrll       cur_vinsn.num_slots++;
   5488  1.1  skrll       if (*input_line_pointer == '}'
   5489  1.1  skrll 	  || *(input_line_pointer - 1) == '}'
   5490  1.1  skrll 	  || *(input_line_pointer - 2) == '}')
   5491  1.1  skrll 	finish_vinsn (&cur_vinsn);
   5492  1.1  skrll     }
   5493  1.1  skrll 
   5494  1.1  skrll   /* We've just emitted a new instruction so clear the list of labels.  */
   5495  1.1  skrll   xtensa_clear_insn_labels ();
   5496  1.1  skrll }
   5497  1.1  skrll 
   5498  1.1  skrll 
   5499  1.1  skrll /* HANDLE_ALIGN hook */
   5500  1.1  skrll 
   5501  1.1  skrll /* For a .align directive, we mark the previous block with the alignment
   5502  1.1  skrll    information.  This will be placed in the object file in the
   5503  1.1  skrll    property section corresponding to this section.  */
   5504  1.1  skrll 
   5505  1.1  skrll void
   5506  1.1  skrll xtensa_handle_align (fragS *fragP)
   5507  1.1  skrll {
   5508  1.1  skrll   if (linkrelax
   5509  1.1  skrll       && ! fragP->tc_frag_data.is_literal
   5510  1.1  skrll       && (fragP->fr_type == rs_align
   5511  1.1  skrll 	  || fragP->fr_type == rs_align_code)
   5512  1.1  skrll       && fragP->fr_address + fragP->fr_fix > 0
   5513  1.1  skrll       && fragP->fr_offset > 0
   5514  1.1  skrll       && now_seg != bss_section)
   5515  1.1  skrll     {
   5516  1.1  skrll       fragP->tc_frag_data.is_align = TRUE;
   5517  1.1  skrll       fragP->tc_frag_data.alignment = fragP->fr_offset;
   5518  1.1  skrll     }
   5519  1.1  skrll 
   5520  1.1  skrll   if (fragP->fr_type == rs_align_test)
   5521  1.1  skrll     {
   5522  1.1  skrll       int count;
   5523  1.1  skrll       count = fragP->fr_next->fr_address - fragP->fr_address - fragP->fr_fix;
   5524  1.1  skrll       if (count != 0)
   5525  1.1  skrll 	as_bad_where (fragP->fr_file, fragP->fr_line,
   5526  1.1  skrll 		      _("unaligned entry instruction"));
   5527  1.1  skrll     }
   5528  1.1  skrll 
   5529  1.1  skrll   if (linkrelax && fragP->fr_type == rs_org)
   5530  1.1  skrll     fragP->fr_subtype = RELAX_ORG;
   5531  1.1  skrll }
   5532  1.1  skrll 
   5533  1.1  skrll 
   5534  1.1  skrll /* TC_FRAG_INIT hook */
   5535  1.1  skrll 
   5536  1.1  skrll void
   5537  1.1  skrll xtensa_frag_init (fragS *frag)
   5538  1.1  skrll {
   5539  1.1  skrll   xtensa_set_frag_assembly_state (frag);
   5540  1.1  skrll }
   5541  1.1  skrll 
   5542  1.1  skrll 
   5543  1.1  skrll symbolS *
   5544  1.1  skrll md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
   5545  1.1  skrll {
   5546  1.1  skrll   return NULL;
   5547  1.1  skrll }
   5548  1.1  skrll 
   5549  1.1  skrll 
   5550  1.1  skrll /* Round up a section size to the appropriate boundary.  */
   5551  1.1  skrll 
   5552  1.1  skrll valueT
   5553  1.1  skrll md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
   5554  1.1  skrll {
   5555  1.1  skrll   return size;			/* Byte alignment is fine.  */
   5556  1.1  skrll }
   5557  1.1  skrll 
   5558  1.1  skrll 
   5559  1.1  skrll long
   5560  1.1  skrll md_pcrel_from (fixS *fixP)
   5561  1.1  skrll {
   5562  1.1  skrll   char *insn_p;
   5563  1.1  skrll   static xtensa_insnbuf insnbuf = NULL;
   5564  1.1  skrll   static xtensa_insnbuf slotbuf = NULL;
   5565  1.1  skrll   int opnum;
   5566  1.1  skrll   uint32 opnd_value;
   5567  1.1  skrll   xtensa_opcode opcode;
   5568  1.1  skrll   xtensa_format fmt;
   5569  1.1  skrll   int slot;
   5570  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   5571  1.1  skrll   valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
   5572  1.1  skrll   bfd_boolean alt_reloc;
   5573  1.1  skrll 
   5574  1.1  skrll   if (fixP->fx_r_type == BFD_RELOC_XTENSA_ASM_EXPAND)
   5575  1.1  skrll     return 0;
   5576  1.1  skrll 
   5577  1.1  skrll   if (fixP->fx_r_type == BFD_RELOC_32_PCREL)
   5578  1.1  skrll     return addr;
   5579  1.1  skrll 
   5580  1.1  skrll   if (!insnbuf)
   5581  1.1  skrll     {
   5582  1.1  skrll       insnbuf = xtensa_insnbuf_alloc (isa);
   5583  1.1  skrll       slotbuf = xtensa_insnbuf_alloc (isa);
   5584  1.1  skrll     }
   5585  1.1  skrll 
   5586  1.1  skrll   insn_p = &fixP->fx_frag->fr_literal[fixP->fx_where];
   5587  1.1  skrll   xtensa_insnbuf_from_chars (isa, insnbuf, (unsigned char *) insn_p, 0);
   5588  1.1  skrll   fmt = xtensa_format_decode (isa, insnbuf);
   5589  1.1  skrll 
   5590  1.1  skrll   if (fmt == XTENSA_UNDEFINED)
   5591  1.1  skrll     as_fatal (_("bad instruction format"));
   5592  1.1  skrll 
   5593  1.1  skrll   if (decode_reloc (fixP->fx_r_type, &slot, &alt_reloc) != 0)
   5594  1.1  skrll     as_fatal (_("invalid relocation"));
   5595  1.1  skrll 
   5596  1.1  skrll   xtensa_format_get_slot (isa, fmt, slot, insnbuf, slotbuf);
   5597  1.1  skrll   opcode = xtensa_opcode_decode (isa, fmt, slot, slotbuf);
   5598  1.1  skrll 
   5599  1.1  skrll   /* Check for "alternate" relocations (operand not specified).  None
   5600  1.1  skrll      of the current uses for these are really PC-relative.  */
   5601  1.1  skrll   if (alt_reloc || opcode == xtensa_const16_opcode)
   5602  1.1  skrll     {
   5603  1.1  skrll       if (opcode != xtensa_l32r_opcode
   5604  1.1  skrll 	  && opcode != xtensa_const16_opcode)
   5605  1.1  skrll 	as_fatal (_("invalid relocation for '%s' instruction"),
   5606  1.1  skrll 		  xtensa_opcode_name (isa, opcode));
   5607  1.1  skrll       return 0;
   5608  1.1  skrll     }
   5609  1.1  skrll 
   5610  1.1  skrll   opnum = get_relaxable_immed (opcode);
   5611  1.1  skrll   opnd_value = 0;
   5612  1.1  skrll   if (xtensa_operand_is_PCrelative (isa, opcode, opnum) != 1
   5613  1.1  skrll       || xtensa_operand_do_reloc (isa, opcode, opnum, &opnd_value, addr))
   5614  1.1  skrll     {
   5615  1.1  skrll       as_bad_where (fixP->fx_file,
   5616  1.1  skrll 		    fixP->fx_line,
   5617  1.1  skrll 		    _("invalid relocation for operand %d of '%s'"),
   5618  1.1  skrll 		    opnum, xtensa_opcode_name (isa, opcode));
   5619  1.1  skrll       return 0;
   5620  1.1  skrll     }
   5621  1.1  skrll   return 0 - opnd_value;
   5622  1.1  skrll }
   5623  1.1  skrll 
   5624  1.1  skrll 
   5625  1.1  skrll /* TC_FORCE_RELOCATION hook */
   5626  1.1  skrll 
   5627  1.1  skrll int
   5628  1.1  skrll xtensa_force_relocation (fixS *fix)
   5629  1.1  skrll {
   5630  1.1  skrll   switch (fix->fx_r_type)
   5631  1.1  skrll     {
   5632  1.1  skrll     case BFD_RELOC_XTENSA_ASM_EXPAND:
   5633  1.1  skrll     case BFD_RELOC_XTENSA_SLOT0_ALT:
   5634  1.1  skrll     case BFD_RELOC_XTENSA_SLOT1_ALT:
   5635  1.1  skrll     case BFD_RELOC_XTENSA_SLOT2_ALT:
   5636  1.1  skrll     case BFD_RELOC_XTENSA_SLOT3_ALT:
   5637  1.1  skrll     case BFD_RELOC_XTENSA_SLOT4_ALT:
   5638  1.1  skrll     case BFD_RELOC_XTENSA_SLOT5_ALT:
   5639  1.1  skrll     case BFD_RELOC_XTENSA_SLOT6_ALT:
   5640  1.1  skrll     case BFD_RELOC_XTENSA_SLOT7_ALT:
   5641  1.1  skrll     case BFD_RELOC_XTENSA_SLOT8_ALT:
   5642  1.1  skrll     case BFD_RELOC_XTENSA_SLOT9_ALT:
   5643  1.1  skrll     case BFD_RELOC_XTENSA_SLOT10_ALT:
   5644  1.1  skrll     case BFD_RELOC_XTENSA_SLOT11_ALT:
   5645  1.1  skrll     case BFD_RELOC_XTENSA_SLOT12_ALT:
   5646  1.1  skrll     case BFD_RELOC_XTENSA_SLOT13_ALT:
   5647  1.1  skrll     case BFD_RELOC_XTENSA_SLOT14_ALT:
   5648  1.1  skrll       return 1;
   5649  1.1  skrll     default:
   5650  1.1  skrll       break;
   5651  1.1  skrll     }
   5652  1.1  skrll 
   5653  1.1  skrll   if (linkrelax && fix->fx_addsy
   5654  1.1  skrll       && relaxable_section (S_GET_SEGMENT (fix->fx_addsy)))
   5655  1.1  skrll     return 1;
   5656  1.1  skrll 
   5657  1.1  skrll   return generic_force_reloc (fix);
   5658  1.1  skrll }
   5659  1.1  skrll 
   5660  1.1  skrll 
   5661  1.1  skrll /* TC_VALIDATE_FIX_SUB hook */
   5662  1.1  skrll 
   5663  1.1  skrll int
   5664  1.1  skrll xtensa_validate_fix_sub (fixS *fix)
   5665  1.1  skrll {
   5666  1.1  skrll   segT add_symbol_segment, sub_symbol_segment;
   5667  1.1  skrll 
   5668  1.1  skrll   /* The difference of two symbols should be resolved by the assembler when
   5669  1.1  skrll      linkrelax is not set.  If the linker may relax the section containing
   5670  1.1  skrll      the symbols, then an Xtensa DIFF relocation must be generated so that
   5671  1.1  skrll      the linker knows to adjust the difference value.  */
   5672  1.1  skrll   if (!linkrelax || fix->fx_addsy == NULL)
   5673  1.1  skrll     return 0;
   5674  1.1  skrll 
   5675  1.1  skrll   /* Make sure both symbols are in the same segment, and that segment is
   5676  1.1  skrll      "normal" and relaxable.  If the segment is not "normal", then the
   5677  1.1  skrll      fix is not valid.  If the segment is not "relaxable", then the fix
   5678  1.1  skrll      should have been handled earlier.  */
   5679  1.1  skrll   add_symbol_segment = S_GET_SEGMENT (fix->fx_addsy);
   5680  1.1  skrll   if (! SEG_NORMAL (add_symbol_segment) ||
   5681  1.1  skrll       ! relaxable_section (add_symbol_segment))
   5682  1.1  skrll     return 0;
   5683  1.1  skrll   sub_symbol_segment = S_GET_SEGMENT (fix->fx_subsy);
   5684  1.1  skrll   return (sub_symbol_segment == add_symbol_segment);
   5685  1.1  skrll }
   5686  1.1  skrll 
   5687  1.1  skrll 
   5688  1.1  skrll /* NO_PSEUDO_DOT hook */
   5689  1.1  skrll 
   5690  1.1  skrll /* This function has nothing to do with pseudo dots, but this is the
   5691  1.1  skrll    nearest macro to where the check needs to take place.  FIXME: This
   5692  1.1  skrll    seems wrong.  */
   5693  1.1  skrll 
   5694  1.1  skrll bfd_boolean
   5695  1.1  skrll xtensa_check_inside_bundle (void)
   5696  1.1  skrll {
   5697  1.1  skrll   if (cur_vinsn.inside_bundle && input_line_pointer[-1] == '.')
   5698  1.1  skrll     as_bad (_("directives are not valid inside bundles"));
   5699  1.1  skrll 
   5700  1.1  skrll   /* This function must always return FALSE because it is called via a
   5701  1.1  skrll      macro that has nothing to do with bundling.  */
   5702  1.1  skrll   return FALSE;
   5703  1.1  skrll }
   5704  1.1  skrll 
   5705  1.1  skrll 
   5706  1.1  skrll /* md_elf_section_change_hook */
   5707  1.1  skrll 
   5708  1.1  skrll void
   5709  1.1  skrll xtensa_elf_section_change_hook (void)
   5710  1.1  skrll {
   5711  1.1  skrll   /* Set up the assembly state.  */
   5712  1.1  skrll   if (!frag_now->tc_frag_data.is_assembly_state_set)
   5713  1.1  skrll     xtensa_set_frag_assembly_state (frag_now);
   5714  1.1  skrll }
   5715  1.1  skrll 
   5716  1.1  skrll 
   5717  1.1  skrll /* tc_fix_adjustable hook */
   5718  1.1  skrll 
   5719  1.1  skrll bfd_boolean
   5720  1.1  skrll xtensa_fix_adjustable (fixS *fixP)
   5721  1.1  skrll {
   5722  1.1  skrll   /* An offset is not allowed in combination with the difference of two
   5723  1.1  skrll      symbols, but that cannot be easily detected after a local symbol
   5724  1.1  skrll      has been adjusted to a (section+offset) form.  Return 0 so that such
   5725  1.1  skrll      an fix will not be adjusted.  */
   5726  1.1  skrll   if (fixP->fx_subsy && fixP->fx_addsy && fixP->fx_offset
   5727  1.1  skrll       && relaxable_section (S_GET_SEGMENT (fixP->fx_subsy)))
   5728  1.1  skrll     return 0;
   5729  1.1  skrll 
   5730  1.1  skrll   /* We need the symbol name for the VTABLE entries.  */
   5731  1.1  skrll   if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
   5732  1.1  skrll       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
   5733  1.1  skrll     return 0;
   5734  1.1  skrll 
   5735  1.1  skrll   return 1;
   5736  1.1  skrll }
   5737  1.1  skrll 
   5738  1.1  skrll 
   5739  1.1  skrll /* tc_symbol_new_hook */
   5740  1.1  skrll 
   5741  1.1  skrll symbolS *expr_symbols = NULL;
   5742  1.1  skrll 
   5743  1.1  skrll void
   5744  1.1  skrll xtensa_symbol_new_hook (symbolS *sym)
   5745  1.1  skrll {
   5746  1.1  skrll   if (is_leb128_expr && S_GET_SEGMENT (sym) == expr_section)
   5747  1.1  skrll     {
   5748  1.1  skrll       symbol_get_tc (sym)->next_expr_symbol = expr_symbols;
   5749  1.1  skrll       expr_symbols = sym;
   5750  1.1  skrll     }
   5751  1.1  skrll }
   5752  1.1  skrll 
   5753  1.1  skrll 
   5754  1.1  skrll void
   5755  1.1  skrll md_apply_fix (fixS *fixP, valueT *valP, segT seg)
   5756  1.1  skrll {
   5757  1.1  skrll   char *const fixpos = fixP->fx_frag->fr_literal + fixP->fx_where;
   5758  1.1  skrll   valueT val = 0;
   5759  1.1  skrll 
   5760  1.1  skrll   /* Subtracted symbols are only allowed for a few relocation types, and
   5761  1.1  skrll      unless linkrelax is enabled, they should not make it to this point.  */
   5762  1.1  skrll   if (fixP->fx_subsy && !(linkrelax && (fixP->fx_r_type == BFD_RELOC_32
   5763  1.1  skrll 					|| fixP->fx_r_type == BFD_RELOC_16
   5764  1.1  skrll 					|| fixP->fx_r_type == BFD_RELOC_8)))
   5765  1.1  skrll     as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
   5766  1.1  skrll 
   5767  1.1  skrll   switch (fixP->fx_r_type)
   5768  1.1  skrll     {
   5769  1.1  skrll     case BFD_RELOC_32_PCREL:
   5770  1.1  skrll     case BFD_RELOC_32:
   5771  1.1  skrll     case BFD_RELOC_16:
   5772  1.1  skrll     case BFD_RELOC_8:
   5773  1.1  skrll       if (fixP->fx_subsy)
   5774  1.1  skrll 	{
   5775  1.1  skrll 	  switch (fixP->fx_r_type)
   5776  1.1  skrll 	    {
   5777  1.1  skrll 	    case BFD_RELOC_8:
   5778  1.1  skrll 	      fixP->fx_r_type = BFD_RELOC_XTENSA_DIFF8;
   5779  1.1  skrll 	      break;
   5780  1.1  skrll 	    case BFD_RELOC_16:
   5781  1.1  skrll 	      fixP->fx_r_type = BFD_RELOC_XTENSA_DIFF16;
   5782  1.1  skrll 	      break;
   5783  1.1  skrll 	    case BFD_RELOC_32:
   5784  1.1  skrll 	      fixP->fx_r_type = BFD_RELOC_XTENSA_DIFF32;
   5785  1.1  skrll 	      break;
   5786  1.1  skrll 	    default:
   5787  1.1  skrll 	      break;
   5788  1.1  skrll 	    }
   5789  1.1  skrll 
   5790  1.1  skrll 	  /* An offset is only allowed when it results from adjusting a
   5791  1.1  skrll 	     local symbol into a section-relative offset.  If the offset
   5792  1.1  skrll 	     came from the original expression, tc_fix_adjustable will have
   5793  1.1  skrll 	     prevented the fix from being converted to a section-relative
   5794  1.1  skrll 	     form so that we can flag the error here.  */
   5795  1.1  skrll 	  if (fixP->fx_offset != 0 && !symbol_section_p (fixP->fx_addsy))
   5796  1.1  skrll 	    as_bad_where (fixP->fx_file, fixP->fx_line,
   5797  1.1  skrll 			  _("cannot represent subtraction with an offset"));
   5798  1.1  skrll 
   5799  1.1  skrll 	  val = (S_GET_VALUE (fixP->fx_addsy) + fixP->fx_offset
   5800  1.1  skrll 		 - S_GET_VALUE (fixP->fx_subsy));
   5801  1.1  skrll 
   5802  1.1  skrll 	  /* The difference value gets written out, and the DIFF reloc
   5803  1.1  skrll 	     identifies the address of the subtracted symbol (i.e., the one
   5804  1.1  skrll 	     with the lowest address).  */
   5805  1.1  skrll 	  *valP = val;
   5806  1.1  skrll 	  fixP->fx_offset -= val;
   5807  1.1  skrll 	  fixP->fx_subsy = NULL;
   5808  1.1  skrll 	}
   5809  1.1  skrll       else if (! fixP->fx_addsy)
   5810  1.1  skrll 	{
   5811  1.1  skrll 	  val = *valP;
   5812  1.1  skrll 	  fixP->fx_done = 1;
   5813  1.1  skrll 	}
   5814  1.1  skrll       /* fall through */
   5815  1.1  skrll 
   5816  1.1  skrll     case BFD_RELOC_XTENSA_PLT:
   5817  1.1  skrll       md_number_to_chars (fixpos, val, fixP->fx_size);
   5818  1.1  skrll       fixP->fx_no_overflow = 0; /* Use the standard overflow check.  */
   5819  1.1  skrll       break;
   5820  1.1  skrll 
   5821  1.1  skrll     case BFD_RELOC_XTENSA_TLSDESC_FN:
   5822  1.1  skrll     case BFD_RELOC_XTENSA_TLSDESC_ARG:
   5823  1.1  skrll     case BFD_RELOC_XTENSA_TLS_TPOFF:
   5824  1.1  skrll     case BFD_RELOC_XTENSA_TLS_DTPOFF:
   5825  1.1  skrll       S_SET_THREAD_LOCAL (fixP->fx_addsy);
   5826  1.1  skrll       md_number_to_chars (fixpos, 0, fixP->fx_size);
   5827  1.1  skrll       fixP->fx_no_overflow = 0; /* Use the standard overflow check.  */
   5828  1.1  skrll       break;
   5829  1.1  skrll 
   5830  1.1  skrll     case BFD_RELOC_XTENSA_SLOT0_OP:
   5831  1.1  skrll     case BFD_RELOC_XTENSA_SLOT1_OP:
   5832  1.1  skrll     case BFD_RELOC_XTENSA_SLOT2_OP:
   5833  1.1  skrll     case BFD_RELOC_XTENSA_SLOT3_OP:
   5834  1.1  skrll     case BFD_RELOC_XTENSA_SLOT4_OP:
   5835  1.1  skrll     case BFD_RELOC_XTENSA_SLOT5_OP:
   5836  1.1  skrll     case BFD_RELOC_XTENSA_SLOT6_OP:
   5837  1.1  skrll     case BFD_RELOC_XTENSA_SLOT7_OP:
   5838  1.1  skrll     case BFD_RELOC_XTENSA_SLOT8_OP:
   5839  1.1  skrll     case BFD_RELOC_XTENSA_SLOT9_OP:
   5840  1.1  skrll     case BFD_RELOC_XTENSA_SLOT10_OP:
   5841  1.1  skrll     case BFD_RELOC_XTENSA_SLOT11_OP:
   5842  1.1  skrll     case BFD_RELOC_XTENSA_SLOT12_OP:
   5843  1.1  skrll     case BFD_RELOC_XTENSA_SLOT13_OP:
   5844  1.1  skrll     case BFD_RELOC_XTENSA_SLOT14_OP:
   5845  1.1  skrll       if (linkrelax)
   5846  1.1  skrll 	{
   5847  1.1  skrll 	  /* Write the tentative value of a PC-relative relocation to a
   5848  1.1  skrll 	     local symbol into the instruction.  The value will be ignored
   5849  1.1  skrll 	     by the linker, and it makes the object file disassembly
   5850  1.1  skrll 	     readable when all branch targets are encoded in relocations.  */
   5851  1.1  skrll 
   5852  1.1  skrll 	  assert (fixP->fx_addsy);
   5853  1.1  skrll 	  if (S_GET_SEGMENT (fixP->fx_addsy) == seg
   5854  1.1  skrll 	      && !S_FORCE_RELOC (fixP->fx_addsy, 1))
   5855  1.1  skrll 	    {
   5856  1.1  skrll 	      val = (S_GET_VALUE (fixP->fx_addsy) + fixP->fx_offset
   5857  1.1  skrll 		     - md_pcrel_from (fixP));
   5858  1.1  skrll 	      (void) xg_apply_fix_value (fixP, val);
   5859  1.1  skrll 	    }
   5860  1.1  skrll 	}
   5861  1.1  skrll       else if (! fixP->fx_addsy)
   5862  1.1  skrll 	{
   5863  1.1  skrll 	  val = *valP;
   5864  1.1  skrll 	  if (xg_apply_fix_value (fixP, val))
   5865  1.1  skrll 	    fixP->fx_done = 1;
   5866  1.1  skrll 	}
   5867  1.1  skrll       break;
   5868  1.1  skrll 
   5869  1.1  skrll     case BFD_RELOC_XTENSA_ASM_EXPAND:
   5870  1.1  skrll     case BFD_RELOC_XTENSA_TLS_FUNC:
   5871  1.1  skrll     case BFD_RELOC_XTENSA_TLS_ARG:
   5872  1.1  skrll     case BFD_RELOC_XTENSA_TLS_CALL:
   5873  1.1  skrll     case BFD_RELOC_XTENSA_SLOT0_ALT:
   5874  1.1  skrll     case BFD_RELOC_XTENSA_SLOT1_ALT:
   5875  1.1  skrll     case BFD_RELOC_XTENSA_SLOT2_ALT:
   5876  1.1  skrll     case BFD_RELOC_XTENSA_SLOT3_ALT:
   5877  1.1  skrll     case BFD_RELOC_XTENSA_SLOT4_ALT:
   5878  1.1  skrll     case BFD_RELOC_XTENSA_SLOT5_ALT:
   5879  1.1  skrll     case BFD_RELOC_XTENSA_SLOT6_ALT:
   5880  1.1  skrll     case BFD_RELOC_XTENSA_SLOT7_ALT:
   5881  1.1  skrll     case BFD_RELOC_XTENSA_SLOT8_ALT:
   5882  1.1  skrll     case BFD_RELOC_XTENSA_SLOT9_ALT:
   5883  1.1  skrll     case BFD_RELOC_XTENSA_SLOT10_ALT:
   5884  1.1  skrll     case BFD_RELOC_XTENSA_SLOT11_ALT:
   5885  1.1  skrll     case BFD_RELOC_XTENSA_SLOT12_ALT:
   5886  1.1  skrll     case BFD_RELOC_XTENSA_SLOT13_ALT:
   5887  1.1  skrll     case BFD_RELOC_XTENSA_SLOT14_ALT:
   5888  1.1  skrll       /* These all need to be resolved at link-time.  Do nothing now.  */
   5889  1.1  skrll       break;
   5890  1.1  skrll 
   5891  1.1  skrll     case BFD_RELOC_VTABLE_INHERIT:
   5892  1.1  skrll     case BFD_RELOC_VTABLE_ENTRY:
   5893  1.1  skrll       fixP->fx_done = 0;
   5894  1.1  skrll       break;
   5895  1.1  skrll 
   5896  1.1  skrll     default:
   5897  1.1  skrll       as_bad (_("unhandled local relocation fix %s"),
   5898  1.1  skrll 	      bfd_get_reloc_code_name (fixP->fx_r_type));
   5899  1.1  skrll     }
   5900  1.1  skrll }
   5901  1.1  skrll 
   5902  1.1  skrll 
   5903  1.1  skrll char *
   5904  1.1  skrll md_atof (int type, char *litP, int *sizeP)
   5905  1.1  skrll {
   5906  1.1  skrll   return ieee_md_atof (type, litP, sizeP, target_big_endian);
   5907  1.1  skrll }
   5908  1.1  skrll 
   5909  1.1  skrll 
   5910  1.1  skrll int
   5911  1.1  skrll md_estimate_size_before_relax (fragS *fragP, segT seg ATTRIBUTE_UNUSED)
   5912  1.1  skrll {
   5913  1.1  skrll   return total_frag_text_expansion (fragP);
   5914  1.1  skrll }
   5915  1.1  skrll 
   5916  1.1  skrll 
   5917  1.1  skrll /* Translate internal representation of relocation info to BFD target
   5918  1.1  skrll    format.  */
   5919  1.1  skrll 
   5920  1.1  skrll arelent *
   5921  1.1  skrll tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
   5922  1.1  skrll {
   5923  1.1  skrll   arelent *reloc;
   5924  1.1  skrll 
   5925  1.1  skrll   reloc = (arelent *) xmalloc (sizeof (arelent));
   5926  1.1  skrll   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
   5927  1.1  skrll   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
   5928  1.1  skrll   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
   5929  1.1  skrll 
   5930  1.1  skrll   /* Make sure none of our internal relocations make it this far.
   5931  1.1  skrll      They'd better have been fully resolved by this point.  */
   5932  1.1  skrll   assert ((int) fixp->fx_r_type > 0);
   5933  1.1  skrll 
   5934  1.1  skrll   reloc->addend = fixp->fx_offset;
   5935  1.1  skrll 
   5936  1.1  skrll   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
   5937  1.1  skrll   if (reloc->howto == NULL)
   5938  1.1  skrll     {
   5939  1.1  skrll       as_bad_where (fixp->fx_file, fixp->fx_line,
   5940  1.1  skrll 		    _("cannot represent `%s' relocation in object file"),
   5941  1.1  skrll 		    bfd_get_reloc_code_name (fixp->fx_r_type));
   5942  1.1  skrll       free (reloc->sym_ptr_ptr);
   5943  1.1  skrll       free (reloc);
   5944  1.1  skrll       return NULL;
   5945  1.1  skrll     }
   5946  1.1  skrll 
   5947  1.1  skrll   if (!fixp->fx_pcrel != !reloc->howto->pc_relative)
   5948  1.1  skrll     as_fatal (_("internal error; cannot generate `%s' relocation"),
   5949  1.1  skrll 	      bfd_get_reloc_code_name (fixp->fx_r_type));
   5950  1.1  skrll 
   5951  1.1  skrll   return reloc;
   5952  1.1  skrll }
   5953  1.1  skrll 
   5954  1.1  skrll 
   5955  1.1  skrll /* Checks for resource conflicts between instructions.  */
   5957  1.1  skrll 
   5958  1.1  skrll /* The func unit stuff could be implemented as bit-vectors rather
   5959  1.1  skrll    than the iterative approach here.  If it ends up being too
   5960  1.1  skrll    slow, we will switch it.  */
   5961  1.1  skrll 
   5962  1.1  skrll resource_table *
   5963  1.1  skrll new_resource_table (void *data,
   5964  1.1  skrll 		    int cycles,
   5965  1.1  skrll 		    int nu,
   5966  1.1  skrll 		    unit_num_copies_func uncf,
   5967  1.1  skrll 		    opcode_num_units_func onuf,
   5968  1.1  skrll 		    opcode_funcUnit_use_unit_func ouuf,
   5969  1.1  skrll 		    opcode_funcUnit_use_stage_func ousf)
   5970  1.1  skrll {
   5971  1.1  skrll   int i;
   5972  1.1  skrll   resource_table *rt = (resource_table *) xmalloc (sizeof (resource_table));
   5973  1.1  skrll   rt->data = data;
   5974  1.1  skrll   rt->cycles = cycles;
   5975  1.1  skrll   rt->allocated_cycles = cycles;
   5976  1.1  skrll   rt->num_units = nu;
   5977  1.1  skrll   rt->unit_num_copies = uncf;
   5978  1.1  skrll   rt->opcode_num_units = onuf;
   5979  1.1  skrll   rt->opcode_unit_use = ouuf;
   5980  1.1  skrll   rt->opcode_unit_stage = ousf;
   5981  1.1  skrll 
   5982  1.1  skrll   rt->units = (unsigned char **) xcalloc (cycles, sizeof (unsigned char *));
   5983  1.1  skrll   for (i = 0; i < cycles; i++)
   5984  1.1  skrll     rt->units[i] = (unsigned char *) xcalloc (nu, sizeof (unsigned char));
   5985  1.1  skrll 
   5986  1.1  skrll   return rt;
   5987  1.1  skrll }
   5988  1.1  skrll 
   5989  1.1  skrll 
   5990  1.1  skrll void
   5991  1.1  skrll clear_resource_table (resource_table *rt)
   5992  1.1  skrll {
   5993  1.1  skrll   int i, j;
   5994  1.1  skrll   for (i = 0; i < rt->allocated_cycles; i++)
   5995  1.1  skrll     for (j = 0; j < rt->num_units; j++)
   5996  1.1  skrll       rt->units[i][j] = 0;
   5997  1.1  skrll }
   5998  1.1  skrll 
   5999  1.1  skrll 
   6000  1.1  skrll /* We never shrink it, just fake it into thinking so.  */
   6001  1.1  skrll 
   6002  1.1  skrll void
   6003  1.1  skrll resize_resource_table (resource_table *rt, int cycles)
   6004  1.1  skrll {
   6005  1.1  skrll   int i, old_cycles;
   6006  1.1  skrll 
   6007  1.1  skrll   rt->cycles = cycles;
   6008  1.1  skrll   if (cycles <= rt->allocated_cycles)
   6009  1.1  skrll     return;
   6010  1.1  skrll 
   6011  1.1  skrll   old_cycles = rt->allocated_cycles;
   6012  1.1  skrll   rt->allocated_cycles = cycles;
   6013  1.1  skrll 
   6014  1.1  skrll   rt->units = xrealloc (rt->units,
   6015  1.1  skrll 			rt->allocated_cycles * sizeof (unsigned char *));
   6016  1.1  skrll   for (i = 0; i < old_cycles; i++)
   6017  1.1  skrll     rt->units[i] = xrealloc (rt->units[i],
   6018  1.1  skrll 			     rt->num_units * sizeof (unsigned char));
   6019  1.1  skrll   for (i = old_cycles; i < cycles; i++)
   6020  1.1  skrll     rt->units[i] = xcalloc (rt->num_units, sizeof (unsigned char));
   6021  1.1  skrll }
   6022  1.1  skrll 
   6023  1.1  skrll 
   6024  1.1  skrll bfd_boolean
   6025  1.1  skrll resources_available (resource_table *rt, xtensa_opcode opcode, int cycle)
   6026  1.1  skrll {
   6027  1.1  skrll   int i;
   6028  1.1  skrll   int uses = (rt->opcode_num_units) (rt->data, opcode);
   6029  1.1  skrll 
   6030  1.1  skrll   for (i = 0; i < uses; i++)
   6031  1.1  skrll     {
   6032  1.1  skrll       xtensa_funcUnit unit = (rt->opcode_unit_use) (rt->data, opcode, i);
   6033  1.1  skrll       int stage = (rt->opcode_unit_stage) (rt->data, opcode, i);
   6034  1.1  skrll       int copies_in_use = rt->units[stage + cycle][unit];
   6035  1.1  skrll       int copies = (rt->unit_num_copies) (rt->data, unit);
   6036  1.1  skrll       if (copies_in_use >= copies)
   6037  1.1  skrll 	return FALSE;
   6038  1.1  skrll     }
   6039  1.1  skrll   return TRUE;
   6040  1.1  skrll }
   6041  1.1  skrll 
   6042  1.1  skrll 
   6043  1.1  skrll void
   6044  1.1  skrll reserve_resources (resource_table *rt, xtensa_opcode opcode, int cycle)
   6045  1.1  skrll {
   6046  1.1  skrll   int i;
   6047  1.1  skrll   int uses = (rt->opcode_num_units) (rt->data, opcode);
   6048  1.1  skrll 
   6049  1.1  skrll   for (i = 0; i < uses; i++)
   6050  1.1  skrll     {
   6051  1.1  skrll       xtensa_funcUnit unit = (rt->opcode_unit_use) (rt->data, opcode, i);
   6052  1.1  skrll       int stage = (rt->opcode_unit_stage) (rt->data, opcode, i);
   6053  1.1  skrll       /* Note that this allows resources to be oversubscribed.  That's
   6054  1.1  skrll 	 essential to the way the optional scheduler works.
   6055  1.1  skrll 	 resources_available reports when a resource is over-subscribed,
   6056  1.1  skrll 	 so it's easy to tell.  */
   6057  1.1  skrll       rt->units[stage + cycle][unit]++;
   6058  1.1  skrll     }
   6059  1.1  skrll }
   6060  1.1  skrll 
   6061  1.1  skrll 
   6062  1.1  skrll void
   6063  1.1  skrll release_resources (resource_table *rt, xtensa_opcode opcode, int cycle)
   6064  1.1  skrll {
   6065  1.1  skrll   int i;
   6066  1.1  skrll   int uses = (rt->opcode_num_units) (rt->data, opcode);
   6067  1.1  skrll 
   6068  1.1  skrll   for (i = 0; i < uses; i++)
   6069  1.1  skrll     {
   6070  1.1  skrll       xtensa_funcUnit unit = (rt->opcode_unit_use) (rt->data, opcode, i);
   6071  1.1  skrll       int stage = (rt->opcode_unit_stage) (rt->data, opcode, i);
   6072  1.1  skrll       assert (rt->units[stage + cycle][unit] > 0);
   6073  1.1  skrll       rt->units[stage + cycle][unit]--;
   6074  1.1  skrll     }
   6075  1.1  skrll }
   6076  1.1  skrll 
   6077  1.1  skrll 
   6078  1.1  skrll /* Wrapper functions make parameterized resource reservation
   6079  1.1  skrll    more convenient.  */
   6080  1.1  skrll 
   6081  1.1  skrll int
   6082  1.1  skrll opcode_funcUnit_use_unit (void *data, xtensa_opcode opcode, int idx)
   6083  1.1  skrll {
   6084  1.1  skrll   xtensa_funcUnit_use *use = xtensa_opcode_funcUnit_use (data, opcode, idx);
   6085  1.1  skrll   return use->unit;
   6086  1.1  skrll }
   6087  1.1  skrll 
   6088  1.1  skrll 
   6089  1.1  skrll int
   6090  1.1  skrll opcode_funcUnit_use_stage (void *data, xtensa_opcode opcode, int idx)
   6091  1.1  skrll {
   6092  1.1  skrll   xtensa_funcUnit_use *use = xtensa_opcode_funcUnit_use (data, opcode, idx);
   6093  1.1  skrll   return use->stage;
   6094  1.1  skrll }
   6095  1.1  skrll 
   6096  1.1  skrll 
   6097  1.1  skrll /* Note that this function does not check issue constraints, but
   6098  1.1  skrll    solely whether the hardware is available to execute the given
   6099  1.1  skrll    instructions together.  It also doesn't check if the tinsns
   6100  1.1  skrll    write the same state, or access the same tieports.  That is
   6101  1.1  skrll    checked by check_t1_t2_reads_and_writes.  */
   6102  1.1  skrll 
   6103  1.1  skrll static bfd_boolean
   6104  1.1  skrll resources_conflict (vliw_insn *vinsn)
   6105  1.1  skrll {
   6106  1.1  skrll   int i;
   6107  1.1  skrll   static resource_table *rt = NULL;
   6108  1.1  skrll 
   6109  1.1  skrll   /* This is the most common case by far.  Optimize it.  */
   6110  1.1  skrll   if (vinsn->num_slots == 1)
   6111  1.1  skrll     return FALSE;
   6112  1.1  skrll 
   6113  1.1  skrll   if (rt == NULL)
   6114  1.1  skrll     {
   6115  1.1  skrll       xtensa_isa isa = xtensa_default_isa;
   6116  1.1  skrll       rt = new_resource_table
   6117  1.1  skrll 	(isa, xtensa_num_pipe_stages,
   6118  1.1  skrll 	 xtensa_isa_num_funcUnits (isa),
   6119  1.1  skrll 	 (unit_num_copies_func) xtensa_funcUnit_num_copies,
   6120  1.1  skrll 	 (opcode_num_units_func) xtensa_opcode_num_funcUnit_uses,
   6121  1.1  skrll 	 opcode_funcUnit_use_unit,
   6122  1.1  skrll 	 opcode_funcUnit_use_stage);
   6123  1.1  skrll     }
   6124  1.1  skrll 
   6125  1.1  skrll   clear_resource_table (rt);
   6126  1.1  skrll 
   6127  1.1  skrll   for (i = 0; i < vinsn->num_slots; i++)
   6128  1.1  skrll     {
   6129  1.1  skrll       if (!resources_available (rt, vinsn->slots[i].opcode, 0))
   6130  1.1  skrll 	return TRUE;
   6131  1.1  skrll       reserve_resources (rt, vinsn->slots[i].opcode, 0);
   6132  1.1  skrll     }
   6133  1.1  skrll 
   6134  1.1  skrll   return FALSE;
   6135  1.1  skrll }
   6136  1.1  skrll 
   6137  1.1  skrll 
   6138  1.1  skrll /* finish_vinsn, emit_single_op and helper functions.  */
   6140  1.1  skrll 
   6141  1.1  skrll static bfd_boolean find_vinsn_conflicts (vliw_insn *);
   6142  1.1  skrll static xtensa_format xg_find_narrowest_format (vliw_insn *);
   6143  1.1  skrll static void xg_assemble_vliw_tokens (vliw_insn *);
   6144  1.1  skrll 
   6145  1.1  skrll 
   6146  1.1  skrll /* We have reached the end of a bundle; emit into the frag.  */
   6147  1.1  skrll 
   6148  1.1  skrll static void
   6149  1.1  skrll finish_vinsn (vliw_insn *vinsn)
   6150  1.1  skrll {
   6151  1.1  skrll   IStack slotstack;
   6152  1.1  skrll   int i;
   6153  1.1  skrll   char *file_name;
   6154  1.1  skrll   unsigned line;
   6155  1.1  skrll 
   6156  1.1  skrll   if (find_vinsn_conflicts (vinsn))
   6157  1.1  skrll     {
   6158  1.1  skrll       xg_clear_vinsn (vinsn);
   6159  1.1  skrll       return;
   6160  1.1  skrll     }
   6161  1.1  skrll 
   6162  1.1  skrll   /* First, find a format that works.  */
   6163  1.1  skrll   if (vinsn->format == XTENSA_UNDEFINED)
   6164  1.1  skrll     vinsn->format = xg_find_narrowest_format (vinsn);
   6165  1.1  skrll 
   6166  1.1  skrll   if (vinsn->format == XTENSA_UNDEFINED)
   6167  1.1  skrll     {
   6168  1.1  skrll       as_where (&file_name, &line);
   6169  1.1  skrll       as_bad_where (file_name, line,
   6170  1.1  skrll 		    _("couldn't find a valid instruction format"));
   6171  1.1  skrll       fprintf (stderr, _("    ops were: "));
   6172  1.1  skrll       for (i = 0; i < vinsn->num_slots; i++)
   6173  1.1  skrll 	fprintf (stderr, _(" %s;"),
   6174  1.1  skrll 		 xtensa_opcode_name (xtensa_default_isa,
   6175  1.1  skrll 				     vinsn->slots[i].opcode));
   6176  1.1  skrll       fprintf (stderr, _("\n"));
   6177  1.1  skrll       xg_clear_vinsn (vinsn);
   6178  1.1  skrll       return;
   6179  1.1  skrll     }
   6180  1.1  skrll 
   6181  1.1  skrll   if (vinsn->num_slots
   6182  1.1  skrll       != xtensa_format_num_slots (xtensa_default_isa, vinsn->format))
   6183  1.1  skrll     {
   6184  1.1  skrll       as_bad (_("format '%s' allows %d slots, but there are %d opcodes"),
   6185  1.1  skrll 	      xtensa_format_name (xtensa_default_isa, vinsn->format),
   6186  1.1  skrll 	      xtensa_format_num_slots (xtensa_default_isa, vinsn->format),
   6187  1.1  skrll 	      vinsn->num_slots);
   6188  1.1  skrll       xg_clear_vinsn (vinsn);
   6189  1.1  skrll       return;
   6190  1.1  skrll     }
   6191  1.1  skrll 
   6192  1.1  skrll   if (resources_conflict (vinsn))
   6193  1.1  skrll     {
   6194  1.1  skrll       as_where (&file_name, &line);
   6195  1.1  skrll       as_bad_where (file_name, line, _("illegal resource usage in bundle"));
   6196  1.1  skrll       fprintf (stderr, "    ops were: ");
   6197  1.1  skrll       for (i = 0; i < vinsn->num_slots; i++)
   6198  1.1  skrll 	fprintf (stderr, " %s;",
   6199  1.1  skrll 		 xtensa_opcode_name (xtensa_default_isa,
   6200  1.1  skrll 				     vinsn->slots[i].opcode));
   6201  1.1  skrll       fprintf (stderr, "\n");
   6202  1.1  skrll       xg_clear_vinsn (vinsn);
   6203  1.1  skrll       return;
   6204  1.1  skrll     }
   6205  1.1  skrll 
   6206  1.1  skrll   for (i = 0; i < vinsn->num_slots; i++)
   6207  1.1  skrll     {
   6208  1.1  skrll       if (vinsn->slots[i].opcode != XTENSA_UNDEFINED)
   6209  1.1  skrll 	{
   6210  1.1  skrll 	  symbolS *lit_sym = NULL;
   6211  1.1  skrll 	  int j;
   6212  1.1  skrll 	  bfd_boolean e = FALSE;
   6213  1.1  skrll 	  bfd_boolean saved_density = density_supported;
   6214  1.1  skrll 
   6215  1.1  skrll 	  /* We don't want to narrow ops inside multi-slot bundles.  */
   6216  1.1  skrll 	  if (vinsn->num_slots > 1)
   6217  1.1  skrll 	    density_supported = FALSE;
   6218  1.1  skrll 
   6219  1.1  skrll 	  istack_init (&slotstack);
   6220  1.1  skrll 	  if (vinsn->slots[i].opcode == xtensa_nop_opcode)
   6221  1.1  skrll 	    {
   6222  1.1  skrll 	      vinsn->slots[i].opcode =
   6223  1.1  skrll 		xtensa_format_slot_nop_opcode (xtensa_default_isa,
   6224  1.1  skrll 					       vinsn->format, i);
   6225  1.1  skrll 	      vinsn->slots[i].ntok = 0;
   6226  1.1  skrll 	    }
   6227  1.1  skrll 
   6228  1.1  skrll 	  if (xg_expand_assembly_insn (&slotstack, &vinsn->slots[i]))
   6229  1.1  skrll 	    {
   6230  1.1  skrll 	      e = TRUE;
   6231  1.1  skrll 	      continue;
   6232  1.1  skrll 	    }
   6233  1.1  skrll 
   6234  1.1  skrll 	  density_supported = saved_density;
   6235  1.1  skrll 
   6236  1.1  skrll 	  if (e)
   6237  1.1  skrll 	    {
   6238  1.1  skrll 	      xg_clear_vinsn (vinsn);
   6239  1.1  skrll 	      return;
   6240  1.1  skrll 	    }
   6241  1.1  skrll 
   6242  1.1  skrll 	  for (j = 0; j < slotstack.ninsn; j++)
   6243  1.1  skrll 	    {
   6244  1.1  skrll 	      TInsn *insn = &slotstack.insn[j];
   6245  1.1  skrll 	      if (insn->insn_type == ITYPE_LITERAL)
   6246  1.1  skrll 		{
   6247  1.1  skrll 		  assert (lit_sym == NULL);
   6248  1.1  skrll 		  lit_sym = xg_assemble_literal (insn);
   6249  1.1  skrll 		}
   6250  1.1  skrll 	      else
   6251  1.1  skrll 		{
   6252  1.1  skrll 		  assert (insn->insn_type == ITYPE_INSN);
   6253  1.1  skrll 		  if (lit_sym)
   6254  1.1  skrll 		    xg_resolve_literals (insn, lit_sym);
   6255  1.1  skrll 		  if (j != slotstack.ninsn - 1)
   6256  1.1  skrll 		    emit_single_op (insn);
   6257  1.1  skrll 		}
   6258  1.1  skrll 	    }
   6259  1.1  skrll 
   6260  1.1  skrll 	  if (vinsn->num_slots > 1)
   6261  1.1  skrll 	    {
   6262  1.1  skrll 	      if (opcode_fits_format_slot
   6263  1.1  skrll 		  (slotstack.insn[slotstack.ninsn - 1].opcode,
   6264  1.1  skrll 		   vinsn->format, i))
   6265  1.1  skrll 		{
   6266  1.1  skrll 		  vinsn->slots[i] = slotstack.insn[slotstack.ninsn - 1];
   6267  1.1  skrll 		}
   6268  1.1  skrll 	      else
   6269  1.1  skrll 		{
   6270  1.1  skrll 		  emit_single_op (&slotstack.insn[slotstack.ninsn - 1]);
   6271  1.1  skrll 		  if (vinsn->format == XTENSA_UNDEFINED)
   6272  1.1  skrll 		    vinsn->slots[i].opcode = xtensa_nop_opcode;
   6273  1.1  skrll 		  else
   6274  1.1  skrll 		    vinsn->slots[i].opcode
   6275  1.1  skrll 		      = xtensa_format_slot_nop_opcode (xtensa_default_isa,
   6276  1.1  skrll 						       vinsn->format, i);
   6277  1.1  skrll 
   6278  1.1  skrll 		  vinsn->slots[i].ntok = 0;
   6279  1.1  skrll 		}
   6280  1.1  skrll 	    }
   6281  1.1  skrll 	  else
   6282  1.1  skrll 	    {
   6283  1.1  skrll 	      vinsn->slots[0] = slotstack.insn[slotstack.ninsn - 1];
   6284  1.1  skrll 	      vinsn->format = XTENSA_UNDEFINED;
   6285  1.1  skrll 	    }
   6286  1.1  skrll 	}
   6287  1.1  skrll     }
   6288  1.1  skrll 
   6289  1.1  skrll   /* Now check resource conflicts on the modified bundle.  */
   6290  1.1  skrll   if (resources_conflict (vinsn))
   6291  1.1  skrll     {
   6292  1.1  skrll       as_where (&file_name, &line);
   6293  1.1  skrll       as_bad_where (file_name, line, _("illegal resource usage in bundle"));
   6294  1.1  skrll       fprintf (stderr, "    ops were: ");
   6295  1.1  skrll       for (i = 0; i < vinsn->num_slots; i++)
   6296  1.1  skrll 	fprintf (stderr, " %s;",
   6297  1.1  skrll 		 xtensa_opcode_name (xtensa_default_isa,
   6298  1.1  skrll 				     vinsn->slots[i].opcode));
   6299  1.1  skrll       fprintf (stderr, "\n");
   6300  1.1  skrll       xg_clear_vinsn (vinsn);
   6301  1.1  skrll       return;
   6302  1.1  skrll     }
   6303  1.1  skrll 
   6304  1.1  skrll   /* First, find a format that works.  */
   6305  1.1  skrll   if (vinsn->format == XTENSA_UNDEFINED)
   6306  1.1  skrll       vinsn->format = xg_find_narrowest_format (vinsn);
   6307  1.1  skrll 
   6308  1.1  skrll   xg_assemble_vliw_tokens (vinsn);
   6309  1.1  skrll 
   6310  1.1  skrll   xg_clear_vinsn (vinsn);
   6311  1.1  skrll }
   6312  1.1  skrll 
   6313  1.1  skrll 
   6314  1.1  skrll /* Given an vliw instruction, what conflicts are there in register
   6315  1.1  skrll    usage and in writes to states and queues?
   6316  1.1  skrll 
   6317  1.1  skrll    This function does two things:
   6318  1.1  skrll    1. Reports an error when a vinsn contains illegal combinations
   6319  1.1  skrll       of writes to registers states or queues.
   6320  1.1  skrll    2. Marks individual tinsns as not relaxable if the combination
   6321  1.1  skrll       contains antidependencies.
   6322  1.1  skrll 
   6323  1.1  skrll    Job 2 handles things like swap semantics in instructions that need
   6324  1.1  skrll    to be relaxed.  For example,
   6325  1.1  skrll 
   6326  1.1  skrll 	addi a0, a1, 100000
   6327  1.1  skrll 
   6328  1.1  skrll    normally would be relaxed to
   6329  1.1  skrll 
   6330  1.1  skrll 	l32r a0, some_label
   6331  1.1  skrll 	add a0, a1, a0
   6332  1.1  skrll 
   6333  1.1  skrll    _but_, if the above instruction is bundled with an a0 reader, e.g.,
   6334  1.1  skrll 
   6335  1.1  skrll 	{ addi a0, a1, 10000 ; add a2, a0, a4 ; }
   6336  1.1  skrll 
   6337  1.1  skrll    then we can't relax it into
   6338  1.1  skrll 
   6339  1.1  skrll 	l32r a0, some_label
   6340  1.1  skrll 	{ add a0, a1, a0 ; add a2, a0, a4 ; }
   6341  1.1  skrll 
   6342  1.1  skrll    because the value of a0 is trashed before the second add can read it.  */
   6343  1.1  skrll 
   6344  1.1  skrll static char check_t1_t2_reads_and_writes (TInsn *, TInsn *);
   6345  1.1  skrll 
   6346  1.1  skrll static bfd_boolean
   6347  1.1  skrll find_vinsn_conflicts (vliw_insn *vinsn)
   6348  1.1  skrll {
   6349  1.1  skrll   int i, j;
   6350  1.1  skrll   int branches = 0;
   6351  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   6352  1.1  skrll 
   6353  1.1  skrll   assert (!past_xtensa_end);
   6354  1.1  skrll 
   6355  1.1  skrll   for (i = 0 ; i < vinsn->num_slots; i++)
   6356  1.1  skrll     {
   6357  1.1  skrll       TInsn *op1 = &vinsn->slots[i];
   6358  1.1  skrll       if (op1->is_specific_opcode)
   6359  1.1  skrll 	op1->keep_wide = TRUE;
   6360  1.1  skrll       else
   6361  1.1  skrll 	op1->keep_wide = FALSE;
   6362  1.1  skrll     }
   6363  1.1  skrll 
   6364  1.1  skrll   for (i = 0 ; i < vinsn->num_slots; i++)
   6365  1.1  skrll     {
   6366  1.1  skrll       TInsn *op1 = &vinsn->slots[i];
   6367  1.1  skrll 
   6368  1.1  skrll       if (xtensa_opcode_is_branch (isa, op1->opcode) == 1)
   6369  1.1  skrll 	branches++;
   6370  1.1  skrll 
   6371  1.1  skrll       for (j = 0; j < vinsn->num_slots; j++)
   6372  1.1  skrll 	{
   6373  1.1  skrll 	  if (i != j)
   6374  1.1  skrll 	    {
   6375  1.1  skrll 	      TInsn *op2 = &vinsn->slots[j];
   6376  1.1  skrll 	      char conflict_type = check_t1_t2_reads_and_writes (op1, op2);
   6377  1.1  skrll 	      switch (conflict_type)
   6378  1.1  skrll 		{
   6379  1.1  skrll 		case 'c':
   6380  1.1  skrll 		  as_bad (_("opcodes '%s' (slot %d) and '%s' (slot %d) write the same register"),
   6381  1.1  skrll 			  xtensa_opcode_name (isa, op1->opcode), i,
   6382  1.1  skrll 			  xtensa_opcode_name (isa, op2->opcode), j);
   6383  1.1  skrll 		  return TRUE;
   6384  1.1  skrll 		case 'd':
   6385  1.1  skrll 		  as_bad (_("opcodes '%s' (slot %d) and '%s' (slot %d) write the same state"),
   6386  1.1  skrll 			  xtensa_opcode_name (isa, op1->opcode), i,
   6387  1.1  skrll 			  xtensa_opcode_name (isa, op2->opcode), j);
   6388  1.1  skrll 		  return TRUE;
   6389  1.1  skrll 		case 'e':
   6390  1.1  skrll 		  as_bad (_("opcodes '%s' (slot %d) and '%s' (slot %d) write the same port"),
   6391  1.1  skrll 			  xtensa_opcode_name (isa, op1->opcode), i,
   6392  1.1  skrll 			  xtensa_opcode_name (isa, op2->opcode), j);
   6393  1.1  skrll 		  return TRUE;
   6394  1.1  skrll 		case 'f':
   6395  1.1  skrll 		  as_bad (_("opcodes '%s' (slot %d) and '%s' (slot %d) both have volatile port accesses"),
   6396  1.1  skrll 			  xtensa_opcode_name (isa, op1->opcode), i,
   6397  1.1  skrll 			  xtensa_opcode_name (isa, op2->opcode), j);
   6398  1.1  skrll 		  return TRUE;
   6399  1.1  skrll 		default:
   6400  1.1  skrll 		  /* Everything is OK.  */
   6401  1.1  skrll 		  break;
   6402  1.1  skrll 		}
   6403  1.1  skrll 	      op2->is_specific_opcode = (op2->is_specific_opcode
   6404  1.1  skrll 					 || conflict_type == 'a');
   6405  1.1  skrll 	    }
   6406  1.1  skrll 	}
   6407  1.1  skrll     }
   6408  1.1  skrll 
   6409  1.1  skrll   if (branches > 1)
   6410  1.1  skrll     {
   6411  1.1  skrll       as_bad (_("multiple branches or jumps in the same bundle"));
   6412  1.1  skrll       return TRUE;
   6413  1.1  skrll     }
   6414  1.1  skrll 
   6415  1.1  skrll   return FALSE;
   6416  1.1  skrll }
   6417  1.1  skrll 
   6418  1.1  skrll 
   6419  1.1  skrll /* Check how the state used by t1 and t2 relate.
   6420  1.1  skrll    Cases found are:
   6421  1.1  skrll 
   6422  1.1  skrll    case A: t1 reads a register t2 writes (an antidependency within a bundle)
   6423  1.1  skrll    case B: no relationship between what is read and written (both could
   6424  1.1  skrll            read the same reg though)
   6425  1.1  skrll    case C: t1 writes a register t2 writes (a register conflict within a
   6426  1.1  skrll            bundle)
   6427  1.1  skrll    case D: t1 writes a state that t2 also writes
   6428  1.1  skrll    case E: t1 writes a tie queue that t2 also writes
   6429  1.1  skrll    case F: two volatile queue accesses
   6430  1.1  skrll */
   6431  1.1  skrll 
   6432  1.1  skrll static char
   6433  1.1  skrll check_t1_t2_reads_and_writes (TInsn *t1, TInsn *t2)
   6434  1.1  skrll {
   6435  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   6436  1.1  skrll   xtensa_regfile t1_regfile, t2_regfile;
   6437  1.1  skrll   int t1_reg, t2_reg;
   6438  1.1  skrll   int t1_base_reg, t1_last_reg;
   6439  1.1  skrll   int t2_base_reg, t2_last_reg;
   6440  1.1  skrll   char t1_inout, t2_inout;
   6441  1.1  skrll   int i, j;
   6442  1.1  skrll   char conflict = 'b';
   6443  1.1  skrll   int t1_states;
   6444  1.1  skrll   int t2_states;
   6445  1.1  skrll   int t1_interfaces;
   6446  1.1  skrll   int t2_interfaces;
   6447  1.1  skrll   bfd_boolean t1_volatile = FALSE;
   6448  1.1  skrll   bfd_boolean t2_volatile = FALSE;
   6449  1.1  skrll 
   6450  1.1  skrll   /* Check registers.  */
   6451  1.1  skrll   for (j = 0; j < t2->ntok; j++)
   6452  1.1  skrll     {
   6453  1.1  skrll       if (xtensa_operand_is_register (isa, t2->opcode, j) != 1)
   6454  1.1  skrll 	continue;
   6455  1.1  skrll 
   6456  1.1  skrll       t2_regfile = xtensa_operand_regfile (isa, t2->opcode, j);
   6457  1.1  skrll       t2_base_reg = t2->tok[j].X_add_number;
   6458  1.1  skrll       t2_last_reg = t2_base_reg + xtensa_operand_num_regs (isa, t2->opcode, j);
   6459  1.1  skrll 
   6460  1.1  skrll       for (i = 0; i < t1->ntok; i++)
   6461  1.1  skrll 	{
   6462  1.1  skrll 	  if (xtensa_operand_is_register (isa, t1->opcode, i) != 1)
   6463  1.1  skrll 	    continue;
   6464  1.1  skrll 
   6465  1.1  skrll 	  t1_regfile = xtensa_operand_regfile (isa, t1->opcode, i);
   6466  1.1  skrll 
   6467  1.1  skrll 	  if (t1_regfile != t2_regfile)
   6468  1.1  skrll 	    continue;
   6469  1.1  skrll 
   6470  1.1  skrll 	  t1_inout = xtensa_operand_inout (isa, t1->opcode, i);
   6471  1.1  skrll 	  t2_inout = xtensa_operand_inout (isa, t2->opcode, j);
   6472  1.1  skrll 
   6473  1.1  skrll 	  if (xtensa_operand_is_known_reg (isa, t1->opcode, i) == 0
   6474  1.1  skrll 	      || xtensa_operand_is_known_reg (isa, t2->opcode, j) == 0)
   6475  1.1  skrll 	    {
   6476  1.1  skrll 	      if (t1_inout == 'm' || t1_inout == 'o'
   6477  1.1  skrll 		  || t2_inout == 'm' || t2_inout == 'o')
   6478  1.1  skrll 		{
   6479  1.1  skrll 		  conflict = 'a';
   6480  1.1  skrll 		  continue;
   6481  1.1  skrll 		}
   6482  1.1  skrll 	    }
   6483  1.1  skrll 
   6484  1.1  skrll 	  t1_base_reg = t1->tok[i].X_add_number;
   6485  1.1  skrll 	  t1_last_reg = (t1_base_reg
   6486  1.1  skrll 			 + xtensa_operand_num_regs (isa, t1->opcode, i));
   6487  1.1  skrll 
   6488  1.1  skrll 	  for (t1_reg = t1_base_reg; t1_reg < t1_last_reg; t1_reg++)
   6489  1.1  skrll 	    {
   6490  1.1  skrll 	      for (t2_reg = t2_base_reg; t2_reg < t2_last_reg; t2_reg++)
   6491  1.1  skrll 		{
   6492  1.1  skrll 		  if (t1_reg != t2_reg)
   6493  1.1  skrll 		    continue;
   6494  1.1  skrll 
   6495  1.1  skrll 		  if (t2_inout == 'i' && (t1_inout == 'm' || t1_inout == 'o'))
   6496  1.1  skrll 		    {
   6497  1.1  skrll 		      conflict = 'a';
   6498  1.1  skrll 		      continue;
   6499  1.1  skrll 		    }
   6500  1.1  skrll 
   6501  1.1  skrll 		  if (t1_inout == 'i' && (t2_inout == 'm' || t2_inout == 'o'))
   6502  1.1  skrll 		    {
   6503  1.1  skrll 		      conflict = 'a';
   6504  1.1  skrll 		      continue;
   6505  1.1  skrll 		    }
   6506  1.1  skrll 
   6507  1.1  skrll 		  if (t1_inout != 'i' && t2_inout != 'i')
   6508  1.1  skrll 		    return 'c';
   6509  1.1  skrll 		}
   6510  1.1  skrll 	    }
   6511  1.1  skrll 	}
   6512  1.1  skrll     }
   6513  1.1  skrll 
   6514  1.1  skrll   /* Check states.  */
   6515  1.1  skrll   t1_states = xtensa_opcode_num_stateOperands (isa, t1->opcode);
   6516  1.1  skrll   t2_states = xtensa_opcode_num_stateOperands (isa, t2->opcode);
   6517  1.1  skrll   for (j = 0; j < t2_states; j++)
   6518  1.1  skrll     {
   6519  1.1  skrll       xtensa_state t2_so = xtensa_stateOperand_state (isa, t2->opcode, j);
   6520  1.1  skrll       t2_inout = xtensa_stateOperand_inout (isa, t2->opcode, j);
   6521  1.1  skrll       for (i = 0; i < t1_states; i++)
   6522  1.1  skrll 	{
   6523  1.1  skrll 	  xtensa_state t1_so = xtensa_stateOperand_state (isa, t1->opcode, i);
   6524  1.1  skrll 	  t1_inout = xtensa_stateOperand_inout (isa, t1->opcode, i);
   6525  1.1  skrll 	  if (t1_so != t2_so)
   6526  1.1  skrll 	    continue;
   6527  1.1  skrll 
   6528  1.1  skrll 	  if (t2_inout == 'i' && (t1_inout == 'm' || t1_inout == 'o'))
   6529  1.1  skrll 	    {
   6530  1.1  skrll 	      conflict = 'a';
   6531  1.1  skrll 	      continue;
   6532  1.1  skrll 	    }
   6533  1.1  skrll 
   6534  1.1  skrll 	  if (t1_inout == 'i' && (t2_inout == 'm' || t2_inout == 'o'))
   6535  1.1  skrll 	    {
   6536  1.1  skrll 	      conflict = 'a';
   6537  1.1  skrll 	      continue;
   6538  1.1  skrll 	    }
   6539  1.1  skrll 
   6540  1.1  skrll 	  if (t1_inout != 'i' && t2_inout != 'i')
   6541  1.1  skrll 	    return 'd';
   6542  1.1  skrll 	}
   6543  1.1  skrll     }
   6544  1.1  skrll 
   6545  1.1  skrll   /* Check tieports.  */
   6546  1.1  skrll   t1_interfaces = xtensa_opcode_num_interfaceOperands (isa, t1->opcode);
   6547  1.1  skrll   t2_interfaces = xtensa_opcode_num_interfaceOperands (isa, t2->opcode);
   6548  1.1  skrll   for (j = 0; j < t2_interfaces; j++)
   6549  1.1  skrll     {
   6550  1.1  skrll       xtensa_interface t2_int
   6551  1.1  skrll 	= xtensa_interfaceOperand_interface (isa, t2->opcode, j);
   6552  1.1  skrll       int t2_class = xtensa_interface_class_id (isa, t2_int);
   6553  1.1  skrll 
   6554  1.1  skrll       t2_inout = xtensa_interface_inout (isa, t2_int);
   6555  1.1  skrll       if (xtensa_interface_has_side_effect (isa, t2_int) == 1)
   6556  1.1  skrll 	t2_volatile = TRUE;
   6557  1.1  skrll 
   6558  1.1  skrll       for (i = 0; i < t1_interfaces; i++)
   6559  1.1  skrll 	{
   6560  1.1  skrll 	  xtensa_interface t1_int
   6561  1.1  skrll 	    = xtensa_interfaceOperand_interface (isa, t1->opcode, j);
   6562  1.1  skrll 	  int t1_class = xtensa_interface_class_id (isa, t1_int);
   6563  1.1  skrll 
   6564  1.1  skrll 	  t1_inout = xtensa_interface_inout (isa, t1_int);
   6565  1.1  skrll 	  if (xtensa_interface_has_side_effect (isa, t1_int) == 1)
   6566  1.1  skrll 	    t1_volatile = TRUE;
   6567  1.1  skrll 
   6568  1.1  skrll 	  if (t1_volatile && t2_volatile && (t1_class == t2_class))
   6569  1.1  skrll 	    return 'f';
   6570  1.1  skrll 
   6571  1.1  skrll 	  if (t1_int != t2_int)
   6572  1.1  skrll 	    continue;
   6573  1.1  skrll 
   6574  1.1  skrll 	  if (t2_inout == 'i' && t1_inout == 'o')
   6575  1.1  skrll 	    {
   6576  1.1  skrll 	      conflict = 'a';
   6577  1.1  skrll 	      continue;
   6578  1.1  skrll 	    }
   6579  1.1  skrll 
   6580  1.1  skrll 	  if (t1_inout == 'i' && t2_inout == 'o')
   6581  1.1  skrll 	    {
   6582  1.1  skrll 	      conflict = 'a';
   6583  1.1  skrll 	      continue;
   6584  1.1  skrll 	    }
   6585  1.1  skrll 
   6586  1.1  skrll 	  if (t1_inout != 'i' && t2_inout != 'i')
   6587  1.1  skrll 	    return 'e';
   6588  1.1  skrll 	}
   6589  1.1  skrll     }
   6590  1.1  skrll 
   6591  1.1  skrll   return conflict;
   6592  1.1  skrll }
   6593  1.1  skrll 
   6594  1.1  skrll 
   6595  1.1  skrll static xtensa_format
   6596  1.1  skrll xg_find_narrowest_format (vliw_insn *vinsn)
   6597  1.1  skrll {
   6598  1.1  skrll   /* Right now we assume that the ops within the vinsn are properly
   6599  1.1  skrll      ordered for the slots that the programmer wanted them in.  In
   6600  1.1  skrll      other words, we don't rearrange the ops in hopes of finding a
   6601  1.1  skrll      better format.  The scheduler handles that.  */
   6602  1.1  skrll 
   6603  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   6604  1.1  skrll   xtensa_format format;
   6605  1.1  skrll   vliw_insn v_copy = *vinsn;
   6606  1.1  skrll   xtensa_opcode nop_opcode = xtensa_nop_opcode;
   6607  1.1  skrll 
   6608  1.1  skrll   if (vinsn->num_slots == 1)
   6609  1.1  skrll     return xg_get_single_format (vinsn->slots[0].opcode);
   6610  1.1  skrll 
   6611  1.1  skrll   for (format = 0; format < xtensa_isa_num_formats (isa); format++)
   6612  1.1  skrll     {
   6613  1.1  skrll       v_copy = *vinsn;
   6614  1.1  skrll       if (xtensa_format_num_slots (isa, format) == v_copy.num_slots)
   6615  1.1  skrll 	{
   6616  1.1  skrll 	  int slot;
   6617  1.1  skrll 	  int fit = 0;
   6618  1.1  skrll 	  for (slot = 0; slot < v_copy.num_slots; slot++)
   6619  1.1  skrll 	    {
   6620  1.1  skrll 	      if (v_copy.slots[slot].opcode == nop_opcode)
   6621  1.1  skrll 		{
   6622  1.1  skrll 		  v_copy.slots[slot].opcode =
   6623  1.1  skrll 		    xtensa_format_slot_nop_opcode (isa, format, slot);
   6624  1.1  skrll 		  v_copy.slots[slot].ntok = 0;
   6625  1.1  skrll 		}
   6626  1.1  skrll 
   6627  1.1  skrll 	      if (opcode_fits_format_slot (v_copy.slots[slot].opcode,
   6628  1.1  skrll 					   format, slot))
   6629  1.1  skrll 		fit++;
   6630  1.1  skrll 	      else if (v_copy.num_slots > 1)
   6631  1.1  skrll 		{
   6632  1.1  skrll 		  TInsn widened;
   6633  1.1  skrll 		  /* Try the widened version.  */
   6634  1.1  skrll 		  if (!v_copy.slots[slot].keep_wide
   6635  1.1  skrll 		      && !v_copy.slots[slot].is_specific_opcode
   6636  1.1  skrll 		      && xg_is_single_relaxable_insn (&v_copy.slots[slot],
   6637  1.1  skrll 						      &widened, TRUE)
   6638  1.1  skrll 		      && opcode_fits_format_slot (widened.opcode,
   6639  1.1  skrll 						  format, slot))
   6640  1.1  skrll 		    {
   6641  1.1  skrll 		      v_copy.slots[slot] = widened;
   6642  1.1  skrll 		      fit++;
   6643  1.1  skrll 		    }
   6644  1.1  skrll 		}
   6645  1.1  skrll 	    }
   6646  1.1  skrll 	  if (fit == v_copy.num_slots)
   6647  1.1  skrll 	    {
   6648  1.1  skrll 	      *vinsn = v_copy;
   6649  1.1  skrll 	      xtensa_format_encode (isa, format, vinsn->insnbuf);
   6650  1.1  skrll 	      vinsn->format = format;
   6651  1.1  skrll 	      break;
   6652  1.1  skrll 	    }
   6653  1.1  skrll 	}
   6654  1.1  skrll     }
   6655  1.1  skrll 
   6656  1.1  skrll   if (format == xtensa_isa_num_formats (isa))
   6657  1.1  skrll     return XTENSA_UNDEFINED;
   6658  1.1  skrll 
   6659  1.1  skrll   return format;
   6660  1.1  skrll }
   6661  1.1  skrll 
   6662  1.1  skrll 
   6663  1.1  skrll /* Return the additional space needed in a frag
   6664  1.1  skrll    for possible relaxations of any ops in a VLIW insn.
   6665  1.1  skrll    Also fill out the relaxations that might be required of
   6666  1.1  skrll    each tinsn in the vinsn.  */
   6667  1.1  skrll 
   6668  1.1  skrll static int
   6669  1.1  skrll relaxation_requirements (vliw_insn *vinsn, bfd_boolean *pfinish_frag)
   6670  1.1  skrll {
   6671  1.1  skrll   bfd_boolean finish_frag = FALSE;
   6672  1.1  skrll   int extra_space = 0;
   6673  1.1  skrll   int slot;
   6674  1.1  skrll 
   6675  1.1  skrll   for (slot = 0; slot < vinsn->num_slots; slot++)
   6676  1.1  skrll     {
   6677  1.1  skrll       TInsn *tinsn = &vinsn->slots[slot];
   6678  1.1  skrll       if (!tinsn_has_symbolic_operands (tinsn))
   6679  1.1  skrll 	{
   6680  1.1  skrll 	  /* A narrow instruction could be widened later to help
   6681  1.1  skrll 	     alignment issues.  */
   6682  1.1  skrll 	  if (xg_is_single_relaxable_insn (tinsn, 0, TRUE)
   6683  1.1  skrll 	      && !tinsn->is_specific_opcode
   6684  1.1  skrll 	      && vinsn->num_slots == 1)
   6685  1.1  skrll 	    {
   6686  1.1  skrll 	      /* Difference in bytes between narrow and wide insns...  */
   6687  1.1  skrll 	      extra_space += 1;
   6688  1.1  skrll 	      tinsn->subtype = RELAX_NARROW;
   6689  1.1  skrll 	    }
   6690  1.1  skrll 	}
   6691  1.1  skrll       else
   6692  1.1  skrll 	{
   6693  1.1  skrll 	  if (workaround_b_j_loop_end
   6694  1.1  skrll 	      && tinsn->opcode == xtensa_jx_opcode
   6695  1.1  skrll 	      && use_transform ())
   6696  1.1  skrll 	    {
   6697  1.1  skrll 	      /* Add 2 of these.  */
   6698  1.1  skrll 	      extra_space += 3; /* for the nop size */
   6699  1.1  skrll 	      tinsn->subtype = RELAX_ADD_NOP_IF_PRE_LOOP_END;
   6700  1.1  skrll 	    }
   6701  1.1  skrll 
   6702  1.1  skrll 	  /* Need to assemble it with space for the relocation.  */
   6703  1.1  skrll 	  if (xg_is_relaxable_insn (tinsn, 0)
   6704  1.1  skrll 	      && !tinsn->is_specific_opcode)
   6705  1.1  skrll 	    {
   6706  1.1  skrll 	      int max_size = xg_get_max_insn_widen_size (tinsn->opcode);
   6707  1.1  skrll 	      int max_literal_size =
   6708  1.1  skrll 		xg_get_max_insn_widen_literal_size (tinsn->opcode);
   6709  1.1  skrll 
   6710  1.1  skrll 	      tinsn->literal_space = max_literal_size;
   6711  1.1  skrll 
   6712  1.1  skrll 	      tinsn->subtype = RELAX_IMMED;
   6713  1.1  skrll 	      extra_space += max_size;
   6714  1.1  skrll 	    }
   6715  1.1  skrll 	  else
   6716  1.1  skrll 	    {
   6717  1.1  skrll 	      /* A fix record will be added for this instruction prior
   6718  1.1  skrll 		 to relaxation, so make it end the frag.  */
   6719  1.1  skrll 	      finish_frag = TRUE;
   6720  1.1  skrll 	    }
   6721  1.1  skrll 	}
   6722  1.1  skrll     }
   6723  1.1  skrll   *pfinish_frag = finish_frag;
   6724  1.1  skrll   return extra_space;
   6725  1.1  skrll }
   6726  1.1  skrll 
   6727  1.1  skrll 
   6728  1.1  skrll static void
   6729  1.1  skrll bundle_tinsn (TInsn *tinsn, vliw_insn *vinsn)
   6730  1.1  skrll {
   6731  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   6732  1.1  skrll   int slot, chosen_slot;
   6733  1.1  skrll 
   6734  1.1  skrll   vinsn->format = xg_get_single_format (tinsn->opcode);
   6735  1.1  skrll   assert (vinsn->format != XTENSA_UNDEFINED);
   6736  1.1  skrll   vinsn->num_slots = xtensa_format_num_slots (isa, vinsn->format);
   6737  1.1  skrll 
   6738  1.1  skrll   chosen_slot = xg_get_single_slot (tinsn->opcode);
   6739  1.1  skrll   for (slot = 0; slot < vinsn->num_slots; slot++)
   6740  1.1  skrll     {
   6741  1.1  skrll       if (slot == chosen_slot)
   6742  1.1  skrll 	vinsn->slots[slot] = *tinsn;
   6743  1.1  skrll       else
   6744  1.1  skrll 	{
   6745  1.1  skrll 	  vinsn->slots[slot].opcode =
   6746  1.1  skrll 	    xtensa_format_slot_nop_opcode (isa, vinsn->format, slot);
   6747  1.1  skrll 	  vinsn->slots[slot].ntok = 0;
   6748  1.1  skrll 	  vinsn->slots[slot].insn_type = ITYPE_INSN;
   6749  1.1  skrll 	}
   6750  1.1  skrll     }
   6751  1.1  skrll }
   6752  1.1  skrll 
   6753  1.1  skrll 
   6754  1.1  skrll static bfd_boolean
   6755  1.1  skrll emit_single_op (TInsn *orig_insn)
   6756  1.1  skrll {
   6757  1.1  skrll   int i;
   6758  1.1  skrll   IStack istack;		/* put instructions into here */
   6759  1.1  skrll   symbolS *lit_sym = NULL;
   6760  1.1  skrll   symbolS *label_sym = NULL;
   6761  1.1  skrll 
   6762  1.1  skrll   istack_init (&istack);
   6763  1.1  skrll 
   6764  1.1  skrll   /* Special-case for "movi aX, foo" which is guaranteed to need relaxing.
   6765  1.1  skrll      Because the scheduling and bundling characteristics of movi and
   6766  1.1  skrll      l32r or const16 are so different, we can do much better if we relax
   6767  1.1  skrll      it prior to scheduling and bundling, rather than after.  */
   6768  1.1  skrll   if ((orig_insn->opcode == xtensa_movi_opcode
   6769  1.1  skrll        || orig_insn->opcode == xtensa_movi_n_opcode)
   6770  1.1  skrll       && !cur_vinsn.inside_bundle
   6771  1.1  skrll       && (orig_insn->tok[1].X_op == O_symbol
   6772  1.1  skrll 	  || orig_insn->tok[1].X_op == O_pltrel
   6773  1.1  skrll 	  || orig_insn->tok[1].X_op == O_tlsfunc
   6774  1.1  skrll 	  || orig_insn->tok[1].X_op == O_tlsarg
   6775  1.1  skrll 	  || orig_insn->tok[1].X_op == O_tpoff
   6776  1.1  skrll 	  || orig_insn->tok[1].X_op == O_dtpoff)
   6777  1.1  skrll       && !orig_insn->is_specific_opcode && use_transform ())
   6778  1.1  skrll     xg_assembly_relax (&istack, orig_insn, now_seg, frag_now, 0, 1, 0);
   6779  1.1  skrll   else
   6780  1.1  skrll     if (xg_expand_assembly_insn (&istack, orig_insn))
   6781  1.1  skrll       return TRUE;
   6782  1.1  skrll 
   6783  1.1  skrll   for (i = 0; i < istack.ninsn; i++)
   6784  1.1  skrll     {
   6785  1.1  skrll       TInsn *insn = &istack.insn[i];
   6786  1.1  skrll       switch (insn->insn_type)
   6787  1.1  skrll 	{
   6788  1.1  skrll 	case ITYPE_LITERAL:
   6789  1.1  skrll 	  assert (lit_sym == NULL);
   6790  1.1  skrll 	  lit_sym = xg_assemble_literal (insn);
   6791  1.1  skrll 	  break;
   6792  1.1  skrll 	case ITYPE_LABEL:
   6793  1.1  skrll 	  {
   6794  1.1  skrll 	    static int relaxed_sym_idx = 0;
   6795  1.1  skrll 	    char *label = xmalloc (strlen (FAKE_LABEL_NAME) + 12);
   6796  1.1  skrll 	    sprintf (label, "%s_rl_%x", FAKE_LABEL_NAME, relaxed_sym_idx++);
   6797  1.1  skrll 	    colon (label);
   6798  1.1  skrll 	    assert (label_sym == NULL);
   6799  1.1  skrll 	    label_sym = symbol_find_or_make (label);
   6800  1.1  skrll 	    assert (label_sym);
   6801  1.1  skrll 	    free (label);
   6802  1.1  skrll 	  }
   6803  1.1  skrll 	  break;
   6804  1.1  skrll 	case ITYPE_INSN:
   6805  1.1  skrll 	  {
   6806  1.1  skrll 	    vliw_insn v;
   6807  1.1  skrll 	    if (lit_sym)
   6808  1.1  skrll 	      xg_resolve_literals (insn, lit_sym);
   6809  1.1  skrll 	    if (label_sym)
   6810  1.1  skrll 	      xg_resolve_labels (insn, label_sym);
   6811  1.1  skrll 	    xg_init_vinsn (&v);
   6812  1.1  skrll 	    bundle_tinsn (insn, &v);
   6813  1.1  skrll 	    finish_vinsn (&v);
   6814  1.1  skrll 	    xg_free_vinsn (&v);
   6815  1.1  skrll 	  }
   6816  1.1  skrll 	  break;
   6817  1.1  skrll 	default:
   6818  1.1  skrll 	  assert (0);
   6819  1.1  skrll 	  break;
   6820  1.1  skrll 	}
   6821  1.1  skrll     }
   6822  1.1  skrll   return FALSE;
   6823  1.1  skrll }
   6824  1.1  skrll 
   6825  1.1  skrll 
   6826  1.1  skrll static int
   6827  1.1  skrll total_frag_text_expansion (fragS *fragP)
   6828  1.1  skrll {
   6829  1.1  skrll   int slot;
   6830  1.1  skrll   int total_expansion = 0;
   6831  1.1  skrll 
   6832  1.1  skrll   for (slot = 0; slot < MAX_SLOTS; slot++)
   6833  1.1  skrll     total_expansion += fragP->tc_frag_data.text_expansion[slot];
   6834  1.1  skrll 
   6835  1.1  skrll   return total_expansion;
   6836  1.1  skrll }
   6837  1.1  skrll 
   6838  1.1  skrll 
   6839  1.1  skrll /* Emit a vliw instruction to the current fragment.  */
   6840  1.1  skrll 
   6841  1.1  skrll static void
   6842  1.1  skrll xg_assemble_vliw_tokens (vliw_insn *vinsn)
   6843  1.1  skrll {
   6844  1.1  skrll   bfd_boolean finish_frag;
   6845  1.1  skrll   bfd_boolean is_jump = FALSE;
   6846  1.1  skrll   bfd_boolean is_branch = FALSE;
   6847  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   6848  1.1  skrll   int insn_size;
   6849  1.1  skrll   int extra_space;
   6850  1.1  skrll   char *f = NULL;
   6851  1.1  skrll   int slot;
   6852  1.1  skrll   struct dwarf2_line_info debug_line;
   6853  1.1  skrll   bfd_boolean loc_directive_seen = FALSE;
   6854  1.1  skrll   TInsn *tinsn;
   6855  1.1  skrll 
   6856  1.1  skrll   memset (&debug_line, 0, sizeof (struct dwarf2_line_info));
   6857  1.1  skrll 
   6858  1.1  skrll   if (generating_literals)
   6859  1.1  skrll     {
   6860  1.1  skrll       static int reported = 0;
   6861  1.1  skrll       if (reported < 4)
   6862  1.1  skrll 	as_bad_where (frag_now->fr_file, frag_now->fr_line,
   6863  1.1  skrll 		      _("cannot assemble into a literal fragment"));
   6864  1.1  skrll       if (reported == 3)
   6865  1.1  skrll 	as_bad (_("..."));
   6866  1.1  skrll       reported++;
   6867  1.1  skrll       return;
   6868  1.1  skrll     }
   6869  1.1  skrll 
   6870  1.1  skrll   if (frag_now_fix () != 0
   6871  1.1  skrll       && (! frag_now->tc_frag_data.is_insn
   6872  1.1  skrll  	  || (vinsn_has_specific_opcodes (vinsn) && use_transform ())
   6873  1.1  skrll  	  || !use_transform () != frag_now->tc_frag_data.is_no_transform
   6874  1.1  skrll  	  || (directive_state[directive_longcalls]
   6875  1.1  skrll 	      != frag_now->tc_frag_data.use_longcalls)
   6876  1.1  skrll  	  || (directive_state[directive_absolute_literals]
   6877  1.1  skrll 	      != frag_now->tc_frag_data.use_absolute_literals)))
   6878  1.1  skrll     {
   6879  1.1  skrll       frag_wane (frag_now);
   6880  1.1  skrll       frag_new (0);
   6881  1.1  skrll       xtensa_set_frag_assembly_state (frag_now);
   6882  1.1  skrll     }
   6883  1.1  skrll 
   6884  1.1  skrll   if (workaround_a0_b_retw
   6885  1.1  skrll       && vinsn->num_slots == 1
   6886  1.1  skrll       && (get_last_insn_flags (now_seg, now_subseg) & FLAG_IS_A0_WRITER) != 0
   6887  1.1  skrll       && xtensa_opcode_is_branch (isa, vinsn->slots[0].opcode) == 1
   6888  1.1  skrll       && use_transform ())
   6889  1.1  skrll     {
   6890  1.1  skrll       has_a0_b_retw = TRUE;
   6891  1.1  skrll 
   6892  1.1  skrll       /* Mark this fragment with the special RELAX_ADD_NOP_IF_A0_B_RETW.
   6893  1.1  skrll 	 After the first assembly pass we will check all of them and
   6894  1.1  skrll 	 add a nop if needed.  */
   6895  1.1  skrll       frag_now->tc_frag_data.is_insn = TRUE;
   6896  1.1  skrll       frag_var (rs_machine_dependent, 4, 4,
   6897  1.1  skrll 		RELAX_ADD_NOP_IF_A0_B_RETW,
   6898  1.1  skrll 		frag_now->fr_symbol,
   6899  1.1  skrll 		frag_now->fr_offset,
   6900  1.1  skrll 		NULL);
   6901  1.1  skrll       xtensa_set_frag_assembly_state (frag_now);
   6902  1.1  skrll       frag_now->tc_frag_data.is_insn = TRUE;
   6903  1.1  skrll       frag_var (rs_machine_dependent, 4, 4,
   6904  1.1  skrll 		RELAX_ADD_NOP_IF_A0_B_RETW,
   6905  1.1  skrll 		frag_now->fr_symbol,
   6906  1.1  skrll 		frag_now->fr_offset,
   6907  1.1  skrll 		NULL);
   6908  1.1  skrll       xtensa_set_frag_assembly_state (frag_now);
   6909  1.1  skrll     }
   6910  1.1  skrll 
   6911  1.1  skrll   for (slot = 0; slot < vinsn->num_slots; slot++)
   6912  1.1  skrll     {
   6913  1.1  skrll       tinsn = &vinsn->slots[slot];
   6914  1.1  skrll 
   6915  1.1  skrll       /* See if the instruction implies an aligned section.  */
   6916  1.1  skrll       if (xtensa_opcode_is_loop (isa, tinsn->opcode) == 1)
   6917  1.1  skrll 	record_alignment (now_seg, 2);
   6918  1.1  skrll 
   6919  1.1  skrll       /* Determine the best line number for debug info.  */
   6920  1.1  skrll       if ((tinsn->loc_directive_seen || !loc_directive_seen)
   6921  1.1  skrll 	  && (tinsn->debug_line.filenum != debug_line.filenum
   6922  1.1  skrll 	      || tinsn->debug_line.line < debug_line.line
   6923  1.1  skrll 	      || tinsn->debug_line.column < debug_line.column))
   6924  1.1  skrll 	debug_line = tinsn->debug_line;
   6925  1.1  skrll       if (tinsn->loc_directive_seen)
   6926  1.1  skrll 	loc_directive_seen = TRUE;
   6927  1.1  skrll     }
   6928  1.1  skrll 
   6929  1.1  skrll   /* Special cases for instructions that force an alignment... */
   6930  1.1  skrll   /* None of these opcodes are bundle-able.  */
   6931  1.1  skrll   if (xtensa_opcode_is_loop (isa, vinsn->slots[0].opcode) == 1)
   6932  1.1  skrll     {
   6933  1.1  skrll       int max_fill;
   6934  1.1  skrll 
   6935  1.1  skrll       /* Remember the symbol that marks the end of the loop in the frag
   6936  1.1  skrll 	 that marks the start of the loop.  This way we can easily find
   6937  1.1  skrll 	 the end of the loop at the beginning, without adding special code
   6938  1.1  skrll 	 to mark the loop instructions themselves.  */
   6939  1.1  skrll       symbolS *target_sym = NULL;
   6940  1.1  skrll       if (vinsn->slots[0].tok[1].X_op == O_symbol)
   6941  1.1  skrll 	target_sym = vinsn->slots[0].tok[1].X_add_symbol;
   6942  1.1  skrll 
   6943  1.1  skrll       xtensa_set_frag_assembly_state (frag_now);
   6944  1.1  skrll       frag_now->tc_frag_data.is_insn = TRUE;
   6945  1.1  skrll 
   6946  1.1  skrll       max_fill = get_text_align_max_fill_size
   6947  1.1  skrll 	(get_text_align_power (xtensa_fetch_width),
   6948  1.1  skrll 	 TRUE, frag_now->tc_frag_data.is_no_density);
   6949  1.1  skrll 
   6950  1.1  skrll       if (use_transform ())
   6951  1.1  skrll 	frag_var (rs_machine_dependent, max_fill, max_fill,
   6952  1.1  skrll 		  RELAX_ALIGN_NEXT_OPCODE, target_sym, 0, NULL);
   6953  1.1  skrll       else
   6954  1.1  skrll 	frag_var (rs_machine_dependent, 0, 0,
   6955  1.1  skrll 		  RELAX_CHECK_ALIGN_NEXT_OPCODE, target_sym, 0, NULL);
   6956  1.1  skrll       xtensa_set_frag_assembly_state (frag_now);
   6957  1.1  skrll     }
   6958  1.1  skrll 
   6959  1.1  skrll   if (vinsn->slots[0].opcode == xtensa_entry_opcode
   6960  1.1  skrll       && !vinsn->slots[0].is_specific_opcode)
   6961  1.1  skrll     {
   6962  1.1  skrll       xtensa_mark_literal_pool_location ();
   6963  1.1  skrll       xtensa_move_labels (frag_now, 0);
   6964  1.1  skrll       frag_var (rs_align_test, 1, 1, 0, NULL, 2, NULL);
   6965  1.1  skrll     }
   6966  1.1  skrll 
   6967  1.1  skrll   if (vinsn->num_slots == 1)
   6968  1.1  skrll     {
   6969  1.1  skrll       if (workaround_a0_b_retw && use_transform ())
   6970  1.1  skrll 	set_last_insn_flags (now_seg, now_subseg, FLAG_IS_A0_WRITER,
   6971  1.1  skrll 			     is_register_writer (&vinsn->slots[0], "a", 0));
   6972  1.1  skrll 
   6973  1.1  skrll       set_last_insn_flags (now_seg, now_subseg, FLAG_IS_BAD_LOOPEND,
   6974  1.1  skrll 			   is_bad_loopend_opcode (&vinsn->slots[0]));
   6975  1.1  skrll     }
   6976  1.1  skrll   else
   6977  1.1  skrll     set_last_insn_flags (now_seg, now_subseg, FLAG_IS_BAD_LOOPEND, FALSE);
   6978  1.1  skrll 
   6979  1.1  skrll   insn_size = xtensa_format_length (isa, vinsn->format);
   6980  1.1  skrll 
   6981  1.1  skrll   extra_space = relaxation_requirements (vinsn, &finish_frag);
   6982  1.1  skrll 
   6983  1.1  skrll   /* vinsn_to_insnbuf will produce the error.  */
   6984  1.1  skrll   if (vinsn->format != XTENSA_UNDEFINED)
   6985  1.1  skrll     {
   6986  1.1  skrll       f = frag_more (insn_size + extra_space);
   6987  1.1  skrll       xtensa_set_frag_assembly_state (frag_now);
   6988  1.1  skrll       frag_now->tc_frag_data.is_insn = TRUE;
   6989  1.1  skrll     }
   6990  1.1  skrll 
   6991  1.1  skrll   vinsn_to_insnbuf (vinsn, f, frag_now, FALSE);
   6992  1.1  skrll   if (vinsn->format == XTENSA_UNDEFINED)
   6993  1.1  skrll     return;
   6994  1.1  skrll 
   6995  1.1  skrll   xtensa_insnbuf_to_chars (isa, vinsn->insnbuf, (unsigned char *) f, 0);
   6996  1.1  skrll 
   6997  1.1  skrll   if (debug_type == DEBUG_DWARF2 || loc_directive_seen)
   6998  1.1  skrll     dwarf2_gen_line_info (frag_now_fix () - (insn_size + extra_space),
   6999  1.1  skrll 			  &debug_line);
   7000  1.1  skrll 
   7001  1.1  skrll   for (slot = 0; slot < vinsn->num_slots; slot++)
   7002  1.1  skrll     {
   7003  1.1  skrll       tinsn = &vinsn->slots[slot];
   7004  1.1  skrll       frag_now->tc_frag_data.slot_subtypes[slot] = tinsn->subtype;
   7005  1.1  skrll       frag_now->tc_frag_data.slot_symbols[slot] = tinsn->symbol;
   7006  1.1  skrll       frag_now->tc_frag_data.slot_offsets[slot] = tinsn->offset;
   7007  1.1  skrll       frag_now->tc_frag_data.literal_frags[slot] = tinsn->literal_frag;
   7008  1.1  skrll       if (tinsn->literal_space != 0)
   7009  1.1  skrll 	xg_assemble_literal_space (tinsn->literal_space, slot);
   7010  1.1  skrll 
   7011  1.1  skrll       if (tinsn->subtype == RELAX_NARROW)
   7012  1.1  skrll 	assert (vinsn->num_slots == 1);
   7013  1.1  skrll       if (xtensa_opcode_is_jump (isa, tinsn->opcode) == 1)
   7014  1.1  skrll 	is_jump = TRUE;
   7015  1.1  skrll       if (xtensa_opcode_is_branch (isa, tinsn->opcode) == 1)
   7016  1.1  skrll 	is_branch = TRUE;
   7017  1.1  skrll 
   7018  1.1  skrll       if (tinsn->subtype || tinsn->symbol || tinsn->offset
   7019  1.1  skrll 	  || tinsn->literal_frag || is_jump || is_branch)
   7020  1.1  skrll 	finish_frag = TRUE;
   7021  1.1  skrll     }
   7022  1.1  skrll 
   7023  1.1  skrll   if (vinsn_has_specific_opcodes (vinsn) && use_transform ())
   7024  1.1  skrll     frag_now->tc_frag_data.is_specific_opcode = TRUE;
   7025  1.1  skrll 
   7026  1.1  skrll   if (finish_frag)
   7027  1.1  skrll     {
   7028  1.1  skrll       frag_variant (rs_machine_dependent,
   7029  1.1  skrll 		    extra_space, extra_space, RELAX_SLOTS,
   7030  1.1  skrll 		    frag_now->fr_symbol, frag_now->fr_offset, f);
   7031  1.1  skrll       xtensa_set_frag_assembly_state (frag_now);
   7032  1.1  skrll     }
   7033  1.1  skrll 
   7034  1.1  skrll   /* Special cases for loops:
   7035  1.1  skrll      close_loop_end should be inserted AFTER short_loop.
   7036  1.1  skrll      Make sure that CLOSE loops are processed BEFORE short_loops
   7037  1.1  skrll      when converting them.  */
   7038  1.1  skrll 
   7039  1.1  skrll   /* "short_loop": Add a NOP if the loop is < 4 bytes.  */
   7040  1.1  skrll   if (xtensa_opcode_is_loop (isa, vinsn->slots[0].opcode) == 1
   7041  1.1  skrll       && !vinsn->slots[0].is_specific_opcode)
   7042  1.1  skrll     {
   7043  1.1  skrll       if (workaround_short_loop && use_transform ())
   7044  1.1  skrll 	{
   7045  1.1  skrll 	  maybe_has_short_loop = TRUE;
   7046  1.1  skrll 	  frag_now->tc_frag_data.is_insn = TRUE;
   7047  1.1  skrll 	  frag_var (rs_machine_dependent, 4, 4,
   7048  1.1  skrll 		    RELAX_ADD_NOP_IF_SHORT_LOOP,
   7049  1.1  skrll 		    frag_now->fr_symbol, frag_now->fr_offset, NULL);
   7050  1.1  skrll 	  frag_now->tc_frag_data.is_insn = TRUE;
   7051  1.1  skrll 	  frag_var (rs_machine_dependent, 4, 4,
   7052  1.1  skrll 		    RELAX_ADD_NOP_IF_SHORT_LOOP,
   7053  1.1  skrll 		    frag_now->fr_symbol, frag_now->fr_offset, NULL);
   7054  1.1  skrll 	}
   7055  1.1  skrll 
   7056  1.1  skrll       /* "close_loop_end": Add up to 12 bytes of NOPs to keep a
   7057  1.1  skrll 	 loop at least 12 bytes away from another loop's end.  */
   7058  1.1  skrll       if (workaround_close_loop_end && use_transform ())
   7059  1.1  skrll 	{
   7060  1.1  skrll 	  maybe_has_close_loop_end = TRUE;
   7061  1.1  skrll 	  frag_now->tc_frag_data.is_insn = TRUE;
   7062  1.1  skrll 	  frag_var (rs_machine_dependent, 12, 12,
   7063  1.1  skrll 		    RELAX_ADD_NOP_IF_CLOSE_LOOP_END,
   7064  1.1  skrll 		    frag_now->fr_symbol, frag_now->fr_offset, NULL);
   7065  1.1  skrll 	}
   7066  1.1  skrll     }
   7067  1.1  skrll 
   7068  1.1  skrll   if (use_transform ())
   7069  1.1  skrll     {
   7070  1.1  skrll       if (is_jump)
   7071  1.1  skrll 	{
   7072  1.1  skrll 	  assert (finish_frag);
   7073  1.1  skrll 	  frag_var (rs_machine_dependent,
   7074  1.1  skrll 		    UNREACHABLE_MAX_WIDTH, UNREACHABLE_MAX_WIDTH,
   7075  1.1  skrll 		    RELAX_UNREACHABLE,
   7076  1.1  skrll 		    frag_now->fr_symbol, frag_now->fr_offset, NULL);
   7077  1.1  skrll 	  xtensa_set_frag_assembly_state (frag_now);
   7078  1.1  skrll 	}
   7079  1.1  skrll       else if (is_branch && do_align_targets ())
   7080  1.1  skrll 	{
   7081  1.1  skrll 	  assert (finish_frag);
   7082  1.1  skrll 	  frag_var (rs_machine_dependent,
   7083  1.1  skrll 		    UNREACHABLE_MAX_WIDTH, UNREACHABLE_MAX_WIDTH,
   7084  1.1  skrll 		    RELAX_MAYBE_UNREACHABLE,
   7085  1.1  skrll 		    frag_now->fr_symbol, frag_now->fr_offset, NULL);
   7086  1.1  skrll 	  xtensa_set_frag_assembly_state (frag_now);
   7087  1.1  skrll 	  frag_var (rs_machine_dependent,
   7088  1.1  skrll 		    0, 0,
   7089  1.1  skrll 		    RELAX_MAYBE_DESIRE_ALIGN,
   7090  1.1  skrll 		    frag_now->fr_symbol, frag_now->fr_offset, NULL);
   7091  1.1  skrll 	  xtensa_set_frag_assembly_state (frag_now);
   7092  1.1  skrll 	}
   7093  1.1  skrll     }
   7094  1.1  skrll 
   7095  1.1  skrll   /* Now, if the original opcode was a call...  */
   7096  1.1  skrll   if (do_align_targets ()
   7097  1.1  skrll       && xtensa_opcode_is_call (isa, vinsn->slots[0].opcode) == 1)
   7098  1.1  skrll     {
   7099  1.1  skrll       float freq = get_subseg_total_freq (now_seg, now_subseg);
   7100  1.1  skrll       frag_now->tc_frag_data.is_insn = TRUE;
   7101  1.1  skrll       frag_var (rs_machine_dependent, 4, (int) freq, RELAX_DESIRE_ALIGN,
   7102  1.1  skrll 		frag_now->fr_symbol, frag_now->fr_offset, NULL);
   7103  1.1  skrll       xtensa_set_frag_assembly_state (frag_now);
   7104  1.1  skrll     }
   7105  1.1  skrll 
   7106  1.1  skrll   if (vinsn_has_specific_opcodes (vinsn) && use_transform ())
   7107  1.1  skrll     {
   7108  1.1  skrll       frag_wane (frag_now);
   7109  1.1  skrll       frag_new (0);
   7110  1.1  skrll       xtensa_set_frag_assembly_state (frag_now);
   7111  1.1  skrll     }
   7112  1.1  skrll }
   7113  1.1  skrll 
   7114  1.1  skrll 
   7115  1.1  skrll /* xtensa_end and helper functions.  */
   7117  1.1  skrll 
   7118  1.1  skrll static void xtensa_cleanup_align_frags (void);
   7119  1.1  skrll static void xtensa_fix_target_frags (void);
   7120  1.1  skrll static void xtensa_mark_narrow_branches (void);
   7121  1.1  skrll static void xtensa_mark_zcl_first_insns (void);
   7122  1.1  skrll static void xtensa_mark_difference_of_two_symbols (void);
   7123  1.1  skrll static void xtensa_fix_a0_b_retw_frags (void);
   7124  1.1  skrll static void xtensa_fix_b_j_loop_end_frags (void);
   7125  1.1  skrll static void xtensa_fix_close_loop_end_frags (void);
   7126  1.1  skrll static void xtensa_fix_short_loop_frags (void);
   7127  1.1  skrll static void xtensa_sanity_check (void);
   7128  1.1  skrll static void xtensa_add_config_info (void);
   7129  1.1  skrll 
   7130  1.1  skrll void
   7131  1.1  skrll xtensa_end (void)
   7132  1.1  skrll {
   7133  1.1  skrll   directive_balance ();
   7134  1.1  skrll   xtensa_flush_pending_output ();
   7135  1.1  skrll 
   7136  1.1  skrll   past_xtensa_end = TRUE;
   7137  1.1  skrll 
   7138  1.1  skrll   xtensa_move_literals ();
   7139  1.1  skrll 
   7140  1.1  skrll   xtensa_reorder_segments ();
   7141  1.1  skrll   xtensa_cleanup_align_frags ();
   7142  1.1  skrll   xtensa_fix_target_frags ();
   7143  1.1  skrll   if (workaround_a0_b_retw && has_a0_b_retw)
   7144  1.1  skrll     xtensa_fix_a0_b_retw_frags ();
   7145  1.1  skrll   if (workaround_b_j_loop_end)
   7146  1.1  skrll     xtensa_fix_b_j_loop_end_frags ();
   7147  1.1  skrll 
   7148  1.1  skrll   /* "close_loop_end" should be processed BEFORE "short_loop".  */
   7149  1.1  skrll   if (workaround_close_loop_end && maybe_has_close_loop_end)
   7150  1.1  skrll     xtensa_fix_close_loop_end_frags ();
   7151  1.1  skrll 
   7152  1.1  skrll   if (workaround_short_loop && maybe_has_short_loop)
   7153  1.1  skrll     xtensa_fix_short_loop_frags ();
   7154  1.1  skrll   if (align_targets)
   7155  1.1  skrll     xtensa_mark_narrow_branches ();
   7156  1.1  skrll   xtensa_mark_zcl_first_insns ();
   7157  1.1  skrll 
   7158  1.1  skrll   xtensa_sanity_check ();
   7159  1.1  skrll 
   7160  1.1  skrll   xtensa_add_config_info ();
   7161  1.1  skrll }
   7162  1.1  skrll 
   7163  1.1  skrll 
   7164  1.1  skrll static void
   7165  1.1  skrll xtensa_cleanup_align_frags (void)
   7166  1.1  skrll {
   7167  1.1  skrll   frchainS *frchP;
   7168  1.1  skrll   asection *s;
   7169  1.1  skrll 
   7170  1.1  skrll   for (s = stdoutput->sections; s; s = s->next)
   7171  1.1  skrll     for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
   7172  1.1  skrll       {
   7173  1.1  skrll 	fragS *fragP;
   7174  1.1  skrll 	/* Walk over all of the fragments in a subsection.  */
   7175  1.1  skrll 	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
   7176  1.1  skrll 	  {
   7177  1.1  skrll 	    if ((fragP->fr_type == rs_align
   7178  1.1  skrll 		 || fragP->fr_type == rs_align_code
   7179  1.1  skrll 		 || (fragP->fr_type == rs_machine_dependent
   7180  1.1  skrll 		     && (fragP->fr_subtype == RELAX_DESIRE_ALIGN
   7181  1.1  skrll 			 || fragP->fr_subtype == RELAX_DESIRE_ALIGN_IF_TARGET)))
   7182  1.1  skrll 		&& fragP->fr_fix == 0)
   7183  1.1  skrll 	      {
   7184  1.1  skrll 		fragS *next = fragP->fr_next;
   7185  1.1  skrll 
   7186  1.1  skrll 		while (next
   7187  1.1  skrll 		       && next->fr_fix == 0
   7188  1.1  skrll 		       && next->fr_type == rs_machine_dependent
   7189  1.1  skrll 		       && next->fr_subtype == RELAX_DESIRE_ALIGN_IF_TARGET)
   7190  1.1  skrll 		  {
   7191  1.1  skrll 		    frag_wane (next);
   7192  1.1  skrll 		    next = next->fr_next;
   7193  1.1  skrll 		  }
   7194  1.1  skrll 	      }
   7195  1.1  skrll 	    /* If we don't widen branch targets, then they
   7196  1.1  skrll 	       will be easier to align.  */
   7197  1.1  skrll 	    if (fragP->tc_frag_data.is_branch_target
   7198  1.1  skrll 		&& fragP->fr_opcode == fragP->fr_literal
   7199  1.1  skrll 		&& fragP->fr_type == rs_machine_dependent
   7200  1.1  skrll 		&& fragP->fr_subtype == RELAX_SLOTS
   7201  1.1  skrll 		&& fragP->tc_frag_data.slot_subtypes[0] == RELAX_NARROW)
   7202  1.1  skrll 	      frag_wane (fragP);
   7203  1.1  skrll 	    if (fragP->fr_type == rs_machine_dependent
   7204  1.1  skrll 		&& fragP->fr_subtype == RELAX_UNREACHABLE)
   7205  1.1  skrll 	      fragP->tc_frag_data.is_unreachable = TRUE;
   7206  1.1  skrll 	  }
   7207  1.1  skrll       }
   7208  1.1  skrll }
   7209  1.1  skrll 
   7210  1.1  skrll 
   7211  1.1  skrll /* Re-process all of the fragments looking to convert all of the
   7212  1.1  skrll    RELAX_DESIRE_ALIGN_IF_TARGET fragments.  If there is a branch
   7213  1.1  skrll    target in the next fragment, convert this to RELAX_DESIRE_ALIGN.
   7214  1.1  skrll    Otherwise, convert to a .fill 0.  */
   7215  1.1  skrll 
   7216  1.1  skrll static void
   7217  1.1  skrll xtensa_fix_target_frags (void)
   7218  1.1  skrll {
   7219  1.1  skrll   frchainS *frchP;
   7220  1.1  skrll   asection *s;
   7221  1.1  skrll 
   7222  1.1  skrll   /* When this routine is called, all of the subsections are still intact
   7223  1.1  skrll      so we walk over subsections instead of sections.  */
   7224  1.1  skrll   for (s = stdoutput->sections; s; s = s->next)
   7225  1.1  skrll     for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
   7226  1.1  skrll       {
   7227  1.1  skrll 	fragS *fragP;
   7228  1.1  skrll 
   7229  1.1  skrll 	/* Walk over all of the fragments in a subsection.  */
   7230  1.1  skrll 	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
   7231  1.1  skrll 	  {
   7232  1.1  skrll 	    if (fragP->fr_type == rs_machine_dependent
   7233  1.1  skrll 		&& fragP->fr_subtype == RELAX_DESIRE_ALIGN_IF_TARGET)
   7234  1.1  skrll 	      {
   7235  1.1  skrll 		if (next_frag_is_branch_target (fragP))
   7236  1.1  skrll 		  fragP->fr_subtype = RELAX_DESIRE_ALIGN;
   7237  1.1  skrll 		else
   7238  1.1  skrll 		  frag_wane (fragP);
   7239  1.1  skrll 	      }
   7240  1.1  skrll 	  }
   7241  1.1  skrll       }
   7242  1.1  skrll }
   7243  1.1  skrll 
   7244  1.1  skrll 
   7245  1.1  skrll static bfd_boolean is_narrow_branch_guaranteed_in_range (fragS *, TInsn *);
   7246  1.1  skrll 
   7247  1.1  skrll static void
   7248  1.1  skrll xtensa_mark_narrow_branches (void)
   7249  1.1  skrll {
   7250  1.1  skrll   frchainS *frchP;
   7251  1.1  skrll   asection *s;
   7252  1.1  skrll 
   7253  1.1  skrll   for (s = stdoutput->sections; s; s = s->next)
   7254  1.1  skrll     for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
   7255  1.1  skrll       {
   7256  1.1  skrll 	fragS *fragP;
   7257  1.1  skrll 	/* Walk over all of the fragments in a subsection.  */
   7258  1.1  skrll 	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
   7259  1.1  skrll 	  {
   7260  1.1  skrll 	    if (fragP->fr_type == rs_machine_dependent
   7261  1.1  skrll 		&& fragP->fr_subtype == RELAX_SLOTS
   7262  1.1  skrll 		&& fragP->tc_frag_data.slot_subtypes[0] == RELAX_IMMED)
   7263  1.1  skrll 	      {
   7264  1.1  skrll 		vliw_insn vinsn;
   7265  1.1  skrll 
   7266  1.1  skrll 		vinsn_from_chars (&vinsn, fragP->fr_opcode);
   7267  1.1  skrll 		tinsn_immed_from_frag (&vinsn.slots[0], fragP, 0);
   7268  1.1  skrll 
   7269  1.1  skrll 		if (vinsn.num_slots == 1
   7270  1.1  skrll 		    && xtensa_opcode_is_branch (xtensa_default_isa,
   7271  1.1  skrll 						vinsn.slots[0].opcode) == 1
   7272  1.1  skrll 		    && xg_get_single_size (vinsn.slots[0].opcode) == 2
   7273  1.1  skrll 		    && is_narrow_branch_guaranteed_in_range (fragP,
   7274  1.1  skrll 							     &vinsn.slots[0]))
   7275  1.1  skrll 		  {
   7276  1.1  skrll 		    fragP->fr_subtype = RELAX_SLOTS;
   7277  1.1  skrll 		    fragP->tc_frag_data.slot_subtypes[0] = RELAX_NARROW;
   7278  1.1  skrll 		    fragP->tc_frag_data.is_aligning_branch = 1;
   7279  1.1  skrll 		  }
   7280  1.1  skrll 	      }
   7281  1.1  skrll 	  }
   7282  1.1  skrll       }
   7283  1.1  skrll }
   7284  1.1  skrll 
   7285  1.1  skrll 
   7286  1.1  skrll /* A branch is typically widened only when its target is out of
   7287  1.1  skrll    range.  However, we would like to widen them to align a subsequent
   7288  1.1  skrll    branch target when possible.
   7289  1.1  skrll 
   7290  1.1  skrll    Because the branch relaxation code is so convoluted, the optimal solution
   7291  1.1  skrll    (combining the two cases) is difficult to get right in all circumstances.
   7292  1.1  skrll    We therefore go with an "almost as good" solution, where we only
   7293  1.1  skrll    use for alignment narrow branches that definitely will not expand to a
   7294  1.1  skrll    jump and a branch.  These functions find and mark these cases.  */
   7295  1.1  skrll 
   7296  1.1  skrll /* The range in bytes of BNEZ.N and BEQZ.N.  The target operand is encoded
   7297  1.1  skrll    as PC + 4 + imm6, where imm6 is a 6-bit immediate ranging from 0 to 63.
   7298  1.1  skrll    We start counting beginning with the frag after the 2-byte branch, so the
   7299  1.1  skrll    maximum offset is (4 - 2) + 63 = 65.  */
   7300  1.1  skrll #define MAX_IMMED6 65
   7301  1.1  skrll 
   7302  1.1  skrll static offsetT unrelaxed_frag_max_size (fragS *);
   7303  1.1  skrll 
   7304  1.1  skrll static bfd_boolean
   7305  1.1  skrll is_narrow_branch_guaranteed_in_range (fragS *fragP, TInsn *tinsn)
   7306  1.1  skrll {
   7307  1.1  skrll   const expressionS *expr = &tinsn->tok[1];
   7308  1.1  skrll   symbolS *symbolP = expr->X_add_symbol;
   7309  1.1  skrll   offsetT max_distance = expr->X_add_number;
   7310  1.1  skrll   fragS *target_frag;
   7311  1.1  skrll 
   7312  1.1  skrll   if (expr->X_op != O_symbol)
   7313  1.1  skrll     return FALSE;
   7314  1.1  skrll 
   7315  1.1  skrll   target_frag = symbol_get_frag (symbolP);
   7316  1.1  skrll 
   7317  1.1  skrll   max_distance += (S_GET_VALUE (symbolP) - target_frag->fr_address);
   7318  1.1  skrll   if (is_branch_jmp_to_next (tinsn, fragP))
   7319  1.1  skrll     return FALSE;
   7320  1.1  skrll 
   7321  1.1  skrll   /* The branch doesn't branch over it's own frag,
   7322  1.1  skrll      but over the subsequent ones.  */
   7323  1.1  skrll   fragP = fragP->fr_next;
   7324  1.1  skrll   while (fragP != NULL && fragP != target_frag && max_distance <= MAX_IMMED6)
   7325  1.1  skrll     {
   7326  1.1  skrll       max_distance += unrelaxed_frag_max_size (fragP);
   7327  1.1  skrll       fragP = fragP->fr_next;
   7328  1.1  skrll     }
   7329  1.1  skrll   if (max_distance <= MAX_IMMED6 && fragP == target_frag)
   7330  1.1  skrll     return TRUE;
   7331  1.1  skrll   return FALSE;
   7332  1.1  skrll }
   7333  1.1  skrll 
   7334  1.1  skrll 
   7335  1.1  skrll static void
   7336  1.1  skrll xtensa_mark_zcl_first_insns (void)
   7337  1.1  skrll {
   7338  1.1  skrll   frchainS *frchP;
   7339  1.1  skrll   asection *s;
   7340  1.1  skrll 
   7341  1.1  skrll   for (s = stdoutput->sections; s; s = s->next)
   7342  1.1  skrll     for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
   7343  1.1  skrll       {
   7344  1.1  skrll 	fragS *fragP;
   7345  1.1  skrll 	/* Walk over all of the fragments in a subsection.  */
   7346  1.1  skrll 	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
   7347  1.1  skrll 	  {
   7348  1.1  skrll 	    if (fragP->fr_type == rs_machine_dependent
   7349  1.1  skrll 		&& (fragP->fr_subtype == RELAX_ALIGN_NEXT_OPCODE
   7350  1.1  skrll 		    || fragP->fr_subtype == RELAX_CHECK_ALIGN_NEXT_OPCODE))
   7351  1.1  skrll 	      {
   7352  1.1  skrll 		/* Find the loop frag.  */
   7353  1.1  skrll 		fragS *targ_frag = next_non_empty_frag (fragP);
   7354  1.1  skrll 		/* Find the first insn frag.  */
   7355  1.1  skrll 		targ_frag = next_non_empty_frag (targ_frag);
   7356  1.1  skrll 
   7357  1.1  skrll 		/* Of course, sometimes (mostly for toy test cases) a
   7358  1.1  skrll 		   zero-cost loop instruction is the last in a section.  */
   7359  1.1  skrll 		if (targ_frag)
   7360  1.1  skrll 		  {
   7361  1.1  skrll 		    targ_frag->tc_frag_data.is_first_loop_insn = TRUE;
   7362  1.1  skrll 		    /* Do not widen a frag that is the first instruction of a
   7363  1.1  skrll 		       zero-cost loop.  It makes that loop harder to align.  */
   7364  1.1  skrll 		    if (targ_frag->fr_type == rs_machine_dependent
   7365  1.1  skrll 			&& targ_frag->fr_subtype == RELAX_SLOTS
   7366  1.1  skrll 			&& (targ_frag->tc_frag_data.slot_subtypes[0]
   7367  1.1  skrll 			    == RELAX_NARROW))
   7368  1.1  skrll 		      {
   7369  1.1  skrll 			if (targ_frag->tc_frag_data.is_aligning_branch)
   7370  1.1  skrll 			  targ_frag->tc_frag_data.slot_subtypes[0] = RELAX_IMMED;
   7371  1.1  skrll 			else
   7372  1.1  skrll 			  {
   7373  1.1  skrll 			    frag_wane (targ_frag);
   7374  1.1  skrll 			    targ_frag->tc_frag_data.slot_subtypes[0] = 0;
   7375  1.1  skrll 			  }
   7376  1.1  skrll 		      }
   7377  1.1  skrll 		  }
   7378  1.1  skrll 		if (fragP->fr_subtype == RELAX_CHECK_ALIGN_NEXT_OPCODE)
   7379  1.1  skrll 		  frag_wane (fragP);
   7380  1.1  skrll 	      }
   7381  1.1  skrll 	  }
   7382  1.1  skrll       }
   7383  1.1  skrll }
   7384  1.1  skrll 
   7385  1.1  skrll 
   7386  1.1  skrll /* When a difference-of-symbols expression is encoded as a uleb128 or
   7387  1.1  skrll    sleb128 value, the linker is unable to adjust that value to account for
   7388  1.1  skrll    link-time relaxation.  Mark all the code between such symbols so that
   7389  1.1  skrll    its size cannot be changed by linker relaxation.  */
   7390  1.1  skrll 
   7391  1.1  skrll static void
   7392  1.1  skrll xtensa_mark_difference_of_two_symbols (void)
   7393  1.1  skrll {
   7394  1.1  skrll   symbolS *expr_sym;
   7395  1.1  skrll 
   7396  1.1  skrll   for (expr_sym = expr_symbols; expr_sym;
   7397  1.1  skrll        expr_sym = symbol_get_tc (expr_sym)->next_expr_symbol)
   7398  1.1  skrll     {
   7399  1.1  skrll       expressionS *expr = symbol_get_value_expression (expr_sym);
   7400  1.1  skrll 
   7401  1.1  skrll       if (expr->X_op == O_subtract)
   7402  1.1  skrll 	{
   7403  1.1  skrll 	  symbolS *left = expr->X_add_symbol;
   7404  1.1  skrll 	  symbolS *right = expr->X_op_symbol;
   7405  1.1  skrll 
   7406  1.1  skrll 	  /* Difference of two symbols not in the same section
   7407  1.1  skrll 	     are handled with relocations in the linker.  */
   7408  1.1  skrll 	  if (S_GET_SEGMENT (left) == S_GET_SEGMENT (right))
   7409  1.1  skrll 	    {
   7410  1.1  skrll 	      fragS *start;
   7411  1.1  skrll 	      fragS *end;
   7412  1.1  skrll 
   7413  1.1  skrll 	      if (symbol_get_frag (left)->fr_address
   7414  1.1  skrll 		  <= symbol_get_frag (right)->fr_address)
   7415  1.1  skrll 		{
   7416  1.1  skrll 		  start = symbol_get_frag (left);
   7417  1.1  skrll 		  end = symbol_get_frag (right);
   7418  1.1  skrll 		}
   7419  1.1  skrll 	      else
   7420  1.1  skrll 		{
   7421  1.1  skrll 		  start = symbol_get_frag (right);
   7422  1.1  skrll 		  end = symbol_get_frag (left);
   7423  1.1  skrll 		}
   7424  1.1  skrll 	      do
   7425  1.1  skrll 		{
   7426  1.1  skrll 		  start->tc_frag_data.is_no_transform = 1;
   7427  1.1  skrll 		  start = start->fr_next;
   7428  1.1  skrll 		}
   7429  1.1  skrll 	      while (start && start->fr_address < end->fr_address);
   7430  1.1  skrll 	    }
   7431  1.1  skrll 	}
   7432  1.1  skrll     }
   7433  1.1  skrll }
   7434  1.1  skrll 
   7435  1.1  skrll 
   7436  1.1  skrll /* Re-process all of the fragments looking to convert all of the
   7437  1.1  skrll    RELAX_ADD_NOP_IF_A0_B_RETW.  If the next instruction is a
   7438  1.1  skrll    conditional branch or a retw/retw.n, convert this frag to one that
   7439  1.1  skrll    will generate a NOP.  In any case close it off with a .fill 0.  */
   7440  1.1  skrll 
   7441  1.1  skrll static bfd_boolean next_instrs_are_b_retw (fragS *);
   7442  1.1  skrll 
   7443  1.1  skrll static void
   7444  1.1  skrll xtensa_fix_a0_b_retw_frags (void)
   7445  1.1  skrll {
   7446  1.1  skrll   frchainS *frchP;
   7447  1.1  skrll   asection *s;
   7448  1.1  skrll 
   7449  1.1  skrll   /* When this routine is called, all of the subsections are still intact
   7450  1.1  skrll      so we walk over subsections instead of sections.  */
   7451  1.1  skrll   for (s = stdoutput->sections; s; s = s->next)
   7452  1.1  skrll     for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
   7453  1.1  skrll       {
   7454  1.1  skrll 	fragS *fragP;
   7455  1.1  skrll 
   7456  1.1  skrll 	/* Walk over all of the fragments in a subsection.  */
   7457  1.1  skrll 	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
   7458  1.1  skrll 	  {
   7459  1.1  skrll 	    if (fragP->fr_type == rs_machine_dependent
   7460  1.1  skrll 		&& fragP->fr_subtype == RELAX_ADD_NOP_IF_A0_B_RETW)
   7461  1.1  skrll 	      {
   7462  1.1  skrll 		if (next_instrs_are_b_retw (fragP))
   7463  1.1  skrll 		  {
   7464  1.1  skrll 		    if (fragP->tc_frag_data.is_no_transform)
   7465  1.1  skrll 		      as_bad (_("instruction sequence (write a0, branch, retw) may trigger hardware errata"));
   7466  1.1  skrll 		    else
   7467  1.1  skrll 		      relax_frag_add_nop (fragP);
   7468  1.1  skrll 		  }
   7469  1.1  skrll 		frag_wane (fragP);
   7470  1.1  skrll 	      }
   7471  1.1  skrll 	  }
   7472  1.1  skrll       }
   7473  1.1  skrll }
   7474  1.1  skrll 
   7475  1.1  skrll 
   7476  1.1  skrll static bfd_boolean
   7477  1.1  skrll next_instrs_are_b_retw (fragS *fragP)
   7478  1.1  skrll {
   7479  1.1  skrll   xtensa_opcode opcode;
   7480  1.1  skrll   xtensa_format fmt;
   7481  1.1  skrll   const fragS *next_fragP = next_non_empty_frag (fragP);
   7482  1.1  skrll   static xtensa_insnbuf insnbuf = NULL;
   7483  1.1  skrll   static xtensa_insnbuf slotbuf = NULL;
   7484  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   7485  1.1  skrll   int offset = 0;
   7486  1.1  skrll   int slot;
   7487  1.1  skrll   bfd_boolean branch_seen = FALSE;
   7488  1.1  skrll 
   7489  1.1  skrll   if (!insnbuf)
   7490  1.1  skrll     {
   7491  1.1  skrll       insnbuf = xtensa_insnbuf_alloc (isa);
   7492  1.1  skrll       slotbuf = xtensa_insnbuf_alloc (isa);
   7493  1.1  skrll     }
   7494  1.1  skrll 
   7495  1.1  skrll   if (next_fragP == NULL)
   7496  1.1  skrll     return FALSE;
   7497  1.1  skrll 
   7498  1.1  skrll   /* Check for the conditional branch.  */
   7499  1.1  skrll   xtensa_insnbuf_from_chars
   7500  1.1  skrll     (isa, insnbuf, (unsigned char *) &next_fragP->fr_literal[offset], 0);
   7501  1.1  skrll   fmt = xtensa_format_decode (isa, insnbuf);
   7502  1.1  skrll   if (fmt == XTENSA_UNDEFINED)
   7503  1.1  skrll     return FALSE;
   7504  1.1  skrll 
   7505  1.1  skrll   for (slot = 0; slot < xtensa_format_num_slots (isa, fmt); slot++)
   7506  1.1  skrll     {
   7507  1.1  skrll       xtensa_format_get_slot (isa, fmt, slot, insnbuf, slotbuf);
   7508  1.1  skrll       opcode = xtensa_opcode_decode (isa, fmt, slot, slotbuf);
   7509  1.1  skrll 
   7510  1.1  skrll       branch_seen = (branch_seen
   7511  1.1  skrll 		     || xtensa_opcode_is_branch (isa, opcode) == 1);
   7512  1.1  skrll     }
   7513  1.1  skrll 
   7514  1.1  skrll   if (!branch_seen)
   7515  1.1  skrll     return FALSE;
   7516  1.1  skrll 
   7517  1.1  skrll   offset += xtensa_format_length (isa, fmt);
   7518  1.1  skrll   if (offset == next_fragP->fr_fix)
   7519  1.1  skrll     {
   7520  1.1  skrll       next_fragP = next_non_empty_frag (next_fragP);
   7521  1.1  skrll       offset = 0;
   7522  1.1  skrll     }
   7523  1.1  skrll 
   7524  1.1  skrll   if (next_fragP == NULL)
   7525  1.1  skrll     return FALSE;
   7526  1.1  skrll 
   7527  1.1  skrll   /* Check for the retw/retw.n.  */
   7528  1.1  skrll   xtensa_insnbuf_from_chars
   7529  1.1  skrll     (isa, insnbuf, (unsigned char *) &next_fragP->fr_literal[offset], 0);
   7530  1.1  skrll   fmt = xtensa_format_decode (isa, insnbuf);
   7531  1.1  skrll 
   7532  1.1  skrll   /* Because RETW[.N] is not bundleable, a VLIW bundle here means that we
   7533  1.1  skrll      have no problems.  */
   7534  1.1  skrll   if (fmt == XTENSA_UNDEFINED
   7535  1.1  skrll       || xtensa_format_num_slots (isa, fmt) != 1)
   7536  1.1  skrll     return FALSE;
   7537  1.1  skrll 
   7538  1.1  skrll   xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf);
   7539  1.1  skrll   opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
   7540  1.1  skrll 
   7541  1.1  skrll   if (opcode == xtensa_retw_opcode || opcode == xtensa_retw_n_opcode)
   7542  1.1  skrll     return TRUE;
   7543  1.1  skrll 
   7544  1.1  skrll   return FALSE;
   7545  1.1  skrll }
   7546  1.1  skrll 
   7547  1.1  skrll 
   7548  1.1  skrll /* Re-process all of the fragments looking to convert all of the
   7549  1.1  skrll    RELAX_ADD_NOP_IF_PRE_LOOP_END.  If there is one instruction and a
   7550  1.1  skrll    loop end label, convert this frag to one that will generate a NOP.
   7551  1.1  skrll    In any case close it off with a .fill 0.  */
   7552  1.1  skrll 
   7553  1.1  skrll static bfd_boolean next_instr_is_loop_end (fragS *);
   7554  1.1  skrll 
   7555  1.1  skrll static void
   7556  1.1  skrll xtensa_fix_b_j_loop_end_frags (void)
   7557  1.1  skrll {
   7558  1.1  skrll   frchainS *frchP;
   7559  1.1  skrll   asection *s;
   7560  1.1  skrll 
   7561  1.1  skrll   /* When this routine is called, all of the subsections are still intact
   7562  1.1  skrll      so we walk over subsections instead of sections.  */
   7563  1.1  skrll   for (s = stdoutput->sections; s; s = s->next)
   7564  1.1  skrll     for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
   7565  1.1  skrll       {
   7566  1.1  skrll 	fragS *fragP;
   7567  1.1  skrll 
   7568  1.1  skrll 	/* Walk over all of the fragments in a subsection.  */
   7569  1.1  skrll 	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
   7570  1.1  skrll 	  {
   7571  1.1  skrll 	    if (fragP->fr_type == rs_machine_dependent
   7572  1.1  skrll 		&& fragP->fr_subtype == RELAX_ADD_NOP_IF_PRE_LOOP_END)
   7573  1.1  skrll 	      {
   7574  1.1  skrll 		if (next_instr_is_loop_end (fragP))
   7575  1.1  skrll 		  {
   7576  1.1  skrll 		    if (fragP->tc_frag_data.is_no_transform)
   7577  1.1  skrll 		      as_bad (_("branching or jumping to a loop end may trigger hardware errata"));
   7578  1.1  skrll 		    else
   7579  1.1  skrll 		      relax_frag_add_nop (fragP);
   7580  1.1  skrll 		  }
   7581  1.1  skrll 		frag_wane (fragP);
   7582  1.1  skrll 	      }
   7583  1.1  skrll 	  }
   7584  1.1  skrll       }
   7585  1.1  skrll }
   7586  1.1  skrll 
   7587  1.1  skrll 
   7588  1.1  skrll static bfd_boolean
   7589  1.1  skrll next_instr_is_loop_end (fragS *fragP)
   7590  1.1  skrll {
   7591  1.1  skrll   const fragS *next_fragP;
   7592  1.1  skrll 
   7593  1.1  skrll   if (next_frag_is_loop_target (fragP))
   7594  1.1  skrll     return FALSE;
   7595  1.1  skrll 
   7596  1.1  skrll   next_fragP = next_non_empty_frag (fragP);
   7597  1.1  skrll   if (next_fragP == NULL)
   7598  1.1  skrll     return FALSE;
   7599  1.1  skrll 
   7600  1.1  skrll   if (!next_frag_is_loop_target (next_fragP))
   7601  1.1  skrll     return FALSE;
   7602  1.1  skrll 
   7603  1.1  skrll   /* If the size is >= 3 then there is more than one instruction here.
   7604  1.1  skrll      The hardware bug will not fire.  */
   7605  1.1  skrll   if (next_fragP->fr_fix > 3)
   7606  1.1  skrll     return FALSE;
   7607  1.1  skrll 
   7608  1.1  skrll   return TRUE;
   7609  1.1  skrll }
   7610  1.1  skrll 
   7611  1.1  skrll 
   7612  1.1  skrll /* Re-process all of the fragments looking to convert all of the
   7613  1.1  skrll    RELAX_ADD_NOP_IF_CLOSE_LOOP_END.  If there is an loop end that is
   7614  1.1  skrll    not MY loop's loop end within 12 bytes, add enough nops here to
   7615  1.1  skrll    make it at least 12 bytes away.  In any case close it off with a
   7616  1.1  skrll    .fill 0.  */
   7617  1.1  skrll 
   7618  1.1  skrll static offsetT min_bytes_to_other_loop_end
   7619  1.1  skrll   (fragS *, fragS *, offsetT);
   7620  1.1  skrll 
   7621  1.1  skrll static void
   7622  1.1  skrll xtensa_fix_close_loop_end_frags (void)
   7623  1.1  skrll {
   7624  1.1  skrll   frchainS *frchP;
   7625  1.1  skrll   asection *s;
   7626  1.1  skrll 
   7627  1.1  skrll   /* When this routine is called, all of the subsections are still intact
   7628  1.1  skrll      so we walk over subsections instead of sections.  */
   7629  1.1  skrll   for (s = stdoutput->sections; s; s = s->next)
   7630  1.1  skrll     for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
   7631  1.1  skrll       {
   7632  1.1  skrll 	fragS *fragP;
   7633  1.1  skrll 
   7634  1.1  skrll 	fragS *current_target = NULL;
   7635  1.1  skrll 
   7636  1.1  skrll 	/* Walk over all of the fragments in a subsection.  */
   7637  1.1  skrll 	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
   7638  1.1  skrll 	  {
   7639  1.1  skrll 	    if (fragP->fr_type == rs_machine_dependent
   7640  1.1  skrll 		&& ((fragP->fr_subtype == RELAX_ALIGN_NEXT_OPCODE)
   7641  1.1  skrll 		    || (fragP->fr_subtype == RELAX_CHECK_ALIGN_NEXT_OPCODE)))
   7642  1.1  skrll 	      current_target = symbol_get_frag (fragP->fr_symbol);
   7643  1.1  skrll 
   7644  1.1  skrll 	    if (current_target
   7645  1.1  skrll 		&& fragP->fr_type == rs_machine_dependent
   7646  1.1  skrll 		&& fragP->fr_subtype == RELAX_ADD_NOP_IF_CLOSE_LOOP_END)
   7647  1.1  skrll 	      {
   7648  1.1  skrll 		offsetT min_bytes;
   7649  1.1  skrll 		int bytes_added = 0;
   7650  1.1  skrll 
   7651  1.1  skrll #define REQUIRED_LOOP_DIVIDING_BYTES 12
   7652  1.1  skrll 		/* Max out at 12.  */
   7653  1.1  skrll 		min_bytes = min_bytes_to_other_loop_end
   7654  1.1  skrll 		  (fragP->fr_next, current_target, REQUIRED_LOOP_DIVIDING_BYTES);
   7655  1.1  skrll 
   7656  1.1  skrll 		if (min_bytes < REQUIRED_LOOP_DIVIDING_BYTES)
   7657  1.1  skrll 		  {
   7658  1.1  skrll 		    if (fragP->tc_frag_data.is_no_transform)
   7659  1.1  skrll 		      as_bad (_("loop end too close to another loop end may trigger hardware errata"));
   7660  1.1  skrll 		    else
   7661  1.1  skrll 		      {
   7662  1.1  skrll 			while (min_bytes + bytes_added
   7663  1.1  skrll 			       < REQUIRED_LOOP_DIVIDING_BYTES)
   7664  1.1  skrll 			  {
   7665  1.1  skrll 			    int length = 3;
   7666  1.1  skrll 
   7667  1.1  skrll 			    if (fragP->fr_var < length)
   7668  1.1  skrll 			      as_fatal (_("fr_var %lu < length %d"),
   7669  1.1  skrll 					(long) fragP->fr_var, length);
   7670  1.1  skrll 			    else
   7671  1.1  skrll 			      {
   7672  1.1  skrll 				assemble_nop (length,
   7673  1.1  skrll 					      fragP->fr_literal + fragP->fr_fix);
   7674  1.1  skrll 				fragP->fr_fix += length;
   7675  1.1  skrll 				fragP->fr_var -= length;
   7676  1.1  skrll 			      }
   7677  1.1  skrll 			    bytes_added += length;
   7678  1.1  skrll 			  }
   7679  1.1  skrll 		      }
   7680  1.1  skrll 		  }
   7681  1.1  skrll 		frag_wane (fragP);
   7682  1.1  skrll 	      }
   7683  1.1  skrll 	    assert (fragP->fr_type != rs_machine_dependent
   7684  1.1  skrll 		    || fragP->fr_subtype != RELAX_ADD_NOP_IF_CLOSE_LOOP_END);
   7685  1.1  skrll 	  }
   7686  1.1  skrll       }
   7687  1.1  skrll }
   7688  1.1  skrll 
   7689  1.1  skrll 
   7690  1.1  skrll static offsetT unrelaxed_frag_min_size (fragS *);
   7691  1.1  skrll 
   7692  1.1  skrll static offsetT
   7693  1.1  skrll min_bytes_to_other_loop_end (fragS *fragP,
   7694  1.1  skrll 			     fragS *current_target,
   7695  1.1  skrll 			     offsetT max_size)
   7696  1.1  skrll {
   7697  1.1  skrll   offsetT offset = 0;
   7698  1.1  skrll   fragS *current_fragP;
   7699  1.1  skrll 
   7700  1.1  skrll   for (current_fragP = fragP;
   7701  1.1  skrll        current_fragP;
   7702  1.1  skrll        current_fragP = current_fragP->fr_next)
   7703  1.1  skrll     {
   7704  1.1  skrll       if (current_fragP->tc_frag_data.is_loop_target
   7705  1.1  skrll 	  && current_fragP != current_target)
   7706  1.1  skrll 	return offset;
   7707  1.1  skrll 
   7708  1.1  skrll       offset += unrelaxed_frag_min_size (current_fragP);
   7709  1.1  skrll 
   7710  1.1  skrll       if (offset >= max_size)
   7711  1.1  skrll 	return max_size;
   7712  1.1  skrll     }
   7713  1.1  skrll   return max_size;
   7714  1.1  skrll }
   7715  1.1  skrll 
   7716  1.1  skrll 
   7717  1.1  skrll static offsetT
   7718  1.1  skrll unrelaxed_frag_min_size (fragS *fragP)
   7719  1.1  skrll {
   7720  1.1  skrll   offsetT size = fragP->fr_fix;
   7721  1.1  skrll 
   7722  1.1  skrll   /* Add fill size.  */
   7723  1.1  skrll   if (fragP->fr_type == rs_fill)
   7724  1.1  skrll     size += fragP->fr_offset;
   7725  1.1  skrll 
   7726  1.1  skrll   return size;
   7727  1.1  skrll }
   7728  1.1  skrll 
   7729  1.1  skrll 
   7730  1.1  skrll static offsetT
   7731  1.1  skrll unrelaxed_frag_max_size (fragS *fragP)
   7732  1.1  skrll {
   7733  1.1  skrll   offsetT size = fragP->fr_fix;
   7734  1.1  skrll   switch (fragP->fr_type)
   7735  1.1  skrll     {
   7736  1.1  skrll     case 0:
   7737  1.1  skrll       /* Empty frags created by the obstack allocation scheme
   7738  1.1  skrll 	 end up with type 0.  */
   7739  1.1  skrll       break;
   7740  1.1  skrll     case rs_fill:
   7741  1.1  skrll     case rs_org:
   7742  1.1  skrll     case rs_space:
   7743  1.1  skrll       size += fragP->fr_offset;
   7744  1.1  skrll       break;
   7745  1.1  skrll     case rs_align:
   7746  1.1  skrll     case rs_align_code:
   7747  1.1  skrll     case rs_align_test:
   7748  1.1  skrll     case rs_leb128:
   7749  1.1  skrll     case rs_cfa:
   7750  1.1  skrll     case rs_dwarf2dbg:
   7751  1.1  skrll       /* No further adjustments needed.  */
   7752  1.1  skrll       break;
   7753  1.1  skrll     case rs_machine_dependent:
   7754  1.1  skrll       if (fragP->fr_subtype != RELAX_DESIRE_ALIGN)
   7755  1.1  skrll 	size += fragP->fr_var;
   7756  1.1  skrll       break;
   7757  1.1  skrll     default:
   7758  1.1  skrll       /* We had darn well better know how big it is.  */
   7759  1.1  skrll       assert (0);
   7760  1.1  skrll       break;
   7761  1.1  skrll     }
   7762  1.1  skrll 
   7763  1.1  skrll   return size;
   7764  1.1  skrll }
   7765  1.1  skrll 
   7766  1.1  skrll 
   7767  1.1  skrll /* Re-process all of the fragments looking to convert all
   7768  1.1  skrll    of the RELAX_ADD_NOP_IF_SHORT_LOOP.  If:
   7769  1.1  skrll 
   7770  1.1  skrll    A)
   7771  1.1  skrll      1) the instruction size count to the loop end label
   7772  1.1  skrll         is too short (<= 2 instructions),
   7773  1.1  skrll      2) loop has a jump or branch in it
   7774  1.1  skrll 
   7775  1.1  skrll    or B)
   7776  1.1  skrll      1) workaround_all_short_loops is TRUE
   7777  1.1  skrll      2) The generating loop was a  'loopgtz' or 'loopnez'
   7778  1.1  skrll      3) the instruction size count to the loop end label is too short
   7779  1.1  skrll         (<= 2 instructions)
   7780  1.1  skrll    then convert this frag (and maybe the next one) to generate a NOP.
   7781  1.1  skrll    In any case close it off with a .fill 0.  */
   7782  1.1  skrll 
   7783  1.1  skrll static int count_insns_to_loop_end (fragS *, bfd_boolean, int);
   7784  1.1  skrll static bfd_boolean branch_before_loop_end (fragS *);
   7785  1.1  skrll 
   7786  1.1  skrll static void
   7787  1.1  skrll xtensa_fix_short_loop_frags (void)
   7788  1.1  skrll {
   7789  1.1  skrll   frchainS *frchP;
   7790  1.1  skrll   asection *s;
   7791  1.1  skrll 
   7792  1.1  skrll   /* When this routine is called, all of the subsections are still intact
   7793  1.1  skrll      so we walk over subsections instead of sections.  */
   7794  1.1  skrll   for (s = stdoutput->sections; s; s = s->next)
   7795  1.1  skrll     for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
   7796  1.1  skrll       {
   7797  1.1  skrll 	fragS *fragP;
   7798  1.1  skrll 	fragS *current_target = NULL;
   7799  1.1  skrll 	xtensa_opcode current_opcode = XTENSA_UNDEFINED;
   7800  1.1  skrll 
   7801  1.1  skrll 	/* Walk over all of the fragments in a subsection.  */
   7802  1.1  skrll 	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
   7803  1.1  skrll 	  {
   7804  1.1  skrll 	    if (fragP->fr_type == rs_machine_dependent
   7805  1.1  skrll 		&& ((fragP->fr_subtype == RELAX_ALIGN_NEXT_OPCODE)
   7806  1.1  skrll 		    || (fragP->fr_subtype == RELAX_CHECK_ALIGN_NEXT_OPCODE)))
   7807  1.1  skrll 	      {
   7808  1.1  skrll 		TInsn t_insn;
   7809  1.1  skrll 		fragS *loop_frag = next_non_empty_frag (fragP);
   7810  1.1  skrll 		tinsn_from_chars (&t_insn, loop_frag->fr_opcode, 0);
   7811  1.1  skrll 		current_target = symbol_get_frag (fragP->fr_symbol);
   7812  1.1  skrll 		current_opcode = t_insn.opcode;
   7813  1.1  skrll 		assert (xtensa_opcode_is_loop (xtensa_default_isa,
   7814  1.1  skrll 					       current_opcode) == 1);
   7815  1.1  skrll 	      }
   7816  1.1  skrll 
   7817  1.1  skrll 	    if (fragP->fr_type == rs_machine_dependent
   7818  1.1  skrll 		&& fragP->fr_subtype == RELAX_ADD_NOP_IF_SHORT_LOOP)
   7819  1.1  skrll 	      {
   7820  1.1  skrll 		if (count_insns_to_loop_end (fragP->fr_next, TRUE, 3) < 3
   7821  1.1  skrll 		    && (branch_before_loop_end (fragP->fr_next)
   7822  1.1  skrll 			|| (workaround_all_short_loops
   7823  1.1  skrll 			    && current_opcode != XTENSA_UNDEFINED
   7824  1.1  skrll 			    && current_opcode != xtensa_loop_opcode)))
   7825  1.1  skrll 		  {
   7826  1.1  skrll 		    if (fragP->tc_frag_data.is_no_transform)
   7827  1.1  skrll 		      as_bad (_("loop containing less than three instructions may trigger hardware errata"));
   7828  1.1  skrll 		    else
   7829  1.1  skrll 		      relax_frag_add_nop (fragP);
   7830  1.1  skrll 		  }
   7831  1.1  skrll 		frag_wane (fragP);
   7832  1.1  skrll 	      }
   7833  1.1  skrll 	  }
   7834  1.1  skrll       }
   7835  1.1  skrll }
   7836  1.1  skrll 
   7837  1.1  skrll 
   7838  1.1  skrll static int unrelaxed_frag_min_insn_count (fragS *);
   7839  1.1  skrll 
   7840  1.1  skrll static int
   7841  1.1  skrll count_insns_to_loop_end (fragS *base_fragP,
   7842  1.1  skrll 			 bfd_boolean count_relax_add,
   7843  1.1  skrll 			 int max_count)
   7844  1.1  skrll {
   7845  1.1  skrll   fragS *fragP = NULL;
   7846  1.1  skrll   int insn_count = 0;
   7847  1.1  skrll 
   7848  1.1  skrll   fragP = base_fragP;
   7849  1.1  skrll 
   7850  1.1  skrll   for (; fragP && !fragP->tc_frag_data.is_loop_target; fragP = fragP->fr_next)
   7851  1.1  skrll     {
   7852  1.1  skrll       insn_count += unrelaxed_frag_min_insn_count (fragP);
   7853  1.1  skrll       if (insn_count >= max_count)
   7854  1.1  skrll 	return max_count;
   7855  1.1  skrll 
   7856  1.1  skrll       if (count_relax_add)
   7857  1.1  skrll 	{
   7858  1.1  skrll 	  if (fragP->fr_type == rs_machine_dependent
   7859  1.1  skrll 	      && fragP->fr_subtype == RELAX_ADD_NOP_IF_SHORT_LOOP)
   7860  1.1  skrll 	    {
   7861  1.1  skrll 	      /* In order to add the appropriate number of
   7862  1.1  skrll 	         NOPs, we count an instruction for downstream
   7863  1.1  skrll 	         occurrences.  */
   7864  1.1  skrll 	      insn_count++;
   7865  1.1  skrll 	      if (insn_count >= max_count)
   7866  1.1  skrll 		return max_count;
   7867  1.1  skrll 	    }
   7868  1.1  skrll 	}
   7869  1.1  skrll     }
   7870  1.1  skrll   return insn_count;
   7871  1.1  skrll }
   7872  1.1  skrll 
   7873  1.1  skrll 
   7874  1.1  skrll static int
   7875  1.1  skrll unrelaxed_frag_min_insn_count (fragS *fragP)
   7876  1.1  skrll {
   7877  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   7878  1.1  skrll   static xtensa_insnbuf insnbuf = NULL;
   7879  1.1  skrll   int insn_count = 0;
   7880  1.1  skrll   int offset = 0;
   7881  1.1  skrll 
   7882  1.1  skrll   if (!fragP->tc_frag_data.is_insn)
   7883  1.1  skrll     return insn_count;
   7884  1.1  skrll 
   7885  1.1  skrll   if (!insnbuf)
   7886  1.1  skrll     insnbuf = xtensa_insnbuf_alloc (isa);
   7887  1.1  skrll 
   7888  1.1  skrll   /* Decode the fixed instructions.  */
   7889  1.1  skrll   while (offset < fragP->fr_fix)
   7890  1.1  skrll     {
   7891  1.1  skrll       xtensa_format fmt;
   7892  1.1  skrll 
   7893  1.1  skrll       xtensa_insnbuf_from_chars
   7894  1.1  skrll 	(isa, insnbuf, (unsigned char *) fragP->fr_literal + offset, 0);
   7895  1.1  skrll       fmt = xtensa_format_decode (isa, insnbuf);
   7896  1.1  skrll 
   7897  1.1  skrll       if (fmt == XTENSA_UNDEFINED)
   7898  1.1  skrll 	{
   7899  1.1  skrll 	  as_fatal (_("undecodable instruction in instruction frag"));
   7900  1.1  skrll 	  return insn_count;
   7901  1.1  skrll 	}
   7902  1.1  skrll       offset += xtensa_format_length (isa, fmt);
   7903  1.1  skrll       insn_count++;
   7904  1.1  skrll     }
   7905  1.1  skrll 
   7906  1.1  skrll   return insn_count;
   7907  1.1  skrll }
   7908  1.1  skrll 
   7909  1.1  skrll 
   7910  1.1  skrll static bfd_boolean unrelaxed_frag_has_b_j (fragS *);
   7911  1.1  skrll 
   7912  1.1  skrll static bfd_boolean
   7913  1.1  skrll branch_before_loop_end (fragS *base_fragP)
   7914  1.1  skrll {
   7915  1.1  skrll   fragS *fragP;
   7916  1.1  skrll 
   7917  1.1  skrll   for (fragP = base_fragP;
   7918  1.1  skrll        fragP && !fragP->tc_frag_data.is_loop_target;
   7919  1.1  skrll        fragP = fragP->fr_next)
   7920  1.1  skrll     {
   7921  1.1  skrll       if (unrelaxed_frag_has_b_j (fragP))
   7922  1.1  skrll 	return TRUE;
   7923  1.1  skrll     }
   7924  1.1  skrll   return FALSE;
   7925  1.1  skrll }
   7926  1.1  skrll 
   7927  1.1  skrll 
   7928  1.1  skrll static bfd_boolean
   7929  1.1  skrll unrelaxed_frag_has_b_j (fragS *fragP)
   7930  1.1  skrll {
   7931  1.1  skrll   static xtensa_insnbuf insnbuf = NULL;
   7932  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   7933  1.1  skrll   int offset = 0;
   7934  1.1  skrll 
   7935  1.1  skrll   if (!fragP->tc_frag_data.is_insn)
   7936  1.1  skrll     return FALSE;
   7937  1.1  skrll 
   7938  1.1  skrll   if (!insnbuf)
   7939  1.1  skrll     insnbuf = xtensa_insnbuf_alloc (isa);
   7940  1.1  skrll 
   7941  1.1  skrll   /* Decode the fixed instructions.  */
   7942  1.1  skrll   while (offset < fragP->fr_fix)
   7943  1.1  skrll     {
   7944  1.1  skrll       xtensa_format fmt;
   7945  1.1  skrll       int slot;
   7946  1.1  skrll 
   7947  1.1  skrll       xtensa_insnbuf_from_chars
   7948  1.1  skrll 	(isa, insnbuf, (unsigned char *) fragP->fr_literal + offset, 0);
   7949  1.1  skrll       fmt = xtensa_format_decode (isa, insnbuf);
   7950  1.1  skrll       if (fmt == XTENSA_UNDEFINED)
   7951  1.1  skrll 	return FALSE;
   7952  1.1  skrll 
   7953  1.1  skrll       for (slot = 0; slot < xtensa_format_num_slots (isa, fmt); slot++)
   7954  1.1  skrll 	{
   7955  1.1  skrll 	  xtensa_opcode opcode =
   7956  1.1  skrll 	    get_opcode_from_buf (fragP->fr_literal + offset, slot);
   7957  1.1  skrll 	  if (xtensa_opcode_is_branch (isa, opcode) == 1
   7958  1.1  skrll 	      || xtensa_opcode_is_jump (isa, opcode) == 1)
   7959  1.1  skrll 	    return TRUE;
   7960  1.1  skrll 	}
   7961  1.1  skrll       offset += xtensa_format_length (isa, fmt);
   7962  1.1  skrll     }
   7963  1.1  skrll   return FALSE;
   7964  1.1  skrll }
   7965  1.1  skrll 
   7966  1.1  skrll 
   7967  1.1  skrll /* Checks to be made after initial assembly but before relaxation.  */
   7968  1.1  skrll 
   7969  1.1  skrll static bfd_boolean is_empty_loop (const TInsn *, fragS *);
   7970  1.1  skrll static bfd_boolean is_local_forward_loop (const TInsn *, fragS *);
   7971  1.1  skrll 
   7972  1.1  skrll static void
   7973  1.1  skrll xtensa_sanity_check (void)
   7974  1.1  skrll {
   7975  1.1  skrll   char *file_name;
   7976  1.1  skrll   unsigned line;
   7977  1.1  skrll   frchainS *frchP;
   7978  1.1  skrll   asection *s;
   7979  1.1  skrll 
   7980  1.1  skrll   as_where (&file_name, &line);
   7981  1.1  skrll   for (s = stdoutput->sections; s; s = s->next)
   7982  1.1  skrll     for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
   7983  1.1  skrll       {
   7984  1.1  skrll 	fragS *fragP;
   7985  1.1  skrll 
   7986  1.1  skrll 	/* Walk over all of the fragments in a subsection.  */
   7987  1.1  skrll 	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
   7988  1.1  skrll 	  {
   7989  1.1  skrll 	    if (fragP->fr_type == rs_machine_dependent
   7990  1.1  skrll 		&& fragP->fr_subtype == RELAX_SLOTS
   7991  1.1  skrll 		&& fragP->tc_frag_data.slot_subtypes[0] == RELAX_IMMED)
   7992  1.1  skrll 	      {
   7993  1.1  skrll 		static xtensa_insnbuf insnbuf = NULL;
   7994  1.1  skrll 		TInsn t_insn;
   7995  1.1  skrll 
   7996  1.1  skrll 		if (fragP->fr_opcode != NULL)
   7997  1.1  skrll 		  {
   7998  1.1  skrll 		    if (!insnbuf)
   7999  1.1  skrll 		      insnbuf = xtensa_insnbuf_alloc (xtensa_default_isa);
   8000  1.1  skrll 		    tinsn_from_chars (&t_insn, fragP->fr_opcode, 0);
   8001  1.1  skrll 		    tinsn_immed_from_frag (&t_insn, fragP, 0);
   8002  1.1  skrll 
   8003  1.1  skrll 		    if (xtensa_opcode_is_loop (xtensa_default_isa,
   8004  1.1  skrll 					       t_insn.opcode) == 1)
   8005  1.1  skrll 		      {
   8006  1.1  skrll 			if (is_empty_loop (&t_insn, fragP))
   8007  1.1  skrll 			  {
   8008  1.1  skrll 			    new_logical_line (fragP->fr_file, fragP->fr_line);
   8009  1.1  skrll 			    as_bad (_("invalid empty loop"));
   8010  1.1  skrll 			  }
   8011  1.1  skrll 			if (!is_local_forward_loop (&t_insn, fragP))
   8012  1.1  skrll 			  {
   8013  1.1  skrll 			    new_logical_line (fragP->fr_file, fragP->fr_line);
   8014  1.1  skrll 			    as_bad (_("loop target does not follow "
   8015  1.1  skrll 				      "loop instruction in section"));
   8016  1.1  skrll 			  }
   8017  1.1  skrll 		      }
   8018  1.1  skrll 		  }
   8019  1.1  skrll 	      }
   8020  1.1  skrll 	  }
   8021  1.1  skrll       }
   8022  1.1  skrll   new_logical_line (file_name, line);
   8023  1.1  skrll }
   8024  1.1  skrll 
   8025  1.1  skrll 
   8026  1.1  skrll #define LOOP_IMMED_OPN 1
   8027  1.1  skrll 
   8028  1.1  skrll /* Return TRUE if the loop target is the next non-zero fragment.  */
   8029  1.1  skrll 
   8030  1.1  skrll static bfd_boolean
   8031  1.1  skrll is_empty_loop (const TInsn *insn, fragS *fragP)
   8032  1.1  skrll {
   8033  1.1  skrll   const expressionS *expr;
   8034  1.1  skrll   symbolS *symbolP;
   8035  1.1  skrll   fragS *next_fragP;
   8036  1.1  skrll 
   8037  1.1  skrll   if (insn->insn_type != ITYPE_INSN)
   8038  1.1  skrll     return FALSE;
   8039  1.1  skrll 
   8040  1.1  skrll   if (xtensa_opcode_is_loop (xtensa_default_isa, insn->opcode) != 1)
   8041  1.1  skrll     return FALSE;
   8042  1.1  skrll 
   8043  1.1  skrll   if (insn->ntok <= LOOP_IMMED_OPN)
   8044  1.1  skrll     return FALSE;
   8045  1.1  skrll 
   8046  1.1  skrll   expr = &insn->tok[LOOP_IMMED_OPN];
   8047  1.1  skrll 
   8048  1.1  skrll   if (expr->X_op != O_symbol)
   8049  1.1  skrll     return FALSE;
   8050  1.1  skrll 
   8051  1.1  skrll   symbolP = expr->X_add_symbol;
   8052  1.1  skrll   if (!symbolP)
   8053  1.1  skrll     return FALSE;
   8054  1.1  skrll 
   8055  1.1  skrll   if (symbol_get_frag (symbolP) == NULL)
   8056  1.1  skrll     return FALSE;
   8057  1.1  skrll 
   8058  1.1  skrll   if (S_GET_VALUE (symbolP) != 0)
   8059  1.1  skrll     return FALSE;
   8060  1.1  skrll 
   8061  1.1  skrll   /* Walk through the zero-size fragments from this one.  If we find
   8062  1.1  skrll      the target fragment, then this is a zero-size loop.  */
   8063  1.1  skrll 
   8064  1.1  skrll   for (next_fragP = fragP->fr_next;
   8065  1.1  skrll        next_fragP != NULL;
   8066  1.1  skrll        next_fragP = next_fragP->fr_next)
   8067  1.1  skrll     {
   8068  1.1  skrll       if (next_fragP == symbol_get_frag (symbolP))
   8069  1.1  skrll 	return TRUE;
   8070  1.1  skrll       if (next_fragP->fr_fix != 0)
   8071  1.1  skrll 	return FALSE;
   8072  1.1  skrll     }
   8073  1.1  skrll   return FALSE;
   8074  1.1  skrll }
   8075  1.1  skrll 
   8076  1.1  skrll 
   8077  1.1  skrll static bfd_boolean
   8078  1.1  skrll is_local_forward_loop (const TInsn *insn, fragS *fragP)
   8079  1.1  skrll {
   8080  1.1  skrll   const expressionS *expr;
   8081  1.1  skrll   symbolS *symbolP;
   8082  1.1  skrll   fragS *next_fragP;
   8083  1.1  skrll 
   8084  1.1  skrll   if (insn->insn_type != ITYPE_INSN)
   8085  1.1  skrll     return FALSE;
   8086  1.1  skrll 
   8087  1.1  skrll   if (xtensa_opcode_is_loop (xtensa_default_isa, insn->opcode) != 1)
   8088  1.1  skrll     return FALSE;
   8089  1.1  skrll 
   8090  1.1  skrll   if (insn->ntok <= LOOP_IMMED_OPN)
   8091  1.1  skrll     return FALSE;
   8092  1.1  skrll 
   8093  1.1  skrll   expr = &insn->tok[LOOP_IMMED_OPN];
   8094  1.1  skrll 
   8095  1.1  skrll   if (expr->X_op != O_symbol)
   8096  1.1  skrll     return FALSE;
   8097  1.1  skrll 
   8098  1.1  skrll   symbolP = expr->X_add_symbol;
   8099  1.1  skrll   if (!symbolP)
   8100  1.1  skrll     return FALSE;
   8101  1.1  skrll 
   8102  1.1  skrll   if (symbol_get_frag (symbolP) == NULL)
   8103  1.1  skrll     return FALSE;
   8104  1.1  skrll 
   8105  1.1  skrll   /* Walk through fragments until we find the target.
   8106  1.1  skrll      If we do not find the target, then this is an invalid loop.  */
   8107  1.1  skrll 
   8108  1.1  skrll   for (next_fragP = fragP->fr_next;
   8109  1.1  skrll        next_fragP != NULL;
   8110  1.1  skrll        next_fragP = next_fragP->fr_next)
   8111  1.1  skrll     {
   8112  1.1  skrll       if (next_fragP == symbol_get_frag (symbolP))
   8113  1.1  skrll 	return TRUE;
   8114  1.1  skrll     }
   8115  1.1  skrll 
   8116  1.1  skrll   return FALSE;
   8117  1.1  skrll }
   8118  1.1  skrll 
   8119  1.1  skrll 
   8120  1.1  skrll #define XTINFO_NAME "Xtensa_Info"
   8121  1.1  skrll #define XTINFO_NAMESZ 12
   8122  1.1  skrll #define XTINFO_TYPE 1
   8123  1.1  skrll 
   8124  1.1  skrll static void
   8125  1.1  skrll xtensa_add_config_info (void)
   8126  1.1  skrll {
   8127  1.1  skrll   asection *info_sec;
   8128  1.1  skrll   char *data, *p;
   8129  1.1  skrll   int sz;
   8130  1.1  skrll 
   8131  1.1  skrll   info_sec = subseg_new (".xtensa.info", 0);
   8132  1.1  skrll   bfd_set_section_flags (stdoutput, info_sec, SEC_HAS_CONTENTS | SEC_READONLY);
   8133  1.1  skrll 
   8134  1.1  skrll   data = xmalloc (100);
   8135  1.1  skrll   sprintf (data, "USE_ABSOLUTE_LITERALS=%d\nABI=%d\n",
   8136  1.1  skrll 	   XSHAL_USE_ABSOLUTE_LITERALS, XSHAL_ABI);
   8137  1.1  skrll   sz = strlen (data) + 1;
   8138  1.1  skrll 
   8139  1.1  skrll   /* Add enough null terminators to pad to a word boundary.  */
   8140  1.1  skrll   do
   8141  1.1  skrll     data[sz++] = 0;
   8142  1.1  skrll   while ((sz & 3) != 0);
   8143  1.1  skrll 
   8144  1.1  skrll   /* Follow the standard note section layout:
   8145  1.1  skrll      First write the length of the name string.  */
   8146  1.1  skrll   p = frag_more (4);
   8147  1.1  skrll   md_number_to_chars (p, (valueT) XTINFO_NAMESZ, 4);
   8148  1.1  skrll 
   8149  1.1  skrll   /* Next comes the length of the "descriptor", i.e., the actual data.  */
   8150  1.1  skrll   p = frag_more (4);
   8151  1.1  skrll   md_number_to_chars (p, (valueT) sz, 4);
   8152  1.1  skrll 
   8153  1.1  skrll   /* Write the note type.  */
   8154  1.1  skrll   p = frag_more (4);
   8155  1.1  skrll   md_number_to_chars (p, (valueT) XTINFO_TYPE, 4);
   8156  1.1  skrll 
   8157  1.1  skrll   /* Write the name field.  */
   8158  1.1  skrll   p = frag_more (XTINFO_NAMESZ);
   8159  1.1  skrll   memcpy (p, XTINFO_NAME, XTINFO_NAMESZ);
   8160  1.1  skrll 
   8161  1.1  skrll   /* Finally, write the descriptor.  */
   8162  1.1  skrll   p = frag_more (sz);
   8163  1.1  skrll   memcpy (p, data, sz);
   8164  1.1  skrll 
   8165  1.1  skrll   free (data);
   8166  1.1  skrll }
   8167  1.1  skrll 
   8168  1.1  skrll 
   8169  1.1  skrll /* Alignment Functions.  */
   8171  1.1  skrll 
   8172  1.1  skrll static int
   8173  1.1  skrll get_text_align_power (unsigned target_size)
   8174  1.1  skrll {
   8175  1.1  skrll   if (target_size <= 4)
   8176  1.1  skrll     return 2;
   8177  1.1  skrll   assert (target_size == 8);
   8178  1.1  skrll   return 3;
   8179  1.1  skrll }
   8180  1.1  skrll 
   8181  1.1  skrll 
   8182  1.1  skrll static int
   8183  1.1  skrll get_text_align_max_fill_size (int align_pow,
   8184  1.1  skrll 			      bfd_boolean use_nops,
   8185  1.1  skrll 			      bfd_boolean use_no_density)
   8186  1.1  skrll {
   8187  1.1  skrll   if (!use_nops)
   8188  1.1  skrll     return (1 << align_pow);
   8189  1.1  skrll   if (use_no_density)
   8190  1.1  skrll     return 3 * (1 << align_pow);
   8191  1.1  skrll 
   8192  1.1  skrll   return 1 + (1 << align_pow);
   8193  1.1  skrll }
   8194  1.1  skrll 
   8195  1.1  skrll 
   8196  1.1  skrll /* Calculate the minimum bytes of fill needed at "address" to align a
   8197  1.1  skrll    target instruction of size "target_size" so that it does not cross a
   8198  1.1  skrll    power-of-two boundary specified by "align_pow".  If "use_nops" is FALSE,
   8199  1.1  skrll    the fill can be an arbitrary number of bytes.  Otherwise, the space must
   8200  1.1  skrll    be filled by NOP instructions.  */
   8201  1.1  skrll 
   8202  1.1  skrll static int
   8203  1.1  skrll get_text_align_fill_size (addressT address,
   8204  1.1  skrll 			  int align_pow,
   8205  1.1  skrll 			  int target_size,
   8206  1.1  skrll 			  bfd_boolean use_nops,
   8207  1.1  skrll 			  bfd_boolean use_no_density)
   8208  1.1  skrll {
   8209  1.1  skrll   addressT alignment, fill, fill_limit, fill_step;
   8210  1.1  skrll   bfd_boolean skip_one = FALSE;
   8211  1.1  skrll 
   8212  1.1  skrll   alignment = (1 << align_pow);
   8213  1.1  skrll   assert (target_size > 0 && alignment >= (addressT) target_size);
   8214  1.1  skrll 
   8215  1.1  skrll   if (!use_nops)
   8216  1.1  skrll     {
   8217  1.1  skrll       fill_limit = alignment;
   8218  1.1  skrll       fill_step = 1;
   8219  1.1  skrll     }
   8220  1.1  skrll   else if (!use_no_density)
   8221  1.1  skrll     {
   8222  1.1  skrll       /* Combine 2- and 3-byte NOPs to fill anything larger than one.  */
   8223  1.1  skrll       fill_limit = alignment * 2;
   8224  1.1  skrll       fill_step = 1;
   8225  1.1  skrll       skip_one = TRUE;
   8226  1.1  skrll     }
   8227  1.1  skrll   else
   8228  1.1  skrll     {
   8229  1.1  skrll       /* Fill with 3-byte NOPs -- can only fill multiples of 3.  */
   8230  1.1  skrll       fill_limit = alignment * 3;
   8231  1.1  skrll       fill_step = 3;
   8232  1.1  skrll     }
   8233  1.1  skrll 
   8234  1.1  skrll   /* Try all fill sizes until finding one that works.  */
   8235  1.1  skrll   for (fill = 0; fill < fill_limit; fill += fill_step)
   8236  1.1  skrll     {
   8237  1.1  skrll       if (skip_one && fill == 1)
   8238  1.1  skrll 	continue;
   8239  1.1  skrll       if ((address + fill) >> align_pow
   8240  1.1  skrll 	  == (address + fill + target_size - 1) >> align_pow)
   8241  1.1  skrll 	return fill;
   8242  1.1  skrll     }
   8243  1.1  skrll   assert (0);
   8244  1.1  skrll   return 0;
   8245  1.1  skrll }
   8246  1.1  skrll 
   8247  1.1  skrll 
   8248  1.1  skrll static int
   8249  1.1  skrll branch_align_power (segT sec)
   8250  1.1  skrll {
   8251  1.1  skrll   /* If the Xtensa processor has a fetch width of 8 bytes, and the section
   8252  1.1  skrll      is aligned to at least an 8-byte boundary, then a branch target need
   8253  1.1  skrll      only fit within an 8-byte aligned block of memory to avoid a stall.
   8254  1.1  skrll      Otherwise, try to fit branch targets within 4-byte aligned blocks
   8255  1.1  skrll      (which may be insufficient, e.g., if the section has no alignment, but
   8256  1.1  skrll      it's good enough).  */
   8257  1.1  skrll   if (xtensa_fetch_width == 8)
   8258  1.1  skrll     {
   8259  1.1  skrll       if (get_recorded_alignment (sec) >= 3)
   8260  1.1  skrll 	return 3;
   8261  1.1  skrll     }
   8262  1.1  skrll   else
   8263  1.1  skrll     assert (xtensa_fetch_width == 4);
   8264  1.1  skrll 
   8265  1.1  skrll   return 2;
   8266  1.1  skrll }
   8267  1.1  skrll 
   8268  1.1  skrll 
   8269  1.1  skrll /* This will assert if it is not possible.  */
   8270  1.1  skrll 
   8271  1.1  skrll static int
   8272  1.1  skrll get_text_align_nop_count (offsetT fill_size, bfd_boolean use_no_density)
   8273  1.1  skrll {
   8274  1.1  skrll   int count = 0;
   8275  1.1  skrll 
   8276  1.1  skrll   if (use_no_density)
   8277  1.1  skrll     {
   8278  1.1  skrll       assert (fill_size % 3 == 0);
   8279  1.1  skrll       return (fill_size / 3);
   8280  1.1  skrll     }
   8281  1.1  skrll 
   8282  1.1  skrll   assert (fill_size != 1);	/* Bad argument.  */
   8283  1.1  skrll 
   8284  1.1  skrll   while (fill_size > 1)
   8285  1.1  skrll     {
   8286  1.1  skrll       int insn_size = 3;
   8287  1.1  skrll       if (fill_size == 2 || fill_size == 4)
   8288  1.1  skrll 	insn_size = 2;
   8289  1.1  skrll       fill_size -= insn_size;
   8290  1.1  skrll       count++;
   8291  1.1  skrll     }
   8292  1.1  skrll   assert (fill_size != 1);	/* Bad algorithm.  */
   8293  1.1  skrll   return count;
   8294  1.1  skrll }
   8295  1.1  skrll 
   8296  1.1  skrll 
   8297  1.1  skrll static int
   8298  1.1  skrll get_text_align_nth_nop_size (offsetT fill_size,
   8299  1.1  skrll 			     int n,
   8300  1.1  skrll 			     bfd_boolean use_no_density)
   8301  1.1  skrll {
   8302  1.1  skrll   int count = 0;
   8303  1.1  skrll 
   8304  1.1  skrll   if (use_no_density)
   8305  1.1  skrll     return 3;
   8306  1.1  skrll 
   8307  1.1  skrll   assert (fill_size != 1);	/* Bad argument.  */
   8308  1.1  skrll 
   8309  1.1  skrll   while (fill_size > 1)
   8310  1.1  skrll     {
   8311  1.1  skrll       int insn_size = 3;
   8312  1.1  skrll       if (fill_size == 2 || fill_size == 4)
   8313  1.1  skrll 	insn_size = 2;
   8314  1.1  skrll       fill_size -= insn_size;
   8315  1.1  skrll       count++;
   8316  1.1  skrll       if (n + 1 == count)
   8317  1.1  skrll 	return insn_size;
   8318  1.1  skrll     }
   8319  1.1  skrll   assert (0);
   8320  1.1  skrll   return 0;
   8321  1.1  skrll }
   8322  1.1  skrll 
   8323  1.1  skrll 
   8324  1.1  skrll /* For the given fragment, find the appropriate address
   8325  1.1  skrll    for it to begin at if we are using NOPs to align it.  */
   8326  1.1  skrll 
   8327  1.1  skrll static addressT
   8328  1.1  skrll get_noop_aligned_address (fragS *fragP, addressT address)
   8329  1.1  skrll {
   8330  1.1  skrll   /* The rule is: get next fragment's FIRST instruction.  Find
   8331  1.1  skrll      the smallest number of bytes that need to be added to
   8332  1.1  skrll      ensure that the next fragment's FIRST instruction will fit
   8333  1.1  skrll      in a single word.
   8334  1.1  skrll 
   8335  1.1  skrll      E.G.,   2 bytes : 0, 1, 2 mod 4
   8336  1.1  skrll 	     3 bytes: 0, 1 mod 4
   8337  1.1  skrll 
   8338  1.1  skrll      If the FIRST instruction MIGHT be relaxed,
   8339  1.1  skrll      assume that it will become a 3-byte instruction.
   8340  1.1  skrll 
   8341  1.1  skrll      Note again here that LOOP instructions are not bundleable,
   8342  1.1  skrll      and this relaxation only applies to LOOP opcodes.  */
   8343  1.1  skrll 
   8344  1.1  skrll   int fill_size = 0;
   8345  1.1  skrll   int first_insn_size;
   8346  1.1  skrll   int loop_insn_size;
   8347  1.1  skrll   addressT pre_opcode_bytes;
   8348  1.1  skrll   int align_power;
   8349  1.1  skrll   fragS *first_insn;
   8350  1.1  skrll   xtensa_opcode opcode;
   8351  1.1  skrll   bfd_boolean is_loop;
   8352  1.1  skrll 
   8353  1.1  skrll   assert (fragP->fr_type == rs_machine_dependent);
   8354  1.1  skrll   assert (fragP->fr_subtype == RELAX_ALIGN_NEXT_OPCODE);
   8355  1.1  skrll 
   8356  1.1  skrll   /* Find the loop frag.  */
   8357  1.1  skrll   first_insn = next_non_empty_frag (fragP);
   8358  1.1  skrll   /* Now find the first insn frag.  */
   8359  1.1  skrll   first_insn = next_non_empty_frag (first_insn);
   8360  1.1  skrll 
   8361  1.1  skrll   is_loop = next_frag_opcode_is_loop (fragP, &opcode);
   8362  1.1  skrll   assert (is_loop);
   8363  1.1  skrll   loop_insn_size = xg_get_single_size (opcode);
   8364  1.1  skrll 
   8365  1.1  skrll   pre_opcode_bytes = next_frag_pre_opcode_bytes (fragP);
   8366  1.1  skrll   pre_opcode_bytes += loop_insn_size;
   8367  1.1  skrll 
   8368  1.1  skrll   /* For loops, the alignment depends on the size of the
   8369  1.1  skrll      instruction following the loop, not the LOOP instruction.  */
   8370  1.1  skrll 
   8371  1.1  skrll   if (first_insn == NULL)
   8372  1.1  skrll     first_insn_size = xtensa_fetch_width;
   8373  1.1  skrll   else
   8374  1.1  skrll     first_insn_size = get_loop_align_size (frag_format_size (first_insn));
   8375  1.1  skrll 
   8376  1.1  skrll   /* If it was 8, then we'll need a larger alignment for the section.  */
   8377  1.1  skrll   align_power = get_text_align_power (first_insn_size);
   8378  1.1  skrll   record_alignment (now_seg, align_power);
   8379  1.1  skrll 
   8380  1.1  skrll   fill_size = get_text_align_fill_size
   8381  1.1  skrll     (address + pre_opcode_bytes, align_power, first_insn_size, TRUE,
   8382  1.1  skrll      fragP->tc_frag_data.is_no_density);
   8383  1.1  skrll 
   8384  1.1  skrll   return address + fill_size;
   8385  1.1  skrll }
   8386  1.1  skrll 
   8387  1.1  skrll 
   8388  1.1  skrll /* 3 mechanisms for relaxing an alignment:
   8389  1.1  skrll 
   8390  1.1  skrll    Align to a power of 2.
   8391  1.1  skrll    Align so the next fragment's instruction does not cross a word boundary.
   8392  1.1  skrll    Align the current instruction so that if the next instruction
   8393  1.1  skrll        were 3 bytes, it would not cross a word boundary.
   8394  1.1  skrll 
   8395  1.1  skrll    We can align with:
   8396  1.1  skrll 
   8397  1.1  skrll    zeros    - This is easy; always insert zeros.
   8398  1.1  skrll    nops     - 3-byte and 2-byte instructions
   8399  1.1  skrll               2 - 2-byte nop
   8400  1.1  skrll               3 - 3-byte nop
   8401  1.1  skrll               4 - 2 2-byte nops
   8402  1.1  skrll               >=5 : 3-byte instruction + fn (n-3)
   8403  1.1  skrll    widening - widen previous instructions.  */
   8404  1.1  skrll 
   8405  1.1  skrll static offsetT
   8406  1.1  skrll get_aligned_diff (fragS *fragP, addressT address, offsetT *max_diff)
   8407  1.1  skrll {
   8408  1.1  skrll   addressT target_address, loop_insn_offset;
   8409  1.1  skrll   int target_size;
   8410  1.1  skrll   xtensa_opcode loop_opcode;
   8411  1.1  skrll   bfd_boolean is_loop;
   8412  1.1  skrll   int align_power;
   8413  1.1  skrll   offsetT opt_diff;
   8414  1.1  skrll   offsetT branch_align;
   8415  1.1  skrll   fragS *loop_frag;
   8416  1.1  skrll 
   8417  1.1  skrll   assert (fragP->fr_type == rs_machine_dependent);
   8418  1.1  skrll   switch (fragP->fr_subtype)
   8419  1.1  skrll     {
   8420  1.1  skrll     case RELAX_DESIRE_ALIGN:
   8421  1.1  skrll       target_size = next_frag_format_size (fragP);
   8422  1.1  skrll       if (target_size == XTENSA_UNDEFINED)
   8423  1.1  skrll 	target_size = 3;
   8424  1.1  skrll       align_power = branch_align_power (now_seg);
   8425  1.1  skrll       branch_align = 1 << align_power;
   8426  1.1  skrll       /* Don't count on the section alignment being as large as the target.  */
   8427  1.1  skrll       if (target_size > branch_align)
   8428  1.1  skrll 	target_size = branch_align;
   8429  1.1  skrll       opt_diff = get_text_align_fill_size (address, align_power,
   8430  1.1  skrll 					   target_size, FALSE, FALSE);
   8431  1.1  skrll 
   8432  1.1  skrll       *max_diff = (opt_diff + branch_align
   8433  1.1  skrll 		   - (target_size + ((address + opt_diff) % branch_align)));
   8434  1.1  skrll       assert (*max_diff >= opt_diff);
   8435  1.1  skrll       return opt_diff;
   8436  1.1  skrll 
   8437  1.1  skrll     case RELAX_ALIGN_NEXT_OPCODE:
   8438  1.1  skrll       /* The next non-empty frag after this one holds the LOOP instruction
   8439  1.1  skrll 	 that needs to be aligned.  The required alignment depends on the
   8440  1.1  skrll 	 size of the next non-empty frag after the loop frag, i.e., the
   8441  1.1  skrll 	 first instruction in the loop.  */
   8442  1.1  skrll       loop_frag = next_non_empty_frag (fragP);
   8443  1.1  skrll       target_size = get_loop_align_size (next_frag_format_size (loop_frag));
   8444  1.1  skrll       loop_insn_offset = 0;
   8445  1.1  skrll       is_loop = next_frag_opcode_is_loop (fragP, &loop_opcode);
   8446  1.1  skrll       assert (is_loop);
   8447  1.1  skrll 
   8448  1.1  skrll       /* If the loop has been expanded then the LOOP instruction
   8449  1.1  skrll 	 could be at an offset from this fragment.  */
   8450  1.1  skrll       if (loop_frag->tc_frag_data.slot_subtypes[0] != RELAX_IMMED)
   8451  1.1  skrll 	loop_insn_offset = get_expanded_loop_offset (loop_opcode);
   8452  1.1  skrll 
   8453  1.1  skrll       /* In an ideal world, which is what we are shooting for here,
   8454  1.1  skrll 	 we wouldn't need to use any NOPs immediately prior to the
   8455  1.1  skrll 	 LOOP instruction.  If this approach fails, relax_frag_loop_align
   8456  1.1  skrll 	 will call get_noop_aligned_address.  */
   8457  1.1  skrll       target_address =
   8458  1.1  skrll 	address + loop_insn_offset + xg_get_single_size (loop_opcode);
   8459  1.1  skrll       align_power = get_text_align_power (target_size);
   8460  1.1  skrll       opt_diff = get_text_align_fill_size (target_address, align_power,
   8461  1.1  skrll 					   target_size, FALSE, FALSE);
   8462  1.1  skrll 
   8463  1.1  skrll       *max_diff = xtensa_fetch_width
   8464  1.1  skrll 	- ((target_address + opt_diff) % xtensa_fetch_width)
   8465  1.1  skrll 	- target_size + opt_diff;
   8466  1.1  skrll       assert (*max_diff >= opt_diff);
   8467  1.1  skrll       return opt_diff;
   8468  1.1  skrll 
   8469  1.1  skrll     default:
   8470  1.1  skrll       break;
   8471  1.1  skrll     }
   8472  1.1  skrll   assert (0);
   8473  1.1  skrll   return 0;
   8474  1.1  skrll }
   8475  1.1  skrll 
   8476  1.1  skrll 
   8477  1.1  skrll /* md_relax_frag Hook and Helper Functions.  */
   8479  1.1  skrll 
   8480  1.1  skrll static long relax_frag_loop_align (fragS *, long);
   8481  1.1  skrll static long relax_frag_for_align (fragS *, long);
   8482  1.1  skrll static long relax_frag_immed
   8483  1.1  skrll   (segT, fragS *, long, int, xtensa_format, int, int *, bfd_boolean);
   8484  1.1  skrll 
   8485  1.1  skrll 
   8486  1.1  skrll /* Return the number of bytes added to this fragment, given that the
   8487  1.1  skrll    input has been stretched already by "stretch".  */
   8488  1.1  skrll 
   8489  1.1  skrll long
   8490  1.1  skrll xtensa_relax_frag (fragS *fragP, long stretch, int *stretched_p)
   8491  1.1  skrll {
   8492  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   8493  1.1  skrll   int unreported = fragP->tc_frag_data.unreported_expansion;
   8494  1.1  skrll   long new_stretch = 0;
   8495  1.1  skrll   char *file_name;
   8496  1.1  skrll   unsigned line;
   8497  1.1  skrll   int lit_size;
   8498  1.1  skrll   static xtensa_insnbuf vbuf = NULL;
   8499  1.1  skrll   int slot, num_slots;
   8500  1.1  skrll   xtensa_format fmt;
   8501  1.1  skrll 
   8502  1.1  skrll   as_where (&file_name, &line);
   8503  1.1  skrll   new_logical_line (fragP->fr_file, fragP->fr_line);
   8504  1.1  skrll 
   8505  1.1  skrll   fragP->tc_frag_data.unreported_expansion = 0;
   8506  1.1  skrll 
   8507  1.1  skrll   switch (fragP->fr_subtype)
   8508  1.1  skrll     {
   8509  1.1  skrll     case RELAX_ALIGN_NEXT_OPCODE:
   8510  1.1  skrll       /* Always convert.  */
   8511  1.1  skrll       if (fragP->tc_frag_data.relax_seen)
   8512  1.1  skrll 	new_stretch = relax_frag_loop_align (fragP, stretch);
   8513  1.1  skrll       break;
   8514  1.1  skrll 
   8515  1.1  skrll     case RELAX_LOOP_END:
   8516  1.1  skrll       /* Do nothing.  */
   8517  1.1  skrll       break;
   8518  1.1  skrll 
   8519  1.1  skrll     case RELAX_LOOP_END_ADD_NOP:
   8520  1.1  skrll       /* Add a NOP and switch to .fill 0.  */
   8521  1.1  skrll       new_stretch = relax_frag_add_nop (fragP);
   8522  1.1  skrll       frag_wane (fragP);
   8523  1.1  skrll       break;
   8524  1.1  skrll 
   8525  1.1  skrll     case RELAX_DESIRE_ALIGN:
   8526  1.1  skrll       /* Do nothing. The narrowing before this frag will either align
   8527  1.1  skrll          it or not.  */
   8528  1.1  skrll       break;
   8529  1.1  skrll 
   8530  1.1  skrll     case RELAX_LITERAL:
   8531  1.1  skrll     case RELAX_LITERAL_FINAL:
   8532  1.1  skrll       return 0;
   8533  1.1  skrll 
   8534  1.1  skrll     case RELAX_LITERAL_NR:
   8535  1.1  skrll       lit_size = 4;
   8536  1.1  skrll       fragP->fr_subtype = RELAX_LITERAL_FINAL;
   8537  1.1  skrll       assert (unreported == lit_size);
   8538  1.1  skrll       memset (&fragP->fr_literal[fragP->fr_fix], 0, 4);
   8539  1.1  skrll       fragP->fr_var -= lit_size;
   8540  1.1  skrll       fragP->fr_fix += lit_size;
   8541  1.1  skrll       new_stretch = 4;
   8542  1.1  skrll       break;
   8543  1.1  skrll 
   8544  1.1  skrll     case RELAX_SLOTS:
   8545  1.1  skrll       if (vbuf == NULL)
   8546  1.1  skrll 	vbuf = xtensa_insnbuf_alloc (isa);
   8547  1.1  skrll 
   8548  1.1  skrll       xtensa_insnbuf_from_chars
   8549  1.1  skrll 	(isa, vbuf, (unsigned char *) fragP->fr_opcode, 0);
   8550  1.1  skrll       fmt = xtensa_format_decode (isa, vbuf);
   8551  1.1  skrll       num_slots = xtensa_format_num_slots (isa, fmt);
   8552  1.1  skrll 
   8553  1.1  skrll       for (slot = 0; slot < num_slots; slot++)
   8554  1.1  skrll 	{
   8555  1.1  skrll 	  switch (fragP->tc_frag_data.slot_subtypes[slot])
   8556  1.1  skrll 	    {
   8557  1.1  skrll 	    case RELAX_NARROW:
   8558  1.1  skrll 	      if (fragP->tc_frag_data.relax_seen)
   8559  1.1  skrll 		new_stretch += relax_frag_for_align (fragP, stretch);
   8560  1.1  skrll 	      break;
   8561  1.1  skrll 
   8562  1.1  skrll 	    case RELAX_IMMED:
   8563  1.1  skrll 	    case RELAX_IMMED_STEP1:
   8564  1.1  skrll 	    case RELAX_IMMED_STEP2:
   8565  1.1  skrll 	    case RELAX_IMMED_STEP3:
   8566  1.1  skrll 	      /* Place the immediate.  */
   8567  1.1  skrll 	      new_stretch += relax_frag_immed
   8568  1.1  skrll 		(now_seg, fragP, stretch,
   8569  1.1  skrll 		 fragP->tc_frag_data.slot_subtypes[slot] - RELAX_IMMED,
   8570  1.1  skrll 		 fmt, slot, stretched_p, FALSE);
   8571  1.1  skrll 	      break;
   8572  1.1  skrll 
   8573  1.1  skrll 	    default:
   8574  1.1  skrll 	      /* This is OK; see the note in xg_assemble_vliw_tokens.  */
   8575  1.1  skrll 	      break;
   8576  1.1  skrll 	    }
   8577  1.1  skrll 	}
   8578  1.1  skrll       break;
   8579  1.1  skrll 
   8580  1.1  skrll     case RELAX_LITERAL_POOL_BEGIN:
   8581  1.1  skrll     case RELAX_LITERAL_POOL_END:
   8582  1.1  skrll     case RELAX_MAYBE_UNREACHABLE:
   8583  1.1  skrll     case RELAX_MAYBE_DESIRE_ALIGN:
   8584  1.1  skrll       /* No relaxation required.  */
   8585  1.1  skrll       break;
   8586  1.1  skrll 
   8587  1.1  skrll     case RELAX_FILL_NOP:
   8588  1.1  skrll     case RELAX_UNREACHABLE:
   8589  1.1  skrll       if (fragP->tc_frag_data.relax_seen)
   8590  1.1  skrll 	new_stretch += relax_frag_for_align (fragP, stretch);
   8591  1.1  skrll       break;
   8592  1.1  skrll 
   8593  1.1  skrll     default:
   8594  1.1  skrll       as_bad (_("bad relaxation state"));
   8595  1.1  skrll     }
   8596  1.1  skrll 
   8597  1.1  skrll   /* Tell gas we need another relaxation pass.  */
   8598  1.1  skrll   if (! fragP->tc_frag_data.relax_seen)
   8599  1.1  skrll     {
   8600  1.1  skrll       fragP->tc_frag_data.relax_seen = TRUE;
   8601  1.1  skrll       *stretched_p = 1;
   8602  1.1  skrll     }
   8603  1.1  skrll 
   8604  1.1  skrll   new_logical_line (file_name, line);
   8605  1.1  skrll   return new_stretch;
   8606  1.1  skrll }
   8607  1.1  skrll 
   8608  1.1  skrll 
   8609  1.1  skrll static long
   8610  1.1  skrll relax_frag_loop_align (fragS *fragP, long stretch)
   8611  1.1  skrll {
   8612  1.1  skrll   addressT old_address, old_next_address, old_size;
   8613  1.1  skrll   addressT new_address, new_next_address, new_size;
   8614  1.1  skrll   addressT growth;
   8615  1.1  skrll 
   8616  1.1  skrll   /* All the frags with relax_frag_for_alignment prior to this one in the
   8617  1.1  skrll      section have been done, hopefully eliminating the need for a NOP here.
   8618  1.1  skrll      But, this will put it in if necessary.  */
   8619  1.1  skrll 
   8620  1.1  skrll   /* Calculate the old address of this fragment and the next fragment.  */
   8621  1.1  skrll   old_address = fragP->fr_address - stretch;
   8622  1.1  skrll   old_next_address = (fragP->fr_address - stretch + fragP->fr_fix +
   8623  1.1  skrll 		      fragP->tc_frag_data.text_expansion[0]);
   8624  1.1  skrll   old_size = old_next_address - old_address;
   8625  1.1  skrll 
   8626  1.1  skrll   /* Calculate the new address of this fragment and the next fragment.  */
   8627  1.1  skrll   new_address = fragP->fr_address;
   8628  1.1  skrll   new_next_address =
   8629  1.1  skrll     get_noop_aligned_address (fragP, fragP->fr_address + fragP->fr_fix);
   8630  1.1  skrll   new_size = new_next_address - new_address;
   8631  1.1  skrll 
   8632  1.1  skrll   growth = new_size - old_size;
   8633  1.1  skrll 
   8634  1.1  skrll   /* Fix up the text_expansion field and return the new growth.  */
   8635  1.1  skrll   fragP->tc_frag_data.text_expansion[0] += growth;
   8636  1.1  skrll   return growth;
   8637  1.1  skrll }
   8638  1.1  skrll 
   8639  1.1  skrll 
   8640  1.1  skrll /* Add a NOP instruction.  */
   8641  1.1  skrll 
   8642  1.1  skrll static long
   8643  1.1  skrll relax_frag_add_nop (fragS *fragP)
   8644  1.1  skrll {
   8645  1.1  skrll   char *nop_buf = fragP->fr_literal + fragP->fr_fix;
   8646  1.1  skrll   int length = fragP->tc_frag_data.is_no_density ? 3 : 2;
   8647  1.1  skrll   assemble_nop (length, nop_buf);
   8648  1.1  skrll   fragP->tc_frag_data.is_insn = TRUE;
   8649  1.1  skrll 
   8650  1.1  skrll   if (fragP->fr_var < length)
   8651  1.1  skrll     {
   8652  1.1  skrll       as_fatal (_("fr_var (%ld) < length (%d)"), (long) fragP->fr_var, length);
   8653  1.1  skrll       return 0;
   8654  1.1  skrll     }
   8655  1.1  skrll 
   8656  1.1  skrll   fragP->fr_fix += length;
   8657  1.1  skrll   fragP->fr_var -= length;
   8658  1.1  skrll   return length;
   8659  1.1  skrll }
   8660  1.1  skrll 
   8661  1.1  skrll 
   8662  1.1  skrll static long future_alignment_required (fragS *, long);
   8663  1.1  skrll 
   8664  1.1  skrll static long
   8665  1.1  skrll relax_frag_for_align (fragS *fragP, long stretch)
   8666  1.1  skrll {
   8667  1.1  skrll   /* Overview of the relaxation procedure for alignment:
   8668  1.1  skrll      We can widen with NOPs or by widening instructions or by filling
   8669  1.1  skrll      bytes after jump instructions.  Find the opportune places and widen
   8670  1.1  skrll      them if necessary.  */
   8671  1.1  skrll 
   8672  1.1  skrll   long stretch_me;
   8673  1.1  skrll   long diff;
   8674  1.1  skrll 
   8675  1.1  skrll   assert (fragP->fr_subtype == RELAX_FILL_NOP
   8676  1.1  skrll 	  || fragP->fr_subtype == RELAX_UNREACHABLE
   8677  1.1  skrll 	  || (fragP->fr_subtype == RELAX_SLOTS
   8678  1.1  skrll 	      && fragP->tc_frag_data.slot_subtypes[0] == RELAX_NARROW));
   8679  1.1  skrll 
   8680  1.1  skrll   stretch_me = future_alignment_required (fragP, stretch);
   8681  1.1  skrll   diff = stretch_me - fragP->tc_frag_data.text_expansion[0];
   8682  1.1  skrll   if (diff == 0)
   8683  1.1  skrll     return 0;
   8684  1.1  skrll 
   8685  1.1  skrll   if (diff < 0)
   8686  1.1  skrll     {
   8687  1.1  skrll       /* We expanded on a previous pass.  Can we shrink now?  */
   8688  1.1  skrll       long shrink = fragP->tc_frag_data.text_expansion[0] - stretch_me;
   8689  1.1  skrll       if (shrink <= stretch && stretch > 0)
   8690  1.1  skrll 	{
   8691  1.1  skrll 	  fragP->tc_frag_data.text_expansion[0] = stretch_me;
   8692  1.1  skrll 	  return -shrink;
   8693  1.1  skrll 	}
   8694  1.1  skrll       return 0;
   8695  1.1  skrll     }
   8696  1.1  skrll 
   8697  1.1  skrll   /* Below here, diff > 0.  */
   8698  1.1  skrll   fragP->tc_frag_data.text_expansion[0] = stretch_me;
   8699  1.1  skrll 
   8700  1.1  skrll   return diff;
   8701  1.1  skrll }
   8702  1.1  skrll 
   8703  1.1  skrll 
   8704  1.1  skrll /* Return the address of the next frag that should be aligned.
   8705  1.1  skrll 
   8706  1.1  skrll    By "address" we mean the address it _would_ be at if there
   8707  1.1  skrll    is no action taken to align it between here and the target frag.
   8708  1.1  skrll    In other words, if no narrows and no fill nops are used between
   8709  1.1  skrll    here and the frag to align, _even_if_ some of the frags we use
   8710  1.1  skrll    to align targets have already expanded on a previous relaxation
   8711  1.1  skrll    pass.
   8712  1.1  skrll 
   8713  1.1  skrll    Also, count each frag that may be used to help align the target.
   8714  1.1  skrll 
   8715  1.1  skrll    Return 0 if there are no frags left in the chain that need to be
   8716  1.1  skrll    aligned.  */
   8717  1.1  skrll 
   8718  1.1  skrll static addressT
   8719  1.1  skrll find_address_of_next_align_frag (fragS **fragPP,
   8720  1.1  skrll 				 int *wide_nops,
   8721  1.1  skrll 				 int *narrow_nops,
   8722  1.1  skrll 				 int *widens,
   8723  1.1  skrll 				 bfd_boolean *paddable)
   8724  1.1  skrll {
   8725  1.1  skrll   fragS *fragP = *fragPP;
   8726  1.1  skrll   addressT address = fragP->fr_address;
   8727  1.1  skrll 
   8728  1.1  skrll   /* Do not reset the counts to 0.  */
   8729  1.1  skrll 
   8730  1.1  skrll   while (fragP)
   8731  1.1  skrll     {
   8732  1.1  skrll       /* Limit this to a small search.  */
   8733  1.1  skrll       if (*widens >= (int) xtensa_fetch_width)
   8734  1.1  skrll 	{
   8735  1.1  skrll 	  *fragPP = fragP;
   8736  1.1  skrll 	  return 0;
   8737  1.1  skrll 	}
   8738  1.1  skrll       address += fragP->fr_fix;
   8739  1.1  skrll 
   8740  1.1  skrll       if (fragP->fr_type == rs_fill)
   8741  1.1  skrll 	address += fragP->fr_offset * fragP->fr_var;
   8742  1.1  skrll       else if (fragP->fr_type == rs_machine_dependent)
   8743  1.1  skrll 	{
   8744  1.1  skrll 	  switch (fragP->fr_subtype)
   8745  1.1  skrll 	    {
   8746  1.1  skrll 	    case RELAX_UNREACHABLE:
   8747  1.1  skrll 	      *paddable = TRUE;
   8748  1.1  skrll 	      break;
   8749  1.1  skrll 
   8750  1.1  skrll 	    case RELAX_FILL_NOP:
   8751  1.1  skrll 	      (*wide_nops)++;
   8752  1.1  skrll 	      if (!fragP->tc_frag_data.is_no_density)
   8753  1.1  skrll 		(*narrow_nops)++;
   8754  1.1  skrll 	      break;
   8755  1.1  skrll 
   8756  1.1  skrll 	    case RELAX_SLOTS:
   8757  1.1  skrll 	      if (fragP->tc_frag_data.slot_subtypes[0] == RELAX_NARROW)
   8758  1.1  skrll 		{
   8759  1.1  skrll 		  (*widens)++;
   8760  1.1  skrll 		  break;
   8761  1.1  skrll 		}
   8762  1.1  skrll 	      address += total_frag_text_expansion (fragP);;
   8763  1.1  skrll 	      break;
   8764  1.1  skrll 
   8765  1.1  skrll 	    case RELAX_IMMED:
   8766  1.1  skrll 	      address += fragP->tc_frag_data.text_expansion[0];
   8767  1.1  skrll 	      break;
   8768  1.1  skrll 
   8769  1.1  skrll 	    case RELAX_ALIGN_NEXT_OPCODE:
   8770  1.1  skrll 	    case RELAX_DESIRE_ALIGN:
   8771  1.1  skrll 	      *fragPP = fragP;
   8772  1.1  skrll 	      return address;
   8773  1.1  skrll 
   8774  1.1  skrll 	    case RELAX_MAYBE_UNREACHABLE:
   8775  1.1  skrll 	    case RELAX_MAYBE_DESIRE_ALIGN:
   8776  1.1  skrll 	      /* Do nothing.  */
   8777  1.1  skrll 	      break;
   8778  1.1  skrll 
   8779  1.1  skrll 	    default:
   8780  1.1  skrll 	      /* Just punt if we don't know the type.  */
   8781  1.1  skrll 	      *fragPP = fragP;
   8782  1.1  skrll 	      return 0;
   8783  1.1  skrll 	    }
   8784  1.1  skrll 	}
   8785  1.1  skrll       else
   8786  1.1  skrll 	{
   8787  1.1  skrll 	  /* Just punt if we don't know the type.  */
   8788  1.1  skrll 	  *fragPP = fragP;
   8789  1.1  skrll 	  return 0;
   8790  1.1  skrll 	}
   8791  1.1  skrll       fragP = fragP->fr_next;
   8792  1.1  skrll     }
   8793  1.1  skrll 
   8794  1.1  skrll   *fragPP = fragP;
   8795  1.1  skrll   return 0;
   8796  1.1  skrll }
   8797  1.1  skrll 
   8798  1.1  skrll 
   8799  1.1  skrll static long bytes_to_stretch (fragS *, int, int, int, int);
   8800  1.1  skrll 
   8801  1.1  skrll static long
   8802  1.1  skrll future_alignment_required (fragS *fragP, long stretch ATTRIBUTE_UNUSED)
   8803  1.1  skrll {
   8804  1.1  skrll   fragS *this_frag = fragP;
   8805  1.1  skrll   long address;
   8806  1.1  skrll   int num_widens = 0;
   8807  1.1  skrll   int wide_nops = 0;
   8808  1.1  skrll   int narrow_nops = 0;
   8809  1.1  skrll   bfd_boolean paddable = FALSE;
   8810  1.1  skrll   offsetT local_opt_diff;
   8811  1.1  skrll   offsetT opt_diff;
   8812  1.1  skrll   offsetT max_diff;
   8813  1.1  skrll   int stretch_amount = 0;
   8814  1.1  skrll   int local_stretch_amount;
   8815  1.1  skrll   int global_stretch_amount;
   8816  1.1  skrll 
   8817  1.1  skrll   address = find_address_of_next_align_frag
   8818  1.1  skrll     (&fragP, &wide_nops, &narrow_nops, &num_widens, &paddable);
   8819  1.1  skrll 
   8820  1.1  skrll   if (!address)
   8821  1.1  skrll     {
   8822  1.1  skrll       if (this_frag->tc_frag_data.is_aligning_branch)
   8823  1.1  skrll 	this_frag->tc_frag_data.slot_subtypes[0] = RELAX_IMMED;
   8824  1.1  skrll       else
   8825  1.1  skrll 	frag_wane (this_frag);
   8826  1.1  skrll     }
   8827  1.1  skrll   else
   8828  1.1  skrll     {
   8829  1.1  skrll       local_opt_diff = get_aligned_diff (fragP, address, &max_diff);
   8830  1.1  skrll       opt_diff = local_opt_diff;
   8831  1.1  skrll       assert (opt_diff >= 0);
   8832  1.1  skrll       assert (max_diff >= opt_diff);
   8833  1.1  skrll       if (max_diff == 0)
   8834  1.1  skrll 	return 0;
   8835  1.1  skrll 
   8836  1.1  skrll       if (fragP)
   8837  1.1  skrll 	fragP = fragP->fr_next;
   8838  1.1  skrll 
   8839  1.1  skrll       while (fragP && opt_diff < max_diff && address)
   8840  1.1  skrll 	{
   8841  1.1  skrll 	  /* We only use these to determine if we can exit early
   8842  1.1  skrll 	     because there will be plenty of ways to align future
   8843  1.1  skrll 	     align frags.  */
   8844  1.1  skrll 	  int glob_widens = 0;
   8845  1.1  skrll 	  int dnn = 0;
   8846  1.1  skrll 	  int dw = 0;
   8847  1.1  skrll 	  bfd_boolean glob_pad = 0;
   8848  1.1  skrll 	  address = find_address_of_next_align_frag
   8849  1.1  skrll 	    (&fragP, &glob_widens, &dnn, &dw, &glob_pad);
   8850  1.1  skrll 	  /* If there is a padable portion, then skip.  */
   8851  1.1  skrll 	  if (glob_pad || glob_widens >= (1 << branch_align_power (now_seg)))
   8852  1.1  skrll 	    address = 0;
   8853  1.1  skrll 
   8854  1.1  skrll 	  if (address)
   8855  1.1  skrll 	    {
   8856  1.1  skrll 	      offsetT next_m_diff;
   8857  1.1  skrll 	      offsetT next_o_diff;
   8858  1.1  skrll 
   8859  1.1  skrll 	      /* Downrange frags haven't had stretch added to them yet.  */
   8860  1.1  skrll 	      address += stretch;
   8861  1.1  skrll 
   8862  1.1  skrll 	      /* The address also includes any text expansion from this
   8863  1.1  skrll 		 frag in a previous pass, but we don't want that.  */
   8864  1.1  skrll 	      address -= this_frag->tc_frag_data.text_expansion[0];
   8865  1.1  skrll 
   8866  1.1  skrll 	      /* Assume we are going to move at least opt_diff.  In
   8867  1.1  skrll 		 reality, we might not be able to, but assuming that
   8868  1.1  skrll 		 we will helps catch cases where moving opt_diff pushes
   8869  1.1  skrll 		 the next target from aligned to unaligned.  */
   8870  1.1  skrll 	      address += opt_diff;
   8871  1.1  skrll 
   8872  1.1  skrll 	      next_o_diff = get_aligned_diff (fragP, address, &next_m_diff);
   8873  1.1  skrll 
   8874  1.1  skrll 	      /* Now cleanup for the adjustments to address.  */
   8875  1.1  skrll 	      next_o_diff += opt_diff;
   8876  1.1  skrll 	      next_m_diff += opt_diff;
   8877  1.1  skrll 	      if (next_o_diff <= max_diff && next_o_diff > opt_diff)
   8878  1.1  skrll 		opt_diff = next_o_diff;
   8879  1.1  skrll 	      if (next_m_diff < max_diff)
   8880  1.1  skrll 		max_diff = next_m_diff;
   8881  1.1  skrll 	      fragP = fragP->fr_next;
   8882  1.1  skrll 	    }
   8883  1.1  skrll 	}
   8884  1.1  skrll 
   8885  1.1  skrll       /* If there are enough wideners in between, do it.  */
   8886  1.1  skrll       if (paddable)
   8887  1.1  skrll 	{
   8888  1.1  skrll 	  if (this_frag->fr_subtype == RELAX_UNREACHABLE)
   8889  1.1  skrll 	    {
   8890  1.1  skrll 	      assert (opt_diff <= UNREACHABLE_MAX_WIDTH);
   8891  1.1  skrll 	      return opt_diff;
   8892  1.1  skrll 	    }
   8893  1.1  skrll 	  return 0;
   8894  1.1  skrll 	}
   8895  1.1  skrll       local_stretch_amount
   8896  1.1  skrll 	= bytes_to_stretch (this_frag, wide_nops, narrow_nops,
   8897  1.1  skrll 			    num_widens, local_opt_diff);
   8898  1.1  skrll       global_stretch_amount
   8899  1.1  skrll 	= bytes_to_stretch (this_frag, wide_nops, narrow_nops,
   8900  1.1  skrll 			    num_widens, opt_diff);
   8901  1.1  skrll       /* If the condition below is true, then the frag couldn't
   8902  1.1  skrll 	 stretch the correct amount for the global case, so we just
   8903  1.1  skrll 	 optimize locally.  We'll rely on the subsequent frags to get
   8904  1.1  skrll 	 the correct alignment in the global case.  */
   8905  1.1  skrll       if (global_stretch_amount < local_stretch_amount)
   8906  1.1  skrll 	stretch_amount = local_stretch_amount;
   8907  1.1  skrll       else
   8908  1.1  skrll 	stretch_amount = global_stretch_amount;
   8909  1.1  skrll 
   8910  1.1  skrll       if (this_frag->fr_subtype == RELAX_SLOTS
   8911  1.1  skrll 	  && this_frag->tc_frag_data.slot_subtypes[0] == RELAX_NARROW)
   8912  1.1  skrll 	assert (stretch_amount <= 1);
   8913  1.1  skrll       else if (this_frag->fr_subtype == RELAX_FILL_NOP)
   8914  1.1  skrll 	{
   8915  1.1  skrll 	  if (this_frag->tc_frag_data.is_no_density)
   8916  1.1  skrll 	    assert (stretch_amount == 3 || stretch_amount == 0);
   8917  1.1  skrll 	  else
   8918  1.1  skrll 	    assert (stretch_amount <= 3);
   8919  1.1  skrll 	}
   8920  1.1  skrll     }
   8921  1.1  skrll   return stretch_amount;
   8922  1.1  skrll }
   8923  1.1  skrll 
   8924  1.1  skrll 
   8925  1.1  skrll /* The idea: widen everything you can to get a target or loop aligned,
   8926  1.1  skrll    then start using NOPs.
   8927  1.1  skrll 
   8928  1.1  skrll    When we must have a NOP, here is a table of how we decide
   8929  1.1  skrll    (so you don't have to fight through the control flow below):
   8930  1.1  skrll 
   8931  1.1  skrll    wide_nops   = the number of wide NOPs available for aligning
   8932  1.1  skrll    narrow_nops = the number of narrow NOPs available for aligning
   8933  1.1  skrll 		 (a subset of wide_nops)
   8934  1.1  skrll    widens      = the number of narrow instructions that should be widened
   8935  1.1  skrll 
   8936  1.1  skrll    Desired   wide   narrow
   8937  1.1  skrll    Diff      nop    nop      widens
   8938  1.1  skrll    1           0      0         1
   8939  1.1  skrll    2           0      1         0
   8940  1.1  skrll    3a          1      0         0
   8941  1.1  skrll     b          0      1         1 (case 3a makes this case unnecessary)
   8942  1.1  skrll    4a          1      0         1
   8943  1.1  skrll     b          0      2         0
   8944  1.1  skrll     c          0      1         2 (case 4a makes this case unnecessary)
   8945  1.1  skrll    5a          1      0         2
   8946  1.1  skrll     b          1      1         0
   8947  1.1  skrll     c          0      2         1 (case 5b makes this case unnecessary)
   8948  1.1  skrll    6a          2      0         0
   8949  1.1  skrll     b          1      0         3
   8950  1.1  skrll     c          0      1         4 (case 6b makes this case unnecessary)
   8951  1.1  skrll     d          1      1         1 (case 6a makes this case unnecessary)
   8952  1.1  skrll     e          0      2         2 (case 6a makes this case unnecessary)
   8953  1.1  skrll     f          0      3         0 (case 6a makes this case unnecessary)
   8954  1.1  skrll    7a          1      0         4
   8955  1.1  skrll     b          2      0         1
   8956  1.1  skrll     c          1      1         2 (case 7b makes this case unnecessary)
   8957  1.1  skrll     d          0      1         5 (case 7a makes this case unnecessary)
   8958  1.1  skrll     e          0      2         3 (case 7b makes this case unnecessary)
   8959  1.1  skrll     f          0      3         1 (case 7b makes this case unnecessary)
   8960  1.1  skrll     g          1      2         1 (case 7b makes this case unnecessary)
   8961  1.1  skrll */
   8962  1.1  skrll 
   8963  1.1  skrll static long
   8964  1.1  skrll bytes_to_stretch (fragS *this_frag,
   8965  1.1  skrll 		  int wide_nops,
   8966  1.1  skrll 		  int narrow_nops,
   8967  1.1  skrll 		  int num_widens,
   8968  1.1  skrll 		  int desired_diff)
   8969  1.1  skrll {
   8970  1.1  skrll   int bytes_short = desired_diff - num_widens;
   8971  1.1  skrll 
   8972  1.1  skrll   assert (desired_diff >= 0 && desired_diff < 8);
   8973  1.1  skrll   if (desired_diff == 0)
   8974  1.1  skrll     return 0;
   8975  1.1  skrll 
   8976  1.1  skrll   assert (wide_nops > 0 || num_widens > 0);
   8977  1.1  skrll 
   8978  1.1  skrll   /* Always prefer widening to NOP-filling.  */
   8979  1.1  skrll   if (bytes_short < 0)
   8980  1.1  skrll     {
   8981  1.1  skrll       /* There are enough RELAX_NARROW frags after this one
   8982  1.1  skrll 	 to align the target without widening this frag in any way.  */
   8983  1.1  skrll       return 0;
   8984  1.1  skrll     }
   8985  1.1  skrll 
   8986  1.1  skrll   if (bytes_short == 0)
   8987  1.1  skrll     {
   8988  1.1  skrll       /* Widen every narrow between here and the align target
   8989  1.1  skrll 	 and the align target will be properly aligned.  */
   8990  1.1  skrll       if (this_frag->fr_subtype == RELAX_FILL_NOP)
   8991  1.1  skrll 	return 0;
   8992  1.1  skrll       else
   8993  1.1  skrll 	return 1;
   8994  1.1  skrll     }
   8995  1.1  skrll 
   8996  1.1  skrll   /* From here we will need at least one NOP to get an alignment.
   8997  1.1  skrll      However, we may not be able to align at all, in which case,
   8998  1.1  skrll      don't widen.  */
   8999  1.1  skrll   if (this_frag->fr_subtype == RELAX_FILL_NOP)
   9000  1.1  skrll     {
   9001  1.1  skrll       switch (desired_diff)
   9002  1.1  skrll 	{
   9003  1.1  skrll 	case 1:
   9004  1.1  skrll 	  return 0;
   9005  1.1  skrll 	case 2:
   9006  1.1  skrll 	  if (!this_frag->tc_frag_data.is_no_density && narrow_nops == 1)
   9007  1.1  skrll 	    return 2; /* case 2 */
   9008  1.1  skrll 	  return 0;
   9009  1.1  skrll 	case 3:
   9010  1.1  skrll 	  if (wide_nops > 1)
   9011  1.1  skrll 	    return 0;
   9012  1.1  skrll 	  else
   9013  1.1  skrll 	    return 3; /* case 3a */
   9014  1.1  skrll 	case 4:
   9015  1.1  skrll 	  if (num_widens >= 1 && wide_nops == 1)
   9016  1.1  skrll 	    return 3; /* case 4a */
   9017  1.1  skrll 	  if (!this_frag->tc_frag_data.is_no_density && narrow_nops == 2)
   9018  1.1  skrll 	    return 2; /* case 4b */
   9019  1.1  skrll 	  return 0;
   9020  1.1  skrll 	case 5:
   9021  1.1  skrll 	  if (num_widens >= 2 && wide_nops == 1)
   9022  1.1  skrll 	    return 3; /* case 5a */
   9023  1.1  skrll 	  /* We will need two nops.  Are there enough nops
   9024  1.1  skrll 	     between here and the align target?  */
   9025  1.1  skrll 	  if (wide_nops < 2 || narrow_nops == 0)
   9026  1.1  skrll 	    return 0;
   9027  1.1  skrll 	  /* Are there other nops closer that can serve instead?  */
   9028  1.1  skrll 	  if (wide_nops > 2 && narrow_nops > 1)
   9029  1.1  skrll 	    return 0;
   9030  1.1  skrll 	  /* Take the density one first, because there might not be
   9031  1.1  skrll 	     another density one available.  */
   9032  1.1  skrll 	  if (!this_frag->tc_frag_data.is_no_density)
   9033  1.1  skrll 	    return 2; /* case 5b narrow */
   9034  1.1  skrll 	  else
   9035  1.1  skrll 	    return 3; /* case 5b wide */
   9036  1.1  skrll 	  return 0;
   9037  1.1  skrll 	case 6:
   9038  1.1  skrll 	  if (wide_nops == 2)
   9039  1.1  skrll 	    return 3; /* case 6a */
   9040  1.1  skrll 	  else if (num_widens >= 3 && wide_nops == 1)
   9041  1.1  skrll 	    return 3; /* case 6b */
   9042  1.1  skrll 	  return 0;
   9043  1.1  skrll 	case 7:
   9044  1.1  skrll 	  if (wide_nops == 1 && num_widens >= 4)
   9045  1.1  skrll 	    return 3; /* case 7a */
   9046  1.1  skrll 	  else if (wide_nops == 2 && num_widens >= 1)
   9047  1.1  skrll 	    return 3; /* case 7b */
   9048  1.1  skrll 	  return 0;
   9049  1.1  skrll 	default:
   9050  1.1  skrll 	  assert (0);
   9051  1.1  skrll 	}
   9052  1.1  skrll     }
   9053  1.1  skrll   else
   9054  1.1  skrll     {
   9055  1.1  skrll       /* We will need a NOP no matter what, but should we widen
   9056  1.1  skrll 	 this instruction to help?
   9057  1.1  skrll 
   9058  1.1  skrll 	 This is a RELAX_NARROW frag.  */
   9059  1.1  skrll       switch (desired_diff)
   9060  1.1  skrll 	{
   9061  1.1  skrll 	case 1:
   9062  1.1  skrll 	  assert (0);
   9063  1.1  skrll 	  return 0;
   9064  1.1  skrll 	case 2:
   9065  1.1  skrll 	case 3:
   9066  1.1  skrll 	  return 0;
   9067  1.1  skrll 	case 4:
   9068  1.1  skrll 	  if (wide_nops >= 1 && num_widens == 1)
   9069  1.1  skrll 	    return 1; /* case 4a */
   9070  1.1  skrll 	  return 0;
   9071  1.1  skrll 	case 5:
   9072  1.1  skrll 	  if (wide_nops >= 1 && num_widens == 2)
   9073  1.1  skrll 	    return 1; /* case 5a */
   9074  1.1  skrll 	  return 0;
   9075  1.1  skrll 	case 6:
   9076  1.1  skrll 	  if (wide_nops >= 2)
   9077  1.1  skrll 	    return 0; /* case 6a */
   9078  1.1  skrll 	  else if (wide_nops >= 1 && num_widens == 3)
   9079  1.1  skrll 	    return 1; /* case 6b */
   9080  1.1  skrll 	  return 0;
   9081  1.1  skrll 	case 7:
   9082  1.1  skrll 	  if (wide_nops >= 1 && num_widens == 4)
   9083  1.1  skrll 	    return 1; /* case 7a */
   9084  1.1  skrll 	  else if (wide_nops >= 2 && num_widens == 1)
   9085  1.1  skrll 	    return 1; /* case 7b */
   9086  1.1  skrll 	  return 0;
   9087  1.1  skrll 	default:
   9088  1.1  skrll 	  assert (0);
   9089  1.1  skrll 	  return 0;
   9090  1.1  skrll 	}
   9091  1.1  skrll     }
   9092  1.1  skrll   assert (0);
   9093  1.1  skrll   return 0;
   9094  1.1  skrll }
   9095  1.1  skrll 
   9096  1.1  skrll 
   9097  1.1  skrll static long
   9098  1.1  skrll relax_frag_immed (segT segP,
   9099  1.1  skrll 		  fragS *fragP,
   9100  1.1  skrll 		  long stretch,
   9101  1.1  skrll 		  int min_steps,
   9102  1.1  skrll 		  xtensa_format fmt,
   9103  1.1  skrll 		  int slot,
   9104  1.1  skrll 		  int *stretched_p,
   9105  1.1  skrll 		  bfd_boolean estimate_only)
   9106  1.1  skrll {
   9107  1.1  skrll   TInsn tinsn;
   9108  1.1  skrll   int old_size;
   9109  1.1  skrll   bfd_boolean negatable_branch = FALSE;
   9110  1.1  skrll   bfd_boolean branch_jmp_to_next = FALSE;
   9111  1.1  skrll   bfd_boolean from_wide_insn = FALSE;
   9112  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   9113  1.1  skrll   IStack istack;
   9114  1.1  skrll   offsetT frag_offset;
   9115  1.1  skrll   int num_steps;
   9116  1.1  skrll   int num_text_bytes, num_literal_bytes;
   9117  1.1  skrll   int literal_diff, total_text_diff, this_text_diff;
   9118  1.1  skrll 
   9119  1.1  skrll   assert (fragP->fr_opcode != NULL);
   9120  1.1  skrll 
   9121  1.1  skrll   xg_clear_vinsn (&cur_vinsn);
   9122  1.1  skrll   vinsn_from_chars (&cur_vinsn, fragP->fr_opcode);
   9123  1.1  skrll   if (cur_vinsn.num_slots > 1)
   9124  1.1  skrll     from_wide_insn = TRUE;
   9125  1.1  skrll 
   9126  1.1  skrll   tinsn = cur_vinsn.slots[slot];
   9127  1.1  skrll   tinsn_immed_from_frag (&tinsn, fragP, slot);
   9128  1.1  skrll 
   9129  1.1  skrll   if (estimate_only && xtensa_opcode_is_loop (isa, tinsn.opcode) == 1)
   9130  1.1  skrll     return 0;
   9131  1.1  skrll 
   9132  1.1  skrll   if (workaround_b_j_loop_end && ! fragP->tc_frag_data.is_no_transform)
   9133  1.1  skrll     branch_jmp_to_next = is_branch_jmp_to_next (&tinsn, fragP);
   9134  1.1  skrll 
   9135  1.1  skrll   negatable_branch = (xtensa_opcode_is_branch (isa, tinsn.opcode) == 1);
   9136  1.1  skrll 
   9137  1.1  skrll   old_size = xtensa_format_length (isa, fmt);
   9138  1.1  skrll 
   9139  1.1  skrll   /* Special case: replace a branch to the next instruction with a NOP.
   9140  1.1  skrll      This is required to work around a hardware bug in T1040.0 and also
   9141  1.1  skrll      serves as an optimization.  */
   9142  1.1  skrll 
   9143  1.1  skrll   if (branch_jmp_to_next
   9144  1.1  skrll       && ((old_size == 2) || (old_size == 3))
   9145  1.1  skrll       && !next_frag_is_loop_target (fragP))
   9146  1.1  skrll     return 0;
   9147  1.1  skrll 
   9148  1.1  skrll   /* Here is the fun stuff: Get the immediate field from this
   9149  1.1  skrll      instruction.  If it fits, we are done.  If not, find the next
   9150  1.1  skrll      instruction sequence that fits.  */
   9151  1.1  skrll 
   9152  1.1  skrll   frag_offset = fragP->fr_opcode - fragP->fr_literal;
   9153  1.1  skrll   istack_init (&istack);
   9154  1.1  skrll   num_steps = xg_assembly_relax (&istack, &tinsn, segP, fragP, frag_offset,
   9155  1.1  skrll 				 min_steps, stretch);
   9156  1.1  skrll   assert (num_steps >= min_steps && num_steps <= RELAX_IMMED_MAXSTEPS);
   9157  1.1  skrll 
   9158  1.1  skrll   fragP->tc_frag_data.slot_subtypes[slot] = (int) RELAX_IMMED + num_steps;
   9159  1.1  skrll 
   9160  1.1  skrll   /* Figure out the number of bytes needed.  */
   9161  1.1  skrll   num_literal_bytes = get_num_stack_literal_bytes (&istack);
   9162  1.1  skrll   literal_diff
   9163  1.1  skrll     = num_literal_bytes - fragP->tc_frag_data.literal_expansion[slot];
   9164  1.1  skrll   num_text_bytes = get_num_stack_text_bytes (&istack);
   9165  1.1  skrll 
   9166  1.1  skrll   if (from_wide_insn)
   9167  1.1  skrll     {
   9168  1.1  skrll       int first = 0;
   9169  1.1  skrll       while (istack.insn[first].opcode == XTENSA_UNDEFINED)
   9170  1.1  skrll 	first++;
   9171  1.1  skrll 
   9172  1.1  skrll       num_text_bytes += old_size;
   9173  1.1  skrll       if (opcode_fits_format_slot (istack.insn[first].opcode, fmt, slot))
   9174  1.1  skrll 	num_text_bytes -= xg_get_single_size (istack.insn[first].opcode);
   9175  1.1  skrll       else
   9176  1.1  skrll 	{
   9177  1.1  skrll 	  /* The first instruction in the relaxed sequence will go after
   9178  1.1  skrll 	     the current wide instruction, and thus its symbolic immediates
   9179  1.1  skrll 	     might not fit.  */
   9180  1.1  skrll 
   9181  1.1  skrll 	  istack_init (&istack);
   9182  1.1  skrll 	  num_steps = xg_assembly_relax (&istack, &tinsn, segP, fragP,
   9183  1.1  skrll 					 frag_offset + old_size,
   9184  1.1  skrll 					 min_steps, stretch + old_size);
   9185  1.1  skrll 	  assert (num_steps >= min_steps && num_steps <= RELAX_IMMED_MAXSTEPS);
   9186  1.1  skrll 
   9187  1.1  skrll 	  fragP->tc_frag_data.slot_subtypes[slot]
   9188  1.1  skrll 	    = (int) RELAX_IMMED + num_steps;
   9189  1.1  skrll 
   9190  1.1  skrll 	  num_literal_bytes = get_num_stack_literal_bytes (&istack);
   9191  1.1  skrll 	  literal_diff
   9192  1.1  skrll 	    = num_literal_bytes - fragP->tc_frag_data.literal_expansion[slot];
   9193  1.1  skrll 
   9194  1.1  skrll 	  num_text_bytes = get_num_stack_text_bytes (&istack) + old_size;
   9195  1.1  skrll 	}
   9196  1.1  skrll     }
   9197  1.1  skrll 
   9198  1.1  skrll   total_text_diff = num_text_bytes - old_size;
   9199  1.1  skrll   this_text_diff = total_text_diff - fragP->tc_frag_data.text_expansion[slot];
   9200  1.1  skrll 
   9201  1.1  skrll   /* It MUST get larger.  If not, we could get an infinite loop.  */
   9202  1.1  skrll   assert (num_text_bytes >= 0);
   9203  1.1  skrll   assert (literal_diff >= 0);
   9204  1.1  skrll   assert (total_text_diff >= 0);
   9205  1.1  skrll 
   9206  1.1  skrll   fragP->tc_frag_data.text_expansion[slot] = total_text_diff;
   9207  1.1  skrll   fragP->tc_frag_data.literal_expansion[slot] = num_literal_bytes;
   9208  1.1  skrll   assert (fragP->tc_frag_data.text_expansion[slot] >= 0);
   9209  1.1  skrll   assert (fragP->tc_frag_data.literal_expansion[slot] >= 0);
   9210  1.1  skrll 
   9211  1.1  skrll   /* Find the associated expandable literal for this.  */
   9212  1.1  skrll   if (literal_diff != 0)
   9213  1.1  skrll     {
   9214  1.1  skrll       fragS *lit_fragP = fragP->tc_frag_data.literal_frags[slot];
   9215  1.1  skrll       if (lit_fragP)
   9216  1.1  skrll 	{
   9217  1.1  skrll 	  assert (literal_diff == 4);
   9218  1.1  skrll 	  lit_fragP->tc_frag_data.unreported_expansion += literal_diff;
   9219  1.1  skrll 
   9220  1.1  skrll 	  /* We expect that the literal section state has NOT been
   9221  1.1  skrll 	     modified yet.  */
   9222  1.1  skrll 	  assert (lit_fragP->fr_type == rs_machine_dependent
   9223  1.1  skrll 		  && lit_fragP->fr_subtype == RELAX_LITERAL);
   9224  1.1  skrll 	  lit_fragP->fr_subtype = RELAX_LITERAL_NR;
   9225  1.1  skrll 
   9226  1.1  skrll 	  /* We need to mark this section for another iteration
   9227  1.1  skrll 	     of relaxation.  */
   9228  1.1  skrll 	  (*stretched_p)++;
   9229  1.1  skrll 	}
   9230  1.1  skrll     }
   9231  1.1  skrll 
   9232  1.1  skrll   if (negatable_branch && istack.ninsn > 1)
   9233  1.1  skrll     update_next_frag_state (fragP);
   9234  1.1  skrll 
   9235  1.1  skrll   return this_text_diff;
   9236  1.1  skrll }
   9237  1.1  skrll 
   9238  1.1  skrll 
   9239  1.1  skrll /* md_convert_frag Hook and Helper Functions.  */
   9241  1.1  skrll 
   9242  1.1  skrll static void convert_frag_align_next_opcode (fragS *);
   9243  1.1  skrll static void convert_frag_narrow (segT, fragS *, xtensa_format, int);
   9244  1.1  skrll static void convert_frag_fill_nop (fragS *);
   9245  1.1  skrll static void convert_frag_immed (segT, fragS *, int, xtensa_format, int);
   9246  1.1  skrll 
   9247  1.1  skrll void
   9248  1.1  skrll md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT sec, fragS *fragp)
   9249  1.1  skrll {
   9250  1.1  skrll   static xtensa_insnbuf vbuf = NULL;
   9251  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   9252  1.1  skrll   int slot;
   9253  1.1  skrll   int num_slots;
   9254  1.1  skrll   xtensa_format fmt;
   9255  1.1  skrll   char *file_name;
   9256  1.1  skrll   unsigned line;
   9257  1.1  skrll 
   9258  1.1  skrll   as_where (&file_name, &line);
   9259  1.1  skrll   new_logical_line (fragp->fr_file, fragp->fr_line);
   9260  1.1  skrll 
   9261  1.1  skrll   switch (fragp->fr_subtype)
   9262  1.1  skrll     {
   9263  1.1  skrll     case RELAX_ALIGN_NEXT_OPCODE:
   9264  1.1  skrll       /* Always convert.  */
   9265  1.1  skrll       convert_frag_align_next_opcode (fragp);
   9266  1.1  skrll       break;
   9267  1.1  skrll 
   9268  1.1  skrll     case RELAX_DESIRE_ALIGN:
   9269  1.1  skrll       /* Do nothing.  If not aligned already, too bad.  */
   9270  1.1  skrll       break;
   9271  1.1  skrll 
   9272  1.1  skrll     case RELAX_LITERAL:
   9273  1.1  skrll     case RELAX_LITERAL_FINAL:
   9274  1.1  skrll       break;
   9275  1.1  skrll 
   9276  1.1  skrll     case RELAX_SLOTS:
   9277  1.1  skrll       if (vbuf == NULL)
   9278  1.1  skrll 	vbuf = xtensa_insnbuf_alloc (isa);
   9279  1.1  skrll 
   9280  1.1  skrll       xtensa_insnbuf_from_chars
   9281  1.1  skrll 	(isa, vbuf, (unsigned char *) fragp->fr_opcode, 0);
   9282  1.1  skrll       fmt = xtensa_format_decode (isa, vbuf);
   9283  1.1  skrll       num_slots = xtensa_format_num_slots (isa, fmt);
   9284  1.1  skrll 
   9285  1.1  skrll       for (slot = 0; slot < num_slots; slot++)
   9286  1.1  skrll 	{
   9287  1.1  skrll 	  switch (fragp->tc_frag_data.slot_subtypes[slot])
   9288  1.1  skrll 	    {
   9289  1.1  skrll 	    case RELAX_NARROW:
   9290  1.1  skrll 	      convert_frag_narrow (sec, fragp, fmt, slot);
   9291  1.1  skrll 	      break;
   9292  1.1  skrll 
   9293  1.1  skrll 	    case RELAX_IMMED:
   9294  1.1  skrll 	    case RELAX_IMMED_STEP1:
   9295  1.1  skrll 	    case RELAX_IMMED_STEP2:
   9296  1.1  skrll 	    case RELAX_IMMED_STEP3:
   9297  1.1  skrll 	      /* Place the immediate.  */
   9298  1.1  skrll 	      convert_frag_immed
   9299  1.1  skrll 		(sec, fragp,
   9300  1.1  skrll 		 fragp->tc_frag_data.slot_subtypes[slot] - RELAX_IMMED,
   9301  1.1  skrll 		 fmt, slot);
   9302  1.1  skrll 	      break;
   9303  1.1  skrll 
   9304  1.1  skrll 	    default:
   9305  1.1  skrll 	      /* This is OK because some slots could have
   9306  1.1  skrll 		 relaxations and others have none.  */
   9307  1.1  skrll 	      break;
   9308  1.1  skrll 	    }
   9309  1.1  skrll 	}
   9310  1.1  skrll       break;
   9311  1.1  skrll 
   9312  1.1  skrll     case RELAX_UNREACHABLE:
   9313  1.1  skrll       memset (&fragp->fr_literal[fragp->fr_fix], 0, fragp->fr_var);
   9314  1.1  skrll       fragp->fr_fix += fragp->tc_frag_data.text_expansion[0];
   9315  1.1  skrll       fragp->fr_var -= fragp->tc_frag_data.text_expansion[0];
   9316  1.1  skrll       frag_wane (fragp);
   9317  1.1  skrll       break;
   9318  1.1  skrll 
   9319  1.1  skrll     case RELAX_MAYBE_UNREACHABLE:
   9320  1.1  skrll     case RELAX_MAYBE_DESIRE_ALIGN:
   9321  1.1  skrll       frag_wane (fragp);
   9322  1.1  skrll       break;
   9323  1.1  skrll 
   9324  1.1  skrll     case RELAX_FILL_NOP:
   9325  1.1  skrll       convert_frag_fill_nop (fragp);
   9326  1.1  skrll       break;
   9327  1.1  skrll 
   9328  1.1  skrll     case RELAX_LITERAL_NR:
   9329  1.1  skrll       if (use_literal_section)
   9330  1.1  skrll 	{
   9331  1.1  skrll 	  /* This should have been handled during relaxation.  When
   9332  1.1  skrll 	     relaxing a code segment, literals sometimes need to be
   9333  1.1  skrll 	     added to the corresponding literal segment.  If that
   9334  1.1  skrll 	     literal segment has already been relaxed, then we end up
   9335  1.1  skrll 	     in this situation.  Marking the literal segments as data
   9336  1.1  skrll 	     would make this happen less often (since GAS always relaxes
   9337  1.1  skrll 	     code before data), but we could still get into trouble if
   9338  1.1  skrll 	     there are instructions in a segment that is not marked as
   9339  1.1  skrll 	     containing code.  Until we can implement a better solution,
   9340  1.1  skrll 	     cheat and adjust the addresses of all the following frags.
   9341  1.1  skrll 	     This could break subsequent alignments, but the linker's
   9342  1.1  skrll 	     literal coalescing will do that anyway.  */
   9343  1.1  skrll 
   9344  1.1  skrll 	  fragS *f;
   9345  1.1  skrll 	  fragp->fr_subtype = RELAX_LITERAL_FINAL;
   9346  1.1  skrll 	  assert (fragp->tc_frag_data.unreported_expansion == 4);
   9347  1.1  skrll 	  memset (&fragp->fr_literal[fragp->fr_fix], 0, 4);
   9348  1.1  skrll 	  fragp->fr_var -= 4;
   9349  1.1  skrll 	  fragp->fr_fix += 4;
   9350  1.1  skrll 	  for (f = fragp->fr_next; f; f = f->fr_next)
   9351  1.1  skrll 	    f->fr_address += 4;
   9352  1.1  skrll 	}
   9353  1.1  skrll       else
   9354  1.1  skrll 	as_bad (_("invalid relaxation fragment result"));
   9355  1.1  skrll       break;
   9356  1.1  skrll     }
   9357  1.1  skrll 
   9358  1.1  skrll   fragp->fr_var = 0;
   9359  1.1  skrll   new_logical_line (file_name, line);
   9360  1.1  skrll }
   9361  1.1  skrll 
   9362  1.1  skrll 
   9363  1.1  skrll static void
   9364  1.1  skrll convert_frag_align_next_opcode (fragS *fragp)
   9365  1.1  skrll {
   9366  1.1  skrll   char *nop_buf;		/* Location for Writing.  */
   9367  1.1  skrll   bfd_boolean use_no_density = fragp->tc_frag_data.is_no_density;
   9368  1.1  skrll   addressT aligned_address;
   9369  1.1  skrll   offsetT fill_size;
   9370  1.1  skrll   int nop, nop_count;
   9371  1.1  skrll 
   9372  1.1  skrll   aligned_address = get_noop_aligned_address (fragp, fragp->fr_address +
   9373  1.1  skrll 					      fragp->fr_fix);
   9374  1.1  skrll   fill_size = aligned_address - (fragp->fr_address + fragp->fr_fix);
   9375  1.1  skrll   nop_count = get_text_align_nop_count (fill_size, use_no_density);
   9376  1.1  skrll   nop_buf = fragp->fr_literal + fragp->fr_fix;
   9377  1.1  skrll 
   9378  1.1  skrll   for (nop = 0; nop < nop_count; nop++)
   9379  1.1  skrll     {
   9380  1.1  skrll       int nop_size;
   9381  1.1  skrll       nop_size = get_text_align_nth_nop_size (fill_size, nop, use_no_density);
   9382  1.1  skrll 
   9383  1.1  skrll       assemble_nop (nop_size, nop_buf);
   9384  1.1  skrll       nop_buf += nop_size;
   9385  1.1  skrll     }
   9386  1.1  skrll 
   9387  1.1  skrll   fragp->fr_fix += fill_size;
   9388  1.1  skrll   fragp->fr_var -= fill_size;
   9389  1.1  skrll }
   9390  1.1  skrll 
   9391  1.1  skrll 
   9392  1.1  skrll static void
   9393  1.1  skrll convert_frag_narrow (segT segP, fragS *fragP, xtensa_format fmt, int slot)
   9394  1.1  skrll {
   9395  1.1  skrll   TInsn tinsn, single_target;
   9396  1.1  skrll   int size, old_size, diff;
   9397  1.1  skrll   offsetT frag_offset;
   9398  1.1  skrll 
   9399  1.1  skrll   assert (slot == 0);
   9400  1.1  skrll   tinsn_from_chars (&tinsn, fragP->fr_opcode, 0);
   9401  1.1  skrll 
   9402  1.1  skrll   if (fragP->tc_frag_data.is_aligning_branch == 1)
   9403  1.1  skrll     {
   9404  1.1  skrll       assert (fragP->tc_frag_data.text_expansion[0] == 1
   9405  1.1  skrll 	      || fragP->tc_frag_data.text_expansion[0] == 0);
   9406  1.1  skrll       convert_frag_immed (segP, fragP, fragP->tc_frag_data.text_expansion[0],
   9407  1.1  skrll 			  fmt, slot);
   9408  1.1  skrll       return;
   9409  1.1  skrll     }
   9410  1.1  skrll 
   9411  1.1  skrll   if (fragP->tc_frag_data.text_expansion[0] == 0)
   9412  1.1  skrll     {
   9413  1.1  skrll       /* No conversion.  */
   9414  1.1  skrll       fragP->fr_var = 0;
   9415  1.1  skrll       return;
   9416  1.1  skrll     }
   9417  1.1  skrll 
   9418  1.1  skrll   assert (fragP->fr_opcode != NULL);
   9419  1.1  skrll 
   9420  1.1  skrll   /* Frags in this relaxation state should only contain
   9421  1.1  skrll      single instruction bundles.  */
   9422  1.1  skrll   tinsn_immed_from_frag (&tinsn, fragP, 0);
   9423  1.1  skrll 
   9424  1.1  skrll   /* Just convert it to a wide form....  */
   9425  1.1  skrll   size = 0;
   9426  1.1  skrll   old_size = xg_get_single_size (tinsn.opcode);
   9427  1.1  skrll 
   9428  1.1  skrll   tinsn_init (&single_target);
   9429  1.1  skrll   frag_offset = fragP->fr_opcode - fragP->fr_literal;
   9430  1.1  skrll 
   9431  1.1  skrll   if (! xg_is_single_relaxable_insn (&tinsn, &single_target, FALSE))
   9432  1.1  skrll     {
   9433  1.1  skrll       as_bad (_("unable to widen instruction"));
   9434  1.1  skrll       return;
   9435  1.1  skrll     }
   9436  1.1  skrll 
   9437  1.1  skrll   size = xg_get_single_size (single_target.opcode);
   9438  1.1  skrll   xg_emit_insn_to_buf (&single_target, fragP->fr_opcode, fragP,
   9439  1.1  skrll 		       frag_offset, TRUE);
   9440  1.1  skrll 
   9441  1.1  skrll   diff = size - old_size;
   9442  1.1  skrll   assert (diff >= 0);
   9443  1.1  skrll   assert (diff <= fragP->fr_var);
   9444  1.1  skrll   fragP->fr_var -= diff;
   9445  1.1  skrll   fragP->fr_fix += diff;
   9446  1.1  skrll 
   9447  1.1  skrll   /* clean it up */
   9448  1.1  skrll   fragP->fr_var = 0;
   9449  1.1  skrll }
   9450  1.1  skrll 
   9451  1.1  skrll 
   9452  1.1  skrll static void
   9453  1.1  skrll convert_frag_fill_nop (fragS *fragP)
   9454  1.1  skrll {
   9455  1.1  skrll   char *loc = &fragP->fr_literal[fragP->fr_fix];
   9456  1.1  skrll   int size = fragP->tc_frag_data.text_expansion[0];
   9457  1.1  skrll   assert ((unsigned) size == (fragP->fr_next->fr_address
   9458  1.1  skrll 			      - fragP->fr_address - fragP->fr_fix));
   9459  1.1  skrll   if (size == 0)
   9460  1.1  skrll     {
   9461  1.1  skrll       /* No conversion.  */
   9462  1.1  skrll       fragP->fr_var = 0;
   9463  1.1  skrll       return;
   9464  1.1  skrll     }
   9465  1.1  skrll   assemble_nop (size, loc);
   9466  1.1  skrll   fragP->tc_frag_data.is_insn = TRUE;
   9467  1.1  skrll   fragP->fr_var -= size;
   9468  1.1  skrll   fragP->fr_fix += size;
   9469  1.1  skrll   frag_wane (fragP);
   9470  1.1  skrll }
   9471  1.1  skrll 
   9472  1.1  skrll 
   9473  1.1  skrll static fixS *fix_new_exp_in_seg
   9474  1.1  skrll   (segT, subsegT, fragS *, int, int, expressionS *, int,
   9475  1.1  skrll    bfd_reloc_code_real_type);
   9476  1.1  skrll static void convert_frag_immed_finish_loop (segT, fragS *, TInsn *);
   9477  1.1  skrll 
   9478  1.1  skrll static void
   9479  1.1  skrll convert_frag_immed (segT segP,
   9480  1.1  skrll 		    fragS *fragP,
   9481  1.1  skrll 		    int min_steps,
   9482  1.1  skrll 		    xtensa_format fmt,
   9483  1.1  skrll 		    int slot)
   9484  1.1  skrll {
   9485  1.1  skrll   char *immed_instr = fragP->fr_opcode;
   9486  1.1  skrll   TInsn orig_tinsn;
   9487  1.1  skrll   bfd_boolean expanded = FALSE;
   9488  1.1  skrll   bfd_boolean branch_jmp_to_next = FALSE;
   9489  1.1  skrll   char *fr_opcode = fragP->fr_opcode;
   9490  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   9491  1.1  skrll   bfd_boolean from_wide_insn = FALSE;
   9492  1.1  skrll   int bytes;
   9493  1.1  skrll   bfd_boolean is_loop;
   9494  1.1  skrll 
   9495  1.1  skrll   assert (fr_opcode != NULL);
   9496  1.1  skrll 
   9497  1.1  skrll   xg_clear_vinsn (&cur_vinsn);
   9498  1.1  skrll 
   9499  1.1  skrll   vinsn_from_chars (&cur_vinsn, fr_opcode);
   9500  1.1  skrll   if (cur_vinsn.num_slots > 1)
   9501  1.1  skrll     from_wide_insn = TRUE;
   9502  1.1  skrll 
   9503  1.1  skrll   orig_tinsn = cur_vinsn.slots[slot];
   9504  1.1  skrll   tinsn_immed_from_frag (&orig_tinsn, fragP, slot);
   9505  1.1  skrll 
   9506  1.1  skrll   is_loop = xtensa_opcode_is_loop (xtensa_default_isa, orig_tinsn.opcode) == 1;
   9507  1.1  skrll 
   9508  1.1  skrll   if (workaround_b_j_loop_end && ! fragP->tc_frag_data.is_no_transform)
   9509  1.1  skrll     branch_jmp_to_next = is_branch_jmp_to_next (&orig_tinsn, fragP);
   9510  1.1  skrll 
   9511  1.1  skrll   if (branch_jmp_to_next && !next_frag_is_loop_target (fragP))
   9512  1.1  skrll     {
   9513  1.1  skrll       /* Conversion just inserts a NOP and marks the fix as completed.  */
   9514  1.1  skrll       bytes = xtensa_format_length (isa, fmt);
   9515  1.1  skrll       if (bytes >= 4)
   9516  1.1  skrll 	{
   9517  1.1  skrll 	  cur_vinsn.slots[slot].opcode =
   9518  1.1  skrll 	    xtensa_format_slot_nop_opcode (isa, cur_vinsn.format, slot);
   9519  1.1  skrll 	  cur_vinsn.slots[slot].ntok = 0;
   9520  1.1  skrll 	}
   9521  1.1  skrll       else
   9522  1.1  skrll 	{
   9523  1.1  skrll 	  bytes += fragP->tc_frag_data.text_expansion[0];
   9524  1.1  skrll 	  assert (bytes == 2 || bytes == 3);
   9525  1.1  skrll 	  build_nop (&cur_vinsn.slots[0], bytes);
   9526  1.1  skrll 	  fragP->fr_fix += fragP->tc_frag_data.text_expansion[0];
   9527  1.1  skrll 	}
   9528  1.1  skrll       vinsn_to_insnbuf (&cur_vinsn, fr_opcode, frag_now, TRUE);
   9529  1.1  skrll       xtensa_insnbuf_to_chars
   9530  1.1  skrll 	(isa, cur_vinsn.insnbuf, (unsigned char *) fr_opcode, 0);
   9531  1.1  skrll       fragP->fr_var = 0;
   9532  1.1  skrll     }
   9533  1.1  skrll   else
   9534  1.1  skrll     {
   9535  1.1  skrll       /* Here is the fun stuff:  Get the immediate field from this
   9536  1.1  skrll 	 instruction.  If it fits, we're done.  If not, find the next
   9537  1.1  skrll 	 instruction sequence that fits.  */
   9538  1.1  skrll 
   9539  1.1  skrll       IStack istack;
   9540  1.1  skrll       int i;
   9541  1.1  skrll       symbolS *lit_sym = NULL;
   9542  1.1  skrll       int total_size = 0;
   9543  1.1  skrll       int target_offset = 0;
   9544  1.1  skrll       int old_size;
   9545  1.1  skrll       int diff;
   9546  1.1  skrll       symbolS *gen_label = NULL;
   9547  1.1  skrll       offsetT frag_offset;
   9548  1.1  skrll       bfd_boolean first = TRUE;
   9549  1.1  skrll       bfd_boolean last_is_jump;
   9550  1.1  skrll 
   9551  1.1  skrll       /* It does not fit.  Find something that does and
   9552  1.1  skrll          convert immediately.  */
   9553  1.1  skrll       frag_offset = fr_opcode - fragP->fr_literal;
   9554  1.1  skrll       istack_init (&istack);
   9555  1.1  skrll       xg_assembly_relax (&istack, &orig_tinsn,
   9556  1.1  skrll 			 segP, fragP, frag_offset, min_steps, 0);
   9557  1.1  skrll 
   9558  1.1  skrll       old_size = xtensa_format_length (isa, fmt);
   9559  1.1  skrll 
   9560  1.1  skrll       /* Assemble this right inline.  */
   9561  1.1  skrll 
   9562  1.1  skrll       /* First, create the mapping from a label name to the REAL label.  */
   9563  1.1  skrll       target_offset = 0;
   9564  1.1  skrll       for (i = 0; i < istack.ninsn; i++)
   9565  1.1  skrll 	{
   9566  1.1  skrll 	  TInsn *tinsn = &istack.insn[i];
   9567  1.1  skrll 	  fragS *lit_frag;
   9568  1.1  skrll 
   9569  1.1  skrll 	  switch (tinsn->insn_type)
   9570  1.1  skrll 	    {
   9571  1.1  skrll 	    case ITYPE_LITERAL:
   9572  1.1  skrll 	      if (lit_sym != NULL)
   9573  1.1  skrll 		as_bad (_("multiple literals in expansion"));
   9574  1.1  skrll 	      /* First find the appropriate space in the literal pool.  */
   9575  1.1  skrll 	      lit_frag = fragP->tc_frag_data.literal_frags[slot];
   9576  1.1  skrll 	      if (lit_frag == NULL)
   9577  1.1  skrll 		as_bad (_("no registered fragment for literal"));
   9578  1.1  skrll 	      if (tinsn->ntok != 1)
   9579  1.1  skrll 		as_bad (_("number of literal tokens != 1"));
   9580  1.1  skrll 
   9581  1.1  skrll 	      /* Set the literal symbol and add a fixup.  */
   9582  1.1  skrll 	      lit_sym = lit_frag->fr_symbol;
   9583  1.1  skrll 	      break;
   9584  1.1  skrll 
   9585  1.1  skrll 	    case ITYPE_LABEL:
   9586  1.1  skrll 	      if (align_targets && !is_loop)
   9587  1.1  skrll 		{
   9588  1.1  skrll 		  fragS *unreach = fragP->fr_next;
   9589  1.1  skrll 		  while (!(unreach->fr_type == rs_machine_dependent
   9590  1.1  skrll 			   && (unreach->fr_subtype == RELAX_MAYBE_UNREACHABLE
   9591  1.1  skrll 			       || unreach->fr_subtype == RELAX_UNREACHABLE)))
   9592  1.1  skrll 		    {
   9593  1.1  skrll 		      unreach = unreach->fr_next;
   9594  1.1  skrll 		    }
   9595  1.1  skrll 
   9596  1.1  skrll 		  assert (unreach->fr_type == rs_machine_dependent
   9597  1.1  skrll 			  && (unreach->fr_subtype == RELAX_MAYBE_UNREACHABLE
   9598  1.1  skrll 			      || unreach->fr_subtype == RELAX_UNREACHABLE));
   9599  1.1  skrll 
   9600  1.1  skrll 		  target_offset += unreach->tc_frag_data.text_expansion[0];
   9601  1.1  skrll 		}
   9602  1.1  skrll 	      assert (gen_label == NULL);
   9603  1.1  skrll 	      gen_label = symbol_new (FAKE_LABEL_NAME, now_seg,
   9604  1.1  skrll 				      fr_opcode - fragP->fr_literal
   9605  1.1  skrll 				      + target_offset, fragP);
   9606  1.1  skrll 	      break;
   9607  1.1  skrll 
   9608  1.1  skrll 	    case ITYPE_INSN:
   9609  1.1  skrll 	      if (first && from_wide_insn)
   9610  1.1  skrll 		{
   9611  1.1  skrll 		  target_offset += xtensa_format_length (isa, fmt);
   9612  1.1  skrll 		  first = FALSE;
   9613  1.1  skrll 		  if (!opcode_fits_format_slot (tinsn->opcode, fmt, slot))
   9614  1.1  skrll 		    target_offset += xg_get_single_size (tinsn->opcode);
   9615  1.1  skrll 		}
   9616  1.1  skrll 	      else
   9617  1.1  skrll 		target_offset += xg_get_single_size (tinsn->opcode);
   9618  1.1  skrll 	      break;
   9619  1.1  skrll 	    }
   9620  1.1  skrll 	}
   9621  1.1  skrll 
   9622  1.1  skrll       total_size = 0;
   9623  1.1  skrll       first = TRUE;
   9624  1.1  skrll       last_is_jump = FALSE;
   9625  1.1  skrll       for (i = 0; i < istack.ninsn; i++)
   9626  1.1  skrll 	{
   9627  1.1  skrll 	  TInsn *tinsn = &istack.insn[i];
   9628  1.1  skrll 	  fragS *lit_frag;
   9629  1.1  skrll 	  int size;
   9630  1.1  skrll 	  segT target_seg;
   9631  1.1  skrll 	  bfd_reloc_code_real_type reloc_type;
   9632  1.1  skrll 
   9633  1.1  skrll 	  switch (tinsn->insn_type)
   9634  1.1  skrll 	    {
   9635  1.1  skrll 	    case ITYPE_LITERAL:
   9636  1.1  skrll 	      lit_frag = fragP->tc_frag_data.literal_frags[slot];
   9637  1.1  skrll 	      /* Already checked.  */
   9638  1.1  skrll 	      assert (lit_frag != NULL);
   9639  1.1  skrll 	      assert (lit_sym != NULL);
   9640  1.1  skrll 	      assert (tinsn->ntok == 1);
   9641  1.1  skrll 	      /* Add a fixup.  */
   9642  1.1  skrll 	      target_seg = S_GET_SEGMENT (lit_sym);
   9643  1.1  skrll 	      assert (target_seg);
   9644  1.1  skrll 	      reloc_type = map_operator_to_reloc (tinsn->tok[0].X_op, TRUE);
   9645  1.1  skrll 	      fix_new_exp_in_seg (target_seg, 0, lit_frag, 0, 4,
   9646  1.1  skrll 				  &tinsn->tok[0], FALSE, reloc_type);
   9647  1.1  skrll 	      break;
   9648  1.1  skrll 
   9649  1.1  skrll 	    case ITYPE_LABEL:
   9650  1.1  skrll 	      break;
   9651  1.1  skrll 
   9652  1.1  skrll 	    case ITYPE_INSN:
   9653  1.1  skrll 	      xg_resolve_labels (tinsn, gen_label);
   9654  1.1  skrll 	      xg_resolve_literals (tinsn, lit_sym);
   9655  1.1  skrll 	      if (from_wide_insn && first)
   9656  1.1  skrll 		{
   9657  1.1  skrll 		  first = FALSE;
   9658  1.1  skrll 		  if (opcode_fits_format_slot (tinsn->opcode, fmt, slot))
   9659  1.1  skrll 		    {
   9660  1.1  skrll 		      cur_vinsn.slots[slot] = *tinsn;
   9661  1.1  skrll 		    }
   9662  1.1  skrll 		  else
   9663  1.1  skrll 		    {
   9664  1.1  skrll 		      cur_vinsn.slots[slot].opcode =
   9665  1.1  skrll 			xtensa_format_slot_nop_opcode (isa, fmt, slot);
   9666  1.1  skrll 		      cur_vinsn.slots[slot].ntok = 0;
   9667  1.1  skrll 		    }
   9668  1.1  skrll 		  vinsn_to_insnbuf (&cur_vinsn, immed_instr, fragP, TRUE);
   9669  1.1  skrll 		  xtensa_insnbuf_to_chars (isa, cur_vinsn.insnbuf,
   9670  1.1  skrll 					   (unsigned char *) immed_instr, 0);
   9671  1.1  skrll 		  fragP->tc_frag_data.is_insn = TRUE;
   9672  1.1  skrll 		  size = xtensa_format_length (isa, fmt);
   9673  1.1  skrll 		  if (!opcode_fits_format_slot (tinsn->opcode, fmt, slot))
   9674  1.1  skrll 		    {
   9675  1.1  skrll 		      xg_emit_insn_to_buf
   9676  1.1  skrll 			(tinsn, immed_instr + size, fragP,
   9677  1.1  skrll 			 immed_instr - fragP->fr_literal + size, TRUE);
   9678  1.1  skrll 		      size += xg_get_single_size (tinsn->opcode);
   9679  1.1  skrll 		    }
   9680  1.1  skrll 		}
   9681  1.1  skrll 	      else
   9682  1.1  skrll 		{
   9683  1.1  skrll 		  size = xg_get_single_size (tinsn->opcode);
   9684  1.1  skrll 		  xg_emit_insn_to_buf (tinsn, immed_instr, fragP,
   9685  1.1  skrll 				       immed_instr - fragP->fr_literal, TRUE);
   9686  1.1  skrll 		}
   9687  1.1  skrll 	      immed_instr += size;
   9688  1.1  skrll 	      total_size += size;
   9689  1.1  skrll 	      break;
   9690  1.1  skrll 	    }
   9691  1.1  skrll 	}
   9692  1.1  skrll 
   9693  1.1  skrll       diff = total_size - old_size;
   9694  1.1  skrll       assert (diff >= 0);
   9695  1.1  skrll       if (diff != 0)
   9696  1.1  skrll 	expanded = TRUE;
   9697  1.1  skrll       assert (diff <= fragP->fr_var);
   9698  1.1  skrll       fragP->fr_var -= diff;
   9699  1.1  skrll       fragP->fr_fix += diff;
   9700  1.1  skrll     }
   9701  1.1  skrll 
   9702  1.1  skrll   /* Check for undefined immediates in LOOP instructions.  */
   9703  1.1  skrll   if (is_loop)
   9704  1.1  skrll     {
   9705  1.1  skrll       symbolS *sym;
   9706  1.1  skrll       sym = orig_tinsn.tok[1].X_add_symbol;
   9707  1.1  skrll       if (sym != NULL && !S_IS_DEFINED (sym))
   9708  1.1  skrll 	{
   9709  1.1  skrll 	  as_bad (_("unresolved loop target symbol: %s"), S_GET_NAME (sym));
   9710  1.1  skrll 	  return;
   9711  1.1  skrll 	}
   9712  1.1  skrll       sym = orig_tinsn.tok[1].X_op_symbol;
   9713  1.1  skrll       if (sym != NULL && !S_IS_DEFINED (sym))
   9714  1.1  skrll 	{
   9715  1.1  skrll 	  as_bad (_("unresolved loop target symbol: %s"), S_GET_NAME (sym));
   9716  1.1  skrll 	  return;
   9717  1.1  skrll 	}
   9718  1.1  skrll     }
   9719  1.1  skrll 
   9720  1.1  skrll   if (expanded && xtensa_opcode_is_loop (isa, orig_tinsn.opcode) == 1)
   9721  1.1  skrll     convert_frag_immed_finish_loop (segP, fragP, &orig_tinsn);
   9722  1.1  skrll 
   9723  1.1  skrll   if (expanded && is_direct_call_opcode (orig_tinsn.opcode))
   9724  1.1  skrll     {
   9725  1.1  skrll       /* Add an expansion note on the expanded instruction.  */
   9726  1.1  skrll       fix_new_exp_in_seg (now_seg, 0, fragP, fr_opcode - fragP->fr_literal, 4,
   9727  1.1  skrll 			  &orig_tinsn.tok[0], TRUE,
   9728  1.1  skrll 			  BFD_RELOC_XTENSA_ASM_EXPAND);
   9729  1.1  skrll     }
   9730  1.1  skrll }
   9731  1.1  skrll 
   9732  1.1  skrll 
   9733  1.1  skrll /* Add a new fix expression into the desired segment.  We have to
   9734  1.1  skrll    switch to that segment to do this.  */
   9735  1.1  skrll 
   9736  1.1  skrll static fixS *
   9737  1.1  skrll fix_new_exp_in_seg (segT new_seg,
   9738  1.1  skrll 		    subsegT new_subseg,
   9739  1.1  skrll 		    fragS *frag,
   9740  1.1  skrll 		    int where,
   9741  1.1  skrll 		    int size,
   9742  1.1  skrll 		    expressionS *exp,
   9743  1.1  skrll 		    int pcrel,
   9744  1.1  skrll 		    bfd_reloc_code_real_type r_type)
   9745  1.1  skrll {
   9746  1.1  skrll   fixS *new_fix;
   9747  1.1  skrll   segT seg = now_seg;
   9748  1.1  skrll   subsegT subseg = now_subseg;
   9749  1.1  skrll 
   9750  1.1  skrll   assert (new_seg != 0);
   9751  1.1  skrll   subseg_set (new_seg, new_subseg);
   9752  1.1  skrll 
   9753  1.1  skrll   new_fix = fix_new_exp (frag, where, size, exp, pcrel, r_type);
   9754  1.1  skrll   subseg_set (seg, subseg);
   9755  1.1  skrll   return new_fix;
   9756  1.1  skrll }
   9757  1.1  skrll 
   9758  1.1  skrll 
   9759  1.1  skrll /* Relax a loop instruction so that it can span loop >256 bytes.
   9760  1.1  skrll 
   9761  1.1  skrll                   loop    as, .L1
   9762  1.1  skrll           .L0:
   9763  1.1  skrll                   rsr     as, LEND
   9764  1.1  skrll                   wsr     as, LBEG
   9765  1.1  skrll                   addi    as, as, lo8 (label-.L1)
   9766  1.1  skrll                   addmi   as, as, mid8 (label-.L1)
   9767  1.1  skrll                   wsr     as, LEND
   9768  1.1  skrll                   isync
   9769  1.1  skrll                   rsr     as, LCOUNT
   9770  1.1  skrll                   addi    as, as, 1
   9771  1.1  skrll           .L1:
   9772  1.1  skrll                   <<body>>
   9773  1.1  skrll           label:
   9774  1.1  skrll */
   9775  1.1  skrll 
   9776  1.1  skrll static void
   9777  1.1  skrll convert_frag_immed_finish_loop (segT segP, fragS *fragP, TInsn *tinsn)
   9778  1.1  skrll {
   9779  1.1  skrll   TInsn loop_insn;
   9780  1.1  skrll   TInsn addi_insn;
   9781  1.1  skrll   TInsn addmi_insn;
   9782  1.1  skrll   unsigned long target;
   9783  1.1  skrll   static xtensa_insnbuf insnbuf = NULL;
   9784  1.1  skrll   unsigned int loop_length, loop_length_hi, loop_length_lo;
   9785  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   9786  1.1  skrll   addressT loop_offset;
   9787  1.1  skrll   addressT addi_offset = 9;
   9788  1.1  skrll   addressT addmi_offset = 12;
   9789  1.1  skrll   fragS *next_fragP;
   9790  1.1  skrll   int target_count;
   9791  1.1  skrll 
   9792  1.1  skrll   if (!insnbuf)
   9793  1.1  skrll     insnbuf = xtensa_insnbuf_alloc (isa);
   9794  1.1  skrll 
   9795  1.1  skrll   /* Get the loop offset.  */
   9796  1.1  skrll   loop_offset = get_expanded_loop_offset (tinsn->opcode);
   9797  1.1  skrll 
   9798  1.1  skrll   /* Validate that there really is a LOOP at the loop_offset.  Because
   9799  1.1  skrll      loops are not bundleable, we can assume that the instruction will be
   9800  1.1  skrll      in slot 0.  */
   9801  1.1  skrll   tinsn_from_chars (&loop_insn, fragP->fr_opcode + loop_offset, 0);
   9802  1.1  skrll   tinsn_immed_from_frag (&loop_insn, fragP, 0);
   9803  1.1  skrll 
   9804  1.1  skrll   assert (xtensa_opcode_is_loop (isa, loop_insn.opcode) == 1);
   9805  1.1  skrll   addi_offset += loop_offset;
   9806  1.1  skrll   addmi_offset += loop_offset;
   9807  1.1  skrll 
   9808  1.1  skrll   assert (tinsn->ntok == 2);
   9809  1.1  skrll   if (tinsn->tok[1].X_op == O_constant)
   9810  1.1  skrll     target = tinsn->tok[1].X_add_number;
   9811  1.1  skrll   else if (tinsn->tok[1].X_op == O_symbol)
   9812  1.1  skrll     {
   9813  1.1  skrll       /* Find the fragment.  */
   9814  1.1  skrll       symbolS *sym = tinsn->tok[1].X_add_symbol;
   9815  1.1  skrll       assert (S_GET_SEGMENT (sym) == segP
   9816  1.1  skrll 	      || S_GET_SEGMENT (sym) == absolute_section);
   9817  1.1  skrll       target = (S_GET_VALUE (sym) + tinsn->tok[1].X_add_number);
   9818  1.1  skrll     }
   9819  1.1  skrll   else
   9820  1.1  skrll     {
   9821  1.1  skrll       as_bad (_("invalid expression evaluation type %d"), tinsn->tok[1].X_op);
   9822  1.1  skrll       target = 0;
   9823  1.1  skrll     }
   9824  1.1  skrll 
   9825  1.1  skrll   loop_length = target - (fragP->fr_address + fragP->fr_fix);
   9826  1.1  skrll   loop_length_hi = loop_length & ~0x0ff;
   9827  1.1  skrll   loop_length_lo = loop_length & 0x0ff;
   9828  1.1  skrll   if (loop_length_lo >= 128)
   9829  1.1  skrll     {
   9830  1.1  skrll       loop_length_lo -= 256;
   9831  1.1  skrll       loop_length_hi += 256;
   9832  1.1  skrll     }
   9833  1.1  skrll 
   9834  1.1  skrll   /* Because addmi sign-extends the immediate, 'loop_length_hi' can be at most
   9835  1.1  skrll      32512.  If the loop is larger than that, then we just fail.  */
   9836  1.1  skrll   if (loop_length_hi > 32512)
   9837  1.1  skrll     as_bad_where (fragP->fr_file, fragP->fr_line,
   9838  1.1  skrll 		  _("loop too long for LOOP instruction"));
   9839  1.1  skrll 
   9840  1.1  skrll   tinsn_from_chars (&addi_insn, fragP->fr_opcode + addi_offset, 0);
   9841  1.1  skrll   assert (addi_insn.opcode == xtensa_addi_opcode);
   9842  1.1  skrll 
   9843  1.1  skrll   tinsn_from_chars (&addmi_insn, fragP->fr_opcode + addmi_offset, 0);
   9844  1.1  skrll   assert (addmi_insn.opcode == xtensa_addmi_opcode);
   9845  1.1  skrll 
   9846  1.1  skrll   set_expr_const (&addi_insn.tok[2], loop_length_lo);
   9847  1.1  skrll   tinsn_to_insnbuf (&addi_insn, insnbuf);
   9848  1.1  skrll 
   9849  1.1  skrll   fragP->tc_frag_data.is_insn = TRUE;
   9850  1.1  skrll   xtensa_insnbuf_to_chars
   9851  1.1  skrll     (isa, insnbuf, (unsigned char *) fragP->fr_opcode + addi_offset, 0);
   9852  1.1  skrll 
   9853  1.1  skrll   set_expr_const (&addmi_insn.tok[2], loop_length_hi);
   9854  1.1  skrll   tinsn_to_insnbuf (&addmi_insn, insnbuf);
   9855  1.1  skrll   xtensa_insnbuf_to_chars
   9856  1.1  skrll     (isa, insnbuf, (unsigned char *) fragP->fr_opcode + addmi_offset, 0);
   9857  1.1  skrll 
   9858  1.1  skrll   /* Walk through all of the frags from here to the loop end
   9859  1.1  skrll      and mark them as no_transform to keep them from being modified
   9860  1.1  skrll      by the linker.  If we ever have a relocation for the
   9861  1.1  skrll      addi/addmi of the difference of two symbols we can remove this.  */
   9862  1.1  skrll 
   9863  1.1  skrll   target_count = 0;
   9864  1.1  skrll   for (next_fragP = fragP; next_fragP != NULL;
   9865  1.1  skrll        next_fragP = next_fragP->fr_next)
   9866  1.1  skrll     {
   9867  1.1  skrll       next_fragP->tc_frag_data.is_no_transform = TRUE;
   9868  1.1  skrll       if (next_fragP->tc_frag_data.is_loop_target)
   9869  1.1  skrll 	target_count++;
   9870  1.1  skrll       if (target_count == 2)
   9871  1.1  skrll 	break;
   9872  1.1  skrll     }
   9873  1.1  skrll }
   9874  1.1  skrll 
   9875  1.1  skrll 
   9876  1.1  skrll /* A map that keeps information on a per-subsegment basis.  This is
   9878  1.1  skrll    maintained during initial assembly, but is invalid once the
   9879  1.1  skrll    subsegments are smashed together.  I.E., it cannot be used during
   9880  1.1  skrll    the relaxation.  */
   9881  1.1  skrll 
   9882  1.1  skrll typedef struct subseg_map_struct
   9883  1.1  skrll {
   9884  1.1  skrll   /* the key */
   9885  1.1  skrll   segT seg;
   9886  1.1  skrll   subsegT subseg;
   9887  1.1  skrll 
   9888  1.1  skrll   /* the data */
   9889  1.1  skrll   unsigned flags;
   9890  1.1  skrll   float total_freq;	/* fall-through + branch target frequency */
   9891  1.1  skrll   float target_freq;	/* branch target frequency alone */
   9892  1.1  skrll 
   9893  1.1  skrll   struct subseg_map_struct *next;
   9894  1.1  skrll } subseg_map;
   9895  1.1  skrll 
   9896  1.1  skrll 
   9897  1.1  skrll static subseg_map *sseg_map = NULL;
   9898  1.1  skrll 
   9899  1.1  skrll static subseg_map *
   9900  1.1  skrll get_subseg_info (segT seg, subsegT subseg)
   9901  1.1  skrll {
   9902  1.1  skrll   subseg_map *subseg_e;
   9903  1.1  skrll 
   9904  1.1  skrll   for (subseg_e = sseg_map; subseg_e; subseg_e = subseg_e->next)
   9905  1.1  skrll     {
   9906  1.1  skrll       if (seg == subseg_e->seg && subseg == subseg_e->subseg)
   9907  1.1  skrll 	break;
   9908  1.1  skrll     }
   9909  1.1  skrll   return subseg_e;
   9910  1.1  skrll }
   9911  1.1  skrll 
   9912  1.1  skrll 
   9913  1.1  skrll static subseg_map *
   9914  1.1  skrll add_subseg_info (segT seg, subsegT subseg)
   9915  1.1  skrll {
   9916  1.1  skrll   subseg_map *subseg_e = (subseg_map *) xmalloc (sizeof (subseg_map));
   9917  1.1  skrll   memset (subseg_e, 0, sizeof (subseg_map));
   9918  1.1  skrll   subseg_e->seg = seg;
   9919  1.1  skrll   subseg_e->subseg = subseg;
   9920  1.1  skrll   subseg_e->flags = 0;
   9921  1.1  skrll   /* Start off considering every branch target very important.  */
   9922  1.1  skrll   subseg_e->target_freq = 1.0;
   9923  1.1  skrll   subseg_e->total_freq = 1.0;
   9924  1.1  skrll   subseg_e->next = sseg_map;
   9925  1.1  skrll   sseg_map = subseg_e;
   9926  1.1  skrll   return subseg_e;
   9927  1.1  skrll }
   9928  1.1  skrll 
   9929  1.1  skrll 
   9930  1.1  skrll static unsigned
   9931  1.1  skrll get_last_insn_flags (segT seg, subsegT subseg)
   9932  1.1  skrll {
   9933  1.1  skrll   subseg_map *subseg_e = get_subseg_info (seg, subseg);
   9934  1.1  skrll   if (subseg_e)
   9935  1.1  skrll     return subseg_e->flags;
   9936  1.1  skrll   return 0;
   9937  1.1  skrll }
   9938  1.1  skrll 
   9939  1.1  skrll 
   9940  1.1  skrll static void
   9941  1.1  skrll set_last_insn_flags (segT seg,
   9942  1.1  skrll 		     subsegT subseg,
   9943  1.1  skrll 		     unsigned fl,
   9944  1.1  skrll 		     bfd_boolean val)
   9945  1.1  skrll {
   9946  1.1  skrll   subseg_map *subseg_e = get_subseg_info (seg, subseg);
   9947  1.1  skrll   if (! subseg_e)
   9948  1.1  skrll     subseg_e = add_subseg_info (seg, subseg);
   9949  1.1  skrll   if (val)
   9950  1.1  skrll     subseg_e->flags |= fl;
   9951  1.1  skrll   else
   9952  1.1  skrll     subseg_e->flags &= ~fl;
   9953  1.1  skrll }
   9954  1.1  skrll 
   9955  1.1  skrll 
   9956  1.1  skrll static float
   9957  1.1  skrll get_subseg_total_freq (segT seg, subsegT subseg)
   9958  1.1  skrll {
   9959  1.1  skrll   subseg_map *subseg_e = get_subseg_info (seg, subseg);
   9960  1.1  skrll   if (subseg_e)
   9961  1.1  skrll     return subseg_e->total_freq;
   9962  1.1  skrll   return 1.0;
   9963  1.1  skrll }
   9964  1.1  skrll 
   9965  1.1  skrll 
   9966  1.1  skrll static float
   9967  1.1  skrll get_subseg_target_freq (segT seg, subsegT subseg)
   9968  1.1  skrll {
   9969  1.1  skrll   subseg_map *subseg_e = get_subseg_info (seg, subseg);
   9970  1.1  skrll   if (subseg_e)
   9971  1.1  skrll     return subseg_e->target_freq;
   9972  1.1  skrll   return 1.0;
   9973  1.1  skrll }
   9974  1.1  skrll 
   9975  1.1  skrll 
   9976  1.1  skrll static void
   9977  1.1  skrll set_subseg_freq (segT seg, subsegT subseg, float total_f, float target_f)
   9978  1.1  skrll {
   9979  1.1  skrll   subseg_map *subseg_e = get_subseg_info (seg, subseg);
   9980  1.1  skrll   if (! subseg_e)
   9981  1.1  skrll     subseg_e = add_subseg_info (seg, subseg);
   9982  1.1  skrll   subseg_e->total_freq = total_f;
   9983  1.1  skrll   subseg_e->target_freq = target_f;
   9984  1.1  skrll }
   9985  1.1  skrll 
   9986  1.1  skrll 
   9987  1.1  skrll /* Segment Lists and emit_state Stuff.  */
   9989  1.1  skrll 
   9990  1.1  skrll static void
   9991  1.1  skrll xtensa_move_seg_list_to_beginning (seg_list *head)
   9992  1.1  skrll {
   9993  1.1  skrll   head = head->next;
   9994  1.1  skrll   while (head)
   9995  1.1  skrll     {
   9996  1.1  skrll       segT literal_section = head->seg;
   9997  1.1  skrll 
   9998  1.1  skrll       /* Move the literal section to the front of the section list.  */
   9999  1.1  skrll       assert (literal_section);
   10000  1.1  skrll       if (literal_section != stdoutput->sections)
   10001  1.1  skrll 	{
   10002  1.1  skrll 	  bfd_section_list_remove (stdoutput, literal_section);
   10003  1.1  skrll 	  bfd_section_list_prepend (stdoutput, literal_section);
   10004  1.1  skrll 	}
   10005  1.1  skrll       head = head->next;
   10006  1.1  skrll     }
   10007  1.1  skrll }
   10008  1.1  skrll 
   10009  1.1  skrll 
   10010  1.1  skrll static void mark_literal_frags (seg_list *);
   10011  1.1  skrll 
   10012  1.1  skrll static void
   10013  1.1  skrll xtensa_move_literals (void)
   10014  1.1  skrll {
   10015  1.1  skrll   seg_list *segment;
   10016  1.1  skrll   frchainS *frchain_from, *frchain_to;
   10017  1.1  skrll   fragS *search_frag, *next_frag, *last_frag, *literal_pool, *insert_after;
   10018  1.1  skrll   fragS **frag_splice;
   10019  1.1  skrll   emit_state state;
   10020  1.1  skrll   segT dest_seg;
   10021  1.1  skrll   fixS *fix, *next_fix, **fix_splice;
   10022  1.1  skrll   sym_list *lit;
   10023  1.1  skrll 
   10024  1.1  skrll   mark_literal_frags (literal_head->next);
   10025  1.1  skrll 
   10026  1.1  skrll   if (use_literal_section)
   10027  1.1  skrll     return;
   10028  1.1  skrll 
   10029  1.1  skrll   for (segment = literal_head->next; segment; segment = segment->next)
   10030  1.1  skrll     {
   10031  1.1  skrll       /* Keep the literals for .init and .fini in separate sections.  */
   10032  1.1  skrll       if (!strcmp (segment_name (segment->seg), INIT_SECTION_NAME)
   10033  1.1  skrll 	  || !strcmp (segment_name (segment->seg), FINI_SECTION_NAME))
   10034  1.1  skrll 	continue;
   10035  1.1  skrll 
   10036  1.1  skrll       frchain_from = seg_info (segment->seg)->frchainP;
   10037  1.1  skrll       search_frag = frchain_from->frch_root;
   10038  1.1  skrll       literal_pool = NULL;
   10039  1.1  skrll       frchain_to = NULL;
   10040  1.1  skrll       frag_splice = &(frchain_from->frch_root);
   10041  1.1  skrll 
   10042  1.1  skrll       while (!search_frag->tc_frag_data.literal_frag)
   10043  1.1  skrll 	{
   10044  1.1  skrll 	  assert (search_frag->fr_fix == 0
   10045  1.1  skrll 		  || search_frag->fr_type == rs_align);
   10046  1.1  skrll 	  search_frag = search_frag->fr_next;
   10047  1.1  skrll 	}
   10048  1.1  skrll 
   10049  1.1  skrll       assert (search_frag->tc_frag_data.literal_frag->fr_subtype
   10050  1.1  skrll 	      == RELAX_LITERAL_POOL_BEGIN);
   10051  1.1  skrll       xtensa_switch_section_emit_state (&state, segment->seg, 0);
   10052  1.1  skrll 
   10053  1.1  skrll       /* Make sure that all the frags in this series are closed, and
   10054  1.1  skrll 	 that there is at least one left over of zero-size.  This
   10055  1.1  skrll 	 prevents us from making a segment with an frchain without any
   10056  1.1  skrll 	 frags in it.  */
   10057  1.1  skrll       frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
   10058  1.1  skrll       xtensa_set_frag_assembly_state (frag_now);
   10059  1.1  skrll       last_frag = frag_now;
   10060  1.1  skrll       frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
   10061  1.1  skrll       xtensa_set_frag_assembly_state (frag_now);
   10062  1.1  skrll 
   10063  1.1  skrll       while (search_frag != frag_now)
   10064  1.1  skrll 	{
   10065  1.1  skrll 	  next_frag = search_frag->fr_next;
   10066  1.1  skrll 
   10067  1.1  skrll 	  /* First, move the frag out of the literal section and
   10068  1.1  skrll 	     to the appropriate place.  */
   10069  1.1  skrll 	  if (search_frag->tc_frag_data.literal_frag)
   10070  1.1  skrll 	    {
   10071  1.1  skrll 	      literal_pool = search_frag->tc_frag_data.literal_frag;
   10072  1.1  skrll 	      assert (literal_pool->fr_subtype == RELAX_LITERAL_POOL_BEGIN);
   10073  1.1  skrll 	      frchain_to = literal_pool->tc_frag_data.lit_frchain;
   10074  1.1  skrll 	      assert (frchain_to);
   10075  1.1  skrll 	    }
   10076  1.1  skrll 	  insert_after = literal_pool->tc_frag_data.literal_frag;
   10077  1.1  skrll 	  dest_seg = insert_after->fr_next->tc_frag_data.lit_seg;
   10078  1.1  skrll 
   10079  1.1  skrll 	  *frag_splice = next_frag;
   10080  1.1  skrll 	  search_frag->fr_next = insert_after->fr_next;
   10081  1.1  skrll 	  insert_after->fr_next = search_frag;
   10082  1.1  skrll 	  search_frag->tc_frag_data.lit_seg = dest_seg;
   10083  1.1  skrll 	  literal_pool->tc_frag_data.literal_frag = search_frag;
   10084  1.1  skrll 
   10085  1.1  skrll 	  /* Now move any fixups associated with this frag to the
   10086  1.1  skrll 	     right section.  */
   10087  1.1  skrll 	  fix = frchain_from->fix_root;
   10088  1.1  skrll 	  fix_splice = &(frchain_from->fix_root);
   10089  1.1  skrll 	  while (fix)
   10090  1.1  skrll 	    {
   10091  1.1  skrll 	      next_fix = fix->fx_next;
   10092  1.1  skrll 	      if (fix->fx_frag == search_frag)
   10093  1.1  skrll 		{
   10094  1.1  skrll 		  *fix_splice = next_fix;
   10095  1.1  skrll 		  fix->fx_next = frchain_to->fix_root;
   10096  1.1  skrll 		  frchain_to->fix_root = fix;
   10097  1.1  skrll 		  if (frchain_to->fix_tail == NULL)
   10098  1.1  skrll 		    frchain_to->fix_tail = fix;
   10099  1.1  skrll 		}
   10100  1.1  skrll 	      else
   10101  1.1  skrll 		fix_splice = &(fix->fx_next);
   10102  1.1  skrll 	      fix = next_fix;
   10103  1.1  skrll 	    }
   10104  1.1  skrll 	  search_frag = next_frag;
   10105  1.1  skrll 	}
   10106  1.1  skrll 
   10107  1.1  skrll       if (frchain_from->fix_root != NULL)
   10108  1.1  skrll 	{
   10109  1.1  skrll 	  frchain_from = seg_info (segment->seg)->frchainP;
   10110  1.1  skrll 	  as_warn (_("fixes not all moved from %s"), segment->seg->name);
   10111  1.1  skrll 
   10112  1.1  skrll 	  assert (frchain_from->fix_root == NULL);
   10113  1.1  skrll 	}
   10114  1.1  skrll       frchain_from->fix_tail = NULL;
   10115  1.1  skrll       xtensa_restore_emit_state (&state);
   10116  1.1  skrll     }
   10117  1.1  skrll 
   10118  1.1  skrll   /* Now fix up the SEGMENT value for all the literal symbols.  */
   10119  1.1  skrll   for (lit = literal_syms; lit; lit = lit->next)
   10120  1.1  skrll     {
   10121  1.1  skrll       symbolS *lit_sym = lit->sym;
   10122  1.1  skrll       segT dest_seg = symbol_get_frag (lit_sym)->tc_frag_data.lit_seg;
   10123  1.1  skrll       if (dest_seg)
   10124  1.1  skrll 	S_SET_SEGMENT (lit_sym, dest_seg);
   10125  1.1  skrll     }
   10126  1.1  skrll }
   10127  1.1  skrll 
   10128  1.1  skrll 
   10129  1.1  skrll /* Walk over all the frags for segments in a list and mark them as
   10130  1.1  skrll    containing literals.  As clunky as this is, we can't rely on frag_var
   10131  1.1  skrll    and frag_variant to get called in all situations.  */
   10132  1.1  skrll 
   10133  1.1  skrll static void
   10134  1.1  skrll mark_literal_frags (seg_list *segment)
   10135  1.1  skrll {
   10136  1.1  skrll   frchainS *frchain_from;
   10137  1.1  skrll   fragS *search_frag;
   10138  1.1  skrll 
   10139  1.1  skrll   while (segment)
   10140  1.1  skrll     {
   10141  1.1  skrll       frchain_from = seg_info (segment->seg)->frchainP;
   10142  1.1  skrll       search_frag = frchain_from->frch_root;
   10143  1.1  skrll       while (search_frag)
   10144  1.1  skrll 	{
   10145  1.1  skrll 	  search_frag->tc_frag_data.is_literal = TRUE;
   10146  1.1  skrll 	  search_frag = search_frag->fr_next;
   10147  1.1  skrll 	}
   10148  1.1  skrll       segment = segment->next;
   10149  1.1  skrll     }
   10150  1.1  skrll }
   10151  1.1  skrll 
   10152  1.1  skrll 
   10153  1.1  skrll static void
   10154  1.1  skrll xtensa_reorder_seg_list (seg_list *head, segT after)
   10155  1.1  skrll {
   10156  1.1  skrll   /* Move all of the sections in the section list to come
   10157  1.1  skrll      after "after" in the gnu segment list.  */
   10158  1.1  skrll 
   10159  1.1  skrll   head = head->next;
   10160  1.1  skrll   while (head)
   10161  1.1  skrll     {
   10162  1.1  skrll       segT literal_section = head->seg;
   10163  1.1  skrll 
   10164  1.1  skrll       /* Move the literal section after "after".  */
   10165  1.1  skrll       assert (literal_section);
   10166  1.1  skrll       if (literal_section != after)
   10167  1.1  skrll 	{
   10168  1.1  skrll 	  bfd_section_list_remove (stdoutput, literal_section);
   10169  1.1  skrll 	  bfd_section_list_insert_after (stdoutput, after, literal_section);
   10170  1.1  skrll 	}
   10171  1.1  skrll 
   10172  1.1  skrll       head = head->next;
   10173  1.1  skrll     }
   10174  1.1  skrll }
   10175  1.1  skrll 
   10176  1.1  skrll 
   10177  1.1  skrll /* Push all the literal segments to the end of the gnu list.  */
   10178  1.1  skrll 
   10179  1.1  skrll static void
   10180  1.1  skrll xtensa_reorder_segments (void)
   10181  1.1  skrll {
   10182  1.1  skrll   segT sec;
   10183  1.1  skrll   segT last_sec = 0;
   10184  1.1  skrll   int old_count = 0;
   10185  1.1  skrll   int new_count = 0;
   10186  1.1  skrll 
   10187  1.1  skrll   for (sec = stdoutput->sections; sec != NULL; sec = sec->next)
   10188  1.1  skrll     {
   10189  1.1  skrll       last_sec = sec;
   10190  1.1  skrll       old_count++;
   10191  1.1  skrll     }
   10192  1.1  skrll 
   10193  1.1  skrll   /* Now that we have the last section, push all the literal
   10194  1.1  skrll      sections to the end.  */
   10195  1.1  skrll   xtensa_reorder_seg_list (literal_head, last_sec);
   10196  1.1  skrll 
   10197  1.1  skrll   /* Now perform the final error check.  */
   10198  1.1  skrll   for (sec = stdoutput->sections; sec != NULL; sec = sec->next)
   10199  1.1  skrll     new_count++;
   10200  1.1  skrll   assert (new_count == old_count);
   10201  1.1  skrll }
   10202  1.1  skrll 
   10203  1.1  skrll 
   10204  1.1  skrll /* Change the emit state (seg, subseg, and frag related stuff) to the
   10205  1.1  skrll    correct location.  Return a emit_state which can be passed to
   10206  1.1  skrll    xtensa_restore_emit_state to return to current fragment.  */
   10207  1.1  skrll 
   10208  1.1  skrll static void
   10209  1.1  skrll xtensa_switch_to_literal_fragment (emit_state *result)
   10210  1.1  skrll {
   10211  1.1  skrll   if (directive_state[directive_absolute_literals])
   10212  1.1  skrll     {
   10213  1.1  skrll       segT lit4_seg = cache_literal_section (TRUE);
   10214  1.1  skrll       xtensa_switch_section_emit_state (result, lit4_seg, 0);
   10215  1.1  skrll     }
   10216  1.1  skrll   else
   10217  1.1  skrll     xtensa_switch_to_non_abs_literal_fragment (result);
   10218  1.1  skrll 
   10219  1.1  skrll   /* Do a 4-byte align here.  */
   10220  1.1  skrll   frag_align (2, 0, 0);
   10221  1.1  skrll   record_alignment (now_seg, 2);
   10222  1.1  skrll }
   10223  1.1  skrll 
   10224  1.1  skrll 
   10225  1.1  skrll static void
   10226  1.1  skrll xtensa_switch_to_non_abs_literal_fragment (emit_state *result)
   10227  1.1  skrll {
   10228  1.1  skrll   static bfd_boolean recursive = FALSE;
   10229  1.1  skrll   fragS *pool_location = get_literal_pool_location (now_seg);
   10230  1.1  skrll   segT lit_seg;
   10231  1.1  skrll   bfd_boolean is_init =
   10232  1.1  skrll     (now_seg && !strcmp (segment_name (now_seg), INIT_SECTION_NAME));
   10233  1.1  skrll   bfd_boolean is_fini =
   10234  1.1  skrll     (now_seg && !strcmp (segment_name (now_seg), FINI_SECTION_NAME));
   10235  1.1  skrll 
   10236  1.1  skrll   if (pool_location == NULL
   10237  1.1  skrll       && !use_literal_section
   10238  1.1  skrll       && !recursive
   10239  1.1  skrll       && !is_init && ! is_fini)
   10240  1.1  skrll     {
   10241  1.1  skrll       as_bad (_("literal pool location required for text-section-literals; specify with .literal_position"));
   10242  1.1  skrll 
   10243  1.1  skrll       /* When we mark a literal pool location, we want to put a frag in
   10244  1.1  skrll 	 the literal pool that points to it.  But to do that, we want to
   10245  1.1  skrll 	 switch_to_literal_fragment.  But literal sections don't have
   10246  1.1  skrll 	 literal pools, so their location is always null, so we would
   10247  1.1  skrll 	 recurse forever.  This is kind of hacky, but it works.  */
   10248  1.1  skrll 
   10249  1.1  skrll       recursive = TRUE;
   10250  1.1  skrll       xtensa_mark_literal_pool_location ();
   10251  1.1  skrll       recursive = FALSE;
   10252  1.1  skrll     }
   10253  1.1  skrll 
   10254  1.1  skrll   lit_seg = cache_literal_section (FALSE);
   10255  1.1  skrll   xtensa_switch_section_emit_state (result, lit_seg, 0);
   10256  1.1  skrll 
   10257  1.1  skrll   if (!use_literal_section
   10258  1.1  skrll       && !is_init && !is_fini
   10259  1.1  skrll       && get_literal_pool_location (now_seg) != pool_location)
   10260  1.1  skrll     {
   10261  1.1  skrll       /* Close whatever frag is there.  */
   10262  1.1  skrll       frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
   10263  1.1  skrll       xtensa_set_frag_assembly_state (frag_now);
   10264  1.1  skrll       frag_now->tc_frag_data.literal_frag = pool_location;
   10265  1.1  skrll       frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
   10266  1.1  skrll       xtensa_set_frag_assembly_state (frag_now);
   10267  1.1  skrll     }
   10268  1.1  skrll }
   10269  1.1  skrll 
   10270  1.1  skrll 
   10271  1.1  skrll /* Call this function before emitting data into the literal section.
   10272  1.1  skrll    This is a helper function for xtensa_switch_to_literal_fragment.
   10273  1.1  skrll    This is similar to a .section new_now_seg subseg. */
   10274  1.1  skrll 
   10275  1.1  skrll static void
   10276  1.1  skrll xtensa_switch_section_emit_state (emit_state *state,
   10277  1.1  skrll 				  segT new_now_seg,
   10278  1.1  skrll 				  subsegT new_now_subseg)
   10279  1.1  skrll {
   10280  1.1  skrll   state->name = now_seg->name;
   10281  1.1  skrll   state->now_seg = now_seg;
   10282  1.1  skrll   state->now_subseg = now_subseg;
   10283  1.1  skrll   state->generating_literals = generating_literals;
   10284  1.1  skrll   generating_literals++;
   10285  1.1  skrll   subseg_set (new_now_seg, new_now_subseg);
   10286  1.1  skrll }
   10287  1.1  skrll 
   10288  1.1  skrll 
   10289  1.1  skrll /* Use to restore the emitting into the normal place.  */
   10290  1.1  skrll 
   10291  1.1  skrll static void
   10292  1.1  skrll xtensa_restore_emit_state (emit_state *state)
   10293  1.1  skrll {
   10294  1.1  skrll   generating_literals = state->generating_literals;
   10295  1.1  skrll   subseg_set (state->now_seg, state->now_subseg);
   10296  1.1  skrll }
   10297  1.1  skrll 
   10298  1.1  skrll 
   10299  1.1  skrll /* Predicate function used to look up a section in a particular group.  */
   10300  1.1  skrll 
   10301  1.1  skrll static bfd_boolean
   10302  1.1  skrll match_section_group (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *inf)
   10303  1.1  skrll {
   10304  1.1  skrll   const char *gname = inf;
   10305  1.1  skrll   const char *group_name = elf_group_name (sec);
   10306  1.1  skrll 
   10307  1.1  skrll   return (group_name == gname
   10308  1.1  skrll 	  || (group_name != NULL
   10309  1.1  skrll 	      && gname != NULL
   10310  1.1  skrll 	      && strcmp (group_name, gname) == 0));
   10311  1.1  skrll }
   10312  1.1  skrll 
   10313  1.1  skrll 
   10314  1.1  skrll /* Get the literal section to be used for the current text section.
   10315  1.1  skrll    The result may be cached in the default_lit_sections structure.  */
   10316  1.1  skrll 
   10317  1.1  skrll static segT
   10318  1.1  skrll cache_literal_section (bfd_boolean use_abs_literals)
   10319  1.1  skrll {
   10320  1.1  skrll   const char *text_name, *group_name = 0;
   10321  1.1  skrll   char *base_name, *name, *suffix;
   10322  1.1  skrll   segT *pcached;
   10323  1.1  skrll   segT seg, current_section;
   10324  1.1  skrll   int current_subsec;
   10325  1.1  skrll   bfd_boolean linkonce = FALSE;
   10326  1.1  skrll 
   10327  1.1  skrll   /* Save the current section/subsection.  */
   10328  1.1  skrll   current_section = now_seg;
   10329  1.1  skrll   current_subsec = now_subseg;
   10330  1.1  skrll 
   10331  1.1  skrll   /* Clear the cached values if they are no longer valid.  */
   10332  1.1  skrll   if (now_seg != default_lit_sections.current_text_seg)
   10333  1.1  skrll     {
   10334  1.1  skrll       default_lit_sections.current_text_seg = now_seg;
   10335  1.1  skrll       default_lit_sections.lit_seg = NULL;
   10336  1.1  skrll       default_lit_sections.lit4_seg = NULL;
   10337  1.1  skrll     }
   10338  1.1  skrll 
   10339  1.1  skrll   /* Check if the literal section is already cached.  */
   10340  1.1  skrll   if (use_abs_literals)
   10341  1.1  skrll     pcached = &default_lit_sections.lit4_seg;
   10342  1.1  skrll   else
   10343  1.1  skrll     pcached = &default_lit_sections.lit_seg;
   10344  1.1  skrll 
   10345  1.1  skrll   if (*pcached)
   10346  1.1  skrll     return *pcached;
   10347  1.1  skrll 
   10348  1.1  skrll   text_name = default_lit_sections.lit_prefix;
   10349  1.1  skrll   if (! text_name || ! *text_name)
   10350  1.1  skrll     {
   10351  1.1  skrll       text_name = segment_name (current_section);
   10352  1.1  skrll       group_name = elf_group_name (current_section);
   10353  1.1  skrll       linkonce = (current_section->flags & SEC_LINK_ONCE) != 0;
   10354  1.1  skrll     }
   10355  1.1  skrll 
   10356  1.1  skrll   base_name = use_abs_literals ? ".lit4" : ".literal";
   10357  1.1  skrll   if (group_name)
   10358  1.1  skrll     {
   10359  1.1  skrll       name = xmalloc (strlen (base_name) + strlen (group_name) + 2);
   10360  1.1  skrll       sprintf (name, "%s.%s", base_name, group_name);
   10361  1.1  skrll     }
   10362  1.1  skrll   else if (strncmp (text_name, ".gnu.linkonce.", linkonce_len) == 0)
   10363  1.1  skrll     {
   10364  1.1  skrll       suffix = strchr (text_name + linkonce_len, '.');
   10365  1.1  skrll 
   10366  1.1  skrll       name = xmalloc (linkonce_len + strlen (base_name) + 1
   10367  1.1  skrll 		      + (suffix ? strlen (suffix) : 0));
   10368  1.1  skrll       strcpy (name, ".gnu.linkonce");
   10369  1.1  skrll       strcat (name, base_name);
   10370  1.1  skrll       if (suffix)
   10371  1.1  skrll 	strcat (name, suffix);
   10372  1.1  skrll       linkonce = TRUE;
   10373  1.1  skrll     }
   10374  1.1  skrll   else
   10375  1.1  skrll     {
   10376  1.1  skrll       /* If the section name ends with ".text", then replace that suffix
   10377  1.1  skrll 	 instead of appending an additional suffix.  */
   10378  1.1  skrll       size_t len = strlen (text_name);
   10379  1.1  skrll       if (len >= 5 && strcmp (text_name + len - 5, ".text") == 0)
   10380  1.1  skrll 	len -= 5;
   10381  1.1  skrll 
   10382  1.1  skrll       name = xmalloc (len + strlen (base_name) + 1);
   10383  1.1  skrll       strcpy (name, text_name);
   10384  1.1  skrll       strcpy (name + len, base_name);
   10385  1.1  skrll     }
   10386  1.1  skrll 
   10387  1.1  skrll   /* Canonicalize section names to allow renaming literal sections.
   10388  1.1  skrll      The group name, if any, came from the current text section and
   10389  1.1  skrll      has already been canonicalized.  */
   10390  1.1  skrll   name = tc_canonicalize_symbol_name (name);
   10391  1.1  skrll 
   10392  1.1  skrll   seg = bfd_get_section_by_name_if (stdoutput, name, match_section_group,
   10393  1.1  skrll 				    (void *) group_name);
   10394  1.1  skrll   if (! seg)
   10395  1.1  skrll     {
   10396  1.1  skrll       flagword flags;
   10397  1.1  skrll 
   10398  1.1  skrll       seg = subseg_force_new (name, 0);
   10399  1.1  skrll 
   10400  1.1  skrll       if (! use_abs_literals)
   10401  1.1  skrll 	{
   10402  1.1  skrll 	  /* Add the newly created literal segment to the list.  */
   10403  1.1  skrll 	  seg_list *n = (seg_list *) xmalloc (sizeof (seg_list));
   10404  1.1  skrll 	  n->seg = seg;
   10405  1.1  skrll 	  n->next = literal_head->next;
   10406  1.1  skrll 	  literal_head->next = n;
   10407  1.1  skrll 	}
   10408  1.1  skrll 
   10409  1.1  skrll       flags = (SEC_HAS_CONTENTS | SEC_READONLY | SEC_ALLOC | SEC_LOAD
   10410  1.1  skrll 	       | (linkonce ? (SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD) : 0)
   10411  1.1  skrll 	       | (use_abs_literals ? SEC_DATA : SEC_CODE));
   10412  1.1  skrll 
   10413  1.1  skrll       elf_group_name (seg) = group_name;
   10414  1.1  skrll 
   10415  1.1  skrll       bfd_set_section_flags (stdoutput, seg, flags);
   10416  1.1  skrll       bfd_set_section_alignment (stdoutput, seg, 2);
   10417  1.1  skrll     }
   10418  1.1  skrll 
   10419  1.1  skrll   *pcached = seg;
   10420  1.1  skrll   subseg_set (current_section, current_subsec);
   10421  1.1  skrll   return seg;
   10422  1.1  skrll }
   10423  1.1  skrll 
   10424  1.1  skrll 
   10425  1.1  skrll /* Property Tables Stuff.  */
   10427  1.1  skrll 
   10428  1.1  skrll #define XTENSA_INSN_SEC_NAME ".xt.insn"
   10429  1.1  skrll #define XTENSA_LIT_SEC_NAME ".xt.lit"
   10430  1.1  skrll #define XTENSA_PROP_SEC_NAME ".xt.prop"
   10431  1.1  skrll 
   10432  1.1  skrll typedef bfd_boolean (*frag_predicate) (const fragS *);
   10433  1.1  skrll typedef void (*frag_flags_fn) (const fragS *, frag_flags *);
   10434  1.1  skrll 
   10435  1.1  skrll static bfd_boolean get_frag_is_literal (const fragS *);
   10436  1.1  skrll static void xtensa_create_property_segments
   10437  1.1  skrll   (frag_predicate, frag_predicate, const char *, xt_section_type);
   10438  1.1  skrll static void xtensa_create_xproperty_segments
   10439  1.1  skrll   (frag_flags_fn, const char *, xt_section_type);
   10440  1.1  skrll static bfd_boolean exclude_section_from_property_tables (segT);
   10441  1.1  skrll static bfd_boolean section_has_property (segT, frag_predicate);
   10442  1.1  skrll static bfd_boolean section_has_xproperty (segT, frag_flags_fn);
   10443  1.1  skrll static void add_xt_block_frags
   10444  1.1  skrll   (segT, xtensa_block_info **, frag_predicate, frag_predicate);
   10445  1.1  skrll static bfd_boolean xtensa_frag_flags_is_empty (const frag_flags *);
   10446  1.1  skrll static void xtensa_frag_flags_init (frag_flags *);
   10447  1.1  skrll static void get_frag_property_flags (const fragS *, frag_flags *);
   10448  1.1  skrll static bfd_vma frag_flags_to_number (const frag_flags *);
   10449  1.1  skrll static void add_xt_prop_frags (segT, xtensa_block_info **, frag_flags_fn);
   10450  1.1  skrll 
   10451  1.1  skrll /* Set up property tables after relaxation.  */
   10452  1.1  skrll 
   10453  1.1  skrll void
   10454  1.1  skrll xtensa_post_relax_hook (void)
   10455  1.1  skrll {
   10456  1.1  skrll   xtensa_move_seg_list_to_beginning (literal_head);
   10457  1.1  skrll 
   10458  1.1  skrll   xtensa_find_unmarked_state_frags ();
   10459  1.1  skrll   xtensa_mark_frags_for_org ();
   10460  1.1  skrll   xtensa_mark_difference_of_two_symbols ();
   10461  1.1  skrll 
   10462  1.1  skrll   xtensa_create_property_segments (get_frag_is_literal,
   10463  1.1  skrll 				   NULL,
   10464  1.1  skrll 				   XTENSA_LIT_SEC_NAME,
   10465  1.1  skrll 				   xt_literal_sec);
   10466  1.1  skrll   xtensa_create_xproperty_segments (get_frag_property_flags,
   10467  1.1  skrll 				    XTENSA_PROP_SEC_NAME,
   10468  1.1  skrll 				    xt_prop_sec);
   10469  1.1  skrll 
   10470  1.1  skrll   if (warn_unaligned_branch_targets)
   10471  1.1  skrll     bfd_map_over_sections (stdoutput, xtensa_find_unaligned_branch_targets, 0);
   10472  1.1  skrll   bfd_map_over_sections (stdoutput, xtensa_find_unaligned_loops, 0);
   10473  1.1  skrll }
   10474  1.1  skrll 
   10475  1.1  skrll 
   10476  1.1  skrll /* This function is only meaningful after xtensa_move_literals.  */
   10477  1.1  skrll 
   10478  1.1  skrll static bfd_boolean
   10479  1.1  skrll get_frag_is_literal (const fragS *fragP)
   10480  1.1  skrll {
   10481  1.1  skrll   assert (fragP != NULL);
   10482  1.1  skrll   return fragP->tc_frag_data.is_literal;
   10483  1.1  skrll }
   10484  1.1  skrll 
   10485  1.1  skrll 
   10486  1.1  skrll static void
   10487  1.1  skrll xtensa_create_property_segments (frag_predicate property_function,
   10488  1.1  skrll 				 frag_predicate end_property_function,
   10489  1.1  skrll 				 const char *section_name_base,
   10490  1.1  skrll 				 xt_section_type sec_type)
   10491  1.1  skrll {
   10492  1.1  skrll   segT *seclist;
   10493  1.1  skrll 
   10494  1.1  skrll   /* Walk over all of the current segments.
   10495  1.1  skrll      Walk over each fragment
   10496  1.1  skrll      For each non-empty fragment,
   10497  1.1  skrll      Build a property record (append where possible).  */
   10498  1.1  skrll 
   10499  1.1  skrll   for (seclist = &stdoutput->sections;
   10500  1.1  skrll        seclist && *seclist;
   10501  1.1  skrll        seclist = &(*seclist)->next)
   10502  1.1  skrll     {
   10503  1.1  skrll       segT sec = *seclist;
   10504  1.1  skrll 
   10505  1.1  skrll       if (exclude_section_from_property_tables (sec))
   10506  1.1  skrll 	continue;
   10507  1.1  skrll 
   10508  1.1  skrll       if (section_has_property (sec, property_function))
   10509  1.1  skrll 	{
   10510  1.1  skrll 	  segment_info_type *xt_seg_info;
   10511  1.1  skrll 	  xtensa_block_info **xt_blocks;
   10512  1.1  skrll 	  segT prop_sec = xtensa_make_property_section (sec, section_name_base);
   10513  1.1  skrll 
   10514  1.1  skrll 	  prop_sec->output_section = prop_sec;
   10515  1.1  skrll 	  subseg_set (prop_sec, 0);
   10516  1.1  skrll 	  xt_seg_info = seg_info (prop_sec);
   10517  1.1  skrll 	  xt_blocks = &xt_seg_info->tc_segment_info_data.blocks[sec_type];
   10518  1.1  skrll 
   10519  1.1  skrll 	  /* Walk over all of the frchains here and add new sections.  */
   10520  1.1  skrll 	  add_xt_block_frags (sec, xt_blocks, property_function,
   10521  1.1  skrll 			      end_property_function);
   10522  1.1  skrll 	}
   10523  1.1  skrll     }
   10524  1.1  skrll 
   10525  1.1  skrll   /* Now we fill them out....  */
   10526  1.1  skrll 
   10527  1.1  skrll   for (seclist = &stdoutput->sections;
   10528  1.1  skrll        seclist && *seclist;
   10529  1.1  skrll        seclist = &(*seclist)->next)
   10530  1.1  skrll     {
   10531  1.1  skrll       segment_info_type *seginfo;
   10532  1.1  skrll       xtensa_block_info *block;
   10533  1.1  skrll       segT sec = *seclist;
   10534  1.1  skrll 
   10535  1.1  skrll       seginfo = seg_info (sec);
   10536  1.1  skrll       block = seginfo->tc_segment_info_data.blocks[sec_type];
   10537  1.1  skrll 
   10538  1.1  skrll       if (block)
   10539  1.1  skrll 	{
   10540  1.1  skrll 	  xtensa_block_info *cur_block;
   10541  1.1  skrll 	  int num_recs = 0;
   10542  1.1  skrll 	  bfd_size_type rec_size;
   10543  1.1  skrll 
   10544  1.1  skrll 	  for (cur_block = block; cur_block; cur_block = cur_block->next)
   10545  1.1  skrll 	    num_recs++;
   10546  1.1  skrll 
   10547  1.1  skrll 	  rec_size = num_recs * 8;
   10548  1.1  skrll 	  bfd_set_section_size (stdoutput, sec, rec_size);
   10549  1.1  skrll 
   10550  1.1  skrll 	  if (num_recs)
   10551  1.1  skrll 	    {
   10552  1.1  skrll 	      char *frag_data;
   10553  1.1  skrll 	      int i;
   10554  1.1  skrll 
   10555  1.1  skrll 	      subseg_set (sec, 0);
   10556  1.1  skrll 	      frag_data = frag_more (rec_size);
   10557  1.1  skrll 	      cur_block = block;
   10558  1.1  skrll 	      for (i = 0; i < num_recs; i++)
   10559  1.1  skrll 		{
   10560  1.1  skrll 		  fixS *fix;
   10561  1.1  skrll 
   10562  1.1  skrll 		  /* Write the fixup.  */
   10563  1.1  skrll 		  assert (cur_block);
   10564  1.1  skrll 		  fix = fix_new (frag_now, i * 8, 4,
   10565  1.1  skrll 				 section_symbol (cur_block->sec),
   10566  1.1  skrll 				 cur_block->offset,
   10567  1.1  skrll 				 FALSE, BFD_RELOC_32);
   10568  1.1  skrll 		  fix->fx_file = "<internal>";
   10569  1.1  skrll 		  fix->fx_line = 0;
   10570  1.1  skrll 
   10571  1.1  skrll 		  /* Write the length.  */
   10572  1.1  skrll 		  md_number_to_chars (&frag_data[4 + i * 8],
   10573  1.1  skrll 				      cur_block->size, 4);
   10574  1.1  skrll 		  cur_block = cur_block->next;
   10575  1.1  skrll 		}
   10576  1.1  skrll 	      frag_wane (frag_now);
   10577  1.1  skrll 	      frag_new (0);
   10578  1.1  skrll 	      frag_wane (frag_now);
   10579  1.1  skrll 	    }
   10580  1.1  skrll 	}
   10581  1.1  skrll     }
   10582  1.1  skrll }
   10583  1.1  skrll 
   10584  1.1  skrll 
   10585  1.1  skrll static void
   10586  1.1  skrll xtensa_create_xproperty_segments (frag_flags_fn flag_fn,
   10587  1.1  skrll 				  const char *section_name_base,
   10588  1.1  skrll 				  xt_section_type sec_type)
   10589  1.1  skrll {
   10590  1.1  skrll   segT *seclist;
   10591  1.1  skrll 
   10592  1.1  skrll   /* Walk over all of the current segments.
   10593  1.1  skrll      Walk over each fragment.
   10594  1.1  skrll      For each fragment that has instructions,
   10595  1.1  skrll      build an instruction record (append where possible).  */
   10596  1.1  skrll 
   10597  1.1  skrll   for (seclist = &stdoutput->sections;
   10598  1.1  skrll        seclist && *seclist;
   10599  1.1  skrll        seclist = &(*seclist)->next)
   10600  1.1  skrll     {
   10601  1.1  skrll       segT sec = *seclist;
   10602  1.1  skrll 
   10603  1.1  skrll       if (exclude_section_from_property_tables (sec))
   10604  1.1  skrll 	continue;
   10605  1.1  skrll 
   10606  1.1  skrll       if (section_has_xproperty (sec, flag_fn))
   10607  1.1  skrll 	{
   10608  1.1  skrll 	  segment_info_type *xt_seg_info;
   10609  1.1  skrll 	  xtensa_block_info **xt_blocks;
   10610  1.1  skrll 	  segT prop_sec = xtensa_make_property_section (sec, section_name_base);
   10611  1.1  skrll 
   10612  1.1  skrll 	  prop_sec->output_section = prop_sec;
   10613  1.1  skrll 	  subseg_set (prop_sec, 0);
   10614  1.1  skrll 	  xt_seg_info = seg_info (prop_sec);
   10615  1.1  skrll 	  xt_blocks = &xt_seg_info->tc_segment_info_data.blocks[sec_type];
   10616  1.1  skrll 
   10617  1.1  skrll 	  /* Walk over all of the frchains here and add new sections.  */
   10618  1.1  skrll 	  add_xt_prop_frags (sec, xt_blocks, flag_fn);
   10619  1.1  skrll 	}
   10620  1.1  skrll     }
   10621  1.1  skrll 
   10622  1.1  skrll   /* Now we fill them out....  */
   10623  1.1  skrll 
   10624  1.1  skrll   for (seclist = &stdoutput->sections;
   10625  1.1  skrll        seclist && *seclist;
   10626  1.1  skrll        seclist = &(*seclist)->next)
   10627  1.1  skrll     {
   10628  1.1  skrll       segment_info_type *seginfo;
   10629  1.1  skrll       xtensa_block_info *block;
   10630  1.1  skrll       segT sec = *seclist;
   10631  1.1  skrll 
   10632  1.1  skrll       seginfo = seg_info (sec);
   10633  1.1  skrll       block = seginfo->tc_segment_info_data.blocks[sec_type];
   10634  1.1  skrll 
   10635  1.1  skrll       if (block)
   10636  1.1  skrll 	{
   10637  1.1  skrll 	  xtensa_block_info *cur_block;
   10638  1.1  skrll 	  int num_recs = 0;
   10639  1.1  skrll 	  bfd_size_type rec_size;
   10640  1.1  skrll 
   10641  1.1  skrll 	  for (cur_block = block; cur_block; cur_block = cur_block->next)
   10642  1.1  skrll 	    num_recs++;
   10643  1.1  skrll 
   10644  1.1  skrll 	  rec_size = num_recs * (8 + 4);
   10645  1.1  skrll 	  bfd_set_section_size (stdoutput, sec, rec_size);
   10646  1.1  skrll 	  /* elf_section_data (sec)->this_hdr.sh_entsize = 12; */
   10647  1.1  skrll 
   10648  1.1  skrll 	  if (num_recs)
   10649  1.1  skrll 	    {
   10650  1.1  skrll 	      char *frag_data;
   10651  1.1  skrll 	      int i;
   10652  1.1  skrll 
   10653  1.1  skrll 	      subseg_set (sec, 0);
   10654  1.1  skrll 	      frag_data = frag_more (rec_size);
   10655  1.1  skrll 	      cur_block = block;
   10656  1.1  skrll 	      for (i = 0; i < num_recs; i++)
   10657  1.1  skrll 		{
   10658  1.1  skrll 		  fixS *fix;
   10659  1.1  skrll 
   10660  1.1  skrll 		  /* Write the fixup.  */
   10661  1.1  skrll 		  assert (cur_block);
   10662  1.1  skrll 		  fix = fix_new (frag_now, i * 12, 4,
   10663  1.1  skrll 				 section_symbol (cur_block->sec),
   10664  1.1  skrll 				 cur_block->offset,
   10665  1.1  skrll 				 FALSE, BFD_RELOC_32);
   10666  1.1  skrll 		  fix->fx_file = "<internal>";
   10667  1.1  skrll 		  fix->fx_line = 0;
   10668  1.1  skrll 
   10669  1.1  skrll 		  /* Write the length.  */
   10670  1.1  skrll 		  md_number_to_chars (&frag_data[4 + i * 12],
   10671  1.1  skrll 				      cur_block->size, 4);
   10672  1.1  skrll 		  md_number_to_chars (&frag_data[8 + i * 12],
   10673  1.1  skrll 				      frag_flags_to_number (&cur_block->flags),
   10674  1.1  skrll 				      4);
   10675  1.1  skrll 		  cur_block = cur_block->next;
   10676  1.1  skrll 		}
   10677  1.1  skrll 	      frag_wane (frag_now);
   10678  1.1  skrll 	      frag_new (0);
   10679  1.1  skrll 	      frag_wane (frag_now);
   10680  1.1  skrll 	    }
   10681  1.1  skrll 	}
   10682  1.1  skrll     }
   10683  1.1  skrll }
   10684  1.1  skrll 
   10685  1.1  skrll 
   10686  1.1  skrll static bfd_boolean
   10687  1.1  skrll exclude_section_from_property_tables (segT sec)
   10688  1.1  skrll {
   10689  1.1  skrll   flagword flags = bfd_get_section_flags (stdoutput, sec);
   10690  1.1  skrll 
   10691  1.1  skrll   /* Sections that don't contribute to the memory footprint are excluded.  */
   10692  1.1  skrll   if ((flags & SEC_DEBUGGING)
   10693  1.1  skrll       || !(flags & SEC_ALLOC)
   10694  1.1  skrll       || (flags & SEC_MERGE))
   10695  1.1  skrll     return TRUE;
   10696  1.1  skrll 
   10697  1.1  skrll   /* Linker cie and fde optimizations mess up property entries for
   10698  1.1  skrll      eh_frame sections, but there is nothing inside them relevant to
   10699  1.1  skrll      property tables anyway.  */
   10700  1.1  skrll   if (strcmp (sec->name, ".eh_frame") == 0)
   10701  1.1  skrll     return TRUE;
   10702  1.1  skrll 
   10703  1.1  skrll   return FALSE;
   10704  1.1  skrll }
   10705  1.1  skrll 
   10706  1.1  skrll 
   10707  1.1  skrll static bfd_boolean
   10708  1.1  skrll section_has_property (segT sec, frag_predicate property_function)
   10709  1.1  skrll {
   10710  1.1  skrll   segment_info_type *seginfo = seg_info (sec);
   10711  1.1  skrll   fragS *fragP;
   10712  1.1  skrll 
   10713  1.1  skrll   if (seginfo && seginfo->frchainP)
   10714  1.1  skrll     {
   10715  1.1  skrll       for (fragP = seginfo->frchainP->frch_root; fragP; fragP = fragP->fr_next)
   10716  1.1  skrll 	{
   10717  1.1  skrll 	  if (property_function (fragP)
   10718  1.1  skrll 	      && (fragP->fr_type != rs_fill || fragP->fr_fix != 0))
   10719  1.1  skrll 	    return TRUE;
   10720  1.1  skrll 	}
   10721  1.1  skrll     }
   10722  1.1  skrll   return FALSE;
   10723  1.1  skrll }
   10724  1.1  skrll 
   10725  1.1  skrll 
   10726  1.1  skrll static bfd_boolean
   10727  1.1  skrll section_has_xproperty (segT sec, frag_flags_fn property_function)
   10728  1.1  skrll {
   10729  1.1  skrll   segment_info_type *seginfo = seg_info (sec);
   10730  1.1  skrll   fragS *fragP;
   10731  1.1  skrll 
   10732  1.1  skrll   if (seginfo && seginfo->frchainP)
   10733  1.1  skrll     {
   10734  1.1  skrll       for (fragP = seginfo->frchainP->frch_root; fragP; fragP = fragP->fr_next)
   10735  1.1  skrll 	{
   10736  1.1  skrll 	  frag_flags prop_flags;
   10737  1.1  skrll 	  property_function (fragP, &prop_flags);
   10738  1.1  skrll 	  if (!xtensa_frag_flags_is_empty (&prop_flags))
   10739  1.1  skrll 	    return TRUE;
   10740  1.1  skrll 	}
   10741  1.1  skrll     }
   10742  1.1  skrll   return FALSE;
   10743  1.1  skrll }
   10744  1.1  skrll 
   10745  1.1  skrll 
   10746  1.1  skrll /* Two types of block sections exist right now: literal and insns.  */
   10747  1.1  skrll 
   10748  1.1  skrll static void
   10749  1.1  skrll add_xt_block_frags (segT sec,
   10750  1.1  skrll 		    xtensa_block_info **xt_block,
   10751  1.1  skrll 		    frag_predicate property_function,
   10752  1.1  skrll 		    frag_predicate end_property_function)
   10753  1.1  skrll {
   10754  1.1  skrll   bfd_vma seg_offset;
   10755  1.1  skrll   fragS *fragP;
   10756  1.1  skrll 
   10757  1.1  skrll   /* Build it if needed.  */
   10758  1.1  skrll   while (*xt_block != NULL)
   10759  1.1  skrll     xt_block = &(*xt_block)->next;
   10760  1.1  skrll   /* We are either at NULL at the beginning or at the end.  */
   10761  1.1  skrll 
   10762  1.1  skrll   /* Walk through the frags.  */
   10763  1.1  skrll   seg_offset = 0;
   10764  1.1  skrll 
   10765  1.1  skrll   if (seg_info (sec)->frchainP)
   10766  1.1  skrll     {
   10767  1.1  skrll       for (fragP = seg_info (sec)->frchainP->frch_root;
   10768  1.1  skrll 	   fragP;
   10769  1.1  skrll 	   fragP = fragP->fr_next)
   10770  1.1  skrll 	{
   10771  1.1  skrll 	  if (property_function (fragP)
   10772  1.1  skrll 	      && (fragP->fr_type != rs_fill || fragP->fr_fix != 0))
   10773  1.1  skrll 	    {
   10774  1.1  skrll 	      if (*xt_block != NULL)
   10775  1.1  skrll 		{
   10776  1.1  skrll 		  if ((*xt_block)->offset + (*xt_block)->size
   10777  1.1  skrll 		      == fragP->fr_address)
   10778  1.1  skrll 		    (*xt_block)->size += fragP->fr_fix;
   10779  1.1  skrll 		  else
   10780  1.1  skrll 		    xt_block = &((*xt_block)->next);
   10781  1.1  skrll 		}
   10782  1.1  skrll 	      if (*xt_block == NULL)
   10783  1.1  skrll 		{
   10784  1.1  skrll 		  xtensa_block_info *new_block = (xtensa_block_info *)
   10785  1.1  skrll 		    xmalloc (sizeof (xtensa_block_info));
   10786  1.1  skrll 		  new_block->sec = sec;
   10787  1.1  skrll 		  new_block->offset = fragP->fr_address;
   10788  1.1  skrll 		  new_block->size = fragP->fr_fix;
   10789  1.1  skrll 		  new_block->next = NULL;
   10790  1.1  skrll 		  xtensa_frag_flags_init (&new_block->flags);
   10791  1.1  skrll 		  *xt_block = new_block;
   10792  1.1  skrll 		}
   10793  1.1  skrll 	      if (end_property_function
   10794  1.1  skrll 		  && end_property_function (fragP))
   10795  1.1  skrll 		{
   10796  1.1  skrll 		  xt_block = &((*xt_block)->next);
   10797  1.1  skrll 		}
   10798  1.1  skrll 	    }
   10799  1.1  skrll 	}
   10800  1.1  skrll     }
   10801  1.1  skrll }
   10802  1.1  skrll 
   10803  1.1  skrll 
   10804  1.1  skrll /* Break the encapsulation of add_xt_prop_frags here.  */
   10805  1.1  skrll 
   10806  1.1  skrll static bfd_boolean
   10807  1.1  skrll xtensa_frag_flags_is_empty (const frag_flags *prop_flags)
   10808  1.1  skrll {
   10809  1.1  skrll   if (prop_flags->is_literal
   10810  1.1  skrll       || prop_flags->is_insn
   10811  1.1  skrll       || prop_flags->is_data
   10812  1.1  skrll       || prop_flags->is_unreachable)
   10813  1.1  skrll     return FALSE;
   10814  1.1  skrll   return TRUE;
   10815  1.1  skrll }
   10816  1.1  skrll 
   10817  1.1  skrll 
   10818  1.1  skrll static void
   10819  1.1  skrll xtensa_frag_flags_init (frag_flags *prop_flags)
   10820  1.1  skrll {
   10821  1.1  skrll   memset (prop_flags, 0, sizeof (frag_flags));
   10822  1.1  skrll }
   10823  1.1  skrll 
   10824  1.1  skrll 
   10825  1.1  skrll static void
   10826  1.1  skrll get_frag_property_flags (const fragS *fragP, frag_flags *prop_flags)
   10827  1.1  skrll {
   10828  1.1  skrll   xtensa_frag_flags_init (prop_flags);
   10829  1.1  skrll   if (fragP->tc_frag_data.is_literal)
   10830  1.1  skrll     prop_flags->is_literal = TRUE;
   10831  1.1  skrll   if (fragP->tc_frag_data.is_specific_opcode
   10832  1.1  skrll       || fragP->tc_frag_data.is_no_transform)
   10833  1.1  skrll     {
   10834  1.1  skrll       prop_flags->is_no_transform = TRUE;
   10835  1.1  skrll       if (xtensa_frag_flags_is_empty (prop_flags))
   10836  1.1  skrll 	prop_flags->is_data = TRUE;
   10837  1.1  skrll     }
   10838  1.1  skrll   if (fragP->tc_frag_data.is_unreachable)
   10839  1.1  skrll     prop_flags->is_unreachable = TRUE;
   10840  1.1  skrll   else if (fragP->tc_frag_data.is_insn)
   10841  1.1  skrll     {
   10842  1.1  skrll       prop_flags->is_insn = TRUE;
   10843  1.1  skrll       if (fragP->tc_frag_data.is_loop_target)
   10844  1.1  skrll 	prop_flags->insn.is_loop_target = TRUE;
   10845  1.1  skrll       if (fragP->tc_frag_data.is_branch_target)
   10846  1.1  skrll 	prop_flags->insn.is_branch_target = TRUE;
   10847  1.1  skrll       if (fragP->tc_frag_data.is_no_density)
   10848  1.1  skrll 	prop_flags->insn.is_no_density = TRUE;
   10849  1.1  skrll       if (fragP->tc_frag_data.use_absolute_literals)
   10850  1.1  skrll 	prop_flags->insn.is_abslit = TRUE;
   10851  1.1  skrll     }
   10852  1.1  skrll   if (fragP->tc_frag_data.is_align)
   10853  1.1  skrll     {
   10854  1.1  skrll       prop_flags->is_align = TRUE;
   10855  1.1  skrll       prop_flags->alignment = fragP->tc_frag_data.alignment;
   10856  1.1  skrll       if (xtensa_frag_flags_is_empty (prop_flags))
   10857  1.1  skrll 	prop_flags->is_data = TRUE;
   10858  1.1  skrll     }
   10859  1.1  skrll }
   10860  1.1  skrll 
   10861  1.1  skrll 
   10862  1.1  skrll static bfd_vma
   10863  1.1  skrll frag_flags_to_number (const frag_flags *prop_flags)
   10864  1.1  skrll {
   10865  1.1  skrll   bfd_vma num = 0;
   10866  1.1  skrll   if (prop_flags->is_literal)
   10867  1.1  skrll     num |= XTENSA_PROP_LITERAL;
   10868  1.1  skrll   if (prop_flags->is_insn)
   10869  1.1  skrll     num |= XTENSA_PROP_INSN;
   10870  1.1  skrll   if (prop_flags->is_data)
   10871  1.1  skrll     num |= XTENSA_PROP_DATA;
   10872  1.1  skrll   if (prop_flags->is_unreachable)
   10873  1.1  skrll     num |= XTENSA_PROP_UNREACHABLE;
   10874  1.1  skrll   if (prop_flags->insn.is_loop_target)
   10875  1.1  skrll     num |= XTENSA_PROP_INSN_LOOP_TARGET;
   10876  1.1  skrll   if (prop_flags->insn.is_branch_target)
   10877  1.1  skrll     {
   10878  1.1  skrll       num |= XTENSA_PROP_INSN_BRANCH_TARGET;
   10879  1.1  skrll       num = SET_XTENSA_PROP_BT_ALIGN (num, prop_flags->insn.bt_align_priority);
   10880  1.1  skrll     }
   10881  1.1  skrll 
   10882  1.1  skrll   if (prop_flags->insn.is_no_density)
   10883  1.1  skrll     num |= XTENSA_PROP_INSN_NO_DENSITY;
   10884  1.1  skrll   if (prop_flags->is_no_transform)
   10885  1.1  skrll     num |= XTENSA_PROP_NO_TRANSFORM;
   10886  1.1  skrll   if (prop_flags->insn.is_no_reorder)
   10887  1.1  skrll     num |= XTENSA_PROP_INSN_NO_REORDER;
   10888  1.1  skrll   if (prop_flags->insn.is_abslit)
   10889  1.1  skrll     num |= XTENSA_PROP_INSN_ABSLIT;
   10890  1.1  skrll 
   10891  1.1  skrll   if (prop_flags->is_align)
   10892  1.1  skrll     {
   10893  1.1  skrll       num |= XTENSA_PROP_ALIGN;
   10894  1.1  skrll       num = SET_XTENSA_PROP_ALIGNMENT (num, prop_flags->alignment);
   10895  1.1  skrll     }
   10896  1.1  skrll 
   10897  1.1  skrll   return num;
   10898  1.1  skrll }
   10899  1.1  skrll 
   10900  1.1  skrll 
   10901  1.1  skrll static bfd_boolean
   10902  1.1  skrll xtensa_frag_flags_combinable (const frag_flags *prop_flags_1,
   10903  1.1  skrll 			      const frag_flags *prop_flags_2)
   10904  1.1  skrll {
   10905  1.1  skrll   /* Cannot combine with an end marker.  */
   10906  1.1  skrll 
   10907  1.1  skrll   if (prop_flags_1->is_literal != prop_flags_2->is_literal)
   10908  1.1  skrll     return FALSE;
   10909  1.1  skrll   if (prop_flags_1->is_insn != prop_flags_2->is_insn)
   10910  1.1  skrll     return FALSE;
   10911  1.1  skrll   if (prop_flags_1->is_data != prop_flags_2->is_data)
   10912  1.1  skrll     return FALSE;
   10913  1.1  skrll 
   10914  1.1  skrll   if (prop_flags_1->is_insn)
   10915  1.1  skrll     {
   10916  1.1  skrll       /* Properties of the beginning of the frag.  */
   10917  1.1  skrll       if (prop_flags_2->insn.is_loop_target)
   10918  1.1  skrll 	return FALSE;
   10919  1.1  skrll       if (prop_flags_2->insn.is_branch_target)
   10920  1.1  skrll 	return FALSE;
   10921  1.1  skrll       if (prop_flags_1->insn.is_no_density !=
   10922  1.1  skrll 	  prop_flags_2->insn.is_no_density)
   10923  1.1  skrll 	return FALSE;
   10924  1.1  skrll       if (prop_flags_1->is_no_transform !=
   10925  1.1  skrll 	  prop_flags_2->is_no_transform)
   10926  1.1  skrll 	return FALSE;
   10927  1.1  skrll       if (prop_flags_1->insn.is_no_reorder !=
   10928  1.1  skrll 	  prop_flags_2->insn.is_no_reorder)
   10929  1.1  skrll 	return FALSE;
   10930  1.1  skrll       if (prop_flags_1->insn.is_abslit !=
   10931  1.1  skrll 	  prop_flags_2->insn.is_abslit)
   10932  1.1  skrll 	return FALSE;
   10933  1.1  skrll     }
   10934  1.1  skrll 
   10935  1.1  skrll   if (prop_flags_1->is_align)
   10936  1.1  skrll     return FALSE;
   10937  1.1  skrll 
   10938  1.1  skrll   return TRUE;
   10939  1.1  skrll }
   10940  1.1  skrll 
   10941  1.1  skrll 
   10942  1.1  skrll static bfd_vma
   10943  1.1  skrll xt_block_aligned_size (const xtensa_block_info *xt_block)
   10944  1.1  skrll {
   10945  1.1  skrll   bfd_vma end_addr;
   10946  1.1  skrll   unsigned align_bits;
   10947  1.1  skrll 
   10948  1.1  skrll   if (!xt_block->flags.is_align)
   10949  1.1  skrll     return xt_block->size;
   10950  1.1  skrll 
   10951  1.1  skrll   end_addr = xt_block->offset + xt_block->size;
   10952  1.1  skrll   align_bits = xt_block->flags.alignment;
   10953  1.1  skrll   end_addr = ((end_addr + ((1 << align_bits) -1)) >> align_bits) << align_bits;
   10954  1.1  skrll   return end_addr - xt_block->offset;
   10955  1.1  skrll }
   10956  1.1  skrll 
   10957  1.1  skrll 
   10958  1.1  skrll static bfd_boolean
   10959  1.1  skrll xtensa_xt_block_combine (xtensa_block_info *xt_block,
   10960  1.1  skrll 			 const xtensa_block_info *xt_block_2)
   10961  1.1  skrll {
   10962  1.1  skrll   if (xt_block->sec != xt_block_2->sec)
   10963  1.1  skrll     return FALSE;
   10964  1.1  skrll   if (xt_block->offset + xt_block_aligned_size (xt_block)
   10965  1.1  skrll       != xt_block_2->offset)
   10966  1.1  skrll     return FALSE;
   10967  1.1  skrll 
   10968  1.1  skrll   if (xt_block_2->size == 0
   10969  1.1  skrll       && (!xt_block_2->flags.is_unreachable
   10970  1.1  skrll 	  || xt_block->flags.is_unreachable))
   10971  1.1  skrll     {
   10972  1.1  skrll       if (xt_block_2->flags.is_align
   10973  1.1  skrll 	  && xt_block->flags.is_align)
   10974  1.1  skrll 	{
   10975  1.1  skrll 	  /* Nothing needed.  */
   10976  1.1  skrll 	  if (xt_block->flags.alignment >= xt_block_2->flags.alignment)
   10977  1.1  skrll 	    return TRUE;
   10978  1.1  skrll 	}
   10979  1.1  skrll       else
   10980  1.1  skrll 	{
   10981  1.1  skrll 	  if (xt_block_2->flags.is_align)
   10982  1.1  skrll 	    {
   10983  1.1  skrll 	      /* Push alignment to previous entry.  */
   10984  1.1  skrll 	      xt_block->flags.is_align = xt_block_2->flags.is_align;
   10985  1.1  skrll 	      xt_block->flags.alignment = xt_block_2->flags.alignment;
   10986  1.1  skrll 	    }
   10987  1.1  skrll 	  return TRUE;
   10988  1.1  skrll 	}
   10989  1.1  skrll     }
   10990  1.1  skrll   if (!xtensa_frag_flags_combinable (&xt_block->flags,
   10991  1.1  skrll 				     &xt_block_2->flags))
   10992  1.1  skrll     return FALSE;
   10993  1.1  skrll 
   10994  1.1  skrll   xt_block->size += xt_block_2->size;
   10995  1.1  skrll 
   10996  1.1  skrll   if (xt_block_2->flags.is_align)
   10997  1.1  skrll     {
   10998  1.1  skrll       xt_block->flags.is_align = TRUE;
   10999  1.1  skrll       xt_block->flags.alignment = xt_block_2->flags.alignment;
   11000  1.1  skrll     }
   11001  1.1  skrll 
   11002  1.1  skrll   return TRUE;
   11003  1.1  skrll }
   11004  1.1  skrll 
   11005  1.1  skrll 
   11006  1.1  skrll static void
   11007  1.1  skrll add_xt_prop_frags (segT sec,
   11008  1.1  skrll 		   xtensa_block_info **xt_block,
   11009  1.1  skrll 		   frag_flags_fn property_function)
   11010  1.1  skrll {
   11011  1.1  skrll   bfd_vma seg_offset;
   11012  1.1  skrll   fragS *fragP;
   11013  1.1  skrll 
   11014  1.1  skrll   /* Build it if needed.  */
   11015  1.1  skrll   while (*xt_block != NULL)
   11016  1.1  skrll     {
   11017  1.1  skrll       xt_block = &(*xt_block)->next;
   11018  1.1  skrll     }
   11019  1.1  skrll   /* We are either at NULL at the beginning or at the end.  */
   11020  1.1  skrll 
   11021  1.1  skrll   /* Walk through the frags.  */
   11022  1.1  skrll   seg_offset = 0;
   11023  1.1  skrll 
   11024  1.1  skrll   if (seg_info (sec)->frchainP)
   11025  1.1  skrll     {
   11026  1.1  skrll       for (fragP = seg_info (sec)->frchainP->frch_root; fragP;
   11027  1.1  skrll 	   fragP = fragP->fr_next)
   11028  1.1  skrll 	{
   11029  1.1  skrll 	  xtensa_block_info tmp_block;
   11030  1.1  skrll 	  tmp_block.sec = sec;
   11031  1.1  skrll 	  tmp_block.offset = fragP->fr_address;
   11032  1.1  skrll 	  tmp_block.size = fragP->fr_fix;
   11033  1.1  skrll 	  tmp_block.next = NULL;
   11034  1.1  skrll 	  property_function (fragP, &tmp_block.flags);
   11035  1.1  skrll 
   11036  1.1  skrll 	  if (!xtensa_frag_flags_is_empty (&tmp_block.flags))
   11037  1.1  skrll 	    /* && fragP->fr_fix != 0) */
   11038  1.1  skrll 	    {
   11039  1.1  skrll 	      if ((*xt_block) == NULL
   11040  1.1  skrll 		  || !xtensa_xt_block_combine (*xt_block, &tmp_block))
   11041  1.1  skrll 		{
   11042  1.1  skrll 		  xtensa_block_info *new_block;
   11043  1.1  skrll 		  if ((*xt_block) != NULL)
   11044  1.1  skrll 		    xt_block = &(*xt_block)->next;
   11045  1.1  skrll 		  new_block = (xtensa_block_info *)
   11046  1.1  skrll 		    xmalloc (sizeof (xtensa_block_info));
   11047  1.1  skrll 		  *new_block = tmp_block;
   11048  1.1  skrll 		  *xt_block = new_block;
   11049  1.1  skrll 		}
   11050  1.1  skrll 	    }
   11051  1.1  skrll 	}
   11052  1.1  skrll     }
   11053  1.1  skrll }
   11054  1.1  skrll 
   11055  1.1  skrll 
   11056  1.1  skrll /* op_placement_info_table */
   11058  1.1  skrll 
   11059  1.1  skrll /* op_placement_info makes it easier to determine which
   11060  1.1  skrll    ops can go in which slots.  */
   11061  1.1  skrll 
   11062  1.1  skrll static void
   11063  1.1  skrll init_op_placement_info_table (void)
   11064  1.1  skrll {
   11065  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   11066  1.1  skrll   xtensa_insnbuf ibuf = xtensa_insnbuf_alloc (isa);
   11067  1.1  skrll   xtensa_opcode opcode;
   11068  1.1  skrll   xtensa_format fmt;
   11069  1.1  skrll   int slot;
   11070  1.1  skrll   int num_opcodes = xtensa_isa_num_opcodes (isa);
   11071  1.1  skrll 
   11072  1.1  skrll   op_placement_table = (op_placement_info_table)
   11073  1.1  skrll     xmalloc (sizeof (op_placement_info) * num_opcodes);
   11074  1.1  skrll   assert (xtensa_isa_num_formats (isa) < MAX_FORMATS);
   11075  1.1  skrll 
   11076  1.1  skrll   for (opcode = 0; opcode < num_opcodes; opcode++)
   11077  1.1  skrll     {
   11078  1.1  skrll       op_placement_info *opi = &op_placement_table[opcode];
   11079  1.1  skrll       /* FIXME: Make tinsn allocation dynamic.  */
   11080  1.1  skrll       if (xtensa_opcode_num_operands (isa, opcode) >= MAX_INSN_ARGS)
   11081  1.1  skrll 	as_fatal (_("too many operands in instruction"));
   11082  1.1  skrll       opi->narrowest = XTENSA_UNDEFINED;
   11083  1.1  skrll       opi->narrowest_size = 0x7F;
   11084  1.1  skrll       opi->narrowest_slot = 0;
   11085  1.1  skrll       opi->formats = 0;
   11086  1.1  skrll       opi->num_formats = 0;
   11087  1.1  skrll       opi->issuef = 0;
   11088  1.1  skrll       for (fmt = 0; fmt < xtensa_isa_num_formats (isa); fmt++)
   11089  1.1  skrll 	{
   11090  1.1  skrll 	  opi->slots[fmt] = 0;
   11091  1.1  skrll 	  for (slot = 0; slot < xtensa_format_num_slots (isa, fmt); slot++)
   11092  1.1  skrll 	    {
   11093  1.1  skrll 	      if (xtensa_opcode_encode (isa, fmt, slot, ibuf, opcode) == 0)
   11094  1.1  skrll 		{
   11095  1.1  skrll 		  int fmt_length = xtensa_format_length (isa, fmt);
   11096  1.1  skrll 		  opi->issuef++;
   11097  1.1  skrll 		  set_bit (fmt, opi->formats);
   11098  1.1  skrll 		  set_bit (slot, opi->slots[fmt]);
   11099  1.1  skrll 		  if (fmt_length < opi->narrowest_size
   11100  1.1  skrll 		      || (fmt_length == opi->narrowest_size
   11101  1.1  skrll 			  && (xtensa_format_num_slots (isa, fmt)
   11102  1.1  skrll 			      < xtensa_format_num_slots (isa,
   11103  1.1  skrll 							 opi->narrowest))))
   11104  1.1  skrll 		    {
   11105  1.1  skrll 		      opi->narrowest = fmt;
   11106  1.1  skrll 		      opi->narrowest_size = fmt_length;
   11107  1.1  skrll 		      opi->narrowest_slot = slot;
   11108  1.1  skrll 		    }
   11109  1.1  skrll 		}
   11110  1.1  skrll 	    }
   11111  1.1  skrll 	  if (opi->formats)
   11112  1.1  skrll 	    opi->num_formats++;
   11113  1.1  skrll 	}
   11114  1.1  skrll     }
   11115  1.1  skrll   xtensa_insnbuf_free (isa, ibuf);
   11116  1.1  skrll }
   11117  1.1  skrll 
   11118  1.1  skrll 
   11119  1.1  skrll bfd_boolean
   11120  1.1  skrll opcode_fits_format_slot (xtensa_opcode opcode, xtensa_format fmt, int slot)
   11121  1.1  skrll {
   11122  1.1  skrll   return bit_is_set (slot, op_placement_table[opcode].slots[fmt]);
   11123  1.1  skrll }
   11124  1.1  skrll 
   11125  1.1  skrll 
   11126  1.1  skrll /* If the opcode is available in a single slot format, return its size.  */
   11127  1.1  skrll 
   11128  1.1  skrll static int
   11129  1.1  skrll xg_get_single_size (xtensa_opcode opcode)
   11130  1.1  skrll {
   11131  1.1  skrll   return op_placement_table[opcode].narrowest_size;
   11132  1.1  skrll }
   11133  1.1  skrll 
   11134  1.1  skrll 
   11135  1.1  skrll static xtensa_format
   11136  1.1  skrll xg_get_single_format (xtensa_opcode opcode)
   11137  1.1  skrll {
   11138  1.1  skrll   return op_placement_table[opcode].narrowest;
   11139  1.1  skrll }
   11140  1.1  skrll 
   11141  1.1  skrll 
   11142  1.1  skrll static int
   11143  1.1  skrll xg_get_single_slot (xtensa_opcode opcode)
   11144  1.1  skrll {
   11145  1.1  skrll   return op_placement_table[opcode].narrowest_slot;
   11146  1.1  skrll }
   11147  1.1  skrll 
   11148  1.1  skrll 
   11149  1.1  skrll /* Instruction Stack Functions (from "xtensa-istack.h").  */
   11151  1.1  skrll 
   11152  1.1  skrll void
   11153  1.1  skrll istack_init (IStack *stack)
   11154  1.1  skrll {
   11155  1.1  skrll   memset (stack, 0, sizeof (IStack));
   11156  1.1  skrll   stack->ninsn = 0;
   11157  1.1  skrll }
   11158  1.1  skrll 
   11159  1.1  skrll 
   11160  1.1  skrll bfd_boolean
   11161  1.1  skrll istack_empty (IStack *stack)
   11162  1.1  skrll {
   11163  1.1  skrll   return (stack->ninsn == 0);
   11164  1.1  skrll }
   11165  1.1  skrll 
   11166  1.1  skrll 
   11167  1.1  skrll bfd_boolean
   11168  1.1  skrll istack_full (IStack *stack)
   11169  1.1  skrll {
   11170  1.1  skrll   return (stack->ninsn == MAX_ISTACK);
   11171  1.1  skrll }
   11172  1.1  skrll 
   11173  1.1  skrll 
   11174  1.1  skrll /* Return a pointer to the top IStack entry.
   11175  1.1  skrll    It is an error to call this if istack_empty () is TRUE. */
   11176  1.1  skrll 
   11177  1.1  skrll TInsn *
   11178  1.1  skrll istack_top (IStack *stack)
   11179  1.1  skrll {
   11180  1.1  skrll   int rec = stack->ninsn - 1;
   11181  1.1  skrll   assert (!istack_empty (stack));
   11182  1.1  skrll   return &stack->insn[rec];
   11183  1.1  skrll }
   11184  1.1  skrll 
   11185  1.1  skrll 
   11186  1.1  skrll /* Add a new TInsn to an IStack.
   11187  1.1  skrll    It is an error to call this if istack_full () is TRUE.  */
   11188  1.1  skrll 
   11189  1.1  skrll void
   11190  1.1  skrll istack_push (IStack *stack, TInsn *insn)
   11191  1.1  skrll {
   11192  1.1  skrll   int rec = stack->ninsn;
   11193  1.1  skrll   assert (!istack_full (stack));
   11194  1.1  skrll   stack->insn[rec] = *insn;
   11195  1.1  skrll   stack->ninsn++;
   11196  1.1  skrll }
   11197  1.1  skrll 
   11198  1.1  skrll 
   11199  1.1  skrll /* Clear space for the next TInsn on the IStack and return a pointer
   11200  1.1  skrll    to it.  It is an error to call this if istack_full () is TRUE.  */
   11201  1.1  skrll 
   11202  1.1  skrll TInsn *
   11203  1.1  skrll istack_push_space (IStack *stack)
   11204  1.1  skrll {
   11205  1.1  skrll   int rec = stack->ninsn;
   11206  1.1  skrll   TInsn *insn;
   11207  1.1  skrll   assert (!istack_full (stack));
   11208  1.1  skrll   insn = &stack->insn[rec];
   11209  1.1  skrll   tinsn_init (insn);
   11210  1.1  skrll   stack->ninsn++;
   11211  1.1  skrll   return insn;
   11212  1.1  skrll }
   11213  1.1  skrll 
   11214  1.1  skrll 
   11215  1.1  skrll /* Remove the last pushed instruction.  It is an error to call this if
   11216  1.1  skrll    istack_empty () returns TRUE.  */
   11217  1.1  skrll 
   11218  1.1  skrll void
   11219  1.1  skrll istack_pop (IStack *stack)
   11220  1.1  skrll {
   11221  1.1  skrll   int rec = stack->ninsn - 1;
   11222  1.1  skrll   assert (!istack_empty (stack));
   11223  1.1  skrll   stack->ninsn--;
   11224  1.1  skrll   tinsn_init (&stack->insn[rec]);
   11225  1.1  skrll }
   11226  1.1  skrll 
   11227  1.1  skrll 
   11228  1.1  skrll /* TInsn functions.  */
   11230  1.1  skrll 
   11231  1.1  skrll void
   11232  1.1  skrll tinsn_init (TInsn *dst)
   11233  1.1  skrll {
   11234  1.1  skrll   memset (dst, 0, sizeof (TInsn));
   11235  1.1  skrll }
   11236  1.1  skrll 
   11237  1.1  skrll 
   11238  1.1  skrll /* Return TRUE if ANY of the operands in the insn are symbolic.  */
   11239  1.1  skrll 
   11240  1.1  skrll static bfd_boolean
   11241  1.1  skrll tinsn_has_symbolic_operands (const TInsn *insn)
   11242  1.1  skrll {
   11243  1.1  skrll   int i;
   11244  1.1  skrll   int n = insn->ntok;
   11245  1.1  skrll 
   11246  1.1  skrll   assert (insn->insn_type == ITYPE_INSN);
   11247  1.1  skrll 
   11248  1.1  skrll   for (i = 0; i < n; ++i)
   11249  1.1  skrll     {
   11250  1.1  skrll       switch (insn->tok[i].X_op)
   11251  1.1  skrll 	{
   11252  1.1  skrll 	case O_register:
   11253  1.1  skrll 	case O_constant:
   11254  1.1  skrll 	  break;
   11255  1.1  skrll 	default:
   11256  1.1  skrll 	  return TRUE;
   11257  1.1  skrll 	}
   11258  1.1  skrll     }
   11259  1.1  skrll   return FALSE;
   11260  1.1  skrll }
   11261  1.1  skrll 
   11262  1.1  skrll 
   11263  1.1  skrll bfd_boolean
   11264  1.1  skrll tinsn_has_invalid_symbolic_operands (const TInsn *insn)
   11265  1.1  skrll {
   11266  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   11267  1.1  skrll   int i;
   11268  1.1  skrll   int n = insn->ntok;
   11269  1.1  skrll 
   11270  1.1  skrll   assert (insn->insn_type == ITYPE_INSN);
   11271  1.1  skrll 
   11272  1.1  skrll   for (i = 0; i < n; ++i)
   11273  1.1  skrll     {
   11274  1.1  skrll       switch (insn->tok[i].X_op)
   11275  1.1  skrll 	{
   11276  1.1  skrll 	case O_register:
   11277  1.1  skrll 	case O_constant:
   11278  1.1  skrll 	  break;
   11279  1.1  skrll 	case O_big:
   11280  1.1  skrll 	case O_illegal:
   11281  1.1  skrll 	case O_absent:
   11282  1.1  skrll 	  /* Errors for these types are caught later.  */
   11283  1.1  skrll 	  break;
   11284  1.1  skrll 	case O_hi16:
   11285  1.1  skrll 	case O_lo16:
   11286  1.1  skrll 	default:
   11287  1.1  skrll 	  /* Symbolic immediates are only allowed on the last immediate
   11288  1.1  skrll 	     operand.  At this time, CONST16 is the only opcode where we
   11289  1.1  skrll 	     support non-PC-relative relocations.  */
   11290  1.1  skrll 	  if (i != get_relaxable_immed (insn->opcode)
   11291  1.1  skrll 	      || (xtensa_operand_is_PCrelative (isa, insn->opcode, i) != 1
   11292  1.1  skrll 		  && insn->opcode != xtensa_const16_opcode))
   11293  1.1  skrll 	    {
   11294  1.1  skrll 	      as_bad (_("invalid symbolic operand"));
   11295  1.1  skrll 	      return TRUE;
   11296  1.1  skrll 	    }
   11297  1.1  skrll 	}
   11298  1.1  skrll     }
   11299  1.1  skrll   return FALSE;
   11300  1.1  skrll }
   11301  1.1  skrll 
   11302  1.1  skrll 
   11303  1.1  skrll /* For assembly code with complex expressions (e.g. subtraction),
   11304  1.1  skrll    we have to build them in the literal pool so that
   11305  1.1  skrll    their results are calculated correctly after relaxation.
   11306  1.1  skrll    The relaxation only handles expressions that
   11307  1.1  skrll    boil down to SYMBOL + OFFSET.  */
   11308  1.1  skrll 
   11309  1.1  skrll static bfd_boolean
   11310  1.1  skrll tinsn_has_complex_operands (const TInsn *insn)
   11311  1.1  skrll {
   11312  1.1  skrll   int i;
   11313  1.1  skrll   int n = insn->ntok;
   11314  1.1  skrll   assert (insn->insn_type == ITYPE_INSN);
   11315  1.1  skrll   for (i = 0; i < n; ++i)
   11316  1.1  skrll     {
   11317  1.1  skrll       switch (insn->tok[i].X_op)
   11318  1.1  skrll 	{
   11319  1.1  skrll 	case O_register:
   11320  1.1  skrll 	case O_constant:
   11321  1.1  skrll 	case O_symbol:
   11322  1.1  skrll 	case O_lo16:
   11323  1.1  skrll 	case O_hi16:
   11324  1.1  skrll 	  break;
   11325  1.1  skrll 	default:
   11326  1.1  skrll 	  return TRUE;
   11327  1.1  skrll 	}
   11328  1.1  skrll     }
   11329  1.1  skrll   return FALSE;
   11330  1.1  skrll }
   11331  1.1  skrll 
   11332  1.1  skrll 
   11333  1.1  skrll /* Encode a TInsn opcode and its constant operands into slotbuf.
   11334  1.1  skrll    Return TRUE if there is a symbol in the immediate field.  This
   11335  1.1  skrll    function assumes that:
   11336  1.1  skrll    1) The number of operands are correct.
   11337  1.1  skrll    2) The insn_type is ITYPE_INSN.
   11338  1.1  skrll    3) The opcode can be encoded in the specified format and slot.
   11339  1.1  skrll    4) Operands are either O_constant or O_symbol, and all constants fit.  */
   11340  1.1  skrll 
   11341  1.1  skrll static bfd_boolean
   11342  1.1  skrll tinsn_to_slotbuf (xtensa_format fmt,
   11343  1.1  skrll 		  int slot,
   11344  1.1  skrll 		  TInsn *tinsn,
   11345  1.1  skrll 		  xtensa_insnbuf slotbuf)
   11346  1.1  skrll {
   11347  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   11348  1.1  skrll   xtensa_opcode opcode = tinsn->opcode;
   11349  1.1  skrll   bfd_boolean has_fixup = FALSE;
   11350  1.1  skrll   int noperands = xtensa_opcode_num_operands (isa, opcode);
   11351  1.1  skrll   int i;
   11352  1.1  skrll 
   11353  1.1  skrll   assert (tinsn->insn_type == ITYPE_INSN);
   11354  1.1  skrll   if (noperands != tinsn->ntok)
   11355  1.1  skrll     as_fatal (_("operand number mismatch"));
   11356  1.1  skrll 
   11357  1.1  skrll   if (xtensa_opcode_encode (isa, fmt, slot, slotbuf, opcode))
   11358  1.1  skrll     {
   11359  1.1  skrll       as_bad (_("cannot encode opcode \"%s\" in the given format \"%s\""),
   11360  1.1  skrll 	      xtensa_opcode_name (isa, opcode), xtensa_format_name (isa, fmt));
   11361  1.1  skrll       return FALSE;
   11362  1.1  skrll     }
   11363  1.1  skrll 
   11364  1.1  skrll   for (i = 0; i < noperands; i++)
   11365  1.1  skrll     {
   11366  1.1  skrll       expressionS *expr = &tinsn->tok[i];
   11367  1.1  skrll       int rc;
   11368  1.1  skrll       unsigned line;
   11369  1.1  skrll       char *file_name;
   11370  1.1  skrll       uint32 opnd_value;
   11371  1.1  skrll 
   11372  1.1  skrll       switch (expr->X_op)
   11373  1.1  skrll 	{
   11374  1.1  skrll 	case O_register:
   11375  1.1  skrll 	  if (xtensa_operand_is_visible (isa, opcode, i) == 0)
   11376  1.1  skrll 	    break;
   11377  1.1  skrll 	  /* The register number has already been checked in
   11378  1.1  skrll 	     expression_maybe_register, so we don't need to check here.  */
   11379  1.1  skrll 	  opnd_value = expr->X_add_number;
   11380  1.1  skrll 	  (void) xtensa_operand_encode (isa, opcode, i, &opnd_value);
   11381  1.1  skrll 	  rc = xtensa_operand_set_field (isa, opcode, i, fmt, slot, slotbuf,
   11382  1.1  skrll 					 opnd_value);
   11383  1.1  skrll 	  if (rc != 0)
   11384  1.1  skrll 	    as_warn (_("xtensa-isa failure: %s"), xtensa_isa_error_msg (isa));
   11385  1.1  skrll 	  break;
   11386  1.1  skrll 
   11387  1.1  skrll 	case O_constant:
   11388  1.1  skrll 	  if (xtensa_operand_is_visible (isa, opcode, i) == 0)
   11389  1.1  skrll 	    break;
   11390  1.1  skrll 	  as_where (&file_name, &line);
   11391  1.1  skrll 	  /* It is a constant and we called this function
   11392  1.1  skrll 	     then we have to try to fit it.  */
   11393  1.1  skrll 	  xtensa_insnbuf_set_operand (slotbuf, fmt, slot, opcode, i,
   11394  1.1  skrll 				      expr->X_add_number, file_name, line);
   11395  1.1  skrll 	  break;
   11396  1.1  skrll 
   11397  1.1  skrll 	default:
   11398  1.1  skrll 	  has_fixup = TRUE;
   11399  1.1  skrll 	  break;
   11400  1.1  skrll 	}
   11401  1.1  skrll     }
   11402  1.1  skrll 
   11403  1.1  skrll   return has_fixup;
   11404  1.1  skrll }
   11405  1.1  skrll 
   11406  1.1  skrll 
   11407  1.1  skrll /* Encode a single TInsn into an insnbuf.  If the opcode can only be encoded
   11408  1.1  skrll    into a multi-slot instruction, fill the other slots with NOPs.
   11409  1.1  skrll    Return TRUE if there is a symbol in the immediate field.  See also the
   11410  1.1  skrll    assumptions listed for tinsn_to_slotbuf.  */
   11411  1.1  skrll 
   11412  1.1  skrll static bfd_boolean
   11413  1.1  skrll tinsn_to_insnbuf (TInsn *tinsn, xtensa_insnbuf insnbuf)
   11414  1.1  skrll {
   11415  1.1  skrll   static xtensa_insnbuf slotbuf = 0;
   11416  1.1  skrll   static vliw_insn vinsn;
   11417  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   11418  1.1  skrll   bfd_boolean has_fixup = FALSE;
   11419  1.1  skrll   int i;
   11420  1.1  skrll 
   11421  1.1  skrll   if (!slotbuf)
   11422  1.1  skrll     {
   11423  1.1  skrll       slotbuf = xtensa_insnbuf_alloc (isa);
   11424  1.1  skrll       xg_init_vinsn (&vinsn);
   11425  1.1  skrll     }
   11426  1.1  skrll 
   11427  1.1  skrll   xg_clear_vinsn (&vinsn);
   11428  1.1  skrll 
   11429  1.1  skrll   bundle_tinsn (tinsn, &vinsn);
   11430  1.1  skrll 
   11431  1.1  skrll   xtensa_format_encode (isa, vinsn.format, insnbuf);
   11432  1.1  skrll 
   11433  1.1  skrll   for (i = 0; i < vinsn.num_slots; i++)
   11434  1.1  skrll     {
   11435  1.1  skrll       /* Only one slot may have a fix-up because the rest contains NOPs.  */
   11436  1.1  skrll       has_fixup |=
   11437  1.1  skrll 	tinsn_to_slotbuf (vinsn.format, i, &vinsn.slots[i], vinsn.slotbuf[i]);
   11438  1.1  skrll       xtensa_format_set_slot (isa, vinsn.format, i, insnbuf, vinsn.slotbuf[i]);
   11439  1.1  skrll     }
   11440  1.1  skrll 
   11441  1.1  skrll   return has_fixup;
   11442  1.1  skrll }
   11443  1.1  skrll 
   11444  1.1  skrll 
   11445  1.1  skrll /* Check the instruction arguments.  Return TRUE on failure.  */
   11446  1.1  skrll 
   11447  1.1  skrll static bfd_boolean
   11448  1.1  skrll tinsn_check_arguments (const TInsn *insn)
   11449  1.1  skrll {
   11450  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   11451  1.1  skrll   xtensa_opcode opcode = insn->opcode;
   11452  1.1  skrll 
   11453  1.1  skrll   if (opcode == XTENSA_UNDEFINED)
   11454  1.1  skrll     {
   11455  1.1  skrll       as_bad (_("invalid opcode"));
   11456  1.1  skrll       return TRUE;
   11457  1.1  skrll     }
   11458  1.1  skrll 
   11459  1.1  skrll   if (xtensa_opcode_num_operands (isa, opcode) > insn->ntok)
   11460  1.1  skrll     {
   11461  1.1  skrll       as_bad (_("too few operands"));
   11462  1.1  skrll       return TRUE;
   11463  1.1  skrll     }
   11464  1.1  skrll 
   11465  1.1  skrll   if (xtensa_opcode_num_operands (isa, opcode) < insn->ntok)
   11466  1.1  skrll     {
   11467  1.1  skrll       as_bad (_("too many operands"));
   11468  1.1  skrll       return TRUE;
   11469  1.1  skrll     }
   11470  1.1  skrll   return FALSE;
   11471  1.1  skrll }
   11472  1.1  skrll 
   11473  1.1  skrll 
   11474  1.1  skrll /* Load an instruction from its encoded form.  */
   11475  1.1  skrll 
   11476  1.1  skrll static void
   11477  1.1  skrll tinsn_from_chars (TInsn *tinsn, char *f, int slot)
   11478  1.1  skrll {
   11479  1.1  skrll   vliw_insn vinsn;
   11480  1.1  skrll 
   11481  1.1  skrll   xg_init_vinsn (&vinsn);
   11482  1.1  skrll   vinsn_from_chars (&vinsn, f);
   11483  1.1  skrll 
   11484  1.1  skrll   *tinsn = vinsn.slots[slot];
   11485  1.1  skrll   xg_free_vinsn (&vinsn);
   11486  1.1  skrll }
   11487  1.1  skrll 
   11488  1.1  skrll 
   11489  1.1  skrll static void
   11490  1.1  skrll tinsn_from_insnbuf (TInsn *tinsn,
   11491  1.1  skrll 		    xtensa_insnbuf slotbuf,
   11492  1.1  skrll 		    xtensa_format fmt,
   11493  1.1  skrll 		    int slot)
   11494  1.1  skrll {
   11495  1.1  skrll   int i;
   11496  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   11497  1.1  skrll 
   11498  1.1  skrll   /* Find the immed.  */
   11499  1.1  skrll   tinsn_init (tinsn);
   11500  1.1  skrll   tinsn->insn_type = ITYPE_INSN;
   11501  1.1  skrll   tinsn->is_specific_opcode = FALSE;	/* must not be specific */
   11502  1.1  skrll   tinsn->opcode = xtensa_opcode_decode (isa, fmt, slot, slotbuf);
   11503  1.1  skrll   tinsn->ntok = xtensa_opcode_num_operands (isa, tinsn->opcode);
   11504  1.1  skrll   for (i = 0; i < tinsn->ntok; i++)
   11505  1.1  skrll     {
   11506  1.1  skrll       set_expr_const (&tinsn->tok[i],
   11507  1.1  skrll 		      xtensa_insnbuf_get_operand (slotbuf, fmt, slot,
   11508  1.1  skrll 						  tinsn->opcode, i));
   11509  1.1  skrll     }
   11510  1.1  skrll }
   11511  1.1  skrll 
   11512  1.1  skrll 
   11513  1.1  skrll /* Read the value of the relaxable immed from the fr_symbol and fr_offset.  */
   11514  1.1  skrll 
   11515  1.1  skrll static void
   11516  1.1  skrll tinsn_immed_from_frag (TInsn *tinsn, fragS *fragP, int slot)
   11517  1.1  skrll {
   11518  1.1  skrll   xtensa_opcode opcode = tinsn->opcode;
   11519  1.1  skrll   int opnum;
   11520  1.1  skrll 
   11521  1.1  skrll   if (fragP->tc_frag_data.slot_symbols[slot])
   11522  1.1  skrll     {
   11523  1.1  skrll       opnum = get_relaxable_immed (opcode);
   11524  1.1  skrll       assert (opnum >= 0);
   11525  1.1  skrll       set_expr_symbol_offset (&tinsn->tok[opnum],
   11526  1.1  skrll 			      fragP->tc_frag_data.slot_symbols[slot],
   11527  1.1  skrll 			      fragP->tc_frag_data.slot_offsets[slot]);
   11528  1.1  skrll     }
   11529  1.1  skrll }
   11530  1.1  skrll 
   11531  1.1  skrll 
   11532  1.1  skrll static int
   11533  1.1  skrll get_num_stack_text_bytes (IStack *istack)
   11534  1.1  skrll {
   11535  1.1  skrll   int i;
   11536  1.1  skrll   int text_bytes = 0;
   11537  1.1  skrll 
   11538  1.1  skrll   for (i = 0; i < istack->ninsn; i++)
   11539  1.1  skrll     {
   11540  1.1  skrll       TInsn *tinsn = &istack->insn[i];
   11541  1.1  skrll       if (tinsn->insn_type == ITYPE_INSN)
   11542  1.1  skrll 	text_bytes += xg_get_single_size (tinsn->opcode);
   11543  1.1  skrll     }
   11544  1.1  skrll   return text_bytes;
   11545  1.1  skrll }
   11546  1.1  skrll 
   11547  1.1  skrll 
   11548  1.1  skrll static int
   11549  1.1  skrll get_num_stack_literal_bytes (IStack *istack)
   11550  1.1  skrll {
   11551  1.1  skrll   int i;
   11552  1.1  skrll   int lit_bytes = 0;
   11553  1.1  skrll 
   11554  1.1  skrll   for (i = 0; i < istack->ninsn; i++)
   11555  1.1  skrll     {
   11556  1.1  skrll       TInsn *tinsn = &istack->insn[i];
   11557  1.1  skrll       if (tinsn->insn_type == ITYPE_LITERAL && tinsn->ntok == 1)
   11558  1.1  skrll 	lit_bytes += 4;
   11559  1.1  skrll     }
   11560  1.1  skrll   return lit_bytes;
   11561  1.1  skrll }
   11562  1.1  skrll 
   11563  1.1  skrll 
   11564  1.1  skrll /* vliw_insn functions.  */
   11566  1.1  skrll 
   11567  1.1  skrll static void
   11568  1.1  skrll xg_init_vinsn (vliw_insn *v)
   11569  1.1  skrll {
   11570  1.1  skrll   int i;
   11571  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   11572  1.1  skrll 
   11573  1.1  skrll   xg_clear_vinsn (v);
   11574  1.1  skrll 
   11575  1.1  skrll   v->insnbuf = xtensa_insnbuf_alloc (isa);
   11576  1.1  skrll   if (v->insnbuf == NULL)
   11577  1.1  skrll     as_fatal (_("out of memory"));
   11578  1.1  skrll 
   11579  1.1  skrll   for (i = 0; i < MAX_SLOTS; i++)
   11580  1.1  skrll     {
   11581  1.1  skrll       v->slotbuf[i] = xtensa_insnbuf_alloc (isa);
   11582  1.1  skrll       if (v->slotbuf[i] == NULL)
   11583  1.1  skrll 	as_fatal (_("out of memory"));
   11584  1.1  skrll     }
   11585  1.1  skrll }
   11586  1.1  skrll 
   11587  1.1  skrll 
   11588  1.1  skrll static void
   11589  1.1  skrll xg_clear_vinsn (vliw_insn *v)
   11590  1.1  skrll {
   11591  1.1  skrll   int i;
   11592  1.1  skrll 
   11593  1.1  skrll   memset (v, 0, offsetof (vliw_insn, insnbuf));
   11594  1.1  skrll 
   11595  1.1  skrll   v->format = XTENSA_UNDEFINED;
   11596  1.1  skrll   v->num_slots = 0;
   11597  1.1  skrll   v->inside_bundle = FALSE;
   11598  1.1  skrll 
   11599  1.1  skrll   if (xt_saved_debug_type != DEBUG_NONE)
   11600  1.1  skrll     debug_type = xt_saved_debug_type;
   11601  1.1  skrll 
   11602  1.1  skrll   for (i = 0; i < MAX_SLOTS; i++)
   11603  1.1  skrll     v->slots[i].opcode = XTENSA_UNDEFINED;
   11604  1.1  skrll }
   11605  1.1  skrll 
   11606  1.1  skrll 
   11607  1.1  skrll static bfd_boolean
   11608  1.1  skrll vinsn_has_specific_opcodes (vliw_insn *v)
   11609  1.1  skrll {
   11610  1.1  skrll   int i;
   11611  1.1  skrll 
   11612  1.1  skrll   for (i = 0; i < v->num_slots; i++)
   11613  1.1  skrll     {
   11614  1.1  skrll       if (v->slots[i].is_specific_opcode)
   11615  1.1  skrll 	return TRUE;
   11616  1.1  skrll     }
   11617  1.1  skrll   return FALSE;
   11618  1.1  skrll }
   11619  1.1  skrll 
   11620  1.1  skrll 
   11621  1.1  skrll static void
   11622  1.1  skrll xg_free_vinsn (vliw_insn *v)
   11623  1.1  skrll {
   11624  1.1  skrll   int i;
   11625  1.1  skrll   xtensa_insnbuf_free (xtensa_default_isa, v->insnbuf);
   11626  1.1  skrll   for (i = 0; i < MAX_SLOTS; i++)
   11627  1.1  skrll     xtensa_insnbuf_free (xtensa_default_isa, v->slotbuf[i]);
   11628  1.1  skrll }
   11629  1.1  skrll 
   11630  1.1  skrll 
   11631  1.1  skrll /* Encode a vliw_insn into an insnbuf.  Return TRUE if there are any symbolic
   11632  1.1  skrll    operands.  See also the assumptions listed for tinsn_to_slotbuf.  */
   11633  1.1  skrll 
   11634  1.1  skrll static bfd_boolean
   11635  1.1  skrll vinsn_to_insnbuf (vliw_insn *vinsn,
   11636  1.1  skrll 		  char *frag_offset,
   11637  1.1  skrll 		  fragS *fragP,
   11638  1.1  skrll 		  bfd_boolean record_fixup)
   11639  1.1  skrll {
   11640  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   11641  1.1  skrll   xtensa_format fmt = vinsn->format;
   11642  1.1  skrll   xtensa_insnbuf insnbuf = vinsn->insnbuf;
   11643  1.1  skrll   int slot;
   11644  1.1  skrll   bfd_boolean has_fixup = FALSE;
   11645  1.1  skrll 
   11646  1.1  skrll   xtensa_format_encode (isa, fmt, insnbuf);
   11647  1.1  skrll 
   11648  1.1  skrll   for (slot = 0; slot < vinsn->num_slots; slot++)
   11649  1.1  skrll     {
   11650  1.1  skrll       TInsn *tinsn = &vinsn->slots[slot];
   11651  1.1  skrll       expressionS *tls_reloc = &tinsn->tls_reloc;
   11652  1.1  skrll       bfd_boolean tinsn_has_fixup =
   11653  1.1  skrll 	tinsn_to_slotbuf (vinsn->format, slot, tinsn,
   11654  1.1  skrll 			  vinsn->slotbuf[slot]);
   11655  1.1  skrll 
   11656  1.1  skrll       xtensa_format_set_slot (isa, fmt, slot,
   11657  1.1  skrll 			      insnbuf, vinsn->slotbuf[slot]);
   11658  1.1  skrll       if (tls_reloc->X_op != O_illegal)
   11659  1.1  skrll 	{
   11660  1.1  skrll 	  if (vinsn->num_slots != 1)
   11661  1.1  skrll 	    as_bad (_("TLS relocation not allowed in FLIX bundle"));
   11662  1.1  skrll 	  else if (record_fixup)
   11663  1.1  skrll 	    /* Instructions that generate TLS relocations should always be
   11664  1.1  skrll 	       relaxed in the front-end.  If "record_fixup" is set, then this
   11665  1.1  skrll 	       function is being called during back-end relaxation, so flag
   11666  1.1  skrll 	       the unexpected behavior as an error.  */
   11667  1.1  skrll 	    as_bad (_("unexpected TLS relocation"));
   11668  1.1  skrll 	  else
   11669  1.1  skrll 	    fix_new (fragP, frag_offset - fragP->fr_literal,
   11670  1.1  skrll 		     xtensa_format_length (isa, fmt),
   11671  1.1  skrll 		     tls_reloc->X_add_symbol, tls_reloc->X_add_number,
   11672  1.1  skrll 		     FALSE, map_operator_to_reloc (tls_reloc->X_op, FALSE));
   11673  1.1  skrll 	}
   11674  1.1  skrll       if (tinsn_has_fixup)
   11675  1.1  skrll 	{
   11676  1.1  skrll 	  int i;
   11677  1.1  skrll 	  xtensa_opcode opcode = tinsn->opcode;
   11678  1.1  skrll 	  int noperands = xtensa_opcode_num_operands (isa, opcode);
   11679  1.1  skrll 	  has_fixup = TRUE;
   11680  1.1  skrll 
   11681  1.1  skrll 	  for (i = 0; i < noperands; i++)
   11682  1.1  skrll 	    {
   11683  1.1  skrll 	      expressionS* expr = &tinsn->tok[i];
   11684  1.1  skrll 	      switch (expr->X_op)
   11685  1.1  skrll 		{
   11686  1.1  skrll 		case O_symbol:
   11687  1.1  skrll 		case O_lo16:
   11688  1.1  skrll 		case O_hi16:
   11689  1.1  skrll 		  if (get_relaxable_immed (opcode) == i)
   11690  1.1  skrll 		    {
   11691  1.1  skrll 		      /* Add a fix record for the instruction, except if this
   11692  1.1  skrll 			 function is being called prior to relaxation, i.e.,
   11693  1.1  skrll 			 if record_fixup is false, and the instruction might
   11694  1.1  skrll 			 be relaxed later.  */
   11695  1.1  skrll 		      if (record_fixup
   11696  1.1  skrll 			  || tinsn->is_specific_opcode
   11697  1.1  skrll 			  || !xg_is_relaxable_insn (tinsn, 0))
   11698  1.1  skrll 			{
   11699  1.1  skrll 			  xg_add_opcode_fix (tinsn, i, fmt, slot, expr, fragP,
   11700  1.1  skrll 					     frag_offset - fragP->fr_literal);
   11701  1.1  skrll 			}
   11702  1.1  skrll 		      else
   11703  1.1  skrll 			{
   11704  1.1  skrll 			  if (expr->X_op != O_symbol)
   11705  1.1  skrll 			    as_bad (_("invalid operand"));
   11706  1.1  skrll 			  tinsn->symbol = expr->X_add_symbol;
   11707  1.1  skrll 			  tinsn->offset = expr->X_add_number;
   11708  1.1  skrll 			}
   11709  1.1  skrll 		    }
   11710  1.1  skrll 		  else
   11711  1.1  skrll 		    as_bad (_("symbolic operand not allowed"));
   11712  1.1  skrll 		  break;
   11713  1.1  skrll 
   11714  1.1  skrll 		case O_constant:
   11715  1.1  skrll 		case O_register:
   11716  1.1  skrll 		  break;
   11717  1.1  skrll 
   11718  1.1  skrll 		default:
   11719  1.1  skrll 		  as_bad (_("expression too complex"));
   11720  1.1  skrll 		  break;
   11721  1.1  skrll 		}
   11722  1.1  skrll 	    }
   11723  1.1  skrll 	}
   11724  1.1  skrll     }
   11725  1.1  skrll 
   11726  1.1  skrll   return has_fixup;
   11727  1.1  skrll }
   11728  1.1  skrll 
   11729  1.1  skrll 
   11730  1.1  skrll static void
   11731  1.1  skrll vinsn_from_chars (vliw_insn *vinsn, char *f)
   11732  1.1  skrll {
   11733  1.1  skrll   static xtensa_insnbuf insnbuf = NULL;
   11734  1.1  skrll   static xtensa_insnbuf slotbuf = NULL;
   11735  1.1  skrll   int i;
   11736  1.1  skrll   xtensa_format fmt;
   11737  1.1  skrll   xtensa_isa isa = xtensa_default_isa;
   11738  1.1  skrll 
   11739  1.1  skrll   if (!insnbuf)
   11740  1.1  skrll     {
   11741  1.1  skrll       insnbuf = xtensa_insnbuf_alloc (isa);
   11742  1.1  skrll       slotbuf = xtensa_insnbuf_alloc (isa);
   11743  1.1  skrll     }
   11744  1.1  skrll 
   11745  1.1  skrll   xtensa_insnbuf_from_chars (isa, insnbuf, (unsigned char *) f, 0);
   11746  1.1  skrll   fmt = xtensa_format_decode (isa, insnbuf);
   11747  1.1  skrll   if (fmt == XTENSA_UNDEFINED)
   11748  1.1  skrll     as_fatal (_("cannot decode instruction format"));
   11749  1.1  skrll   vinsn->format = fmt;
   11750  1.1  skrll   vinsn->num_slots = xtensa_format_num_slots (isa, fmt);
   11751  1.1  skrll 
   11752  1.1  skrll   for (i = 0; i < vinsn->num_slots; i++)
   11753  1.1  skrll     {
   11754  1.1  skrll       TInsn *tinsn = &vinsn->slots[i];
   11755  1.1  skrll       xtensa_format_get_slot (isa, fmt, i, insnbuf, slotbuf);
   11756  1.1  skrll       tinsn_from_insnbuf (tinsn, slotbuf, fmt, i);
   11757  1.1  skrll     }
   11758  1.1  skrll }
   11759  1.1  skrll 
   11760  1.1  skrll 
   11761  1.1  skrll /* Expression utilities.  */
   11763  1.1  skrll 
   11764  1.1  skrll /* Return TRUE if the expression is an integer constant.  */
   11765  1.1  skrll 
   11766  1.1  skrll bfd_boolean
   11767  1.1  skrll expr_is_const (const expressionS *s)
   11768  1.1  skrll {
   11769  1.1  skrll   return (s->X_op == O_constant);
   11770  1.1  skrll }
   11771  1.1  skrll 
   11772  1.1  skrll 
   11773  1.1  skrll /* Get the expression constant.
   11774  1.1  skrll    Calling this is illegal if expr_is_const () returns TRUE.  */
   11775  1.1  skrll 
   11776  1.1  skrll offsetT
   11777  1.1  skrll get_expr_const (const expressionS *s)
   11778  1.1  skrll {
   11779  1.1  skrll   assert (expr_is_const (s));
   11780  1.1  skrll   return s->X_add_number;
   11781  1.1  skrll }
   11782  1.1  skrll 
   11783  1.1  skrll 
   11784  1.1  skrll /* Set the expression to a constant value.  */
   11785  1.1  skrll 
   11786  1.1  skrll void
   11787  1.1  skrll set_expr_const (expressionS *s, offsetT val)
   11788  1.1  skrll {
   11789  1.1  skrll   s->X_op = O_constant;
   11790  1.1  skrll   s->X_add_number = val;
   11791  1.1  skrll   s->X_add_symbol = NULL;
   11792  1.1  skrll   s->X_op_symbol = NULL;
   11793  1.1  skrll }
   11794  1.1  skrll 
   11795  1.1  skrll 
   11796  1.1  skrll bfd_boolean
   11797  1.1  skrll expr_is_register (const expressionS *s)
   11798  1.1  skrll {
   11799  1.1  skrll   return (s->X_op == O_register);
   11800  1.1  skrll }
   11801  1.1  skrll 
   11802  1.1  skrll 
   11803  1.1  skrll /* Get the expression constant.
   11804  1.1  skrll    Calling this is illegal if expr_is_const () returns TRUE.  */
   11805  1.1  skrll 
   11806  1.1  skrll offsetT
   11807  1.1  skrll get_expr_register (const expressionS *s)
   11808  1.1  skrll {
   11809  1.1  skrll   assert (expr_is_register (s));
   11810  1.1  skrll   return s->X_add_number;
   11811  1.1  skrll }
   11812  1.1  skrll 
   11813  1.1  skrll 
   11814  1.1  skrll /* Set the expression to a symbol + constant offset.  */
   11815  1.1  skrll 
   11816  1.1  skrll void
   11817  1.1  skrll set_expr_symbol_offset (expressionS *s, symbolS *sym, offsetT offset)
   11818  1.1  skrll {
   11819  1.1  skrll   s->X_op = O_symbol;
   11820  1.1  skrll   s->X_add_symbol = sym;
   11821  1.1  skrll   s->X_op_symbol = NULL;	/* unused */
   11822  1.1  skrll   s->X_add_number = offset;
   11823  1.1  skrll }
   11824  1.1  skrll 
   11825  1.1  skrll 
   11826  1.1  skrll /* Return TRUE if the two expressions are equal.  */
   11827  1.1  skrll 
   11828  1.1  skrll bfd_boolean
   11829  1.1  skrll expr_is_equal (expressionS *s1, expressionS *s2)
   11830  1.1  skrll {
   11831  1.1  skrll   if (s1->X_op != s2->X_op)
   11832  1.1  skrll     return FALSE;
   11833  1.1  skrll   if (s1->X_add_symbol != s2->X_add_symbol)
   11834  1.1  skrll     return FALSE;
   11835  1.1  skrll   if (s1->X_op_symbol != s2->X_op_symbol)
   11836  1.1  skrll     return FALSE;
   11837  1.1  skrll   if (s1->X_add_number != s2->X_add_number)
   11838  1.1  skrll     return FALSE;
   11839  1.1  skrll   return TRUE;
   11840  1.1  skrll }
   11841  1.1  skrll 
   11842  1.1  skrll 
   11843  1.1  skrll static void
   11844  1.1  skrll copy_expr (expressionS *dst, const expressionS *src)
   11845  1.1  skrll {
   11846  1.1  skrll   memcpy (dst, src, sizeof (expressionS));
   11847  1.1  skrll }
   11848  1.1  skrll 
   11849  1.1  skrll 
   11850  1.1  skrll /* Support for the "--rename-section" option.  */
   11852  1.1  skrll 
   11853  1.1  skrll struct rename_section_struct
   11854  1.1  skrll {
   11855  1.1  skrll   char *old_name;
   11856  1.1  skrll   char *new_name;
   11857  1.1  skrll   struct rename_section_struct *next;
   11858  1.1  skrll };
   11859  1.1  skrll 
   11860  1.1  skrll static struct rename_section_struct *section_rename;
   11861  1.1  skrll 
   11862  1.1  skrll 
   11863  1.1  skrll /* Parse the string "oldname=new_name(:oldname2=new_name2)*" and add
   11864  1.1  skrll    entries to the section_rename list.  Note: Specifying multiple
   11865  1.1  skrll    renamings separated by colons is not documented and is retained only
   11866  1.1  skrll    for backward compatibility.  */
   11867  1.1  skrll 
   11868  1.1  skrll static void
   11869  1.1  skrll build_section_rename (const char *arg)
   11870  1.1  skrll {
   11871  1.1  skrll   struct rename_section_struct *r;
   11872  1.1  skrll   char *this_arg = NULL;
   11873  1.1  skrll   char *next_arg = NULL;
   11874  1.1  skrll 
   11875  1.1  skrll   for (this_arg = xstrdup (arg); this_arg != NULL; this_arg = next_arg)
   11876  1.1  skrll     {
   11877  1.1  skrll       char *old_name, *new_name;
   11878  1.1  skrll 
   11879  1.1  skrll       if (this_arg)
   11880  1.1  skrll 	{
   11881  1.1  skrll 	  next_arg = strchr (this_arg, ':');
   11882  1.1  skrll 	  if (next_arg)
   11883  1.1  skrll 	    {
   11884  1.1  skrll 	      *next_arg = '\0';
   11885  1.1  skrll 	      next_arg++;
   11886  1.1  skrll 	    }
   11887  1.1  skrll 	}
   11888  1.1  skrll 
   11889  1.1  skrll       old_name = this_arg;
   11890  1.1  skrll       new_name = strchr (this_arg, '=');
   11891  1.1  skrll 
   11892  1.1  skrll       if (*old_name == '\0')
   11893  1.1  skrll 	{
   11894  1.1  skrll 	  as_warn (_("ignoring extra '-rename-section' delimiter ':'"));
   11895  1.1  skrll 	  continue;
   11896  1.1  skrll 	}
   11897  1.1  skrll       if (!new_name || new_name[1] == '\0')
   11898  1.1  skrll 	{
   11899  1.1  skrll 	  as_warn (_("ignoring invalid '-rename-section' specification: '%s'"),
   11900  1.1  skrll 		   old_name);
   11901  1.1  skrll 	  continue;
   11902  1.1  skrll 	}
   11903  1.1  skrll       *new_name = '\0';
   11904  1.1  skrll       new_name++;
   11905  1.1  skrll 
   11906  1.1  skrll       /* Check for invalid section renaming.  */
   11907  1.1  skrll       for (r = section_rename; r != NULL; r = r->next)
   11908  1.1  skrll 	{
   11909  1.1  skrll 	  if (strcmp (r->old_name, old_name) == 0)
   11910  1.1  skrll 	    as_bad (_("section %s renamed multiple times"), old_name);
   11911  1.1  skrll 	  if (strcmp (r->new_name, new_name) == 0)
   11912  1.1  skrll 	    as_bad (_("multiple sections remapped to output section %s"),
   11913  1.1  skrll 		    new_name);
   11914  1.1  skrll 	}
   11915  1.1  skrll 
   11916                   /* Now add it.  */
   11917                   r = (struct rename_section_struct *)
   11918             	xmalloc (sizeof (struct rename_section_struct));
   11919                   r->old_name = xstrdup (old_name);
   11920                   r->new_name = xstrdup (new_name);
   11921                   r->next = section_rename;
   11922                   section_rename = r;
   11923                 }
   11924             }
   11925             
   11926             
   11927             char *
   11928             xtensa_section_rename (char *name)
   11929             {
   11930               struct rename_section_struct *r = section_rename;
   11931             
   11932               for (r = section_rename; r != NULL; r = r->next)
   11933                 {
   11934                   if (strcmp (r->old_name, name) == 0)
   11935             	return r->new_name;
   11936                 }
   11937             
   11938               return name;
   11939             }
   11940