include/opcode/
* mips.h (mips_pcrel_operand): Inherit from mips_int_operand. (mips_int_operand_min, mips_int_operand_max): New functions. (mips_decode_pcrel_operand): Use mips_decode_int_operand. opcodes/ * mips-formats.h (PCREL): Reorder parameters and update the definition to match new mips_pcrel_operand layout. (JUMP, JALX, BRANCH): Update accordingly. * mips16-opc.c (decode_mips16_operand): Likewise. gas/ * config/tc-mips.c (match_int_operand): Use mips_int_operand_min and mips_int_operand_max. (mips16_immed_operand, mips16_immed_operands, MIPS16_NUM_IMMED): Delete. (mips16_immed_operand, mips16_immed_in_range_p): New functions. (mips16_immed, mips16_extended_frag): Use them. Use mips_int_operand instead of mips16_immed_operand.
This commit is contained in:
parent
f34670b338
commit
fbb49d5252
@ -1,3 +1,9 @@
|
|||||||
|
2013-08-03 Richard Sandiford <rdsandiford@googlemail.com>
|
||||||
|
|
||||||
|
* mips.h (mips_pcrel_operand): Inherit from mips_int_operand.
|
||||||
|
(mips_int_operand_min, mips_int_operand_max): New functions.
|
||||||
|
(mips_decode_pcrel_operand): Use mips_decode_int_operand.
|
||||||
|
|
||||||
2013-08-01 Richard Sandiford <rdsandiford@googlemail.com>
|
2013-08-01 Richard Sandiford <rdsandiford@googlemail.com>
|
||||||
|
|
||||||
* mips.h (mips_decode_reg_operand): New function.
|
* mips.h (mips_decode_reg_operand): New function.
|
||||||
|
@ -537,16 +537,13 @@ struct mips_reg_pair_operand
|
|||||||
but the rules for MIPS16 instructions like ADDIUPC are more complicated. */
|
but the rules for MIPS16 instructions like ADDIUPC are more complicated. */
|
||||||
struct mips_pcrel_operand
|
struct mips_pcrel_operand
|
||||||
{
|
{
|
||||||
struct mips_operand root;
|
/* Encodes the offset. */
|
||||||
|
struct mips_int_operand root;
|
||||||
|
|
||||||
/* The low ALIGN_LOG2 bits of the base PC are cleared to give PC'. */
|
/* The low ALIGN_LOG2 bits of the base PC are cleared to give PC',
|
||||||
|
which is then added to the offset encoded by ROOT. */
|
||||||
unsigned int align_log2 : 8;
|
unsigned int align_log2 : 8;
|
||||||
|
|
||||||
/* The operand is shifted left SHIFT places and added to PC'.
|
|
||||||
The operand is signed if IS_SIGNED. */
|
|
||||||
unsigned int shift : 8;
|
|
||||||
unsigned int is_signed : 1;
|
|
||||||
|
|
||||||
/* If INCLUDE_ISA_BIT, the ISA bit of the original base PC is then
|
/* If INCLUDE_ISA_BIT, the ISA bit of the original base PC is then
|
||||||
reinstated. This is true for jumps and branches and false for
|
reinstated. This is true for jumps and branches and false for
|
||||||
PC-relative data instructions. */
|
PC-relative data instructions. */
|
||||||
@ -604,6 +601,25 @@ mips_decode_int_operand (const struct mips_int_operand *operand,
|
|||||||
return uval;
|
return uval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return the maximum value that can be encoded by OPERAND. */
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
mips_int_operand_max (const struct mips_int_operand *operand)
|
||||||
|
{
|
||||||
|
return (operand->max_val + operand->bias) << operand->shift;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Return the minimum value that can be encoded by OPERAND. */
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
mips_int_operand_min (const struct mips_int_operand *operand)
|
||||||
|
{
|
||||||
|
unsigned int mask;
|
||||||
|
|
||||||
|
mask = (1 << operand->root.size) - 1;
|
||||||
|
return mips_int_operand_max (operand) - (mask << operand->shift);
|
||||||
|
}
|
||||||
|
|
||||||
/* Return the register that OPERAND encodes as UVAL. */
|
/* Return the register that OPERAND encodes as UVAL. */
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
@ -625,10 +641,7 @@ mips_decode_pcrel_operand (const struct mips_pcrel_operand *operand,
|
|||||||
bfd_vma addr;
|
bfd_vma addr;
|
||||||
|
|
||||||
addr = base_pc & -(1 << operand->align_log2);
|
addr = base_pc & -(1 << operand->align_log2);
|
||||||
if (operand->is_signed)
|
addr += mips_decode_int_operand (&operand->root, uval);
|
||||||
addr += mips_signed_operand (&operand->root, uval) * (1 << operand->shift);
|
|
||||||
else
|
|
||||||
addr += uval << operand->shift;
|
|
||||||
if (operand->include_isa_bit)
|
if (operand->include_isa_bit)
|
||||||
addr |= base_pc & 1;
|
addr |= base_pc & 1;
|
||||||
if (operand->flip_isa_bit)
|
if (operand->flip_isa_bit)
|
||||||
|
Loading…
Reference in New Issue
Block a user