1 /* bfin-defs.h ADI Blackfin gas header file
2 Copyright 2005, 2006, 2007, 2009, 2010, 2011
3 Free Software Foundation, Inc.
5 This file is part of GAS, the GNU Assembler.
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 3, or (at your option)
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.
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
25 #include "opcode/bfin.h"
28 #define CODE_FRAG_SIZE 4096 /* 1 page. */
31 /* Definition for all status bits. */
71 /* High-Nibble: group code, low nibble: register code. */
82 /* All registers above this value don't
83 belong to a usuable register group. */
84 #define T_NOGROUP 0xa0
91 enum machine_registers
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,
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,
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,
119 /* Status register flags. */
171 /* Register type checking macros. */
173 #define CODE_MASK 0x07
174 #define CLASS_MASK 0xf0
176 #define REG_SAME(a, b) ((a).regno == (b).regno)
177 #define REG_EQUAL(a, b) (((a).regno & CODE_MASK) == ((b).regno & CODE_MASK))
178 #define REG_CLASS(a) ((a).regno & 0xf0)
179 #define IS_A1(a) ((a).regno == REG_A1)
180 #define IS_H(a) ((a).flags & F_REG_HIGH ? 1: 0)
181 #define IS_EVEN(r) ((r).regno % 2 == 0)
182 #define IS_HCOMPL(a, b) (REG_EQUAL(a, b) && \
183 ((a).flags & F_REG_HIGH) != ((b).flags & F_REG_HIGH))
185 /* register type checking. */
186 #define _TYPECHECK(r, x) (((r).regno & CLASS_MASK) == T_REG_##x)
188 #define IS_DREG(r) _TYPECHECK(r, R)
189 #define IS_DREG_H(r) (_TYPECHECK(r, R) && IS_H(r))
190 #define IS_DREG_L(r) (_TYPECHECK(r, R) && !IS_H(r))
191 #define IS_PREG(r) _TYPECHECK(r, P)
192 #define IS_IREG(r) (((r).regno & 0xf4) == T_REG_I)
193 #define IS_MREG(r) (((r).regno & 0xf4) == T_REG_M)
194 #define IS_BREG(r) (((r).regno & 0xf4) == T_REG_B)
195 #define IS_LREG(r) (((r).regno & 0xf4) == T_REG_L)
196 #define IS_CREG(r) ((r).regno == REG_LC0 || (r).regno == REG_LC1)
197 #define IS_EMUDAT(r) ((r).regno == REG_EMUDAT)
198 #define IS_ALLREG(r) ((r).regno < T_NOGROUP)
200 #define IS_GENREG(r) \
201 (IS_DREG (r) || IS_PREG (r) \
202 || (r).regno == REG_A0x || (r).regno == REG_A0w \
203 || (r).regno == REG_A1x || (r).regno == REG_A1w)
205 #define IS_DAGREG(r) \
206 (IS_IREG (r) || IS_MREG (r) || IS_BREG (r) || IS_LREG (r))
208 #define IS_SYSREG(r) \
209 ((r).regno == REG_ASTAT || (r).regno == REG_SEQSTAT \
210 || (r).regno == REG_SYSCFG || (r).regno == REG_RETI \
211 || (r).regno == REG_RETX || (r).regno == REG_RETN \
212 || (r).regno == REG_RETE || (r).regno == REG_RETS \
213 || (r).regno == REG_LC0 || (r).regno == REG_LC1 \
214 || (r).regno == REG_LT0 || (r).regno == REG_LT1 \
215 || (r).regno == REG_LB0 || (r).regno == REG_LB1 \
216 || (r).regno == REG_CYCLES || (r).regno == REG_CYCLES2 \
217 || (r).regno == REG_EMUDAT)
219 /* Expression value macros. */
239 #define SYMBOL_T symbolS*
241 struct expression_cell
247 /* User Type Definitions. */
251 struct bfin_insn *next;
252 struct expression_cell *exp;
257 #define INSTR_T struct bfin_insn*
258 #define EXPR_T struct expression_cell*
260 typedef struct expr_node_struct Expr_Node;
262 extern INSTR_T gencode (unsigned long x);
263 extern INSTR_T conscode (INSTR_T head, INSTR_T tail);
264 extern INSTR_T conctcode (INSTR_T head, INSTR_T tail);
265 extern INSTR_T note_reloc
266 (INSTR_T code, Expr_Node *, int reloc,int pcrel);
267 extern INSTR_T note_reloc1
268 (INSTR_T code, const char * sym, int reloc, int pcrel);
269 extern INSTR_T note_reloc2
270 (INSTR_T code, const char *symbol, int reloc, int value, int pcrel);
272 /* Types of expressions. */
275 Expr_Node_Binop, /* Binary operator. */
276 Expr_Node_Unop, /* Unary operator. */
277 Expr_Node_Reloc, /* Symbol to be relocated. */
278 Expr_Node_GOT_Reloc, /* Symbol to be relocated using the GOT. */
279 Expr_Node_Constant /* Constant. */
282 /* Types of operators. */
292 Expr_Op_Type_BAND, /* Bitwise AND. */
293 Expr_Op_Type_BOR, /* Bitwise OR. */
294 Expr_Op_Type_BXOR, /* Bitwise exclusive OR. */
295 Expr_Op_Type_LAND, /* Logical AND. */
296 Expr_Op_Type_LOR, /* Logical OR. */
298 Expr_Op_Type_COMP /* Complement. */
301 /* The value that can be stored ... depends on type. */
304 const char *s_value; /* if relocation symbol, the text. */
305 long long i_value; /* if constant, the value. */
306 Expr_Op_Type op_value; /* if operator, the value. */
309 /* The expression node. */
310 struct expr_node_struct
313 Expr_Node_Value value;
314 Expr_Node *Left_Child;
315 Expr_Node *Right_Child;
319 /* Operations on the expression node. */
320 Expr_Node *Expr_Node_Create (Expr_Node_Type type,
321 Expr_Node_Value value,
322 Expr_Node *Left_Child,
323 Expr_Node *Right_Child);
325 /* Generate the reloc structure as a series of instructions. */
326 INSTR_T Expr_Node_Gen_Reloc (Expr_Node *head, int parent_reloc);
328 #define MKREF(x) mkexpr (0,x)
329 #define ALLOCATE(x) malloc (x)
331 #define NULL_CODE ((INSTR_T) 0)
334 #define EXPR_VALUE(x) (((x)->type == Expr_Node_Constant) ? ((x)->value.i_value) : 0)
337 #define EXPR_SYMBOL(x) ((x)->symbol)
344 typedef struct _register
346 reg_t regno; /* Register ID as defined in machine_registers. */
351 typedef struct _macfunc
362 typedef struct _opt_mode
380 extern int debug_codeselection;
382 void error (char *format, ...);
383 void warn (char *format, ...);
384 int semantic_error (char *syntax);
385 void semantic_error_2 (char *syntax);
387 EXPR_T mkexpr (int, SYMBOL_T);
389 /* Defined in bfin-lex.l. */
390 void set_start_state (void);
392 extern int insn_regmask (int, int);
397 #endif /* BFIN_PARSE_H */