1  /* Declarations for stacks of tokenized Xtensa instructions.
       2     Copyright (C) 2003-2023 Free Software Foundation, Inc.
       3  
       4     This file is part of GAS, the GNU Assembler.
       5  
       6     GAS is free software; you can redistribute it and/or modify
       7     it under the terms of the GNU General Public License as published by
       8     the Free Software Foundation; either version 3, or (at your option)
       9     any later version.
      10  
      11     GAS is distributed in the hope that it will be useful,
      12     but WITHOUT ANY WARRANTY; without even the implied warranty of
      13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14     GNU General Public License for more details.
      15  
      16     You should have received a copy of the GNU General Public License
      17     along with GAS; see the file COPYING.  If not, write to the Free
      18     Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
      19     02110-1301, USA.  */
      20  
      21  #ifndef XTENSA_ISTACK_H
      22  #define XTENSA_ISTACK_H
      23  
      24  #include "xtensa-isa.h"
      25  
      26  #define MAX_ISTACK 12
      27  #define MAX_INSN_ARGS 64
      28  
      29  enum itype_enum
      30  {
      31    ITYPE_INSN,
      32    ITYPE_LITERAL,
      33    ITYPE_LABEL
      34  };
      35  
      36  
      37  /* Literals have 1 token and no opcode.
      38     Labels have 1 token and no opcode.  */
      39  
      40  typedef struct tinsn_struct
      41  {
      42    enum itype_enum insn_type;
      43  
      44    xtensa_opcode opcode;	/* Literals have an invalid opcode.  */
      45    bool is_specific_opcode;
      46    bool keep_wide;
      47    int ntok;
      48    expressionS tok[MAX_INSN_ARGS];
      49    bool loc_directive_seen;
      50    struct dwarf2_line_info debug_line;
      51  
      52    /* This field is used for two types of special pseudo ops:
      53       1. TLS-related operations.  Eg:  callx8.tls
      54       2. j.l  label, a2
      55  
      56       For the tls-related operations, it will hold a tls-related opcode
      57       and info to be used in a fixup.  For j.l it will hold a
      58       register to be used during relaxation.  */
      59    expressionS extra_arg;
      60  
      61    /* Filled out by relaxation_requirements:  */
      62    enum xtensa_relax_statesE subtype;
      63    int literal_space;
      64  
      65    /* Filled out by vinsn_to_insnbuf:  */
      66    symbolS *symbol;
      67    offsetT offset;
      68    fragS *literal_frag;
      69  } TInsn;
      70  
      71  
      72  /* tinsn_stack:  This is a stack of instructions to  be placed.  */
      73  
      74  typedef struct tinsn_stack
      75  {
      76    int ninsn;
      77    TInsn insn[MAX_ISTACK];
      78  } IStack;
      79  
      80  
      81  void istack_init (IStack *);
      82  bool istack_empty (IStack *);
      83  bool istack_full (IStack *);
      84  TInsn *istack_top (IStack *);
      85  void istack_push (IStack *, TInsn *);
      86  TInsn *istack_push_space (IStack *);
      87  void istack_pop (IStack *);
      88  
      89  /* TInsn utilities.  */
      90  void tinsn_init (TInsn *);
      91  
      92  
      93  /* vliw_insn: bundles of TInsns.  */
      94  
      95  typedef struct vliw_insn
      96  {
      97    xtensa_format format;
      98    int num_slots;
      99    unsigned int inside_bundle;
     100    TInsn slots[MAX_SLOTS];
     101    xtensa_insnbuf insnbuf;
     102    xtensa_insnbuf slotbuf[MAX_SLOTS];
     103  } vliw_insn;
     104  
     105  #endif /* !XTENSA_ISTACK_H */