1 /* tc-cr16.c -- Assembler code for the CR16 CPU core.
2 Copyright (C) 2007-2016 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 (_("field width %lu too big to fit in %d bytes: truncated to %d bits"), width, nbytes, (BITS_PER_CHAR * nbytes));
182 width = BITS_PER_CHAR * nbytes;
186 if (width > bits_available)
188 /* FIXME-SOMEDAY: backing up and reparsing is wasteful. */
189 input_line_pointer = hold;
190 exp.X_add_number = value;
195 hold = ++input_line_pointer;
198 if (exp.X_op != O_constant)
200 char cache = *input_line_pointer;
202 *input_line_pointer = '\0';
203 as_bad (_("field value \"%s\" too complex for a bitfield"), hold);
204 *input_line_pointer = cache;
205 demand_empty_rest_of_line ();
209 value |= ((~(-(1 << width)) & exp.X_add_number)
210 << ((BITS_PER_CHAR * nbytes) - bits_available));
212 if ((bits_available -= width) == 0
213 || is_it_end_of_statement ()
214 || *input_line_pointer != ',')
217 hold = ++input_line_pointer;
221 exp.X_add_number = value;
222 exp.X_op = O_constant;
226 if ((*(input_line_pointer) == '@') && (*(input_line_pointer +1) == 'c'))
228 emit_expr (&exp, (unsigned int) nbytes);
230 if ((*(input_line_pointer) == '@') && (*(input_line_pointer +1) == 'c'))
232 input_line_pointer +=3;
236 while ((*input_line_pointer++ == ','));
238 /* Put terminator back into stream. */
239 input_line_pointer--;
241 demand_empty_rest_of_line ();
244 /* This table describes all the machine specific pseudo-ops
245 the assembler has to support. The fields are:
246 *** Pseudo-op name without dot.
247 *** Function to call to execute this pseudo-op.
248 *** Integer arg to pass to the function. */
250 const pseudo_typeS md_pseudo_table[] =
252 /* In CR16 machine, align is in bytes (not a ptwo boundary). */
253 {"align", s_align_bytes, 0},
254 {"long", l_cons, 4 },
255 {"4byte", l_cons, 4 },
259 /* CR16 relaxation table. */
260 const relax_typeS md_relax_table[] =
263 {0x7f, -0x80, 2, 1}, /* 8 */
264 {0xfffe, -0x10000, 4, 2}, /* 16 */
265 {0xfffffe, -0x1000000, 6, 0}, /* 24 */
268 /* Return the bit size for a given operand. */
271 get_opbits (operand_type op)
274 return cr16_optab[op].bit_size;
279 /* Return the argument type of a given operand. */
282 get_optype (operand_type op)
285 return cr16_optab[op].arg_type;
290 /* Return the flags of a given operand. */
293 get_opflags (operand_type op)
296 return cr16_optab[op].flags;
301 /* Get the cc code. */
304 get_cc (char *cc_name)
308 for (i = 0; i < cr16_num_cc; i++)
309 if (strcmp (cc_name, cr16_b_cond_tab[i]) == 0)
315 /* Get the core processor register 'reg_name'. */
318 get_register (char *reg_name)
320 const reg_entry *rreg;
322 rreg = (const reg_entry *) hash_find (reg_hash, reg_name);
325 return rreg->value.reg_val;
329 /* Get the core processor register-pair 'reg_name'. */
332 get_register_pair (char *reg_name)
334 const reg_entry *rreg;
335 char tmp_rp[16]="\0";
337 /* Add '(' and ')' to the reg pair, if its not present. */
338 if (reg_name[0] != '(')
341 strcat (tmp_rp, reg_name);
343 rreg = (const reg_entry *) hash_find (regp_hash, tmp_rp);
346 rreg = (const reg_entry *) hash_find (regp_hash, reg_name);
349 return rreg->value.reg_val;
354 /* Get the index register 'reg_name'. */
357 get_index_register (char *reg_name)
359 const reg_entry *rreg;
361 rreg = (const reg_entry *) hash_find (reg_hash, reg_name);
364 && ((rreg->value.reg_val == 12) || (rreg->value.reg_val == 13)))
365 return rreg->value.reg_val;
369 /* Get the core processor index register-pair 'reg_name'. */
372 get_index_register_pair (char *reg_name)
374 const reg_entry *rreg;
376 rreg = (const reg_entry *) hash_find (regp_hash, reg_name);
380 if ((rreg->value.reg_val != 1) || (rreg->value.reg_val != 7)
381 || (rreg->value.reg_val != 9) || (rreg->value.reg_val > 10))
382 return rreg->value.reg_val;
384 as_bad (_("Unknown register pair - index relative mode: `%d'"), rreg->value.reg_val);
390 /* Get the processor register 'preg_name'. */
393 get_pregister (char *preg_name)
395 const reg_entry *prreg;
397 prreg = (const reg_entry *) hash_find (preg_hash, preg_name);
400 return prreg->value.preg_val;
402 return nullpregister;
405 /* Get the processor register 'preg_name 32 bit'. */
408 get_pregisterp (char *preg_name)
410 const reg_entry *prreg;
412 prreg = (const reg_entry *) hash_find (pregp_hash, preg_name);
415 return prreg->value.preg_val;
417 return nullpregister;
421 /* Round up a section size to the appropriate boundary. */
424 md_section_align (segT seg, valueT val)
426 /* Round .text section to a multiple of 2. */
427 if (seg == text_section)
428 return (val + 1) & ~1;
432 /* Parse an operand that is machine-specific (remove '*'). */
435 md_operand (expressionS * exp)
437 char c = *input_line_pointer;
442 input_line_pointer++;
450 /* Reset global variables before parsing a new instruction. */
453 reset_vars (char *op)
455 cur_arg_num = relocatable = 0;
456 memset (& output_opcode, '\0', sizeof (output_opcode));
458 /* Save a copy of the original OP (used in error messages). */
459 strncpy (ins_parse, op, sizeof ins_parse - 1);
460 ins_parse [sizeof ins_parse - 1] = 0;
463 /* This macro decides whether a particular reloc is an entry in a
464 switch table. It is used when relaxing, because the linker needs
465 to know about all such entries so that it can adjust them if
468 #define SWITCH_TABLE(fix) \
469 ( (fix)->fx_addsy != NULL \
470 && (fix)->fx_subsy != NULL \
471 && S_GET_SEGMENT ((fix)->fx_addsy) == \
472 S_GET_SEGMENT ((fix)->fx_subsy) \
473 && S_GET_SEGMENT (fix->fx_addsy) != undefined_section \
474 && ( (fix)->fx_r_type == BFD_RELOC_CR16_NUM8 \
475 || (fix)->fx_r_type == BFD_RELOC_CR16_NUM16 \
476 || (fix)->fx_r_type == BFD_RELOC_CR16_NUM32 \
477 || (fix)->fx_r_type == BFD_RELOC_CR16_NUM32a))
479 /* See whether we need to force a relocation into the output file.
480 This is used to force out switch and PC relative relocations when
484 cr16_force_relocation (fixS *fix)
486 if (generic_force_reloc (fix) || SWITCH_TABLE (fix))
492 /* Record a fixup for a cons expression. */
495 cr16_cons_fix_new (fragS *frag, int offset, int len, expressionS *exp,
496 bfd_reloc_code_real_type rtype)
500 default: rtype = BFD_RELOC_NONE; break;
501 case 1: rtype = BFD_RELOC_CR16_NUM8 ; break;
502 case 2: rtype = BFD_RELOC_CR16_NUM16; break;
506 rtype = BFD_RELOC_CR16_NUM32a;
510 rtype = BFD_RELOC_CR16_NUM32;
514 fix_new_exp (frag, offset, len, exp, 0, rtype);
517 /* Generate a relocation entry for a fixup. */
520 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS * fixP)
524 /* If symbols are local and resolved, then no relocation needed. */
525 if ( ((fixP->fx_addsy)
526 && (S_GET_SEGMENT (fixP->fx_addsy) == absolute_section))
528 && (S_GET_SEGMENT (fixP->fx_subsy) == absolute_section)))
531 reloc = XNEW (arelent);
532 reloc->sym_ptr_ptr = XNEW (asymbol *);
533 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy);
534 reloc->address = fixP->fx_frag->fr_address + fixP->fx_where;
535 reloc->addend = fixP->fx_offset;
537 if (fixP->fx_subsy != NULL)
539 if (SWITCH_TABLE (fixP))
541 /* Keep the current difference in the addend. */
542 reloc->addend = (S_GET_VALUE (fixP->fx_addsy)
543 - S_GET_VALUE (fixP->fx_subsy) + fixP->fx_offset);
545 switch (fixP->fx_r_type)
547 case BFD_RELOC_CR16_NUM8:
548 fixP->fx_r_type = BFD_RELOC_CR16_SWITCH8;
550 case BFD_RELOC_CR16_NUM16:
551 fixP->fx_r_type = BFD_RELOC_CR16_SWITCH16;
553 case BFD_RELOC_CR16_NUM32:
554 fixP->fx_r_type = BFD_RELOC_CR16_SWITCH32;
556 case BFD_RELOC_CR16_NUM32a:
557 fixP->fx_r_type = BFD_RELOC_CR16_NUM32a;
566 /* We only resolve difference expressions in the same section. */
567 as_bad_where (fixP->fx_file, fixP->fx_line,
568 _("can't resolve `%s' {%s section} - `%s' {%s section}"),
569 fixP->fx_addsy ? S_GET_NAME (fixP->fx_addsy) : "0",
570 segment_name (fixP->fx_addsy
571 ? S_GET_SEGMENT (fixP->fx_addsy)
573 S_GET_NAME (fixP->fx_subsy),
574 segment_name (S_GET_SEGMENT (fixP->fx_addsy)));
578 if ((fixP->fx_r_type == BFD_RELOC_CR16_GOT_REGREL20)
580 && fixP->fx_addsy == GOT_symbol)
582 reloc->addend = fixP->fx_offset = reloc->address;
584 else if ((fixP->fx_r_type == BFD_RELOC_CR16_GOTC_REGREL20)
586 && fixP->fx_addsy == GOT_symbol)
588 reloc->addend = fixP->fx_offset = reloc->address;
592 gas_assert ((int) fixP->fx_r_type > 0);
593 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
595 if (reloc->howto == NULL)
597 as_bad_where (fixP->fx_file, fixP->fx_line,
598 _("internal error: reloc %d (`%s') not supported by object file format"),
600 bfd_get_reloc_code_name (fixP->fx_r_type));
603 gas_assert (!fixP->fx_pcrel == !reloc->howto->pc_relative);
608 /* Prepare machine-dependent frags for relaxation. */
611 md_estimate_size_before_relax (fragS *fragp, asection *seg)
613 /* If symbol is undefined or located in a different section,
614 select the largest supported relocation. */
615 relax_substateT subtype;
616 relax_substateT rlx_state[] = {0, 2};
618 for (subtype = 0; subtype < ARRAY_SIZE (rlx_state); subtype += 2)
620 if (fragp->fr_subtype == rlx_state[subtype]
621 && (!S_IS_DEFINED (fragp->fr_symbol)
622 || seg != S_GET_SEGMENT (fragp->fr_symbol)))
624 fragp->fr_subtype = rlx_state[subtype + 1];
629 if (fragp->fr_subtype >= ARRAY_SIZE (md_relax_table))
632 return md_relax_table[fragp->fr_subtype].rlx_length;
636 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, fragS *fragP)
638 /* 'opcode' points to the start of the instruction, whether
639 we need to change the instruction's fixed encoding. */
640 char *opcode = fragP->fr_literal + fragP->fr_fix;
641 bfd_reloc_code_real_type reloc;
643 subseg_change (sec, 0);
645 switch (fragP->fr_subtype)
648 reloc = BFD_RELOC_CR16_DISP8;
651 /* If the subtype is not changed due to :m operand qualifier,
652 then no need to update the opcode value. */
653 if ((int)opcode[1] != 0x18)
655 opcode[0] = (opcode[0] & 0xf0);
658 reloc = BFD_RELOC_CR16_DISP16;
661 /* If the subtype is not changed due to :l operand qualifier,
662 then no need to update the opcode value. */
663 if ((int)opcode[1] != 0)
665 opcode[2] = opcode[0];
666 opcode[0] = opcode[1];
669 reloc = BFD_RELOC_CR16_DISP24;
675 fix_new (fragP, fragP->fr_fix,
676 bfd_get_reloc_size (bfd_reloc_type_lookup (stdoutput, reloc)),
677 fragP->fr_symbol, fragP->fr_offset, 1, reloc);
679 fragP->fr_fix += md_relax_table[fragP->fr_subtype].rlx_length;
683 md_undefined_symbol (char *name)
685 if (*name == '_' && *(name + 1) == 'G'
686 && strcmp (name, "_GLOBAL_OFFSET_TABLE_") == 0)
690 if (symbol_find (name))
691 as_bad (_("GOT already in symbol table"));
692 GOT_symbol = symbol_new (name, undefined_section,
693 (valueT) 0, &zero_address_frag);
700 /* Process machine-dependent command line options. Called once for
701 each option on the command line that the machine-independent part of
702 GAS does not understand. */
705 md_parse_option (int c ATTRIBUTE_UNUSED, const char *arg ATTRIBUTE_UNUSED)
710 /* Machine-dependent usage-output. */
713 md_show_usage (FILE *stream ATTRIBUTE_UNUSED)
719 md_atof (int type, char *litP, int *sizeP)
721 return ieee_md_atof (type, litP, sizeP, target_big_endian);
724 /* Apply a fixS (fixup of an instruction or data that we didn't have
725 enough info to complete immediately) to the data in a frag.
726 Since linkrelax is nonzero and TC_LINKRELAX_FIXUP is defined to disable
727 relaxation of debug sections, this function is called only when
728 fixuping relocations of debug sections. */
731 md_apply_fix (fixS *fixP, valueT *valP, segT seg)
735 if (fixP->fx_addsy == NULL
736 && fixP->fx_pcrel == 0)
738 else if (fixP->fx_pcrel == 1
739 && fixP->fx_addsy != NULL
740 && S_GET_SEGMENT (fixP->fx_addsy) == seg)
745 if (fixP->fx_addsy != NULL && !fixP->fx_pcrel)
747 val = fixP->fx_offset;
753 char *buf = fixP->fx_frag->fr_literal + fixP->fx_where;
757 switch (fixP->fx_r_type)
759 case BFD_RELOC_CR16_NUM8:
760 bfd_put_8 (stdoutput, (unsigned char) val, buf);
762 case BFD_RELOC_CR16_NUM16:
763 bfd_put_16 (stdoutput, val, buf);
765 case BFD_RELOC_CR16_NUM32:
766 bfd_put_32 (stdoutput, val, buf);
768 case BFD_RELOC_CR16_NUM32a:
769 bfd_put_32 (stdoutput, val, buf);
772 /* We shouldn't ever get here because linkrelax is nonzero. */
779 fixP->fx_offset = * valP;
782 /* The location from which a PC relative jump should be calculated,
783 given a PC relative reloc. */
786 md_pcrel_from (fixS *fixp)
788 return fixp->fx_frag->fr_address + fixp->fx_where;
792 initialise_reg_hash_table (struct hash_control ** hash_table,
793 const reg_entry * register_table,
794 const unsigned int num_entries)
796 const reg_entry * rreg;
799 if ((* hash_table = hash_new ()) == NULL)
800 as_fatal (_("Virtual memory exhausted"));
802 for (rreg = register_table;
803 rreg < (register_table + num_entries);
806 hashret = hash_insert (* hash_table, rreg->name, (char *) rreg);
808 as_fatal (_("Internal Error: Can't hash %s: %s"),
809 rreg->name, hashret);
813 /* This function is called once, at assembler startup time. This should
814 set up all the tables, etc that the MD part of the assembler needs. */
821 /* Set up a hash table for the instructions. */
822 if ((cr16_inst_hash = hash_new ()) == NULL)
823 as_fatal (_("Virtual memory exhausted"));
825 while (cr16_instruction[i].mnemonic != NULL)
828 const char *mnemonic = cr16_instruction[i].mnemonic;
830 hashret = hash_insert (cr16_inst_hash, mnemonic,
831 (char *)(cr16_instruction + i));
833 if (hashret != NULL && *hashret != '\0')
834 as_fatal (_("Can't hash `%s': %s\n"), cr16_instruction[i].mnemonic,
835 *hashret == 0 ? _("(unknown reason)") : hashret);
837 /* Insert unique names into hash table. The CR16 instruction set
838 has many identical opcode names that have different opcodes based
839 on the operands. This hash table then provides a quick index to
840 the first opcode with a particular name in the opcode table. */
845 while (cr16_instruction[i].mnemonic != NULL
846 && streq (cr16_instruction[i].mnemonic, mnemonic));
849 /* Initialize reg_hash hash table. */
850 initialise_reg_hash_table (& reg_hash, cr16_regtab, NUMREGS);
851 /* Initialize regp_hash hash table. */
852 initialise_reg_hash_table (& regp_hash, cr16_regptab, NUMREGPS);
853 /* Initialize preg_hash hash table. */
854 initialise_reg_hash_table (& preg_hash, cr16_pregtab, NUMPREGS);
855 /* Initialize pregp_hash hash table. */
856 initialise_reg_hash_table (& pregp_hash, cr16_pregptab, NUMPREGPS);
858 /* Set linkrelax here to avoid fixups in most sections. */
862 /* Process constants (immediate/absolute)
863 and labels (jump targets/Memory locations). */
866 process_label_constant (char *str, ins * cr16_ins)
868 char *saved_input_line_pointer;
869 int symbol_with_at = 0;
870 int symbol_with_s = 0;
871 int symbol_with_m = 0;
872 int symbol_with_l = 0;
873 int symbol_with_at_got = 0;
874 int symbol_with_at_gotc = 0;
875 argument *cur_arg = cr16_ins->arg + cur_arg_num; /* Current argument. */
877 saved_input_line_pointer = input_line_pointer;
878 input_line_pointer = str;
880 expression (&cr16_ins->exp);
882 switch (cr16_ins->exp.X_op)
886 /* Missing or bad expr becomes absolute 0. */
887 as_bad (_("missing or invalid displacement expression `%s' taken as 0"),
889 cr16_ins->exp.X_op = O_constant;
890 cr16_ins->exp.X_add_number = 0;
891 cr16_ins->exp.X_add_symbol = NULL;
892 cr16_ins->exp.X_op_symbol = NULL;
896 cur_arg->X_op = O_constant;
897 cur_arg->constant = cr16_ins->exp.X_add_number;
903 cur_arg->X_op = O_symbol;
904 cur_arg->constant = cr16_ins->exp.X_add_number;
905 cr16_ins->exp.X_add_number = 0;
906 cr16_ins->rtype = BFD_RELOC_NONE;
909 if (strneq (input_line_pointer, "@c", 2))
912 if (strneq (input_line_pointer, "@l", 2)
913 || strneq (input_line_pointer, ":l", 2))
916 if (strneq (input_line_pointer, "@m", 2)
917 || strneq (input_line_pointer, ":m", 2))
920 if (strneq (input_line_pointer, "@s", 2)
921 || strneq (input_line_pointer, ":s", 2))
924 if (strneq (input_line_pointer, "@cGOT", 5)
925 || strneq (input_line_pointer, "@cgot", 5))
927 if (GOT_symbol == NULL)
928 GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
930 symbol_with_at_gotc = 1;
932 else if (strneq (input_line_pointer, "@GOT", 4)
933 || strneq (input_line_pointer, "@got", 4))
935 if ((strneq (input_line_pointer, "+", 1))
936 || (strneq (input_line_pointer, "-", 1)))
937 as_warn (_("GOT bad expression with %s."), input_line_pointer);
939 if (GOT_symbol == NULL)
940 GOT_symbol = symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME);
942 symbol_with_at_got = 1;
945 switch (cur_arg->type)
948 if (IS_INSN_TYPE (LD_STOR_INS) || IS_INSN_TYPE (CSTBIT_INS))
950 if (symbol_with_at_got)
951 cr16_ins->rtype = BFD_RELOC_CR16_GOT_REGREL20;
952 else if (symbol_with_at_gotc)
953 cr16_ins->rtype = BFD_RELOC_CR16_GOTC_REGREL20;
954 else if (cur_arg->size == 20)
955 cr16_ins->rtype = BFD_RELOC_CR16_REGREL20;
957 cr16_ins->rtype = BFD_RELOC_CR16_REGREL20a;
962 if (IS_INSN_TYPE (LD_STOR_INS) || IS_INSN_TYPE (CSTBIT_INS))
964 if (symbol_with_at_got)
965 cr16_ins->rtype = BFD_RELOC_CR16_GOT_REGREL20;
966 else if (symbol_with_at_gotc)
967 cr16_ins->rtype = BFD_RELOC_CR16_GOTC_REGREL20;
969 switch (instruction->size)
972 switch (cur_arg->size)
975 cr16_ins->rtype = BFD_RELOC_CR16_REGREL0;
978 if (IS_INSN_MNEMONIC ("loadb") || IS_INSN_MNEMONIC ("storb"))
979 cr16_ins->rtype = BFD_RELOC_CR16_REGREL4;
981 cr16_ins->rtype = BFD_RELOC_CR16_REGREL4a;
987 cr16_ins->rtype = BFD_RELOC_CR16_REGREL16;
990 if (cur_arg->size == 20)
991 cr16_ins->rtype = BFD_RELOC_CR16_REGREL20;
993 cr16_ins->rtype = BFD_RELOC_CR16_REGREL20a;
1002 if (IS_INSN_TYPE (LD_STOR_INS) || IS_INSN_TYPE (CSTBIT_INS))
1004 if (symbol_with_at_got)
1005 cr16_ins->rtype = BFD_RELOC_CR16_GOT_REGREL20;
1006 else if (symbol_with_at_gotc)
1007 cr16_ins->rtype = BFD_RELOC_CR16_GOTC_REGREL20;
1009 cr16_ins->rtype = BFD_RELOC_CR16_REGREL20;
1014 if (IS_INSN_TYPE (LD_STOR_INS) || IS_INSN_TYPE (CSTBIT_INS))
1016 if (symbol_with_at_got)
1017 cr16_ins->rtype = BFD_RELOC_CR16_GOT_REGREL20;
1018 else if (symbol_with_at_gotc)
1019 cr16_ins->rtype = BFD_RELOC_CR16_GOTC_REGREL20;
1021 switch (instruction->size)
1023 case 1: cr16_ins->rtype = BFD_RELOC_CR16_REGREL0; break;
1024 case 2: cr16_ins->rtype = BFD_RELOC_CR16_REGREL14; break;
1025 case 3: cr16_ins->rtype = BFD_RELOC_CR16_REGREL20; break;
1033 if (IS_INSN_MNEMONIC ("bal"))
1034 cr16_ins->rtype = BFD_RELOC_CR16_DISP24;
1035 else if (IS_INSN_TYPE (BRANCH_INS))
1038 cr16_ins->rtype = BFD_RELOC_CR16_DISP24;
1039 else if (symbol_with_m)
1040 cr16_ins->rtype = BFD_RELOC_CR16_DISP16;
1042 cr16_ins->rtype = BFD_RELOC_CR16_DISP8;
1044 else if (IS_INSN_TYPE (STOR_IMM_INS) || IS_INSN_TYPE (LD_STOR_INS)
1045 || IS_INSN_TYPE (CSTBIT_INS))
1048 as_bad (_("operand %d: illegal use expression: `%s`"), cur_arg_num + 1, str);
1049 if (symbol_with_at_got)
1050 cr16_ins->rtype = BFD_RELOC_CR16_GOT_REGREL20;
1051 else if (symbol_with_at_gotc)
1052 cr16_ins->rtype = BFD_RELOC_CR16_GOTC_REGREL20;
1053 else if (symbol_with_m)
1054 cr16_ins->rtype = BFD_RELOC_CR16_ABS20;
1055 else /* Default to (symbol_with_l) */
1056 cr16_ins->rtype = BFD_RELOC_CR16_ABS24;
1058 else if (IS_INSN_TYPE (BRANCH_NEQ_INS))
1059 cr16_ins->rtype = BFD_RELOC_CR16_DISP4;
1063 if (IS_INSN_TYPE (ARITH_INS))
1065 if (symbol_with_at_got)
1066 cr16_ins->rtype = BFD_RELOC_CR16_GOT_REGREL20;
1067 else if (symbol_with_at_gotc)
1068 cr16_ins->rtype = BFD_RELOC_CR16_GOTC_REGREL20;
1069 else if (symbol_with_s)
1070 cr16_ins->rtype = BFD_RELOC_CR16_IMM4;
1071 else if (symbol_with_m)
1072 cr16_ins->rtype = BFD_RELOC_CR16_IMM20;
1073 else if (symbol_with_at)
1074 cr16_ins->rtype = BFD_RELOC_CR16_IMM32a;
1075 else /* Default to (symbol_with_l) */
1076 cr16_ins->rtype = BFD_RELOC_CR16_IMM32;
1078 else if (IS_INSN_TYPE (ARITH_BYTE_INS))
1080 cr16_ins->rtype = BFD_RELOC_CR16_IMM16;
1089 cur_arg->X_op = cr16_ins->exp.X_op;
1093 input_line_pointer = saved_input_line_pointer;
1097 /* Retrieve the opcode image of a given register.
1098 If the register is illegal for the current instruction,
1102 getreg_image (reg r)
1104 const reg_entry *rreg;
1106 int is_procreg = 0; /* Nonzero means argument should be processor reg. */
1108 /* Check whether the register is in registers table. */
1110 rreg = cr16_regtab + r;
1111 else /* Register not found. */
1113 as_bad (_("Unknown register: `%d'"), r);
1117 reg_name = rreg->name;
1119 /* Issue a error message when register is illegal. */
1121 as_bad (_("Illegal register (`%s') in Instruction: `%s'"), \
1122 reg_name, ins_parse); \
1127 case CR16_R_REGTYPE:
1133 case CR16_P_REGTYPE:
1144 /* Parsing different types of operands
1145 -> constants Immediate/Absolute/Relative numbers
1146 -> Labels Relocatable symbols
1147 -> (reg pair base) Register pair base
1148 -> (rbase) Register base
1149 -> disp(rbase) Register relative
1150 -> [rinx]disp(reg pair) Register index with reg pair mode
1151 -> disp(rbase,ridx,scl) Register index mode. */
1154 set_operand (char *operand, ins * cr16_ins)
1156 char *operandS; /* Pointer to start of sub-opearand. */
1157 char *operandE; /* Pointer to end of sub-opearand. */
1159 argument *cur_arg = &cr16_ins->arg[cur_arg_num]; /* Current argument. */
1161 /* Initialize pointers. */
1162 operandS = operandE = operand;
1164 switch (cur_arg->type)
1166 case arg_ic: /* Case $0x18. */
1168 case arg_c: /* Case 0x18. */
1170 process_label_constant (operandS, cr16_ins);
1172 if (cur_arg->type != arg_ic)
1173 cur_arg->type = arg_c;
1176 case arg_icr: /* Case $0x18(r1). */
1178 case arg_cr: /* Case 0x18(r1). */
1179 /* Set displacement constant. */
1180 while (*operandE != '(')
1183 process_label_constant (operandS, cr16_ins);
1184 operandS = operandE;
1185 case arg_rbase: /* Case (r1) or (r1,r0). */
1187 /* Set register base. */
1188 while (*operandE != ')')
1191 if ((cur_arg->r = get_register (operandS)) == nullregister)
1192 as_bad (_("Illegal register `%s' in Instruction `%s'"),
1193 operandS, ins_parse);
1195 /* set the arg->rp, if reg is "r12" or "r13" or "14" or "15" */
1196 if ((cur_arg->type != arg_rbase)
1197 && ((getreg_image (cur_arg->r) == 12)
1198 || (getreg_image (cur_arg->r) == 13)
1199 || (getreg_image (cur_arg->r) == 14)
1200 || (getreg_image (cur_arg->r) == 15)))
1202 cur_arg->type = arg_crp;
1203 cur_arg->rp = cur_arg->r;
1207 case arg_crp: /* Case 0x18(r1,r0). */
1208 /* Set displacement constant. */
1209 while (*operandE != '(')
1212 process_label_constant (operandS, cr16_ins);
1213 operandS = operandE;
1215 /* Set register pair base. */
1216 while (*operandE != ')')
1219 if ((cur_arg->rp = get_register_pair (operandS)) == nullregister)
1220 as_bad (_("Illegal register pair `%s' in Instruction `%s'"),
1221 operandS, ins_parse);
1225 /* Set register pair base. */
1226 if ((strchr (operandS,'(') != NULL))
1228 while ((*operandE != '(') && (! ISSPACE (*operandE)))
1230 if ((cur_arg->rp = get_index_register_pair (operandE)) == nullregister)
1231 as_bad (_("Illegal register pair `%s' in Instruction `%s'"),
1232 operandS, ins_parse);
1234 cur_arg->type = arg_idxrp;
1239 operandE = operandS;
1240 /* Set displacement constant. */
1241 while (*operandE != ']')
1243 process_label_constant (++operandE, cr16_ins);
1245 operandE = operandS;
1247 /* Set index register . */
1248 operandS = strchr (operandE,'[');
1249 if (operandS != NULL)
1250 { /* Eliminate '[', detach from rest of operand. */
1253 operandE = strchr (operandS, ']');
1255 if (operandE == NULL)
1256 as_bad (_("unmatched '['"));
1258 { /* Eliminate ']' and make sure it was the last thing
1261 if (*(operandE + 1) != '\0')
1262 as_bad (_("garbage after index spec ignored"));
1266 if ((cur_arg->i_r = get_index_register (operandS)) == nullregister)
1267 as_bad (_("Illegal register `%s' in Instruction `%s'"),
1268 operandS, ins_parse);
1278 /* Parse a single operand.
1279 operand - Current operand to parse.
1280 cr16_ins - Current assembled instruction. */
1283 parse_operand (char *operand, ins * cr16_ins)
1286 argument *cur_arg = cr16_ins->arg + cur_arg_num; /* Current argument. */
1288 /* Initialize the type to NULL before parsing. */
1289 cur_arg->type = nullargs;
1291 /* Check whether this is a condition code . */
1292 if ((IS_INSN_MNEMONIC ("b")) && ((ret_val = get_cc (operand)) != -1))
1294 cur_arg->type = arg_cc;
1295 cur_arg->cc = ret_val;
1296 cur_arg->X_op = O_register;
1300 /* Check whether this is a general processor register. */
1301 if ((ret_val = get_register (operand)) != nullregister)
1303 cur_arg->type = arg_r;
1304 cur_arg->r = ret_val;
1309 /* Check whether this is a general processor register pair. */
1310 if ((operand[0] == '(')
1311 && ((ret_val = get_register_pair (operand)) != nullregister))
1313 cur_arg->type = arg_rp;
1314 cur_arg->rp = ret_val;
1315 cur_arg->X_op = O_register;
1319 /* Check whether the operand is a processor register.
1320 For "lprd" and "sprd" instruction, only 32 bit
1321 processor registers used. */
1322 if (!(IS_INSN_MNEMONIC ("lprd") || (IS_INSN_MNEMONIC ("sprd")))
1323 && ((ret_val = get_pregister (operand)) != nullpregister))
1325 cur_arg->type = arg_pr;
1326 cur_arg->pr = ret_val;
1327 cur_arg->X_op = O_register;
1331 /* Check whether this is a processor register - 32 bit. */
1332 if ((ret_val = get_pregisterp (operand)) != nullpregister)
1334 cur_arg->type = arg_prp;
1335 cur_arg->prp = ret_val;
1336 cur_arg->X_op = O_register;
1340 /* Deal with special characters. */
1344 if (strchr (operand, '(') != NULL)
1345 cur_arg->type = arg_icr;
1347 cur_arg->type = arg_ic;
1352 cur_arg->type = arg_rbase;
1357 cur_arg->type = arg_idxr;
1365 if (strchr (operand, '(') != NULL)
1367 if (strchr (operand, ',') != NULL
1368 && (strchr (operand, ',') > strchr (operand, '(')))
1369 cur_arg->type = arg_crp;
1371 cur_arg->type = arg_cr;
1374 cur_arg->type = arg_c;
1376 /* Parse an operand according to its type. */
1378 cur_arg->constant = 0;
1379 set_operand (operand, cr16_ins);
1382 /* Parse the various operands. Each operand is then analyzed to fillup
1383 the fields in the cr16_ins data structure. */
1386 parse_operands (ins * cr16_ins, char *operands)
1388 char *operandS; /* Operands string. */
1389 char *operandH, *operandT; /* Single operand head/tail pointers. */
1390 int allocated = 0; /* Indicates a new operands string was allocated.*/
1391 char *operand[MAX_OPERANDS];/* Separating the operands. */
1392 int op_num = 0; /* Current operand number we are parsing. */
1393 int bracket_flag = 0; /* Indicates a bracket '(' was found. */
1394 int sq_bracket_flag = 0; /* Indicates a square bracket '[' was found. */
1396 /* Preprocess the list of registers, if necessary. */
1397 operandS = operandH = operandT = operands;
1399 while (*operandT != '\0')
1401 if (*operandT == ',' && bracket_flag != 1 && sq_bracket_flag != 1)
1404 operand[op_num++] = strdup (operandH);
1405 operandH = operandT;
1409 if (*operandT == ' ')
1410 as_bad (_("Illegal operands (whitespace): `%s'"), ins_parse);
1412 if (*operandT == '(')
1414 else if (*operandT == '[')
1415 sq_bracket_flag = 1;
1417 if (*operandT == ')')
1422 as_fatal (_("Missing matching brackets : `%s'"), ins_parse);
1424 else if (*operandT == ']')
1426 if (sq_bracket_flag)
1427 sq_bracket_flag = 0;
1429 as_fatal (_("Missing matching brackets : `%s'"), ins_parse);
1432 if (bracket_flag == 1 && *operandT == ')')
1434 else if (sq_bracket_flag == 1 && *operandT == ']')
1435 sq_bracket_flag = 0;
1440 /* Adding the last operand. */
1441 operand[op_num++] = strdup (operandH);
1442 cr16_ins->nargs = op_num;
1444 /* Verifying correct syntax of operands (all brackets should be closed). */
1445 if (bracket_flag || sq_bracket_flag)
1446 as_fatal (_("Missing matching brackets : `%s'"), ins_parse);
1448 /* Now we parse each operand separately. */
1449 for (op_num = 0; op_num < cr16_ins->nargs; op_num++)
1451 cur_arg_num = op_num;
1452 parse_operand (operand[op_num], cr16_ins);
1453 free (operand[op_num]);
1460 /* Get the trap index in dispatch table, given its name.
1461 This routine is used by assembling the 'excp' instruction. */
1466 const trap_entry *trap;
1468 for (trap = cr16_traps; trap < (cr16_traps + NUMTRAPS); trap++)
1469 if (strcasecmp (trap->name, s) == 0)
1472 /* To make compatable with CR16 4.1 tools, the below 3-lines of
1473 * code added. Refer: Development Tracker item #123 */
1474 for (trap = cr16_traps; trap < (cr16_traps + NUMTRAPS); trap++)
1475 if (trap->entry == (unsigned int) atoi (s))
1478 as_bad (_("Unknown exception: `%s'"), s);
1482 /* Top level module where instruction parsing starts.
1483 cr16_ins - data structure holds some information.
1484 operands - holds the operands part of the whole instruction. */
1487 parse_insn (ins *insn, char *operands)
1491 /* Handle instructions with no operands. */
1492 for (i = 0; cr16_no_op_insn[i] != NULL; i++)
1494 if (streq (cr16_no_op_insn[i], instruction->mnemonic))
1501 /* Handle 'excp' instructions. */
1502 if (IS_INSN_MNEMONIC ("excp"))
1505 insn->arg[0].type = arg_ic;
1506 insn->arg[0].constant = gettrap (operands);
1507 insn->arg[0].X_op = O_constant;
1511 if (operands != NULL)
1512 parse_operands (insn, operands);
1515 /* bCC instruction requires special handling. */
1517 get_b_cc (char * op)
1522 for (i = 1; i < strlen (op); i++)
1527 for (i = 0; i < cr16_num_cc ; i++)
1528 if (streq (op1, cr16_b_cond_tab[i]))
1529 return (char *) cr16_b_cond_tab[i];
1534 /* bCC instruction requires special handling. */
1536 is_bcc_insn (char * op)
1538 if (!(streq (op, "bal") || streq (op, "beq0b") || streq (op, "bnq0b")
1539 || streq (op, "beq0w") || streq (op, "bnq0w")))
1540 if ((op[0] == 'b') && (get_b_cc (op) != NULL))
1545 /* Cinv instruction requires special handling. */
1548 check_cinv_options (char * operand)
1563 as_bad (_("Illegal `cinv' parameter: `%c'"), *p);
1568 /* Retrieve the opcode image of a given register pair.
1569 If the register is illegal for the current instruction,
1573 getregp_image (reg r)
1575 const reg_entry *rreg;
1578 /* Check whether the register is in registers table. */
1580 rreg = cr16_regptab + r;
1581 /* Register not found. */
1584 as_bad (_("Unknown register pair: `%d'"), r);
1588 reg_name = rreg->name;
1590 /* Issue a error message when register pair is illegal. */
1591 #define RPAIR_IMAGE_ERR \
1592 as_bad (_("Illegal register pair (`%s') in Instruction: `%s'"), \
1593 reg_name, ins_parse); \
1598 case CR16_RP_REGTYPE:
1607 /* Retrieve the opcode image of a given index register pair.
1608 If the register is illegal for the current instruction,
1612 getidxregp_image (reg r)
1614 const reg_entry *rreg;
1617 /* Check whether the register is in registers table. */
1619 rreg = cr16_regptab + r;
1620 /* Register not found. */
1623 as_bad (_("Unknown register pair: `%d'"), r);
1627 reg_name = rreg->name;
1629 /* Issue a error message when register pair is illegal. */
1630 #define IDX_RPAIR_IMAGE_ERR \
1631 as_bad (_("Illegal index register pair (`%s') in Instruction: `%s'"), \
1632 reg_name, ins_parse); \
1634 if (rreg->type == CR16_RP_REGTYPE)
1636 switch (rreg->image)
1638 case 0: return 0; break;
1639 case 2: return 1; break;
1640 case 4: return 2; break;
1641 case 6: return 3; break;
1642 case 8: return 4; break;
1643 case 10: return 5; break;
1644 case 3: return 6; break;
1645 case 5: return 7; break;
1651 IDX_RPAIR_IMAGE_ERR;
1655 /* Retrieve the opcode image of a given processort register.
1656 If the register is illegal for the current instruction,
1659 getprocreg_image (int r)
1661 const reg_entry *rreg;
1664 /* Check whether the register is in registers table. */
1665 if (r >= MAX_REG && r < MAX_PREG)
1666 rreg = &cr16_pregtab[r - MAX_REG];
1667 /* Register not found. */
1670 as_bad (_("Unknown processor register : `%d'"), r);
1674 reg_name = rreg->name;
1676 /* Issue a error message when register pair is illegal. */
1677 #define PROCREG_IMAGE_ERR \
1678 as_bad (_("Illegal processor register (`%s') in Instruction: `%s'"), \
1679 reg_name, ins_parse); \
1684 case CR16_P_REGTYPE:
1693 /* Retrieve the opcode image of a given processort register.
1694 If the register is illegal for the current instruction,
1697 getprocregp_image (int r)
1699 const reg_entry *rreg;
1701 int pregptab_disp = 0;
1703 /* Check whether the register is in registers table. */
1704 if (r >= MAX_REG && r < MAX_PREG)
1709 case 4: pregptab_disp = 1; break;
1710 case 6: pregptab_disp = 2; break;
1714 pregptab_disp = 3; break;
1716 pregptab_disp = 4; break;
1718 pregptab_disp = 5; break;
1721 rreg = &cr16_pregptab[r - pregptab_disp];
1723 /* Register not found. */
1726 as_bad (_("Unknown processor register (32 bit) : `%d'"), r);
1730 reg_name = rreg->name;
1732 /* Issue a error message when register pair is illegal. */
1733 #define PROCREGP_IMAGE_ERR \
1734 as_bad (_("Illegal 32 bit - processor register (`%s') in Instruction: `%s'"),\
1735 reg_name, ins_parse); \
1740 case CR16_P_REGTYPE:
1749 /* Routine used to represent integer X using NBITS bits. */
1752 getconstant (long x, int nbits)
1754 /* The following expression avoids overflow if
1755 'nbits' is the number of bits in 'bfd_vma'. */
1756 return (x & ((((1 << (nbits - 1)) - 1) << 1) | 1));
1759 /* Print a constant value to 'output_opcode':
1760 ARG holds the operand's type and value.
1761 SHIFT represents the location of the operand to be print into.
1762 NBITS determines the size (in bits) of the constant. */
1765 print_constant (int nbits, int shift, argument *arg)
1767 unsigned long mask = 0;
1769 long constant = getconstant (arg->constant, nbits);
1775 /* mask the upper part of the constant, that is, the bits
1776 going to the lowest byte of output_opcode[0].
1777 The upper part of output_opcode[1] is always filled,
1778 therefore it is always masked with 0xFFFF. */
1779 mask = (1 << (nbits - 16)) - 1;
1780 /* Divide the constant between two consecutive words :
1782 +---------+---------+---------+---------+
1783 | | X X X X | x X x X | |
1784 +---------+---------+---------+---------+
1785 output_opcode[0] output_opcode[1] */
1787 CR16_PRINT (0, (constant >> WORD_SHIFT) & mask, 0);
1788 CR16_PRINT (1, (constant & 0xFFFF), WORD_SHIFT);
1792 if ((nbits == 21) && (IS_INSN_TYPE (LD_STOR_INS))) nbits = 20;
1796 /* mask the upper part of the constant, that is, the bits
1797 going to the lowest byte of output_opcode[0].
1798 The upper part of output_opcode[1] is always filled,
1799 therefore it is always masked with 0xFFFF. */
1800 mask = (1 << (nbits - 16)) - 1;
1801 /* Divide the constant between two consecutive words :
1803 +---------+---------+---------+---------+
1804 | | X X X X | - X - X | |
1805 +---------+---------+---------+---------+
1806 output_opcode[0] output_opcode[1] */
1808 if ((instruction->size > 2) && (shift == WORD_SHIFT))
1810 if (arg->type == arg_idxrp)
1812 CR16_PRINT (0, ((constant >> WORD_SHIFT) & mask) << 8, 0);
1813 CR16_PRINT (1, (constant & 0xFFFF), WORD_SHIFT);
1817 CR16_PRINT (0, (((((constant >> WORD_SHIFT) & mask) << 8) & 0x0f00) | ((((constant >> WORD_SHIFT) & mask) >> 4) & 0xf)),0);
1818 CR16_PRINT (1, (constant & 0xFFFF), WORD_SHIFT);
1822 CR16_PRINT (0, constant, shift);
1826 if (arg->type == arg_idxrp)
1828 if (instruction->size == 2)
1830 CR16_PRINT (0, ((constant) & 0xf), shift); /* 0-3 bits. */
1831 CR16_PRINT (0, ((constant >> 4) & 0x3), (shift + 20)); /* 4-5 bits. */
1832 CR16_PRINT (0, ((constant >> 6) & 0x3), (shift + 14)); /* 6-7 bits. */
1833 CR16_PRINT (0, ((constant >> 8) & 0x3f), (shift + 8)); /* 8-13 bits. */
1836 CR16_PRINT (0, constant, shift);
1842 /* When instruction size is 3 and 'shift' is 16, a 16-bit constant is
1843 always filling the upper part of output_opcode[1]. If we mistakenly
1844 write it to output_opcode[0], the constant prefix (that is, 'match')
1847 +---------+---------+---------+---------+
1848 | 'match' | | X X X X | |
1849 +---------+---------+---------+---------+
1850 output_opcode[0] output_opcode[1] */
1852 if ((instruction->size > 2) && (shift == WORD_SHIFT))
1853 CR16_PRINT (1, constant, WORD_SHIFT);
1855 CR16_PRINT (0, constant, shift);
1859 CR16_PRINT (0, ((constant / 2) & 0xf), shift);
1860 CR16_PRINT (0, ((constant / 2) >> 4), (shift + 8));
1864 CR16_PRINT (0, constant, shift);
1869 /* Print an operand to 'output_opcode', which later on will be
1870 printed to the object file:
1871 ARG holds the operand's type, size and value.
1872 SHIFT represents the printing location of operand.
1873 NBITS determines the size (in bits) of a constant operand. */
1876 print_operand (int nbits, int shift, argument *arg)
1881 CR16_PRINT (0, arg->cc, shift);
1885 CR16_PRINT (0, getreg_image (arg->r), shift);
1889 CR16_PRINT (0, getregp_image (arg->rp), shift);
1893 CR16_PRINT (0, getprocreg_image (arg->pr), shift);
1897 CR16_PRINT (0, getprocregp_image (arg->prp), shift);
1902 +-----------------------------+
1903 | r_index | disp | rp_base |
1904 +-----------------------------+ */
1906 if (instruction->size == 3)
1908 CR16_PRINT (0, getidxregp_image (arg->rp), 0);
1909 if (getreg_image (arg->i_r) == 12)
1910 CR16_PRINT (0, 0, 3);
1912 CR16_PRINT (0, 1, 3);
1916 CR16_PRINT (0, getidxregp_image (arg->rp), 16);
1917 if (getreg_image (arg->i_r) == 12)
1918 CR16_PRINT (0, 0, 19);
1920 CR16_PRINT (0, 1, 19);
1922 print_constant (nbits, shift, arg);
1926 if (getreg_image (arg->i_r) == 12)
1927 if (IS_INSN_MNEMONIC ("cbitb") || IS_INSN_MNEMONIC ("sbitb")
1928 || IS_INSN_MNEMONIC ("tbitb"))
1929 CR16_PRINT (0, 0, 23);
1930 else CR16_PRINT (0, 0, 24);
1932 if (IS_INSN_MNEMONIC ("cbitb") || IS_INSN_MNEMONIC ("sbitb")
1933 || IS_INSN_MNEMONIC ("tbitb"))
1934 CR16_PRINT (0, 1, 23);
1935 else CR16_PRINT (0, 1, 24);
1937 print_constant (nbits, shift, arg);
1942 print_constant (nbits, shift, arg);
1946 CR16_PRINT (0, getreg_image (arg->r), shift);
1950 print_constant (nbits, shift , arg);
1951 /* Add the register argument to the output_opcode. */
1952 CR16_PRINT (0, getreg_image (arg->r), (shift+16));
1956 print_constant (nbits, shift , arg);
1957 if (instruction->size > 1)
1958 CR16_PRINT (0, getregp_image (arg->rp), (shift + 16));
1959 else if (IS_INSN_TYPE (LD_STOR_INS) || (IS_INSN_TYPE (CSTBIT_INS)))
1961 if (instruction->size == 2)
1962 CR16_PRINT (0, getregp_image (arg->rp), (shift - 8));
1963 else if (instruction->size == 1)
1964 CR16_PRINT (0, getregp_image (arg->rp), 16);
1967 CR16_PRINT (0, getregp_image (arg->rp), shift);
1975 /* Retrieve the number of operands for the current assembled instruction. */
1978 get_number_of_operands (void)
1982 for (i = 0; instruction->operands[i].op_type && i < MAX_OPERANDS; i++)
1987 /* Verify that the number NUM can be represented in BITS bits (that is,
1988 within its permitted range), based on the instruction's FLAGS.
1989 If UPDATE is nonzero, update the value of NUM if necessary.
1990 Return OP_LEGAL upon success, actual error type upon failure. */
1993 check_range (long *num, int bits, int unsigned flags, int update)
1996 op_err retval = OP_LEGAL;
1999 if (bits == 0 && value > 0) return OP_OUT_OF_RANGE;
2001 /* For hosts witah longs bigger than 32-bits make sure that the top
2002 bits of a 32-bit negative value read in by the parser are set,
2003 so that the correct comparisons are made. */
2004 if (value & 0x80000000)
2005 value |= (-1UL << 31);
2008 /* Verify operand value is even. */
2009 if (flags & OP_EVEN)
2022 if (flags & OP_SHIFT)
2028 else if (flags & OP_SHIFT_DEC)
2030 value = (value >> 1) - 1;
2035 if (flags & OP_ABS20)
2037 if (value > 0xEFFFF)
2038 return OP_OUT_OF_RANGE;
2043 if (value == 0xB || value == 0x9)
2044 return OP_OUT_OF_RANGE;
2045 else if (value == -1)
2053 if (flags & OP_ESC1)
2056 return OP_OUT_OF_RANGE;
2059 if (flags & OP_SIGNED)
2061 max = (1 << (bits - 1)) - 1;
2062 min = - (1 << (bits - 1));
2063 if ((value > max) || (value < min))
2064 retval = OP_OUT_OF_RANGE;
2066 else if (flags & OP_UNSIGNED)
2068 max = ((((1 << (bits - 1)) - 1) << 1) | 1);
2070 if (((unsigned long) value > (unsigned long) max)
2071 || ((unsigned long) value < (unsigned long) min))
2072 retval = OP_OUT_OF_RANGE;
2074 else if (flags & OP_NEG)
2077 min = - ((1 << (bits - 1)) - 1);
2078 if ((value > max) || (value < min))
2079 retval = OP_OUT_OF_RANGE;
2084 /* Bunch of error checkings.
2085 The checks are made after a matching instruction was found. */
2088 warn_if_needed (ins *insn)
2090 /* If the post-increment address mode is used and the load/store
2091 source register is the same as rbase, the result of the
2092 instruction is undefined. */
2093 if (IS_INSN_TYPE (LD_STOR_INS_INC))
2095 /* Enough to verify that one of the arguments is a simple reg. */
2096 if ((insn->arg[0].type == arg_r) || (insn->arg[1].type == arg_r))
2097 if (insn->arg[0].r == insn->arg[1].r)
2098 as_bad (_("Same src/dest register is used (`r%d'), result is undefined"), insn->arg[0].r);
2101 if (IS_INSN_MNEMONIC ("pop")
2102 || IS_INSN_MNEMONIC ("push")
2103 || IS_INSN_MNEMONIC ("popret"))
2105 unsigned int count = insn->arg[0].constant, reg_val;
2107 /* Check if count operand caused to save/retrive the RA twice
2108 to generate warning message. */
2109 if (insn->nargs > 2)
2111 reg_val = getreg_image (insn->arg[1].r);
2113 if ( ((reg_val == 9) && (count > 7))
2114 || ((reg_val == 10) && (count > 6))
2115 || ((reg_val == 11) && (count > 5))
2116 || ((reg_val == 12) && (count > 4))
2117 || ((reg_val == 13) && (count > 2))
2118 || ((reg_val == 14) && (count > 0)))
2119 as_warn (_("RA register is saved twice."));
2121 /* Check if the third operand is "RA" or "ra" */
2122 if (!(((insn->arg[2].r) == ra) || ((insn->arg[2].r) == RA)))
2123 as_bad (_("`%s' Illegal use of registers."), ins_parse);
2126 if (insn->nargs > 1)
2128 reg_val = getreg_image (insn->arg[1].r);
2130 /* If register is a register pair ie r12/r13/r14 in operand1, then
2131 the count constant should be validated. */
2132 if (((reg_val == 11) && (count > 7))
2133 || ((reg_val == 12) && (count > 6))
2134 || ((reg_val == 13) && (count > 4))
2135 || ((reg_val == 14) && (count > 2))
2136 || ((reg_val == 15) && (count > 0)))
2137 as_bad (_("`%s' Illegal count-register combination."), ins_parse);
2141 /* Check if the operand is "RA" or "ra" */
2142 if (!(((insn->arg[0].r) == ra) || ((insn->arg[0].r) == RA)))
2143 as_bad (_("`%s' Illegal use of register."), ins_parse);
2147 /* Some instruction assume the stack pointer as rptr operand.
2148 Issue an error when the register to be loaded is also SP. */
2149 if (instruction->flags & NO_SP)
2151 if (getreg_image (insn->arg[1].r) == getreg_image (sp))
2152 as_bad (_("`%s' has undefined result"), ins_parse);
2155 /* If the rptr register is specified as one of the registers to be loaded,
2156 the final contents of rptr are undefined. Thus, we issue an error. */
2157 if (instruction->flags & NO_RPTR)
2159 if ((1 << getreg_image (insn->arg[0].r)) & insn->arg[1].constant)
2160 as_bad (_("Same src/dest register is used (`r%d'),result is undefined"),
2161 getreg_image (insn->arg[0].r));
2165 /* In some cases, we need to adjust the instruction pointer although a
2166 match was already found. Here, we gather all these cases.
2167 Returns 1 if instruction pointer was adjusted, otherwise 0. */
2170 adjust_if_needed (ins *insn ATTRIBUTE_UNUSED)
2174 if ((IS_INSN_TYPE (CSTBIT_INS)) || (IS_INSN_TYPE (LD_STOR_INS)))
2176 if ((instruction->operands[0].op_type == abs24)
2177 && ((insn->arg[0].constant) > 0xF00000))
2179 insn->arg[0].constant &= 0xFFFFF;
2188 /* Assemble a single instruction:
2189 INSN is already parsed (that is, all operand values and types are set).
2190 For instruction to be assembled, we need to find an appropriate template in
2191 the instruction table, meeting the following conditions:
2192 1: Has the same number of operands.
2193 2: Has the same operand types.
2194 3: Each operand size is sufficient to represent the instruction's values.
2195 Returns 1 upon success, 0 upon failure. */
2198 assemble_insn (const char *mnemonic, ins *insn)
2200 /* Type of each operand in the current template. */
2201 argtype cur_type[MAX_OPERANDS];
2202 /* Size (in bits) of each operand in the current template. */
2203 unsigned int cur_size[MAX_OPERANDS];
2204 /* Flags of each operand in the current template. */
2205 unsigned int cur_flags[MAX_OPERANDS];
2206 /* Instruction type to match. */
2207 unsigned int ins_type;
2208 /* Boolean flag to mark whether a match was found. */
2211 /* Nonzero if an instruction with same number of operands was found. */
2212 int found_same_number_of_operands = 0;
2213 /* Nonzero if an instruction with same argument types was found. */
2214 int found_same_argument_types = 0;
2215 /* Nonzero if a constant was found within the required range. */
2216 int found_const_within_range = 0;
2217 /* Argument number of an operand with invalid type. */
2218 int invalid_optype = -1;
2219 /* Argument number of an operand with invalid constant value. */
2220 int invalid_const = -1;
2221 /* Operand error (used for issuing various constant error messages). */
2222 op_err op_error, const_err = OP_LEGAL;
2224 /* Retrieve data (based on FUNC) for each operand of a given instruction. */
2225 #define GET_CURRENT_DATA(FUNC, ARRAY) \
2226 for (i = 0; i < insn->nargs; i++) \
2227 ARRAY[i] = FUNC (instruction->operands[i].op_type)
2229 #define GET_CURRENT_TYPE GET_CURRENT_DATA (get_optype, cur_type)
2230 #define GET_CURRENT_SIZE GET_CURRENT_DATA (get_opbits, cur_size)
2231 #define GET_CURRENT_FLAGS GET_CURRENT_DATA (get_opflags, cur_flags)
2233 /* Instruction has no operands -> only copy the constant opcode. */
2234 if (insn->nargs == 0)
2236 output_opcode[0] = BIN (instruction->match, instruction->match_bits);
2240 /* In some case, same mnemonic can appear with different instruction types.
2241 For example, 'storb' is supported with 3 different types :
2242 LD_STOR_INS, LD_STOR_INS_INC, STOR_IMM_INS.
2243 We assume that when reaching this point, the instruction type was
2244 pre-determined. We need to make sure that the type stays the same
2245 during a search for matching instruction. */
2246 ins_type = CR16_INS_TYPE (instruction->flags);
2248 while (/* Check that match is still not found. */
2250 /* Check we didn't get to end of table. */
2251 && instruction->mnemonic != NULL
2252 /* Check that the actual mnemonic is still available. */
2253 && IS_INSN_MNEMONIC (mnemonic)
2254 /* Check that the instruction type wasn't changed. */
2255 && IS_INSN_TYPE (ins_type))
2257 /* Check whether number of arguments is legal. */
2258 if (get_number_of_operands () != insn->nargs)
2260 found_same_number_of_operands = 1;
2262 /* Initialize arrays with data of each operand in current template. */
2267 /* Check for type compatibility. */
2268 for (i = 0; i < insn->nargs; i++)
2270 if (cur_type[i] != insn->arg[i].type)
2272 if (invalid_optype == -1)
2273 invalid_optype = i + 1;
2277 found_same_argument_types = 1;
2279 for (i = 0; i < insn->nargs; i++)
2281 /* If 'bal' instruction size is '2' and reg operand is not 'ra'
2282 then goto next instruction. */
2283 if (IS_INSN_MNEMONIC ("bal") && (i == 0)
2284 && (instruction->size == 2) && (insn->arg[i].rp != 14))
2287 /* If 'storb' instruction with 'sp' reg and 16-bit disp of
2288 * reg-pair, leads to undifined trap, so this should use
2289 * 20-bit disp of reg-pair. */
2290 if (IS_INSN_MNEMONIC ("storb") && (instruction->size == 2)
2291 && (insn->arg[i].r == 15) && (insn->arg[i + 1].type == arg_crp))
2294 /* Only check range - don't update the constant's value, since the
2295 current instruction may not be the last we try to match.
2296 The constant's value will be updated later, right before printing
2297 it to the object file. */
2298 if ((insn->arg[i].X_op == O_constant)
2299 && (op_error = check_range (&insn->arg[i].constant, cur_size[i],
2302 if (invalid_const == -1)
2304 invalid_const = i + 1;
2305 const_err = op_error;
2309 /* For symbols, we make sure the relocation size (which was already
2310 determined) is sufficient. */
2311 else if ((insn->arg[i].X_op == O_symbol)
2312 && ((bfd_reloc_type_lookup (stdoutput, insn->rtype))->bitsize
2316 found_const_within_range = 1;
2318 /* If we got till here -> Full match is found. */
2322 /* Try again with next instruction. */
2329 /* We haven't found a match - instruction can't be assembled. */
2330 if (!found_same_number_of_operands)
2331 as_bad (_("Incorrect number of operands"));
2332 else if (!found_same_argument_types)
2333 as_bad (_("Illegal type of operand (arg %d)"), invalid_optype);
2334 else if (!found_const_within_range)
2338 case OP_OUT_OF_RANGE:
2339 as_bad (_("Operand out of range (arg %d)"), invalid_const);
2342 as_bad (_("Operand has odd displacement (arg %d)"), invalid_const);
2345 as_bad (_("Illegal operand (arg %d)"), invalid_const);
2353 /* Full match - print the encoding to output file. */
2355 /* Make further checkings (such that couldn't be made earlier).
2356 Warn the user if necessary. */
2357 warn_if_needed (insn);
2359 /* Check whether we need to adjust the instruction pointer. */
2360 if (adjust_if_needed (insn))
2361 /* If instruction pointer was adjusted, we need to update
2362 the size of the current template operands. */
2365 for (i = 0; i < insn->nargs; i++)
2367 int j = instruction->flags & REVERSE_MATCH ?
2372 /* This time, update constant value before printing it. */
2373 if ((insn->arg[j].X_op == O_constant)
2374 && (check_range (&insn->arg[j].constant, cur_size[j],
2375 cur_flags[j], 1) != OP_LEGAL))
2376 as_fatal (_("Illegal operand (arg %d)"), j+1);
2379 /* First, copy the instruction's opcode. */
2380 output_opcode[0] = BIN (instruction->match, instruction->match_bits);
2382 for (i = 0; i < insn->nargs; i++)
2384 /* For BAL (ra),disp17 instuction only. And also set the
2385 DISP24a relocation type. */
2386 if (IS_INSN_MNEMONIC ("bal") && (instruction->size == 2) && i == 0)
2388 insn->rtype = BFD_RELOC_CR16_DISP24a;
2392 print_operand (cur_size[i], instruction->operands[i].shift,
2400 /* Print the instruction.
2401 Handle also cases where the instruction is relaxable/relocatable. */
2404 print_insn (ins *insn)
2406 unsigned int i, j, insn_size;
2408 unsigned short words[4];
2411 /* Arrange the insn encodings in a WORD size array. */
2412 for (i = 0, j = 0; i < 2; i++)
2414 words[j++] = (output_opcode[i] >> 16) & 0xFFFF;
2415 words[j++] = output_opcode[i] & 0xFFFF;
2418 /* Handle relocation. */
2419 if ((instruction->flags & RELAXABLE) && relocatable)
2422 /* Write the maximal instruction size supported. */
2423 insn_size = INSN_MAX_SIZE;
2425 if (IS_INSN_TYPE (BRANCH_INS))
2427 switch (insn->rtype)
2429 case BFD_RELOC_CR16_DISP24:
2432 case BFD_RELOC_CR16_DISP16:
2443 this_frag = frag_var (rs_machine_dependent, insn_size *2,
2445 insn->exp.X_add_symbol,
2451 insn_size = instruction->size;
2452 this_frag = frag_more (insn_size * 2);
2454 if ((relocatable) && (insn->rtype != BFD_RELOC_NONE))
2456 reloc_howto_type *reloc_howto;
2459 reloc_howto = bfd_reloc_type_lookup (stdoutput, insn->rtype);
2464 size = bfd_get_reloc_size (reloc_howto);
2466 if (size < 1 || size > 4)
2469 fix_new_exp (frag_now, this_frag - frag_now->fr_literal,
2470 size, &insn->exp, reloc_howto->pc_relative,
2475 /* Verify a 2-byte code alignment. */
2476 addr_mod = frag_now_fix () & 1;
2477 if (frag_now->has_code && frag_now->insn_addr != addr_mod)
2478 as_bad (_("instruction address is not a multiple of 2"));
2479 frag_now->insn_addr = addr_mod;
2480 frag_now->has_code = 1;
2482 /* Write the instruction encoding to frag. */
2483 for (i = 0; i < insn_size; i++)
2485 md_number_to_chars (this_frag, (valueT) words[i], 2);
2490 /* Actually assemble an instruction. */
2493 cr16_assemble (const char *op, char *param)
2497 /* Find the instruction. */
2498 instruction = (const inst *) hash_find (cr16_inst_hash, op);
2499 if (instruction == NULL)
2501 as_bad (_("Unknown opcode: `%s'"), op);
2505 /* Tie dwarf2 debug info to the address at the start of the insn. */
2506 dwarf2_emit_insn (0);
2508 /* Parse the instruction's operands. */
2509 parse_insn (&cr16_ins, param);
2511 /* Assemble the instruction - return upon failure. */
2512 if (assemble_insn (op, &cr16_ins) == 0)
2515 /* Print the instruction. */
2516 print_insn (&cr16_ins);
2519 /* This is the guts of the machine-dependent assembler. OP points to a
2520 machine dependent instruction. This function is supposed to emit
2521 the frags/bytes it assembles to. */
2524 md_assemble (char *op)
2527 char *param, param1[32];
2529 /* Reset global variables for a new instruction. */
2532 /* Strip the mnemonic. */
2533 for (param = op; *param != 0 && !ISSPACE (*param); param++)
2537 /* bCC instuctions and adjust the mnemonic by adding extra white spaces. */
2538 if (is_bcc_insn (op))
2540 strcpy (param1, get_b_cc (op));
2541 strcat (param1,",");
2542 strcat (param1, param);
2543 param = (char *) ¶m1;
2544 cr16_assemble ("b", param);
2548 /* Checking the cinv options and adjust the mnemonic by removing the
2549 extra white spaces. */
2550 if (streq ("cinv", op))
2552 /* Validate the cinv options. */
2553 check_cinv_options (param);
2557 /* MAPPING - SHIFT INSN, if imm4/imm16 positive values
2558 lsh[b/w] imm4/imm6, reg ==> ashu[b/w] imm4/imm16, reg
2559 as CR16 core doesn't support lsh[b/w] right shift operaions. */
2560 if ((streq ("lshb", op) || streq ("lshw", op) || streq ("lshd", op))
2561 && (param [0] == '$'))
2563 strcpy (param1, param);
2564 /* Find the instruction. */
2565 instruction = (const inst *) hash_find (cr16_inst_hash, op);
2566 parse_operands (&cr16_ins, param1);
2567 if (((&cr16_ins)->arg[0].type == arg_ic)
2568 && ((&cr16_ins)->arg[0].constant >= 0))
2570 if (streq ("lshb", op))
2571 cr16_assemble ("ashub", param);
2572 else if (streq ("lshd", op))
2573 cr16_assemble ("ashud", param);
2575 cr16_assemble ("ashuw", param);
2580 cr16_assemble (op, param);