1 /* tc-cr16.c -- Assembler code for the CR16 CPU core.
2 Copyright (C) 2007-2017 Free Software Foundation, Inc.
4 Contributed by M R Swami Reddy <MR.Swami.Reddy@nsc.com>
6 This file is part of GAS, the GNU Assembler.
8 GAS is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
13 GAS is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GAS; see the file COPYING. If not, write to the
20 Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
24 #include "safe-ctype.h"
25 #include "dwarf2dbg.h"
26 #include "opcode/cr16.h"
30 /* Word is considered here as a 16-bit unsigned short int. */
33 /* Register is 2-byte size. */
36 /* Maximum size of a single instruction (in words). */
37 #define INSN_MAX_SIZE 3
39 /* Maximum bits which may be set in a `mask16' operand. */
40 #define MAX_REGS_IN_MASK16 8
42 /* Assign a number NUM, shifted by SHIFT bytes, into a location
43 pointed by index BYTE of array 'output_opcode'. */
44 #define CR16_PRINT(BYTE, NUM, SHIFT) output_opcode[BYTE] |= (NUM << SHIFT)
49 OP_LEGAL = 0, /* Legal operand. */
50 OP_OUT_OF_RANGE, /* Operand not within permitted range. */
51 OP_NOT_EVEN /* Operand is Odd number, should be even. */
55 /* Opcode mnemonics hash table. */
56 static struct hash_control *cr16_inst_hash;
57 /* CR16 registers hash table. */
58 static struct hash_control *reg_hash;
59 /* CR16 register pair hash table. */
60 static struct hash_control *regp_hash;
61 /* CR16 processor registers hash table. */
62 static struct hash_control *preg_hash;
63 /* CR16 processor registers 32 bit hash table. */
64 static struct hash_control *pregp_hash;
65 /* Current instruction we're assembling. */
66 const inst *instruction;
69 static int code_label = 0;
71 /* Global variables. */
73 /* Array to hold an instruction encoding. */
74 long output_opcode[2];
76 /* Nonzero means a relocatable symbol. */
79 /* A copy of the original instruction (used in error messages). */
80 char ins_parse[MAX_INST_LEN];
82 /* The current processed argument number. */
85 /* Generic assembler global variables which must be defined by all targets. */
87 /* Characters which always start a comment. */
88 const char comment_chars[] = "#";
90 /* Characters which start a comment at the beginning of a line. */
91 const char line_comment_chars[] = "#";
93 /* This array holds machine specific line separator characters. */
94 const char line_separator_chars[] = ";";
96 /* Chars that can be used to separate mant from exp in floating point nums. */
97 const char EXP_CHARS[] = "eE";
99 /* Chars that mean this number is a floating point constant as in 0f12.456 */
100 const char FLT_CHARS[] = "f'";
103 /* Pre-defined "_GLOBAL_OFFSET_TABLE_" */
104 symbolS * GOT_symbol;
107 /* Target-specific multicharacter options, not const-declared at usage. */
108 const char *md_shortopts = "";
109 struct option md_longopts[] =
111 {NULL, no_argument, NULL, 0}
113 size_t md_longopts_size = sizeof (md_longopts);
121 #ifdef md_flush_pending_output
122 md_flush_pending_output ();
125 if (is_it_end_of_statement ())
127 demand_empty_rest_of_line ();
131 #ifdef TC_ADDRESS_BYTES
133 nbytes = TC_ADDRESS_BYTES ();
137 md_cons_align (nbytes);
143 unsigned int bits_available = BITS_PER_CHAR * nbytes;
144 char *hold = input_line_pointer;
148 if (*input_line_pointer == ':')
157 if (*input_line_pointer != ':')
159 input_line_pointer = hold;
162 if (exp.X_op == O_absent)
164 as_warn (_("using a bit field width of zero"));
165 exp.X_add_number = 0;
166 exp.X_op = O_constant;
169 if (exp.X_op != O_constant)
171 *input_line_pointer = '\0';
172 as_bad (_("field width \"%s\" too complex for a bitfield"), hold);
173 *input_line_pointer = ':';
174 demand_empty_rest_of_line ();
178 if ((width = exp.X_add_number) >
179 (unsigned int)(BITS_PER_CHAR * nbytes))
181 as_warn (ngettext ("field width %lu too big to fit in %d"
182 " byte: truncated to %d bits",
183 "field width %lu too big to fit in %d"
184 " bytes: truncated to %d bits",
186 width, nbytes, (BITS_PER_CHAR * nbytes));
187 width = BITS_PER_CHAR * nbytes;
191 if (width > bits_available)
193 /* FIXME-SOMEDAY: backing up and reparsing is wasteful. */
194 input_line_pointer = hold;
195 exp.X_add_number = value;
200 hold = ++input_line_pointer;
203 if (exp.X_op != O_constant)
205 char cache = *input_line_pointer;
207 *input_line_pointer = '\0';
208 as_bad (_("field value \"%s\" too complex for a bitfield"), hold);
209 *input_line_pointer = cache;
210 demand_empty_rest_of_line ();
214 value |= ((~(-(1 << width)) & exp.X_add_number)
215 << ((BITS_PER_CHAR * nbytes) - bits_available));
217 if ((bits_available -= width) == 0
218 || is_it_end_of_statement ()
219 || *input_line_pointer != ',')
222 hold = ++input_line_pointer;
226 exp.X_add_number = value;
227 exp.X_op = O_constant;
231 if ((*(input_line_pointer) == '@') && (*(input_line_pointer +1) == 'c'))
233 emit_expr (&exp, (unsigned int) nbytes);
235 if ((*(input_line_pointer) == '@') && (*(input_line_pointer +1) == 'c'))
237 input_line_pointer +=3;
241 while ((*input_line_pointer++ == ','));
243 /* Put terminator back into stream. */
244 input_line_pointer--;
246 demand_empty_rest_of_line ();
249 /* This table describes all the machine specific pseudo-ops
250 the assembler has to support. The fields are:
251 *** Pseudo-op name without dot.
252 *** Function to call to execute this pseudo-op.
253 *** Integer arg to pass to the function. */
255 const pseudo_typeS md_pseudo_table[] =
257 /* In CR16 machine, align is in bytes (not a ptwo boundary). */
258 {"align", s_align_bytes, 0},
259 {"long", l_cons, 4 },
260 {"4byte", l_cons, 4 },
264 /* CR16 relaxation table. */
265 const relax_typeS md_relax_table[] =
268 {0x7f, -0x80, 2, 1}, /* 8 */
269 {0xfffe, -0x10000, 4, 2}, /* 16 */
270 {0xfffffe, -0x1000000, 6, 0}, /* 24 */
273 /* Return the bit size for a given operand. */
276 get_opbits (operand_type op)
279 return cr16_optab[op].bit_size;
284 /* Return the argument type of a given operand. */
287 get_optype (operand_type op)
290 return cr16_optab[op].arg_type;
295 /* Return the flags of a given operand. */
298 get_opflags (operand_type op)
301 return cr16_optab[op].flags;
306 /* Get the cc code. */
309 get_cc (char *cc_name)
313 for (i = 0; i < cr16_num_cc; i++)
314 if (strcmp (cc_name, cr16_b_cond_tab[i]) == 0)
320 /* Get the core processor register 'reg_name'. */
323 get_register (char *reg_name)
325 const reg_entry *rreg;
327 rreg = (const reg_entry *) hash_find (reg_hash, reg_name);
330 return rreg->value.reg_val;
334 /* Get the core processor register-pair 'reg_name'. */
337 get_register_pair (char *reg_name)
339 const reg_entry *rreg;
340 char tmp_rp[16]="\0";
342 /* Add '(' and ')' to the reg pair, if it's not present. */
343 if (reg_name[0] != '(')
346 strcat (tmp_rp, reg_name);
348 rreg = (const reg_entry *) hash_find (regp_hash, tmp_rp);
351 rreg = (const reg_entry *) hash_find (regp_hash, reg_name);
354 return rreg->value.reg_val;
359 /* Get the index register 'reg_name'. */
362 get_index_register (char *reg_name)
364 const reg_entry *rreg;
366 rreg = (const reg_entry *) hash_find (reg_hash, reg_name);
369 && ((rreg->value.reg_val == 12) || (rreg->value.reg_val == 13)))
370 return rreg->value.reg_val;
374 /* Get the core processor index register-pair 'reg_name'. */
377 get_index_register_pair (char *reg_name)
379 const reg_entry *rreg;
381 rreg = (const reg_entry *) hash_find (regp_hash, reg_name);
385 if ((rreg->value.reg_val != 1) || (rreg->value.reg_val != 7)
386 || (rreg->value.reg_val != 9) || (rreg->value.reg_val > 10))
387 return rreg->value.reg_val;
389 as_bad (_("Unknown register pair - index relative mode: `%d'"), rreg->value.reg_val);
395 /* Get the processor register 'preg_name'. */
398 get_pregister (char *preg_name)
400 const reg_entry *prreg;
402 prreg = (const reg_entry *) hash_find (preg_hash, preg_name);
405 return prreg->value.preg_val;
407 return nullpregister;
410 /* Get the processor register 'preg_name 32 bit'. */
413 get_pregisterp (char *preg_name)
415 const reg_entry *prreg;
417 prreg = (const reg_entry *) hash_find (pregp_hash, preg_name);
420 return prreg->value.preg_val;
422 return nullpregister;
426 /* Round up a section size to the appropriate boundary. */
429 md_section_align (segT seg, valueT val)
431 /* Round .text section to a multiple of 2. */
432 if (seg == text_section)
433 return (val + 1) & ~1;
437 /* Parse an operand that is machine-specific (remove '*'). */
440 md_operand (expressionS * exp)
442 char c = *input_line_pointer;
447 input_line_pointer++;
455 /* Reset global variables before parsing a new instruction. */
458 reset_vars (char *op)
460 cur_arg_num = relocatable = 0;
461 memset (& output_opcode, '\0', sizeof (output_opcode));
463 /* Save a copy of the original OP (used in error messages). */
464 strncpy (ins_parse, op, sizeof ins_parse - 1);
465 ins_parse [sizeof ins_parse - 1] = 0;
468 /* This macro decides whether a particular reloc is an entry in a
469 switch table. It is used when relaxing, because the linker needs
470 to know about all such entries so that it can adjust them if
473 #define SWITCH_TABLE(fix) \
474 ( (fix)->fx_addsy != NULL \
475 && (fix)->fx_subsy != NULL \
476 && S_GET_SEGMENT ((fix)->fx_addsy) == \
477 S_GET_SEGMENT ((fix)->fx_subsy) \
478 && S_GET_SEGMENT (fix->fx_addsy) != undefined_section \
479 && ( (fix)->fx_r_type == BFD_RELOC_CR16_NUM8 \
480 || (fix)->fx_r_type == BFD_RELOC_CR16_NUM16 \
481 || (fix)->fx_r_type == BFD_RELOC_CR16_NUM32 \
482 || (fix)->fx_r_type == BFD_RELOC_CR16_NUM32a))
484 /* See whether we need to force a relocation into the output file.
485 This is used to force out switch and PC relative relocations when
489 cr16_force_relocation (fixS *fix)
491 if (generic_force_reloc (fix) || SWITCH_TABLE (fix))
497 /* Record a fixup for a cons expression. */
500 cr16_cons_fix_new (fragS *frag, int offset, int len, expressionS *exp,
501 bfd_reloc_code_real_type rtype)
505 default: rtype = BFD_RELOC_NONE; break;
506 case 1: rtype = BFD_RELOC_CR16_NUM8 ; break;
507 case 2: rtype = BFD_RELOC_CR16_NUM16; break;
511 rtype = BFD_RELOC_CR16_NUM32a;
515 rtype = BFD_RELOC_CR16_NUM32;
519 fix_new_exp (frag, offset, len, exp, 0, rtype);
522 /* Generate a relocation entry for a fixup. */
525 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS * fixP)
529 /* If symbols are local and resolved, then no relocation needed. */
530 if ( ((fixP->fx_addsy)
531 && (S_GET_SEGMENT (fixP->fx_addsy) == absolute_section))
533 && (S_GET_SEGMENT (fixP->fx_subsy) == absolute_section)))
536 reloc = XNEW (arelent);
537 reloc->sym_ptr_ptr = XNEW (asymbol *);
538 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy);
539 reloc->address = fixP->fx_frag->fr_address + fixP->fx_where;
540 reloc->addend = fixP->fx_offset;
542 if (fixP->fx_subsy != NULL)
544 if (SWITCH_TABLE (fixP))
546 /* Keep the current difference in the addend. */
547 reloc->addend = (S_GET_VALUE (fixP->fx_addsy)
548 - S_GET_VALUE (fixP->fx_subsy) + fixP->fx_offset);
550 switch (fixP->fx_r_type)
552 case BFD_RELOC_CR16_NUM8:
553 fixP->fx_r_type = BFD_RELOC_CR16_SWITCH8;
555 case BFD_RELOC_CR16_NUM16:
556 fixP->fx_r_type = BFD_RELOC_CR16_SWITCH16;
558 case BFD_RELOC_CR16_NUM32:
559 fixP->fx_r_type = BFD_RELOC_CR16_SWITCH32;
561 case BFD_RELOC_CR16_NUM32a:
562 fixP->fx_r_type = BFD_RELOC_CR16_NUM32a;
571 /* We only resolve difference expressions in the same section. */
572 as_bad_where (fixP->fx_file, fixP->fx_line,
573 _("can't resolve `%s' {%s section} - `%s' {%s section}"),
574 fixP->fx_addsy ? S_GET_NAME (fixP->fx_addsy) : "0",
575 segment_name (fixP->fx_addsy
576 ? S_GET_SEGMENT (fixP->fx_addsy)
578 S_GET_NAME (fixP->fx_subsy),
579 segment_name (S_GET_SEGMENT (fixP->fx_addsy)));
583 if ((fixP->fx_r_type == BFD_RELOC_CR16_GOT_REGREL20)
585 && fixP->fx_addsy == GOT_symbol)
587 reloc->addend = fixP->fx_offset = reloc->address;
589 else if ((fixP->fx_r_type == BFD_RELOC_CR16_GOTC_REGREL20)
591 && fixP->fx_addsy == GOT_symbol)
593 reloc->addend = fixP->fx_offset = reloc->address;
597 gas_assert ((int) fixP->fx_r_type > 0);
598 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
600 if (reloc->howto == NULL)
602 as_bad_where (fixP->fx_file, fixP->fx_line,
603 _("internal error: reloc %d (`%s') not supported by object file format"),
605 bfd_get_reloc_code_name (fixP->fx_r_type));
608 gas_assert (!fixP->fx_pcrel == !reloc->howto->pc_relative);
613 /* Prepare machine-dependent frags for relaxation. */
616 md_estimate_size_before_relax (fragS *fragp, asection *seg)
618 /* If symbol is undefined or located in a different section,
619 select the largest supported relocation. */
620 relax_substateT subtype;
621 relax_substateT rlx_state[] = {0, 2};
623 for (subtype = 0; subtype < ARRAY_SIZE (rlx_state); subtype += 2)
625 if (fragp->fr_subtype == rlx_state[subtype]
626 && (!S_IS_DEFINED (fragp->fr_symbol)
627 || seg != S_GET_SEGMENT (fragp->fr_symbol)))
629 fragp->fr_subtype = rlx_state[subtype + 1];
634 if (fragp->fr_subtype >= ARRAY_SIZE (md_relax_table))
637 return md_relax_table[fragp->fr_subtype].rlx_length;
641 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, fragS *fragP)
643 /* 'opcode' points to the start of the instruction, whether
644 we need to change the instruction's fixed encoding. */
645 char *opcode = fragP->fr_literal + fragP->fr_fix;
646 bfd_reloc_code_real_type reloc;
648 subseg_change (sec, 0);
650 switch (fragP->fr_subtype)
653 reloc = BFD_RELOC_CR16_DISP8;
656 /* If the subtype is not changed due to :m operand qualifier,
657 then no need to update the opcode value. */
658 if ((int)opcode[1] != 0x18)
660 opcode[0] = (opcode[0] & 0xf0);
663 reloc = BFD_RELOC_CR16_DISP16;
666 /* If the subtype is not changed due to :l operand qualifier,
667 then no need to update the opcode value. */
668 if ((int)opcode[1] != 0)
670 opcode[2] = opcode[0];
671 opcode[0] = opcode[1];
674 reloc = BFD_RELOC_CR16_DISP24;
680 fix_new (fragP, fragP->fr_fix,
681 bfd_get_reloc_size (bfd_reloc_type_lookup (stdoutput, reloc)),
682 fragP->fr_symbol, fragP->fr_offset, 1, reloc);
684 fragP->fr_fix += md_relax_table[fragP->fr_subtype].rlx_length;
688 md_undefined_symbol (char *name)
690 if (*name == '_' && *(name + 1) == 'G'
691 && strcmp (name, "_GLOBAL_OFFSET_TABLE_") == 0)
695 if (symbol_find (name))
696 as_bad (_("GOT already in symbol table"));
697 GOT_symbol = symbol_new (name, undefined_section,
698 (valueT) 0, &zero_address_frag);
705 /* Process machine-dependent command line options. Called once for
706 each option on the command line that the machine-independent part of
707 GAS does not understand. */
710 md_parse_option (int c ATTRIBUTE_UNUSED, const char *arg ATTRIBUTE_UNUSED)
715 /* Machine-dependent usage-output. */
718 md_show_usage (FILE *stream ATTRIBUTE_UNUSED)
724 md_atof (int type, char *litP, int *sizeP)
726 return ieee_md_atof (type, litP, sizeP, target_big_endian);
729 /* Apply a fixS (fixup of an instruction or data that we didn't have
730 enough info to complete immediately) to the data in a frag.
731 Since linkrelax is nonzero and TC_LINKRELAX_FIXUP is defined to disable
732 relaxation of debug sections, this function is called only when
733 fixuping relocations of debug sections. */
736 md_apply_fix (fixS *fixP, valueT *valP, segT seg)
740 if (fixP->fx_addsy == NULL
741 && fixP->fx_pcrel == 0)
743 else if (fixP->fx_pcrel == 1
744 && fixP->fx_addsy != NULL
745 && S_GET_SEGMENT (fixP->fx_addsy) == seg)
750 if (fixP->fx_addsy != NULL && !fixP->fx_pcrel)
752 val = fixP->fx_offset;
758 char *buf = fixP->fx_frag->fr_literal + fixP->fx_where;
762 switch (fixP->fx_r_type)
764 case BFD_RELOC_CR16_NUM8:
765 bfd_put_8 (stdoutput, (unsigned char) val, buf);
767 case BFD_RELOC_CR16_NUM16:
768 bfd_put_16 (stdoutput, val, buf);
770 case BFD_RELOC_CR16_NUM32:
771 bfd_put_32 (stdoutput, val, buf);
773 case BFD_RELOC_CR16_NUM32a:
774 bfd_put_32 (stdoutput, val, buf);
777 /* We shouldn't ever get here because linkrelax is nonzero. */
784 fixP->fx_offset = * valP;
787 /* The location from which a PC relative jump should be calculated,
788 given a PC relative reloc. */
791 md_pcrel_from (fixS *fixp)
793 return fixp->fx_frag->fr_address + fixp->fx_where;
797 initialise_reg_hash_table (struct hash_control ** hash_table,
798 const reg_entry * register_table,
799 const unsigned int num_entries)
801 const reg_entry * rreg;
804 if ((* hash_table = hash_new ()) == NULL)
805 as_fatal (_("Virtual memory exhausted"));
807 for (rreg = register_table;
808 rreg < (register_table + num_entries);
811 hashret = hash_insert (* hash_table, rreg->name, (char *) rreg);
813 as_fatal (_("Internal Error: Can't hash %s: %s"),
814 rreg->name, hashret);
818 /* This function is called once, at assembler startup time. This should
819 set up all the tables, etc that the MD part of the assembler needs. */
826 /* Set up a hash table for the instructions. */
827 if ((cr16_inst_hash = hash_new ()) == NULL)
828 as_fatal (_("Virtual memory exhausted"));
830 while (cr16_instruction[i].mnemonic != NULL)
833 const char *mnemonic = cr16_instruction[i].mnemonic;
835 hashret = hash_insert (cr16_inst_hash, mnemonic,
836 (char *)(cr16_instruction + i));
838 if (hashret != NULL && *hashret != '\0')
839 as_fatal (_("Can't hash `%s': %s\n"), cr16_instruction[i].mnemonic,
840 *hashret == 0 ? _("(unknown reason)") : hashret);
842 /* Insert unique names into hash table. The CR16 instruction set
843 has many identical opcode names that have different opcodes based
844 on the operands. This hash table then provides a quick index to
845 the first opcode with a particular name in the opcode table. */
850 while (cr16_instruction[i].mnemonic != NULL
851 && streq (cr16_instruction[i].mnemonic, mnemonic));
854 /* Initialize reg_hash hash table. */
855 initialise_reg_hash_table (& reg_hash, cr16_regtab, NUMREGS);
856 /* Initialize regp_hash hash table. */
857 initialise_reg_hash_table (& regp_hash, cr16_regptab, NUMREGPS);
858 /* Initialize preg_hash hash table. */
859 initialise_reg_hash_table (& preg_hash, cr16_pregtab, NUMPREGS);
860 /* Initialize pregp_hash hash table. */
861 initialise_reg_hash_table (& pregp_hash, cr16_pregptab, NUMPREGPS);
863 /* Set linkrelax here to avoid fixups in most sections. */
867 /* Process constants (immediate/absolute)
868 and labels (jump targets/Memory locations). */
871 process_label_constant (char *str, ins * cr16_ins)
873 char *saved_input_line_pointer;
874 int symbol_with_at = 0;
875 int symbol_with_s = 0;
876 int symbol_with_m = 0;
877 int symbol_with_l = 0;
878 int symbol_with_at_got = 0;
879 int symbol_with_at_gotc = 0;
880 argument *cur_arg = cr16_ins->arg + cur_arg_num; /* Current argument. */
882 saved_input_line_pointer = input_line_pointer;
883 input_line_pointer = str;
885 expression (&cr16_ins->exp);
887 switch (cr16_ins->exp.X_op)
891 /* Missing or bad expr becomes absolute 0. */
892 as_bad (_("missing or invalid displacement expression `%s' taken as 0"),
894 cr16_ins->exp.X_op = O_constant;
895 cr16_ins->exp.X_add_number = 0;
896 cr16_ins->exp.X_add_symbol = NULL;
897 cr16_ins->exp.X_op_symbol = NULL;
901 cur_arg->X_op = O_constant;
902 cur_arg->constant = cr16_ins->exp.X_add_number;
908 cur_arg->X_op = O_symbol;
909 cur_arg->constant = cr16_ins->exp.X_add_number;
910 cr16_ins->exp.X_add_number = 0;
911 cr16_ins->rtype = BFD_RELOC_NONE;
914 if (strneq (input_line_pointer, "@c", 2))
917 if (strneq (input_line_pointer, "@l", 2)
918 || strneq (input_line_pointer, ":l", 2))
921 if (strneq (input_line_pointer, "@m", 2)
922 || strneq (input_line_pointer, ":m", 2))
925 if (strneq (input_line_pointer, "@s", 2)
926 || strneq (input_line_pointer, ":s", 2))
929 if (strneq (input_line_pointer, "@cGOT", 5)
930 || strneq (input_line_pointer, "@cgot", 5))
932 if (GOT_symbol == NULL)
933 GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
935 symbol_with_at_gotc = 1;
937 else if (strneq (input_line_pointer, "@GOT", 4)
938 || strneq (input_line_pointer, "@got", 4))
940 if ((strneq (input_line_pointer, "+", 1))
941 || (strneq (input_line_pointer, "-", 1)))
942 as_warn (_("GOT bad expression with %s."), input_line_pointer);
944 if (GOT_symbol == NULL)
945 GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
947 symbol_with_at_got = 1;
950 switch (cur_arg->type)
953 if (IS_INSN_TYPE (LD_STOR_INS) || IS_INSN_TYPE (CSTBIT_INS))
955 if (symbol_with_at_got)
956 cr16_ins->rtype = BFD_RELOC_CR16_GOT_REGREL20;
957 else if (symbol_with_at_gotc)
958 cr16_ins->rtype = BFD_RELOC_CR16_GOTC_REGREL20;
959 else if (cur_arg->size == 20)
960 cr16_ins->rtype = BFD_RELOC_CR16_REGREL20;
962 cr16_ins->rtype = BFD_RELOC_CR16_REGREL20a;
967 if (IS_INSN_TYPE (LD_STOR_INS) || IS_INSN_TYPE (CSTBIT_INS))
969 if (symbol_with_at_got)
970 cr16_ins->rtype = BFD_RELOC_CR16_GOT_REGREL20;
971 else if (symbol_with_at_gotc)
972 cr16_ins->rtype = BFD_RELOC_CR16_GOTC_REGREL20;
974 switch (instruction->size)
977 switch (cur_arg->size)
980 cr16_ins->rtype = BFD_RELOC_CR16_REGREL0;
983 if (IS_INSN_MNEMONIC ("loadb") || IS_INSN_MNEMONIC ("storb"))
984 cr16_ins->rtype = BFD_RELOC_CR16_REGREL4;
986 cr16_ins->rtype = BFD_RELOC_CR16_REGREL4a;
992 cr16_ins->rtype = BFD_RELOC_CR16_REGREL16;
995 if (cur_arg->size == 20)
996 cr16_ins->rtype = BFD_RELOC_CR16_REGREL20;
998 cr16_ins->rtype = BFD_RELOC_CR16_REGREL20a;
1007 if (IS_INSN_TYPE (LD_STOR_INS) || IS_INSN_TYPE (CSTBIT_INS))
1009 if (symbol_with_at_got)
1010 cr16_ins->rtype = BFD_RELOC_CR16_GOT_REGREL20;
1011 else if (symbol_with_at_gotc)
1012 cr16_ins->rtype = BFD_RELOC_CR16_GOTC_REGREL20;
1014 cr16_ins->rtype = BFD_RELOC_CR16_REGREL20;
1019 if (IS_INSN_TYPE (LD_STOR_INS) || IS_INSN_TYPE (CSTBIT_INS))
1021 if (symbol_with_at_got)
1022 cr16_ins->rtype = BFD_RELOC_CR16_GOT_REGREL20;
1023 else if (symbol_with_at_gotc)
1024 cr16_ins->rtype = BFD_RELOC_CR16_GOTC_REGREL20;
1026 switch (instruction->size)
1028 case 1: cr16_ins->rtype = BFD_RELOC_CR16_REGREL0; break;
1029 case 2: cr16_ins->rtype = BFD_RELOC_CR16_REGREL14; break;
1030 case 3: cr16_ins->rtype = BFD_RELOC_CR16_REGREL20; break;
1038 if (IS_INSN_MNEMONIC ("bal"))
1039 cr16_ins->rtype = BFD_RELOC_CR16_DISP24;
1040 else if (IS_INSN_TYPE (BRANCH_INS))
1043 cr16_ins->rtype = BFD_RELOC_CR16_DISP24;
1044 else if (symbol_with_m)
1045 cr16_ins->rtype = BFD_RELOC_CR16_DISP16;
1047 cr16_ins->rtype = BFD_RELOC_CR16_DISP8;
1049 else if (IS_INSN_TYPE (STOR_IMM_INS) || IS_INSN_TYPE (LD_STOR_INS)
1050 || IS_INSN_TYPE (CSTBIT_INS))
1053 as_bad (_("operand %d: illegal use expression: `%s`"), cur_arg_num + 1, str);
1054 if (symbol_with_at_got)
1055 cr16_ins->rtype = BFD_RELOC_CR16_GOT_REGREL20;
1056 else if (symbol_with_at_gotc)
1057 cr16_ins->rtype = BFD_RELOC_CR16_GOTC_REGREL20;
1058 else if (symbol_with_m)
1059 cr16_ins->rtype = BFD_RELOC_CR16_ABS20;
1060 else /* Default to (symbol_with_l) */
1061 cr16_ins->rtype = BFD_RELOC_CR16_ABS24;
1063 else if (IS_INSN_TYPE (BRANCH_NEQ_INS))
1064 cr16_ins->rtype = BFD_RELOC_CR16_DISP4;
1068 if (IS_INSN_TYPE (ARITH_INS))
1070 if (symbol_with_at_got)
1071 cr16_ins->rtype = BFD_RELOC_CR16_GOT_REGREL20;
1072 else if (symbol_with_at_gotc)
1073 cr16_ins->rtype = BFD_RELOC_CR16_GOTC_REGREL20;
1074 else if (symbol_with_s)
1075 cr16_ins->rtype = BFD_RELOC_CR16_IMM4;
1076 else if (symbol_with_m)
1077 cr16_ins->rtype = BFD_RELOC_CR16_IMM20;
1078 else if (symbol_with_at)
1079 cr16_ins->rtype = BFD_RELOC_CR16_IMM32a;
1080 else /* Default to (symbol_with_l) */
1081 cr16_ins->rtype = BFD_RELOC_CR16_IMM32;
1083 else if (IS_INSN_TYPE (ARITH_BYTE_INS))
1085 cr16_ins->rtype = BFD_RELOC_CR16_IMM16;
1094 cur_arg->X_op = cr16_ins->exp.X_op;
1098 input_line_pointer = saved_input_line_pointer;
1102 /* Retrieve the opcode image of a given register.
1103 If the register is illegal for the current instruction,
1107 getreg_image (reg r)
1109 const reg_entry *rreg;
1111 int is_procreg = 0; /* Nonzero means argument should be processor reg. */
1113 /* Check whether the register is in registers table. */
1115 rreg = cr16_regtab + r;
1116 else /* Register not found. */
1118 as_bad (_("Unknown register: `%d'"), r);
1122 reg_name = rreg->name;
1124 /* Issue a error message when register is illegal. */
1126 as_bad (_("Illegal register (`%s') in Instruction: `%s'"), \
1127 reg_name, ins_parse); \
1132 case CR16_R_REGTYPE:
1138 case CR16_P_REGTYPE:
1149 /* Parsing different types of operands
1150 -> constants Immediate/Absolute/Relative numbers
1151 -> Labels Relocatable symbols
1152 -> (reg pair base) Register pair base
1153 -> (rbase) Register base
1154 -> disp(rbase) Register relative
1155 -> [rinx]disp(reg pair) Register index with reg pair mode
1156 -> disp(rbase,ridx,scl) Register index mode. */
1159 set_operand (char *operand, ins * cr16_ins)
1161 char *operandS; /* Pointer to start of sub-operand. */
1162 char *operandE; /* Pointer to end of sub-operand. */
1164 argument *cur_arg = &cr16_ins->arg[cur_arg_num]; /* Current argument. */
1166 /* Initialize pointers. */
1167 operandS = operandE = operand;
1169 switch (cur_arg->type)
1171 case arg_ic: /* Case $0x18. */
1174 case arg_c: /* Case 0x18. */
1176 process_label_constant (operandS, cr16_ins);
1178 if (cur_arg->type != arg_ic)
1179 cur_arg->type = arg_c;
1182 case arg_icr: /* Case $0x18(r1). */
1184 case arg_cr: /* Case 0x18(r1). */
1185 /* Set displacement constant. */
1186 while (*operandE != '(')
1189 process_label_constant (operandS, cr16_ins);
1190 operandS = operandE;
1192 case arg_rbase: /* Case (r1) or (r1,r0). */
1194 /* Set register base. */
1195 while (*operandE != ')')
1198 if ((cur_arg->r = get_register (operandS)) == nullregister)
1199 as_bad (_("Illegal register `%s' in Instruction `%s'"),
1200 operandS, ins_parse);
1202 /* set the arg->rp, if reg is "r12" or "r13" or "14" or "15" */
1203 if ((cur_arg->type != arg_rbase)
1204 && ((getreg_image (cur_arg->r) == 12)
1205 || (getreg_image (cur_arg->r) == 13)
1206 || (getreg_image (cur_arg->r) == 14)
1207 || (getreg_image (cur_arg->r) == 15)))
1209 cur_arg->type = arg_crp;
1210 cur_arg->rp = cur_arg->r;
1214 case arg_crp: /* Case 0x18(r1,r0). */
1215 /* Set displacement constant. */
1216 while (*operandE != '(')
1219 process_label_constant (operandS, cr16_ins);
1220 operandS = operandE;
1222 /* Set register pair base. */
1223 while (*operandE != ')')
1226 if ((cur_arg->rp = get_register_pair (operandS)) == nullregister)
1227 as_bad (_("Illegal register pair `%s' in Instruction `%s'"),
1228 operandS, ins_parse);
1232 /* Set register pair base. */
1233 if ((strchr (operandS,'(') != NULL))
1235 while ((*operandE != '(') && (! ISSPACE (*operandE)))
1237 if ((cur_arg->rp = get_index_register_pair (operandE)) == nullregister)
1238 as_bad (_("Illegal register pair `%s' in Instruction `%s'"),
1239 operandS, ins_parse);
1241 cur_arg->type = arg_idxrp;
1246 operandE = operandS;
1247 /* Set displacement constant. */
1248 while (*operandE != ']')
1250 process_label_constant (++operandE, cr16_ins);
1252 operandE = operandS;
1254 /* Set index register . */
1255 operandS = strchr (operandE,'[');
1256 if (operandS != NULL)
1257 { /* Eliminate '[', detach from rest of operand. */
1260 operandE = strchr (operandS, ']');
1262 if (operandE == NULL)
1263 as_bad (_("unmatched '['"));
1265 { /* Eliminate ']' and make sure it was the last thing
1268 if (*(operandE + 1) != '\0')
1269 as_bad (_("garbage after index spec ignored"));
1273 if ((cur_arg->i_r = get_index_register (operandS)) == nullregister)
1274 as_bad (_("Illegal register `%s' in Instruction `%s'"),
1275 operandS, ins_parse);
1285 /* Parse a single operand.
1286 operand - Current operand to parse.
1287 cr16_ins - Current assembled instruction. */
1290 parse_operand (char *operand, ins * cr16_ins)
1293 argument *cur_arg = cr16_ins->arg + cur_arg_num; /* Current argument. */
1295 /* Initialize the type to NULL before parsing. */
1296 cur_arg->type = nullargs;
1298 /* Check whether this is a condition code . */
1299 if ((IS_INSN_MNEMONIC ("b")) && ((ret_val = get_cc (operand)) != -1))
1301 cur_arg->type = arg_cc;
1302 cur_arg->cc = ret_val;
1303 cur_arg->X_op = O_register;
1307 /* Check whether this is a general processor register. */
1308 if ((ret_val = get_register (operand)) != nullregister)
1310 cur_arg->type = arg_r;
1311 cur_arg->r = ret_val;
1316 /* Check whether this is a general processor register pair. */
1317 if ((operand[0] == '(')
1318 && ((ret_val = get_register_pair (operand)) != nullregister))
1320 cur_arg->type = arg_rp;
1321 cur_arg->rp = ret_val;
1322 cur_arg->X_op = O_register;
1326 /* Check whether the operand is a processor register.
1327 For "lprd" and "sprd" instruction, only 32 bit
1328 processor registers used. */
1329 if (!(IS_INSN_MNEMONIC ("lprd") || (IS_INSN_MNEMONIC ("sprd")))
1330 && ((ret_val = get_pregister (operand)) != nullpregister))
1332 cur_arg->type = arg_pr;
1333 cur_arg->pr = ret_val;
1334 cur_arg->X_op = O_register;
1338 /* Check whether this is a processor register - 32 bit. */
1339 if ((ret_val = get_pregisterp (operand)) != nullpregister)
1341 cur_arg->type = arg_prp;
1342 cur_arg->prp = ret_val;
1343 cur_arg->X_op = O_register;
1347 /* Deal with special characters. */
1351 if (strchr (operand, '(') != NULL)
1352 cur_arg->type = arg_icr;
1354 cur_arg->type = arg_ic;
1359 cur_arg->type = arg_rbase;
1364 cur_arg->type = arg_idxr;
1372 if (strchr (operand, '(') != NULL)
1374 if (strchr (operand, ',') != NULL
1375 && (strchr (operand, ',') > strchr (operand, '(')))
1376 cur_arg->type = arg_crp;
1378 cur_arg->type = arg_cr;
1381 cur_arg->type = arg_c;
1383 /* Parse an operand according to its type. */
1385 cur_arg->constant = 0;
1386 set_operand (operand, cr16_ins);
1389 /* Parse the various operands. Each operand is then analyzed to fillup
1390 the fields in the cr16_ins data structure. */
1393 parse_operands (ins * cr16_ins, char *operands)
1395 char *operandS; /* Operands string. */
1396 char *operandH, *operandT; /* Single operand head/tail pointers. */
1397 int allocated = 0; /* Indicates a new operands string was allocated.*/
1398 char *operand[MAX_OPERANDS];/* Separating the operands. */
1399 int op_num = 0; /* Current operand number we are parsing. */
1400 int bracket_flag = 0; /* Indicates a bracket '(' was found. */
1401 int sq_bracket_flag = 0; /* Indicates a square bracket '[' was found. */
1403 /* Preprocess the list of registers, if necessary. */
1404 operandS = operandH = operandT = operands;
1406 while (*operandT != '\0')
1408 if (*operandT == ',' && bracket_flag != 1 && sq_bracket_flag != 1)
1411 operand[op_num++] = strdup (operandH);
1412 operandH = operandT;
1416 if (*operandT == ' ')
1417 as_bad (_("Illegal operands (whitespace): `%s'"), ins_parse);
1419 if (*operandT == '(')
1421 else if (*operandT == '[')
1422 sq_bracket_flag = 1;
1424 if (*operandT == ')')
1429 as_fatal (_("Missing matching brackets : `%s'"), ins_parse);
1431 else if (*operandT == ']')
1433 if (sq_bracket_flag)
1434 sq_bracket_flag = 0;
1436 as_fatal (_("Missing matching brackets : `%s'"), ins_parse);
1439 if (bracket_flag == 1 && *operandT == ')')
1441 else if (sq_bracket_flag == 1 && *operandT == ']')
1442 sq_bracket_flag = 0;
1447 /* Adding the last operand. */
1448 operand[op_num++] = strdup (operandH);
1449 cr16_ins->nargs = op_num;
1451 /* Verifying correct syntax of operands (all brackets should be closed). */
1452 if (bracket_flag || sq_bracket_flag)
1453 as_fatal (_("Missing matching brackets : `%s'"), ins_parse);
1455 /* Now we parse each operand separately. */
1456 for (op_num = 0; op_num < cr16_ins->nargs; op_num++)
1458 cur_arg_num = op_num;
1459 parse_operand (operand[op_num], cr16_ins);
1460 free (operand[op_num]);
1467 /* Get the trap index in dispatch table, given its name.
1468 This routine is used by assembling the 'excp' instruction. */
1473 const trap_entry *trap;
1475 for (trap = cr16_traps; trap < (cr16_traps + NUMTRAPS); trap++)
1476 if (strcasecmp (trap->name, s) == 0)
1479 /* To make compatible with CR16 4.1 tools, the below 3-lines of
1480 * code added. Refer: Development Tracker item #123 */
1481 for (trap = cr16_traps; trap < (cr16_traps + NUMTRAPS); trap++)
1482 if (trap->entry == (unsigned int) atoi (s))
1485 as_bad (_("Unknown exception: `%s'"), s);
1489 /* Top level module where instruction parsing starts.
1490 cr16_ins - data structure holds some information.
1491 operands - holds the operands part of the whole instruction. */
1494 parse_insn (ins *insn, char *operands)
1498 /* Handle instructions with no operands. */
1499 for (i = 0; cr16_no_op_insn[i] != NULL; i++)
1501 if (streq (cr16_no_op_insn[i], instruction->mnemonic))
1508 /* Handle 'excp' instructions. */
1509 if (IS_INSN_MNEMONIC ("excp"))
1512 insn->arg[0].type = arg_ic;
1513 insn->arg[0].constant = gettrap (operands);
1514 insn->arg[0].X_op = O_constant;
1518 if (operands != NULL)
1519 parse_operands (insn, operands);
1522 /* bCC instruction requires special handling. */
1524 get_b_cc (char * op)
1529 for (i = 1; i < strlen (op); i++)
1534 for (i = 0; i < cr16_num_cc ; i++)
1535 if (streq (op1, cr16_b_cond_tab[i]))
1536 return (char *) cr16_b_cond_tab[i];
1541 /* bCC instruction requires special handling. */
1543 is_bcc_insn (char * op)
1545 if (!(streq (op, "bal") || streq (op, "beq0b") || streq (op, "bnq0b")
1546 || streq (op, "beq0w") || streq (op, "bnq0w")))
1547 if ((op[0] == 'b') && (get_b_cc (op) != NULL))
1552 /* Cinv instruction requires special handling. */
1555 check_cinv_options (char * operand)
1570 as_bad (_("Illegal `cinv' parameter: `%c'"), *p);
1575 /* Retrieve the opcode image of a given register pair.
1576 If the register is illegal for the current instruction,
1580 getregp_image (reg r)
1582 const reg_entry *rreg;
1585 /* Check whether the register is in registers table. */
1587 rreg = cr16_regptab + r;
1588 /* Register not found. */
1591 as_bad (_("Unknown register pair: `%d'"), r);
1595 reg_name = rreg->name;
1597 /* Issue a error message when register pair is illegal. */
1598 #define RPAIR_IMAGE_ERR \
1599 as_bad (_("Illegal register pair (`%s') in Instruction: `%s'"), \
1600 reg_name, ins_parse); \
1605 case CR16_RP_REGTYPE:
1614 /* Retrieve the opcode image of a given index register pair.
1615 If the register is illegal for the current instruction,
1619 getidxregp_image (reg r)
1621 const reg_entry *rreg;
1624 /* Check whether the register is in registers table. */
1626 rreg = cr16_regptab + r;
1627 /* Register not found. */
1630 as_bad (_("Unknown register pair: `%d'"), r);
1634 reg_name = rreg->name;
1636 /* Issue a error message when register pair is illegal. */
1637 #define IDX_RPAIR_IMAGE_ERR \
1638 as_bad (_("Illegal index register pair (`%s') in Instruction: `%s'"), \
1639 reg_name, ins_parse); \
1641 if (rreg->type == CR16_RP_REGTYPE)
1643 switch (rreg->image)
1645 case 0: return 0; break;
1646 case 2: return 1; break;
1647 case 4: return 2; break;
1648 case 6: return 3; break;
1649 case 8: return 4; break;
1650 case 10: return 5; break;
1651 case 3: return 6; break;
1652 case 5: return 7; break;
1658 IDX_RPAIR_IMAGE_ERR;
1662 /* Retrieve the opcode image of a given processor register.
1663 If the register is illegal for the current instruction,
1666 getprocreg_image (int r)
1668 const reg_entry *rreg;
1671 /* Check whether the register is in registers table. */
1672 if (r >= MAX_REG && r < MAX_PREG)
1673 rreg = &cr16_pregtab[r - MAX_REG];
1674 /* Register not found. */
1677 as_bad (_("Unknown processor register : `%d'"), r);
1681 reg_name = rreg->name;
1683 /* Issue a error message when register pair is illegal. */
1684 #define PROCREG_IMAGE_ERR \
1685 as_bad (_("Illegal processor register (`%s') in Instruction: `%s'"), \
1686 reg_name, ins_parse); \
1691 case CR16_P_REGTYPE:
1700 /* Retrieve the opcode image of a given processor register.
1701 If the register is illegal for the current instruction,
1704 getprocregp_image (int r)
1706 const reg_entry *rreg;
1708 int pregptab_disp = 0;
1710 /* Check whether the register is in registers table. */
1711 if (r >= MAX_REG && r < MAX_PREG)
1716 case 4: pregptab_disp = 1; break;
1717 case 6: pregptab_disp = 2; break;
1721 pregptab_disp = 3; break;
1723 pregptab_disp = 4; break;
1725 pregptab_disp = 5; break;
1728 rreg = &cr16_pregptab[r - pregptab_disp];
1730 /* Register not found. */
1733 as_bad (_("Unknown processor register (32 bit) : `%d'"), r);
1737 reg_name = rreg->name;
1739 /* Issue a error message when register pair is illegal. */
1740 #define PROCREGP_IMAGE_ERR \
1741 as_bad (_("Illegal 32 bit - processor register (`%s') in Instruction: `%s'"),\
1742 reg_name, ins_parse); \
1747 case CR16_P_REGTYPE:
1756 /* Routine used to represent integer X using NBITS bits. */
1759 getconstant (long x, int nbits)
1761 /* The following expression avoids overflow if
1762 'nbits' is the number of bits in 'bfd_vma'. */
1763 return (x & ((((1 << (nbits - 1)) - 1) << 1) | 1));
1766 /* Print a constant value to 'output_opcode':
1767 ARG holds the operand's type and value.
1768 SHIFT represents the location of the operand to be print into.
1769 NBITS determines the size (in bits) of the constant. */
1772 print_constant (int nbits, int shift, argument *arg)
1774 unsigned long mask = 0;
1776 long constant = getconstant (arg->constant, nbits);
1782 /* mask the upper part of the constant, that is, the bits
1783 going to the lowest byte of output_opcode[0].
1784 The upper part of output_opcode[1] is always filled,
1785 therefore it is always masked with 0xFFFF. */
1786 mask = (1 << (nbits - 16)) - 1;
1787 /* Divide the constant between two consecutive words :
1789 +---------+---------+---------+---------+
1790 | | X X X X | x X x X | |
1791 +---------+---------+---------+---------+
1792 output_opcode[0] output_opcode[1] */
1794 CR16_PRINT (0, (constant >> WORD_SHIFT) & mask, 0);
1795 CR16_PRINT (1, (constant & 0xFFFF), WORD_SHIFT);
1799 if ((nbits == 21) && (IS_INSN_TYPE (LD_STOR_INS)))
1805 /* mask the upper part of the constant, that is, the bits
1806 going to the lowest byte of output_opcode[0].
1807 The upper part of output_opcode[1] is always filled,
1808 therefore it is always masked with 0xFFFF. */
1809 mask = (1 << (nbits - 16)) - 1;
1810 /* Divide the constant between two consecutive words :
1812 +---------+---------+---------+---------+
1813 | | X X X X | - X - X | |
1814 +---------+---------+---------+---------+
1815 output_opcode[0] output_opcode[1] */
1817 if ((instruction->size > 2) && (shift == WORD_SHIFT))
1819 if (arg->type == arg_idxrp)
1821 CR16_PRINT (0, ((constant >> WORD_SHIFT) & mask) << 8, 0);
1822 CR16_PRINT (1, (constant & 0xFFFF), WORD_SHIFT);
1826 CR16_PRINT (0, (((((constant >> WORD_SHIFT) & mask) << 8) & 0x0f00) | ((((constant >> WORD_SHIFT) & mask) >> 4) & 0xf)),0);
1827 CR16_PRINT (1, (constant & 0xFFFF), WORD_SHIFT);
1831 CR16_PRINT (0, constant, shift);
1835 if (arg->type == arg_idxrp)
1837 if (instruction->size == 2)
1839 CR16_PRINT (0, ((constant) & 0xf), shift); /* 0-3 bits. */
1840 CR16_PRINT (0, ((constant >> 4) & 0x3), (shift + 20)); /* 4-5 bits. */
1841 CR16_PRINT (0, ((constant >> 6) & 0x3), (shift + 14)); /* 6-7 bits. */
1842 CR16_PRINT (0, ((constant >> 8) & 0x3f), (shift + 8)); /* 8-13 bits. */
1845 CR16_PRINT (0, constant, shift);
1851 /* When instruction size is 3 and 'shift' is 16, a 16-bit constant is
1852 always filling the upper part of output_opcode[1]. If we mistakenly
1853 write it to output_opcode[0], the constant prefix (that is, 'match')
1856 +---------+---------+---------+---------+
1857 | 'match' | | X X X X | |
1858 +---------+---------+---------+---------+
1859 output_opcode[0] output_opcode[1] */
1861 if ((instruction->size > 2) && (shift == WORD_SHIFT))
1862 CR16_PRINT (1, constant, WORD_SHIFT);
1864 CR16_PRINT (0, constant, shift);
1868 CR16_PRINT (0, ((constant / 2) & 0xf), shift);
1869 CR16_PRINT (0, ((constant / 2) >> 4), (shift + 8));
1873 CR16_PRINT (0, constant, shift);
1878 /* Print an operand to 'output_opcode', which later on will be
1879 printed to the object file:
1880 ARG holds the operand's type, size and value.
1881 SHIFT represents the printing location of operand.
1882 NBITS determines the size (in bits) of a constant operand. */
1885 print_operand (int nbits, int shift, argument *arg)
1890 CR16_PRINT (0, arg->cc, shift);
1894 CR16_PRINT (0, getreg_image (arg->r), shift);
1898 CR16_PRINT (0, getregp_image (arg->rp), shift);
1902 CR16_PRINT (0, getprocreg_image (arg->pr), shift);
1906 CR16_PRINT (0, getprocregp_image (arg->prp), shift);
1911 +-----------------------------+
1912 | r_index | disp | rp_base |
1913 +-----------------------------+ */
1915 if (instruction->size == 3)
1917 CR16_PRINT (0, getidxregp_image (arg->rp), 0);
1918 if (getreg_image (arg->i_r) == 12)
1919 CR16_PRINT (0, 0, 3);
1921 CR16_PRINT (0, 1, 3);
1925 CR16_PRINT (0, getidxregp_image (arg->rp), 16);
1926 if (getreg_image (arg->i_r) == 12)
1927 CR16_PRINT (0, 0, 19);
1929 CR16_PRINT (0, 1, 19);
1931 print_constant (nbits, shift, arg);
1935 if (getreg_image (arg->i_r) == 12)
1936 if (IS_INSN_MNEMONIC ("cbitb") || IS_INSN_MNEMONIC ("sbitb")
1937 || IS_INSN_MNEMONIC ("tbitb"))
1938 CR16_PRINT (0, 0, 23);
1939 else CR16_PRINT (0, 0, 24);
1941 if (IS_INSN_MNEMONIC ("cbitb") || IS_INSN_MNEMONIC ("sbitb")
1942 || IS_INSN_MNEMONIC ("tbitb"))
1943 CR16_PRINT (0, 1, 23);
1944 else CR16_PRINT (0, 1, 24);
1946 print_constant (nbits, shift, arg);
1951 print_constant (nbits, shift, arg);
1955 CR16_PRINT (0, getreg_image (arg->r), shift);
1959 print_constant (nbits, shift , arg);
1960 /* Add the register argument to the output_opcode. */
1961 CR16_PRINT (0, getreg_image (arg->r), (shift+16));
1965 print_constant (nbits, shift , arg);
1966 if (instruction->size > 1)
1967 CR16_PRINT (0, getregp_image (arg->rp), (shift + 16));
1968 else if (IS_INSN_TYPE (LD_STOR_INS) || (IS_INSN_TYPE (CSTBIT_INS)))
1970 if (instruction->size == 2)
1971 CR16_PRINT (0, getregp_image (arg->rp), (shift - 8));
1972 else if (instruction->size == 1)
1973 CR16_PRINT (0, getregp_image (arg->rp), 16);
1976 CR16_PRINT (0, getregp_image (arg->rp), shift);
1984 /* Retrieve the number of operands for the current assembled instruction. */
1987 get_number_of_operands (void)
1991 for (i = 0; instruction->operands[i].op_type && i < MAX_OPERANDS; i++)
1996 /* Verify that the number NUM can be represented in BITS bits (that is,
1997 within its permitted range), based on the instruction's FLAGS.
1998 If UPDATE is nonzero, update the value of NUM if necessary.
1999 Return OP_LEGAL upon success, actual error type upon failure. */
2002 check_range (long *num, int bits, int unsigned flags, int update)
2005 op_err retval = OP_LEGAL;
2008 if (bits == 0 && value > 0) return OP_OUT_OF_RANGE;
2010 /* For hosts with longs bigger than 32-bits make sure that the top
2011 bits of a 32-bit negative value read in by the parser are set,
2012 so that the correct comparisons are made. */
2013 if (value & 0x80000000)
2014 value |= (-1UL << 31);
2017 /* Verify operand value is even. */
2018 if (flags & OP_EVEN)
2031 if (flags & OP_SHIFT)
2037 else if (flags & OP_SHIFT_DEC)
2039 value = (value >> 1) - 1;
2044 if (flags & OP_ABS20)
2046 if (value > 0xEFFFF)
2047 return OP_OUT_OF_RANGE;
2052 if (value == 0xB || value == 0x9)
2053 return OP_OUT_OF_RANGE;
2054 else if (value == -1)
2062 if (flags & OP_ESC1)
2065 return OP_OUT_OF_RANGE;
2068 if (flags & OP_SIGNED)
2070 max = (1 << (bits - 1)) - 1;
2071 min = - (1 << (bits - 1));
2072 if ((value > max) || (value < min))
2073 retval = OP_OUT_OF_RANGE;
2075 else if (flags & OP_UNSIGNED)
2077 max = ((((1 << (bits - 1)) - 1) << 1) | 1);
2079 if (((unsigned long) value > (unsigned long) max)
2080 || ((unsigned long) value < (unsigned long) min))
2081 retval = OP_OUT_OF_RANGE;
2083 else if (flags & OP_NEG)
2086 min = - ((1 << (bits - 1)) - 1);
2087 if ((value > max) || (value < min))
2088 retval = OP_OUT_OF_RANGE;
2093 /* Bunch of error checking.
2094 The checks are made after a matching instruction was found. */
2097 warn_if_needed (ins *insn)
2099 /* If the post-increment address mode is used and the load/store
2100 source register is the same as rbase, the result of the
2101 instruction is undefined. */
2102 if (IS_INSN_TYPE (LD_STOR_INS_INC))
2104 /* Enough to verify that one of the arguments is a simple reg. */
2105 if ((insn->arg[0].type == arg_r) || (insn->arg[1].type == arg_r))
2106 if (insn->arg[0].r == insn->arg[1].r)
2107 as_bad (_("Same src/dest register is used (`r%d'), result is undefined"), insn->arg[0].r);
2110 if (IS_INSN_MNEMONIC ("pop")
2111 || IS_INSN_MNEMONIC ("push")
2112 || IS_INSN_MNEMONIC ("popret"))
2114 unsigned int count = insn->arg[0].constant, reg_val;
2116 /* Check if count operand caused to save/retrieve the RA twice
2117 to generate warning message. */
2118 if (insn->nargs > 2)
2120 reg_val = getreg_image (insn->arg[1].r);
2122 if ( ((reg_val == 9) && (count > 7))
2123 || ((reg_val == 10) && (count > 6))
2124 || ((reg_val == 11) && (count > 5))
2125 || ((reg_val == 12) && (count > 4))
2126 || ((reg_val == 13) && (count > 2))
2127 || ((reg_val == 14) && (count > 0)))
2128 as_warn (_("RA register is saved twice."));
2130 /* Check if the third operand is "RA" or "ra" */
2131 if (!(((insn->arg[2].r) == ra) || ((insn->arg[2].r) == RA)))
2132 as_bad (_("`%s' Illegal use of registers."), ins_parse);
2135 if (insn->nargs > 1)
2137 reg_val = getreg_image (insn->arg[1].r);
2139 /* If register is a register pair ie r12/r13/r14 in operand1, then
2140 the count constant should be validated. */
2141 if (((reg_val == 11) && (count > 7))
2142 || ((reg_val == 12) && (count > 6))
2143 || ((reg_val == 13) && (count > 4))
2144 || ((reg_val == 14) && (count > 2))
2145 || ((reg_val == 15) && (count > 0)))
2146 as_bad (_("`%s' Illegal count-register combination."), ins_parse);
2150 /* Check if the operand is "RA" or "ra" */
2151 if (!(((insn->arg[0].r) == ra) || ((insn->arg[0].r) == RA)))
2152 as_bad (_("`%s' Illegal use of register."), ins_parse);
2156 /* Some instruction assume the stack pointer as rptr operand.
2157 Issue an error when the register to be loaded is also SP. */
2158 if (instruction->flags & NO_SP)
2160 if (getreg_image (insn->arg[1].r) == getreg_image (sp))
2161 as_bad (_("`%s' has undefined result"), ins_parse);
2164 /* If the rptr register is specified as one of the registers to be loaded,
2165 the final contents of rptr are undefined. Thus, we issue an error. */
2166 if (instruction->flags & NO_RPTR)
2168 if ((1 << getreg_image (insn->arg[0].r)) & insn->arg[1].constant)
2169 as_bad (_("Same src/dest register is used (`r%d'),result is undefined"),
2170 getreg_image (insn->arg[0].r));
2174 /* In some cases, we need to adjust the instruction pointer although a
2175 match was already found. Here, we gather all these cases.
2176 Returns 1 if instruction pointer was adjusted, otherwise 0. */
2179 adjust_if_needed (ins *insn ATTRIBUTE_UNUSED)
2183 if ((IS_INSN_TYPE (CSTBIT_INS)) || (IS_INSN_TYPE (LD_STOR_INS)))
2185 if ((instruction->operands[0].op_type == abs24)
2186 && ((insn->arg[0].constant) > 0xF00000))
2188 insn->arg[0].constant &= 0xFFFFF;
2197 /* Assemble a single instruction:
2198 INSN is already parsed (that is, all operand values and types are set).
2199 For instruction to be assembled, we need to find an appropriate template in
2200 the instruction table, meeting the following conditions:
2201 1: Has the same number of operands.
2202 2: Has the same operand types.
2203 3: Each operand size is sufficient to represent the instruction's values.
2204 Returns 1 upon success, 0 upon failure. */
2207 assemble_insn (const char *mnemonic, ins *insn)
2209 /* Type of each operand in the current template. */
2210 argtype cur_type[MAX_OPERANDS];
2211 /* Size (in bits) of each operand in the current template. */
2212 unsigned int cur_size[MAX_OPERANDS];
2213 /* Flags of each operand in the current template. */
2214 unsigned int cur_flags[MAX_OPERANDS];
2215 /* Instruction type to match. */
2216 unsigned int ins_type;
2217 /* Boolean flag to mark whether a match was found. */
2220 /* Nonzero if an instruction with same number of operands was found. */
2221 int found_same_number_of_operands = 0;
2222 /* Nonzero if an instruction with same argument types was found. */
2223 int found_same_argument_types = 0;
2224 /* Nonzero if a constant was found within the required range. */
2225 int found_const_within_range = 0;
2226 /* Argument number of an operand with invalid type. */
2227 int invalid_optype = -1;
2228 /* Argument number of an operand with invalid constant value. */
2229 int invalid_const = -1;
2230 /* Operand error (used for issuing various constant error messages). */
2231 op_err op_error, const_err = OP_LEGAL;
2233 /* Retrieve data (based on FUNC) for each operand of a given instruction. */
2234 #define GET_CURRENT_DATA(FUNC, ARRAY) \
2235 for (i = 0; i < insn->nargs; i++) \
2236 ARRAY[i] = FUNC (instruction->operands[i].op_type)
2238 #define GET_CURRENT_TYPE GET_CURRENT_DATA (get_optype, cur_type)
2239 #define GET_CURRENT_SIZE GET_CURRENT_DATA (get_opbits, cur_size)
2240 #define GET_CURRENT_FLAGS GET_CURRENT_DATA (get_opflags, cur_flags)
2242 /* Instruction has no operands -> only copy the constant opcode. */
2243 if (insn->nargs == 0)
2245 output_opcode[0] = BIN (instruction->match, instruction->match_bits);
2249 /* In some case, same mnemonic can appear with different instruction types.
2250 For example, 'storb' is supported with 3 different types :
2251 LD_STOR_INS, LD_STOR_INS_INC, STOR_IMM_INS.
2252 We assume that when reaching this point, the instruction type was
2253 pre-determined. We need to make sure that the type stays the same
2254 during a search for matching instruction. */
2255 ins_type = CR16_INS_TYPE (instruction->flags);
2257 while (/* Check that match is still not found. */
2259 /* Check we didn't get to end of table. */
2260 && instruction->mnemonic != NULL
2261 /* Check that the actual mnemonic is still available. */
2262 && IS_INSN_MNEMONIC (mnemonic)
2263 /* Check that the instruction type wasn't changed. */
2264 && IS_INSN_TYPE (ins_type))
2266 /* Check whether number of arguments is legal. */
2267 if (get_number_of_operands () != insn->nargs)
2269 found_same_number_of_operands = 1;
2271 /* Initialize arrays with data of each operand in current template. */
2276 /* Check for type compatibility. */
2277 for (i = 0; i < insn->nargs; i++)
2279 if (cur_type[i] != insn->arg[i].type)
2281 if (invalid_optype == -1)
2282 invalid_optype = i + 1;
2286 found_same_argument_types = 1;
2288 for (i = 0; i < insn->nargs; i++)
2290 /* If 'bal' instruction size is '2' and reg operand is not 'ra'
2291 then goto next instruction. */
2292 if (IS_INSN_MNEMONIC ("bal") && (i == 0)
2293 && (instruction->size == 2) && (insn->arg[i].rp != 14))
2296 /* If 'storb' instruction with 'sp' reg and 16-bit disp of
2297 * reg-pair, leads to undefined trap, so this should use
2298 * 20-bit disp of reg-pair. */
2299 if (IS_INSN_MNEMONIC ("storb") && (instruction->size == 2)
2300 && (insn->arg[i].r == 15) && (insn->arg[i + 1].type == arg_crp))
2303 /* Only check range - don't update the constant's value, since the
2304 current instruction may not be the last we try to match.
2305 The constant's value will be updated later, right before printing
2306 it to the object file. */
2307 if ((insn->arg[i].X_op == O_constant)
2308 && (op_error = check_range (&insn->arg[i].constant, cur_size[i],
2311 if (invalid_const == -1)
2313 invalid_const = i + 1;
2314 const_err = op_error;
2318 /* For symbols, we make sure the relocation size (which was already
2319 determined) is sufficient. */
2320 else if ((insn->arg[i].X_op == O_symbol)
2321 && ((bfd_reloc_type_lookup (stdoutput, insn->rtype))->bitsize
2325 found_const_within_range = 1;
2327 /* If we got till here -> Full match is found. */
2331 /* Try again with next instruction. */
2338 /* We haven't found a match - instruction can't be assembled. */
2339 if (!found_same_number_of_operands)
2340 as_bad (_("Incorrect number of operands"));
2341 else if (!found_same_argument_types)
2342 as_bad (_("Illegal type of operand (arg %d)"), invalid_optype);
2343 else if (!found_const_within_range)
2347 case OP_OUT_OF_RANGE:
2348 as_bad (_("Operand out of range (arg %d)"), invalid_const);
2351 as_bad (_("Operand has odd displacement (arg %d)"), invalid_const);
2354 as_bad (_("Illegal operand (arg %d)"), invalid_const);
2362 /* Full match - print the encoding to output file. */
2364 /* Make further checking (such that couldn't be made earlier).
2365 Warn the user if necessary. */
2366 warn_if_needed (insn);
2368 /* Check whether we need to adjust the instruction pointer. */
2369 if (adjust_if_needed (insn))
2370 /* If instruction pointer was adjusted, we need to update
2371 the size of the current template operands. */
2374 for (i = 0; i < insn->nargs; i++)
2376 int j = instruction->flags & REVERSE_MATCH ?
2381 /* This time, update constant value before printing it. */
2382 if ((insn->arg[j].X_op == O_constant)
2383 && (check_range (&insn->arg[j].constant, cur_size[j],
2384 cur_flags[j], 1) != OP_LEGAL))
2385 as_fatal (_("Illegal operand (arg %d)"), j+1);
2388 /* First, copy the instruction's opcode. */
2389 output_opcode[0] = BIN (instruction->match, instruction->match_bits);
2391 for (i = 0; i < insn->nargs; i++)
2393 /* For BAL (ra),disp17 instruction only. And also set the
2394 DISP24a relocation type. */
2395 if (IS_INSN_MNEMONIC ("bal") && (instruction->size == 2) && i == 0)
2397 insn->rtype = BFD_RELOC_CR16_DISP24a;
2401 print_operand (cur_size[i], instruction->operands[i].shift,
2409 /* Print the instruction.
2410 Handle also cases where the instruction is relaxable/relocatable. */
2413 print_insn (ins *insn)
2415 unsigned int i, j, insn_size;
2417 unsigned short words[4];
2420 /* Arrange the insn encodings in a WORD size array. */
2421 for (i = 0, j = 0; i < 2; i++)
2423 words[j++] = (output_opcode[i] >> 16) & 0xFFFF;
2424 words[j++] = output_opcode[i] & 0xFFFF;
2427 /* Handle relocation. */
2428 if ((instruction->flags & RELAXABLE) && relocatable)
2431 /* Write the maximal instruction size supported. */
2432 insn_size = INSN_MAX_SIZE;
2434 if (IS_INSN_TYPE (BRANCH_INS))
2436 switch (insn->rtype)
2438 case BFD_RELOC_CR16_DISP24:
2441 case BFD_RELOC_CR16_DISP16:
2452 this_frag = frag_var (rs_machine_dependent, insn_size *2,
2454 insn->exp.X_add_symbol,
2460 insn_size = instruction->size;
2461 this_frag = frag_more (insn_size * 2);
2463 if ((relocatable) && (insn->rtype != BFD_RELOC_NONE))
2465 reloc_howto_type *reloc_howto;
2468 reloc_howto = bfd_reloc_type_lookup (stdoutput, insn->rtype);
2473 size = bfd_get_reloc_size (reloc_howto);
2475 if (size < 1 || size > 4)
2478 fix_new_exp (frag_now, this_frag - frag_now->fr_literal,
2479 size, &insn->exp, reloc_howto->pc_relative,
2484 /* Verify a 2-byte code alignment. */
2485 addr_mod = frag_now_fix () & 1;
2486 if (frag_now->has_code && frag_now->insn_addr != addr_mod)
2487 as_bad (_("instruction address is not a multiple of 2"));
2488 frag_now->insn_addr = addr_mod;
2489 frag_now->has_code = 1;
2491 /* Write the instruction encoding to frag. */
2492 for (i = 0; i < insn_size; i++)
2494 md_number_to_chars (this_frag, (valueT) words[i], 2);
2499 /* Actually assemble an instruction. */
2502 cr16_assemble (const char *op, char *param)
2506 /* Find the instruction. */
2507 instruction = (const inst *) hash_find (cr16_inst_hash, op);
2508 if (instruction == NULL)
2510 as_bad (_("Unknown opcode: `%s'"), op);
2514 /* Tie dwarf2 debug info to the address at the start of the insn. */
2515 dwarf2_emit_insn (0);
2517 /* Parse the instruction's operands. */
2518 parse_insn (&cr16_ins, param);
2520 /* Assemble the instruction - return upon failure. */
2521 if (assemble_insn (op, &cr16_ins) == 0)
2524 /* Print the instruction. */
2525 print_insn (&cr16_ins);
2528 /* This is the guts of the machine-dependent assembler. OP points to a
2529 machine dependent instruction. This function is supposed to emit
2530 the frags/bytes it assembles to. */
2533 md_assemble (char *op)
2536 char *param, param1[32];
2538 /* Reset global variables for a new instruction. */
2541 /* Strip the mnemonic. */
2542 for (param = op; *param != 0 && !ISSPACE (*param); param++)
2546 /* bCC instructions and adjust the mnemonic by adding extra white spaces. */
2547 if (is_bcc_insn (op))
2549 strcpy (param1, get_b_cc (op));
2550 strcat (param1,",");
2551 strcat (param1, param);
2552 param = (char *) ¶m1;
2553 cr16_assemble ("b", param);
2557 /* Checking the cinv options and adjust the mnemonic by removing the
2558 extra white spaces. */
2559 if (streq ("cinv", op))
2561 /* Validate the cinv options. */
2562 check_cinv_options (param);
2566 /* MAPPING - SHIFT INSN, if imm4/imm16 positive values
2567 lsh[b/w] imm4/imm6, reg ==> ashu[b/w] imm4/imm16, reg
2568 as CR16 core doesn't support lsh[b/w] right shift operations. */
2569 if ((streq ("lshb", op) || streq ("lshw", op) || streq ("lshd", op))
2570 && (param [0] == '$'))
2572 strcpy (param1, param);
2573 /* Find the instruction. */
2574 instruction = (const inst *) hash_find (cr16_inst_hash, op);
2575 parse_operands (&cr16_ins, param1);
2576 if (((&cr16_ins)->arg[0].type == arg_ic)
2577 && ((&cr16_ins)->arg[0].constant >= 0))
2579 if (streq ("lshb", op))
2580 cr16_assemble ("ashub", param);
2581 else if (streq ("lshd", op))
2582 cr16_assemble ("ashud", param);
2584 cr16_assemble ("ashuw", param);
2589 cr16_assemble (op, param);