eabf8efcac5f475484504f193ddc1b7fe9f32873
[deliverable/binutils-gdb.git] / gas / config / tc-m68hc11.c
1 /* tc-m68hc11.c -- Assembler code for the Motorola 68HC11 & 68HC12.
2 Copyright (C) 1999, 2000 Free Software Foundation.
3 Written by Stephane Carrez (stcarrez@worldnet.fr)
4
5 This file is part of GAS, the GNU Assembler.
6
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GAS is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
21
22 #include <stdio.h>
23 #include <ctype.h>
24 #include "as.h"
25 #include "subsegs.h"
26 #include "opcode/m68hc11.h"
27 #include "dwarf2dbg.h"
28
29 const char comment_chars[] = ";!";
30 const char line_comment_chars[] = "#*";
31 const char line_separator_chars[] = "";
32
33 const char EXP_CHARS[] = "eE";
34 const char FLT_CHARS[] = "dD";
35
36 #define STATE_CONDITIONAL_BRANCH (1)
37 #define STATE_PC_RELATIVE (2)
38 #define STATE_INDEXED_OFFSET (3)
39 #define STATE_XBCC_BRANCH (4)
40 #define STATE_CONDITIONAL_BRANCH_6812 (5)
41
42 #define STATE_BYTE (0)
43 #define STATE_BITS5 (0)
44 #define STATE_WORD (1)
45 #define STATE_BITS9 (1)
46 #define STATE_LONG (2)
47 #define STATE_BITS16 (2)
48 #define STATE_UNDF (3) /* Symbol undefined in pass1 */
49
50 /* This macro has no side-effects. */
51 #define ENCODE_RELAX(what,length) (((what) << 2) + (length))
52
53 #define IS_OPCODE(C1,C2) (((C1) & 0x0FF) == ((C2) & 0x0FF))
54
55 /* This table describes how you change sizes for the various types of variable
56 size expressions. This version only supports two kinds. */
57
58 /* The fields are:
59 How far Forward this mode will reach.
60 How far Backward this mode will reach.
61 How many bytes this mode will add to the size of the frag.
62 Which mode to go to if the offset won't fit in this one. */
63
64 relax_typeS md_relax_table[] =
65 {
66 {1, 1, 0, 0}, /* First entries aren't used. */
67 {1, 1, 0, 0}, /* For no good reason except. */
68 {1, 1, 0, 0}, /* that the VAX doesn't either. */
69 {1, 1, 0, 0},
70
71 /* Relax for bcc <L>.
72 These insns are translated into b!cc +3 jmp L. */
73 {(127), (-128), 0, ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_WORD)},
74 {0, 0, 3, 0},
75 {1, 1, 0, 0},
76 {1, 1, 0, 0},
77
78 /* Relax for bsr <L> and bra <L>.
79 These insns are translated into jsr and jmp. */
80 {(127), (-128), 0, ENCODE_RELAX (STATE_PC_RELATIVE, STATE_WORD)},
81 {0, 0, 1, 0},
82 {1, 1, 0, 0},
83 {1, 1, 0, 0},
84
85 /* Relax for indexed offset: 5-bits, 9-bits, 16-bits. */
86 {(15), (-16), 0, ENCODE_RELAX (STATE_INDEXED_OFFSET, STATE_BITS9)},
87 {(255), (-256), 1, ENCODE_RELAX (STATE_INDEXED_OFFSET, STATE_BITS16)},
88 {0, 0, 1, 0},
89 {1, 1, 0, 0},
90
91 /* Relax for dbeq/ibeq/tbeq r,<L>:
92 These insns are translated into db!cc +3 jmp L. */
93 {(255), (-256), 0, ENCODE_RELAX (STATE_XBCC_BRANCH, STATE_WORD)},
94 {0, 0, 3, 0},
95 {1, 1, 0, 0},
96 {1, 1, 0, 0},
97
98 /* Relax for bcc <L> on 68HC12.
99 These insns are translated into lbcc <L>. */
100 {(127), (-128), 0, ENCODE_RELAX (STATE_CONDITIONAL_BRANCH_6812, STATE_WORD)},
101 {0, 0, 2, 0},
102 {1, 1, 0, 0},
103 {1, 1, 0, 0},
104
105 };
106
107 /* 68HC11 and 68HC12 registers. They are numbered according to the 68HC12. */
108 typedef enum register_id
109 {
110 REG_NONE = -1,
111 REG_A = 0,
112 REG_B = 1,
113 REG_CCR = 2,
114 REG_D = 4,
115 REG_X = 5,
116 REG_Y = 6,
117 REG_SP = 7,
118 REG_PC = 8
119 } register_id;
120
121 typedef struct operand
122 {
123 expressionS exp;
124 register_id reg1;
125 register_id reg2;
126 int mode;
127 } operand;
128
129 struct m68hc11_opcode_def
130 {
131 long format;
132 int min_operands;
133 int max_operands;
134 int nb_modes;
135 int used;
136 struct m68hc11_opcode *opcode;
137 };
138
139 static struct m68hc11_opcode_def *m68hc11_opcode_defs = 0;
140 static int m68hc11_nb_opcode_defs = 0;
141
142 typedef struct alias
143 {
144 const char *name;
145 const char *alias;
146 }
147 alias;
148
149 static alias alias_opcodes[] =
150 {
151 {"cpd", "cmpd"},
152 {"cpx", "cmpx"},
153 {"cpy", "cmpy"},
154 {0, 0}
155 };
156
157 /* Local functions. */
158 static register_id reg_name_search PARAMS ((char *));
159 static register_id register_name PARAMS ((void));
160 static int check_range PARAMS ((long, int));
161 static void print_opcode_list PARAMS ((void));
162 static void get_default_target PARAMS ((void));
163 static void print_insn_format PARAMS ((char *));
164 static int get_operand PARAMS ((operand *, int, long));
165 static void fixup8 PARAMS ((expressionS *, int, int));
166 static void fixup16 PARAMS ((expressionS *, int, int));
167 static struct m68hc11_opcode *find_opcode
168 PARAMS ((struct m68hc11_opcode_def *, operand *, int *));
169 static void build_jump_insn
170 PARAMS ((struct m68hc11_opcode *, operand *, int, int));
171 static void build_insn
172 PARAMS ((struct m68hc11_opcode *, operand *, int));
173
174 /* Controls whether relative branches can be turned into long branches.
175 When the relative offset is too large, the insn are changed:
176 bra -> jmp
177 bsr -> jsr
178 bcc -> b!cc +3
179 jmp L
180 dbcc -> db!cc +3
181 jmp L
182
183 Setting the flag forbidds this. */
184 static short flag_fixed_branchs = 0;
185
186 /* Force to use long jumps (absolute) instead of relative branches. */
187 static short flag_force_long_jumps = 0;
188
189 /* Change the direct addressing mode into an absolute addressing mode
190 when the insn does not support direct addressing.
191 For example, "clr *ZD0" is normally not possible and is changed
192 into "clr ZDO". */
193 static short flag_strict_direct_addressing = 1;
194
195 /* When an opcode has invalid operand, print out the syntax of the opcode
196 to stderr. */
197 static short flag_print_insn_syntax = 0;
198
199 /* Dumps the list of instructions with syntax and then exit:
200 1 -> Only dumps the list (sorted by name)
201 2 -> Generate an example (or test) that can be compiled. */
202 static short flag_print_opcodes = 0;
203
204 /* Opcode hash table. */
205 static struct hash_control *m68hc11_hash;
206
207 /* Current cpu (either cpu6811 or cpu6812). This is determined automagically
208 by 'get_default_target' by looking at default BFD vector. This is overriden
209 with the -m<cpu> option. */
210 static int current_architecture = 0;
211
212 /* Default cpu determined by 'get_default_target'. */
213 static const char *default_cpu;
214
215 /* Number of opcodes in the sorted table (filtered by current cpu). */
216 static int num_opcodes;
217
218 /* The opcodes sorted by name and filtered by current cpu. */
219 static struct m68hc11_opcode *m68hc11_sorted_opcodes;
220
221 /* These are the machine dependent pseudo-ops. These are included so
222 the assembler can work on the output from the SUN C compiler, which
223 generates these. */
224
225 /* This table describes all the machine specific pseudo-ops the assembler
226 has to support. The fields are:
227 pseudo-op name without dot
228 function to call to execute this pseudo-op
229 Integer arg to pass to the function. */
230 const pseudo_typeS md_pseudo_table[] =
231 {
232 /* The following pseudo-ops are supported for MRI compatibility. */
233 {"fcb", cons, 1},
234 {"fdb", cons, 2},
235 {"fcc", stringer, 1},
236 {"rmb", s_space, 0},
237 {"file", dwarf2_directive_file, 0},
238 {"loc", dwarf2_directive_loc, 0},
239
240 {0, 0, 0}
241 };
242 \f
243 /* Options and initialization. */
244
245 CONST char *md_shortopts = "Sm:";
246
247 struct option md_longopts[] =
248 {
249 #define OPTION_FORCE_LONG_BRANCH (OPTION_MD_BASE)
250 {"force-long-branchs", no_argument, NULL, OPTION_FORCE_LONG_BRANCH},
251
252 #define OPTION_SHORT_BRANCHS (OPTION_MD_BASE + 1)
253 {"short-branchs", no_argument, NULL, OPTION_SHORT_BRANCHS},
254
255 #define OPTION_STRICT_DIRECT_MODE (OPTION_MD_BASE + 2)
256 {"strict-direct-mode", no_argument, NULL, OPTION_STRICT_DIRECT_MODE},
257
258 #define OPTION_PRINT_INSN_SYNTAX (OPTION_MD_BASE + 3)
259 {"print-insn-syntax", no_argument, NULL, OPTION_PRINT_INSN_SYNTAX},
260
261 #define OPTION_PRINT_OPCODES (OPTION_MD_BASE + 4)
262 {"print-opcodes", no_argument, NULL, OPTION_PRINT_OPCODES},
263
264 #define OPTION_GENERATE_EXAMPLE (OPTION_MD_BASE + 5)
265 {"generate-example", no_argument, NULL, OPTION_GENERATE_EXAMPLE},
266
267 {NULL, no_argument, NULL, 0}
268 };
269 size_t md_longopts_size = sizeof (md_longopts);
270
271 /* Get the target cpu for the assembler. This is based on the configure
272 options and on the -m68hc11/-m68hc12 option. If no option is specified,
273 we must get the default. */
274 const char *
275 m68hc11_arch_format ()
276 {
277 get_default_target ();
278 if (current_architecture & cpu6811)
279 return "elf32-m68hc11";
280 else
281 return "elf32-m68hc12";
282 }
283
284 enum bfd_architecture
285 m68hc11_arch ()
286 {
287 get_default_target ();
288 if (current_architecture & cpu6811)
289 return bfd_arch_m68hc11;
290 else
291 return bfd_arch_m68hc12;
292 }
293
294 int
295 m68hc11_mach ()
296 {
297 return 0;
298 }
299
300 void
301 md_show_usage (stream)
302 FILE *stream;
303 {
304 get_default_target ();
305 fprintf (stream, _("\
306 Motorola 68HC11/68HC12 options:\n\
307 -m68hc11 | -m68hc12 specify the processor [default %s]\n\
308 --force-long-branchs always turn relative branchs into absolute ones\n\
309 -S,--short-branchs do not turn relative branchs into absolute ones\n\
310 when the offset is out of range\n\
311 --strict-direct-mode do not turn the direct mode into extended mode\n\
312 when the instruction does not support direct mode\n\
313 --print-insn-syntax print the syntax of instruction in case of error\n\
314 --print-opcodes print the list of instructions with syntax\n\
315 --generate-example generate an example of each instruction\n\
316 (used for testing)\n"), default_cpu);
317
318 }
319
320 /* Try to identify the default target based on the BFD library. */
321 static void
322 get_default_target ()
323 {
324 const bfd_target *target;
325 bfd abfd;
326
327 if (current_architecture != 0)
328 return;
329
330 default_cpu = "unknown";
331 target = bfd_find_target (0, &abfd);
332 if (target && target->name)
333 {
334 if (strcmp (target->name, "elf32-m68hc12") == 0)
335 {
336 current_architecture = cpu6812;
337 default_cpu = "m68hc12";
338 }
339 else if (strcmp (target->name, "elf32-m68hc11") == 0)
340 {
341 current_architecture = cpu6811;
342 default_cpu = "m68hc11";
343 }
344 else
345 {
346 as_bad (_("Default target `%s' is not supported."), target->name);
347 }
348 }
349 }
350
351 void
352 m68hc11_print_statistics (file)
353 FILE *file;
354 {
355 int i;
356 struct m68hc11_opcode_def *opc;
357
358 hash_print_statistics (file, "opcode table", m68hc11_hash);
359
360 opc = m68hc11_opcode_defs;
361 if (opc == 0 || m68hc11_nb_opcode_defs == 0)
362 return;
363
364 /* Dump the opcode statistics table. */
365 fprintf (file, _("Name # Modes Min ops Max ops Modes mask # Used\n"));
366 for (i = 0; i < m68hc11_nb_opcode_defs; i++, opc++)
367 {
368 fprintf (file, "%-7.7s %5d %7d %7d 0x%08lx %7d\n",
369 opc->opcode->name,
370 opc->nb_modes,
371 opc->min_operands, opc->max_operands, opc->format, opc->used);
372 }
373 }
374
375 int
376 md_parse_option (c, arg)
377 int c;
378 char *arg;
379 {
380 get_default_target ();
381 switch (c)
382 {
383 /* -S means keep external to 2 bits offset rather than 16 bits one. */
384 case OPTION_SHORT_BRANCHS:
385 case 'S':
386 flag_fixed_branchs = 1;
387 break;
388
389 case OPTION_FORCE_LONG_BRANCH:
390 flag_force_long_jumps = 1;
391 break;
392
393 case OPTION_PRINT_INSN_SYNTAX:
394 flag_print_insn_syntax = 1;
395 break;
396
397 case OPTION_PRINT_OPCODES:
398 flag_print_opcodes = 1;
399 break;
400
401 case OPTION_STRICT_DIRECT_MODE:
402 flag_strict_direct_addressing = 0;
403 break;
404
405 case OPTION_GENERATE_EXAMPLE:
406 flag_print_opcodes = 2;
407 break;
408
409 case 'm':
410 if (strcasecmp (arg, "68hc11") == 0)
411 current_architecture = cpu6811;
412 else if (strcasecmp (arg, "68hc12") == 0)
413 current_architecture = cpu6812;
414 else
415 as_bad (_("Option `%s' is not recognized."), arg);
416 break;
417
418 default:
419 return 0;
420 }
421
422 return 1;
423 }
424 \f
425 symbolS *
426 md_undefined_symbol (name)
427 char *name ATTRIBUTE_UNUSED;
428 {
429 return 0;
430 }
431
432 /* Equal to MAX_PRECISION in atof-ieee.c. */
433 #define MAX_LITTLENUMS 6
434
435 /* Turn a string in input_line_pointer into a floating point constant
436 of type TYPE, and store the appropriate bytes in *LITP. The number
437 of LITTLENUMS emitted is stored in *SIZEP. An error message is
438 returned, or NULL on OK. */
439 char *
440 md_atof (type, litP, sizeP)
441 char type;
442 char *litP;
443 int *sizeP;
444 {
445 int prec;
446 LITTLENUM_TYPE words[MAX_LITTLENUMS];
447 LITTLENUM_TYPE *wordP;
448 char *t;
449
450 switch (type)
451 {
452 case 'f':
453 case 'F':
454 case 's':
455 case 'S':
456 prec = 2;
457 break;
458
459 case 'd':
460 case 'D':
461 case 'r':
462 case 'R':
463 prec = 4;
464 break;
465
466 case 'x':
467 case 'X':
468 prec = 6;
469 break;
470
471 case 'p':
472 case 'P':
473 prec = 6;
474 break;
475
476 default:
477 *sizeP = 0;
478 return _("Bad call to MD_ATOF()");
479 }
480 t = atof_ieee (input_line_pointer, type, words);
481 if (t)
482 input_line_pointer = t;
483
484 *sizeP = prec * sizeof (LITTLENUM_TYPE);
485 for (wordP = words; prec--;)
486 {
487 md_number_to_chars (litP, (long) (*wordP++), sizeof (LITTLENUM_TYPE));
488 litP += sizeof (LITTLENUM_TYPE);
489 }
490 return 0;
491 }
492
493 valueT
494 md_section_align (seg, addr)
495 asection *seg;
496 valueT addr;
497 {
498 int align = bfd_get_section_alignment (stdoutput, seg);
499 return ((addr + (1 << align) - 1) & (-1 << align));
500 }
501
502 static int
503 cmp_opcode (op1, op2)
504 struct m68hc11_opcode *op1;
505 struct m68hc11_opcode *op2;
506 {
507 return strcmp (op1->name, op2->name);
508 }
509
510 /* Initialize the assembler. Create the opcode hash table
511 (sorted on the names) with the M6811 opcode table
512 (from opcode library). */
513 void
514 md_begin ()
515 {
516 char *prev_name = "";
517 struct m68hc11_opcode *opcodes;
518 struct m68hc11_opcode_def *opc = 0;
519 int i, j;
520
521 get_default_target ();
522
523 m68hc11_hash = hash_new ();
524
525 /* Get a writable copy of the opcode table and sort it on the names. */
526 opcodes = (struct m68hc11_opcode *) xmalloc (m68hc11_num_opcodes *
527 sizeof (struct
528 m68hc11_opcode));
529 m68hc11_sorted_opcodes = opcodes;
530 num_opcodes = 0;
531 for (i = 0; i < m68hc11_num_opcodes; i++)
532 {
533 if (m68hc11_opcodes[i].arch & current_architecture)
534 {
535 opcodes[num_opcodes] = m68hc11_opcodes[i];
536 if (opcodes[num_opcodes].name[0] == 'b'
537 && opcodes[num_opcodes].format & M6811_OP_JUMP_REL
538 && !(opcodes[num_opcodes].format & M6811_OP_BITMASK))
539 {
540 num_opcodes++;
541 opcodes[num_opcodes] = m68hc11_opcodes[i];
542 }
543 num_opcodes++;
544 for (j = 0; alias_opcodes[j].name != 0; j++)
545 if (strcmp (m68hc11_opcodes[i].name, alias_opcodes[j].name) == 0)
546 {
547 opcodes[num_opcodes] = m68hc11_opcodes[i];
548 opcodes[num_opcodes].name = alias_opcodes[j].alias;
549 num_opcodes++;
550 break;
551 }
552 }
553 }
554 qsort (opcodes, num_opcodes, sizeof (struct m68hc11_opcode), cmp_opcode);
555
556 opc = (struct m68hc11_opcode_def *)
557 xmalloc (num_opcodes * sizeof (struct m68hc11_opcode_def));
558 m68hc11_opcode_defs = opc--;
559
560 /* Insert unique names into hash table. The M6811 instruction set
561 has several identical opcode names that have different opcodes based
562 on the operands. This hash table then provides a quick index to
563 the first opcode with a particular name in the opcode table. */
564 for (i = 0; i < num_opcodes; i++, opcodes++)
565 {
566 int expect;
567
568 if (strcmp (prev_name, opcodes->name))
569 {
570 prev_name = (char *) opcodes->name;
571
572 opc++;
573 opc->format = 0;
574 opc->min_operands = 100;
575 opc->max_operands = 0;
576 opc->nb_modes = 0;
577 opc->opcode = opcodes;
578 opc->used = 0;
579 hash_insert (m68hc11_hash, opcodes->name, (char *) opc);
580 }
581 opc->nb_modes++;
582 opc->format |= opcodes->format;
583
584 /* See how many operands this opcode needs. */
585 expect = 0;
586 if (opcodes->format & M6811_OP_MASK)
587 expect++;
588 if (opcodes->format & M6811_OP_BITMASK)
589 expect++;
590 if (opcodes->format & (M6811_OP_JUMP_REL | M6812_OP_JUMP_REL16))
591 expect++;
592 if (opcodes->format & (M6812_OP_IND16_P2 | M6812_OP_IDX_P2))
593 expect++;
594
595 if (expect < opc->min_operands)
596 opc->min_operands = expect;
597 if (expect > opc->max_operands)
598 opc->max_operands = expect;
599 }
600 opc++;
601 m68hc11_nb_opcode_defs = opc - m68hc11_opcode_defs;
602
603 if (flag_print_opcodes)
604 {
605 print_opcode_list ();
606 exit (EXIT_SUCCESS);
607 }
608 }
609
610 void
611 m68hc11_init_after_args ()
612 {
613 }
614 \f
615 /* Builtin help. */
616
617 /* Return a string that represents the operand format for the instruction.
618 When example is true, this generates an example of operand. This is used
619 to give an example and also to generate a test. */
620 static char *
621 print_opcode_format (opcode, example)
622 struct m68hc11_opcode *opcode;
623 int example;
624 {
625 static char buf[128];
626 int format = opcode->format;
627 char *p;
628
629 p = buf;
630 buf[0] = 0;
631 if (format & M6811_OP_IMM8)
632 {
633 if (example)
634 sprintf (p, "#%d", rand () & 0x0FF);
635 else
636 strcpy (p, _("#<imm8>"));
637 p = &p[strlen (p)];
638 }
639
640 if (format & M6811_OP_IMM16)
641 {
642 if (example)
643 sprintf (p, "#%d", rand () & 0x0FFFF);
644 else
645 strcpy (p, _("#<imm16>"));
646 p = &p[strlen (p)];
647 }
648
649 if (format & M6811_OP_IX)
650 {
651 if (example)
652 sprintf (p, "%d,X", rand () & 0x0FF);
653 else
654 strcpy (p, _("<imm8>,X"));
655 p = &p[strlen (p)];
656 }
657
658 if (format & M6811_OP_IY)
659 {
660 if (example)
661 sprintf (p, "%d,X", rand () & 0x0FF);
662 else
663 strcpy (p, _("<imm8>,X"));
664 p = &p[strlen (p)];
665 }
666
667 if (format & M6812_OP_IDX)
668 {
669 if (example)
670 sprintf (p, "%d,X", rand () & 0x0FF);
671 else
672 strcpy (p, "n,r");
673 p = &p[strlen (p)];
674 }
675
676 if (format & M6811_OP_DIRECT)
677 {
678 if (example)
679 sprintf (p, "*Z%d", rand () & 0x0FF);
680 else
681 strcpy (p, _("*<abs8>"));
682 p = &p[strlen (p)];
683 }
684
685 if (format & M6811_OP_BITMASK)
686 {
687 if (buf[0])
688 *p++ = ' ';
689
690 if (example)
691 sprintf (p, "#$%02x", rand () & 0x0FF);
692 else
693 strcpy (p, _("#<mask>"));
694
695 p = &p[strlen (p)];
696 if (format & M6811_OP_JUMP_REL)
697 *p++ = ' ';
698 }
699
700 if (format & M6811_OP_IND16)
701 {
702 if (example)
703 sprintf (p, _("symbol%d"), rand () & 0x0FF);
704 else
705 strcpy (p, _("<abs>"));
706
707 p = &p[strlen (p)];
708 }
709
710 if (format & (M6811_OP_JUMP_REL | M6812_OP_JUMP_REL16))
711 {
712 if (example)
713 {
714 if (format & M6811_OP_BITMASK)
715 {
716 sprintf (p, ".+%d", rand () & 0x7F);
717 }
718 else
719 {
720 sprintf (p, "L%d", rand () & 0x0FF);
721 }
722 }
723 else
724 strcpy (p, _("<label>"));
725 }
726
727 return buf;
728 }
729
730 /* Prints the list of instructions with the possible operands. */
731 static void
732 print_opcode_list ()
733 {
734 int i;
735 char *prev_name = "";
736 struct m68hc11_opcode *opcodes;
737 int example = flag_print_opcodes == 2;
738
739 if (example)
740 printf (_("# Example of `%s' instructions\n\t.sect .text\n_start:\n"),
741 default_cpu);
742
743 opcodes = m68hc11_sorted_opcodes;
744
745 /* Walk the list sorted on names (by md_begin). We only report
746 one instruction per line, and we collect the different operand
747 formats. */
748 for (i = 0; i < num_opcodes; i++, opcodes++)
749 {
750 char *fmt = print_opcode_format (opcodes, example);
751
752 if (example)
753 {
754 printf ("L%d:\t", i);
755 printf ("%s %s\n", opcodes->name, fmt);
756 }
757 else
758 {
759 if (strcmp (prev_name, opcodes->name))
760 {
761 if (i > 0)
762 printf ("\n");
763
764 printf ("%-5.5s ", opcodes->name);
765 prev_name = (char *) opcodes->name;
766 }
767 if (fmt[0])
768 printf (" [%s]", fmt);
769 }
770 }
771 printf ("\n");
772 }
773
774 /* Print the instruction format. This operation is called when some
775 instruction is not correct. Instruction format is printed as an
776 error message. */
777 static void
778 print_insn_format (name)
779 char *name;
780 {
781 struct m68hc11_opcode_def *opc;
782 struct m68hc11_opcode *opcode;
783 char buf[128];
784
785 opc = (struct m68hc11_opcode_def *) hash_find (m68hc11_hash, name);
786 if (opc == NULL)
787 {
788 as_bad (_("Instruction `%s' is not recognized."), name);
789 return;
790 }
791 opcode = opc->opcode;
792
793 as_bad (_("Instruction formats for `%s':"), name);
794 do
795 {
796 char *fmt;
797
798 fmt = print_opcode_format (opcode, 0, 0);
799 sprintf (buf, "\t%-5.5s %s", opcode->name, fmt);
800
801 as_bad ("%s", buf);
802 opcode++;
803 }
804 while (strcmp (opcode->name, name) == 0);
805 }
806 \f
807 /* Analysis of 68HC11 and 68HC12 operands. */
808
809 /* reg_name_search() finds the register number given its name.
810 Returns the register number or REG_NONE on failure. */
811 static register_id
812 reg_name_search (name)
813 char *name;
814 {
815 if (strcasecmp (name, "x") == 0 || strcasecmp (name, "ix") == 0)
816 return REG_X;
817 if (strcasecmp (name, "y") == 0 || strcasecmp (name, "iy") == 0)
818 return REG_Y;
819 if (strcasecmp (name, "a") == 0)
820 return REG_A;
821 if (strcasecmp (name, "b") == 0)
822 return REG_B;
823 if (strcasecmp (name, "d") == 0)
824 return REG_D;
825 if (strcasecmp (name, "sp") == 0)
826 return REG_SP;
827 if (strcasecmp (name, "pc") == 0)
828 return REG_PC;
829 if (strcasecmp (name, "ccr") == 0)
830 return REG_CCR;
831
832 return REG_NONE;
833 }
834
835 static char *
836 skip_whites (p)
837 char *p;
838 {
839 while (*p == ' ' || *p == '\t')
840 p++;
841
842 return p;
843 }
844
845 /* Check the string at input_line_pointer
846 to see if it is a valid register name. */
847 static register_id
848 register_name ()
849 {
850 register_id reg_number;
851 char c, *p = input_line_pointer;
852
853 if (!is_name_beginner (*p++))
854 return REG_NONE;
855
856 while (is_part_of_name (*p++))
857 continue;
858
859 c = *--p;
860 if (c)
861 *p++ = 0;
862
863 /* Look to see if it's in the register table. */
864 reg_number = reg_name_search (input_line_pointer);
865 if (reg_number != REG_NONE)
866 {
867 if (c)
868 *--p = c;
869
870 input_line_pointer = p;
871 return reg_number;
872 }
873 if (c)
874 *--p = c;
875
876 return reg_number;
877 }
878
879 /* Parse a string of operands and return an array of expressions.
880
881 Operand mode[0] mode[1] exp[0] exp[1]
882 #n M6811_OP_IMM16 - O_*
883 *<exp> M6811_OP_DIRECT - O_*
884 .{+-}<exp> M6811_OP_JUMP_REL - O_*
885 <exp> M6811_OP_IND16 - O_*
886 ,r N,r M6812_OP_IDX M6812_OP_REG O_constant O_register
887 n,-r M6812_PRE_DEC M6812_OP_REG O_constant O_register
888 n,+r M6812_PRE_INC " "
889 n,r- M6812_POST_DEC " "
890 n,r+ M6812_POST_INC " "
891 A,r B,r D,r M6811_OP_REG M6812_OP_REG O_register O_register
892 [D,r] M6811_OP_IDX_2 M6812_OP_REG O_register O_register
893 [n,r] M6811_OP_IDX_1 M6812_OP_REG O_constant O_register */
894 static int
895 get_operand (oper, which, opmode)
896 operand *oper;
897 int which;
898 long opmode;
899 {
900 char *p = input_line_pointer;
901 int mode;
902 register_id reg;
903
904 oper->exp.X_op = O_absent;
905 oper->reg1 = REG_NONE;
906 oper->reg2 = REG_NONE;
907 mode = M6811_OP_NONE;
908
909 p = skip_whites (p);
910
911 if (*p == 0 || *p == '\n' || *p == '\r')
912 {
913 input_line_pointer = p;
914 return 0;
915 }
916
917 if (*p == '*' && (opmode & (M6811_OP_DIRECT | M6811_OP_IND16)))
918 {
919 mode = M6811_OP_DIRECT;
920 p++;
921 }
922 else if (*p == '#')
923 {
924 if (!(opmode & (M6811_OP_IMM8 | M6811_OP_IMM16 | M6811_OP_BITMASK)))
925 {
926 as_bad (_("Immediate operand is not allowed for operand %d."),
927 which);
928 return -1;
929 }
930
931 mode = M6811_OP_IMM16;
932 p++;
933 if (strncmp (p, "%hi", 3) == 0)
934 {
935 p += 3;
936 mode |= M6811_OP_HIGH_ADDR;
937 }
938 else if (strncmp (p, "%lo", 3) == 0)
939 {
940 p += 3;
941 mode |= M6811_OP_LOW_ADDR;
942 }
943 }
944 else if (*p == '.' && (p[1] == '+' || p[1] == '-'))
945 {
946 p++;
947 mode = M6811_OP_JUMP_REL;
948 }
949 else if (*p == '[')
950 {
951 if (current_architecture & cpu6811)
952 as_bad (_("Indirect indexed addressing is not valid for 68HC11."));
953
954 p++;
955 mode = M6812_OP_IDX_2;
956 p = skip_whites (p);
957 }
958 else if (*p == ',') /* Special handling of ,x and ,y. */
959 {
960 p++;
961 input_line_pointer = p;
962
963 reg = register_name ();
964 if (reg != REG_NONE)
965 {
966 oper->reg1 = reg;
967 oper->exp.X_op = O_constant;
968 oper->exp.X_add_number = 0;
969 oper->mode = M6812_OP_IDX;
970 return 1;
971 }
972 as_bad (_("Spurious `,' or bad indirect register addressing mode."));
973 return -1;
974 }
975 input_line_pointer = p;
976
977 if (mode == M6811_OP_NONE || mode == M6812_OP_IDX_2)
978 reg = register_name ();
979 else
980 reg = REG_NONE;
981
982 if (reg != REG_NONE)
983 {
984 p = skip_whites (input_line_pointer);
985 if (*p == ']' && mode == M6812_OP_IDX_2)
986 {
987 as_bad
988 (_("Missing second register or offset for indexed-indirect mode."));
989 return -1;
990 }
991
992 oper->reg1 = reg;
993 oper->mode = mode | M6812_OP_REG;
994 if (*p != ',')
995 {
996 if (mode == M6812_OP_IDX_2)
997 {
998 as_bad (_("Missing second register for indexed-indirect mode."));
999 return -1;
1000 }
1001 return 1;
1002 }
1003
1004 p++;
1005 input_line_pointer = p;
1006 reg = register_name ();
1007 if (reg != REG_NONE)
1008 {
1009 p = skip_whites (input_line_pointer);
1010 if (mode == M6812_OP_IDX_2)
1011 {
1012 if (*p != ']')
1013 {
1014 as_bad (_("Missing `]' to close indexed-indirect mode."));
1015 return -1;
1016 }
1017 p++;
1018 }
1019 input_line_pointer = p;
1020
1021 oper->reg2 = reg;
1022 return 1;
1023 }
1024 return 1;
1025 }
1026
1027 /* In MRI mode, isolate the operand because we can't distinguish
1028 operands from comments. */
1029 if (flag_mri)
1030 {
1031 char c = 0;
1032
1033 p = skip_whites (p);
1034 while (*p && *p != ' ' && *p != '\t')
1035 p++;
1036
1037 if (*p)
1038 {
1039 c = *p;
1040 *p = 0;
1041 }
1042
1043 /* Parse as an expression. */
1044 expression (&oper->exp);
1045
1046 if (c)
1047 {
1048 *p = c;
1049 }
1050 }
1051 else
1052 {
1053 expression (&oper->exp);
1054 }
1055
1056 if (oper->exp.X_op == O_illegal)
1057 {
1058 as_bad (_("Illegal operand."));
1059 return -1;
1060 }
1061 else if (oper->exp.X_op == O_absent)
1062 {
1063 as_bad (_("Missing operand."));
1064 return -1;
1065 }
1066
1067 p = input_line_pointer;
1068
1069 if (mode == M6811_OP_NONE || mode == M6811_OP_DIRECT
1070 || mode == M6812_OP_IDX_2)
1071 {
1072 p = skip_whites (input_line_pointer);
1073
1074 if (*p == ',')
1075 {
1076 p++;
1077
1078 /* 68HC12 pre increment or decrement. */
1079 if (mode == M6811_OP_NONE)
1080 {
1081 if (*p == '-')
1082 {
1083 mode = M6812_PRE_DEC;
1084 p++;
1085 if (current_architecture & cpu6811)
1086 as_bad (_("Pre-decrement mode is not valid for 68HC11"));
1087 }
1088 else if (*p == '+')
1089 {
1090 mode = M6812_PRE_INC;
1091 p++;
1092 if (current_architecture & cpu6811)
1093 as_bad (_("Pre-increment mode is not valid for 68HC11"));
1094 }
1095 p = skip_whites (p);
1096 }
1097 input_line_pointer = p;
1098 reg = register_name ();
1099
1100 /* Backtrack. */
1101 if (which == 0 && opmode & M6812_OP_IDX_P2
1102 && reg != REG_X && reg != REG_Y
1103 && reg != REG_PC && reg != REG_SP)
1104 {
1105 reg = REG_NONE;
1106 input_line_pointer = p;
1107 }
1108
1109 if (reg == REG_NONE && mode != M6811_OP_DIRECT
1110 && !(mode == M6811_OP_NONE && opmode & M6811_OP_IND16))
1111 {
1112 as_bad (_("Wrong register in register indirect mode."));
1113 return -1;
1114 }
1115 if (mode == M6812_OP_IDX_2)
1116 {
1117 p = skip_whites (input_line_pointer);
1118 if (*p++ != ']')
1119 {
1120 as_bad (_("Missing `]' to close register indirect operand."));
1121 return -1;
1122 }
1123 input_line_pointer = p;
1124 }
1125 if (reg != REG_NONE)
1126 {
1127 oper->reg1 = reg;
1128 if (mode == M6811_OP_NONE)
1129 {
1130 p = input_line_pointer;
1131 if (*p == '-')
1132 {
1133 mode = M6812_POST_DEC;
1134 p++;
1135 if (current_architecture & cpu6811)
1136 as_bad
1137 (_("Post-decrement mode is not valid for 68HC11."));
1138 }
1139 else if (*p == '+')
1140 {
1141 mode = M6812_POST_INC;
1142 p++;
1143 if (current_architecture & cpu6811)
1144 as_bad
1145 (_("Post-increment mode is not valid for 68HC11."));
1146 }
1147 else
1148 mode = M6812_OP_IDX;
1149
1150 input_line_pointer = p;
1151 }
1152 else
1153 mode |= M6812_OP_IDX;
1154
1155 oper->mode = mode;
1156 return 1;
1157 }
1158 }
1159
1160 if (mode == M6812_OP_D_IDX_2)
1161 {
1162 as_bad (_("Invalid indexed indirect mode."));
1163 return -1;
1164 }
1165 }
1166
1167 /* If the mode is not known until now, this is either a label
1168 or an indirect address. */
1169 if (mode == M6811_OP_NONE)
1170 mode = M6811_OP_IND16 | M6811_OP_JUMP_REL;
1171
1172 p = input_line_pointer;
1173 while (*p == ' ' || *p == '\t')
1174 p++;
1175 input_line_pointer = p;
1176 oper->mode = mode;
1177
1178 return 1;
1179 }
1180
1181 #define M6812_AUTO_INC_DEC (M6812_PRE_INC | M6812_PRE_DEC \
1182 | M6812_POST_INC | M6812_POST_DEC)
1183
1184 /* Checks that the number 'num' fits for a given mode. */
1185 static int
1186 check_range (num, mode)
1187 long num;
1188 int mode;
1189 {
1190 /* Auto increment and decrement are ok for [-8..8] without 0. */
1191 if (mode & M6812_AUTO_INC_DEC)
1192 return (num != 0 && num <= 8 && num >= -8);
1193
1194 /* The 68HC12 supports 5, 9 and 16-bits offsets. */
1195 if (mode & (M6812_INDEXED_IND | M6812_INDEXED | M6812_OP_IDX))
1196 mode = M6811_OP_IND16;
1197
1198 if (mode & M6812_OP_JUMP_REL16)
1199 mode = M6811_OP_IND16;
1200
1201 switch (mode)
1202 {
1203 case M6811_OP_IX:
1204 case M6811_OP_IY:
1205 case M6811_OP_DIRECT:
1206 return (num >= 0 && num <= 255) ? 1 : 0;
1207
1208 case M6811_OP_BITMASK:
1209 case M6811_OP_IMM8:
1210 return (((num & 0xFFFFFF00) == 0) || ((num & 0xFFFFFF00) == 0xFFFFFF00))
1211 ? 1 : 0;
1212
1213 case M6811_OP_JUMP_REL:
1214 return (num >= -128 && num <= 127) ? 1 : 0;
1215
1216 case M6811_OP_IND16:
1217 case M6811_OP_IMM16:
1218 return (((num & 0xFFFF0000) == 0) || ((num & 0xFFFF0000) == 0xFFFF0000))
1219 ? 1 : 0;
1220
1221 case M6812_OP_IBCC_MARKER:
1222 case M6812_OP_TBCC_MARKER:
1223 case M6812_OP_DBCC_MARKER:
1224 return (num >= -256 && num <= 255) ? 1 : 0;
1225
1226 case M6812_OP_TRAP_ID:
1227 return ((num >= 0x30 && num <= 0x39)
1228 || (num >= 0x40 && num <= 0x0ff)) ? 1 : 0;
1229
1230 default:
1231 return 0;
1232 }
1233 }
1234 \f
1235 /* Gas fixup generation. */
1236
1237 /* Put a 1 byte expression described by 'oper'. If this expression contains
1238 unresolved symbols, generate an 8-bit fixup. */
1239 static void
1240 fixup8 (oper, mode, opmode)
1241 expressionS *oper;
1242 int mode;
1243 int opmode;
1244 {
1245 char *f;
1246
1247 f = frag_more (1);
1248
1249 if (oper->X_op == O_constant)
1250 {
1251 if (mode & M6812_OP_TRAP_ID
1252 && !check_range (oper->X_add_number, M6812_OP_TRAP_ID))
1253 {
1254 static char trap_id_warn_once = 0;
1255
1256 as_bad (_("Trap id `%ld' is out of range."), oper->X_add_number);
1257 if (trap_id_warn_once == 0)
1258 {
1259 trap_id_warn_once = 1;
1260 as_bad (_("Trap id must be within [0x30..0x39] or [0x40..0xff]."));
1261 }
1262 }
1263
1264 if (!(mode & M6812_OP_TRAP_ID)
1265 && !check_range (oper->X_add_number, mode))
1266 {
1267 as_bad (_("Operand out of 8-bit range: `%ld'."), oper->X_add_number);
1268 }
1269 number_to_chars_bigendian (f, oper->X_add_number & 0x0FF, 1);
1270 }
1271 else if (oper->X_op != O_register)
1272 {
1273 if (mode & M6812_OP_TRAP_ID)
1274 as_bad (_("The trap id must be a constant."));
1275
1276 if (mode == M6811_OP_JUMP_REL)
1277 {
1278 fixS *fixp;
1279
1280 fixp = fix_new_exp (frag_now, f - frag_now->fr_literal, 1,
1281 oper, true, BFD_RELOC_8_PCREL);
1282 fixp->fx_pcrel_adjust = 1;
1283 }
1284 else
1285 {
1286 /* Now create an 8-bit fixup. If there was some %hi or %lo
1287 modifier, generate the reloc accordingly. */
1288 fix_new_exp (frag_now, f - frag_now->fr_literal, 1,
1289 oper, false,
1290 ((opmode & M6811_OP_HIGH_ADDR)
1291 ? BFD_RELOC_M68HC11_HI8
1292 : ((opmode & M6811_OP_LOW_ADDR)
1293 ? BFD_RELOC_M68HC11_LO8 : BFD_RELOC_8)));
1294 }
1295 number_to_chars_bigendian (f, 0, 1);
1296 }
1297 else
1298 {
1299 as_fatal (_("Operand `%x' not recognized in fixup8."), oper->X_op);
1300 }
1301 }
1302
1303 /* Put a 2 bytes expression described by 'oper'. If this expression contains
1304 unresolved symbols, generate a 16-bit fixup. */
1305 static void
1306 fixup16 (oper, mode, opmode)
1307 expressionS *oper;
1308 int mode;
1309 int opmode ATTRIBUTE_UNUSED;
1310 {
1311 char *f;
1312
1313 f = frag_more (2);
1314
1315 if (oper->X_op == O_constant)
1316 {
1317 if (!check_range (oper->X_add_number, mode))
1318 {
1319 as_bad (_("Operand out of 16-bit range: `%ld'."),
1320 oper->X_add_number);
1321 }
1322 number_to_chars_bigendian (f, oper->X_add_number & 0x0FFFF, 2);
1323 }
1324 else if (oper->X_op != O_register)
1325 {
1326 fixS *fixp;
1327
1328 /* Now create a 16-bit fixup. */
1329 fixp = fix_new_exp (frag_now, f - frag_now->fr_literal, 2,
1330 oper,
1331 (mode & M6812_OP_JUMP_REL16 ? true : false),
1332 (mode & M6812_OP_JUMP_REL16
1333 ? BFD_RELOC_16_PCREL : BFD_RELOC_16));
1334 number_to_chars_bigendian (f, 0, 2);
1335 if (mode & M6812_OP_JUMP_REL16)
1336 fixp->fx_pcrel_adjust = 2;
1337 }
1338 else
1339 {
1340 as_fatal (_("Operand `%x' not recognized in fixup16."), oper->X_op);
1341 }
1342 }
1343 \f
1344 /* 68HC11 and 68HC12 code generation. */
1345
1346 /* Translate the short branch/bsr instruction into a long branch. */
1347 static unsigned char
1348 convert_branch (code)
1349 unsigned char code;
1350 {
1351 if (IS_OPCODE (code, M6812_BSR))
1352 return M6812_JSR;
1353 else if (IS_OPCODE (code, M6811_BSR))
1354 return M6811_JSR;
1355 else if (IS_OPCODE (code, M6811_BRA))
1356 return (current_architecture & cpu6812) ? M6812_JMP : M6811_JMP;
1357 else
1358 as_fatal (_("Unexpected branch conversion with `%x'"), code);
1359
1360 /* Keep gcc happy. */
1361 return M6811_JSR;
1362 }
1363
1364 /* Start a new insn that contains at least 'size' bytes. Record the
1365 line information of that insn in the dwarf2 debug sections. */
1366 static char *
1367 m68hc11_new_insn (size)
1368 int size;
1369 {
1370 char *f;
1371
1372 f = frag_more (size);
1373
1374 dwarf2_emit_insn (size);
1375
1376 return f;
1377 }
1378
1379 /* Builds a jump instruction (bra, bcc, bsr). */
1380 static void
1381 build_jump_insn (opcode, operands, nb_operands, jmp_mode)
1382 struct m68hc11_opcode *opcode;
1383 operand operands[];
1384 int nb_operands;
1385 int jmp_mode;
1386 {
1387 unsigned char code;
1388 int insn_size;
1389 char *f;
1390 unsigned long n;
1391
1392 /* The relative branch convertion is not supported for
1393 brclr and brset. */
1394 assert ((opcode->format & M6811_OP_BITMASK) == 0);
1395 assert (nb_operands == 1);
1396 assert (operands[0].reg1 == REG_NONE && operands[0].reg2 == REG_NONE);
1397
1398 code = opcode->opcode;
1399 insn_size = 1;
1400
1401 n = operands[0].exp.X_add_number;
1402
1403 /* Turn into a long branch:
1404 - when force long branch option (and not for jbcc pseudos),
1405 - when jbcc and the constant is out of -128..127 range,
1406 - when branch optimization is allowed and branch out of range. */
1407 if ((jmp_mode == 0 && flag_force_long_jumps)
1408 || (operands[0].exp.X_op == O_constant
1409 && (!check_range (n, opcode->format) &&
1410 (jmp_mode == 1 || flag_fixed_branchs == 0))))
1411 {
1412 if (code == M6811_BSR || code == M6811_BRA || code == M6812_BSR)
1413 {
1414 code = convert_branch (code);
1415
1416 f = m68hc11_new_insn (1);
1417 number_to_chars_bigendian (f, code, 1);
1418 }
1419 else if (current_architecture & cpu6812)
1420 {
1421 /* 68HC12: translate the bcc into a lbcc. */
1422 f = m68hc11_new_insn (2);
1423 number_to_chars_bigendian (f, M6811_OPCODE_PAGE2, 1);
1424 number_to_chars_bigendian (f + 1, code, 1);
1425 fixup16 (&operands[0].exp, M6812_OP_JUMP_REL16,
1426 M6812_OP_JUMP_REL16);
1427 return;
1428 }
1429 else
1430 {
1431 /* 68HC11: translate the bcc into b!cc +3; jmp <L>. */
1432 f = m68hc11_new_insn (3);
1433 code ^= 1;
1434 number_to_chars_bigendian (f, code, 1);
1435 number_to_chars_bigendian (f + 1, 3, 1);
1436 number_to_chars_bigendian (f + 2, M6811_JMP, 1);
1437 }
1438 fixup16 (&operands[0].exp, M6811_OP_IND16, M6811_OP_IND16);
1439 return;
1440 }
1441
1442 /* Branch with a constant that must fit in 8-bits. */
1443 if (operands[0].exp.X_op == O_constant)
1444 {
1445 if (!check_range (n, opcode->format))
1446 {
1447 as_bad (_("Operand out of range for a relative branch: `%ld'"),
1448 n);
1449 }
1450 else if (opcode->format & M6812_OP_JUMP_REL16)
1451 {
1452 f = m68hc11_new_insn (4);
1453 number_to_chars_bigendian (f, M6811_OPCODE_PAGE2, 1);
1454 number_to_chars_bigendian (f + 1, code, 1);
1455 number_to_chars_bigendian (f + 2, n & 0x0ffff, 2);
1456 }
1457 else
1458 {
1459 f = m68hc11_new_insn (2);
1460 number_to_chars_bigendian (f, code, 1);
1461 number_to_chars_bigendian (f + 1, n & 0x0FF, 1);
1462 }
1463 }
1464 else if (opcode->format & M6812_OP_JUMP_REL16)
1465 {
1466 f = m68hc11_new_insn (2);
1467 number_to_chars_bigendian (f, M6811_OPCODE_PAGE2, 1);
1468 number_to_chars_bigendian (f + 1, code, 1);
1469 fixup16 (&operands[0].exp, M6812_OP_JUMP_REL16, M6812_OP_JUMP_REL16);
1470 }
1471 else
1472 {
1473 char *opcode;
1474
1475 /* Branch offset must fit in 8-bits, don't do some relax. */
1476 if (jmp_mode == 0 && flag_fixed_branchs)
1477 {
1478 opcode = m68hc11_new_insn (1);
1479 number_to_chars_bigendian (opcode, code, 1);
1480 fixup8 (&operands[0].exp, M6811_OP_JUMP_REL, M6811_OP_JUMP_REL);
1481 }
1482
1483 /* bra/bsr made be changed into jmp/jsr. */
1484 else if (code == M6811_BSR || code == M6811_BRA || code == M6812_BSR)
1485 {
1486 opcode = m68hc11_new_insn (2);
1487 number_to_chars_bigendian (opcode, code, 1);
1488 number_to_chars_bigendian (opcode + 1, 0, 1);
1489 frag_var (rs_machine_dependent, 2, 1,
1490 ENCODE_RELAX (STATE_PC_RELATIVE, STATE_UNDF),
1491 operands[0].exp.X_add_symbol, (offsetT) n, opcode);
1492 }
1493 else if (current_architecture & cpu6812)
1494 {
1495 opcode = m68hc11_new_insn (2);
1496 number_to_chars_bigendian (opcode, code, 1);
1497 number_to_chars_bigendian (opcode + 1, 0, 1);
1498 frag_var (rs_machine_dependent, 2, 2,
1499 ENCODE_RELAX (STATE_CONDITIONAL_BRANCH_6812, STATE_UNDF),
1500 operands[0].exp.X_add_symbol, (offsetT) n, opcode);
1501 }
1502 else
1503 {
1504 opcode = m68hc11_new_insn (2);
1505 number_to_chars_bigendian (opcode, code, 1);
1506 number_to_chars_bigendian (opcode + 1, 0, 1);
1507 frag_var (rs_machine_dependent, 3, 3,
1508 ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_UNDF),
1509 operands[0].exp.X_add_symbol, (offsetT) n, opcode);
1510 }
1511 }
1512 }
1513
1514 /* Builds a dbne/dbeq/tbne/tbeq instruction. */
1515 static void
1516 build_dbranch_insn (opcode, operands, nb_operands, jmp_mode)
1517 struct m68hc11_opcode *opcode;
1518 operand operands[];
1519 int nb_operands;
1520 int jmp_mode;
1521 {
1522 unsigned char code;
1523 int insn_size;
1524 char *f;
1525 unsigned long n;
1526
1527 /* The relative branch convertion is not supported for
1528 brclr and brset. */
1529 assert ((opcode->format & M6811_OP_BITMASK) == 0);
1530 assert (nb_operands == 2);
1531 assert (operands[0].reg1 != REG_NONE);
1532
1533 code = opcode->opcode & 0x0FF;
1534 insn_size = 1;
1535
1536 f = m68hc11_new_insn (1);
1537 number_to_chars_bigendian (f, code, 1);
1538
1539 n = operands[1].exp.X_add_number;
1540 code = operands[0].reg1;
1541
1542 if (operands[0].reg1 == REG_NONE || operands[0].reg1 == REG_CCR
1543 || operands[0].reg1 == REG_PC)
1544 as_bad (_("Invalid register for dbcc/tbcc instruction."));
1545
1546 if (opcode->format & M6812_OP_IBCC_MARKER)
1547 code |= 0x80;
1548 else if (opcode->format & M6812_OP_TBCC_MARKER)
1549 code |= 0x40;
1550
1551 if (!(opcode->format & M6812_OP_EQ_MARKER))
1552 code |= 0x20;
1553
1554 /* Turn into a long branch:
1555 - when force long branch option (and not for jbcc pseudos),
1556 - when jdbcc and the constant is out of -256..255 range,
1557 - when branch optimization is allowed and branch out of range. */
1558 if ((jmp_mode == 0 && flag_force_long_jumps)
1559 || (operands[1].exp.X_op == O_constant
1560 && (!check_range (n, M6812_OP_IBCC_MARKER) &&
1561 (jmp_mode == 1 || flag_fixed_branchs == 0))))
1562 {
1563 f = frag_more (2);
1564 code ^= 0x20;
1565 number_to_chars_bigendian (f, code, 1);
1566 number_to_chars_bigendian (f + 1, M6812_JMP, 1);
1567 fixup16 (&operands[0].exp, M6811_OP_IND16, M6811_OP_IND16);
1568 return;
1569 }
1570
1571 /* Branch with a constant that must fit in 9-bits. */
1572 if (operands[1].exp.X_op == O_constant)
1573 {
1574 if (!check_range (n, M6812_OP_IBCC_MARKER))
1575 {
1576 as_bad (_("Operand out of range for a relative branch: `%ld'"),
1577 n);
1578 }
1579 else
1580 {
1581 if ((long) n < 0)
1582 code |= 0x10;
1583
1584 f = frag_more (2);
1585 number_to_chars_bigendian (f, code, 1);
1586 number_to_chars_bigendian (f + 1, n & 0x0FF, 1);
1587 }
1588 }
1589 else
1590 {
1591 /* Branch offset must fit in 8-bits, don't do some relax. */
1592 if (jmp_mode == 0 && flag_fixed_branchs)
1593 {
1594 fixup8 (&operands[0].exp, M6811_OP_JUMP_REL, M6811_OP_JUMP_REL);
1595 }
1596
1597 else
1598 {
1599 f = frag_more (2);
1600 number_to_chars_bigendian (f, code, 1);
1601 number_to_chars_bigendian (f + 1, 0, 1);
1602 frag_var (rs_machine_dependent, 3, 3,
1603 ENCODE_RELAX (STATE_XBCC_BRANCH, STATE_UNDF),
1604 operands[1].exp.X_add_symbol, (offsetT) n, f);
1605 }
1606 }
1607 }
1608
1609 #define OP_EXTENDED (M6811_OP_PAGE2 | M6811_OP_PAGE3 | M6811_OP_PAGE4)
1610
1611 /* Assemble the post index byte for 68HC12 extended addressing modes. */
1612 static int
1613 build_indexed_byte (op, format, move_insn)
1614 operand *op;
1615 int format ATTRIBUTE_UNUSED;
1616 int move_insn;
1617 {
1618 unsigned char byte = 0;
1619 char *f;
1620 int mode;
1621 long val;
1622
1623 val = op->exp.X_add_number;
1624 mode = op->mode;
1625 if (mode & M6812_AUTO_INC_DEC)
1626 {
1627 byte = 0x20;
1628 if (mode & (M6812_POST_INC | M6812_POST_DEC))
1629 byte |= 0x10;
1630
1631 if (op->exp.X_op == O_constant)
1632 {
1633 if (!check_range (val, mode))
1634 {
1635 as_bad (_("Increment/decrement value is out of range: `%ld'."),
1636 val);
1637 }
1638 if (mode & (M6812_POST_INC | M6812_PRE_INC))
1639 byte |= (val - 1) & 0x07;
1640 else
1641 byte |= (8 - ((val) & 7)) | 0x8;
1642 }
1643 switch (op->reg1)
1644 {
1645 case REG_NONE:
1646 as_fatal (_("Expecting a register."));
1647
1648 case REG_X:
1649 byte |= 0;
1650 break;
1651
1652 case REG_Y:
1653 byte |= 0x40;
1654 break;
1655
1656 case REG_SP:
1657 byte |= 0x80;
1658 break;
1659
1660 default:
1661 as_bad (_("Invalid register for post/pre increment."));
1662 break;
1663 }
1664
1665 f = frag_more (1);
1666 number_to_chars_bigendian (f, byte, 1);
1667 return 1;
1668 }
1669
1670 if (mode & M6812_OP_IDX)
1671 {
1672 switch (op->reg1)
1673 {
1674 case REG_X:
1675 byte = 0;
1676 break;
1677
1678 case REG_Y:
1679 byte = 1;
1680 break;
1681
1682 case REG_SP:
1683 byte = 2;
1684 break;
1685
1686 case REG_PC:
1687 byte = 3;
1688 break;
1689
1690 default:
1691 as_bad (_("Invalid register."));
1692 break;
1693 }
1694 if (op->exp.X_op == O_constant)
1695 {
1696 if (!check_range (val, M6812_OP_IDX))
1697 {
1698 as_bad (_("Offset out of 16-bit range: %ld."), val);
1699 }
1700
1701 if (move_insn && !(val >= -16 && val <= 15))
1702 {
1703 as_bad (_("Offset out of 5-bit range for movw/movb insn."));
1704 return -1;
1705 }
1706
1707 if (val >= -16 && val <= 15 && !(mode & M6812_OP_IDX_2))
1708 {
1709 byte = byte << 6;
1710 byte |= val & 0x1f;
1711 f = frag_more (1);
1712 number_to_chars_bigendian (f, byte, 1);
1713 return 1;
1714 }
1715 else if (val >= -256 && val <= 255 && !(mode & M6812_OP_IDX_2))
1716 {
1717 byte = byte << 3;
1718 byte |= 0xe0;
1719 if (val < 0)
1720 byte |= 0x1;
1721 f = frag_more (2);
1722 number_to_chars_bigendian (f, byte, 1);
1723 number_to_chars_bigendian (f + 1, val & 0x0FF, 1);
1724 return 2;
1725 }
1726 else
1727 {
1728 byte = byte << 3;
1729 if (mode & M6812_OP_IDX_2)
1730 byte |= 0xe3;
1731 else
1732 byte |= 0xe2;
1733
1734 f = frag_more (3);
1735 number_to_chars_bigendian (f, byte, 1);
1736 number_to_chars_bigendian (f + 1, val & 0x0FFFF, 2);
1737 return 3;
1738 }
1739 }
1740 f = frag_more (1);
1741 number_to_chars_bigendian (f, byte, 1);
1742 #if 0
1743 fix_new_exp (frag_now, f - frag_now->fr_literal, 2,
1744 &op->exp, false, BFD_RELOC_16);
1745 #endif
1746 frag_var (rs_machine_dependent, 2, 2,
1747 ENCODE_RELAX (STATE_INDEXED_OFFSET, STATE_UNDF),
1748 op->exp.X_add_symbol, val, f);
1749 return 3;
1750 }
1751
1752 if (mode & M6812_OP_REG)
1753 {
1754 if (mode & M6812_OP_IDX_2)
1755 {
1756 if (op->reg1 != REG_D)
1757 as_bad (_("Expecting register D for indexed indirect mode."));
1758 if (move_insn)
1759 as_bad (_("Indexed indirect mode is not allowed for movb/movw."));
1760
1761 byte = 0xE7;
1762 }
1763 else
1764 {
1765 switch (op->reg1)
1766 {
1767 case REG_A:
1768 byte = 0xE4;
1769 break;
1770
1771 case REG_B:
1772 byte = 0xE5;
1773 break;
1774
1775 default:
1776 as_bad (_("Invalid accumulator register."));
1777
1778 case REG_D:
1779 byte = 0xE6;
1780 break;
1781 }
1782 }
1783 switch (op->reg2)
1784 {
1785 case REG_X:
1786 break;
1787
1788 case REG_Y:
1789 byte |= (1 << 3);
1790 break;
1791
1792 case REG_SP:
1793 byte |= (2 << 3);
1794 break;
1795
1796 case REG_PC:
1797 byte |= (3 << 3);
1798 break;
1799
1800 default:
1801 as_bad (_("Invalid indexed register."));
1802 break;
1803 }
1804 f = frag_more (1);
1805 number_to_chars_bigendian (f, byte, 1);
1806 return 1;
1807 }
1808
1809 as_fatal (_("Addressing mode not implemented yet."));
1810 return 0;
1811 }
1812
1813 /* Assemble the 68HC12 register mode byte. */
1814 static int
1815 build_reg_mode (op, format)
1816 operand *op;
1817 int format;
1818 {
1819 unsigned char byte;
1820 char *f;
1821
1822 if (format & M6812_OP_SEX_MARKER
1823 && op->reg1 != REG_A && op->reg1 != REG_B && op->reg1 != REG_CCR)
1824 as_bad (_("Invalid source register for this instruction, use 'tfr'."));
1825 else if (op->reg1 == REG_NONE || op->reg1 == REG_PC)
1826 as_bad (_("Invalid source register."));
1827
1828 if (format & M6812_OP_SEX_MARKER
1829 && op->reg2 != REG_D
1830 && op->reg2 != REG_X && op->reg2 != REG_Y && op->reg2 != REG_SP)
1831 as_bad (_("Invalid destination register for this instruction, use 'tfr'."));
1832 else if (op->reg2 == REG_NONE || op->reg2 == REG_PC)
1833 as_bad (_("Invalid destination register."));
1834
1835 byte = (op->reg1 << 4) | (op->reg2);
1836 if (format & M6812_OP_EXG_MARKER)
1837 byte |= 0x80;
1838
1839 f = frag_more (1);
1840 number_to_chars_bigendian (f, byte, 1);
1841 return 1;
1842 }
1843
1844 /* build_insn takes a pointer to the opcode entry in the opcode table,
1845 the array of operand expressions and builds the correspding instruction.
1846 This operation only deals with non relative jumps insn (need special
1847 handling). */
1848 static void
1849 build_insn (opcode, operands, nb_operands)
1850 struct m68hc11_opcode *opcode;
1851 operand operands[];
1852 int nb_operands ATTRIBUTE_UNUSED;
1853 {
1854 int i;
1855 char *f;
1856 int insn_size = 1;
1857 long format;
1858 int move_insn = 0;
1859
1860 /* Put the page code instruction if there is one. */
1861 format = opcode->format;
1862 if (format & OP_EXTENDED)
1863 {
1864 int page_code;
1865
1866 f = m68hc11_new_insn (2);
1867 if (format & M6811_OP_PAGE2)
1868 page_code = M6811_OPCODE_PAGE2;
1869 else if (format & M6811_OP_PAGE3)
1870 page_code = M6811_OPCODE_PAGE3;
1871 else
1872 page_code = M6811_OPCODE_PAGE4;
1873
1874 number_to_chars_bigendian (f, page_code, 1);
1875 f++;
1876 insn_size = 2;
1877 }
1878 else
1879 f = m68hc11_new_insn (1);
1880
1881 number_to_chars_bigendian (f, opcode->opcode, 1);
1882
1883 i = 0;
1884
1885 /* The 68HC12 movb and movw instructions are special. We have to handle
1886 them in a special way. */
1887 if (format & (M6812_OP_IND16_P2 | M6812_OP_IDX_P2))
1888 {
1889 move_insn = 1;
1890 if (format & M6812_OP_IDX)
1891 {
1892 insn_size += build_indexed_byte (&operands[0], format, 1);
1893 i = 1;
1894 format &= ~M6812_OP_IDX;
1895 }
1896 if (format & M6812_OP_IDX_P2)
1897 {
1898 insn_size += build_indexed_byte (&operands[1], format, 1);
1899 i = 0;
1900 format &= ~M6812_OP_IDX_P2;
1901 }
1902 }
1903
1904 if (format & (M6811_OP_DIRECT | M6811_OP_IMM8))
1905 {
1906 insn_size++;
1907 fixup8 (&operands[i].exp,
1908 format & (M6811_OP_DIRECT | M6811_OP_IMM8 | M6812_OP_TRAP_ID),
1909 operands[i].mode);
1910 i++;
1911 }
1912 else if (format & (M6811_OP_IMM16 | M6811_OP_IND16))
1913 {
1914 insn_size += 2;
1915 fixup16 (&operands[i].exp, format & (M6811_OP_IMM16 | M6811_OP_IND16),
1916 operands[i].mode);
1917 i++;
1918 }
1919 else if (format & (M6811_OP_IX | M6811_OP_IY))
1920 {
1921 if ((format & M6811_OP_IX) && (operands[0].reg1 != REG_X))
1922 as_bad (_("Invalid indexed register, expecting register X."));
1923 if ((format & M6811_OP_IY) && (operands[0].reg1 != REG_Y))
1924 as_bad (_("Invalid indexed register, expecting register Y."));
1925
1926 insn_size++;
1927 fixup8 (&operands[0].exp, M6811_OP_IX, operands[0].mode);
1928 i = 1;
1929 }
1930 else if (format &
1931 (M6812_OP_IDX | M6812_OP_IDX_2 | M6812_OP_IDX_1 | M6812_OP_D_IDX))
1932 {
1933 insn_size += build_indexed_byte (&operands[i], format, move_insn);
1934 i++;
1935 }
1936 else if (format & M6812_OP_REG && current_architecture & cpu6812)
1937 {
1938 insn_size += build_reg_mode (&operands[i], format);
1939 i++;
1940 }
1941 if (format & M6811_OP_BITMASK)
1942 {
1943 insn_size++;
1944 fixup8 (&operands[i].exp, M6811_OP_BITMASK, operands[i].mode);
1945 i++;
1946 }
1947 if (format & M6811_OP_JUMP_REL)
1948 {
1949 insn_size++;
1950 fixup8 (&operands[i].exp, M6811_OP_JUMP_REL, operands[i].mode);
1951 i++;
1952 }
1953 else if (format & M6812_OP_IND16_P2)
1954 {
1955 insn_size += 2;
1956 fixup16 (&operands[1].exp, M6811_OP_IND16, operands[1].mode);
1957 }
1958 }
1959 \f
1960 /* Opcode identification and operand analysis. */
1961
1962 /* find() gets a pointer to an entry in the opcode table. It must look at all
1963 opcodes with the same name and use the operands to choose the correct
1964 opcode. Returns the opcode pointer if there was a match and 0 if none. */
1965 static struct m68hc11_opcode *
1966 find (opc, operands, nb_operands)
1967 struct m68hc11_opcode_def *opc;
1968 operand operands[];
1969 int nb_operands;
1970 {
1971 int i, match, pos;
1972 struct m68hc11_opcode *opcode;
1973 struct m68hc11_opcode *op_indirect;
1974
1975 op_indirect = 0;
1976 opcode = opc->opcode;
1977
1978 /* Now search the opcode table table for one with operands
1979 that matches what we've got. We're only done if the operands matched so
1980 far AND there are no more to check. */
1981 for (pos = match = 0; match == 0 && pos < opc->nb_modes; pos++, opcode++)
1982 {
1983 int poss_indirect = 0;
1984 long format = opcode->format;
1985 int expect;
1986
1987 expect = 0;
1988 if (opcode->format & M6811_OP_MASK)
1989 expect++;
1990 if (opcode->format & M6811_OP_BITMASK)
1991 expect++;
1992 if (opcode->format & (M6811_OP_JUMP_REL | M6812_OP_JUMP_REL16))
1993 expect++;
1994 if (opcode->format & (M6812_OP_IND16_P2 | M6812_OP_IDX_P2))
1995 expect++;
1996
1997 for (i = 0; expect == nb_operands && i < nb_operands; i++)
1998 {
1999 int mode = operands[i].mode;
2000
2001 if (mode & M6811_OP_IMM16)
2002 {
2003 if (format &
2004 (M6811_OP_IMM8 | M6811_OP_IMM16 | M6811_OP_BITMASK))
2005 continue;
2006 break;
2007 }
2008 if (mode == M6811_OP_DIRECT)
2009 {
2010 if (format & M6811_OP_DIRECT)
2011 continue;
2012
2013 /* If the operand is a page 0 operand, remember a
2014 possible <abs-16> addressing mode. We mark
2015 this and continue to check other operands. */
2016 if (format & M6811_OP_IND16
2017 && flag_strict_direct_addressing && op_indirect == 0)
2018 {
2019 poss_indirect = 1;
2020 continue;
2021 }
2022 break;
2023 }
2024 if (mode & M6811_OP_IND16)
2025 {
2026 if (i == 0 && (format & M6811_OP_IND16) != 0)
2027 continue;
2028 if (i != 0 && (format & M6812_OP_IND16_P2) != 0)
2029 continue;
2030 if (i == 0 && (format & M6811_OP_BITMASK))
2031 break;
2032 }
2033 if (mode & (M6811_OP_JUMP_REL | M6812_OP_JUMP_REL16))
2034 {
2035 if (format & (M6811_OP_JUMP_REL | M6812_OP_JUMP_REL16))
2036 continue;
2037 }
2038 if (mode & M6812_OP_REG)
2039 {
2040 if (i == 0
2041 && (format & M6812_OP_REG)
2042 && (operands[i].reg2 == REG_NONE))
2043 continue;
2044 if (i == 0
2045 && (format & M6812_OP_REG)
2046 && (format & M6812_OP_REG_2)
2047 && (operands[i].reg2 != REG_NONE))
2048 continue;
2049 if (i == 0
2050 && (format & M6812_OP_IDX)
2051 && (operands[i].reg2 != REG_NONE))
2052 continue;
2053 if (i == 0
2054 && (format & M6812_OP_D_IDX))
2055 continue;
2056 if (i == 0
2057 && (format & M6812_OP_IDX)
2058 && (format & (M6812_OP_IND16_P2 | M6812_OP_IDX_P2)))
2059 continue;
2060 if (i == 1
2061 && (format & M6812_OP_IDX_P2))
2062 continue;
2063 break;
2064 }
2065 if (mode & M6812_OP_IDX)
2066 {
2067 if (format & M6811_OP_IX && operands[i].reg1 == REG_X)
2068 continue;
2069 if (format & M6811_OP_IY && operands[i].reg1 == REG_Y)
2070 continue;
2071 if (i == 0
2072 && format & (M6812_OP_IDX | M6812_OP_IDX_1 | M6812_OP_IDX_2)
2073 && (operands[i].reg1 == REG_X
2074 || operands[i].reg1 == REG_Y
2075 || operands[i].reg1 == REG_SP
2076 || operands[i].reg1 == REG_PC))
2077 continue;
2078 if (i == 1 && format & M6812_OP_IDX_P2)
2079 continue;
2080 }
2081 if (mode & M6812_AUTO_INC_DEC)
2082 {
2083 if (i == 0
2084 && format & (M6812_OP_IDX | M6812_OP_IDX_1 |
2085 M6812_OP_IDX_2))
2086 continue;
2087 if (i == 1 && format & M6812_OP_IDX_P2)
2088 continue;
2089 }
2090 break;
2091 }
2092 match = i == nb_operands;
2093
2094 /* Operands are ok but an operand uses page 0 addressing mode
2095 while the insn supports abs-16 mode. Keep a reference to this
2096 insns in case there is no insn supporting page 0 addressing. */
2097 if (match && poss_indirect)
2098 {
2099 op_indirect = opcode;
2100 match = 0;
2101 }
2102 if (match)
2103 break;
2104 }
2105
2106 /* Page 0 addressing is used but not supported by any insn.
2107 If absolute addresses are supported, we use that insn. */
2108 if (match == 0 && op_indirect)
2109 {
2110 opcode = op_indirect;
2111 match = 1;
2112 }
2113
2114 if (!match)
2115 {
2116 return (0);
2117 }
2118
2119 return opcode;
2120 }
2121
2122 /* Find the real opcode and its associated operands. We use a progressive
2123 approach here. On entry, 'opc' points to the first opcode in the
2124 table that matches the opcode name in the source line. We try to
2125 isolate an operand, find a possible match in the opcode table.
2126 We isolate another operand if no match were found. The table 'operands'
2127 is filled while operands are recognized.
2128
2129 Returns the opcode pointer that matches the opcode name in the
2130 source line and the associated operands. */
2131 static struct m68hc11_opcode *
2132 find_opcode (opc, operands, nb_operands)
2133 struct m68hc11_opcode_def *opc;
2134 operand operands[];
2135 int *nb_operands;
2136 {
2137 struct m68hc11_opcode *opcode;
2138 int i;
2139
2140 if (opc->max_operands == 0)
2141 {
2142 *nb_operands = 0;
2143 return opc->opcode;
2144 }
2145
2146 for (i = 0; i < opc->max_operands;)
2147 {
2148 int result;
2149
2150 result = get_operand (&operands[i], i, opc->format);
2151 if (result <= 0)
2152 return 0;
2153
2154 /* Special case where the bitmask of the bclr/brclr
2155 instructions is not introduced by #.
2156 Example: bclr 3,x $80. */
2157 if (i == 1 && (opc->format & M6811_OP_BITMASK)
2158 && (operands[i].mode & M6811_OP_IND16))
2159 {
2160 operands[i].mode = M6811_OP_IMM16;
2161 }
2162
2163 i += result;
2164 *nb_operands = i;
2165 if (i >= opc->min_operands)
2166 {
2167 opcode = find (opc, operands, i);
2168 if (opcode)
2169 return opcode;
2170 }
2171
2172 if (*input_line_pointer == ',')
2173 input_line_pointer++;
2174 }
2175
2176 return 0;
2177 }
2178
2179 #define M6812_XBCC_MARKER (M6812_OP_TBCC_MARKER \
2180 | M6812_OP_DBCC_MARKER \
2181 | M6812_OP_IBCC_MARKER)
2182 \f
2183 /* Gas line assembler entry point. */
2184
2185 /* This is the main entry point for the machine-dependent assembler. str
2186 points to a machine-dependent instruction. This function is supposed to
2187 emit the frags/bytes it assembles to. */
2188 void
2189 md_assemble (str)
2190 char *str;
2191 {
2192 struct m68hc11_opcode_def *opc;
2193 struct m68hc11_opcode *opcode;
2194
2195 unsigned char *op_start, *save;
2196 unsigned char *op_end;
2197 char name[20];
2198 int nlen = 0;
2199 operand operands[M6811_MAX_OPERANDS];
2200 int nb_operands;
2201 int branch_optimize = 0;
2202 int alias_id = -1;
2203
2204 /* Drop leading whitespace. */
2205 while (*str == ' ')
2206 str++;
2207
2208 /* Find the opcode end and get the opcode in 'name'. The opcode is forced
2209 lower case (the opcode table only has lower case op-codes). */
2210 for (op_start = op_end = (unsigned char *) (str);
2211 *op_end && nlen < 20 && !is_end_of_line[*op_end] && *op_end != ' ';
2212 op_end++)
2213 {
2214 name[nlen] = tolower (op_start[nlen]);
2215 nlen++;
2216 }
2217 name[nlen] = 0;
2218
2219 if (nlen == 0)
2220 {
2221 as_bad (_("No instruction or missing opcode."));
2222 return;
2223 }
2224
2225 /* Find the opcode definition given its name. */
2226 opc = (struct m68hc11_opcode_def *) hash_find (m68hc11_hash, name);
2227
2228 /* If it's not recognized, look for 'jbsr' and 'jbxx'. These are
2229 pseudo insns for relative branch. For these branchs, we always
2230 optimize them (turned into absolute branchs) even if --short-branchs
2231 is given. */
2232 if (opc == NULL && name[0] == 'j' && name[1] == 'b')
2233 {
2234 opc = (struct m68hc11_opcode_def *) hash_find (m68hc11_hash, &name[1]);
2235 if (opc
2236 && (!(opc->format & M6811_OP_JUMP_REL)
2237 || (opc->format & M6811_OP_BITMASK)))
2238 opc = 0;
2239 if (opc)
2240 branch_optimize = 1;
2241 }
2242
2243 /* The following test should probably be removed. This is not conform
2244 to Motorola assembler specs. */
2245 if (opc == NULL && flag_mri)
2246 {
2247 if (*op_end == ' ' || *op_end == '\t')
2248 {
2249 while (*op_end == ' ' || *op_end == '\t')
2250 op_end++;
2251
2252 if (nlen < 19
2253 && (*op_end &&
2254 (is_end_of_line[op_end[1]]
2255 || op_end[1] == ' ' || op_end[1] == '\t'
2256 || !isalnum (op_end[1])))
2257 && (*op_end == 'a' || *op_end == 'b'
2258 || *op_end == 'A' || *op_end == 'B'
2259 || *op_end == 'd' || *op_end == 'D'
2260 || *op_end == 'x' || *op_end == 'X'
2261 || *op_end == 'y' || *op_end == 'Y'))
2262 {
2263 name[nlen++] = tolower (*op_end++);
2264 name[nlen] = 0;
2265 opc = (struct m68hc11_opcode_def *) hash_find (m68hc11_hash,
2266 name);
2267 }
2268 }
2269 }
2270
2271 /* Identify a possible instruction alias. There are some on the
2272 68HC12 to emulate a fiew 68HC11 instructions. */
2273 if (opc == NULL && (current_architecture & cpu6812))
2274 {
2275 int i;
2276
2277 for (i = 0; i < m68hc12_num_alias; i++)
2278 if (strcmp (m68hc12_alias[i].name, name) == 0)
2279 {
2280 alias_id = i;
2281 break;
2282 }
2283 }
2284 if (opc == NULL && alias_id < 0)
2285 {
2286 as_bad (_("Opcode `%s' is not recognized."), name);
2287 return;
2288 }
2289 save = input_line_pointer;
2290 input_line_pointer = op_end;
2291
2292 if (opc)
2293 {
2294 opc->used++;
2295 opcode = find_opcode (opc, operands, &nb_operands);
2296 }
2297 else
2298 opcode = 0;
2299
2300 if ((opcode || alias_id >= 0) && !flag_mri)
2301 {
2302 char *p = input_line_pointer;
2303
2304 while (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r')
2305 p++;
2306
2307 if (*p != '\n' && *p)
2308 as_bad (_("Garbage at end of instruction: `%s'."), p);
2309 }
2310
2311 input_line_pointer = save;
2312
2313 if (alias_id >= 0)
2314 {
2315 char *f = m68hc11_new_insn (m68hc12_alias[alias_id].size);
2316
2317 number_to_chars_bigendian (f, m68hc12_alias[alias_id].code1, 1);
2318 if (m68hc12_alias[alias_id].size > 1)
2319 number_to_chars_bigendian (f + 1, m68hc12_alias[alias_id].code2, 1);
2320
2321 return;
2322 }
2323
2324 /* Opcode is known but does not have valid operands. Print out the
2325 syntax for this opcode. */
2326 if (opcode == 0)
2327 {
2328 if (flag_print_insn_syntax)
2329 print_insn_format (name);
2330
2331 as_bad (_("Invalid operand for `%s'"), name);
2332 return;
2333 }
2334
2335 /* Treat dbeq/ibeq/tbeq instructions in a special way. The branch is
2336 relative and must be in the range -256..255 (9-bits). */
2337 if ((opcode->format & M6812_XBCC_MARKER)
2338 && (opcode->format & M6811_OP_JUMP_REL))
2339 build_dbranch_insn (opcode, operands, nb_operands);
2340
2341 /* Relative jumps instructions are taken care of separately. We have to make
2342 sure that the relative branch is within the range -128..127. If it's out
2343 of range, the instructions are changed into absolute instructions.
2344 This is not supported for the brset and brclr instructions. */
2345 else if ((opcode->format & (M6811_OP_JUMP_REL | M6812_OP_JUMP_REL16))
2346 && !(opcode->format & M6811_OP_BITMASK))
2347 build_jump_insn (opcode, operands, nb_operands, branch_optimize);
2348 else
2349 build_insn (opcode, operands, nb_operands);
2350 }
2351 \f
2352 /* Relocation, relaxation and frag conversions. */
2353 long
2354 md_pcrel_from_section (fixp, sec)
2355 fixS *fixp;
2356 segT sec;
2357 {
2358 int adjust;
2359 if (fixp->fx_addsy != (symbolS *) NULL
2360 && (!S_IS_DEFINED (fixp->fx_addsy)
2361 || (S_GET_SEGMENT (fixp->fx_addsy) != sec)))
2362 return 0;
2363
2364 adjust = fixp->fx_pcrel_adjust;
2365 return fixp->fx_frag->fr_address + fixp->fx_where + adjust;
2366 }
2367
2368 /* If while processing a fixup, a reloc really needs to be created
2369 then it is done here. */
2370 arelent *
2371 tc_gen_reloc (section, fixp)
2372 asection *section;
2373 fixS *fixp;
2374 {
2375 arelent *reloc;
2376
2377 reloc = (arelent *) xmalloc (sizeof (arelent));
2378 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
2379 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2380 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
2381 if (fixp->fx_r_type == 0)
2382 reloc->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_16);
2383 else
2384 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
2385 if (reloc->howto == (reloc_howto_type *) NULL)
2386 {
2387 as_bad_where (fixp->fx_file, fixp->fx_line,
2388 _("Relocation %d is not supported by object file format."),
2389 (int) fixp->fx_r_type);
2390 return NULL;
2391 }
2392
2393 if (!fixp->fx_pcrel)
2394 reloc->addend = fixp->fx_addnumber;
2395 else
2396 reloc->addend = (section->vma
2397 + (fixp->fx_pcrel_adjust == 64
2398 ? -1 : fixp->fx_pcrel_adjust)
2399 + fixp->fx_addnumber
2400 + md_pcrel_from_section (fixp, section));
2401 return reloc;
2402 }
2403
2404 void
2405 md_convert_frag (abfd, sec, fragP)
2406 bfd *abfd ATTRIBUTE_UNUSED;
2407 asection *sec ATTRIBUTE_UNUSED;
2408 fragS *fragP;
2409 {
2410 fixS *fixp;
2411 long disp;
2412 char *buffer_address = fragP->fr_literal;
2413
2414 /* Address in object code of the displacement. */
2415 register int object_address = fragP->fr_fix + fragP->fr_address;
2416
2417 buffer_address += fragP->fr_fix;
2418
2419 /* The displacement of the address, from current location. */
2420 disp = fragP->fr_symbol ? S_GET_VALUE (fragP->fr_symbol) : 0;
2421 disp = (disp + fragP->fr_offset) - object_address;
2422 disp += symbol_get_frag (fragP->fr_symbol)->fr_address;
2423
2424 switch (fragP->fr_subtype)
2425 {
2426 case ENCODE_RELAX (STATE_PC_RELATIVE, STATE_BYTE):
2427 fragP->fr_opcode[1] = disp;
2428 break;
2429
2430 case ENCODE_RELAX (STATE_PC_RELATIVE, STATE_WORD):
2431 /* This relax is only for bsr and bra. */
2432 assert (IS_OPCODE (fragP->fr_opcode[0], M6811_BSR)
2433 || IS_OPCODE (fragP->fr_opcode[0], M6811_BRA)
2434 || IS_OPCODE (fragP->fr_opcode[0], M6812_BSR));
2435
2436 fragP->fr_opcode[0] = convert_branch (fragP->fr_opcode[0]);
2437
2438 fix_new (fragP, fragP->fr_fix - 1, 2,
2439 fragP->fr_symbol, fragP->fr_offset, 0, BFD_RELOC_16);
2440 fragP->fr_fix += 1;
2441 break;
2442
2443 case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_BYTE):
2444 case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH_6812, STATE_BYTE):
2445 fragP->fr_opcode[1] = disp;
2446 break;
2447
2448 case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_WORD):
2449 /* Invert branch. */
2450 fragP->fr_opcode[0] ^= 1;
2451 fragP->fr_opcode[1] = 3; /* Branch offset. */
2452 buffer_address[0] = M6811_JMP;
2453 fix_new (fragP, fragP->fr_fix + 1, 2,
2454 fragP->fr_symbol, fragP->fr_offset, 0, BFD_RELOC_16);
2455 fragP->fr_fix += 3;
2456 break;
2457
2458 case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH_6812, STATE_WORD):
2459 /* Translate branch into a long branch. */
2460 fragP->fr_opcode[1] = fragP->fr_opcode[0];
2461 fragP->fr_opcode[0] = M6811_OPCODE_PAGE2;
2462
2463 fixp = fix_new (fragP, fragP->fr_fix, 2,
2464 fragP->fr_symbol, fragP->fr_offset, 1,
2465 BFD_RELOC_16_PCREL);
2466 fixp->fx_pcrel_adjust = 2;
2467 fragP->fr_fix += 2;
2468 break;
2469
2470 case ENCODE_RELAX (STATE_INDEXED_OFFSET, STATE_BITS5):
2471 fragP->fr_opcode[0] = fragP->fr_opcode[0] << 5;
2472 fragP->fr_opcode[0] |= disp & 0x1f;
2473 break;
2474
2475 case ENCODE_RELAX (STATE_INDEXED_OFFSET, STATE_BITS9):
2476 fragP->fr_opcode[0] = (fragP->fr_opcode[0] << 3);
2477 fragP->fr_opcode[0] |= 0xE0;
2478 fix_new (fragP, fragP->fr_fix + 1, 1,
2479 fragP->fr_symbol, fragP->fr_offset, 0, BFD_RELOC_8);
2480 fragP->fr_fix += 1;
2481 break;
2482
2483 case ENCODE_RELAX (STATE_INDEXED_OFFSET, STATE_BITS16):
2484 fragP->fr_opcode[0] = (fragP->fr_opcode[0] << 3);
2485 fragP->fr_opcode[0] |= 0xE2;
2486 fix_new (fragP, fragP->fr_fix, 2,
2487 fragP->fr_symbol, fragP->fr_offset, 0, BFD_RELOC_16);
2488 fragP->fr_fix += 1;
2489 break;
2490
2491 case ENCODE_RELAX (STATE_XBCC_BRANCH, STATE_BYTE):
2492 if (disp < 0)
2493 fragP->fr_opcode[0] |= 0x10;
2494
2495 fragP->fr_opcode[1] = disp & 0x0FF;
2496 break;
2497
2498 case ENCODE_RELAX (STATE_XBCC_BRANCH, STATE_WORD):
2499 /* Invert branch. */
2500 fragP->fr_opcode[0] ^= 0x20;
2501 fragP->fr_opcode[1] = 3; /* Branch offset. */
2502 buffer_address[0] = M6812_JMP;
2503 fix_new (fragP, fragP->fr_fix + 1, 2,
2504 fragP->fr_symbol, fragP->fr_offset, 0, BFD_RELOC_16);
2505 fragP->fr_fix += 3;
2506 break;
2507
2508 default:
2509 break;
2510 }
2511 }
2512
2513 /* Force truly undefined symbols to their maximum size, and generally set up
2514 the frag list to be relaxed. */
2515 int
2516 md_estimate_size_before_relax (fragP, segment)
2517 fragS *fragP;
2518 asection *segment;
2519 {
2520 int old_fr_fix;
2521 char *buffer_address = fragP->fr_fix + fragP->fr_literal;
2522
2523 old_fr_fix = fragP->fr_fix;
2524
2525 switch (fragP->fr_subtype)
2526 {
2527 case ENCODE_RELAX (STATE_PC_RELATIVE, STATE_UNDF):
2528
2529 /* This relax is only for bsr and bra. */
2530 assert (IS_OPCODE (fragP->fr_opcode[0], M6811_BSR)
2531 || IS_OPCODE (fragP->fr_opcode[0], M6811_BRA)
2532 || IS_OPCODE (fragP->fr_opcode[0], M6812_BSR));
2533
2534 /* A relaxable case. */
2535 if (S_GET_SEGMENT (fragP->fr_symbol) == segment)
2536 {
2537 fragP->fr_subtype = ENCODE_RELAX (STATE_PC_RELATIVE, STATE_BYTE);
2538 }
2539 else
2540 {
2541 if (flag_fixed_branchs)
2542 as_bad_where (fragP->fr_file, fragP->fr_line,
2543 _("bra or bsr with undefined symbol."));
2544
2545 /* The symbol is undefined or in a separate section. Turn bra into a
2546 jmp and bsr into a jsr. The insn becomes 3 bytes long (instead of
2547 2). A fixup is necessary for the unresolved symbol address. */
2548
2549 fragP->fr_opcode[0] = convert_branch (fragP->fr_opcode[0]);
2550
2551 fragP->fr_fix++;
2552 fix_new (fragP, old_fr_fix - 1, 2, fragP->fr_symbol,
2553 fragP->fr_offset, 0, BFD_RELOC_16);
2554 frag_wane (fragP);
2555 }
2556 break;
2557
2558 case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_UNDF):
2559 assert (current_architecture & cpu6811);
2560
2561 if (S_GET_SEGMENT (fragP->fr_symbol) == segment)
2562 {
2563 fragP->fr_subtype = ENCODE_RELAX (STATE_CONDITIONAL_BRANCH,
2564 STATE_BYTE);
2565 }
2566 else
2567 {
2568 fragP->fr_opcode[0] ^= 1; /* Reverse sense of branch. */
2569 fragP->fr_opcode[1] = 3; /* Skip next jmp insn (3 bytes). */
2570
2571 /* Don't use fr_opcode[2] because this may be
2572 in a different frag. */
2573 buffer_address[0] = M6811_JMP;
2574
2575 fragP->fr_fix++;
2576 fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
2577 fragP->fr_offset, 0, BFD_RELOC_16);
2578 fragP->fr_fix += 2;
2579 frag_wane (fragP);
2580 }
2581 break;
2582
2583 case ENCODE_RELAX (STATE_INDEXED_OFFSET, STATE_UNDF):
2584 assert (current_architecture & cpu6812);
2585
2586 if (S_GET_SEGMENT (fragP->fr_symbol) == segment)
2587 {
2588 fragP->fr_subtype = ENCODE_RELAX (STATE_INDEXED_OFFSET,
2589 STATE_BITS5);
2590 }
2591 else
2592 {
2593 /* Switch the indexed operation to 16-bit mode. */
2594 if ((fragP->fr_opcode[1] & 0x21) == 0x20)
2595 fragP->fr_opcode[1] = (fragP->fr_opcode[1] >> 3) | 0xc0 | 0x02;
2596
2597 fragP->fr_fix++;
2598 fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
2599 fragP->fr_offset, 0, BFD_RELOC_16);
2600 fragP->fr_fix += 2;
2601 frag_wane (fragP);
2602 }
2603 break;
2604
2605 case ENCODE_RELAX (STATE_XBCC_BRANCH, STATE_UNDF):
2606 assert (current_architecture & cpu6812);
2607
2608 if (S_GET_SEGMENT (fragP->fr_symbol) == segment)
2609 {
2610 fragP->fr_subtype = ENCODE_RELAX (STATE_XBCC_BRANCH, STATE_BYTE);
2611 }
2612 else
2613 {
2614 fragP->fr_opcode[0] ^= 0x20; /* Reverse sense of branch. */
2615 fragP->fr_opcode[1] = 3; /* Skip next jmp insn (3 bytes). */
2616
2617 /* Don't use fr_opcode[2] because this may be
2618 in a different frag. */
2619 buffer_address[0] = M6812_JMP;
2620
2621 fragP->fr_fix++;
2622 fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
2623 fragP->fr_offset, 0, BFD_RELOC_16);
2624 fragP->fr_fix += 2;
2625 frag_wane (fragP);
2626 }
2627 break;
2628
2629 case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH_6812, STATE_UNDF):
2630 assert (current_architecture & cpu6812);
2631
2632 if (S_GET_SEGMENT (fragP->fr_symbol) == segment)
2633 {
2634 fragP->fr_subtype = ENCODE_RELAX (STATE_CONDITIONAL_BRANCH_6812,
2635 STATE_BYTE);
2636 }
2637 else
2638 {
2639 /* Translate into a lbcc branch. */
2640 fragP->fr_opcode[1] = fragP->fr_opcode[0];
2641 fragP->fr_opcode[0] = M6811_OPCODE_PAGE2;
2642
2643 fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
2644 fragP->fr_offset, 0, BFD_RELOC_16_PCREL);
2645 fragP->fr_fix += 2;
2646 frag_wane (fragP);
2647 }
2648 break;
2649
2650 default:
2651 as_fatal (_("Subtype %d is not recognized."), fragP->fr_subtype);
2652 }
2653
2654 return (fragP->fr_fix - old_fr_fix);
2655 }
2656
2657 int
2658 md_apply_fix (fixp, valuep)
2659 fixS *fixp;
2660 valueT *valuep;
2661 {
2662 char *where;
2663 long value;
2664 int op_type;
2665
2666 if (fixp->fx_addsy == (symbolS *) NULL)
2667 {
2668 value = *valuep;
2669 fixp->fx_done = 1;
2670 }
2671 else if (fixp->fx_pcrel)
2672 {
2673 value = *valuep;
2674 }
2675 else
2676 {
2677 value = fixp->fx_offset;
2678 if (fixp->fx_subsy != (symbolS *) NULL)
2679 {
2680 if (S_GET_SEGMENT (fixp->fx_subsy) == absolute_section)
2681 {
2682 value -= S_GET_VALUE (fixp->fx_subsy);
2683 }
2684 else
2685 {
2686 /* We don't actually support subtracting a symbol. */
2687 as_bad_where (fixp->fx_file, fixp->fx_line,
2688 _("Expression too complex."));
2689 }
2690 }
2691 }
2692
2693 op_type = fixp->fx_r_type;
2694
2695 /* Patch the instruction with the resolved operand. Elf relocation
2696 info will also be generated to take care of linker/loader fixups.
2697 The 68HC11 addresses only 64Kb, we are only concerned by 8 and 16-bit
2698 relocs. BFD_RELOC_8 is basically used for .page0 access (the linker
2699 will warn for overflows). BFD_RELOC_8_PCREL should not be generated
2700 because it's either resolved or turned out into non-relative insns (see
2701 relax table, bcc, bra, bsr transformations)
2702
2703 The BFD_RELOC_32 is necessary for the support of --gstabs. */
2704 where = fixp->fx_frag->fr_literal + fixp->fx_where;
2705
2706 switch (fixp->fx_r_type)
2707 {
2708 case BFD_RELOC_32:
2709 bfd_putb32 ((bfd_vma) value, (unsigned char *) where);
2710 break;
2711
2712 case BFD_RELOC_16:
2713 case BFD_RELOC_16_PCREL:
2714 bfd_putb16 ((bfd_vma) value, (unsigned char *) where);
2715 if (value < -65537 || value > 65535)
2716 as_bad_where (fixp->fx_file, fixp->fx_line,
2717 _("Value out of 16-bit range."));
2718 break;
2719
2720 case BFD_RELOC_M68HC11_HI8:
2721 value = value >> 8;
2722 /* Fall through. */
2723
2724 case BFD_RELOC_M68HC11_LO8:
2725 case BFD_RELOC_8:
2726 #if 0
2727 bfd_putb8 ((bfd_vma) value, (unsigned char *) where);
2728 #endif
2729 ((bfd_byte *) where)[0] = (bfd_byte) value;
2730 break;
2731
2732 case BFD_RELOC_8_PCREL:
2733 #if 0
2734 bfd_putb8 ((bfd_vma) value, (unsigned char *) where);
2735 #endif
2736 ((bfd_byte *) where)[0] = (bfd_byte) value;
2737
2738 if (value < -128 || value > 127)
2739 as_bad_where (fixp->fx_file, fixp->fx_line,
2740 _("Value %ld too large for 8-bit PC-relative branch."),
2741 value);
2742 break;
2743
2744 case BFD_RELOC_M68HC11_3B:
2745 if (value <= 0 || value > 8)
2746 as_bad_where (fixp->fx_file, fixp->fx_line,
2747 _("Auto increment/decrement offset '%ld' is out of range."),
2748 value);
2749 if (where[0] & 0x8)
2750 value = 8 - value;
2751 else
2752 value--;
2753
2754 where[0] = where[0] | (value & 0x07);
2755 break;
2756
2757 default:
2758 as_fatal (_("Line %d: unknown relocation type: 0x%x."),
2759 fixp->fx_line, fixp->fx_r_type);
2760 }
2761
2762 return 0;
2763 }
2764
2765 int
2766 m68hc11_cleanup ()
2767 {
2768 return 1;
2769 }
This page took 0.089068 seconds and 4 git commands to generate.