1 /* Disassembler code for CRIS. 2 Copyright 2000, 2001, 2002, 2004, 2005, 2006 Free Software Foundation, Inc. 3 Contributed by Axis Communications AB, Lund, Sweden. 4 Written by Hans-Peter Nilsson. 5 6 This file is part of the GNU binutils and GDB, the GNU debugger. 7 8 This program is free software; you can redistribute it and/or modify it 9 under the terms of the GNU General Public License as published by the 10 Free Software Foundation; either version 2, or (at your option) any later 11 version. 12 13 This program is distributed in the hope that it will be useful, but WITHOUT 14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 16 more details. 17 18 You should have received a copy of the GNU General Public License 19 along with this program; if not, see <http://www.gnu.org/licenses/>. */ 20 21 #include "qemu/osdep.h" 22 #include "qemu-common.h" 23 #include "disas/dis-asm.h" 24 #include "target/cris/opcode-cris.h" 25 26 #define CONST_STRNEQ(STR1,STR2) (strncmp ((STR1), (STR2), sizeof (STR2) - 1) == 0) 27 28 /* cris-opc.c -- Table of opcodes for the CRIS processor. 29 Copyright 2000, 2001, 2004 Free Software Foundation, Inc. 30 Contributed by Axis Communications AB, Lund, Sweden. 31 Originally written for GAS 1.38.1 by Mikael Asker. 32 Reorganized by Hans-Peter Nilsson. 33 34 This file is part of GAS, GDB and the GNU binutils. 35 36 GAS, GDB, and GNU binutils is free software; you can redistribute it 37 and/or modify it under the terms of the GNU General Public License as 38 published by the Free Software Foundation; either version 2, or (at your 39 option) any later version. 40 41 GAS, GDB, and GNU binutils are distributed in the hope that they will be 42 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of 43 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 44 GNU General Public License for more details. 45 46 You should have received a copy of the GNU General Public License 47 along with this program; if not, see <http://www.gnu.org/licenses/>. */ 48 49 #ifndef NULL 50 #define NULL (0) 51 #endif 52 53 /* This table isn't used for CRISv32 and the size of immediate operands. */ 54 const struct cris_spec_reg 55 cris_spec_regs[] = 56 { 57 {"bz", 0, 1, cris_ver_v32p, NULL}, 58 {"p0", 0, 1, 0, NULL}, 59 {"vr", 1, 1, 0, NULL}, 60 {"p1", 1, 1, 0, NULL}, 61 {"pid", 2, 1, cris_ver_v32p, NULL}, 62 {"p2", 2, 1, cris_ver_v32p, NULL}, 63 {"p2", 2, 1, cris_ver_warning, NULL}, 64 {"srs", 3, 1, cris_ver_v32p, NULL}, 65 {"p3", 3, 1, cris_ver_v32p, NULL}, 66 {"p3", 3, 1, cris_ver_warning, NULL}, 67 {"wz", 4, 2, cris_ver_v32p, NULL}, 68 {"p4", 4, 2, 0, NULL}, 69 {"ccr", 5, 2, cris_ver_v0_10, NULL}, 70 {"exs", 5, 4, cris_ver_v32p, NULL}, 71 {"p5", 5, 2, cris_ver_v0_10, NULL}, 72 {"p5", 5, 4, cris_ver_v32p, NULL}, 73 {"dcr0",6, 2, cris_ver_v0_3, NULL}, 74 {"eda", 6, 4, cris_ver_v32p, NULL}, 75 {"p6", 6, 2, cris_ver_v0_3, NULL}, 76 {"p6", 6, 4, cris_ver_v32p, NULL}, 77 {"dcr1/mof", 7, 4, cris_ver_v10p, 78 "Register `dcr1/mof' with ambiguous size specified. Guessing 4 bytes"}, 79 {"dcr1/mof", 7, 2, cris_ver_v0_3, 80 "Register `dcr1/mof' with ambiguous size specified. Guessing 2 bytes"}, 81 {"mof", 7, 4, cris_ver_v10p, NULL}, 82 {"dcr1",7, 2, cris_ver_v0_3, NULL}, 83 {"p7", 7, 4, cris_ver_v10p, NULL}, 84 {"p7", 7, 2, cris_ver_v0_3, NULL}, 85 {"dz", 8, 4, cris_ver_v32p, NULL}, 86 {"p8", 8, 4, 0, NULL}, 87 {"ibr", 9, 4, cris_ver_v0_10, NULL}, 88 {"ebp", 9, 4, cris_ver_v32p, NULL}, 89 {"p9", 9, 4, 0, NULL}, 90 {"irp", 10, 4, cris_ver_v0_10, NULL}, 91 {"erp", 10, 4, cris_ver_v32p, NULL}, 92 {"p10", 10, 4, 0, NULL}, 93 {"srp", 11, 4, 0, NULL}, 94 {"p11", 11, 4, 0, NULL}, 95 /* For disassembly use only. Accept at assembly with a warning. */ 96 {"bar/dtp0", 12, 4, cris_ver_warning, 97 "Ambiguous register `bar/dtp0' specified"}, 98 {"nrp", 12, 4, cris_ver_v32p, NULL}, 99 {"bar", 12, 4, cris_ver_v8_10, NULL}, 100 {"dtp0",12, 4, cris_ver_v0_3, NULL}, 101 {"p12", 12, 4, 0, NULL}, 102 /* For disassembly use only. Accept at assembly with a warning. */ 103 {"dccr/dtp1",13, 4, cris_ver_warning, 104 "Ambiguous register `dccr/dtp1' specified"}, 105 {"ccs", 13, 4, cris_ver_v32p, NULL}, 106 {"dccr",13, 4, cris_ver_v8_10, NULL}, 107 {"dtp1",13, 4, cris_ver_v0_3, NULL}, 108 {"p13", 13, 4, 0, NULL}, 109 {"brp", 14, 4, cris_ver_v3_10, NULL}, 110 {"usp", 14, 4, cris_ver_v32p, NULL}, 111 {"p14", 14, 4, cris_ver_v3p, NULL}, 112 {"usp", 15, 4, cris_ver_v10, NULL}, 113 {"spc", 15, 4, cris_ver_v32p, NULL}, 114 {"p15", 15, 4, cris_ver_v10p, NULL}, 115 {NULL, 0, 0, cris_ver_version_all, NULL} 116 }; 117 118 /* Add version specifiers to this table when necessary. 119 The (now) regular coding of register names suggests a simpler 120 implementation. */ 121 const struct cris_support_reg cris_support_regs[] = 122 { 123 {"s0", 0}, 124 {"s1", 1}, 125 {"s2", 2}, 126 {"s3", 3}, 127 {"s4", 4}, 128 {"s5", 5}, 129 {"s6", 6}, 130 {"s7", 7}, 131 {"s8", 8}, 132 {"s9", 9}, 133 {"s10", 10}, 134 {"s11", 11}, 135 {"s12", 12}, 136 {"s13", 13}, 137 {"s14", 14}, 138 {"s15", 15}, 139 {NULL, 0} 140 }; 141 142 /* All CRIS opcodes are 16 bits. 143 144 - The match component is a mask saying which bits must match a 145 particular opcode in order for an instruction to be an instance 146 of that opcode. 147 148 - The args component is a string containing characters symbolically 149 matching the operands of an instruction. Used for both assembly 150 and disassembly. 151 152 Operand-matching characters: 153 [ ] , space 154 Verbatim. 155 A The string "ACR" (case-insensitive). 156 B Not really an operand. It causes a "BDAP -size,SP" prefix to be 157 output for the PUSH alias-instructions and recognizes a push- 158 prefix at disassembly. This letter isn't recognized for v32. 159 Must be followed by a R or P letter. 160 ! Non-match pattern, will not match if there's a prefix insn. 161 b Non-matching operand, used for branches with 16-bit 162 displacement. Only recognized by the disassembler. 163 c 5-bit unsigned immediate in bits <4:0>. 164 C 4-bit unsigned immediate in bits <3:0>. 165 d At assembly, optionally (as in put other cases before this one) 166 ".d" or ".D" at the start of the operands, followed by one space 167 character. At disassembly, nothing. 168 D General register in bits <15:12> and <3:0>. 169 f List of flags in bits <15:12> and <3:0>. 170 i 6-bit signed immediate in bits <5:0>. 171 I 6-bit unsigned immediate in bits <5:0>. 172 M Size modifier (B, W or D) for CLEAR instructions. 173 m Size modifier (B, W or D) in bits <5:4> 174 N A 32-bit dword, like in the difference between s and y. 175 This has no effect on bits in the opcode. Can also be expressed 176 as "[pc+]" in input. 177 n As N, but PC-relative (to the start of the instruction). 178 o [-128..127] word offset in bits <7:1> and <0>. Used by 8-bit 179 branch instructions. 180 O [-128..127] offset in bits <7:0>. Also matches a comma and a 181 general register after the expression, in bits <15:12>. Used 182 only for the BDAP prefix insn (in v32 the ADDOQ insn; same opcode). 183 P Special register in bits <15:12>. 184 p Indicates that the insn is a prefix insn. Must be first 185 character. 186 Q As O, but don't relax; force an 8-bit offset. 187 R General register in bits <15:12>. 188 r General register in bits <3:0>. 189 S Source operand in bit <10> and a prefix; a 3-operand prefix 190 without side-effect. 191 s Source operand in bits <10> and <3:0>, optionally with a 192 side-effect prefix, except [pc] (the name, not R15 as in ACR) 193 isn't allowed for v32 and higher. 194 T Support register in bits <15:12>. 195 u 4-bit (PC-relative) unsigned immediate word offset in bits <3:0>. 196 U Relaxes to either u or n, instruction is assumed LAPCQ or LAPC. 197 Not recognized at disassembly. 198 x Register-dot-modifier, for example "r5.w" in bits <15:12> and <5:4>. 199 y Like 's' but do not allow an integer at assembly. 200 Y The difference s-y; only an integer is allowed. 201 z Size modifier (B or W) in bit <4>. */ 202 203 204 /* Please note the order of the opcodes in this table is significant. 205 The assembler requires that all instances of the same mnemonic must 206 be consecutive. If they aren't, the assembler might not recognize 207 them, or may indicate an internal error. 208 209 The disassembler should not normally care about the order of the 210 opcodes, but will prefer an earlier alternative if the "match-score" 211 (see cris-dis.c) is computed as equal. 212 213 It should not be significant for proper execution that this table is 214 in alphabetical order, but please follow that convention for an easy 215 overview. */ 216 217 const struct cris_opcode 218 cris_opcodes[] = 219 { 220 {"abs", 0x06B0, 0x0940, "r,R", 0, SIZE_NONE, 0, 221 cris_abs_op}, 222 223 {"add", 0x0600, 0x09c0, "m r,R", 0, SIZE_NONE, 0, 224 cris_reg_mode_add_sub_cmp_and_or_move_op}, 225 226 {"add", 0x0A00, 0x01c0, "m s,R", 0, SIZE_FIELD, 0, 227 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 228 229 {"add", 0x0A00, 0x01c0, "m S,D", 0, SIZE_NONE, 230 cris_ver_v0_10, 231 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 232 233 {"add", 0x0a00, 0x05c0, "m S,R,r", 0, SIZE_NONE, 234 cris_ver_v0_10, 235 cris_three_operand_add_sub_cmp_and_or_op}, 236 237 {"add", 0x0A00, 0x01c0, "m s,R", 0, SIZE_FIELD, 238 cris_ver_v32p, 239 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 240 241 {"addc", 0x0570, 0x0A80, "r,R", 0, SIZE_FIX_32, 242 cris_ver_v32p, 243 cris_not_implemented_op}, 244 245 {"addc", 0x09A0, 0x0250, "s,R", 0, SIZE_FIX_32, 246 cris_ver_v32p, 247 cris_not_implemented_op}, 248 249 {"addi", 0x0540, 0x0A80, "x,r,A", 0, SIZE_NONE, 250 cris_ver_v32p, 251 cris_addi_op}, 252 253 {"addi", 0x0500, 0x0Ac0, "x,r", 0, SIZE_NONE, 0, 254 cris_addi_op}, 255 256 /* This collates after "addo", but we want to disassemble as "addoq", 257 not "addo". */ 258 {"addoq", 0x0100, 0x0E00, "Q,A", 0, SIZE_NONE, 259 cris_ver_v32p, 260 cris_not_implemented_op}, 261 262 {"addo", 0x0940, 0x0280, "m s,R,A", 0, SIZE_FIELD_SIGNED, 263 cris_ver_v32p, 264 cris_not_implemented_op}, 265 266 /* This must be located after the insn above, lest we misinterpret 267 "addo.b -1,r0,acr" as "addo .b-1,r0,acr". FIXME: Sounds like a 268 parser bug. */ 269 {"addo", 0x0100, 0x0E00, "O,A", 0, SIZE_NONE, 270 cris_ver_v32p, 271 cris_not_implemented_op}, 272 273 {"addq", 0x0200, 0x0Dc0, "I,R", 0, SIZE_NONE, 0, 274 cris_quick_mode_add_sub_op}, 275 276 {"adds", 0x0420, 0x0Bc0, "z r,R", 0, SIZE_NONE, 0, 277 cris_reg_mode_add_sub_cmp_and_or_move_op}, 278 279 /* FIXME: SIZE_FIELD_SIGNED and all necessary changes. */ 280 {"adds", 0x0820, 0x03c0, "z s,R", 0, SIZE_FIELD, 0, 281 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 282 283 {"adds", 0x0820, 0x03c0, "z S,D", 0, SIZE_NONE, 284 cris_ver_v0_10, 285 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 286 287 {"adds", 0x0820, 0x07c0, "z S,R,r", 0, SIZE_NONE, 288 cris_ver_v0_10, 289 cris_three_operand_add_sub_cmp_and_or_op}, 290 291 {"addu", 0x0400, 0x0be0, "z r,R", 0, SIZE_NONE, 0, 292 cris_reg_mode_add_sub_cmp_and_or_move_op}, 293 294 /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */ 295 {"addu", 0x0800, 0x03e0, "z s,R", 0, SIZE_FIELD, 0, 296 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 297 298 {"addu", 0x0800, 0x03e0, "z S,D", 0, SIZE_NONE, 299 cris_ver_v0_10, 300 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 301 302 {"addu", 0x0800, 0x07e0, "z S,R,r", 0, SIZE_NONE, 303 cris_ver_v0_10, 304 cris_three_operand_add_sub_cmp_and_or_op}, 305 306 {"and", 0x0700, 0x08C0, "m r,R", 0, SIZE_NONE, 0, 307 cris_reg_mode_add_sub_cmp_and_or_move_op}, 308 309 {"and", 0x0B00, 0x00C0, "m s,R", 0, SIZE_FIELD, 0, 310 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 311 312 {"and", 0x0B00, 0x00C0, "m S,D", 0, SIZE_NONE, 313 cris_ver_v0_10, 314 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 315 316 {"and", 0x0B00, 0x04C0, "m S,R,r", 0, SIZE_NONE, 317 cris_ver_v0_10, 318 cris_three_operand_add_sub_cmp_and_or_op}, 319 320 {"andq", 0x0300, 0x0CC0, "i,R", 0, SIZE_NONE, 0, 321 cris_quick_mode_and_cmp_move_or_op}, 322 323 {"asr", 0x0780, 0x0840, "m r,R", 0, SIZE_NONE, 0, 324 cris_asr_op}, 325 326 {"asrq", 0x03a0, 0x0c40, "c,R", 0, SIZE_NONE, 0, 327 cris_asrq_op}, 328 329 {"ax", 0x15B0, 0xEA4F, "", 0, SIZE_NONE, 0, 330 cris_ax_ei_setf_op}, 331 332 /* FIXME: Should use branch #defines. */ 333 {"b", 0x0dff, 0x0200, "b", 1, SIZE_NONE, 0, 334 cris_sixteen_bit_offset_branch_op}, 335 336 {"ba", 337 BA_QUICK_OPCODE, 338 0x0F00+(0xF-CC_A)*0x1000, "o", 1, SIZE_NONE, 0, 339 cris_eight_bit_offset_branch_op}, 340 341 /* Needs to come after the usual "ba o", which might be relaxed to 342 this one. */ 343 {"ba", BA_DWORD_OPCODE, 344 0xffff & (~BA_DWORD_OPCODE), "n", 0, SIZE_FIX_32, 345 cris_ver_v32p, 346 cris_none_reg_mode_jump_op}, 347 348 {"bas", 0x0EBF, 0x0140, "n,P", 0, SIZE_FIX_32, 349 cris_ver_v32p, 350 cris_none_reg_mode_jump_op}, 351 352 {"basc", 0x0EFF, 0x0100, "n,P", 0, SIZE_FIX_32, 353 cris_ver_v32p, 354 cris_none_reg_mode_jump_op}, 355 356 {"bcc", 357 BRANCH_QUICK_OPCODE+CC_CC*0x1000, 358 0x0f00+(0xF-CC_CC)*0x1000, "o", 1, SIZE_NONE, 0, 359 cris_eight_bit_offset_branch_op}, 360 361 {"bcs", 362 BRANCH_QUICK_OPCODE+CC_CS*0x1000, 363 0x0f00+(0xF-CC_CS)*0x1000, "o", 1, SIZE_NONE, 0, 364 cris_eight_bit_offset_branch_op}, 365 366 {"bdap", 367 BDAP_INDIR_OPCODE, BDAP_INDIR_Z_BITS, "pm s,R", 0, SIZE_FIELD_SIGNED, 368 cris_ver_v0_10, 369 cris_bdap_prefix}, 370 371 {"bdap", 372 BDAP_QUICK_OPCODE, BDAP_QUICK_Z_BITS, "pO", 0, SIZE_NONE, 373 cris_ver_v0_10, 374 cris_quick_mode_bdap_prefix}, 375 376 {"beq", 377 BRANCH_QUICK_OPCODE+CC_EQ*0x1000, 378 0x0f00+(0xF-CC_EQ)*0x1000, "o", 1, SIZE_NONE, 0, 379 cris_eight_bit_offset_branch_op}, 380 381 /* This is deliberately put before "bext" to trump it, even though not 382 in alphabetical order, since we don't do excluding version checks 383 for v0..v10. */ 384 {"bwf", 385 BRANCH_QUICK_OPCODE+CC_EXT*0x1000, 386 0x0f00+(0xF-CC_EXT)*0x1000, "o", 1, SIZE_NONE, 387 cris_ver_v10, 388 cris_eight_bit_offset_branch_op}, 389 390 {"bext", 391 BRANCH_QUICK_OPCODE+CC_EXT*0x1000, 392 0x0f00+(0xF-CC_EXT)*0x1000, "o", 1, SIZE_NONE, 393 cris_ver_v0_3, 394 cris_eight_bit_offset_branch_op}, 395 396 {"bge", 397 BRANCH_QUICK_OPCODE+CC_GE*0x1000, 398 0x0f00+(0xF-CC_GE)*0x1000, "o", 1, SIZE_NONE, 0, 399 cris_eight_bit_offset_branch_op}, 400 401 {"bgt", 402 BRANCH_QUICK_OPCODE+CC_GT*0x1000, 403 0x0f00+(0xF-CC_GT)*0x1000, "o", 1, SIZE_NONE, 0, 404 cris_eight_bit_offset_branch_op}, 405 406 {"bhi", 407 BRANCH_QUICK_OPCODE+CC_HI*0x1000, 408 0x0f00+(0xF-CC_HI)*0x1000, "o", 1, SIZE_NONE, 0, 409 cris_eight_bit_offset_branch_op}, 410 411 {"bhs", 412 BRANCH_QUICK_OPCODE+CC_HS*0x1000, 413 0x0f00+(0xF-CC_HS)*0x1000, "o", 1, SIZE_NONE, 0, 414 cris_eight_bit_offset_branch_op}, 415 416 {"biap", BIAP_OPCODE, BIAP_Z_BITS, "pm r,R", 0, SIZE_NONE, 417 cris_ver_v0_10, 418 cris_biap_prefix}, 419 420 {"ble", 421 BRANCH_QUICK_OPCODE+CC_LE*0x1000, 422 0x0f00+(0xF-CC_LE)*0x1000, "o", 1, SIZE_NONE, 0, 423 cris_eight_bit_offset_branch_op}, 424 425 {"blo", 426 BRANCH_QUICK_OPCODE+CC_LO*0x1000, 427 0x0f00+(0xF-CC_LO)*0x1000, "o", 1, SIZE_NONE, 0, 428 cris_eight_bit_offset_branch_op}, 429 430 {"bls", 431 BRANCH_QUICK_OPCODE+CC_LS*0x1000, 432 0x0f00+(0xF-CC_LS)*0x1000, "o", 1, SIZE_NONE, 0, 433 cris_eight_bit_offset_branch_op}, 434 435 {"blt", 436 BRANCH_QUICK_OPCODE+CC_LT*0x1000, 437 0x0f00+(0xF-CC_LT)*0x1000, "o", 1, SIZE_NONE, 0, 438 cris_eight_bit_offset_branch_op}, 439 440 {"bmi", 441 BRANCH_QUICK_OPCODE+CC_MI*0x1000, 442 0x0f00+(0xF-CC_MI)*0x1000, "o", 1, SIZE_NONE, 0, 443 cris_eight_bit_offset_branch_op}, 444 445 {"bmod", 0x0ab0, 0x0140, "s,R", 0, SIZE_FIX_32, 446 cris_ver_sim_v0_10, 447 cris_not_implemented_op}, 448 449 {"bmod", 0x0ab0, 0x0140, "S,D", 0, SIZE_NONE, 450 cris_ver_sim_v0_10, 451 cris_not_implemented_op}, 452 453 {"bmod", 0x0ab0, 0x0540, "S,R,r", 0, SIZE_NONE, 454 cris_ver_sim_v0_10, 455 cris_not_implemented_op}, 456 457 {"bne", 458 BRANCH_QUICK_OPCODE+CC_NE*0x1000, 459 0x0f00+(0xF-CC_NE)*0x1000, "o", 1, SIZE_NONE, 0, 460 cris_eight_bit_offset_branch_op}, 461 462 {"bound", 0x05c0, 0x0A00, "m r,R", 0, SIZE_NONE, 0, 463 cris_two_operand_bound_op}, 464 /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */ 465 {"bound", 0x09c0, 0x0200, "m s,R", 0, SIZE_FIELD, 466 cris_ver_v0_10, 467 cris_two_operand_bound_op}, 468 /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */ 469 {"bound", 0x0dcf, 0x0200, "m Y,R", 0, SIZE_FIELD, 0, 470 cris_two_operand_bound_op}, 471 {"bound", 0x09c0, 0x0200, "m S,D", 0, SIZE_NONE, 472 cris_ver_v0_10, 473 cris_two_operand_bound_op}, 474 {"bound", 0x09c0, 0x0600, "m S,R,r", 0, SIZE_NONE, 475 cris_ver_v0_10, 476 cris_three_operand_bound_op}, 477 478 {"bpl", 479 BRANCH_QUICK_OPCODE+CC_PL*0x1000, 480 0x0f00+(0xF-CC_PL)*0x1000, "o", 1, SIZE_NONE, 0, 481 cris_eight_bit_offset_branch_op}, 482 483 {"break", 0xe930, 0x16c0, "C", 0, SIZE_NONE, 484 cris_ver_v3p, 485 cris_break_op}, 486 487 {"bsb", 488 BRANCH_QUICK_OPCODE+CC_EXT*0x1000, 489 0x0f00+(0xF-CC_EXT)*0x1000, "o", 1, SIZE_NONE, 490 cris_ver_v32p, 491 cris_eight_bit_offset_branch_op}, 492 493 {"bsr", 0xBEBF, 0x4140, "n", 0, SIZE_FIX_32, 494 cris_ver_v32p, 495 cris_none_reg_mode_jump_op}, 496 497 {"bsrc", 0xBEFF, 0x4100, "n", 0, SIZE_FIX_32, 498 cris_ver_v32p, 499 cris_none_reg_mode_jump_op}, 500 501 {"bstore", 0x0af0, 0x0100, "s,R", 0, SIZE_FIX_32, 502 cris_ver_warning, 503 cris_not_implemented_op}, 504 505 {"bstore", 0x0af0, 0x0100, "S,D", 0, SIZE_NONE, 506 cris_ver_warning, 507 cris_not_implemented_op}, 508 509 {"bstore", 0x0af0, 0x0500, "S,R,r", 0, SIZE_NONE, 510 cris_ver_warning, 511 cris_not_implemented_op}, 512 513 {"btst", 0x04F0, 0x0B00, "r,R", 0, SIZE_NONE, 0, 514 cris_btst_nop_op}, 515 {"btstq", 0x0380, 0x0C60, "c,R", 0, SIZE_NONE, 0, 516 cris_btst_nop_op}, 517 518 {"bvc", 519 BRANCH_QUICK_OPCODE+CC_VC*0x1000, 520 0x0f00+(0xF-CC_VC)*0x1000, "o", 1, SIZE_NONE, 0, 521 cris_eight_bit_offset_branch_op}, 522 523 {"bvs", 524 BRANCH_QUICK_OPCODE+CC_VS*0x1000, 525 0x0f00+(0xF-CC_VS)*0x1000, "o", 1, SIZE_NONE, 0, 526 cris_eight_bit_offset_branch_op}, 527 528 {"clear", 0x0670, 0x3980, "M r", 0, SIZE_NONE, 0, 529 cris_reg_mode_clear_op}, 530 531 {"clear", 0x0A70, 0x3180, "M y", 0, SIZE_NONE, 0, 532 cris_none_reg_mode_clear_test_op}, 533 534 {"clear", 0x0A70, 0x3180, "M S", 0, SIZE_NONE, 535 cris_ver_v0_10, 536 cris_none_reg_mode_clear_test_op}, 537 538 {"clearf", 0x05F0, 0x0A00, "f", 0, SIZE_NONE, 0, 539 cris_clearf_di_op}, 540 541 {"cmp", 0x06C0, 0x0900, "m r,R", 0, SIZE_NONE, 0, 542 cris_reg_mode_add_sub_cmp_and_or_move_op}, 543 544 {"cmp", 0x0Ac0, 0x0100, "m s,R", 0, SIZE_FIELD, 0, 545 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 546 547 {"cmp", 0x0Ac0, 0x0100, "m S,D", 0, SIZE_NONE, 548 cris_ver_v0_10, 549 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 550 551 {"cmpq", 0x02C0, 0x0D00, "i,R", 0, SIZE_NONE, 0, 552 cris_quick_mode_and_cmp_move_or_op}, 553 554 /* FIXME: SIZE_FIELD_SIGNED and all necessary changes. */ 555 {"cmps", 0x08e0, 0x0300, "z s,R", 0, SIZE_FIELD, 0, 556 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 557 558 {"cmps", 0x08e0, 0x0300, "z S,D", 0, SIZE_NONE, 559 cris_ver_v0_10, 560 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 561 562 /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */ 563 {"cmpu", 0x08c0, 0x0320, "z s,R" , 0, SIZE_FIELD, 0, 564 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 565 566 {"cmpu", 0x08c0, 0x0320, "z S,D", 0, SIZE_NONE, 567 cris_ver_v0_10, 568 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 569 570 {"di", 0x25F0, 0xDA0F, "", 0, SIZE_NONE, 0, 571 cris_clearf_di_op}, 572 573 {"dip", DIP_OPCODE, DIP_Z_BITS, "ps", 0, SIZE_FIX_32, 574 cris_ver_v0_10, 575 cris_dip_prefix}, 576 577 {"div", 0x0980, 0x0640, "m R,r", 0, SIZE_FIELD, 0, 578 cris_not_implemented_op}, 579 580 {"dstep", 0x06f0, 0x0900, "r,R", 0, SIZE_NONE, 0, 581 cris_dstep_logshift_mstep_neg_not_op}, 582 583 {"ei", 0x25B0, 0xDA4F, "", 0, SIZE_NONE, 0, 584 cris_ax_ei_setf_op}, 585 586 {"fidxd", 0x0ab0, 0xf540, "[r]", 0, SIZE_NONE, 587 cris_ver_v32p, 588 cris_not_implemented_op}, 589 590 {"fidxi", 0x0d30, 0xF2C0, "[r]", 0, SIZE_NONE, 591 cris_ver_v32p, 592 cris_not_implemented_op}, 593 594 {"ftagd", 0x1AB0, 0xE540, "[r]", 0, SIZE_NONE, 595 cris_ver_v32p, 596 cris_not_implemented_op}, 597 598 {"ftagi", 0x1D30, 0xE2C0, "[r]", 0, SIZE_NONE, 599 cris_ver_v32p, 600 cris_not_implemented_op}, 601 602 {"halt", 0xF930, 0x06CF, "", 0, SIZE_NONE, 603 cris_ver_v32p, 604 cris_not_implemented_op}, 605 606 {"jas", 0x09B0, 0x0640, "r,P", 0, SIZE_NONE, 607 cris_ver_v32p, 608 cris_reg_mode_jump_op}, 609 610 {"jas", 0x0DBF, 0x0240, "N,P", 0, SIZE_FIX_32, 611 cris_ver_v32p, 612 cris_reg_mode_jump_op}, 613 614 {"jasc", 0x0B30, 0x04C0, "r,P", 0, SIZE_NONE, 615 cris_ver_v32p, 616 cris_reg_mode_jump_op}, 617 618 {"jasc", 0x0F3F, 0x00C0, "N,P", 0, SIZE_FIX_32, 619 cris_ver_v32p, 620 cris_reg_mode_jump_op}, 621 622 {"jbrc", 0x69b0, 0x9640, "r", 0, SIZE_NONE, 623 cris_ver_v8_10, 624 cris_reg_mode_jump_op}, 625 626 {"jbrc", 0x6930, 0x92c0, "s", 0, SIZE_FIX_32, 627 cris_ver_v8_10, 628 cris_none_reg_mode_jump_op}, 629 630 {"jbrc", 0x6930, 0x92c0, "S", 0, SIZE_NONE, 631 cris_ver_v8_10, 632 cris_none_reg_mode_jump_op}, 633 634 {"jir", 0xA9b0, 0x5640, "r", 0, SIZE_NONE, 635 cris_ver_v8_10, 636 cris_reg_mode_jump_op}, 637 638 {"jir", 0xA930, 0x52c0, "s", 0, SIZE_FIX_32, 639 cris_ver_v8_10, 640 cris_none_reg_mode_jump_op}, 641 642 {"jir", 0xA930, 0x52c0, "S", 0, SIZE_NONE, 643 cris_ver_v8_10, 644 cris_none_reg_mode_jump_op}, 645 646 {"jirc", 0x29b0, 0xd640, "r", 0, SIZE_NONE, 647 cris_ver_v8_10, 648 cris_reg_mode_jump_op}, 649 650 {"jirc", 0x2930, 0xd2c0, "s", 0, SIZE_FIX_32, 651 cris_ver_v8_10, 652 cris_none_reg_mode_jump_op}, 653 654 {"jirc", 0x2930, 0xd2c0, "S", 0, SIZE_NONE, 655 cris_ver_v8_10, 656 cris_none_reg_mode_jump_op}, 657 658 {"jsr", 0xB9b0, 0x4640, "r", 0, SIZE_NONE, 0, 659 cris_reg_mode_jump_op}, 660 661 {"jsr", 0xB930, 0x42c0, "s", 0, SIZE_FIX_32, 662 cris_ver_v0_10, 663 cris_none_reg_mode_jump_op}, 664 665 {"jsr", 0xBDBF, 0x4240, "N", 0, SIZE_FIX_32, 666 cris_ver_v32p, 667 cris_none_reg_mode_jump_op}, 668 669 {"jsr", 0xB930, 0x42c0, "S", 0, SIZE_NONE, 670 cris_ver_v0_10, 671 cris_none_reg_mode_jump_op}, 672 673 {"jsrc", 0x39b0, 0xc640, "r", 0, SIZE_NONE, 674 cris_ver_v8_10, 675 cris_reg_mode_jump_op}, 676 677 {"jsrc", 0x3930, 0xc2c0, "s", 0, SIZE_FIX_32, 678 cris_ver_v8_10, 679 cris_none_reg_mode_jump_op}, 680 681 {"jsrc", 0x3930, 0xc2c0, "S", 0, SIZE_NONE, 682 cris_ver_v8_10, 683 cris_none_reg_mode_jump_op}, 684 685 {"jsrc", 0xBB30, 0x44C0, "r", 0, SIZE_NONE, 686 cris_ver_v32p, 687 cris_reg_mode_jump_op}, 688 689 {"jsrc", 0xBF3F, 0x40C0, "N", 0, SIZE_FIX_32, 690 cris_ver_v32p, 691 cris_reg_mode_jump_op}, 692 693 {"jump", 0x09b0, 0xF640, "r", 0, SIZE_NONE, 0, 694 cris_reg_mode_jump_op}, 695 696 {"jump", 697 JUMP_INDIR_OPCODE, JUMP_INDIR_Z_BITS, "s", 0, SIZE_FIX_32, 698 cris_ver_v0_10, 699 cris_none_reg_mode_jump_op}, 700 701 {"jump", 702 JUMP_INDIR_OPCODE, JUMP_INDIR_Z_BITS, "S", 0, SIZE_NONE, 703 cris_ver_v0_10, 704 cris_none_reg_mode_jump_op}, 705 706 {"jump", 0x09F0, 0x060F, "P", 0, SIZE_NONE, 707 cris_ver_v32p, 708 cris_none_reg_mode_jump_op}, 709 710 {"jump", 711 JUMP_PC_INCR_OPCODE_V32, 712 (0xffff & ~JUMP_PC_INCR_OPCODE_V32), "N", 0, SIZE_FIX_32, 713 cris_ver_v32p, 714 cris_none_reg_mode_jump_op}, 715 716 {"jmpu", 0x8930, 0x72c0, "s", 0, SIZE_FIX_32, 717 cris_ver_v10, 718 cris_none_reg_mode_jump_op}, 719 720 {"jmpu", 0x8930, 0x72c0, "S", 0, SIZE_NONE, 721 cris_ver_v10, 722 cris_none_reg_mode_jump_op}, 723 724 {"lapc", 0x0970, 0x0680, "U,R", 0, SIZE_NONE, 725 cris_ver_v32p, 726 cris_not_implemented_op}, 727 728 {"lapc", 0x0D7F, 0x0280, "dn,R", 0, SIZE_FIX_32, 729 cris_ver_v32p, 730 cris_not_implemented_op}, 731 732 {"lapcq", 0x0970, 0x0680, "u,R", 0, SIZE_NONE, 733 cris_ver_v32p, 734 cris_addi_op}, 735 736 {"lsl", 0x04C0, 0x0B00, "m r,R", 0, SIZE_NONE, 0, 737 cris_dstep_logshift_mstep_neg_not_op}, 738 739 {"lslq", 0x03c0, 0x0C20, "c,R", 0, SIZE_NONE, 0, 740 cris_dstep_logshift_mstep_neg_not_op}, 741 742 {"lsr", 0x07C0, 0x0800, "m r,R", 0, SIZE_NONE, 0, 743 cris_dstep_logshift_mstep_neg_not_op}, 744 745 {"lsrq", 0x03e0, 0x0C00, "c,R", 0, SIZE_NONE, 0, 746 cris_dstep_logshift_mstep_neg_not_op}, 747 748 {"lz", 0x0730, 0x08C0, "r,R", 0, SIZE_NONE, 749 cris_ver_v3p, 750 cris_not_implemented_op}, 751 752 {"mcp", 0x07f0, 0x0800, "P,r", 0, SIZE_NONE, 753 cris_ver_v32p, 754 cris_not_implemented_op}, 755 756 {"move", 0x0640, 0x0980, "m r,R", 0, SIZE_NONE, 0, 757 cris_reg_mode_add_sub_cmp_and_or_move_op}, 758 759 {"move", 0x0A40, 0x0180, "m s,R", 0, SIZE_FIELD, 0, 760 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 761 762 {"move", 0x0A40, 0x0180, "m S,D", 0, SIZE_NONE, 763 cris_ver_v0_10, 764 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 765 766 {"move", 0x0630, 0x09c0, "r,P", 0, SIZE_NONE, 0, 767 cris_move_to_preg_op}, 768 769 {"move", 0x0670, 0x0980, "P,r", 0, SIZE_NONE, 0, 770 cris_reg_mode_move_from_preg_op}, 771 772 {"move", 0x0BC0, 0x0000, "m R,y", 0, SIZE_FIELD, 0, 773 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 774 775 {"move", 0x0BC0, 0x0000, "m D,S", 0, SIZE_NONE, 776 cris_ver_v0_10, 777 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 778 779 {"move", 780 MOVE_M_TO_PREG_OPCODE, MOVE_M_TO_PREG_ZBITS, 781 "s,P", 0, SIZE_SPEC_REG, 0, 782 cris_move_to_preg_op}, 783 784 {"move", 0x0A30, 0x01c0, "S,P", 0, SIZE_NONE, 785 cris_ver_v0_10, 786 cris_move_to_preg_op}, 787 788 {"move", 0x0A70, 0x0180, "P,y", 0, SIZE_SPEC_REG, 0, 789 cris_none_reg_mode_move_from_preg_op}, 790 791 {"move", 0x0A70, 0x0180, "P,S", 0, SIZE_NONE, 792 cris_ver_v0_10, 793 cris_none_reg_mode_move_from_preg_op}, 794 795 {"move", 0x0B70, 0x0480, "r,T", 0, SIZE_NONE, 796 cris_ver_v32p, 797 cris_not_implemented_op}, 798 799 {"move", 0x0F70, 0x0080, "T,r", 0, SIZE_NONE, 800 cris_ver_v32p, 801 cris_not_implemented_op}, 802 803 {"movem", 0x0BF0, 0x0000, "R,y", 0, SIZE_FIX_32, 0, 804 cris_move_reg_to_mem_movem_op}, 805 806 {"movem", 0x0BF0, 0x0000, "D,S", 0, SIZE_NONE, 807 cris_ver_v0_10, 808 cris_move_reg_to_mem_movem_op}, 809 810 {"movem", 0x0BB0, 0x0040, "s,R", 0, SIZE_FIX_32, 0, 811 cris_move_mem_to_reg_movem_op}, 812 813 {"movem", 0x0BB0, 0x0040, "S,D", 0, SIZE_NONE, 814 cris_ver_v0_10, 815 cris_move_mem_to_reg_movem_op}, 816 817 {"moveq", 0x0240, 0x0D80, "i,R", 0, SIZE_NONE, 0, 818 cris_quick_mode_and_cmp_move_or_op}, 819 820 {"movs", 0x0460, 0x0B80, "z r,R", 0, SIZE_NONE, 0, 821 cris_reg_mode_add_sub_cmp_and_or_move_op}, 822 823 /* FIXME: SIZE_FIELD_SIGNED and all necessary changes. */ 824 {"movs", 0x0860, 0x0380, "z s,R", 0, SIZE_FIELD, 0, 825 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 826 827 {"movs", 0x0860, 0x0380, "z S,D", 0, SIZE_NONE, 828 cris_ver_v0_10, 829 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 830 831 {"movu", 0x0440, 0x0Ba0, "z r,R", 0, SIZE_NONE, 0, 832 cris_reg_mode_add_sub_cmp_and_or_move_op}, 833 834 /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */ 835 {"movu", 0x0840, 0x03a0, "z s,R", 0, SIZE_FIELD, 0, 836 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 837 838 {"movu", 0x0840, 0x03a0, "z S,D", 0, SIZE_NONE, 839 cris_ver_v0_10, 840 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 841 842 {"mstep", 0x07f0, 0x0800, "r,R", 0, SIZE_NONE, 843 cris_ver_v0_10, 844 cris_dstep_logshift_mstep_neg_not_op}, 845 846 {"muls", 0x0d00, 0x02c0, "m r,R", 0, SIZE_NONE, 847 cris_ver_v10p, 848 cris_muls_op}, 849 850 {"mulu", 0x0900, 0x06c0, "m r,R", 0, SIZE_NONE, 851 cris_ver_v10p, 852 cris_mulu_op}, 853 854 {"neg", 0x0580, 0x0A40, "m r,R", 0, SIZE_NONE, 0, 855 cris_dstep_logshift_mstep_neg_not_op}, 856 857 {"nop", NOP_OPCODE, NOP_Z_BITS, "", 0, SIZE_NONE, 858 cris_ver_v0_10, 859 cris_btst_nop_op}, 860 861 {"nop", NOP_OPCODE_V32, NOP_Z_BITS_V32, "", 0, SIZE_NONE, 862 cris_ver_v32p, 863 cris_btst_nop_op}, 864 865 {"not", 0x8770, 0x7880, "r", 0, SIZE_NONE, 0, 866 cris_dstep_logshift_mstep_neg_not_op}, 867 868 {"or", 0x0740, 0x0880, "m r,R", 0, SIZE_NONE, 0, 869 cris_reg_mode_add_sub_cmp_and_or_move_op}, 870 871 {"or", 0x0B40, 0x0080, "m s,R", 0, SIZE_FIELD, 0, 872 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 873 874 {"or", 0x0B40, 0x0080, "m S,D", 0, SIZE_NONE, 875 cris_ver_v0_10, 876 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 877 878 {"or", 0x0B40, 0x0480, "m S,R,r", 0, SIZE_NONE, 879 cris_ver_v0_10, 880 cris_three_operand_add_sub_cmp_and_or_op}, 881 882 {"orq", 0x0340, 0x0C80, "i,R", 0, SIZE_NONE, 0, 883 cris_quick_mode_and_cmp_move_or_op}, 884 885 {"pop", 0x0E6E, 0x0191, "!R", 0, SIZE_NONE, 886 cris_ver_v0_10, 887 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 888 889 {"pop", 0x0e3e, 0x01c1, "!P", 0, SIZE_NONE, 890 cris_ver_v0_10, 891 cris_none_reg_mode_move_from_preg_op}, 892 893 {"push", 0x0FEE, 0x0011, "BR", 0, SIZE_NONE, 894 cris_ver_v0_10, 895 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 896 897 {"push", 0x0E7E, 0x0181, "BP", 0, SIZE_NONE, 898 cris_ver_v0_10, 899 cris_move_to_preg_op}, 900 901 {"rbf", 0x3b30, 0xc0c0, "y", 0, SIZE_NONE, 902 cris_ver_v10, 903 cris_not_implemented_op}, 904 905 {"rbf", 0x3b30, 0xc0c0, "S", 0, SIZE_NONE, 906 cris_ver_v10, 907 cris_not_implemented_op}, 908 909 {"rfe", 0x2930, 0xD6CF, "", 0, SIZE_NONE, 910 cris_ver_v32p, 911 cris_not_implemented_op}, 912 913 {"rfg", 0x4930, 0xB6CF, "", 0, SIZE_NONE, 914 cris_ver_v32p, 915 cris_not_implemented_op}, 916 917 {"rfn", 0x5930, 0xA6CF, "", 0, SIZE_NONE, 918 cris_ver_v32p, 919 cris_not_implemented_op}, 920 921 {"ret", 0xB67F, 0x4980, "", 1, SIZE_NONE, 922 cris_ver_v0_10, 923 cris_reg_mode_move_from_preg_op}, 924 925 {"ret", 0xB9F0, 0x460F, "", 1, SIZE_NONE, 926 cris_ver_v32p, 927 cris_reg_mode_move_from_preg_op}, 928 929 {"retb", 0xe67f, 0x1980, "", 1, SIZE_NONE, 930 cris_ver_v0_10, 931 cris_reg_mode_move_from_preg_op}, 932 933 {"rete", 0xA9F0, 0x560F, "", 1, SIZE_NONE, 934 cris_ver_v32p, 935 cris_reg_mode_move_from_preg_op}, 936 937 {"reti", 0xA67F, 0x5980, "", 1, SIZE_NONE, 938 cris_ver_v0_10, 939 cris_reg_mode_move_from_preg_op}, 940 941 {"retn", 0xC9F0, 0x360F, "", 1, SIZE_NONE, 942 cris_ver_v32p, 943 cris_reg_mode_move_from_preg_op}, 944 945 {"sbfs", 0x3b70, 0xc080, "y", 0, SIZE_NONE, 946 cris_ver_v10, 947 cris_not_implemented_op}, 948 949 {"sbfs", 0x3b70, 0xc080, "S", 0, SIZE_NONE, 950 cris_ver_v10, 951 cris_not_implemented_op}, 952 953 {"sa", 954 0x0530+CC_A*0x1000, 955 0x0AC0+(0xf-CC_A)*0x1000, "r", 0, SIZE_NONE, 0, 956 cris_scc_op}, 957 958 {"ssb", 959 0x0530+CC_EXT*0x1000, 960 0x0AC0+(0xf-CC_EXT)*0x1000, "r", 0, SIZE_NONE, 961 cris_ver_v32p, 962 cris_scc_op}, 963 964 {"scc", 965 0x0530+CC_CC*0x1000, 966 0x0AC0+(0xf-CC_CC)*0x1000, "r", 0, SIZE_NONE, 0, 967 cris_scc_op}, 968 969 {"scs", 970 0x0530+CC_CS*0x1000, 971 0x0AC0+(0xf-CC_CS)*0x1000, "r", 0, SIZE_NONE, 0, 972 cris_scc_op}, 973 974 {"seq", 975 0x0530+CC_EQ*0x1000, 976 0x0AC0+(0xf-CC_EQ)*0x1000, "r", 0, SIZE_NONE, 0, 977 cris_scc_op}, 978 979 {"setf", 0x05b0, 0x0A40, "f", 0, SIZE_NONE, 0, 980 cris_ax_ei_setf_op}, 981 982 {"sfe", 0x3930, 0xC6CF, "", 0, SIZE_NONE, 983 cris_ver_v32p, 984 cris_not_implemented_op}, 985 986 /* Need to have "swf" in front of "sext" so it is the one displayed in 987 disassembly. */ 988 {"swf", 989 0x0530+CC_EXT*0x1000, 990 0x0AC0+(0xf-CC_EXT)*0x1000, "r", 0, SIZE_NONE, 991 cris_ver_v10, 992 cris_scc_op}, 993 994 {"sext", 995 0x0530+CC_EXT*0x1000, 996 0x0AC0+(0xf-CC_EXT)*0x1000, "r", 0, SIZE_NONE, 997 cris_ver_v0_3, 998 cris_scc_op}, 999 1000 {"sge", 1001 0x0530+CC_GE*0x1000, 1002 0x0AC0+(0xf-CC_GE)*0x1000, "r", 0, SIZE_NONE, 0, 1003 cris_scc_op}, 1004 1005 {"sgt", 1006 0x0530+CC_GT*0x1000, 1007 0x0AC0+(0xf-CC_GT)*0x1000, "r", 0, SIZE_NONE, 0, 1008 cris_scc_op}, 1009 1010 {"shi", 1011 0x0530+CC_HI*0x1000, 1012 0x0AC0+(0xf-CC_HI)*0x1000, "r", 0, SIZE_NONE, 0, 1013 cris_scc_op}, 1014 1015 {"shs", 1016 0x0530+CC_HS*0x1000, 1017 0x0AC0+(0xf-CC_HS)*0x1000, "r", 0, SIZE_NONE, 0, 1018 cris_scc_op}, 1019 1020 {"sle", 1021 0x0530+CC_LE*0x1000, 1022 0x0AC0+(0xf-CC_LE)*0x1000, "r", 0, SIZE_NONE, 0, 1023 cris_scc_op}, 1024 1025 {"slo", 1026 0x0530+CC_LO*0x1000, 1027 0x0AC0+(0xf-CC_LO)*0x1000, "r", 0, SIZE_NONE, 0, 1028 cris_scc_op}, 1029 1030 {"sls", 1031 0x0530+CC_LS*0x1000, 1032 0x0AC0+(0xf-CC_LS)*0x1000, "r", 0, SIZE_NONE, 0, 1033 cris_scc_op}, 1034 1035 {"slt", 1036 0x0530+CC_LT*0x1000, 1037 0x0AC0+(0xf-CC_LT)*0x1000, "r", 0, SIZE_NONE, 0, 1038 cris_scc_op}, 1039 1040 {"smi", 1041 0x0530+CC_MI*0x1000, 1042 0x0AC0+(0xf-CC_MI)*0x1000, "r", 0, SIZE_NONE, 0, 1043 cris_scc_op}, 1044 1045 {"sne", 1046 0x0530+CC_NE*0x1000, 1047 0x0AC0+(0xf-CC_NE)*0x1000, "r", 0, SIZE_NONE, 0, 1048 cris_scc_op}, 1049 1050 {"spl", 1051 0x0530+CC_PL*0x1000, 1052 0x0AC0+(0xf-CC_PL)*0x1000, "r", 0, SIZE_NONE, 0, 1053 cris_scc_op}, 1054 1055 {"sub", 0x0680, 0x0940, "m r,R", 0, SIZE_NONE, 0, 1056 cris_reg_mode_add_sub_cmp_and_or_move_op}, 1057 1058 {"sub", 0x0a80, 0x0140, "m s,R", 0, SIZE_FIELD, 0, 1059 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 1060 1061 {"sub", 0x0a80, 0x0140, "m S,D", 0, SIZE_NONE, 1062 cris_ver_v0_10, 1063 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 1064 1065 {"sub", 0x0a80, 0x0540, "m S,R,r", 0, SIZE_NONE, 1066 cris_ver_v0_10, 1067 cris_three_operand_add_sub_cmp_and_or_op}, 1068 1069 {"subq", 0x0280, 0x0d40, "I,R", 0, SIZE_NONE, 0, 1070 cris_quick_mode_add_sub_op}, 1071 1072 {"subs", 0x04a0, 0x0b40, "z r,R", 0, SIZE_NONE, 0, 1073 cris_reg_mode_add_sub_cmp_and_or_move_op}, 1074 1075 /* FIXME: SIZE_FIELD_SIGNED and all necessary changes. */ 1076 {"subs", 0x08a0, 0x0340, "z s,R", 0, SIZE_FIELD, 0, 1077 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 1078 1079 {"subs", 0x08a0, 0x0340, "z S,D", 0, SIZE_NONE, 1080 cris_ver_v0_10, 1081 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 1082 1083 {"subs", 0x08a0, 0x0740, "z S,R,r", 0, SIZE_NONE, 1084 cris_ver_v0_10, 1085 cris_three_operand_add_sub_cmp_and_or_op}, 1086 1087 {"subu", 0x0480, 0x0b60, "z r,R", 0, SIZE_NONE, 0, 1088 cris_reg_mode_add_sub_cmp_and_or_move_op}, 1089 1090 /* FIXME: SIZE_FIELD_UNSIGNED and all necessary changes. */ 1091 {"subu", 0x0880, 0x0360, "z s,R", 0, SIZE_FIELD, 0, 1092 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 1093 1094 {"subu", 0x0880, 0x0360, "z S,D", 0, SIZE_NONE, 1095 cris_ver_v0_10, 1096 cris_none_reg_mode_add_sub_cmp_and_or_move_op}, 1097 1098 {"subu", 0x0880, 0x0760, "z S,R,r", 0, SIZE_NONE, 1099 cris_ver_v0_10, 1100 cris_three_operand_add_sub_cmp_and_or_op}, 1101 1102 {"svc", 1103 0x0530+CC_VC*0x1000, 1104 0x0AC0+(0xf-CC_VC)*0x1000, "r", 0, SIZE_NONE, 0, 1105 cris_scc_op}, 1106 1107 {"svs", 1108 0x0530+CC_VS*0x1000, 1109 0x0AC0+(0xf-CC_VS)*0x1000, "r", 0, SIZE_NONE, 0, 1110 cris_scc_op}, 1111 1112 /* The insn "swapn" is the same as "not" and will be disassembled as 1113 such, but the swap* family of mnmonics are generally v8-and-higher 1114 only, so count it in. */ 1115 {"swapn", 0x8770, 0x7880, "r", 0, SIZE_NONE, 1116 cris_ver_v8p, 1117 cris_not_implemented_op}, 1118 1119 {"swapw", 0x4770, 0xb880, "r", 0, SIZE_NONE, 1120 cris_ver_v8p, 1121 cris_not_implemented_op}, 1122 1123 {"swapnw", 0xc770, 0x3880, "r", 0, SIZE_NONE, 1124 cris_ver_v8p, 1125 cris_not_implemented_op}, 1126 1127 {"swapb", 0x2770, 0xd880, "r", 0, SIZE_NONE, 1128 cris_ver_v8p, 1129 cris_not_implemented_op}, 1130 1131 {"swapnb", 0xA770, 0x5880, "r", 0, SIZE_NONE, 1132 cris_ver_v8p, 1133 cris_not_implemented_op}, 1134 1135 {"swapwb", 0x6770, 0x9880, "r", 0, SIZE_NONE, 1136 cris_ver_v8p, 1137 cris_not_implemented_op}, 1138 1139 {"swapnwb", 0xE770, 0x1880, "r", 0, SIZE_NONE, 1140 cris_ver_v8p, 1141 cris_not_implemented_op}, 1142 1143 {"swapr", 0x1770, 0xe880, "r", 0, SIZE_NONE, 1144 cris_ver_v8p, 1145 cris_not_implemented_op}, 1146 1147 {"swapnr", 0x9770, 0x6880, "r", 0, SIZE_NONE, 1148 cris_ver_v8p, 1149 cris_not_implemented_op}, 1150 1151 {"swapwr", 0x5770, 0xa880, "r", 0, SIZE_NONE, 1152 cris_ver_v8p, 1153 cris_not_implemented_op}, 1154 1155 {"swapnwr", 0xd770, 0x2880, "r", 0, SIZE_NONE, 1156 cris_ver_v8p, 1157 cris_not_implemented_op}, 1158 1159 {"swapbr", 0x3770, 0xc880, "r", 0, SIZE_NONE, 1160 cris_ver_v8p, 1161 cris_not_implemented_op}, 1162 1163 {"swapnbr", 0xb770, 0x4880, "r", 0, SIZE_NONE, 1164 cris_ver_v8p, 1165 cris_not_implemented_op}, 1166 1167 {"swapwbr", 0x7770, 0x8880, "r", 0, SIZE_NONE, 1168 cris_ver_v8p, 1169 cris_not_implemented_op}, 1170 1171 {"swapnwbr", 0xf770, 0x0880, "r", 0, SIZE_NONE, 1172 cris_ver_v8p, 1173 cris_not_implemented_op}, 1174 1175 {"test", 0x0640, 0x0980, "m D", 0, SIZE_NONE, 1176 cris_ver_v0_10, 1177 cris_reg_mode_test_op}, 1178 1179 {"test", 0x0b80, 0xf040, "m y", 0, SIZE_FIELD, 0, 1180 cris_none_reg_mode_clear_test_op}, 1181 1182 {"test", 0x0b80, 0xf040, "m S", 0, SIZE_NONE, 1183 cris_ver_v0_10, 1184 cris_none_reg_mode_clear_test_op}, 1185 1186 {"xor", 0x07B0, 0x0840, "r,R", 0, SIZE_NONE, 0, 1187 cris_xor_op}, 1188 1189 {NULL, 0, 0, NULL, 0, 0, 0, cris_not_implemented_op} 1190 }; 1191 1192 /* Condition-names, indexed by the CC_* numbers as found in cris.h. */ 1193 const char * const 1194 cris_cc_strings[] = 1195 { 1196 "hs", 1197 "lo", 1198 "ne", 1199 "eq", 1200 "vc", 1201 "vs", 1202 "pl", 1203 "mi", 1204 "ls", 1205 "hi", 1206 "ge", 1207 "lt", 1208 "gt", 1209 "le", 1210 "a", 1211 /* This is a placeholder. In v0, this would be "ext". In v32, this 1212 is "sb". */ 1213 "wf" 1214 }; 1215 1216 /* 1217 * Local variables: 1218 * eval: (c-set-style "gnu") 1219 * indent-tabs-mode: t 1220 * End: 1221 */ 1222 1223 1224 /* No instruction will be disassembled longer than this. In theory, and 1225 in silicon, address prefixes can be cascaded. In practice, cascading 1226 is not used by GCC, and not supported by the assembler. */ 1227 #ifndef MAX_BYTES_PER_CRIS_INSN 1228 #define MAX_BYTES_PER_CRIS_INSN 8 1229 #endif 1230 1231 /* Whether or not to decode prefixes, folding it into the following 1232 instruction. FIXME: Make this optional later. */ 1233 #ifndef PARSE_PREFIX 1234 #define PARSE_PREFIX 1 1235 #endif 1236 1237 /* Sometimes we prefix all registers with this character. */ 1238 #define REGISTER_PREFIX_CHAR '$' 1239 1240 /* Whether or not to trace the following sequence: 1241 sub* X,r%d 1242 bound* Y,r%d 1243 adds.w [pc+r%d.w],pc 1244 1245 This is the assembly form of a switch-statement in C. 1246 The "sub is optional. If there is none, then X will be zero. 1247 X is the value of the first case, 1248 Y is the number of cases (including default). 1249 1250 This results in case offsets printed on the form: 1251 case N: -> case_address 1252 where N is an estimation on the corresponding 'case' operand in C, 1253 and case_address is where execution of that case continues after the 1254 sequence presented above. 1255 1256 The old style of output was to print the offsets as instructions, 1257 which made it hard to follow "case"-constructs in the disassembly, 1258 and caused a lot of annoying warnings about undefined instructions. 1259 1260 FIXME: Make this optional later. */ 1261 #ifndef TRACE_CASE 1262 #define TRACE_CASE (disdata->trace_case) 1263 #endif 1264 1265 enum cris_disass_family 1266 { cris_dis_v0_v10, cris_dis_common_v10_v32, cris_dis_v32 }; 1267 1268 /* Stored in the disasm_info->private_data member. */ 1269 struct cris_disasm_data 1270 { 1271 /* Whether to print something less confusing if we find something 1272 matching a switch-construct. */ 1273 bfd_boolean trace_case; 1274 1275 /* Whether this code is flagged as crisv32. FIXME: Should be an enum 1276 that includes "compatible". */ 1277 enum cris_disass_family distype; 1278 }; 1279 1280 /* Value of first element in switch. */ 1281 static long case_offset = 0; 1282 1283 /* How many more case-offsets to print. */ 1284 static long case_offset_counter = 0; 1285 1286 /* Number of case offsets. */ 1287 static long no_of_case_offsets = 0; 1288 1289 /* Candidate for next case_offset. */ 1290 static long last_immediate = 0; 1291 1292 static int cris_constraint 1293 (const char *, unsigned, unsigned, struct cris_disasm_data *); 1294 1295 /* Parse disassembler options and store state in info. FIXME: For the 1296 time being, we abuse static variables. */ 1297 1298 static bfd_boolean 1299 cris_parse_disassembler_options (disassemble_info *info, 1300 enum cris_disass_family distype) 1301 { 1302 struct cris_disasm_data *disdata; 1303 1304 info->private_data = calloc (1, sizeof (struct cris_disasm_data)); 1305 disdata = (struct cris_disasm_data *) info->private_data; 1306 if (disdata == NULL) 1307 return false; 1308 1309 /* Default true. */ 1310 disdata->trace_case 1311 = (info->disassembler_options == NULL 1312 || (strcmp (info->disassembler_options, "nocase") != 0)); 1313 1314 disdata->distype = distype; 1315 return true; 1316 } 1317 1318 static const struct cris_spec_reg * 1319 spec_reg_info (unsigned int sreg, enum cris_disass_family distype) 1320 { 1321 int i; 1322 1323 for (i = 0; cris_spec_regs[i].name != NULL; i++) 1324 { 1325 if (cris_spec_regs[i].number == sreg) 1326 { 1327 if (distype == cris_dis_v32) 1328 switch (cris_spec_regs[i].applicable_version) 1329 { 1330 case cris_ver_warning: 1331 case cris_ver_version_all: 1332 case cris_ver_v3p: 1333 case cris_ver_v8p: 1334 case cris_ver_v10p: 1335 case cris_ver_v32p: 1336 /* No ambiguous sizes or register names with CRISv32. */ 1337 if (cris_spec_regs[i].warning == NULL) 1338 return &cris_spec_regs[i]; 1339 default: 1340 ; 1341 } 1342 else if (cris_spec_regs[i].applicable_version != cris_ver_v32p) 1343 return &cris_spec_regs[i]; 1344 } 1345 } 1346 1347 return NULL; 1348 } 1349 1350 /* Return the number of bits in the argument. */ 1351 1352 static int 1353 number_of_bits (unsigned int val) 1354 { 1355 int bits; 1356 1357 for (bits = 0; val != 0; val &= val - 1) 1358 bits++; 1359 1360 return bits; 1361 } 1362 1363 /* Get an entry in the opcode-table. */ 1364 1365 static const struct cris_opcode * 1366 get_opcode_entry (unsigned int insn, 1367 unsigned int prefix_insn, 1368 struct cris_disasm_data *disdata) 1369 { 1370 /* For non-prefixed insns, we keep a table of pointers, indexed by the 1371 insn code. Each entry is initialized when found to be NULL. */ 1372 static const struct cris_opcode **opc_table = NULL; 1373 1374 const struct cris_opcode *max_matchedp = NULL; 1375 const struct cris_opcode **prefix_opc_table = NULL; 1376 1377 /* We hold a table for each prefix that need to be handled differently. */ 1378 static const struct cris_opcode **dip_prefixes = NULL; 1379 static const struct cris_opcode **bdapq_m1_prefixes = NULL; 1380 static const struct cris_opcode **bdapq_m2_prefixes = NULL; 1381 static const struct cris_opcode **bdapq_m4_prefixes = NULL; 1382 static const struct cris_opcode **rest_prefixes = NULL; 1383 1384 /* Allocate and clear the opcode-table. */ 1385 if (opc_table == NULL) 1386 { 1387 opc_table = g_new0(const struct cris_opcode *, 65536); 1388 dip_prefixes = g_new0(const struct cris_opcode *, 65536); 1389 bdapq_m1_prefixes = g_new0(const struct cris_opcode *, 65536); 1390 bdapq_m2_prefixes = g_new0(const struct cris_opcode *, 65536); 1391 bdapq_m4_prefixes = g_new0(const struct cris_opcode *, 65536); 1392 rest_prefixes = g_new0(const struct cris_opcode *, 65536); 1393 } 1394 1395 /* Get the right table if this is a prefix. 1396 This code is connected to cris_constraints in that it knows what 1397 prefixes play a role in recognition of patterns; the necessary 1398 state is reflected by which table is used. If constraints 1399 involving match or non-match of prefix insns are changed, then this 1400 probably needs changing too. */ 1401 if (prefix_insn != NO_CRIS_PREFIX) 1402 { 1403 const struct cris_opcode *popcodep 1404 = (opc_table[prefix_insn] != NULL 1405 ? opc_table[prefix_insn] 1406 : get_opcode_entry (prefix_insn, NO_CRIS_PREFIX, disdata)); 1407 1408 if (popcodep == NULL) 1409 return NULL; 1410 1411 if (popcodep->match == BDAP_QUICK_OPCODE) 1412 { 1413 /* Since some offsets are recognized with "push" macros, we 1414 have to have different tables for them. */ 1415 int offset = (prefix_insn & 255); 1416 1417 if (offset > 127) 1418 offset -= 256; 1419 1420 switch (offset) 1421 { 1422 case -4: 1423 prefix_opc_table = bdapq_m4_prefixes; 1424 break; 1425 1426 case -2: 1427 prefix_opc_table = bdapq_m2_prefixes; 1428 break; 1429 1430 case -1: 1431 prefix_opc_table = bdapq_m1_prefixes; 1432 break; 1433 1434 default: 1435 prefix_opc_table = rest_prefixes; 1436 break; 1437 } 1438 } 1439 else if (popcodep->match == DIP_OPCODE) 1440 /* We don't allow postincrement when the prefix is DIP, so use a 1441 different table for DIP. */ 1442 prefix_opc_table = dip_prefixes; 1443 else 1444 prefix_opc_table = rest_prefixes; 1445 } 1446 1447 if (prefix_insn != NO_CRIS_PREFIX 1448 && prefix_opc_table[insn] != NULL) 1449 max_matchedp = prefix_opc_table[insn]; 1450 else if (prefix_insn == NO_CRIS_PREFIX && opc_table[insn] != NULL) 1451 max_matchedp = opc_table[insn]; 1452 else 1453 { 1454 const struct cris_opcode *opcodep; 1455 int max_level_of_match = -1; 1456 1457 for (opcodep = cris_opcodes; 1458 opcodep->name != NULL; 1459 opcodep++) 1460 { 1461 int level_of_match; 1462 1463 if (disdata->distype == cris_dis_v32) 1464 { 1465 switch (opcodep->applicable_version) 1466 { 1467 case cris_ver_version_all: 1468 break; 1469 1470 case cris_ver_v0_3: 1471 case cris_ver_v0_10: 1472 case cris_ver_v3_10: 1473 case cris_ver_sim_v0_10: 1474 case cris_ver_v8_10: 1475 case cris_ver_v10: 1476 case cris_ver_warning: 1477 continue; 1478 1479 case cris_ver_v3p: 1480 case cris_ver_v8p: 1481 case cris_ver_v10p: 1482 case cris_ver_v32p: 1483 break; 1484 1485 case cris_ver_v8: 1486 abort (); 1487 default: 1488 abort (); 1489 } 1490 } 1491 else 1492 { 1493 switch (opcodep->applicable_version) 1494 { 1495 case cris_ver_version_all: 1496 case cris_ver_v0_3: 1497 case cris_ver_v3p: 1498 case cris_ver_v0_10: 1499 case cris_ver_v8p: 1500 case cris_ver_v8_10: 1501 case cris_ver_v10: 1502 case cris_ver_sim_v0_10: 1503 case cris_ver_v10p: 1504 case cris_ver_warning: 1505 break; 1506 1507 case cris_ver_v32p: 1508 continue; 1509 1510 case cris_ver_v8: 1511 abort (); 1512 default: 1513 abort (); 1514 } 1515 } 1516 1517 /* We give a double lead for bits matching the template in 1518 cris_opcodes. Not even, because then "move p8,r10" would 1519 be given 2 bits lead over "clear.d r10". When there's a 1520 tie, the first entry in the table wins. This is 1521 deliberate, to avoid a more complicated recognition 1522 formula. */ 1523 if ((opcodep->match & insn) == opcodep->match 1524 && (opcodep->lose & insn) == 0 1525 && ((level_of_match 1526 = cris_constraint (opcodep->args, 1527 insn, 1528 prefix_insn, 1529 disdata)) 1530 >= 0) 1531 && ((level_of_match 1532 += 2 * number_of_bits (opcodep->match 1533 | opcodep->lose)) 1534 > max_level_of_match)) 1535 { 1536 max_matchedp = opcodep; 1537 max_level_of_match = level_of_match; 1538 1539 /* If there was a full match, never mind looking 1540 further. */ 1541 if (level_of_match >= 2 * 16) 1542 break; 1543 } 1544 } 1545 /* Fill in the new entry. 1546 1547 If there are changes to the opcode-table involving prefixes, and 1548 disassembly then does not work correctly, try removing the 1549 else-clause below that fills in the prefix-table. If that 1550 helps, you need to change the prefix_opc_table setting above, or 1551 something related. */ 1552 if (prefix_insn == NO_CRIS_PREFIX) 1553 opc_table[insn] = max_matchedp; 1554 else 1555 prefix_opc_table[insn] = max_matchedp; 1556 } 1557 1558 return max_matchedp; 1559 } 1560 1561 /* Return -1 if the constraints of a bitwise-matched instruction say 1562 that there is no match. Otherwise return a nonnegative number 1563 indicating the confidence in the match (higher is better). */ 1564 1565 static int 1566 cris_constraint (const char *cs, 1567 unsigned int insn, 1568 unsigned int prefix_insn, 1569 struct cris_disasm_data *disdata) 1570 { 1571 int retval = 0; 1572 int tmp; 1573 int prefix_ok = 0; 1574 const char *s; 1575 1576 for (s = cs; *s; s++) 1577 switch (*s) 1578 { 1579 case '!': 1580 /* Do not recognize "pop" if there's a prefix and then only for 1581 v0..v10. */ 1582 if (prefix_insn != NO_CRIS_PREFIX 1583 || disdata->distype != cris_dis_v0_v10) 1584 return -1; 1585 break; 1586 1587 case 'U': 1588 /* Not recognized at disassembly. */ 1589 return -1; 1590 1591 case 'M': 1592 /* Size modifier for "clear", i.e. special register 0, 4 or 8. 1593 Check that it is one of them. Only special register 12 could 1594 be mismatched, but checking for matches is more logical than 1595 checking for mismatches when there are only a few cases. */ 1596 tmp = ((insn >> 12) & 0xf); 1597 if (tmp != 0 && tmp != 4 && tmp != 8) 1598 return -1; 1599 break; 1600 1601 case 'm': 1602 if ((insn & 0x30) == 0x30) 1603 return -1; 1604 break; 1605 1606 case 'S': 1607 /* A prefix operand without side-effect. */ 1608 if (prefix_insn != NO_CRIS_PREFIX && (insn & 0x400) == 0) 1609 { 1610 prefix_ok = 1; 1611 break; 1612 } 1613 else 1614 return -1; 1615 1616 case 's': 1617 case 'y': 1618 case 'Y': 1619 /* If this is a prefixed insn with postincrement (side-effect), 1620 the prefix must not be DIP. */ 1621 if (prefix_insn != NO_CRIS_PREFIX) 1622 { 1623 if (insn & 0x400) 1624 { 1625 const struct cris_opcode *prefix_opcodep 1626 = get_opcode_entry (prefix_insn, NO_CRIS_PREFIX, disdata); 1627 1628 if (prefix_opcodep->match == DIP_OPCODE) 1629 return -1; 1630 } 1631 1632 prefix_ok = 1; 1633 } 1634 break; 1635 1636 case 'B': 1637 /* If we don't fall through, then the prefix is ok. */ 1638 prefix_ok = 1; 1639 1640 /* A "push" prefix. Check for valid "push" size. 1641 In case of special register, it may be != 4. */ 1642 if (prefix_insn != NO_CRIS_PREFIX) 1643 { 1644 /* Match the prefix insn to BDAPQ. */ 1645 const struct cris_opcode *prefix_opcodep 1646 = get_opcode_entry (prefix_insn, NO_CRIS_PREFIX, disdata); 1647 1648 if (prefix_opcodep->match == BDAP_QUICK_OPCODE) 1649 { 1650 int pushsize = (prefix_insn & 255); 1651 1652 if (pushsize > 127) 1653 pushsize -= 256; 1654 1655 if (s[1] == 'P') 1656 { 1657 unsigned int spec_reg = (insn >> 12) & 15; 1658 const struct cris_spec_reg *sregp 1659 = spec_reg_info (spec_reg, disdata->distype); 1660 1661 /* For a special-register, the "prefix size" must 1662 match the size of the register. */ 1663 if (sregp && sregp->reg_size == (unsigned int) -pushsize) 1664 break; 1665 } 1666 else if (s[1] == 'R') 1667 { 1668 if ((insn & 0x30) == 0x20 && pushsize == -4) 1669 break; 1670 } 1671 /* FIXME: Should abort here; next constraint letter 1672 *must* be 'P' or 'R'. */ 1673 } 1674 } 1675 return -1; 1676 1677 case 'D': 1678 retval = (((insn >> 12) & 15) == (insn & 15)); 1679 if (!retval) 1680 return -1; 1681 else 1682 retval += 4; 1683 break; 1684 1685 case 'P': 1686 { 1687 const struct cris_spec_reg *sregp 1688 = spec_reg_info ((insn >> 12) & 15, disdata->distype); 1689 1690 /* Since we match four bits, we will give a value of 4-1 = 3 1691 in a match. If there is a corresponding exact match of a 1692 special register in another pattern, it will get a value of 1693 4, which will be higher. This should be correct in that an 1694 exact pattern would match better than a general pattern. 1695 1696 Note that there is a reason for not returning zero; the 1697 pattern for "clear" is partly matched in the bit-pattern 1698 (the two lower bits must be zero), while the bit-pattern 1699 for a move from a special register is matched in the 1700 register constraint. */ 1701 1702 if (sregp != NULL) 1703 { 1704 retval += 3; 1705 break; 1706 } 1707 else 1708 return -1; 1709 } 1710 } 1711 1712 if (prefix_insn != NO_CRIS_PREFIX && ! prefix_ok) 1713 return -1; 1714 1715 return retval; 1716 } 1717 1718 /* Format number as hex with a leading "0x" into outbuffer. */ 1719 1720 static char * 1721 format_hex (unsigned long number, 1722 char *outbuffer, 1723 struct cris_disasm_data *disdata) 1724 { 1725 /* Truncate negative numbers on >32-bit hosts. */ 1726 number &= 0xffffffff; 1727 1728 sprintf (outbuffer, "0x%lx", number); 1729 1730 /* Save this value for the "case" support. */ 1731 if (TRACE_CASE) 1732 last_immediate = number; 1733 1734 return outbuffer + strlen (outbuffer); 1735 } 1736 1737 /* Format number as decimal into outbuffer. Parameter signedp says 1738 whether the number should be formatted as signed (!= 0) or 1739 unsigned (== 0). */ 1740 1741 static char * 1742 format_dec (long number, char *outbuffer, int signedp) 1743 { 1744 last_immediate = number; 1745 sprintf (outbuffer, signedp ? "%ld" : "%lu", number); 1746 1747 return outbuffer + strlen (outbuffer); 1748 } 1749 1750 /* Format the name of the general register regno into outbuffer. */ 1751 1752 static char * 1753 format_reg (struct cris_disasm_data *disdata, 1754 int regno, 1755 char *outbuffer_start, 1756 bfd_boolean with_reg_prefix) 1757 { 1758 char *outbuffer = outbuffer_start; 1759 1760 if (with_reg_prefix) 1761 *outbuffer++ = REGISTER_PREFIX_CHAR; 1762 1763 switch (regno) 1764 { 1765 case 15: 1766 /* For v32, there is no context in which we output PC. */ 1767 if (disdata->distype == cris_dis_v32) 1768 strcpy (outbuffer, "acr"); 1769 else 1770 strcpy (outbuffer, "pc"); 1771 break; 1772 1773 case 14: 1774 strcpy (outbuffer, "sp"); 1775 break; 1776 1777 default: 1778 sprintf (outbuffer, "r%d", regno); 1779 break; 1780 } 1781 1782 return outbuffer_start + strlen (outbuffer_start); 1783 } 1784 1785 /* Format the name of a support register into outbuffer. */ 1786 1787 static char * 1788 format_sup_reg (unsigned int regno, 1789 char *outbuffer_start, 1790 bfd_boolean with_reg_prefix) 1791 { 1792 char *outbuffer = outbuffer_start; 1793 int i; 1794 1795 if (with_reg_prefix) 1796 *outbuffer++ = REGISTER_PREFIX_CHAR; 1797 1798 for (i = 0; cris_support_regs[i].name != NULL; i++) 1799 if (cris_support_regs[i].number == regno) 1800 { 1801 sprintf (outbuffer, "%s", cris_support_regs[i].name); 1802 return outbuffer_start + strlen (outbuffer_start); 1803 } 1804 1805 /* There's supposed to be register names covering all numbers, though 1806 some may be generic names. */ 1807 sprintf (outbuffer, "format_sup_reg-BUG"); 1808 return outbuffer_start + strlen (outbuffer_start); 1809 } 1810 1811 /* Return the length of an instruction. */ 1812 1813 static unsigned 1814 bytes_to_skip (unsigned int insn, 1815 const struct cris_opcode *matchedp, 1816 enum cris_disass_family distype, 1817 const struct cris_opcode *prefix_matchedp) 1818 { 1819 /* Each insn is a word plus "immediate" operands. */ 1820 unsigned to_skip = 2; 1821 const char *template = matchedp->args; 1822 const char *s; 1823 1824 for (s = template; *s; s++) 1825 if ((*s == 's' || *s == 'N' || *s == 'Y') 1826 && (insn & 0x400) && (insn & 15) == 15 1827 && prefix_matchedp == NULL) 1828 { 1829 /* Immediate via [pc+], so we have to check the size of the 1830 operand. */ 1831 int mode_size = 1 << ((insn >> 4) & (*template == 'z' ? 1 : 3)); 1832 1833 if (matchedp->imm_oprnd_size == SIZE_FIX_32) 1834 to_skip += 4; 1835 else if (matchedp->imm_oprnd_size == SIZE_SPEC_REG) 1836 { 1837 const struct cris_spec_reg *sregp 1838 = spec_reg_info ((insn >> 12) & 15, distype); 1839 1840 /* FIXME: Improve error handling; should have been caught 1841 earlier. */ 1842 if (sregp == NULL) 1843 return 2; 1844 1845 /* PC is incremented by two, not one, for a byte. Except on 1846 CRISv32, where constants are always DWORD-size for 1847 special registers. */ 1848 to_skip += 1849 distype == cris_dis_v32 ? 4 : (sregp->reg_size + 1) & ~1; 1850 } 1851 else 1852 to_skip += (mode_size + 1) & ~1; 1853 } 1854 else if (*s == 'n') 1855 to_skip += 4; 1856 else if (*s == 'b') 1857 to_skip += 2; 1858 1859 return to_skip; 1860 } 1861 1862 /* Print condition code flags. */ 1863 1864 static char * 1865 print_flags (struct cris_disasm_data *disdata, unsigned int insn, char *cp) 1866 { 1867 /* Use the v8 (Etrax 100) flag definitions for disassembly. 1868 The differences with v0 (Etrax 1..4) vs. Svinto are: 1869 v0 'd' <=> v8 'm' 1870 v0 'e' <=> v8 'b'. 1871 FIXME: Emit v0..v3 flag names somehow. */ 1872 static const char v8_fnames[] = "cvznxibm"; 1873 static const char v32_fnames[] = "cvznxiup"; 1874 const char *fnames 1875 = disdata->distype == cris_dis_v32 ? v32_fnames : v8_fnames; 1876 1877 unsigned char flagbits = (((insn >> 8) & 0xf0) | (insn & 15)); 1878 int i; 1879 1880 for (i = 0; i < 8; i++) 1881 if (flagbits & (1 << i)) 1882 *cp++ = fnames[i]; 1883 1884 return cp; 1885 } 1886 1887 /* Print out an insn with its operands, and update the info->insn_type 1888 fields. The prefix_opcodep and the rest hold a prefix insn that is 1889 supposed to be output as an address mode. */ 1890 1891 static void 1892 print_with_operands (const struct cris_opcode *opcodep, 1893 unsigned int insn, 1894 unsigned char *buffer, 1895 bfd_vma addr, 1896 disassemble_info *info, 1897 /* If a prefix insn was before this insn (and is supposed 1898 to be output as an address), here is a description of 1899 it. */ 1900 const struct cris_opcode *prefix_opcodep, 1901 unsigned int prefix_insn, 1902 unsigned char *prefix_buffer, 1903 bfd_boolean with_reg_prefix) 1904 { 1905 /* Get a buffer of somewhat reasonable size where we store 1906 intermediate parts of the insn. */ 1907 char temp[sizeof (".d [$r13=$r12-2147483648],$r10") * 2]; 1908 char *tp = temp; 1909 static const char mode_char[] = "bwd?"; 1910 const char *s; 1911 const char *cs; 1912 struct cris_disasm_data *disdata 1913 = (struct cris_disasm_data *) info->private_data; 1914 1915 /* Print out the name first thing we do. */ 1916 (*info->fprintf_func) (info->stream, "%s", opcodep->name); 1917 1918 cs = opcodep->args; 1919 s = cs; 1920 1921 /* Ignore any prefix indicator. */ 1922 if (*s == 'p') 1923 s++; 1924 1925 if (*s == 'm' || *s == 'M' || *s == 'z') 1926 { 1927 *tp++ = '.'; 1928 1929 /* Get the size-letter. */ 1930 *tp++ = *s == 'M' 1931 ? (insn & 0x8000 ? 'd' 1932 : insn & 0x4000 ? 'w' : 'b') 1933 : mode_char[(insn >> 4) & (*s == 'z' ? 1 : 3)]; 1934 1935 /* Ignore the size and the space character that follows. */ 1936 s += 2; 1937 } 1938 1939 /* Add a space if this isn't a long-branch, because for those will add 1940 the condition part of the name later. */ 1941 if (opcodep->match != (BRANCH_PC_LOW + BRANCH_INCR_HIGH * 256)) 1942 *tp++ = ' '; 1943 1944 /* Fill in the insn-type if deducible from the name (and there's no 1945 better way). */ 1946 if (opcodep->name[0] == 'j') 1947 { 1948 if (CONST_STRNEQ (opcodep->name, "jsr")) 1949 /* It's "jsr" or "jsrc". */ 1950 info->insn_type = dis_jsr; 1951 else 1952 /* Any other jump-type insn is considered a branch. */ 1953 info->insn_type = dis_branch; 1954 } 1955 1956 /* We might know some more fields right now. */ 1957 info->branch_delay_insns = opcodep->delayed; 1958 1959 /* Handle operands. */ 1960 for (; *s; s++) 1961 { 1962 switch (*s) 1963 { 1964 case 'T': 1965 tp = format_sup_reg ((insn >> 12) & 15, tp, with_reg_prefix); 1966 break; 1967 1968 case 'A': 1969 if (with_reg_prefix) 1970 *tp++ = REGISTER_PREFIX_CHAR; 1971 *tp++ = 'a'; 1972 *tp++ = 'c'; 1973 *tp++ = 'r'; 1974 break; 1975 1976 case '[': 1977 case ']': 1978 case ',': 1979 *tp++ = *s; 1980 break; 1981 1982 case '!': 1983 /* Ignore at this point; used at earlier stages to avoid 1984 recognition if there's a prefix at something that in other 1985 ways looks like a "pop". */ 1986 break; 1987 1988 case 'd': 1989 /* Ignore. This is an optional ".d " on the large one of 1990 relaxable insns. */ 1991 break; 1992 1993 case 'B': 1994 /* This was the prefix that made this a "push". We've already 1995 handled it by recognizing it, so signal that the prefix is 1996 handled by setting it to NULL. */ 1997 prefix_opcodep = NULL; 1998 break; 1999 2000 case 'D': 2001 case 'r': 2002 tp = format_reg (disdata, insn & 15, tp, with_reg_prefix); 2003 break; 2004 2005 case 'R': 2006 tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix); 2007 break; 2008 2009 case 'n': 2010 { 2011 /* Like N but pc-relative to the start of the insn. */ 2012 uint32_t number 2013 = (buffer[2] + buffer[3] * 256 + buffer[4] * 65536 2014 + buffer[5] * 0x1000000 + addr); 2015 2016 /* Finish off and output previous formatted bytes. */ 2017 *tp = 0; 2018 if (temp[0]) 2019 (*info->fprintf_func) (info->stream, "%s", temp); 2020 tp = temp; 2021 2022 (*info->print_address_func) ((bfd_vma) number, info); 2023 } 2024 break; 2025 2026 case 'u': 2027 { 2028 /* Like n but the offset is bits <3:0> in the instruction. */ 2029 unsigned long number = (buffer[0] & 0xf) * 2 + addr; 2030 2031 /* Finish off and output previous formatted bytes. */ 2032 *tp = 0; 2033 if (temp[0]) 2034 (*info->fprintf_func) (info->stream, "%s", temp); 2035 tp = temp; 2036 2037 (*info->print_address_func) ((bfd_vma) number, info); 2038 } 2039 break; 2040 2041 case 'N': 2042 case 'y': 2043 case 'Y': 2044 case 'S': 2045 case 's': 2046 /* Any "normal" memory operand. */ 2047 if ((insn & 0x400) && (insn & 15) == 15 && prefix_opcodep == NULL) 2048 { 2049 /* We're looking at [pc+], i.e. we need to output an immediate 2050 number, where the size can depend on different things. */ 2051 int32_t number; 2052 int signedp 2053 = ((*cs == 'z' && (insn & 0x20)) 2054 || opcodep->match == BDAP_QUICK_OPCODE); 2055 int nbytes; 2056 2057 if (opcodep->imm_oprnd_size == SIZE_FIX_32) 2058 nbytes = 4; 2059 else if (opcodep->imm_oprnd_size == SIZE_SPEC_REG) 2060 { 2061 const struct cris_spec_reg *sregp 2062 = spec_reg_info ((insn >> 12) & 15, disdata->distype); 2063 2064 /* A NULL return should have been as a non-match earlier, 2065 so catch it as an internal error in the error-case 2066 below. */ 2067 if (sregp == NULL) 2068 /* Whatever non-valid size. */ 2069 nbytes = 42; 2070 else 2071 /* PC is always incremented by a multiple of two. 2072 For CRISv32, immediates are always 4 bytes for 2073 special registers. */ 2074 nbytes = disdata->distype == cris_dis_v32 2075 ? 4 : (sregp->reg_size + 1) & ~1; 2076 } 2077 else 2078 { 2079 int mode_size = 1 << ((insn >> 4) & (*cs == 'z' ? 1 : 3)); 2080 2081 if (mode_size == 1) 2082 nbytes = 2; 2083 else 2084 nbytes = mode_size; 2085 } 2086 2087 switch (nbytes) 2088 { 2089 case 1: 2090 number = buffer[2]; 2091 if (signedp && number > 127) 2092 number -= 256; 2093 break; 2094 2095 case 2: 2096 number = buffer[2] + buffer[3] * 256; 2097 if (signedp && number > 32767) 2098 number -= 65536; 2099 break; 2100 2101 case 4: 2102 number 2103 = buffer[2] + buffer[3] * 256 + buffer[4] * 65536 2104 + buffer[5] * 0x1000000; 2105 break; 2106 2107 default: 2108 strcpy (tp, "bug"); 2109 tp += 3; 2110 number = 42; 2111 } 2112 2113 if ((*cs == 'z' && (insn & 0x20)) 2114 || (opcodep->match == BDAP_QUICK_OPCODE 2115 && (nbytes <= 2 || buffer[1 + nbytes] == 0))) 2116 tp = format_dec (number, tp, signedp); 2117 else 2118 { 2119 unsigned int highbyte = (number >> 24) & 0xff; 2120 2121 /* Either output this as an address or as a number. If it's 2122 a dword with the same high-byte as the address of the 2123 insn, assume it's an address, and also if it's a non-zero 2124 non-0xff high-byte. If this is a jsr or a jump, then 2125 it's definitely an address. */ 2126 if (nbytes == 4 2127 && (highbyte == ((addr >> 24) & 0xff) 2128 || (highbyte != 0 && highbyte != 0xff) 2129 || info->insn_type == dis_branch 2130 || info->insn_type == dis_jsr)) 2131 { 2132 /* Finish off and output previous formatted bytes. */ 2133 *tp = 0; 2134 tp = temp; 2135 if (temp[0]) 2136 (*info->fprintf_func) (info->stream, "%s", temp); 2137 2138 (*info->print_address_func) ((bfd_vma) number, info); 2139 2140 info->target = number; 2141 } 2142 else 2143 tp = format_hex (number, tp, disdata); 2144 } 2145 } 2146 else 2147 { 2148 /* Not an immediate number. Then this is a (possibly 2149 prefixed) memory operand. */ 2150 if (info->insn_type != dis_nonbranch) 2151 { 2152 int mode_size 2153 = 1 << ((insn >> 4) 2154 & (opcodep->args[0] == 'z' ? 1 : 3)); 2155 int size; 2156 info->insn_type = dis_dref; 2157 info->flags |= CRIS_DIS_FLAG_MEMREF; 2158 2159 if (opcodep->imm_oprnd_size == SIZE_FIX_32) 2160 size = 4; 2161 else if (opcodep->imm_oprnd_size == SIZE_SPEC_REG) 2162 { 2163 const struct cris_spec_reg *sregp 2164 = spec_reg_info ((insn >> 12) & 15, disdata->distype); 2165 2166 /* FIXME: Improve error handling; should have been caught 2167 earlier. */ 2168 if (sregp == NULL) 2169 size = 4; 2170 else 2171 size = sregp->reg_size; 2172 } 2173 else 2174 size = mode_size; 2175 2176 info->data_size = size; 2177 } 2178 2179 *tp++ = '['; 2180 2181 if (prefix_opcodep 2182 /* We don't match dip with a postincremented field 2183 as a side-effect address mode. */ 2184 && ((insn & 0x400) == 0 2185 || prefix_opcodep->match != DIP_OPCODE)) 2186 { 2187 if (insn & 0x400) 2188 { 2189 tp = format_reg (disdata, insn & 15, tp, with_reg_prefix); 2190 *tp++ = '='; 2191 } 2192 2193 2194 /* We mainly ignore the prefix format string when the 2195 address-mode syntax is output. */ 2196 switch (prefix_opcodep->match) 2197 { 2198 case DIP_OPCODE: 2199 /* It's [r], [r+] or [pc+]. */ 2200 if ((prefix_insn & 0x400) && (prefix_insn & 15) == 15) 2201 { 2202 /* It's [pc+]. This cannot possibly be anything 2203 but an address. */ 2204 uint32_t number 2205 = prefix_buffer[2] + prefix_buffer[3] * 256 2206 + prefix_buffer[4] * 65536 2207 + prefix_buffer[5] * 0x1000000; 2208 2209 info->target = (bfd_vma) number; 2210 2211 /* Finish off and output previous formatted 2212 data. */ 2213 *tp = 0; 2214 tp = temp; 2215 if (temp[0]) 2216 (*info->fprintf_func) (info->stream, "%s", temp); 2217 2218 (*info->print_address_func) ((bfd_vma) number, info); 2219 } 2220 else 2221 { 2222 /* For a memref in an address, we use target2. 2223 In this case, target is zero. */ 2224 info->flags 2225 |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG 2226 | CRIS_DIS_FLAG_MEM_TARGET2_MEM); 2227 2228 info->target2 = prefix_insn & 15; 2229 2230 *tp++ = '['; 2231 tp = format_reg (disdata, prefix_insn & 15, tp, 2232 with_reg_prefix); 2233 if (prefix_insn & 0x400) 2234 *tp++ = '+'; 2235 *tp++ = ']'; 2236 } 2237 break; 2238 2239 case BDAP_QUICK_OPCODE: 2240 { 2241 int number; 2242 2243 number = prefix_buffer[0]; 2244 if (number > 127) 2245 number -= 256; 2246 2247 /* Output "reg+num" or, if num < 0, "reg-num". */ 2248 tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp, 2249 with_reg_prefix); 2250 if (number >= 0) 2251 *tp++ = '+'; 2252 tp = format_dec (number, tp, 1); 2253 2254 info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG; 2255 info->target = (prefix_insn >> 12) & 15; 2256 info->target2 = (bfd_vma) number; 2257 break; 2258 } 2259 2260 case BIAP_OPCODE: 2261 /* Output "r+R.m". */ 2262 tp = format_reg (disdata, prefix_insn & 15, tp, 2263 with_reg_prefix); 2264 *tp++ = '+'; 2265 tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp, 2266 with_reg_prefix); 2267 *tp++ = '.'; 2268 *tp++ = mode_char[(prefix_insn >> 4) & 3]; 2269 2270 info->flags 2271 |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG 2272 | CRIS_DIS_FLAG_MEM_TARGET_IS_REG 2273 2274 | ((prefix_insn & 0x8000) 2275 ? CRIS_DIS_FLAG_MEM_TARGET2_MULT4 2276 : ((prefix_insn & 0x8000) 2277 ? CRIS_DIS_FLAG_MEM_TARGET2_MULT2 : 0))); 2278 2279 /* Is it the casejump? It's a "adds.w [pc+r%d.w],pc". */ 2280 if (insn == 0xf83f && (prefix_insn & ~0xf000) == 0x55f) 2281 /* Then start interpreting data as offsets. */ 2282 case_offset_counter = no_of_case_offsets; 2283 break; 2284 2285 case BDAP_INDIR_OPCODE: 2286 /* Output "r+s.m", or, if "s" is [pc+], "r+s" or 2287 "r-s". */ 2288 tp = format_reg (disdata, (prefix_insn >> 12) & 15, tp, 2289 with_reg_prefix); 2290 2291 if ((prefix_insn & 0x400) && (prefix_insn & 15) == 15) 2292 { 2293 int32_t number; 2294 unsigned int nbytes; 2295 2296 /* It's a value. Get its size. */ 2297 int mode_size = 1 << ((prefix_insn >> 4) & 3); 2298 2299 if (mode_size == 1) 2300 nbytes = 2; 2301 else 2302 nbytes = mode_size; 2303 2304 switch (nbytes) 2305 { 2306 case 1: 2307 number = prefix_buffer[2]; 2308 if (number > 127) 2309 number -= 256; 2310 break; 2311 2312 case 2: 2313 number = prefix_buffer[2] + prefix_buffer[3] * 256; 2314 if (number > 32767) 2315 number -= 65536; 2316 break; 2317 2318 case 4: 2319 number 2320 = prefix_buffer[2] + prefix_buffer[3] * 256 2321 + prefix_buffer[4] * 65536 2322 + prefix_buffer[5] * 0x1000000; 2323 break; 2324 2325 default: 2326 strcpy (tp, "bug"); 2327 tp += 3; 2328 number = 42; 2329 } 2330 2331 info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG; 2332 info->target2 = (bfd_vma) number; 2333 2334 /* If the size is dword, then assume it's an 2335 address. */ 2336 if (nbytes == 4) 2337 { 2338 /* Finish off and output previous formatted 2339 bytes. */ 2340 *tp++ = '+'; 2341 *tp = 0; 2342 tp = temp; 2343 (*info->fprintf_func) (info->stream, "%s", temp); 2344 2345 (*info->print_address_func) ((bfd_vma) number, info); 2346 } 2347 else 2348 { 2349 if (number >= 0) 2350 *tp++ = '+'; 2351 tp = format_dec (number, tp, 1); 2352 } 2353 } 2354 else 2355 { 2356 /* Output "r+[R].m" or "r+[R+].m". */ 2357 *tp++ = '+'; 2358 *tp++ = '['; 2359 tp = format_reg (disdata, prefix_insn & 15, tp, 2360 with_reg_prefix); 2361 if (prefix_insn & 0x400) 2362 *tp++ = '+'; 2363 *tp++ = ']'; 2364 *tp++ = '.'; 2365 *tp++ = mode_char[(prefix_insn >> 4) & 3]; 2366 2367 info->flags 2368 |= (CRIS_DIS_FLAG_MEM_TARGET2_IS_REG 2369 | CRIS_DIS_FLAG_MEM_TARGET2_MEM 2370 | CRIS_DIS_FLAG_MEM_TARGET_IS_REG 2371 2372 | (((prefix_insn >> 4) == 2) 2373 ? 0 2374 : (((prefix_insn >> 4) & 3) == 1 2375 ? CRIS_DIS_FLAG_MEM_TARGET2_MEM_WORD 2376 : CRIS_DIS_FLAG_MEM_TARGET2_MEM_BYTE))); 2377 } 2378 break; 2379 2380 default: 2381 (*info->fprintf_func) (info->stream, "?prefix-bug"); 2382 } 2383 2384 /* To mark that the prefix is used, reset it. */ 2385 prefix_opcodep = NULL; 2386 } 2387 else 2388 { 2389 tp = format_reg (disdata, insn & 15, tp, with_reg_prefix); 2390 2391 info->flags |= CRIS_DIS_FLAG_MEM_TARGET_IS_REG; 2392 info->target = insn & 15; 2393 2394 if (insn & 0x400) 2395 *tp++ = '+'; 2396 } 2397 *tp++ = ']'; 2398 } 2399 break; 2400 2401 case 'x': 2402 tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix); 2403 *tp++ = '.'; 2404 *tp++ = mode_char[(insn >> 4) & 3]; 2405 break; 2406 2407 case 'I': 2408 tp = format_dec (insn & 63, tp, 0); 2409 break; 2410 2411 case 'b': 2412 { 2413 int where = buffer[2] + buffer[3] * 256; 2414 2415 if (where > 32767) 2416 where -= 65536; 2417 2418 where += addr + ((disdata->distype == cris_dis_v32) ? 0 : 4); 2419 2420 if (insn == BA_PC_INCR_OPCODE) 2421 info->insn_type = dis_branch; 2422 else 2423 info->insn_type = dis_condbranch; 2424 2425 info->target = (bfd_vma) where; 2426 2427 *tp = 0; 2428 tp = temp; 2429 (*info->fprintf_func) (info->stream, "%s%s ", 2430 temp, cris_cc_strings[insn >> 12]); 2431 2432 (*info->print_address_func) ((bfd_vma) where, info); 2433 } 2434 break; 2435 2436 case 'c': 2437 tp = format_dec (insn & 31, tp, 0); 2438 break; 2439 2440 case 'C': 2441 tp = format_dec (insn & 15, tp, 0); 2442 break; 2443 2444 case 'o': 2445 { 2446 long offset = insn & 0xfe; 2447 bfd_vma target; 2448 2449 if (insn & 1) 2450 offset |= ~0xff; 2451 2452 if (opcodep->match == BA_QUICK_OPCODE) 2453 info->insn_type = dis_branch; 2454 else 2455 info->insn_type = dis_condbranch; 2456 2457 target = addr + ((disdata->distype == cris_dis_v32) ? 0 : 2) + offset; 2458 info->target = target; 2459 *tp = 0; 2460 tp = temp; 2461 (*info->fprintf_func) (info->stream, "%s", temp); 2462 (*info->print_address_func) (target, info); 2463 } 2464 break; 2465 2466 case 'Q': 2467 case 'O': 2468 { 2469 long number = buffer[0]; 2470 2471 if (number > 127) 2472 number = number - 256; 2473 2474 tp = format_dec (number, tp, 1); 2475 *tp++ = ','; 2476 tp = format_reg (disdata, (insn >> 12) & 15, tp, with_reg_prefix); 2477 } 2478 break; 2479 2480 case 'f': 2481 tp = print_flags (disdata, insn, tp); 2482 break; 2483 2484 case 'i': 2485 tp = format_dec ((insn & 32) ? (insn & 31) | ~31L : insn & 31, tp, 1); 2486 break; 2487 2488 case 'P': 2489 { 2490 const struct cris_spec_reg *sregp 2491 = spec_reg_info ((insn >> 12) & 15, disdata->distype); 2492 2493 if (sregp == NULL || sregp->name == NULL) 2494 /* Should have been caught as a non-match earlier. */ 2495 *tp++ = '?'; 2496 else 2497 { 2498 if (with_reg_prefix) 2499 *tp++ = REGISTER_PREFIX_CHAR; 2500 strcpy (tp, sregp->name); 2501 tp += strlen (tp); 2502 } 2503 } 2504 break; 2505 2506 default: 2507 strcpy (tp, "???"); 2508 tp += 3; 2509 } 2510 } 2511 2512 *tp = 0; 2513 2514 if (prefix_opcodep) 2515 (*info->fprintf_func) (info->stream, " (OOPS unused prefix \"%s: %s\")", 2516 prefix_opcodep->name, prefix_opcodep->args); 2517 2518 (*info->fprintf_func) (info->stream, "%s", temp); 2519 2520 /* Get info for matching case-tables, if we don't have any active. 2521 We assume that the last constant seen is used; either in the insn 2522 itself or in a "move.d const,rN, sub.d rN,rM"-like sequence. */ 2523 if (TRACE_CASE && case_offset_counter == 0) 2524 { 2525 if (CONST_STRNEQ (opcodep->name, "sub")) 2526 case_offset = last_immediate; 2527 2528 /* It could also be an "add", if there are negative case-values. */ 2529 else if (CONST_STRNEQ (opcodep->name, "add")) 2530 /* The first case is the negated operand to the add. */ 2531 case_offset = -last_immediate; 2532 2533 /* A bound insn will tell us the number of cases. */ 2534 else if (CONST_STRNEQ (opcodep->name, "bound")) 2535 no_of_case_offsets = last_immediate + 1; 2536 2537 /* A jump or jsr or branch breaks the chain of insns for a 2538 case-table, so assume default first-case again. */ 2539 else if (info->insn_type == dis_jsr 2540 || info->insn_type == dis_branch 2541 || info->insn_type == dis_condbranch) 2542 case_offset = 0; 2543 } 2544 } 2545 2546 2547 /* Print the CRIS instruction at address memaddr on stream. Returns 2548 length of the instruction, in bytes. Prefix register names with `$' if 2549 WITH_REG_PREFIX. */ 2550 2551 static int 2552 print_insn_cris_generic (bfd_vma memaddr, 2553 disassemble_info *info, 2554 bfd_boolean with_reg_prefix) 2555 { 2556 int nbytes; 2557 unsigned int insn; 2558 const struct cris_opcode *matchedp; 2559 int advance = 0; 2560 struct cris_disasm_data *disdata 2561 = (struct cris_disasm_data *) info->private_data; 2562 2563 /* No instruction will be disassembled as longer than this number of 2564 bytes; stacked prefixes will not be expanded. */ 2565 unsigned char buffer[MAX_BYTES_PER_CRIS_INSN]; 2566 unsigned char *bufp; 2567 int status = 0; 2568 bfd_vma addr; 2569 2570 /* There will be an "out of range" error after the last instruction. 2571 Reading pairs of bytes in decreasing number, we hope that we will get 2572 at least the amount that we will consume. 2573 2574 If we can't get any data, or we do not get enough data, we print 2575 the error message. */ 2576 2577 nbytes = info->buffer_length ? info->buffer_length 2578 : MAX_BYTES_PER_CRIS_INSN; 2579 nbytes = MIN(nbytes, MAX_BYTES_PER_CRIS_INSN); 2580 status = (*info->read_memory_func) (memaddr, buffer, nbytes, info); 2581 2582 /* If we did not get all we asked for, then clear the rest. 2583 Hopefully this makes a reproducible result in case of errors. */ 2584 if (nbytes != MAX_BYTES_PER_CRIS_INSN) 2585 memset (buffer + nbytes, 0, MAX_BYTES_PER_CRIS_INSN - nbytes); 2586 2587 addr = memaddr; 2588 bufp = buffer; 2589 2590 /* Set some defaults for the insn info. */ 2591 info->insn_info_valid = 1; 2592 info->branch_delay_insns = 0; 2593 info->data_size = 0; 2594 info->insn_type = dis_nonbranch; 2595 info->flags = 0; 2596 info->target = 0; 2597 info->target2 = 0; 2598 2599 /* If we got any data, disassemble it. */ 2600 if (nbytes != 0) 2601 { 2602 matchedp = NULL; 2603 2604 insn = bufp[0] + bufp[1] * 256; 2605 2606 /* If we're in a case-table, don't disassemble the offsets. */ 2607 if (TRACE_CASE && case_offset_counter != 0) 2608 { 2609 info->insn_type = dis_noninsn; 2610 advance += 2; 2611 2612 /* If to print data as offsets, then shortcut here. */ 2613 (*info->fprintf_func) (info->stream, "case %ld%s: -> ", 2614 case_offset + no_of_case_offsets 2615 - case_offset_counter, 2616 case_offset_counter == 1 ? "/default" : 2617 ""); 2618 2619 (*info->print_address_func) ((bfd_vma) 2620 ((short) (insn) 2621 + (long) (addr 2622 - (no_of_case_offsets 2623 - case_offset_counter) 2624 * 2)), info); 2625 case_offset_counter--; 2626 2627 /* The default case start (without a "sub" or "add") must be 2628 zero. */ 2629 if (case_offset_counter == 0) 2630 case_offset = 0; 2631 } 2632 else if (insn == 0) 2633 { 2634 /* We're often called to disassemble zeroes. While this is a 2635 valid "bcc .+2" insn, it is also useless enough and enough 2636 of a nuiscance that we will just output "bcc .+2" for it 2637 and signal it as a noninsn. */ 2638 (*info->fprintf_func) (info->stream, 2639 disdata->distype == cris_dis_v32 2640 ? "bcc ." : "bcc .+2"); 2641 info->insn_type = dis_noninsn; 2642 advance += 2; 2643 } 2644 else 2645 { 2646 const struct cris_opcode *prefix_opcodep = NULL; 2647 unsigned char *prefix_buffer = bufp; 2648 unsigned int prefix_insn = insn; 2649 int prefix_size = 0; 2650 2651 matchedp = get_opcode_entry (insn, NO_CRIS_PREFIX, disdata); 2652 2653 /* Check if we're supposed to write out prefixes as address 2654 modes and if this was a prefix. */ 2655 if (matchedp != NULL && PARSE_PREFIX && matchedp->args[0] == 'p') 2656 { 2657 /* If it's a prefix, put it into the prefix vars and get the 2658 main insn. */ 2659 prefix_size = bytes_to_skip (prefix_insn, matchedp, 2660 disdata->distype, NULL); 2661 prefix_opcodep = matchedp; 2662 2663 insn = bufp[prefix_size] + bufp[prefix_size + 1] * 256; 2664 matchedp = get_opcode_entry (insn, prefix_insn, disdata); 2665 2666 if (matchedp != NULL) 2667 { 2668 addr += prefix_size; 2669 bufp += prefix_size; 2670 advance += prefix_size; 2671 } 2672 else 2673 { 2674 /* The "main" insn wasn't valid, at least not when 2675 prefixed. Put back things enough to output the 2676 prefix insn only, as a normal insn. */ 2677 matchedp = prefix_opcodep; 2678 insn = prefix_insn; 2679 prefix_opcodep = NULL; 2680 } 2681 } 2682 2683 if (matchedp == NULL) 2684 { 2685 (*info->fprintf_func) (info->stream, "??0x%x", insn); 2686 advance += 2; 2687 2688 info->insn_type = dis_noninsn; 2689 } 2690 else 2691 { 2692 advance 2693 += bytes_to_skip (insn, matchedp, disdata->distype, 2694 prefix_opcodep); 2695 2696 /* The info_type and assorted fields will be set according 2697 to the operands. */ 2698 print_with_operands (matchedp, insn, bufp, addr, info, 2699 prefix_opcodep, prefix_insn, 2700 prefix_buffer, with_reg_prefix); 2701 } 2702 } 2703 } 2704 else 2705 info->insn_type = dis_noninsn; 2706 2707 /* If we read less than MAX_BYTES_PER_CRIS_INSN, i.e. we got an error 2708 status when reading that much, and the insn decoding indicated a 2709 length exceeding what we read, there is an error. */ 2710 if (status != 0 && (nbytes == 0 || advance > nbytes)) 2711 { 2712 (*info->memory_error_func) (status, memaddr, info); 2713 return -1; 2714 } 2715 2716 /* Max supported insn size with one folded prefix insn. */ 2717 info->bytes_per_line = MAX_BYTES_PER_CRIS_INSN; 2718 2719 /* I would like to set this to a fixed value larger than the actual 2720 number of bytes to print in order to avoid spaces between bytes, 2721 but objdump.c (2.9.1) does not like that, so we print 16-bit 2722 chunks, which is the next choice. */ 2723 info->bytes_per_chunk = 2; 2724 2725 /* Printing bytes in order of increasing addresses makes sense, 2726 especially on a little-endian target. 2727 This is completely the opposite of what you think; setting this to 2728 BFD_ENDIAN_LITTLE will print bytes in order N..0 rather than the 0..N 2729 we want. */ 2730 info->display_endian = BFD_ENDIAN_BIG; 2731 2732 return advance; 2733 } 2734 2735 /* Disassemble, prefixing register names with `$'. CRIS v0..v10. */ 2736 static int 2737 print_insn_cris_with_register_prefix (bfd_vma vma, 2738 disassemble_info *info) 2739 { 2740 if (info->private_data == NULL 2741 && !cris_parse_disassembler_options (info, cris_dis_v0_v10)) 2742 return -1; 2743 return print_insn_cris_generic (vma, info, true); 2744 } 2745 /* Disassemble, prefixing register names with `$'. CRIS v32. */ 2746 2747 static int 2748 print_insn_crisv32_with_register_prefix (bfd_vma vma, 2749 disassemble_info *info) 2750 { 2751 if (info->private_data == NULL 2752 && !cris_parse_disassembler_options (info, cris_dis_v32)) 2753 return -1; 2754 return print_insn_cris_generic (vma, info, true); 2755 } 2756 2757 #if 0 2758 /* Disassemble, prefixing register names with `$'. 2759 Common v10 and v32 subset. */ 2760 2761 static int 2762 print_insn_crisv10_v32_with_register_prefix (bfd_vma vma, 2763 disassemble_info *info) 2764 { 2765 if (info->private_data == NULL 2766 && !cris_parse_disassembler_options (info, cris_dis_common_v10_v32)) 2767 return -1; 2768 return print_insn_cris_generic (vma, info, true); 2769 } 2770 2771 /* Disassemble, no prefixes on register names. CRIS v0..v10. */ 2772 2773 static int 2774 print_insn_cris_without_register_prefix (bfd_vma vma, 2775 disassemble_info *info) 2776 { 2777 if (info->private_data == NULL 2778 && !cris_parse_disassembler_options (info, cris_dis_v0_v10)) 2779 return -1; 2780 return print_insn_cris_generic (vma, info, false); 2781 } 2782 2783 /* Disassemble, no prefixes on register names. CRIS v32. */ 2784 2785 static int 2786 print_insn_crisv32_without_register_prefix (bfd_vma vma, 2787 disassemble_info *info) 2788 { 2789 if (info->private_data == NULL 2790 && !cris_parse_disassembler_options (info, cris_dis_v32)) 2791 return -1; 2792 return print_insn_cris_generic (vma, info, false); 2793 } 2794 2795 /* Disassemble, no prefixes on register names. 2796 Common v10 and v32 subset. */ 2797 2798 static int 2799 print_insn_crisv10_v32_without_register_prefix (bfd_vma vma, 2800 disassemble_info *info) 2801 { 2802 if (info->private_data == NULL 2803 && !cris_parse_disassembler_options (info, cris_dis_common_v10_v32)) 2804 return -1; 2805 return print_insn_cris_generic (vma, info, false); 2806 } 2807 #endif 2808 2809 int 2810 print_insn_crisv10 (bfd_vma vma, 2811 disassemble_info *info) 2812 { 2813 return print_insn_cris_with_register_prefix(vma, info); 2814 } 2815 2816 int 2817 print_insn_crisv32 (bfd_vma vma, 2818 disassemble_info *info) 2819 { 2820 return print_insn_crisv32_with_register_prefix(vma, info); 2821 } 2822 2823 /* Return a disassembler-function that prints registers with a `$' prefix, 2824 or one that prints registers without a prefix. 2825 FIXME: We should improve the solution to avoid the multitude of 2826 functions seen above. */ 2827 #if 0 2828 disassembler_ftype 2829 cris_get_disassembler (bfd *abfd) 2830 { 2831 /* If there's no bfd in sight, we return what is valid as input in all 2832 contexts if fed back to the assembler: disassembly *with* register 2833 prefix. Unfortunately this will be totally wrong for v32. */ 2834 if (abfd == NULL) 2835 return print_insn_cris_with_register_prefix; 2836 2837 if (bfd_get_symbol_leading_char (abfd) == 0) 2838 { 2839 if (bfd_get_mach (abfd) == bfd_mach_cris_v32) 2840 return print_insn_crisv32_with_register_prefix; 2841 if (bfd_get_mach (abfd) == bfd_mach_cris_v10_v32) 2842 return print_insn_crisv10_v32_with_register_prefix; 2843 2844 /* We default to v10. This may be specifically specified in the 2845 bfd mach, but is also the default setting. */ 2846 return print_insn_cris_with_register_prefix; 2847 } 2848 2849 if (bfd_get_mach (abfd) == bfd_mach_cris_v32) 2850 return print_insn_crisv32_without_register_prefix; 2851 if (bfd_get_mach (abfd) == bfd_mach_cris_v10_v32) 2852 return print_insn_crisv10_v32_without_register_prefix; 2853 return print_insn_cris_without_register_prefix; 2854 } 2855 #endif 2856 /* Local variables: 2857 eval: (c-set-style "gnu") 2858 indent-tabs-mode: t 2859 End: */ 2860