include/opcode/
[deliverable/binutils-gdb.git] / gas / config / bfin-defs.h
CommitLineData
07c1b327
CM
1/* bfin-defs.h ADI Blackfin gas header file
2 Copyright 2005
3 Free Software Foundation, Inc.
4
5 This file is part of GAS, the GNU Assembler.
6
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GAS is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to the Free
19 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
20 02110-1301, USA. */
21
22#ifndef BFIN_PARSE_H
23#define BFIN_PARSE_H
24
25#include <bfd.h>
26#include "as.h"
27
28#define PCREL 1
29#define CODE_FRAG_SIZE 4096 /* 1 page. */
30
31
32/* Definition for all status bits. */
33typedef enum
34{
35 c_0,
36 c_1,
37 c_4,
38 c_2,
39 c_uimm2,
40 c_uimm3,
41 c_imm3,
42 c_pcrel4,
43 c_imm4,
44 c_uimm4s4,
45 c_uimm4,
46 c_uimm4s2,
47 c_negimm5s4,
48 c_imm5,
49 c_uimm5,
50 c_imm6,
51 c_imm7,
52 c_imm8,
53 c_uimm8,
54 c_pcrel8,
55 c_uimm8s4,
56 c_pcrel8s4,
57 c_lppcrel10,
58 c_pcrel10,
59 c_pcrel12,
60 c_imm16s4,
61 c_luimm16,
62 c_imm16,
63 c_huimm16,
64 c_rimm16,
65 c_imm16s2,
66 c_uimm16s4,
67 c_uimm16,
68 c_pcrel24
69} const_forms_t;
70
71
72/* High-Nibble: group code, low nibble: register code. */
73
74
75#define T_REG_R 0x00
76#define T_REG_P 0x10
77#define T_REG_I 0x20
78#define T_REG_B 0x30
79#define T_REG_L 0x34
80#define T_REG_M 0x24
81#define T_REG_A 0x40
82
83/* All registers above this value don't
84 belong to a usuable register group. */
85#define T_NOGROUP 0xa0
86
87/* Flags. */
88#define F_REG_ALL 0x1000
89#define F_REG_HIGH 0x2000 /* Half register: high half. */
90
91enum machine_registers
92{
93 REG_R0 = T_REG_R, REG_R1, REG_R2, REG_R3, REG_R4, REG_R5, REG_R6, REG_R7,
94 REG_P0 = T_REG_P, REG_P1, REG_P2, REG_P3, REG_P4, REG_P5, REG_SP, REG_FP,
95 REG_I0 = T_REG_I, REG_I1, REG_I2, REG_I3,
96 REG_M0 = T_REG_M, REG_M1, REG_M2, REG_M3,
97 REG_B0 = T_REG_B, REG_B1, REG_B2, REG_B3,
98 REG_L0 = T_REG_L, REG_L1, REG_L2, REG_L3,
99 REG_A0x = T_REG_A, REG_A0w, REG_A1x, REG_A1w,
100 REG_ASTAT = 0x46,
101 REG_RETS = 0x47,
102 REG_LC0 = 0x60, REG_LT0, REG_LB0, REG_LC1, REG_LT1, REG_LB1,
103 REG_CYCLES, REG_CYCLES2,
104 REG_USP = 0x70, REG_SEQSTAT, REG_SYSCFG,
105 REG_RETI, REG_RETX, REG_RETN, REG_RETE, REG_EMUDAT,
106
107/* These don't have groups. */
108 REG_sftreset = T_NOGROUP, REG_omode, REG_excause, REG_emucause,
109 REG_idle_req, REG_hwerrcause,
110 REG_A0 = 0xc0, REG_A1, REG_CC,
111/* Pseudo registers, used only for distinction from symbols. */
112 REG_RL0, REG_RL1, REG_RL2, REG_RL3,
113 REG_RL4, REG_RL5, REG_RL6, REG_RL7,
114 REG_RH0, REG_RH1, REG_RH2, REG_RH3,
115 REG_RH4, REG_RH5, REG_RH6, REG_RH7,
116 REG_LASTREG
117};
118
119/* Status register flags. */
120
121enum statusflags
122{
123 S_AZ = 0,
124 S_AN,
125 S_AQ = 6,
126 S_AC0 = 12,
127 S_AC1,
128 S_AV0 = 16,
129 S_AV0S,
130 S_AV1,
131 S_AV1S,
132 S_V = 24,
133 S_VS = 25
134};
135
136
137enum reg_class
138{
139 rc_dregs_lo,
140 rc_dregs_hi,
141 rc_dregs,
142 rc_dregs_pair,
143 rc_pregs,
144 rc_spfp,
145 rc_dregs_hilo,
146 rc_accum_ext,
147 rc_accum_word,
148 rc_accum,
149 rc_iregs,
150 rc_mregs,
151 rc_bregs,
152 rc_lregs,
153 rc_dpregs,
154 rc_gregs,
155 rc_regs,
156 rc_statbits,
157 rc_ignore_bits,
158 rc_ccstat,
159 rc_counters,
160 rc_dregs2_sysregs1,
161 rc_open,
162 rc_sysregs2,
163 rc_sysregs3,
164 rc_allregs,
165 LIM_REG_CLASSES
166};
167
168/* mmod field. */
169#define M_S2RND 1
170#define M_T 2
171#define M_W32 3
172#define M_FU 4
173#define M_TFU 6
174#define M_IS 8
175#define M_ISS2 9
176#define M_IH 11
177#define M_IU 12
178
179/* Register type checking macros. */
180
181#define CODE_MASK 0x07
182#define CLASS_MASK 0xf0
183
184#define REG_SAME(a, b) ((a).regno == (b).regno)
185#define REG_EQUAL(a, b) (((a).regno & CODE_MASK) == ((b).regno & CODE_MASK))
186#define REG_CLASS(a) ((a.regno) & 0xf0)
187#define IS_A1(a) ((a).regno == REG_A1)
188#define IS_H(a) ((a).regno & F_REG_HIGH ? 1: 0)
189#define IS_EVEN(r) (r.regno % 2 == 0)
190#define IS_HCOMPL(a, b) (REG_EQUAL(a, b) && \
191 ((a).regno & F_REG_HIGH) != ((b).regno & F_REG_HIGH))
192
193/* register type checking. */
194#define _TYPECHECK(r, x) (((r).regno & CLASS_MASK) == T_REG_##x)
195
196#define IS_DREG(r) _TYPECHECK(r, R)
197#define IS_DREG_H(r) (_TYPECHECK(r, R) && IS_H(r))
198#define IS_DREG_L(r) (_TYPECHECK(r, R) && !IS_H(r))
199#define IS_PREG(r) _TYPECHECK(r, P)
200#define IS_IREG(r) (((r).regno & 0xf4) == T_REG_I)
201#define IS_MREG(r) (((r).regno & 0xf4) == T_REG_M)
73562ad0
JZ
202#define IS_BREG(r) (((r).regno & 0xf4) == T_REG_B)
203#define IS_LREG(r) (((r).regno & 0xf4) == T_REG_L)
07c1b327
CM
204#define IS_CREG(r) ((r).regno == REG_LC0 || (r).regno == REG_LC1)
205#define IS_ALLREG(r) ((r).regno < T_NOGROUP)
206
207/* Expression value macros. */
208
209typedef enum
210{
211 ones_compl,
212 twos_compl,
213 mult,
214 divide,
215 mod,
216 add,
217 sub,
218 lsh,
219 rsh,
220 logand,
221 logior,
222 logxor
223} expr_opcodes_t;
224
225struct expressionS;
226
227#define SYMBOL_T symbolS*
228
229struct expression_cell
230{
231 int value;
232 SYMBOL_T symbol;
233};
234
235/* User Type Definitions. */
236struct bfin_insn
237{
238 unsigned long value;
239 struct bfin_insn *next;
240 struct expression_cell *exp;
241 int pcrel;
242 int reloc;
243};
244
245#define INSTR_T struct bfin_insn*
246#define EXPR_T struct expression_cell*
247
248typedef struct expr_node_struct Expr_Node;
249
250extern INSTR_T gencode (unsigned long x);
251extern INSTR_T conscode (INSTR_T head, INSTR_T tail);
252extern INSTR_T conctcode (INSTR_T head, INSTR_T tail);
253extern INSTR_T note_reloc
254 (INSTR_T code, Expr_Node *, int reloc,int pcrel);
255extern INSTR_T note_reloc1
256 (INSTR_T code, const char * sym, int reloc, int pcrel);
257extern INSTR_T note_reloc2
258 (INSTR_T code, const char *symbol, int reloc, int value, int pcrel);
259
260/* Types of expressions. */
261typedef enum
262{
263 Expr_Node_Binop, /* Binary operator. */
264 Expr_Node_Unop, /* Unary operator. */
265 Expr_Node_Reloc, /* Symbol to be relocated. */
1ac4baed 266 Expr_Node_GOT_Reloc, /* Symbol to be relocated using the GOT. */
07c1b327
CM
267 Expr_Node_Constant /* Constant. */
268} Expr_Node_Type;
269
270/* Types of operators. */
271typedef enum
272{
273 Expr_Op_Type_Add,
274 Expr_Op_Type_Sub,
275 Expr_Op_Type_Mult,
276 Expr_Op_Type_Div,
277 Expr_Op_Type_Mod,
278 Expr_Op_Type_Lshift,
279 Expr_Op_Type_Rshift,
280 Expr_Op_Type_BAND, /* Bitwise AND. */
281 Expr_Op_Type_BOR, /* Bitwise OR. */
282 Expr_Op_Type_BXOR, /* Bitwise exclusive OR. */
283 Expr_Op_Type_LAND, /* Logical AND. */
284 Expr_Op_Type_LOR, /* Logical OR. */
285 Expr_Op_Type_NEG,
286 Expr_Op_Type_COMP /* Complement. */
287} Expr_Op_Type;
288
289/* The value that can be stored ... depends on type. */
290typedef union
291{
292 const char *s_value; /* if relocation symbol, the text. */
293 int i_value; /* if constant, the value. */
294 Expr_Op_Type op_value; /* if operator, the value. */
295} Expr_Node_Value;
296
297/* The expression node. */
298struct expr_node_struct
299{
300 Expr_Node_Type type;
301 Expr_Node_Value value;
302 Expr_Node *Left_Child;
303 Expr_Node *Right_Child;
304};
305
306
307/* Operations on the expression node. */
308Expr_Node *Expr_Node_Create (Expr_Node_Type type,
309 Expr_Node_Value value,
310 Expr_Node *Left_Child,
311 Expr_Node *Right_Child);
312
313/* Generate the reloc structure as a series of instructions. */
314INSTR_T Expr_Node_Gen_Reloc (Expr_Node *head, int parent_reloc);
315
316#define MKREF(x) mkexpr (0,x)
317#define ALLOCATE(x) malloc (x)
318
319#define NULL_CODE ((INSTR_T) 0)
320
321#ifndef EXPR_VALUE
322#define EXPR_VALUE(x) (((x)->type == Expr_Node_Constant) ? ((x)->value.i_value) : 0)
323#endif
324#ifndef EXPR_SYMBOL
325#define EXPR_SYMBOL(x) ((x)->symbol)
326#endif
327
328
329typedef long reg_t;
330
331
332typedef struct _register
333{
334 reg_t regno; /* Register ID as defined in machine_registers. */
335 int flags;
336} Register;
337
338
339typedef struct _macfunc
340{
341 char n;
342 char op;
343 char w;
344 char P;
345 Register dst;
346 Register s0;
347 Register s1;
348} Macfunc;
349
350typedef struct _opt_mode
351{
352 int MM;
353 int mod;
354} Opt_mode;
355
356typedef enum
357{
358 SEMANTIC_ERROR,
359 NO_INSN_GENERATED,
360 INSN_GENERATED
361} parse_state;
362
363
364#ifdef __cplusplus
365extern "C" {
366#endif
367
368extern int debug_codeselection;
369
370void error (char *format, ...);
371void warn (char *format, ...);
372int semantic_error (char *syntax);
373void semantic_error_2 (char *syntax);
374
375EXPR_T mkexpr (int, SYMBOL_T);
376
07c1b327
CM
377/* Defined in bfin-lex.l. */
378void set_start_state (void);
379
380#ifdef __cplusplus
381}
382#endif
383
384#endif /* BFIN_PARSE_H */
385
This page took 0.054117 seconds and 4 git commands to generate.