Home | History | Annotate | Download | only in opcode
      1 /* Nios II opcode list for GAS, the GNU assembler.
      2    Copyright (C) 2012-2014 Free Software Foundation, Inc.
      3    Contributed by Nigel Gray (ngray (at) altera.com).
      4    Contributed by Mentor Graphics, Inc.
      5 
      6    This file is part of GAS, the GNU Assembler, and GDB, the GNU disassembler.
      7 
      8    GAS/GDB is free software; you can redistribute it and/or modify
      9    it under the terms of the GNU General Public License as published by
     10    the Free Software Foundation; either version 3, or (at your option)
     11    any later version.
     12 
     13    GAS/GDB is distributed in the hope that it will be useful,
     14    but WITHOUT ANY WARRANTY; without even the implied warranty of
     15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16    GNU General Public License for more details.
     17 
     18    You should have received a copy of the GNU General Public License
     19    along with GAS or GDB; see the file COPYING3.  If not, write to
     20    the Free Software Foundation, 51 Franklin Street - Fifth Floor,
     21    Boston, MA 02110-1301, USA.  */
     22 
     23 #ifndef _NIOS2_H_
     24 #define _NIOS2_H_
     25 
     26 #include "bfd.h"
     27 
     28 /****************************************************************************
     29  * This file contains structures, bit masks and shift counts used
     30  * by the GNU toolchain to define the Nios II instruction set and
     31  * access various opcode fields.
     32  ****************************************************************************/
     33 
     34 /* Instruction encoding formats.  */
     35 enum iw_format_type {
     36   /* R1 formats */
     37   iw_i_type,
     38   iw_r_type,
     39   iw_j_type,
     40   iw_custom_type
     41 };
     42 
     43 /* Identify different overflow situations for error messages.  */
     44 enum overflow_type
     45 {
     46   call_target_overflow = 0,
     47   branch_target_overflow,
     48   address_offset_overflow,
     49   signed_immed16_overflow,
     50   unsigned_immed16_overflow,
     51   unsigned_immed5_overflow,
     52   custom_opcode_overflow,
     53   no_overflow
     54 };
     55 
     56 /* This structure holds information for a particular instruction.
     57 
     58    The args field is a string describing the operands.  The following
     59    letters can appear in the args:
     60      c - a 5-bit control register index
     61      d - a 5-bit destination register index
     62      s - a 5-bit left source register index
     63      t - a 5-bit right source register index
     64      i - a 16-bit signed immediate
     65      u - a 16-bit unsigned immediate
     66      o - a 16-bit signed program counter relative offset
     67      j - a 5-bit unsigned immediate
     68      l - a 8-bit custom instruction constant
     69      m - a 26-bit unsigned immediate
     70    Literal ',', '(', and ')' characters may also appear in the args as
     71    delimiters.
     72 
     73    Note that the args describe the semantics and assembly-language syntax
     74    of the operands, not their encoding into the instruction word.
     75 
     76    The pinfo field is INSN_MACRO for a macro.  Otherwise, it is a collection
     77    of bits describing the instruction, notably any relevant hazard
     78    information.
     79 
     80    When assembling, the match field contains the opcode template, which
     81    is modified by the arguments to produce the actual opcode
     82    that is emitted.  If pinfo is INSN_MACRO, then this is 0.
     83 
     84    If pinfo is INSN_MACRO, the mask field stores the macro identifier.
     85    Otherwise this is a bit mask for the relevant portions of the opcode
     86    when disassembling.  If the actual opcode anded with the match field
     87    equals the opcode field, then we have found the correct instruction.  */
     88 
     89 struct nios2_opcode
     90 {
     91   const char *name;		/* The name of the instruction.  */
     92   const char *args;		/* A string describing the arguments for this
     93 				   instruction.  */
     94   const char *args_test;	/* Like args, but with an extra argument for
     95 				   the expected opcode.  */
     96   unsigned long num_args;	/* The number of arguments the instruction
     97 				   takes.  */
     98   unsigned size;		/* Size in bytes of the instruction.  */
     99   enum iw_format_type format;	/* Instruction format.  */
    100   unsigned long match;		/* The basic opcode for the instruction.  */
    101   unsigned long mask;		/* Mask for the opcode field of the
    102 				   instruction.  */
    103   unsigned long pinfo;		/* Is this a real instruction or instruction
    104 				   macro?  */
    105   enum overflow_type overflow_msg;  /* Used to generate informative
    106 				       message when fixup overflows.  */
    107 };
    108 
    109 /* This value is used in the nios2_opcode.pinfo field to indicate that the
    110    instruction is a macro or pseudo-op.  This requires special treatment by
    111    the assembler, and is used by the disassembler to determine whether to
    112    check for a nop.  */
    113 #define NIOS2_INSN_MACRO	0x80000000
    114 #define NIOS2_INSN_MACRO_MOV	0x80000001
    115 #define NIOS2_INSN_MACRO_MOVI	0x80000002
    116 #define NIOS2_INSN_MACRO_MOVIA	0x80000004
    117 
    118 #define NIOS2_INSN_RELAXABLE	0x40000000
    119 #define NIOS2_INSN_UBRANCH	0x00000010
    120 #define NIOS2_INSN_CBRANCH	0x00000020
    121 #define NIOS2_INSN_CALL		0x00000040
    122 
    123 #define NIOS2_INSN_ADDI		0x00000080
    124 #define NIOS2_INSN_ANDI		0x00000100
    125 #define NIOS2_INSN_ORI		0x00000200
    126 #define NIOS2_INSN_XORI		0x00000400
    127 
    128 #define NIOS2_INSN_OPTARG	0x00000800
    129 
    130 /* Register attributes.  */
    131 #define REG_NORMAL	(1<<0)	/* Normal registers.  */
    132 #define REG_CONTROL	(1<<1)  /* Control registers.  */
    133 #define REG_COPROCESSOR	(1<<2)  /* For custom instructions.  */
    134 
    135 struct nios2_reg
    136 {
    137   const char *name;
    138   const int index;
    139   unsigned long regtype;
    140 };
    141 
    142 /* Pull in the instruction field accessors, opcodes, and masks.  */
    143 #include "nios2r1.h"
    144 
    145 /* These are the data structures used to hold the instruction information.  */
    146 extern const struct nios2_opcode nios2_r1_opcodes[];
    147 extern const int nios2_num_r1_opcodes;
    148 extern struct nios2_opcode *nios2_opcodes;
    149 extern int nios2_num_opcodes;
    150 
    151 /* These are the data structures used to hold the register information.  */
    152 extern const struct nios2_reg nios2_builtin_regs[];
    153 extern struct nios2_reg *nios2_regs;
    154 extern const int nios2_num_builtin_regs;
    155 extern int nios2_num_regs;
    156 
    157 /* Return the opcode descriptor for a single instruction.  */
    158 extern const struct nios2_opcode *
    159 nios2_find_opcode_hash (unsigned long, unsigned long);
    160 
    161 #endif /* _NIOS2_H */
    162