239 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			239 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* alpha.h -- Header file for Alpha opcode table
 | ||
|    Copyright 1996, 1999, 2001, 2003, 2010 Free Software Foundation, Inc.
 | ||
|    Contributed by Richard Henderson <rth@tamu.edu>,
 | ||
|    patterned after the PPC opcode table written by Ian Lance Taylor.
 | ||
| 
 | ||
|    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 OPCODE_ALPHA_H
 | ||
| #define OPCODE_ALPHA_H
 | ||
| 
 | ||
| /* The opcode table is an array of struct alpha_opcode.  */
 | ||
| 
 | ||
| struct alpha_opcode
 | ||
| {
 | ||
|   /* The opcode name.  */
 | ||
|   const char *name;
 | ||
| 
 | ||
|   /* The opcode itself.  Those bits which will be filled in with
 | ||
|      operands are zeroes.  */
 | ||
|   unsigned 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 mask;
 | ||
| 
 | ||
|   /* One bit flags for the opcode.  These are primarily used to
 | ||
|      indicate specific processors and environments support the
 | ||
|      instructions.  The defined values are listed below. */
 | ||
|   unsigned flags;
 | ||
| 
 | ||
|   /* 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[4];
 | ||
| };
 | ||
| 
 | ||
| /* 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 alpha_opcode alpha_opcodes[];
 | ||
| extern const unsigned alpha_num_opcodes;
 | ||
| 
 | ||
| /* Values defined for the flags field of a struct alpha_opcode.  */
 | ||
| 
 | ||
| /* CPU Availability */
 | ||
| #define AXP_OPCODE_BASE  0x0001  /* Base architecture -- all cpus.  */
 | ||
| #define AXP_OPCODE_EV4   0x0002  /* EV4 specific PALcode insns.  */
 | ||
| #define AXP_OPCODE_EV5   0x0004  /* EV5 specific PALcode insns.  */
 | ||
| #define AXP_OPCODE_EV6   0x0008  /* EV6 specific PALcode insns.  */
 | ||
| #define AXP_OPCODE_BWX   0x0100  /* Byte/word extension (amask bit 0).  */
 | ||
| #define AXP_OPCODE_CIX   0x0200  /* "Count" extension (amask bit 1).  */
 | ||
| #define AXP_OPCODE_MAX   0x0400  /* Multimedia extension (amask bit 8).  */
 | ||
| 
 | ||
| #define AXP_OPCODE_NOPAL (~(AXP_OPCODE_EV4|AXP_OPCODE_EV5|AXP_OPCODE_EV6))
 | ||
| 
 | ||
| /* A macro to extract the major opcode from an instruction.  */
 | ||
| #define AXP_OP(i)	(((i) >> 26) & 0x3F)
 | ||
| 
 | ||
| /* The total number of major opcodes. */
 | ||
| #define AXP_NOPS	0x40
 | ||
| 
 | ||
| 
 | ||
| /* The operands table is an array of struct alpha_operand.  */
 | ||
| 
 | ||
| struct alpha_operand
 | ||
| {
 | ||
|   /* The number of bits in the operand.  */
 | ||
|   unsigned int bits : 5;
 | ||
| 
 | ||
|   /* How far the operand is left shifted in the instruction.  */
 | ||
|   unsigned int shift : 5;
 | ||
| 
 | ||
|   /* The default relocation type for this operand.  */
 | ||
|   signed int default_reloc : 16;
 | ||
| 
 | ||
|   /* One bit syntax flags.  */
 | ||
|   unsigned int flags : 16;
 | ||
| 
 | ||
|   /* 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 (*insert) (unsigned instruction, int 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 = ((i) >> o->shift) & ((1 << o->bits) - 1);
 | ||
| 	 if ((o->flags & AXP_OPERAND_SIGNED) != 0
 | ||
| 	     && (op & (1 << (o->bits - 1))) != 0)
 | ||
| 	   op -= 1 << 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.  */
 | ||
|   int (*extract) (unsigned instruction, int *invalid);
 | ||
| };
 | ||
| 
 | ||
| /* Elements in the table are retrieved by indexing with values from
 | ||
|    the operands field of the alpha_opcodes table.  */
 | ||
| 
 | ||
| extern const struct alpha_operand alpha_operands[];
 | ||
| extern const unsigned alpha_num_operands;
 | ||
| 
 | ||
| /* Values defined for the flags field of a struct alpha_operand.  */
 | ||
| 
 | ||
| /* Mask for selecting the type for typecheck purposes */
 | ||
| #define AXP_OPERAND_TYPECHECK_MASK					\
 | ||
|   (AXP_OPERAND_PARENS | AXP_OPERAND_COMMA | AXP_OPERAND_IR |		\
 | ||
|    AXP_OPERAND_FPR | AXP_OPERAND_RELATIVE | AXP_OPERAND_SIGNED | 	\
 | ||
|    AXP_OPERAND_UNSIGNED)
 | ||
| 
 | ||
| /* This operand does not actually exist in the assembler input.  This
 | ||
|    is used to support extended mnemonics, for which two operands fields
 | ||
|    are identical.  The assembler should call the insert function with
 | ||
|    any op value.  The disassembler should call the extract function,
 | ||
|    ignore the return value, and check the value placed in the invalid
 | ||
|    argument.  */
 | ||
| #define AXP_OPERAND_FAKE	01
 | ||
| 
 | ||
| /* The operand should be wrapped in parentheses rather than separated
 | ||
|    from the previous by a comma.  This is used for the load and store
 | ||
|    instructions which want their operands to look like "Ra,disp(Rb)".  */
 | ||
| #define AXP_OPERAND_PARENS	02
 | ||
| 
 | ||
| /* Used in combination with PARENS, this supresses the supression of
 | ||
|    the comma.  This is used for "jmp Ra,(Rb),hint".  */
 | ||
| #define AXP_OPERAND_COMMA	04
 | ||
| 
 | ||
| /* This operand names an integer register.  */
 | ||
| #define AXP_OPERAND_IR		010
 | ||
| 
 | ||
| /* This operand names a floating point register.  */
 | ||
| #define AXP_OPERAND_FPR		020
 | ||
| 
 | ||
| /* This operand is a relative branch displacement.  The disassembler
 | ||
|    prints these symbolically if possible.  */
 | ||
| #define AXP_OPERAND_RELATIVE	040
 | ||
| 
 | ||
| /* This operand takes signed values.  */
 | ||
| #define AXP_OPERAND_SIGNED	0100
 | ||
| 
 | ||
| /* This operand takes unsigned values.  This exists primarily so that
 | ||
|    a flags value of 0 can be treated as end-of-arguments.  */
 | ||
| #define AXP_OPERAND_UNSIGNED	0200
 | ||
| 
 | ||
| /* Supress overflow detection on this field.  This is used for hints. */
 | ||
| #define AXP_OPERAND_NOOVERFLOW	0400
 | ||
| 
 | ||
| /* Mask for optional argument default value.  */
 | ||
| #define AXP_OPERAND_OPTIONAL_MASK 07000
 | ||
| 
 | ||
| /* This operand defaults to zero.  This is used for jump hints.  */
 | ||
| #define AXP_OPERAND_DEFAULT_ZERO 01000
 | ||
| 
 | ||
| /* This operand should default to the first (real) operand and is used
 | ||
|    in conjunction with AXP_OPERAND_OPTIONAL.  This allows
 | ||
|    "and $0,3,$0" to be written as "and $0,3", etc.  I don't like
 | ||
|    it, but it's what DEC does.  */
 | ||
| #define AXP_OPERAND_DEFAULT_FIRST 02000
 | ||
| 
 | ||
| /* Similarly, this operand should default to the second (real) operand.
 | ||
|    This allows "negl $0" instead of "negl $0,$0".  */
 | ||
| #define AXP_OPERAND_DEFAULT_SECOND 04000
 | ||
| 
 | ||
| 
 | ||
| /* Register common names */
 | ||
| 
 | ||
| #define AXP_REG_V0	0
 | ||
| #define AXP_REG_T0	1
 | ||
| #define AXP_REG_T1	2
 | ||
| #define AXP_REG_T2	3
 | ||
| #define AXP_REG_T3	4
 | ||
| #define AXP_REG_T4	5
 | ||
| #define AXP_REG_T5	6
 | ||
| #define AXP_REG_T6	7
 | ||
| #define AXP_REG_T7	8
 | ||
| #define AXP_REG_S0	9
 | ||
| #define AXP_REG_S1	10
 | ||
| #define AXP_REG_S2	11
 | ||
| #define AXP_REG_S3	12
 | ||
| #define AXP_REG_S4	13
 | ||
| #define AXP_REG_S5	14
 | ||
| #define AXP_REG_FP	15
 | ||
| #define AXP_REG_A0	16
 | ||
| #define AXP_REG_A1	17
 | ||
| #define AXP_REG_A2	18
 | ||
| #define AXP_REG_A3	19
 | ||
| #define AXP_REG_A4	20
 | ||
| #define AXP_REG_A5	21
 | ||
| #define AXP_REG_T8	22
 | ||
| #define AXP_REG_T9	23
 | ||
| #define AXP_REG_T10	24
 | ||
| #define AXP_REG_T11	25
 | ||
| #define AXP_REG_RA	26
 | ||
| #define AXP_REG_PV	27
 | ||
| #define AXP_REG_T12	27
 | ||
| #define AXP_REG_AT	28
 | ||
| #define AXP_REG_GP	29
 | ||
| #define AXP_REG_SP	30
 | ||
| #define AXP_REG_ZERO	31
 | ||
| 
 | ||
| #endif /* OPCODE_ALPHA_H */
 |