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