Add Xtensa port
[deliverable/binutils-gdb.git] / gas / config / xtensa-relax.h
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 */
This page took 0.033059 seconds and 4 git commands to generate.