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)
5 This file is part of GAS, the GNU Assembler.
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)
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.
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. */
24 #include "safe-ctype.h"
26 #include "opcode/m68hc11.h"
27 #include "dwarf2dbg.h"
28 #include "elf/m68hc11.h"
30 const char comment_chars[] = ";!";
31 const char line_comment_chars[] = "#*";
32 const char line_separator_chars[] = "";
34 const char EXP_CHARS[] = "eE";
35 const char FLT_CHARS[] = "dD";
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)
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 */
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)
56 #define IS_OPCODE(C1,C2) (((C1) & 0x0FF) == ((C2) & 0x0FF))
58 /* This table describes how you change sizes for the various types of variable
59 size expressions. This version only supports two kinds. */
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. */
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. */
74 These insns are translated into b!cc +3 jmp L. */
75 {(127), (-128), 0, ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_WORD)},
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)},
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)},
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)},
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)},
109 /* 68HC11 and 68HC12 registers. They are numbered according to the 68HC12. */
110 typedef enum register_id {
122 typedef struct operand {
129 struct m68hc11_opcode_def {
135 struct m68hc11_opcode *opcode;
138 static struct m68hc11_opcode_def *m68hc11_opcode_defs = 0;
139 static int m68hc11_nb_opcode_defs = 0;
141 typedef struct alias {
146 static alias alias_opcodes[] = {
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));
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 *));
185 /* Pseudo op to indicate a relax group. */
186 static void s_m68hc11_relax PARAMS((int));
188 /* Pseudo op to control the ELF flags. */
189 static void s_m68hc11_mode PARAMS ((int));
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));
197 /* Controls whether relative branches can be turned into long branches.
198 When the relative offset is too large, the insn are changed:
206 Setting the flag forbidds this. */
207 static short flag_fixed_branchs = 0;
209 /* Force to use long jumps (absolute) instead of relative branches. */
210 static short flag_force_long_jumps = 0;
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
216 static short flag_strict_direct_addressing = 1;
218 /* When an opcode has invalid operand, print out the syntax of the opcode
220 static short flag_print_insn_syntax = 0;
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;
227 /* Opcode hash table. */
228 static struct hash_control *m68hc11_hash;
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;
235 /* Default cpu determined by 'get_default_target'. */
236 static const char *default_cpu;
238 /* Number of opcodes in the sorted table (filtered by current cpu). */
239 static int num_opcodes;
241 /* The opcodes sorted by name and filtered by current cpu. */
242 static struct m68hc11_opcode *m68hc11_sorted_opcodes;
244 /* ELF flags to set in the output file header. */
245 static int elf_flags = E_M68HC11_F64;
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
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. */
260 {"fcc", stringer, 1},
263 /* Dwarf2 support for Gcc. */
264 {"file", (void (*) PARAMS ((int))) dwarf2_directive_file, 0},
265 {"loc", dwarf2_directive_loc, 0},
268 {"xrefb", s_ignore, 0}, /* Same as xref */
270 /* Gcc driven relaxation. */
271 {"relax", s_m68hc11_relax, 0},
273 /* .mode instruction (ala SH). */
274 {"mode", s_m68hc11_mode, 0},
276 /* .far instruction. */
277 {"far", s_m68hc11_mark_symbol, STO_M68HC12_FAR},
279 /* .interrupt instruction. */
280 {"interrupt", s_m68hc11_mark_symbol, STO_M68HC12_INTERRUPT},
285 /* Options and initialization. */
287 const char *md_shortopts = "Sm:";
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},
293 #define OPTION_SHORT_BRANCHS (OPTION_MD_BASE + 1)
294 {"short-branchs", no_argument, NULL, OPTION_SHORT_BRANCHS},
296 #define OPTION_STRICT_DIRECT_MODE (OPTION_MD_BASE + 2)
297 {"strict-direct-mode", no_argument, NULL, OPTION_STRICT_DIRECT_MODE},
299 #define OPTION_PRINT_INSN_SYNTAX (OPTION_MD_BASE + 3)
300 {"print-insn-syntax", no_argument, NULL, OPTION_PRINT_INSN_SYNTAX},
302 #define OPTION_PRINT_OPCODES (OPTION_MD_BASE + 4)
303 {"print-opcodes", no_argument, NULL, OPTION_PRINT_OPCODES},
305 #define OPTION_GENERATE_EXAMPLE (OPTION_MD_BASE + 5)
306 {"generate-example", no_argument, NULL, OPTION_GENERATE_EXAMPLE},
308 #define OPTION_MSHORT (OPTION_MD_BASE + 6)
309 {"mshort", no_argument, NULL, OPTION_MSHORT},
311 #define OPTION_MLONG (OPTION_MD_BASE + 7)
312 {"mlong", no_argument, NULL, OPTION_MLONG},
314 #define OPTION_MSHORT_DOUBLE (OPTION_MD_BASE + 8)
315 {"mshort-double", no_argument, NULL, OPTION_MSHORT_DOUBLE},
317 #define OPTION_MLONG_DOUBLE (OPTION_MD_BASE + 9)
318 {"mlong-double", no_argument, NULL, OPTION_MLONG_DOUBLE},
320 {NULL, no_argument, NULL, 0}
322 size_t md_longopts_size = sizeof (md_longopts);
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. */
328 m68hc11_arch_format ()
330 get_default_target ();
331 if (current_architecture & cpu6811)
332 return "elf32-m68hc11";
334 return "elf32-m68hc12";
337 enum bfd_architecture
340 get_default_target ();
341 if (current_architecture & cpu6811)
342 return bfd_arch_m68hc11;
344 return bfd_arch_m68hc12;
353 /* Listing header selected according to cpu. */
355 m68hc11_listing_header ()
357 if (current_architecture & cpu6811)
358 return "M68HC11 GAS ";
360 return "M68HC12 GAS ";
364 md_show_usage (stream)
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);
387 /* Try to identify the default target based on the BFD library. */
389 get_default_target ()
391 const bfd_target *target;
394 if (current_architecture != 0)
397 default_cpu = "unknown";
398 target = bfd_find_target (0, &abfd);
399 if (target && target->name)
401 if (strcmp (target->name, "elf32-m68hc12") == 0)
403 current_architecture = cpu6812;
404 default_cpu = "m68hc12";
406 else if (strcmp (target->name, "elf32-m68hc11") == 0)
408 current_architecture = cpu6811;
409 default_cpu = "m68hc11";
413 as_bad (_("Default target `%s' is not supported."), target->name);
419 m68hc11_print_statistics (file)
423 struct m68hc11_opcode_def *opc;
425 hash_print_statistics (file, "opcode table", m68hc11_hash);
427 opc = m68hc11_opcode_defs;
428 if (opc == 0 || m68hc11_nb_opcode_defs == 0)
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++)
435 fprintf (file, "%-7.7s %5d %7d %7d 0x%08lx %7d\n",
438 opc->min_operands, opc->max_operands, opc->format, opc->used);
443 md_parse_option (c, arg)
447 get_default_target ();
450 /* -S means keep external to 2 bit offset rather than 16 bit one. */
451 case OPTION_SHORT_BRANCHS:
453 flag_fixed_branchs = 1;
456 case OPTION_FORCE_LONG_BRANCH:
457 flag_force_long_jumps = 1;
460 case OPTION_PRINT_INSN_SYNTAX:
461 flag_print_insn_syntax = 1;
464 case OPTION_PRINT_OPCODES:
465 flag_print_opcodes = 1;
468 case OPTION_STRICT_DIRECT_MODE:
469 flag_strict_direct_addressing = 0;
472 case OPTION_GENERATE_EXAMPLE:
473 flag_print_opcodes = 2;
477 elf_flags &= ~E_M68HC11_I32;
481 elf_flags |= E_M68HC11_I32;
484 case OPTION_MSHORT_DOUBLE:
485 elf_flags &= ~E_M68HC11_F64;
488 case OPTION_MLONG_DOUBLE:
489 elf_flags |= E_M68HC11_F64;
493 if (strcasecmp (arg, "68hc11") == 0)
494 current_architecture = cpu6811;
495 else if (strcasecmp (arg, "68hc12") == 0)
496 current_architecture = cpu6812;
498 as_bad (_("Option `%s' is not recognized."), arg);
509 md_undefined_symbol (name)
510 char *name ATTRIBUTE_UNUSED;
515 /* Equal to MAX_PRECISION in atof-ieee.c. */
516 #define MAX_LITTLENUMS 6
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. */
523 md_atof (type, litP, sizeP)
529 LITTLENUM_TYPE words[MAX_LITTLENUMS];
530 LITTLENUM_TYPE *wordP;
561 return _("Bad call to MD_ATOF()");
563 t = atof_ieee (input_line_pointer, type, words);
565 input_line_pointer = t;
567 *sizeP = prec * sizeof (LITTLENUM_TYPE);
568 for (wordP = words; prec--;)
570 md_number_to_chars (litP, (long) (*wordP++), sizeof (LITTLENUM_TYPE));
571 litP += sizeof (LITTLENUM_TYPE);
577 md_section_align (seg, addr)
581 int align = bfd_get_section_alignment (stdoutput, seg);
582 return ((addr + (1 << align) - 1) & (-1 << align));
586 cmp_opcode (op1, op2)
587 struct m68hc11_opcode *op1;
588 struct m68hc11_opcode *op2;
590 return strcmp (op1->name, op2->name);
593 #define IS_CALL_SYMBOL(MODE) \
594 (((MODE) & (M6812_OP_PAGE|M6811_OP_IND16)) \
595 == ((M6812_OP_PAGE|M6811_OP_IND16)))
597 /* Initialize the assembler. Create the opcode hash table
598 (sorted on the names) with the M6811 opcode table
599 (from opcode library). */
603 char *prev_name = "";
604 struct m68hc11_opcode *opcodes;
605 struct m68hc11_opcode_def *opc = 0;
608 get_default_target ();
610 m68hc11_hash = hash_new ();
612 /* Get a writable copy of the opcode table and sort it on the names. */
613 opcodes = (struct m68hc11_opcode *) xmalloc (m68hc11_num_opcodes *
616 m68hc11_sorted_opcodes = opcodes;
618 for (i = 0; i < m68hc11_num_opcodes; i++)
620 if (m68hc11_opcodes[i].arch & current_architecture)
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))
628 opcodes[num_opcodes] = m68hc11_opcodes[i];
631 for (j = 0; alias_opcodes[j].name != 0; j++)
632 if (strcmp (m68hc11_opcodes[i].name, alias_opcodes[j].name) == 0)
634 opcodes[num_opcodes] = m68hc11_opcodes[i];
635 opcodes[num_opcodes].name = alias_opcodes[j].alias;
641 qsort (opcodes, num_opcodes, sizeof (struct m68hc11_opcode),
642 (int (*) PARAMS ((const PTR, const PTR))) cmp_opcode);
644 opc = (struct m68hc11_opcode_def *)
645 xmalloc (num_opcodes * sizeof (struct m68hc11_opcode_def));
646 m68hc11_opcode_defs = opc--;
648 /* Insert unique names into hash table. The M6811 instruction set
649 has several identical opcode names that have different opcodes based
650 on the operands. This hash table then provides a quick index to
651 the first opcode with a particular name in the opcode table. */
652 for (i = 0; i < num_opcodes; i++, opcodes++)
656 if (strcmp (prev_name, opcodes->name))
658 prev_name = (char *) opcodes->name;
662 opc->min_operands = 100;
663 opc->max_operands = 0;
665 opc->opcode = opcodes;
667 hash_insert (m68hc11_hash, opcodes->name, (char *) opc);
670 opc->format |= opcodes->format;
672 /* See how many operands this opcode needs. */
674 if (opcodes->format & M6811_OP_MASK)
676 if (opcodes->format & M6811_OP_BITMASK)
678 if (opcodes->format & (M6811_OP_JUMP_REL | M6812_OP_JUMP_REL16))
680 if (opcodes->format & (M6812_OP_IND16_P2 | M6812_OP_IDX_P2))
682 /* Special case for call instruction. */
683 if ((opcodes->format & M6812_OP_PAGE)
684 && !(opcodes->format & M6811_OP_IND16))
687 if (expect < opc->min_operands)
688 opc->min_operands = expect;
689 if (IS_CALL_SYMBOL (opcodes->format))
691 if (expect > opc->max_operands)
692 opc->max_operands = expect;
695 m68hc11_nb_opcode_defs = opc - m68hc11_opcode_defs;
697 if (flag_print_opcodes)
699 print_opcode_list ();
705 m68hc11_init_after_args ()
711 /* Return a string that represents the operand format for the instruction.
712 When example is true, this generates an example of operand. This is used
713 to give an example and also to generate a test. */
715 print_opcode_format (opcode, example)
716 struct m68hc11_opcode *opcode;
719 static char buf[128];
720 int format = opcode->format;
725 if (format & M6811_OP_IMM8)
728 sprintf (p, "#%d", rand () & 0x0FF);
730 strcpy (p, _("#<imm8>"));
734 if (format & M6811_OP_IMM16)
737 sprintf (p, "#%d", rand () & 0x0FFFF);
739 strcpy (p, _("#<imm16>"));
743 if (format & M6811_OP_IX)
746 sprintf (p, "%d,X", rand () & 0x0FF);
748 strcpy (p, _("<imm8>,X"));
752 if (format & M6811_OP_IY)
755 sprintf (p, "%d,X", rand () & 0x0FF);
757 strcpy (p, _("<imm8>,X"));
761 if (format & M6812_OP_IDX)
764 sprintf (p, "%d,X", rand () & 0x0FF);
770 if (format & M6812_OP_PAGE)
773 sprintf (p, ", %d", rand () & 0x0FF);
775 strcpy (p, ", <page>");
779 if (format & M6811_OP_DIRECT)
782 sprintf (p, "*Z%d", rand () & 0x0FF);
784 strcpy (p, _("*<abs8>"));
788 if (format & M6811_OP_BITMASK)
794 sprintf (p, "#$%02x", rand () & 0x0FF);
796 strcpy (p, _("#<mask>"));
799 if (format & M6811_OP_JUMP_REL)
803 if (format & M6811_OP_IND16)
806 sprintf (p, _("symbol%d"), rand () & 0x0FF);
808 strcpy (p, _("<abs>"));
813 if (format & (M6811_OP_JUMP_REL | M6812_OP_JUMP_REL16))
817 if (format & M6811_OP_BITMASK)
819 sprintf (p, ".+%d", rand () & 0x7F);
823 sprintf (p, "L%d", rand () & 0x0FF);
827 strcpy (p, _("<label>"));
833 /* Prints the list of instructions with the possible operands. */
838 char *prev_name = "";
839 struct m68hc11_opcode *opcodes;
840 int example = flag_print_opcodes == 2;
843 printf (_("# Example of `%s' instructions\n\t.sect .text\n_start:\n"),
846 opcodes = m68hc11_sorted_opcodes;
848 /* Walk the list sorted on names (by md_begin). We only report
849 one instruction per line, and we collect the different operand
851 for (i = 0; i < num_opcodes; i++, opcodes++)
853 char *fmt = print_opcode_format (opcodes, example);
857 printf ("L%d:\t", i);
858 printf ("%s %s\n", opcodes->name, fmt);
862 if (strcmp (prev_name, opcodes->name))
867 printf ("%-5.5s ", opcodes->name);
868 prev_name = (char *) opcodes->name;
871 printf (" [%s]", fmt);
877 /* Print the instruction format. This operation is called when some
878 instruction is not correct. Instruction format is printed as an
881 print_insn_format (name)
884 struct m68hc11_opcode_def *opc;
885 struct m68hc11_opcode *opcode;
888 opc = (struct m68hc11_opcode_def *) hash_find (m68hc11_hash, name);
891 as_bad (_("Instruction `%s' is not recognized."), name);
894 opcode = opc->opcode;
896 as_bad (_("Instruction formats for `%s':"), name);
901 fmt = print_opcode_format (opcode, 0);
902 sprintf (buf, "\t%-5.5s %s", opcode->name, fmt);
907 while (strcmp (opcode->name, name) == 0);
910 /* Analysis of 68HC11 and 68HC12 operands. */
912 /* reg_name_search() finds the register number given its name.
913 Returns the register number or REG_NONE on failure. */
915 reg_name_search (name)
918 if (strcasecmp (name, "x") == 0 || strcasecmp (name, "ix") == 0)
920 if (strcasecmp (name, "y") == 0 || strcasecmp (name, "iy") == 0)
922 if (strcasecmp (name, "a") == 0)
924 if (strcasecmp (name, "b") == 0)
926 if (strcasecmp (name, "d") == 0)
928 if (strcasecmp (name, "sp") == 0)
930 if (strcasecmp (name, "pc") == 0)
932 if (strcasecmp (name, "ccr") == 0)
942 while (*p == ' ' || *p == '\t')
948 /* Check the string at input_line_pointer
949 to see if it is a valid register name. */
953 register_id reg_number;
954 char c, *p = input_line_pointer;
956 if (!is_name_beginner (*p++))
959 while (is_part_of_name (*p++))
966 /* Look to see if it's in the register table. */
967 reg_number = reg_name_search (input_line_pointer);
968 if (reg_number != REG_NONE)
973 input_line_pointer = p;
982 /* Parse a string of operands and return an array of expressions.
984 Operand mode[0] mode[1] exp[0] exp[1]
985 #n M6811_OP_IMM16 - O_*
986 *<exp> M6811_OP_DIRECT - O_*
987 .{+-}<exp> M6811_OP_JUMP_REL - O_*
988 <exp> M6811_OP_IND16 - O_*
989 ,r N,r M6812_OP_IDX M6812_OP_REG O_constant O_register
990 n,-r M6812_PRE_DEC M6812_OP_REG O_constant O_register
991 n,+r M6812_PRE_INC " "
992 n,r- M6812_POST_DEC " "
993 n,r+ M6812_POST_INC " "
994 A,r B,r D,r M6811_OP_REG M6812_OP_REG O_register O_register
995 [D,r] M6811_OP_D_IDX M6812_OP_REG O_register O_register
996 [n,r] M6811_OP_D_IDX_2 M6812_OP_REG O_constant O_register */
998 get_operand (oper, which, opmode)
1003 char *p = input_line_pointer;
1007 oper->exp.X_op = O_absent;
1008 oper->reg1 = REG_NONE;
1009 oper->reg2 = REG_NONE;
1010 mode = M6811_OP_NONE;
1012 p = skip_whites (p);
1014 if (*p == 0 || *p == '\n' || *p == '\r')
1016 input_line_pointer = p;
1020 if (*p == '*' && (opmode & (M6811_OP_DIRECT | M6811_OP_IND16)))
1022 mode = M6811_OP_DIRECT;
1027 if (!(opmode & (M6811_OP_IMM8 | M6811_OP_IMM16 | M6811_OP_BITMASK)))
1029 as_bad (_("Immediate operand is not allowed for operand %d."),
1034 mode = M6811_OP_IMM16;
1036 if (strncmp (p, "%hi", 3) == 0)
1039 mode |= M6811_OP_HIGH_ADDR;
1041 else if (strncmp (p, "%lo", 3) == 0)
1044 mode |= M6811_OP_LOW_ADDR;
1047 else if (*p == '.' && (p[1] == '+' || p[1] == '-'))
1050 mode = M6811_OP_JUMP_REL;
1054 if (current_architecture & cpu6811)
1055 as_bad (_("Indirect indexed addressing is not valid for 68HC11."));
1058 mode = M6812_OP_D_IDX;
1059 p = skip_whites (p);
1061 else if (*p == ',') /* Special handling of ,x and ,y. */
1064 input_line_pointer = p;
1066 reg = register_name ();
1067 if (reg != REG_NONE)
1070 oper->exp.X_op = O_constant;
1071 oper->exp.X_add_number = 0;
1072 oper->mode = M6812_OP_IDX;
1075 as_bad (_("Spurious `,' or bad indirect register addressing mode."));
1078 input_line_pointer = p;
1080 if (mode == M6811_OP_NONE || mode == M6812_OP_D_IDX)
1081 reg = register_name ();
1085 if (reg != REG_NONE)
1087 p = skip_whites (input_line_pointer);
1088 if (*p == ']' && mode == M6812_OP_D_IDX)
1091 (_("Missing second register or offset for indexed-indirect mode."));
1096 oper->mode = mode | M6812_OP_REG;
1099 if (mode == M6812_OP_D_IDX)
1101 as_bad (_("Missing second register for indexed-indirect mode."));
1108 input_line_pointer = p;
1109 reg = register_name ();
1110 if (reg != REG_NONE)
1112 p = skip_whites (input_line_pointer);
1113 if (mode == M6812_OP_D_IDX)
1117 as_bad (_("Missing `]' to close indexed-indirect mode."));
1121 oper->mode = M6812_OP_D_IDX;
1123 input_line_pointer = p;
1131 /* In MRI mode, isolate the operand because we can't distinguish
1132 operands from comments. */
1137 p = skip_whites (p);
1138 while (*p && *p != ' ' && *p != '\t')
1147 /* Parse as an expression. */
1148 expression (&oper->exp);
1157 expression (&oper->exp);
1160 if (oper->exp.X_op == O_illegal)
1162 as_bad (_("Illegal operand."));
1165 else if (oper->exp.X_op == O_absent)
1167 as_bad (_("Missing operand."));
1171 p = input_line_pointer;
1173 if (mode == M6811_OP_NONE || mode == M6811_OP_DIRECT
1174 || mode == M6812_OP_D_IDX)
1176 p = skip_whites (input_line_pointer);
1180 int possible_mode = M6811_OP_NONE;
1181 char *old_input_line;
1186 /* 68HC12 pre increment or decrement. */
1187 if (mode == M6811_OP_NONE)
1191 possible_mode = M6812_PRE_DEC;
1196 possible_mode = M6812_PRE_INC;
1199 p = skip_whites (p);
1201 input_line_pointer = p;
1202 reg = register_name ();
1204 /* Backtrack if we have a valid constant expression and
1205 it does not correspond to the offset of the 68HC12 indexed
1206 addressing mode (as in N,x). */
1207 if (reg == REG_NONE && mode == M6811_OP_NONE
1208 && possible_mode != M6811_OP_NONE)
1210 oper->mode = M6811_OP_IND16 | M6811_OP_JUMP_REL;
1211 input_line_pointer = skip_whites (old_input_line);
1215 if (possible_mode != M6811_OP_NONE)
1216 mode = possible_mode;
1218 if ((current_architecture & cpu6811)
1219 && possible_mode != M6811_OP_NONE)
1220 as_bad (_("Pre-increment mode is not valid for 68HC11"));
1222 if (which == 0 && opmode & M6812_OP_IDX_P2
1223 && reg != REG_X && reg != REG_Y
1224 && reg != REG_PC && reg != REG_SP)
1227 input_line_pointer = p;
1230 if (reg == REG_NONE && mode != M6811_OP_DIRECT
1231 && !(mode == M6811_OP_NONE && opmode & M6811_OP_IND16))
1233 as_bad (_("Wrong register in register indirect mode."));
1236 if (mode == M6812_OP_D_IDX)
1238 p = skip_whites (input_line_pointer);
1241 as_bad (_("Missing `]' to close register indirect operand."));
1244 input_line_pointer = p;
1246 oper->mode = M6812_OP_D_IDX_2;
1249 if (reg != REG_NONE)
1252 if (mode == M6811_OP_NONE)
1254 p = input_line_pointer;
1257 mode = M6812_POST_DEC;
1259 if (current_architecture & cpu6811)
1261 (_("Post-decrement mode is not valid for 68HC11."));
1265 mode = M6812_POST_INC;
1267 if (current_architecture & cpu6811)
1269 (_("Post-increment mode is not valid for 68HC11."));
1272 mode = M6812_OP_IDX;
1274 input_line_pointer = p;
1277 mode |= M6812_OP_IDX;
1282 input_line_pointer = old_input_line;
1285 if (mode == M6812_OP_D_IDX_2)
1287 as_bad (_("Invalid indexed indirect mode."));
1292 /* If the mode is not known until now, this is either a label
1293 or an indirect address. */
1294 if (mode == M6811_OP_NONE)
1295 mode = M6811_OP_IND16 | M6811_OP_JUMP_REL;
1297 p = input_line_pointer;
1298 while (*p == ' ' || *p == '\t')
1300 input_line_pointer = p;
1306 #define M6812_AUTO_INC_DEC (M6812_PRE_INC | M6812_PRE_DEC \
1307 | M6812_POST_INC | M6812_POST_DEC)
1309 /* Checks that the number 'num' fits for a given mode. */
1311 check_range (num, mode)
1315 /* Auto increment and decrement are ok for [-8..8] without 0. */
1316 if (mode & M6812_AUTO_INC_DEC)
1317 return (num != 0 && num <= 8 && num >= -8);
1319 /* The 68HC12 supports 5, 9 and 16-bit offsets. */
1320 if (mode & (M6812_INDEXED_IND | M6812_INDEXED | M6812_OP_IDX))
1321 mode = M6811_OP_IND16;
1323 if (mode & M6812_OP_JUMP_REL16)
1324 mode = M6811_OP_IND16;
1326 mode &= ~M6811_OP_BRANCH;
1331 case M6811_OP_DIRECT:
1332 return (num >= 0 && num <= 255) ? 1 : 0;
1334 case M6811_OP_BITMASK:
1337 return (((num & 0xFFFFFF00) == 0) || ((num & 0xFFFFFF00) == 0xFFFFFF00))
1340 case M6811_OP_JUMP_REL:
1341 return (num >= -128 && num <= 127) ? 1 : 0;
1343 case M6811_OP_IND16:
1344 case M6811_OP_IND16 | M6812_OP_PAGE:
1345 case M6811_OP_IMM16:
1346 return (((num & 0xFFFF0000) == 0) || ((num & 0xFFFF0000) == 0xFFFF0000))
1349 case M6812_OP_IBCC_MARKER:
1350 case M6812_OP_TBCC_MARKER:
1351 case M6812_OP_DBCC_MARKER:
1352 return (num >= -256 && num <= 255) ? 1 : 0;
1354 case M6812_OP_TRAP_ID:
1355 return ((num >= 0x30 && num <= 0x39)
1356 || (num >= 0x40 && num <= 0x0ff)) ? 1 : 0;
1363 /* Gas fixup generation. */
1365 /* Put a 1 byte expression described by 'oper'. If this expression contains
1366 unresolved symbols, generate an 8-bit fixup. */
1368 fixup8 (oper, mode, opmode)
1377 if (oper->X_op == O_constant)
1379 if (mode & M6812_OP_TRAP_ID
1380 && !check_range (oper->X_add_number, M6812_OP_TRAP_ID))
1382 static char trap_id_warn_once = 0;
1384 as_bad (_("Trap id `%ld' is out of range."), oper->X_add_number);
1385 if (trap_id_warn_once == 0)
1387 trap_id_warn_once = 1;
1388 as_bad (_("Trap id must be within [0x30..0x39] or [0x40..0xff]."));
1392 if (!(mode & M6812_OP_TRAP_ID)
1393 && !check_range (oper->X_add_number, mode))
1395 as_bad (_("Operand out of 8-bit range: `%ld'."), oper->X_add_number);
1397 number_to_chars_bigendian (f, oper->X_add_number & 0x0FF, 1);
1399 else if (oper->X_op != O_register)
1401 if (mode & M6812_OP_TRAP_ID)
1402 as_bad (_("The trap id must be a constant."));
1404 if (mode == M6811_OP_JUMP_REL)
1408 fixp = fix_new_exp (frag_now, f - frag_now->fr_literal, 1,
1409 oper, TRUE, BFD_RELOC_8_PCREL);
1410 fixp->fx_pcrel_adjust = 1;
1414 /* Now create an 8-bit fixup. If there was some %hi or %lo
1415 modifier, generate the reloc accordingly. */
1416 fix_new_exp (frag_now, f - frag_now->fr_literal, 1,
1418 ((opmode & M6811_OP_HIGH_ADDR)
1419 ? BFD_RELOC_M68HC11_HI8
1420 : ((opmode & M6811_OP_LOW_ADDR)
1421 ? BFD_RELOC_M68HC11_LO8
1422 : ((mode & M6812_OP_PAGE)
1423 ? BFD_RELOC_M68HC11_PAGE : BFD_RELOC_8))));
1425 number_to_chars_bigendian (f, 0, 1);
1429 as_fatal (_("Operand `%x' not recognized in fixup8."), oper->X_op);
1433 /* Put a 2 byte expression described by 'oper'. If this expression contains
1434 unresolved symbols, generate a 16-bit fixup. */
1436 fixup16 (oper, mode, opmode)
1439 int opmode ATTRIBUTE_UNUSED;
1445 if (oper->X_op == O_constant)
1447 if (!check_range (oper->X_add_number, mode))
1449 as_bad (_("Operand out of 16-bit range: `%ld'."),
1450 oper->X_add_number);
1452 number_to_chars_bigendian (f, oper->X_add_number & 0x0FFFF, 2);
1454 else if (oper->X_op != O_register)
1458 /* Now create a 16-bit fixup. */
1459 fixp = fix_new_exp (frag_now, f - frag_now->fr_literal, 2,
1461 (mode & M6812_OP_JUMP_REL16 ? TRUE : FALSE),
1462 (mode & M6812_OP_JUMP_REL16
1463 ? BFD_RELOC_16_PCREL
1464 : (mode & M6812_OP_PAGE)
1465 ? BFD_RELOC_M68HC11_LO16 : BFD_RELOC_16));
1466 number_to_chars_bigendian (f, 0, 2);
1467 if (mode & M6812_OP_JUMP_REL16)
1468 fixp->fx_pcrel_adjust = 2;
1472 as_fatal (_("Operand `%x' not recognized in fixup16."), oper->X_op);
1476 /* Put a 3 byte expression described by 'oper'. If this expression contains
1477 unresolved symbols, generate a 24-bit fixup. */
1479 fixup24 (oper, mode, opmode)
1482 int opmode ATTRIBUTE_UNUSED;
1488 if (oper->X_op == O_constant)
1490 if (!check_range (oper->X_add_number, mode))
1492 as_bad (_("Operand out of 16-bit range: `%ld'."),
1493 oper->X_add_number);
1495 number_to_chars_bigendian (f, oper->X_add_number & 0x0FFFFFF, 3);
1497 else if (oper->X_op != O_register)
1501 /* Now create a 24-bit fixup. */
1502 fixp = fix_new_exp (frag_now, f - frag_now->fr_literal, 2,
1503 oper, FALSE, BFD_RELOC_M68HC11_24);
1504 number_to_chars_bigendian (f, 0, 3);
1508 as_fatal (_("Operand `%x' not recognized in fixup16."), oper->X_op);
1512 /* 68HC11 and 68HC12 code generation. */
1514 /* Translate the short branch/bsr instruction into a long branch. */
1515 static unsigned char
1516 convert_branch (code)
1519 if (IS_OPCODE (code, M6812_BSR))
1521 else if (IS_OPCODE (code, M6811_BSR))
1523 else if (IS_OPCODE (code, M6811_BRA))
1524 return (current_architecture & cpu6812) ? M6812_JMP : M6811_JMP;
1526 as_fatal (_("Unexpected branch conversion with `%x'"), code);
1528 /* Keep gcc happy. */
1532 /* Start a new insn that contains at least 'size' bytes. Record the
1533 line information of that insn in the dwarf2 debug sections. */
1535 m68hc11_new_insn (size)
1540 f = frag_more (size);
1542 dwarf2_emit_insn (size);
1547 /* Builds a jump instruction (bra, bcc, bsr). */
1549 build_jump_insn (opcode, operands, nb_operands, jmp_mode)
1550 struct m68hc11_opcode *opcode;
1561 /* The relative branch convertion is not supported for
1563 assert ((opcode->format & M6811_OP_BITMASK) == 0);
1564 assert (nb_operands == 1);
1565 assert (operands[0].reg1 == REG_NONE && operands[0].reg2 == REG_NONE);
1567 code = opcode->opcode;
1569 n = operands[0].exp.X_add_number;
1571 /* Turn into a long branch:
1572 - when force long branch option (and not for jbcc pseudos),
1573 - when jbcc and the constant is out of -128..127 range,
1574 - when branch optimization is allowed and branch out of range. */
1575 if ((jmp_mode == 0 && flag_force_long_jumps)
1576 || (operands[0].exp.X_op == O_constant
1577 && (!check_range (n, opcode->format) &&
1578 (jmp_mode == 1 || flag_fixed_branchs == 0))))
1581 where = frag_now_fix ();
1583 fix_new (frag_now, frag_now_fix (), 1,
1584 &abs_symbol, 0, 1, BFD_RELOC_M68HC11_RL_JUMP);
1586 if (code == M6811_BSR || code == M6811_BRA || code == M6812_BSR)
1588 code = convert_branch (code);
1590 f = m68hc11_new_insn (1);
1591 number_to_chars_bigendian (f, code, 1);
1593 else if (current_architecture & cpu6812)
1595 /* 68HC12: translate the bcc into a lbcc. */
1596 f = m68hc11_new_insn (2);
1597 number_to_chars_bigendian (f, M6811_OPCODE_PAGE2, 1);
1598 number_to_chars_bigendian (f + 1, code, 1);
1599 fixup16 (&operands[0].exp, M6812_OP_JUMP_REL16,
1600 M6812_OP_JUMP_REL16);
1605 /* 68HC11: translate the bcc into b!cc +3; jmp <L>. */
1606 f = m68hc11_new_insn (3);
1608 number_to_chars_bigendian (f, code, 1);
1609 number_to_chars_bigendian (f + 1, 3, 1);
1610 number_to_chars_bigendian (f + 2, M6811_JMP, 1);
1612 fixup16 (&operands[0].exp, M6811_OP_IND16, M6811_OP_IND16);
1616 /* Branch with a constant that must fit in 8-bits. */
1617 if (operands[0].exp.X_op == O_constant)
1619 if (!check_range (n, opcode->format))
1621 as_bad (_("Operand out of range for a relative branch: `%ld'"),
1624 else if (opcode->format & M6812_OP_JUMP_REL16)
1626 f = m68hc11_new_insn (4);
1627 number_to_chars_bigendian (f, M6811_OPCODE_PAGE2, 1);
1628 number_to_chars_bigendian (f + 1, code, 1);
1629 number_to_chars_bigendian (f + 2, n & 0x0ffff, 2);
1633 f = m68hc11_new_insn (2);
1634 number_to_chars_bigendian (f, code, 1);
1635 number_to_chars_bigendian (f + 1, n & 0x0FF, 1);
1638 else if (opcode->format & M6812_OP_JUMP_REL16)
1641 where = frag_now_fix ();
1643 fix_new (frag_now, frag_now_fix (), 1,
1644 &abs_symbol, 0, 1, BFD_RELOC_M68HC11_RL_JUMP);
1646 f = m68hc11_new_insn (2);
1647 number_to_chars_bigendian (f, M6811_OPCODE_PAGE2, 1);
1648 number_to_chars_bigendian (f + 1, code, 1);
1649 fixup16 (&operands[0].exp, M6812_OP_JUMP_REL16, M6812_OP_JUMP_REL16);
1656 where = frag_now_fix ();
1658 fix_new (frag_now, frag_now_fix (), 1,
1659 &abs_symbol, 0, 1, BFD_RELOC_M68HC11_RL_JUMP);
1661 /* Branch offset must fit in 8-bits, don't do some relax. */
1662 if (jmp_mode == 0 && flag_fixed_branchs)
1664 opcode = m68hc11_new_insn (1);
1665 number_to_chars_bigendian (opcode, code, 1);
1666 fixup8 (&operands[0].exp, M6811_OP_JUMP_REL, M6811_OP_JUMP_REL);
1669 /* bra/bsr made be changed into jmp/jsr. */
1670 else if (code == M6811_BSR || code == M6811_BRA || code == M6812_BSR)
1672 /* Allocate worst case storage. */
1673 opcode = m68hc11_new_insn (3);
1674 number_to_chars_bigendian (opcode, code, 1);
1675 number_to_chars_bigendian (opcode + 1, 0, 1);
1676 frag_variant (rs_machine_dependent, 1, 1,
1677 ENCODE_RELAX (STATE_PC_RELATIVE, STATE_UNDF),
1678 operands[0].exp.X_add_symbol, (offsetT) n,
1681 else if (current_architecture & cpu6812)
1683 opcode = m68hc11_new_insn (2);
1684 number_to_chars_bigendian (opcode, code, 1);
1685 number_to_chars_bigendian (opcode + 1, 0, 1);
1686 frag_var (rs_machine_dependent, 2, 2,
1687 ENCODE_RELAX (STATE_CONDITIONAL_BRANCH_6812, STATE_UNDF),
1688 operands[0].exp.X_add_symbol, (offsetT) n, opcode);
1692 opcode = m68hc11_new_insn (2);
1693 number_to_chars_bigendian (opcode, code, 1);
1694 number_to_chars_bigendian (opcode + 1, 0, 1);
1695 frag_var (rs_machine_dependent, 3, 3,
1696 ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_UNDF),
1697 operands[0].exp.X_add_symbol, (offsetT) n, opcode);
1702 /* Builds a dbne/dbeq/tbne/tbeq instruction. */
1704 build_dbranch_insn (opcode, operands, nb_operands, jmp_mode)
1705 struct m68hc11_opcode *opcode;
1714 /* The relative branch convertion is not supported for
1716 assert ((opcode->format & M6811_OP_BITMASK) == 0);
1717 assert (nb_operands == 2);
1718 assert (operands[0].reg1 != REG_NONE);
1720 code = opcode->opcode & 0x0FF;
1722 f = m68hc11_new_insn (1);
1723 number_to_chars_bigendian (f, code, 1);
1725 n = operands[1].exp.X_add_number;
1726 code = operands[0].reg1;
1728 if (operands[0].reg1 == REG_NONE || operands[0].reg1 == REG_CCR
1729 || operands[0].reg1 == REG_PC)
1730 as_bad (_("Invalid register for dbcc/tbcc instruction."));
1732 if (opcode->format & M6812_OP_IBCC_MARKER)
1734 else if (opcode->format & M6812_OP_TBCC_MARKER)
1737 if (!(opcode->format & M6812_OP_EQ_MARKER))
1740 /* Turn into a long branch:
1741 - when force long branch option (and not for jbcc pseudos),
1742 - when jdbcc and the constant is out of -256..255 range,
1743 - when branch optimization is allowed and branch out of range. */
1744 if ((jmp_mode == 0 && flag_force_long_jumps)
1745 || (operands[1].exp.X_op == O_constant
1746 && (!check_range (n, M6812_OP_IBCC_MARKER) &&
1747 (jmp_mode == 1 || flag_fixed_branchs == 0))))
1751 number_to_chars_bigendian (f, code, 1);
1752 number_to_chars_bigendian (f + 1, M6812_JMP, 1);
1753 fixup16 (&operands[0].exp, M6811_OP_IND16, M6811_OP_IND16);
1757 /* Branch with a constant that must fit in 9-bits. */
1758 if (operands[1].exp.X_op == O_constant)
1760 if (!check_range (n, M6812_OP_IBCC_MARKER))
1762 as_bad (_("Operand out of range for a relative branch: `%ld'"),
1771 number_to_chars_bigendian (f, code, 1);
1772 number_to_chars_bigendian (f + 1, n & 0x0FF, 1);
1777 /* Branch offset must fit in 8-bits, don't do some relax. */
1778 if (jmp_mode == 0 && flag_fixed_branchs)
1780 fixup8 (&operands[0].exp, M6811_OP_JUMP_REL, M6811_OP_JUMP_REL);
1786 number_to_chars_bigendian (f, code, 1);
1787 number_to_chars_bigendian (f + 1, 0, 1);
1788 frag_var (rs_machine_dependent, 3, 3,
1789 ENCODE_RELAX (STATE_XBCC_BRANCH, STATE_UNDF),
1790 operands[1].exp.X_add_symbol, (offsetT) n, f);
1795 #define OP_EXTENDED (M6811_OP_PAGE2 | M6811_OP_PAGE3 | M6811_OP_PAGE4)
1797 /* Assemble the post index byte for 68HC12 extended addressing modes. */
1799 build_indexed_byte (op, format, move_insn)
1801 int format ATTRIBUTE_UNUSED;
1804 unsigned char byte = 0;
1809 val = op->exp.X_add_number;
1811 if (mode & M6812_AUTO_INC_DEC)
1814 if (mode & (M6812_POST_INC | M6812_POST_DEC))
1817 if (op->exp.X_op == O_constant)
1819 if (!check_range (val, mode))
1821 as_bad (_("Increment/decrement value is out of range: `%ld'."),
1824 if (mode & (M6812_POST_INC | M6812_PRE_INC))
1825 byte |= (val - 1) & 0x07;
1827 byte |= (8 - ((val) & 7)) | 0x8;
1832 as_fatal (_("Expecting a register."));
1847 as_bad (_("Invalid register for post/pre increment."));
1852 number_to_chars_bigendian (f, byte, 1);
1856 if (mode & (M6812_OP_IDX | M6812_OP_D_IDX_2))
1877 as_bad (_("Invalid register."));
1880 if (op->exp.X_op == O_constant)
1882 if (!check_range (val, M6812_OP_IDX))
1884 as_bad (_("Offset out of 16-bit range: %ld."), val);
1887 if (move_insn && !(val >= -16 && val <= 15))
1889 as_bad (_("Offset out of 5-bit range for movw/movb insn: %ld."),
1894 if (val >= -16 && val <= 15 && !(mode & M6812_OP_D_IDX_2))
1899 number_to_chars_bigendian (f, byte, 1);
1902 else if (val >= -256 && val <= 255 && !(mode & M6812_OP_D_IDX_2))
1909 number_to_chars_bigendian (f, byte, 1);
1910 number_to_chars_bigendian (f + 1, val & 0x0FF, 1);
1916 if (mode & M6812_OP_D_IDX_2)
1922 number_to_chars_bigendian (f, byte, 1);
1923 number_to_chars_bigendian (f + 1, val & 0x0FFFF, 2);
1927 if (mode & M6812_OP_D_IDX_2)
1929 byte = (byte << 3) | 0xe3;
1931 number_to_chars_bigendian (f, byte, 1);
1933 fixup16 (&op->exp, 0, 0);
1935 else if (op->reg1 != REG_PC)
1941 number_to_chars_bigendian (f, byte, 1);
1942 sym = op->exp.X_add_symbol;
1943 off = op->exp.X_add_number;
1944 if (op->exp.X_op != O_symbol)
1946 sym = make_expr_symbol (&op->exp);
1949 frag_var (rs_machine_dependent, 2, 2,
1950 ENCODE_RELAX (STATE_INDEXED_OFFSET, STATE_UNDF),
1956 number_to_chars_bigendian (f, byte, 1);
1957 frag_var (rs_machine_dependent, 2, 2,
1958 ENCODE_RELAX (STATE_INDEXED_OFFSET, STATE_UNDF),
1959 op->exp.X_add_symbol,
1960 op->exp.X_add_number, f);
1965 if (mode & (M6812_OP_REG | M6812_OP_D_IDX))
1967 if (mode & M6812_OP_D_IDX)
1969 if (op->reg1 != REG_D)
1970 as_bad (_("Expecting register D for indexed indirect mode."));
1972 as_bad (_("Indexed indirect mode is not allowed for movb/movw."));
1989 as_bad (_("Invalid accumulator register."));
2014 as_bad (_("Invalid indexed register."));
2018 number_to_chars_bigendian (f, byte, 1);
2022 as_fatal (_("Addressing mode not implemented yet."));
2026 /* Assemble the 68HC12 register mode byte. */
2028 build_reg_mode (op, format)
2035 if (format & M6812_OP_SEX_MARKER
2036 && op->reg1 != REG_A && op->reg1 != REG_B && op->reg1 != REG_CCR)
2037 as_bad (_("Invalid source register for this instruction, use 'tfr'."));
2038 else if (op->reg1 == REG_NONE || op->reg1 == REG_PC)
2039 as_bad (_("Invalid source register."));
2041 if (format & M6812_OP_SEX_MARKER
2042 && op->reg2 != REG_D
2043 && op->reg2 != REG_X && op->reg2 != REG_Y && op->reg2 != REG_SP)
2044 as_bad (_("Invalid destination register for this instruction, use 'tfr'."));
2045 else if (op->reg2 == REG_NONE || op->reg2 == REG_PC)
2046 as_bad (_("Invalid destination register."));
2048 byte = (op->reg1 << 4) | (op->reg2);
2049 if (format & M6812_OP_EXG_MARKER)
2053 number_to_chars_bigendian (f, byte, 1);
2057 /* build_insn takes a pointer to the opcode entry in the opcode table,
2058 the array of operand expressions and builds the correspding instruction.
2059 This operation only deals with non relative jumps insn (need special
2062 build_insn (opcode, operands, nb_operands)
2063 struct m68hc11_opcode *opcode;
2065 int nb_operands ATTRIBUTE_UNUSED;
2072 /* Put the page code instruction if there is one. */
2073 format = opcode->format;
2075 if (format & M6811_OP_BRANCH)
2076 fix_new (frag_now, frag_now_fix (), 1,
2077 &abs_symbol, 0, 1, BFD_RELOC_M68HC11_RL_JUMP);
2079 if (format & OP_EXTENDED)
2083 f = m68hc11_new_insn (2);
2084 if (format & M6811_OP_PAGE2)
2085 page_code = M6811_OPCODE_PAGE2;
2086 else if (format & M6811_OP_PAGE3)
2087 page_code = M6811_OPCODE_PAGE3;
2089 page_code = M6811_OPCODE_PAGE4;
2091 number_to_chars_bigendian (f, page_code, 1);
2095 f = m68hc11_new_insn (1);
2097 number_to_chars_bigendian (f, opcode->opcode, 1);
2101 /* The 68HC12 movb and movw instructions are special. We have to handle
2102 them in a special way. */
2103 if (format & (M6812_OP_IND16_P2 | M6812_OP_IDX_P2))
2106 if (format & M6812_OP_IDX)
2108 build_indexed_byte (&operands[0], format, 1);
2110 format &= ~M6812_OP_IDX;
2112 if (format & M6812_OP_IDX_P2)
2114 build_indexed_byte (&operands[1], format, 1);
2116 format &= ~M6812_OP_IDX_P2;
2120 if (format & (M6811_OP_DIRECT | M6811_OP_IMM8))
2122 fixup8 (&operands[i].exp,
2123 format & (M6811_OP_DIRECT | M6811_OP_IMM8 | M6812_OP_TRAP_ID),
2127 else if (IS_CALL_SYMBOL (format) && nb_operands == 1)
2129 format &= ~M6812_OP_PAGE;
2130 fixup24 (&operands[i].exp, format & M6811_OP_IND16,
2134 else if (format & (M6811_OP_IMM16 | M6811_OP_IND16))
2136 fixup16 (&operands[i].exp,
2137 format & (M6811_OP_IMM16 | M6811_OP_IND16 | M6812_OP_PAGE),
2141 else if (format & (M6811_OP_IX | M6811_OP_IY))
2143 if ((format & M6811_OP_IX) && (operands[0].reg1 != REG_X))
2144 as_bad (_("Invalid indexed register, expecting register X."));
2145 if ((format & M6811_OP_IY) && (operands[0].reg1 != REG_Y))
2146 as_bad (_("Invalid indexed register, expecting register Y."));
2148 fixup8 (&operands[0].exp, M6811_OP_IX, operands[0].mode);
2152 (M6812_OP_IDX | M6812_OP_IDX_2 | M6812_OP_IDX_1
2153 | M6812_OP_D_IDX | M6812_OP_D_IDX_2))
2155 build_indexed_byte (&operands[i], format, move_insn);
2158 else if (format & M6812_OP_REG && current_architecture & cpu6812)
2160 build_reg_mode (&operands[i], format);
2163 if (format & M6811_OP_BITMASK)
2165 fixup8 (&operands[i].exp, M6811_OP_BITMASK, operands[i].mode);
2168 if (format & M6811_OP_JUMP_REL)
2170 fixup8 (&operands[i].exp, M6811_OP_JUMP_REL, operands[i].mode);
2172 else if (format & M6812_OP_IND16_P2)
2174 fixup16 (&operands[1].exp, M6811_OP_IND16, operands[1].mode);
2176 if (format & M6812_OP_PAGE)
2178 fixup8 (&operands[i].exp, M6812_OP_PAGE, operands[i].mode);
2182 /* Opcode identification and operand analysis. */
2184 /* find() gets a pointer to an entry in the opcode table. It must look at all
2185 opcodes with the same name and use the operands to choose the correct
2186 opcode. Returns the opcode pointer if there was a match and 0 if none. */
2187 static struct m68hc11_opcode *
2188 find (opc, operands, nb_operands)
2189 struct m68hc11_opcode_def *opc;
2194 struct m68hc11_opcode *opcode;
2195 struct m68hc11_opcode *op_indirect;
2198 opcode = opc->opcode;
2200 /* Now search the opcode table table for one with operands
2201 that matches what we've got. We're only done if the operands matched so
2202 far AND there are no more to check. */
2203 for (pos = match = 0; match == 0 && pos < opc->nb_modes; pos++, opcode++)
2205 int poss_indirect = 0;
2206 long format = opcode->format;
2210 if (opcode->format & M6811_OP_MASK)
2212 if (opcode->format & M6811_OP_BITMASK)
2214 if (opcode->format & (M6811_OP_JUMP_REL | M6812_OP_JUMP_REL16))
2216 if (opcode->format & (M6812_OP_IND16_P2 | M6812_OP_IDX_P2))
2218 if ((opcode->format & M6812_OP_PAGE)
2219 && (!IS_CALL_SYMBOL (opcode->format) || nb_operands == 2))
2222 for (i = 0; expect == nb_operands && i < nb_operands; i++)
2224 int mode = operands[i].mode;
2226 if (mode & M6811_OP_IMM16)
2229 (M6811_OP_IMM8 | M6811_OP_IMM16 | M6811_OP_BITMASK))
2233 if (mode == M6811_OP_DIRECT)
2235 if (format & M6811_OP_DIRECT)
2238 /* If the operand is a page 0 operand, remember a
2239 possible <abs-16> addressing mode. We mark
2240 this and continue to check other operands. */
2241 if (format & M6811_OP_IND16
2242 && flag_strict_direct_addressing && op_indirect == 0)
2249 if (mode & M6811_OP_IND16)
2251 if (i == 0 && (format & M6811_OP_IND16) != 0)
2253 if (i != 0 && (format & M6812_OP_PAGE) != 0)
2255 if (i != 0 && (format & M6812_OP_IND16_P2) != 0)
2257 if (i == 0 && (format & M6811_OP_BITMASK))
2260 if (mode & (M6811_OP_JUMP_REL | M6812_OP_JUMP_REL16))
2262 if (format & (M6811_OP_JUMP_REL | M6812_OP_JUMP_REL16))
2265 if (mode & M6812_OP_REG)
2268 && (format & M6812_OP_REG)
2269 && (operands[i].reg2 == REG_NONE))
2272 && (format & M6812_OP_REG)
2273 && (format & M6812_OP_REG_2)
2274 && (operands[i].reg2 != REG_NONE))
2277 && (format & M6812_OP_IDX)
2278 && (operands[i].reg2 != REG_NONE))
2281 && (format & M6812_OP_IDX)
2282 && (format & (M6812_OP_IND16_P2 | M6812_OP_IDX_P2)))
2285 && (format & M6812_OP_IDX_P2))
2289 if (mode & M6812_OP_IDX)
2291 if (format & M6811_OP_IX && operands[i].reg1 == REG_X)
2293 if (format & M6811_OP_IY && operands[i].reg1 == REG_Y)
2296 && format & (M6812_OP_IDX | M6812_OP_IDX_1 | M6812_OP_IDX_2)
2297 && (operands[i].reg1 == REG_X
2298 || operands[i].reg1 == REG_Y
2299 || operands[i].reg1 == REG_SP
2300 || operands[i].reg1 == REG_PC))
2302 if (i == 1 && format & M6812_OP_IDX_P2)
2305 if (mode & format & (M6812_OP_D_IDX | M6812_OP_D_IDX_2))
2310 if (mode & M6812_AUTO_INC_DEC)
2313 && format & (M6812_OP_IDX | M6812_OP_IDX_1 |
2316 if (i == 1 && format & M6812_OP_IDX_P2)
2321 match = i == nb_operands;
2323 /* Operands are ok but an operand uses page 0 addressing mode
2324 while the insn supports abs-16 mode. Keep a reference to this
2325 insns in case there is no insn supporting page 0 addressing. */
2326 if (match && poss_indirect)
2328 op_indirect = opcode;
2335 /* Page 0 addressing is used but not supported by any insn.
2336 If absolute addresses are supported, we use that insn. */
2337 if (match == 0 && op_indirect)
2339 opcode = op_indirect;
2351 /* Find the real opcode and its associated operands. We use a progressive
2352 approach here. On entry, 'opc' points to the first opcode in the
2353 table that matches the opcode name in the source line. We try to
2354 isolate an operand, find a possible match in the opcode table.
2355 We isolate another operand if no match were found. The table 'operands'
2356 is filled while operands are recognized.
2358 Returns the opcode pointer that matches the opcode name in the
2359 source line and the associated operands. */
2360 static struct m68hc11_opcode *
2361 find_opcode (opc, operands, nb_operands)
2362 struct m68hc11_opcode_def *opc;
2366 struct m68hc11_opcode *opcode;
2369 if (opc->max_operands == 0)
2375 for (i = 0; i < opc->max_operands;)
2379 result = get_operand (&operands[i], i, opc->format);
2383 /* Special case where the bitmask of the bclr/brclr
2384 instructions is not introduced by #.
2385 Example: bclr 3,x $80. */
2386 if (i == 1 && (opc->format & M6811_OP_BITMASK)
2387 && (operands[i].mode & M6811_OP_IND16))
2389 operands[i].mode = M6811_OP_IMM16;
2394 if (i >= opc->min_operands)
2396 opcode = find (opc, operands, i);
2397 if (opcode && !(opcode->format & M6812_OP_PAGE))
2400 if (opcode && *input_line_pointer != ',')
2404 if (*input_line_pointer == ',')
2405 input_line_pointer++;
2411 #define M6812_XBCC_MARKER (M6812_OP_TBCC_MARKER \
2412 | M6812_OP_DBCC_MARKER \
2413 | M6812_OP_IBCC_MARKER)
2415 /* Gas line assembler entry point. */
2417 /* This is the main entry point for the machine-dependent assembler. str
2418 points to a machine-dependent instruction. This function is supposed to
2419 emit the frags/bytes it assembles to. */
2424 struct m68hc11_opcode_def *opc;
2425 struct m68hc11_opcode *opcode;
2427 unsigned char *op_start, *save;
2428 unsigned char *op_end;
2431 operand operands[M6811_MAX_OPERANDS];
2433 int branch_optimize = 0;
2436 /* Drop leading whitespace. */
2440 /* Find the opcode end and get the opcode in 'name'. The opcode is forced
2441 lower case (the opcode table only has lower case op-codes). */
2442 for (op_start = op_end = (unsigned char *) (str);
2443 *op_end && nlen < 20 && !is_end_of_line[*op_end] && *op_end != ' ';
2446 name[nlen] = TOLOWER (op_start[nlen]);
2453 as_bad (_("No instruction or missing opcode."));
2457 /* Find the opcode definition given its name. */
2458 opc = (struct m68hc11_opcode_def *) hash_find (m68hc11_hash, name);
2460 /* If it's not recognized, look for 'jbsr' and 'jbxx'. These are
2461 pseudo insns for relative branch. For these branchs, we always
2462 optimize them (turned into absolute branchs) even if --short-branchs
2464 if (opc == NULL && name[0] == 'j' && name[1] == 'b')
2466 opc = (struct m68hc11_opcode_def *) hash_find (m68hc11_hash, &name[1]);
2468 && (!(opc->format & M6811_OP_JUMP_REL)
2469 || (opc->format & M6811_OP_BITMASK)))
2472 branch_optimize = 1;
2475 /* The following test should probably be removed. This is not conform
2476 to Motorola assembler specs. */
2477 if (opc == NULL && flag_mri)
2479 if (*op_end == ' ' || *op_end == '\t')
2481 while (*op_end == ' ' || *op_end == '\t')
2486 (is_end_of_line[op_end[1]]
2487 || op_end[1] == ' ' || op_end[1] == '\t'
2488 || !ISALNUM (op_end[1])))
2489 && (*op_end == 'a' || *op_end == 'b'
2490 || *op_end == 'A' || *op_end == 'B'
2491 || *op_end == 'd' || *op_end == 'D'
2492 || *op_end == 'x' || *op_end == 'X'
2493 || *op_end == 'y' || *op_end == 'Y'))
2495 name[nlen++] = TOLOWER (*op_end++);
2497 opc = (struct m68hc11_opcode_def *) hash_find (m68hc11_hash,
2503 /* Identify a possible instruction alias. There are some on the
2504 68HC12 to emulate a few 68HC11 instructions. */
2505 if (opc == NULL && (current_architecture & cpu6812))
2509 for (i = 0; i < m68hc12_num_alias; i++)
2510 if (strcmp (m68hc12_alias[i].name, name) == 0)
2516 if (opc == NULL && alias_id < 0)
2518 as_bad (_("Opcode `%s' is not recognized."), name);
2521 save = input_line_pointer;
2522 input_line_pointer = op_end;
2527 opcode = find_opcode (opc, operands, &nb_operands);
2532 if ((opcode || alias_id >= 0) && !flag_mri)
2534 char *p = input_line_pointer;
2536 while (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r')
2539 if (*p != '\n' && *p)
2540 as_bad (_("Garbage at end of instruction: `%s'."), p);
2543 input_line_pointer = save;
2547 char *f = m68hc11_new_insn (m68hc12_alias[alias_id].size);
2549 number_to_chars_bigendian (f, m68hc12_alias[alias_id].code1, 1);
2550 if (m68hc12_alias[alias_id].size > 1)
2551 number_to_chars_bigendian (f + 1, m68hc12_alias[alias_id].code2, 1);
2556 /* Opcode is known but does not have valid operands. Print out the
2557 syntax for this opcode. */
2560 if (flag_print_insn_syntax)
2561 print_insn_format (name);
2563 as_bad (_("Invalid operand for `%s'"), name);
2567 /* Treat dbeq/ibeq/tbeq instructions in a special way. The branch is
2568 relative and must be in the range -256..255 (9-bits). */
2569 if ((opcode->format & M6812_XBCC_MARKER)
2570 && (opcode->format & M6811_OP_JUMP_REL))
2571 build_dbranch_insn (opcode, operands, nb_operands, branch_optimize);
2573 /* Relative jumps instructions are taken care of separately. We have to make
2574 sure that the relative branch is within the range -128..127. If it's out
2575 of range, the instructions are changed into absolute instructions.
2576 This is not supported for the brset and brclr instructions. */
2577 else if ((opcode->format & (M6811_OP_JUMP_REL | M6812_OP_JUMP_REL16))
2578 && !(opcode->format & M6811_OP_BITMASK))
2579 build_jump_insn (opcode, operands, nb_operands, branch_optimize);
2581 build_insn (opcode, operands, nb_operands);
2585 /* Pseudo op to control the ELF flags. */
2588 int x ATTRIBUTE_UNUSED;
2590 char *name = input_line_pointer, ch;
2592 while (!is_end_of_line[(unsigned char) *input_line_pointer])
2593 input_line_pointer++;
2594 ch = *input_line_pointer;
2595 *input_line_pointer = '\0';
2597 if (strcmp (name, "mshort") == 0)
2599 elf_flags &= ~E_M68HC11_I32;
2601 else if (strcmp (name, "mlong") == 0)
2603 elf_flags |= E_M68HC11_I32;
2605 else if (strcmp (name, "mshort-double") == 0)
2607 elf_flags &= ~E_M68HC11_F64;
2609 else if (strcmp (name, "mlong-double") == 0)
2611 elf_flags |= E_M68HC11_F64;
2615 as_warn (_("Invalid mode: %s\n"), name);
2617 *input_line_pointer = ch;
2618 demand_empty_rest_of_line ();
2621 /* Mark the symbols with STO_M68HC12_FAR to indicate the functions
2622 are using 'rtc' for returning. It is necessary to use 'call'
2623 to invoke them. This is also used by the debugger to correctly
2624 find the stack frame. */
2626 s_m68hc11_mark_symbol (mark)
2633 elf_symbol_type *elfsym;
2637 name = input_line_pointer;
2638 c = get_symbol_end ();
2639 symbolP = symbol_find_or_make (name);
2640 *input_line_pointer = c;
2644 bfdsym = symbol_get_bfdsym (symbolP);
2645 elfsym = elf_symbol_from (bfd_asymbol_bfd (bfdsym), bfdsym);
2649 /* Mark the symbol far (using rtc for function return). */
2650 elfsym->internal_elf_sym.st_other |= mark;
2654 input_line_pointer ++;
2658 if (*input_line_pointer == '\n')
2664 demand_empty_rest_of_line ();
2668 s_m68hc11_relax (ignore)
2669 int ignore ATTRIBUTE_UNUSED;
2675 if (ex.X_op != O_symbol || ex.X_add_number != 0)
2677 as_bad (_("bad .relax format"));
2678 ignore_rest_of_line ();
2682 fix_new_exp (frag_now, frag_now_fix (), 1, &ex, 1,
2683 BFD_RELOC_M68HC11_RL_GROUP);
2685 demand_empty_rest_of_line ();
2689 /* Relocation, relaxation and frag conversions. */
2691 /* PC-relative offsets are relative to the start of the
2692 next instruction. That is, the address of the offset, plus its
2693 size, since the offset is always the last part of the insn. */
2695 md_pcrel_from (fixP)
2698 if (fixP->fx_r_type == BFD_RELOC_M68HC11_RL_JUMP)
2701 return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
2704 /* If while processing a fixup, a reloc really needs to be created
2705 then it is done here. */
2707 tc_gen_reloc (section, fixp)
2708 asection *section ATTRIBUTE_UNUSED;
2713 reloc = (arelent *) xmalloc (sizeof (arelent));
2714 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
2715 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2716 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
2717 if (fixp->fx_r_type == 0)
2718 reloc->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_16);
2720 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
2721 if (reloc->howto == (reloc_howto_type *) NULL)
2723 as_bad_where (fixp->fx_file, fixp->fx_line,
2724 _("Relocation %d is not supported by object file format."),
2725 (int) fixp->fx_r_type);
2729 /* Since we use Rel instead of Rela, encode the vtable entry to be
2730 used in the relocation's section offset. */
2731 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
2732 reloc->address = fixp->fx_offset;
2738 /* We need a port-specific relaxation function to cope with sym2 - sym1
2739 relative expressions with both symbols in the same segment (but not
2740 necessarily in the same frag as this insn), for example:
2741 ldab sym2-(sym1-2),pc
2743 The offset can be 5, 9 or 16 bits long. */
2746 m68hc11_relax_frag (seg, fragP, stretch)
2747 segT seg ATTRIBUTE_UNUSED;
2749 long stretch ATTRIBUTE_UNUSED;
2754 const relax_typeS *this_type;
2755 const relax_typeS *start_type;
2756 relax_substateT next_state;
2757 relax_substateT this_state;
2758 const relax_typeS *table = TC_GENERIC_RELAX_TABLE;
2760 /* We only have to cope with frags as prepared by
2761 md_estimate_size_before_relax. The STATE_BITS16 case may geet here
2762 because of the different reasons that it's not relaxable. */
2763 switch (fragP->fr_subtype)
2765 case ENCODE_RELAX (STATE_INDEXED_OFFSET, STATE_BITS16):
2766 /* When we get to this state, the frag won't grow any more. */
2769 case ENCODE_RELAX (STATE_INDEXED_OFFSET, STATE_BITS5):
2770 case ENCODE_RELAX (STATE_INDEXED_OFFSET, STATE_BITS9):
2771 if (fragP->fr_symbol == NULL
2772 || S_GET_SEGMENT (fragP->fr_symbol) != absolute_section)
2773 as_fatal (_("internal inconsistency problem in %s: fr_symbol %lx"),
2774 __FUNCTION__, (long) fragP->fr_symbol);
2775 symbolP = fragP->fr_symbol;
2776 if (symbol_resolved_p (symbolP))
2777 as_fatal (_("internal inconsistency problem in %s: resolved symbol"),
2779 aim = S_GET_VALUE (symbolP);
2783 as_fatal (_("internal inconsistency problem in %s: fr_subtype %d"),
2784 __FUNCTION__, fragP->fr_subtype);
2787 /* The rest is stolen from relax_frag. There's no obvious way to
2788 share the code, but fortunately no requirement to keep in sync as
2789 long as fragP->fr_symbol does not have its segment changed. */
2791 this_state = fragP->fr_subtype;
2792 start_type = this_type = table + this_state;
2796 /* Look backwards. */
2797 for (next_state = this_type->rlx_more; next_state;)
2798 if (aim >= this_type->rlx_backward)
2802 /* Grow to next state. */
2803 this_state = next_state;
2804 this_type = table + this_state;
2805 next_state = this_type->rlx_more;
2810 /* Look forwards. */
2811 for (next_state = this_type->rlx_more; next_state;)
2812 if (aim <= this_type->rlx_forward)
2816 /* Grow to next state. */
2817 this_state = next_state;
2818 this_type = table + this_state;
2819 next_state = this_type->rlx_more;
2823 growth = this_type->rlx_length - start_type->rlx_length;
2825 fragP->fr_subtype = this_state;
2830 md_convert_frag (abfd, sec, fragP)
2831 bfd *abfd ATTRIBUTE_UNUSED;
2832 asection *sec ATTRIBUTE_UNUSED;
2838 char *buffer_address = fragP->fr_literal;
2840 /* Address in object code of the displacement. */
2841 register int object_address = fragP->fr_fix + fragP->fr_address;
2843 buffer_address += fragP->fr_fix;
2845 /* The displacement of the address, from current location. */
2846 value = S_GET_VALUE (fragP->fr_symbol);
2847 disp = (value + fragP->fr_offset) - object_address;
2849 switch (fragP->fr_subtype)
2851 case ENCODE_RELAX (STATE_PC_RELATIVE, STATE_BYTE):
2852 fragP->fr_opcode[1] = disp;
2855 case ENCODE_RELAX (STATE_PC_RELATIVE, STATE_WORD):
2856 /* This relax is only for bsr and bra. */
2857 assert (IS_OPCODE (fragP->fr_opcode[0], M6811_BSR)
2858 || IS_OPCODE (fragP->fr_opcode[0], M6811_BRA)
2859 || IS_OPCODE (fragP->fr_opcode[0], M6812_BSR));
2861 fragP->fr_opcode[0] = convert_branch (fragP->fr_opcode[0]);
2863 fix_new (fragP, fragP->fr_fix - 1, 2,
2864 fragP->fr_symbol, fragP->fr_offset, 0, BFD_RELOC_16);
2868 case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_BYTE):
2869 case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH_6812, STATE_BYTE):
2870 fragP->fr_opcode[1] = disp;
2873 case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH, STATE_WORD):
2874 /* Invert branch. */
2875 fragP->fr_opcode[0] ^= 1;
2876 fragP->fr_opcode[1] = 3; /* Branch offset. */
2877 buffer_address[0] = M6811_JMP;
2878 fix_new (fragP, fragP->fr_fix + 1, 2,
2879 fragP->fr_symbol, fragP->fr_offset, 0, BFD_RELOC_16);
2883 case ENCODE_RELAX (STATE_CONDITIONAL_BRANCH_6812, STATE_WORD):
2884 /* Translate branch into a long branch. */
2885 fragP->fr_opcode[1] = fragP->fr_opcode[0];
2886 fragP->fr_opcode[0] = M6811_OPCODE_PAGE2;
2888 fixp = fix_new (fragP, fragP->fr_fix, 2,
2889 fragP->fr_symbol, fragP->fr_offset, 1,
2890 BFD_RELOC_16_PCREL);
2891 fixp->fx_pcrel_adjust = 2;
2895 case ENCODE_RELAX (STATE_INDEXED_OFFSET, STATE_BITS5):
2896 if (fragP->fr_opcode[0] == 3
2897 && fragP->fr_symbol != 0
2898 && S_GET_SEGMENT (fragP->fr_symbol) != absolute_section)
2900 fragP->fr_opcode[0] = fragP->fr_opcode[0] << 6;
2901 fragP->fr_opcode[0] |= value & 0x1f;
2904 case ENCODE_RELAX (STATE_INDEXED_OFFSET, STATE_BITS9):
2905 if (fragP->fr_opcode[0] == 3
2906 && fragP->fr_symbol != 0
2907 && S_GET_SEGMENT (fragP->fr_symbol) != absolute_section)
2909 fragP->fr_opcode[0] = (fragP->fr_opcode[0] << 3);
2910 fragP->fr_opcode[0] |= 0xE0;
2911 fragP->fr_opcode[0] |= (value >> 8) & 1;
2912 fragP->fr_opcode[1] = value;
2916 case ENCODE_RELAX (STATE_INDEXED_OFFSET, STATE_BITS16):
2917 fragP->fr_opcode[0] = (fragP->fr_opcode[0] << 3);
2918 fragP->fr_opcode[0] |= 0xe2;
2919 if ((fragP->fr_opcode[0] & 0x0ff) == 0x0fa
2920 && fragP->fr_symbol != 0
2921 && S_GET_SEGMENT (fragP->fr_symbol) != absolute_section)
2923 fixp = fix_new (fragP, fragP->fr_fix, 2,
2924 fragP->fr_symbol, fragP->fr_offset,
2925 1, BFD_RELOC_16_PCREL);
2926 fixp->fx_pcrel_adjust = 2;
2930 fix_new (fragP, fragP->fr_fix, 2,
2931 fragP->fr_symbol, fragP->fr_offset, 0, BFD_RELOC_16);
2936 case ENCODE_RELAX (STATE_XBCC_BRANCH, STATE_BYTE):
2938 fragP->fr_opcode[0] |= 0x10;
2940 fragP->fr_opcode[1] = disp & 0x0FF;
2943 case ENCODE_RELAX (STATE_XBCC_BRANCH, STATE_WORD):
2944 /* Invert branch. */
2945 fragP->fr_opcode[0] ^= 0x20;
2946 fragP->fr_opcode[1] = 3; /* Branch offset. */
2947 buffer_address[0] = M6812_JMP;
2948 fix_new (fragP, fragP->fr_fix + 1, 2,
2949 fragP->fr_symbol, fragP->fr_offset, 0, BFD_RELOC_16);
2958 /* On an ELF system, we can't relax a weak symbol. The weak symbol
2959 can be overridden at final link time by a non weak symbol. We can
2960 relax externally visible symbol because there is no shared library
2961 and such symbol can't be overridden (unless they are weak). */
2963 relaxable_symbol (symbol)
2966 return ! S_IS_WEAK (symbol);
2969 /* Force truly undefined symbols to their maximum size, and generally set up
2970 the frag list to be relaxed. */
2972 md_estimate_size_before_relax (fragP, segment)
2976 if (RELAX_LENGTH (fragP->fr_subtype) == STATE_UNDF)
2978 if (S_GET_SEGMENT (fragP->fr_symbol) != segment
2979 || !relaxable_symbol (fragP->fr_symbol))
2981 /* Non-relaxable cases. */
2983 char *buffer_address;
2985 old_fr_fix = fragP->fr_fix;
2986 buffer_address = fragP->fr_fix + fragP->fr_literal;
2988 switch (RELAX_STATE (fragP->fr_subtype))
2990 case STATE_PC_RELATIVE:
2992 /* This relax is only for bsr and bra. */
2993 assert (IS_OPCODE (fragP->fr_opcode[0], M6811_BSR)
2994 || IS_OPCODE (fragP->fr_opcode[0], M6811_BRA)
2995 || IS_OPCODE (fragP->fr_opcode[0], M6812_BSR));
2997 if (flag_fixed_branchs)
2998 as_bad_where (fragP->fr_file, fragP->fr_line,
2999 _("bra or bsr with undefined symbol."));
3001 /* The symbol is undefined or in a separate section.
3002 Turn bra into a jmp and bsr into a jsr. The insn
3003 becomes 3 bytes long (instead of 2). A fixup is
3004 necessary for the unresolved symbol address. */
3005 fragP->fr_opcode[0] = convert_branch (fragP->fr_opcode[0]);
3007 fix_new (fragP, fragP->fr_fix - 1, 2, fragP->fr_symbol,
3008 fragP->fr_offset, 0, BFD_RELOC_16);
3012 case STATE_CONDITIONAL_BRANCH:
3013 assert (current_architecture & cpu6811);
3015 fragP->fr_opcode[0] ^= 1; /* Reverse sense of branch. */
3016 fragP->fr_opcode[1] = 3; /* Skip next jmp insn (3 bytes). */
3018 /* Don't use fr_opcode[2] because this may be
3019 in a different frag. */
3020 buffer_address[0] = M6811_JMP;
3023 fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
3024 fragP->fr_offset, 0, BFD_RELOC_16);
3028 case STATE_INDEXED_OFFSET:
3029 assert (current_architecture & cpu6812);
3031 if (fragP->fr_symbol
3032 && S_GET_SEGMENT (fragP->fr_symbol) == absolute_section)
3034 fragP->fr_subtype = ENCODE_RELAX (STATE_INDEXED_OFFSET,
3036 /* Return the size of the variable part of the frag. */
3037 return md_relax_table[fragP->fr_subtype].rlx_length;
3041 /* Switch the indexed operation to 16-bit mode. */
3042 fragP->fr_opcode[0] = fragP->fr_opcode[0] << 3;
3043 fragP->fr_opcode[0] |= 0xe2;
3044 fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
3045 fragP->fr_offset, 0, BFD_RELOC_16);
3050 case STATE_XBCC_BRANCH:
3051 assert (current_architecture & cpu6812);
3053 fragP->fr_opcode[0] ^= 0x20; /* Reverse sense of branch. */
3054 fragP->fr_opcode[1] = 3; /* Skip next jmp insn (3 bytes). */
3056 /* Don't use fr_opcode[2] because this may be
3057 in a different frag. */
3058 buffer_address[0] = M6812_JMP;
3061 fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
3062 fragP->fr_offset, 0, BFD_RELOC_16);
3066 case STATE_CONDITIONAL_BRANCH_6812:
3067 assert (current_architecture & cpu6812);
3069 /* Translate into a lbcc branch. */
3070 fragP->fr_opcode[1] = fragP->fr_opcode[0];
3071 fragP->fr_opcode[0] = M6811_OPCODE_PAGE2;
3073 fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
3074 fragP->fr_offset, 1, BFD_RELOC_16_PCREL);
3079 as_fatal (_("Subtype %d is not recognized."), fragP->fr_subtype);
3083 /* Return the growth in the fixed part of the frag. */
3084 return fragP->fr_fix - old_fr_fix;
3087 /* Relaxable cases. */
3088 switch (RELAX_STATE (fragP->fr_subtype))
3090 case STATE_PC_RELATIVE:
3091 /* This relax is only for bsr and bra. */
3092 assert (IS_OPCODE (fragP->fr_opcode[0], M6811_BSR)
3093 || IS_OPCODE (fragP->fr_opcode[0], M6811_BRA)
3094 || IS_OPCODE (fragP->fr_opcode[0], M6812_BSR));
3096 fragP->fr_subtype = ENCODE_RELAX (STATE_PC_RELATIVE, STATE_BYTE);
3099 case STATE_CONDITIONAL_BRANCH:
3100 assert (current_architecture & cpu6811);
3102 fragP->fr_subtype = ENCODE_RELAX (STATE_CONDITIONAL_BRANCH,
3106 case STATE_INDEXED_OFFSET:
3107 assert (current_architecture & cpu6812);
3109 fragP->fr_subtype = ENCODE_RELAX (STATE_INDEXED_OFFSET,
3113 case STATE_XBCC_BRANCH:
3114 assert (current_architecture & cpu6812);
3116 fragP->fr_subtype = ENCODE_RELAX (STATE_XBCC_BRANCH, STATE_BYTE);
3119 case STATE_CONDITIONAL_BRANCH_6812:
3120 assert (current_architecture & cpu6812);
3122 fragP->fr_subtype = ENCODE_RELAX (STATE_CONDITIONAL_BRANCH_6812,
3128 if (fragP->fr_subtype >= sizeof (md_relax_table) / sizeof (md_relax_table[0]))
3129 as_fatal (_("Subtype %d is not recognized."), fragP->fr_subtype);
3131 /* Return the size of the variable part of the frag. */
3132 return md_relax_table[fragP->fr_subtype].rlx_length;
3135 /* See whether we need to force a relocation into the output file. */
3137 tc_m68hc11_force_relocation (fixP)
3140 switch (fixP->fx_r_type)
3142 case BFD_RELOC_VTABLE_INHERIT:
3143 case BFD_RELOC_VTABLE_ENTRY:
3144 case BFD_RELOC_M68HC11_RL_GROUP:
3151 return S_FORCE_RELOC (fixP->fx_addsy);
3154 /* Here we decide which fixups can be adjusted to make them relative
3155 to the beginning of the section instead of the symbol. Basically
3156 we need to make sure that the linker relaxation is done
3157 correctly, so in some cases we force the original symbol to be
3160 tc_m68hc11_fix_adjustable (fixP)
3163 switch (fixP->fx_r_type)
3165 /* For the linker relaxation to work correctly, these relocs
3166 need to be on the symbol itself. */
3168 case BFD_RELOC_LO16:
3169 case BFD_RELOC_M68HC11_RL_JUMP:
3170 case BFD_RELOC_M68HC11_RL_GROUP:
3171 case BFD_RELOC_VTABLE_INHERIT:
3172 case BFD_RELOC_VTABLE_ENTRY:
3182 md_apply_fix3 (fixP, valP, seg)
3185 segT seg ATTRIBUTE_UNUSED;
3188 long value = * valP;
3191 if (fixP->fx_addsy == (symbolS *) NULL)
3194 /* We don't actually support subtracting a symbol. */
3195 if (fixP->fx_subsy != (symbolS *) NULL)
3196 as_bad_where (fixP->fx_file, fixP->fx_line, _("Expression too complex."));
3198 op_type = fixP->fx_r_type;
3200 /* Patch the instruction with the resolved operand. Elf relocation
3201 info will also be generated to take care of linker/loader fixups.
3202 The 68HC11 addresses only 64Kb, we are only concerned by 8 and 16-bit
3203 relocs. BFD_RELOC_8 is basically used for .page0 access (the linker
3204 will warn for overflows). BFD_RELOC_8_PCREL should not be generated
3205 because it's either resolved or turned out into non-relative insns (see
3206 relax table, bcc, bra, bsr transformations)
3208 The BFD_RELOC_32 is necessary for the support of --gstabs. */
3209 where = fixP->fx_frag->fr_literal + fixP->fx_where;
3211 switch (fixP->fx_r_type)
3214 bfd_putb32 ((bfd_vma) value, (unsigned char *) where);
3218 case BFD_RELOC_M68HC11_24:
3219 bfd_putb16 ((bfd_vma) (value & 0x0ffff), (unsigned char *) where);
3220 ((bfd_byte*) where)[2] = ((value >> 16) & 0x0ff);
3224 case BFD_RELOC_16_PCREL:
3225 case BFD_RELOC_M68HC11_LO16:
3226 bfd_putb16 ((bfd_vma) value, (unsigned char *) where);
3227 if (value < -65537 || value > 65535)
3228 as_bad_where (fixP->fx_file, fixP->fx_line,
3229 _("Value out of 16-bit range."));
3232 case BFD_RELOC_M68HC11_HI8:
3236 case BFD_RELOC_M68HC11_LO8:
3238 case BFD_RELOC_M68HC11_PAGE:
3240 bfd_putb8 ((bfd_vma) value, (unsigned char *) where);
3242 ((bfd_byte *) where)[0] = (bfd_byte) value;
3245 case BFD_RELOC_8_PCREL:
3247 bfd_putb8 ((bfd_vma) value, (unsigned char *) where);
3249 ((bfd_byte *) where)[0] = (bfd_byte) value;
3251 if (value < -128 || value > 127)
3252 as_bad_where (fixP->fx_file, fixP->fx_line,
3253 _("Value %ld too large for 8-bit PC-relative branch."),
3257 case BFD_RELOC_M68HC11_3B:
3258 if (value <= 0 || value > 8)
3259 as_bad_where (fixP->fx_file, fixP->fx_line,
3260 _("Auto increment/decrement offset '%ld' is out of range."),
3267 where[0] = where[0] | (value & 0x07);
3270 case BFD_RELOC_M68HC11_RL_JUMP:
3271 case BFD_RELOC_M68HC11_RL_GROUP:
3272 case BFD_RELOC_VTABLE_INHERIT:
3273 case BFD_RELOC_VTABLE_ENTRY:
3278 as_fatal (_("Line %d: unknown relocation type: 0x%x."),
3279 fixP->fx_line, fixP->fx_r_type);
3283 /* Set the ELF specific flags. */
3285 m68hc11_elf_final_processing ()
3287 elf_elfheader (stdoutput)->e_flags &= ~EF_M68HC11_ABI;
3288 elf_elfheader (stdoutput)->e_flags |= elf_flags;