Browse Source
* mips.h (mips_operand_type, mips_reg_operand_type): New enums. (mips_operand, mips_int_operand, mips_mapped_int_operand) (mips_msb_operand, mips_reg_operand, mips_reg_pair_operand) (mips_pcrel_operand): New structures. (mips_insert_operand, mips_extract_operand, mips_signed_operand) (mips_decode_int_operand, mips_decode_pcrel_operand): New functions. (decode_mips_operand, decode_micromips_operand): Declare. opcodes/ * mips-formats.h: New file. * mips-opc.c: Include mips-formats.h. (reg_0_map): New static array. (decode_mips_operand): New function. * micromips-opc.c: Remove <stdio.h> include. Include mips-formats.h. (reg_0_map, reg_28_map, reg_29_map, reg_31_map, reg_m16_map) (reg_mn_map, reg_q_map, reg_h_map1, reg_h_map2, int_b_map) (int_c_map): New static arrays. (decode_micromips_operand): New function. * mips-dis.c (micromips_to_32_reg_b_map, micromips_to_32_reg_c_map) (micromips_to_32_reg_d_map, micromips_to_32_reg_e_map) (micromips_to_32_reg_f_map, micromips_to_32_reg_g_map) (micromips_to_32_reg_h_map1, micromips_to_32_reg_h_map2) (micromips_to_32_reg_l_map, micromips_to_32_reg_m_map) (micromips_to_32_reg_n_map, micromips_to_32_reg_q_map) (micromips_imm_b_map, micromips_imm_c_map): Delete. (print_reg): New function. (mips_print_arg_state): New structure. (init_print_arg_state, print_insn_arg): New functions. (print_insn_args): Change interface and use mips_operand structures. Delete GET_OP_S. Move GET_OP definition to... (print_insn_mips): ...here. Update the call to print_insn_args. (print_insn_micromips): Use print_insn_args. gas/ * config/tc-mips.c (validate_mips_insn): Move further up file. Add insn_bits and decode_operand arguments. Use the mips_operand fields to work out which bits an operand occupies. Detect double definitions. (validate_micromips_insn): Move further up file. Call into validate_mips_insn.binutils-2_24-branch
9 changed files with 1134 additions and 1434 deletions
File diff suppressed because it is too large
@ -0,0 +1,113 @@ |
|||
/* mips-formats.h
|
|||
Copyright 2013 Free Software Foundation, Inc. |
|||
|
|||
This library is free software; you can redistribute it and/or modify |
|||
it under the terms of the GNU General Public License as published by |
|||
the Free Software Foundation; either version 3, or (at your option) |
|||
any later version. |
|||
|
|||
It is distributed in the hope that it will be useful, but WITHOUT |
|||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
|||
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public |
|||
License for more details. |
|||
|
|||
You should have received a copy of the GNU General Public License |
|||
along with this program; see the file COPYING3. If not, |
|||
see <http://www.gnu.org/licenses/>. */
|
|||
|
|||
/* For ARRAY_SIZE. */ |
|||
#include "libiberty.h" |
|||
|
|||
#define INT_ADJ(SIZE, LSB, MAX_VAL, SHIFT, PRINT_HEX) \ |
|||
{ \ |
|||
static const struct mips_int_operand op = { \ |
|||
{ OP_INT, SIZE, LSB }, MAX_VAL, 0, SHIFT, PRINT_HEX \ |
|||
}; \ |
|||
return &op.root; \ |
|||
} |
|||
|
|||
#define UINT(SIZE, LSB) \ |
|||
INT_ADJ(SIZE, LSB, (1 << (SIZE)) - 1, 0, FALSE) |
|||
|
|||
#define SINT(SIZE, LSB) \ |
|||
INT_ADJ(SIZE, LSB, (1 << ((SIZE) - 1)) - 1, 0, FALSE) |
|||
|
|||
#define HINT(SIZE, LSB) \ |
|||
INT_ADJ(SIZE, LSB, (1 << (SIZE)) - 1, 0, TRUE) |
|||
|
|||
#define BIT(SIZE, LSB, BIAS) \ |
|||
{ \ |
|||
static const struct mips_int_operand op = { \ |
|||
{ OP_INT, SIZE, LSB }, (1 << (SIZE)) - 1, BIAS, 0, TRUE \ |
|||
}; \ |
|||
return &op.root; \ |
|||
} |
|||
|
|||
#define MAPPED_INT(SIZE, LSB, MAP, PRINT_HEX) \ |
|||
{ \ |
|||
typedef char static_assert[(1 << (SIZE)) == ARRAY_SIZE (MAP)]; \ |
|||
static const struct mips_mapped_int_operand op = { \ |
|||
{ OP_MAPPED_INT, SIZE, LSB }, MAP, PRINT_HEX \ |
|||
}; \ |
|||
return &op.root; \ |
|||
} |
|||
|
|||
#define MSB(SIZE, LSB, BIAS, ADD_LSB, OPSIZE) \ |
|||
{ \ |
|||
static const struct mips_msb_operand op = { \ |
|||
{ OP_MSB, SIZE, LSB }, BIAS, ADD_LSB, OPSIZE \ |
|||
}; \ |
|||
return &op.root; \ |
|||
} |
|||
|
|||
#define REG(SIZE, LSB, BANK) \ |
|||
{ \ |
|||
static const struct mips_reg_operand op = { \ |
|||
{ OP_REG, SIZE, LSB }, OP_REG_##BANK, 0 \ |
|||
}; \ |
|||
return &op.root; \ |
|||
} |
|||
|
|||
#define MAPPED_REG(SIZE, LSB, BANK, MAP) \ |
|||
{ \ |
|||
typedef char static_assert[(1 << (SIZE)) == ARRAY_SIZE (MAP)]; \ |
|||
static const struct mips_reg_operand op = { \ |
|||
{ OP_REG, SIZE, LSB }, OP_REG_##BANK, MAP \ |
|||
}; \ |
|||
return &op.root; \ |
|||
} |
|||
|
|||
#define REG_PAIR(SIZE, LSB, BANK, MAP) \ |
|||
{ \ |
|||
typedef char static_assert1[(1 << (SIZE)) == ARRAY_SIZE (MAP##1)]; \ |
|||
typedef char static_assert2[(1 << (SIZE)) == ARRAY_SIZE (MAP##2)]; \ |
|||
static const struct mips_reg_pair_operand op = { \ |
|||
{ OP_REG_PAIR, SIZE, LSB }, OP_REG_##BANK, MAP##1, MAP##2 \ |
|||
}; \ |
|||
return &op.root; \ |
|||
} |
|||
|
|||
#define PCREL(SIZE, LSB, ALIGN_LOG2, SHIFT, IS_SIGNED, INCLUDE_ISA_BIT, \ |
|||
FLIP_ISA_BIT) \ |
|||
{ \ |
|||
static const struct mips_pcrel_operand op = { \ |
|||
{ OP_PCREL, SIZE, LSB }, ALIGN_LOG2, SHIFT, IS_SIGNED, \ |
|||
INCLUDE_ISA_BIT, FLIP_ISA_BIT \ |
|||
}; \ |
|||
return &op.root; \ |
|||
} |
|||
|
|||
#define JUMP(SIZE, LSB, SHIFT) \ |
|||
PCREL (SIZE, LSB, SIZE + SHIFT, SHIFT, FALSE, TRUE, FALSE) |
|||
|
|||
#define JALX(SIZE, LSB, SHIFT) \ |
|||
PCREL (SIZE, LSB, SIZE + SHIFT, SHIFT, FALSE, TRUE, TRUE) |
|||
|
|||
#define BRANCH(SIZE, LSB, SHIFT) \ |
|||
PCREL (SIZE, LSB, 0, SHIFT, TRUE, TRUE, FALSE) |
|||
|
|||
#define SPECIAL(SIZE, LSB, TYPE) \ |
|||
{ \ |
|||
static const struct mips_operand op = { OP_##TYPE, SIZE, LSB }; \ |
|||
return &op; \ |
|||
} |
|||
Loading…
Reference in new issue