Fri Jun 21 13:52:17 1996 Richard Henderson <rth@tamu.edu>
authorIan Lance Taylor <ian@airs.com>
Fri, 21 Jun 1996 17:52:56 +0000 (17:52 +0000)
committerIan Lance Taylor <ian@airs.com>
Fri, 21 Jun 1996 17:52:56 +0000 (17:52 +0000)
* alpha.h: New file.

include/opcode/.Sanitize
include/opcode/alpha.h [new file with mode: 0644]

index 4fb2bdccedd55a49f74bad6fffa7d83c5ba65ac8..fdf5feaf60d74b8d75b1afb9b6c012623fa4edc0 100644 (file)
@@ -34,6 +34,7 @@ Things-to-keep:
 
 ChangeLog
 a29k.h
+alpha.h
 arm.h
 convex.h
 h8300.h
diff --git a/include/opcode/alpha.h b/include/opcode/alpha.h
new file mode 100644 (file)
index 0000000..06ba20f
--- /dev/null
@@ -0,0 +1,236 @@
+/* alpha.h -- Header file for Alpha opcode table
+   Copyright 1996 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
+1, 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 COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#ifndef OPCODE_ALPHA_H
+#define OPCODE_ALPHA_H
+
+#include "bfd.h"               /* for bfd_reloc_code_real_type */
+
+/* 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 int alpha_num_opcodes;
+
+/* Values defined for the flags field of a struct alpha_opcode.  */
+
+/* CPU Availability */
+#define AXP_OPCODE_ALL         00001
+#define AXP_OPCODE_EV4         00002
+/* EV45 is not programatically different */
+#define AXP_OPCODE_EV5         00004
+#define AXP_OPCODE_EV56                00010
+
+/* 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
+
+\f
+/* The operands table is an array of struct alpha_operand.  */
+
+struct alpha_operand
+{
+  /* The number of bits in the operand.  */
+  int bits;
+
+  /* How far the operand is left shifted in the instruction.  */
+  int shift;
+
+  /* The default relocation type for this operand.  */
+  bfd_reloc_code_real_type default_reloc;
+
+  /* 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) PARAMS ((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) PARAMS ((unsigned instruction, int *invalid));
+
+  /* One bit syntax flags.  */
+  unsigned flags;
+};
+
+/* 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 int 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
+
+\f
+/* 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 */