1 1.1 christos /* Opcode table header for Visium. 2 1.1 christos 3 1.8 christos Copyright (C) 2003-2025 Free Software Foundation, Inc. 4 1.1 christos 5 1.1 christos This file is part of GDB, GAS, and GNU binutils. 6 1.1 christos 7 1.1 christos GDB, GAS and the GNU binutils are free software; you can redistribute 8 1.1 christos them and/or modify them under the terms of the GNU General Public 9 1.1 christos License as published by the Free Software Foundation; either version 3, 10 1.1 christos or (at your option) any later version. 11 1.1 christos 12 1.1 christos GDB, GAS, and the GNU binutils are distributed in the hope that they 13 1.1 christos will be useful, but WITHOUT ANY WARRANTY; without even the implied 14 1.1 christos warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 15 1.1 christos the GNU General Public License for more details. 16 1.1 christos 17 1.1 christos You should have received a copy of the GNU General Public License 18 1.1 christos along with this file; see the file COPYING3. If not, write to the Free 19 1.1 christos Software Foundation, 51 Franklin Street - Fifth Floor, Boston, 20 1.1 christos MA 02110-1301, USA. */ 21 1.1 christos 22 1.1 christos enum visium_opcode_arch_val 23 1.1 christos { 24 1.1 christos VISIUM_OPCODE_ARCH_DEF = 0, 25 1.1 christos VISIUM_OPCODE_ARCH_GR5, 26 1.1 christos VISIUM_OPCODE_ARCH_GR6, 27 1.1 christos VISIUM_OPCODE_ARCH_BAD 28 1.1 christos }; 29 1.1 christos 30 1.1 christos /* The highest architecture in the table. */ 31 1.1 christos #define VISIUM_OPCODE_ARCH_MAX (VISIUM_OPCODE_ARCH_BAD - 1) 32 1.1 christos 33 1.1 christos /* Given an enum visium_opcode_arch_val, return the bitmask to use in 34 1.1 christos insn encoding/decoding. */ 35 1.1 christos #define VISIUM_OPCODE_ARCH_MASK(arch) (1 << (arch)) 36 1.1 christos 37 1.1 christos /* Some defines to make life easy. */ 38 1.1 christos #define MASK_DEF VISIUM_OPCODE_ARCH_MASK (VISIUM_OPCODE_ARCH_DEF) 39 1.1 christos #define MASK_GR5 VISIUM_OPCODE_ARCH_MASK (VISIUM_OPCODE_ARCH_GR5) 40 1.1 christos #define MASK_GR6 VISIUM_OPCODE_ARCH_MASK (VISIUM_OPCODE_ARCH_GR6) 41 1.1 christos 42 1.1 christos /* Bit masks of architectures supporting the insn. */ 43 1.1 christos #define def (MASK_DEF | MASK_GR5 | MASK_GR6) 44 1.1 christos #define gr5 (MASK_GR5 | MASK_GR6) 45 1.1 christos #define gr6 (MASK_GR6) 46 1.1 christos 47 1.1 christos /* The condition code field is not used (zero) for most instructions. 48 1.1 christos BRR and BRA make normal use of it. Floating point instructions use 49 1.1 christos it as a sub-opcode. */ 50 1.1 christos #define CC_MASK (0xf << 27) 51 1.1 christos 52 1.1 christos /* It seems a shame not to use these bits in a class 0 instruction, 53 1.1 christos since they could be used to extend the range of the branch. */ 54 1.1 christos #define CLASS0_UNUSED_MASK (0x1f << 16) 55 1.1 christos 56 1.1 christos /* For class 1 instructions the following bit is unused. */ 57 1.1 christos #define CLASS1_UNUSED_MASK (1 << 9) 58 1.1 christos 59 1.1 christos /* For class 1 instructions this field gives the index for a write 60 1.1 christos instruction, the specific operation for an EAM instruction, or 61 1.1 christos the floating point destination register for a floating point 62 1.1 christos instruction. */ 63 1.1 christos #define CLASS1_INDEX_MASK (0x1f << 10) 64 1.1 christos 65 1.1 christos /* For class 3 instructions the following field gives the destination 66 1.1 christos general register. */ 67 1.1 christos #define CLASS3_DEST_MASK (0x1f << 10) 68 1.1 christos 69 1.1 christos /* For class 1 and class 3 instructions the following bit selects an 70 1.1 christos EAM write/read rather than a memory write/read. */ 71 1.1 christos #define EAM_SELECT_MASK (1 << 15) 72 1.1 christos 73 1.1 christos /* Floating point instructions are distinguished from general EAM 74 1.1 christos instructions by the following bit. */ 75 1.1 christos #define FP_SELECT_MASK (1 << 3) 76 1.1 christos 77 1.1 christos /* For both class 1 and class 3 the following fields give, where 78 1.1 christos appropriate the srcA and srcB registers whether floating point 79 1.1 christos or general. */ 80 1.1 christos #define SRCA_MASK (0x1f << 16) 81 1.1 christos #define SRCB_MASK (0x1f << 4) 82 1.1 christos 83 1.1 christos /* The class 3 interrupt bit. It turns a BRA into a SYS1, and an 84 1.1 christos RFLAG into a SYS2. This bit should not be set in the user's 85 1.1 christos class 3 instructions. This bit is also used in class 3 86 1.1 christos to distinguish between floating point and other EAM operations. 87 1.1 christos (see FP_SELECT_MASK). */ 88 1.1 christos #define CLASS3_INT (1 << 3) 89 1.1 christos 90 1.1 christos /* Class 3 shift instructions use this bit to indicate that the 91 1.1 christos srcB field is a 5 bit immediate shift count rather than a 92 1.1 christos register number. */ 93 1.1 christos #define CLASS3_SOURCEB_IMMED (1 << 9) 94 1.1 christos 95 1.1 christos #define BMD 0x02630004 96 1.1 christos #define BMI 0x82230004 97 1.1 christos #define DSI 0x82800004 98 1.1 christos #define ENI 0x02a00004 99 1.1 christos #define RFI 0x82fe01d4 100 1.1 christos 101 1.1 christos struct reg_entry 102 1.1 christos { 103 1.3 christos const char *name; 104 1.1 christos unsigned char code; 105 1.1 christos }; 106 1.1 christos 107 1.3 christos static const struct reg_entry gen_reg_table[] ATTRIBUTE_UNUSED = 108 1.1 christos { 109 1.1 christos {"fp", 0x16}, 110 1.1 christos {"r0", 0x0}, 111 1.1 christos {"r1", 0x1}, 112 1.1 christos {"r10", 0xA}, 113 1.1 christos {"r11", 0xB}, 114 1.1 christos {"r12", 0xC}, 115 1.1 christos {"r13", 0xD}, 116 1.1 christos {"r14", 0xE}, 117 1.1 christos {"r15", 0xF}, 118 1.1 christos {"r16", 0x10}, 119 1.1 christos {"r17", 0x11}, 120 1.1 christos {"r18", 0x12}, 121 1.1 christos {"r19", 0x13}, 122 1.1 christos {"r2", 0x2}, 123 1.1 christos {"r20", 0x14}, 124 1.1 christos {"r21", 0x15}, 125 1.1 christos {"r22", 0x16}, 126 1.1 christos {"r23", 0x17}, 127 1.1 christos {"r24", 0x18}, 128 1.1 christos {"r25", 0x19}, 129 1.1 christos {"r26", 0x1a}, 130 1.1 christos {"r27", 0x1b}, 131 1.1 christos {"r28", 0x1c}, 132 1.1 christos {"r29", 0x1d}, 133 1.1 christos {"r3", 0x3}, 134 1.1 christos {"r30", 0x1e}, 135 1.1 christos {"r31", 0x1f}, 136 1.1 christos {"r4", 0x4}, 137 1.1 christos {"r5", 0x5}, 138 1.1 christos {"r6", 0x6}, 139 1.1 christos {"r7", 0x7}, 140 1.1 christos {"r8", 0x8}, 141 1.1 christos {"r9", 0x9}, 142 1.1 christos {"sp", 0x17}, 143 1.1 christos }; 144 1.1 christos 145 1.3 christos static const struct reg_entry fp_reg_table[] ATTRIBUTE_UNUSED = 146 1.1 christos { 147 1.1 christos {"f0", 0x0}, 148 1.1 christos {"f1", 0x1}, 149 1.1 christos {"f10", 0xa}, 150 1.1 christos {"f11", 0xb}, 151 1.1 christos {"f12", 0xc}, 152 1.1 christos {"f13", 0xd}, 153 1.1 christos {"f14", 0xe}, 154 1.1 christos {"f15", 0xf}, 155 1.1 christos {"f2", 0x2}, 156 1.1 christos {"f3", 0x3}, 157 1.1 christos {"f4", 0x4}, 158 1.1 christos {"f5", 0x5}, 159 1.1 christos {"f6", 0x6}, 160 1.1 christos {"f7", 0x7}, 161 1.1 christos {"f8", 0x8}, 162 1.1 christos {"f9", 0x9}, 163 1.1 christos }; 164 1.1 christos 165 1.1 christos static const struct cc_entry 166 1.1 christos { 167 1.3 christos const char *name; 168 1.1 christos int code; 169 1.3 christos } cc_table [] ATTRIBUTE_UNUSED = 170 1.1 christos { 171 1.1 christos {"cc", 6}, 172 1.1 christos {"cs", 2}, 173 1.1 christos {"eq", 1}, 174 1.1 christos {"fa", 0}, 175 1.1 christos {"ge", 9}, 176 1.1 christos {"gt", 10}, 177 1.1 christos {"hi", 11}, 178 1.1 christos {"le", 12}, 179 1.1 christos {"ls", 13}, 180 1.1 christos {"lt", 14}, 181 1.1 christos {"nc", 8}, 182 1.1 christos {"ne", 5}, 183 1.1 christos {"ns", 4}, 184 1.1 christos {"oc", 7}, 185 1.1 christos {"os", 3}, 186 1.1 christos {"tr", 15}, 187 1.1 christos }; 188 1.1 christos 189 1.1 christos enum addressing_mode 190 1.1 christos { 191 1.1 christos mode_d, /* register := */ 192 1.1 christos mode_a, /* op= register */ 193 1.1 christos mode_da, /* register := register */ 194 1.1 christos mode_ab, /* register * register */ 195 1.1 christos mode_dab, /* register := register * register */ 196 1.1 christos mode_iab, /* 5-bit immediate * register * register */ 197 1.1 christos mode_0ab, /* zero * register * register */ 198 1.1 christos mode_da0, /* register := register * zero */ 199 1.1 christos mode_cad, /* condition * register * register */ 200 1.1 christos mode_das, /* register := register * 5-bit immed/register shift count */ 201 1.1 christos mode_di, /* register := 5-bit immediate */ 202 1.1 christos mode_ir, /* 5-bit immediate * register */ 203 1.1 christos mode_ai, /* register 16-bit unsigned immediate */ 204 1.1 christos mode_i, /* 16-bit unsigned immediate */ 205 1.1 christos mode_bax, /* register * register * 5-bit immediate */ 206 1.1 christos mode_dax, /* register := register * 5-bit immediate */ 207 1.1 christos mode_s, /* special mode */ 208 1.1 christos mode_sr, /* special mode with register */ 209 1.1 christos mode_ci, /* condition * 16-bit signed word displacement */ 210 1.1 christos mode_fdab, /* float := float * float */ 211 1.1 christos mode_ifdab, /* fpinst: 4-bit immediate * float * float * float */ 212 1.1 christos mode_idfab, /* fpuread: 4-bit immediate * register * float * float */ 213 1.1 christos mode_fda, /* float := float */ 214 1.1 christos mode_fdra, /* float := register */ 215 1.1 christos mode_rdfab, /* register := float * float */ 216 1.1 christos mode_rdfa, /* register := float */ 217 1.1 christos mode_rrr, /* 3 register sources and destinations (block move) */ 218 1.1 christos }; 219 1.1 christos 220 1.1 christos #define class0 (0<<25) 221 1.1 christos #define class1 (1<<25) 222 1.1 christos #define class2 (2<<25) 223 1.1 christos #define class3 (3<<25) 224 1.1 christos 225 1.1 christos static const struct opcode_entry 226 1.1 christos { 227 1.3 christos const char *mnem; 228 1.1 christos enum addressing_mode mode; 229 1.1 christos unsigned code; 230 1.1 christos char flags; 231 1.1 christos } 232 1.3 christos opcode_table[] ATTRIBUTE_UNUSED = 233 1.1 christos { 234 1.1 christos { "adc.b", mode_dab, class3|(1<<21)|(1), def }, 235 1.1 christos { "adc.l", mode_dab, class3|(1<<21)|(4), def }, 236 1.1 christos { "adc.w", mode_dab, class3|(1<<21)|(2), def }, 237 1.1 christos { "add.b", mode_dab, class3|(0<<21)|(1), def }, 238 1.1 christos { "add.l", mode_dab, class3|(0<<21)|(4), def }, 239 1.1 christos { "add.w", mode_dab, class3|(0<<21)|(2), def }, 240 1.1 christos { "addi", mode_ai, class2, def }, 241 1.1 christos { "and.b", mode_dab, class3|(10<<21)|(1), def}, 242 1.1 christos { "and.l", mode_dab, class3|(10<<21)|(4), def }, 243 1.1 christos { "and.w", mode_dab, class3|(10<<21)|(2), def }, 244 1.1 christos { "asl.b", mode_das, class3|(7<<21)|(1), def }, 245 1.1 christos { "asl.l", mode_das, class3|(7<<21)|(4), def }, 246 1.1 christos { "asl.w", mode_das, class3|(7<<21)|(2), def }, 247 1.1 christos { "asld", mode_a, class1|(15<<21)|(1<<15)|(11<<10)|(4), def }, 248 1.1 christos { "asr.b", mode_das, class3|(5<<21)|(1), def }, 249 1.1 christos { "asr.l", mode_das, class3|(5<<21)|(4), def }, 250 1.1 christos { "asr.w", mode_das, class3|(5<<21)|(2), def }, 251 1.1 christos { "asrd", mode_a, class1|(15<<21)|(1<<15)|(9<<10)|(4), def }, 252 1.1 christos { "bmd", mode_rrr, class1|(3<<21)|(3<<16)|(4), gr6 }, 253 1.1 christos { "bmi", mode_rrr, class1|(1<<21)|(3<<16)|(4), gr6 }, 254 1.1 christos { "bra", mode_cad, class3|(12<<21)|(4), def }, 255 1.1 christos { "brr", mode_ci, class0, def }, 256 1.1 christos { "cmp.b", mode_0ab, class3|(2<<21)|(1), def }, 257 1.1 christos { "cmp.l", mode_0ab, class3|(2<<21)|(4), def }, 258 1.1 christos { "cmp.w", mode_0ab, class3|(2<<21)|(2), def }, 259 1.1 christos { "cmpc.b", mode_0ab, class3|(3<<21)|(1), def }, 260 1.1 christos { "cmpc.l", mode_0ab, class3|(3<<21)|(4), def }, 261 1.1 christos { "cmpc.w", mode_0ab, class3|(3<<21)|(2), def }, 262 1.1 christos { "divds", mode_a, class1|(15<<21)|(1<<15)|(6<<10)|(4), def }, 263 1.1 christos { "divdu", mode_a, class1|(15<<21)|(1<<15)|(7<<10)|(4), def }, 264 1.1 christos { "divs", mode_a, class1|(15<<21)|(1<<15)|(2<<10)|(4), def }, 265 1.1 christos { "divu", mode_a, class1|(15<<21)|(1<<15)|(3<<10)|(4), def }, 266 1.1 christos { "dsi", mode_s, class1|(4<<21)|(4), def }, 267 1.1 christos { "eamread", mode_di, class3|(15<<21)|(1<<15)|(1<<9)|(4), def }, 268 1.1 christos { "eamwrite", mode_iab, class1|(15<<21)|(1<<15)|(4), def }, 269 1.1 christos { "eni", mode_s, class1|(5<<21)|(4), def }, 270 1.1 christos { "extb.b", mode_da, class3|(14<<21)|(1), def }, 271 1.1 christos { "extb.l", mode_da, class3|(14<<21)|(4), def }, 272 1.1 christos { "extb.w", mode_da, class3|(14<<21)|(2), def }, 273 1.1 christos { "extw.l", mode_da, class3|(4<<21)|(4), def }, 274 1.1 christos { "extw.w", mode_da, class3|(4<<21)|(2), def }, 275 1.1 christos { "fabs", mode_fda, class1|(7<<27)|(15<<21)|(1<<15)|(1<<3)|(4), gr5 }, 276 1.1 christos { "fadd", mode_fdab, class1|(1<<27)|(15<<21)|(1<<15)|(1<<3)|(4), gr5 }, 277 1.1 christos { "fcmp", mode_rdfab,class3|(10<<27)|(15<<21)|(1<<15)|(1<<9)|(1<<3)|(4), gr5 }, 278 1.1 christos { "fcmpe", mode_rdfab,class3|(11<<27)|(15<<21)|(1<<15)|(1<<9)|(1<<3)|(4), gr5 }, 279 1.1 christos { "fdiv", mode_fdab, class1|(4<<27)|(15<<21)|(1<<15)|(1<<3)|(4), gr5 }, 280 1.1 christos { "fload", mode_fdra, class1|(15<<21)|(1<<15)|(1<<3)|(4), gr5 }, 281 1.1 christos { "fmove", mode_fda, class1|(12<<27)|(15<<21)|(1<<15)|(1<<3)|(4), gr5}, 282 1.1 christos { "fmult", mode_fdab, class1|(3<<27)|(15<<21)|(1<<15)|(1<<3)|(4), gr5 }, 283 1.1 christos { "fneg", mode_fda, class1|(6<<27)|(15<<21)|(1<<15)|(1<<3)|(4), gr5 }, 284 1.1 christos { "fpinst", mode_ifdab,class1|(15<<21)|(1<<15)|(1<<3)|(4), gr5 }, 285 1.1 christos { "fpuread", mode_idfab,class3|(15<<21)|(1<<15)|(1<<9)|(1<<3)|(4), gr5 }, 286 1.1 christos { "fsqrt", mode_fda, class1|(5<<27)|(15<<21)|(1<<15)|(1<<3)|(4), gr5 }, 287 1.1 christos { "fstore", mode_rdfa, class3|(15<<21)|(1<<15)|(1<<9)|(1<<3)|(4), gr5 }, 288 1.1 christos { "fsub", mode_fdab, class1|(2<<27)|(15<<21)|(1<<15)|(1<<3)|(4), gr5 }, 289 1.1 christos { "ftoi", mode_fda, class1|(8<<27)|(15<<21)|(1<<15)|(1<<3)|(4), gr5 }, 290 1.1 christos { "itof", mode_fda, class1|(9<<27)|(15<<21)|(1<<15)|(1<<3)|(4), gr5 }, 291 1.1 christos { "lsr.b", mode_das, class3|(6<<21)|(1), def }, 292 1.1 christos { "lsr.l", mode_das, class3|(6<<21)|(4), def }, 293 1.1 christos { "lsr.w", mode_das, class3|(6<<21)|(2), def }, 294 1.1 christos { "lsrd", mode_a, class1|(15<<21)|(1<<15)|(10<<10)|(4), def }, 295 1.1 christos { "move.b", mode_da0, class3|(9<<21)|(1), def }, 296 1.1 christos { "move.l", mode_da0, class3|(9<<21)|(4), def }, 297 1.1 christos { "move.w", mode_da0, class3|(9<<21)|(2), def }, 298 1.1 christos { "movil", mode_ai, class2|(4<<21), def }, 299 1.1 christos { "moviq", mode_ai, class2|(6<<21), def }, 300 1.1 christos { "moviu", mode_ai, class2|(5<<21), def }, 301 1.1 christos { "mults", mode_ab, class1|(15<<21)|(1<<15)|(0<<10)|(4), def }, 302 1.1 christos { "multu", mode_ab, class1|(15<<21)|(1<<15)|(1<<10)|(4), def }, 303 1.1 christos { "nop", mode_s, class0, def }, 304 1.1 christos { "not.b", mode_da, class3|(11<<21)|(1), def }, 305 1.1 christos { "not.l", mode_da, class3|(11<<21)|(4), def }, 306 1.1 christos { "not.w", mode_da, class3|(11<<21)|(2), def }, 307 1.1 christos { "or.b", mode_dab, class3|(9<<21)|(1), def }, 308 1.1 christos { "or.l", mode_dab, class3|(9<<21)|(4), def }, 309 1.1 christos { "or.w", mode_dab, class3|(9<<21)|(2), def }, 310 1.1 christos { "read.b", mode_dax, class3|(15<<21)|(1<<9)|(1), def }, 311 1.1 christos { "read.l", mode_dax, class3|(15<<21)|(1<<9)|(4), def }, 312 1.1 christos { "read.w", mode_dax, class3|(15<<21)|(1<<9)|(2), def }, 313 1.1 christos { "readmda", mode_d, class3|(15<<21)|(1<<15)|(1<<9)|(4), def }, 314 1.1 christos { "readmdb", mode_d, class3|(15<<21)|(1<<15)|(1<<9)|(1<<4)|(4), def }, 315 1.1 christos { "readmdc", mode_d, class3|(15<<21)|(1<<15)|(1<<9)|(2<<4)|(4), def }, 316 1.1 christos { "rfi", mode_s, class1|(7<<21)|(30<<16)|(29<<4)|(4), def }, 317 1.1 christos { "rflag", mode_d, class3|(13<<21)|(4), def }, 318 1.1 christos { "stop", mode_ir, class1|(0<<21)|(4), def }, 319 1.1 christos { "sub.b", mode_dab, class3|(2<<21)|(1), def }, 320 1.1 christos { "sub.l", mode_dab, class3|(2<<21)|(4), def }, 321 1.1 christos { "sub.w", mode_dab, class3|(2<<21)|(2), def }, 322 1.1 christos { "subc.b", mode_dab, class3|(3<<21)|(1), def }, 323 1.1 christos { "subc.l", mode_dab, class3|(3<<21)|(4), def }, 324 1.1 christos { "subc.w", mode_dab, class3|(3<<21)|(2), def }, 325 1.1 christos { "subi", mode_ai, class2|(2<<21), def }, 326 1.1 christos { "trace", mode_ir, class1|(13<<21), def }, 327 1.1 christos { "write.b", mode_bax, class1|(15<<21)|(1), def }, 328 1.1 christos { "write.l", mode_bax, class1|(15<<21)|(4), def }, 329 1.1 christos { "write.w", mode_bax, class1|(15<<21)|(2), def }, 330 1.1 christos { "writemd", mode_ab, class1|(15<<21)|(1<<15)|(4<<10)|(4), def }, 331 1.1 christos { "writemdc", mode_a, class1|(15<<21)|(1<<15)|(5<<10)|(4), def }, 332 1.1 christos { "wrtl", mode_i, class2|(8<<21), gr6 }, 333 1.1 christos { "wrtu", mode_i, class2|(9<<21), gr6 }, 334 1.1 christos { "xor.b", mode_dab, class3|(8<<21)|(1), def }, 335 1.1 christos { "xor.l", mode_dab, class3|(8<<21)|(4), def }, 336 1.1 christos { "xor.w", mode_dab, class3|(8<<21)|(2), def }, 337 1.1 christos }; 338 1.3 christos 339