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