1 /* Assembler instructions for Motorola's Mcore processor
2    Copyright (C) 1999-2024 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 
23 typedef 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 }
32 mcore_opclass;
33 
34 typedef struct inst
35 {
36   const char *   name;
37   mcore_opclass  opclass;
38   unsigned char  transfer;
39   unsigned short inst;
40 }
41 mcore_opcode_info;
42 
43 #ifdef DEFINE_TABLE
44 const 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