1238384Sjkim/* Assembler instructions for Motorola's Mcore processor
2238384Sjkim   Copyright (C) 1999-2020 Free Software Foundation, Inc.
3238384Sjkim
4238384Sjkim   This file is part of the GNU opcodes library.
5238384Sjkim
6238384Sjkim   This library is free software; you can redistribute it and/or modify
7238384Sjkim   it under the terms of the GNU General Public License as published by
8238384Sjkim   the Free Software Foundation; either version 3, or (at your option)
9238384Sjkim   any later version.
10238384Sjkim
11238384Sjkim   It is distributed in the hope that it will be useful, but WITHOUT
12238384Sjkim   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13238384Sjkim   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
14238384Sjkim   License for more details.
15238384Sjkim
16238384Sjkim   You should have received a copy of the GNU General Public License
17238384Sjkim   along with this program; if not, write to the Free Software
18238384Sjkim   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19238384Sjkim   MA 02110-1301, USA.  */
20238384Sjkim
21238384Sjkim#include "ansidecl.h"
22238384Sjkim
23238384Sjkimtypedef enum
24238384Sjkim{
25238384Sjkim  O0,    OT,   O1,   OC,   O2,    X1,    OI,    OB,
26238384Sjkim  OMa,   SI,   I7,   LS,   BR,    BL,    LR,    LJ,
27238384Sjkim  RM,    RQ,   JSR,  JMP,  OBRa,  OBRb,  OBRc,  OBR2,
28238384Sjkim  O1R1,  OMb,  OMc,  SIa,
29238384Sjkim  MULSH, OPSR,
30238384Sjkim  JC,    JU,   JL,   RSI,  DO21,  OB2
31238384Sjkim}
32238384Sjkimmcore_opclass;
33238384Sjkim
34238384Sjkimtypedef struct inst
35238384Sjkim{
36238384Sjkim  const char *   name;
37238384Sjkim  mcore_opclass  opclass;
38238384Sjkim  unsigned char  transfer;
39238384Sjkim  unsigned short inst;
40238384Sjkim}
41238384Sjkimmcore_opcode_info;
42238384Sjkim
43238384Sjkim#ifdef DEFINE_TABLE
44238384Sjkimconst mcore_opcode_info mcore_table[] =
45238384Sjkim{
46238384Sjkim  { "bkpt",	O0,	0,	0x0000 },
47238384Sjkim  { "sync",	O0,	0,	0x0001 },
48238384Sjkim  { "rte",	O0,	1,	0x0002 },
49238384Sjkim  { "rfe",	O0,	1,	0x0002 },
50238384Sjkim  { "rfi",	O0,	1,	0x0003 },
51238384Sjkim  { "stop",	O0,	0,	0x0004 },
52238384Sjkim  { "wait",	O0,	0,	0x0005 },
53238384Sjkim  { "doze",	O0,	0,	0x0006 },
54238384Sjkim  { "idly4",    O0,     0,      0x0007 },
55238384Sjkim  { "trap",	OT,	0,	0x0008 },
56238384Sjkim/* SPACE:                       0x000C - 0x000F */
57238384Sjkim/* SPACE:                       0x0010 - 0x001F */
58238384Sjkim  { "mvc",	O1,	0,	0x0020 },
59238384Sjkim  { "mvcv",	O1,	0,	0x0030 },
60238384Sjkim  { "ldq",	RQ,	0,	0x0040 },
61238384Sjkim  { "stq",	RQ,	0,	0x0050 },
62238384Sjkim  { "ldm",	RM,	0,	0x0060 },
63238384Sjkim  { "stm",	RM,	0,	0x0070 },
64238384Sjkim  { "dect",	O1,	0,	0x0080 },
65238384Sjkim  { "decf",	O1,	0,	0x0090 },
66238384Sjkim  { "inct",	O1,	0,	0x00A0 },
67238384Sjkim  { "incf",	O1,	0,	0x00B0 },
68238384Sjkim  { "jmp",	JMP,	2,	0x00C0 },
69238384Sjkim#define	MCORE_INST_JMP	0x00C0
70238384Sjkim  { "jsr",	JSR,	0,	0x00D0 },
71238384Sjkim#define	MCORE_INST_JSR	0x00E0
72238384Sjkim  { "ff1",	O1,	0,	0x00E0 },
73238384Sjkim  { "brev",	O1,	0,	0x00F0 },
74238384Sjkim  { "xtrb3",	X1,	0,	0x0100 },
75238384Sjkim  { "xtrb2",	X1,	0,	0x0110 },
76238384Sjkim  { "xtrb1",	X1,	0,	0x0120 },
77238384Sjkim  { "xtrb0",	X1,	0,	0x0130 },
78238384Sjkim  { "zextb",	O1,	0,	0x0140 },
79238384Sjkim  { "sextb",	O1,	0,	0x0150 },
80238384Sjkim  { "zexth",	O1,	0,	0x0160 },
81238384Sjkim  { "sexth",	O1,	0,	0x0170 },
82238384Sjkim  { "declt",	O1,	0,	0x0180 },
83238384Sjkim  { "tstnbz",	O1,	0,	0x0190 },
84238384Sjkim  { "decgt",	O1,	0,	0x01A0 },
85238384Sjkim  { "decne",	O1,	0,	0x01B0 },
86238384Sjkim  { "clrt",	O1,	0,	0x01C0 },
87238384Sjkim  { "clrf",	O1,	0,	0x01D0 },
88238384Sjkim  { "abs",	O1,	0,	0x01E0 },
89238384Sjkim  { "not",	O1,	0,	0x01F0 },
90238384Sjkim  { "movt",	O2,	0,	0x0200 },
91238384Sjkim  { "mult",	O2,	0,	0x0300 },
92238384Sjkim  { "loopt",	BL,	0,	0x0400 },
93238384Sjkim  { "subu",	O2,	0,	0x0500 },
94238384Sjkim  { "sub",	O2,	0,	0x0500 }, /* Official alias.  */
95238384Sjkim  { "addc",	O2,	0,	0x0600 },
96238384Sjkim  { "subc",	O2,	0,	0x0700 },
97238384Sjkim/* SPACE: 0x0800-0x08ff for a diadic operation */
98238384Sjkim/* SPACE: 0x0900-0x09ff for a diadic operation */
99238384Sjkim  { "movf",	O2,	0,	0x0A00 },
100238384Sjkim  { "lsr",	O2,	0,	0x0B00 },
101238384Sjkim  { "cmphs",	O2,	0,	0x0C00 },
102238384Sjkim  { "cmplt",	O2,	0,	0x0D00 },
103238384Sjkim  { "tst",	O2,	0,	0x0E00 },
104238384Sjkim  { "cmpne",	O2,	0,	0x0F00 },
105238384Sjkim  { "mfcr",	OC,	0,	0x1000 },
106238384Sjkim  { "psrclr",	OPSR,	0,	0x11F0 },
107238384Sjkim  { "psrset",	OPSR,	0,	0x11F8 },
108238384Sjkim  { "mov",	O2,	0,	0x1200 },
109238384Sjkim  { "bgenr",	O2,	0,	0x1300 },
110238384Sjkim  { "rsub",	O2,	0,	0x1400 },
111238384Sjkim  { "ixw",	O2,	0,	0x1500 },
112238384Sjkim  { "and",	O2,	0,	0x1600 },
113238384Sjkim  { "xor",	O2,	0,	0x1700 },
114238384Sjkim  { "mtcr",	OC,	0,	0x1800 },
115238384Sjkim  { "asr",	O2,	0,	0x1A00 },
116238384Sjkim  { "lsl",	O2,	0,	0x1B00 },
117238384Sjkim  { "addu",	O2,	0,	0x1C00 },
118238384Sjkim  { "add",	O2,	0,	0x1C00 }, /* Official alias.  */
119238384Sjkim  { "ixh",	O2,	0,	0x1D00 },
120238384Sjkim  { "or",	O2,	0,	0x1E00 },
121238384Sjkim  { "andn",	O2,	0,	0x1F00 },
122238384Sjkim  { "addi",	OI,	0,	0x2000 },
123238384Sjkim#define	MCORE_INST_ADDI	0x2000
124238384Sjkim  { "cmplti",	OI,	0,	0x2200 },
125238384Sjkim  { "subi",	OI,	0,	0x2400 },
126238384Sjkim/* SPACE: 0x2600-0x27ff open for a register+immediate  operation */
127238384Sjkim  { "rsubi",	OB,	0,	0x2800 },
128238384Sjkim  { "cmpnei",	OB,	0,	0x2A00 },
129238384Sjkim  { "bmaski",	OMa,	0,	0x2C00 },
130238384Sjkim  { "divu",	O1R1,	0,	0x2C10 },
131238384Sjkim/* SPACE:                       0x2c20 - 0x2c7f */
132238384Sjkim  { "bmaski",	OMb,	0,	0x2C80 },
133238384Sjkim  { "bmaski",	OMc,	0,	0x2D00 },
134238384Sjkim  { "andi",	OB,	0,	0x2E00 },
135238384Sjkim  { "bclri",	OB,	0,	0x3000 },
136238384Sjkim/* SPACE:                       0x3200 - 0x320f */
137238384Sjkim  { "divs",	O1R1,	0,	0x3210 },
138238384Sjkim/* SPACE:                       0x3220 - 0x326f */
139238384Sjkim  { "bgeni",	OBRa,	0,	0x3270 },
140238384Sjkim  { "bgeni",	OBRb,	0,	0x3280 },
141238384Sjkim  { "bgeni",	OBRc,	0,	0x3300 },
142238384Sjkim  { "bseti",	OB,	0,	0x3400 },
143238384Sjkim  { "btsti",	OB,	0,	0x3600 },
144238384Sjkim  { "xsr",	O1,	0,	0x3800 },
145238384Sjkim  { "rotli",	SIa,	0,	0x3800 },
146238384Sjkim  { "asrc",	O1,	0,	0x3A00 },
147238384Sjkim  { "asri",	SIa,	0,	0x3A00 },
148238384Sjkim  { "lslc",	O1,	0,	0x3C00 },
149238384Sjkim  { "lsli",	SIa,	0,	0x3C00 },
150238384Sjkim  { "lsrc",	O1,	0,	0x3E00 },
151238384Sjkim  { "lsri",	SIa,	0,	0x3E00 },
152238384Sjkim/* SPACE:                       0x4000 - 0x5fff */
153238384Sjkim  { "movi",	I7,	0,	0x6000 },
154238384Sjkim#define MCORE_INST_BMASKI_ALT	0x6000
155238384Sjkim#define MCORE_INST_BGENI_ALT	0x6000
156238384Sjkim  { "mulsh",    MULSH,  0,      0x6800 },
157238384Sjkim  { "muls.h",   MULSH,  0,      0x6800 },
158238384Sjkim/* SPACE:                       0x6900 - 0x6FFF */
159238384Sjkim  { "jmpi",	LJ,	1,	0x7000 },
160238384Sjkim  { "jsri",	LJ,	0,	0x7F00 },
161238384Sjkim#define	MCORE_INST_JMPI	0x7000
162238384Sjkim  { "lrw",	LR,	0,	0x7000 },
163238384Sjkim#define	MCORE_INST_JSRI	0x7F00
164238384Sjkim  { "ld",	LS,	0,	0x8000 },
165238384Sjkim  { "ldw",	LS,	0,	0x8000 },
166238384Sjkim  { "ld.w",	LS,	0,	0x8000 },
167238384Sjkim  { "st",	LS,	0,	0x9000 },
168238384Sjkim  { "stw",	LS,	0,	0x9000 },
169238384Sjkim  { "st.w",	LS,	0,	0x9000 },
170238384Sjkim  { "ldb",	LS,	0,	0xA000 },
171238384Sjkim  { "ld.b",	LS,	0,	0xA000 },
172238384Sjkim  { "stb",	LS,	0,	0xB000 },
173238384Sjkim  { "st.b",	LS,	0,	0xB000 },
174238384Sjkim  { "ldh",	LS,	0,	0xC000 },
175246772Sjkim  { "ld.h",	LS,	0,	0xC000 },
176246772Sjkim  { "sth",	LS,	0,	0xD000 },
177238384Sjkim  { "st.h",	LS,	0,	0xD000 },
178238384Sjkim  { "bt",	BR,	0,	0xE000 },
179238384Sjkim  { "bf",	BR,	0,	0xE800 },
180238384Sjkim  { "br",	BR,	1,	0xF000 },
181238384Sjkim#define	MCORE_INST_BR	0xF000
182238384Sjkim  { "bsr",	BR,	0,	0xF800 },
183238384Sjkim#define	MCORE_INST_BSR	0xF800
184238384Sjkim
185238384Sjkim/* The following are relaxable branches */
186238384Sjkim  { "jbt",	JC,	0,	0xE000 },
187238384Sjkim  { "jbf",	JC,	0,	0xE800 },
188238384Sjkim  { "jbr",	JU,	1,	0xF000 },
189238384Sjkim  { "jbsr",	JL,	0,	0xF800 },
190238384Sjkim
191238384Sjkim/* The following are aliases for other instructions */
192238384Sjkim  { "rts",	O0,	2,	0x00CF },  /* jmp r15 */
193238384Sjkim  { "rolc",	DO21,	0,	0x0600 },  /* addc rd,rd */
194238384Sjkim  { "rotlc",	DO21,   0,	0x0600 },  /* addc rd,rd */
195238384Sjkim  { "setc",	O0,	0,	0x0C00 },  /* cmphs r0,r0 */
196238384Sjkim  { "clrc",	O0,	0,	0x0F00 },  /* cmpne r0,r0 */
197238384Sjkim  { "tstle",	O1,	0,	0x2200 },  /* cmplti rd,1 */
198238384Sjkim  { "cmplei",	OB,	0,	0x2200 },  /* cmplei rd,X -> cmplti rd,X+1 */
199238384Sjkim  { "neg",	O1,	0,	0x2800 },  /* rsubi rd,0 */
200238384Sjkim  { "tstne",	O1,	0,	0x2A00 },  /* cmpnei rd,0 */
201238384Sjkim  { "tstlt",	O1,	0,	0x37F0 },  /* btsti rx,31 */
202238384Sjkim  { "mclri",	OB2,	0,	0x3000 },  /* bclri rx,log2(imm) */
203238384Sjkim  { "mgeni",	OBR2,	0,	0x3200 },  /* bgeni rx,log2(imm) */
204238384Sjkim  { "mseti",	OB2,	0,	0x3400 },  /* bseti rx,log2(imm) */
205238384Sjkim  { "mtsti",	OB2,	0,	0x3600 },  /* btsti rx,log2(imm) */
206238384Sjkim  { "rori",	RSI,	0,	0x3800 },
207238384Sjkim  { "rotri",	RSI,    0,	0x3800 },
208238384Sjkim  { "nop",	O0,     0,	0x1200 },  /* mov r0, r0 */
209238384Sjkim};
210238384Sjkim#endif
211238384Sjkim