1 /* Nios II opcode list for GAS, the GNU assembler.
2 Copyright (C) 2012, 2013 Free Software Foundation, Inc.
3 Contributed by Nigel Gray (ngray@altera.com).
4 Contributed by Mentor Graphics, Inc.
6 This file is part of GAS, the GNU Assembler, and GDB, the GNU disassembler.
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)
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.
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. */
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 ****************************************************************************/
34 /* Identify different overflow situations for error messages. */
37 call_target_overflow
= 0,
38 branch_target_overflow
,
39 address_offset_overflow
,
40 signed_immed16_overflow
,
41 unsigned_immed16_overflow
,
42 unsigned_immed5_overflow
,
43 custom_opcode_overflow
,
47 /* This structure holds information for a particular instruction.
49 The args field is a string describing the operands. The following
50 letters can appear in the args:
51 c - a 5-bit control register index
52 d - a 5-bit destination register index
53 s - a 5-bit left source register index
54 t - a 5-bit right source register index
55 i - a 16-bit signed immediate
56 u - a 16-bit unsigned immediate
57 o - a 16-bit signed program counter relative offset
58 j - a 5-bit unsigned immediate
59 b - a 5-bit break instruction constant
60 l - a 8-bit custom instruction constant
61 m - a 26-bit unsigned immediate
62 Literal ',', '(', and ')' characters may also appear in the args as
65 The pinfo field is INSN_MACRO for a macro. Otherwise, it is a collection
66 of bits describing the instruction, notably any relevant hazard
69 When assembling, the match field contains the opcode template, which
70 is modified by the arguments to produce the actual opcode
71 that is emitted. If pinfo is INSN_MACRO, then this is 0.
73 If pinfo is INSN_MACRO, the mask field stores the macro identifier.
74 Otherwise this is a bit mask for the relevant portions of the opcode
75 when disassembling. If the actual opcode anded with the match field
76 equals the opcode field, then we have found the correct instruction. */
80 const char *name
; /* The name of the instruction. */
81 const char *args
; /* A string describing the arguments for this
83 const char *args_test
; /* Like args, but with an extra argument for
84 the expected opcode. */
85 unsigned long num_args
; /* The number of arguments the instruction
87 unsigned long match
; /* The basic opcode for the instruction. */
88 unsigned long mask
; /* Mask for the opcode field of the
90 unsigned long pinfo
; /* Is this a real instruction or instruction
92 enum overflow_type overflow_msg
; /* Used to generate informative
93 message when fixup overflows. */
96 /* This value is used in the nios2_opcode.pinfo field to indicate that the
97 instruction is a macro or pseudo-op. This requires special treatment by
98 the assembler, and is used by the disassembler to determine whether to
100 #define NIOS2_INSN_MACRO 0x80000000
101 #define NIOS2_INSN_MACRO_MOV 0x80000001
102 #define NIOS2_INSN_MACRO_MOVI 0x80000002
103 #define NIOS2_INSN_MACRO_MOVIA 0x80000004
105 #define NIOS2_INSN_RELAXABLE 0x40000000
106 #define NIOS2_INSN_UBRANCH 0x00000010
107 #define NIOS2_INSN_CBRANCH 0x00000020
108 #define NIOS2_INSN_CALL 0x00000040
110 #define NIOS2_INSN_ADDI 0x00000080
111 #define NIOS2_INSN_ANDI 0x00000100
112 #define NIOS2_INSN_ORI 0x00000200
113 #define NIOS2_INSN_XORI 0x00000400
116 /* Associates a register name ($6) with a 5-bit index (eg 6). */
124 /* These are bit masks and shift counts for accessing the various
125 fields of a Nios II instruction. */
127 /* Macros for getting and setting an instruction field. */
128 #define GET_INSN_FIELD(X, i) \
129 (((i) & OP_MASK_##X) >> OP_SH_##X)
130 #define SET_INSN_FIELD(X, i, j) \
131 ((i) = (((i) & ~OP_MASK_##X) | (((j) << OP_SH_##X) & OP_MASK_##X)))
133 /* Instruction field definitions. */
137 #define IW_A_MASK 0x1f
142 #define IW_B_MASK 0x1f
147 #define IW_C_MASK 0x1f
149 #define IW_IMM16_LSB 6
150 #define IW_IMM16_MSB 21
151 #define IW_IMM16_SZ 16
152 #define IW_IMM16_MASK 0xffff
154 #define IW_IMM26_LSB 6
155 #define IW_IMM26_MSB 31
156 #define IW_IMM26_SZ 26
157 #define IW_IMM26_MASK 0x3ffffff
162 #define IW_OP_MASK 0x3f
164 #define IW_OPX_LSB 11
165 #define IW_OPX_MSB 16
167 #define IW_OPX_MASK 0x3f
169 #define IW_SHIFT_IMM5_LSB 6
170 #define IW_SHIFT_IMM5_MSB 10
171 #define IW_SHIFT_IMM5_SZ 5
172 #define IW_SHIFT_IMM5_MASK 0x1f
174 #define IW_CONTROL_REGNUM_LSB 6
175 #define IW_CONTROL_REGNUM_MSB 9
176 #define IW_CONTROL_REGNUM_SZ 4
177 #define IW_CONTROL_REGNUM_MASK 0xf
179 /* Operator mask and shift. */
180 #define OP_MASK_OP (IW_OP_MASK << IW_OP_LSB)
181 #define OP_SH_OP IW_OP_LSB
183 /* Masks and shifts for I-type instructions. */
184 #define OP_MASK_IOP (IW_OP_MASK << IW_OP_LSB)
185 #define OP_SH_IOP IW_OP_LSB
187 #define OP_MASK_IMM16 (IW_IMM16_MASK << IW_IMM16_LSB)
188 #define OP_SH_IMM16 IW_IMM16_LSB
190 #define OP_MASK_IRD (IW_B_MASK << IW_B_LSB)
191 #define OP_SH_IRD IW_B_LSB /* The same as T for I-type. */
193 #define OP_MASK_IRT (IW_B_MASK << IW_B_LSB)
194 #define OP_SH_IRT IW_B_LSB
196 #define OP_MASK_IRS (IW_A_MASK << IW_A_LSB)
197 #define OP_SH_IRS IW_A_LSB
199 /* Masks and shifts for R-type instructions. */
200 #define OP_MASK_ROP (IW_OP_MASK << IW_OP_LSB)
201 #define OP_SH_ROP IW_OP_LSB
203 #define OP_MASK_ROPX (IW_OPX_MASK << IW_OPX_LSB)
204 #define OP_SH_ROPX IW_OPX_LSB
206 #define OP_MASK_RRD (IW_C_MASK << IW_C_LSB)
207 #define OP_SH_RRD IW_C_LSB
209 #define OP_MASK_RRT (IW_B_MASK << IW_B_LSB)
210 #define OP_SH_RRT IW_B_LSB
212 #define OP_MASK_RRS (IW_A_MASK << IW_A_LSB)
213 #define OP_SH_RRS IW_A_LSB
215 /* Masks and shifts for J-type instructions. */
216 #define OP_MASK_JOP (IW_OP_MASK << IW_OP_LSB)
217 #define OP_SH_JOP IW_OP_LSB
219 #define OP_MASK_IMM26 (IW_IMM26_MASK << IW_IMM26_LSB)
220 #define OP_SH_IMM26 IW_IMM26_LSB
222 /* Masks and shifts for CTL instructions. */
223 #define OP_MASK_RCTL 0x000007c0
226 /* Break instruction imm5 field. */
227 #define OP_MASK_TRAP_IMM5 0x000007c0
228 #define OP_SH_TRAP_IMM5 6
230 /* Instruction imm5 field. */
231 #define OP_MASK_IMM5 (IW_SHIFT_IMM5_MASK << IW_SHIFT_IMM5_LSB)
232 #define OP_SH_IMM5 IW_SHIFT_IMM5_LSB
234 /* Cache operation fields (type j,i(s)). */
235 #define OP_MASK_CACHE_OPX (IW_B_MASK << IW_B_LSB)
236 #define OP_SH_CACHE_OPX IW_B_LSB
237 #define OP_MASK_CACHE_RRS (IW_A_MASK << IW_A_LSB)
238 #define OP_SH_CACHE_RRS IW_A_LSB
240 /* Custom instruction masks. */
241 #define OP_MASK_CUSTOM_A 0x00010000
242 #define OP_SH_CUSTOM_A 16
244 #define OP_MASK_CUSTOM_B 0x00008000
245 #define OP_SH_CUSTOM_B 15
247 #define OP_MASK_CUSTOM_C 0x00004000
248 #define OP_SH_CUSTOM_C 14
250 #define OP_MASK_CUSTOM_N 0x00003fc0
251 #define OP_SH_CUSTOM_N 6
252 #define OP_MAX_CUSTOM_N 255
254 /* OP instruction values. */
268 #define OP_CMPGEUI 40
270 #define OP_CMPLTUI 48
274 #define OP_FLUSHDA 27
304 /* OPX instruction values. */
312 #define OPX_CMPGEU 40
314 #define OPX_CMPLTU 48
320 #define OPX_FLUSHI 12
322 #define OPX_HBREAK 53
327 #define OPX_MULXSS 31
328 #define OPX_MULXSU 23
330 #define OPX_NEXTPC 28
351 /* The following macros define the opcode matches for each
352 instruction code & OP_MASK_INST == OP_MATCH_INST. */
354 /* OP instruction matches. */
355 #define OP_MATCH_ADDI OP_ADDI
356 #define OP_MATCH_ANDHI OP_ANDHI
357 #define OP_MATCH_ANDI OP_ANDI
358 #define OP_MATCH_BEQ OP_BEQ
359 #define OP_MATCH_BGE OP_BGE
360 #define OP_MATCH_BGEU OP_BGEU
361 #define OP_MATCH_BLT OP_BLT
362 #define OP_MATCH_BLTU OP_BLTU
363 #define OP_MATCH_BNE OP_BNE
364 #define OP_MATCH_BR OP_BR
365 #define OP_MATCH_FLUSHD OP_FLUSHD
366 #define OP_MATCH_FLUSHDA OP_FLUSHDA
367 #define OP_MATCH_INITD OP_INITD
368 #define OP_MATCH_INITDA OP_INITDA
369 #define OP_MATCH_CALL OP_CALL
370 #define OP_MATCH_CMPEQI OP_CMPEQI
371 #define OP_MATCH_CMPGEI OP_CMPGEI
372 #define OP_MATCH_CMPGEUI OP_CMPGEUI
373 #define OP_MATCH_CMPLTI OP_CMPLTI
374 #define OP_MATCH_CMPLTUI OP_CMPLTUI
375 #define OP_MATCH_CMPNEI OP_CMPNEI
376 #define OP_MATCH_JMPI OP_JMPI
377 #define OP_MATCH_LDB OP_LDB
378 #define OP_MATCH_LDBIO OP_LDBIO
379 #define OP_MATCH_LDBU OP_LDBU
380 #define OP_MATCH_LDBUIO OP_LDBUIO
381 #define OP_MATCH_LDH OP_LDH
382 #define OP_MATCH_LDHIO OP_LDHIO
383 #define OP_MATCH_LDHU OP_LDHU
384 #define OP_MATCH_LDHUIO OP_LDHUIO
385 #define OP_MATCH_LDL OP_LDL
386 #define OP_MATCH_LDW OP_LDW
387 #define OP_MATCH_LDWIO OP_LDWIO
388 #define OP_MATCH_MULI OP_MULI
389 #define OP_MATCH_OPX OP_OPX
390 #define OP_MATCH_ORHI OP_ORHI
391 #define OP_MATCH_ORI OP_ORI
392 #define OP_MATCH_RDPRS OP_RDPRS
393 #define OP_MATCH_STB OP_STB
394 #define OP_MATCH_STBIO OP_STBIO
395 #define OP_MATCH_STC OP_STC
396 #define OP_MATCH_STH OP_STH
397 #define OP_MATCH_STHIO OP_STHIO
398 #define OP_MATCH_STW OP_STW
399 #define OP_MATCH_STWIO OP_STWIO
400 #define OP_MATCH_CUSTOM OP_CUSTOM
401 #define OP_MATCH_XORHI OP_XORHI
402 #define OP_MATCH_XORI OP_XORI
403 #define OP_MATCH_OPX OP_OPX
405 /* OPX instruction values. */
406 #define OPX_MATCH(code) ((code << IW_OPX_LSB) | OP_OPX)
408 #define OP_MATCH_ADD OPX_MATCH (OPX_ADD)
409 #define OP_MATCH_AND OPX_MATCH (OPX_AND)
410 #define OP_MATCH_BREAK ((0x1e << 17) | OPX_MATCH (OPX_BREAK))
411 #define OP_MATCH_BRET (0xf0000000 | OPX_MATCH (OPX_BRET))
412 #define OP_MATCH_CALLR ((0x1f << 17) | OPX_MATCH (OPX_CALLR))
413 #define OP_MATCH_CMPEQ OPX_MATCH (OPX_CMPEQ)
414 #define OP_MATCH_CMPGE OPX_MATCH (OPX_CMPGE)
415 #define OP_MATCH_CMPGEU OPX_MATCH (OPX_CMPGEU)
416 #define OP_MATCH_CMPLT OPX_MATCH (OPX_CMPLT)
417 #define OP_MATCH_CMPLTU OPX_MATCH (OPX_CMPLTU)
418 #define OP_MATCH_CMPNE OPX_MATCH (OPX_CMPNE)
419 #define OP_MATCH_DIV OPX_MATCH (OPX_DIV)
420 #define OP_MATCH_DIVU OPX_MATCH (OPX_DIVU)
421 #define OP_MATCH_JMP OPX_MATCH (OPX_JMP)
422 #define OP_MATCH_MUL OPX_MATCH (OPX_MUL)
423 #define OP_MATCH_MULXSS OPX_MATCH (OPX_MULXSS)
424 #define OP_MATCH_MULXSU OPX_MATCH (OPX_MULXSU)
425 #define OP_MATCH_MULXUU OPX_MATCH (OPX_MULXUU)
426 #define OP_MATCH_NEXTPC OPX_MATCH (OPX_NEXTPC)
427 #define OP_MATCH_NOR OPX_MATCH (OPX_NOR)
428 #define OP_MATCH_OR OPX_MATCH (OPX_OR)
429 #define OP_MATCH_RDCTL OPX_MATCH (OPX_RDCTL)
430 #define OP_MATCH_RET (0xf8000000 | OPX_MATCH (OPX_RET))
431 #define OP_MATCH_ROL OPX_MATCH (OPX_ROL)
432 #define OP_MATCH_ROLI OPX_MATCH (OPX_ROLI)
433 #define OP_MATCH_ROR OPX_MATCH (OPX_ROR)
434 #define OP_MATCH_SLL OPX_MATCH (OPX_SLL)
435 #define OP_MATCH_SLLI OPX_MATCH (OPX_SLLI)
436 #define OP_MATCH_SRA OPX_MATCH (OPX_SRA)
437 #define OP_MATCH_SRAI OPX_MATCH (OPX_SRAI)
438 #define OP_MATCH_SRL OPX_MATCH (OPX_SRL)
439 #define OP_MATCH_SRLI OPX_MATCH (OPX_SRLI)
440 #define OP_MATCH_SUB OPX_MATCH (OPX_SUB)
441 #define OP_MATCH_SYNC OPX_MATCH (OPX_SYNC)
442 #define OP_MATCH_TRAP ((0x1d << 17) | OPX_MATCH (OPX_TRAP))
443 #define OP_MATCH_ERET (0xef800000 | OPX_MATCH (OPX_ERET))
444 #define OP_MATCH_WRCTL OPX_MATCH (OPX_WRCTL)
445 #define OP_MATCH_WRPRS OPX_MATCH (OPX_WRPRS)
446 #define OP_MATCH_XOR OPX_MATCH (OPX_XOR)
447 #define OP_MATCH_FLUSHI OPX_MATCH (OPX_FLUSHI)
448 #define OP_MATCH_FLUSHP OPX_MATCH (OPX_FLUSHP)
449 #define OP_MATCH_INITI OPX_MATCH (OPX_INITI)
451 /* Some unusual op masks. */
452 #define OP_MASK_BREAK ((OP_MASK_RRS | OP_MASK_RRT | OP_MASK_RRD \
453 | OP_MASK_ROPX | OP_MASK_OP) \
455 #define OP_MASK_CALLR ((OP_MASK_RRT | OP_MASK_RRD | OP_MASK_ROPX \
457 #define OP_MASK_JMP ((OP_MASK_RRT | OP_MASK_RRD | OP_MASK_ROPX \
459 #define OP_MASK_SYNC ((OP_MASK_RRT | OP_MASK_RRD | OP_MASK_ROPX \
461 #define OP_MASK_TRAP ((OP_MASK_RRS | OP_MASK_RRT | OP_MASK_RRD \
462 | OP_MASK_ROPX | OP_MASK_OP) \
464 #define OP_MASK_WRCTL ((OP_MASK_RRT | OP_MASK_RRD | OP_MASK_ROPX \
465 | OP_MASK_OP)) /*& 0xfffff83f */
466 #define OP_MASK_NEXTPC ((OP_MASK_RRS | OP_MASK_RRT | OP_MASK_ROPX \
468 #define OP_MASK_FLUSHI ((OP_MASK_RRT | OP_MASK_RRD | OP_MASK_ROPX \
470 #define OP_MASK_INITI ((OP_MASK_RRT | OP_MASK_RRD | OP_MASK_ROPX \
473 #define OP_MASK_ROLI ((OP_MASK_RRT | OP_MASK_ROPX | OP_MASK_OP))
474 #define OP_MASK_SLLI ((OP_MASK_RRT | OP_MASK_ROPX | OP_MASK_OP))
475 #define OP_MASK_SRAI ((OP_MASK_RRT | OP_MASK_ROPX | OP_MASK_OP))
476 #define OP_MASK_SRLI ((OP_MASK_RRT | OP_MASK_ROPX | OP_MASK_OP))
477 #define OP_MASK_RDCTL ((OP_MASK_RRS | OP_MASK_RRT | OP_MASK_ROPX \
478 | OP_MASK_OP)) /*& 0xfffff83f */
481 #define OP_MASK 0xffffffff
484 /* These convenience macros to extract instruction fields are used by GDB. */
485 #define GET_IW_A(Iw) \
486 (((Iw) >> IW_A_LSB) & IW_A_MASK)
487 #define GET_IW_B(Iw) \
488 (((Iw) >> IW_B_LSB) & IW_B_MASK)
489 #define GET_IW_C(Iw) \
490 (((Iw) >> IW_C_LSB) & IW_C_MASK)
491 #define GET_IW_CONTROL_REGNUM(Iw) \
492 (((Iw) >> IW_CONTROL_REGNUM_LSB) & IW_CONTROL_REGNUM_MASK)
493 #define GET_IW_IMM16(Iw) \
494 (((Iw) >> IW_IMM16_LSB) & IW_IMM16_MASK)
495 #define GET_IW_IMM26(Iw) \
496 (((Iw) >> IW_IMM26_LSB) & IW_IMM26_MASK)
497 #define GET_IW_OP(Iw) \
498 (((Iw) >> IW_OP_LSB) & IW_OP_MASK)
499 #define GET_IW_OPX(Iw) \
500 (((Iw) >> IW_OPX_LSB) & IW_OPX_MASK)
502 /* These are the data structures we use to hold the instruction information. */
503 extern const struct nios2_opcode nios2_builtin_opcodes
[];
504 extern const int bfd_nios2_num_builtin_opcodes
;
505 extern struct nios2_opcode
*nios2_opcodes
;
506 extern int bfd_nios2_num_opcodes
;
508 /* These are the data structures used to hold the register information. */
509 extern const struct nios2_reg nios2_builtin_regs
[];
510 extern struct nios2_reg
*nios2_regs
;
511 extern const int nios2_num_builtin_regs
;
512 extern int nios2_num_regs
;
514 /* Machine-independent macro for number of opcodes. */
515 #define NUMOPCODES bfd_nios2_num_opcodes
516 #define NUMREGISTERS nios2_num_regs;
518 /* This is made extern so that the assembler can use it to find out
519 what instruction caused an error. */
520 extern const struct nios2_opcode
*nios2_find_opcode_hash (unsigned long);
522 #endif /* _NIOS2_H */