* as.c (debug_type): Init to DEBUG_UNSPECIFIED.
[external/binutils.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 }