1/* Table of relaxations for Xtensa assembly.
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
18   the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
19   MA 02110-1301, 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
30typedef struct transition_list TransitionList;
31typedef struct transition_table TransitionTable;
32typedef struct transition_rule TransitionRule;
33typedef struct precondition_list PreconditionList;
34typedef struct precondition Precondition;
35
36typedef struct req_or_option_list ReqOrOptionList;
37typedef struct req_or_option_list ReqOrOption;
38typedef struct req_option_list ReqOptionList;
39typedef struct req_option_list ReqOption;
40
41struct transition_table
42{
43  int num_opcodes;
44  TransitionList **table;	/* Possible transitions for each opcode.  */
45};
46
47struct transition_list
48{
49  TransitionRule *rule;
50  TransitionList *next;
51};
52
53struct precondition_list
54{
55  Precondition *precond;
56  PreconditionList *next;
57};
58
59
60/* The required options for a rule are represented with a two-level
61   structure, with leaf expressions combined by logical ORs at the
62   lower level, and the results then combined by logical ANDs at the
63   top level.  The AND terms are linked in a list, and each one can
64   contain a reference to a list of OR terms.  The leaf expressions,
65   i.e., the OR options, can be negated by setting the is_true field
66   to FALSE.  There are two classes of leaf expressions: (1) those
67   that are properties of the Xtensa configuration and can be
68   evaluated once when building the tables, and (2) those that depend
69   of the state of directives or other settings that may vary during
70   the assembly.  The following expressions may be used in group (1):
71
72   IsaUse*:	Xtensa configuration settings.
73   realnop:	TRUE if the instruction set includes a NOP instruction.
74
75   There are currently no expressions in group (2), but they are still
76   supported since there is a good chance they'll be needed again for
77   something.  */
78
79struct req_option_list
80{
81  ReqOrOptionList *or_option_terms;
82  ReqOptionList *next;
83};
84
85struct req_or_option_list
86{
87  char *option_name;
88  bfd_boolean is_true;
89  ReqOrOptionList *next;
90};
91
92/* Operand types and constraints on operands:  */
93
94typedef enum op_type
95{
96  OP_CONSTANT,
97  OP_OPERAND,
98  OP_OPERAND_LOW8,		/* Sign-extended low 8 bits of immed.  */
99  OP_OPERAND_HI24S,		/* High 24 bits of immed,
100				   plus 0x100 if low 8 bits are signed.  */
101  OP_OPERAND_F32MINUS,		/* 32 - immed.  */
102  OP_OPERAND_LOW16U,		/* Low 16 bits of immed.  */
103  OP_OPERAND_HI16U,		/* High 16 bits of immed.  */
104  OP_LITERAL,
105  OP_FREEREG,
106  OP_LABEL
107} OpType;
108
109typedef enum cmp_op
110{
111  OP_EQUAL,
112  OP_NOTEQUAL,
113} CmpOp;
114
115struct precondition
116{
117  CmpOp cmp;
118  int op_num;
119  OpType typ;			/* CONSTANT: op_data is a constant.
120				   OPERAND: operand op_num must equal op_data.
121				   Cannot be LITERAL or LABEL.  */
122  int op_data;
123};
124
125
126typedef struct build_op BuildOp;
127
128struct build_op
129{
130  int op_num;
131  OpType typ;
132  unsigned op_data;		/* CONSTANT: op_data is the value to encode.
133				   OPERAND: op_data is the field in the
134				   source instruction to take the value from
135				   and encode in the op_num field here.
136				   LITERAL: op_data is field in the source
137				   instruction that is stored in the literal.
138				   LABEL: unused.  */
139  BuildOp *next;
140};
141
142typedef struct build_instr BuildInstr;
143
144typedef enum instr_type
145{
146  INSTR_INSTR,
147  INSTR_LITERAL_DEF,
148  INSTR_LABEL_DEF
149} InstrType;
150
151struct build_instr
152{
153  InstrType typ;
154  xtensa_opcode opcode;		/* Unused for LITERAL_DEF or LABEL_DEF.  */
155  BuildOp *ops;
156  BuildInstr *next;
157};
158
159struct transition_rule
160{
161  xtensa_opcode opcode;
162  PreconditionList *conditions;
163  ReqOptionList *options;
164  BuildInstr *to_instr;
165};
166
167typedef int (*transition_cmp_fn) (const TransitionRule *,
168				  const TransitionRule *);
169
170extern TransitionTable *xg_build_simplify_table (transition_cmp_fn);
171extern TransitionTable *xg_build_widen_table (transition_cmp_fn);
172
173extern bfd_boolean xg_has_userdef_op_fn (OpType);
174extern long xg_apply_userdef_op_fn (OpType, long);
175
176enum flix_level
177{
178  FLIX_ALL,
179  FLIX_NO_GENERATE,
180  FLIX_NONE
181};
182
183extern enum flix_level produce_flix;
184
185#endif /* !XTENSA_RELAX_H */
186