1 /* DO NOT EDIT! -*- buffer-read-only: t -*- vi:set ro: */ 2 /* Instruction opcode table for lm32. 3 4 THIS FILE IS MACHINE GENERATED WITH CGEN. 5 6 Copyright (C) 1996-2024 Free Software Foundation, Inc. 7 8 This file is part of the GNU Binutils and/or GDB, the GNU debugger. 9 10 This file is free software; you can redistribute it and/or modify 11 it under the terms of the GNU General Public License as published by 12 the Free Software Foundation; either version 3, or (at your option) 13 any later version. 14 15 It is distributed in the hope that it will be useful, but WITHOUT 16 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 17 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 18 License for more details. 19 20 You should have received a copy of the GNU General Public License along 21 with this program; if not, write to the Free Software Foundation, Inc., 22 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. 23 24 */ 25 26 #include "sysdep.h" 27 #include "ansidecl.h" 28 #include "bfd.h" 29 #include "symcat.h" 30 #include "lm32-desc.h" 31 #include "lm32-opc.h" 32 #include "libiberty.h" 33 34 /* The hash functions are recorded here to help keep assembler code out of 35 the disassembler and vice versa. */ 36 37 static int asm_hash_insn_p (const CGEN_INSN *); 38 static unsigned int asm_hash_insn (const char *); 39 static int dis_hash_insn_p (const CGEN_INSN *); 40 static unsigned int dis_hash_insn (const char *, CGEN_INSN_INT); 41 42 /* Instruction formats. */ 43 44 #define F(f) & lm32_cgen_ifld_table[LM32_##f] 45 static const CGEN_IFMT ifmt_empty ATTRIBUTE_UNUSED = { 46 0, 0, 0x0, { { 0 } } 47 }; 48 49 static const CGEN_IFMT ifmt_add ATTRIBUTE_UNUSED = { 50 32, 32, 0xfc0007ff, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_R2) }, { F (F_RESV0) }, { 0 } } 51 }; 52 53 static const CGEN_IFMT ifmt_addi ATTRIBUTE_UNUSED = { 54 32, 32, 0xfc000000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_IMM) }, { 0 } } 55 }; 56 57 static const CGEN_IFMT ifmt_andi ATTRIBUTE_UNUSED = { 58 32, 32, 0xfc000000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_UIMM) }, { 0 } } 59 }; 60 61 static const CGEN_IFMT ifmt_andhii ATTRIBUTE_UNUSED = { 62 32, 32, 0xfc000000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_UIMM) }, { 0 } } 63 }; 64 65 static const CGEN_IFMT ifmt_b ATTRIBUTE_UNUSED = { 66 32, 32, 0xfc1fffff, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_R2) }, { F (F_RESV0) }, { 0 } } 67 }; 68 69 static const CGEN_IFMT ifmt_bi ATTRIBUTE_UNUSED = { 70 32, 32, 0xfc000000, { { F (F_OPCODE) }, { F (F_CALL) }, { 0 } } 71 }; 72 73 static const CGEN_IFMT ifmt_be ATTRIBUTE_UNUSED = { 74 32, 32, 0xfc000000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_BRANCH) }, { 0 } } 75 }; 76 77 static const CGEN_IFMT ifmt_ori ATTRIBUTE_UNUSED = { 78 32, 32, 0xfc000000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_UIMM) }, { 0 } } 79 }; 80 81 static const CGEN_IFMT ifmt_rcsr ATTRIBUTE_UNUSED = { 82 32, 32, 0xfc1f07ff, { { F (F_OPCODE) }, { F (F_CSR) }, { F (F_R1) }, { F (F_R2) }, { F (F_RESV0) }, { 0 } } 83 }; 84 85 static const CGEN_IFMT ifmt_sextb ATTRIBUTE_UNUSED = { 86 32, 32, 0xfc1f07ff, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_R2) }, { F (F_RESV0) }, { 0 } } 87 }; 88 89 static const CGEN_IFMT ifmt_user ATTRIBUTE_UNUSED = { 90 32, 32, 0xfc000000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_R2) }, { F (F_USER) }, { 0 } } 91 }; 92 93 static const CGEN_IFMT ifmt_wcsr ATTRIBUTE_UNUSED = { 94 32, 32, 0xfc00ffff, { { F (F_OPCODE) }, { F (F_CSR) }, { F (F_R1) }, { F (F_R2) }, { F (F_RESV0) }, { 0 } } 95 }; 96 97 static const CGEN_IFMT ifmt_break ATTRIBUTE_UNUSED = { 98 32, 32, 0xffffffff, { { F (F_OPCODE) }, { F (F_EXCEPTION) }, { 0 } } 99 }; 100 101 static const CGEN_IFMT ifmt_bret ATTRIBUTE_UNUSED = { 102 32, 32, 0xffffffff, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_R2) }, { F (F_RESV0) }, { 0 } } 103 }; 104 105 static const CGEN_IFMT ifmt_mvi ATTRIBUTE_UNUSED = { 106 32, 32, 0xffe00000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_IMM) }, { 0 } } 107 }; 108 109 static const CGEN_IFMT ifmt_mvui ATTRIBUTE_UNUSED = { 110 32, 32, 0xffe00000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_UIMM) }, { 0 } } 111 }; 112 113 static const CGEN_IFMT ifmt_mvhi ATTRIBUTE_UNUSED = { 114 32, 32, 0xffe00000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_UIMM) }, { 0 } } 115 }; 116 117 static const CGEN_IFMT ifmt_mva ATTRIBUTE_UNUSED = { 118 32, 32, 0xffe00000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_IMM) }, { 0 } } 119 }; 120 121 static const CGEN_IFMT ifmt_nop ATTRIBUTE_UNUSED = { 122 32, 32, 0xffffffff, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_IMM) }, { 0 } } 123 }; 124 125 static const CGEN_IFMT ifmt_lwgotrel ATTRIBUTE_UNUSED = { 126 32, 32, 0xffe00000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_IMM) }, { 0 } } 127 }; 128 129 static const CGEN_IFMT ifmt_orhigotoffi ATTRIBUTE_UNUSED = { 130 32, 32, 0xfc000000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_IMM) }, { 0 } } 131 }; 132 133 static const CGEN_IFMT ifmt_addgotoff ATTRIBUTE_UNUSED = { 134 32, 32, 0xfc000000, { { F (F_OPCODE) }, { F (F_R0) }, { F (F_R1) }, { F (F_IMM) }, { 0 } } 135 }; 136 137 #undef F 138 139 #define A(a) (1 << CGEN_INSN_##a) 140 #define OPERAND(op) LM32_OPERAND_##op 141 #define MNEM CGEN_SYNTAX_MNEMONIC /* syntax value for mnemonic */ 142 #define OP(field) CGEN_SYNTAX_MAKE_FIELD (OPERAND (field)) 143 144 /* The instruction table. */ 145 146 static const CGEN_OPCODE lm32_cgen_insn_opcode_table[MAX_INSNS] = 147 { 148 /* Special null first entry. 149 A `num' value of zero is thus invalid. 150 Also, the special `invalid' insn resides here. */ 151 { { 0, 0, 0, 0 }, {{0}}, 0, {0}}, 152 /* add $r2,$r0,$r1 */ 153 { 154 { 0, 0, 0, 0 }, 155 { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } }, 156 & ifmt_add, { 0xb4000000 } 157 }, 158 /* addi $r1,$r0,$imm */ 159 { 160 { 0, 0, 0, 0 }, 161 { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (IMM), 0 } }, 162 & ifmt_addi, { 0x34000000 } 163 }, 164 /* and $r2,$r0,$r1 */ 165 { 166 { 0, 0, 0, 0 }, 167 { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } }, 168 & ifmt_add, { 0xa0000000 } 169 }, 170 /* andi $r1,$r0,$uimm */ 171 { 172 { 0, 0, 0, 0 }, 173 { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (UIMM), 0 } }, 174 & ifmt_andi, { 0x20000000 } 175 }, 176 /* andhi $r1,$r0,$hi16 */ 177 { 178 { 0, 0, 0, 0 }, 179 { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (HI16), 0 } }, 180 & ifmt_andhii, { 0x60000000 } 181 }, 182 /* b $r0 */ 183 { 184 { 0, 0, 0, 0 }, 185 { { MNEM, ' ', OP (R0), 0 } }, 186 & ifmt_b, { 0xc0000000 } 187 }, 188 /* bi $call */ 189 { 190 { 0, 0, 0, 0 }, 191 { { MNEM, ' ', OP (CALL), 0 } }, 192 & ifmt_bi, { 0xe0000000 } 193 }, 194 /* be $r0,$r1,$branch */ 195 { 196 { 0, 0, 0, 0 }, 197 { { MNEM, ' ', OP (R0), ',', OP (R1), ',', OP (BRANCH), 0 } }, 198 & ifmt_be, { 0x44000000 } 199 }, 200 /* bg $r0,$r1,$branch */ 201 { 202 { 0, 0, 0, 0 }, 203 { { MNEM, ' ', OP (R0), ',', OP (R1), ',', OP (BRANCH), 0 } }, 204 & ifmt_be, { 0x48000000 } 205 }, 206 /* bge $r0,$r1,$branch */ 207 { 208 { 0, 0, 0, 0 }, 209 { { MNEM, ' ', OP (R0), ',', OP (R1), ',', OP (BRANCH), 0 } }, 210 & ifmt_be, { 0x4c000000 } 211 }, 212 /* bgeu $r0,$r1,$branch */ 213 { 214 { 0, 0, 0, 0 }, 215 { { MNEM, ' ', OP (R0), ',', OP (R1), ',', OP (BRANCH), 0 } }, 216 & ifmt_be, { 0x50000000 } 217 }, 218 /* bgu $r0,$r1,$branch */ 219 { 220 { 0, 0, 0, 0 }, 221 { { MNEM, ' ', OP (R0), ',', OP (R1), ',', OP (BRANCH), 0 } }, 222 & ifmt_be, { 0x54000000 } 223 }, 224 /* bne $r0,$r1,$branch */ 225 { 226 { 0, 0, 0, 0 }, 227 { { MNEM, ' ', OP (R0), ',', OP (R1), ',', OP (BRANCH), 0 } }, 228 & ifmt_be, { 0x5c000000 } 229 }, 230 /* call $r0 */ 231 { 232 { 0, 0, 0, 0 }, 233 { { MNEM, ' ', OP (R0), 0 } }, 234 & ifmt_b, { 0xd8000000 } 235 }, 236 /* calli $call */ 237 { 238 { 0, 0, 0, 0 }, 239 { { MNEM, ' ', OP (CALL), 0 } }, 240 & ifmt_bi, { 0xf8000000 } 241 }, 242 /* cmpe $r2,$r0,$r1 */ 243 { 244 { 0, 0, 0, 0 }, 245 { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } }, 246 & ifmt_add, { 0xe4000000 } 247 }, 248 /* cmpei $r1,$r0,$imm */ 249 { 250 { 0, 0, 0, 0 }, 251 { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (IMM), 0 } }, 252 & ifmt_addi, { 0x64000000 } 253 }, 254 /* cmpg $r2,$r0,$r1 */ 255 { 256 { 0, 0, 0, 0 }, 257 { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } }, 258 & ifmt_add, { 0xe8000000 } 259 }, 260 /* cmpgi $r1,$r0,$imm */ 261 { 262 { 0, 0, 0, 0 }, 263 { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (IMM), 0 } }, 264 & ifmt_addi, { 0x68000000 } 265 }, 266 /* cmpge $r2,$r0,$r1 */ 267 { 268 { 0, 0, 0, 0 }, 269 { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } }, 270 & ifmt_add, { 0xec000000 } 271 }, 272 /* cmpgei $r1,$r0,$imm */ 273 { 274 { 0, 0, 0, 0 }, 275 { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (IMM), 0 } }, 276 & ifmt_addi, { 0x6c000000 } 277 }, 278 /* cmpgeu $r2,$r0,$r1 */ 279 { 280 { 0, 0, 0, 0 }, 281 { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } }, 282 & ifmt_add, { 0xf0000000 } 283 }, 284 /* cmpgeui $r1,$r0,$uimm */ 285 { 286 { 0, 0, 0, 0 }, 287 { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (UIMM), 0 } }, 288 & ifmt_andi, { 0x70000000 } 289 }, 290 /* cmpgu $r2,$r0,$r1 */ 291 { 292 { 0, 0, 0, 0 }, 293 { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } }, 294 & ifmt_add, { 0xf4000000 } 295 }, 296 /* cmpgui $r1,$r0,$uimm */ 297 { 298 { 0, 0, 0, 0 }, 299 { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (UIMM), 0 } }, 300 & ifmt_andi, { 0x74000000 } 301 }, 302 /* cmpne $r2,$r0,$r1 */ 303 { 304 { 0, 0, 0, 0 }, 305 { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } }, 306 & ifmt_add, { 0xfc000000 } 307 }, 308 /* cmpnei $r1,$r0,$imm */ 309 { 310 { 0, 0, 0, 0 }, 311 { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (IMM), 0 } }, 312 & ifmt_addi, { 0x7c000000 } 313 }, 314 /* divu $r2,$r0,$r1 */ 315 { 316 { 0, 0, 0, 0 }, 317 { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } }, 318 & ifmt_add, { 0x8c000000 } 319 }, 320 /* lb $r1,($r0+$imm) */ 321 { 322 { 0, 0, 0, 0 }, 323 { { MNEM, ' ', OP (R1), ',', '(', OP (R0), '+', OP (IMM), ')', 0 } }, 324 & ifmt_addi, { 0x10000000 } 325 }, 326 /* lbu $r1,($r0+$imm) */ 327 { 328 { 0, 0, 0, 0 }, 329 { { MNEM, ' ', OP (R1), ',', '(', OP (R0), '+', OP (IMM), ')', 0 } }, 330 & ifmt_addi, { 0x40000000 } 331 }, 332 /* lh $r1,($r0+$imm) */ 333 { 334 { 0, 0, 0, 0 }, 335 { { MNEM, ' ', OP (R1), ',', '(', OP (R0), '+', OP (IMM), ')', 0 } }, 336 & ifmt_addi, { 0x1c000000 } 337 }, 338 /* lhu $r1,($r0+$imm) */ 339 { 340 { 0, 0, 0, 0 }, 341 { { MNEM, ' ', OP (R1), ',', '(', OP (R0), '+', OP (IMM), ')', 0 } }, 342 & ifmt_addi, { 0x2c000000 } 343 }, 344 /* lw $r1,($r0+$imm) */ 345 { 346 { 0, 0, 0, 0 }, 347 { { MNEM, ' ', OP (R1), ',', '(', OP (R0), '+', OP (IMM), ')', 0 } }, 348 & ifmt_addi, { 0x28000000 } 349 }, 350 /* modu $r2,$r0,$r1 */ 351 { 352 { 0, 0, 0, 0 }, 353 { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } }, 354 & ifmt_add, { 0xc4000000 } 355 }, 356 /* mul $r2,$r0,$r1 */ 357 { 358 { 0, 0, 0, 0 }, 359 { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } }, 360 & ifmt_add, { 0x88000000 } 361 }, 362 /* muli $r1,$r0,$imm */ 363 { 364 { 0, 0, 0, 0 }, 365 { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (IMM), 0 } }, 366 & ifmt_addi, { 0x8000000 } 367 }, 368 /* nor $r2,$r0,$r1 */ 369 { 370 { 0, 0, 0, 0 }, 371 { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } }, 372 & ifmt_add, { 0x84000000 } 373 }, 374 /* nori $r1,$r0,$uimm */ 375 { 376 { 0, 0, 0, 0 }, 377 { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (UIMM), 0 } }, 378 & ifmt_andi, { 0x4000000 } 379 }, 380 /* or $r2,$r0,$r1 */ 381 { 382 { 0, 0, 0, 0 }, 383 { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } }, 384 & ifmt_add, { 0xb8000000 } 385 }, 386 /* ori $r1,$r0,$lo16 */ 387 { 388 { 0, 0, 0, 0 }, 389 { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (LO16), 0 } }, 390 & ifmt_ori, { 0x38000000 } 391 }, 392 /* orhi $r1,$r0,$hi16 */ 393 { 394 { 0, 0, 0, 0 }, 395 { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (HI16), 0 } }, 396 & ifmt_andhii, { 0x78000000 } 397 }, 398 /* rcsr $r2,$csr */ 399 { 400 { 0, 0, 0, 0 }, 401 { { MNEM, ' ', OP (R2), ',', OP (CSR), 0 } }, 402 & ifmt_rcsr, { 0x90000000 } 403 }, 404 /* sb ($r0+$imm),$r1 */ 405 { 406 { 0, 0, 0, 0 }, 407 { { MNEM, ' ', '(', OP (R0), '+', OP (IMM), ')', ',', OP (R1), 0 } }, 408 & ifmt_addi, { 0x30000000 } 409 }, 410 /* sextb $r2,$r0 */ 411 { 412 { 0, 0, 0, 0 }, 413 { { MNEM, ' ', OP (R2), ',', OP (R0), 0 } }, 414 & ifmt_sextb, { 0xb0000000 } 415 }, 416 /* sexth $r2,$r0 */ 417 { 418 { 0, 0, 0, 0 }, 419 { { MNEM, ' ', OP (R2), ',', OP (R0), 0 } }, 420 & ifmt_sextb, { 0xdc000000 } 421 }, 422 /* sh ($r0+$imm),$r1 */ 423 { 424 { 0, 0, 0, 0 }, 425 { { MNEM, ' ', '(', OP (R0), '+', OP (IMM), ')', ',', OP (R1), 0 } }, 426 & ifmt_addi, { 0xc000000 } 427 }, 428 /* sl $r2,$r0,$r1 */ 429 { 430 { 0, 0, 0, 0 }, 431 { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } }, 432 & ifmt_add, { 0xbc000000 } 433 }, 434 /* sli $r1,$r0,$imm */ 435 { 436 { 0, 0, 0, 0 }, 437 { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (IMM), 0 } }, 438 & ifmt_addi, { 0x3c000000 } 439 }, 440 /* sr $r2,$r0,$r1 */ 441 { 442 { 0, 0, 0, 0 }, 443 { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } }, 444 & ifmt_add, { 0x94000000 } 445 }, 446 /* sri $r1,$r0,$imm */ 447 { 448 { 0, 0, 0, 0 }, 449 { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (IMM), 0 } }, 450 & ifmt_addi, { 0x14000000 } 451 }, 452 /* sru $r2,$r0,$r1 */ 453 { 454 { 0, 0, 0, 0 }, 455 { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } }, 456 & ifmt_add, { 0x80000000 } 457 }, 458 /* srui $r1,$r0,$imm */ 459 { 460 { 0, 0, 0, 0 }, 461 { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (IMM), 0 } }, 462 & ifmt_addi, { 0x0 } 463 }, 464 /* sub $r2,$r0,$r1 */ 465 { 466 { 0, 0, 0, 0 }, 467 { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } }, 468 & ifmt_add, { 0xc8000000 } 469 }, 470 /* sw ($r0+$imm),$r1 */ 471 { 472 { 0, 0, 0, 0 }, 473 { { MNEM, ' ', '(', OP (R0), '+', OP (IMM), ')', ',', OP (R1), 0 } }, 474 & ifmt_addi, { 0x58000000 } 475 }, 476 /* user $r2,$r0,$r1,$user */ 477 { 478 { 0, 0, 0, 0 }, 479 { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), ',', OP (USER), 0 } }, 480 & ifmt_user, { 0xcc000000 } 481 }, 482 /* wcsr $csr,$r1 */ 483 { 484 { 0, 0, 0, 0 }, 485 { { MNEM, ' ', OP (CSR), ',', OP (R1), 0 } }, 486 & ifmt_wcsr, { 0xd0000000 } 487 }, 488 /* xor $r2,$r0,$r1 */ 489 { 490 { 0, 0, 0, 0 }, 491 { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } }, 492 & ifmt_add, { 0x98000000 } 493 }, 494 /* xori $r1,$r0,$uimm */ 495 { 496 { 0, 0, 0, 0 }, 497 { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (UIMM), 0 } }, 498 & ifmt_andi, { 0x18000000 } 499 }, 500 /* xnor $r2,$r0,$r1 */ 501 { 502 { 0, 0, 0, 0 }, 503 { { MNEM, ' ', OP (R2), ',', OP (R0), ',', OP (R1), 0 } }, 504 & ifmt_add, { 0xa4000000 } 505 }, 506 /* xnori $r1,$r0,$uimm */ 507 { 508 { 0, 0, 0, 0 }, 509 { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (UIMM), 0 } }, 510 & ifmt_andi, { 0x24000000 } 511 }, 512 /* break */ 513 { 514 { 0, 0, 0, 0 }, 515 { { MNEM, 0 } }, 516 & ifmt_break, { 0xac000002 } 517 }, 518 /* scall */ 519 { 520 { 0, 0, 0, 0 }, 521 { { MNEM, 0 } }, 522 & ifmt_break, { 0xac000007 } 523 }, 524 /* bret */ 525 { 526 { 0, 0, 0, 0 }, 527 { { MNEM, 0 } }, 528 & ifmt_bret, { 0xc3e00000 } 529 }, 530 /* eret */ 531 { 532 { 0, 0, 0, 0 }, 533 { { MNEM, 0 } }, 534 & ifmt_bret, { 0xc3c00000 } 535 }, 536 /* ret */ 537 { 538 { 0, 0, 0, 0 }, 539 { { MNEM, 0 } }, 540 & ifmt_bret, { 0xc3a00000 } 541 }, 542 /* mv $r2,$r0 */ 543 { 544 { 0, 0, 0, 0 }, 545 { { MNEM, ' ', OP (R2), ',', OP (R0), 0 } }, 546 & ifmt_sextb, { 0xb8000000 } 547 }, 548 /* mvi $r1,$imm */ 549 { 550 { 0, 0, 0, 0 }, 551 { { MNEM, ' ', OP (R1), ',', OP (IMM), 0 } }, 552 & ifmt_mvi, { 0x34000000 } 553 }, 554 /* mvu $r1,$lo16 */ 555 { 556 { 0, 0, 0, 0 }, 557 { { MNEM, ' ', OP (R1), ',', OP (LO16), 0 } }, 558 & ifmt_mvui, { 0x38000000 } 559 }, 560 /* mvhi $r1,$hi16 */ 561 { 562 { 0, 0, 0, 0 }, 563 { { MNEM, ' ', OP (R1), ',', OP (HI16), 0 } }, 564 & ifmt_mvhi, { 0x78000000 } 565 }, 566 /* mva $r1,$gp16 */ 567 { 568 { 0, 0, 0, 0 }, 569 { { MNEM, ' ', OP (R1), ',', OP (GP16), 0 } }, 570 & ifmt_mva, { 0x37400000 } 571 }, 572 /* not $r2,$r0 */ 573 { 574 { 0, 0, 0, 0 }, 575 { { MNEM, ' ', OP (R2), ',', OP (R0), 0 } }, 576 & ifmt_sextb, { 0xa4000000 } 577 }, 578 /* nop */ 579 { 580 { 0, 0, 0, 0 }, 581 { { MNEM, 0 } }, 582 & ifmt_nop, { 0x34000000 } 583 }, 584 /* lb $r1,$gp16 */ 585 { 586 { 0, 0, 0, 0 }, 587 { { MNEM, ' ', OP (R1), ',', OP (GP16), 0 } }, 588 & ifmt_mva, { 0x13400000 } 589 }, 590 /* lbu $r1,$gp16 */ 591 { 592 { 0, 0, 0, 0 }, 593 { { MNEM, ' ', OP (R1), ',', OP (GP16), 0 } }, 594 & ifmt_mva, { 0x43400000 } 595 }, 596 /* lh $r1,$gp16 */ 597 { 598 { 0, 0, 0, 0 }, 599 { { MNEM, ' ', OP (R1), ',', OP (GP16), 0 } }, 600 & ifmt_mva, { 0x1f400000 } 601 }, 602 /* lhu $r1,$gp16 */ 603 { 604 { 0, 0, 0, 0 }, 605 { { MNEM, ' ', OP (R1), ',', OP (GP16), 0 } }, 606 & ifmt_mva, { 0x2f400000 } 607 }, 608 /* lw $r1,$gp16 */ 609 { 610 { 0, 0, 0, 0 }, 611 { { MNEM, ' ', OP (R1), ',', OP (GP16), 0 } }, 612 & ifmt_mva, { 0x2b400000 } 613 }, 614 /* sb $gp16,$r1 */ 615 { 616 { 0, 0, 0, 0 }, 617 { { MNEM, ' ', OP (GP16), ',', OP (R1), 0 } }, 618 & ifmt_mva, { 0x33400000 } 619 }, 620 /* sh $gp16,$r1 */ 621 { 622 { 0, 0, 0, 0 }, 623 { { MNEM, ' ', OP (GP16), ',', OP (R1), 0 } }, 624 & ifmt_mva, { 0xf400000 } 625 }, 626 /* sw $gp16,$r1 */ 627 { 628 { 0, 0, 0, 0 }, 629 { { MNEM, ' ', OP (GP16), ',', OP (R1), 0 } }, 630 & ifmt_mva, { 0x5b400000 } 631 }, 632 /* lw $r1,(gp+$got16) */ 633 { 634 { 0, 0, 0, 0 }, 635 { { MNEM, ' ', OP (R1), ',', '(', 'g', 'p', '+', OP (GOT16), ')', 0 } }, 636 & ifmt_lwgotrel, { 0x2b400000 } 637 }, 638 /* orhi $r1,$r0,$gotoffhi16 */ 639 { 640 { 0, 0, 0, 0 }, 641 { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (GOTOFFHI16), 0 } }, 642 & ifmt_orhigotoffi, { 0x78000000 } 643 }, 644 /* addi $r1,$r0,$gotofflo16 */ 645 { 646 { 0, 0, 0, 0 }, 647 { { MNEM, ' ', OP (R1), ',', OP (R0), ',', OP (GOTOFFLO16), 0 } }, 648 & ifmt_addgotoff, { 0x34000000 } 649 }, 650 /* sw ($r0+$gotofflo16),$r1 */ 651 { 652 { 0, 0, 0, 0 }, 653 { { MNEM, ' ', '(', OP (R0), '+', OP (GOTOFFLO16), ')', ',', OP (R1), 0 } }, 654 & ifmt_addgotoff, { 0x58000000 } 655 }, 656 /* lw $r1,($r0+$gotofflo16) */ 657 { 658 { 0, 0, 0, 0 }, 659 { { MNEM, ' ', OP (R1), ',', '(', OP (R0), '+', OP (GOTOFFLO16), ')', 0 } }, 660 & ifmt_addgotoff, { 0x28000000 } 661 }, 662 /* sh ($r0+$gotofflo16),$r1 */ 663 { 664 { 0, 0, 0, 0 }, 665 { { MNEM, ' ', '(', OP (R0), '+', OP (GOTOFFLO16), ')', ',', OP (R1), 0 } }, 666 & ifmt_addgotoff, { 0xc000000 } 667 }, 668 /* lh $r1,($r0+$gotofflo16) */ 669 { 670 { 0, 0, 0, 0 }, 671 { { MNEM, ' ', OP (R1), ',', '(', OP (R0), '+', OP (GOTOFFLO16), ')', 0 } }, 672 & ifmt_addgotoff, { 0x1c000000 } 673 }, 674 /* lhu $r1,($r0+$gotofflo16) */ 675 { 676 { 0, 0, 0, 0 }, 677 { { MNEM, ' ', OP (R1), ',', '(', OP (R0), '+', OP (GOTOFFLO16), ')', 0 } }, 678 & ifmt_addgotoff, { 0x2c000000 } 679 }, 680 /* sb ($r0+$gotofflo16),$r1 */ 681 { 682 { 0, 0, 0, 0 }, 683 { { MNEM, ' ', '(', OP (R0), '+', OP (GOTOFFLO16), ')', ',', OP (R1), 0 } }, 684 & ifmt_addgotoff, { 0x30000000 } 685 }, 686 /* lb $r1,($r0+$gotofflo16) */ 687 { 688 { 0, 0, 0, 0 }, 689 { { MNEM, ' ', OP (R1), ',', '(', OP (R0), '+', OP (GOTOFFLO16), ')', 0 } }, 690 & ifmt_addgotoff, { 0x10000000 } 691 }, 692 /* lbu $r1,($r0+$gotofflo16) */ 693 { 694 { 0, 0, 0, 0 }, 695 { { MNEM, ' ', OP (R1), ',', '(', OP (R0), '+', OP (GOTOFFLO16), ')', 0 } }, 696 & ifmt_addgotoff, { 0x40000000 } 697 }, 698 }; 699 700 #undef A 701 #undef OPERAND 702 #undef MNEM 703 #undef OP 704 705 /* Formats for ALIAS macro-insns. */ 706 707 #define F(f) & lm32_cgen_ifld_table[LM32_##f] 708 #undef F 709 710 /* Each non-simple macro entry points to an array of expansion possibilities. */ 711 712 #define A(a) (1 << CGEN_INSN_##a) 713 #define OPERAND(op) LM32_OPERAND_##op 714 #define MNEM CGEN_SYNTAX_MNEMONIC /* syntax value for mnemonic */ 715 #define OP(field) CGEN_SYNTAX_MAKE_FIELD (OPERAND (field)) 716 717 /* The macro instruction table. */ 718 719 static const CGEN_IBASE lm32_cgen_macro_insn_table[] = 720 { 721 }; 722 723 /* The macro instruction opcode table. */ 724 725 static const CGEN_OPCODE lm32_cgen_macro_insn_opcode_table[] = 726 { 727 }; 728 729 #undef A 730 #undef OPERAND 731 #undef MNEM 732 #undef OP 733 734 #ifndef CGEN_ASM_HASH_P 735 #define CGEN_ASM_HASH_P(insn) 1 736 #endif 737 738 #ifndef CGEN_DIS_HASH_P 739 #define CGEN_DIS_HASH_P(insn) 1 740 #endif 741 742 /* Return non-zero if INSN is to be added to the hash table. 743 Targets are free to override CGEN_{ASM,DIS}_HASH_P in the .opc file. */ 744 745 static int 746 asm_hash_insn_p (const CGEN_INSN *insn ATTRIBUTE_UNUSED) 747 { 748 return CGEN_ASM_HASH_P (insn); 749 } 750 751 static int 752 dis_hash_insn_p (const CGEN_INSN *insn) 753 { 754 /* If building the hash table and the NO-DIS attribute is present, 755 ignore. */ 756 if (CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_NO_DIS)) 757 return 0; 758 return CGEN_DIS_HASH_P (insn); 759 } 760 761 #ifndef CGEN_ASM_HASH 762 #define CGEN_ASM_HASH_SIZE 127 763 #ifdef CGEN_MNEMONIC_OPERANDS 764 #define CGEN_ASM_HASH(mnem) (*(unsigned char *) (mnem) % CGEN_ASM_HASH_SIZE) 765 #else 766 #define CGEN_ASM_HASH(mnem) (*(unsigned char *) (mnem) % CGEN_ASM_HASH_SIZE) /*FIXME*/ 767 #endif 768 #endif 769 770 /* It doesn't make much sense to provide a default here, 771 but while this is under development we do. 772 BUFFER is a pointer to the bytes of the insn, target order. 773 VALUE is the first base_insn_bitsize bits as an int in host order. */ 774 775 #ifndef CGEN_DIS_HASH 776 #define CGEN_DIS_HASH_SIZE 256 777 #define CGEN_DIS_HASH(buf, value) (*(unsigned char *) (buf)) 778 #endif 779 780 /* The result is the hash value of the insn. 781 Targets are free to override CGEN_{ASM,DIS}_HASH in the .opc file. */ 782 783 static unsigned int 784 asm_hash_insn (const char *mnem) 785 { 786 return CGEN_ASM_HASH (mnem); 787 } 788 789 /* BUF is a pointer to the bytes of the insn, target order. 790 VALUE is the first base_insn_bitsize bits as an int in host order. */ 791 792 static unsigned int 793 dis_hash_insn (const char *buf ATTRIBUTE_UNUSED, 794 CGEN_INSN_INT value ATTRIBUTE_UNUSED) 795 { 796 return CGEN_DIS_HASH (buf, value); 797 } 798 799 /* Set the recorded length of the insn in the CGEN_FIELDS struct. */ 800 801 static void 802 set_fields_bitsize (CGEN_FIELDS *fields, int size) 803 { 804 CGEN_FIELDS_BITSIZE (fields) = size; 805 } 806 807 /* Function to call before using the operand instance table. 808 This plugs the opcode entries and macro instructions into the cpu table. */ 809 810 void 811 lm32_cgen_init_opcode_table (CGEN_CPU_DESC cd) 812 { 813 int i; 814 int num_macros = (sizeof (lm32_cgen_macro_insn_table) / 815 sizeof (lm32_cgen_macro_insn_table[0])); 816 const CGEN_IBASE *ib = & lm32_cgen_macro_insn_table[0]; 817 const CGEN_OPCODE *oc = & lm32_cgen_macro_insn_opcode_table[0]; 818 CGEN_INSN *insns = xmalloc (num_macros * sizeof (CGEN_INSN)); 819 820 /* This test has been added to avoid a warning generated 821 if memset is called with a third argument of value zero. */ 822 if (num_macros >= 1) 823 memset (insns, 0, num_macros * sizeof (CGEN_INSN)); 824 for (i = 0; i < num_macros; ++i) 825 { 826 insns[i].base = &ib[i]; 827 insns[i].opcode = &oc[i]; 828 lm32_cgen_build_insn_regex (& insns[i]); 829 } 830 cd->macro_insn_table.init_entries = insns; 831 cd->macro_insn_table.entry_size = sizeof (CGEN_IBASE); 832 cd->macro_insn_table.num_init_entries = num_macros; 833 834 oc = & lm32_cgen_insn_opcode_table[0]; 835 insns = (CGEN_INSN *) cd->insn_table.init_entries; 836 for (i = 0; i < MAX_INSNS; ++i) 837 { 838 insns[i].opcode = &oc[i]; 839 lm32_cgen_build_insn_regex (& insns[i]); 840 } 841 842 cd->sizeof_fields = sizeof (CGEN_FIELDS); 843 cd->set_fields_bitsize = set_fields_bitsize; 844 845 cd->asm_hash_p = asm_hash_insn_p; 846 cd->asm_hash = asm_hash_insn; 847 cd->asm_hash_size = CGEN_ASM_HASH_SIZE; 848 849 cd->dis_hash_p = dis_hash_insn_p; 850 cd->dis_hash = dis_hash_insn; 851 cd->dis_hash_size = CGEN_DIS_HASH_SIZE; 852 } 853