(bfd_elf32_bfd_is_target_special_symbol): Define. * v850.h (V850_INVERSE_PCREL): Define. * v850-dis.c (print_value): With V850_INVERSE_PCREL compute the destination address by subtracting the operand from the current address. * v850-opc.c (insert_u16_loop): Disallow negative offsets. Store a positive value in the insn. (extract_u16_loop): Do not negate the returned value. (D16_LOOP): Add V850_INVERSE_PCREL flag. (ceilf.sw): Remove duplicate entry. (cvtf.hs): New entry. (cvtf.sh): Likewise. (fmaf.s): Likewise. (fmsf.s): Likewise. (fnmaf.s): Likewise. (fnmsf.s): Likewise. (maddf.s): Restrict to E3V5 architectures. (msubf.s): Likewise. (nmaddf.s): Likewise. (nmsubf.s): Likewise.
		
			
				
	
	
		
			241 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			241 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* v850.h -- Header file for NEC V850 opcode table
 | ||
|    Copyright 1996-2013 Free Software Foundation, Inc.
 | ||
|    Written by J.T. Conklin, Cygnus Support
 | ||
| 
 | ||
|    This file is part of GDB, GAS, and the GNU binutils.
 | ||
| 
 | ||
|    GDB, GAS, and the GNU binutils are free software; you can redistribute
 | ||
|    them and/or modify them 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.
 | ||
| 
 | ||
|    GDB, GAS, and the GNU binutils are distributed in the hope that they
 | ||
|    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 file; see the file COPYING3.  If not, write to the Free
 | ||
|    Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
 | ||
|    MA 02110-1301, USA.  */
 | ||
| 
 | ||
| #ifndef V850_H
 | ||
| #define V850_H
 | ||
| 
 | ||
| /* The opcode table is an array of struct v850_opcode.  */
 | ||
| 
 | ||
| struct v850_opcode
 | ||
| {
 | ||
|   /* The opcode name.  */
 | ||
|   const char *name;
 | ||
| 
 | ||
|   /* The opcode itself.  Those bits which will be filled in with
 | ||
|      operands are zeroes.  */
 | ||
|   unsigned long opcode;
 | ||
| 
 | ||
|   /* The opcode mask.  This is used by the disassembler.  This is a
 | ||
|      mask containing ones indicating those bits which must match the
 | ||
|      opcode field, and zeroes indicating those bits which need not
 | ||
|      match (and are presumably filled in by operands).  */
 | ||
|   unsigned long mask;
 | ||
| 
 | ||
|   /* An array of operand codes.  Each code is an index into the
 | ||
|      operand table.  They appear in the order which the operands must
 | ||
|      appear in assembly code, and are terminated by a zero.  */
 | ||
|   unsigned char operands[8];
 | ||
| 
 | ||
|   /* Which (if any) operand is a memory operand.  */
 | ||
|   unsigned int memop;
 | ||
| 
 | ||
|   /* Target processor(s).  A bit field of processors which support
 | ||
|      this instruction.  Note a bit field is used as some instructions
 | ||
|      are available on multiple, different processor types, whereas
 | ||
|      other instructions are only available on one specific type.  */
 | ||
|   unsigned int processors;
 | ||
| };
 | ||
| 
 | ||
| /* Values for architecture number.  */
 | ||
| #define arch_V850      0
 | ||
| #define arch_V850E     (arch_V850 + 1)
 | ||
| #define arch_V850E1    (arch_V850E + 1)
 | ||
| #define arch_V850E2    (arch_V850E1 + 1)
 | ||
| #define arch_V850E2V3  (arch_V850E2 + 1)
 | ||
| #define arch_V850E3V5  (arch_V850E2V3 + 1)
 | ||
| #define arch_separator (arch_V850E3V5 + 1)
 | ||
| 
 | ||
| #define opt_EXTENSION  (arch_separator)
 | ||
| #define opt_ALIAS      (opt_EXTENSION + 1)
 | ||
| 
 | ||
| /* Values for the processors field in the v850_opcode structure.  */
 | ||
| #define PROCESSOR_V850       (1 << (arch_V850))     /* Just the V850.  */
 | ||
| #define PROCESSOR_V850E      (1 << (arch_V850E))    /* Just the V850E.  */
 | ||
| #define PROCESSOR_V850E1     (1 << (arch_V850E1))   /* Just the V850E1.  */
 | ||
| #define PROCESSOR_V850E2     (1 << (arch_V850E2))   /* Just the V850E2.  */
 | ||
| #define PROCESSOR_V850E2V3   (1 << (arch_V850E2V3)) /* Just the V850E2V3.  */
 | ||
| #define PROCESSOR_V850E3V5   (1 << (arch_V850E3V5)) /* Just the V850E3V5.  */
 | ||
| 
 | ||
| /* UPPERS */
 | ||
| #define PROCESSOR_V850E3V5_UP (PROCESSOR_V850E3V5)
 | ||
| #define PROCESSOR_V850E2V3_UP (PROCESSOR_V850E2V3 | PROCESSOR_V850E3V5_UP)
 | ||
| #define PROCESSOR_V850E2_UP   (PROCESSOR_V850E2   | PROCESSOR_V850E2V3_UP)
 | ||
| #define PROCESSOR_V850E_UP    (PROCESSOR_V850E    | PROCESSOR_V850E1 | PROCESSOR_V850E2_UP)
 | ||
| #define PROCESSOR_ALL         (PROCESSOR_V850     | PROCESSOR_V850E_UP)
 | ||
| 
 | ||
| #define PROCESSOR_MASK        (PROCESSOR_ALL)
 | ||
| #define PROCESSOR_NOT_V850    (PROCESSOR_ALL & (~ PROCESSOR_V850))         /* Any processor except the V850.  */
 | ||
| 
 | ||
| #define PROCESSOR_UNKNOWN    ~(PROCESSOR_MASK)
 | ||
| 
 | ||
| /* OPTIONS */
 | ||
| #define PROCESSOR_OPTION_EXTENSION (1 << (opt_EXTENSION))                  /* Enable extension opcodes.  */
 | ||
| #define PROCESSOR_OPTION_ALIAS     (1 << (opt_ALIAS))                      /* Enable alias opcodes.  */
 | ||
| 
 | ||
| #define SET_PROCESSOR_MASK(mask,set)	((mask) = ((mask) & ~PROCESSOR_MASK) | (set))
 | ||
| 
 | ||
| /* The table itself is sorted by major opcode number, and is otherwise
 | ||
|    in the order in which the disassembler should consider
 | ||
|    instructions.  */
 | ||
| extern const struct v850_opcode v850_opcodes[];
 | ||
| extern const int v850_num_opcodes;
 | ||
| 
 | ||
| 
 | ||
| /* The operands table is an array of struct v850_operand.  */
 | ||
| 
 | ||
| struct v850_operand
 | ||
| {
 | ||
|   /* The number of bits in the operand.  */
 | ||
|   /* If this value is -1 then the operand's bits are in a discontinous
 | ||
|      distribution in the instruction. */
 | ||
|   int bits;
 | ||
| 
 | ||
|   /* (bits >= 0):  How far the operand is left shifted in the instruction.  */
 | ||
|   /* (bits == -1): Bit mask of the bits in the operand.  */
 | ||
|   int shift;
 | ||
| 
 | ||
|   /* Insertion function.  This is used by the assembler.  To insert an
 | ||
|      operand value into an instruction, check this field.
 | ||
| 
 | ||
|      If it is NULL, execute
 | ||
|          i |= (op & ((1 << o->bits) - 1)) << o->shift;
 | ||
|      (i is the instruction which we are filling in, o is a pointer to
 | ||
|      this structure, and op is the opcode value; this assumes twos
 | ||
|      complement arithmetic).
 | ||
| 
 | ||
|      If this field is not NULL, then simply call it with the
 | ||
|      instruction and the operand value.  It will return the new value
 | ||
|      of the instruction.  If the ERRMSG argument is not NULL, then if
 | ||
|      the operand value is illegal, *ERRMSG will be set to a warning
 | ||
|      string (the operand will be inserted in any case).  If the
 | ||
|      operand value is legal, *ERRMSG will be unchanged (most operands
 | ||
|      can accept any value).  */
 | ||
|   unsigned long (* insert)
 | ||
|     (unsigned long instruction, long op, const char ** errmsg);
 | ||
| 
 | ||
|   /* Extraction function.  This is used by the disassembler.  To
 | ||
|      extract this operand type from an instruction, check this field.
 | ||
| 
 | ||
|      If it is NULL, compute
 | ||
|          op = o->bits == -1 ? ((i) & o->shift) : ((i) >> o->shift) & ((1 << o->bits) - 1);
 | ||
| 	 if (o->flags & V850_OPERAND_SIGNED)
 | ||
| 	     op = (op << (32 - o->bits)) >> (32 - o->bits);
 | ||
|      (i is the instruction, o is a pointer to this structure, and op
 | ||
|      is the result; this assumes twos complement arithmetic).
 | ||
| 
 | ||
|      If this field is not NULL, then simply call it with the
 | ||
|      instruction value.  It will return the value of the operand.  If
 | ||
|      the INVALID argument is not NULL, *INVALID will be set to
 | ||
|      non-zero if this operand type can not actually be extracted from
 | ||
|      this operand (i.e., the instruction does not match).  If the
 | ||
|      operand is valid, *INVALID will not be changed.  */
 | ||
|   unsigned long (* extract) (unsigned long instruction, int * invalid);
 | ||
| 
 | ||
|   /* One bit syntax flags.  */
 | ||
|   int flags;
 | ||
| 
 | ||
|   int default_reloc;
 | ||
| };
 | ||
| 
 | ||
| /* Elements in the table are retrieved by indexing with values from
 | ||
|    the operands field of the v850_opcodes table.  */
 | ||
| 
 | ||
| extern const struct v850_operand v850_operands[];
 | ||
| 
 | ||
| /* Values defined for the flags field of a struct v850_operand.  */
 | ||
| 
 | ||
| /* This operand names a general purpose register.  */
 | ||
| #define V850_OPERAND_REG	0x01
 | ||
| 
 | ||
| /* This operand is the ep register.  */
 | ||
| #define V850_OPERAND_EP		0x02
 | ||
| 
 | ||
| /* This operand names a system register.  */
 | ||
| #define V850_OPERAND_SRG	0x04
 | ||
| 
 | ||
| /* Prologue eilogue type instruction, V850E specific.  */
 | ||
| #define V850E_OPERAND_REG_LIST	0x08
 | ||
| 
 | ||
| /* This operand names a condition code used in the setf instruction.  */
 | ||
| #define V850_OPERAND_CC		0x10
 | ||
| 
 | ||
| #define V850_OPERAND_FLOAT_CC	0x20
 | ||
| 
 | ||
| /* This operand names a vector purpose register.  */
 | ||
| #define V850_OPERAND_VREG	0x40
 | ||
| 
 | ||
| /* 16 bit immediate follows instruction, V850E specific.  */
 | ||
| #define V850E_IMMEDIATE16	0x80
 | ||
| 
 | ||
| /* hi16 bit immediate follows instruction, V850E specific.  */
 | ||
| #define V850E_IMMEDIATE16HI	0x100
 | ||
| 
 | ||
| /* 23 bit immediate follows instruction, V850E specific.  */
 | ||
| #define V850E_IMMEDIATE23	0x200
 | ||
| 
 | ||
| /* 32 bit immediate follows instruction, V850E specific.  */
 | ||
| #define V850E_IMMEDIATE32	0x400
 | ||
| 
 | ||
| /* This is a relaxable operand.   Only used for D9->D22 branch relaxing
 | ||
|    right now.  We may need others in the future (or maybe handle them like
 | ||
|    promoted operands on the mn10300?).  */
 | ||
| #define V850_OPERAND_RELAX	0x800
 | ||
| 
 | ||
| /* This operand takes signed values.  */
 | ||
| #define V850_OPERAND_SIGNED	0x1000
 | ||
| 
 | ||
| /* This operand is a displacement.  */
 | ||
| #define V850_OPERAND_DISP	0x2000
 | ||
| 
 | ||
| /* This operand is a PC displacement.  */
 | ||
| #define V850_PCREL		0x4000
 | ||
| 
 | ||
| /* The register specified must be even number.  */
 | ||
| #define V850_REG_EVEN		0x8000
 | ||
| 
 | ||
| /* The register specified must not be r0.  */
 | ||
| #define V850_NOT_R0	        0x20000
 | ||
| 
 | ||
| /* The register specified must not be 0.  */
 | ||
| #define V850_NOT_IMM0	        0x40000
 | ||
| 
 | ||
| /* The condition code must not be SA CONDITION.  */
 | ||
| #define V850_NOT_SA		0x80000
 | ||
| 
 | ||
| /* The operand has '!' prefix.  */
 | ||
| #define V850_OPERAND_BANG	0x100000
 | ||
| 
 | ||
| /* The operand has '%' prefix.  */
 | ||
| #define V850_OPERAND_PERCENT	0x200000
 | ||
| 
 | ||
| /* This operand is a cache oparation.  */
 | ||
| #define V850_OPERAND_CACHEOP	0x400000
 | ||
| 
 | ||
| /* This operand is a prefetch oparation.  */
 | ||
| #define V850_OPERAND_PREFOP	0x800000
 | ||
| 
 | ||
| /* A PC-relative displacement where a positive value indicates a backwards displacement.  */
 | ||
| #define V850_INVERSE_PCREL	0x1000000
 | ||
| 
 | ||
| extern int v850_msg_is_out_of_range (const char *);
 | ||
| 
 | ||
| #endif /* V850_H */
 |