1a1ba9ba4Schristos /* Assembler instructions for Motorola's Mcore processor
2*184b2d41Schristos    Copyright (C) 1999-2020 Free Software Foundation, Inc.
3a1ba9ba4Schristos 
4a1ba9ba4Schristos    This file is part of the GNU opcodes library.
5a1ba9ba4Schristos 
6a1ba9ba4Schristos    This library is free software; you can redistribute it and/or modify
7a1ba9ba4Schristos    it under the terms of the GNU General Public License as published by
8a1ba9ba4Schristos    the Free Software Foundation; either version 3, or (at your option)
9a1ba9ba4Schristos    any later version.
10a1ba9ba4Schristos 
11a1ba9ba4Schristos    It is distributed in the hope that it will be useful, but WITHOUT
12a1ba9ba4Schristos    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13a1ba9ba4Schristos    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
14a1ba9ba4Schristos    License for more details.
15a1ba9ba4Schristos 
16a1ba9ba4Schristos    You should have received a copy of the GNU General Public License
17a1ba9ba4Schristos    along with this program; if not, write to the Free Software
18a1ba9ba4Schristos    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19a1ba9ba4Schristos    MA 02110-1301, USA.  */
20a1ba9ba4Schristos 
21a1ba9ba4Schristos #include "ansidecl.h"
22a1ba9ba4Schristos 
23a1ba9ba4Schristos typedef enum
24a1ba9ba4Schristos {
25a1ba9ba4Schristos   O0,    OT,   O1,   OC,   O2,    X1,    OI,    OB,
26a1ba9ba4Schristos   OMa,   SI,   I7,   LS,   BR,    BL,    LR,    LJ,
27a1ba9ba4Schristos   RM,    RQ,   JSR,  JMP,  OBRa,  OBRb,  OBRc,  OBR2,
28a1ba9ba4Schristos   O1R1,  OMb,  OMc,  SIa,
29a1ba9ba4Schristos   MULSH, OPSR,
30a1ba9ba4Schristos   JC,    JU,   JL,   RSI,  DO21,  OB2
31a1ba9ba4Schristos }
32a1ba9ba4Schristos mcore_opclass;
33a1ba9ba4Schristos 
34a1ba9ba4Schristos typedef struct inst
35a1ba9ba4Schristos {
36b2396a7bSchristos   const char *   name;
37a1ba9ba4Schristos   mcore_opclass  opclass;
38a1ba9ba4Schristos   unsigned char  transfer;
39a1ba9ba4Schristos   unsigned short inst;
40a1ba9ba4Schristos }
41a1ba9ba4Schristos mcore_opcode_info;
42a1ba9ba4Schristos 
43a1ba9ba4Schristos #ifdef DEFINE_TABLE
44a1ba9ba4Schristos const mcore_opcode_info mcore_table[] =
45a1ba9ba4Schristos {
46a1ba9ba4Schristos   { "bkpt",	O0,	0,	0x0000 },
47a1ba9ba4Schristos   { "sync",	O0,	0,	0x0001 },
48a1ba9ba4Schristos   { "rte",	O0,	1,	0x0002 },
49a1ba9ba4Schristos   { "rfe",	O0,	1,	0x0002 },
50a1ba9ba4Schristos   { "rfi",	O0,	1,	0x0003 },
51a1ba9ba4Schristos   { "stop",	O0,	0,	0x0004 },
52a1ba9ba4Schristos   { "wait",	O0,	0,	0x0005 },
53a1ba9ba4Schristos   { "doze",	O0,	0,	0x0006 },
54a1ba9ba4Schristos   { "idly4",    O0,     0,      0x0007 },
55a1ba9ba4Schristos   { "trap",	OT,	0,	0x0008 },
56a1ba9ba4Schristos /* SPACE:                       0x000C - 0x000F */
57a1ba9ba4Schristos /* SPACE:                       0x0010 - 0x001F */
58a1ba9ba4Schristos   { "mvc",	O1,	0,	0x0020 },
59a1ba9ba4Schristos   { "mvcv",	O1,	0,	0x0030 },
60a1ba9ba4Schristos   { "ldq",	RQ,	0,	0x0040 },
61a1ba9ba4Schristos   { "stq",	RQ,	0,	0x0050 },
62a1ba9ba4Schristos   { "ldm",	RM,	0,	0x0060 },
63a1ba9ba4Schristos   { "stm",	RM,	0,	0x0070 },
64a1ba9ba4Schristos   { "dect",	O1,	0,	0x0080 },
65a1ba9ba4Schristos   { "decf",	O1,	0,	0x0090 },
66a1ba9ba4Schristos   { "inct",	O1,	0,	0x00A0 },
67a1ba9ba4Schristos   { "incf",	O1,	0,	0x00B0 },
68a1ba9ba4Schristos   { "jmp",	JMP,	2,	0x00C0 },
69a1ba9ba4Schristos #define	MCORE_INST_JMP	0x00C0
70a1ba9ba4Schristos   { "jsr",	JSR,	0,	0x00D0 },
71a1ba9ba4Schristos #define	MCORE_INST_JSR	0x00E0
72a1ba9ba4Schristos   { "ff1",	O1,	0,	0x00E0 },
73a1ba9ba4Schristos   { "brev",	O1,	0,	0x00F0 },
74a1ba9ba4Schristos   { "xtrb3",	X1,	0,	0x0100 },
75a1ba9ba4Schristos   { "xtrb2",	X1,	0,	0x0110 },
76a1ba9ba4Schristos   { "xtrb1",	X1,	0,	0x0120 },
77a1ba9ba4Schristos   { "xtrb0",	X1,	0,	0x0130 },
78a1ba9ba4Schristos   { "zextb",	O1,	0,	0x0140 },
79a1ba9ba4Schristos   { "sextb",	O1,	0,	0x0150 },
80a1ba9ba4Schristos   { "zexth",	O1,	0,	0x0160 },
81a1ba9ba4Schristos   { "sexth",	O1,	0,	0x0170 },
82a1ba9ba4Schristos   { "declt",	O1,	0,	0x0180 },
83a1ba9ba4Schristos   { "tstnbz",	O1,	0,	0x0190 },
84a1ba9ba4Schristos   { "decgt",	O1,	0,	0x01A0 },
85a1ba9ba4Schristos   { "decne",	O1,	0,	0x01B0 },
86a1ba9ba4Schristos   { "clrt",	O1,	0,	0x01C0 },
87a1ba9ba4Schristos   { "clrf",	O1,	0,	0x01D0 },
88a1ba9ba4Schristos   { "abs",	O1,	0,	0x01E0 },
89a1ba9ba4Schristos   { "not",	O1,	0,	0x01F0 },
90a1ba9ba4Schristos   { "movt",	O2,	0,	0x0200 },
91a1ba9ba4Schristos   { "mult",	O2,	0,	0x0300 },
92a1ba9ba4Schristos   { "loopt",	BL,	0,	0x0400 },
93a1ba9ba4Schristos   { "subu",	O2,	0,	0x0500 },
94a1ba9ba4Schristos   { "sub",	O2,	0,	0x0500 }, /* Official alias.  */
95a1ba9ba4Schristos   { "addc",	O2,	0,	0x0600 },
96a1ba9ba4Schristos   { "subc",	O2,	0,	0x0700 },
97a1ba9ba4Schristos /* SPACE: 0x0800-0x08ff for a diadic operation */
98a1ba9ba4Schristos /* SPACE: 0x0900-0x09ff for a diadic operation */
99a1ba9ba4Schristos   { "movf",	O2,	0,	0x0A00 },
100a1ba9ba4Schristos   { "lsr",	O2,	0,	0x0B00 },
101a1ba9ba4Schristos   { "cmphs",	O2,	0,	0x0C00 },
102a1ba9ba4Schristos   { "cmplt",	O2,	0,	0x0D00 },
103a1ba9ba4Schristos   { "tst",	O2,	0,	0x0E00 },
104a1ba9ba4Schristos   { "cmpne",	O2,	0,	0x0F00 },
105a1ba9ba4Schristos   { "mfcr",	OC,	0,	0x1000 },
106a1ba9ba4Schristos   { "psrclr",	OPSR,	0,	0x11F0 },
107a1ba9ba4Schristos   { "psrset",	OPSR,	0,	0x11F8 },
108a1ba9ba4Schristos   { "mov",	O2,	0,	0x1200 },
109a1ba9ba4Schristos   { "bgenr",	O2,	0,	0x1300 },
110a1ba9ba4Schristos   { "rsub",	O2,	0,	0x1400 },
111a1ba9ba4Schristos   { "ixw",	O2,	0,	0x1500 },
112a1ba9ba4Schristos   { "and",	O2,	0,	0x1600 },
113a1ba9ba4Schristos   { "xor",	O2,	0,	0x1700 },
114a1ba9ba4Schristos   { "mtcr",	OC,	0,	0x1800 },
115a1ba9ba4Schristos   { "asr",	O2,	0,	0x1A00 },
116a1ba9ba4Schristos   { "lsl",	O2,	0,	0x1B00 },
117a1ba9ba4Schristos   { "addu",	O2,	0,	0x1C00 },
118a1ba9ba4Schristos   { "add",	O2,	0,	0x1C00 }, /* Official alias.  */
119a1ba9ba4Schristos   { "ixh",	O2,	0,	0x1D00 },
120a1ba9ba4Schristos   { "or",	O2,	0,	0x1E00 },
121a1ba9ba4Schristos   { "andn",	O2,	0,	0x1F00 },
122a1ba9ba4Schristos   { "addi",	OI,	0,	0x2000 },
123a1ba9ba4Schristos #define	MCORE_INST_ADDI	0x2000
124a1ba9ba4Schristos   { "cmplti",	OI,	0,	0x2200 },
125a1ba9ba4Schristos   { "subi",	OI,	0,	0x2400 },
126a1ba9ba4Schristos /* SPACE: 0x2600-0x27ff open for a register+immediate  operation */
127a1ba9ba4Schristos   { "rsubi",	OB,	0,	0x2800 },
128a1ba9ba4Schristos   { "cmpnei",	OB,	0,	0x2A00 },
129a1ba9ba4Schristos   { "bmaski",	OMa,	0,	0x2C00 },
130a1ba9ba4Schristos   { "divu",	O1R1,	0,	0x2C10 },
131a1ba9ba4Schristos /* SPACE:                       0x2c20 - 0x2c7f */
132a1ba9ba4Schristos   { "bmaski",	OMb,	0,	0x2C80 },
133a1ba9ba4Schristos   { "bmaski",	OMc,	0,	0x2D00 },
134a1ba9ba4Schristos   { "andi",	OB,	0,	0x2E00 },
135a1ba9ba4Schristos   { "bclri",	OB,	0,	0x3000 },
136a1ba9ba4Schristos /* SPACE:                       0x3200 - 0x320f */
137a1ba9ba4Schristos   { "divs",	O1R1,	0,	0x3210 },
138a1ba9ba4Schristos /* SPACE:                       0x3220 - 0x326f */
139a1ba9ba4Schristos   { "bgeni",	OBRa,	0,	0x3270 },
140a1ba9ba4Schristos   { "bgeni",	OBRb,	0,	0x3280 },
141a1ba9ba4Schristos   { "bgeni",	OBRc,	0,	0x3300 },
142a1ba9ba4Schristos   { "bseti",	OB,	0,	0x3400 },
143a1ba9ba4Schristos   { "btsti",	OB,	0,	0x3600 },
144a1ba9ba4Schristos   { "xsr",	O1,	0,	0x3800 },
145a1ba9ba4Schristos   { "rotli",	SIa,	0,	0x3800 },
146a1ba9ba4Schristos   { "asrc",	O1,	0,	0x3A00 },
147a1ba9ba4Schristos   { "asri",	SIa,	0,	0x3A00 },
148a1ba9ba4Schristos   { "lslc",	O1,	0,	0x3C00 },
149a1ba9ba4Schristos   { "lsli",	SIa,	0,	0x3C00 },
150a1ba9ba4Schristos   { "lsrc",	O1,	0,	0x3E00 },
151a1ba9ba4Schristos   { "lsri",	SIa,	0,	0x3E00 },
152a1ba9ba4Schristos /* SPACE:                       0x4000 - 0x5fff */
153a1ba9ba4Schristos   { "movi",	I7,	0,	0x6000 },
154a1ba9ba4Schristos #define MCORE_INST_BMASKI_ALT	0x6000
155a1ba9ba4Schristos #define MCORE_INST_BGENI_ALT	0x6000
156a1ba9ba4Schristos   { "mulsh",    MULSH,  0,      0x6800 },
157a1ba9ba4Schristos   { "muls.h",   MULSH,  0,      0x6800 },
158a1ba9ba4Schristos /* SPACE:                       0x6900 - 0x6FFF */
159a1ba9ba4Schristos   { "jmpi",	LJ,	1,	0x7000 },
160a1ba9ba4Schristos   { "jsri",	LJ,	0,	0x7F00 },
161a1ba9ba4Schristos #define	MCORE_INST_JMPI	0x7000
162a1ba9ba4Schristos   { "lrw",	LR,	0,	0x7000 },
163a1ba9ba4Schristos #define	MCORE_INST_JSRI	0x7F00
164a1ba9ba4Schristos   { "ld",	LS,	0,	0x8000 },
165a1ba9ba4Schristos   { "ldw",	LS,	0,	0x8000 },
166a1ba9ba4Schristos   { "ld.w",	LS,	0,	0x8000 },
167a1ba9ba4Schristos   { "st",	LS,	0,	0x9000 },
168a1ba9ba4Schristos   { "stw",	LS,	0,	0x9000 },
169a1ba9ba4Schristos   { "st.w",	LS,	0,	0x9000 },
170a1ba9ba4Schristos   { "ldb",	LS,	0,	0xA000 },
171a1ba9ba4Schristos   { "ld.b",	LS,	0,	0xA000 },
172a1ba9ba4Schristos   { "stb",	LS,	0,	0xB000 },
173a1ba9ba4Schristos   { "st.b",	LS,	0,	0xB000 },
174a1ba9ba4Schristos   { "ldh",	LS,	0,	0xC000 },
175a1ba9ba4Schristos   { "ld.h",	LS,	0,	0xC000 },
176a1ba9ba4Schristos   { "sth",	LS,	0,	0xD000 },
177a1ba9ba4Schristos   { "st.h",	LS,	0,	0xD000 },
178a1ba9ba4Schristos   { "bt",	BR,	0,	0xE000 },
179a1ba9ba4Schristos   { "bf",	BR,	0,	0xE800 },
180a1ba9ba4Schristos   { "br",	BR,	1,	0xF000 },
181a1ba9ba4Schristos #define	MCORE_INST_BR	0xF000
182a1ba9ba4Schristos   { "bsr",	BR,	0,	0xF800 },
183a1ba9ba4Schristos #define	MCORE_INST_BSR	0xF800
184a1ba9ba4Schristos 
185a1ba9ba4Schristos /* The following are relaxable branches */
186a1ba9ba4Schristos   { "jbt",	JC,	0,	0xE000 },
187a1ba9ba4Schristos   { "jbf",	JC,	0,	0xE800 },
188a1ba9ba4Schristos   { "jbr",	JU,	1,	0xF000 },
189a1ba9ba4Schristos   { "jbsr",	JL,	0,	0xF800 },
190a1ba9ba4Schristos 
191a1ba9ba4Schristos /* The following are aliases for other instructions */
192a1ba9ba4Schristos   { "rts",	O0,	2,	0x00CF },  /* jmp r15 */
193a1ba9ba4Schristos   { "rolc",	DO21,	0,	0x0600 },  /* addc rd,rd */
194a1ba9ba4Schristos   { "rotlc",	DO21,   0,	0x0600 },  /* addc rd,rd */
195a1ba9ba4Schristos   { "setc",	O0,	0,	0x0C00 },  /* cmphs r0,r0 */
196a1ba9ba4Schristos   { "clrc",	O0,	0,	0x0F00 },  /* cmpne r0,r0 */
197a1ba9ba4Schristos   { "tstle",	O1,	0,	0x2200 },  /* cmplti rd,1 */
198a1ba9ba4Schristos   { "cmplei",	OB,	0,	0x2200 },  /* cmplei rd,X -> cmplti rd,X+1 */
199a1ba9ba4Schristos   { "neg",	O1,	0,	0x2800 },  /* rsubi rd,0 */
200a1ba9ba4Schristos   { "tstne",	O1,	0,	0x2A00 },  /* cmpnei rd,0 */
201a1ba9ba4Schristos   { "tstlt",	O1,	0,	0x37F0 },  /* btsti rx,31 */
202a1ba9ba4Schristos   { "mclri",	OB2,	0,	0x3000 },  /* bclri rx,log2(imm) */
203a1ba9ba4Schristos   { "mgeni",	OBR2,	0,	0x3200 },  /* bgeni rx,log2(imm) */
204a1ba9ba4Schristos   { "mseti",	OB2,	0,	0x3400 },  /* bseti rx,log2(imm) */
205a1ba9ba4Schristos   { "mtsti",	OB2,	0,	0x3600 },  /* btsti rx,log2(imm) */
206a1ba9ba4Schristos   { "rori",	RSI,	0,	0x3800 },
207a1ba9ba4Schristos   { "rotri",	RSI,    0,	0x3800 },
208a1ba9ba4Schristos   { "nop",	O0,     0,	0x1200 },  /* mov r0, r0 */
209a1ba9ba4Schristos };
210a1ba9ba4Schristos #endif
211