1 /* bfin-defs.h ADI Blackfin gas header file
2 Copyright 2005, 2006, 2007, 2009
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
26 #define CODE_FRAG_SIZE 4096 /* 1 page. */
29 /* Definition for all status bits. */
69 /* High-Nibble: group code, low nibble: register code. */
80 /* All registers above this value don't
81 belong to a usuable register group. */
82 #define T_NOGROUP 0xa0
89 enum machine_registers
91 REG_R0
= T_REG_R
, REG_R1
, REG_R2
, REG_R3
, REG_R4
, REG_R5
, REG_R6
, REG_R7
,
92 REG_P0
= T_REG_P
, REG_P1
, REG_P2
, REG_P3
, REG_P4
, REG_P5
, REG_SP
, REG_FP
,
93 REG_I0
= T_REG_I
, REG_I1
, REG_I2
, REG_I3
,
94 REG_M0
= T_REG_M
, REG_M1
, REG_M2
, REG_M3
,
95 REG_B0
= T_REG_B
, REG_B1
, REG_B2
, REG_B3
,
96 REG_L0
= T_REG_L
, REG_L1
, REG_L2
, REG_L3
,
97 REG_A0x
= T_REG_A
, REG_A0w
, REG_A1x
, REG_A1w
,
100 REG_LC0
= 0x60, REG_LT0
, REG_LB0
, REG_LC1
, REG_LT1
, REG_LB1
,
101 REG_CYCLES
, REG_CYCLES2
,
102 REG_USP
= 0x70, REG_SEQSTAT
, REG_SYSCFG
,
103 REG_RETI
, REG_RETX
, REG_RETN
, REG_RETE
, REG_EMUDAT
,
105 /* These don't have groups. */
106 REG_sftreset
= T_NOGROUP
, REG_omode
, REG_excause
, REG_emucause
,
107 REG_idle_req
, REG_hwerrcause
,
108 REG_A0
= 0xc0, REG_A1
, REG_CC
,
109 /* Pseudo registers, used only for distinction from symbols. */
110 REG_RL0
, REG_RL1
, REG_RL2
, REG_RL3
,
111 REG_RL4
, REG_RL5
, REG_RL6
, REG_RL7
,
112 REG_RH0
, REG_RH1
, REG_RH2
, REG_RH3
,
113 REG_RH4
, REG_RH5
, REG_RH6
, REG_RH7
,
117 /* Status register flags. */
177 /* Register type checking macros. */
179 #define CODE_MASK 0x07
180 #define CLASS_MASK 0xf0
182 #define REG_SAME(a, b) ((a).regno == (b).regno)
183 #define REG_EQUAL(a, b) (((a).regno & CODE_MASK) == ((b).regno & CODE_MASK))
184 #define REG_CLASS(a) ((a).regno & 0xf0)
185 #define IS_A1(a) ((a).regno == REG_A1)
186 #define IS_H(a) ((a).flags & F_REG_HIGH ? 1: 0)
187 #define IS_EVEN(r) ((r).regno % 2 == 0)
188 #define IS_HCOMPL(a, b) (REG_EQUAL(a, b) && \
189 ((a).flags & F_REG_HIGH) != ((b).flags & F_REG_HIGH))
191 /* register type checking. */
192 #define _TYPECHECK(r, x) (((r).regno & CLASS_MASK) == T_REG_##x)
194 #define IS_DREG(r) _TYPECHECK(r, R)
195 #define IS_DREG_H(r) (_TYPECHECK(r, R) && IS_H(r))
196 #define IS_DREG_L(r) (_TYPECHECK(r, R) && !IS_H(r))
197 #define IS_PREG(r) _TYPECHECK(r, P)
198 #define IS_IREG(r) (((r).regno & 0xf4) == T_REG_I)
199 #define IS_MREG(r) (((r).regno & 0xf4) == T_REG_M)
200 #define IS_BREG(r) (((r).regno & 0xf4) == T_REG_B)
201 #define IS_LREG(r) (((r).regno & 0xf4) == T_REG_L)
202 #define IS_CREG(r) ((r).regno == REG_LC0 || (r).regno == REG_LC1)
203 #define IS_ALLREG(r) ((r).regno < T_NOGROUP)
205 #define IS_GENREG(r) \
206 (IS_DREG (r) || IS_PREG (r) \
207 || (r).regno == REG_A0x || (r).regno == REG_A0w \
208 || (r).regno == REG_A1x || (r).regno == REG_A1w)
210 #define IS_DAGREG(r) \
211 (IS_IREG (r) || IS_MREG (r) || IS_BREG (r) || IS_LREG (r))
213 #define IS_SYSREG(r) \
214 ((r).regno == REG_ASTAT || (r).regno == REG_SEQSTAT \
215 || (r).regno == REG_SYSCFG || (r).regno == REG_RETI \
216 || (r).regno == REG_RETX || (r).regno == REG_RETN \
217 || (r).regno == REG_RETE || (r).regno == REG_RETS \
218 || (r).regno == REG_LC0 || (r).regno == REG_LC1 \
219 || (r).regno == REG_LT0 || (r).regno == REG_LT1 \
220 || (r).regno == REG_LB0 || (r).regno == REG_LB1 \
221 || (r).regno == REG_CYCLES || (r).regno == REG_CYCLES2 \
222 || (r).regno == REG_EMUDAT)
224 /* Expression value macros. */
244 #define SYMBOL_T symbolS*
246 struct expression_cell
252 /* User Type Definitions. */
256 struct bfin_insn
*next
;
257 struct expression_cell
*exp
;
262 #define INSTR_T struct bfin_insn*
263 #define EXPR_T struct expression_cell*
265 typedef struct expr_node_struct Expr_Node
;
267 extern INSTR_T
gencode (unsigned long x
);
268 extern INSTR_T
conscode (INSTR_T head
, INSTR_T tail
);
269 extern INSTR_T
conctcode (INSTR_T head
, INSTR_T tail
);
270 extern INSTR_T note_reloc
271 (INSTR_T code
, Expr_Node
*, int reloc
,int pcrel
);
272 extern INSTR_T note_reloc1
273 (INSTR_T code
, const char * sym
, int reloc
, int pcrel
);
274 extern INSTR_T note_reloc2
275 (INSTR_T code
, const char *symbol
, int reloc
, int value
, int pcrel
);
277 /* Types of expressions. */
280 Expr_Node_Binop
, /* Binary operator. */
281 Expr_Node_Unop
, /* Unary operator. */
282 Expr_Node_Reloc
, /* Symbol to be relocated. */
283 Expr_Node_GOT_Reloc
, /* Symbol to be relocated using the GOT. */
284 Expr_Node_Constant
/* Constant. */
287 /* Types of operators. */
297 Expr_Op_Type_BAND
, /* Bitwise AND. */
298 Expr_Op_Type_BOR
, /* Bitwise OR. */
299 Expr_Op_Type_BXOR
, /* Bitwise exclusive OR. */
300 Expr_Op_Type_LAND
, /* Logical AND. */
301 Expr_Op_Type_LOR
, /* Logical OR. */
303 Expr_Op_Type_COMP
/* Complement. */
306 /* The value that can be stored ... depends on type. */
309 const char *s_value
; /* if relocation symbol, the text. */
310 long long i_value
; /* if constant, the value. */
311 Expr_Op_Type op_value
; /* if operator, the value. */
314 /* The expression node. */
315 struct expr_node_struct
318 Expr_Node_Value value
;
319 Expr_Node
*Left_Child
;
320 Expr_Node
*Right_Child
;
324 /* Operations on the expression node. */
325 Expr_Node
*Expr_Node_Create (Expr_Node_Type type
,
326 Expr_Node_Value value
,
327 Expr_Node
*Left_Child
,
328 Expr_Node
*Right_Child
);
330 /* Generate the reloc structure as a series of instructions. */
331 INSTR_T
Expr_Node_Gen_Reloc (Expr_Node
*head
, int parent_reloc
);
333 #define MKREF(x) mkexpr (0,x)
334 #define ALLOCATE(x) malloc (x)
336 #define NULL_CODE ((INSTR_T) 0)
339 #define EXPR_VALUE(x) (((x)->type == Expr_Node_Constant) ? ((x)->value.i_value) : 0)
342 #define EXPR_SYMBOL(x) ((x)->symbol)
349 typedef struct _register
351 reg_t regno
; /* Register ID as defined in machine_registers. */
356 typedef struct _macfunc
367 typedef struct _opt_mode
385 extern int debug_codeselection
;
387 void error (char *format
, ...);
388 void warn (char *format
, ...);
389 int semantic_error (char *syntax
);
390 void semantic_error_2 (char *syntax
);
392 EXPR_T
mkexpr (int, SYMBOL_T
);
394 /* Defined in bfin-lex.l. */
395 void set_start_state (void);
397 extern int insn_regmask (int, int);
402 #endif /* BFIN_PARSE_H */