1/* Declarations for stacks of tokenized Xtensa instructions. 2 Copyright (C) 2003-2017 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 29enum 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 40typedef struct tinsn_struct 41{ 42 enum itype_enum insn_type; 43 44 xtensa_opcode opcode; /* Literals have an invalid opcode. */ 45 bfd_boolean is_specific_opcode; 46 bfd_boolean keep_wide; 47 int ntok; 48 expressionS tok[MAX_INSN_ARGS]; 49 bfd_boolean 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 74typedef struct tinsn_stack 75{ 76 int ninsn; 77 TInsn insn[MAX_ISTACK]; 78} IStack; 79 80 81void istack_init (IStack *); 82bfd_boolean istack_empty (IStack *); 83bfd_boolean istack_full (IStack *); 84TInsn *istack_top (IStack *); 85void istack_push (IStack *, TInsn *); 86TInsn *istack_push_space (IStack *); 87void istack_pop (IStack *); 88 89/* TInsn utilities. */ 90void tinsn_init (TInsn *); 91 92 93/* vliw_insn: bundles of TInsns. */ 94 95typedef 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