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