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