1 /* Declarations for stacks of tokenized Xtensa instructions. 2 Copyright (C) 2003-2021 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 */ 106