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