Fix gas 68HC12 indexed addressing code generation
[external/binutils.git] / gas / config / tc-m68hc11.c
1 /* tc-m68hc11.c -- Assembler code for the Motorola 68HC11 & 68HC12.
2    Copyright (C) 1999, 2000, 2001 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, 2, 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           int possible_mode = M6811_OP_NONE;
1077           char *old_input_line;
1078           p++;
1079
1080           /* 68HC12 pre increment or decrement.  */
1081           if (mode == M6811_OP_NONE)
1082             {
1083               if (*p == '-')
1084                 {
1085                   possible_mode = M6812_PRE_DEC;
1086                   p++;
1087                 }
1088               else if (*p == '+')
1089                 {
1090                   possible_mode = M6812_PRE_INC;
1091                   p++;
1092                 }
1093               p = skip_whites (p);
1094             }
1095           old_input_line = input_line_pointer;
1096           input_line_pointer = p;
1097           reg = register_name ();
1098
1099           /* Backtrack if we have a valid constant expression and
1100              it does not correspond to the offset of the 68HC12 indexed
1101              addressing mode (as in N,x).  */
1102           if (reg == REG_NONE && mode == M6811_OP_NONE
1103               && possible_mode != M6811_OP_NONE)
1104             {
1105               oper->mode = M6811_OP_IND16 | M6811_OP_JUMP_REL;
1106               input_line_pointer = skip_whites (old_input_line);
1107               return 1;
1108             }
1109
1110           if (possible_mode != M6811_OP_NONE)
1111             mode = possible_mode;
1112
1113           if ((current_architecture & cpu6811)
1114               && possible_mode != M6811_OP_NONE)
1115             as_bad (_("Pre-increment mode is not valid for 68HC11"));
1116           /* Backtrack.  */
1117           if (which == 0 && opmode & M6812_OP_IDX_P2
1118               && reg != REG_X && reg != REG_Y
1119               && reg != REG_PC && reg != REG_SP)
1120             {
1121               reg = REG_NONE;
1122               input_line_pointer = p;
1123             }
1124
1125           if (reg == REG_NONE && mode != M6811_OP_DIRECT
1126               && !(mode == M6811_OP_NONE && opmode & M6811_OP_IND16))
1127             {
1128               as_bad (_("Wrong register in register indirect mode."));
1129               return -1;
1130             }
1131           if (mode == M6812_OP_IDX_2)
1132             {
1133               p = skip_whites (input_line_pointer);
1134               if (*p++ != ']')
1135                 {
1136                   as_bad (_("Missing `]' to close register indirect operand."));
1137                   return -1;
1138                 }
1139               input_line_pointer = p;
1140             }
1141           if (reg != REG_NONE)
1142             {
1143               oper->reg1 = reg;
1144               if (mode == M6811_OP_NONE)
1145                 {
1146                   p = input_line_pointer;
1147                   if (*p == '-')
1148                     {
1149                       mode = M6812_POST_DEC;
1150                       p++;
1151                       if (current_architecture & cpu6811)
1152                         as_bad
1153                           (_("Post-decrement mode is not valid for 68HC11."));
1154                     }
1155                   else if (*p == '+')
1156                     {
1157                       mode = M6812_POST_INC;
1158                       p++;
1159                       if (current_architecture & cpu6811)
1160                         as_bad
1161                           (_("Post-increment mode is not valid for 68HC11."));
1162                     }
1163                   else
1164                     mode = M6812_OP_IDX;
1165
1166                   input_line_pointer = p;
1167                 }
1168               else
1169                 mode |= M6812_OP_IDX;
1170
1171               oper->mode = mode;
1172               return 1;
1173             }
1174         }
1175
1176       if (mode == M6812_OP_D_IDX_2)
1177         {
1178           as_bad (_("Invalid indexed indirect mode."));
1179           return -1;
1180         }
1181     }
1182
1183   /* If the mode is not known until now, this is either a label
1184      or an indirect address.  */
1185   if (mode == M6811_OP_NONE)
1186     mode = M6811_OP_IND16 | M6811_OP_JUMP_REL;
1187
1188   p = input_line_pointer;
1189   while (*p == ' ' || *p == '\t')
1190     p++;
1191   input_line_pointer = p;
1192   oper->mode = mode;
1193
1194   return 1;
1195 }
1196
1197 #define M6812_AUTO_INC_DEC (M6812_PRE_INC | M6812_PRE_DEC \
1198                             | M6812_POST_INC | M6812_POST_DEC)
1199
1200 /* Checks that the number 'num' fits for a given mode.  */
1201 static int
1202 check_range (num, mode)
1203      long num;
1204      int mode;
1205 {
1206   /* Auto increment and decrement are ok for [-8..8] without 0.  */
1207   if (mode & M6812_AUTO_INC_DEC)
1208     return (num != 0 && num <= 8 && num >= -8);
1209
1210   /* The 68HC12 supports 5, 9 and 16-bits offsets.  */
1211   if (mode & (M6812_INDEXED_IND | M6812_INDEXED | M6812_OP_IDX))
1212     mode = M6811_OP_IND16;
1213
1214   if (mode & M6812_OP_JUMP_REL16)
1215     mode = M6811_OP_IND16;
1216
1217   switch (mode)
1218     {
1219     case M6811_OP_IX:
1220     case M6811_OP_IY:
1221     case M6811_OP_DIRECT:
1222       return (num >= 0 && num <= 255) ? 1 : 0;
1223
1224     case M6811_OP_BITMASK:
1225     case M6811_OP_IMM8:
1226       return (((num & 0xFFFFFF00) == 0) || ((num & 0xFFFFFF00) == 0xFFFFFF00))
1227         ? 1 : 0;
1228
1229     case M6811_OP_JUMP_REL:
1230       return (num >= -128 && num <= 127) ? 1 : 0;
1231
1232     case M6811_OP_IND16:
1233     case M6811_OP_IMM16:
1234       return (((num & 0xFFFF0000) == 0) || ((num & 0xFFFF0000) == 0xFFFF0000))
1235         ? 1 : 0;
1236
1237     case M6812_OP_IBCC_MARKER:
1238     case M6812_OP_TBCC_MARKER:
1239     case M6812_OP_DBCC_MARKER:
1240       return (num >= -256 && num <= 255) ? 1 : 0;
1241
1242     case M6812_OP_TRAP_ID:
1243       return ((num >= 0x30 && num <= 0x39)
1244               || (num >= 0x40 && num <= 0x0ff)) ? 1 : 0;
1245
1246     default:
1247       return 0;
1248     }
1249 }
1250 \f
1251 /* Gas fixup generation.  */
1252
1253 /* Put a 1 byte expression described by 'oper'.  If this expression contains
1254    unresolved symbols, generate an 8-bit fixup.  */
1255 static void
1256 fixup8 (oper, mode, opmode)
1257      expressionS *oper;
1258      int mode;
1259      int opmode;
1260 {
1261   char *f;
1262
1263   f = frag_more (1);
1264
1265   if (oper->X_op == O_constant)
1266     {
1267       if (mode & M6812_OP_TRAP_ID
1268           && !check_range (oper->X_add_number, M6812_OP_TRAP_ID))
1269         {
1270           static char trap_id_warn_once = 0;
1271
1272           as_bad (_("Trap id `%ld' is out of range."), oper->X_add_number);
1273           if (trap_id_warn_once == 0)
1274             {
1275               trap_id_warn_once = 1;
1276               as_bad (_("Trap id must be within [0x30..0x39] or [0x40..0xff]."));
1277             }
1278         }
1279
1280       if (!(mode & M6812_OP_TRAP_ID)
1281           && !check_range (oper->X_add_number, mode))
1282         {
1283           as_bad (_("Operand out of 8-bit range: `%ld'."), oper->X_add_number);
1284         }
1285       number_to_chars_bigendian (f, oper->X_add_number & 0x0FF, 1);
1286     }
1287   else if (oper->X_op != O_register)
1288     {
1289       if (mode & M6812_OP_TRAP_ID)
1290         as_bad (_("The trap id must be a constant."));
1291
1292       if (mode == M6811_OP_JUMP_REL)
1293         {
1294           fixS *fixp;
1295
1296           fixp = fix_new_exp (frag_now, f - frag_now->fr_literal, 1,
1297                               oper, true, BFD_RELOC_8_PCREL);
1298           fixp->fx_pcrel_adjust = 1;
1299         }
1300       else
1301         {
1302           /* Now create an 8-bit fixup.  If there was some %hi or %lo
1303              modifier, generate the reloc accordingly.  */
1304           fix_new_exp (frag_now, f - frag_now->fr_literal, 1,
1305                        oper, false,
1306                        ((opmode & M6811_OP_HIGH_ADDR)
1307                         ? BFD_RELOC_M68HC11_HI8
1308                         : ((opmode & M6811_OP_LOW_ADDR)
1309                            ? BFD_RELOC_M68HC11_LO8 : BFD_RELOC_8)));
1310         }
1311       number_to_chars_bigendian (f, 0, 1);
1312     }
1313   else
1314     {
1315       as_fatal (_("Operand `%x' not recognized in fixup8."), oper->X_op);
1316     }
1317 }
1318
1319 /* Put a 2 bytes expression described by 'oper'.  If this expression contains
1320    unresolved symbols, generate a 16-bit fixup.  */
1321 static void
1322 fixup16 (oper, mode, opmode)
1323      expressionS *oper;
1324      int mode;
1325      int opmode ATTRIBUTE_UNUSED;
1326 {
1327   char *f;
1328
1329   f = frag_more (2);
1330
1331   if (oper->X_op == O_constant)
1332     {
1333       if (!check_range (oper->X_add_number, mode))
1334         {
1335           as_bad (_("Operand out of 16-bit range: `%ld'."),
1336                   oper->X_add_number);
1337         }
1338       number_to_chars_bigendian (f, oper->X_add_number & 0x0FFFF, 2);
1339     }
1340   else if (oper->X_op != O_register)
1341     {
1342       fixS *fixp;
1343
1344       /* Now create a 16-bit fixup.  */
1345       fixp = fix_new_exp (frag_now, f - frag_now->fr_literal, 2,
1346                           oper,
1347                           (mode & M6812_OP_JUMP_REL16 ? true : false),
1348                           (mode & M6812_OP_JUMP_REL16
1349                            ? BFD_RELOC_16_PCREL : BFD_RELOC_16));
1350       number_to_chars_bigendian (f, 0, 2);
1351       if (mode & M6812_OP_JUMP_REL16)
1352         fixp->fx_pcrel_adjust = 2;
1353     }
1354   else
1355     {
1356       as_fatal (_("Operand `%x' not recognized in fixup16."), oper->X_op);
1357     }
1358 }
1359 \f
1360 /* 68HC11 and 68HC12 code generation.  */
1361
1362 /* Translate the short branch/bsr instruction into a long branch.  */
1363 static unsigned char
1364 convert_branch (code)
1365      unsigned char code;
1366 {
1367   if (IS_OPCODE (code, M6812_BSR))
1368     return M6812_JSR;
1369   else if (IS_OPCODE (code, M6811_BSR))
1370     return M6811_JSR;
1371   else if (IS_OPCODE (code, M6811_BRA))
1372     return (current_architecture & cpu6812) ? M6812_JMP : M6811_JMP;
1373   else
1374     as_fatal (_("Unexpected branch conversion with `%x'"), code);
1375
1376   /* Keep gcc happy.  */
1377   return M6811_JSR;
1378 }
1379
1380 /* Start a new insn that contains at least 'size' bytes.  Record the
1381    line information of that insn in the dwarf2 debug sections.  */
1382 static char *
1383 m68hc11_new_insn (size)
1384      int size;
1385 {
1386   char *f;
1387
1388   f = frag_more (size);
1389
1390   dwarf2_emit_insn (size);
1391
1392   return f;
1393 }
1394
1395 /* Builds a jump instruction (bra, bcc, bsr).  */
1396 static void
1397 build_jump_insn (opcode, operands, nb_operands, jmp_mode)
1398      struct m68hc11_opcode *opcode;
1399      operand operands[];
1400      int nb_operands;
1401      int jmp_mode;
1402 {
1403   unsigned char code;
1404   int insn_size;
1405   char *f;
1406   unsigned long n;
1407
1408   /* The relative branch convertion is not supported for
1409      brclr and brset.  */
1410   assert ((opcode->format & M6811_OP_BITMASK) == 0);
1411   assert (nb_operands == 1);
1412   assert (operands[0].reg1 == REG_NONE && operands[0].reg2 == REG_NONE);
1413
1414   code = opcode->opcode;
1415   insn_size = 1;
1416
1417   n = operands[0].exp.X_add_number;
1418
1419   /* Turn into a long branch:
1420      - when force long branch option (and not for jbcc pseudos),
1421      - when jbcc and the constant is out of -128..127 range,
1422      - when branch optimization is allowed and branch out of range.  */
1423   if ((jmp_mode == 0 && flag_force_long_jumps)
1424       || (operands[0].exp.X_op == O_constant
1425           && (!check_range (n, opcode->format) &&
1426               (jmp_mode == 1 || flag_fixed_branchs == 0))))
1427     {
1428       if (code == M6811_BSR || code == M6811_BRA || code == M6812_BSR)
1429         {
1430           code = convert_branch (code);
1431
1432           f = m68hc11_new_insn (1);
1433           number_to_chars_bigendian (f, code, 1);
1434         }
1435       else if (current_architecture & cpu6812)
1436         {
1437           /* 68HC12: translate the bcc into a lbcc.  */
1438           f = m68hc11_new_insn (2);
1439           number_to_chars_bigendian (f, M6811_OPCODE_PAGE2, 1);
1440           number_to_chars_bigendian (f + 1, code, 1);
1441           fixup16 (&operands[0].exp, M6812_OP_JUMP_REL16,
1442                    M6812_OP_JUMP_REL16);
1443           return;
1444         }
1445       else
1446         {
1447           /* 68HC11: translate the bcc into b!cc +3; jmp <L>.  */
1448           f = m68hc11_new_insn (3);
1449           code ^= 1;
1450           number_to_chars_bigendian (f, code, 1);
1451           number_to_chars_bigendian (f + 1, 3, 1);
1452           number_to_chars_bigendian (f + 2, M6811_JMP, 1);
1453         }
1454       fixup16 (&operands[0].exp, M6811_OP_IND16, M6811_OP_IND16);
1455       return;
1456     }
1457
1458   /* Branch with a constant that must fit in 8-bits.  */
1459   if (operands[0].exp.X_op == O_constant)
1460     {
1461       if (!check_range (n, opcode->format))
1462         {
1463           as_bad (_("Operand out of range for a relative branch: `%ld'"),
1464                   n);
1465         }
1466       else if (opcode->format & M6812_OP_JUMP_REL16)
1467         {
1468           f = m68hc11_new_insn (4);
1469           number_to_chars_bigendian (f, M6811_OPCODE_PAGE2, 1);
1470           number_to_chars_bigendian (f + 1, code, 1);
1471           number_to_chars_bigendian (f + 2, n & 0x0ffff, 2);
1472         }
1473       else
1474         {
1475           f = m68hc11_new_insn (2);
1476           number_to_chars_bigendian (f, code, 1);
1477           number_to_chars_bigendian (f + 1, n & 0x0FF, 1);
1478         }
1479     }
1480   else if (opcode->format & M6812_OP_JUMP_REL16)
1481     {
1482       f = m68hc11_new_insn (2);
1483       number_to_chars_bigendian (f, M6811_OPCODE_PAGE2, 1);
1484       number_to_chars_bigendian (f + 1, code, 1);
1485       fixup16 (&operands[0].exp, M6812_OP_JUMP_REL16, M6812_OP_JUMP_REL16);
1486     }
1487   else
1488     {
1489       char *opcode;
1490
1491       /* Branch offset must fit in 8-bits, don't do some relax.  */
1492       if (jmp_mode == 0 && flag_fixed_branchs)
1493         {
1494           opcode = m68hc11_new_insn (1);
1495           number_to_chars_bigendian (opcode, code, 1);
1496           fixup8 (&operands[0].exp, M6811_OP_JUMP_REL, M6811_OP_JUMP_REL);
1497         }
1498
1499       /* bra/bsr made be changed into jmp/jsr.  */
1500       else if (code == M6811_BSR || code == M6811_BRA || code == M6812_BSR)
1501         {
1502           opcode = m68hc11_new_insn (2);
1503           number_to_chars_bigendian (opcode, code, 1);
1504           number_to_chars_bigendian (opcode + 1, 0, 1);
1505           frag_var (rs_machine_dependent, 2, 1,
1506                     ENCODE_RELAX (STATE_PC_RELATIVE, STATE_UNDF),
1507                     operands[0].exp.X_add_symbol, (offsetT) n, opcode);
1508         }
1509       else if (current_architecture & cpu6812)
1510         {
1511           opcode = m68hc11_new_insn (2);
1512           number_to_chars_bigendian (opcode, code, 1);
1513           number_to_chars_bigendian (opcode + 1, 0, 1);
1514           frag_var (rs_machine_dependent, 2, 2,
1515                     ENCODE_RELAX (STATE_CONDITIONAL_BRANCH_6812, STATE_UNDF),
1516                     operands[0].exp.X_add_symbol, (offsetT) n, opcode);
1517         }
1518       else
1519         {
1520           opcode = m68hc11_new_insn (2);
1521           number_to_chars_bigendian (opcode, code, 1);
1522           number_to_chars_bigendian (opcode + 1, 0, 1);
1523           frag_var (rs_machine_dependent, 3, 3,
1524                     ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_UNDF),
1525                     operands[0].exp.X_add_symbol, (offsetT) n, opcode);
1526         }
1527     }
1528 }
1529
1530 /* Builds a dbne/dbeq/tbne/tbeq instruction.  */
1531 static void
1532 build_dbranch_insn (opcode, operands, nb_operands, jmp_mode)
1533      struct m68hc11_opcode *opcode;
1534      operand operands[];
1535      int nb_operands;
1536      int jmp_mode;
1537 {
1538   unsigned char code;
1539   int insn_size;
1540   char *f;
1541   unsigned long n;
1542
1543   /* The relative branch convertion is not supported for
1544      brclr and brset.  */
1545   assert ((opcode->format & M6811_OP_BITMASK) == 0);
1546   assert (nb_operands == 2);
1547   assert (operands[0].reg1 != REG_NONE);
1548
1549   code = opcode->opcode & 0x0FF;
1550   insn_size = 1;
1551
1552   f = m68hc11_new_insn (1);
1553   number_to_chars_bigendian (f, code, 1);
1554
1555   n = operands[1].exp.X_add_number;
1556   code = operands[0].reg1;
1557
1558   if (operands[0].reg1 == REG_NONE || operands[0].reg1 == REG_CCR
1559       || operands[0].reg1 == REG_PC)
1560     as_bad (_("Invalid register for dbcc/tbcc instruction."));
1561
1562   if (opcode->format & M6812_OP_IBCC_MARKER)
1563     code |= 0x80;
1564   else if (opcode->format & M6812_OP_TBCC_MARKER)
1565     code |= 0x40;
1566
1567   if (!(opcode->format & M6812_OP_EQ_MARKER))
1568     code |= 0x20;
1569
1570   /* Turn into a long branch:
1571      - when force long branch option (and not for jbcc pseudos),
1572      - when jdbcc and the constant is out of -256..255 range,
1573      - when branch optimization is allowed and branch out of range.  */
1574   if ((jmp_mode == 0 && flag_force_long_jumps)
1575       || (operands[1].exp.X_op == O_constant
1576           && (!check_range (n, M6812_OP_IBCC_MARKER) &&
1577               (jmp_mode == 1 || flag_fixed_branchs == 0))))
1578     {
1579       f = frag_more (2);
1580       code ^= 0x20;
1581       number_to_chars_bigendian (f, code, 1);
1582       number_to_chars_bigendian (f + 1, M6812_JMP, 1);
1583       fixup16 (&operands[0].exp, M6811_OP_IND16, M6811_OP_IND16);
1584       return;
1585     }
1586
1587   /* Branch with a constant that must fit in 9-bits.  */
1588   if (operands[1].exp.X_op == O_constant)
1589     {
1590       if (!check_range (n, M6812_OP_IBCC_MARKER))
1591         {
1592           as_bad (_("Operand out of range for a relative branch: `%ld'"),
1593                   n);
1594         }
1595       else
1596         {
1597           if ((long) n < 0)
1598             code |= 0x10;
1599
1600           f = frag_more (2);
1601           number_to_chars_bigendian (f, code, 1);
1602           number_to_chars_bigendian (f + 1, n & 0x0FF, 1);
1603         }
1604     }
1605   else
1606     {
1607       /* Branch offset must fit in 8-bits, don't do some relax.  */
1608       if (jmp_mode == 0 && flag_fixed_branchs)
1609         {
1610           fixup8 (&operands[0].exp, M6811_OP_JUMP_REL, M6811_OP_JUMP_REL);
1611         }
1612
1613       else
1614         {
1615           f = frag_more (2);
1616           number_to_chars_bigendian (f, code, 1);
1617           number_to_chars_bigendian (f + 1, 0, 1);
1618           frag_var (rs_machine_dependent, 3, 3,
1619                     ENCODE_RELAX (STATE_XBCC_BRANCH, STATE_UNDF),
1620                     operands[1].exp.X_add_symbol, (offsetT) n, f);
1621         }
1622     }
1623 }
1624
1625 #define OP_EXTENDED (M6811_OP_PAGE2 | M6811_OP_PAGE3 | M6811_OP_PAGE4)
1626
1627 /* Assemble the post index byte for 68HC12 extended addressing modes.  */
1628 static int
1629 build_indexed_byte (op, format, move_insn)
1630      operand *op;
1631      int format ATTRIBUTE_UNUSED;
1632      int move_insn;
1633 {
1634   unsigned char byte = 0;
1635   char *f;
1636   int mode;
1637   long val;
1638
1639   val = op->exp.X_add_number;
1640   mode = op->mode;
1641   if (mode & M6812_AUTO_INC_DEC)
1642     {
1643       byte = 0x20;
1644       if (mode & (M6812_POST_INC | M6812_POST_DEC))
1645         byte |= 0x10;
1646
1647       if (op->exp.X_op == O_constant)
1648         {
1649           if (!check_range (val, mode))
1650             {
1651               as_bad (_("Increment/decrement value is out of range: `%ld'."),
1652                       val);
1653             }
1654           if (mode & (M6812_POST_INC | M6812_PRE_INC))
1655             byte |= (val - 1) & 0x07;
1656           else
1657             byte |= (8 - ((val) & 7)) | 0x8;
1658         }
1659       switch (op->reg1)
1660         {
1661         case REG_NONE:
1662           as_fatal (_("Expecting a register."));
1663
1664         case REG_X:
1665           byte |= 0;
1666           break;
1667
1668         case REG_Y:
1669           byte |= 0x40;
1670           break;
1671
1672         case REG_SP:
1673           byte |= 0x80;
1674           break;
1675
1676         default:
1677           as_bad (_("Invalid register for post/pre increment."));
1678           break;
1679         }
1680
1681       f = frag_more (1);
1682       number_to_chars_bigendian (f, byte, 1);
1683       return 1;
1684     }
1685
1686   if (mode & M6812_OP_IDX)
1687     {
1688       switch (op->reg1)
1689         {
1690         case REG_X:
1691           byte = 0;
1692           break;
1693
1694         case REG_Y:
1695           byte = 1;
1696           break;
1697
1698         case REG_SP:
1699           byte = 2;
1700           break;
1701
1702         case REG_PC:
1703           byte = 3;
1704           break;
1705
1706         default:
1707           as_bad (_("Invalid register."));
1708           break;
1709         }
1710       if (op->exp.X_op == O_constant)
1711         {
1712           if (!check_range (val, M6812_OP_IDX))
1713             {
1714               as_bad (_("Offset out of 16-bit range: %ld."), val);
1715             }
1716
1717           if (move_insn && !(val >= -16 && val <= 15))
1718             {
1719               as_bad (_("Offset out of 5-bit range for movw/movb insn: %ld."),
1720                       val);
1721               return -1;
1722             }
1723
1724           if (val >= -16 && val <= 15 && !(mode & M6812_OP_IDX_2))
1725             {
1726               byte = byte << 6;
1727               byte |= val & 0x1f;
1728               f = frag_more (1);
1729               number_to_chars_bigendian (f, byte, 1);
1730               return 1;
1731             }
1732           else if (val >= -256 && val <= 255 && !(mode & M6812_OP_IDX_2))
1733             {
1734               byte = byte << 3;
1735               byte |= 0xe0;
1736               if (val < 0)
1737                 byte |= 0x1;
1738               f = frag_more (2);
1739               number_to_chars_bigendian (f, byte, 1);
1740               number_to_chars_bigendian (f + 1, val & 0x0FF, 1);
1741               return 2;
1742             }
1743           else
1744             {
1745               byte = byte << 3;
1746               if (mode & M6812_OP_IDX_2)
1747                 byte |= 0xe3;
1748               else
1749                 byte |= 0xe2;
1750
1751               f = frag_more (3);
1752               number_to_chars_bigendian (f, byte, 1);
1753               number_to_chars_bigendian (f + 1, val & 0x0FFFF, 2);
1754               return 3;
1755             }
1756         }
1757       if (op->reg1 != REG_PC)
1758         {
1759           byte = (byte << 3) | 0xe2;
1760           f = frag_more (1);
1761           number_to_chars_bigendian (f, byte, 1);
1762
1763           f = frag_more (2);
1764           fix_new_exp (frag_now, f - frag_now->fr_literal, 2,
1765                        &op->exp, false, BFD_RELOC_16);
1766           number_to_chars_bigendian (f, 0, 2);
1767         }
1768       else
1769         {
1770           f = frag_more (1);
1771           number_to_chars_bigendian (f, byte, 1);
1772           frag_var (rs_machine_dependent, 2, 2,
1773                     ENCODE_RELAX (STATE_INDEXED_OFFSET, STATE_UNDF),
1774                     op->exp.X_add_symbol,
1775                     op->exp.X_add_number, f);
1776         }
1777       return 3;
1778     }
1779
1780   if (mode & M6812_OP_REG)
1781     {
1782       if (mode & M6812_OP_IDX_2)
1783         {
1784           if (op->reg1 != REG_D)
1785             as_bad (_("Expecting register D for indexed indirect mode."));
1786           if (move_insn)
1787             as_bad (_("Indexed indirect mode is not allowed for movb/movw."));
1788
1789           byte = 0xE7;
1790         }
1791       else
1792         {
1793           switch (op->reg1)
1794             {
1795             case REG_A:
1796               byte = 0xE4;
1797               break;
1798
1799             case REG_B:
1800               byte = 0xE5;
1801               break;
1802
1803             default:
1804               as_bad (_("Invalid accumulator register."));
1805
1806             case REG_D:
1807               byte = 0xE6;
1808               break;
1809             }
1810         }
1811       switch (op->reg2)
1812         {
1813         case REG_X:
1814           break;
1815
1816         case REG_Y:
1817           byte |= (1 << 3);
1818           break;
1819
1820         case REG_SP:
1821           byte |= (2 << 3);
1822           break;
1823
1824         case REG_PC:
1825           byte |= (3 << 3);
1826           break;
1827
1828         default:
1829           as_bad (_("Invalid indexed register."));
1830           break;
1831         }
1832       f = frag_more (1);
1833       number_to_chars_bigendian (f, byte, 1);
1834       return 1;
1835     }
1836
1837   as_fatal (_("Addressing mode not implemented yet."));
1838   return 0;
1839 }
1840
1841 /* Assemble the 68HC12 register mode byte.  */
1842 static int
1843 build_reg_mode (op, format)
1844      operand *op;
1845      int format;
1846 {
1847   unsigned char byte;
1848   char *f;
1849
1850   if (format & M6812_OP_SEX_MARKER
1851       && op->reg1 != REG_A && op->reg1 != REG_B && op->reg1 != REG_CCR)
1852     as_bad (_("Invalid source register for this instruction, use 'tfr'."));
1853   else if (op->reg1 == REG_NONE || op->reg1 == REG_PC)
1854     as_bad (_("Invalid source register."));
1855
1856   if (format & M6812_OP_SEX_MARKER
1857       && op->reg2 != REG_D
1858       && op->reg2 != REG_X && op->reg2 != REG_Y && op->reg2 != REG_SP)
1859     as_bad (_("Invalid destination register for this instruction, use 'tfr'."));
1860   else if (op->reg2 == REG_NONE || op->reg2 == REG_PC)
1861     as_bad (_("Invalid destination register."));
1862
1863   byte = (op->reg1 << 4) | (op->reg2);
1864   if (format & M6812_OP_EXG_MARKER)
1865     byte |= 0x80;
1866
1867   f = frag_more (1);
1868   number_to_chars_bigendian (f, byte, 1);
1869   return 1;
1870 }
1871
1872 /* build_insn takes a pointer to the opcode entry in the opcode table,
1873    the array of operand expressions and builds the correspding instruction.
1874    This operation only deals with non relative jumps insn (need special
1875    handling).  */
1876 static void
1877 build_insn (opcode, operands, nb_operands)
1878      struct m68hc11_opcode *opcode;
1879      operand operands[];
1880      int nb_operands ATTRIBUTE_UNUSED;
1881 {
1882   int i;
1883   char *f;
1884   int insn_size = 1;
1885   long format;
1886   int move_insn = 0;
1887
1888   /* Put the page code instruction if there is one.  */
1889   format = opcode->format;
1890   if (format & OP_EXTENDED)
1891     {
1892       int page_code;
1893
1894       f = m68hc11_new_insn (2);
1895       if (format & M6811_OP_PAGE2)
1896         page_code = M6811_OPCODE_PAGE2;
1897       else if (format & M6811_OP_PAGE3)
1898         page_code = M6811_OPCODE_PAGE3;
1899       else
1900         page_code = M6811_OPCODE_PAGE4;
1901
1902       number_to_chars_bigendian (f, page_code, 1);
1903       f++;
1904       insn_size = 2;
1905     }
1906   else
1907     f = m68hc11_new_insn (1);
1908
1909   number_to_chars_bigendian (f, opcode->opcode, 1);
1910
1911   i = 0;
1912
1913   /* The 68HC12 movb and movw instructions are special.  We have to handle
1914      them in a special way.  */
1915   if (format & (M6812_OP_IND16_P2 | M6812_OP_IDX_P2))
1916     {
1917       move_insn = 1;
1918       if (format & M6812_OP_IDX)
1919         {
1920           insn_size += build_indexed_byte (&operands[0], format, 1);
1921           i = 1;
1922           format &= ~M6812_OP_IDX;
1923         }
1924       if (format & M6812_OP_IDX_P2)
1925         {
1926           insn_size += build_indexed_byte (&operands[1], format, 1);
1927           i = 0;
1928           format &= ~M6812_OP_IDX_P2;
1929         }
1930     }
1931
1932   if (format & (M6811_OP_DIRECT | M6811_OP_IMM8))
1933     {
1934       insn_size++;
1935       fixup8 (&operands[i].exp,
1936               format & (M6811_OP_DIRECT | M6811_OP_IMM8 | M6812_OP_TRAP_ID),
1937               operands[i].mode);
1938       i++;
1939     }
1940   else if (format & (M6811_OP_IMM16 | M6811_OP_IND16))
1941     {
1942       insn_size += 2;
1943       fixup16 (&operands[i].exp, format & (M6811_OP_IMM16 | M6811_OP_IND16),
1944                operands[i].mode);
1945       i++;
1946     }
1947   else if (format & (M6811_OP_IX | M6811_OP_IY))
1948     {
1949       if ((format & M6811_OP_IX) && (operands[0].reg1 != REG_X))
1950         as_bad (_("Invalid indexed register, expecting register X."));
1951       if ((format & M6811_OP_IY) && (operands[0].reg1 != REG_Y))
1952         as_bad (_("Invalid indexed register, expecting register Y."));
1953
1954       insn_size++;
1955       fixup8 (&operands[0].exp, M6811_OP_IX, operands[0].mode);
1956       i = 1;
1957     }
1958   else if (format &
1959            (M6812_OP_IDX | M6812_OP_IDX_2 | M6812_OP_IDX_1 | M6812_OP_D_IDX))
1960     {
1961       insn_size += build_indexed_byte (&operands[i], format, move_insn);
1962       i++;
1963     }
1964   else if (format & M6812_OP_REG && current_architecture & cpu6812)
1965     {
1966       insn_size += build_reg_mode (&operands[i], format);
1967       i++;
1968     }
1969   if (format & M6811_OP_BITMASK)
1970     {
1971       insn_size++;
1972       fixup8 (&operands[i].exp, M6811_OP_BITMASK, operands[i].mode);
1973       i++;
1974     }
1975   if (format & M6811_OP_JUMP_REL)
1976     {
1977       insn_size++;
1978       fixup8 (&operands[i].exp, M6811_OP_JUMP_REL, operands[i].mode);
1979       i++;
1980     }
1981   else if (format & M6812_OP_IND16_P2)
1982     {
1983       insn_size += 2;
1984       fixup16 (&operands[1].exp, M6811_OP_IND16, operands[1].mode);
1985     }
1986 }
1987 \f
1988 /* Opcode identification and operand analysis.  */
1989
1990 /* find() gets a pointer to an entry in the opcode table.  It must look at all
1991    opcodes with the same name and use the operands to choose the correct
1992    opcode.  Returns the opcode pointer if there was a match and 0 if none.  */
1993 static struct m68hc11_opcode *
1994 find (opc, operands, nb_operands)
1995      struct m68hc11_opcode_def *opc;
1996      operand operands[];
1997      int nb_operands;
1998 {
1999   int i, match, pos;
2000   struct m68hc11_opcode *opcode;
2001   struct m68hc11_opcode *op_indirect;
2002
2003   op_indirect = 0;
2004   opcode = opc->opcode;
2005
2006   /* Now search the opcode table table for one with operands
2007      that matches what we've got.  We're only done if the operands matched so
2008      far AND there are no more to check.  */
2009   for (pos = match = 0; match == 0 && pos < opc->nb_modes; pos++, opcode++)
2010     {
2011       int poss_indirect = 0;
2012       long format = opcode->format;
2013       int expect;
2014
2015       expect = 0;
2016       if (opcode->format & M6811_OP_MASK)
2017         expect++;
2018       if (opcode->format & M6811_OP_BITMASK)
2019         expect++;
2020       if (opcode->format & (M6811_OP_JUMP_REL | M6812_OP_JUMP_REL16))
2021         expect++;
2022       if (opcode->format & (M6812_OP_IND16_P2 | M6812_OP_IDX_P2))
2023         expect++;
2024
2025       for (i = 0; expect == nb_operands && i < nb_operands; i++)
2026         {
2027           int mode = operands[i].mode;
2028
2029           if (mode & M6811_OP_IMM16)
2030             {
2031               if (format &
2032                   (M6811_OP_IMM8 | M6811_OP_IMM16 | M6811_OP_BITMASK))
2033                 continue;
2034               break;
2035             }
2036           if (mode == M6811_OP_DIRECT)
2037             {
2038               if (format & M6811_OP_DIRECT)
2039                 continue;
2040
2041               /* If the operand is a page 0 operand, remember a
2042                  possible <abs-16> addressing mode.  We mark
2043                  this and continue to check other operands.  */
2044               if (format & M6811_OP_IND16
2045                   && flag_strict_direct_addressing && op_indirect == 0)
2046                 {
2047                   poss_indirect = 1;
2048                   continue;
2049                 }
2050               break;
2051             }
2052           if (mode & M6811_OP_IND16)
2053             {
2054               if (i == 0 && (format & M6811_OP_IND16) != 0)
2055                 continue;
2056               if (i != 0 && (format & M6812_OP_IND16_P2) != 0)
2057                 continue;
2058               if (i == 0 && (format & M6811_OP_BITMASK))
2059                 break;
2060             }
2061           if (mode & (M6811_OP_JUMP_REL | M6812_OP_JUMP_REL16))
2062             {
2063               if (format & (M6811_OP_JUMP_REL | M6812_OP_JUMP_REL16))
2064                 continue;
2065             }
2066           if (mode & M6812_OP_REG)
2067             {
2068               if (i == 0
2069                   && (format & M6812_OP_REG)
2070                   && (operands[i].reg2 == REG_NONE))
2071                 continue;
2072               if (i == 0
2073                   && (format & M6812_OP_REG)
2074                   && (format & M6812_OP_REG_2)
2075                   && (operands[i].reg2 != REG_NONE))
2076                 continue;
2077               if (i == 0
2078                   && (format & M6812_OP_IDX)
2079                   && (operands[i].reg2 != REG_NONE))
2080                 continue;
2081               if (i == 0
2082                   && (format & M6812_OP_D_IDX))
2083                 continue;
2084               if (i == 0
2085                   && (format & M6812_OP_IDX)
2086                   && (format & (M6812_OP_IND16_P2 | M6812_OP_IDX_P2)))
2087                 continue;
2088               if (i == 1
2089                   && (format & M6812_OP_IDX_P2))
2090                 continue;
2091               break;
2092             }
2093           if (mode & M6812_OP_IDX)
2094             {
2095               if (format & M6811_OP_IX && operands[i].reg1 == REG_X)
2096                 continue;
2097               if (format & M6811_OP_IY && operands[i].reg1 == REG_Y)
2098                 continue;
2099               if (i == 0
2100                   && format & (M6812_OP_IDX | M6812_OP_IDX_1 | M6812_OP_IDX_2)
2101                   && (operands[i].reg1 == REG_X
2102                       || operands[i].reg1 == REG_Y
2103                       || operands[i].reg1 == REG_SP
2104                       || operands[i].reg1 == REG_PC))
2105                 continue;
2106               if (i == 1 && format & M6812_OP_IDX_P2)
2107                 continue;
2108             }
2109           if (mode & M6812_AUTO_INC_DEC)
2110             {
2111               if (i == 0
2112                   && format & (M6812_OP_IDX | M6812_OP_IDX_1 |
2113                                M6812_OP_IDX_2))
2114                 continue;
2115               if (i == 1 && format & M6812_OP_IDX_P2)
2116                 continue;
2117             }
2118           break;
2119         }
2120       match = i == nb_operands;
2121
2122       /* Operands are ok but an operand uses page 0 addressing mode
2123          while the insn supports abs-16 mode.  Keep a reference to this
2124          insns in case there is no insn supporting page 0 addressing.  */
2125       if (match && poss_indirect)
2126         {
2127           op_indirect = opcode;
2128           match = 0;
2129         }
2130       if (match)
2131         break;
2132     }
2133
2134   /* Page 0 addressing is used but not supported by any insn.
2135      If absolute addresses are supported, we use that insn.  */
2136   if (match == 0 && op_indirect)
2137     {
2138       opcode = op_indirect;
2139       match = 1;
2140     }
2141
2142   if (!match)
2143     {
2144       return (0);
2145     }
2146
2147   return opcode;
2148 }
2149
2150 /* Find the real opcode and its associated operands.  We use a progressive
2151    approach here.  On entry, 'opc' points to the first opcode in the
2152    table that matches the opcode name in the source line.  We try to
2153    isolate an operand, find a possible match in the opcode table.
2154    We isolate another operand if no match were found.  The table 'operands'
2155    is filled while operands are recognized.
2156
2157    Returns the opcode pointer that matches the opcode name in the
2158    source line and the associated operands.  */
2159 static struct m68hc11_opcode *
2160 find_opcode (opc, operands, nb_operands)
2161      struct m68hc11_opcode_def *opc;
2162      operand operands[];
2163      int *nb_operands;
2164 {
2165   struct m68hc11_opcode *opcode;
2166   int i;
2167
2168   if (opc->max_operands == 0)
2169     {
2170       *nb_operands = 0;
2171       return opc->opcode;
2172     }
2173
2174   for (i = 0; i < opc->max_operands;)
2175     {
2176       int result;
2177
2178       result = get_operand (&operands[i], i, opc->format);
2179       if (result <= 0)
2180         return 0;
2181
2182       /* Special case where the bitmask of the bclr/brclr
2183          instructions is not introduced by #.
2184          Example: bclr 3,x $80.  */
2185       if (i == 1 && (opc->format & M6811_OP_BITMASK)
2186           && (operands[i].mode & M6811_OP_IND16))
2187         {
2188           operands[i].mode = M6811_OP_IMM16;
2189         }
2190
2191       i += result;
2192       *nb_operands = i;
2193       if (i >= opc->min_operands)
2194         {
2195           opcode = find (opc, operands, i);
2196           if (opcode)
2197             return opcode;
2198         }
2199
2200       if (*input_line_pointer == ',')
2201         input_line_pointer++;
2202     }
2203
2204   return 0;
2205 }
2206
2207 #define M6812_XBCC_MARKER (M6812_OP_TBCC_MARKER \
2208                            | M6812_OP_DBCC_MARKER \
2209                            | M6812_OP_IBCC_MARKER)
2210 \f
2211 /* Gas line assembler entry point.  */
2212
2213 /* This is the main entry point for the machine-dependent assembler.  str
2214    points to a machine-dependent instruction.  This function is supposed to
2215    emit the frags/bytes it assembles to.  */
2216 void
2217 md_assemble (str)
2218      char *str;
2219 {
2220   struct m68hc11_opcode_def *opc;
2221   struct m68hc11_opcode *opcode;
2222
2223   unsigned char *op_start, *save;
2224   unsigned char *op_end;
2225   char name[20];
2226   int nlen = 0;
2227   operand operands[M6811_MAX_OPERANDS];
2228   int nb_operands;
2229   int branch_optimize = 0;
2230   int alias_id = -1;
2231
2232   /* Drop leading whitespace.  */
2233   while (*str == ' ')
2234     str++;
2235
2236   /* Find the opcode end and get the opcode in 'name'.  The opcode is forced
2237      lower case (the opcode table only has lower case op-codes).  */
2238   for (op_start = op_end = (unsigned char *) (str);
2239        *op_end && nlen < 20 && !is_end_of_line[*op_end] && *op_end != ' ';
2240        op_end++)
2241     {
2242       name[nlen] = tolower (op_start[nlen]);
2243       nlen++;
2244     }
2245   name[nlen] = 0;
2246
2247   if (nlen == 0)
2248     {
2249       as_bad (_("No instruction or missing opcode."));
2250       return;
2251     }
2252
2253   /* Find the opcode definition given its name.  */
2254   opc = (struct m68hc11_opcode_def *) hash_find (m68hc11_hash, name);
2255
2256   /* If it's not recognized, look for 'jbsr' and 'jbxx'.  These are
2257      pseudo insns for relative branch.  For these branchs, we always
2258      optimize them (turned into absolute branchs) even if --short-branchs
2259      is given.  */
2260   if (opc == NULL && name[0] == 'j' && name[1] == 'b')
2261     {
2262       opc = (struct m68hc11_opcode_def *) hash_find (m68hc11_hash, &name[1]);
2263       if (opc
2264           && (!(opc->format & M6811_OP_JUMP_REL)
2265               || (opc->format & M6811_OP_BITMASK)))
2266         opc = 0;
2267       if (opc)
2268         branch_optimize = 1;
2269     }
2270
2271   /* The following test should probably be removed.  This is not conform
2272      to Motorola assembler specs.  */
2273   if (opc == NULL && flag_mri)
2274     {
2275       if (*op_end == ' ' || *op_end == '\t')
2276         {
2277           while (*op_end == ' ' || *op_end == '\t')
2278             op_end++;
2279
2280           if (nlen < 19
2281               && (*op_end &&
2282                   (is_end_of_line[op_end[1]]
2283                    || op_end[1] == ' ' || op_end[1] == '\t'
2284                    || !isalnum (op_end[1])))
2285               && (*op_end == 'a' || *op_end == 'b'
2286                   || *op_end == 'A' || *op_end == 'B'
2287                   || *op_end == 'd' || *op_end == 'D'
2288                   || *op_end == 'x' || *op_end == 'X'
2289                   || *op_end == 'y' || *op_end == 'Y'))
2290             {
2291               name[nlen++] = tolower (*op_end++);
2292               name[nlen] = 0;
2293               opc = (struct m68hc11_opcode_def *) hash_find (m68hc11_hash,
2294                                                              name);
2295             }
2296         }
2297     }
2298
2299   /* Identify a possible instruction alias.  There are some on the
2300      68HC12 to emulate a fiew 68HC11 instructions.  */
2301   if (opc == NULL && (current_architecture & cpu6812))
2302     {
2303       int i;
2304
2305       for (i = 0; i < m68hc12_num_alias; i++)
2306         if (strcmp (m68hc12_alias[i].name, name) == 0)
2307           {
2308             alias_id = i;
2309             break;
2310           }
2311     }
2312   if (opc == NULL && alias_id < 0)
2313     {
2314       as_bad (_("Opcode `%s' is not recognized."), name);
2315       return;
2316     }
2317   save = input_line_pointer;
2318   input_line_pointer = op_end;
2319
2320   if (opc)
2321     {
2322       opc->used++;
2323       opcode = find_opcode (opc, operands, &nb_operands);
2324     }
2325   else
2326     opcode = 0;
2327
2328   if ((opcode || alias_id >= 0) && !flag_mri)
2329     {
2330       char *p = input_line_pointer;
2331
2332       while (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r')
2333         p++;
2334
2335       if (*p != '\n' && *p)
2336         as_bad (_("Garbage at end of instruction: `%s'."), p);
2337     }
2338
2339   input_line_pointer = save;
2340
2341   if (alias_id >= 0)
2342     {
2343       char *f = m68hc11_new_insn (m68hc12_alias[alias_id].size);
2344
2345       number_to_chars_bigendian (f, m68hc12_alias[alias_id].code1, 1);
2346       if (m68hc12_alias[alias_id].size > 1)
2347         number_to_chars_bigendian (f + 1, m68hc12_alias[alias_id].code2, 1);
2348
2349       return;
2350     }
2351
2352   /* Opcode is known but does not have valid operands.  Print out the
2353      syntax for this opcode.  */
2354   if (opcode == 0)
2355     {
2356       if (flag_print_insn_syntax)
2357         print_insn_format (name);
2358
2359       as_bad (_("Invalid operand for `%s'"), name);
2360       return;
2361     }
2362
2363   /* Treat dbeq/ibeq/tbeq instructions in a special way.  The branch is
2364      relative and must be in the range -256..255 (9-bits).  */
2365   if ((opcode->format & M6812_XBCC_MARKER)
2366       && (opcode->format & M6811_OP_JUMP_REL))
2367     build_dbranch_insn (opcode, operands, nb_operands);
2368
2369   /* Relative jumps instructions are taken care of separately.  We have to make
2370      sure that the relative branch is within the range -128..127.  If it's out
2371      of range, the instructions are changed into absolute instructions.
2372      This is not supported for the brset and brclr instructions.  */
2373   else if ((opcode->format & (M6811_OP_JUMP_REL | M6812_OP_JUMP_REL16))
2374            && !(opcode->format & M6811_OP_BITMASK))
2375     build_jump_insn (opcode, operands, nb_operands, branch_optimize);
2376   else
2377     build_insn (opcode, operands, nb_operands);
2378 }
2379 \f
2380 /* Relocation, relaxation and frag conversions.  */
2381 long
2382 md_pcrel_from_section (fixp, sec)
2383      fixS *fixp;
2384      segT sec;
2385 {
2386   int adjust;
2387   if (fixp->fx_addsy != (symbolS *) NULL
2388       && (!S_IS_DEFINED (fixp->fx_addsy)
2389           || (S_GET_SEGMENT (fixp->fx_addsy) != sec)))
2390     return 0;
2391
2392   adjust = fixp->fx_pcrel_adjust;
2393   return fixp->fx_frag->fr_address + fixp->fx_where + adjust;
2394 }
2395
2396 /* If while processing a fixup, a reloc really needs to be created
2397    then it is done here.  */
2398 arelent *
2399 tc_gen_reloc (section, fixp)
2400      asection *section;
2401      fixS *fixp;
2402 {
2403   arelent *reloc;
2404
2405   reloc = (arelent *) xmalloc (sizeof (arelent));
2406   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
2407   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2408   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
2409   if (fixp->fx_r_type == 0)
2410     reloc->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_16);
2411   else
2412     reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
2413   if (reloc->howto == (reloc_howto_type *) NULL)
2414     {
2415       as_bad_where (fixp->fx_file, fixp->fx_line,
2416                     _("Relocation %d is not supported by object file format."),
2417                     (int) fixp->fx_r_type);
2418       return NULL;
2419     }
2420
2421   if (!fixp->fx_pcrel)
2422     reloc->addend = fixp->fx_addnumber;
2423   else
2424     reloc->addend = (section->vma
2425                      + (fixp->fx_pcrel_adjust == 64
2426                         ? -1 : fixp->fx_pcrel_adjust)
2427                      + fixp->fx_addnumber
2428                      + md_pcrel_from_section (fixp, section));
2429   return reloc;
2430 }
2431
2432 void
2433 md_convert_frag (abfd, sec, fragP)
2434      bfd *abfd ATTRIBUTE_UNUSED;
2435      asection *sec ATTRIBUTE_UNUSED;
2436      fragS *fragP;
2437 {
2438   fixS *fixp;
2439   long value;
2440   long disp;
2441   char *buffer_address = fragP->fr_literal;
2442
2443   /* Address in object code of the displacement.  */
2444   register int object_address = fragP->fr_fix + fragP->fr_address;
2445
2446   buffer_address += fragP->fr_fix;
2447
2448   /* The displacement of the address, from current location.  */
2449   value = fragP->fr_symbol ? S_GET_VALUE (fragP->fr_symbol) : 0;
2450   disp = (value + fragP->fr_offset) - object_address;
2451   disp += symbol_get_frag (fragP->fr_symbol)->fr_address;
2452
2453   switch (fragP->fr_subtype)
2454     {
2455     case ENCODE_RELAX (STATE_PC_RELATIVE, STATE_BYTE):
2456       fragP->fr_opcode[1] = disp;
2457       break;
2458
2459     case ENCODE_RELAX (STATE_PC_RELATIVE, STATE_WORD):
2460       /* This relax is only for bsr and bra.  */
2461       assert (IS_OPCODE (fragP->fr_opcode[0], M6811_BSR)
2462               || IS_OPCODE (fragP->fr_opcode[0], M6811_BRA)
2463               || IS_OPCODE (fragP->fr_opcode[0], M6812_BSR));
2464
2465       fragP->fr_opcode[0] = convert_branch (fragP->fr_opcode[0]);
2466
2467       fix_new (fragP, fragP->fr_fix - 1, 2,
2468                fragP->fr_symbol, fragP->fr_offset, 0, BFD_RELOC_16);
2469       fragP->fr_fix += 1;
2470       break;
2471
2472     case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_BYTE):
2473     case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH_6812, STATE_BYTE):
2474       fragP->fr_opcode[1] = disp;
2475       break;
2476
2477     case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_WORD):
2478       /* Invert branch.  */
2479       fragP->fr_opcode[0] ^= 1;
2480       fragP->fr_opcode[1] = 3;  /* Branch offset.  */
2481       buffer_address[0] = M6811_JMP;
2482       fix_new (fragP, fragP->fr_fix + 1, 2,
2483                fragP->fr_symbol, fragP->fr_offset, 0, BFD_RELOC_16);
2484       fragP->fr_fix += 3;
2485       break;
2486
2487     case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH_6812, STATE_WORD):
2488       /* Translate branch into a long branch.  */
2489       fragP->fr_opcode[1] = fragP->fr_opcode[0];
2490       fragP->fr_opcode[0] = M6811_OPCODE_PAGE2;
2491
2492       fixp = fix_new (fragP, fragP->fr_fix, 2,
2493                       fragP->fr_symbol, fragP->fr_offset, 1,
2494                       BFD_RELOC_16_PCREL);
2495       fixp->fx_pcrel_adjust = 2;
2496       fragP->fr_fix += 2;
2497       break;
2498
2499     case ENCODE_RELAX (STATE_INDEXED_OFFSET, STATE_BITS5):
2500       fragP->fr_opcode[0] = fragP->fr_opcode[0] << 6;
2501       if ((fragP->fr_opcode[0] & 0x0ff) == 0x0c0)
2502         fragP->fr_opcode[0] |= disp & 0x1f;
2503       else
2504         fragP->fr_opcode[0] |= value & 0x1f;
2505       break;
2506
2507     case ENCODE_RELAX (STATE_INDEXED_OFFSET, STATE_BITS9):
2508       fragP->fr_opcode[0] = (fragP->fr_opcode[0] << 3);
2509       fragP->fr_opcode[0] |= 0xE0;
2510       fix_new (fragP, fragP->fr_fix, 1,
2511                fragP->fr_symbol, fragP->fr_offset, 0, BFD_RELOC_8);
2512       fragP->fr_fix += 1;
2513       break;
2514
2515     case ENCODE_RELAX (STATE_INDEXED_OFFSET, STATE_BITS16):
2516       fragP->fr_opcode[0] = (fragP->fr_opcode[0] << 3);
2517       fragP->fr_opcode[0] |= 0xe2;
2518       if ((fragP->fr_opcode[0] & 0x0ff) == 0x0fa)
2519         {
2520           fixp = fix_new (fragP, fragP->fr_fix, 2,
2521                           fragP->fr_symbol, fragP->fr_offset,
2522                           1, BFD_RELOC_16_PCREL);
2523           fixp->fx_pcrel_adjust = 2;
2524         }
2525       else
2526         {
2527           fix_new (fragP, fragP->fr_fix, 2,
2528                    fragP->fr_symbol, fragP->fr_offset, 0, BFD_RELOC_16);
2529         }
2530       fragP->fr_fix += 2;
2531       break;
2532
2533     case ENCODE_RELAX (STATE_XBCC_BRANCH, STATE_BYTE):
2534       if (disp < 0)
2535         fragP->fr_opcode[0] |= 0x10;
2536
2537       fragP->fr_opcode[1] = disp & 0x0FF;
2538       break;
2539
2540     case ENCODE_RELAX (STATE_XBCC_BRANCH, STATE_WORD):
2541       /* Invert branch.  */
2542       fragP->fr_opcode[0] ^= 0x20;
2543       fragP->fr_opcode[1] = 3;  /* Branch offset.  */
2544       buffer_address[0] = M6812_JMP;
2545       fix_new (fragP, fragP->fr_fix + 1, 2,
2546                fragP->fr_symbol, fragP->fr_offset, 0, BFD_RELOC_16);
2547       fragP->fr_fix += 3;
2548       break;
2549
2550     default:
2551       break;
2552     }
2553 }
2554
2555 /* On an ELF system, we can't relax an externally visible symbol,
2556    as well as a weak symbol.  The weak symbol can be overriden
2557    at final link time by a non weak symbol.  */
2558 static int
2559 relaxable_symbol (symbol)
2560      symbolS* symbol;
2561 {
2562   return ! S_IS_EXTERNAL (symbol) && ! S_IS_WEAK (symbol);
2563 }
2564
2565 /* Force truly undefined symbols to their maximum size, and generally set up
2566    the frag list to be relaxed.  */
2567 int
2568 md_estimate_size_before_relax (fragP, segment)
2569      fragS *fragP;
2570      asection *segment;
2571 {
2572   int old_fr_fix;
2573   char *buffer_address = fragP->fr_fix + fragP->fr_literal;
2574
2575   old_fr_fix = fragP->fr_fix;
2576
2577   switch (fragP->fr_subtype)
2578     {
2579     case ENCODE_RELAX (STATE_PC_RELATIVE, STATE_UNDF):
2580
2581       /* This relax is only for bsr and bra.  */
2582       assert (IS_OPCODE (fragP->fr_opcode[0], M6811_BSR)
2583               || IS_OPCODE (fragP->fr_opcode[0], M6811_BRA)
2584               || IS_OPCODE (fragP->fr_opcode[0], M6812_BSR));
2585
2586       /* A relaxable case.  */
2587       if (S_GET_SEGMENT (fragP->fr_symbol) == segment
2588           && relaxable_symbol (fragP->fr_symbol))
2589         {
2590           fragP->fr_subtype = ENCODE_RELAX (STATE_PC_RELATIVE, STATE_BYTE);
2591         }
2592       else
2593         {
2594           if (flag_fixed_branchs)
2595             as_bad_where (fragP->fr_file, fragP->fr_line,
2596                           _("bra or bsr with undefined symbol."));
2597
2598           /* The symbol is undefined or in a separate section.  Turn bra into a
2599              jmp and bsr into a jsr.  The insn becomes 3 bytes long (instead of
2600              2).  A fixup is necessary for the unresolved symbol address.  */
2601
2602           fragP->fr_opcode[0] = convert_branch (fragP->fr_opcode[0]);
2603
2604           fragP->fr_fix++;
2605           fix_new (fragP, old_fr_fix - 1, 2, fragP->fr_symbol,
2606                    fragP->fr_offset, 0, BFD_RELOC_16);
2607           frag_wane (fragP);
2608         }
2609       break;
2610
2611     case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_UNDF):
2612       assert (current_architecture & cpu6811);
2613
2614       if (S_GET_SEGMENT (fragP->fr_symbol) == segment
2615           && relaxable_symbol (fragP->fr_symbol))
2616         {
2617           fragP->fr_subtype = ENCODE_RELAX (STATE_CONDITIONAL_BRANCH,
2618                                             STATE_BYTE);
2619         }
2620       else
2621         {
2622           fragP->fr_opcode[0] ^= 1;     /* Reverse sense of branch.  */
2623           fragP->fr_opcode[1] = 3;      /* Skip next jmp insn (3 bytes).  */
2624
2625           /* Don't use fr_opcode[2] because this may be
2626              in a different frag.  */
2627           buffer_address[0] = M6811_JMP;
2628
2629           fragP->fr_fix++;
2630           fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
2631                    fragP->fr_offset, 0, BFD_RELOC_16);
2632           fragP->fr_fix += 2;
2633           frag_wane (fragP);
2634         }
2635       break;
2636
2637     case ENCODE_RELAX (STATE_INDEXED_OFFSET, STATE_UNDF):
2638       assert (current_architecture & cpu6812);
2639
2640       if (S_GET_SEGMENT (fragP->fr_symbol) == segment
2641           && relaxable_symbol (fragP->fr_symbol))
2642         {
2643           fragP->fr_subtype = ENCODE_RELAX (STATE_INDEXED_OFFSET,
2644                                             STATE_BITS5);
2645         }
2646       else
2647         {
2648           /* Switch the indexed operation to 16-bit mode.  */
2649           fragP->fr_opcode[0] = fragP->fr_opcode[0] << 3;
2650           fragP->fr_opcode[0] |= 0xe2;
2651           fragP->fr_fix++;
2652           fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
2653                    fragP->fr_offset, 0, BFD_RELOC_16);
2654           fragP->fr_fix++;
2655           frag_wane (fragP);
2656         }
2657       break;
2658
2659     case ENCODE_RELAX (STATE_XBCC_BRANCH, STATE_UNDF):
2660       assert (current_architecture & cpu6812);
2661
2662       if (S_GET_SEGMENT (fragP->fr_symbol) == segment
2663           && relaxable_symbol (fragP->fr_symbol))
2664         {
2665           fragP->fr_subtype = ENCODE_RELAX (STATE_XBCC_BRANCH, STATE_BYTE);
2666         }
2667       else
2668         {
2669           fragP->fr_opcode[0] ^= 0x20;  /* Reverse sense of branch.  */
2670           fragP->fr_opcode[1] = 3;      /* Skip next jmp insn (3 bytes).  */
2671
2672           /* Don't use fr_opcode[2] because this may be
2673              in a different frag.  */
2674           buffer_address[0] = M6812_JMP;
2675
2676           fragP->fr_fix++;
2677           fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
2678                    fragP->fr_offset, 0, BFD_RELOC_16);
2679           fragP->fr_fix += 2;
2680           frag_wane (fragP);
2681         }
2682       break;
2683
2684     case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH_6812, STATE_UNDF):
2685       assert (current_architecture & cpu6812);
2686
2687       if (S_GET_SEGMENT (fragP->fr_symbol) == segment
2688           && relaxable_symbol (fragP->fr_symbol))
2689         {
2690           fragP->fr_subtype = ENCODE_RELAX (STATE_CONDITIONAL_BRANCH_6812,
2691                                             STATE_BYTE);
2692         }
2693       else
2694         {
2695           /* Translate into a lbcc branch.  */
2696           fragP->fr_opcode[1] = fragP->fr_opcode[0];
2697           fragP->fr_opcode[0] = M6811_OPCODE_PAGE2;
2698
2699           fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
2700                    fragP->fr_offset, 0, BFD_RELOC_16_PCREL);
2701           fragP->fr_fix += 2;
2702           frag_wane (fragP);
2703         }
2704       break;
2705
2706     default:
2707       as_fatal (_("Subtype %d is not recognized."), fragP->fr_subtype);
2708     }
2709
2710   return (fragP->fr_fix - old_fr_fix);
2711 }
2712
2713 int
2714 md_apply_fix (fixp, valuep)
2715      fixS *fixp;
2716      valueT *valuep;
2717 {
2718   char *where;
2719   long value;
2720   int op_type;
2721
2722   if (fixp->fx_addsy == (symbolS *) NULL)
2723     {
2724       value = *valuep;
2725       fixp->fx_done = 1;
2726     }
2727   else if (fixp->fx_pcrel)
2728     {
2729       value = *valuep;
2730     }
2731   else
2732     {
2733       value = fixp->fx_offset;
2734       if (fixp->fx_subsy != (symbolS *) NULL)
2735         {
2736           if (S_GET_SEGMENT (fixp->fx_subsy) == absolute_section)
2737             {
2738               value -= S_GET_VALUE (fixp->fx_subsy);
2739             }
2740           else
2741             {
2742               /* We don't actually support subtracting a symbol.  */
2743               as_bad_where (fixp->fx_file, fixp->fx_line,
2744                             _("Expression too complex."));
2745             }
2746         }
2747     }
2748
2749   op_type = fixp->fx_r_type;
2750
2751   /* Patch the instruction with the resolved operand.  Elf relocation
2752      info will also be generated to take care of linker/loader fixups.
2753      The 68HC11 addresses only 64Kb, we are only concerned by 8 and 16-bit
2754      relocs.  BFD_RELOC_8 is basically used for .page0 access (the linker
2755      will warn for overflows).  BFD_RELOC_8_PCREL should not be generated
2756      because it's either resolved or turned out into non-relative insns (see
2757      relax table, bcc, bra, bsr transformations)
2758
2759      The BFD_RELOC_32 is necessary for the support of --gstabs.  */
2760   where = fixp->fx_frag->fr_literal + fixp->fx_where;
2761
2762   switch (fixp->fx_r_type)
2763     {
2764     case BFD_RELOC_32:
2765       bfd_putb32 ((bfd_vma) value, (unsigned char *) where);
2766       break;
2767
2768     case BFD_RELOC_16:
2769     case BFD_RELOC_16_PCREL:
2770       bfd_putb16 ((bfd_vma) value, (unsigned char *) where);
2771       if (value < -65537 || value > 65535)
2772         as_bad_where (fixp->fx_file, fixp->fx_line,
2773                       _("Value out of 16-bit range."));
2774       break;
2775
2776     case BFD_RELOC_M68HC11_HI8:
2777       value = value >> 8;
2778       /* Fall through.  */
2779
2780     case BFD_RELOC_M68HC11_LO8:
2781     case BFD_RELOC_8:
2782 #if 0
2783       bfd_putb8 ((bfd_vma) value, (unsigned char *) where);
2784 #endif
2785       ((bfd_byte *) where)[0] = (bfd_byte) value;
2786       break;
2787
2788     case BFD_RELOC_8_PCREL:
2789 #if 0
2790       bfd_putb8 ((bfd_vma) value, (unsigned char *) where);
2791 #endif
2792       ((bfd_byte *) where)[0] = (bfd_byte) value;
2793
2794       if (value < -128 || value > 127)
2795         as_bad_where (fixp->fx_file, fixp->fx_line,
2796                       _("Value %ld too large for 8-bit PC-relative branch."),
2797                       value);
2798       break;
2799
2800     case BFD_RELOC_M68HC11_3B:
2801       if (value <= 0 || value > 8)
2802         as_bad_where (fixp->fx_file, fixp->fx_line,
2803                       _("Auto increment/decrement offset '%ld' is out of range."),
2804                       value);
2805       if (where[0] & 0x8)
2806         value = 8 - value;
2807       else
2808         value--;
2809
2810       where[0] = where[0] | (value & 0x07);
2811       break;
2812
2813     default:
2814       as_fatal (_("Line %d: unknown relocation type: 0x%x."),
2815                 fixp->fx_line, fixp->fx_r_type);
2816     }
2817
2818   return 0;
2819 }
2820
2821 int
2822 m68hc11_cleanup ()
2823 {
2824   return 1;
2825 }