| 1 | /* Table of relaxations for Xtensa assembly.
 | 
|---|
| 2 |    Copyright 2003 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 2, or (at your option)
 | 
|---|
| 9 |    any later version.
 | 
|---|
| 10 | 
 | 
|---|
| 11 |    GAS is distributed in the hope that it will be useful,
 | 
|---|
| 12 |    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
|---|
| 13 |    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
|---|
| 14 |    GNU General Public License for more details.
 | 
|---|
| 15 | 
 | 
|---|
| 16 |    You should have received a copy of the GNU General Public License
 | 
|---|
| 17 |    along with GAS; see the file COPYING.  If not, write to
 | 
|---|
| 18 |    the Free Software Foundation, 59 Temple Place - Suite 330, Boston, 
 | 
|---|
| 19 |    MA 02111-1307, USA.  */
 | 
|---|
| 20 | 
 | 
|---|
| 21 | #ifndef XTENSA_RELAX_H
 | 
|---|
| 22 | #define XTENSA_RELAX_H
 | 
|---|
| 23 | 
 | 
|---|
| 24 | #include "xtensa-isa.h"
 | 
|---|
| 25 | 
 | 
|---|
| 26 | 
 | 
|---|
| 27 | /* Data structures for the table-driven relaxations for Xtensa processors.
 | 
|---|
| 28 |    See xtensa-relax.c for details.  */
 | 
|---|
| 29 | 
 | 
|---|
| 30 | typedef struct transition_list TransitionList;
 | 
|---|
| 31 | typedef struct transition_table TransitionTable;
 | 
|---|
| 32 | typedef struct transition_rule TransitionRule;
 | 
|---|
| 33 | typedef struct precondition_list PreconditionList;
 | 
|---|
| 34 | typedef struct precondition Precondition;
 | 
|---|
| 35 | 
 | 
|---|
| 36 | struct transition_table
 | 
|---|
| 37 | {
 | 
|---|
| 38 |   int num_opcodes;
 | 
|---|
| 39 |   TransitionList **table;       /* Possible transitions for each opcode.  */
 | 
|---|
| 40 | };
 | 
|---|
| 41 | 
 | 
|---|
| 42 | struct transition_list
 | 
|---|
| 43 | {
 | 
|---|
| 44 |   TransitionRule *rule;
 | 
|---|
| 45 |   TransitionList *next;
 | 
|---|
| 46 | };
 | 
|---|
| 47 | 
 | 
|---|
| 48 | struct precondition_list
 | 
|---|
| 49 | {
 | 
|---|
| 50 |   Precondition *precond;
 | 
|---|
| 51 |   PreconditionList *next;
 | 
|---|
| 52 | };
 | 
|---|
| 53 | 
 | 
|---|
| 54 | 
 | 
|---|
| 55 | /* Operand types and constraints on operands:  */
 | 
|---|
| 56 | 
 | 
|---|
| 57 | typedef enum op_type OpType;
 | 
|---|
| 58 | typedef enum cmp_op CmpOp;
 | 
|---|
| 59 | 
 | 
|---|
| 60 | enum op_type
 | 
|---|
| 61 | {
 | 
|---|
| 62 |   OP_CONSTANT,
 | 
|---|
| 63 |   OP_OPERAND,
 | 
|---|
| 64 |   OP_OPERAND_LOW8,              /* Sign-extended low 8 bits of immed.  */
 | 
|---|
| 65 |   OP_OPERAND_HI24S,             /* high 24 bits of immed,
 | 
|---|
| 66 |                                    plus 0x100 if low 8 bits are signed.  */
 | 
|---|
| 67 |   OP_OPERAND_F32MINUS,          /* 32 - immed.  */
 | 
|---|
| 68 |   OP_LITERAL,
 | 
|---|
| 69 |   OP_LABEL
 | 
|---|
| 70 | };
 | 
|---|
| 71 | 
 | 
|---|
| 72 | enum cmp_op
 | 
|---|
| 73 | {
 | 
|---|
| 74 |   OP_EQUAL,
 | 
|---|
| 75 |   OP_NOTEQUAL,
 | 
|---|
| 76 | };
 | 
|---|
| 77 | 
 | 
|---|
| 78 | struct precondition
 | 
|---|
| 79 | {
 | 
|---|
| 80 |   CmpOp cmp;
 | 
|---|
| 81 |   int op_num;
 | 
|---|
| 82 |   OpType typ;                   /* CONSTANT: op_data is a constant.
 | 
|---|
| 83 |                                    OPERAND: operand op_num must equal op_data.
 | 
|---|
| 84 |                                    Cannot be LITERAL or LABEL.  */
 | 
|---|
| 85 |   int op_data;
 | 
|---|
| 86 | };
 | 
|---|
| 87 | 
 | 
|---|
| 88 | typedef struct build_op BuildOp;
 | 
|---|
| 89 | 
 | 
|---|
| 90 | struct build_op
 | 
|---|
| 91 | {
 | 
|---|
| 92 |   int op_num;
 | 
|---|
| 93 |   OpType typ;
 | 
|---|
| 94 |   unsigned op_data;             /* CONSTANT: op_data is the value to encode.
 | 
|---|
| 95 |                                    OPERAND: op_data is the field in the
 | 
|---|
| 96 |                                    source instruction to take the value from
 | 
|---|
| 97 |                                    and encode in the op_num field here.
 | 
|---|
| 98 |                                    LITERAL or LABEL: op_data is the ordinal
 | 
|---|
| 99 |                                    that identifies the appropriate one, i.e.,
 | 
|---|
| 100 |                                    there can be more than one literal or
 | 
|---|
| 101 |                                    label in an expansion.  */
 | 
|---|
| 102 |   BuildOp *next;
 | 
|---|
| 103 | };
 | 
|---|
| 104 | 
 | 
|---|
| 105 | typedef struct build_instr BuildInstr;
 | 
|---|
| 106 | typedef enum instr_type InstrType;
 | 
|---|
| 107 | 
 | 
|---|
| 108 | enum instr_type
 | 
|---|
| 109 | {
 | 
|---|
| 110 |   INSTR_INSTR,
 | 
|---|
| 111 |   INSTR_LITERAL_DEF,
 | 
|---|
| 112 |   INSTR_LABEL_DEF
 | 
|---|
| 113 | };
 | 
|---|
| 114 | 
 | 
|---|
| 115 | struct build_instr
 | 
|---|
| 116 | {
 | 
|---|
| 117 |   InstrType typ;
 | 
|---|
| 118 |   unsigned id;                  /* LITERAL_DEF or LABEL_DEF: an ordinal to
 | 
|---|
| 119 |                                    identify which one.  */
 | 
|---|
| 120 |   xtensa_opcode opcode;         /* unused for LITERAL_DEF or LABEL_DEF.  */
 | 
|---|
| 121 |   BuildOp *ops;
 | 
|---|
| 122 |   BuildInstr *next;
 | 
|---|
| 123 | };
 | 
|---|
| 124 | 
 | 
|---|
| 125 | struct transition_rule
 | 
|---|
| 126 | {
 | 
|---|
| 127 |   xtensa_opcode opcode;
 | 
|---|
| 128 |   PreconditionList *conditions;
 | 
|---|
| 129 |   BuildInstr *to_instr;
 | 
|---|
| 130 | };
 | 
|---|
| 131 | 
 | 
|---|
| 132 | extern TransitionTable *xg_build_simplify_table
 | 
|---|
| 133 |   PARAMS ((void));
 | 
|---|
| 134 | extern TransitionTable *xg_build_widen_table
 | 
|---|
| 135 |   PARAMS ((void));
 | 
|---|
| 136 | 
 | 
|---|
| 137 | extern bfd_boolean xg_has_userdef_op_fn
 | 
|---|
| 138 |   PARAMS ((OpType));
 | 
|---|
| 139 | extern long xg_apply_userdef_op_fn
 | 
|---|
| 140 |   PARAMS ((OpType, long));
 | 
|---|
| 141 | 
 | 
|---|
| 142 | #endif /* !XTENSA_RELAX_H */
 | 
|---|