1 /* tc-cr16.c -- Assembler code for the CR16 CPU core.
2 Copyright 2007, 2008, 2009 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
)
497 int rtype
= BFD_RELOC_UNUSED
;
501 default: rtype
= BFD_RELOC_NONE
; break;
502 case 1: rtype
= BFD_RELOC_CR16_NUM8
; break;
503 case 2: rtype
= BFD_RELOC_CR16_NUM16
; break;
507 rtype
= BFD_RELOC_CR16_NUM32a
;
511 rtype
= BFD_RELOC_CR16_NUM32
;
515 fix_new_exp (frag
, offset
, len
, exp
, 0, rtype
);
518 /* Generate a relocation entry for a fixup. */
521 tc_gen_reloc (asection
*section ATTRIBUTE_UNUSED
, fixS
* fixP
)
524 bfd_reloc_code_real_type code
;
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 code
= BFD_RELOC_CR16_GOT_REGREL20
;
585 reloc
->addend
= fixP
->fx_offset
= reloc
->address
;
587 else if ((fixP
->fx_r_type
== BFD_RELOC_CR16_GOTC_REGREL20
)
589 && fixP
->fx_addsy
== GOT_symbol
)
591 code
= BFD_RELOC_CR16_GOTC_REGREL20
;
592 reloc
->addend
= fixP
->fx_offset
= reloc
->address
;
596 gas_assert ((int) fixP
->fx_r_type
> 0);
597 reloc
->howto
= bfd_reloc_type_lookup (stdoutput
, fixP
->fx_r_type
);
599 if (reloc
->howto
== NULL
)
601 as_bad_where (fixP
->fx_file
, fixP
->fx_line
,
602 _("internal error: reloc %d (`%s') not supported by object file format"),
604 bfd_get_reloc_code_name (fixP
->fx_r_type
));
607 gas_assert (!fixP
->fx_pcrel
== !reloc
->howto
->pc_relative
);
612 /* Prepare machine-dependent frags for relaxation. */
615 md_estimate_size_before_relax (fragS
*fragp
, asection
*seg
)
617 /* If symbol is undefined or located in a different section,
618 select the largest supported relocation. */
619 relax_substateT subtype
;
620 relax_substateT rlx_state
[] = {0, 2};
622 for (subtype
= 0; subtype
< ARRAY_SIZE (rlx_state
); subtype
+= 2)
624 if (fragp
->fr_subtype
== rlx_state
[subtype
]
625 && (!S_IS_DEFINED (fragp
->fr_symbol
)
626 || seg
!= S_GET_SEGMENT (fragp
->fr_symbol
)))
628 fragp
->fr_subtype
= rlx_state
[subtype
+ 1];
633 if (fragp
->fr_subtype
>= ARRAY_SIZE (md_relax_table
))
636 return md_relax_table
[fragp
->fr_subtype
].rlx_length
;
640 md_convert_frag (bfd
*abfd ATTRIBUTE_UNUSED
, asection
*sec
, fragS
*fragP
)
642 /* 'opcode' points to the start of the instruction, whether
643 we need to change the instruction's fixed encoding. */
644 char *opcode
= fragP
->fr_literal
+ fragP
->fr_fix
;
645 bfd_reloc_code_real_type reloc
;
647 subseg_change (sec
, 0);
649 switch (fragP
->fr_subtype
)
652 reloc
= BFD_RELOC_CR16_DISP8
;
655 /* If the subtype is not changed due to :m operand qualifier,
656 then no need to update the opcode value. */
657 if ((int)opcode
[1] != 0x18)
659 opcode
[0] = (opcode
[0] & 0xf0);
662 reloc
= BFD_RELOC_CR16_DISP16
;
665 /* If the subtype is not changed due to :l operand qualifier,
666 then no need to update the opcode value. */
667 if ((int)opcode
[1] != 0)
669 opcode
[2] = opcode
[0];
670 opcode
[0] = opcode
[1];
673 reloc
= BFD_RELOC_CR16_DISP24
;
679 fix_new (fragP
, fragP
->fr_fix
,
680 bfd_get_reloc_size (bfd_reloc_type_lookup (stdoutput
, reloc
)),
681 fragP
->fr_symbol
, fragP
->fr_offset
, 1, reloc
);
683 fragP
->fr_fix
+= md_relax_table
[fragP
->fr_subtype
].rlx_length
;
687 md_undefined_symbol (char *name
)
689 if (*name
== '_' && *(name
+ 1) == 'G'
690 && strcmp (name
, "_GLOBAL_OFFSET_TABLE_") == 0)
694 if (symbol_find (name
))
695 as_bad (_("GOT already in symbol table"));
696 GOT_symbol
= symbol_new (name
, undefined_section
,
697 (valueT
) 0, &zero_address_frag
);
704 /* Process machine-dependent command line options. Called once for
705 each option on the command line that the machine-independent part of
706 GAS does not understand. */
709 md_parse_option (int c ATTRIBUTE_UNUSED
, char *arg ATTRIBUTE_UNUSED
)
714 /* Machine-dependent usage-output. */
717 md_show_usage (FILE *stream ATTRIBUTE_UNUSED
)
723 md_atof (int type
, char *litP
, int *sizeP
)
725 return ieee_md_atof (type
, litP
, sizeP
, target_big_endian
);
728 /* Apply a fixS (fixup of an instruction or data that we didn't have
729 enough info to complete immediately) to the data in a frag.
730 Since linkrelax is nonzero and TC_LINKRELAX_FIXUP is defined to disable
731 relaxation of debug sections, this function is called only when
732 fixuping relocations of debug sections. */
735 md_apply_fix (fixS
*fixP
, valueT
*valP
, segT seg
)
739 if (fixP
->fx_addsy
== NULL
740 && fixP
->fx_pcrel
== 0)
742 else if (fixP
->fx_pcrel
== 1
743 && fixP
->fx_addsy
!= NULL
744 && S_GET_SEGMENT (fixP
->fx_addsy
) == seg
)
749 if (fixP
->fx_addsy
!= NULL
&& !fixP
->fx_pcrel
)
751 val
= fixP
->fx_offset
;
757 char *buf
= fixP
->fx_frag
->fr_literal
+ fixP
->fx_where
;
761 switch (fixP
->fx_r_type
)
763 case BFD_RELOC_CR16_NUM8
:
764 bfd_put_8 (stdoutput
, (unsigned char) val
, buf
);
766 case BFD_RELOC_CR16_NUM16
:
767 bfd_put_16 (stdoutput
, val
, buf
);
769 case BFD_RELOC_CR16_NUM32
:
770 bfd_put_32 (stdoutput
, val
, buf
);
772 case BFD_RELOC_CR16_NUM32a
:
773 bfd_put_32 (stdoutput
, val
, buf
);
776 /* We shouldn't ever get here because linkrelax is nonzero. */
783 fixP
->fx_offset
= * valP
;
786 /* The location from which a PC relative jump should be calculated,
787 given a PC relative reloc. */
790 md_pcrel_from (fixS
*fixp
)
792 return fixp
->fx_frag
->fr_address
+ fixp
->fx_where
;
796 initialise_reg_hash_table (struct hash_control
** hash_table
,
797 const reg_entry
* register_table
,
798 const unsigned int num_entries
)
800 const reg_entry
* rreg
;
803 if ((* hash_table
= hash_new ()) == NULL
)
804 as_fatal (_("Virtual memory exhausted"));
806 for (rreg
= register_table
;
807 rreg
< (register_table
+ num_entries
);
810 hashret
= hash_insert (* hash_table
, rreg
->name
, (char *) rreg
);
812 as_fatal (_("Internal Error: Can't hash %s: %s"),
813 rreg
->name
, hashret
);
817 /* This function is called once, at assembler startup time. This should
818 set up all the tables, etc that the MD part of the assembler needs. */
825 /* Set up a hash table for the instructions. */
826 if ((cr16_inst_hash
= hash_new ()) == NULL
)
827 as_fatal (_("Virtual memory exhausted"));
829 while (cr16_instruction
[i
].mnemonic
!= NULL
)
832 const char *mnemonic
= cr16_instruction
[i
].mnemonic
;
834 hashret
= hash_insert (cr16_inst_hash
, mnemonic
,
835 (char *)(cr16_instruction
+ i
));
837 if (hashret
!= NULL
&& *hashret
!= '\0')
838 as_fatal (_("Can't hash `%s': %s\n"), cr16_instruction
[i
].mnemonic
,
839 *hashret
== 0 ? _("(unknown reason)") : hashret
);
841 /* Insert unique names into hash table. The CR16 instruction set
842 has many identical opcode names that have different opcodes based
843 on the operands. This hash table then provides a quick index to
844 the first opcode with a particular name in the opcode table. */
849 while (cr16_instruction
[i
].mnemonic
!= NULL
850 && streq (cr16_instruction
[i
].mnemonic
, mnemonic
));
853 /* Initialize reg_hash hash table. */
854 initialise_reg_hash_table (& reg_hash
, cr16_regtab
, NUMREGS
);
855 /* Initialize regp_hash hash table. */
856 initialise_reg_hash_table (& regp_hash
, cr16_regptab
, NUMREGPS
);
857 /* Initialize preg_hash hash table. */
858 initialise_reg_hash_table (& preg_hash
, cr16_pregtab
, NUMPREGS
);
859 /* Initialize pregp_hash hash table. */
860 initialise_reg_hash_table (& pregp_hash
, cr16_pregptab
, NUMPREGPS
);
862 /* Set linkrelax here to avoid fixups in most sections. */
866 /* Process constants (immediate/absolute)
867 and labels (jump targets/Memory locations). */
870 process_label_constant (char *str
, ins
* cr16_ins
)
872 char *saved_input_line_pointer
;
873 int symbol_with_at
= 0;
874 int symbol_with_s
= 0;
875 int symbol_with_m
= 0;
876 int symbol_with_l
= 0;
877 int symbol_with_at_got
= 0;
878 int symbol_with_at_gotc
= 0;
879 argument
*cur_arg
= cr16_ins
->arg
+ cur_arg_num
; /* Current argument. */
881 saved_input_line_pointer
= input_line_pointer
;
882 input_line_pointer
= str
;
884 expression (&cr16_ins
->exp
);
886 switch (cr16_ins
->exp
.X_op
)
890 /* Missing or bad expr becomes absolute 0. */
891 as_bad (_("missing or invalid displacement expression `%s' taken as 0"),
893 cr16_ins
->exp
.X_op
= O_constant
;
894 cr16_ins
->exp
.X_add_number
= 0;
895 cr16_ins
->exp
.X_add_symbol
= NULL
;
896 cr16_ins
->exp
.X_op_symbol
= NULL
;
900 cur_arg
->X_op
= O_constant
;
901 cur_arg
->constant
= cr16_ins
->exp
.X_add_number
;
907 cur_arg
->X_op
= O_symbol
;
908 cur_arg
->constant
= cr16_ins
->exp
.X_add_number
;
909 cr16_ins
->exp
.X_add_number
= 0;
910 cr16_ins
->rtype
= BFD_RELOC_NONE
;
913 if (strneq (input_line_pointer
, "@c", 2))
916 if (strneq (input_line_pointer
, "@l", 2)
917 || strneq (input_line_pointer
, ":l", 2))
920 if (strneq (input_line_pointer
, "@m", 2)
921 || strneq (input_line_pointer
, ":m", 2))
924 if (strneq (input_line_pointer
, "@s", 2)
925 || strneq (input_line_pointer
, ":s", 2))
928 if (strneq (input_line_pointer
, "@cGOT", 5)
929 || strneq (input_line_pointer
, "@cgot", 5))
931 if (GOT_symbol
== NULL
)
932 GOT_symbol
= symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME
);
934 symbol_with_at_gotc
= 1;
936 else if (strneq (input_line_pointer
, "@GOT", 4)
937 || strneq (input_line_pointer
, "@got", 4))
939 if ((strneq (input_line_pointer
, "+", 1))
940 || (strneq (input_line_pointer
, "-", 1)))
941 as_warn (_("GOT bad expression with %s."), input_line_pointer
);
943 if (GOT_symbol
== NULL
)
944 GOT_symbol
= symbol_find_or_make (GLOBAL_OFFSET_TABLE_NAME
);
946 symbol_with_at_got
= 1;
949 switch (cur_arg
->type
)
952 if (IS_INSN_TYPE (LD_STOR_INS
) || IS_INSN_TYPE (CSTBIT_INS
))
954 if (symbol_with_at_got
)
955 cr16_ins
->rtype
= BFD_RELOC_CR16_GOT_REGREL20
;
956 else if (symbol_with_at_gotc
)
957 cr16_ins
->rtype
= BFD_RELOC_CR16_GOTC_REGREL20
;
958 else if (cur_arg
->size
== 20)
959 cr16_ins
->rtype
= BFD_RELOC_CR16_REGREL20
;
961 cr16_ins
->rtype
= BFD_RELOC_CR16_REGREL20a
;
966 if (IS_INSN_TYPE (LD_STOR_INS
) || IS_INSN_TYPE (CSTBIT_INS
))
968 if (symbol_with_at_got
)
969 cr16_ins
->rtype
= BFD_RELOC_CR16_GOT_REGREL20
;
970 else if (symbol_with_at_gotc
)
971 cr16_ins
->rtype
= BFD_RELOC_CR16_GOTC_REGREL20
;
973 switch (instruction
->size
)
976 switch (cur_arg
->size
)
979 cr16_ins
->rtype
= BFD_RELOC_CR16_REGREL0
;
982 if (IS_INSN_MNEMONIC ("loadb") || IS_INSN_MNEMONIC ("storb"))
983 cr16_ins
->rtype
= BFD_RELOC_CR16_REGREL4
;
985 cr16_ins
->rtype
= BFD_RELOC_CR16_REGREL4a
;
991 cr16_ins
->rtype
= BFD_RELOC_CR16_REGREL16
;
994 if (cur_arg
->size
== 20)
995 cr16_ins
->rtype
= BFD_RELOC_CR16_REGREL20
;
997 cr16_ins
->rtype
= BFD_RELOC_CR16_REGREL20a
;
1006 if (IS_INSN_TYPE (LD_STOR_INS
) || IS_INSN_TYPE (CSTBIT_INS
))
1008 if (symbol_with_at_got
)
1009 cr16_ins
->rtype
= BFD_RELOC_CR16_GOT_REGREL20
;
1010 else if (symbol_with_at_gotc
)
1011 cr16_ins
->rtype
= BFD_RELOC_CR16_GOTC_REGREL20
;
1013 cr16_ins
->rtype
= BFD_RELOC_CR16_REGREL20
;
1018 if (IS_INSN_TYPE (LD_STOR_INS
) || IS_INSN_TYPE (CSTBIT_INS
))
1020 if (symbol_with_at_got
)
1021 cr16_ins
->rtype
= BFD_RELOC_CR16_GOT_REGREL20
;
1022 else if (symbol_with_at_gotc
)
1023 cr16_ins
->rtype
= BFD_RELOC_CR16_GOTC_REGREL20
;
1025 switch (instruction
->size
)
1027 case 1: cr16_ins
->rtype
= BFD_RELOC_CR16_REGREL0
; break;
1028 case 2: cr16_ins
->rtype
= BFD_RELOC_CR16_REGREL14
; break;
1029 case 3: cr16_ins
->rtype
= BFD_RELOC_CR16_REGREL20
; break;
1037 if (IS_INSN_MNEMONIC ("bal"))
1038 cr16_ins
->rtype
= BFD_RELOC_CR16_DISP24
;
1039 else if (IS_INSN_TYPE (BRANCH_INS
))
1042 cr16_ins
->rtype
= BFD_RELOC_CR16_DISP24
;
1043 else if (symbol_with_m
)
1044 cr16_ins
->rtype
= BFD_RELOC_CR16_DISP16
;
1046 cr16_ins
->rtype
= BFD_RELOC_CR16_DISP8
;
1048 else if (IS_INSN_TYPE (STOR_IMM_INS
) || IS_INSN_TYPE (LD_STOR_INS
)
1049 || IS_INSN_TYPE (CSTBIT_INS
))
1052 as_bad (_("operand %d: illegal use expression: `%s`"), cur_arg_num
+ 1, str
);
1053 if (symbol_with_at_got
)
1054 cr16_ins
->rtype
= BFD_RELOC_CR16_GOT_REGREL20
;
1055 else if (symbol_with_at_gotc
)
1056 cr16_ins
->rtype
= BFD_RELOC_CR16_GOTC_REGREL20
;
1057 else if (symbol_with_m
)
1058 cr16_ins
->rtype
= BFD_RELOC_CR16_ABS20
;
1059 else /* Default to (symbol_with_l) */
1060 cr16_ins
->rtype
= BFD_RELOC_CR16_ABS24
;
1062 else if (IS_INSN_TYPE (BRANCH_NEQ_INS
))
1063 cr16_ins
->rtype
= BFD_RELOC_CR16_DISP4
;
1067 if (IS_INSN_TYPE (ARITH_INS
))
1069 if (symbol_with_at_got
)
1070 cr16_ins
->rtype
= BFD_RELOC_CR16_GOT_REGREL20
;
1071 else if (symbol_with_at_gotc
)
1072 cr16_ins
->rtype
= BFD_RELOC_CR16_GOTC_REGREL20
;
1073 else if (symbol_with_s
)
1074 cr16_ins
->rtype
= BFD_RELOC_CR16_IMM4
;
1075 else if (symbol_with_m
)
1076 cr16_ins
->rtype
= BFD_RELOC_CR16_IMM20
;
1077 else if (symbol_with_at
)
1078 cr16_ins
->rtype
= BFD_RELOC_CR16_IMM32a
;
1079 else /* Default to (symbol_with_l) */
1080 cr16_ins
->rtype
= BFD_RELOC_CR16_IMM32
;
1082 else if (IS_INSN_TYPE (ARITH_BYTE_INS
))
1084 cr16_ins
->rtype
= BFD_RELOC_CR16_IMM16
;
1093 cur_arg
->X_op
= cr16_ins
->exp
.X_op
;
1097 input_line_pointer
= saved_input_line_pointer
;
1101 /* Retrieve the opcode image of a given register.
1102 If the register is illegal for the current instruction,
1106 getreg_image (reg r
)
1108 const reg_entry
*rreg
;
1110 int is_procreg
= 0; /* Nonzero means argument should be processor reg. */
1112 /* Check whether the register is in registers table. */
1114 rreg
= cr16_regtab
+ r
;
1115 else /* Register not found. */
1117 as_bad (_("Unknown register: `%d'"), r
);
1121 reg_name
= rreg
->name
;
1123 /* Issue a error message when register is illegal. */
1125 as_bad (_("Illegal register (`%s') in Instruction: `%s'"), \
1126 reg_name, ins_parse); \
1131 case CR16_R_REGTYPE
:
1137 case CR16_P_REGTYPE
:
1148 /* Parsing different types of operands
1149 -> constants Immediate/Absolute/Relative numbers
1150 -> Labels Relocatable symbols
1151 -> (reg pair base) Register pair base
1152 -> (rbase) Register base
1153 -> disp(rbase) Register relative
1154 -> [rinx]disp(reg pair) Register index with reg pair mode
1155 -> disp(rbase,ridx,scl) Register index mode. */
1158 set_operand (char *operand
, ins
* cr16_ins
)
1160 char *operandS
; /* Pointer to start of sub-opearand. */
1161 char *operandE
; /* Pointer to end of sub-opearand. */
1163 argument
*cur_arg
= &cr16_ins
->arg
[cur_arg_num
]; /* Current argument. */
1165 /* Initialize pointers. */
1166 operandS
= operandE
= operand
;
1168 switch (cur_arg
->type
)
1170 case arg_ic
: /* Case $0x18. */
1172 case arg_c
: /* Case 0x18. */
1174 process_label_constant (operandS
, cr16_ins
);
1176 if (cur_arg
->type
!= arg_ic
)
1177 cur_arg
->type
= arg_c
;
1180 case arg_icr
: /* Case $0x18(r1). */
1182 case arg_cr
: /* Case 0x18(r1). */
1183 /* Set displacement constant. */
1184 while (*operandE
!= '(')
1187 process_label_constant (operandS
, cr16_ins
);
1188 operandS
= operandE
;
1189 case arg_rbase
: /* Case (r1) or (r1,r0). */
1191 /* Set register base. */
1192 while (*operandE
!= ')')
1195 if ((cur_arg
->r
= get_register (operandS
)) == nullregister
)
1196 as_bad (_("Illegal register `%s' in Instruction `%s'"),
1197 operandS
, ins_parse
);
1199 /* set the arg->rp, if reg is "r12" or "r13" or "14" or "15" */
1200 if ((cur_arg
->type
!= arg_rbase
)
1201 && ((getreg_image (cur_arg
->r
) == 12)
1202 || (getreg_image (cur_arg
->r
) == 13)
1203 || (getreg_image (cur_arg
->r
) == 14)
1204 || (getreg_image (cur_arg
->r
) == 15)))
1206 cur_arg
->type
= arg_crp
;
1207 cur_arg
->rp
= cur_arg
->r
;
1211 case arg_crp
: /* Case 0x18(r1,r0). */
1212 /* Set displacement constant. */
1213 while (*operandE
!= '(')
1216 process_label_constant (operandS
, cr16_ins
);
1217 operandS
= operandE
;
1219 /* Set register pair base. */
1220 while (*operandE
!= ')')
1223 if ((cur_arg
->rp
= get_register_pair (operandS
)) == nullregister
)
1224 as_bad (_("Illegal register pair `%s' in Instruction `%s'"),
1225 operandS
, ins_parse
);
1229 /* Set register pair base. */
1230 if ((strchr (operandS
,'(') != NULL
))
1232 while ((*operandE
!= '(') && (! ISSPACE (*operandE
)))
1234 if ((cur_arg
->rp
= get_index_register_pair (operandE
)) == nullregister
)
1235 as_bad (_("Illegal register pair `%s' in Instruction `%s'"),
1236 operandS
, ins_parse
);
1238 cur_arg
->type
= arg_idxrp
;
1243 operandE
= operandS
;
1244 /* Set displacement constant. */
1245 while (*operandE
!= ']')
1247 process_label_constant (++operandE
, cr16_ins
);
1249 operandE
= operandS
;
1251 /* Set index register . */
1252 operandS
= strchr (operandE
,'[');
1253 if (operandS
!= NULL
)
1254 { /* Eliminate '[', detach from rest of operand. */
1257 operandE
= strchr (operandS
, ']');
1259 if (operandE
== NULL
)
1260 as_bad (_("unmatched '['"));
1262 { /* Eliminate ']' and make sure it was the last thing
1265 if (*(operandE
+ 1) != '\0')
1266 as_bad (_("garbage after index spec ignored"));
1270 if ((cur_arg
->i_r
= get_index_register (operandS
)) == nullregister
)
1271 as_bad (_("Illegal register `%s' in Instruction `%s'"),
1272 operandS
, ins_parse
);
1282 /* Parse a single operand.
1283 operand - Current operand to parse.
1284 cr16_ins - Current assembled instruction. */
1287 parse_operand (char *operand
, ins
* cr16_ins
)
1290 argument
*cur_arg
= cr16_ins
->arg
+ cur_arg_num
; /* Current argument. */
1292 /* Initialize the type to NULL before parsing. */
1293 cur_arg
->type
= nullargs
;
1295 /* Check whether this is a condition code . */
1296 if ((IS_INSN_MNEMONIC ("b")) && ((ret_val
= get_cc (operand
)) != -1))
1298 cur_arg
->type
= arg_cc
;
1299 cur_arg
->cc
= ret_val
;
1300 cur_arg
->X_op
= O_register
;
1304 /* Check whether this is a general processor register. */
1305 if ((ret_val
= get_register (operand
)) != nullregister
)
1307 cur_arg
->type
= arg_r
;
1308 cur_arg
->r
= ret_val
;
1313 /* Check whether this is a general processor register pair. */
1314 if ((operand
[0] == '(')
1315 && ((ret_val
= get_register_pair (operand
)) != nullregister
))
1317 cur_arg
->type
= arg_rp
;
1318 cur_arg
->rp
= ret_val
;
1319 cur_arg
->X_op
= O_register
;
1323 /* Check whether the operand is a processor register.
1324 For "lprd" and "sprd" instruction, only 32 bit
1325 processor registers used. */
1326 if (!(IS_INSN_MNEMONIC ("lprd") || (IS_INSN_MNEMONIC ("sprd")))
1327 && ((ret_val
= get_pregister (operand
)) != nullpregister
))
1329 cur_arg
->type
= arg_pr
;
1330 cur_arg
->pr
= ret_val
;
1331 cur_arg
->X_op
= O_register
;
1335 /* Check whether this is a processor register - 32 bit. */
1336 if ((ret_val
= get_pregisterp (operand
)) != nullpregister
)
1338 cur_arg
->type
= arg_prp
;
1339 cur_arg
->prp
= ret_val
;
1340 cur_arg
->X_op
= O_register
;
1344 /* Deal with special characters. */
1348 if (strchr (operand
, '(') != NULL
)
1349 cur_arg
->type
= arg_icr
;
1351 cur_arg
->type
= arg_ic
;
1356 cur_arg
->type
= arg_rbase
;
1361 cur_arg
->type
= arg_idxr
;
1369 if (strchr (operand
, '(') != NULL
)
1371 if (strchr (operand
, ',') != NULL
1372 && (strchr (operand
, ',') > strchr (operand
, '(')))
1373 cur_arg
->type
= arg_crp
;
1375 cur_arg
->type
= arg_cr
;
1378 cur_arg
->type
= arg_c
;
1380 /* Parse an operand according to its type. */
1382 cur_arg
->constant
= 0;
1383 set_operand (operand
, cr16_ins
);
1386 /* Parse the various operands. Each operand is then analyzed to fillup
1387 the fields in the cr16_ins data structure. */
1390 parse_operands (ins
* cr16_ins
, char *operands
)
1392 char *operandS
; /* Operands string. */
1393 char *operandH
, *operandT
; /* Single operand head/tail pointers. */
1394 int allocated
= 0; /* Indicates a new operands string was allocated.*/
1395 char *operand
[MAX_OPERANDS
];/* Separating the operands. */
1396 int op_num
= 0; /* Current operand number we are parsing. */
1397 int bracket_flag
= 0; /* Indicates a bracket '(' was found. */
1398 int sq_bracket_flag
= 0; /* Indicates a square bracket '[' was found. */
1400 /* Preprocess the list of registers, if necessary. */
1401 operandS
= operandH
= operandT
= operands
;
1403 while (*operandT
!= '\0')
1405 if (*operandT
== ',' && bracket_flag
!= 1 && sq_bracket_flag
!= 1)
1408 operand
[op_num
++] = strdup (operandH
);
1409 operandH
= operandT
;
1413 if (*operandT
== ' ')
1414 as_bad (_("Illegal operands (whitespace): `%s'"), ins_parse
);
1416 if (*operandT
== '(')
1418 else if (*operandT
== '[')
1419 sq_bracket_flag
= 1;
1421 if (*operandT
== ')')
1426 as_fatal (_("Missing matching brackets : `%s'"), ins_parse
);
1428 else if (*operandT
== ']')
1430 if (sq_bracket_flag
)
1431 sq_bracket_flag
= 0;
1433 as_fatal (_("Missing matching brackets : `%s'"), ins_parse
);
1436 if (bracket_flag
== 1 && *operandT
== ')')
1438 else if (sq_bracket_flag
== 1 && *operandT
== ']')
1439 sq_bracket_flag
= 0;
1444 /* Adding the last operand. */
1445 operand
[op_num
++] = strdup (operandH
);
1446 cr16_ins
->nargs
= op_num
;
1448 /* Verifying correct syntax of operands (all brackets should be closed). */
1449 if (bracket_flag
|| sq_bracket_flag
)
1450 as_fatal (_("Missing matching brackets : `%s'"), ins_parse
);
1452 /* Now we parse each operand separately. */
1453 for (op_num
= 0; op_num
< cr16_ins
->nargs
; op_num
++)
1455 cur_arg_num
= op_num
;
1456 parse_operand (operand
[op_num
], cr16_ins
);
1457 free (operand
[op_num
]);
1464 /* Get the trap index in dispatch table, given its name.
1465 This routine is used by assembling the 'excp' instruction. */
1470 const trap_entry
*trap
;
1472 for (trap
= cr16_traps
; trap
< (cr16_traps
+ NUMTRAPS
); trap
++)
1473 if (strcasecmp (trap
->name
, s
) == 0)
1476 /* To make compatable with CR16 4.1 tools, the below 3-lines of
1477 * code added. Refer: Development Tracker item #123 */
1478 for (trap
= cr16_traps
; trap
< (cr16_traps
+ NUMTRAPS
); trap
++)
1479 if (trap
->entry
== (unsigned int) atoi (s
))
1482 as_bad (_("Unknown exception: `%s'"), s
);
1486 /* Top level module where instruction parsing starts.
1487 cr16_ins - data structure holds some information.
1488 operands - holds the operands part of the whole instruction. */
1491 parse_insn (ins
*insn
, char *operands
)
1495 /* Handle instructions with no operands. */
1496 for (i
= 0; cr16_no_op_insn
[i
] != NULL
; i
++)
1498 if (streq (cr16_no_op_insn
[i
], instruction
->mnemonic
))
1505 /* Handle 'excp' instructions. */
1506 if (IS_INSN_MNEMONIC ("excp"))
1509 insn
->arg
[0].type
= arg_ic
;
1510 insn
->arg
[0].constant
= gettrap (operands
);
1511 insn
->arg
[0].X_op
= O_constant
;
1515 if (operands
!= NULL
)
1516 parse_operands (insn
, operands
);
1519 /* bCC instruction requires special handling. */
1521 get_b_cc (char * op
)
1526 for (i
= 1; i
< strlen (op
); i
++)
1531 for (i
= 0; i
< cr16_num_cc
; i
++)
1532 if (streq (op1
, cr16_b_cond_tab
[i
]))
1533 return (char *) cr16_b_cond_tab
[i
];
1538 /* bCC instruction requires special handling. */
1540 is_bcc_insn (char * op
)
1542 if (!(streq (op
, "bal") || streq (op
, "beq0b") || streq (op
, "bnq0b")
1543 || streq (op
, "beq0w") || streq (op
, "bnq0w")))
1544 if ((op
[0] == 'b') && (get_b_cc (op
) != NULL
))
1549 /* Cinv instruction requires special handling. */
1552 check_cinv_options (char * operand
)
1555 int i_used
= 0, u_used
= 0, d_used
= 0;
1559 if (*p
== ',' || *p
== ' ')
1569 as_bad (_("Illegal `cinv' parameter: `%c'"), *p
);
1575 /* Retrieve the opcode image of a given register pair.
1576 If the register is illegal for the current instruction,
1580 getregp_image (reg r
)
1582 const reg_entry
*rreg
;
1585 /* Check whether the register is in registers table. */
1587 rreg
= cr16_regptab
+ r
;
1588 /* Register not found. */
1591 as_bad (_("Unknown register pair: `%d'"), r
);
1595 reg_name
= rreg
->name
;
1597 /* Issue a error message when register pair is illegal. */
1598 #define RPAIR_IMAGE_ERR \
1599 as_bad (_("Illegal register pair (`%s') in Instruction: `%s'"), \
1600 reg_name, ins_parse); \
1605 case CR16_RP_REGTYPE
:
1614 /* Retrieve the opcode image of a given index register pair.
1615 If the register is illegal for the current instruction,
1619 getidxregp_image (reg r
)
1621 const reg_entry
*rreg
;
1624 /* Check whether the register is in registers table. */
1626 rreg
= cr16_regptab
+ r
;
1627 /* Register not found. */
1630 as_bad (_("Unknown register pair: `%d'"), r
);
1634 reg_name
= rreg
->name
;
1636 /* Issue a error message when register pair is illegal. */
1637 #define IDX_RPAIR_IMAGE_ERR \
1638 as_bad (_("Illegal index register pair (`%s') in Instruction: `%s'"), \
1639 reg_name, ins_parse); \
1641 if (rreg->type == CR16_RP_REGTYPE)
1643 switch (rreg
->image
)
1645 case 0: return 0; break;
1646 case 2: return 1; break;
1647 case 4: return 2; break;
1648 case 6: return 3; break;
1649 case 8: return 4; break;
1650 case 10: return 5; break;
1651 case 3: return 6; break;
1652 case 5: return 7; break;
1658 IDX_RPAIR_IMAGE_ERR
;
1662 /* Retrieve the opcode image of a given processort register.
1663 If the register is illegal for the current instruction,
1666 getprocreg_image (reg r
)
1668 const reg_entry
*rreg
;
1671 /* Check whether the register is in registers table. */
1673 rreg
= &cr16_pregtab
[r
- MAX_REG
];
1674 /* Register not found. */
1677 as_bad (_("Unknown processor register : `%d'"), r
);
1681 reg_name
= rreg
->name
;
1683 /* Issue a error message when register pair is illegal. */
1684 #define PROCREG_IMAGE_ERR \
1685 as_bad (_("Illegal processor register (`%s') in Instruction: `%s'"), \
1686 reg_name, ins_parse); \
1691 case CR16_P_REGTYPE
:
1700 /* Retrieve the opcode image of a given processort register.
1701 If the register is illegal for the current instruction,
1704 getprocregp_image (reg r
)
1706 const reg_entry
*rreg
;
1708 int pregptab_disp
= 0;
1710 /* Check whether the register is in registers table. */
1716 case 4: pregptab_disp
= 1; break;
1717 case 6: pregptab_disp
= 2; break;
1721 pregptab_disp
= 3; break;
1723 pregptab_disp
= 4; break;
1725 pregptab_disp
= 5; break;
1728 rreg
= &cr16_pregptab
[r
- pregptab_disp
];
1730 /* Register not found. */
1733 as_bad (_("Unknown processor register (32 bit) : `%d'"), r
);
1737 reg_name
= rreg
->name
;
1739 /* Issue a error message when register pair is illegal. */
1740 #define PROCREGP_IMAGE_ERR \
1741 as_bad (_("Illegal 32 bit - processor register (`%s') in Instruction: `%s'"),\
1742 reg_name, ins_parse); \
1747 case CR16_P_REGTYPE
:
1756 /* Routine used to represent integer X using NBITS bits. */
1759 getconstant (long x
, int nbits
)
1761 /* The following expression avoids overflow if
1762 'nbits' is the number of bits in 'bfd_vma'. */
1763 return (x
& ((((1 << (nbits
- 1)) - 1) << 1) | 1));
1766 /* Print a constant value to 'output_opcode':
1767 ARG holds the operand's type and value.
1768 SHIFT represents the location of the operand to be print into.
1769 NBITS determines the size (in bits) of the constant. */
1772 print_constant (int nbits
, int shift
, argument
*arg
)
1774 unsigned long mask
= 0;
1776 long constant
= getconstant (arg
->constant
, nbits
);
1782 /* mask the upper part of the constant, that is, the bits
1783 going to the lowest byte of output_opcode[0].
1784 The upper part of output_opcode[1] is always filled,
1785 therefore it is always masked with 0xFFFF. */
1786 mask
= (1 << (nbits
- 16)) - 1;
1787 /* Divide the constant between two consecutive words :
1789 +---------+---------+---------+---------+
1790 | | X X X X | x X x X | |
1791 +---------+---------+---------+---------+
1792 output_opcode[0] output_opcode[1] */
1794 CR16_PRINT (0, (constant
>> WORD_SHIFT
) & mask
, 0);
1795 CR16_PRINT (1, (constant
& 0xFFFF), WORD_SHIFT
);
1799 if ((nbits
== 21) && (IS_INSN_TYPE (LD_STOR_INS
))) nbits
= 20;
1803 /* mask the upper part of the constant, that is, the bits
1804 going to the lowest byte of output_opcode[0].
1805 The upper part of output_opcode[1] is always filled,
1806 therefore it is always masked with 0xFFFF. */
1807 mask
= (1 << (nbits
- 16)) - 1;
1808 /* Divide the constant between two consecutive words :
1810 +---------+---------+---------+---------+
1811 | | X X X X | - X - X | |
1812 +---------+---------+---------+---------+
1813 output_opcode[0] output_opcode[1] */
1815 if ((instruction
->size
> 2) && (shift
== WORD_SHIFT
))
1817 if (arg
->type
== arg_idxrp
)
1819 CR16_PRINT (0, ((constant
>> WORD_SHIFT
) & mask
) << 8, 0);
1820 CR16_PRINT (1, (constant
& 0xFFFF), WORD_SHIFT
);
1824 CR16_PRINT (0, (((((constant
>> WORD_SHIFT
) & mask
) << 8) & 0x0f00) | ((((constant
>> WORD_SHIFT
) & mask
) >> 4) & 0xf)),0);
1825 CR16_PRINT (1, (constant
& 0xFFFF), WORD_SHIFT
);
1829 CR16_PRINT (0, constant
, shift
);
1833 if (arg
->type
== arg_idxrp
)
1835 if (instruction
->size
== 2)
1837 CR16_PRINT (0, ((constant
) & 0xf), shift
); /* 0-3 bits. */
1838 CR16_PRINT (0, ((constant
>> 4) & 0x3), (shift
+ 20)); /* 4-5 bits. */
1839 CR16_PRINT (0, ((constant
>> 6) & 0x3), (shift
+ 14)); /* 6-7 bits. */
1840 CR16_PRINT (0, ((constant
>> 8) & 0x3f), (shift
+ 8)); /* 8-13 bits. */
1843 CR16_PRINT (0, constant
, shift
);
1849 /* When instruction size is 3 and 'shift' is 16, a 16-bit constant is
1850 always filling the upper part of output_opcode[1]. If we mistakenly
1851 write it to output_opcode[0], the constant prefix (that is, 'match')
1854 +---------+---------+---------+---------+
1855 | 'match' | | X X X X | |
1856 +---------+---------+---------+---------+
1857 output_opcode[0] output_opcode[1] */
1859 if ((instruction
->size
> 2) && (shift
== WORD_SHIFT
))
1860 CR16_PRINT (1, constant
, WORD_SHIFT
);
1862 CR16_PRINT (0, constant
, shift
);
1866 CR16_PRINT (0, ((constant
/ 2) & 0xf), shift
);
1867 CR16_PRINT (0, ((constant
/ 2) >> 4), (shift
+ 8));
1871 CR16_PRINT (0, constant
, shift
);
1876 /* Print an operand to 'output_opcode', which later on will be
1877 printed to the object file:
1878 ARG holds the operand's type, size and value.
1879 SHIFT represents the printing location of operand.
1880 NBITS determines the size (in bits) of a constant operand. */
1883 print_operand (int nbits
, int shift
, argument
*arg
)
1888 CR16_PRINT (0, arg
->cc
, shift
);
1892 CR16_PRINT (0, getreg_image (arg
->r
), shift
);
1896 CR16_PRINT (0, getregp_image (arg
->rp
), shift
);
1900 CR16_PRINT (0, getprocreg_image (arg
->pr
), shift
);
1904 CR16_PRINT (0, getprocregp_image (arg
->prp
), shift
);
1909 +-----------------------------+
1910 | r_index | disp | rp_base |
1911 +-----------------------------+ */
1913 if (instruction
->size
== 3)
1915 CR16_PRINT (0, getidxregp_image (arg
->rp
), 0);
1916 if (getreg_image (arg
->i_r
) == 12)
1917 CR16_PRINT (0, 0, 3);
1919 CR16_PRINT (0, 1, 3);
1923 CR16_PRINT (0, getidxregp_image (arg
->rp
), 16);
1924 if (getreg_image (arg
->i_r
) == 12)
1925 CR16_PRINT (0, 0, 19);
1927 CR16_PRINT (0, 1, 19);
1929 print_constant (nbits
, shift
, arg
);
1933 if (getreg_image (arg
->i_r
) == 12)
1934 if (IS_INSN_MNEMONIC ("cbitb") || IS_INSN_MNEMONIC ("sbitb")
1935 || IS_INSN_MNEMONIC ("tbitb"))
1936 CR16_PRINT (0, 0, 23);
1937 else CR16_PRINT (0, 0, 24);
1939 if (IS_INSN_MNEMONIC ("cbitb") || IS_INSN_MNEMONIC ("sbitb")
1940 || IS_INSN_MNEMONIC ("tbitb"))
1941 CR16_PRINT (0, 1, 23);
1942 else CR16_PRINT (0, 1, 24);
1944 print_constant (nbits
, shift
, arg
);
1949 print_constant (nbits
, shift
, arg
);
1953 CR16_PRINT (0, getreg_image (arg
->r
), shift
);
1957 print_constant (nbits
, shift
, arg
);
1958 /* Add the register argument to the output_opcode. */
1959 CR16_PRINT (0, getreg_image (arg
->r
), (shift
+16));
1963 print_constant (nbits
, shift
, arg
);
1964 if (instruction
->size
> 1)
1965 CR16_PRINT (0, getregp_image (arg
->rp
), (shift
+ 16));
1966 else if (IS_INSN_TYPE (LD_STOR_INS
) || (IS_INSN_TYPE (CSTBIT_INS
)))
1968 if (instruction
->size
== 2)
1969 CR16_PRINT (0, getregp_image (arg
->rp
), (shift
- 8));
1970 else if (instruction
->size
== 1)
1971 CR16_PRINT (0, getregp_image (arg
->rp
), 16);
1974 CR16_PRINT (0, getregp_image (arg
->rp
), shift
);
1982 /* Retrieve the number of operands for the current assembled instruction. */
1985 get_number_of_operands (void)
1989 for (i
= 0; instruction
->operands
[i
].op_type
&& i
< MAX_OPERANDS
; i
++)
1994 /* Verify that the number NUM can be represented in BITS bits (that is,
1995 within its permitted range), based on the instruction's FLAGS.
1996 If UPDATE is nonzero, update the value of NUM if necessary.
1997 Return OP_LEGAL upon success, actual error type upon failure. */
2000 check_range (long *num
, int bits
, int unsigned flags
, int update
)
2003 int retval
= OP_LEGAL
;
2006 if (bits
== 0 && value
> 0) return OP_OUT_OF_RANGE
;
2008 /* For hosts witah longs bigger than 32-bits make sure that the top
2009 bits of a 32-bit negative value read in by the parser are set,
2010 so that the correct comparisons are made. */
2011 if (value
& 0x80000000)
2012 value
|= (-1L << 31);
2015 /* Verify operand value is even. */
2016 if (flags
& OP_EVEN
)
2029 if (flags
& OP_SHIFT
)
2035 else if (flags
& OP_SHIFT_DEC
)
2037 value
= (value
>> 1) - 1;
2042 if (flags
& OP_ABS20
)
2044 if (value
> 0xEFFFF)
2045 return OP_OUT_OF_RANGE
;
2050 if (value
== 0xB || value
== 0x9)
2051 return OP_OUT_OF_RANGE
;
2052 else if (value
== -1)
2060 if (flags
& OP_ESC1
)
2063 return OP_OUT_OF_RANGE
;
2066 if (flags
& OP_SIGNED
)
2068 max
= (1 << (bits
- 1)) - 1;
2069 min
= - (1 << (bits
- 1));
2070 if ((value
> max
) || (value
< min
))
2071 retval
= OP_OUT_OF_RANGE
;
2073 else if (flags
& OP_UNSIGNED
)
2075 max
= ((((1 << (bits
- 1)) - 1) << 1) | 1);
2077 if (((unsigned long) value
> (unsigned long) max
)
2078 || ((unsigned long) value
< (unsigned long) min
))
2079 retval
= OP_OUT_OF_RANGE
;
2081 else if (flags
& OP_NEG
)
2084 min
= - ((1 << (bits
- 1)) - 1);
2085 if ((value
> max
) || (value
< min
))
2086 retval
= OP_OUT_OF_RANGE
;
2091 /* Bunch of error checkings.
2092 The checks are made after a matching instruction was found. */
2095 warn_if_needed (ins
*insn
)
2097 /* If the post-increment address mode is used and the load/store
2098 source register is the same as rbase, the result of the
2099 instruction is undefined. */
2100 if (IS_INSN_TYPE (LD_STOR_INS_INC
))
2102 /* Enough to verify that one of the arguments is a simple reg. */
2103 if ((insn
->arg
[0].type
== arg_r
) || (insn
->arg
[1].type
== arg_r
))
2104 if (insn
->arg
[0].r
== insn
->arg
[1].r
)
2105 as_bad (_("Same src/dest register is used (`r%d'), result is undefined"), insn
->arg
[0].r
);
2108 if (IS_INSN_MNEMONIC ("pop")
2109 || IS_INSN_MNEMONIC ("push")
2110 || IS_INSN_MNEMONIC ("popret"))
2112 unsigned int count
= insn
->arg
[0].constant
, reg_val
;
2114 /* Check if count operand caused to save/retrive the RA twice
2115 to generate warning message. */
2116 if (insn
->nargs
> 2)
2118 reg_val
= getreg_image (insn
->arg
[1].r
);
2120 if ( ((reg_val
== 9) && (count
> 7))
2121 || ((reg_val
== 10) && (count
> 6))
2122 || ((reg_val
== 11) && (count
> 5))
2123 || ((reg_val
== 12) && (count
> 4))
2124 || ((reg_val
== 13) && (count
> 2))
2125 || ((reg_val
== 14) && (count
> 0)))
2126 as_warn (_("RA register is saved twice."));
2128 /* Check if the third operand is "RA" or "ra" */
2129 if (!(((insn
->arg
[2].r
) == ra
) || ((insn
->arg
[2].r
) == RA
)))
2130 as_bad (_("`%s' Illegal use of registers."), ins_parse
);
2133 if (insn
->nargs
> 1)
2135 reg_val
= getreg_image (insn
->arg
[1].r
);
2137 /* If register is a register pair ie r12/r13/r14 in operand1, then
2138 the count constant should be validated. */
2139 if (((reg_val
== 11) && (count
> 7))
2140 || ((reg_val
== 12) && (count
> 6))
2141 || ((reg_val
== 13) && (count
> 4))
2142 || ((reg_val
== 14) && (count
> 2))
2143 || ((reg_val
== 15) && (count
> 0)))
2144 as_bad (_("`%s' Illegal count-register combination."), ins_parse
);
2148 /* Check if the operand is "RA" or "ra" */
2149 if (!(((insn
->arg
[0].r
) == ra
) || ((insn
->arg
[0].r
) == RA
)))
2150 as_bad (_("`%s' Illegal use of register."), ins_parse
);
2154 /* Some instruction assume the stack pointer as rptr operand.
2155 Issue an error when the register to be loaded is also SP. */
2156 if (instruction
->flags
& NO_SP
)
2158 if (getreg_image (insn
->arg
[1].r
) == getreg_image (sp
))
2159 as_bad (_("`%s' has undefined result"), ins_parse
);
2162 /* If the rptr register is specified as one of the registers to be loaded,
2163 the final contents of rptr are undefined. Thus, we issue an error. */
2164 if (instruction
->flags
& NO_RPTR
)
2166 if ((1 << getreg_image (insn
->arg
[0].r
)) & insn
->arg
[1].constant
)
2167 as_bad (_("Same src/dest register is used (`r%d'),result is undefined"),
2168 getreg_image (insn
->arg
[0].r
));
2172 /* In some cases, we need to adjust the instruction pointer although a
2173 match was already found. Here, we gather all these cases.
2174 Returns 1 if instruction pointer was adjusted, otherwise 0. */
2177 adjust_if_needed (ins
*insn ATTRIBUTE_UNUSED
)
2181 if ((IS_INSN_TYPE (CSTBIT_INS
)) || (IS_INSN_TYPE (LD_STOR_INS
)))
2183 if ((instruction
->operands
[0].op_type
== abs24
)
2184 && ((insn
->arg
[0].constant
) > 0xF00000))
2186 insn
->arg
[0].constant
&= 0xFFFFF;
2195 /* Assemble a single instruction:
2196 INSN is already parsed (that is, all operand values and types are set).
2197 For instruction to be assembled, we need to find an appropriate template in
2198 the instruction table, meeting the following conditions:
2199 1: Has the same number of operands.
2200 2: Has the same operand types.
2201 3: Each operand size is sufficient to represent the instruction's values.
2202 Returns 1 upon success, 0 upon failure. */
2205 assemble_insn (char *mnemonic
, ins
*insn
)
2207 /* Type of each operand in the current template. */
2208 argtype cur_type
[MAX_OPERANDS
];
2209 /* Size (in bits) of each operand in the current template. */
2210 unsigned int cur_size
[MAX_OPERANDS
];
2211 /* Flags of each operand in the current template. */
2212 unsigned int cur_flags
[MAX_OPERANDS
];
2213 /* Instruction type to match. */
2214 unsigned int ins_type
;
2215 /* Boolean flag to mark whether a match was found. */
2218 /* Nonzero if an instruction with same number of operands was found. */
2219 int found_same_number_of_operands
= 0;
2220 /* Nonzero if an instruction with same argument types was found. */
2221 int found_same_argument_types
= 0;
2222 /* Nonzero if a constant was found within the required range. */
2223 int found_const_within_range
= 0;
2224 /* Argument number of an operand with invalid type. */
2225 int invalid_optype
= -1;
2226 /* Argument number of an operand with invalid constant value. */
2227 int invalid_const
= -1;
2228 /* Operand error (used for issuing various constant error messages). */
2229 op_err op_error
, const_err
= OP_LEGAL
;
2231 /* Retrieve data (based on FUNC) for each operand of a given instruction. */
2232 #define GET_CURRENT_DATA(FUNC, ARRAY) \
2233 for (i = 0; i < insn->nargs; i++) \
2234 ARRAY[i] = FUNC (instruction->operands[i].op_type)
2236 #define GET_CURRENT_TYPE GET_CURRENT_DATA (get_optype, cur_type)
2237 #define GET_CURRENT_SIZE GET_CURRENT_DATA (get_opbits, cur_size)
2238 #define GET_CURRENT_FLAGS GET_CURRENT_DATA (get_opflags, cur_flags)
2240 /* Instruction has no operands -> only copy the constant opcode. */
2241 if (insn
->nargs
== 0)
2243 output_opcode
[0] = BIN (instruction
->match
, instruction
->match_bits
);
2247 /* In some case, same mnemonic can appear with different instruction types.
2248 For example, 'storb' is supported with 3 different types :
2249 LD_STOR_INS, LD_STOR_INS_INC, STOR_IMM_INS.
2250 We assume that when reaching this point, the instruction type was
2251 pre-determined. We need to make sure that the type stays the same
2252 during a search for matching instruction. */
2253 ins_type
= CR16_INS_TYPE (instruction
->flags
);
2255 while (/* Check that match is still not found. */
2257 /* Check we didn't get to end of table. */
2258 && instruction
->mnemonic
!= NULL
2259 /* Check that the actual mnemonic is still available. */
2260 && IS_INSN_MNEMONIC (mnemonic
)
2261 /* Check that the instruction type wasn't changed. */
2262 && IS_INSN_TYPE (ins_type
))
2264 /* Check whether number of arguments is legal. */
2265 if (get_number_of_operands () != insn
->nargs
)
2267 found_same_number_of_operands
= 1;
2269 /* Initialize arrays with data of each operand in current template. */
2274 /* Check for type compatibility. */
2275 for (i
= 0; i
< insn
->nargs
; i
++)
2277 if (cur_type
[i
] != insn
->arg
[i
].type
)
2279 if (invalid_optype
== -1)
2280 invalid_optype
= i
+ 1;
2284 found_same_argument_types
= 1;
2286 for (i
= 0; i
< insn
->nargs
; i
++)
2288 /* If 'bal' instruction size is '2' and reg operand is not 'ra'
2289 then goto next instruction. */
2290 if (IS_INSN_MNEMONIC ("bal") && (i
== 0)
2291 && (instruction
->size
== 2) && (insn
->arg
[i
].rp
!= 14))
2294 /* If 'storb' instruction with 'sp' reg and 16-bit disp of
2295 * reg-pair, leads to undifined trap, so this should use
2296 * 20-bit disp of reg-pair. */
2297 if (IS_INSN_MNEMONIC ("storb") && (instruction
->size
== 2)
2298 && (insn
->arg
[i
].r
== 15) && (insn
->arg
[i
+ 1].type
== arg_crp
))
2301 /* Only check range - don't update the constant's value, since the
2302 current instruction may not be the last we try to match.
2303 The constant's value will be updated later, right before printing
2304 it to the object file. */
2305 if ((insn
->arg
[i
].X_op
== O_constant
)
2306 && (op_error
= check_range (&insn
->arg
[i
].constant
, cur_size
[i
],
2309 if (invalid_const
== -1)
2311 invalid_const
= i
+ 1;
2312 const_err
= op_error
;
2316 /* For symbols, we make sure the relocation size (which was already
2317 determined) is sufficient. */
2318 else if ((insn
->arg
[i
].X_op
== O_symbol
)
2319 && ((bfd_reloc_type_lookup (stdoutput
, insn
->rtype
))->bitsize
2323 found_const_within_range
= 1;
2325 /* If we got till here -> Full match is found. */
2329 /* Try again with next instruction. */
2336 /* We haven't found a match - instruction can't be assembled. */
2337 if (!found_same_number_of_operands
)
2338 as_bad (_("Incorrect number of operands"));
2339 else if (!found_same_argument_types
)
2340 as_bad (_("Illegal type of operand (arg %d)"), invalid_optype
);
2341 else if (!found_const_within_range
)
2345 case OP_OUT_OF_RANGE
:
2346 as_bad (_("Operand out of range (arg %d)"), invalid_const
);
2349 as_bad (_("Operand has odd displacement (arg %d)"), invalid_const
);
2352 as_bad (_("Illegal operand (arg %d)"), invalid_const
);
2360 /* Full match - print the encoding to output file. */
2362 /* Make further checkings (such that couldn't be made earlier).
2363 Warn the user if necessary. */
2364 warn_if_needed (insn
);
2366 /* Check whether we need to adjust the instruction pointer. */
2367 if (adjust_if_needed (insn
))
2368 /* If instruction pointer was adjusted, we need to update
2369 the size of the current template operands. */
2372 for (i
= 0; i
< insn
->nargs
; i
++)
2374 int j
= instruction
->flags
& REVERSE_MATCH
?
2379 /* This time, update constant value before printing it. */
2380 if ((insn
->arg
[j
].X_op
== O_constant
)
2381 && (check_range (&insn
->arg
[j
].constant
, cur_size
[j
],
2382 cur_flags
[j
], 1) != OP_LEGAL
))
2383 as_fatal (_("Illegal operand (arg %d)"), j
+1);
2386 /* First, copy the instruction's opcode. */
2387 output_opcode
[0] = BIN (instruction
->match
, instruction
->match_bits
);
2389 for (i
= 0; i
< insn
->nargs
; i
++)
2391 /* For BAL (ra),disp17 instuction only. And also set the
2392 DISP24a relocation type. */
2393 if (IS_INSN_MNEMONIC ("bal") && (instruction
->size
== 2) && i
== 0)
2395 insn
->rtype
= BFD_RELOC_CR16_DISP24a
;
2399 print_operand (cur_size
[i
], instruction
->operands
[i
].shift
,
2407 /* Print the instruction.
2408 Handle also cases where the instruction is relaxable/relocatable. */
2411 print_insn (ins
*insn
)
2413 unsigned int i
, j
, insn_size
;
2415 unsigned short words
[4];
2418 /* Arrange the insn encodings in a WORD size array. */
2419 for (i
= 0, j
= 0; i
< 2; i
++)
2421 words
[j
++] = (output_opcode
[i
] >> 16) & 0xFFFF;
2422 words
[j
++] = output_opcode
[i
] & 0xFFFF;
2425 /* Handle relocation. */
2426 if ((instruction
->flags
& RELAXABLE
) && relocatable
)
2429 /* Write the maximal instruction size supported. */
2430 insn_size
= INSN_MAX_SIZE
;
2432 if (IS_INSN_TYPE (BRANCH_INS
))
2434 switch (insn
->rtype
)
2436 case BFD_RELOC_CR16_DISP24
:
2439 case BFD_RELOC_CR16_DISP16
:
2450 this_frag
= frag_var (rs_machine_dependent
, insn_size
*2,
2452 insn
->exp
.X_add_symbol
,
2458 insn_size
= instruction
->size
;
2459 this_frag
= frag_more (insn_size
* 2);
2461 if ((relocatable
) && (insn
->rtype
!= BFD_RELOC_NONE
))
2463 reloc_howto_type
*reloc_howto
;
2466 reloc_howto
= bfd_reloc_type_lookup (stdoutput
, insn
->rtype
);
2471 size
= bfd_get_reloc_size (reloc_howto
);
2473 if (size
< 1 || size
> 4)
2476 fix_new_exp (frag_now
, this_frag
- frag_now
->fr_literal
,
2477 size
, &insn
->exp
, reloc_howto
->pc_relative
,
2482 /* Verify a 2-byte code alignment. */
2483 addr_mod
= frag_now_fix () & 1;
2484 if (frag_now
->has_code
&& frag_now
->insn_addr
!= addr_mod
)
2485 as_bad (_("instruction address is not a multiple of 2"));
2486 frag_now
->insn_addr
= addr_mod
;
2487 frag_now
->has_code
= 1;
2489 /* Write the instruction encoding to frag. */
2490 for (i
= 0; i
< insn_size
; i
++)
2492 md_number_to_chars (this_frag
, (valueT
) words
[i
], 2);
2497 /* This is the guts of the machine-dependent assembler. OP points to a
2498 machine dependent instruction. This function is supposed to emit
2499 the frags/bytes it assembles to. */
2502 md_assemble (char *op
)
2505 char *param
, param1
[32];
2508 /* Reset global variables for a new instruction. */
2511 /* Strip the mnemonic. */
2512 for (param
= op
; *param
!= 0 && !ISSPACE (*param
); param
++)
2517 /* bCC instuctions and adjust the mnemonic by adding extra white spaces. */
2518 if (is_bcc_insn (op
))
2520 strcpy (param1
, get_b_cc (op
));
2522 strcat (param1
,",");
2523 strcat (param1
, param
);
2524 param
= (char *) ¶m1
;
2527 /* Checking the cinv options and adjust the mnemonic by removing the
2528 extra white spaces. */
2529 if (streq ("cinv", op
))
2531 /* Validate the cinv options. */
2532 check_cinv_options (param
);
2536 /* MAPPING - SHIFT INSN, if imm4/imm16 positive values
2537 lsh[b/w] imm4/imm6, reg ==> ashu[b/w] imm4/imm16, reg
2538 as CR16 core doesn't support lsh[b/w] right shift operaions. */
2539 if ((streq ("lshb", op
) || streq ("lshw", op
) || streq ("lshd", op
))
2540 && (param
[0] == '$'))
2542 strcpy (param1
, param
);
2543 /* Find the instruction. */
2544 instruction
= (const inst
*) hash_find (cr16_inst_hash
, op
);
2545 parse_operands (&cr16_ins
, param1
);
2546 if (((&cr16_ins
)->arg
[0].type
== arg_ic
)
2547 && ((&cr16_ins
)->arg
[0].constant
>= 0))
2549 if (streq ("lshb", op
))
2551 else if (streq ("lshd", op
))
2558 /* Find the instruction. */
2559 instruction
= (const inst
*) hash_find (cr16_inst_hash
, op
);
2560 if (instruction
== NULL
)
2562 as_bad (_("Unknown opcode: `%s'"), op
);
2566 /* Tie dwarf2 debug info to the address at the start of the insn. */
2567 dwarf2_emit_insn (0);
2569 /* Parse the instruction's operands. */
2570 parse_insn (&cr16_ins
, param
);
2572 /* Assemble the instruction - return upon failure. */
2573 if (assemble_insn (op
, &cr16_ins
) == 0)
2576 /* Print the instruction. */
2577 print_insn (&cr16_ins
);