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:
		| @@ -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) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user