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