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