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