arc-opc.c

来自「基于4个mips核的noc设计」· C语言 代码 · 共 1,826 行 · 第 1/4 页

C
1,826
字号
/* Opcode table for the ARC.   Copyright 1994, 1995, 1997, 1998, 2000, 2001   Free Software Foundation, Inc.   Contributed by Doug Evans (dje@cygnus.com).   This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 2, or (at your option)   any later version.   This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   You should have received a copy of the GNU General Public License   along with this program; if not, write to the Free Software Foundation,   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */#include <stdio.h>#include "ansidecl.h"#include "opcode/arc.h"#define INSERT_FN(fn) \static arc_insn fn PARAMS ((arc_insn, const struct arc_operand *, \			    int, const struct arc_operand_value *, long, \			    const char **))#define EXTRACT_FN(fn) \static long fn PARAMS ((arc_insn *, const struct arc_operand *, \			int, const struct arc_operand_value **, int *))INSERT_FN (insert_reg);INSERT_FN (insert_shimmfinish);INSERT_FN (insert_limmfinish);INSERT_FN (insert_offset);INSERT_FN (insert_base);INSERT_FN (insert_st_syntax);INSERT_FN (insert_ld_syntax);INSERT_FN (insert_addr_wb);INSERT_FN (insert_flag);INSERT_FN (insert_nullify);INSERT_FN (insert_flagfinish);INSERT_FN (insert_cond);INSERT_FN (insert_forcelimm);INSERT_FN (insert_reladdr);INSERT_FN (insert_absaddr);INSERT_FN (insert_jumpflags);INSERT_FN (insert_unopmacro);EXTRACT_FN (extract_reg);EXTRACT_FN (extract_ld_offset);EXTRACT_FN (extract_ld_syntax);EXTRACT_FN (extract_st_offset);EXTRACT_FN (extract_st_syntax);EXTRACT_FN (extract_flag);EXTRACT_FN (extract_cond);EXTRACT_FN (extract_reladdr);EXTRACT_FN (extract_jumpflags);EXTRACT_FN (extract_unopmacro);enum operand {OP_NONE,OP_REG,OP_SHIMM,OP_LIMM};#define OPERANDS 3enum operand ls_operand[OPERANDS];#define LS_VALUE  0#define LS_DEST   0#define LS_BASE   1#define LS_OFFSET 2/* Various types of ARC operands, including insn suffixes.  *//* Insn format values:   'a'	REGA		register A field   'b'	REGB		register B field   'c'	REGC		register C field   'S'	SHIMMFINISH	finish inserting a shimm value   'L'	LIMMFINISH	finish inserting a limm value   'o'	OFFSET		offset in st insns   'O'	OFFSET		offset in ld insns   '0'	SYNTAX_ST_NE	enforce store insn syntax, no errors   '1'	SYNTAX_LD_NE	enforce load insn syntax, no errors   '2'  SYNTAX_ST       enforce store insn syntax, errors, last pattern only   '3'  SYNTAX_LD       enforce load insn syntax, errors, last pattern only   's'  BASE            base in st insn   'f'	FLAG		F flag   'F'	FLAGFINISH	finish inserting the F flag   'G'	FLAGINSN	insert F flag in "flag" insn   'n'	DELAY		N field (nullify field)   'q'	COND		condition code field   'Q'	FORCELIMM	set `cond_p' to 1 to ensure a constant is a limm   'B'	BRANCH		branch address (22 bit pc relative)   'J'	JUMP		jump address (26 bit absolute)   'j'  JUMPFLAGS       optional high order bits of 'J'   'z'	SIZE1		size field in ld a,[b,c]   'Z'	SIZE10		size field in ld a,[b,shimm]   'y'	SIZE22		size field in st c,[b,shimm]   'x'	SIGN0		sign extend field ld a,[b,c]   'X'	SIGN9		sign extend field ld a,[b,shimm]   'w'	ADDRESS3	write-back field in ld a,[b,c]   'W'	ADDRESS12	write-back field in ld a,[b,shimm]   'v'	ADDRESS24	write-back field in st c,[b,shimm]   'e'	CACHEBYPASS5	cache bypass in ld a,[b,c]   'E'	CACHEBYPASS14	cache bypass in ld a,[b,shimm]   'D'	CACHEBYPASS26	cache bypass in st c,[b,shimm]   'U'	UNOPMACRO	fake operand to copy REGB to REGC for unop macros   The following modifiers may appear between the % and char (eg: %.f):   '.'	MODDOT		'.' prefix must be present   'r'	REG		generic register value, for register table   'A'	AUXREG		auxiliary register in lr a,[b], sr c,[b]   Fields are:   CHAR BITS SHIFT FLAGS INSERT_FN EXTRACT_FN  */const struct arc_operand arc_operands[] ={/* place holder (??? not sure if needed).  */#define UNUSED 0  { 0, 0, 0, 0, 0, 0 },/* register A or shimm/limm indicator.  */#define REGA (UNUSED + 1)  { 'a', 6, ARC_SHIFT_REGA, ARC_OPERAND_SIGNED | ARC_OPERAND_ERROR, insert_reg, extract_reg },/* register B or shimm/limm indicator.  */#define REGB (REGA + 1)  { 'b', 6, ARC_SHIFT_REGB, ARC_OPERAND_SIGNED | ARC_OPERAND_ERROR, insert_reg, extract_reg },/* register C or shimm/limm indicator.  */#define REGC (REGB + 1)  { 'c', 6, ARC_SHIFT_REGC, ARC_OPERAND_SIGNED | ARC_OPERAND_ERROR, insert_reg, extract_reg },/* fake operand used to insert shimm value into most instructions.  */#define SHIMMFINISH (REGC + 1)  { 'S', 9, 0, ARC_OPERAND_SIGNED + ARC_OPERAND_FAKE, insert_shimmfinish, 0 },/* fake operand used to insert limm value into most instructions.  */#define LIMMFINISH (SHIMMFINISH + 1)  { 'L', 32, 32, ARC_OPERAND_ADDRESS + ARC_OPERAND_LIMM + ARC_OPERAND_FAKE, insert_limmfinish, 0 },/* shimm operand when there is no reg indicator (st).  */#define ST_OFFSET (LIMMFINISH + 1)  { 'o', 9, 0, ARC_OPERAND_LIMM | ARC_OPERAND_SIGNED | ARC_OPERAND_STORE, insert_offset, extract_st_offset },/* shimm operand when there is no reg indicator (ld).  */#define LD_OFFSET (ST_OFFSET + 1)  { 'O', 9, 0,ARC_OPERAND_LIMM | ARC_OPERAND_SIGNED | ARC_OPERAND_LOAD, insert_offset, extract_ld_offset },/* operand for base.  */#define BASE (LD_OFFSET + 1)  { 's', 6, ARC_SHIFT_REGB, ARC_OPERAND_LIMM | ARC_OPERAND_SIGNED, insert_base, extract_reg},/* 0 enforce syntax for st insns.  */#define SYNTAX_ST_NE (BASE + 1)  { '0', 9, 0, ARC_OPERAND_FAKE, insert_st_syntax, extract_st_syntax },/* 1 enforce syntax for ld insns.  */#define SYNTAX_LD_NE (SYNTAX_ST_NE + 1)  { '1', 9, 0, ARC_OPERAND_FAKE, insert_ld_syntax, extract_ld_syntax },/* 0 enforce syntax for st insns.  */#define SYNTAX_ST (SYNTAX_LD_NE + 1)  { '2', 9, 0, ARC_OPERAND_FAKE | ARC_OPERAND_ERROR, insert_st_syntax, extract_st_syntax },/* 0 enforce syntax for ld insns.  */#define SYNTAX_LD (SYNTAX_ST + 1)  { '3', 9, 0, ARC_OPERAND_FAKE | ARC_OPERAND_ERROR, insert_ld_syntax, extract_ld_syntax },/* flag update bit (insertion is defered until we know how).  */#define FLAG (SYNTAX_LD + 1)  { 'f', 1, 8, ARC_OPERAND_SUFFIX, insert_flag, extract_flag },/* fake utility operand to finish 'f' suffix handling.  */#define FLAGFINISH (FLAG + 1)  { 'F', 1, 8, ARC_OPERAND_FAKE, insert_flagfinish, 0 },/* fake utility operand to set the 'f' flag for the "flag" insn.  */#define FLAGINSN (FLAGFINISH + 1)  { 'G', 1, 8, ARC_OPERAND_FAKE, insert_flag, 0 },/* branch delay types.  */#define DELAY (FLAGINSN + 1)  { 'n', 2, 5, ARC_OPERAND_SUFFIX , insert_nullify, 0 },/* conditions.  */#define COND (DELAY + 1)  { 'q', 5, 0, ARC_OPERAND_SUFFIX, insert_cond, extract_cond },/* set `cond_p' to 1 to ensure a constant is treated as a limm.  */#define FORCELIMM (COND + 1)  { 'Q', 0, 0, ARC_OPERAND_FAKE, insert_forcelimm, 0 },/* branch address; b, bl, and lp insns.  */#define BRANCH (FORCELIMM + 1)  { 'B', 20, 7, (ARC_OPERAND_RELATIVE_BRANCH + ARC_OPERAND_SIGNED) | ARC_OPERAND_ERROR, insert_reladdr, extract_reladdr },/* jump address; j insn (this is basically the same as 'L' except that the   value is right shifted by 2).  */#define JUMP (BRANCH + 1)  { 'J', 24, 32, ARC_OPERAND_ERROR | (ARC_OPERAND_ABSOLUTE_BRANCH + ARC_OPERAND_LIMM + ARC_OPERAND_FAKE), insert_absaddr, 0 },/* jump flags; j{,l} insn value or'ed into 'J' addr for flag values.  */#define JUMPFLAGS (JUMP + 1)  { 'j', 6, 26, ARC_OPERAND_JUMPFLAGS | ARC_OPERAND_ERROR, insert_jumpflags, extract_jumpflags },/* size field, stored in bit 1,2.  */#define SIZE1 (JUMPFLAGS + 1)  { 'z', 2, 1, ARC_OPERAND_SUFFIX, 0, 0 },/* size field, stored in bit 10,11.  */#define SIZE10 (SIZE1 + 1)  { 'Z', 2, 10, ARC_OPERAND_SUFFIX, 0, 0 },/* size field, stored in bit 22,23.  */#define SIZE22 (SIZE10 + 1)  { 'y', 2, 22, ARC_OPERAND_SUFFIX, 0, 0 },/* sign extend field, stored in bit 0.  */#define SIGN0 (SIZE22 + 1)  { 'x', 1, 0, ARC_OPERAND_SUFFIX, 0, 0 },/* sign extend field, stored in bit 9.  */#define SIGN9 (SIGN0 + 1)  { 'X', 1, 9, ARC_OPERAND_SUFFIX, 0, 0 },/* address write back, stored in bit 3.  */#define ADDRESS3 (SIGN9 + 1)  { 'w', 1, 3, ARC_OPERAND_SUFFIX, insert_addr_wb, 0},/* address write back, stored in bit 12.  */#define ADDRESS12 (ADDRESS3 + 1)  { 'W', 1, 12, ARC_OPERAND_SUFFIX, insert_addr_wb, 0},/* address write back, stored in bit 24.  */#define ADDRESS24 (ADDRESS12 + 1)  { 'v', 1, 24, ARC_OPERAND_SUFFIX, insert_addr_wb, 0},/* cache bypass, stored in bit 5.  */#define CACHEBYPASS5 (ADDRESS24 + 1)  { 'e', 1, 5, ARC_OPERAND_SUFFIX, 0, 0 },/* cache bypass, stored in bit 14.  */#define CACHEBYPASS14 (CACHEBYPASS5 + 1)  { 'E', 1, 14, ARC_OPERAND_SUFFIX, 0, 0 },/* cache bypass, stored in bit 26.  */#define CACHEBYPASS26 (CACHEBYPASS14 + 1)  { 'D', 1, 26, ARC_OPERAND_SUFFIX, 0, 0 },/* unop macro, used to copy REGB to REGC.  */#define UNOPMACRO (CACHEBYPASS26 + 1)  { 'U', 6, ARC_SHIFT_REGC, ARC_OPERAND_FAKE, insert_unopmacro, extract_unopmacro },/* '.' modifier ('.' required).  */#define MODDOT (UNOPMACRO + 1)  { '.', 1, 0, ARC_MOD_DOT, 0, 0 },/* Dummy 'r' modifier for the register table.   It's called a "dummy" because there's no point in inserting an 'r' into all   the %a/%b/%c occurrences in the insn table.  */#define REG (MODDOT + 1)  { 'r', 6, 0, ARC_MOD_REG, 0, 0 },/* Known auxiliary register modifier (stored in shimm field).  */#define AUXREG (REG + 1)  { 'A', 9, 0, ARC_MOD_AUXREG, 0, 0 },/* end of list place holder.  */  { 0, 0, 0, 0, 0, 0 }};/* Given a format letter, yields the index into `arc_operands'.   eg: arc_operand_map['a'] = REGA.  */unsigned char arc_operand_map[256];/* ARC instructions.   Longer versions of insns must appear before shorter ones (if gas sees   "lsr r2,r3,1" when it's parsing "lsr %a,%b" it will think the ",1" is   junk).  This isn't necessary for `ld' because of the trailing ']'.   Instructions that are really macros based on other insns must appear   before the real insn so they're chosen when disassembling.  Eg: The `mov'   insn is really the `and' insn.  */struct arc_opcode arc_opcodes[] ={  /* Base case instruction set (core versions 5-8)  */  /* "mov" is really an "and".  */  { "mov%.q%.f %a,%b%F%S%L%U", I(-1), I(12), ARC_MACH_5, 0, 0 },  /* "asl" is really an "add".  */  { "asl%.q%.f %a,%b%F%S%L%U", I(-1), I(8), ARC_MACH_5, 0, 0 },  /* "lsl" is really an "add".  */  { "lsl%.q%.f %a,%b%F%S%L%U", I(-1), I(8), ARC_MACH_5, 0, 0 },  /* "nop" is really an "xor".  */  { "nop", 0x7fffffff, 0x7fffffff, ARC_MACH_5, 0, 0 },  /* "rlc" is really an "adc".  */  { "rlc%.q%.f %a,%b%F%S%L%U", I(-1), I(9), ARC_MACH_5, 0, 0 },  { "adc%.q%.f %a,%b,%c%F%S%L", I(-1), I(9), ARC_MACH_5, 0, 0 },  { "add%.q%.f %a,%b,%c%F%S%L", I(-1), I(8), ARC_MACH_5, 0, 0 },  { "and%.q%.f %a,%b,%c%F%S%L", I(-1), I(12), ARC_MACH_5, 0, 0 },  { "asr%.q%.f %a,%b%F%S%L", I(-1)|C(-1), I(3)|C(1), ARC_MACH_5, 0, 0 },  { "bic%.q%.f %a,%b,%c%F%S%L",	I(-1), I(14), ARC_MACH_5, 0, 0 },  { "b%q%.n %B", I(-1), I(4), ARC_MACH_5 | ARC_OPCODE_COND_BRANCH, 0, 0 },  { "bl%q%.n %B", I(-1), I(5), ARC_MACH_5 | ARC_OPCODE_COND_BRANCH, 0, 0 },  { "extb%.q%.f %a,%b%F%S%L", I(-1)|C(-1), I(3)|C(7), ARC_MACH_5, 0, 0 },  { "extw%.q%.f %a,%b%F%S%L", I(-1)|C(-1), I(3)|C(8), ARC_MACH_5, 0, 0 },  { "flag%.q %b%G%S%L", I(-1)|A(-1)|C(-1), I(3)|A(ARC_REG_SHIMM_UPDATE)|C(0), ARC_MACH_5, 0, 0 },  { "brk", 0x1ffffe00, 0x1ffffe00, ARC_MACH_7, 0, 0 },  { "sleep", 0x1ffffe01, 0x1ffffe01, ARC_MACH_7, 0, 0 },  { "swi", 0x1ffffe02, 0x1ffffe02, ARC_MACH_8, 0, 0 },  /* %Q: force cond_p=1 -> no shimm values. This insn allows an     optional flags spec.  */  { "j%q%Q%.n%.f %b%F%J,%j", I(-1)|A(-1)|C(-1)|R(-1,7,1), I(7)|A(0)|C(0)|R(0,7,1), ARC_MACH_5 | ARC_OPCODE_COND_BRANCH, 0, 0 },  { "j%q%Q%.n%.f %b%F%J", I(-1)|A(-1)|C(-1)|R(-1,7,1), I(7)|A(0)|C(0)|R(0,7,1), ARC_MACH_5 | ARC_OPCODE_COND_BRANCH, 0, 0 },  /* This insn allows an optional flags spec.  */  { "jl%q%Q%.n%.f %b%F%J,%j", I(-1)|A(-1)|C(-1)|R(-1,7,1)|R(-1,9,1), I(7)|A(0)|C(0)|R(0,7,1)|R(1,9,1), ARC_MACH_6 | ARC_OPCODE_COND_BRANCH, 0, 0 },  { "jl%q%Q%.n%.f %b%F%J", I(-1)|A(-1)|C(-1)|R(-1,7,1)|R(-1,9,1), I(7)|A(0)|C(0)|R(0,7,1)|R(1,9,1), ARC_MACH_6 | ARC_OPCODE_COND_BRANCH, 0, 0 },  /* Put opcode 1 ld insns first so shimm gets prefered over limm.     "[%b]" is before "[%b,%o]" so 0 offsets don't get printed.  */  { "ld%Z%.X%.W%.E %a,[%s]%S%L%1", I(-1)|R(-1,13,1)|R(-1,0,511), I(1)|R(0,13,1)|R(0,0,511), ARC_MACH_5, 0, 0 },  { "ld%z%.x%.w%.e %a,[%s]%S%L%1", I(-1)|R(-1,4,1)|R(-1,6,7), I(0)|R(0,4,1)|R(0,6,7), ARC_MACH_5, 0, 0 },  { "ld%z%.x%.w%.e %a,[%s,%O]%S%L%1", I(-1)|R(-1,4,1)|R(-1,6,7), I(0)|R(0,4,1)|R(0,6,7), ARC_MACH_5, 0, 0 },  { "ld%Z%.X%.W%.E %a,[%s,%O]%S%L%3", I(-1)|R(-1,13,1),	I(1)|R(0,13,1), ARC_MACH_5, 0, 0 },  { "lp%q%.n %B", I(-1), I(6), ARC_MACH_5, 0, 0 },  { "lr %a,[%Ab]%S%L", I(-1)|C(-1), I(1)|C(0x10), ARC_MACH_5, 0, 0 },  { "lsr%.q%.f %a,%b%F%S%L", I(-1)|C(-1), I(3)|C(2), ARC_MACH_5, 0, 0 },  { "or%.q%.f %a,%b,%c%F%S%L", I(-1), I(13), ARC_MACH_5, 0, 0 },  { "ror%.q%.f %a,%b%F%S%L", I(-1)|C(-1), I(3)|C(3), ARC_MACH_5, 0, 0 },  { "rrc%.q%.f %a,%b%F%S%L", I(-1)|C(-1), I(3)|C(4), ARC_MACH_5, 0, 0 },  { "sbc%.q%.f %a,%b,%c%F%S%L",	I(-1), I(11), ARC_MACH_5, 0, 0 },  { "sexb%.q%.f %a,%b%F%S%L", I(-1)|C(-1), I(3)|C(5), ARC_MACH_5, 0, 0 },  { "sexw%.q%.f %a,%b%F%S%L", I(-1)|C(-1), I(3)|C(6), ARC_MACH_5, 0, 0 },  { "sr %c,[%Ab]%S%L", I(-1)|A(-1), I(2)|A(0x10), ARC_MACH_5, 0, 0 },  /* "[%b]" is before "[%b,%o]" so 0 offsets don't get printed.  */  { "st%y%.v%.D %c,[%s]%L%S%0", I(-1)|R(-1,25,1)|R(-1,21,1), I(2)|R(0,25,1)|R(0,21,1), ARC_MACH_5, 0, 0 },  { "st%y%.v%.D %c,[%s,%o]%S%L%2", I(-1)|R(-1,25,1)|R(-1,21,1), I(2)|R(0,25,1)|R(0,21,1), ARC_MACH_5, 0, 0 },  { "sub%.q%.f %a,%b,%c%F%S%L",	I(-1), I(10), ARC_MACH_5, 0, 0 },  { "xor%.q%.f %a,%b,%c%F%S%L",	I(-1), I(15), ARC_MACH_5, 0, 0 }};const int arc_opcodes_count = sizeof (arc_opcodes) / sizeof (arc_opcodes[0]);const struct arc_operand_value arc_reg_names[] ={  /* Core register set r0-r63.  */  /* r0-r28 - general purpose registers.  */  { "r0", 0, REG, 0 }, { "r1", 1, REG, 0 }, { "r2", 2, REG, 0 },  { "r3", 3, REG, 0 }, { "r4", 4, REG, 0 }, { "r5", 5, REG, 0 },  { "r6", 6, REG, 0 }, { "r7", 7, REG, 0 }, { "r8", 8, REG, 0 },  { "r9", 9, REG, 0 }, { "r10", 10, REG, 0 }, { "r11", 11, REG, 0 },  { "r12", 12, REG, 0 }, { "r13", 13, REG, 0 }, { "r14", 14, REG, 0 },  { "r15", 15, REG, 0 }, { "r16", 16, REG, 0 }, { "r17", 17, REG, 0 },  { "r18", 18, REG, 0 }, { "r19", 19, REG, 0 }, { "r20", 20, REG, 0 },  { "r21", 21, REG, 0 }, { "r22", 22, REG, 0 }, { "r23", 23, REG, 0 },  { "r24", 24, REG, 0 }, { "r25", 25, REG, 0 }, { "r26", 26, REG, 0 },  { "r27", 27, REG, 0 }, { "r28", 28, REG, 0 },  /* Maskable interrupt link register.  */  { "ilink1", 29, REG, 0 },  /* Maskable interrupt link register.  */  { "ilink2", 30, REG, 0 },  /* Branch-link register.  */  { "blink", 31, REG, 0 },  /* r32-r59 reserved for extensions.  */  { "r32", 32, REG, 0 }, { "r33", 33, REG, 0 }, { "r34", 34, REG, 0 },  { "r35", 35, REG, 0 }, { "r36", 36, REG, 0 }, { "r37", 37, REG, 0 },  { "r38", 38, REG, 0 }, { "r39", 39, REG, 0 }, { "r40", 40, REG, 0 },  { "r41", 41, REG, 0 }, { "r42", 42, REG, 0 }, { "r43", 43, REG, 0 },  { "r44", 44, REG, 0 }, { "r45", 45, REG, 0 }, { "r46", 46, REG, 0 },  { "r47", 47, REG, 0 }, { "r48", 48, REG, 0 }, { "r49", 49, REG, 0 },  { "r50", 50, REG, 0 }, { "r51", 51, REG, 0 }, { "r52", 52, REG, 0 },  { "r53", 53, REG, 0 }, { "r54", 54, REG, 0 }, { "r55", 55, REG, 0 },  { "r56", 56, REG, 0 }, { "r57", 57, REG, 0 }, { "r58", 58, REG, 0 },  { "r59", 59, REG, 0 },  /* Loop count register (24 bits).  */  { "lp_count", 60, REG, 0 },  /* Short immediate data indicator setting flags.  */  { "r61", 61, REG, ARC_REGISTER_READONLY },  /* Long immediate data indicator setting flags.  */  { "r62", 62, REG, ARC_REGISTER_READONLY },  /* Short immediate data indicator not setting flags.  */  { "r63", 63, REG, ARC_REGISTER_READONLY },  /* Small-data base register.  */  { "gp", 26, REG, 0 },  /* Frame pointer.  */  { "fp", 27, REG, 0 },  /* Stack pointer.  */  { "sp", 28, REG, 0 },  { "r29", 29, REG, 0 },  { "r30", 30, REG, 0 },  { "r31", 31, REG, 0 },  { "r60", 60, REG, 0 },  /* Auxiliary register set.  */  /* Auxiliary register address map:     0xffffffff-0xffffff00 (-1..-256) - customer shimm allocation     0xfffffeff-0x80000000 - customer limm allocation     0x7fffffff-0x00000100 - ARC limm allocation     0x000000ff-0x00000000 - ARC shimm allocation  */  /* Base case auxiliary registers (shimm address).  */  { "status",         0x00, AUXREG, 0 },  { "semaphore",      0x01, AUXREG, 0 },  { "lp_start",       0x02, AUXREG, 0 },  { "lp_end",         0x03, AUXREG, 0 },  { "identity",       0x04, AUXREG, ARC_REGISTER_READONLY },  { "debug",          0x05, AUXREG, 0 },};const int arc_reg_names_count =  sizeof (arc_reg_names) / sizeof (arc_reg_names[0]);/* The suffix table.   Operands with the same name must be stored together.  */const struct arc_operand_value arc_suffixes[] ={  /* Entry 0 is special, default values aren't printed by the disassembler.  */  { "", 0, -1, 0 },  /* Base case condition codes.  */  { "al", 0, COND, 0 },  { "ra", 0, COND, 0 },  { "eq", 1, COND, 0 },  { "z", 1, COND, 0 },  { "ne", 2, COND, 0 },  { "nz", 2, COND, 0 },  { "pl", 3, COND, 0 },  { "p", 3, COND, 0 },  { "mi", 4, COND, 0 },  { "n", 4, COND, 0 },  { "cs", 5, COND, 0 },  { "c", 5, COND, 0 },  { "lo", 5, COND, 0 },  { "cc", 6, COND, 0 },  { "nc", 6, COND, 0 },  { "hs", 6, COND, 0 },  { "vs", 7, COND, 0 },  { "v", 7, COND, 0 },  { "vc", 8, COND, 0 },  { "nv", 8, COND, 0 },  { "gt", 9, COND, 0 },  { "ge", 10, COND, 0 },  { "lt", 11, COND, 0 },  { "le", 12, COND, 0 },

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?