1 /* tc-cr16.c -- Assembler code for the CR16 CPU core.
2 Copyright 2007, 2008, 2009, 2010, 2011
3 Free Software Foundation, Inc.
5 Contributed by M R Swami Reddy <MR.Swami.Reddy@nsc.com>
7 This file is part of GAS, the GNU Assembler.
9 GAS is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3, or (at your option)
14 GAS is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with GAS; see the file COPYING. If not, write to the
21 Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
22 MA 02110-1301, USA. */
25 #include "safe-ctype.h"
26 #include "dwarf2dbg.h"
27 #include "opcode/cr16.h"
31 /* Word is considered here as a 16-bit unsigned short int. */
34 /* Register is 2-byte size. */
37 /* Maximum size of a single instruction (in words). */
38 #define INSN_MAX_SIZE 3
40 /* Maximum bits which may be set in a `mask16' operand. */
41 #define MAX_REGS_IN_MASK16 8
43 /* Assign a number NUM, shifted by SHIFT bytes, into a location
44 pointed by index BYTE of array 'output_opcode'. */
45 #define CR16_PRINT(BYTE, NUM, SHIFT) output_opcode[BYTE] |= (NUM << SHIFT)
50 OP_LEGAL
= 0, /* Legal operand. */
51 OP_OUT_OF_RANGE
, /* Operand not within permitted range. */
52 OP_NOT_EVEN
/* Operand is Odd number, should be even. */
56 /* Opcode mnemonics hash table. */
57 static struct hash_control
*cr16_inst_hash
;
58 /* CR16 registers hash table. */
59 static struct hash_control
*reg_hash
;
60 /* CR16 register pair hash table. */
61 static struct hash_control
*regp_hash
;
62 /* CR16 processor registers hash table. */
63 static struct hash_control
*preg_hash
;
64 /* CR16 processor registers 32 bit hash table. */
65 static struct hash_control
*pregp_hash
;
66 /* Current instruction we're assembling. */
67 const inst
*instruction
;
70 static int code_label
= 0;
72 /* Global variables. */
74 /* Array to hold an instruction encoding. */
75 long output_opcode
[2];
77 /* Nonzero means a relocatable symbol. */
80 /* A copy of the original instruction (used in error messages). */
81 char ins_parse
[MAX_INST_LEN
];
83 /* The current processed argument number. */
86 /* Generic assembler global variables which must be defined by all targets. */
88 /* Characters which always start a comment. */
89 const char comment_chars
[] = "#";
91 /* Characters which start a comment at the beginning of a line. */
92 const char line_comment_chars
[] = "#";
94 /* This array holds machine specific line separator characters. */
95 const char line_separator_chars
[] = ";";
97 /* Chars that can be used to separate mant from exp in floating point nums. */
98 const char EXP_CHARS
[] = "eE";
100 /* Chars that mean this number is a floating point constant as in 0f12.456 */
101 const char FLT_CHARS
[] = "f'";
104 /* Pre-defined "_GLOBAL_OFFSET_TABLE_" */
105 symbolS
* GOT_symbol
;
108 /* Target-specific multicharacter options, not const-declared at usage. */
109 const char *md_shortopts
= "";
110 struct option md_longopts
[] =
112 {NULL
, no_argument
, NULL
, 0}
114 size_t md_longopts_size
= sizeof (md_longopts
);
122 #ifdef md_flush_pending_output
123 md_flush_pending_output ();
126 if (is_it_end_of_statement ())
128 demand_empty_rest_of_line ();
132 #ifdef TC_ADDRESS_BYTES
134 nbytes
= TC_ADDRESS_BYTES ();
138 md_cons_align (nbytes
);
144 unsigned int bits_available
= BITS_PER_CHAR
* nbytes
;
145 char *hold
= input_line_pointer
;
149 if (*input_line_pointer
== ':')
158 if (*input_line_pointer
!= ':')
160 input_line_pointer
= hold
;
163 if (exp
.X_op
== O_absent
)
165 as_warn (_("using a bit field width of zero"));
166 exp
.X_add_number
= 0;
167 exp
.X_op
= O_constant
;
170 if (exp
.X_op
!= O_constant
)
172 *input_line_pointer
= '\0';
173 as_bad (_("field width \"%s\" too complex for a bitfield"), hold
);
174 *input_line_pointer
= ':';
175 demand_empty_rest_of_line ();
179 if ((width
= exp
.X_add_number
) >
180 (unsigned int)(BITS_PER_CHAR
* nbytes
))
182 as_warn (_("field width %lu too big to fit in %d bytes: truncated to %d bits"), width
, nbytes
, (BITS_PER_CHAR
* nbytes
));
183 width
= BITS_PER_CHAR
* nbytes
;
187 if (width
> bits_available
)
189 /* FIXME-SOMEDAY: backing up and reparsing is wasteful. */
190 input_line_pointer
= hold
;
191 exp
.X_add_number
= value
;
196 hold
= ++input_line_pointer
;
199 if (exp
.X_op
!= O_constant
)
201 char cache
= *input_line_pointer
;
203 *input_line_pointer
= '\0';
204 as_bad (_("field value \"%s\" too complex for a bitfield"), hold
);
205 *input_line_pointer
= cache
;
206 demand_empty_rest_of_line ();
210 value
|= ((~(-1 << width
) & exp
.X_add_number
)
211 << ((BITS_PER_CHAR
* nbytes
) - bits_available
));
213 if ((bits_available
-= width
) == 0
214 || is_it_end_of_statement ()
215 || *input_line_pointer
!= ',')
218 hold
= ++input_line_pointer
;
222 exp
.X_add_number
= value
;
223 exp
.X_op
= O_constant
;
227 if ((*(input_line_pointer
) == '@') && (*(input_line_pointer
+1) == 'c'))
229 emit_expr (&exp
, (unsigned int) nbytes
);
231 if ((*(input_line_pointer
) == '@') && (*(input_line_pointer
+1) == 'c'))
233 input_line_pointer
+=3;
237 while ((*input_line_pointer
++ == ','));
239 /* Put terminator back into stream. */
240 input_line_pointer
--;
242 demand_empty_rest_of_line ();
245 /* This table describes all the machine specific pseudo-ops
246 the assembler has to support. The fields are:
247 *** Pseudo-op name without dot.
248 *** Function to call to execute this pseudo-op.
249 *** Integer arg to pass to the function. */
251 const pseudo_typeS md_pseudo_table
[] =
253 /* In CR16 machine, align is in bytes (not a ptwo boundary). */
254 {"align", s_align_bytes
, 0},
255 {"long", l_cons
, 4 },
256 {"4byte", l_cons
, 4 },
260 /* CR16 relaxation table. */
261 const relax_typeS md_relax_table
[] =
264 {0x7f, -0x80, 2, 1}, /* 8 */
265 {0xfffe, -0x10000, 4, 2}, /* 16 */
266 {0xfffffe, -0x1000000, 6, 0}, /* 24 */
269 /* Return the bit size for a given operand. */
272 get_opbits (operand_type op
)
275 return cr16_optab
[op
].bit_size
;
280 /* Return the argument type of a given operand. */
283 get_optype (operand_type op
)
286 return cr16_optab
[op
].arg_type
;
291 /* Return the flags of a given operand. */
294 get_opflags (operand_type op
)
297 return cr16_optab
[op
].flags
;
302 /* Get the cc code. */
305 get_cc (char *cc_name
)
309 for (i
= 0; i
< cr16_num_cc
; i
++)
310 if (strcmp (cc_name
, cr16_b_cond_tab
[i
]) == 0)
316 /* Get the core processor register 'reg_name'. */
319 get_register (char *reg_name
)
321 const reg_entry
*rreg
;
323 rreg
= (const reg_entry
*) hash_find (reg_hash
, reg_name
);
326 return rreg
->value
.reg_val
;
330 /* Get the core processor register-pair 'reg_name'. */
333 get_register_pair (char *reg_name
)
335 const reg_entry
*rreg
;
336 char tmp_rp
[16]="\0";
338 /* Add '(' and ')' to the reg pair, if its not present. */
339 if (reg_name
[0] != '(')
342 strcat (tmp_rp
, reg_name
);
344 rreg
= (const reg_entry
*) hash_find (regp_hash
, tmp_rp
);
347 rreg
= (const reg_entry
*) hash_find (regp_hash
, reg_name
);
350 return rreg
->value
.reg_val
;
355 /* Get the index register 'reg_name'. */
358 get_index_register (char *reg_name
)
360 const reg_entry
*rreg
;
362 rreg
= (const reg_entry
*) hash_find (reg_hash
, reg_name
);
365 && ((rreg
->value
.reg_val
== 12) || (rreg
->value
.reg_val
== 13)))
366 return rreg
->value
.reg_val
;
370 /* Get the core processor index register-pair 'reg_name'. */
373 get_index_register_pair (char *reg_name
)
375 const reg_entry
*rreg
;
377 rreg
= (const reg_entry
*) hash_find (regp_hash
, reg_name
);
381 if ((rreg
->value
.reg_val
!= 1) || (rreg
->value
.reg_val
!= 7)
382 || (rreg
->value
.reg_val
!= 9) || (rreg
->value
.reg_val
> 10))
383 return rreg
->value
.reg_val
;
385 as_bad (_("Unknown register pair - index relative mode: `%d'"), rreg
->value
.reg_val
);
391 /* Get the processor register 'preg_name'. */
394 get_pregister (char *preg_name
)
396 const reg_entry
*prreg
;
398 prreg
= (const reg_entry
*) hash_find (preg_hash
, preg_name
);
401 return prreg
->value
.preg_val
;
403 return nullpregister
;
406 /* Get the processor register 'preg_name 32 bit'. */
409 get_pregisterp (char *preg_name
)
411 const reg_entry
*prreg
;
413 prreg
= (const reg_entry
*) hash_find (pregp_hash
, preg_name
);
416 return prreg
->value
.preg_val
;
418 return nullpregister
;
422 /* Round up a section size to the appropriate boundary. */
425 md_section_align (segT seg
, valueT val
)
427 /* Round .text section to a multiple of 2. */
428 if (seg
== text_section
)
429 return (val
+ 1) & ~1;
433 /* Parse an operand that is machine-specific (remove '*'). */
436 md_operand (expressionS
* exp
)
438 char c
= *input_line_pointer
;
443 input_line_pointer
++;
451 /* Reset global variables before parsing a new instruction. */
454 reset_vars (char *op
)
456 cur_arg_num
= relocatable
= 0;
457 memset (& output_opcode
, '\0', sizeof (output_opcode
));
459 /* Save a copy of the original OP (used in error messages). */
460 strncpy (ins_parse
, op
, sizeof ins_parse
- 1);
461 ins_parse
[sizeof ins_parse
- 1] = 0;
464 /* This macro decides whether a particular reloc is an entry in a
465 switch table. It is used when relaxing, because the linker needs
466 to know about all such entries so that it can adjust them if
469 #define SWITCH_TABLE(fix) \
470 ( (fix)->fx_addsy != NULL \
471 && (fix)->fx_subsy != NULL \
472 && S_GET_SEGMENT ((fix)->fx_addsy) == \
473 S_GET_SEGMENT ((fix)->fx_subsy) \
474 && S_GET_SEGMENT (fix->fx_addsy) != undefined_section \
475 && ( (fix)->fx_r_type == BFD_RELOC_CR16_NUM8 \
476 || (fix)->fx_r_type == BFD_RELOC_CR16_NUM16 \
477 || (fix)->fx_r_type == BFD_RELOC_CR16_NUM32 \
478 || (fix)->fx_r_type == BFD_RELOC_CR16_NUM32a))
480 /* See whether we need to force a relocation into the output file.
481 This is used to force out switch and PC relative relocations when
485 cr16_force_relocation (fixS
*fix
)
487 if (generic_force_reloc (fix
) || SWITCH_TABLE (fix
))
493 /* Record a fixup for a cons expression. */
496 cr16_cons_fix_new (fragS
*frag
, int offset
, int len
, expressionS
*exp
)
498 int rtype
= BFD_RELOC_UNUSED
;
502 default: rtype
= BFD_RELOC_NONE
; break;
503 case 1: rtype
= BFD_RELOC_CR16_NUM8
; break;
504 case 2: rtype
= BFD_RELOC_CR16_NUM16
; break;
508 rtype
= BFD_RELOC_CR16_NUM32a
;
512 rtype
= BFD_RELOC_CR16_NUM32
;
516 fix_new_exp (frag
, offset
, len
, exp
, 0, rtype
);
519 /* Generate a relocation entry for a fixup. */
522 tc_gen_reloc (asection
*section ATTRIBUTE_UNUSED
, fixS
* fixP
)
526 /* If symbols are local and resolved, then no relocation needed. */
527 if ( ((fixP
->fx_addsy
)
528 && (S_GET_SEGMENT (fixP
->fx_addsy
) == absolute_section
))
530 && (S_GET_SEGMENT (fixP
->fx_subsy
) == absolute_section
)))
533 reloc
= xmalloc (sizeof (arelent
));
534 reloc
->sym_ptr_ptr
= xmalloc (sizeof (asymbol
*));
535 *reloc
->sym_ptr_ptr
= symbol_get_bfdsym (fixP
->fx_addsy
);
536 reloc
->address
= fixP
->fx_frag
->fr_address
+ fixP
->fx_where
;
537 reloc
->addend
= fixP
->fx_offset
;
539 if (fixP
->fx_subsy
!= NULL
)
541 if (SWITCH_TABLE (fixP
))
543 /* Keep the current difference in the addend. */
544 reloc
->addend
= (S_GET_VALUE (fixP
->fx_addsy
)
545 - S_GET_VALUE (fixP
->fx_subsy
) + fixP
->fx_offset
);
547 switch (fixP
->fx_r_type
)
549 case BFD_RELOC_CR16_NUM8
:
550 fixP
->fx_r_type
= BFD_RELOC_CR16_SWITCH8
;
552 case BFD_RELOC_CR16_NUM16
:
553 fixP
->fx_r_type
= BFD_RELOC_CR16_SWITCH16
;
555 case BFD_RELOC_CR16_NUM32
:
556 fixP
->fx_r_type
= BFD_RELOC_CR16_SWITCH32
;
558 case BFD_RELOC_CR16_NUM32a
:
559 fixP
->fx_r_type
= BFD_RELOC_CR16_NUM32a
;
568 /* We only resolve difference expressions in the same section. */
569 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
570 _("can't resolve `%s' {%s section} - `%s' {%s section}"),
571 fixP
->fx_addsy
? S_GET_NAME (fixP
->fx_addsy
) : "0",
572 segment_name (fixP
->fx_addsy
573 ? S_GET_SEGMENT (fixP
->fx_addsy
)
575 S_GET_NAME (fixP
->fx_subsy
),
576 segment_name (S_GET_SEGMENT (fixP
->fx_addsy
)));
580 if ((fixP
->fx_r_type
== BFD_RELOC_CR16_GOT_REGREL20
)
582 && fixP
->fx_addsy
== GOT_symbol
)
584 reloc
->addend
= fixP
->fx_offset
= reloc
->address
;
586 else if ((fixP
->fx_r_type
== BFD_RELOC_CR16_GOTC_REGREL20
)
588 && fixP
->fx_addsy
== GOT_symbol
)
590 reloc
->addend
= fixP
->fx_offset
= reloc
->address
;
594 gas_assert ((int) fixP
->fx_r_type
> 0);
595 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, fixP
->fx_r_type
);
597 if (reloc
->howto
== NULL
)
599 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
600 _("internal error: reloc %d (`%s') not supported by object file format"),
602 bfd_get_reloc_code_name (fixP
->fx_r_type
));
605 gas_assert (!fixP
->fx_pcrel
== !reloc
->howto
->pc_relative
);
610 /* Prepare machine-dependent frags for relaxation. */
613 md_estimate_size_before_relax (fragS
*fragp
, asection
*seg
)
615 /* If symbol is undefined or located in a different section,
616 select the largest supported relocation. */
617 relax_substateT subtype
;
618 relax_substateT rlx_state
[] = {0, 2};
620 for (subtype
= 0; subtype
< ARRAY_SIZE (rlx_state
); subtype
+= 2)
622 if (fragp
->fr_subtype
== rlx_state
[subtype
]
623 && (!S_IS_DEFINED (fragp
->fr_symbol
)
624 || seg
!= S_GET_SEGMENT (fragp
->fr_symbol
)))
626 fragp
->fr_subtype
= rlx_state
[subtype
+ 1];
631 if (fragp
->fr_subtype
>= ARRAY_SIZE (md_relax_table
))
634 return md_relax_table
[fragp
->fr_subtype
].rlx_length
;
638 md_convert_frag (bfd
*abfd ATTRIBUTE_UNUSED
, asection
*sec
, fragS
*fragP
)
640 /* 'opcode' points to the start of the instruction, whether
641 we need to change the instruction's fixed encoding. */
642 char *opcode
= fragP
->fr_literal
+ fragP
->fr_fix
;
643 bfd_reloc_code_real_type reloc
;
645 subseg_change (sec
, 0);
647 switch (fragP
->fr_subtype
)
650 reloc
= BFD_RELOC_CR16_DISP8
;
653 /* If the subtype is not changed due to :m operand qualifier,
654 then no need to update the opcode value. */
655 if ((int)opcode
[1] != 0x18)
657 opcode
[0] = (opcode
[0] & 0xf0);
660 reloc
= BFD_RELOC_CR16_DISP16
;
663 /* If the subtype is not changed due to :l operand qualifier,
664 then no need to update the opcode value. */
665 if ((int)opcode
[1] != 0)
667 opcode
[2] = opcode
[0];
668 opcode
[0] = opcode
[1];
671 reloc
= BFD_RELOC_CR16_DISP24
;
677 fix_new (fragP
, fragP
->fr_fix
,
678 bfd_get_reloc_size (bfd_reloc_type_lookup (stdoutput
, reloc
)),
679 fragP
->fr_symbol
, fragP
->fr_offset
, 1, reloc
);
681 fragP
->fr_fix
+= md_relax_table
[fragP
->fr_subtype
].rlx_length
;
685 md_undefined_symbol (char *name
)
687 if (*name
== '_' && *(name
+ 1) == 'G'
688 && strcmp (name
, "_GLOBAL_OFFSET_TABLE_") == 0)
692 if (symbol_find (name
))
693 as_bad (_("GOT already in symbol table"));
694 GOT_symbol
= symbol_new (name
, undefined_section
,
695 (valueT
) 0, &zero_address_frag
);
702 /* Process machine-dependent command line options. Called once for
703 each option on the command line that the machine-independent part of
704 GAS does not understand. */
707 md_parse_option (int c ATTRIBUTE_UNUSED
, char *arg ATTRIBUTE_UNUSED
)
712 /* Machine-dependent usage-output. */
715 md_show_usage (FILE *stream ATTRIBUTE_UNUSED
)
721 md_atof (int type
, char *litP
, int *sizeP
)
723 return ieee_md_atof (type
, litP
, sizeP
, target_big_endian
);
726 /* Apply a fixS (fixup of an instruction or data that we didn't have
727 enough info to complete immediately) to the data in a frag.
728 Since linkrelax is nonzero and TC_LINKRELAX_FIXUP is defined to disable
729 relaxation of debug sections, this function is called only when
730 fixuping relocations of debug sections. */
733 md_apply_fix (fixS
*fixP
, valueT
*valP
, segT seg
)
737 if (fixP
->fx_addsy
== NULL
738 && fixP
->fx_pcrel
== 0)
740 else if (fixP
->fx_pcrel
== 1
741 && fixP
->fx_addsy
!= NULL
742 && S_GET_SEGMENT (fixP
->fx_addsy
) == seg
)
747 if (fixP
->fx_addsy
!= NULL
&& !fixP
->fx_pcrel
)
749 val
= fixP
->fx_offset
;
755 char *buf
= fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
;
759 switch (fixP
->fx_r_type
)
761 case BFD_RELOC_CR16_NUM8
:
762 bfd_put_8 (stdoutput
, (unsigned char) val
, buf
);
764 case BFD_RELOC_CR16_NUM16
:
765 bfd_put_16 (stdoutput
, val
, buf
);
767 case BFD_RELOC_CR16_NUM32
:
768 bfd_put_32 (stdoutput
, val
, buf
);
770 case BFD_RELOC_CR16_NUM32a
:
771 bfd_put_32 (stdoutput
, val
, buf
);
774 /* We shouldn't ever get here because linkrelax is nonzero. */
781 fixP
->fx_offset
= * valP
;
784 /* The location from which a PC relative jump should be calculated,
785 given a PC relative reloc. */
788 md_pcrel_from (fixS
*fixp
)
790 return fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
794 initialise_reg_hash_table (struct hash_control
** hash_table
,
795 const reg_entry
* register_table
,
796 const unsigned int num_entries
)
798 const reg_entry
* rreg
;
801 if ((* hash_table
= hash_new ()) == NULL
)
802 as_fatal (_("Virtual memory exhausted"));
804 for (rreg
= register_table
;
805 rreg
< (register_table
+ num_entries
);
808 hashret
= hash_insert (* hash_table
, rreg
->name
, (char *) rreg
);
810 as_fatal (_("Internal Error: Can't hash %s: %s"),
811 rreg
->name
, hashret
);
815 /* This function is called once, at assembler startup time. This should
816 set up all the tables, etc that the MD part of the assembler needs. */
823 /* Set up a hash table for the instructions. */
824 if ((cr16_inst_hash
= hash_new ()) == NULL
)
825 as_fatal (_("Virtual memory exhausted"));
827 while (cr16_instruction
[i
].mnemonic
!= NULL
)
830 const char *mnemonic
= cr16_instruction
[i
].mnemonic
;
832 hashret
= hash_insert (cr16_inst_hash
, mnemonic
,
833 (char *)(cr16_instruction
+ i
));
835 if (hashret
!= NULL
&& *hashret
!= '\0')
836 as_fatal (_("Can't hash `%s': %s\n"), cr16_instruction
[i
].mnemonic
,
837 *hashret
== 0 ? _("(unknown reason)") : hashret
);
839 /* Insert unique names into hash table. The CR16 instruction set
840 has many identical opcode names that have different opcodes based
841 on the operands. This hash table then provides a quick index to
842 the first opcode with a particular name in the opcode table. */
847 while (cr16_instruction
[i
].mnemonic
!= NULL
848 && streq (cr16_instruction
[i
].mnemonic
, mnemonic
));
851 /* Initialize reg_hash hash table. */
852 initialise_reg_hash_table (& reg_hash
, cr16_regtab
, NUMREGS
);
853 /* Initialize regp_hash hash table. */
854 initialise_reg_hash_table (& regp_hash
, cr16_regptab
, NUMREGPS
);
855 /* Initialize preg_hash hash table. */
856 initialise_reg_hash_table (& preg_hash
, cr16_pregtab
, NUMPREGS
);
857 /* Initialize pregp_hash hash table. */
858 initialise_reg_hash_table (& pregp_hash
, cr16_pregptab
, NUMPREGPS
);
860 /* Set linkrelax here to avoid fixups in most sections. */
864 /* Process constants (immediate/absolute)
865 and labels (jump targets/Memory locations). */
868 process_label_constant (char *str
, ins
* cr16_ins
)
870 char *saved_input_line_pointer
;
871 int symbol_with_at
= 0;
872 int symbol_with_s
= 0;
873 int symbol_with_m
= 0;
874 int symbol_with_l
= 0;
875 int symbol_with_at_got
= 0;
876 int symbol_with_at_gotc
= 0;
877 argument
*cur_arg
= cr16_ins
->arg
+ cur_arg_num
; /* Current argument. */
879 saved_input_line_pointer
= input_line_pointer
;
880 input_line_pointer
= str
;
882 expression (&cr16_ins
->exp
);
884 switch (cr16_ins
->exp
.X_op
)
888 /* Missing or bad expr becomes absolute 0. */
889 as_bad (_("missing or invalid displacement expression `%s' taken as 0"),
891 cr16_ins
->exp
.X_op
= O_constant
;
892 cr16_ins
->exp
.X_add_number
= 0;
893 cr16_ins
->exp
.X_add_symbol
= NULL
;
894 cr16_ins
->exp
.X_op_symbol
= NULL
;
898 cur_arg
->X_op
= O_constant
;
899 cur_arg
->constant
= cr16_ins
->exp
.X_add_number
;
905 cur_arg
->X_op
= O_symbol
;
906 cur_arg
->constant
= cr16_ins
->exp
.X_add_number
;
907 cr16_ins
->exp
.X_add_number
= 0;
908 cr16_ins
->rtype
= BFD_RELOC_NONE
;
911 if (strneq (input_line_pointer
, "@c", 2))
914 if (strneq (input_line_pointer
, "@l", 2)
915 || strneq (input_line_pointer
, ":l", 2))
918 if (strneq (input_line_pointer
, "@m", 2)
919 || strneq (input_line_pointer
, ":m", 2))
922 if (strneq (input_line_pointer
, "@s", 2)
923 || strneq (input_line_pointer
, ":s", 2))
926 if (strneq (input_line_pointer
, "@cGOT", 5)
927 || strneq (input_line_pointer
, "@cgot", 5))
929 if (GOT_symbol
== NULL
)
930 GOT_symbol
= symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME
);
932 symbol_with_at_gotc
= 1;
934 else if (strneq (input_line_pointer
, "@GOT", 4)
935 || strneq (input_line_pointer
, "@got", 4))
937 if ((strneq (input_line_pointer
, "+", 1))
938 || (strneq (input_line_pointer
, "-", 1)))
939 as_warn (_("GOT bad expression with %s."), input_line_pointer
);
941 if (GOT_symbol
== NULL
)
942 GOT_symbol
= symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME
);
944 symbol_with_at_got
= 1;
947 switch (cur_arg
->type
)
950 if (IS_INSN_TYPE (LD_STOR_INS
) || IS_INSN_TYPE (CSTBIT_INS
))
952 if (symbol_with_at_got
)
953 cr16_ins
->rtype
= BFD_RELOC_CR16_GOT_REGREL20
;
954 else if (symbol_with_at_gotc
)
955 cr16_ins
->rtype
= BFD_RELOC_CR16_GOTC_REGREL20
;
956 else if (cur_arg
->size
== 20)
957 cr16_ins
->rtype
= BFD_RELOC_CR16_REGREL20
;
959 cr16_ins
->rtype
= BFD_RELOC_CR16_REGREL20a
;
964 if (IS_INSN_TYPE (LD_STOR_INS
) || IS_INSN_TYPE (CSTBIT_INS
))
966 if (symbol_with_at_got
)
967 cr16_ins
->rtype
= BFD_RELOC_CR16_GOT_REGREL20
;
968 else if (symbol_with_at_gotc
)
969 cr16_ins
->rtype
= BFD_RELOC_CR16_GOTC_REGREL20
;
971 switch (instruction
->size
)
974 switch (cur_arg
->size
)
977 cr16_ins
->rtype
= BFD_RELOC_CR16_REGREL0
;
980 if (IS_INSN_MNEMONIC ("loadb") || IS_INSN_MNEMONIC ("storb"))
981 cr16_ins
->rtype
= BFD_RELOC_CR16_REGREL4
;
983 cr16_ins
->rtype
= BFD_RELOC_CR16_REGREL4a
;
989 cr16_ins
->rtype
= BFD_RELOC_CR16_REGREL16
;
992 if (cur_arg
->size
== 20)
993 cr16_ins
->rtype
= BFD_RELOC_CR16_REGREL20
;
995 cr16_ins
->rtype
= BFD_RELOC_CR16_REGREL20a
;
1004 if (IS_INSN_TYPE (LD_STOR_INS
) || IS_INSN_TYPE (CSTBIT_INS
))
1006 if (symbol_with_at_got
)
1007 cr16_ins
->rtype
= BFD_RELOC_CR16_GOT_REGREL20
;
1008 else if (symbol_with_at_gotc
)
1009 cr16_ins
->rtype
= BFD_RELOC_CR16_GOTC_REGREL20
;
1011 cr16_ins
->rtype
= BFD_RELOC_CR16_REGREL20
;
1016 if (IS_INSN_TYPE (LD_STOR_INS
) || IS_INSN_TYPE (CSTBIT_INS
))
1018 if (symbol_with_at_got
)
1019 cr16_ins
->rtype
= BFD_RELOC_CR16_GOT_REGREL20
;
1020 else if (symbol_with_at_gotc
)
1021 cr16_ins
->rtype
= BFD_RELOC_CR16_GOTC_REGREL20
;
1023 switch (instruction
->size
)
1025 case 1: cr16_ins
->rtype
= BFD_RELOC_CR16_REGREL0
; break;
1026 case 2: cr16_ins
->rtype
= BFD_RELOC_CR16_REGREL14
; break;
1027 case 3: cr16_ins
->rtype
= BFD_RELOC_CR16_REGREL20
; break;
1035 if (IS_INSN_MNEMONIC ("bal"))
1036 cr16_ins
->rtype
= BFD_RELOC_CR16_DISP24
;
1037 else if (IS_INSN_TYPE (BRANCH_INS
))
1040 cr16_ins
->rtype
= BFD_RELOC_CR16_DISP24
;
1041 else if (symbol_with_m
)
1042 cr16_ins
->rtype
= BFD_RELOC_CR16_DISP16
;
1044 cr16_ins
->rtype
= BFD_RELOC_CR16_DISP8
;
1046 else if (IS_INSN_TYPE (STOR_IMM_INS
) || IS_INSN_TYPE (LD_STOR_INS
)
1047 || IS_INSN_TYPE (CSTBIT_INS
))
1050 as_bad (_("operand %d: illegal use expression: `%s`"), cur_arg_num
+ 1, str
);
1051 if (symbol_with_at_got
)
1052 cr16_ins
->rtype
= BFD_RELOC_CR16_GOT_REGREL20
;
1053 else if (symbol_with_at_gotc
)
1054 cr16_ins
->rtype
= BFD_RELOC_CR16_GOTC_REGREL20
;
1055 else if (symbol_with_m
)
1056 cr16_ins
->rtype
= BFD_RELOC_CR16_ABS20
;
1057 else /* Default to (symbol_with_l) */
1058 cr16_ins
->rtype
= BFD_RELOC_CR16_ABS24
;
1060 else if (IS_INSN_TYPE (BRANCH_NEQ_INS
))
1061 cr16_ins
->rtype
= BFD_RELOC_CR16_DISP4
;
1065 if (IS_INSN_TYPE (ARITH_INS
))
1067 if (symbol_with_at_got
)
1068 cr16_ins
->rtype
= BFD_RELOC_CR16_GOT_REGREL20
;
1069 else if (symbol_with_at_gotc
)
1070 cr16_ins
->rtype
= BFD_RELOC_CR16_GOTC_REGREL20
;
1071 else if (symbol_with_s
)
1072 cr16_ins
->rtype
= BFD_RELOC_CR16_IMM4
;
1073 else if (symbol_with_m
)
1074 cr16_ins
->rtype
= BFD_RELOC_CR16_IMM20
;
1075 else if (symbol_with_at
)
1076 cr16_ins
->rtype
= BFD_RELOC_CR16_IMM32a
;
1077 else /* Default to (symbol_with_l) */
1078 cr16_ins
->rtype
= BFD_RELOC_CR16_IMM32
;
1080 else if (IS_INSN_TYPE (ARITH_BYTE_INS
))
1082 cr16_ins
->rtype
= BFD_RELOC_CR16_IMM16
;
1091 cur_arg
->X_op
= cr16_ins
->exp
.X_op
;
1095 input_line_pointer
= saved_input_line_pointer
;
1099 /* Retrieve the opcode image of a given register.
1100 If the register is illegal for the current instruction,
1104 getreg_image (reg r
)
1106 const reg_entry
*rreg
;
1108 int is_procreg
= 0; /* Nonzero means argument should be processor reg. */
1110 /* Check whether the register is in registers table. */
1112 rreg
= cr16_regtab
+ r
;
1113 else /* Register not found. */
1115 as_bad (_("Unknown register: `%d'"), r
);
1119 reg_name
= rreg
->name
;
1121 /* Issue a error message when register is illegal. */
1123 as_bad (_("Illegal register (`%s') in Instruction: `%s'"), \
1124 reg_name, ins_parse); \
1129 case CR16_R_REGTYPE
:
1135 case CR16_P_REGTYPE
:
1146 /* Parsing different types of operands
1147 -> constants Immediate/Absolute/Relative numbers
1148 -> Labels Relocatable symbols
1149 -> (reg pair base) Register pair base
1150 -> (rbase) Register base
1151 -> disp(rbase) Register relative
1152 -> [rinx]disp(reg pair) Register index with reg pair mode
1153 -> disp(rbase,ridx,scl) Register index mode. */
1156 set_operand (char *operand
, ins
* cr16_ins
)
1158 char *operandS
; /* Pointer to start of sub-opearand. */
1159 char *operandE
; /* Pointer to end of sub-opearand. */
1161 argument
*cur_arg
= &cr16_ins
->arg
[cur_arg_num
]; /* Current argument. */
1163 /* Initialize pointers. */
1164 operandS
= operandE
= operand
;
1166 switch (cur_arg
->type
)
1168 case arg_ic
: /* Case $0x18. */
1170 case arg_c
: /* Case 0x18. */
1172 process_label_constant (operandS
, cr16_ins
);
1174 if (cur_arg
->type
!= arg_ic
)
1175 cur_arg
->type
= arg_c
;
1178 case arg_icr
: /* Case $0x18(r1). */
1180 case arg_cr
: /* Case 0x18(r1). */
1181 /* Set displacement constant. */
1182 while (*operandE
!= '(')
1185 process_label_constant (operandS
, cr16_ins
);
1186 operandS
= operandE
;
1187 case arg_rbase
: /* Case (r1) or (r1,r0). */
1189 /* Set register base. */
1190 while (*operandE
!= ')')
1193 if ((cur_arg
->r
= get_register (operandS
)) == nullregister
)
1194 as_bad (_("Illegal register `%s' in Instruction `%s'"),
1195 operandS
, ins_parse
);
1197 /* set the arg->rp, if reg is "r12" or "r13" or "14" or "15" */
1198 if ((cur_arg
->type
!= arg_rbase
)
1199 && ((getreg_image (cur_arg
->r
) == 12)
1200 || (getreg_image (cur_arg
->r
) == 13)
1201 || (getreg_image (cur_arg
->r
) == 14)
1202 || (getreg_image (cur_arg
->r
) == 15)))
1204 cur_arg
->type
= arg_crp
;
1205 cur_arg
->rp
= cur_arg
->r
;
1209 case arg_crp
: /* Case 0x18(r1,r0). */
1210 /* Set displacement constant. */
1211 while (*operandE
!= '(')
1214 process_label_constant (operandS
, cr16_ins
);
1215 operandS
= operandE
;
1217 /* Set register pair base. */
1218 while (*operandE
!= ')')
1221 if ((cur_arg
->rp
= get_register_pair (operandS
)) == nullregister
)
1222 as_bad (_("Illegal register pair `%s' in Instruction `%s'"),
1223 operandS
, ins_parse
);
1227 /* Set register pair base. */
1228 if ((strchr (operandS
,'(') != NULL
))
1230 while ((*operandE
!= '(') && (! ISSPACE (*operandE
)))
1232 if ((cur_arg
->rp
= get_index_register_pair (operandE
)) == nullregister
)
1233 as_bad (_("Illegal register pair `%s' in Instruction `%s'"),
1234 operandS
, ins_parse
);
1236 cur_arg
->type
= arg_idxrp
;
1241 operandE
= operandS
;
1242 /* Set displacement constant. */
1243 while (*operandE
!= ']')
1245 process_label_constant (++operandE
, cr16_ins
);
1247 operandE
= operandS
;
1249 /* Set index register . */
1250 operandS
= strchr (operandE
,'[');
1251 if (operandS
!= NULL
)
1252 { /* Eliminate '[', detach from rest of operand. */
1255 operandE
= strchr (operandS
, ']');
1257 if (operandE
== NULL
)
1258 as_bad (_("unmatched '['"));
1260 { /* Eliminate ']' and make sure it was the last thing
1263 if (*(operandE
+ 1) != '\0')
1264 as_bad (_("garbage after index spec ignored"));
1268 if ((cur_arg
->i_r
= get_index_register (operandS
)) == nullregister
)
1269 as_bad (_("Illegal register `%s' in Instruction `%s'"),
1270 operandS
, ins_parse
);
1280 /* Parse a single operand.
1281 operand - Current operand to parse.
1282 cr16_ins - Current assembled instruction. */
1285 parse_operand (char *operand
, ins
* cr16_ins
)
1288 argument
*cur_arg
= cr16_ins
->arg
+ cur_arg_num
; /* Current argument. */
1290 /* Initialize the type to NULL before parsing. */
1291 cur_arg
->type
= nullargs
;
1293 /* Check whether this is a condition code . */
1294 if ((IS_INSN_MNEMONIC ("b")) && ((ret_val
= get_cc (operand
)) != -1))
1296 cur_arg
->type
= arg_cc
;
1297 cur_arg
->cc
= ret_val
;
1298 cur_arg
->X_op
= O_register
;
1302 /* Check whether this is a general processor register. */
1303 if ((ret_val
= get_register (operand
)) != nullregister
)
1305 cur_arg
->type
= arg_r
;
1306 cur_arg
->r
= ret_val
;
1311 /* Check whether this is a general processor register pair. */
1312 if ((operand
[0] == '(')
1313 && ((ret_val
= get_register_pair (operand
)) != nullregister
))
1315 cur_arg
->type
= arg_rp
;
1316 cur_arg
->rp
= ret_val
;
1317 cur_arg
->X_op
= O_register
;
1321 /* Check whether the operand is a processor register.
1322 For "lprd" and "sprd" instruction, only 32 bit
1323 processor registers used. */
1324 if (!(IS_INSN_MNEMONIC ("lprd") || (IS_INSN_MNEMONIC ("sprd")))
1325 && ((ret_val
= get_pregister (operand
)) != nullpregister
))
1327 cur_arg
->type
= arg_pr
;
1328 cur_arg
->pr
= ret_val
;
1329 cur_arg
->X_op
= O_register
;
1333 /* Check whether this is a processor register - 32 bit. */
1334 if ((ret_val
= get_pregisterp (operand
)) != nullpregister
)
1336 cur_arg
->type
= arg_prp
;
1337 cur_arg
->prp
= ret_val
;
1338 cur_arg
->X_op
= O_register
;
1342 /* Deal with special characters. */
1346 if (strchr (operand
, '(') != NULL
)
1347 cur_arg
->type
= arg_icr
;
1349 cur_arg
->type
= arg_ic
;
1354 cur_arg
->type
= arg_rbase
;
1359 cur_arg
->type
= arg_idxr
;
1367 if (strchr (operand
, '(') != NULL
)
1369 if (strchr (operand
, ',') != NULL
1370 && (strchr (operand
, ',') > strchr (operand
, '(')))
1371 cur_arg
->type
= arg_crp
;
1373 cur_arg
->type
= arg_cr
;
1376 cur_arg
->type
= arg_c
;
1378 /* Parse an operand according to its type. */
1380 cur_arg
->constant
= 0;
1381 set_operand (operand
, cr16_ins
);
1384 /* Parse the various operands. Each operand is then analyzed to fillup
1385 the fields in the cr16_ins data structure. */
1388 parse_operands (ins
* cr16_ins
, char *operands
)
1390 char *operandS
; /* Operands string. */
1391 char *operandH
, *operandT
; /* Single operand head/tail pointers. */
1392 int allocated
= 0; /* Indicates a new operands string was allocated.*/
1393 char *operand
[MAX_OPERANDS
];/* Separating the operands. */
1394 int op_num
= 0; /* Current operand number we are parsing. */
1395 int bracket_flag
= 0; /* Indicates a bracket '(' was found. */
1396 int sq_bracket_flag
= 0; /* Indicates a square bracket '[' was found. */
1398 /* Preprocess the list of registers, if necessary. */
1399 operandS
= operandH
= operandT
= operands
;
1401 while (*operandT
!= '\0')
1403 if (*operandT
== ',' && bracket_flag
!= 1 && sq_bracket_flag
!= 1)
1406 operand
[op_num
++] = strdup (operandH
);
1407 operandH
= operandT
;
1411 if (*operandT
== ' ')
1412 as_bad (_("Illegal operands (whitespace): `%s'"), ins_parse
);
1414 if (*operandT
== '(')
1416 else if (*operandT
== '[')
1417 sq_bracket_flag
= 1;
1419 if (*operandT
== ')')
1424 as_fatal (_("Missing matching brackets : `%s'"), ins_parse
);
1426 else if (*operandT
== ']')
1428 if (sq_bracket_flag
)
1429 sq_bracket_flag
= 0;
1431 as_fatal (_("Missing matching brackets : `%s'"), ins_parse
);
1434 if (bracket_flag
== 1 && *operandT
== ')')
1436 else if (sq_bracket_flag
== 1 && *operandT
== ']')
1437 sq_bracket_flag
= 0;
1442 /* Adding the last operand. */
1443 operand
[op_num
++] = strdup (operandH
);
1444 cr16_ins
->nargs
= op_num
;
1446 /* Verifying correct syntax of operands (all brackets should be closed). */
1447 if (bracket_flag
|| sq_bracket_flag
)
1448 as_fatal (_("Missing matching brackets : `%s'"), ins_parse
);
1450 /* Now we parse each operand separately. */
1451 for (op_num
= 0; op_num
< cr16_ins
->nargs
; op_num
++)
1453 cur_arg_num
= op_num
;
1454 parse_operand (operand
[op_num
], cr16_ins
);
1455 free (operand
[op_num
]);
1462 /* Get the trap index in dispatch table, given its name.
1463 This routine is used by assembling the 'excp' instruction. */
1468 const trap_entry
*trap
;
1470 for (trap
= cr16_traps
; trap
< (cr16_traps
+ NUMTRAPS
); trap
++)
1471 if (strcasecmp (trap
->name
, s
) == 0)
1474 /* To make compatable with CR16 4.1 tools, the below 3-lines of
1475 * code added. Refer: Development Tracker item #123 */
1476 for (trap
= cr16_traps
; trap
< (cr16_traps
+ NUMTRAPS
); trap
++)
1477 if (trap
->entry
== (unsigned int) atoi (s
))
1480 as_bad (_("Unknown exception: `%s'"), s
);
1484 /* Top level module where instruction parsing starts.
1485 cr16_ins - data structure holds some information.
1486 operands - holds the operands part of the whole instruction. */
1489 parse_insn (ins
*insn
, char *operands
)
1493 /* Handle instructions with no operands. */
1494 for (i
= 0; cr16_no_op_insn
[i
] != NULL
; i
++)
1496 if (streq (cr16_no_op_insn
[i
], instruction
->mnemonic
))
1503 /* Handle 'excp' instructions. */
1504 if (IS_INSN_MNEMONIC ("excp"))
1507 insn
->arg
[0].type
= arg_ic
;
1508 insn
->arg
[0].constant
= gettrap (operands
);
1509 insn
->arg
[0].X_op
= O_constant
;
1513 if (operands
!= NULL
)
1514 parse_operands (insn
, operands
);
1517 /* bCC instruction requires special handling. */
1519 get_b_cc (char * op
)
1524 for (i
= 1; i
< strlen (op
); i
++)
1529 for (i
= 0; i
< cr16_num_cc
; i
++)
1530 if (streq (op1
, cr16_b_cond_tab
[i
]))
1531 return (char *) cr16_b_cond_tab
[i
];
1536 /* bCC instruction requires special handling. */
1538 is_bcc_insn (char * op
)
1540 if (!(streq (op
, "bal") || streq (op
, "beq0b") || streq (op
, "bnq0b")
1541 || streq (op
, "beq0w") || streq (op
, "bnq0w")))
1542 if ((op
[0] == 'b') && (get_b_cc (op
) != NULL
))
1547 /* Cinv instruction requires special handling. */
1550 check_cinv_options (char * operand
)
1565 as_bad (_("Illegal `cinv' parameter: `%c'"), *p
);
1570 /* Retrieve the opcode image of a given register pair.
1571 If the register is illegal for the current instruction,
1575 getregp_image (reg r
)
1577 const reg_entry
*rreg
;
1580 /* Check whether the register is in registers table. */
1582 rreg
= cr16_regptab
+ r
;
1583 /* Register not found. */
1586 as_bad (_("Unknown register pair: `%d'"), r
);
1590 reg_name
= rreg
->name
;
1592 /* Issue a error message when register pair is illegal. */
1593 #define RPAIR_IMAGE_ERR \
1594 as_bad (_("Illegal register pair (`%s') in Instruction: `%s'"), \
1595 reg_name, ins_parse); \
1600 case CR16_RP_REGTYPE
:
1609 /* Retrieve the opcode image of a given index register pair.
1610 If the register is illegal for the current instruction,
1614 getidxregp_image (reg r
)
1616 const reg_entry
*rreg
;
1619 /* Check whether the register is in registers table. */
1621 rreg
= cr16_regptab
+ r
;
1622 /* Register not found. */
1625 as_bad (_("Unknown register pair: `%d'"), r
);
1629 reg_name
= rreg
->name
;
1631 /* Issue a error message when register pair is illegal. */
1632 #define IDX_RPAIR_IMAGE_ERR \
1633 as_bad (_("Illegal index register pair (`%s') in Instruction: `%s'"), \
1634 reg_name, ins_parse); \
1636 if (rreg->type == CR16_RP_REGTYPE)
1638 switch (rreg
->image
)
1640 case 0: return 0; break;
1641 case 2: return 1; break;
1642 case 4: return 2; break;
1643 case 6: return 3; break;
1644 case 8: return 4; break;
1645 case 10: return 5; break;
1646 case 3: return 6; break;
1647 case 5: return 7; break;
1653 IDX_RPAIR_IMAGE_ERR
;
1657 /* Retrieve the opcode image of a given processort register.
1658 If the register is illegal for the current instruction,
1661 getprocreg_image (int r
)
1663 const reg_entry
*rreg
;
1666 /* Check whether the register is in registers table. */
1667 if (r
>= MAX_REG
&& r
< MAX_PREG
)
1668 rreg
= &cr16_pregtab
[r
- MAX_REG
];
1669 /* Register not found. */
1672 as_bad (_("Unknown processor register : `%d'"), r
);
1676 reg_name
= rreg
->name
;
1678 /* Issue a error message when register pair is illegal. */
1679 #define PROCREG_IMAGE_ERR \
1680 as_bad (_("Illegal processor register (`%s') in Instruction: `%s'"), \
1681 reg_name, ins_parse); \
1686 case CR16_P_REGTYPE
:
1695 /* Retrieve the opcode image of a given processort register.
1696 If the register is illegal for the current instruction,
1699 getprocregp_image (int r
)
1701 const reg_entry
*rreg
;
1703 int pregptab_disp
= 0;
1705 /* Check whether the register is in registers table. */
1706 if (r
>= MAX_REG
&& r
< MAX_PREG
)
1711 case 4: pregptab_disp
= 1; break;
1712 case 6: pregptab_disp
= 2; break;
1716 pregptab_disp
= 3; break;
1718 pregptab_disp
= 4; break;
1720 pregptab_disp
= 5; break;
1723 rreg
= &cr16_pregptab
[r
- pregptab_disp
];
1725 /* Register not found. */
1728 as_bad (_("Unknown processor register (32 bit) : `%d'"), r
);
1732 reg_name
= rreg
->name
;
1734 /* Issue a error message when register pair is illegal. */
1735 #define PROCREGP_IMAGE_ERR \
1736 as_bad (_("Illegal 32 bit - processor register (`%s') in Instruction: `%s'"),\
1737 reg_name, ins_parse); \
1742 case CR16_P_REGTYPE
:
1751 /* Routine used to represent integer X using NBITS bits. */
1754 getconstant (long x
, int nbits
)
1756 /* The following expression avoids overflow if
1757 'nbits' is the number of bits in 'bfd_vma'. */
1758 return (x
& ((((1 << (nbits
- 1)) - 1) << 1) | 1));
1761 /* Print a constant value to 'output_opcode':
1762 ARG holds the operand's type and value.
1763 SHIFT represents the location of the operand to be print into.
1764 NBITS determines the size (in bits) of the constant. */
1767 print_constant (int nbits
, int shift
, argument
*arg
)
1769 unsigned long mask
= 0;
1771 long constant
= getconstant (arg
->constant
, nbits
);
1777 /* mask the upper part of the constant, that is, the bits
1778 going to the lowest byte of output_opcode[0].
1779 The upper part of output_opcode[1] is always filled,
1780 therefore it is always masked with 0xFFFF. */
1781 mask
= (1 << (nbits
- 16)) - 1;
1782 /* Divide the constant between two consecutive words :
1784 +---------+---------+---------+---------+
1785 | | X X X X | x X x X | |
1786 +---------+---------+---------+---------+
1787 output_opcode[0] output_opcode[1] */
1789 CR16_PRINT (0, (constant
>> WORD_SHIFT
) & mask
, 0);
1790 CR16_PRINT (1, (constant
& 0xFFFF), WORD_SHIFT
);
1794 if ((nbits
== 21) && (IS_INSN_TYPE (LD_STOR_INS
))) nbits
= 20;
1798 /* mask the upper part of the constant, that is, the bits
1799 going to the lowest byte of output_opcode[0].
1800 The upper part of output_opcode[1] is always filled,
1801 therefore it is always masked with 0xFFFF. */
1802 mask
= (1 << (nbits
- 16)) - 1;
1803 /* Divide the constant between two consecutive words :
1805 +---------+---------+---------+---------+
1806 | | X X X X | - X - X | |
1807 +---------+---------+---------+---------+
1808 output_opcode[0] output_opcode[1] */
1810 if ((instruction
->size
> 2) && (shift
== WORD_SHIFT
))
1812 if (arg
->type
== arg_idxrp
)
1814 CR16_PRINT (0, ((constant
>> WORD_SHIFT
) & mask
) << 8, 0);
1815 CR16_PRINT (1, (constant
& 0xFFFF), WORD_SHIFT
);
1819 CR16_PRINT (0, (((((constant
>> WORD_SHIFT
) & mask
) << 8) & 0x0f00) | ((((constant
>> WORD_SHIFT
) & mask
) >> 4) & 0xf)),0);
1820 CR16_PRINT (1, (constant
& 0xFFFF), WORD_SHIFT
);
1824 CR16_PRINT (0, constant
, shift
);
1828 if (arg
->type
== arg_idxrp
)
1830 if (instruction
->size
== 2)
1832 CR16_PRINT (0, ((constant
) & 0xf), shift
); /* 0-3 bits. */
1833 CR16_PRINT (0, ((constant
>> 4) & 0x3), (shift
+ 20)); /* 4-5 bits. */
1834 CR16_PRINT (0, ((constant
>> 6) & 0x3), (shift
+ 14)); /* 6-7 bits. */
1835 CR16_PRINT (0, ((constant
>> 8) & 0x3f), (shift
+ 8)); /* 8-13 bits. */
1838 CR16_PRINT (0, constant
, shift
);
1844 /* When instruction size is 3 and 'shift' is 16, a 16-bit constant is
1845 always filling the upper part of output_opcode[1]. If we mistakenly
1846 write it to output_opcode[0], the constant prefix (that is, 'match')
1849 +---------+---------+---------+---------+
1850 | 'match' | | X X X X | |
1851 +---------+---------+---------+---------+
1852 output_opcode[0] output_opcode[1] */
1854 if ((instruction
->size
> 2) && (shift
== WORD_SHIFT
))
1855 CR16_PRINT (1, constant
, WORD_SHIFT
);
1857 CR16_PRINT (0, constant
, shift
);
1861 CR16_PRINT (0, ((constant
/ 2) & 0xf), shift
);
1862 CR16_PRINT (0, ((constant
/ 2) >> 4), (shift
+ 8));
1866 CR16_PRINT (0, constant
, shift
);
1871 /* Print an operand to 'output_opcode', which later on will be
1872 printed to the object file:
1873 ARG holds the operand's type, size and value.
1874 SHIFT represents the printing location of operand.
1875 NBITS determines the size (in bits) of a constant operand. */
1878 print_operand (int nbits
, int shift
, argument
*arg
)
1883 CR16_PRINT (0, arg
->cc
, shift
);
1887 CR16_PRINT (0, getreg_image (arg
->r
), shift
);
1891 CR16_PRINT (0, getregp_image (arg
->rp
), shift
);
1895 CR16_PRINT (0, getprocreg_image (arg
->pr
), shift
);
1899 CR16_PRINT (0, getprocregp_image (arg
->prp
), shift
);
1904 +-----------------------------+
1905 | r_index | disp | rp_base |
1906 +-----------------------------+ */
1908 if (instruction
->size
== 3)
1910 CR16_PRINT (0, getidxregp_image (arg
->rp
), 0);
1911 if (getreg_image (arg
->i_r
) == 12)
1912 CR16_PRINT (0, 0, 3);
1914 CR16_PRINT (0, 1, 3);
1918 CR16_PRINT (0, getidxregp_image (arg
->rp
), 16);
1919 if (getreg_image (arg
->i_r
) == 12)
1920 CR16_PRINT (0, 0, 19);
1922 CR16_PRINT (0, 1, 19);
1924 print_constant (nbits
, shift
, arg
);
1928 if (getreg_image (arg
->i_r
) == 12)
1929 if (IS_INSN_MNEMONIC ("cbitb") || IS_INSN_MNEMONIC ("sbitb")
1930 || IS_INSN_MNEMONIC ("tbitb"))
1931 CR16_PRINT (0, 0, 23);
1932 else CR16_PRINT (0, 0, 24);
1934 if (IS_INSN_MNEMONIC ("cbitb") || IS_INSN_MNEMONIC ("sbitb")
1935 || IS_INSN_MNEMONIC ("tbitb"))
1936 CR16_PRINT (0, 1, 23);
1937 else CR16_PRINT (0, 1, 24);
1939 print_constant (nbits
, shift
, arg
);
1944 print_constant (nbits
, shift
, arg
);
1948 CR16_PRINT (0, getreg_image (arg
->r
), shift
);
1952 print_constant (nbits
, shift
, arg
);
1953 /* Add the register argument to the output_opcode. */
1954 CR16_PRINT (0, getreg_image (arg
->r
), (shift
+16));
1958 print_constant (nbits
, shift
, arg
);
1959 if (instruction
->size
> 1)
1960 CR16_PRINT (0, getregp_image (arg
->rp
), (shift
+ 16));
1961 else if (IS_INSN_TYPE (LD_STOR_INS
) || (IS_INSN_TYPE (CSTBIT_INS
)))
1963 if (instruction
->size
== 2)
1964 CR16_PRINT (0, getregp_image (arg
->rp
), (shift
- 8));
1965 else if (instruction
->size
== 1)
1966 CR16_PRINT (0, getregp_image (arg
->rp
), 16);
1969 CR16_PRINT (0, getregp_image (arg
->rp
), shift
);
1977 /* Retrieve the number of operands for the current assembled instruction. */
1980 get_number_of_operands (void)
1984 for (i
= 0; instruction
->operands
[i
].op_type
&& i
< MAX_OPERANDS
; i
++)
1989 /* Verify that the number NUM can be represented in BITS bits (that is,
1990 within its permitted range), based on the instruction's FLAGS.
1991 If UPDATE is nonzero, update the value of NUM if necessary.
1992 Return OP_LEGAL upon success, actual error type upon failure. */
1995 check_range (long *num
, int bits
, int unsigned flags
, int update
)
1998 int retval
= OP_LEGAL
;
2001 if (bits
== 0 && value
> 0) return OP_OUT_OF_RANGE
;
2003 /* For hosts witah longs bigger than 32-bits make sure that the top
2004 bits of a 32-bit negative value read in by the parser are set,
2005 so that the correct comparisons are made. */
2006 if (value
& 0x80000000)
2007 value
|= (-1L << 31);
2010 /* Verify operand value is even. */
2011 if (flags
& OP_EVEN
)
2024 if (flags
& OP_SHIFT
)
2030 else if (flags
& OP_SHIFT_DEC
)
2032 value
= (value
>> 1) - 1;
2037 if (flags
& OP_ABS20
)
2039 if (value
> 0xEFFFF)
2040 return OP_OUT_OF_RANGE
;
2045 if (value
== 0xB || value
== 0x9)
2046 return OP_OUT_OF_RANGE
;
2047 else if (value
== -1)
2055 if (flags
& OP_ESC1
)
2058 return OP_OUT_OF_RANGE
;
2061 if (flags
& OP_SIGNED
)
2063 max
= (1 << (bits
- 1)) - 1;
2064 min
= - (1 << (bits
- 1));
2065 if ((value
> max
) || (value
< min
))
2066 retval
= OP_OUT_OF_RANGE
;
2068 else if (flags
& OP_UNSIGNED
)
2070 max
= ((((1 << (bits
- 1)) - 1) << 1) | 1);
2072 if (((unsigned long) value
> (unsigned long) max
)
2073 || ((unsigned long) value
< (unsigned long) min
))
2074 retval
= OP_OUT_OF_RANGE
;
2076 else if (flags
& OP_NEG
)
2079 min
= - ((1 << (bits
- 1)) - 1);
2080 if ((value
> max
) || (value
< min
))
2081 retval
= OP_OUT_OF_RANGE
;
2086 /* Bunch of error checkings.
2087 The checks are made after a matching instruction was found. */
2090 warn_if_needed (ins
*insn
)
2092 /* If the post-increment address mode is used and the load/store
2093 source register is the same as rbase, the result of the
2094 instruction is undefined. */
2095 if (IS_INSN_TYPE (LD_STOR_INS_INC
))
2097 /* Enough to verify that one of the arguments is a simple reg. */
2098 if ((insn
->arg
[0].type
== arg_r
) || (insn
->arg
[1].type
== arg_r
))
2099 if (insn
->arg
[0].r
== insn
->arg
[1].r
)
2100 as_bad (_("Same src/dest register is used (`r%d'), result is undefined"), insn
->arg
[0].r
);
2103 if (IS_INSN_MNEMONIC ("pop")
2104 || IS_INSN_MNEMONIC ("push")
2105 || IS_INSN_MNEMONIC ("popret"))
2107 unsigned int count
= insn
->arg
[0].constant
, reg_val
;
2109 /* Check if count operand caused to save/retrive the RA twice
2110 to generate warning message. */
2111 if (insn
->nargs
> 2)
2113 reg_val
= getreg_image (insn
->arg
[1].r
);
2115 if ( ((reg_val
== 9) && (count
> 7))
2116 || ((reg_val
== 10) && (count
> 6))
2117 || ((reg_val
== 11) && (count
> 5))
2118 || ((reg_val
== 12) && (count
> 4))
2119 || ((reg_val
== 13) && (count
> 2))
2120 || ((reg_val
== 14) && (count
> 0)))
2121 as_warn (_("RA register is saved twice."));
2123 /* Check if the third operand is "RA" or "ra" */
2124 if (!(((insn
->arg
[2].r
) == ra
) || ((insn
->arg
[2].r
) == RA
)))
2125 as_bad (_("`%s' Illegal use of registers."), ins_parse
);
2128 if (insn
->nargs
> 1)
2130 reg_val
= getreg_image (insn
->arg
[1].r
);
2132 /* If register is a register pair ie r12/r13/r14 in operand1, then
2133 the count constant should be validated. */
2134 if (((reg_val
== 11) && (count
> 7))
2135 || ((reg_val
== 12) && (count
> 6))
2136 || ((reg_val
== 13) && (count
> 4))
2137 || ((reg_val
== 14) && (count
> 2))
2138 || ((reg_val
== 15) && (count
> 0)))
2139 as_bad (_("`%s' Illegal count-register combination."), ins_parse
);
2143 /* Check if the operand is "RA" or "ra" */
2144 if (!(((insn
->arg
[0].r
) == ra
) || ((insn
->arg
[0].r
) == RA
)))
2145 as_bad (_("`%s' Illegal use of register."), ins_parse
);
2149 /* Some instruction assume the stack pointer as rptr operand.
2150 Issue an error when the register to be loaded is also SP. */
2151 if (instruction
->flags
& NO_SP
)
2153 if (getreg_image (insn
->arg
[1].r
) == getreg_image (sp
))
2154 as_bad (_("`%s' has undefined result"), ins_parse
);
2157 /* If the rptr register is specified as one of the registers to be loaded,
2158 the final contents of rptr are undefined. Thus, we issue an error. */
2159 if (instruction
->flags
& NO_RPTR
)
2161 if ((1 << getreg_image (insn
->arg
[0].r
)) & insn
->arg
[1].constant
)
2162 as_bad (_("Same src/dest register is used (`r%d'),result is undefined"),
2163 getreg_image (insn
->arg
[0].r
));
2167 /* In some cases, we need to adjust the instruction pointer although a
2168 match was already found. Here, we gather all these cases.
2169 Returns 1 if instruction pointer was adjusted, otherwise 0. */
2172 adjust_if_needed (ins
*insn ATTRIBUTE_UNUSED
)
2176 if ((IS_INSN_TYPE (CSTBIT_INS
)) || (IS_INSN_TYPE (LD_STOR_INS
)))
2178 if ((instruction
->operands
[0].op_type
== abs24
)
2179 && ((insn
->arg
[0].constant
) > 0xF00000))
2181 insn
->arg
[0].constant
&= 0xFFFFF;
2190 /* Assemble a single instruction:
2191 INSN is already parsed (that is, all operand values and types are set).
2192 For instruction to be assembled, we need to find an appropriate template in
2193 the instruction table, meeting the following conditions:
2194 1: Has the same number of operands.
2195 2: Has the same operand types.
2196 3: Each operand size is sufficient to represent the instruction's values.
2197 Returns 1 upon success, 0 upon failure. */
2200 assemble_insn (char *mnemonic
, ins
*insn
)
2202 /* Type of each operand in the current template. */
2203 argtype cur_type
[MAX_OPERANDS
];
2204 /* Size (in bits) of each operand in the current template. */
2205 unsigned int cur_size
[MAX_OPERANDS
];
2206 /* Flags of each operand in the current template. */
2207 unsigned int cur_flags
[MAX_OPERANDS
];
2208 /* Instruction type to match. */
2209 unsigned int ins_type
;
2210 /* Boolean flag to mark whether a match was found. */
2213 /* Nonzero if an instruction with same number of operands was found. */
2214 int found_same_number_of_operands
= 0;
2215 /* Nonzero if an instruction with same argument types was found. */
2216 int found_same_argument_types
= 0;
2217 /* Nonzero if a constant was found within the required range. */
2218 int found_const_within_range
= 0;
2219 /* Argument number of an operand with invalid type. */
2220 int invalid_optype
= -1;
2221 /* Argument number of an operand with invalid constant value. */
2222 int invalid_const
= -1;
2223 /* Operand error (used for issuing various constant error messages). */
2224 op_err op_error
, const_err
= OP_LEGAL
;
2226 /* Retrieve data (based on FUNC) for each operand of a given instruction. */
2227 #define GET_CURRENT_DATA(FUNC, ARRAY) \
2228 for (i = 0; i < insn->nargs; i++) \
2229 ARRAY[i] = FUNC (instruction->operands[i].op_type)
2231 #define GET_CURRENT_TYPE GET_CURRENT_DATA (get_optype, cur_type)
2232 #define GET_CURRENT_SIZE GET_CURRENT_DATA (get_opbits, cur_size)
2233 #define GET_CURRENT_FLAGS GET_CURRENT_DATA (get_opflags, cur_flags)
2235 /* Instruction has no operands -> only copy the constant opcode. */
2236 if (insn
->nargs
== 0)
2238 output_opcode
[0] = BIN (instruction
->match
, instruction
->match_bits
);
2242 /* In some case, same mnemonic can appear with different instruction types.
2243 For example, 'storb' is supported with 3 different types :
2244 LD_STOR_INS, LD_STOR_INS_INC, STOR_IMM_INS.
2245 We assume that when reaching this point, the instruction type was
2246 pre-determined. We need to make sure that the type stays the same
2247 during a search for matching instruction. */
2248 ins_type
= CR16_INS_TYPE (instruction
->flags
);
2250 while (/* Check that match is still not found. */
2252 /* Check we didn't get to end of table. */
2253 && instruction
->mnemonic
!= NULL
2254 /* Check that the actual mnemonic is still available. */
2255 && IS_INSN_MNEMONIC (mnemonic
)
2256 /* Check that the instruction type wasn't changed. */
2257 && IS_INSN_TYPE (ins_type
))
2259 /* Check whether number of arguments is legal. */
2260 if (get_number_of_operands () != insn
->nargs
)
2262 found_same_number_of_operands
= 1;
2264 /* Initialize arrays with data of each operand in current template. */
2269 /* Check for type compatibility. */
2270 for (i
= 0; i
< insn
->nargs
; i
++)
2272 if (cur_type
[i
] != insn
->arg
[i
].type
)
2274 if (invalid_optype
== -1)
2275 invalid_optype
= i
+ 1;
2279 found_same_argument_types
= 1;
2281 for (i
= 0; i
< insn
->nargs
; i
++)
2283 /* If 'bal' instruction size is '2' and reg operand is not 'ra'
2284 then goto next instruction. */
2285 if (IS_INSN_MNEMONIC ("bal") && (i
== 0)
2286 && (instruction
->size
== 2) && (insn
->arg
[i
].rp
!= 14))
2289 /* If 'storb' instruction with 'sp' reg and 16-bit disp of
2290 * reg-pair, leads to undifined trap, so this should use
2291 * 20-bit disp of reg-pair. */
2292 if (IS_INSN_MNEMONIC ("storb") && (instruction
->size
== 2)
2293 && (insn
->arg
[i
].r
== 15) && (insn
->arg
[i
+ 1].type
== arg_crp
))
2296 /* Only check range - don't update the constant's value, since the
2297 current instruction may not be the last we try to match.
2298 The constant's value will be updated later, right before printing
2299 it to the object file. */
2300 if ((insn
->arg
[i
].X_op
== O_constant
)
2301 && (op_error
= check_range (&insn
->arg
[i
].constant
, cur_size
[i
],
2304 if (invalid_const
== -1)
2306 invalid_const
= i
+ 1;
2307 const_err
= op_error
;
2311 /* For symbols, we make sure the relocation size (which was already
2312 determined) is sufficient. */
2313 else if ((insn
->arg
[i
].X_op
== O_symbol
)
2314 && ((bfd_reloc_type_lookup (stdoutput
, insn
->rtype
))->bitsize
2318 found_const_within_range
= 1;
2320 /* If we got till here -> Full match is found. */
2324 /* Try again with next instruction. */
2331 /* We haven't found a match - instruction can't be assembled. */
2332 if (!found_same_number_of_operands
)
2333 as_bad (_("Incorrect number of operands"));
2334 else if (!found_same_argument_types
)
2335 as_bad (_("Illegal type of operand (arg %d)"), invalid_optype
);
2336 else if (!found_const_within_range
)
2340 case OP_OUT_OF_RANGE
:
2341 as_bad (_("Operand out of range (arg %d)"), invalid_const
);
2344 as_bad (_("Operand has odd displacement (arg %d)"), invalid_const
);
2347 as_bad (_("Illegal operand (arg %d)"), invalid_const
);
2355 /* Full match - print the encoding to output file. */
2357 /* Make further checkings (such that couldn't be made earlier).
2358 Warn the user if necessary. */
2359 warn_if_needed (insn
);
2361 /* Check whether we need to adjust the instruction pointer. */
2362 if (adjust_if_needed (insn
))
2363 /* If instruction pointer was adjusted, we need to update
2364 the size of the current template operands. */
2367 for (i
= 0; i
< insn
->nargs
; i
++)
2369 int j
= instruction
->flags
& REVERSE_MATCH
?
2374 /* This time, update constant value before printing it. */
2375 if ((insn
->arg
[j
].X_op
== O_constant
)
2376 && (check_range (&insn
->arg
[j
].constant
, cur_size
[j
],
2377 cur_flags
[j
], 1) != OP_LEGAL
))
2378 as_fatal (_("Illegal operand (arg %d)"), j
+1);
2381 /* First, copy the instruction's opcode. */
2382 output_opcode
[0] = BIN (instruction
->match
, instruction
->match_bits
);
2384 for (i
= 0; i
< insn
->nargs
; i
++)
2386 /* For BAL (ra),disp17 instuction only. And also set the
2387 DISP24a relocation type. */
2388 if (IS_INSN_MNEMONIC ("bal") && (instruction
->size
== 2) && i
== 0)
2390 insn
->rtype
= BFD_RELOC_CR16_DISP24a
;
2394 print_operand (cur_size
[i
], instruction
->operands
[i
].shift
,
2402 /* Print the instruction.
2403 Handle also cases where the instruction is relaxable/relocatable. */
2406 print_insn (ins
*insn
)
2408 unsigned int i
, j
, insn_size
;
2410 unsigned short words
[4];
2413 /* Arrange the insn encodings in a WORD size array. */
2414 for (i
= 0, j
= 0; i
< 2; i
++)
2416 words
[j
++] = (output_opcode
[i
] >> 16) & 0xFFFF;
2417 words
[j
++] = output_opcode
[i
] & 0xFFFF;
2420 /* Handle relocation. */
2421 if ((instruction
->flags
& RELAXABLE
) && relocatable
)
2424 /* Write the maximal instruction size supported. */
2425 insn_size
= INSN_MAX_SIZE
;
2427 if (IS_INSN_TYPE (BRANCH_INS
))
2429 switch (insn
->rtype
)
2431 case BFD_RELOC_CR16_DISP24
:
2434 case BFD_RELOC_CR16_DISP16
:
2445 this_frag
= frag_var (rs_machine_dependent
, insn_size
*2,
2447 insn
->exp
.X_add_symbol
,
2453 insn_size
= instruction
->size
;
2454 this_frag
= frag_more (insn_size
* 2);
2456 if ((relocatable
) && (insn
->rtype
!= BFD_RELOC_NONE
))
2458 reloc_howto_type
*reloc_howto
;
2461 reloc_howto
= bfd_reloc_type_lookup (stdoutput
, insn
->rtype
);
2466 size
= bfd_get_reloc_size (reloc_howto
);
2468 if (size
< 1 || size
> 4)
2471 fix_new_exp (frag_now
, this_frag
- frag_now
->fr_literal
,
2472 size
, &insn
->exp
, reloc_howto
->pc_relative
,
2477 /* Verify a 2-byte code alignment. */
2478 addr_mod
= frag_now_fix () & 1;
2479 if (frag_now
->has_code
&& frag_now
->insn_addr
!= addr_mod
)
2480 as_bad (_("instruction address is not a multiple of 2"));
2481 frag_now
->insn_addr
= addr_mod
;
2482 frag_now
->has_code
= 1;
2484 /* Write the instruction encoding to frag. */
2485 for (i
= 0; i
< insn_size
; i
++)
2487 md_number_to_chars (this_frag
, (valueT
) words
[i
], 2);
2492 /* This is the guts of the machine-dependent assembler. OP points to a
2493 machine dependent instruction. This function is supposed to emit
2494 the frags/bytes it assembles to. */
2497 md_assemble (char *op
)
2500 char *param
, param1
[32];
2502 /* Reset global variables for a new instruction. */
2505 /* Strip the mnemonic. */
2506 for (param
= op
; *param
!= 0 && !ISSPACE (*param
); param
++)
2510 /* bCC instuctions and adjust the mnemonic by adding extra white spaces. */
2511 if (is_bcc_insn (op
))
2513 strcpy (param1
, get_b_cc (op
));
2515 strcat (param1
,",");
2516 strcat (param1
, param
);
2517 param
= (char *) ¶m1
;
2520 /* Checking the cinv options and adjust the mnemonic by removing the
2521 extra white spaces. */
2522 if (streq ("cinv", op
))
2524 /* Validate the cinv options. */
2525 check_cinv_options (param
);
2529 /* MAPPING - SHIFT INSN, if imm4/imm16 positive values
2530 lsh[b/w] imm4/imm6, reg ==> ashu[b/w] imm4/imm16, reg
2531 as CR16 core doesn't support lsh[b/w] right shift operaions. */
2532 if ((streq ("lshb", op
) || streq ("lshw", op
) || streq ("lshd", op
))
2533 && (param
[0] == '$'))
2535 strcpy (param1
, param
);
2536 /* Find the instruction. */
2537 instruction
= (const inst
*) hash_find (cr16_inst_hash
, op
);
2538 parse_operands (&cr16_ins
, param1
);
2539 if (((&cr16_ins
)->arg
[0].type
== arg_ic
)
2540 && ((&cr16_ins
)->arg
[0].constant
>= 0))
2542 if (streq ("lshb", op
))
2544 else if (streq ("lshd", op
))
2551 /* Find the instruction. */
2552 instruction
= (const inst
*) hash_find (cr16_inst_hash
, op
);
2553 if (instruction
== NULL
)
2555 as_bad (_("Unknown opcode: `%s'"), op
);
2559 /* Tie dwarf2 debug info to the address at the start of the insn. */
2560 dwarf2_emit_insn (0);
2562 /* Parse the instruction's operands. */
2563 parse_insn (&cr16_ins
, param
);
2565 /* Assemble the instruction - return upon failure. */
2566 if (assemble_insn (op
, &cr16_ins
) == 0)
2569 /* Print the instruction. */
2570 print_insn (&cr16_ins
);