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