1 /* tc-m68k.c -- Assemble for the m68k family 2 Copyright (C) 1987-2016 Free Software Foundation, Inc. 3 4 This file is part of GAS, the GNU Assembler. 5 6 GAS is free software; you can redistribute it and/or modify 7 it under the terms of the GNU General Public License as published by 8 the Free Software Foundation; either version 3, or (at your option) 9 any later version. 10 11 GAS is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 GNU General Public License for more details. 15 16 You should have received a copy of the GNU General Public License 17 along with GAS; see the file COPYING. If not, write to the Free 18 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 19 02110-1301, USA. */ 20 21 #include "as.h" 22 #include "safe-ctype.h" 23 #include "obstack.h" 24 #include "subsegs.h" 25 #include "dwarf2dbg.h" 26 #include "dw2gencfi.h" 27 28 #include "opcode/m68k.h" 29 #include "m68k-parse.h" 30 31 #if defined (OBJ_ELF) 32 #include "elf/m68k.h" 33 #endif 34 35 #ifdef M68KCOFF 36 #include "obj-coff.h" 37 #endif 38 39 #ifdef OBJ_ELF 40 static void m68k_elf_cons (int); 41 #endif 42 43 /* This string holds the chars that always start a comment. If the 44 pre-processor is disabled, these aren't very useful. The macro 45 tc_comment_chars points to this. We use this, rather than the 46 usual comment_chars, so that the --bitwise-or option will work. */ 47 #if defined (TE_SVR4) || defined (TE_DELTA) 48 const char *m68k_comment_chars = "|#"; 49 #else 50 const char *m68k_comment_chars = "|"; 51 #endif 52 53 /* This array holds the chars that only start a comment at the beginning of 54 a line. If the line seems to have the form '# 123 filename' 55 .line and .file directives will appear in the pre-processed output */ 56 /* Note that input_file.c hand checks for '#' at the beginning of the 57 first line of the input file. This is because the compiler outputs 58 #NO_APP at the beginning of its output. */ 59 /* Also note that comments like this one will always work. */ 60 const char line_comment_chars[] = "#*"; 61 62 const char line_separator_chars[] = ";"; 63 64 /* Chars that can be used to separate mant from exp in floating point nums. */ 65 const char EXP_CHARS[] = "eE"; 66 67 /* Chars that mean this number is a floating point constant, as 68 in "0f12.456" or "0d1.2345e12". */ 69 70 const char FLT_CHARS[] = "rRsSfFdDxXeEpP"; 71 72 /* Also be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be 73 changed in read.c . Ideally it shouldn't have to know about it at all, 74 but nothing is ideal around here. */ 75 76 /* Are we trying to generate PIC code? If so, absolute references 77 ought to be made into linkage table references or pc-relative 78 references. Not implemented. For ELF there are other means 79 to denote pic relocations. */ 80 int flag_want_pic; 81 82 static int flag_short_refs; /* -l option. */ 83 static int flag_long_jumps; /* -S option. */ 84 static int flag_keep_pcrel; /* --pcrel option. */ 85 86 #ifdef REGISTER_PREFIX_OPTIONAL 87 int flag_reg_prefix_optional = REGISTER_PREFIX_OPTIONAL; 88 #else 89 int flag_reg_prefix_optional; 90 #endif 91 92 /* Whether --register-prefix-optional was used on the command line. */ 93 static int reg_prefix_optional_seen; 94 95 /* The floating point coprocessor to use by default. */ 96 static enum m68k_register m68k_float_copnum = COP1; 97 98 /* If this is non-zero, then references to number(%pc) will be taken 99 to refer to number, rather than to %pc + number. */ 100 static int m68k_abspcadd; 101 102 /* If this is non-zero, then the quick forms of the move, add, and sub 103 instructions are used when possible. */ 104 static int m68k_quick = 1; 105 106 /* If this is non-zero, then if the size is not specified for a base 107 or outer displacement, the assembler assumes that the size should 108 be 32 bits. */ 109 static int m68k_rel32 = 1; 110 111 /* This is non-zero if m68k_rel32 was set from the command line. */ 112 static int m68k_rel32_from_cmdline; 113 114 /* The default width to use for an index register when using a base 115 displacement. */ 116 static enum m68k_size m68k_index_width_default = SIZE_LONG; 117 118 /* We want to warn if any text labels are misaligned. In order to get 119 the right line number, we need to record the line number for each 120 label. */ 121 struct label_line 122 { 123 struct label_line *next; 124 symbolS *label; 125 const char *file; 126 unsigned int line; 127 int text; 128 }; 129 130 /* The list of labels. */ 131 132 static struct label_line *labels; 133 134 /* The current label. */ 135 136 static struct label_line *current_label; 137 138 /* Pointer to list holding the opcodes sorted by name. */ 139 static struct m68k_opcode const ** m68k_sorted_opcodes; 140 141 /* Its an arbitrary name: This means I don't approve of it. 142 See flames below. */ 143 static struct obstack robyn; 144 145 struct m68k_incant 146 { 147 const char *m_operands; 148 unsigned long m_opcode; 149 short m_opnum; 150 short m_codenum; 151 int m_arch; 152 struct m68k_incant *m_next; 153 }; 154 155 #define getone(x) ((((x)->m_opcode)>>16)&0xffff) 156 #define gettwo(x) (((x)->m_opcode)&0xffff) 157 158 static const enum m68k_register m68000_ctrl[] = { 0 }; 159 static const enum m68k_register m68010_ctrl[] = { 160 SFC, DFC, USP, VBR, 161 0 162 }; 163 static const enum m68k_register m68020_ctrl[] = { 164 SFC, DFC, USP, VBR, CACR, CAAR, MSP, ISP, 165 0 166 }; 167 static const enum m68k_register m68040_ctrl[] = { 168 SFC, DFC, CACR, TC, ITT0, ITT1, DTT0, DTT1, 169 USP, VBR, MSP, ISP, MMUSR, URP, SRP, 170 0 171 }; 172 static const enum m68k_register m68060_ctrl[] = { 173 SFC, DFC, CACR, TC, ITT0, ITT1, DTT0, DTT1, BUSCR, 174 USP, VBR, URP, SRP, PCR, 175 0 176 }; 177 static const enum m68k_register mcf_ctrl[] = { 178 CACR, TC, ACR0, ACR1, ACR2, ACR3, VBR, ROMBAR, 179 RAMBAR0, RAMBAR1, RAMBAR, MBAR, 180 0 181 }; 182 static const enum m68k_register mcf51_ctrl[] = { 183 VBR, CPUCR, 184 0 185 }; 186 static const enum m68k_register mcf5206_ctrl[] = { 187 CACR, ACR0, ACR1, VBR, RAMBAR0, RAMBAR_ALT, MBAR, 188 0 189 }; 190 static const enum m68k_register mcf5208_ctrl[] = { 191 CACR, ACR0, ACR1, VBR, RAMBAR, RAMBAR1, 192 0 193 }; 194 static const enum m68k_register mcf5210a_ctrl[] = { 195 VBR, CACR, ACR0, ACR1, ROMBAR, RAMBAR, RAMBAR1, MBAR, 196 0 197 }; 198 static const enum m68k_register mcf5213_ctrl[] = { 199 VBR, RAMBAR, RAMBAR1, FLASHBAR, 200 0 201 }; 202 static const enum m68k_register mcf5216_ctrl[] = { 203 VBR, CACR, ACR0, ACR1, FLASHBAR, RAMBAR, RAMBAR1, 204 0 205 }; 206 static const enum m68k_register mcf5221x_ctrl[] = { 207 VBR, FLASHBAR, RAMBAR, RAMBAR1, 208 0 209 }; 210 static const enum m68k_register mcf52223_ctrl[] = { 211 VBR, FLASHBAR, RAMBAR, RAMBAR1, 212 0 213 }; 214 static const enum m68k_register mcf52235_ctrl[] = { 215 VBR, FLASHBAR, RAMBAR, RAMBAR1, 216 0 217 }; 218 static const enum m68k_register mcf5225_ctrl[] = { 219 VBR, CACR, ACR0, ACR1, FLASHBAR, RAMBAR, MBAR, RAMBAR1, 220 0 221 }; 222 static const enum m68k_register mcf52259_ctrl[] = { 223 VBR, FLASHBAR, RAMBAR, RAMBAR1, 224 0 225 }; 226 static const enum m68k_register mcf52277_ctrl[] = { 227 VBR, CACR, ACR0, ACR1, RAMBAR, RAMBAR1, 228 0 229 }; 230 static const enum m68k_register mcf5235_ctrl[] = { 231 VBR, CACR, ACR0, ACR1, RAMBAR, RAMBAR1, 232 0 233 }; 234 static const enum m68k_register mcf5249_ctrl[] = { 235 VBR, CACR, ACR0, ACR1, RAMBAR0, RAMBAR1, RAMBAR, MBAR, MBAR2, 236 0 237 }; 238 static const enum m68k_register mcf5250_ctrl[] = { 239 VBR, 240 0 241 }; 242 static const enum m68k_register mcf5253_ctrl[] = { 243 VBR, CACR, ACR0, ACR1, RAMBAR0, RAMBAR1, RAMBAR, MBAR, MBAR2, 244 0 245 }; 246 static const enum m68k_register mcf5271_ctrl[] = { 247 VBR, CACR, ACR0, ACR1, RAMBAR, RAMBAR1, 248 0 249 }; 250 static const enum m68k_register mcf5272_ctrl[] = { 251 VBR, CACR, ACR0, ACR1, ROMBAR, RAMBAR_ALT, RAMBAR0, MBAR, 252 0 253 }; 254 static const enum m68k_register mcf5275_ctrl[] = { 255 VBR, CACR, ACR0, ACR1, RAMBAR, RAMBAR1, 256 0 257 }; 258 static const enum m68k_register mcf5282_ctrl[] = { 259 VBR, CACR, ACR0, ACR1, FLASHBAR, RAMBAR, RAMBAR1, 260 0 261 }; 262 static const enum m68k_register mcf53017_ctrl[] = { 263 VBR, CACR, ACR0, ACR1, RAMBAR, RAMBAR1, 264 0 265 }; 266 static const enum m68k_register mcf5307_ctrl[] = { 267 VBR, CACR, ACR0, ACR1, RAMBAR0, RAMBAR_ALT, MBAR, 268 0 269 }; 270 static const enum m68k_register mcf5329_ctrl[] = { 271 VBR, CACR, ACR0, ACR1, RAMBAR, RAMBAR1, 272 0 273 }; 274 static const enum m68k_register mcf5373_ctrl[] = { 275 VBR, CACR, ACR0, ACR1, RAMBAR, RAMBAR1, 276 0 277 }; 278 static const enum m68k_register mcfv4e_ctrl[] = { 279 CACR, ASID, ACR0, ACR1, ACR2, ACR3, MMUBAR, 280 VBR, PC, ROMBAR0, ROMBAR1, RAMBAR0, RAMBAR1, 281 MBAR, SECMBAR, 282 MPCR /* Multiprocessor Control register */, 283 EDRAMBAR /* Embedded DRAM Base Address Register */, 284 /* Permutation control registers. */ 285 PCR1U0, PCR1L0, PCR1U1, PCR1L1, PCR2U0, PCR2L0, PCR2U1, PCR2L1, 286 PCR3U0, PCR3L0, PCR3U1, PCR3L1, 287 /* Legacy names */ 288 TC /* ASID */, BUSCR /* MMUBAR */, 289 ITT0 /* ACR0 */, ITT1 /* ACR1 */, DTT0 /* ACR2 */, DTT1 /* ACR3 */, 290 MBAR1 /* MBAR */, MBAR2 /* SECMBAR */, MBAR0 /* SECMBAR */, 291 ROMBAR /* ROMBAR0 */, RAMBAR /* RAMBAR1 */, 292 0 293 }; 294 static const enum m68k_register mcf5407_ctrl[] = { 295 CACR, ASID, ACR0, ACR1, ACR2, ACR3, 296 VBR, PC, RAMBAR0, RAMBAR1, MBAR, 297 /* Legacy names */ 298 TC /* ASID */, 299 ITT0 /* ACR0 */, ITT1 /* ACR1 */, DTT0 /* ACR2 */, DTT1 /* ACR3 */, 300 MBAR1 /* MBAR */, RAMBAR /* RAMBAR1 */, 301 0 302 }; 303 static const enum m68k_register mcf54418_ctrl[] = { 304 CACR, ASID, ACR0, ACR1, ACR2, ACR3, ACR4, ACR5, ACR6, ACR7, MMUBAR, RGPIOBAR, 305 VBR, PC, RAMBAR1, 306 /* Legacy names */ 307 TC /* ASID */, BUSCR /* MMUBAR */, 308 ITT0 /* ACR0 */, ITT1 /* ACR1 */, DTT0 /* ACR2 */, DTT1 /* ACR3 */, 309 RAMBAR /* RAMBAR1 */, 310 0 311 }; 312 static const enum m68k_register mcf54455_ctrl[] = { 313 CACR, ASID, ACR0, ACR1, ACR2, ACR3, MMUBAR, 314 VBR, PC, RAMBAR1, 315 /* Legacy names */ 316 TC /* ASID */, BUSCR /* MMUBAR */, 317 ITT0 /* ACR0 */, ITT1 /* ACR1 */, DTT0 /* ACR2 */, DTT1 /* ACR3 */, 318 RAMBAR /* RAMBAR1 */, 319 0 320 }; 321 static const enum m68k_register mcf5475_ctrl[] = { 322 CACR, ASID, ACR0, ACR1, ACR2, ACR3, MMUBAR, 323 VBR, PC, RAMBAR0, RAMBAR1, MBAR, 324 /* Legacy names */ 325 TC /* ASID */, BUSCR /* MMUBAR */, 326 ITT0 /* ACR0 */, ITT1 /* ACR1 */, DTT0 /* ACR2 */, DTT1 /* ACR3 */, 327 MBAR1 /* MBAR */, RAMBAR /* RAMBAR1 */, 328 0 329 }; 330 static const enum m68k_register mcf5485_ctrl[] = { 331 CACR, ASID, ACR0, ACR1, ACR2, ACR3, MMUBAR, 332 VBR, PC, RAMBAR0, RAMBAR1, MBAR, 333 /* Legacy names */ 334 TC /* ASID */, BUSCR /* MMUBAR */, 335 ITT0 /* ACR0 */, ITT1 /* ACR1 */, DTT0 /* ACR2 */, DTT1 /* ACR3 */, 336 MBAR1 /* MBAR */, RAMBAR /* RAMBAR1 */, 337 0 338 }; 339 static const enum m68k_register fido_ctrl[] = { 340 SFC, DFC, USP, VBR, CAC, MBO, 341 0 342 }; 343 #define cpu32_ctrl m68010_ctrl 344 345 static const enum m68k_register *control_regs; 346 347 /* Internal form of a 68020 instruction. */ 348 struct m68k_it 349 { 350 const char *error; 351 const char *args; /* List of opcode info. */ 352 int numargs; 353 354 int numo; /* Number of shorts in opcode. */ 355 short opcode[11]; 356 357 struct m68k_op operands[6]; 358 359 int nexp; /* Number of exprs in use. */ 360 struct m68k_exp exprs[4]; 361 362 int nfrag; /* Number of frags we have to produce. */ 363 struct 364 { 365 int fragoff; /* Where in the current opcode the frag ends. */ 366 symbolS *fadd; 367 offsetT foff; 368 int fragty; 369 } 370 fragb[4]; 371 372 int nrel; /* Num of reloc strucs in use. */ 373 struct 374 { 375 int n; 376 expressionS exp; 377 char wid; 378 char pcrel; 379 /* In a pc relative address the difference between the address 380 of the offset and the address that the offset is relative 381 to. This depends on the addressing mode. Basically this 382 is the value to put in the offset field to address the 383 first byte of the offset, without regarding the special 384 significance of some values (in the branch instruction, for 385 example). */ 386 int pcrel_fix; 387 #ifdef OBJ_ELF 388 /* Whether this expression needs special pic relocation, and if 389 so, which. */ 390 enum pic_relocation pic_reloc; 391 #endif 392 } 393 reloc[5]; /* Five is enough??? */ 394 }; 395 396 #define cpu_of_arch(x) ((x) & (m68000up | mcfisa_a | fido_a)) 397 #define float_of_arch(x) ((x) & mfloat) 398 #define mmu_of_arch(x) ((x) & mmmu) 399 #define arch_coldfire_p(x) ((x) & mcfisa_a) 400 #define arch_coldfire_fpu(x) ((x) & cfloat) 401 402 /* Macros for determining if cpu supports a specific addressing mode. */ 403 #define HAVE_LONG_DISP(x) \ 404 ((x) & (m68020|m68030|m68040|m68060|cpu32|fido_a|mcfisa_b|mcfisa_c)) 405 #define HAVE_LONG_CALL(x) \ 406 ((x) & (m68020|m68030|m68040|m68060|cpu32|fido_a|mcfisa_b|mcfisa_c)) 407 #define HAVE_LONG_COND(x) \ 408 ((x) & (m68020|m68030|m68040|m68060|cpu32|fido_a|mcfisa_b|mcfisa_c)) 409 #define HAVE_LONG_BRANCH(x) \ 410 ((x) & (m68020|m68030|m68040|m68060|cpu32|fido_a|mcfisa_b)) 411 #define LONG_BRANCH_VIA_COND(x) (HAVE_LONG_COND(x) && !HAVE_LONG_BRANCH(x)) 412 413 static struct m68k_it the_ins; /* The instruction being assembled. */ 414 415 #define op(ex) ((ex)->exp.X_op) 416 #define adds(ex) ((ex)->exp.X_add_symbol) 417 #define subs(ex) ((ex)->exp.X_op_symbol) 418 #define offs(ex) ((ex)->exp.X_add_number) 419 420 /* Macros for adding things to the m68k_it struct. */ 421 #define addword(w) (the_ins.opcode[the_ins.numo++] = (w)) 422 423 /* Like addword, but goes BEFORE general operands. */ 424 425 static void 426 insop (int w, const struct m68k_incant *opcode) 427 { 428 int z; 429 for (z = the_ins.numo; z > opcode->m_codenum; --z) 430 the_ins.opcode[z] = the_ins.opcode[z - 1]; 431 for (z = 0; z < the_ins.nrel; z++) 432 the_ins.reloc[z].n += 2; 433 for (z = 0; z < the_ins.nfrag; z++) 434 the_ins.fragb[z].fragoff++; 435 the_ins.opcode[opcode->m_codenum] = w; 436 the_ins.numo++; 437 } 438 439 /* The numo+1 kludge is so we can hit the low order byte of the prev word. 440 Blecch. */ 441 static void 442 add_fix (int width, struct m68k_exp *exp, int pc_rel, int pc_fix) 443 { 444 the_ins.reloc[the_ins.nrel].n = (width == 'B' || width == '3' 445 ? the_ins.numo * 2 - 1 446 : (width == 'b' 447 ? the_ins.numo * 2 + 1 448 : the_ins.numo * 2)); 449 the_ins.reloc[the_ins.nrel].exp = exp->exp; 450 the_ins.reloc[the_ins.nrel].wid = width; 451 the_ins.reloc[the_ins.nrel].pcrel_fix = pc_fix; 452 #ifdef OBJ_ELF 453 the_ins.reloc[the_ins.nrel].pic_reloc = exp->pic_reloc; 454 #endif 455 the_ins.reloc[the_ins.nrel++].pcrel = pc_rel; 456 } 457 458 /* Cause an extra frag to be generated here, inserting up to 10 bytes 459 (that value is chosen in the frag_var call in md_assemble). TYPE 460 is the subtype of the frag to be generated; its primary type is 461 rs_machine_dependent. 462 463 The TYPE parameter is also used by md_convert_frag_1 and 464 md_estimate_size_before_relax. The appropriate type of fixup will 465 be emitted by md_convert_frag_1. 466 467 ADD becomes the FR_SYMBOL field of the frag, and OFF the FR_OFFSET. */ 468 static void 469 add_frag (symbolS *add, offsetT off, int type) 470 { 471 the_ins.fragb[the_ins.nfrag].fragoff = the_ins.numo; 472 the_ins.fragb[the_ins.nfrag].fadd = add; 473 the_ins.fragb[the_ins.nfrag].foff = off; 474 the_ins.fragb[the_ins.nfrag++].fragty = type; 475 } 476 477 #define isvar(ex) \ 478 (op (ex) != O_constant && op (ex) != O_big) 479 480 static char *crack_operand (char *str, struct m68k_op *opP); 481 static int get_num (struct m68k_exp *exp, int ok); 482 static int reverse_16_bits (int in); 483 static int reverse_8_bits (int in); 484 static void install_gen_operand (int mode, int val); 485 static void install_operand (int mode, int val); 486 static void s_bss (int); 487 static void s_data1 (int); 488 static void s_data2 (int); 489 static void s_even (int); 490 static void s_proc (int); 491 static void s_chip (int); 492 static void s_fopt (int); 493 static void s_opt (int); 494 static void s_reg (int); 495 static void s_restore (int); 496 static void s_save (int); 497 static void s_mri_if (int); 498 static void s_mri_else (int); 499 static void s_mri_endi (int); 500 static void s_mri_break (int); 501 static void s_mri_next (int); 502 static void s_mri_for (int); 503 static void s_mri_endf (int); 504 static void s_mri_repeat (int); 505 static void s_mri_until (int); 506 static void s_mri_while (int); 507 static void s_mri_endw (int); 508 static void s_m68k_cpu (int); 509 static void s_m68k_arch (int); 510 511 struct m68k_cpu 512 { 513 unsigned long arch; /* Architecture features. */ 514 const enum m68k_register *control_regs; /* Control regs on chip */ 515 const char *name; /* Name */ 516 int alias; /* Alias for a cannonical name. If 1, then 517 succeeds canonical name, if -1 then 518 succeeds canonical name, if <-1 ||>1 this is a 519 deprecated name, and the next/previous name 520 should be used. */ 521 }; 522 523 /* We hold flags for features explicitly enabled and explicitly 524 disabled. */ 525 static int current_architecture; 526 static int not_current_architecture; 527 static const struct m68k_cpu *selected_arch; 528 static const struct m68k_cpu *selected_cpu; 529 static int initialized; 530 531 /* Architecture models. */ 532 static const struct m68k_cpu m68k_archs[] = 533 { 534 {m68000, m68000_ctrl, "68000", 0}, 535 {m68010, m68010_ctrl, "68010", 0}, 536 {m68020|m68881|m68851, m68020_ctrl, "68020", 0}, 537 {m68030|m68881|m68851, m68020_ctrl, "68030", 0}, 538 {m68040, m68040_ctrl, "68040", 0}, 539 {m68060, m68060_ctrl, "68060", 0}, 540 {cpu32|m68881, cpu32_ctrl, "cpu32", 0}, 541 {fido_a, fido_ctrl, "fidoa", 0}, 542 {mcfisa_a|mcfhwdiv, NULL, "isaa", 0}, 543 {mcfisa_a|mcfhwdiv|mcfisa_aa|mcfusp, NULL, "isaaplus", 0}, 544 {mcfisa_a|mcfhwdiv|mcfisa_b|mcfusp, NULL, "isab", 0}, 545 {mcfisa_a|mcfhwdiv|mcfisa_c|mcfusp, NULL, "isac", 0}, 546 {mcfisa_a|mcfhwdiv|mcfisa_b|mcfmac|mcfusp, mcf_ctrl, "cfv4", 0}, 547 {mcfisa_a|mcfhwdiv|mcfisa_b|mcfemac|mcfusp|cfloat, mcfv4e_ctrl, "cfv4e", 0}, 548 {0,0,NULL, 0} 549 }; 550 551 /* For -mno-mac we want to turn off all types of mac. */ 552 static const unsigned no_mac = mcfmac | mcfemac; 553 554 /* Architecture extensions, here 'alias' -1 for m68k, +1 for cf and 0 555 for either. */ 556 static const struct m68k_cpu m68k_extensions[] = 557 { 558 {m68851, NULL, "68851", -1}, 559 {m68881, NULL, "68881", -1}, 560 {m68881, NULL, "68882", -1}, 561 562 {cfloat|m68881, NULL, "float", 0}, 563 564 {mcfhwdiv, NULL, "div", 1}, 565 {mcfusp, NULL, "usp", 1}, 566 {mcfmac, (void *)&no_mac, "mac", 1}, 567 {mcfemac, NULL, "emac", 1}, 568 569 {0,NULL,NULL, 0} 570 }; 571 572 /* Processor list */ 573 static const struct m68k_cpu m68k_cpus[] = 574 { 575 {m68000, m68000_ctrl, "68000", 0}, 576 {m68000, m68000_ctrl, "68ec000", 1}, 577 {m68000, m68000_ctrl, "68hc000", 1}, 578 {m68000, m68000_ctrl, "68hc001", 1}, 579 {m68000, m68000_ctrl, "68008", 1}, 580 {m68000, m68000_ctrl, "68302", 1}, 581 {m68000, m68000_ctrl, "68306", 1}, 582 {m68000, m68000_ctrl, "68307", 1}, 583 {m68000, m68000_ctrl, "68322", 1}, 584 {m68000, m68000_ctrl, "68356", 1}, 585 {m68010, m68010_ctrl, "68010", 0}, 586 {m68020|m68881|m68851, m68020_ctrl, "68020", 0}, 587 {m68020|m68881|m68851, m68020_ctrl, "68k", 1}, 588 {m68020|m68881|m68851, m68020_ctrl, "68ec020", 1}, 589 {m68030|m68881|m68851, m68020_ctrl, "68030", 0}, 590 {m68030|m68881|m68851, m68020_ctrl, "68ec030", 1}, 591 {m68040, m68040_ctrl, "68040", 0}, 592 {m68040, m68040_ctrl, "68ec040", 1}, 593 {m68060, m68060_ctrl, "68060", 0}, 594 {m68060, m68060_ctrl, "68ec060", 1}, 595 596 {cpu32|m68881, cpu32_ctrl, "cpu32", 0}, 597 {cpu32|m68881, cpu32_ctrl, "68330", 1}, 598 {cpu32|m68881, cpu32_ctrl, "68331", 1}, 599 {cpu32|m68881, cpu32_ctrl, "68332", 1}, 600 {cpu32|m68881, cpu32_ctrl, "68333", 1}, 601 {cpu32|m68881, cpu32_ctrl, "68334", 1}, 602 {cpu32|m68881, cpu32_ctrl, "68336", 1}, 603 {cpu32|m68881, cpu32_ctrl, "68340", 1}, 604 {cpu32|m68881, cpu32_ctrl, "68341", 1}, 605 {cpu32|m68881, cpu32_ctrl, "68349", 1}, 606 {cpu32|m68881, cpu32_ctrl, "68360", 1}, 607 608 {mcfisa_a|mcfisa_c|mcfusp, mcf51_ctrl, "51", 0}, 609 {mcfisa_a|mcfisa_c|mcfusp, mcf51_ctrl, "51ac", 1}, 610 {mcfisa_a|mcfisa_c|mcfusp, mcf51_ctrl, "51ag", 1}, 611 {mcfisa_a|mcfisa_c|mcfusp, mcf51_ctrl, "51cn", 1}, 612 {mcfisa_a|mcfisa_c|mcfusp|mcfmac, mcf51_ctrl, "51em", 1}, 613 {mcfisa_a|mcfisa_c|mcfusp|mcfmac, mcf51_ctrl, "51je", 1}, 614 {mcfisa_a|mcfisa_c|mcfusp|mcfemac, mcf51_ctrl, "51jf", 1}, 615 {mcfisa_a|mcfisa_c|mcfusp|mcfemac, mcf51_ctrl, "51jg", 1}, 616 {mcfisa_a|mcfisa_c|mcfusp, mcf51_ctrl, "51jm", 1}, 617 {mcfisa_a|mcfisa_c|mcfusp|mcfmac, mcf51_ctrl, "51mm", 1}, 618 {mcfisa_a|mcfisa_c|mcfusp, mcf51_ctrl, "51qe", 1}, 619 {mcfisa_a|mcfisa_c|mcfusp|mcfemac, mcf51_ctrl, "51qm", 1}, 620 621 {mcfisa_a, mcf_ctrl, "5200", 0}, 622 {mcfisa_a, mcf_ctrl, "5202", 1}, 623 {mcfisa_a, mcf_ctrl, "5204", 1}, 624 {mcfisa_a, mcf5206_ctrl, "5206", 1}, 625 626 {mcfisa_a|mcfhwdiv|mcfmac, mcf5206_ctrl, "5206e", 0}, 627 628 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5208_ctrl, "5207", -1}, 629 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5208_ctrl, "5208", 0}, 630 631 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf5210a_ctrl, "5210a", 0}, 632 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf5210a_ctrl, "5211a", 1}, 633 634 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf5213_ctrl, "5211", -1}, 635 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf5213_ctrl, "5212", -1}, 636 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf5213_ctrl, "5213", 0}, 637 638 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5216_ctrl, "5214", -1}, 639 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5216_ctrl, "5216", 0}, 640 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5216_ctrl, "521x", 2}, 641 642 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf5221x_ctrl, "5221x", 0}, 643 644 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf52223_ctrl, "52221", -1}, 645 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf52223_ctrl, "52223", 0}, 646 647 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf52235_ctrl, "52230", -1}, 648 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf52235_ctrl, "52233", -1}, 649 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf52235_ctrl, "52234", -1}, 650 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf52235_ctrl, "52235", 0}, 651 652 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf5225_ctrl, "5224", -1}, 653 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfmac|mcfusp, mcf5225_ctrl, "5225", 0}, 654 655 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf52277_ctrl, "52274", -1}, 656 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf52277_ctrl, "52277", 0}, 657 658 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5235_ctrl, "5232", -1}, 659 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5235_ctrl, "5233", -1}, 660 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5235_ctrl, "5234", -1}, 661 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5235_ctrl, "5235", -1}, 662 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5235_ctrl, "523x", 0}, 663 664 {mcfisa_a|mcfhwdiv|mcfemac, mcf5249_ctrl, "5249", 0}, 665 {mcfisa_a|mcfhwdiv|mcfemac, mcf5250_ctrl, "5250", 0}, 666 {mcfisa_a|mcfhwdiv|mcfemac, mcf5253_ctrl, "5253", 0}, 667 668 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf52259_ctrl, "52252", -1}, 669 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf52259_ctrl, "52254", -1}, 670 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf52259_ctrl, "52255", -1}, 671 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf52259_ctrl, "52256", -1}, 672 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf52259_ctrl, "52258", -1}, 673 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf52259_ctrl, "52259", 0}, 674 675 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5271_ctrl, "5270", -1}, 676 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5271_ctrl, "5271", 0}, 677 678 {mcfisa_a|mcfhwdiv|mcfmac, mcf5272_ctrl, "5272", 0}, 679 680 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5275_ctrl, "5274", -1}, 681 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5275_ctrl, "5275", 0}, 682 683 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5282_ctrl, "5280", -1}, 684 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5282_ctrl, "5281", -1}, 685 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5282_ctrl, "5282", -1}, 686 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5282_ctrl, "528x", 0}, 687 688 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf53017_ctrl, "53011", -1}, 689 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf53017_ctrl, "53012", -1}, 690 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf53017_ctrl, "53013", -1}, 691 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf53017_ctrl, "53014", -1}, 692 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf53017_ctrl, "53015", -1}, 693 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf53017_ctrl, "53016", -1}, 694 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf53017_ctrl, "53017", 0}, 695 696 {mcfisa_a|mcfhwdiv|mcfmac, mcf5307_ctrl, "5307", 0}, 697 698 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5329_ctrl, "5327", -1}, 699 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5329_ctrl, "5328", -1}, 700 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5329_ctrl, "5329", -1}, 701 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5329_ctrl, "532x", 0}, 702 703 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5373_ctrl, "5372", -1}, 704 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5373_ctrl, "5373", -1}, 705 {mcfisa_a|mcfisa_aa|mcfhwdiv|mcfemac|mcfusp, mcf5373_ctrl, "537x", 0}, 706 707 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfmac, mcf5407_ctrl, "5407",0}, 708 709 {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp, mcf54418_ctrl, "54410", -1}, 710 {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp, mcf54418_ctrl, "54415", -1}, 711 {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp, mcf54418_ctrl, "54416", -1}, 712 {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp, mcf54418_ctrl, "54417", -1}, 713 {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp, mcf54418_ctrl, "54418", 0}, 714 715 {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp, mcf54455_ctrl, "54450", -1}, 716 {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp, mcf54455_ctrl, "54451", -1}, 717 {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp, mcf54455_ctrl, "54452", -1}, 718 {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp, mcf54455_ctrl, "54453", -1}, 719 {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp, mcf54455_ctrl, "54454", -1}, 720 {mcfisa_a|mcfisa_c|mcfhwdiv|mcfemac|mcfusp, mcf54455_ctrl, "54455", 0}, 721 722 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "5470", -1}, 723 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "5471", -1}, 724 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "5472", -1}, 725 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "5473", -1}, 726 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "5474", -1}, 727 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "5475", -1}, 728 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5475_ctrl, "547x", 0}, 729 730 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "5480", -1}, 731 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "5481", -1}, 732 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "5482", -1}, 733 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "5483", -1}, 734 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "5484", -1}, 735 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "5485", -1}, 736 {mcfisa_a|mcfisa_b|mcfhwdiv|mcfemac|mcfusp|cfloat, mcf5485_ctrl, "548x", 0}, 737 738 {fido_a, fido_ctrl, "fidoa", 0}, 739 {fido_a, fido_ctrl, "fido", 1}, 740 741 {0,NULL,NULL, 0} 742 }; 743 744 static const struct m68k_cpu *m68k_lookup_cpu 745 (const char *, const struct m68k_cpu *, int, int *); 746 static int m68k_set_arch (const char *, int, int); 747 static int m68k_set_cpu (const char *, int, int); 748 static int m68k_set_extension (const char *, int, int); 749 static void m68k_init_arch (void); 750 751 /* This is the assembler relaxation table for m68k. m68k is a rich CISC 752 architecture and we have a lot of relaxation modes. */ 753 754 /* Macros used in the relaxation code. */ 755 #define TAB(x,y) (((x) << 2) + (y)) 756 #define TABTYPE(x) ((x) >> 2) 757 758 /* Relaxation states. */ 759 #define BYTE 0 760 #define SHORT 1 761 #define LONG 2 762 #define SZ_UNDEF 3 763 764 /* Here are all the relaxation modes we support. First we can relax ordinary 765 branches. On 68020 and higher and on CPU32 all branch instructions take 766 three forms, so on these CPUs all branches always remain as such. When we 767 have to expand to the LONG form on a 68000, though, we substitute an 768 absolute jump instead. This is a direct replacement for unconditional 769 branches and a branch over a jump for conditional branches. However, if the 770 user requires PIC and disables this with --pcrel, we can only relax between 771 BYTE and SHORT forms, punting if that isn't enough. This gives us four 772 different relaxation modes for branches: */ 773 774 #define BRANCHBWL 0 /* Branch byte, word, or long. */ 775 #define BRABSJUNC 1 /* Absolute jump for LONG, unconditional. */ 776 #define BRABSJCOND 2 /* Absolute jump for LONG, conditional. */ 777 #define BRANCHBW 3 /* Branch byte or word. */ 778 779 /* We also relax coprocessor branches and DBcc's. All CPUs that support 780 coprocessor branches support them in word and long forms, so we have only 781 one relaxation mode for them. DBcc's are word only on all CPUs. We can 782 relax them to the LONG form with a branch-around sequence. This sequence 783 can use a long branch (if available) or an absolute jump (if acceptable). 784 This gives us two relaxation modes. If long branches are not available and 785 absolute jumps are not acceptable, we don't relax DBcc's. */ 786 787 #define FBRANCH 4 /* Coprocessor branch. */ 788 #define DBCCLBR 5 /* DBcc relaxable with a long branch. */ 789 #define DBCCABSJ 6 /* DBcc relaxable with an absolute jump. */ 790 791 /* That's all for instruction relaxation. However, we also relax PC-relative 792 operands. Specifically, we have three operand relaxation modes. On the 793 68000 PC-relative operands can only be 16-bit, but on 68020 and higher and 794 on CPU32 they may be 16-bit or 32-bit. For the latter we relax between the 795 two. Also PC+displacement+index operands in their simple form (with a non- 796 suppressed index without memory indirection) are supported on all CPUs, but 797 on the 68000 the displacement can be 8-bit only, whereas on 68020 and higher 798 and on CPU32 we relax it to SHORT and LONG forms as well using the extended 799 form of the PC+displacement+index operand. Finally, some absolute operands 800 can be relaxed down to 16-bit PC-relative. */ 801 802 #define PCREL1632 7 /* 16-bit or 32-bit PC-relative. */ 803 #define PCINDEX 8 /* PC + displacement + index. */ 804 #define ABSTOPCREL 9 /* Absolute relax down to 16-bit PC-relative. */ 805 806 /* This relaxation is required for branches where there is no long 807 branch and we are in pcrel mode. We generate a bne/beq pair. */ 808 #define BRANCHBWPL 10 /* Branch byte, word or pair of longs 809 */ 810 811 /* Note that calls to frag_var need to specify the maximum expansion 812 needed; this is currently 12 bytes for bne/beq pair. */ 813 #define FRAG_VAR_SIZE 12 814 815 /* The fields are: 816 How far Forward this mode will reach: 817 How far Backward this mode will reach: 818 How many bytes this mode will add to the size of the frag 819 Which mode to go to if the offset won't fit in this one 820 821 Please check tc-m68k.h:md_prepare_relax_scan if changing this table. */ 822 relax_typeS md_relax_table[] = 823 { 824 { 127, -128, 0, TAB (BRANCHBWL, SHORT) }, 825 { 32767, -32768, 2, TAB (BRANCHBWL, LONG) }, 826 { 0, 0, 4, 0 }, 827 { 1, 1, 0, 0 }, 828 829 { 127, -128, 0, TAB (BRABSJUNC, SHORT) }, 830 { 32767, -32768, 2, TAB (BRABSJUNC, LONG) }, 831 { 0, 0, 4, 0 }, 832 { 1, 1, 0, 0 }, 833 834 { 127, -128, 0, TAB (BRABSJCOND, SHORT) }, 835 { 32767, -32768, 2, TAB (BRABSJCOND, LONG) }, 836 { 0, 0, 6, 0 }, 837 { 1, 1, 0, 0 }, 838 839 { 127, -128, 0, TAB (BRANCHBW, SHORT) }, 840 { 0, 0, 2, 0 }, 841 { 1, 1, 0, 0 }, 842 { 1, 1, 0, 0 }, 843 844 { 1, 1, 0, 0 }, /* FBRANCH doesn't come BYTE. */ 845 { 32767, -32768, 2, TAB (FBRANCH, LONG) }, 846 { 0, 0, 4, 0 }, 847 { 1, 1, 0, 0 }, 848 849 { 1, 1, 0, 0 }, /* DBCC doesn't come BYTE. */ 850 { 32767, -32768, 2, TAB (DBCCLBR, LONG) }, 851 { 0, 0, 10, 0 }, 852 { 1, 1, 0, 0 }, 853 854 { 1, 1, 0, 0 }, /* DBCC doesn't come BYTE. */ 855 { 32767, -32768, 2, TAB (DBCCABSJ, LONG) }, 856 { 0, 0, 10, 0 }, 857 { 1, 1, 0, 0 }, 858 859 { 1, 1, 0, 0 }, /* PCREL1632 doesn't come BYTE. */ 860 { 32767, -32768, 2, TAB (PCREL1632, LONG) }, 861 { 0, 0, 6, 0 }, 862 { 1, 1, 0, 0 }, 863 864 { 125, -130, 0, TAB (PCINDEX, SHORT) }, 865 { 32765, -32770, 2, TAB (PCINDEX, LONG) }, 866 { 0, 0, 4, 0 }, 867 { 1, 1, 0, 0 }, 868 869 { 1, 1, 0, 0 }, /* ABSTOPCREL doesn't come BYTE. */ 870 { 32767, -32768, 2, TAB (ABSTOPCREL, LONG) }, 871 { 0, 0, 4, 0 }, 872 { 1, 1, 0, 0 }, 873 874 { 127, -128, 0, TAB (BRANCHBWPL, SHORT) }, 875 { 32767, -32768, 2, TAB (BRANCHBWPL, LONG) }, 876 { 0, 0, 10, 0 }, 877 { 1, 1, 0, 0 }, 878 }; 879 880 /* These are the machine dependent pseudo-ops. These are included so 881 the assembler can work on the output from the SUN C compiler, which 882 generates these. */ 883 884 /* This table describes all the machine specific pseudo-ops the assembler 885 has to support. The fields are: 886 pseudo-op name without dot 887 function to call to execute this pseudo-op 888 Integer arg to pass to the function. */ 889 const pseudo_typeS md_pseudo_table[] = 890 { 891 {"data1", s_data1, 0}, 892 {"data2", s_data2, 0}, 893 {"bss", s_bss, 0}, 894 {"even", s_even, 0}, 895 {"skip", s_space, 0}, 896 {"proc", s_proc, 0}, 897 #if defined (TE_SUN3) || defined (OBJ_ELF) 898 {"align", s_align_bytes, 0}, 899 #endif 900 #ifdef OBJ_ELF 901 {"swbeg", s_ignore, 0}, 902 {"long", m68k_elf_cons, 4}, 903 #endif 904 {"extend", float_cons, 'x'}, 905 {"ldouble", float_cons, 'x'}, 906 907 {"arch", s_m68k_arch, 0}, 908 {"cpu", s_m68k_cpu, 0}, 909 910 /* The following pseudo-ops are supported for MRI compatibility. */ 911 {"chip", s_chip, 0}, 912 {"comline", s_space, 1}, 913 {"fopt", s_fopt, 0}, 914 {"mask2", s_ignore, 0}, 915 {"opt", s_opt, 0}, 916 {"reg", s_reg, 0}, 917 {"restore", s_restore, 0}, 918 {"save", s_save, 0}, 919 920 {"if", s_mri_if, 0}, 921 {"if.b", s_mri_if, 'b'}, 922 {"if.w", s_mri_if, 'w'}, 923 {"if.l", s_mri_if, 'l'}, 924 {"else", s_mri_else, 0}, 925 {"else.s", s_mri_else, 's'}, 926 {"else.l", s_mri_else, 'l'}, 927 {"endi", s_mri_endi, 0}, 928 {"break", s_mri_break, 0}, 929 {"break.s", s_mri_break, 's'}, 930 {"break.l", s_mri_break, 'l'}, 931 {"next", s_mri_next, 0}, 932 {"next.s", s_mri_next, 's'}, 933 {"next.l", s_mri_next, 'l'}, 934 {"for", s_mri_for, 0}, 935 {"for.b", s_mri_for, 'b'}, 936 {"for.w", s_mri_for, 'w'}, 937 {"for.l", s_mri_for, 'l'}, 938 {"endf", s_mri_endf, 0}, 939 {"repeat", s_mri_repeat, 0}, 940 {"until", s_mri_until, 0}, 941 {"until.b", s_mri_until, 'b'}, 942 {"until.w", s_mri_until, 'w'}, 943 {"until.l", s_mri_until, 'l'}, 944 {"while", s_mri_while, 0}, 945 {"while.b", s_mri_while, 'b'}, 946 {"while.w", s_mri_while, 'w'}, 947 {"while.l", s_mri_while, 'l'}, 948 {"endw", s_mri_endw, 0}, 949 950 {0, 0, 0} 951 }; 952 953 /* The mote pseudo ops are put into the opcode table, since they 954 don't start with a . they look like opcodes to gas. */ 955 956 const pseudo_typeS mote_pseudo_table[] = 957 { 958 959 {"dcl", cons, 4}, 960 {"dc", cons, 2}, 961 {"dcw", cons, 2}, 962 {"dcb", cons, 1}, 963 964 {"dsl", s_space, 4}, 965 {"ds", s_space, 2}, 966 {"dsw", s_space, 2}, 967 {"dsb", s_space, 1}, 968 969 {"xdef", s_globl, 0}, 970 #ifdef OBJ_ELF 971 {"align", s_align_bytes, 0}, 972 #else 973 {"align", s_align_ptwo, 0}, 974 #endif 975 #ifdef M68KCOFF 976 {"sect", obj_coff_section, 0}, 977 {"section", obj_coff_section, 0}, 978 #endif 979 {0, 0, 0} 980 }; 981 982 /* Truncate and sign-extend at 32 bits, so that building on a 64-bit host 983 gives identical results to a 32-bit host. */ 984 #define TRUNC(X) ((valueT) (X) & 0xffffffff) 985 #define SEXT(X) ((TRUNC (X) ^ 0x80000000) - 0x80000000) 986 987 #define issbyte(x) ((valueT) SEXT (x) + 0x80 < 0x100) 988 #define isubyte(x) ((valueT) TRUNC (x) < 0x100) 989 #define issword(x) ((valueT) SEXT (x) + 0x8000 < 0x10000) 990 #define isuword(x) ((valueT) TRUNC (x) < 0x10000) 991 992 #define isbyte(x) ((valueT) SEXT (x) + 0xff < 0x1ff) 993 #define isword(x) ((valueT) SEXT (x) + 0xffff < 0x1ffff) 994 #define islong(x) (1) 995 996 static char notend_table[256]; 997 static char alt_notend_table[256]; 998 #define notend(s) \ 999 (! (notend_table[(unsigned char) *s] \ 1000 || (*s == ':' \ 1001 && alt_notend_table[(unsigned char) s[1]]))) 1002 1003 #ifdef OBJ_ELF 1004 1005 /* Return zero if the reference to SYMBOL from within the same segment may 1006 be relaxed. */ 1007 1008 /* On an ELF system, we can't relax an externally visible symbol, 1009 because it may be overridden by a shared library. However, if 1010 TARGET_OS is "elf", then we presume that we are assembling for an 1011 embedded system, in which case we don't have to worry about shared 1012 libraries, and we can relax any external sym. */ 1013 1014 #define relaxable_symbol(symbol) \ 1015 (!((S_IS_EXTERNAL (symbol) && EXTERN_FORCE_RELOC) \ 1016 || S_IS_WEAK (symbol))) 1017 1018 /* Compute the relocation code for a fixup of SIZE bytes, using pc 1019 relative relocation if PCREL is non-zero. PIC says whether a special 1020 pic relocation was requested. */ 1021 1022 static bfd_reloc_code_real_type 1023 get_reloc_code (int size, int pcrel, enum pic_relocation pic) 1024 { 1025 switch (pic) 1026 { 1027 case pic_got_pcrel: 1028 switch (size) 1029 { 1030 case 1: 1031 return BFD_RELOC_8_GOT_PCREL; 1032 case 2: 1033 return BFD_RELOC_16_GOT_PCREL; 1034 case 4: 1035 return BFD_RELOC_32_GOT_PCREL; 1036 } 1037 break; 1038 1039 case pic_got_off: 1040 switch (size) 1041 { 1042 case 1: 1043 return BFD_RELOC_8_GOTOFF; 1044 case 2: 1045 return BFD_RELOC_16_GOTOFF; 1046 case 4: 1047 return BFD_RELOC_32_GOTOFF; 1048 } 1049 break; 1050 1051 case pic_plt_pcrel: 1052 switch (size) 1053 { 1054 case 1: 1055 return BFD_RELOC_8_PLT_PCREL; 1056 case 2: 1057 return BFD_RELOC_16_PLT_PCREL; 1058 case 4: 1059 return BFD_RELOC_32_PLT_PCREL; 1060 } 1061 break; 1062 1063 case pic_plt_off: 1064 switch (size) 1065 { 1066 case 1: 1067 return BFD_RELOC_8_PLTOFF; 1068 case 2: 1069 return BFD_RELOC_16_PLTOFF; 1070 case 4: 1071 return BFD_RELOC_32_PLTOFF; 1072 } 1073 break; 1074 1075 case pic_tls_gd: 1076 switch (size) 1077 { 1078 case 1: 1079 return BFD_RELOC_68K_TLS_GD8; 1080 case 2: 1081 return BFD_RELOC_68K_TLS_GD16; 1082 case 4: 1083 return BFD_RELOC_68K_TLS_GD32; 1084 } 1085 break; 1086 1087 case pic_tls_ldm: 1088 switch (size) 1089 { 1090 case 1: 1091 return BFD_RELOC_68K_TLS_LDM8; 1092 case 2: 1093 return BFD_RELOC_68K_TLS_LDM16; 1094 case 4: 1095 return BFD_RELOC_68K_TLS_LDM32; 1096 } 1097 break; 1098 1099 case pic_tls_ldo: 1100 switch (size) 1101 { 1102 case 1: 1103 return BFD_RELOC_68K_TLS_LDO8; 1104 case 2: 1105 return BFD_RELOC_68K_TLS_LDO16; 1106 case 4: 1107 return BFD_RELOC_68K_TLS_LDO32; 1108 } 1109 break; 1110 1111 case pic_tls_ie: 1112 switch (size) 1113 { 1114 case 1: 1115 return BFD_RELOC_68K_TLS_IE8; 1116 case 2: 1117 return BFD_RELOC_68K_TLS_IE16; 1118 case 4: 1119 return BFD_RELOC_68K_TLS_IE32; 1120 } 1121 break; 1122 1123 case pic_tls_le: 1124 switch (size) 1125 { 1126 case 1: 1127 return BFD_RELOC_68K_TLS_LE8; 1128 case 2: 1129 return BFD_RELOC_68K_TLS_LE16; 1130 case 4: 1131 return BFD_RELOC_68K_TLS_LE32; 1132 } 1133 break; 1134 1135 case pic_none: 1136 if (pcrel) 1137 { 1138 switch (size) 1139 { 1140 case 1: 1141 return BFD_RELOC_8_PCREL; 1142 case 2: 1143 return BFD_RELOC_16_PCREL; 1144 case 4: 1145 return BFD_RELOC_32_PCREL; 1146 } 1147 } 1148 else 1149 { 1150 switch (size) 1151 { 1152 case 1: 1153 return BFD_RELOC_8; 1154 case 2: 1155 return BFD_RELOC_16; 1156 case 4: 1157 return BFD_RELOC_32; 1158 } 1159 } 1160 } 1161 1162 if (pcrel) 1163 { 1164 if (pic == pic_none) 1165 as_bad (_("Can not do %d byte pc-relative relocation"), size); 1166 else 1167 as_bad (_("Can not do %d byte pc-relative pic relocation"), size); 1168 } 1169 else 1170 { 1171 if (pic == pic_none) 1172 as_bad (_("Can not do %d byte relocation"), size); 1173 else 1174 as_bad (_("Can not do %d byte pic relocation"), size); 1175 } 1176 1177 return BFD_RELOC_NONE; 1178 } 1179 1180 /* Here we decide which fixups can be adjusted to make them relative 1181 to the beginning of the section instead of the symbol. Basically 1182 we need to make sure that the dynamic relocations are done 1183 correctly, so in some cases we force the original symbol to be 1184 used. */ 1185 int 1186 tc_m68k_fix_adjustable (fixS *fixP) 1187 { 1188 /* Adjust_reloc_syms doesn't know about the GOT. */ 1189 switch (fixP->fx_r_type) 1190 { 1191 case BFD_RELOC_8_GOT_PCREL: 1192 case BFD_RELOC_16_GOT_PCREL: 1193 case BFD_RELOC_32_GOT_PCREL: 1194 case BFD_RELOC_8_GOTOFF: 1195 case BFD_RELOC_16_GOTOFF: 1196 case BFD_RELOC_32_GOTOFF: 1197 case BFD_RELOC_8_PLT_PCREL: 1198 case BFD_RELOC_16_PLT_PCREL: 1199 case BFD_RELOC_32_PLT_PCREL: 1200 case BFD_RELOC_8_PLTOFF: 1201 case BFD_RELOC_16_PLTOFF: 1202 case BFD_RELOC_32_PLTOFF: 1203 case BFD_RELOC_68K_TLS_GD32: 1204 case BFD_RELOC_68K_TLS_GD16: 1205 case BFD_RELOC_68K_TLS_GD8: 1206 case BFD_RELOC_68K_TLS_LDM32: 1207 case BFD_RELOC_68K_TLS_LDM16: 1208 case BFD_RELOC_68K_TLS_LDM8: 1209 case BFD_RELOC_68K_TLS_LDO32: 1210 case BFD_RELOC_68K_TLS_LDO16: 1211 case BFD_RELOC_68K_TLS_LDO8: 1212 case BFD_RELOC_68K_TLS_IE32: 1213 case BFD_RELOC_68K_TLS_IE16: 1214 case BFD_RELOC_68K_TLS_IE8: 1215 case BFD_RELOC_68K_TLS_LE32: 1216 case BFD_RELOC_68K_TLS_LE16: 1217 case BFD_RELOC_68K_TLS_LE8: 1218 return 0; 1219 1220 case BFD_RELOC_VTABLE_INHERIT: 1221 case BFD_RELOC_VTABLE_ENTRY: 1222 return 0; 1223 1224 default: 1225 return 1; 1226 } 1227 } 1228 1229 #else /* !OBJ_ELF */ 1230 1231 #define get_reloc_code(SIZE,PCREL,OTHER) NO_RELOC 1232 1233 /* PR gas/3041 Weak symbols are not relaxable 1234 because they must be treated as extern. */ 1235 #define relaxable_symbol(symbol) (!(S_IS_WEAK (symbol))) 1236 1237 #endif /* OBJ_ELF */ 1238 1239 arelent * 1240 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp) 1241 { 1242 arelent *reloc; 1243 bfd_reloc_code_real_type code; 1244 1245 /* If the tcbit is set, then this was a fixup of a negative value 1246 that was never resolved. We do not have a reloc to handle this, 1247 so just return. We assume that other code will have detected this 1248 situation and produced a helpful error message, so we just tell the 1249 user that the reloc cannot be produced. */ 1250 if (fixp->fx_tcbit) 1251 { 1252 if (fixp->fx_addsy) 1253 as_bad_where (fixp->fx_file, fixp->fx_line, 1254 _("Unable to produce reloc against symbol '%s'"), 1255 S_GET_NAME (fixp->fx_addsy)); 1256 return NULL; 1257 } 1258 1259 if (fixp->fx_r_type != BFD_RELOC_NONE) 1260 { 1261 code = fixp->fx_r_type; 1262 1263 /* Since DIFF_EXPR_OK is defined in tc-m68k.h, it is possible 1264 that fixup_segment converted a non-PC relative reloc into a 1265 PC relative reloc. In such a case, we need to convert the 1266 reloc code. */ 1267 if (fixp->fx_pcrel) 1268 { 1269 switch (code) 1270 { 1271 case BFD_RELOC_8: 1272 code = BFD_RELOC_8_PCREL; 1273 break; 1274 case BFD_RELOC_16: 1275 code = BFD_RELOC_16_PCREL; 1276 break; 1277 case BFD_RELOC_32: 1278 code = BFD_RELOC_32_PCREL; 1279 break; 1280 case BFD_RELOC_8_PCREL: 1281 case BFD_RELOC_16_PCREL: 1282 case BFD_RELOC_32_PCREL: 1283 case BFD_RELOC_8_GOT_PCREL: 1284 case BFD_RELOC_16_GOT_PCREL: 1285 case BFD_RELOC_32_GOT_PCREL: 1286 case BFD_RELOC_8_GOTOFF: 1287 case BFD_RELOC_16_GOTOFF: 1288 case BFD_RELOC_32_GOTOFF: 1289 case BFD_RELOC_8_PLT_PCREL: 1290 case BFD_RELOC_16_PLT_PCREL: 1291 case BFD_RELOC_32_PLT_PCREL: 1292 case BFD_RELOC_8_PLTOFF: 1293 case BFD_RELOC_16_PLTOFF: 1294 case BFD_RELOC_32_PLTOFF: 1295 case BFD_RELOC_68K_TLS_GD32: 1296 case BFD_RELOC_68K_TLS_GD16: 1297 case BFD_RELOC_68K_TLS_GD8: 1298 case BFD_RELOC_68K_TLS_LDM32: 1299 case BFD_RELOC_68K_TLS_LDM16: 1300 case BFD_RELOC_68K_TLS_LDM8: 1301 case BFD_RELOC_68K_TLS_LDO32: 1302 case BFD_RELOC_68K_TLS_LDO16: 1303 case BFD_RELOC_68K_TLS_LDO8: 1304 case BFD_RELOC_68K_TLS_IE32: 1305 case BFD_RELOC_68K_TLS_IE16: 1306 case BFD_RELOC_68K_TLS_IE8: 1307 case BFD_RELOC_68K_TLS_LE32: 1308 case BFD_RELOC_68K_TLS_LE16: 1309 case BFD_RELOC_68K_TLS_LE8: 1310 break; 1311 default: 1312 as_bad_where (fixp->fx_file, fixp->fx_line, 1313 _("Cannot make %s relocation PC relative"), 1314 bfd_get_reloc_code_name (code)); 1315 } 1316 } 1317 } 1318 else 1319 { 1320 #define F(SZ,PCREL) (((SZ) << 1) + (PCREL)) 1321 switch (F (fixp->fx_size, fixp->fx_pcrel)) 1322 { 1323 #define MAP(SZ,PCREL,TYPE) case F(SZ,PCREL): code = (TYPE); break 1324 MAP (1, 0, BFD_RELOC_8); 1325 MAP (2, 0, BFD_RELOC_16); 1326 MAP (4, 0, BFD_RELOC_32); 1327 MAP (1, 1, BFD_RELOC_8_PCREL); 1328 MAP (2, 1, BFD_RELOC_16_PCREL); 1329 MAP (4, 1, BFD_RELOC_32_PCREL); 1330 default: 1331 abort (); 1332 } 1333 } 1334 #undef F 1335 #undef MAP 1336 1337 reloc = XNEW (arelent); 1338 reloc->sym_ptr_ptr = XNEW (asymbol *); 1339 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy); 1340 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where; 1341 #ifndef OBJ_ELF 1342 if (OUTPUT_FLAVOR == bfd_target_aout_flavour 1343 && fixp->fx_addsy 1344 && S_IS_WEAK (fixp->fx_addsy) 1345 && ! bfd_is_und_section (S_GET_SEGMENT (fixp->fx_addsy))) 1346 { 1347 /* PR gas/3041 References to weak symbols must be treated as extern 1348 in order to be overridable by the linker, even if they are defined 1349 in the same object file. So the original addend must be written 1350 "as is" into the output section without further processing. 1351 The addend value must be hacked here in order to force 1352 bfd_install_relocation() to write the original value into the 1353 output section. 1354 1) MD_APPLY_SYM_VALUE() is set to 1 for m68k/a.out, so the symbol 1355 value has already been added to the addend in fixup_segment(). We 1356 have to remove it. 1357 2) bfd_install_relocation() will incorrectly treat this symbol as 1358 resolved, so it will write the symbol value plus its addend and 1359 section VMA. As a workaround we can tweak the addend value here in 1360 order to get the original value in the section after the call to 1361 bfd_install_relocation(). */ 1362 reloc->addend = fixp->fx_addnumber 1363 /* Fix because of MD_APPLY_SYM_VALUE() */ 1364 - S_GET_VALUE (fixp->fx_addsy) 1365 /* Fix for bfd_install_relocation() */ 1366 - (S_GET_VALUE (fixp->fx_addsy) 1367 + S_GET_SEGMENT (fixp->fx_addsy)->vma); 1368 } 1369 else if (fixp->fx_pcrel) 1370 reloc->addend = fixp->fx_addnumber; 1371 else 1372 reloc->addend = 0; 1373 #else 1374 if (!fixp->fx_pcrel) 1375 reloc->addend = fixp->fx_addnumber; 1376 else 1377 reloc->addend = (section->vma 1378 + fixp->fx_pcrel_adjust 1379 + fixp->fx_addnumber 1380 + md_pcrel_from (fixp)); 1381 #endif 1382 1383 reloc->howto = bfd_reloc_type_lookup (stdoutput, code); 1384 gas_assert (reloc->howto != 0); 1385 1386 return reloc; 1387 } 1388 1389 /* Handle of the OPCODE hash table. NULL means any use before 1390 m68k_ip_begin() will crash. */ 1391 static struct hash_control *op_hash; 1392 1393 /* Assemble an m68k instruction. */ 1395 1396 static void 1397 m68k_ip (char *instring) 1398 { 1399 char *p; 1400 struct m68k_op *opP; 1401 const struct m68k_incant *opcode; 1402 const char *s; 1403 int tmpreg = 0, baseo = 0, outro = 0, nextword; 1404 char *pdot, *pdotmove; 1405 enum m68k_size siz1, siz2; 1406 char c; 1407 int losing; 1408 int opsfound; 1409 struct m68k_op operands_backup[6]; 1410 LITTLENUM_TYPE words[6]; 1411 LITTLENUM_TYPE *wordp; 1412 unsigned long ok_arch = 0; 1413 1414 if (*instring == ' ') 1415 instring++; /* Skip leading whitespace. */ 1416 1417 /* Scan up to end of operation-code, which MUST end in end-of-string 1418 or exactly 1 space. */ 1419 pdot = 0; 1420 for (p = instring; *p != '\0'; p++) 1421 { 1422 if (*p == ' ') 1423 break; 1424 if (*p == '.') 1425 pdot = p; 1426 } 1427 1428 if (p == instring) 1429 { 1430 the_ins.error = _("No operator"); 1431 return; 1432 } 1433 1434 /* p now points to the end of the opcode name, probably whitespace. 1435 Make sure the name is null terminated by clobbering the 1436 whitespace, look it up in the hash table, then fix it back. 1437 Remove a dot, first, since the opcode tables have none. */ 1438 if (pdot != NULL) 1439 { 1440 for (pdotmove = pdot; pdotmove < p; pdotmove++) 1441 *pdotmove = pdotmove[1]; 1442 p--; 1443 } 1444 1445 c = *p; 1446 *p = '\0'; 1447 opcode = (const struct m68k_incant *) hash_find (op_hash, instring); 1448 *p = c; 1449 1450 if (pdot != NULL) 1451 { 1452 for (pdotmove = p; pdotmove > pdot; pdotmove--) 1453 *pdotmove = pdotmove[-1]; 1454 *pdot = '.'; 1455 ++p; 1456 } 1457 1458 if (opcode == NULL) 1459 { 1460 the_ins.error = _("Unknown operator"); 1461 return; 1462 } 1463 1464 /* Found a legitimate opcode, start matching operands. */ 1465 while (*p == ' ') 1466 ++p; 1467 1468 if (opcode->m_operands == 0) 1469 { 1470 char *old = input_line_pointer; 1471 *old = '\n'; 1472 input_line_pointer = p; 1473 /* Ahh - it's a motorola style psuedo op. */ 1474 mote_pseudo_table[opcode->m_opnum].poc_handler 1475 (mote_pseudo_table[opcode->m_opnum].poc_val); 1476 input_line_pointer = old; 1477 *old = 0; 1478 1479 return; 1480 } 1481 1482 if (flag_mri && opcode->m_opnum == 0) 1483 { 1484 /* In MRI mode, random garbage is allowed after an instruction 1485 which accepts no operands. */ 1486 the_ins.args = opcode->m_operands; 1487 the_ins.numargs = opcode->m_opnum; 1488 the_ins.numo = opcode->m_codenum; 1489 the_ins.opcode[0] = getone (opcode); 1490 the_ins.opcode[1] = gettwo (opcode); 1491 return; 1492 } 1493 1494 for (opP = &the_ins.operands[0]; *p; opP++) 1495 { 1496 p = crack_operand (p, opP); 1497 1498 if (opP->error) 1499 { 1500 the_ins.error = opP->error; 1501 return; 1502 } 1503 } 1504 1505 opsfound = opP - &the_ins.operands[0]; 1506 1507 /* This ugly hack is to support the floating pt opcodes in their 1508 standard form. Essentially, we fake a first enty of type COP#1 */ 1509 if (opcode->m_operands[0] == 'I') 1510 { 1511 int n; 1512 1513 for (n = opsfound; n > 0; --n) 1514 the_ins.operands[n] = the_ins.operands[n - 1]; 1515 1516 memset (&the_ins.operands[0], '\0', sizeof (the_ins.operands[0])); 1517 the_ins.operands[0].mode = CONTROL; 1518 the_ins.operands[0].reg = m68k_float_copnum; 1519 opsfound++; 1520 } 1521 1522 /* We've got the operands. Find an opcode that'll accept them. */ 1523 for (losing = 0;;) 1524 { 1525 /* If we didn't get the right number of ops, or we have no 1526 common model with this pattern then reject this pattern. */ 1527 1528 ok_arch |= opcode->m_arch; 1529 if (opsfound != opcode->m_opnum 1530 || ((opcode->m_arch & current_architecture) == 0)) 1531 ++losing; 1532 else 1533 { 1534 int i; 1535 1536 /* Make a copy of the operands of this insn so that 1537 we can modify them safely, should we want to. */ 1538 gas_assert (opsfound <= (int) ARRAY_SIZE (operands_backup)); 1539 for (i = 0; i < opsfound; i++) 1540 operands_backup[i] = the_ins.operands[i]; 1541 1542 for (s = opcode->m_operands, opP = &operands_backup[0]; 1543 *s && !losing; 1544 s += 2, opP++) 1545 { 1546 /* Warning: this switch is huge! */ 1547 /* I've tried to organize the cases into this order: 1548 non-alpha first, then alpha by letter. Lower-case 1549 goes directly before uppercase counterpart. */ 1550 /* Code with multiple case ...: gets sorted by the lowest 1551 case ... it belongs to. I hope this makes sense. */ 1552 switch (*s) 1553 { 1554 case '!': 1555 switch (opP->mode) 1556 { 1557 case IMMED: 1558 case DREG: 1559 case AREG: 1560 case FPREG: 1561 case CONTROL: 1562 case AINC: 1563 case ADEC: 1564 case REGLST: 1565 losing++; 1566 break; 1567 default: 1568 break; 1569 } 1570 break; 1571 1572 case '<': 1573 switch (opP->mode) 1574 { 1575 case DREG: 1576 case AREG: 1577 case FPREG: 1578 case CONTROL: 1579 case IMMED: 1580 case ADEC: 1581 case REGLST: 1582 losing++; 1583 break; 1584 default: 1585 break; 1586 } 1587 break; 1588 1589 case '>': 1590 switch (opP->mode) 1591 { 1592 case DREG: 1593 case AREG: 1594 case FPREG: 1595 case CONTROL: 1596 case IMMED: 1597 case AINC: 1598 case REGLST: 1599 losing++; 1600 break; 1601 case ABSL: 1602 break; 1603 default: 1604 if (opP->reg == PC 1605 || opP->reg == ZPC) 1606 losing++; 1607 break; 1608 } 1609 break; 1610 1611 case 'm': 1612 switch (opP->mode) 1613 { 1614 case DREG: 1615 case AREG: 1616 case AINDR: 1617 case AINC: 1618 case ADEC: 1619 break; 1620 default: 1621 losing++; 1622 } 1623 break; 1624 1625 case 'n': 1626 switch (opP->mode) 1627 { 1628 case DISP: 1629 break; 1630 default: 1631 losing++; 1632 } 1633 break; 1634 1635 case 'o': 1636 switch (opP->mode) 1637 { 1638 case BASE: 1639 case ABSL: 1640 case IMMED: 1641 break; 1642 default: 1643 losing++; 1644 } 1645 break; 1646 1647 case 'p': 1648 switch (opP->mode) 1649 { 1650 case DREG: 1651 case AREG: 1652 case AINDR: 1653 case AINC: 1654 case ADEC: 1655 break; 1656 case DISP: 1657 if (opP->reg == PC || opP->reg == ZPC) 1658 losing++; 1659 break; 1660 default: 1661 losing++; 1662 } 1663 break; 1664 1665 case 'q': 1666 switch (opP->mode) 1667 { 1668 case DREG: 1669 case AINDR: 1670 case AINC: 1671 case ADEC: 1672 break; 1673 case DISP: 1674 if (opP->reg == PC || opP->reg == ZPC) 1675 losing++; 1676 break; 1677 default: 1678 losing++; 1679 break; 1680 } 1681 break; 1682 1683 case 'v': 1684 switch (opP->mode) 1685 { 1686 case DREG: 1687 case AINDR: 1688 case AINC: 1689 case ADEC: 1690 case ABSL: 1691 break; 1692 case DISP: 1693 if (opP->reg == PC || opP->reg == ZPC) 1694 losing++; 1695 break; 1696 default: 1697 losing++; 1698 break; 1699 } 1700 break; 1701 1702 case '#': 1703 if (opP->mode != IMMED) 1704 losing++; 1705 else if (s[1] == 'b' 1706 && ! isvar (&opP->disp) 1707 && (opP->disp.exp.X_op != O_constant 1708 || ! isbyte (opP->disp.exp.X_add_number))) 1709 losing++; 1710 else if (s[1] == 'B' 1711 && ! isvar (&opP->disp) 1712 && (opP->disp.exp.X_op != O_constant 1713 || ! issbyte (opP->disp.exp.X_add_number))) 1714 losing++; 1715 else if (s[1] == 'w' 1716 && ! isvar (&opP->disp) 1717 && (opP->disp.exp.X_op != O_constant 1718 || ! isword (opP->disp.exp.X_add_number))) 1719 losing++; 1720 else if (s[1] == 'W' 1721 && ! isvar (&opP->disp) 1722 && (opP->disp.exp.X_op != O_constant 1723 || ! issword (opP->disp.exp.X_add_number))) 1724 losing++; 1725 break; 1726 1727 case '^': 1728 case 'T': 1729 if (opP->mode != IMMED) 1730 losing++; 1731 break; 1732 1733 case '$': 1734 if (opP->mode == AREG 1735 || opP->mode == CONTROL 1736 || opP->mode == FPREG 1737 || opP->mode == IMMED 1738 || opP->mode == REGLST 1739 || (opP->mode != ABSL 1740 && (opP->reg == PC 1741 || opP->reg == ZPC))) 1742 losing++; 1743 break; 1744 1745 case '%': 1746 if (opP->mode == CONTROL 1747 || opP->mode == FPREG 1748 || opP->mode == REGLST 1749 || opP->mode == IMMED 1750 || (opP->mode != ABSL 1751 && (opP->reg == PC 1752 || opP->reg == ZPC))) 1753 losing++; 1754 break; 1755 1756 case '&': 1757 switch (opP->mode) 1758 { 1759 case DREG: 1760 case AREG: 1761 case FPREG: 1762 case CONTROL: 1763 case IMMED: 1764 case AINC: 1765 case ADEC: 1766 case REGLST: 1767 losing++; 1768 break; 1769 case ABSL: 1770 break; 1771 default: 1772 if (opP->reg == PC 1773 || opP->reg == ZPC) 1774 losing++; 1775 break; 1776 } 1777 break; 1778 1779 case '*': 1780 if (opP->mode == CONTROL 1781 || opP->mode == FPREG 1782 || opP->mode == REGLST) 1783 losing++; 1784 break; 1785 1786 case '+': 1787 if (opP->mode != AINC) 1788 losing++; 1789 break; 1790 1791 case '-': 1792 if (opP->mode != ADEC) 1793 losing++; 1794 break; 1795 1796 case '/': 1797 switch (opP->mode) 1798 { 1799 case AREG: 1800 case CONTROL: 1801 case FPREG: 1802 case AINC: 1803 case ADEC: 1804 case IMMED: 1805 case REGLST: 1806 losing++; 1807 break; 1808 default: 1809 break; 1810 } 1811 break; 1812 1813 case ';': 1814 switch (opP->mode) 1815 { 1816 case AREG: 1817 case CONTROL: 1818 case FPREG: 1819 case REGLST: 1820 losing++; 1821 break; 1822 default: 1823 break; 1824 } 1825 break; 1826 1827 case '?': 1828 switch (opP->mode) 1829 { 1830 case AREG: 1831 case CONTROL: 1832 case FPREG: 1833 case AINC: 1834 case ADEC: 1835 case IMMED: 1836 case REGLST: 1837 losing++; 1838 break; 1839 case ABSL: 1840 break; 1841 default: 1842 if (opP->reg == PC || opP->reg == ZPC) 1843 losing++; 1844 break; 1845 } 1846 break; 1847 1848 case '@': 1849 switch (opP->mode) 1850 { 1851 case AREG: 1852 case CONTROL: 1853 case FPREG: 1854 case IMMED: 1855 case REGLST: 1856 losing++; 1857 break; 1858 default: 1859 break; 1860 } 1861 break; 1862 1863 case '~': /* For now! (JF FOO is this right?) */ 1864 switch (opP->mode) 1865 { 1866 case DREG: 1867 case AREG: 1868 case CONTROL: 1869 case FPREG: 1870 case IMMED: 1871 case REGLST: 1872 losing++; 1873 break; 1874 case ABSL: 1875 break; 1876 default: 1877 if (opP->reg == PC 1878 || opP->reg == ZPC) 1879 losing++; 1880 break; 1881 } 1882 break; 1883 1884 case '3': 1885 if (opP->mode != CONTROL 1886 || (opP->reg != TT0 && opP->reg != TT1)) 1887 losing++; 1888 break; 1889 1890 case 'A': 1891 if (opP->mode != AREG) 1892 losing++; 1893 break; 1894 1895 case 'a': 1896 if (opP->mode != AINDR) 1897 ++losing; 1898 break; 1899 1900 case '4': 1901 if (opP->mode != AINDR && opP->mode != AINC && opP->mode != ADEC 1902 && (opP->mode != DISP 1903 || opP->reg < ADDR0 1904 || opP->reg > ADDR7)) 1905 ++losing; 1906 break; 1907 1908 case 'B': /* FOO */ 1909 if (opP->mode != ABSL 1910 || (flag_long_jumps 1911 && strncmp (instring, "jbsr", 4) == 0)) 1912 losing++; 1913 break; 1914 1915 case 'b': 1916 switch (opP->mode) 1917 { 1918 case IMMED: 1919 case ABSL: 1920 case AREG: 1921 case FPREG: 1922 case CONTROL: 1923 case POST: 1924 case PRE: 1925 case REGLST: 1926 losing++; 1927 break; 1928 default: 1929 break; 1930 } 1931 break; 1932 1933 case 'C': 1934 if (opP->mode != CONTROL || opP->reg != CCR) 1935 losing++; 1936 break; 1937 1938 case 'd': 1939 if (opP->mode != DISP 1940 || opP->reg < ADDR0 1941 || opP->reg > ADDR7) 1942 losing++; 1943 break; 1944 1945 case 'D': 1946 if (opP->mode != DREG) 1947 losing++; 1948 break; 1949 1950 case 'E': 1951 if (opP->reg != ACC) 1952 losing++; 1953 break; 1954 1955 case 'e': 1956 if (opP->reg != ACC && opP->reg != ACC1 1957 && opP->reg != ACC2 && opP->reg != ACC3) 1958 losing++; 1959 break; 1960 1961 case 'F': 1962 if (opP->mode != FPREG) 1963 losing++; 1964 break; 1965 1966 case 'G': 1967 if (opP->reg != MACSR) 1968 losing++; 1969 break; 1970 1971 case 'g': 1972 if (opP->reg != ACCEXT01 && opP->reg != ACCEXT23) 1973 losing++; 1974 break; 1975 1976 case 'H': 1977 if (opP->reg != MASK) 1978 losing++; 1979 break; 1980 1981 case 'I': 1982 if (opP->mode != CONTROL 1983 || opP->reg < COP0 1984 || opP->reg > COP7) 1985 losing++; 1986 break; 1987 1988 case 'i': 1989 if (opP->mode != LSH && opP->mode != RSH) 1990 losing++; 1991 break; 1992 1993 case 'J': 1994 if (opP->mode != CONTROL 1995 || opP->reg < USP 1996 || opP->reg > last_movec_reg 1997 || !control_regs) 1998 losing++; 1999 else 2000 { 2001 const enum m68k_register *rp; 2002 2003 for (rp = control_regs; *rp; rp++) 2004 { 2005 if (*rp == opP->reg) 2006 break; 2007 /* In most CPUs RAMBAR refers to control reg 2008 c05 (RAMBAR1), but a few CPUs have it 2009 refer to c04 (RAMBAR0). */ 2010 else if (*rp == RAMBAR_ALT && opP->reg == RAMBAR) 2011 { 2012 opP->reg = RAMBAR_ALT; 2013 break; 2014 } 2015 } 2016 if (*rp == 0) 2017 losing++; 2018 } 2019 break; 2020 2021 case 'k': 2022 if (opP->mode != IMMED) 2023 losing++; 2024 break; 2025 2026 case 'l': 2027 case 'L': 2028 if (opP->mode == DREG 2029 || opP->mode == AREG 2030 || opP->mode == FPREG) 2031 { 2032 if (s[1] == '8') 2033 losing++; 2034 else 2035 { 2036 switch (opP->mode) 2037 { 2038 case DREG: 2039 opP->mask = 1 << (opP->reg - DATA0); 2040 break; 2041 case AREG: 2042 opP->mask = 1 << (opP->reg - ADDR0 + 8); 2043 break; 2044 case FPREG: 2045 opP->mask = 1 << (opP->reg - FP0 + 16); 2046 break; 2047 default: 2048 abort (); 2049 } 2050 opP->mode = REGLST; 2051 } 2052 } 2053 else if (opP->mode == CONTROL) 2054 { 2055 if (s[1] != '8') 2056 losing++; 2057 else 2058 { 2059 switch (opP->reg) 2060 { 2061 case FPI: 2062 opP->mask = 1 << 24; 2063 break; 2064 case FPS: 2065 opP->mask = 1 << 25; 2066 break; 2067 case FPC: 2068 opP->mask = 1 << 26; 2069 break; 2070 default: 2071 losing++; 2072 break; 2073 } 2074 opP->mode = REGLST; 2075 } 2076 } 2077 else if (opP->mode != REGLST) 2078 losing++; 2079 else if (s[1] == '8' && (opP->mask & 0x0ffffff) != 0) 2080 losing++; 2081 else if (s[1] == '3' && (opP->mask & 0x7000000) != 0) 2082 losing++; 2083 break; 2084 2085 case 'M': 2086 if (opP->mode != IMMED) 2087 losing++; 2088 else if (opP->disp.exp.X_op != O_constant 2089 || ! issbyte (opP->disp.exp.X_add_number)) 2090 losing++; 2091 else if (! m68k_quick 2092 && instring[3] != 'q' 2093 && instring[4] != 'q') 2094 losing++; 2095 break; 2096 2097 case 'O': 2098 if (opP->mode != DREG 2099 && opP->mode != IMMED 2100 && opP->mode != ABSL) 2101 losing++; 2102 break; 2103 2104 case 'Q': 2105 if (opP->mode != IMMED) 2106 losing++; 2107 else if (opP->disp.exp.X_op != O_constant 2108 || TRUNC (opP->disp.exp.X_add_number) - 1 > 7) 2109 losing++; 2110 else if (! m68k_quick 2111 && (strncmp (instring, "add", 3) == 0 2112 || strncmp (instring, "sub", 3) == 0) 2113 && instring[3] != 'q') 2114 losing++; 2115 break; 2116 2117 case 'R': 2118 if (opP->mode != DREG && opP->mode != AREG) 2119 losing++; 2120 break; 2121 2122 case 'r': 2123 if (opP->mode != AINDR 2124 && (opP->mode != BASE 2125 || (opP->reg != 0 2126 && opP->reg != ZADDR0) 2127 || opP->disp.exp.X_op != O_absent 2128 || ((opP->index.reg < DATA0 2129 || opP->index.reg > DATA7) 2130 && (opP->index.reg < ADDR0 2131 || opP->index.reg > ADDR7)) 2132 || opP->index.size != SIZE_UNSPEC 2133 || opP->index.scale != 1)) 2134 losing++; 2135 break; 2136 2137 case 's': 2138 if (opP->mode != CONTROL 2139 || ! (opP->reg == FPI 2140 || opP->reg == FPS 2141 || opP->reg == FPC)) 2142 losing++; 2143 break; 2144 2145 case 'S': 2146 if (opP->mode != CONTROL || opP->reg != SR) 2147 losing++; 2148 break; 2149 2150 case 't': 2151 if (opP->mode != IMMED) 2152 losing++; 2153 else if (opP->disp.exp.X_op != O_constant 2154 || TRUNC (opP->disp.exp.X_add_number) > 7) 2155 losing++; 2156 break; 2157 2158 case 'U': 2159 if (opP->mode != CONTROL || opP->reg != USP) 2160 losing++; 2161 break; 2162 2163 case 'x': 2164 if (opP->mode != IMMED) 2165 losing++; 2166 else if (opP->disp.exp.X_op != O_constant 2167 || (TRUNC (opP->disp.exp.X_add_number) != 0xffffffff 2168 && TRUNC (opP->disp.exp.X_add_number) - 1 > 6)) 2169 losing++; 2170 break; 2171 2172 case 'j': 2173 if (opP->mode != IMMED) 2174 losing++; 2175 else if (opP->disp.exp.X_op != O_constant 2176 || TRUNC (opP->disp.exp.X_add_number) - 1 > 7) 2177 losing++; 2178 break; 2179 2180 case 'K': 2181 if (opP->mode != IMMED) 2182 losing++; 2183 else if (opP->disp.exp.X_op != O_constant 2184 || TRUNC (opP->disp.exp.X_add_number) > 511) 2185 losing++; 2186 break; 2187 2188 /* JF these are out of order. We could put them 2189 in order if we were willing to put up with 2190 bunches of #ifdef m68851s in the code. 2191 2192 Don't forget that you need these operands 2193 to use 68030 MMU instructions. */ 2194 #ifndef NO_68851 2195 /* Memory addressing mode used by pflushr. */ 2196 case '|': 2197 if (opP->mode == CONTROL 2198 || opP->mode == FPREG 2199 || opP->mode == DREG 2200 || opP->mode == AREG 2201 || opP->mode == REGLST) 2202 losing++; 2203 /* We should accept immediate operands, but they 2204 supposedly have to be quad word, and we don't 2205 handle that. I would like to see what a Motorola 2206 assembler does before doing something here. */ 2207 if (opP->mode == IMMED) 2208 losing++; 2209 break; 2210 2211 case 'f': 2212 if (opP->mode != CONTROL 2213 || (opP->reg != SFC && opP->reg != DFC)) 2214 losing++; 2215 break; 2216 2217 case '0': 2218 if (opP->mode != CONTROL || opP->reg != TC) 2219 losing++; 2220 break; 2221 2222 case '1': 2223 if (opP->mode != CONTROL || opP->reg != AC) 2224 losing++; 2225 break; 2226 2227 case '2': 2228 if (opP->mode != CONTROL 2229 || (opP->reg != CAL 2230 && opP->reg != VAL 2231 && opP->reg != SCC)) 2232 losing++; 2233 break; 2234 2235 case 'V': 2236 if (opP->mode != CONTROL 2237 || opP->reg != VAL) 2238 losing++; 2239 break; 2240 2241 case 'W': 2242 if (opP->mode != CONTROL 2243 || (opP->reg != DRP 2244 && opP->reg != SRP 2245 && opP->reg != CRP)) 2246 losing++; 2247 break; 2248 2249 case 'w': 2250 switch (opP->mode) 2251 { 2252 case IMMED: 2253 case ABSL: 2254 case AREG: 2255 case DREG: 2256 case FPREG: 2257 case CONTROL: 2258 case POST: 2259 case PRE: 2260 case REGLST: 2261 losing++; 2262 break; 2263 default: 2264 break; 2265 } 2266 break; 2267 2268 case 'X': 2269 if (opP->mode != CONTROL 2270 || (!(opP->reg >= BAD && opP->reg <= BAD + 7) 2271 && !(opP->reg >= BAC && opP->reg <= BAC + 7))) 2272 losing++; 2273 break; 2274 2275 case 'Y': 2276 if (opP->mode != CONTROL || opP->reg != PSR) 2277 losing++; 2278 break; 2279 2280 case 'Z': 2281 if (opP->mode != CONTROL || opP->reg != PCSR) 2282 losing++; 2283 break; 2284 #endif 2285 case 'c': 2286 if (opP->mode != CONTROL 2287 || (opP->reg != NC 2288 && opP->reg != IC 2289 && opP->reg != DC 2290 && opP->reg != BC)) 2291 losing++; 2292 break; 2293 2294 case '_': 2295 if (opP->mode != ABSL) 2296 ++losing; 2297 break; 2298 2299 case 'u': 2300 if (opP->reg < DATA0L || opP->reg > ADDR7U) 2301 losing++; 2302 /* FIXME: kludge instead of fixing parser: 2303 upper/lower registers are *not* CONTROL 2304 registers, but ordinary ones. */ 2305 if ((opP->reg >= DATA0L && opP->reg <= DATA7L) 2306 || (opP->reg >= DATA0U && opP->reg <= DATA7U)) 2307 opP->mode = DREG; 2308 else 2309 opP->mode = AREG; 2310 break; 2311 2312 case 'y': 2313 if (!(opP->mode == AINDR 2314 || (opP->mode == DISP 2315 && !(opP->reg == PC || opP->reg == ZPC)))) 2316 losing++; 2317 break; 2318 2319 case 'z': 2320 if (!(opP->mode == AINDR || opP->mode == DISP)) 2321 losing++; 2322 break; 2323 2324 default: 2325 abort (); 2326 } 2327 2328 if (losing) 2329 break; 2330 } 2331 2332 /* Since we have found the correct instruction, copy 2333 in the modifications that we may have made. */ 2334 if (!losing) 2335 for (i = 0; i < opsfound; i++) 2336 the_ins.operands[i] = operands_backup[i]; 2337 } 2338 2339 if (!losing) 2340 break; 2341 2342 opcode = opcode->m_next; 2343 2344 if (!opcode) 2345 { 2346 if (ok_arch 2347 && !(ok_arch & current_architecture)) 2348 { 2349 const struct m68k_cpu *cpu; 2350 int any = 0; 2351 size_t space = 400; 2352 char *buf = XNEWVEC (char, space + 1); 2353 size_t len; 2354 int paren = 1; 2355 2356 the_ins.error = buf; 2357 /* Make sure there's a NUL at the end of the buffer -- strncpy 2358 won't write one when it runs out of buffer. */ 2359 buf[space] = 0; 2360 #define APPEND(STRING) \ 2361 (strncpy (buf, STRING, space), len = strlen (buf), buf += len, space -= len) 2362 2363 APPEND (_("invalid instruction for this architecture; needs ")); 2364 switch (ok_arch) 2365 { 2366 case mcfisa_a: 2367 APPEND ("ColdFire ISA_A"); 2368 break; 2369 case mcfhwdiv: 2370 APPEND ("ColdFire "); 2371 APPEND (_("hardware divide")); 2372 break; 2373 case mcfisa_aa: 2374 APPEND ("ColdFire ISA_A+"); 2375 break; 2376 case mcfisa_b: 2377 APPEND ("ColdFire ISA_B"); 2378 break; 2379 case mcfisa_c: 2380 APPEND ("ColdFire ISA_C"); 2381 break; 2382 case cfloat: 2383 APPEND ("ColdFire fpu"); 2384 break; 2385 case mfloat: 2386 APPEND ("M68K fpu"); 2387 break; 2388 case mmmu: 2389 APPEND ("M68K mmu"); 2390 break; 2391 case m68020up: 2392 APPEND ("68020 "); 2393 APPEND (_("or higher")); 2394 break; 2395 case m68000up: 2396 APPEND ("68000 "); 2397 APPEND (_("or higher")); 2398 break; 2399 case m68010up: 2400 APPEND ("68010 "); 2401 APPEND (_("or higher")); 2402 break; 2403 default: 2404 paren = 0; 2405 } 2406 if (paren) 2407 APPEND (" ("); 2408 2409 for (cpu = m68k_cpus; cpu->name; cpu++) 2410 if (!cpu->alias && (cpu->arch & ok_arch)) 2411 { 2412 const struct m68k_cpu *alias; 2413 int seen_master = 0; 2414 2415 if (any) 2416 APPEND (", "); 2417 any = 0; 2418 APPEND (cpu->name); 2419 for (alias = cpu; alias != m68k_cpus; alias--) 2420 if (alias[-1].alias >= 0) 2421 break; 2422 for (; !seen_master || alias->alias > 0; alias++) 2423 { 2424 if (!alias->alias) 2425 seen_master = 1; 2426 else 2427 { 2428 if (any) 2429 APPEND (", "); 2430 else 2431 APPEND (" ["); 2432 APPEND (alias->name); 2433 any = 1; 2434 } 2435 } 2436 if (any) 2437 APPEND ("]"); 2438 any = 1; 2439 } 2440 if (paren) 2441 APPEND (")"); 2442 #undef APPEND 2443 if (!space) 2444 { 2445 /* We ran out of space, so replace the end of the list 2446 with ellipsis. */ 2447 buf -= 4; 2448 while (*buf != ' ') 2449 buf--; 2450 strcpy (buf, " ..."); 2451 } 2452 } 2453 else 2454 the_ins.error = _("operands mismatch"); 2455 return; 2456 } 2457 2458 losing = 0; 2459 } 2460 2461 /* Now assemble it. */ 2462 the_ins.args = opcode->m_operands; 2463 the_ins.numargs = opcode->m_opnum; 2464 the_ins.numo = opcode->m_codenum; 2465 the_ins.opcode[0] = getone (opcode); 2466 the_ins.opcode[1] = gettwo (opcode); 2467 2468 for (s = the_ins.args, opP = &the_ins.operands[0]; *s; s += 2, opP++) 2469 { 2470 int have_disp = 0; 2471 int use_pl = 0; 2472 2473 /* This switch is a doozy. 2474 Watch the first step; its a big one! */ 2475 switch (s[0]) 2476 { 2477 2478 case '*': 2479 case '~': 2480 case '%': 2481 case ';': 2482 case '@': 2483 case '!': 2484 case '&': 2485 case '$': 2486 case '?': 2487 case '/': 2488 case '<': 2489 case '>': 2490 case 'b': 2491 case 'm': 2492 case 'n': 2493 case 'o': 2494 case 'p': 2495 case 'q': 2496 case 'v': 2497 case 'w': 2498 case 'y': 2499 case 'z': 2500 case '4': 2501 #ifndef NO_68851 2502 case '|': 2503 #endif 2504 switch (opP->mode) 2505 { 2506 case IMMED: 2507 tmpreg = 0x3c; /* 7.4 */ 2508 if (strchr ("bwl", s[1])) 2509 nextword = get_num (&opP->disp, 90); 2510 else 2511 nextword = get_num (&opP->disp, 0); 2512 if (isvar (&opP->disp)) 2513 add_fix (s[1], &opP->disp, 0, 0); 2514 switch (s[1]) 2515 { 2516 case 'b': 2517 if (!isbyte (nextword)) 2518 opP->error = _("operand out of range"); 2519 addword (nextword); 2520 baseo = 0; 2521 break; 2522 case 'w': 2523 if (!isword (nextword)) 2524 opP->error = _("operand out of range"); 2525 addword (nextword); 2526 baseo = 0; 2527 break; 2528 case 'W': 2529 if (!issword (nextword)) 2530 opP->error = _("operand out of range"); 2531 addword (nextword); 2532 baseo = 0; 2533 break; 2534 case 'l': 2535 addword (nextword >> 16); 2536 addword (nextword); 2537 baseo = 0; 2538 break; 2539 2540 case 'f': 2541 baseo = 2; 2542 outro = 8; 2543 break; 2544 case 'F': 2545 baseo = 4; 2546 outro = 11; 2547 break; 2548 case 'x': 2549 baseo = 6; 2550 outro = 15; 2551 break; 2552 case 'p': 2553 baseo = 6; 2554 outro = -1; 2555 break; 2556 default: 2557 abort (); 2558 } 2559 if (!baseo) 2560 break; 2561 2562 /* We gotta put out some float. */ 2563 if (op (&opP->disp) != O_big) 2564 { 2565 valueT val; 2566 int gencnt; 2567 2568 /* Can other cases happen here? */ 2569 if (op (&opP->disp) != O_constant) 2570 abort (); 2571 2572 val = (valueT) offs (&opP->disp); 2573 gencnt = 0; 2574 do 2575 { 2576 generic_bignum[gencnt] = (LITTLENUM_TYPE) val; 2577 val >>= LITTLENUM_NUMBER_OF_BITS; 2578 ++gencnt; 2579 } 2580 while (val != 0); 2581 offs (&opP->disp) = gencnt; 2582 } 2583 if (offs (&opP->disp) > 0) 2584 { 2585 if (offs (&opP->disp) > baseo) 2586 { 2587 as_warn (_("Bignum too big for %c format; truncated"), 2588 s[1]); 2589 offs (&opP->disp) = baseo; 2590 } 2591 baseo -= offs (&opP->disp); 2592 while (baseo--) 2593 addword (0); 2594 for (wordp = generic_bignum + offs (&opP->disp) - 1; 2595 offs (&opP->disp)--; 2596 --wordp) 2597 addword (*wordp); 2598 break; 2599 } 2600 gen_to_words (words, baseo, (long) outro); 2601 for (wordp = words; baseo--; wordp++) 2602 addword (*wordp); 2603 break; 2604 case DREG: 2605 tmpreg = opP->reg - DATA; /* 0.dreg */ 2606 break; 2607 case AREG: 2608 tmpreg = 0x08 + opP->reg - ADDR; /* 1.areg */ 2609 break; 2610 case AINDR: 2611 tmpreg = 0x10 + opP->reg - ADDR; /* 2.areg */ 2612 break; 2613 case ADEC: 2614 tmpreg = 0x20 + opP->reg - ADDR; /* 4.areg */ 2615 break; 2616 case AINC: 2617 tmpreg = 0x18 + opP->reg - ADDR; /* 3.areg */ 2618 break; 2619 case DISP: 2620 2621 nextword = get_num (&opP->disp, 90); 2622 2623 /* Convert mode 5 addressing with a zero offset into 2624 mode 2 addressing to reduce the instruction size by a 2625 word. */ 2626 if (! isvar (&opP->disp) 2627 && (nextword == 0) 2628 && (opP->disp.size == SIZE_UNSPEC) 2629 && (opP->reg >= ADDR0) 2630 && (opP->reg <= ADDR7)) 2631 { 2632 tmpreg = 0x10 + opP->reg - ADDR; /* 2.areg */ 2633 break; 2634 } 2635 2636 if (opP->reg == PC 2637 && ! isvar (&opP->disp) 2638 && m68k_abspcadd) 2639 { 2640 opP->disp.exp.X_op = O_symbol; 2641 opP->disp.exp.X_add_symbol = 2642 section_symbol (absolute_section); 2643 } 2644 2645 /* Force into index mode. Hope this works. */ 2646 2647 /* We do the first bit for 32-bit displacements, and the 2648 second bit for 16 bit ones. It is possible that we 2649 should make the default be WORD instead of LONG, but 2650 I think that'd break GCC, so we put up with a little 2651 inefficiency for the sake of working output. */ 2652 2653 if (!issword (nextword) 2654 || (isvar (&opP->disp) 2655 && ((opP->disp.size == SIZE_UNSPEC 2656 && flag_short_refs == 0 2657 && cpu_of_arch (current_architecture) >= m68020 2658 && ! arch_coldfire_p (current_architecture)) 2659 || opP->disp.size == SIZE_LONG))) 2660 { 2661 if (cpu_of_arch (current_architecture) < m68020 2662 || arch_coldfire_p (current_architecture)) 2663 opP->error = 2664 _("displacement too large for this architecture; needs 68020 or higher"); 2665 if (opP->reg == PC) 2666 tmpreg = 0x3B; /* 7.3 */ 2667 else 2668 tmpreg = 0x30 + opP->reg - ADDR; /* 6.areg */ 2669 if (isvar (&opP->disp)) 2670 { 2671 if (opP->reg == PC) 2672 { 2673 if (opP->disp.size == SIZE_LONG 2674 #ifdef OBJ_ELF 2675 /* If the displacement needs pic 2676 relocation it cannot be relaxed. */ 2677 || opP->disp.pic_reloc != pic_none 2678 #endif 2679 ) 2680 { 2681 addword (0x0170); 2682 add_fix ('l', &opP->disp, 1, 2); 2683 } 2684 else 2685 { 2686 add_frag (adds (&opP->disp), 2687 SEXT (offs (&opP->disp)), 2688 TAB (PCREL1632, SZ_UNDEF)); 2689 break; 2690 } 2691 } 2692 else 2693 { 2694 addword (0x0170); 2695 add_fix ('l', &opP->disp, 0, 0); 2696 } 2697 } 2698 else 2699 addword (0x0170); 2700 addword (nextword >> 16); 2701 } 2702 else 2703 { 2704 if (opP->reg == PC) 2705 tmpreg = 0x3A; /* 7.2 */ 2706 else 2707 tmpreg = 0x28 + opP->reg - ADDR; /* 5.areg */ 2708 2709 if (isvar (&opP->disp)) 2710 { 2711 if (opP->reg == PC) 2712 { 2713 add_fix ('w', &opP->disp, 1, 0); 2714 } 2715 else 2716 add_fix ('w', &opP->disp, 0, 0); 2717 } 2718 } 2719 addword (nextword); 2720 break; 2721 2722 case POST: 2723 case PRE: 2724 case BASE: 2725 nextword = 0; 2726 baseo = get_num (&opP->disp, 90); 2727 if (opP->mode == POST || opP->mode == PRE) 2728 outro = get_num (&opP->odisp, 90); 2729 /* Figure out the `addressing mode'. 2730 Also turn on the BASE_DISABLE bit, if needed. */ 2731 if (opP->reg == PC || opP->reg == ZPC) 2732 { 2733 tmpreg = 0x3b; /* 7.3 */ 2734 if (opP->reg == ZPC) 2735 nextword |= 0x80; 2736 } 2737 else if (opP->reg == 0) 2738 { 2739 nextword |= 0x80; 2740 tmpreg = 0x30; /* 6.garbage */ 2741 } 2742 else if (opP->reg >= ZADDR0 && opP->reg <= ZADDR7) 2743 { 2744 nextword |= 0x80; 2745 tmpreg = 0x30 + opP->reg - ZADDR0; 2746 } 2747 else 2748 tmpreg = 0x30 + opP->reg - ADDR; /* 6.areg */ 2749 2750 siz1 = opP->disp.size; 2751 if (opP->mode == POST || opP->mode == PRE) 2752 siz2 = opP->odisp.size; 2753 else 2754 siz2 = SIZE_UNSPEC; 2755 2756 /* Index register stuff. */ 2757 if (opP->index.reg != 0 2758 && opP->index.reg >= DATA 2759 && opP->index.reg <= ADDR7) 2760 { 2761 nextword |= (opP->index.reg - DATA) << 12; 2762 2763 if (opP->index.size == SIZE_LONG 2764 || (opP->index.size == SIZE_UNSPEC 2765 && m68k_index_width_default == SIZE_LONG)) 2766 nextword |= 0x800; 2767 2768 if ((opP->index.scale != 1 2769 && cpu_of_arch (current_architecture) < m68020) 2770 || (opP->index.scale == 8 2771 && (arch_coldfire_p (current_architecture) 2772 && !arch_coldfire_fpu (current_architecture)))) 2773 { 2774 opP->error = 2775 _("scale factor invalid on this architecture; needs cpu32 or 68020 or higher"); 2776 } 2777 2778 if (arch_coldfire_p (current_architecture) 2779 && opP->index.size == SIZE_WORD) 2780 opP->error = _("invalid index size for coldfire"); 2781 2782 switch (opP->index.scale) 2783 { 2784 case 1: 2785 break; 2786 case 2: 2787 nextword |= 0x200; 2788 break; 2789 case 4: 2790 nextword |= 0x400; 2791 break; 2792 case 8: 2793 nextword |= 0x600; 2794 break; 2795 default: 2796 abort (); 2797 } 2798 /* IF its simple, 2799 GET US OUT OF HERE! */ 2800 2801 /* Must be INDEX, with an index register. Address 2802 register cannot be ZERO-PC, and either :b was 2803 forced, or we know it will fit. For a 68000 or 2804 68010, force this mode anyways, because the 2805 larger modes aren't supported. */ 2806 if (opP->mode == BASE 2807 && ((opP->reg >= ADDR0 2808 && opP->reg <= ADDR7) 2809 || opP->reg == PC)) 2810 { 2811 if (siz1 == SIZE_BYTE 2812 || cpu_of_arch (current_architecture) < m68020 2813 || arch_coldfire_p (current_architecture) 2814 || (siz1 == SIZE_UNSPEC 2815 && ! isvar (&opP->disp) 2816 && issbyte (baseo))) 2817 { 2818 nextword += baseo & 0xff; 2819 addword (nextword); 2820 if (isvar (&opP->disp)) 2821 { 2822 /* Do a byte relocation. If it doesn't 2823 fit (possible on m68000) let the 2824 fixup processing complain later. */ 2825 if (opP->reg == PC) 2826 add_fix ('B', &opP->disp, 1, 1); 2827 else 2828 add_fix ('B', &opP->disp, 0, 0); 2829 } 2830 else if (siz1 != SIZE_BYTE) 2831 { 2832 if (siz1 != SIZE_UNSPEC) 2833 as_warn (_("Forcing byte displacement")); 2834 if (! issbyte (baseo)) 2835 opP->error = _("byte displacement out of range"); 2836 } 2837 2838 break; 2839 } 2840 else if (siz1 == SIZE_UNSPEC 2841 && opP->reg == PC 2842 && isvar (&opP->disp) 2843 && subs (&opP->disp) == NULL 2844 #ifdef OBJ_ELF 2845 /* If the displacement needs pic 2846 relocation it cannot be relaxed. */ 2847 && opP->disp.pic_reloc == pic_none 2848 #endif 2849 ) 2850 { 2851 /* The code in md_convert_frag_1 needs to be 2852 able to adjust nextword. Call frag_grow 2853 to ensure that we have enough space in 2854 the frag obstack to make all the bytes 2855 contiguous. */ 2856 frag_grow (14); 2857 nextword += baseo & 0xff; 2858 addword (nextword); 2859 add_frag (adds (&opP->disp), 2860 SEXT (offs (&opP->disp)), 2861 TAB (PCINDEX, SZ_UNDEF)); 2862 2863 break; 2864 } 2865 } 2866 } 2867 else 2868 { 2869 nextword |= 0x40; /* No index reg. */ 2870 if (opP->index.reg >= ZDATA0 2871 && opP->index.reg <= ZDATA7) 2872 nextword |= (opP->index.reg - ZDATA0) << 12; 2873 else if (opP->index.reg >= ZADDR0 2874 || opP->index.reg <= ZADDR7) 2875 nextword |= (opP->index.reg - ZADDR0 + 8) << 12; 2876 } 2877 2878 /* It isn't simple. */ 2879 2880 if (cpu_of_arch (current_architecture) < m68020 2881 || arch_coldfire_p (current_architecture)) 2882 opP->error = 2883 _("invalid operand mode for this architecture; needs 68020 or higher"); 2884 2885 nextword |= 0x100; 2886 /* If the guy specified a width, we assume that it is 2887 wide enough. Maybe it isn't. If so, we lose. */ 2888 switch (siz1) 2889 { 2890 case SIZE_UNSPEC: 2891 if (isvar (&opP->disp) 2892 ? m68k_rel32 2893 : ! issword (baseo)) 2894 { 2895 siz1 = SIZE_LONG; 2896 nextword |= 0x30; 2897 } 2898 else if (! isvar (&opP->disp) && baseo == 0) 2899 nextword |= 0x10; 2900 else 2901 { 2902 nextword |= 0x20; 2903 siz1 = SIZE_WORD; 2904 } 2905 break; 2906 case SIZE_BYTE: 2907 as_warn (_(":b not permitted; defaulting to :w")); 2908 /* Fall through. */ 2909 case SIZE_WORD: 2910 nextword |= 0x20; 2911 break; 2912 case SIZE_LONG: 2913 nextword |= 0x30; 2914 break; 2915 } 2916 2917 /* Figure out inner displacement stuff. */ 2918 if (opP->mode == POST || opP->mode == PRE) 2919 { 2920 if (cpu_of_arch (current_architecture) & cpu32) 2921 opP->error = _("invalid operand mode for this architecture; needs 68020 or higher"); 2922 switch (siz2) 2923 { 2924 case SIZE_UNSPEC: 2925 if (isvar (&opP->odisp) 2926 ? m68k_rel32 2927 : ! issword (outro)) 2928 { 2929 siz2 = SIZE_LONG; 2930 nextword |= 0x3; 2931 } 2932 else if (! isvar (&opP->odisp) && outro == 0) 2933 nextword |= 0x1; 2934 else 2935 { 2936 nextword |= 0x2; 2937 siz2 = SIZE_WORD; 2938 } 2939 break; 2940 case 1: 2941 as_warn (_(":b not permitted; defaulting to :w")); 2942 /* Fall through. */ 2943 case 2: 2944 nextword |= 0x2; 2945 break; 2946 case 3: 2947 nextword |= 0x3; 2948 break; 2949 } 2950 if (opP->mode == POST 2951 && (nextword & 0x40) == 0) 2952 nextword |= 0x04; 2953 } 2954 addword (nextword); 2955 2956 if (siz1 != SIZE_UNSPEC && isvar (&opP->disp)) 2957 { 2958 if (opP->reg == PC || opP->reg == ZPC) 2959 add_fix (siz1 == SIZE_LONG ? 'l' : 'w', &opP->disp, 1, 2); 2960 else 2961 add_fix (siz1 == SIZE_LONG ? 'l' : 'w', &opP->disp, 0, 0); 2962 } 2963 if (siz1 == SIZE_LONG) 2964 addword (baseo >> 16); 2965 if (siz1 != SIZE_UNSPEC) 2966 addword (baseo); 2967 2968 if (siz2 != SIZE_UNSPEC && isvar (&opP->odisp)) 2969 add_fix (siz2 == SIZE_LONG ? 'l' : 'w', &opP->odisp, 0, 0); 2970 if (siz2 == SIZE_LONG) 2971 addword (outro >> 16); 2972 if (siz2 != SIZE_UNSPEC) 2973 addword (outro); 2974 2975 break; 2976 2977 case ABSL: 2978 nextword = get_num (&opP->disp, 90); 2979 switch (opP->disp.size) 2980 { 2981 default: 2982 abort (); 2983 case SIZE_UNSPEC: 2984 if (!isvar (&opP->disp) && issword (offs (&opP->disp))) 2985 { 2986 tmpreg = 0x38; /* 7.0 */ 2987 addword (nextword); 2988 break; 2989 } 2990 if (isvar (&opP->disp) 2991 && !subs (&opP->disp) 2992 && adds (&opP->disp) 2993 #ifdef OBJ_ELF 2994 /* If the displacement needs pic relocation it 2995 cannot be relaxed. */ 2996 && opP->disp.pic_reloc == pic_none 2997 #endif 2998 && !flag_long_jumps 2999 && !strchr ("~%&$?", s[0])) 3000 { 3001 tmpreg = 0x3A; /* 7.2 */ 3002 add_frag (adds (&opP->disp), 3003 SEXT (offs (&opP->disp)), 3004 TAB (ABSTOPCREL, SZ_UNDEF)); 3005 break; 3006 } 3007 /* Fall through into long. */ 3008 case SIZE_LONG: 3009 if (isvar (&opP->disp)) 3010 add_fix ('l', &opP->disp, 0, 0); 3011 3012 tmpreg = 0x39;/* 7.1 mode */ 3013 addword (nextword >> 16); 3014 addword (nextword); 3015 break; 3016 3017 case SIZE_BYTE: 3018 as_bad (_("unsupported byte value; use a different suffix")); 3019 /* Fall through. */ 3020 3021 case SIZE_WORD: 3022 if (isvar (&opP->disp)) 3023 add_fix ('w', &opP->disp, 0, 0); 3024 3025 tmpreg = 0x38;/* 7.0 mode */ 3026 addword (nextword); 3027 break; 3028 } 3029 break; 3030 case CONTROL: 3031 case FPREG: 3032 default: 3033 as_bad (_("unknown/incorrect operand")); 3034 /* abort (); */ 3035 } 3036 3037 /* If s[0] is '4', then this is for the mac instructions 3038 that can have a trailing_ampersand set. If so, set 0x100 3039 bit on tmpreg so install_gen_operand can check for it and 3040 set the appropriate bit (word2, bit 5). */ 3041 if (s[0] == '4') 3042 { 3043 if (opP->trailing_ampersand) 3044 tmpreg |= 0x100; 3045 } 3046 install_gen_operand (s[1], tmpreg); 3047 break; 3048 3049 case '#': 3050 case '^': 3051 switch (s[1]) 3052 { /* JF: I hate floating point! */ 3053 case 'j': 3054 tmpreg = 70; 3055 break; 3056 case '8': 3057 tmpreg = 20; 3058 break; 3059 case 'C': 3060 tmpreg = 50; 3061 break; 3062 case '3': 3063 default: 3064 tmpreg = 90; 3065 break; 3066 } 3067 tmpreg = get_num (&opP->disp, tmpreg); 3068 if (isvar (&opP->disp)) 3069 add_fix (s[1], &opP->disp, 0, 0); 3070 switch (s[1]) 3071 { 3072 case 'b': /* Danger: These do no check for 3073 certain types of overflow. 3074 user beware! */ 3075 if (!isbyte (tmpreg)) 3076 opP->error = _("out of range"); 3077 insop (tmpreg, opcode); 3078 if (isvar (&opP->disp)) 3079 the_ins.reloc[the_ins.nrel - 1].n = 3080 (opcode->m_codenum) * 2 + 1; 3081 break; 3082 case 'B': 3083 if (!issbyte (tmpreg)) 3084 opP->error = _("out of range"); 3085 the_ins.opcode[the_ins.numo - 1] |= tmpreg & 0xff; 3086 if (isvar (&opP->disp)) 3087 the_ins.reloc[the_ins.nrel - 1].n = opcode->m_codenum * 2 - 1; 3088 break; 3089 case 'w': 3090 if (!isword (tmpreg)) 3091 opP->error = _("out of range"); 3092 insop (tmpreg, opcode); 3093 if (isvar (&opP->disp)) 3094 the_ins.reloc[the_ins.nrel - 1].n = (opcode->m_codenum) * 2; 3095 break; 3096 case 'W': 3097 if (!issword (tmpreg)) 3098 opP->error = _("out of range"); 3099 insop (tmpreg, opcode); 3100 if (isvar (&opP->disp)) 3101 the_ins.reloc[the_ins.nrel - 1].n = (opcode->m_codenum) * 2; 3102 break; 3103 case 'l': 3104 /* Because of the way insop works, we put these two out 3105 backwards. */ 3106 insop (tmpreg, opcode); 3107 insop (tmpreg >> 16, opcode); 3108 if (isvar (&opP->disp)) 3109 the_ins.reloc[the_ins.nrel - 1].n = (opcode->m_codenum) * 2; 3110 break; 3111 case '3': 3112 tmpreg &= 0xFF; 3113 case '8': 3114 case 'C': 3115 case 'j': 3116 install_operand (s[1], tmpreg); 3117 break; 3118 default: 3119 abort (); 3120 } 3121 break; 3122 3123 case '+': 3124 case '-': 3125 case 'A': 3126 case 'a': 3127 install_operand (s[1], opP->reg - ADDR); 3128 break; 3129 3130 case 'B': 3131 tmpreg = get_num (&opP->disp, 90); 3132 3133 switch (s[1]) 3134 { 3135 case 'B': 3136 add_fix ('B', &opP->disp, 1, -1); 3137 break; 3138 case 'W': 3139 add_fix ('w', &opP->disp, 1, 0); 3140 addword (0); 3141 break; 3142 case 'L': 3143 long_branch: 3144 the_ins.opcode[0] |= 0xff; 3145 add_fix ('l', &opP->disp, 1, 0); 3146 addword (0); 3147 addword (0); 3148 break; 3149 case 'g': /* Conditional branch */ 3150 have_disp = HAVE_LONG_CALL (current_architecture); 3151 goto var_branch; 3152 3153 case 'b': /* Unconditional branch */ 3154 have_disp = HAVE_LONG_BRANCH (current_architecture); 3155 use_pl = LONG_BRANCH_VIA_COND (current_architecture); 3156 goto var_branch; 3157 3158 case 's': /* Unconditional subroutine */ 3159 have_disp = HAVE_LONG_CALL (current_architecture); 3160 3161 var_branch: 3162 if (subs (&opP->disp) /* We can't relax it. */ 3163 #ifdef OBJ_ELF 3164 /* If the displacement needs pic relocation it cannot be 3165 relaxed. */ 3166 || opP->disp.pic_reloc != pic_none 3167 #endif 3168 || 0) 3169 { 3170 if (!have_disp) 3171 as_warn (_("Can't use long branches on this architecture")); 3172 goto long_branch; 3173 } 3174 3175 /* This could either be a symbol, or an absolute 3176 address. If it's an absolute address, turn it into 3177 an absolute jump right here and keep it out of the 3178 relaxer. */ 3179 if (adds (&opP->disp) == 0) 3180 { 3181 if (the_ins.opcode[0] == 0x6000) /* jbra */ 3182 the_ins.opcode[0] = 0x4EF9; 3183 else if (the_ins.opcode[0] == 0x6100) /* jbsr */ 3184 the_ins.opcode[0] = 0x4EB9; 3185 else /* jCC */ 3186 { 3187 the_ins.opcode[0] ^= 0x0100; 3188 the_ins.opcode[0] |= 0x0006; 3189 addword (0x4EF9); 3190 } 3191 add_fix ('l', &opP->disp, 0, 0); 3192 addword (0); 3193 addword (0); 3194 break; 3195 } 3196 3197 /* Now we know it's going into the relaxer. Now figure 3198 out which mode. We try in this order of preference: 3199 long branch, absolute jump, byte/word branches only. */ 3200 if (have_disp) 3201 add_frag (adds (&opP->disp), 3202 SEXT (offs (&opP->disp)), 3203 TAB (BRANCHBWL, SZ_UNDEF)); 3204 else if (! flag_keep_pcrel) 3205 { 3206 if ((the_ins.opcode[0] == 0x6000) 3207 || (the_ins.opcode[0] == 0x6100)) 3208 add_frag (adds (&opP->disp), 3209 SEXT (offs (&opP->disp)), 3210 TAB (BRABSJUNC, SZ_UNDEF)); 3211 else 3212 add_frag (adds (&opP->disp), 3213 SEXT (offs (&opP->disp)), 3214 TAB (BRABSJCOND, SZ_UNDEF)); 3215 } 3216 else 3217 add_frag (adds (&opP->disp), 3218 SEXT (offs (&opP->disp)), 3219 (use_pl ? TAB (BRANCHBWPL, SZ_UNDEF) 3220 : TAB (BRANCHBW, SZ_UNDEF))); 3221 break; 3222 case 'w': 3223 if (isvar (&opP->disp)) 3224 { 3225 /* Check for DBcc instructions. We can relax them, 3226 but only if we have long branches and/or absolute 3227 jumps. */ 3228 if (((the_ins.opcode[0] & 0xf0f8) == 0x50c8) 3229 && (HAVE_LONG_BRANCH (current_architecture) 3230 || ! flag_keep_pcrel)) 3231 { 3232 if (HAVE_LONG_BRANCH (current_architecture)) 3233 add_frag (adds (&opP->disp), 3234 SEXT (offs (&opP->disp)), 3235 TAB (DBCCLBR, SZ_UNDEF)); 3236 else 3237 add_frag (adds (&opP->disp), 3238 SEXT (offs (&opP->disp)), 3239 TAB (DBCCABSJ, SZ_UNDEF)); 3240 break; 3241 } 3242 add_fix ('w', &opP->disp, 1, 0); 3243 } 3244 addword (0); 3245 break; 3246 case 'C': /* Fixed size LONG coproc branches. */ 3247 add_fix ('l', &opP->disp, 1, 0); 3248 addword (0); 3249 addword (0); 3250 break; 3251 case 'c': /* Var size Coprocesssor branches. */ 3252 if (subs (&opP->disp) || (adds (&opP->disp) == 0)) 3253 { 3254 the_ins.opcode[the_ins.numo - 1] |= 0x40; 3255 add_fix ('l', &opP->disp, 1, 0); 3256 addword (0); 3257 addword (0); 3258 } 3259 else 3260 add_frag (adds (&opP->disp), 3261 SEXT (offs (&opP->disp)), 3262 TAB (FBRANCH, SZ_UNDEF)); 3263 break; 3264 default: 3265 abort (); 3266 } 3267 break; 3268 3269 case 'C': /* Ignore it. */ 3270 break; 3271 3272 case 'd': /* JF this is a kludge. */ 3273 install_operand ('s', opP->reg - ADDR); 3274 tmpreg = get_num (&opP->disp, 90); 3275 if (!issword (tmpreg)) 3276 { 3277 as_warn (_("Expression out of range, using 0")); 3278 tmpreg = 0; 3279 } 3280 addword (tmpreg); 3281 break; 3282 3283 case 'D': 3284 install_operand (s[1], opP->reg - DATA); 3285 break; 3286 3287 case 'e': /* EMAC ACCx, reg/reg. */ 3288 install_operand (s[1], opP->reg - ACC); 3289 break; 3290 3291 case 'E': /* Ignore it. */ 3292 break; 3293 3294 case 'F': 3295 install_operand (s[1], opP->reg - FP0); 3296 break; 3297 3298 case 'g': /* EMAC ACCEXTx. */ 3299 install_operand (s[1], opP->reg - ACCEXT01); 3300 break; 3301 3302 case 'G': /* Ignore it. */ 3303 case 'H': 3304 break; 3305 3306 case 'I': 3307 tmpreg = opP->reg - COP0; 3308 install_operand (s[1], tmpreg); 3309 break; 3310 3311 case 'i': /* MAC/EMAC scale factor. */ 3312 install_operand (s[1], opP->mode == LSH ? 0x1 : 0x3); 3313 break; 3314 3315 case 'J': /* JF foo. */ 3316 switch (opP->reg) 3317 { 3318 case SFC: 3319 tmpreg = 0x000; 3320 break; 3321 case DFC: 3322 tmpreg = 0x001; 3323 break; 3324 case CACR: 3325 tmpreg = 0x002; 3326 break; 3327 case TC: 3328 case ASID: 3329 tmpreg = 0x003; 3330 break; 3331 case ACR0: 3332 case ITT0: 3333 tmpreg = 0x004; 3334 break; 3335 case ACR1: 3336 case ITT1: 3337 tmpreg = 0x005; 3338 break; 3339 case ACR2: 3340 case DTT0: 3341 tmpreg = 0x006; 3342 break; 3343 case ACR3: 3344 case DTT1: 3345 tmpreg = 0x007; 3346 break; 3347 case BUSCR: 3348 case MMUBAR: 3349 tmpreg = 0x008; 3350 break; 3351 case RGPIOBAR: 3352 tmpreg = 0x009; 3353 break; 3354 case ACR4: 3355 case ACR5: 3356 case ACR6: 3357 case ACR7: 3358 tmpreg = 0x00c + (opP->reg - ACR4); 3359 break; 3360 3361 case USP: 3362 tmpreg = 0x800; 3363 break; 3364 case VBR: 3365 tmpreg = 0x801; 3366 break; 3367 case CAAR: 3368 case CPUCR: 3369 tmpreg = 0x802; 3370 break; 3371 case MSP: 3372 tmpreg = 0x803; 3373 break; 3374 case ISP: 3375 tmpreg = 0x804; 3376 break; 3377 case MMUSR: 3378 tmpreg = 0x805; 3379 break; 3380 case URP: 3381 tmpreg = 0x806; 3382 break; 3383 case SRP: 3384 tmpreg = 0x807; 3385 break; 3386 case PCR: 3387 tmpreg = 0x808; 3388 break; 3389 case ROMBAR: 3390 case ROMBAR0: 3391 tmpreg = 0xC00; 3392 break; 3393 case ROMBAR1: 3394 tmpreg = 0xC01; 3395 break; 3396 case FLASHBAR: 3397 case RAMBAR0: 3398 case RAMBAR_ALT: 3399 tmpreg = 0xC04; 3400 break; 3401 case RAMBAR: 3402 case RAMBAR1: 3403 tmpreg = 0xC05; 3404 break; 3405 case MPCR: 3406 tmpreg = 0xC0C; 3407 break; 3408 case EDRAMBAR: 3409 tmpreg = 0xC0D; 3410 break; 3411 case MBAR0: 3412 case MBAR2: 3413 case SECMBAR: 3414 tmpreg = 0xC0E; 3415 break; 3416 case MBAR1: 3417 case MBAR: 3418 tmpreg = 0xC0F; 3419 break; 3420 case PCR1U0: 3421 tmpreg = 0xD02; 3422 break; 3423 case PCR1L0: 3424 tmpreg = 0xD03; 3425 break; 3426 case PCR2U0: 3427 tmpreg = 0xD04; 3428 break; 3429 case PCR2L0: 3430 tmpreg = 0xD05; 3431 break; 3432 case PCR3U0: 3433 tmpreg = 0xD06; 3434 break; 3435 case PCR3L0: 3436 tmpreg = 0xD07; 3437 break; 3438 case PCR1L1: 3439 tmpreg = 0xD0A; 3440 break; 3441 case PCR1U1: 3442 tmpreg = 0xD0B; 3443 break; 3444 case PCR2L1: 3445 tmpreg = 0xD0C; 3446 break; 3447 case PCR2U1: 3448 tmpreg = 0xD0D; 3449 break; 3450 case PCR3L1: 3451 tmpreg = 0xD0E; 3452 break; 3453 case PCR3U1: 3454 tmpreg = 0xD0F; 3455 break; 3456 case CAC: 3457 tmpreg = 0xFFE; 3458 break; 3459 case MBO: 3460 tmpreg = 0xFFF; 3461 break; 3462 default: 3463 abort (); 3464 } 3465 install_operand (s[1], tmpreg); 3466 break; 3467 3468 case 'k': 3469 tmpreg = get_num (&opP->disp, 55); 3470 install_operand (s[1], tmpreg & 0x7f); 3471 break; 3472 3473 case 'l': 3474 tmpreg = opP->mask; 3475 if (s[1] == 'w') 3476 { 3477 if (tmpreg & 0x7FF0000) 3478 as_bad (_("Floating point register in register list")); 3479 insop (reverse_16_bits (tmpreg), opcode); 3480 } 3481 else 3482 { 3483 if (tmpreg & 0x700FFFF) 3484 as_bad (_("Wrong register in floating-point reglist")); 3485 install_operand (s[1], reverse_8_bits (tmpreg >> 16)); 3486 } 3487 break; 3488 3489 case 'L': 3490 tmpreg = opP->mask; 3491 if (s[1] == 'w') 3492 { 3493 if (tmpreg & 0x7FF0000) 3494 as_bad (_("Floating point register in register list")); 3495 insop (tmpreg, opcode); 3496 } 3497 else if (s[1] == '8') 3498 { 3499 if (tmpreg & 0x0FFFFFF) 3500 as_bad (_("incorrect register in reglist")); 3501 install_operand (s[1], tmpreg >> 24); 3502 } 3503 else 3504 { 3505 if (tmpreg & 0x700FFFF) 3506 as_bad (_("wrong register in floating-point reglist")); 3507 else 3508 install_operand (s[1], tmpreg >> 16); 3509 } 3510 break; 3511 3512 case 'M': 3513 install_operand (s[1], get_num (&opP->disp, 60)); 3514 break; 3515 3516 case 'O': 3517 tmpreg = ((opP->mode == DREG) 3518 ? 0x20 + (int) (opP->reg - DATA) 3519 : (get_num (&opP->disp, 40) & 0x1F)); 3520 install_operand (s[1], tmpreg); 3521 break; 3522 3523 case 'Q': 3524 tmpreg = get_num (&opP->disp, 10); 3525 if (tmpreg == 8) 3526 tmpreg = 0; 3527 install_operand (s[1], tmpreg); 3528 break; 3529 3530 case 'R': 3531 /* This depends on the fact that ADDR registers are eight 3532 more than their corresponding DATA regs, so the result 3533 will have the ADDR_REG bit set. */ 3534 install_operand (s[1], opP->reg - DATA); 3535 break; 3536 3537 case 'r': 3538 if (opP->mode == AINDR) 3539 install_operand (s[1], opP->reg - DATA); 3540 else 3541 install_operand (s[1], opP->index.reg - DATA); 3542 break; 3543 3544 case 's': 3545 if (opP->reg == FPI) 3546 tmpreg = 0x1; 3547 else if (opP->reg == FPS) 3548 tmpreg = 0x2; 3549 else if (opP->reg == FPC) 3550 tmpreg = 0x4; 3551 else 3552 abort (); 3553 install_operand (s[1], tmpreg); 3554 break; 3555 3556 case 'S': /* Ignore it. */ 3557 break; 3558 3559 case 'T': 3560 install_operand (s[1], get_num (&opP->disp, 30)); 3561 break; 3562 3563 case 'U': /* Ignore it. */ 3564 break; 3565 3566 case 'c': 3567 switch (opP->reg) 3568 { 3569 case NC: 3570 tmpreg = 0; 3571 break; 3572 case DC: 3573 tmpreg = 1; 3574 break; 3575 case IC: 3576 tmpreg = 2; 3577 break; 3578 case BC: 3579 tmpreg = 3; 3580 break; 3581 default: 3582 as_fatal (_("failed sanity check")); 3583 } /* switch on cache token. */ 3584 install_operand (s[1], tmpreg); 3585 break; 3586 #ifndef NO_68851 3587 /* JF: These are out of order, I fear. */ 3588 case 'f': 3589 switch (opP->reg) 3590 { 3591 case SFC: 3592 tmpreg = 0; 3593 break; 3594 case DFC: 3595 tmpreg = 1; 3596 break; 3597 default: 3598 abort (); 3599 } 3600 install_operand (s[1], tmpreg); 3601 break; 3602 3603 case '0': 3604 case '1': 3605 case '2': 3606 switch (opP->reg) 3607 { 3608 case TC: 3609 tmpreg = 0; 3610 break; 3611 case CAL: 3612 tmpreg = 4; 3613 break; 3614 case VAL: 3615 tmpreg = 5; 3616 break; 3617 case SCC: 3618 tmpreg = 6; 3619 break; 3620 case AC: 3621 tmpreg = 7; 3622 break; 3623 default: 3624 abort (); 3625 } 3626 install_operand (s[1], tmpreg); 3627 break; 3628 3629 case 'V': 3630 if (opP->reg == VAL) 3631 break; 3632 abort (); 3633 3634 case 'W': 3635 switch (opP->reg) 3636 { 3637 case DRP: 3638 tmpreg = 1; 3639 break; 3640 case SRP: 3641 tmpreg = 2; 3642 break; 3643 case CRP: 3644 tmpreg = 3; 3645 break; 3646 default: 3647 abort (); 3648 } 3649 install_operand (s[1], tmpreg); 3650 break; 3651 3652 case 'X': 3653 switch (opP->reg) 3654 { 3655 case BAD: 3656 case BAD + 1: 3657 case BAD + 2: 3658 case BAD + 3: 3659 case BAD + 4: 3660 case BAD + 5: 3661 case BAD + 6: 3662 case BAD + 7: 3663 tmpreg = (4 << 10) | ((opP->reg - BAD) << 2); 3664 break; 3665 3666 case BAC: 3667 case BAC + 1: 3668 case BAC + 2: 3669 case BAC + 3: 3670 case BAC + 4: 3671 case BAC + 5: 3672 case BAC + 6: 3673 case BAC + 7: 3674 tmpreg = (5 << 10) | ((opP->reg - BAC) << 2); 3675 break; 3676 3677 default: 3678 abort (); 3679 } 3680 install_operand (s[1], tmpreg); 3681 break; 3682 case 'Y': 3683 know (opP->reg == PSR); 3684 break; 3685 case 'Z': 3686 know (opP->reg == PCSR); 3687 break; 3688 #endif /* m68851 */ 3689 case '3': 3690 switch (opP->reg) 3691 { 3692 case TT0: 3693 tmpreg = 2; 3694 break; 3695 case TT1: 3696 tmpreg = 3; 3697 break; 3698 default: 3699 abort (); 3700 } 3701 install_operand (s[1], tmpreg); 3702 break; 3703 case 't': 3704 tmpreg = get_num (&opP->disp, 20); 3705 install_operand (s[1], tmpreg); 3706 break; 3707 case '_': /* used only for move16 absolute 32-bit address. */ 3708 if (isvar (&opP->disp)) 3709 add_fix ('l', &opP->disp, 0, 0); 3710 tmpreg = get_num (&opP->disp, 90); 3711 addword (tmpreg >> 16); 3712 addword (tmpreg & 0xFFFF); 3713 break; 3714 case 'u': 3715 install_operand (s[1], opP->reg - DATA0L); 3716 opP->reg -= (DATA0L); 3717 opP->reg &= 0x0F; /* remove upper/lower bit. */ 3718 break; 3719 case 'x': 3720 tmpreg = get_num (&opP->disp, 80); 3721 if (tmpreg == -1) 3722 tmpreg = 0; 3723 install_operand (s[1], tmpreg); 3724 break; 3725 case 'j': 3726 tmpreg = get_num (&opP->disp, 10); 3727 install_operand (s[1], tmpreg - 1); 3728 break; 3729 case 'K': 3730 tmpreg = get_num (&opP->disp, 65); 3731 install_operand (s[1], tmpreg); 3732 break; 3733 default: 3734 abort (); 3735 } 3736 } 3737 3738 /* By the time whe get here (FINALLY) the_ins contains the complete 3739 instruction, ready to be emitted. . . */ 3740 } 3741 3742 static int 3743 reverse_16_bits (int in) 3744 { 3745 int out = 0; 3746 int n; 3747 3748 static int mask[16] = 3749 { 3750 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 3751 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000 3752 }; 3753 for (n = 0; n < 16; n++) 3754 { 3755 if (in & mask[n]) 3756 out |= mask[15 - n]; 3757 } 3758 return out; 3759 } /* reverse_16_bits() */ 3760 3761 static int 3762 reverse_8_bits (int in) 3763 { 3764 int out = 0; 3765 int n; 3766 3767 static int mask[8] = 3768 { 3769 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 3770 }; 3771 3772 for (n = 0; n < 8; n++) 3773 { 3774 if (in & mask[n]) 3775 out |= mask[7 - n]; 3776 } 3777 return out; 3778 } /* reverse_8_bits() */ 3779 3780 /* Cause an extra frag to be generated here, inserting up to 3781 FRAG_VAR_SIZE bytes. TYPE is the subtype of the frag to be 3782 generated; its primary type is rs_machine_dependent. 3783 3784 The TYPE parameter is also used by md_convert_frag_1 and 3785 md_estimate_size_before_relax. The appropriate type of fixup will 3786 be emitted by md_convert_frag_1. 3787 3788 ADD becomes the FR_SYMBOL field of the frag, and OFF the FR_OFFSET. */ 3789 static void 3790 install_operand (int mode, int val) 3791 { 3792 switch (mode) 3793 { 3794 case 's': 3795 the_ins.opcode[0] |= val & 0xFF; /* JF FF is for M kludge. */ 3796 break; 3797 case 'd': 3798 the_ins.opcode[0] |= val << 9; 3799 break; 3800 case 'E': 3801 the_ins.opcode[1] |= val << 9; 3802 break; 3803 case '1': 3804 the_ins.opcode[1] |= val << 12; 3805 break; 3806 case '2': 3807 the_ins.opcode[1] |= val << 6; 3808 break; 3809 case '3': 3810 the_ins.opcode[1] |= val; 3811 break; 3812 case '4': 3813 the_ins.opcode[2] |= val << 12; 3814 break; 3815 case '5': 3816 the_ins.opcode[2] |= val << 6; 3817 break; 3818 case '6': 3819 /* DANGER! This is a hack to force cas2l and cas2w cmds to be 3820 three words long! */ 3821 the_ins.numo++; 3822 the_ins.opcode[2] |= val; 3823 break; 3824 case '7': 3825 the_ins.opcode[1] |= val << 7; 3826 break; 3827 case '8': 3828 the_ins.opcode[1] |= val << 10; 3829 break; 3830 #ifndef NO_68851 3831 case '9': 3832 the_ins.opcode[1] |= val << 5; 3833 break; 3834 #endif 3835 3836 case 't': 3837 the_ins.opcode[1] |= (val << 10) | (val << 7); 3838 break; 3839 case 'D': 3840 the_ins.opcode[1] |= (val << 12) | val; 3841 break; 3842 case 'g': 3843 the_ins.opcode[0] |= val = 0xff; 3844 break; 3845 case 'i': 3846 the_ins.opcode[0] |= val << 9; 3847 break; 3848 case 'C': 3849 the_ins.opcode[1] |= val; 3850 break; 3851 case 'j': 3852 the_ins.opcode[1] |= val; 3853 the_ins.numo++; /* What a hack. */ 3854 break; 3855 case 'k': 3856 the_ins.opcode[1] |= val << 4; 3857 break; 3858 case 'b': 3859 case 'w': 3860 case 'W': 3861 case 'l': 3862 break; 3863 case 'e': 3864 the_ins.opcode[0] |= (val << 6); 3865 break; 3866 case 'L': 3867 the_ins.opcode[1] = (val >> 16); 3868 the_ins.opcode[2] = val & 0xffff; 3869 break; 3870 case 'm': 3871 the_ins.opcode[0] |= ((val & 0x8) << (6 - 3)); 3872 the_ins.opcode[0] |= ((val & 0x7) << 9); 3873 the_ins.opcode[1] |= ((val & 0x10) << (7 - 4)); 3874 break; 3875 case 'n': /* MAC/EMAC Rx on !load. */ 3876 the_ins.opcode[0] |= ((val & 0x8) << (6 - 3)); 3877 the_ins.opcode[0] |= ((val & 0x7) << 9); 3878 the_ins.opcode[1] |= ((val & 0x10) << (7 - 4)); 3879 break; 3880 case 'o': /* MAC/EMAC Rx on load. */ 3881 the_ins.opcode[1] |= val << 12; 3882 the_ins.opcode[1] |= ((val & 0x10) << (7 - 4)); 3883 break; 3884 case 'M': /* MAC/EMAC Ry on !load. */ 3885 the_ins.opcode[0] |= (val & 0xF); 3886 the_ins.opcode[1] |= ((val & 0x10) << (6 - 4)); 3887 break; 3888 case 'N': /* MAC/EMAC Ry on load. */ 3889 the_ins.opcode[1] |= (val & 0xF); 3890 the_ins.opcode[1] |= ((val & 0x10) << (6 - 4)); 3891 break; 3892 case 'h': 3893 the_ins.opcode[1] |= ((val != 1) << 10); 3894 break; 3895 case 'F': 3896 the_ins.opcode[0] |= ((val & 0x3) << 9); 3897 break; 3898 case 'f': 3899 the_ins.opcode[0] |= ((val & 0x3) << 0); 3900 break; 3901 case 'G': /* EMAC accumulator in a EMAC load instruction. */ 3902 the_ins.opcode[0] |= ((~val & 0x1) << 7); 3903 the_ins.opcode[1] |= ((val & 0x2) << (4 - 1)); 3904 break; 3905 case 'H': /* EMAC accumulator in a EMAC non-load instruction. */ 3906 the_ins.opcode[0] |= ((val & 0x1) << 7); 3907 the_ins.opcode[1] |= ((val & 0x2) << (4 - 1)); 3908 break; 3909 case 'I': 3910 the_ins.opcode[1] |= ((val & 0x3) << 9); 3911 break; 3912 case ']': 3913 the_ins.opcode[0] |= (val & 0x1) <<10; 3914 break; 3915 case 'c': 3916 default: 3917 as_fatal (_("failed sanity check.")); 3918 } 3919 } 3920 3921 static void 3922 install_gen_operand (int mode, int val) 3923 { 3924 switch (mode) 3925 { 3926 case '/': /* Special for mask loads for mac/msac insns with 3927 possible mask; trailing_ampersend set in bit 8. */ 3928 the_ins.opcode[0] |= (val & 0x3f); 3929 the_ins.opcode[1] |= (((val & 0x100) >> 8) << 5); 3930 break; 3931 case 's': 3932 the_ins.opcode[0] |= val; 3933 break; 3934 case 'd': 3935 /* This is a kludge!!! */ 3936 the_ins.opcode[0] |= (val & 0x07) << 9 | (val & 0x38) << 3; 3937 break; 3938 case 'b': 3939 case 'w': 3940 case 'l': 3941 case 'f': 3942 case 'F': 3943 case 'x': 3944 case 'p': 3945 the_ins.opcode[0] |= val; 3946 break; 3947 /* more stuff goes here. */ 3948 default: 3949 as_fatal (_("failed sanity check.")); 3950 } 3951 } 3952 3953 /* Verify that we have some number of paren pairs, do m68k_ip_op(), and 3954 then deal with the bitfield hack. */ 3955 3956 static char * 3957 crack_operand (char *str, struct m68k_op *opP) 3958 { 3959 int parens; 3960 int c; 3961 char *beg_str; 3962 int inquote = 0; 3963 3964 if (!str) 3965 { 3966 return str; 3967 } 3968 beg_str = str; 3969 for (parens = 0; *str && (parens > 0 || inquote || notend (str)); str++) 3970 { 3971 if (! inquote) 3972 { 3973 if (*str == '(') 3974 parens++; 3975 else if (*str == ')') 3976 { 3977 if (!parens) 3978 { /* ERROR. */ 3979 opP->error = _("Extra )"); 3980 return str; 3981 } 3982 --parens; 3983 } 3984 } 3985 if (flag_mri && *str == '\'') 3986 inquote = ! inquote; 3987 } 3988 if (!*str && parens) 3989 { /* ERROR. */ 3990 opP->error = _("Missing )"); 3991 return str; 3992 } 3993 c = *str; 3994 *str = '\0'; 3995 if (m68k_ip_op (beg_str, opP) != 0) 3996 { 3997 *str = c; 3998 return str; 3999 } 4000 *str = c; 4001 if (c == '}') 4002 c = *++str; /* JF bitfield hack. */ 4003 if (c) 4004 { 4005 c = *++str; 4006 if (!c) 4007 as_bad (_("Missing operand")); 4008 } 4009 4010 /* Detect MRI REG symbols and convert them to REGLSTs. */ 4011 if (opP->mode == CONTROL && (int)opP->reg < 0) 4012 { 4013 opP->mode = REGLST; 4014 opP->mask = ~(int)opP->reg; 4015 opP->reg = 0; 4016 } 4017 4018 return str; 4019 } 4020 4021 /* This is the guts of the machine-dependent assembler. STR points to a 4022 machine dependent instruction. This function is supposed to emit 4023 the frags/bytes it assembles to. 4024 */ 4025 4026 static void 4027 insert_reg (const char *regname, int regnum) 4028 { 4029 char buf[100]; 4030 int i; 4031 4032 #ifdef REGISTER_PREFIX 4033 if (!flag_reg_prefix_optional) 4034 { 4035 buf[0] = REGISTER_PREFIX; 4036 strcpy (buf + 1, regname); 4037 regname = buf; 4038 } 4039 #endif 4040 4041 symbol_table_insert (symbol_new (regname, reg_section, regnum, 4042 &zero_address_frag)); 4043 4044 for (i = 0; regname[i]; i++) 4045 buf[i] = TOUPPER (regname[i]); 4046 buf[i] = '\0'; 4047 4048 symbol_table_insert (symbol_new (buf, reg_section, regnum, 4049 &zero_address_frag)); 4050 } 4051 4052 struct init_entry 4053 { 4054 const char *name; 4055 int number; 4056 }; 4057 4058 static const struct init_entry init_table[] = 4059 { 4060 { "d0", DATA0 }, 4061 { "d1", DATA1 }, 4062 { "d2", DATA2 }, 4063 { "d3", DATA3 }, 4064 { "d4", DATA4 }, 4065 { "d5", DATA5 }, 4066 { "d6", DATA6 }, 4067 { "d7", DATA7 }, 4068 { "a0", ADDR0 }, 4069 { "a1", ADDR1 }, 4070 { "a2", ADDR2 }, 4071 { "a3", ADDR3 }, 4072 { "a4", ADDR4 }, 4073 { "a5", ADDR5 }, 4074 { "a6", ADDR6 }, 4075 { "fp", ADDR6 }, 4076 { "a7", ADDR7 }, 4077 { "sp", ADDR7 }, 4078 { "ssp", ADDR7 }, 4079 { "fp0", FP0 }, 4080 { "fp1", FP1 }, 4081 { "fp2", FP2 }, 4082 { "fp3", FP3 }, 4083 { "fp4", FP4 }, 4084 { "fp5", FP5 }, 4085 { "fp6", FP6 }, 4086 { "fp7", FP7 }, 4087 { "fpi", FPI }, 4088 { "fpiar", FPI }, 4089 { "fpc", FPI }, 4090 { "fps", FPS }, 4091 { "fpsr", FPS }, 4092 { "fpc", FPC }, 4093 { "fpcr", FPC }, 4094 { "control", FPC }, 4095 { "status", FPS }, 4096 { "iaddr", FPI }, 4097 4098 { "cop0", COP0 }, 4099 { "cop1", COP1 }, 4100 { "cop2", COP2 }, 4101 { "cop3", COP3 }, 4102 { "cop4", COP4 }, 4103 { "cop5", COP5 }, 4104 { "cop6", COP6 }, 4105 { "cop7", COP7 }, 4106 { "pc", PC }, 4107 { "zpc", ZPC }, 4108 { "sr", SR }, 4109 4110 { "ccr", CCR }, 4111 { "cc", CCR }, 4112 4113 { "acc", ACC }, 4114 { "acc0", ACC }, 4115 { "acc1", ACC1 }, 4116 { "acc2", ACC2 }, 4117 { "acc3", ACC3 }, 4118 { "accext01", ACCEXT01 }, 4119 { "accext23", ACCEXT23 }, 4120 { "macsr", MACSR }, 4121 { "mask", MASK }, 4122 4123 /* Control registers. */ 4124 { "sfc", SFC }, /* Source Function Code. */ 4125 { "sfcr", SFC }, 4126 { "dfc", DFC }, /* Destination Function Code. */ 4127 { "dfcr", DFC }, 4128 { "cacr", CACR }, /* Cache Control Register. */ 4129 { "caar", CAAR }, /* Cache Address Register. */ 4130 { "cpucr", CPUCR }, /* CPU Control Register. */ 4131 4132 { "usp", USP }, /* User Stack Pointer. */ 4133 { "vbr", VBR }, /* Vector Base Register. */ 4134 { "msp", MSP }, /* Master Stack Pointer. */ 4135 { "isp", ISP }, /* Interrupt Stack Pointer. */ 4136 4137 { "itt0", ITT0 }, /* Instruction Transparent Translation Reg 0. */ 4138 { "itt1", ITT1 }, /* Instruction Transparent Translation Reg 1. */ 4139 { "dtt0", DTT0 }, /* Data Transparent Translation Register 0. */ 4140 { "dtt1", DTT1 }, /* Data Transparent Translation Register 1. */ 4141 4142 /* 68ec040 versions of same */ 4143 { "iacr0", ITT0 }, /* Instruction Access Control Register 0. */ 4144 { "iacr1", ITT1 }, /* Instruction Access Control Register 0. */ 4145 { "dacr0", DTT0 }, /* Data Access Control Register 0. */ 4146 { "dacr1", DTT1 }, /* Data Access Control Register 0. */ 4147 4148 /* Coldfire versions of same. The ColdFire programmer's reference 4149 manual indicated that the order is 2,3,0,1, but Ken Rose 4150 <rose (at) netcom.com> says that 0,1,2,3 is the correct order. */ 4151 { "acr0", ACR0 }, /* Access Control Unit 0. */ 4152 { "acr1", ACR1 }, /* Access Control Unit 1. */ 4153 { "acr2", ACR2 }, /* Access Control Unit 2. */ 4154 { "acr3", ACR3 }, /* Access Control Unit 3. */ 4155 { "acr4", ACR4 }, /* Access Control Unit 4. */ 4156 { "acr5", ACR5 }, /* Access Control Unit 5. */ 4157 { "acr6", ACR6 }, /* Access Control Unit 6. */ 4158 { "acr7", ACR7 }, /* Access Control Unit 7. */ 4159 4160 { "tc", TC }, /* MMU Translation Control Register. */ 4161 { "tcr", TC }, 4162 { "asid", ASID }, 4163 4164 { "mmusr", MMUSR }, /* MMU Status Register. */ 4165 { "srp", SRP }, /* User Root Pointer. */ 4166 { "urp", URP }, /* Supervisor Root Pointer. */ 4167 4168 { "buscr", BUSCR }, 4169 { "mmubar", MMUBAR }, 4170 { "pcr", PCR }, 4171 4172 { "rombar", ROMBAR }, /* ROM Base Address Register. */ 4173 { "rambar0", RAMBAR0 }, /* ROM Base Address Register. */ 4174 { "rambar1", RAMBAR1 }, /* ROM Base Address Register. */ 4175 { "mbar", MBAR }, /* Module Base Address Register. */ 4176 4177 { "mbar0", MBAR0 }, /* mcfv4e registers. */ 4178 { "mbar1", MBAR1 }, /* mcfv4e registers. */ 4179 { "rombar0", ROMBAR0 }, /* mcfv4e registers. */ 4180 { "rombar1", ROMBAR1 }, /* mcfv4e registers. */ 4181 { "mpcr", MPCR }, /* mcfv4e registers. */ 4182 { "edrambar", EDRAMBAR }, /* mcfv4e registers. */ 4183 { "secmbar", SECMBAR }, /* mcfv4e registers. */ 4184 { "asid", TC }, /* mcfv4e registers. */ 4185 { "mmubar", BUSCR }, /* mcfv4e registers. */ 4186 { "pcr1u0", PCR1U0 }, /* mcfv4e registers. */ 4187 { "pcr1l0", PCR1L0 }, /* mcfv4e registers. */ 4188 { "pcr2u0", PCR2U0 }, /* mcfv4e registers. */ 4189 { "pcr2l0", PCR2L0 }, /* mcfv4e registers. */ 4190 { "pcr3u0", PCR3U0 }, /* mcfv4e registers. */ 4191 { "pcr3l0", PCR3L0 }, /* mcfv4e registers. */ 4192 { "pcr1u1", PCR1U1 }, /* mcfv4e registers. */ 4193 { "pcr1l1", PCR1L1 }, /* mcfv4e registers. */ 4194 { "pcr2u1", PCR2U1 }, /* mcfv4e registers. */ 4195 { "pcr2l1", PCR2L1 }, /* mcfv4e registers. */ 4196 { "pcr3u1", PCR3U1 }, /* mcfv4e registers. */ 4197 { "pcr3l1", PCR3L1 }, /* mcfv4e registers. */ 4198 4199 { "flashbar", FLASHBAR }, /* mcf528x registers. */ 4200 { "rambar", RAMBAR }, /* mcf528x registers. */ 4201 4202 { "mbar2", MBAR2 }, /* mcf5249 registers. */ 4203 4204 { "rgpiobar", RGPIOBAR }, /* mcf54418 registers. */ 4205 4206 { "cac", CAC }, /* fido registers. */ 4207 { "mbb", MBO }, /* fido registers (obsolete). */ 4208 { "mbo", MBO }, /* fido registers. */ 4209 /* End of control registers. */ 4210 4211 { "ac", AC }, 4212 { "bc", BC }, 4213 { "cal", CAL }, 4214 { "crp", CRP }, 4215 { "drp", DRP }, 4216 { "pcsr", PCSR }, 4217 { "psr", PSR }, 4218 { "scc", SCC }, 4219 { "val", VAL }, 4220 { "bad0", BAD0 }, 4221 { "bad1", BAD1 }, 4222 { "bad2", BAD2 }, 4223 { "bad3", BAD3 }, 4224 { "bad4", BAD4 }, 4225 { "bad5", BAD5 }, 4226 { "bad6", BAD6 }, 4227 { "bad7", BAD7 }, 4228 { "bac0", BAC0 }, 4229 { "bac1", BAC1 }, 4230 { "bac2", BAC2 }, 4231 { "bac3", BAC3 }, 4232 { "bac4", BAC4 }, 4233 { "bac5", BAC5 }, 4234 { "bac6", BAC6 }, 4235 { "bac7", BAC7 }, 4236 4237 { "ic", IC }, 4238 { "dc", DC }, 4239 { "nc", NC }, 4240 4241 { "tt0", TT0 }, 4242 { "tt1", TT1 }, 4243 /* 68ec030 versions of same. */ 4244 { "ac0", TT0 }, 4245 { "ac1", TT1 }, 4246 /* 68ec030 access control unit, identical to 030 MMU status reg. */ 4247 { "acusr", PSR }, 4248 4249 /* Suppressed data and address registers. */ 4250 { "zd0", ZDATA0 }, 4251 { "zd1", ZDATA1 }, 4252 { "zd2", ZDATA2 }, 4253 { "zd3", ZDATA3 }, 4254 { "zd4", ZDATA4 }, 4255 { "zd5", ZDATA5 }, 4256 { "zd6", ZDATA6 }, 4257 { "zd7", ZDATA7 }, 4258 { "za0", ZADDR0 }, 4259 { "za1", ZADDR1 }, 4260 { "za2", ZADDR2 }, 4261 { "za3", ZADDR3 }, 4262 { "za4", ZADDR4 }, 4263 { "za5", ZADDR5 }, 4264 { "za6", ZADDR6 }, 4265 { "za7", ZADDR7 }, 4266 4267 /* Upper and lower data and address registers, used by macw and msacw. */ 4268 { "d0l", DATA0L }, 4269 { "d1l", DATA1L }, 4270 { "d2l", DATA2L }, 4271 { "d3l", DATA3L }, 4272 { "d4l", DATA4L }, 4273 { "d5l", DATA5L }, 4274 { "d6l", DATA6L }, 4275 { "d7l", DATA7L }, 4276 4277 { "a0l", ADDR0L }, 4278 { "a1l", ADDR1L }, 4279 { "a2l", ADDR2L }, 4280 { "a3l", ADDR3L }, 4281 { "a4l", ADDR4L }, 4282 { "a5l", ADDR5L }, 4283 { "a6l", ADDR6L }, 4284 { "a7l", ADDR7L }, 4285 4286 { "d0u", DATA0U }, 4287 { "d1u", DATA1U }, 4288 { "d2u", DATA2U }, 4289 { "d3u", DATA3U }, 4290 { "d4u", DATA4U }, 4291 { "d5u", DATA5U }, 4292 { "d6u", DATA6U }, 4293 { "d7u", DATA7U }, 4294 4295 { "a0u", ADDR0U }, 4296 { "a1u", ADDR1U }, 4297 { "a2u", ADDR2U }, 4298 { "a3u", ADDR3U }, 4299 { "a4u", ADDR4U }, 4300 { "a5u", ADDR5U }, 4301 { "a6u", ADDR6U }, 4302 { "a7u", ADDR7U }, 4303 4304 { 0, 0 } 4305 }; 4306 4307 static void 4308 init_regtable (void) 4309 { 4310 int i; 4311 for (i = 0; init_table[i].name; i++) 4312 insert_reg (init_table[i].name, init_table[i].number); 4313 } 4314 4315 void 4316 md_assemble (char *str) 4317 { 4318 const char *er; 4319 short *fromP; 4320 char *toP = NULL; 4321 int m, n = 0; 4322 char *to_beg_P; 4323 int shorts_this_frag; 4324 fixS *fixP; 4325 4326 if (!selected_cpu && !selected_arch) 4327 { 4328 /* We've not selected an architecture yet. Set the default 4329 now. We do this lazily so that an initial .cpu or .arch directive 4330 can specify. */ 4331 if (!m68k_set_cpu (TARGET_CPU, 1, 1)) 4332 as_bad (_("unrecognized default cpu `%s'"), TARGET_CPU); 4333 } 4334 if (!initialized) 4335 m68k_init_arch (); 4336 4337 /* In MRI mode, the instruction and operands are separated by a 4338 space. Anything following the operands is a comment. The label 4339 has already been removed. */ 4340 if (flag_mri) 4341 { 4342 char *s; 4343 int fields = 0; 4344 int infield = 0; 4345 int inquote = 0; 4346 4347 for (s = str; *s != '\0'; s++) 4348 { 4349 if ((*s == ' ' || *s == '\t') && ! inquote) 4350 { 4351 if (infield) 4352 { 4353 ++fields; 4354 if (fields >= 2) 4355 { 4356 *s = '\0'; 4357 break; 4358 } 4359 infield = 0; 4360 } 4361 } 4362 else 4363 { 4364 if (! infield) 4365 infield = 1; 4366 if (*s == '\'') 4367 inquote = ! inquote; 4368 } 4369 } 4370 } 4371 4372 memset (&the_ins, '\0', sizeof (the_ins)); 4373 m68k_ip (str); 4374 er = the_ins.error; 4375 if (!er) 4376 { 4377 for (n = 0; n < the_ins.numargs; n++) 4378 if (the_ins.operands[n].error) 4379 { 4380 er = the_ins.operands[n].error; 4381 break; 4382 } 4383 } 4384 if (er) 4385 { 4386 as_bad (_("%s -- statement `%s' ignored"), er, str); 4387 return; 4388 } 4389 4390 /* If there is a current label, record that it marks an instruction. */ 4391 if (current_label != NULL) 4392 { 4393 current_label->text = 1; 4394 current_label = NULL; 4395 } 4396 4397 #ifdef OBJ_ELF 4398 /* Tie dwarf2 debug info to the address at the start of the insn. */ 4399 dwarf2_emit_insn (0); 4400 #endif 4401 4402 if (the_ins.nfrag == 0) 4403 { 4404 /* No frag hacking involved; just put it out. */ 4405 toP = frag_more (2 * the_ins.numo); 4406 fromP = &the_ins.opcode[0]; 4407 for (m = the_ins.numo; m; --m) 4408 { 4409 md_number_to_chars (toP, (long) (*fromP), 2); 4410 toP += 2; 4411 fromP++; 4412 } 4413 /* Put out symbol-dependent info. */ 4414 for (m = 0; m < the_ins.nrel; m++) 4415 { 4416 switch (the_ins.reloc[m].wid) 4417 { 4418 case 'B': 4419 n = 1; 4420 break; 4421 case 'b': 4422 n = 1; 4423 break; 4424 case '3': 4425 n = 1; 4426 break; 4427 case 'w': 4428 case 'W': 4429 n = 2; 4430 break; 4431 case 'l': 4432 n = 4; 4433 break; 4434 default: 4435 as_fatal (_("Don't know how to figure width of %c in md_assemble()"), 4436 the_ins.reloc[m].wid); 4437 } 4438 4439 fixP = fix_new_exp (frag_now, 4440 ((toP - frag_now->fr_literal) 4441 - the_ins.numo * 2 + the_ins.reloc[m].n), 4442 n, 4443 &the_ins.reloc[m].exp, 4444 the_ins.reloc[m].pcrel, 4445 get_reloc_code (n, the_ins.reloc[m].pcrel, 4446 the_ins.reloc[m].pic_reloc)); 4447 fixP->fx_pcrel_adjust = the_ins.reloc[m].pcrel_fix; 4448 if (the_ins.reloc[m].wid == 'B') 4449 fixP->fx_signed = 1; 4450 } 4451 return; 4452 } 4453 4454 /* There's some frag hacking. */ 4455 { 4456 /* Calculate the max frag size. */ 4457 int wid; 4458 4459 wid = 2 * the_ins.fragb[0].fragoff; 4460 for (n = 1; n < the_ins.nfrag; n++) 4461 wid += 2 * (the_ins.numo - the_ins.fragb[n - 1].fragoff); 4462 /* frag_var part. */ 4463 wid += FRAG_VAR_SIZE; 4464 /* Make sure the whole insn fits in one chunk, in particular that 4465 the var part is attached, as we access one byte before the 4466 variable frag for byte branches. */ 4467 frag_grow (wid); 4468 } 4469 4470 for (n = 0, fromP = &the_ins.opcode[0]; n < the_ins.nfrag; n++) 4471 { 4472 int wid; 4473 4474 if (n == 0) 4475 wid = 2 * the_ins.fragb[n].fragoff; 4476 else 4477 wid = 2 * (the_ins.numo - the_ins.fragb[n - 1].fragoff); 4478 toP = frag_more (wid); 4479 to_beg_P = toP; 4480 shorts_this_frag = 0; 4481 for (m = wid / 2; m; --m) 4482 { 4483 md_number_to_chars (toP, (long) (*fromP), 2); 4484 toP += 2; 4485 fromP++; 4486 shorts_this_frag++; 4487 } 4488 for (m = 0; m < the_ins.nrel; m++) 4489 { 4490 if ((the_ins.reloc[m].n) >= 2 * shorts_this_frag) 4491 { 4492 the_ins.reloc[m].n -= 2 * shorts_this_frag; 4493 break; 4494 } 4495 wid = the_ins.reloc[m].wid; 4496 if (wid == 0) 4497 continue; 4498 the_ins.reloc[m].wid = 0; 4499 wid = (wid == 'b') ? 1 : (wid == 'w') ? 2 : (wid == 'l') ? 4 : 4000; 4500 4501 fixP = fix_new_exp (frag_now, 4502 ((toP - frag_now->fr_literal) 4503 - the_ins.numo * 2 + the_ins.reloc[m].n), 4504 wid, 4505 &the_ins.reloc[m].exp, 4506 the_ins.reloc[m].pcrel, 4507 get_reloc_code (wid, the_ins.reloc[m].pcrel, 4508 the_ins.reloc[m].pic_reloc)); 4509 fixP->fx_pcrel_adjust = the_ins.reloc[m].pcrel_fix; 4510 } 4511 (void) frag_var (rs_machine_dependent, FRAG_VAR_SIZE, 0, 4512 (relax_substateT) (the_ins.fragb[n].fragty), 4513 the_ins.fragb[n].fadd, the_ins.fragb[n].foff, to_beg_P); 4514 } 4515 gas_assert (the_ins.nfrag >= 1); 4516 n = the_ins.numo - the_ins.fragb[the_ins.nfrag - 1].fragoff; 4517 shorts_this_frag = 0; 4518 if (n) 4519 { 4520 toP = frag_more (n * 2); 4521 while (n--) 4522 { 4523 md_number_to_chars (toP, (long) (*fromP), 2); 4524 toP += 2; 4525 fromP++; 4526 shorts_this_frag++; 4527 } 4528 } 4529 for (m = 0; m < the_ins.nrel; m++) 4530 { 4531 int wid; 4532 4533 wid = the_ins.reloc[m].wid; 4534 if (wid == 0) 4535 continue; 4536 the_ins.reloc[m].wid = 0; 4537 wid = (wid == 'b') ? 1 : (wid == 'w') ? 2 : (wid == 'l') ? 4 : 4000; 4538 4539 fixP = fix_new_exp (frag_now, 4540 ((the_ins.reloc[m].n + toP - frag_now->fr_literal) 4541 - shorts_this_frag * 2), 4542 wid, 4543 &the_ins.reloc[m].exp, 4544 the_ins.reloc[m].pcrel, 4545 get_reloc_code (wid, the_ins.reloc[m].pcrel, 4546 the_ins.reloc[m].pic_reloc)); 4547 fixP->fx_pcrel_adjust = the_ins.reloc[m].pcrel_fix; 4548 } 4549 } 4550 4551 /* Comparison function used by qsort to rank the opcode entries by name. */ 4552 4553 static int 4554 m68k_compare_opcode (const void * v1, const void * v2) 4555 { 4556 struct m68k_opcode * op1, * op2; 4557 int ret; 4558 4559 if (v1 == v2) 4560 return 0; 4561 4562 op1 = *(struct m68k_opcode **) v1; 4563 op2 = *(struct m68k_opcode **) v2; 4564 4565 /* Compare the two names. If different, return the comparison. 4566 If the same, return the order they are in the opcode table. */ 4567 ret = strcmp (op1->name, op2->name); 4568 if (ret) 4569 return ret; 4570 if (op1 < op2) 4571 return -1; 4572 return 1; 4573 } 4574 4575 void 4576 md_begin (void) 4577 { 4578 const struct m68k_opcode *ins; 4579 struct m68k_incant *hack, *slak; 4580 const char *retval = 0; /* Empty string, or error msg text. */ 4581 int i; 4582 4583 /* Set up hash tables with 68000 instructions. 4584 similar to what the vax assembler does. */ 4585 /* RMS claims the thing to do is take the m68k-opcode.h table, and make 4586 a copy of it at runtime, adding in the information we want but isn't 4587 there. I think it'd be better to have an awk script hack the table 4588 at compile time. Or even just xstr the table and use it as-is. But 4589 my lord ghod hath spoken, so we do it this way. Excuse the ugly var 4590 names. */ 4591 4592 if (flag_mri) 4593 { 4594 flag_reg_prefix_optional = 1; 4595 m68k_abspcadd = 1; 4596 if (! m68k_rel32_from_cmdline) 4597 m68k_rel32 = 0; 4598 } 4599 4600 /* First sort the opcode table into alphabetical order to seperate 4601 the order that the assembler wants to see the opcodes from the 4602 order that the disassembler wants to see them. */ 4603 m68k_sorted_opcodes = XNEWVEC (const struct m68k_opcode *, m68k_numopcodes); 4604 4605 for (i = m68k_numopcodes; i--;) 4606 m68k_sorted_opcodes[i] = m68k_opcodes + i; 4607 4608 qsort (m68k_sorted_opcodes, m68k_numopcodes, 4609 sizeof (m68k_sorted_opcodes[0]), m68k_compare_opcode); 4610 4611 op_hash = hash_new (); 4612 4613 obstack_begin (&robyn, 4000); 4614 for (i = 0; i < m68k_numopcodes; i++) 4615 { 4616 hack = slak = XOBNEW (&robyn, struct m68k_incant); 4617 do 4618 { 4619 ins = m68k_sorted_opcodes[i]; 4620 4621 /* We must enter all insns into the table, because .arch and 4622 .cpu directives can change things. */ 4623 slak->m_operands = ins->args; 4624 slak->m_arch = ins->arch; 4625 slak->m_opcode = ins->opcode; 4626 4627 /* In most cases we can determine the number of opcode words 4628 by checking the second word of the mask. Unfortunately 4629 some instructions have 2 opcode words, but no fixed bits 4630 in the second word. A leading dot in the operands 4631 string also indicates 2 opcodes. */ 4632 if (*slak->m_operands == '.') 4633 { 4634 slak->m_operands++; 4635 slak->m_codenum = 2; 4636 } 4637 else if (ins->match & 0xffffL) 4638 slak->m_codenum = 2; 4639 else 4640 slak->m_codenum = 1; 4641 slak->m_opnum = strlen (slak->m_operands) / 2; 4642 4643 if (i + 1 != m68k_numopcodes 4644 && !strcmp (ins->name, m68k_sorted_opcodes[i + 1]->name)) 4645 { 4646 slak->m_next = XOBNEW (&robyn, struct m68k_incant); 4647 i++; 4648 } 4649 else 4650 slak->m_next = 0; 4651 slak = slak->m_next; 4652 } 4653 while (slak); 4654 4655 retval = hash_insert (op_hash, ins->name, (char *) hack); 4656 if (retval) 4657 as_fatal (_("Internal Error: Can't hash %s: %s"), ins->name, retval); 4658 } 4659 4660 for (i = 0; i < m68k_numaliases; i++) 4661 { 4662 const char *name = m68k_opcode_aliases[i].primary; 4663 const char *alias = m68k_opcode_aliases[i].alias; 4664 void *val = hash_find (op_hash, name); 4665 4666 if (!val) 4667 as_fatal (_("Internal Error: Can't find %s in hash table"), name); 4668 retval = hash_insert (op_hash, alias, val); 4669 if (retval) 4670 as_fatal (_("Internal Error: Can't hash %s: %s"), alias, retval); 4671 } 4672 4673 /* In MRI mode, all unsized branches are variable sized. Normally, 4674 they are word sized. */ 4675 if (flag_mri) 4676 { 4677 static struct m68k_opcode_alias mri_aliases[] = 4678 { 4679 { "bhi", "jhi", }, 4680 { "bls", "jls", }, 4681 { "bcc", "jcc", }, 4682 { "bcs", "jcs", }, 4683 { "bne", "jne", }, 4684 { "beq", "jeq", }, 4685 { "bvc", "jvc", }, 4686 { "bvs", "jvs", }, 4687 { "bpl", "jpl", }, 4688 { "bmi", "jmi", }, 4689 { "bge", "jge", }, 4690 { "blt", "jlt", }, 4691 { "bgt", "jgt", }, 4692 { "ble", "jle", }, 4693 { "bra", "jra", }, 4694 { "bsr", "jbsr", }, 4695 }; 4696 4697 for (i = 0; 4698 i < (int) (sizeof mri_aliases / sizeof mri_aliases[0]); 4699 i++) 4700 { 4701 const char *name = mri_aliases[i].primary; 4702 const char *alias = mri_aliases[i].alias; 4703 void *val = hash_find (op_hash, name); 4704 4705 if (!val) 4706 as_fatal (_("Internal Error: Can't find %s in hash table"), name); 4707 retval = hash_jam (op_hash, alias, val); 4708 if (retval) 4709 as_fatal (_("Internal Error: Can't hash %s: %s"), alias, retval); 4710 } 4711 } 4712 4713 for (i = 0; i < (int) sizeof (notend_table); i++) 4714 { 4715 notend_table[i] = 0; 4716 alt_notend_table[i] = 0; 4717 } 4718 4719 notend_table[','] = 1; 4720 notend_table['{'] = 1; 4721 notend_table['}'] = 1; 4722 alt_notend_table['a'] = 1; 4723 alt_notend_table['A'] = 1; 4724 alt_notend_table['d'] = 1; 4725 alt_notend_table['D'] = 1; 4726 alt_notend_table['#'] = 1; 4727 alt_notend_table['&'] = 1; 4728 alt_notend_table['f'] = 1; 4729 alt_notend_table['F'] = 1; 4730 #ifdef REGISTER_PREFIX 4731 alt_notend_table[REGISTER_PREFIX] = 1; 4732 #endif 4733 4734 /* We need to put '(' in alt_notend_table to handle 4735 cas2 %d0:%d2,%d3:%d4,(%a0):(%a1) */ 4736 alt_notend_table['('] = 1; 4737 4738 /* We need to put '@' in alt_notend_table to handle 4739 cas2 %d0:%d2,%d3:%d4,@(%d0):@(%d1) */ 4740 alt_notend_table['@'] = 1; 4741 4742 /* We need to put digits in alt_notend_table to handle 4743 bfextu %d0{24:1},%d0 */ 4744 alt_notend_table['0'] = 1; 4745 alt_notend_table['1'] = 1; 4746 alt_notend_table['2'] = 1; 4747 alt_notend_table['3'] = 1; 4748 alt_notend_table['4'] = 1; 4749 alt_notend_table['5'] = 1; 4750 alt_notend_table['6'] = 1; 4751 alt_notend_table['7'] = 1; 4752 alt_notend_table['8'] = 1; 4753 alt_notend_table['9'] = 1; 4754 4755 #ifndef MIT_SYNTAX_ONLY 4756 /* Insert pseudo ops, these have to go into the opcode table since 4757 gas expects pseudo ops to start with a dot. */ 4758 { 4759 int n = 0; 4760 4761 while (mote_pseudo_table[n].poc_name) 4762 { 4763 hack = XOBNEW (&robyn, struct m68k_incant); 4764 hash_insert (op_hash, 4765 mote_pseudo_table[n].poc_name, (char *) hack); 4766 hack->m_operands = 0; 4767 hack->m_opnum = n; 4768 n++; 4769 } 4770 } 4771 #endif 4772 4773 init_regtable (); 4774 4775 #ifdef OBJ_ELF 4776 record_alignment (text_section, 2); 4777 record_alignment (data_section, 2); 4778 record_alignment (bss_section, 2); 4779 #endif 4780 } 4781 4782 4783 /* This is called when a label is defined. */ 4785 4786 void 4787 m68k_frob_label (symbolS *sym) 4788 { 4789 struct label_line *n; 4790 4791 n = XNEW (struct label_line); 4792 n->next = labels; 4793 n->label = sym; 4794 n->file = as_where (&n->line); 4795 n->text = 0; 4796 labels = n; 4797 current_label = n; 4798 4799 #ifdef OBJ_ELF 4800 dwarf2_emit_label (sym); 4801 #endif 4802 } 4803 4804 /* This is called when a value that is not an instruction is emitted. */ 4805 4806 void 4807 m68k_flush_pending_output (void) 4808 { 4809 current_label = NULL; 4810 } 4811 4812 /* This is called at the end of the assembly, when the final value of 4813 the label is known. We warn if this is a text symbol aligned at an 4814 odd location. */ 4815 4816 void 4817 m68k_frob_symbol (symbolS *sym) 4818 { 4819 if (S_GET_SEGMENT (sym) == reg_section 4820 && (int) S_GET_VALUE (sym) < 0) 4821 { 4822 S_SET_SEGMENT (sym, absolute_section); 4823 S_SET_VALUE (sym, ~(int)S_GET_VALUE (sym)); 4824 } 4825 else if ((S_GET_VALUE (sym) & 1) != 0) 4826 { 4827 struct label_line *l; 4828 4829 for (l = labels; l != NULL; l = l->next) 4830 { 4831 if (l->label == sym) 4832 { 4833 if (l->text) 4834 as_warn_where (l->file, l->line, 4835 _("text label `%s' aligned to odd boundary"), 4836 S_GET_NAME (sym)); 4837 break; 4838 } 4839 } 4840 } 4841 } 4842 4843 /* This is called if we go in or out of MRI mode because of the .mri 4845 pseudo-op. */ 4846 4847 void 4848 m68k_mri_mode_change (int on) 4849 { 4850 if (on) 4851 { 4852 if (! flag_reg_prefix_optional) 4853 { 4854 flag_reg_prefix_optional = 1; 4855 #ifdef REGISTER_PREFIX 4856 init_regtable (); 4857 #endif 4858 } 4859 m68k_abspcadd = 1; 4860 if (! m68k_rel32_from_cmdline) 4861 m68k_rel32 = 0; 4862 } 4863 else 4864 { 4865 if (! reg_prefix_optional_seen) 4866 { 4867 #ifdef REGISTER_PREFIX_OPTIONAL 4868 flag_reg_prefix_optional = REGISTER_PREFIX_OPTIONAL; 4869 #else 4870 flag_reg_prefix_optional = 0; 4871 #endif 4872 #ifdef REGISTER_PREFIX 4873 init_regtable (); 4874 #endif 4875 } 4876 m68k_abspcadd = 0; 4877 if (! m68k_rel32_from_cmdline) 4878 m68k_rel32 = 1; 4879 } 4880 } 4881 4882 const char * 4883 md_atof (int type, char *litP, int *sizeP) 4884 { 4885 return ieee_md_atof (type, litP, sizeP, TRUE); 4886 } 4887 4888 void 4889 md_number_to_chars (char *buf, valueT val, int n) 4890 { 4891 number_to_chars_bigendian (buf, val, n); 4892 } 4893 4894 void 4895 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED) 4896 { 4897 offsetT val = *valP; 4898 addressT upper_limit; 4899 offsetT lower_limit; 4900 4901 /* This is unnecessary but it convinces the native rs6000 compiler 4902 to generate the code we want. */ 4903 char *buf = fixP->fx_frag->fr_literal; 4904 buf += fixP->fx_where; 4905 /* End ibm compiler workaround. */ 4906 4907 val = SEXT (val); 4908 4909 if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0) 4910 fixP->fx_done = 1; 4911 4912 #ifdef OBJ_ELF 4913 if (fixP->fx_addsy) 4914 { 4915 memset (buf, 0, fixP->fx_size); 4916 fixP->fx_addnumber = val; /* Remember value for emit_reloc. */ 4917 4918 if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT 4919 && !S_IS_DEFINED (fixP->fx_addsy) 4920 && !S_IS_WEAK (fixP->fx_addsy)) 4921 S_SET_WEAK (fixP->fx_addsy); 4922 4923 switch (fixP->fx_r_type) 4924 { 4925 case BFD_RELOC_68K_TLS_GD32: 4926 case BFD_RELOC_68K_TLS_GD16: 4927 case BFD_RELOC_68K_TLS_GD8: 4928 case BFD_RELOC_68K_TLS_LDM32: 4929 case BFD_RELOC_68K_TLS_LDM16: 4930 case BFD_RELOC_68K_TLS_LDM8: 4931 case BFD_RELOC_68K_TLS_LDO32: 4932 case BFD_RELOC_68K_TLS_LDO16: 4933 case BFD_RELOC_68K_TLS_LDO8: 4934 case BFD_RELOC_68K_TLS_IE32: 4935 case BFD_RELOC_68K_TLS_IE16: 4936 case BFD_RELOC_68K_TLS_IE8: 4937 case BFD_RELOC_68K_TLS_LE32: 4938 case BFD_RELOC_68K_TLS_LE16: 4939 case BFD_RELOC_68K_TLS_LE8: 4940 S_SET_THREAD_LOCAL (fixP->fx_addsy); 4941 break; 4942 4943 default: 4944 break; 4945 } 4946 4947 return; 4948 } 4949 #elif defined(OBJ_AOUT) 4950 /* PR gas/3041 Do not fix frags referencing a weak symbol. */ 4951 if (fixP->fx_addsy && S_IS_WEAK (fixP->fx_addsy)) 4952 { 4953 memset (buf, 0, fixP->fx_size); 4954 fixP->fx_addnumber = val; /* Remember value for emit_reloc. */ 4955 return; 4956 } 4957 #endif 4958 4959 if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT 4960 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY) 4961 return; 4962 4963 switch (fixP->fx_size) 4964 { 4965 /* The cast to offsetT below are necessary to make code 4966 correct for machines where ints are smaller than offsetT. */ 4967 case 1: 4968 *buf++ = val; 4969 upper_limit = 0x7f; 4970 lower_limit = - (offsetT) 0x80; 4971 break; 4972 case 2: 4973 *buf++ = (val >> 8); 4974 *buf++ = val; 4975 upper_limit = 0x7fff; 4976 lower_limit = - (offsetT) 0x8000; 4977 break; 4978 case 4: 4979 *buf++ = (val >> 24); 4980 *buf++ = (val >> 16); 4981 *buf++ = (val >> 8); 4982 *buf++ = val; 4983 upper_limit = 0x7fffffff; 4984 lower_limit = - (offsetT) 0x7fffffff - 1; /* Avoid constant overflow. */ 4985 break; 4986 default: 4987 BAD_CASE (fixP->fx_size); 4988 } 4989 4990 /* Fix up a negative reloc. */ 4991 if (fixP->fx_addsy == NULL && fixP->fx_subsy != NULL) 4992 { 4993 fixP->fx_addsy = fixP->fx_subsy; 4994 fixP->fx_subsy = NULL; 4995 fixP->fx_tcbit = 1; 4996 } 4997 4998 /* For non-pc-relative values, it's conceivable we might get something 4999 like "0xff" for a byte field. So extend the upper part of the range 5000 to accept such numbers. We arbitrarily disallow "-0xff" or "0xff+0xff", 5001 so that we can do any range checking at all. */ 5002 if (! fixP->fx_pcrel && ! fixP->fx_signed) 5003 upper_limit = upper_limit * 2 + 1; 5004 5005 if ((addressT) val > upper_limit 5006 && (val > 0 || val < lower_limit)) 5007 as_bad_where (fixP->fx_file, fixP->fx_line, 5008 _("value %ld out of range"), (long)val); 5009 5010 /* A one byte PC-relative reloc means a short branch. We can't use 5011 a short branch with a value of 0 or -1, because those indicate 5012 different opcodes (branches with longer offsets). fixup_segment 5013 in write.c may have clobbered fx_pcrel, so we need to examine the 5014 reloc type. */ 5015 if ((fixP->fx_pcrel 5016 || fixP->fx_r_type == BFD_RELOC_8_PCREL) 5017 && fixP->fx_size == 1 5018 && (fixP->fx_addsy == NULL 5019 || S_IS_DEFINED (fixP->fx_addsy)) 5020 && (val == 0 || val == -1)) 5021 as_bad_where (fixP->fx_file, fixP->fx_line, 5022 _("invalid byte branch offset")); 5023 } 5024 5025 /* *fragP has been relaxed to its final size, and now needs to have 5026 the bytes inside it modified to conform to the new size There is UGLY 5027 MAGIC here. .. 5028 */ 5029 static void 5030 md_convert_frag_1 (fragS *fragP) 5031 { 5032 long disp; 5033 fixS *fixP = NULL; 5034 5035 /* Address in object code of the displacement. */ 5036 int object_address = fragP->fr_fix + fragP->fr_address; 5037 5038 /* Address in gas core of the place to store the displacement. */ 5039 /* This convinces the native rs6000 compiler to generate the code we 5040 want. */ 5041 char *buffer_address = fragP->fr_literal; 5042 buffer_address += fragP->fr_fix; 5043 /* End ibm compiler workaround. */ 5044 5045 /* The displacement of the address, from current location. */ 5046 disp = fragP->fr_symbol ? S_GET_VALUE (fragP->fr_symbol) : 0; 5047 disp = (disp + fragP->fr_offset) - object_address; 5048 5049 switch (fragP->fr_subtype) 5050 { 5051 case TAB (BRANCHBWL, BYTE): 5052 case TAB (BRABSJUNC, BYTE): 5053 case TAB (BRABSJCOND, BYTE): 5054 case TAB (BRANCHBW, BYTE): 5055 case TAB (BRANCHBWPL, BYTE): 5056 know (issbyte (disp)); 5057 if (disp == 0) 5058 as_bad_where (fragP->fr_file, fragP->fr_line, 5059 _("short branch with zero offset: use :w")); 5060 fixP = fix_new (fragP, fragP->fr_fix - 1, 1, fragP->fr_symbol, 5061 fragP->fr_offset, 1, RELAX_RELOC_PC8); 5062 fixP->fx_pcrel_adjust = -1; 5063 break; 5064 case TAB (BRANCHBWL, SHORT): 5065 case TAB (BRABSJUNC, SHORT): 5066 case TAB (BRABSJCOND, SHORT): 5067 case TAB (BRANCHBW, SHORT): 5068 case TAB (BRANCHBWPL, SHORT): 5069 fragP->fr_opcode[1] = 0x00; 5070 fixP = fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol, 5071 fragP->fr_offset, 1, RELAX_RELOC_PC16); 5072 fragP->fr_fix += 2; 5073 break; 5074 case TAB (BRANCHBWL, LONG): 5075 fragP->fr_opcode[1] = (char) 0xFF; 5076 fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol, 5077 fragP->fr_offset, 1, RELAX_RELOC_PC32); 5078 fragP->fr_fix += 4; 5079 break; 5080 case TAB (BRANCHBWPL, LONG): 5081 /* Here we are converting an unconditional branch into a pair of 5082 conditional branches, in order to get the range. */ 5083 fragP->fr_opcode[0] = 0x66; /* bne */ 5084 fragP->fr_opcode[1] = 0xFF; 5085 fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol, 5086 fragP->fr_offset, 1, RELAX_RELOC_PC32); 5087 fixP->fx_file = fragP->fr_file; 5088 fixP->fx_line = fragP->fr_line; 5089 fragP->fr_fix += 4; /* Skip first offset */ 5090 buffer_address += 4; 5091 *buffer_address++ = 0x67; /* beq */ 5092 *buffer_address++ = 0xff; 5093 fragP->fr_fix += 2; /* Skip second branch opcode */ 5094 fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol, 5095 fragP->fr_offset, 1, RELAX_RELOC_PC32); 5096 fragP->fr_fix += 4; 5097 break; 5098 case TAB (BRABSJUNC, LONG): 5099 if (fragP->fr_opcode[0] == 0x61) /* jbsr */ 5100 { 5101 if (flag_keep_pcrel) 5102 as_bad_where (fragP->fr_file, fragP->fr_line, 5103 _("Conversion of PC relative BSR to absolute JSR")); 5104 fragP->fr_opcode[0] = 0x4E; 5105 fragP->fr_opcode[1] = (char) 0xB9; /* JSR with ABSL LONG operand. */ 5106 fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol, 5107 fragP->fr_offset, 0, RELAX_RELOC_ABS32); 5108 fragP->fr_fix += 4; 5109 } 5110 else if (fragP->fr_opcode[0] == 0x60) /* jbra */ 5111 { 5112 if (flag_keep_pcrel) 5113 as_bad_where (fragP->fr_file, fragP->fr_line, 5114 _("Conversion of PC relative branch to absolute jump")); 5115 fragP->fr_opcode[0] = 0x4E; 5116 fragP->fr_opcode[1] = (char) 0xF9; /* JMP with ABSL LONG operand. */ 5117 fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol, 5118 fragP->fr_offset, 0, RELAX_RELOC_ABS32); 5119 fragP->fr_fix += 4; 5120 } 5121 else 5122 { 5123 /* This cannot happen, because jbsr and jbra are the only two 5124 unconditional branches. */ 5125 abort (); 5126 } 5127 break; 5128 case TAB (BRABSJCOND, LONG): 5129 if (flag_keep_pcrel) 5130 as_bad_where (fragP->fr_file, fragP->fr_line, 5131 _("Conversion of PC relative conditional branch to absolute jump")); 5132 5133 /* Only Bcc 68000 instructions can come here 5134 Change bcc into b!cc/jmp absl long. */ 5135 fragP->fr_opcode[0] ^= 0x01; /* Invert bcc. */ 5136 fragP->fr_opcode[1] = 0x06; /* Branch offset = 6. */ 5137 5138 /* JF: these used to be fr_opcode[2,3], but they may be in a 5139 different frag, in which case referring to them is a no-no. 5140 Only fr_opcode[0,1] are guaranteed to work. */ 5141 *buffer_address++ = 0x4e; /* put in jmp long (0x4ef9) */ 5142 *buffer_address++ = (char) 0xf9; 5143 fragP->fr_fix += 2; /* Account for jmp instruction. */ 5144 fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol, 5145 fragP->fr_offset, 0, RELAX_RELOC_ABS32); 5146 fragP->fr_fix += 4; 5147 break; 5148 case TAB (FBRANCH, SHORT): 5149 know ((fragP->fr_opcode[1] & 0x40) == 0); 5150 fixP = fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol, 5151 fragP->fr_offset, 1, RELAX_RELOC_PC16); 5152 fragP->fr_fix += 2; 5153 break; 5154 case TAB (FBRANCH, LONG): 5155 fragP->fr_opcode[1] |= 0x40; /* Turn on LONG bit. */ 5156 fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol, 5157 fragP->fr_offset, 1, RELAX_RELOC_PC32); 5158 fragP->fr_fix += 4; 5159 break; 5160 case TAB (DBCCLBR, SHORT): 5161 case TAB (DBCCABSJ, SHORT): 5162 fixP = fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol, 5163 fragP->fr_offset, 1, RELAX_RELOC_PC16); 5164 fragP->fr_fix += 2; 5165 break; 5166 case TAB (DBCCLBR, LONG): 5167 /* Only DBcc instructions can come here. 5168 Change dbcc into dbcc/bral. 5169 JF: these used to be fr_opcode[2-7], but that's wrong. */ 5170 *buffer_address++ = 0x00; /* Branch offset = 4. */ 5171 *buffer_address++ = 0x04; 5172 *buffer_address++ = 0x60; /* Put in bra pc+6. */ 5173 *buffer_address++ = 0x06; 5174 *buffer_address++ = 0x60; /* Put in bral (0x60ff). */ 5175 *buffer_address++ = (char) 0xff; 5176 5177 fragP->fr_fix += 6; /* Account for bra/jmp instructions. */ 5178 fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol, 5179 fragP->fr_offset, 1, RELAX_RELOC_PC32); 5180 fragP->fr_fix += 4; 5181 break; 5182 case TAB (DBCCABSJ, LONG): 5183 /* Only DBcc instructions can come here. 5184 Change dbcc into dbcc/jmp. 5185 JF: these used to be fr_opcode[2-7], but that's wrong. */ 5186 if (flag_keep_pcrel) 5187 as_bad_where (fragP->fr_file, fragP->fr_line, 5188 _("Conversion of PC relative conditional branch to absolute jump")); 5189 5190 *buffer_address++ = 0x00; /* Branch offset = 4. */ 5191 *buffer_address++ = 0x04; 5192 *buffer_address++ = 0x60; /* Put in bra pc + 6. */ 5193 *buffer_address++ = 0x06; 5194 *buffer_address++ = 0x4e; /* Put in jmp long (0x4ef9). */ 5195 *buffer_address++ = (char) 0xf9; 5196 5197 fragP->fr_fix += 6; /* Account for bra/jmp instructions. */ 5198 fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol, 5199 fragP->fr_offset, 0, RELAX_RELOC_ABS32); 5200 fragP->fr_fix += 4; 5201 break; 5202 case TAB (PCREL1632, SHORT): 5203 fragP->fr_opcode[1] &= ~0x3F; 5204 fragP->fr_opcode[1] |= 0x3A; /* 072 - mode 7.2 */ 5205 fixP = fix_new (fragP, (int) (fragP->fr_fix), 2, fragP->fr_symbol, 5206 fragP->fr_offset, 1, RELAX_RELOC_PC16); 5207 fragP->fr_fix += 2; 5208 break; 5209 case TAB (PCREL1632, LONG): 5210 /* Already set to mode 7.3; this indicates: PC indirect with 5211 suppressed index, 32-bit displacement. */ 5212 *buffer_address++ = 0x01; 5213 *buffer_address++ = 0x70; 5214 fragP->fr_fix += 2; 5215 fixP = fix_new (fragP, (int) (fragP->fr_fix), 4, fragP->fr_symbol, 5216 fragP->fr_offset, 1, RELAX_RELOC_PC32); 5217 fixP->fx_pcrel_adjust = 2; 5218 fragP->fr_fix += 4; 5219 break; 5220 case TAB (PCINDEX, BYTE): 5221 gas_assert (fragP->fr_fix >= 2); 5222 buffer_address[-2] &= ~1; 5223 fixP = fix_new (fragP, fragP->fr_fix - 1, 1, fragP->fr_symbol, 5224 fragP->fr_offset, 1, RELAX_RELOC_PC8); 5225 fixP->fx_pcrel_adjust = 1; 5226 break; 5227 case TAB (PCINDEX, SHORT): 5228 gas_assert (fragP->fr_fix >= 2); 5229 buffer_address[-2] |= 0x1; 5230 buffer_address[-1] = 0x20; 5231 fixP = fix_new (fragP, (int) (fragP->fr_fix), 2, fragP->fr_symbol, 5232 fragP->fr_offset, 1, RELAX_RELOC_PC16); 5233 fixP->fx_pcrel_adjust = 2; 5234 fragP->fr_fix += 2; 5235 break; 5236 case TAB (PCINDEX, LONG): 5237 gas_assert (fragP->fr_fix >= 2); 5238 buffer_address[-2] |= 0x1; 5239 buffer_address[-1] = 0x30; 5240 fixP = fix_new (fragP, (int) (fragP->fr_fix), 4, fragP->fr_symbol, 5241 fragP->fr_offset, 1, RELAX_RELOC_PC32); 5242 fixP->fx_pcrel_adjust = 2; 5243 fragP->fr_fix += 4; 5244 break; 5245 case TAB (ABSTOPCREL, SHORT): 5246 fixP = fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol, 5247 fragP->fr_offset, 1, RELAX_RELOC_PC16); 5248 fragP->fr_fix += 2; 5249 break; 5250 case TAB (ABSTOPCREL, LONG): 5251 if (flag_keep_pcrel) 5252 as_bad_where (fragP->fr_file, fragP->fr_line, 5253 _("Conversion of PC relative displacement to absolute")); 5254 /* The thing to do here is force it to ABSOLUTE LONG, since 5255 ABSTOPCREL is really trying to shorten an ABSOLUTE address anyway. */ 5256 if ((fragP->fr_opcode[1] & 0x3F) != 0x3A) 5257 abort (); 5258 fragP->fr_opcode[1] &= ~0x3F; 5259 fragP->fr_opcode[1] |= 0x39; /* Mode 7.1 */ 5260 fixP = fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol, 5261 fragP->fr_offset, 0, RELAX_RELOC_ABS32); 5262 fragP->fr_fix += 4; 5263 break; 5264 } 5265 if (fixP) 5266 { 5267 fixP->fx_file = fragP->fr_file; 5268 fixP->fx_line = fragP->fr_line; 5269 } 5270 } 5271 5272 void 5273 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, 5274 segT sec ATTRIBUTE_UNUSED, 5275 fragS *fragP) 5276 { 5277 md_convert_frag_1 (fragP); 5278 } 5279 5280 /* Force truly undefined symbols to their maximum size, and generally set up 5281 the frag list to be relaxed 5282 */ 5283 int 5284 md_estimate_size_before_relax (fragS *fragP, segT segment) 5285 { 5286 /* Handle SZ_UNDEF first, it can be changed to BYTE or SHORT. */ 5287 switch (fragP->fr_subtype) 5288 { 5289 case TAB (BRANCHBWL, SZ_UNDEF): 5290 case TAB (BRANCHBWPL, SZ_UNDEF): 5291 case TAB (BRABSJUNC, SZ_UNDEF): 5292 case TAB (BRABSJCOND, SZ_UNDEF): 5293 { 5294 if (S_GET_SEGMENT (fragP->fr_symbol) == segment 5295 && relaxable_symbol (fragP->fr_symbol)) 5296 { 5297 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), BYTE); 5298 } 5299 else if (flag_short_refs) 5300 { 5301 /* Symbol is undefined and we want short ref. */ 5302 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT); 5303 } 5304 else 5305 { 5306 /* Symbol is still undefined. Make it LONG. */ 5307 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), LONG); 5308 } 5309 break; 5310 } 5311 5312 case TAB (BRANCHBW, SZ_UNDEF): 5313 { 5314 if (S_GET_SEGMENT (fragP->fr_symbol) == segment 5315 && relaxable_symbol (fragP->fr_symbol)) 5316 { 5317 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), BYTE); 5318 } 5319 else 5320 { 5321 /* Symbol is undefined and we don't have long branches. */ 5322 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT); 5323 } 5324 break; 5325 } 5326 5327 case TAB (FBRANCH, SZ_UNDEF): 5328 case TAB (DBCCLBR, SZ_UNDEF): 5329 case TAB (DBCCABSJ, SZ_UNDEF): 5330 case TAB (PCREL1632, SZ_UNDEF): 5331 { 5332 if ((S_GET_SEGMENT (fragP->fr_symbol) == segment 5333 && relaxable_symbol (fragP->fr_symbol)) 5334 || flag_short_refs) 5335 { 5336 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT); 5337 } 5338 else 5339 { 5340 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), LONG); 5341 } 5342 break; 5343 } 5344 5345 case TAB (PCINDEX, SZ_UNDEF): 5346 if ((S_GET_SEGMENT (fragP->fr_symbol) == segment 5347 && relaxable_symbol (fragP->fr_symbol))) 5348 { 5349 fragP->fr_subtype = TAB (PCINDEX, BYTE); 5350 } 5351 else 5352 { 5353 fragP->fr_subtype = TAB (PCINDEX, LONG); 5354 } 5355 break; 5356 5357 case TAB (ABSTOPCREL, SZ_UNDEF): 5358 { 5359 if ((S_GET_SEGMENT (fragP->fr_symbol) == segment 5360 && relaxable_symbol (fragP->fr_symbol))) 5361 { 5362 fragP->fr_subtype = TAB (ABSTOPCREL, SHORT); 5363 } 5364 else 5365 { 5366 fragP->fr_subtype = TAB (ABSTOPCREL, LONG); 5367 } 5368 break; 5369 } 5370 5371 default: 5372 break; 5373 } 5374 5375 /* Now that SZ_UNDEF are taken care of, check others. */ 5376 switch (fragP->fr_subtype) 5377 { 5378 case TAB (BRANCHBWL, BYTE): 5379 case TAB (BRABSJUNC, BYTE): 5380 case TAB (BRABSJCOND, BYTE): 5381 case TAB (BRANCHBW, BYTE): 5382 /* We can't do a short jump to the next instruction, so in that 5383 case we force word mode. If the symbol is at the start of a 5384 frag, and it is the next frag with any data in it (usually 5385 this is just the next frag, but assembler listings may 5386 introduce empty frags), we must use word mode. */ 5387 if (fragP->fr_symbol) 5388 { 5389 fragS *sym_frag; 5390 5391 sym_frag = symbol_get_frag (fragP->fr_symbol); 5392 if (S_GET_VALUE (fragP->fr_symbol) == sym_frag->fr_address) 5393 { 5394 fragS *l; 5395 5396 for (l = fragP->fr_next; l && l != sym_frag; l = l->fr_next) 5397 if (l->fr_fix != 0) 5398 break; 5399 if (l == sym_frag) 5400 fragP->fr_subtype = TAB (TABTYPE (fragP->fr_subtype), SHORT); 5401 } 5402 } 5403 break; 5404 default: 5405 break; 5406 } 5407 return md_relax_table[fragP->fr_subtype].rlx_length; 5408 } 5409 5410 #if defined(OBJ_AOUT) | defined(OBJ_BOUT) 5411 /* the bit-field entries in the relocation_info struct plays hell 5412 with the byte-order problems of cross-assembly. So as a hack, 5413 I added this mach. dependent ri twiddler. Ugly, but it gets 5414 you there. -KWK */ 5415 /* on m68k: first 4 bytes are normal unsigned long, next three bytes 5416 are symbolnum, most sig. byte first. Last byte is broken up with 5417 bit 7 as pcrel, bits 6 & 5 as length, bit 4 as pcrel, and the lower 5418 nibble as nuthin. (on Sun 3 at least) */ 5419 /* Translate the internal relocation information into target-specific 5420 format. */ 5421 #ifdef comment 5422 void 5423 md_ri_to_chars (char *the_bytes, struct reloc_info_generic *ri) 5424 { 5425 /* This is easy. */ 5426 md_number_to_chars (the_bytes, ri->r_address, 4); 5427 /* Now the fun stuff. */ 5428 the_bytes[4] = (ri->r_symbolnum >> 16) & 0x0ff; 5429 the_bytes[5] = (ri->r_symbolnum >> 8) & 0x0ff; 5430 the_bytes[6] = ri->r_symbolnum & 0x0ff; 5431 the_bytes[7] = (((ri->r_pcrel << 7) & 0x80) 5432 | ((ri->r_length << 5) & 0x60) 5433 | ((ri->r_extern << 4) & 0x10)); 5434 } 5435 5436 #endif 5437 5438 #endif /* OBJ_AOUT or OBJ_BOUT */ 5439 5440 #ifndef WORKING_DOT_WORD 5441 int md_short_jump_size = 4; 5442 int md_long_jump_size = 6; 5443 5444 void 5445 md_create_short_jump (char *ptr, addressT from_addr, addressT to_addr, 5446 fragS *frag ATTRIBUTE_UNUSED, 5447 symbolS *to_symbol ATTRIBUTE_UNUSED) 5448 { 5449 valueT offset; 5450 5451 offset = to_addr - (from_addr + 2); 5452 5453 md_number_to_chars (ptr, (valueT) 0x6000, 2); 5454 md_number_to_chars (ptr + 2, (valueT) offset, 2); 5455 } 5456 5457 void 5458 md_create_long_jump (char *ptr, addressT from_addr, addressT to_addr, 5459 fragS *frag, symbolS *to_symbol) 5460 { 5461 valueT offset; 5462 5463 if (!HAVE_LONG_BRANCH (current_architecture)) 5464 { 5465 if (flag_keep_pcrel) 5466 as_fatal (_("Tried to convert PC relative branch to absolute jump")); 5467 offset = to_addr - S_GET_VALUE (to_symbol); 5468 md_number_to_chars (ptr, (valueT) 0x4EF9, 2); 5469 md_number_to_chars (ptr + 2, (valueT) offset, 4); 5470 fix_new (frag, (ptr + 2) - frag->fr_literal, 4, to_symbol, (offsetT) 0, 5471 0, NO_RELOC); 5472 } 5473 else 5474 { 5475 offset = to_addr - (from_addr + 2); 5476 md_number_to_chars (ptr, (valueT) 0x60ff, 2); 5477 md_number_to_chars (ptr + 2, (valueT) offset, 4); 5478 } 5479 } 5480 5481 #endif 5482 5483 /* Different values of OK tell what its OK to return. Things that 5484 aren't OK are an error (what a shock, no?) 5485 5486 0: Everything is OK 5487 10: Absolute 1:8 only 5488 20: Absolute 0:7 only 5489 30: absolute 0:15 only 5490 40: Absolute 0:31 only 5491 50: absolute 0:127 only 5492 55: absolute -64:63 only 5493 60: absolute -128:127 only 5494 65: absolute 0:511 only 5495 70: absolute 0:4095 only 5496 80: absolute -1, 1:7 only 5497 90: No bignums. */ 5498 5499 static int 5500 get_num (struct m68k_exp *exp, int ok) 5501 { 5502 if (exp->exp.X_op == O_absent) 5503 { 5504 /* Do the same thing the VAX asm does. */ 5505 op (exp) = O_constant; 5506 adds (exp) = 0; 5507 subs (exp) = 0; 5508 offs (exp) = 0; 5509 if (ok == 10) 5510 { 5511 as_warn (_("expression out of range: defaulting to 1")); 5512 offs (exp) = 1; 5513 } 5514 } 5515 else if (exp->exp.X_op == O_constant) 5516 { 5517 switch (ok) 5518 { 5519 case 10: 5520 if ((valueT) TRUNC (offs (exp)) - 1 > 7) 5521 { 5522 as_warn (_("expression out of range: defaulting to 1")); 5523 offs (exp) = 1; 5524 } 5525 break; 5526 case 20: 5527 if ((valueT) TRUNC (offs (exp)) > 7) 5528 goto outrange; 5529 break; 5530 case 30: 5531 if ((valueT) TRUNC (offs (exp)) > 15) 5532 goto outrange; 5533 break; 5534 case 40: 5535 if ((valueT) TRUNC (offs (exp)) > 32) 5536 goto outrange; 5537 break; 5538 case 50: 5539 if ((valueT) TRUNC (offs (exp)) > 127) 5540 goto outrange; 5541 break; 5542 case 55: 5543 if ((valueT) SEXT (offs (exp)) + 64 > 127) 5544 goto outrange; 5545 break; 5546 case 60: 5547 if ((valueT) SEXT (offs (exp)) + 128 > 255) 5548 goto outrange; 5549 break; 5550 case 65: 5551 if ((valueT) TRUNC (offs (exp)) > 511) 5552 goto outrange; 5553 break; 5554 case 70: 5555 if ((valueT) TRUNC (offs (exp)) > 4095) 5556 { 5557 outrange: 5558 as_warn (_("expression out of range: defaulting to 0")); 5559 offs (exp) = 0; 5560 } 5561 break; 5562 case 80: 5563 if ((valueT) TRUNC (offs (exp)) != 0xffffffff 5564 && (valueT) TRUNC (offs (exp)) - 1 > 6) 5565 { 5566 as_warn (_("expression out of range: defaulting to 1")); 5567 offs (exp) = 1; 5568 } 5569 break; 5570 default: 5571 break; 5572 } 5573 } 5574 else if (exp->exp.X_op == O_big) 5575 { 5576 if (offs (exp) <= 0 /* flonum. */ 5577 && (ok == 90 /* no bignums */ 5578 || (ok > 10 /* Small-int ranges including 0 ok. */ 5579 /* If we have a flonum zero, a zero integer should 5580 do as well (e.g., in moveq). */ 5581 && generic_floating_point_number.exponent == 0 5582 && generic_floating_point_number.low[0] == 0))) 5583 { 5584 /* HACK! Turn it into a long. */ 5585 LITTLENUM_TYPE words[6]; 5586 5587 gen_to_words (words, 2, 8L); /* These numbers are magic! */ 5588 op (exp) = O_constant; 5589 adds (exp) = 0; 5590 subs (exp) = 0; 5591 offs (exp) = words[1] | (words[0] << 16); 5592 } 5593 else if (ok != 0) 5594 { 5595 op (exp) = O_constant; 5596 adds (exp) = 0; 5597 subs (exp) = 0; 5598 offs (exp) = (ok == 10) ? 1 : 0; 5599 as_warn (_("Can't deal with expression; defaulting to %ld"), 5600 (long) offs (exp)); 5601 } 5602 } 5603 else 5604 { 5605 if (ok >= 10 && ok <= 80) 5606 { 5607 op (exp) = O_constant; 5608 adds (exp) = 0; 5609 subs (exp) = 0; 5610 offs (exp) = (ok == 10) ? 1 : 0; 5611 as_warn (_("Can't deal with expression; defaulting to %ld"), 5612 (long) offs (exp)); 5613 } 5614 } 5615 5616 if (exp->size != SIZE_UNSPEC) 5617 { 5618 switch (exp->size) 5619 { 5620 case SIZE_UNSPEC: 5621 case SIZE_LONG: 5622 break; 5623 case SIZE_BYTE: 5624 if (!isbyte (offs (exp))) 5625 as_warn (_("expression doesn't fit in BYTE")); 5626 break; 5627 case SIZE_WORD: 5628 if (!isword (offs (exp))) 5629 as_warn (_("expression doesn't fit in WORD")); 5630 break; 5631 } 5632 } 5633 5634 return offs (exp); 5635 } 5636 5637 /* These are the back-ends for the various machine dependent pseudo-ops. */ 5638 5639 static void 5640 s_data1 (int ignore ATTRIBUTE_UNUSED) 5641 { 5642 subseg_set (data_section, 1); 5643 demand_empty_rest_of_line (); 5644 } 5645 5646 static void 5647 s_data2 (int ignore ATTRIBUTE_UNUSED) 5648 { 5649 subseg_set (data_section, 2); 5650 demand_empty_rest_of_line (); 5651 } 5652 5653 static void 5654 s_bss (int ignore ATTRIBUTE_UNUSED) 5655 { 5656 /* We don't support putting frags in the BSS segment, we fake it 5657 by marking in_bss, then looking at s_skip for clues. */ 5658 5659 subseg_set (bss_section, 0); 5660 demand_empty_rest_of_line (); 5661 } 5662 5663 static void 5664 s_even (int ignore ATTRIBUTE_UNUSED) 5665 { 5666 int temp; 5667 long temp_fill; 5668 5669 temp = 1; /* JF should be 2? */ 5670 temp_fill = get_absolute_expression (); 5671 if (!need_pass_2) /* Never make frag if expect extra pass. */ 5672 frag_align (temp, (int) temp_fill, 0); 5673 demand_empty_rest_of_line (); 5674 record_alignment (now_seg, temp); 5675 } 5676 5677 static void 5678 s_proc (int ignore ATTRIBUTE_UNUSED) 5679 { 5680 demand_empty_rest_of_line (); 5681 } 5682 5683 /* Pseudo-ops handled for MRI compatibility. */ 5685 5686 /* This function returns non-zero if the argument is a conditional 5687 pseudo-op. This is called when checking whether a pending 5688 alignment is needed. */ 5689 5690 int 5691 m68k_conditional_pseudoop (pseudo_typeS *pop) 5692 { 5693 return (pop->poc_handler == s_mri_if 5694 || pop->poc_handler == s_mri_else); 5695 } 5696 5697 /* Handle an MRI style chip specification. */ 5698 5699 static void 5700 mri_chip (void) 5701 { 5702 char *s; 5703 char c; 5704 int i; 5705 5706 s = input_line_pointer; 5707 /* We can't use get_symbol_name since the processor names are not proper 5708 symbols. */ 5709 while (is_part_of_name (c = *input_line_pointer++)) 5710 ; 5711 *--input_line_pointer = 0; 5712 for (i = 0; m68k_cpus[i].name; i++) 5713 if (strcasecmp (s, m68k_cpus[i].name) == 0) 5714 break; 5715 if (!m68k_cpus[i].name) 5716 { 5717 as_bad (_("%s: unrecognized processor name"), s); 5718 *input_line_pointer = c; 5719 ignore_rest_of_line (); 5720 return; 5721 } 5722 *input_line_pointer = c; 5723 5724 if (*input_line_pointer == '/') 5725 current_architecture = 0; 5726 else 5727 current_architecture &= m68881 | m68851; 5728 current_architecture |= m68k_cpus[i].arch & ~(m68881 | m68851); 5729 control_regs = m68k_cpus[i].control_regs; 5730 5731 while (*input_line_pointer == '/') 5732 { 5733 ++input_line_pointer; 5734 s = input_line_pointer; 5735 /* We can't use get_symbol_name since the processor names are not 5736 proper symbols. */ 5737 while (is_part_of_name (c = *input_line_pointer++)) 5738 ; 5739 *--input_line_pointer = 0; 5740 if (strcmp (s, "68881") == 0) 5741 current_architecture |= m68881; 5742 else if (strcmp (s, "68851") == 0) 5743 current_architecture |= m68851; 5744 *input_line_pointer = c; 5745 } 5746 } 5747 5748 /* The MRI CHIP pseudo-op. */ 5749 5750 static void 5751 s_chip (int ignore ATTRIBUTE_UNUSED) 5752 { 5753 char *stop = NULL; 5754 char stopc; 5755 5756 if (flag_mri) 5757 stop = mri_comment_field (&stopc); 5758 mri_chip (); 5759 if (flag_mri) 5760 mri_comment_end (stop, stopc); 5761 demand_empty_rest_of_line (); 5762 } 5763 5764 /* The MRI FOPT pseudo-op. */ 5765 5766 static void 5767 s_fopt (int ignore ATTRIBUTE_UNUSED) 5768 { 5769 SKIP_WHITESPACE (); 5770 5771 if (strncasecmp (input_line_pointer, "ID=", 3) == 0) 5772 { 5773 int temp; 5774 5775 input_line_pointer += 3; 5776 temp = get_absolute_expression (); 5777 if (temp < 0 || temp > 7) 5778 as_bad (_("bad coprocessor id")); 5779 else 5780 m68k_float_copnum = COP0 + temp; 5781 } 5782 else 5783 { 5784 as_bad (_("unrecognized fopt option")); 5785 ignore_rest_of_line (); 5786 return; 5787 } 5788 5789 demand_empty_rest_of_line (); 5790 } 5791 5792 /* The structure used to handle the MRI OPT pseudo-op. */ 5793 5794 struct opt_action 5795 { 5796 /* The name of the option. */ 5797 const char *name; 5798 5799 /* If this is not NULL, just call this function. The first argument 5800 is the ARG field of this structure, the second argument is 5801 whether the option was negated. */ 5802 void (*pfn) (int arg, int on); 5803 5804 /* If this is not NULL, and the PFN field is NULL, set the variable 5805 this points to. Set it to the ARG field if the option was not 5806 negated, and the NOTARG field otherwise. */ 5807 int *pvar; 5808 5809 /* The value to pass to PFN or to assign to *PVAR. */ 5810 int arg; 5811 5812 /* The value to assign to *PVAR if the option is negated. If PFN is 5813 NULL, and PVAR is not NULL, and ARG and NOTARG are the same, then 5814 the option may not be negated. */ 5815 int notarg; 5816 }; 5817 5818 /* The table used to handle the MRI OPT pseudo-op. */ 5819 5820 static void skip_to_comma (int, int); 5821 static void opt_nest (int, int); 5822 static void opt_chip (int, int); 5823 static void opt_list (int, int); 5824 static void opt_list_symbols (int, int); 5825 5826 static const struct opt_action opt_table[] = 5827 { 5828 { "abspcadd", 0, &m68k_abspcadd, 1, 0 }, 5829 5830 /* We do relaxing, so there is little use for these options. */ 5831 { "b", 0, 0, 0, 0 }, 5832 { "brs", 0, 0, 0, 0 }, 5833 { "brb", 0, 0, 0, 0 }, 5834 { "brl", 0, 0, 0, 0 }, 5835 { "brw", 0, 0, 0, 0 }, 5836 5837 { "c", 0, 0, 0, 0 }, 5838 { "cex", 0, 0, 0, 0 }, 5839 { "case", 0, &symbols_case_sensitive, 1, 0 }, 5840 { "cl", 0, 0, 0, 0 }, 5841 { "cre", 0, 0, 0, 0 }, 5842 { "d", 0, &flag_keep_locals, 1, 0 }, 5843 { "e", 0, 0, 0, 0 }, 5844 { "f", 0, &flag_short_refs, 1, 0 }, 5845 { "frs", 0, &flag_short_refs, 1, 0 }, 5846 { "frl", 0, &flag_short_refs, 0, 1 }, 5847 { "g", 0, 0, 0, 0 }, 5848 { "i", 0, 0, 0, 0 }, 5849 { "m", 0, 0, 0, 0 }, 5850 { "mex", 0, 0, 0, 0 }, 5851 { "mc", 0, 0, 0, 0 }, 5852 { "md", 0, 0, 0, 0 }, 5853 { "nest", opt_nest, 0, 0, 0 }, 5854 { "next", skip_to_comma, 0, 0, 0 }, 5855 { "o", 0, 0, 0, 0 }, 5856 { "old", 0, 0, 0, 0 }, 5857 { "op", skip_to_comma, 0, 0, 0 }, 5858 { "pco", 0, 0, 0, 0 }, 5859 { "p", opt_chip, 0, 0, 0 }, 5860 { "pcr", 0, 0, 0, 0 }, 5861 { "pcs", 0, 0, 0, 0 }, 5862 { "r", 0, 0, 0, 0 }, 5863 { "quick", 0, &m68k_quick, 1, 0 }, 5864 { "rel32", 0, &m68k_rel32, 1, 0 }, 5865 { "s", opt_list, 0, 0, 0 }, 5866 { "t", opt_list_symbols, 0, 0, 0 }, 5867 { "w", 0, &flag_no_warnings, 0, 1 }, 5868 { "x", 0, 0, 0, 0 } 5869 }; 5870 5871 #define OPTCOUNT ((int) (sizeof opt_table / sizeof opt_table[0])) 5872 5873 /* The MRI OPT pseudo-op. */ 5874 5875 static void 5876 s_opt (int ignore ATTRIBUTE_UNUSED) 5877 { 5878 do 5879 { 5880 int t; 5881 char *s; 5882 char c; 5883 int i; 5884 const struct opt_action *o; 5885 5886 SKIP_WHITESPACE (); 5887 5888 t = 1; 5889 if (*input_line_pointer == '-') 5890 { 5891 ++input_line_pointer; 5892 t = 0; 5893 } 5894 else if (strncasecmp (input_line_pointer, "NO", 2) == 0) 5895 { 5896 input_line_pointer += 2; 5897 t = 0; 5898 } 5899 5900 c = get_symbol_name (&s); 5901 5902 for (i = 0, o = opt_table; i < OPTCOUNT; i++, o++) 5903 { 5904 if (strcasecmp (s, o->name) == 0) 5905 { 5906 if (o->pfn) 5907 { 5908 /* Restore input_line_pointer now in case the option 5909 takes arguments. */ 5910 (void) restore_line_pointer (c); 5911 (*o->pfn) (o->arg, t); 5912 } 5913 else if (o->pvar != NULL) 5914 { 5915 if (! t && o->arg == o->notarg) 5916 as_bad (_("option `%s' may not be negated"), s); 5917 restore_line_pointer (c); 5918 *o->pvar = t ? o->arg : o->notarg; 5919 } 5920 else 5921 *input_line_pointer = c; 5922 break; 5923 } 5924 } 5925 if (i >= OPTCOUNT) 5926 { 5927 as_bad (_("option `%s' not recognized"), s); 5928 restore_line_pointer (c); 5929 } 5930 } 5931 while (*input_line_pointer++ == ','); 5932 5933 /* Move back to terminating character. */ 5934 --input_line_pointer; 5935 demand_empty_rest_of_line (); 5936 } 5937 5938 /* Skip ahead to a comma. This is used for OPT options which we do 5939 not support and which take arguments. */ 5940 5941 static void 5942 skip_to_comma (int arg ATTRIBUTE_UNUSED, int on ATTRIBUTE_UNUSED) 5943 { 5944 while (*input_line_pointer != ',' 5945 && ! is_end_of_line[(unsigned char) *input_line_pointer]) 5946 ++input_line_pointer; 5947 } 5948 5949 /* Handle the OPT NEST=depth option. */ 5950 5951 static void 5952 opt_nest (int arg ATTRIBUTE_UNUSED, int on ATTRIBUTE_UNUSED) 5953 { 5954 if (*input_line_pointer != '=') 5955 { 5956 as_bad (_("bad format of OPT NEST=depth")); 5957 return; 5958 } 5959 5960 ++input_line_pointer; 5961 max_macro_nest = get_absolute_expression (); 5962 } 5963 5964 /* Handle the OPT P=chip option. */ 5965 5966 static void 5967 opt_chip (int arg ATTRIBUTE_UNUSED, int on ATTRIBUTE_UNUSED) 5968 { 5969 if (*input_line_pointer != '=') 5970 { 5971 /* This is just OPT P, which we do not support. */ 5972 return; 5973 } 5974 5975 ++input_line_pointer; 5976 mri_chip (); 5977 } 5978 5979 /* Handle the OPT S option. */ 5980 5981 static void 5982 opt_list (int arg ATTRIBUTE_UNUSED, int on) 5983 { 5984 listing_list (on); 5985 } 5986 5987 /* Handle the OPT T option. */ 5988 5989 static void 5990 opt_list_symbols (int arg ATTRIBUTE_UNUSED, int on) 5991 { 5992 if (on) 5993 listing |= LISTING_SYMBOLS; 5994 else 5995 listing &= ~LISTING_SYMBOLS; 5996 } 5997 5998 /* Handle the MRI REG pseudo-op. */ 5999 6000 static void 6001 s_reg (int ignore ATTRIBUTE_UNUSED) 6002 { 6003 char *s; 6004 int c; 6005 struct m68k_op rop; 6006 int mask; 6007 char *stop = NULL; 6008 char stopc; 6009 6010 if (line_label == NULL) 6011 { 6012 as_bad (_("missing label")); 6013 ignore_rest_of_line (); 6014 return; 6015 } 6016 6017 if (flag_mri) 6018 stop = mri_comment_field (&stopc); 6019 6020 SKIP_WHITESPACE (); 6021 6022 s = input_line_pointer; 6023 while (ISALNUM (*input_line_pointer) 6024 #ifdef REGISTER_PREFIX 6025 || *input_line_pointer == REGISTER_PREFIX 6026 #endif 6027 || *input_line_pointer == '/' 6028 || *input_line_pointer == '-') 6029 ++input_line_pointer; 6030 c = *input_line_pointer; 6031 *input_line_pointer = '\0'; 6032 6033 if (m68k_ip_op (s, &rop) != 0) 6034 { 6035 if (rop.error == NULL) 6036 as_bad (_("bad register list")); 6037 else 6038 as_bad (_("bad register list: %s"), rop.error); 6039 *input_line_pointer = c; 6040 ignore_rest_of_line (); 6041 return; 6042 } 6043 6044 *input_line_pointer = c; 6045 6046 if (rop.mode == REGLST) 6047 mask = rop.mask; 6048 else if (rop.mode == DREG) 6049 mask = 1 << (rop.reg - DATA0); 6050 else if (rop.mode == AREG) 6051 mask = 1 << (rop.reg - ADDR0 + 8); 6052 else if (rop.mode == FPREG) 6053 mask = 1 << (rop.reg - FP0 + 16); 6054 else if (rop.mode == CONTROL 6055 && rop.reg == FPI) 6056 mask = 1 << 24; 6057 else if (rop.mode == CONTROL 6058 && rop.reg == FPS) 6059 mask = 1 << 25; 6060 else if (rop.mode == CONTROL 6061 && rop.reg == FPC) 6062 mask = 1 << 26; 6063 else 6064 { 6065 as_bad (_("bad register list")); 6066 ignore_rest_of_line (); 6067 return; 6068 } 6069 6070 S_SET_SEGMENT (line_label, reg_section); 6071 S_SET_VALUE (line_label, ~mask); 6072 symbol_set_frag (line_label, &zero_address_frag); 6073 6074 if (flag_mri) 6075 mri_comment_end (stop, stopc); 6076 6077 demand_empty_rest_of_line (); 6078 } 6079 6080 /* This structure is used for the MRI SAVE and RESTORE pseudo-ops. */ 6081 6082 struct save_opts 6083 { 6084 struct save_opts *next; 6085 int abspcadd; 6086 int symbols_case_sensitive; 6087 int keep_locals; 6088 int short_refs; 6089 int architecture; 6090 const enum m68k_register *control_regs; 6091 int quick; 6092 int rel32; 6093 int listing; 6094 int no_warnings; 6095 /* FIXME: We don't save OPT S. */ 6096 }; 6097 6098 /* This variable holds the stack of saved options. */ 6099 6100 static struct save_opts *save_stack; 6101 6102 /* The MRI SAVE pseudo-op. */ 6103 6104 static void 6105 s_save (int ignore ATTRIBUTE_UNUSED) 6106 { 6107 struct save_opts *s; 6108 6109 s = XNEW (struct save_opts); 6110 s->abspcadd = m68k_abspcadd; 6111 s->symbols_case_sensitive = symbols_case_sensitive; 6112 s->keep_locals = flag_keep_locals; 6113 s->short_refs = flag_short_refs; 6114 s->architecture = current_architecture; 6115 s->control_regs = control_regs; 6116 s->quick = m68k_quick; 6117 s->rel32 = m68k_rel32; 6118 s->listing = listing; 6119 s->no_warnings = flag_no_warnings; 6120 6121 s->next = save_stack; 6122 save_stack = s; 6123 6124 demand_empty_rest_of_line (); 6125 } 6126 6127 /* The MRI RESTORE pseudo-op. */ 6128 6129 static void 6130 s_restore (int ignore ATTRIBUTE_UNUSED) 6131 { 6132 struct save_opts *s; 6133 6134 if (save_stack == NULL) 6135 { 6136 as_bad (_("restore without save")); 6137 ignore_rest_of_line (); 6138 return; 6139 } 6140 6141 s = save_stack; 6142 save_stack = s->next; 6143 6144 m68k_abspcadd = s->abspcadd; 6145 symbols_case_sensitive = s->symbols_case_sensitive; 6146 flag_keep_locals = s->keep_locals; 6147 flag_short_refs = s->short_refs; 6148 current_architecture = s->architecture; 6149 control_regs = s->control_regs; 6150 m68k_quick = s->quick; 6151 m68k_rel32 = s->rel32; 6152 listing = s->listing; 6153 flag_no_warnings = s->no_warnings; 6154 6155 free (s); 6156 6157 demand_empty_rest_of_line (); 6158 } 6159 6160 /* Types of MRI structured control directives. */ 6161 6162 enum mri_control_type 6163 { 6164 mri_for, 6165 mri_if, 6166 mri_repeat, 6167 mri_while 6168 }; 6169 6170 /* This structure is used to stack the MRI structured control 6171 directives. */ 6172 6173 struct mri_control_info 6174 { 6175 /* The directive within which this one is enclosed. */ 6176 struct mri_control_info *outer; 6177 6178 /* The type of directive. */ 6179 enum mri_control_type type; 6180 6181 /* Whether an ELSE has been in an IF. */ 6182 int else_seen; 6183 6184 /* The add or sub statement at the end of a FOR. */ 6185 char *incr; 6186 6187 /* The label of the top of a FOR or REPEAT loop. */ 6188 char *top; 6189 6190 /* The label to jump to for the next iteration, or the else 6191 expression of a conditional. */ 6192 char *next; 6193 6194 /* The label to jump to to break out of the loop, or the label past 6195 the end of a conditional. */ 6196 char *bottom; 6197 }; 6198 6199 /* The stack of MRI structured control directives. */ 6200 6201 static struct mri_control_info *mri_control_stack; 6202 6203 /* The current MRI structured control directive index number, used to 6204 generate label names. */ 6205 6206 static int mri_control_index; 6207 6208 /* Assemble an instruction for an MRI structured control directive. */ 6209 6210 static void 6211 mri_assemble (char *str) 6212 { 6213 char *s; 6214 6215 /* md_assemble expects the opcode to be in lower case. */ 6216 for (s = str; *s != ' ' && *s != '\0'; s++) 6217 *s = TOLOWER (*s); 6218 6219 md_assemble (str); 6220 } 6221 6222 /* Generate a new MRI label structured control directive label name. */ 6223 6224 static char * 6225 mri_control_label (void) 6226 { 6227 char *n; 6228 6229 n = XNEWVEC (char, 20); 6230 sprintf (n, "%smc%d", FAKE_LABEL_NAME, mri_control_index); 6231 ++mri_control_index; 6232 return n; 6233 } 6234 6235 /* Create a new MRI structured control directive. */ 6236 6237 static struct mri_control_info * 6238 push_mri_control (enum mri_control_type type) 6239 { 6240 struct mri_control_info *n; 6241 6242 n = XNEW (struct mri_control_info); 6243 6244 n->type = type; 6245 n->else_seen = 0; 6246 if (type == mri_if || type == mri_while) 6247 n->top = NULL; 6248 else 6249 n->top = mri_control_label (); 6250 n->next = mri_control_label (); 6251 n->bottom = mri_control_label (); 6252 6253 n->outer = mri_control_stack; 6254 mri_control_stack = n; 6255 6256 return n; 6257 } 6258 6259 /* Pop off the stack of MRI structured control directives. */ 6260 6261 static void 6262 pop_mri_control (void) 6263 { 6264 struct mri_control_info *n; 6265 6266 n = mri_control_stack; 6267 mri_control_stack = n->outer; 6268 if (n->top != NULL) 6269 free (n->top); 6270 free (n->next); 6271 free (n->bottom); 6272 free (n); 6273 } 6274 6275 /* Recognize a condition code in an MRI structured control expression. */ 6276 6277 static int 6278 parse_mri_condition (int *pcc) 6279 { 6280 char c1, c2; 6281 6282 know (*input_line_pointer == '<'); 6283 6284 ++input_line_pointer; 6285 c1 = *input_line_pointer++; 6286 c2 = *input_line_pointer++; 6287 6288 if (*input_line_pointer != '>') 6289 { 6290 as_bad (_("syntax error in structured control directive")); 6291 return 0; 6292 } 6293 6294 ++input_line_pointer; 6295 SKIP_WHITESPACE (); 6296 6297 c1 = TOLOWER (c1); 6298 c2 = TOLOWER (c2); 6299 6300 *pcc = (c1 << 8) | c2; 6301 6302 return 1; 6303 } 6304 6305 /* Parse a single operand in an MRI structured control expression. */ 6306 6307 static int 6308 parse_mri_control_operand (int *pcc, char **leftstart, char **leftstop, 6309 char **rightstart, char **rightstop) 6310 { 6311 char *s; 6312 6313 SKIP_WHITESPACE (); 6314 6315 *pcc = -1; 6316 *leftstart = NULL; 6317 *leftstop = NULL; 6318 *rightstart = NULL; 6319 *rightstop = NULL; 6320 6321 if (*input_line_pointer == '<') 6322 { 6323 /* It's just a condition code. */ 6324 return parse_mri_condition (pcc); 6325 } 6326 6327 /* Look ahead for the condition code. */ 6328 for (s = input_line_pointer; *s != '\0'; ++s) 6329 { 6330 if (*s == '<' && s[1] != '\0' && s[2] != '\0' && s[3] == '>') 6331 break; 6332 } 6333 if (*s == '\0') 6334 { 6335 as_bad (_("missing condition code in structured control directive")); 6336 return 0; 6337 } 6338 6339 *leftstart = input_line_pointer; 6340 *leftstop = s; 6341 if (*leftstop > *leftstart 6342 && ((*leftstop)[-1] == ' ' || (*leftstop)[-1] == '\t')) 6343 --*leftstop; 6344 6345 input_line_pointer = s; 6346 if (! parse_mri_condition (pcc)) 6347 return 0; 6348 6349 /* Look ahead for AND or OR or end of line. */ 6350 for (s = input_line_pointer; *s != '\0'; ++s) 6351 { 6352 /* We must make sure we don't misinterpret AND/OR at the end of labels! 6353 if d0 <eq> #FOOAND and d1 <ne> #BAROR then 6354 ^^^ ^^ */ 6355 if ((s == input_line_pointer 6356 || *(s-1) == ' ' 6357 || *(s-1) == '\t') 6358 && ((strncasecmp (s, "AND", 3) == 0 6359 && (s[3] == '.' || ! is_part_of_name (s[3]))) 6360 || (strncasecmp (s, "OR", 2) == 0 6361 && (s[2] == '.' || ! is_part_of_name (s[2]))))) 6362 break; 6363 } 6364 6365 *rightstart = input_line_pointer; 6366 *rightstop = s; 6367 if (*rightstop > *rightstart 6368 && ((*rightstop)[-1] == ' ' || (*rightstop)[-1] == '\t')) 6369 --*rightstop; 6370 6371 input_line_pointer = s; 6372 6373 return 1; 6374 } 6375 6376 #define MCC(b1, b2) (((b1) << 8) | (b2)) 6377 6378 /* Swap the sense of a condition. This changes the condition so that 6379 it generates the same result when the operands are swapped. */ 6380 6381 static int 6382 swap_mri_condition (int cc) 6383 { 6384 switch (cc) 6385 { 6386 case MCC ('h', 'i'): return MCC ('c', 's'); 6387 case MCC ('l', 's'): return MCC ('c', 'c'); 6388 /* <HS> is an alias for <CC>. */ 6389 case MCC ('h', 's'): 6390 case MCC ('c', 'c'): return MCC ('l', 's'); 6391 /* <LO> is an alias for <CS>. */ 6392 case MCC ('l', 'o'): 6393 case MCC ('c', 's'): return MCC ('h', 'i'); 6394 case MCC ('p', 'l'): return MCC ('m', 'i'); 6395 case MCC ('m', 'i'): return MCC ('p', 'l'); 6396 case MCC ('g', 'e'): return MCC ('l', 'e'); 6397 case MCC ('l', 't'): return MCC ('g', 't'); 6398 case MCC ('g', 't'): return MCC ('l', 't'); 6399 case MCC ('l', 'e'): return MCC ('g', 'e'); 6400 /* Issue a warning for conditions we can not swap. */ 6401 case MCC ('n', 'e'): return MCC ('n', 'e'); /* no problem here */ 6402 case MCC ('e', 'q'): return MCC ('e', 'q'); /* also no problem */ 6403 case MCC ('v', 'c'): 6404 case MCC ('v', 's'): 6405 default : 6406 as_warn (_("Condition <%c%c> in structured control directive can not be encoded correctly"), 6407 (char) (cc >> 8), (char) (cc)); 6408 break; 6409 } 6410 return cc; 6411 } 6412 6413 /* Reverse the sense of a condition. */ 6414 6415 static int 6416 reverse_mri_condition (int cc) 6417 { 6418 switch (cc) 6419 { 6420 case MCC ('h', 'i'): return MCC ('l', 's'); 6421 case MCC ('l', 's'): return MCC ('h', 'i'); 6422 /* <HS> is an alias for <CC> */ 6423 case MCC ('h', 's'): return MCC ('l', 'o'); 6424 case MCC ('c', 'c'): return MCC ('c', 's'); 6425 /* <LO> is an alias for <CS> */ 6426 case MCC ('l', 'o'): return MCC ('h', 's'); 6427 case MCC ('c', 's'): return MCC ('c', 'c'); 6428 case MCC ('n', 'e'): return MCC ('e', 'q'); 6429 case MCC ('e', 'q'): return MCC ('n', 'e'); 6430 case MCC ('v', 'c'): return MCC ('v', 's'); 6431 case MCC ('v', 's'): return MCC ('v', 'c'); 6432 case MCC ('p', 'l'): return MCC ('m', 'i'); 6433 case MCC ('m', 'i'): return MCC ('p', 'l'); 6434 case MCC ('g', 'e'): return MCC ('l', 't'); 6435 case MCC ('l', 't'): return MCC ('g', 'e'); 6436 case MCC ('g', 't'): return MCC ('l', 'e'); 6437 case MCC ('l', 'e'): return MCC ('g', 't'); 6438 } 6439 return cc; 6440 } 6441 6442 /* Build an MRI structured control expression. This generates test 6443 and branch instructions. It goes to TRUELAB if the condition is 6444 true, and to FALSELAB if the condition is false. Exactly one of 6445 TRUELAB and FALSELAB will be NULL, meaning to fall through. QUAL 6446 is the size qualifier for the expression. EXTENT is the size to 6447 use for the branch. */ 6448 6449 static void 6450 build_mri_control_operand (int qual, int cc, char *leftstart, char *leftstop, 6451 char *rightstart, char *rightstop, 6452 const char *truelab, const char *falselab, 6453 int extent) 6454 { 6455 char *buf; 6456 char *s; 6457 6458 if (leftstart != NULL) 6459 { 6460 struct m68k_op leftop, rightop; 6461 char c; 6462 6463 /* Swap the compare operands, if necessary, to produce a legal 6464 m68k compare instruction. Comparing a register operand with 6465 a non-register operand requires the register to be on the 6466 right (cmp, cmpa). Comparing an immediate value with 6467 anything requires the immediate value to be on the left 6468 (cmpi). */ 6469 6470 c = *leftstop; 6471 *leftstop = '\0'; 6472 (void) m68k_ip_op (leftstart, &leftop); 6473 *leftstop = c; 6474 6475 c = *rightstop; 6476 *rightstop = '\0'; 6477 (void) m68k_ip_op (rightstart, &rightop); 6478 *rightstop = c; 6479 6480 if (rightop.mode == IMMED 6481 || ((leftop.mode == DREG || leftop.mode == AREG) 6482 && (rightop.mode != DREG && rightop.mode != AREG))) 6483 { 6484 char *temp; 6485 6486 /* Correct conditional handling: 6487 if #1 <lt> d0 then ;means if (1 < d0) 6488 ... 6489 endi 6490 6491 should assemble to: 6492 6493 cmp #1,d0 if we do *not* swap the operands 6494 bgt true we need the swapped condition! 6495 ble false 6496 true: 6497 ... 6498 false: 6499 */ 6500 temp = leftstart; 6501 leftstart = rightstart; 6502 rightstart = temp; 6503 temp = leftstop; 6504 leftstop = rightstop; 6505 rightstop = temp; 6506 } 6507 else 6508 { 6509 cc = swap_mri_condition (cc); 6510 } 6511 } 6512 6513 if (truelab == NULL) 6514 { 6515 cc = reverse_mri_condition (cc); 6516 truelab = falselab; 6517 } 6518 6519 if (leftstart != NULL) 6520 { 6521 buf = XNEWVEC (char, (20 6522 + (leftstop - leftstart) 6523 + (rightstop - rightstart))); 6524 s = buf; 6525 *s++ = 'c'; 6526 *s++ = 'm'; 6527 *s++ = 'p'; 6528 if (qual != '\0') 6529 *s++ = TOLOWER (qual); 6530 *s++ = ' '; 6531 memcpy (s, leftstart, leftstop - leftstart); 6532 s += leftstop - leftstart; 6533 *s++ = ','; 6534 memcpy (s, rightstart, rightstop - rightstart); 6535 s += rightstop - rightstart; 6536 *s = '\0'; 6537 mri_assemble (buf); 6538 free (buf); 6539 } 6540 6541 buf = XNEWVEC (char, 20 + strlen (truelab)); 6542 s = buf; 6543 *s++ = 'b'; 6544 *s++ = cc >> 8; 6545 *s++ = cc & 0xff; 6546 if (extent != '\0') 6547 *s++ = TOLOWER (extent); 6548 *s++ = ' '; 6549 strcpy (s, truelab); 6550 mri_assemble (buf); 6551 free (buf); 6552 } 6553 6554 /* Parse an MRI structured control expression. This generates test 6555 and branch instructions. STOP is where the expression ends. It 6556 goes to TRUELAB if the condition is true, and to FALSELAB if the 6557 condition is false. Exactly one of TRUELAB and FALSELAB will be 6558 NULL, meaning to fall through. QUAL is the size qualifier for the 6559 expression. EXTENT is the size to use for the branch. */ 6560 6561 static void 6562 parse_mri_control_expression (char *stop, int qual, const char *truelab, 6563 const char *falselab, int extent) 6564 { 6565 int c; 6566 int cc; 6567 char *leftstart; 6568 char *leftstop; 6569 char *rightstart; 6570 char *rightstop; 6571 6572 c = *stop; 6573 *stop = '\0'; 6574 6575 if (! parse_mri_control_operand (&cc, &leftstart, &leftstop, 6576 &rightstart, &rightstop)) 6577 { 6578 *stop = c; 6579 return; 6580 } 6581 6582 if (strncasecmp (input_line_pointer, "AND", 3) == 0) 6583 { 6584 const char *flab; 6585 6586 if (falselab != NULL) 6587 flab = falselab; 6588 else 6589 flab = mri_control_label (); 6590 6591 build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart, 6592 rightstop, (const char *) NULL, flab, extent); 6593 6594 input_line_pointer += 3; 6595 if (*input_line_pointer != '.' 6596 || input_line_pointer[1] == '\0') 6597 qual = '\0'; 6598 else 6599 { 6600 qual = input_line_pointer[1]; 6601 input_line_pointer += 2; 6602 } 6603 6604 if (! parse_mri_control_operand (&cc, &leftstart, &leftstop, 6605 &rightstart, &rightstop)) 6606 { 6607 *stop = c; 6608 return; 6609 } 6610 6611 build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart, 6612 rightstop, truelab, falselab, extent); 6613 6614 if (falselab == NULL) 6615 colon (flab); 6616 } 6617 else if (strncasecmp (input_line_pointer, "OR", 2) == 0) 6618 { 6619 const char *tlab; 6620 6621 if (truelab != NULL) 6622 tlab = truelab; 6623 else 6624 tlab = mri_control_label (); 6625 6626 build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart, 6627 rightstop, tlab, (const char *) NULL, extent); 6628 6629 input_line_pointer += 2; 6630 if (*input_line_pointer != '.' 6631 || input_line_pointer[1] == '\0') 6632 qual = '\0'; 6633 else 6634 { 6635 qual = input_line_pointer[1]; 6636 input_line_pointer += 2; 6637 } 6638 6639 if (! parse_mri_control_operand (&cc, &leftstart, &leftstop, 6640 &rightstart, &rightstop)) 6641 { 6642 *stop = c; 6643 return; 6644 } 6645 6646 build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart, 6647 rightstop, truelab, falselab, extent); 6648 6649 if (truelab == NULL) 6650 colon (tlab); 6651 } 6652 else 6653 { 6654 build_mri_control_operand (qual, cc, leftstart, leftstop, rightstart, 6655 rightstop, truelab, falselab, extent); 6656 } 6657 6658 *stop = c; 6659 if (input_line_pointer != stop) 6660 as_bad (_("syntax error in structured control directive")); 6661 } 6662 6663 /* Handle the MRI IF pseudo-op. This may be a structured control 6664 directive, or it may be a regular assembler conditional, depending 6665 on its operands. */ 6666 6667 static void 6668 s_mri_if (int qual) 6669 { 6670 char *s; 6671 int c; 6672 struct mri_control_info *n; 6673 6674 /* A structured control directive must end with THEN with an 6675 optional qualifier. */ 6676 s = input_line_pointer; 6677 /* We only accept '*' as introduction of comments if preceded by white space 6678 or at first column of a line (I think this can't actually happen here?) 6679 This is important when assembling: 6680 if d0 <ne> 12(a0,d0*2) then 6681 if d0 <ne> #CONST*20 then. */ 6682 while (! (is_end_of_line[(unsigned char) *s] 6683 || (flag_mri 6684 && *s == '*' 6685 && (s == input_line_pointer 6686 || *(s-1) == ' ' 6687 || *(s-1) == '\t')))) 6688 ++s; 6689 --s; 6690 while (s > input_line_pointer && (*s == ' ' || *s == '\t')) 6691 --s; 6692 6693 if (s - input_line_pointer > 1 6694 && s[-1] == '.') 6695 s -= 2; 6696 6697 if (s - input_line_pointer < 3 6698 || strncasecmp (s - 3, "THEN", 4) != 0) 6699 { 6700 if (qual != '\0') 6701 { 6702 as_bad (_("missing then")); 6703 ignore_rest_of_line (); 6704 return; 6705 } 6706 6707 /* It's a conditional. */ 6708 s_if (O_ne); 6709 return; 6710 } 6711 6712 /* Since this might be a conditional if, this pseudo-op will be 6713 called even if we are supported to be ignoring input. Double 6714 check now. Clobber *input_line_pointer so that ignore_input 6715 thinks that this is not a special pseudo-op. */ 6716 c = *input_line_pointer; 6717 *input_line_pointer = 0; 6718 if (ignore_input ()) 6719 { 6720 *input_line_pointer = c; 6721 while (! is_end_of_line[(unsigned char) *input_line_pointer]) 6722 ++input_line_pointer; 6723 demand_empty_rest_of_line (); 6724 return; 6725 } 6726 *input_line_pointer = c; 6727 6728 n = push_mri_control (mri_if); 6729 6730 parse_mri_control_expression (s - 3, qual, (const char *) NULL, 6731 n->next, s[1] == '.' ? s[2] : '\0'); 6732 6733 if (s[1] == '.') 6734 input_line_pointer = s + 3; 6735 else 6736 input_line_pointer = s + 1; 6737 6738 if (flag_mri) 6739 { 6740 while (! is_end_of_line[(unsigned char) *input_line_pointer]) 6741 ++input_line_pointer; 6742 } 6743 6744 demand_empty_rest_of_line (); 6745 } 6746 6747 /* Handle the MRI else pseudo-op. If we are currently doing an MRI 6748 structured IF, associate the ELSE with the IF. Otherwise, assume 6749 it is a conditional else. */ 6750 6751 static void 6752 s_mri_else (int qual) 6753 { 6754 int c; 6755 char *buf; 6756 char q[2]; 6757 6758 if (qual == '\0' 6759 && (mri_control_stack == NULL 6760 || mri_control_stack->type != mri_if 6761 || mri_control_stack->else_seen)) 6762 { 6763 s_else (0); 6764 return; 6765 } 6766 6767 c = *input_line_pointer; 6768 *input_line_pointer = 0; 6769 if (ignore_input ()) 6770 { 6771 *input_line_pointer = c; 6772 while (! is_end_of_line[(unsigned char) *input_line_pointer]) 6773 ++input_line_pointer; 6774 demand_empty_rest_of_line (); 6775 return; 6776 } 6777 *input_line_pointer = c; 6778 6779 if (mri_control_stack == NULL 6780 || mri_control_stack->type != mri_if 6781 || mri_control_stack->else_seen) 6782 { 6783 as_bad (_("else without matching if")); 6784 ignore_rest_of_line (); 6785 return; 6786 } 6787 6788 mri_control_stack->else_seen = 1; 6789 6790 buf = XNEWVEC (char, 20 + strlen (mri_control_stack->bottom)); 6791 q[0] = TOLOWER (qual); 6792 q[1] = '\0'; 6793 sprintf (buf, "bra%s %s", q, mri_control_stack->bottom); 6794 mri_assemble (buf); 6795 free (buf); 6796 6797 colon (mri_control_stack->next); 6798 6799 if (flag_mri) 6800 { 6801 while (! is_end_of_line[(unsigned char) *input_line_pointer]) 6802 ++input_line_pointer; 6803 } 6804 6805 demand_empty_rest_of_line (); 6806 } 6807 6808 /* Handle the MRI ENDI pseudo-op. */ 6809 6810 static void 6811 s_mri_endi (int ignore ATTRIBUTE_UNUSED) 6812 { 6813 if (mri_control_stack == NULL 6814 || mri_control_stack->type != mri_if) 6815 { 6816 as_bad (_("endi without matching if")); 6817 ignore_rest_of_line (); 6818 return; 6819 } 6820 6821 /* ignore_input will not return true for ENDI, so we don't need to 6822 worry about checking it again here. */ 6823 6824 if (! mri_control_stack->else_seen) 6825 colon (mri_control_stack->next); 6826 colon (mri_control_stack->bottom); 6827 6828 pop_mri_control (); 6829 6830 if (flag_mri) 6831 { 6832 while (! is_end_of_line[(unsigned char) *input_line_pointer]) 6833 ++input_line_pointer; 6834 } 6835 6836 demand_empty_rest_of_line (); 6837 } 6838 6839 /* Handle the MRI BREAK pseudo-op. */ 6840 6841 static void 6842 s_mri_break (int extent) 6843 { 6844 struct mri_control_info *n; 6845 char *buf; 6846 char ex[2]; 6847 6848 n = mri_control_stack; 6849 while (n != NULL 6850 && n->type != mri_for 6851 && n->type != mri_repeat 6852 && n->type != mri_while) 6853 n = n->outer; 6854 if (n == NULL) 6855 { 6856 as_bad (_("break outside of structured loop")); 6857 ignore_rest_of_line (); 6858 return; 6859 } 6860 6861 buf = XNEWVEC (char, 20 + strlen (n->bottom)); 6862 ex[0] = TOLOWER (extent); 6863 ex[1] = '\0'; 6864 sprintf (buf, "bra%s %s", ex, n->bottom); 6865 mri_assemble (buf); 6866 free (buf); 6867 6868 if (flag_mri) 6869 { 6870 while (! is_end_of_line[(unsigned char) *input_line_pointer]) 6871 ++input_line_pointer; 6872 } 6873 6874 demand_empty_rest_of_line (); 6875 } 6876 6877 /* Handle the MRI NEXT pseudo-op. */ 6878 6879 static void 6880 s_mri_next (int extent) 6881 { 6882 struct mri_control_info *n; 6883 char *buf; 6884 char ex[2]; 6885 6886 n = mri_control_stack; 6887 while (n != NULL 6888 && n->type != mri_for 6889 && n->type != mri_repeat 6890 && n->type != mri_while) 6891 n = n->outer; 6892 if (n == NULL) 6893 { 6894 as_bad (_("next outside of structured loop")); 6895 ignore_rest_of_line (); 6896 return; 6897 } 6898 6899 buf = XNEWVEC (char, 20 + strlen (n->next)); 6900 ex[0] = TOLOWER (extent); 6901 ex[1] = '\0'; 6902 sprintf (buf, "bra%s %s", ex, n->next); 6903 mri_assemble (buf); 6904 free (buf); 6905 6906 if (flag_mri) 6907 { 6908 while (! is_end_of_line[(unsigned char) *input_line_pointer]) 6909 ++input_line_pointer; 6910 } 6911 6912 demand_empty_rest_of_line (); 6913 } 6914 6915 /* Handle the MRI FOR pseudo-op. */ 6916 6917 static void 6918 s_mri_for (int qual) 6919 { 6920 const char *varstart, *varstop; 6921 const char *initstart, *initstop; 6922 const char *endstart, *endstop; 6923 const char *bystart, *bystop; 6924 int up; 6925 int by; 6926 int extent; 6927 struct mri_control_info *n; 6928 char *buf; 6929 char *s; 6930 char ex[2]; 6931 6932 /* The syntax is 6933 FOR.q var = init { TO | DOWNTO } end [ BY by ] DO.e 6934 */ 6935 6936 SKIP_WHITESPACE (); 6937 varstart = input_line_pointer; 6938 6939 /* Look for the '='. */ 6940 while (! is_end_of_line[(unsigned char) *input_line_pointer] 6941 && *input_line_pointer != '=') 6942 ++input_line_pointer; 6943 if (*input_line_pointer != '=') 6944 { 6945 as_bad (_("missing =")); 6946 ignore_rest_of_line (); 6947 return; 6948 } 6949 6950 varstop = input_line_pointer; 6951 if (varstop > varstart 6952 && (varstop[-1] == ' ' || varstop[-1] == '\t')) 6953 --varstop; 6954 6955 ++input_line_pointer; 6956 6957 initstart = input_line_pointer; 6958 6959 /* Look for TO or DOWNTO. */ 6960 up = 1; 6961 initstop = NULL; 6962 while (! is_end_of_line[(unsigned char) *input_line_pointer]) 6963 { 6964 if (strncasecmp (input_line_pointer, "TO", 2) == 0 6965 && ! is_part_of_name (input_line_pointer[2])) 6966 { 6967 initstop = input_line_pointer; 6968 input_line_pointer += 2; 6969 break; 6970 } 6971 if (strncasecmp (input_line_pointer, "DOWNTO", 6) == 0 6972 && ! is_part_of_name (input_line_pointer[6])) 6973 { 6974 initstop = input_line_pointer; 6975 up = 0; 6976 input_line_pointer += 6; 6977 break; 6978 } 6979 ++input_line_pointer; 6980 } 6981 if (initstop == NULL) 6982 { 6983 as_bad (_("missing to or downto")); 6984 ignore_rest_of_line (); 6985 return; 6986 } 6987 if (initstop > initstart 6988 && (initstop[-1] == ' ' || initstop[-1] == '\t')) 6989 --initstop; 6990 6991 SKIP_WHITESPACE (); 6992 endstart = input_line_pointer; 6993 6994 /* Look for BY or DO. */ 6995 by = 0; 6996 endstop = NULL; 6997 while (! is_end_of_line[(unsigned char) *input_line_pointer]) 6998 { 6999 if (strncasecmp (input_line_pointer, "BY", 2) == 0 7000 && ! is_part_of_name (input_line_pointer[2])) 7001 { 7002 endstop = input_line_pointer; 7003 by = 1; 7004 input_line_pointer += 2; 7005 break; 7006 } 7007 if (strncasecmp (input_line_pointer, "DO", 2) == 0 7008 && (input_line_pointer[2] == '.' 7009 || ! is_part_of_name (input_line_pointer[2]))) 7010 { 7011 endstop = input_line_pointer; 7012 input_line_pointer += 2; 7013 break; 7014 } 7015 ++input_line_pointer; 7016 } 7017 if (endstop == NULL) 7018 { 7019 as_bad (_("missing do")); 7020 ignore_rest_of_line (); 7021 return; 7022 } 7023 if (endstop > endstart 7024 && (endstop[-1] == ' ' || endstop[-1] == '\t')) 7025 --endstop; 7026 7027 if (! by) 7028 { 7029 bystart = "#1"; 7030 bystop = bystart + 2; 7031 } 7032 else 7033 { 7034 SKIP_WHITESPACE (); 7035 bystart = input_line_pointer; 7036 7037 /* Look for DO. */ 7038 bystop = NULL; 7039 while (! is_end_of_line[(unsigned char) *input_line_pointer]) 7040 { 7041 if (strncasecmp (input_line_pointer, "DO", 2) == 0 7042 && (input_line_pointer[2] == '.' 7043 || ! is_part_of_name (input_line_pointer[2]))) 7044 { 7045 bystop = input_line_pointer; 7046 input_line_pointer += 2; 7047 break; 7048 } 7049 ++input_line_pointer; 7050 } 7051 if (bystop == NULL) 7052 { 7053 as_bad (_("missing do")); 7054 ignore_rest_of_line (); 7055 return; 7056 } 7057 if (bystop > bystart 7058 && (bystop[-1] == ' ' || bystop[-1] == '\t')) 7059 --bystop; 7060 } 7061 7062 if (*input_line_pointer != '.') 7063 extent = '\0'; 7064 else 7065 { 7066 extent = input_line_pointer[1]; 7067 input_line_pointer += 2; 7068 } 7069 7070 /* We have fully parsed the FOR operands. Now build the loop. */ 7071 n = push_mri_control (mri_for); 7072 7073 buf = XNEWVEC (char, 50 + (input_line_pointer - varstart)); 7074 7075 /* Move init,var. */ 7076 s = buf; 7077 *s++ = 'm'; 7078 *s++ = 'o'; 7079 *s++ = 'v'; 7080 *s++ = 'e'; 7081 if (qual != '\0') 7082 *s++ = TOLOWER (qual); 7083 *s++ = ' '; 7084 memcpy (s, initstart, initstop - initstart); 7085 s += initstop - initstart; 7086 *s++ = ','; 7087 memcpy (s, varstart, varstop - varstart); 7088 s += varstop - varstart; 7089 *s = '\0'; 7090 mri_assemble (buf); 7091 7092 colon (n->top); 7093 7094 /* cmp end,var. */ 7095 s = buf; 7096 *s++ = 'c'; 7097 *s++ = 'm'; 7098 *s++ = 'p'; 7099 if (qual != '\0') 7100 *s++ = TOLOWER (qual); 7101 *s++ = ' '; 7102 memcpy (s, endstart, endstop - endstart); 7103 s += endstop - endstart; 7104 *s++ = ','; 7105 memcpy (s, varstart, varstop - varstart); 7106 s += varstop - varstart; 7107 *s = '\0'; 7108 mri_assemble (buf); 7109 7110 /* bcc bottom. */ 7111 ex[0] = TOLOWER (extent); 7112 ex[1] = '\0'; 7113 if (up) 7114 sprintf (buf, "blt%s %s", ex, n->bottom); 7115 else 7116 sprintf (buf, "bgt%s %s", ex, n->bottom); 7117 mri_assemble (buf); 7118 7119 /* Put together the add or sub instruction used by ENDF. */ 7120 s = buf; 7121 if (up) 7122 strcpy (s, "add"); 7123 else 7124 strcpy (s, "sub"); 7125 s += 3; 7126 if (qual != '\0') 7127 *s++ = TOLOWER (qual); 7128 *s++ = ' '; 7129 memcpy (s, bystart, bystop - bystart); 7130 s += bystop - bystart; 7131 *s++ = ','; 7132 memcpy (s, varstart, varstop - varstart); 7133 s += varstop - varstart; 7134 *s = '\0'; 7135 n->incr = buf; 7136 7137 if (flag_mri) 7138 { 7139 while (! is_end_of_line[(unsigned char) *input_line_pointer]) 7140 ++input_line_pointer; 7141 } 7142 7143 demand_empty_rest_of_line (); 7144 } 7145 7146 /* Handle the MRI ENDF pseudo-op. */ 7147 7148 static void 7149 s_mri_endf (int ignore ATTRIBUTE_UNUSED) 7150 { 7151 if (mri_control_stack == NULL 7152 || mri_control_stack->type != mri_for) 7153 { 7154 as_bad (_("endf without for")); 7155 ignore_rest_of_line (); 7156 return; 7157 } 7158 7159 colon (mri_control_stack->next); 7160 7161 mri_assemble (mri_control_stack->incr); 7162 7163 sprintf (mri_control_stack->incr, "bra %s", mri_control_stack->top); 7164 mri_assemble (mri_control_stack->incr); 7165 7166 free (mri_control_stack->incr); 7167 7168 colon (mri_control_stack->bottom); 7169 7170 pop_mri_control (); 7171 7172 if (flag_mri) 7173 { 7174 while (! is_end_of_line[(unsigned char) *input_line_pointer]) 7175 ++input_line_pointer; 7176 } 7177 7178 demand_empty_rest_of_line (); 7179 } 7180 7181 /* Handle the MRI REPEAT pseudo-op. */ 7182 7183 static void 7184 s_mri_repeat (int ignore ATTRIBUTE_UNUSED) 7185 { 7186 struct mri_control_info *n; 7187 7188 n = push_mri_control (mri_repeat); 7189 colon (n->top); 7190 if (flag_mri) 7191 { 7192 while (! is_end_of_line[(unsigned char) *input_line_pointer]) 7193 ++input_line_pointer; 7194 } 7195 demand_empty_rest_of_line (); 7196 } 7197 7198 /* Handle the MRI UNTIL pseudo-op. */ 7199 7200 static void 7201 s_mri_until (int qual) 7202 { 7203 char *s; 7204 7205 if (mri_control_stack == NULL 7206 || mri_control_stack->type != mri_repeat) 7207 { 7208 as_bad (_("until without repeat")); 7209 ignore_rest_of_line (); 7210 return; 7211 } 7212 7213 colon (mri_control_stack->next); 7214 7215 for (s = input_line_pointer; ! is_end_of_line[(unsigned char) *s]; s++) 7216 ; 7217 7218 parse_mri_control_expression (s, qual, (const char *) NULL, 7219 mri_control_stack->top, '\0'); 7220 7221 colon (mri_control_stack->bottom); 7222 7223 input_line_pointer = s; 7224 7225 pop_mri_control (); 7226 7227 if (flag_mri) 7228 { 7229 while (! is_end_of_line[(unsigned char) *input_line_pointer]) 7230 ++input_line_pointer; 7231 } 7232 7233 demand_empty_rest_of_line (); 7234 } 7235 7236 /* Handle the MRI WHILE pseudo-op. */ 7237 7238 static void 7239 s_mri_while (int qual) 7240 { 7241 char *s; 7242 7243 struct mri_control_info *n; 7244 7245 s = input_line_pointer; 7246 /* We only accept '*' as introduction of comments if preceded by white space 7247 or at first column of a line (I think this can't actually happen here?) 7248 This is important when assembling: 7249 while d0 <ne> 12(a0,d0*2) do 7250 while d0 <ne> #CONST*20 do. */ 7251 while (! (is_end_of_line[(unsigned char) *s] 7252 || (flag_mri 7253 && *s == '*' 7254 && (s == input_line_pointer 7255 || *(s-1) == ' ' 7256 || *(s-1) == '\t')))) 7257 s++; 7258 --s; 7259 while (*s == ' ' || *s == '\t') 7260 --s; 7261 if (s - input_line_pointer > 1 7262 && s[-1] == '.') 7263 s -= 2; 7264 if (s - input_line_pointer < 2 7265 || strncasecmp (s - 1, "DO", 2) != 0) 7266 { 7267 as_bad (_("missing do")); 7268 ignore_rest_of_line (); 7269 return; 7270 } 7271 7272 n = push_mri_control (mri_while); 7273 7274 colon (n->next); 7275 7276 parse_mri_control_expression (s - 1, qual, (const char *) NULL, n->bottom, 7277 s[1] == '.' ? s[2] : '\0'); 7278 7279 input_line_pointer = s + 1; 7280 if (*input_line_pointer == '.') 7281 input_line_pointer += 2; 7282 7283 if (flag_mri) 7284 { 7285 while (! is_end_of_line[(unsigned char) *input_line_pointer]) 7286 ++input_line_pointer; 7287 } 7288 7289 demand_empty_rest_of_line (); 7290 } 7291 7292 /* Handle the MRI ENDW pseudo-op. */ 7293 7294 static void 7295 s_mri_endw (int ignore ATTRIBUTE_UNUSED) 7296 { 7297 char *buf; 7298 7299 if (mri_control_stack == NULL 7300 || mri_control_stack->type != mri_while) 7301 { 7302 as_bad (_("endw without while")); 7303 ignore_rest_of_line (); 7304 return; 7305 } 7306 7307 buf = XNEWVEC (char, 20 + strlen (mri_control_stack->next)); 7308 sprintf (buf, "bra %s", mri_control_stack->next); 7309 mri_assemble (buf); 7310 free (buf); 7311 7312 colon (mri_control_stack->bottom); 7313 7314 pop_mri_control (); 7315 7316 if (flag_mri) 7317 { 7318 while (! is_end_of_line[(unsigned char) *input_line_pointer]) 7319 ++input_line_pointer; 7320 } 7321 7322 demand_empty_rest_of_line (); 7323 } 7324 7325 /* Parse a .cpu directive. */ 7327 7328 static void 7329 s_m68k_cpu (int ignored ATTRIBUTE_UNUSED) 7330 { 7331 char saved_char; 7332 char *name; 7333 7334 if (initialized) 7335 { 7336 as_bad (_("already assembled instructions")); 7337 ignore_rest_of_line (); 7338 return; 7339 } 7340 7341 name = input_line_pointer; 7342 while (*input_line_pointer && !ISSPACE(*input_line_pointer)) 7343 input_line_pointer++; 7344 saved_char = *input_line_pointer; 7345 *input_line_pointer = 0; 7346 7347 m68k_set_cpu (name, 1, 0); 7348 7349 *input_line_pointer = saved_char; 7350 demand_empty_rest_of_line (); 7351 return; 7352 } 7353 7354 /* Parse a .arch directive. */ 7355 7356 static void 7357 s_m68k_arch (int ignored ATTRIBUTE_UNUSED) 7358 { 7359 char saved_char; 7360 char *name; 7361 7362 if (initialized) 7363 { 7364 as_bad (_("already assembled instructions")); 7365 ignore_rest_of_line (); 7366 return; 7367 } 7368 7369 name = input_line_pointer; 7370 while (*input_line_pointer && *input_line_pointer != ',' 7371 && !ISSPACE (*input_line_pointer)) 7372 input_line_pointer++; 7373 saved_char = *input_line_pointer; 7374 *input_line_pointer = 0; 7375 7376 if (m68k_set_arch (name, 1, 0)) 7377 { 7378 /* Scan extensions. */ 7379 do 7380 { 7381 *input_line_pointer++ = saved_char; 7382 if (!*input_line_pointer || ISSPACE (*input_line_pointer)) 7383 break; 7384 name = input_line_pointer; 7385 while (*input_line_pointer && *input_line_pointer != ',' 7386 && !ISSPACE (*input_line_pointer)) 7387 input_line_pointer++; 7388 saved_char = *input_line_pointer; 7389 *input_line_pointer = 0; 7390 } 7391 while (m68k_set_extension (name, 1, 0)); 7392 } 7393 7394 *input_line_pointer = saved_char; 7395 demand_empty_rest_of_line (); 7396 return; 7397 } 7398 7399 /* Lookup a cpu name in TABLE and return the slot found. Return NULL 7401 if none is found, the caller is responsible for emitting an error 7402 message. If ALLOW_M is non-zero, we allow an initial 'm' on the 7403 cpu name, if it begins with a '6' (possibly skipping an intervening 7404 'c'. We also allow a 'c' in the same place. if NEGATED is 7405 non-zero, we accept a leading 'no-' and *NEGATED is set to true, if 7406 the option is indeed negated. */ 7407 7408 static const struct m68k_cpu * 7409 m68k_lookup_cpu (const char *arg, const struct m68k_cpu *table, 7410 int allow_m, int *negated) 7411 { 7412 /* allow negated value? */ 7413 if (negated) 7414 { 7415 *negated = 0; 7416 7417 if (arg[0] == 'n' && arg[1] == 'o' && arg[2] == '-') 7418 { 7419 arg += 3; 7420 *negated = 1; 7421 } 7422 } 7423 7424 /* Remove 'm' or 'mc' prefix from 68k variants. */ 7425 if (allow_m) 7426 { 7427 if (arg[0] == 'm') 7428 { 7429 if (arg[1] == '6') 7430 arg += 1; 7431 else if (arg[1] == 'c' && arg[2] == '6') 7432 arg += 2; 7433 } 7434 } 7435 else if (arg[0] == 'c' && arg[1] == '6') 7436 arg += 1; 7437 7438 for (; table->name; table++) 7439 if (!strcmp (arg, table->name)) 7440 { 7441 if (table->alias < -1 || table->alias > 1) 7442 as_bad (_("`%s' is deprecated, use `%s'"), 7443 table->name, table[table->alias < 0 ? 1 : -1].name); 7444 return table; 7445 } 7446 return 0; 7447 } 7448 7449 /* Set the cpu, issuing errors if it is unrecognized. */ 7450 7451 static int 7452 m68k_set_cpu (char const *name, int allow_m, int silent) 7453 { 7454 const struct m68k_cpu *cpu; 7455 7456 cpu = m68k_lookup_cpu (name, m68k_cpus, allow_m, NULL); 7457 7458 if (!cpu) 7459 { 7460 if (!silent) 7461 as_bad (_("cpu `%s' unrecognized"), name); 7462 return 0; 7463 } 7464 selected_cpu = cpu; 7465 return 1; 7466 } 7467 7468 /* Set the architecture, issuing errors if it is unrecognized. */ 7469 7470 static int 7471 m68k_set_arch (char const *name, int allow_m, int silent) 7472 { 7473 const struct m68k_cpu *arch; 7474 7475 arch = m68k_lookup_cpu (name, m68k_archs, allow_m, NULL); 7476 7477 if (!arch) 7478 { 7479 if (!silent) 7480 as_bad (_("architecture `%s' unrecognized"), name); 7481 return 0; 7482 } 7483 selected_arch = arch; 7484 return 1; 7485 } 7486 7487 /* Set the architecture extension, issuing errors if it is 7488 unrecognized, or invalid */ 7489 7490 static int 7491 m68k_set_extension (char const *name, int allow_m, int silent) 7492 { 7493 int negated; 7494 const struct m68k_cpu *ext; 7495 7496 ext = m68k_lookup_cpu (name, m68k_extensions, allow_m, &negated); 7497 7498 if (!ext) 7499 { 7500 if (!silent) 7501 as_bad (_("extension `%s' unrecognized"), name); 7502 return 0; 7503 } 7504 7505 if (negated) 7506 not_current_architecture |= (ext->control_regs 7507 ? *(unsigned *)ext->control_regs: ext->arch); 7508 else 7509 current_architecture |= ext->arch; 7510 return 1; 7511 } 7512 7513 /* md_parse_option 7514 Invocation line includes a switch not recognized by the base assembler. 7515 */ 7516 7517 #ifdef OBJ_ELF 7518 const char *md_shortopts = "lSA:m:kQ:V"; 7519 #else 7520 const char *md_shortopts = "lSA:m:k"; 7521 #endif 7522 7523 struct option md_longopts[] = { 7524 #define OPTION_PIC (OPTION_MD_BASE) 7525 {"pic", no_argument, NULL, OPTION_PIC}, 7526 #define OPTION_REGISTER_PREFIX_OPTIONAL (OPTION_MD_BASE + 1) 7527 {"register-prefix-optional", no_argument, NULL, 7528 OPTION_REGISTER_PREFIX_OPTIONAL}, 7529 #define OPTION_BITWISE_OR (OPTION_MD_BASE + 2) 7530 {"bitwise-or", no_argument, NULL, OPTION_BITWISE_OR}, 7531 #define OPTION_BASE_SIZE_DEFAULT_16 (OPTION_MD_BASE + 3) 7532 {"base-size-default-16", no_argument, NULL, OPTION_BASE_SIZE_DEFAULT_16}, 7533 #define OPTION_BASE_SIZE_DEFAULT_32 (OPTION_MD_BASE + 4) 7534 {"base-size-default-32", no_argument, NULL, OPTION_BASE_SIZE_DEFAULT_32}, 7535 #define OPTION_DISP_SIZE_DEFAULT_16 (OPTION_MD_BASE + 5) 7536 {"disp-size-default-16", no_argument, NULL, OPTION_DISP_SIZE_DEFAULT_16}, 7537 #define OPTION_DISP_SIZE_DEFAULT_32 (OPTION_MD_BASE + 6) 7538 {"disp-size-default-32", no_argument, NULL, OPTION_DISP_SIZE_DEFAULT_32}, 7539 #define OPTION_PCREL (OPTION_MD_BASE + 7) 7540 {"pcrel", no_argument, NULL, OPTION_PCREL}, 7541 {NULL, no_argument, NULL, 0} 7542 }; 7543 size_t md_longopts_size = sizeof (md_longopts); 7544 7545 int 7546 md_parse_option (int c, const char *arg) 7547 { 7548 switch (c) 7549 { 7550 case 'l': /* -l means keep external to 2 bit offset 7551 rather than 16 bit one. */ 7552 flag_short_refs = 1; 7553 break; 7554 7555 case 'S': /* -S means that jbsr's always turn into 7556 jsr's. */ 7557 flag_long_jumps = 1; 7558 break; 7559 7560 case OPTION_PCREL: /* --pcrel means never turn PC-relative 7561 branches into absolute jumps. */ 7562 flag_keep_pcrel = 1; 7563 break; 7564 7565 case OPTION_PIC: 7566 case 'k': 7567 flag_want_pic = 1; 7568 break; /* -pic, Position Independent Code. */ 7569 7570 case OPTION_REGISTER_PREFIX_OPTIONAL: 7571 flag_reg_prefix_optional = 1; 7572 reg_prefix_optional_seen = 1; 7573 break; 7574 7575 /* -V: SVR4 argument to print version ID. */ 7576 case 'V': 7577 print_version_id (); 7578 break; 7579 7580 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section 7581 should be emitted or not. FIXME: Not implemented. */ 7582 case 'Q': 7583 break; 7584 7585 case OPTION_BITWISE_OR: 7586 { 7587 char *n, *t; 7588 const char *s; 7589 7590 n = XNEWVEC (char, strlen (m68k_comment_chars) + 1); 7591 t = n; 7592 for (s = m68k_comment_chars; *s != '\0'; s++) 7593 if (*s != '|') 7594 *t++ = *s; 7595 *t = '\0'; 7596 m68k_comment_chars = n; 7597 } 7598 break; 7599 7600 case OPTION_BASE_SIZE_DEFAULT_16: 7601 m68k_index_width_default = SIZE_WORD; 7602 break; 7603 7604 case OPTION_BASE_SIZE_DEFAULT_32: 7605 m68k_index_width_default = SIZE_LONG; 7606 break; 7607 7608 case OPTION_DISP_SIZE_DEFAULT_16: 7609 m68k_rel32 = 0; 7610 m68k_rel32_from_cmdline = 1; 7611 break; 7612 7613 case OPTION_DISP_SIZE_DEFAULT_32: 7614 m68k_rel32 = 1; 7615 m68k_rel32_from_cmdline = 1; 7616 break; 7617 7618 case 'A': 7619 #if WARN_DEPRECATED 7620 as_tsktsk (_ ("option `-A%s' is deprecated: use `-%s'", 7621 arg, arg)); 7622 #endif 7623 /* Intentional fall-through. */ 7624 case 'm': 7625 if (!strncmp (arg, "arch=", 5)) 7626 m68k_set_arch (arg + 5, 1, 0); 7627 else if (!strncmp (arg, "cpu=", 4)) 7628 m68k_set_cpu (arg + 4, 1, 0); 7629 else if (m68k_set_extension (arg, 0, 1)) 7630 ; 7631 else if (m68k_set_arch (arg, 0, 1)) 7632 ; 7633 else if (m68k_set_cpu (arg, 0, 1)) 7634 ; 7635 else 7636 return 0; 7637 break; 7638 7639 default: 7640 return 0; 7641 } 7642 7643 return 1; 7644 } 7645 7646 /* Setup tables from the selected arch and/or cpu */ 7647 7648 static void 7649 m68k_init_arch (void) 7650 { 7651 if (not_current_architecture & current_architecture) 7652 { 7653 as_bad (_("architecture features both enabled and disabled")); 7654 not_current_architecture &= ~current_architecture; 7655 } 7656 if (selected_arch) 7657 { 7658 current_architecture |= selected_arch->arch; 7659 control_regs = selected_arch->control_regs; 7660 } 7661 else 7662 current_architecture |= selected_cpu->arch; 7663 7664 current_architecture &= ~not_current_architecture; 7665 7666 if ((current_architecture & (cfloat | m68881)) == (cfloat | m68881)) 7667 { 7668 /* Determine which float is really meant. */ 7669 if (current_architecture & (m68k_mask & ~m68881)) 7670 current_architecture ^= cfloat; 7671 else 7672 current_architecture ^= m68881; 7673 } 7674 7675 if (selected_cpu) 7676 { 7677 control_regs = selected_cpu->control_regs; 7678 if (current_architecture & ~selected_cpu->arch) 7679 { 7680 as_bad (_("selected processor does not have all features of selected architecture")); 7681 current_architecture 7682 = selected_cpu->arch & ~not_current_architecture; 7683 } 7684 } 7685 7686 if ((current_architecture & m68k_mask) 7687 && (current_architecture & ~m68k_mask)) 7688 { 7689 as_bad (_ ("m68k and cf features both selected")); 7690 if (current_architecture & m68k_mask) 7691 current_architecture &= m68k_mask; 7692 else 7693 current_architecture &= ~m68k_mask; 7694 } 7695 7696 /* Permit m68881 specification with all cpus; those that can't work 7697 with a coprocessor could be doing emulation. */ 7698 if (current_architecture & m68851) 7699 { 7700 if (current_architecture & m68040) 7701 as_warn (_("68040 and 68851 specified; mmu instructions may assemble incorrectly")); 7702 } 7703 /* What other incompatibilities could we check for? */ 7704 7705 if (cpu_of_arch (current_architecture) < m68020 7706 || arch_coldfire_p (current_architecture)) 7707 md_relax_table[TAB (PCINDEX, BYTE)].rlx_more = 0; 7708 7709 initialized = 1; 7710 } 7711 7712 void 7713 md_show_usage (FILE *stream) 7714 { 7715 const char *default_cpu = TARGET_CPU; 7716 int i; 7717 7718 /* Get the canonical name for the default target CPU. */ 7719 if (*default_cpu == 'm') 7720 default_cpu++; 7721 for (i = 0; m68k_cpus[i].name; i++) 7722 { 7723 if (strcasecmp (default_cpu, m68k_cpus[i].name) == 0) 7724 { 7725 while (m68k_cpus[i].alias > 0) 7726 i--; 7727 while (m68k_cpus[i].alias < 0) 7728 i++; 7729 default_cpu = m68k_cpus[i].name; 7730 } 7731 } 7732 7733 fprintf (stream, _("\ 7734 -march=<arch> set architecture\n\ 7735 -mcpu=<cpu> set cpu [default %s]\n\ 7736 "), default_cpu); 7737 for (i = 0; m68k_extensions[i].name; i++) 7738 fprintf (stream, _("\ 7739 -m[no-]%-16s enable/disable%s architecture extension\n\ 7740 "), m68k_extensions[i].name, 7741 m68k_extensions[i].alias > 0 ? " ColdFire" 7742 : m68k_extensions[i].alias < 0 ? " m68k" : ""); 7743 7744 fprintf (stream, _("\ 7745 -l use 1 word for refs to undefined symbols [default 2]\n\ 7746 -pic, -k generate position independent code\n\ 7747 -S turn jbsr into jsr\n\ 7748 --pcrel never turn PC-relative branches into absolute jumps\n\ 7749 --register-prefix-optional\n\ 7750 recognize register names without prefix character\n\ 7751 --bitwise-or do not treat `|' as a comment character\n\ 7752 --base-size-default-16 base reg without size is 16 bits\n\ 7753 --base-size-default-32 base reg without size is 32 bits (default)\n\ 7754 --disp-size-default-16 displacement with unknown size is 16 bits\n\ 7755 --disp-size-default-32 displacement with unknown size is 32 bits (default)\n\ 7756 ")); 7757 7758 fprintf (stream, _("Architecture variants are: ")); 7759 for (i = 0; m68k_archs[i].name; i++) 7760 { 7761 if (i) 7762 fprintf (stream, " | "); 7763 fprintf (stream, "%s", m68k_archs[i].name); 7764 } 7765 fprintf (stream, "\n"); 7766 7767 fprintf (stream, _("Processor variants are: ")); 7768 for (i = 0; m68k_cpus[i].name; i++) 7769 { 7770 if (i) 7771 fprintf (stream, " | "); 7772 fprintf (stream, "%s", m68k_cpus[i].name); 7773 } 7774 fprintf (stream, _("\n")); 7775 } 7776 7777 #ifdef TEST2 7779 7780 /* TEST2: Test md_assemble() */ 7781 /* Warning, this routine probably doesn't work anymore. */ 7782 int 7783 main (void) 7784 { 7785 struct m68k_it the_ins; 7786 char buf[120]; 7787 char *cp; 7788 int n; 7789 7790 m68k_ip_begin (); 7791 for (;;) 7792 { 7793 if (!gets (buf) || !*buf) 7794 break; 7795 if (buf[0] == '|' || buf[1] == '.') 7796 continue; 7797 for (cp = buf; *cp; cp++) 7798 if (*cp == '\t') 7799 *cp = ' '; 7800 if (is_label (buf)) 7801 continue; 7802 memset (&the_ins, '\0', sizeof (the_ins)); 7803 m68k_ip (&the_ins, buf); 7804 if (the_ins.error) 7805 { 7806 printf (_("Error %s in %s\n"), the_ins.error, buf); 7807 } 7808 else 7809 { 7810 printf (_("Opcode(%d.%s): "), the_ins.numo, the_ins.args); 7811 for (n = 0; n < the_ins.numo; n++) 7812 printf (" 0x%x", the_ins.opcode[n] & 0xffff); 7813 printf (" "); 7814 print_the_insn (&the_ins.opcode[0], stdout); 7815 (void) putchar ('\n'); 7816 } 7817 for (n = 0; n < strlen (the_ins.args) / 2; n++) 7818 { 7819 if (the_ins.operands[n].error) 7820 { 7821 printf ("op%d Error %s in %s\n", n, the_ins.operands[n].error, buf); 7822 continue; 7823 } 7824 printf ("mode %d, reg %d, ", the_ins.operands[n].mode, 7825 the_ins.operands[n].reg); 7826 if (the_ins.operands[n].b_const) 7827 printf ("Constant: '%.*s', ", 7828 1 + the_ins.operands[n].e_const - the_ins.operands[n].b_const, 7829 the_ins.operands[n].b_const); 7830 printf ("ireg %d, isiz %d, imul %d, ", the_ins.operands[n].ireg, 7831 the_ins.operands[n].isiz, the_ins.operands[n].imul); 7832 if (the_ins.operands[n].b_iadd) 7833 printf ("Iadd: '%.*s',", 7834 1 + the_ins.operands[n].e_iadd - the_ins.operands[n].b_iadd, 7835 the_ins.operands[n].b_iadd); 7836 putchar ('\n'); 7837 } 7838 } 7839 m68k_ip_end (); 7840 return 0; 7841 } 7842 7843 int 7844 is_label (char *str) 7845 { 7846 while (*str == ' ') 7847 str++; 7848 while (*str && *str != ' ') 7849 str++; 7850 if (str[-1] == ':' || str[1] == '=') 7851 return 1; 7852 return 0; 7853 } 7854 7855 #endif 7856 7857 /* Possible states for relaxation: 7858 7859 0 0 branch offset byte (bra, etc) 7860 0 1 word 7861 0 2 long 7862 7863 1 0 indexed offsets byte a0@(32,d4:w:1) etc 7864 1 1 word 7865 1 2 long 7866 7867 2 0 two-offset index word-word a0@(32,d4)@(45) etc 7868 2 1 word-long 7869 2 2 long-word 7870 2 3 long-long 7871 7872 */ 7873 7874 /* We have no need to default values of symbols. */ 7875 7876 symbolS * 7877 md_undefined_symbol (char *name ATTRIBUTE_UNUSED) 7878 { 7879 return 0; 7880 } 7881 7882 /* Round up a section size to the appropriate boundary. */ 7883 valueT 7884 md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size) 7885 { 7886 #ifdef OBJ_AOUT 7887 /* For a.out, force the section size to be aligned. If we don't do 7888 this, BFD will align it for us, but it will not write out the 7889 final bytes of the section. This may be a bug in BFD, but it is 7890 easier to fix it here since that is how the other a.out targets 7891 work. */ 7892 int align; 7893 7894 align = bfd_get_section_alignment (stdoutput, segment); 7895 size = ((size + (1 << align) - 1) & (-((valueT) 1 << align))); 7896 #endif 7897 7898 return size; 7899 } 7900 7901 /* Exactly what point is a PC-relative offset relative TO? 7902 On the 68k, it is relative to the address of the first extension 7903 word. The difference between the addresses of the offset and the 7904 first extension word is stored in fx_pcrel_adjust. */ 7905 long 7906 md_pcrel_from (fixS *fixP) 7907 { 7908 int adjust; 7909 7910 adjust = fixP->fx_pcrel_adjust; 7911 if (adjust == 64) 7912 adjust = -1; 7913 return fixP->fx_where + fixP->fx_frag->fr_address - adjust; 7914 } 7915 7916 #ifdef OBJ_ELF 7917 void 7918 m68k_elf_final_processing (void) 7919 { 7920 unsigned flags = 0; 7921 7922 if (arch_coldfire_fpu (current_architecture)) 7923 flags |= EF_M68K_CFV4E; 7924 /* Set file-specific flags if this is a cpu32 processor. */ 7925 if (cpu_of_arch (current_architecture) & cpu32) 7926 flags |= EF_M68K_CPU32; 7927 else if (cpu_of_arch (current_architecture) & fido_a) 7928 flags |= EF_M68K_FIDO; 7929 else if ((cpu_of_arch (current_architecture) & m68000up) 7930 && !(cpu_of_arch (current_architecture) & m68020up)) 7931 flags |= EF_M68K_M68000; 7932 7933 if (current_architecture & mcfisa_a) 7934 { 7935 static const unsigned isa_features[][2] = 7936 { 7937 {EF_M68K_CF_ISA_A_NODIV,mcfisa_a}, 7938 {EF_M68K_CF_ISA_A, mcfisa_a|mcfhwdiv}, 7939 {EF_M68K_CF_ISA_A_PLUS, mcfisa_a|mcfisa_aa|mcfhwdiv|mcfusp}, 7940 {EF_M68K_CF_ISA_B_NOUSP,mcfisa_a|mcfisa_b|mcfhwdiv}, 7941 {EF_M68K_CF_ISA_B, mcfisa_a|mcfisa_b|mcfhwdiv|mcfusp}, 7942 {EF_M68K_CF_ISA_C, mcfisa_a|mcfisa_c|mcfhwdiv|mcfusp}, 7943 {EF_M68K_CF_ISA_C_NODIV,mcfisa_a|mcfisa_c|mcfusp}, 7944 {0,0}, 7945 }; 7946 static const unsigned mac_features[][2] = 7947 { 7948 {EF_M68K_CF_MAC, mcfmac}, 7949 {EF_M68K_CF_EMAC, mcfemac}, 7950 {0,0}, 7951 }; 7952 unsigned ix; 7953 unsigned pattern; 7954 7955 pattern = (current_architecture 7956 & (mcfisa_a|mcfisa_aa|mcfisa_b|mcfisa_c|mcfhwdiv|mcfusp)); 7957 for (ix = 0; isa_features[ix][1]; ix++) 7958 { 7959 if (pattern == isa_features[ix][1]) 7960 { 7961 flags |= isa_features[ix][0]; 7962 break; 7963 } 7964 } 7965 if (!isa_features[ix][1]) 7966 { 7967 cf_bad: 7968 as_warn (_("Not a defined coldfire architecture")); 7969 } 7970 else 7971 { 7972 if (current_architecture & cfloat) 7973 flags |= EF_M68K_CF_FLOAT | EF_M68K_CFV4E; 7974 7975 pattern = current_architecture & (mcfmac|mcfemac); 7976 if (pattern) 7977 { 7978 for (ix = 0; mac_features[ix][1]; ix++) 7979 { 7980 if (pattern == mac_features[ix][1]) 7981 { 7982 flags |= mac_features[ix][0]; 7983 break; 7984 } 7985 } 7986 if (!mac_features[ix][1]) 7987 goto cf_bad; 7988 } 7989 } 7990 } 7991 elf_elfheader (stdoutput)->e_flags |= flags; 7992 } 7993 7994 /* Parse @TLSLDO and return the desired relocation. */ 7995 static bfd_reloc_code_real_type 7996 m68k_elf_suffix (char **str_p, expressionS *exp_p) 7997 { 7998 char ident[20]; 7999 char *str = *str_p; 8000 char *str2; 8001 int ch; 8002 int len; 8003 8004 if (*str++ != '@') 8005 return BFD_RELOC_UNUSED; 8006 8007 for (ch = *str, str2 = ident; 8008 (str2 < ident + sizeof (ident) - 1 8009 && (ISALNUM (ch) || ch == '@')); 8010 ch = *++str) 8011 { 8012 *str2++ = ch; 8013 } 8014 8015 *str2 = '\0'; 8016 len = str2 - ident; 8017 8018 if (strncmp (ident, "TLSLDO", 6) == 0 8019 && len == 6) 8020 { 8021 /* Now check for identifier@suffix+constant. */ 8022 if (*str == '-' || *str == '+') 8023 { 8024 char *orig_line = input_line_pointer; 8025 expressionS new_exp; 8026 8027 input_line_pointer = str; 8028 expression (&new_exp); 8029 if (new_exp.X_op == O_constant) 8030 { 8031 exp_p->X_add_number += new_exp.X_add_number; 8032 str = input_line_pointer; 8033 } 8034 8035 if (&input_line_pointer != str_p) 8036 input_line_pointer = orig_line; 8037 } 8038 *str_p = str; 8039 8040 return BFD_RELOC_68K_TLS_LDO32; 8041 } 8042 8043 return BFD_RELOC_UNUSED; 8044 } 8045 8046 /* Handles .long <tls_symbol>+0x8000 debug info. 8047 Clobbers input_line_pointer, checks end-of-line. 8048 Adapted from tc-ppc.c:ppc_elf_cons. */ 8049 static void 8050 m68k_elf_cons (int nbytes /* 4=.long */) 8051 { 8052 if (is_it_end_of_statement ()) 8053 { 8054 demand_empty_rest_of_line (); 8055 return; 8056 } 8057 8058 do 8059 { 8060 expressionS exp; 8061 bfd_reloc_code_real_type reloc; 8062 8063 expression (&exp); 8064 if (exp.X_op == O_symbol 8065 && *input_line_pointer == '@' 8066 && (reloc = m68k_elf_suffix (&input_line_pointer, 8067 &exp)) != BFD_RELOC_UNUSED) 8068 { 8069 reloc_howto_type *reloc_howto; 8070 int size; 8071 8072 reloc_howto = bfd_reloc_type_lookup (stdoutput, reloc); 8073 size = bfd_get_reloc_size (reloc_howto); 8074 8075 if (size > nbytes) 8076 { 8077 as_bad (_("%s relocations do not fit in %d bytes\n"), 8078 reloc_howto->name, nbytes); 8079 } 8080 else 8081 { 8082 char *p; 8083 int offset; 8084 8085 p = frag_more (nbytes); 8086 offset = 0; 8087 if (target_big_endian) 8088 offset = nbytes - size; 8089 fix_new_exp (frag_now, p - frag_now->fr_literal + offset, size, 8090 &exp, 0, reloc); 8091 } 8092 } 8093 else 8094 emit_expr (&exp, (unsigned int) nbytes); 8095 } 8096 while (*input_line_pointer++ == ','); 8097 8098 /* Put terminator back into stream. */ 8099 input_line_pointer--; 8100 demand_empty_rest_of_line (); 8101 } 8102 #endif 8103 8104 int 8105 tc_m68k_regname_to_dw2regnum (const char *regname) 8106 { 8107 unsigned int regnum; 8108 static const char *const regnames[] = 8109 { 8110 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", 8111 "a0", "a1", "a2", "a3", "a4", "a5", "a6", "sp", 8112 "fp0", "fp1", "fp2", "fp3", "fp4", "fp5", "fp6", "fp7", 8113 "pc" 8114 }; 8115 8116 for (regnum = 0; regnum < ARRAY_SIZE (regnames); regnum++) 8117 if (strcmp (regname, regnames[regnum]) == 0) 8118 return regnum; 8119 8120 return -1; 8121 } 8122 8123 void 8124 tc_m68k_frame_initial_instructions (void) 8125 { 8126 static int sp_regno = -1; 8127 8128 if (sp_regno < 0) 8129 sp_regno = tc_m68k_regname_to_dw2regnum ("sp"); 8130 8131 cfi_add_CFA_def_cfa (sp_regno, -DWARF2_CIE_DATA_ALIGNMENT); 8132 cfi_add_CFA_offset (DWARF2_DEFAULT_RETURN_COLUMN, DWARF2_CIE_DATA_ALIGNMENT); 8133 } 8134 8135 /* Check and emit error if broken-word handling has failed to fix up a 8136 case-table. This is called from write.c, after doing everything it 8137 knows about how to handle broken words. */ 8138 8139 void 8140 tc_m68k_check_adjusted_broken_word (offsetT new_offset, struct broken_word *brokwP) 8141 { 8142 if (new_offset > 32767 || new_offset < -32768) 8143 as_bad_where (brokwP->frag->fr_file, brokwP->frag->fr_line, 8144 _("Adjusted signed .word (%#lx) overflows: `switch'-statement too large."), 8145 (long) new_offset); 8146 } 8147 8148