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