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