Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /* Table of opcodes for the OpenRISC 1000 ISA.
  2.    Copyright 2002, 2003, 2010 Free Software Foundation, Inc.
  3.    Contributed by Damjan Lampret (lampret@opencores.org).
  4.    
  5.    This file is part of or1k_gen_isa, or1ksim, GDB and GAS.
  6.  
  7.    This program is free software; you can redistribute it and/or modify
  8.    it under the terms of the GNU General Public License as published by
  9.    the Free Software Foundation; either version 3 of the License, or
  10.    (at your option) any later version.
  11.  
  12.    This program is distributed in the hope that it will be useful,
  13.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.    GNU General Public License for more details.
  16.  
  17.    You should have received a copy of the GNU General Public License
  18.    along with this program; if not, write to the Free Software
  19.    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
  20.    MA 02110-1301, USA.  */
  21.  
  22. /* We treat all letters the same in encode/decode routines so
  23.    we need to assign some characteristics to them like signess etc.  */
  24.  
  25. #ifndef OR32_H_ISA
  26. #define OR32_H_ISA
  27.  
  28. #define NUM_UNSIGNED (0)
  29. #define NUM_SIGNED (1)
  30.  
  31. #define MAX_GPRS 32
  32. #define PAGE_SIZE 4096
  33. #undef __HALF_WORD_INSN__
  34.  
  35. #define OPERAND_DELIM (',')
  36.  
  37. #define OR32_IF_DELAY (1)
  38. #define OR32_W_FLAG   (2)
  39. #define OR32_R_FLAG   (4)
  40.  
  41. struct or32_letter
  42. {
  43.   char letter;
  44.   int  sign;
  45.   /* int  reloc; relocation per letter ??  */
  46. };
  47.  
  48. /* Main instruction specification array.  */
  49. struct or32_opcode
  50. {
  51.   /* Name of the instruction.  */
  52.   char *name;
  53.  
  54.   /* A string of characters which describe the operands.
  55.      Valid characters are:
  56.      ,() Itself.  Characters appears in the assembly code.
  57.      rA  Register operand.
  58.      rB  Register operand.
  59.      rD  Register operand.
  60.      I   An immediate operand, range -32768 to 32767.
  61.      J   An immediate operand, range . (unused)
  62.      K   An immediate operand, range 0 to 65535.
  63.      L   An immediate operand, range 0 to 63.
  64.      M   An immediate operand, range . (unused)
  65.      N   An immediate operand, range -33554432 to 33554431.
  66.      O   An immediate operand, range . (unused).  */
  67.   char *args;
  68.  
  69.   /* Opcode and operand encoding.  */
  70.   char *encoding;
  71.   void (*exec) (void);
  72.   unsigned int flags;
  73. };
  74.  
  75. #define OPTYPE_LAST (0x80000000)
  76. #define OPTYPE_OP   (0x40000000)
  77. #define OPTYPE_REG  (0x20000000)
  78. #define OPTYPE_SIG  (0x10000000)
  79. #define OPTYPE_DIS  (0x08000000)
  80. #define OPTYPE_DST  (0x04000000)
  81. #define OPTYPE_SBIT (0x00001F00)
  82. #define OPTYPE_SHR  (0x0000001F)
  83. #define OPTYPE_SBIT_SHR (8)
  84.  
  85. /* MM: Data how to decode operands.  */
  86. extern struct insn_op_struct
  87. {
  88.   unsigned long type;
  89.   unsigned long data;
  90. } **op_start;
  91.  
  92. #ifdef HAS_EXECUTION
  93. extern void l_invalid (void);
  94. extern void l_sfne    (void);
  95. extern void l_bf      (void);
  96. extern void l_add     (void);
  97. extern void l_sw      (void);
  98. extern void l_sb      (void);
  99. extern void l_sh      (void);
  100. extern void l_lwz     (void);
  101. extern void l_lbs     (void);
  102. extern void l_lbz     (void);
  103. extern void l_lhs     (void);
  104. extern void l_lhz     (void);
  105. extern void l_movhi   (void);
  106. extern void l_and     (void);
  107. extern void l_or      (void);
  108. extern void l_xor     (void);
  109. extern void l_sub     (void);
  110. extern void l_mul     (void);
  111. extern void l_div     (void);
  112. extern void l_divu    (void);
  113. extern void l_sll     (void);
  114. extern void l_sra     (void);
  115. extern void l_srl     (void);
  116. extern void l_j       (void);
  117. extern void l_jal     (void);
  118. extern void l_jalr    (void);
  119. extern void l_jr      (void);
  120. extern void l_rfe     (void);
  121. extern void l_nop     (void);
  122. extern void l_bnf     (void);
  123. extern void l_sfeq    (void);
  124. extern void l_sfgts   (void);
  125. extern void l_sfges   (void);
  126. extern void l_sflts   (void);
  127. extern void l_sfles   (void);
  128. extern void l_sfgtu   (void);
  129. extern void l_sfgeu   (void);
  130. extern void l_sfltu   (void);
  131. extern void l_sfleu   (void);
  132. extern void l_mtspr   (void);
  133. extern void l_mfspr   (void);
  134. extern void l_sys     (void);
  135. extern void l_trap    (void); /* CZ 21/06/01.  */
  136. extern void l_macrc   (void);
  137. extern void l_mac     (void);
  138. extern void l_msb     (void);
  139. extern void l_invalid (void);
  140. extern void l_cust1   (void);
  141. extern void l_cust2   (void);
  142. extern void l_cust3   (void);
  143. extern void l_cust4   (void);
  144. #endif
  145. extern void l_none    (void);
  146.  
  147. extern const struct or32_letter or32_letters[];
  148.  
  149. extern const struct  or32_opcode or32_opcodes[];
  150.  
  151. extern const unsigned int or32_num_opcodes;
  152.  
  153. /* Calculates instruction length in bytes.  Always 4 for OR32.  */
  154. extern int insn_len (int);
  155.  
  156. /* Is individual insn's operand signed or unsigned?  */
  157. extern int letter_signed (char);
  158.  
  159. /* Number of letters in the individual lettered operand.  */
  160. extern int letter_range (char);
  161.  
  162. /* MM: Returns index of given instruction name.  */
  163. extern int insn_index (char *);
  164.  
  165. /* MM: Returns instruction name from index.  */
  166. extern const char *insn_name (int);
  167.  
  168. /* MM: Constructs new FSM, based on or32_opcodes.  */
  169. extern void build_automata (void);
  170.  
  171. /* MM: Destructs FSM.  */
  172. extern void destruct_automata (void);
  173.  
  174. /* MM: Decodes instruction using FSM.  Call build_automata first.  */
  175. extern int insn_decode (unsigned int);
  176.  
  177. /* Disassemble one instruction from insn to disassemble.
  178.    Return the size of the instruction.  */
  179. int disassemble_insn (unsigned long);
  180.  
  181. #endif
  182.