]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gas/config/tc-cr16.c
opcodes/
[thirdparty/binutils-gdb.git] / gas / config / tc-cr16.c
CommitLineData
3d3d428f
NC
1/* tc-cr16.c -- Assembler code for the CR16 CPU core.
2 Copyright 2007 Free Software Foundation, Inc.
3
4 Contributed by M R Swami Reddy <MR.Swami.Reddy@nsc.com>
5
6 This file is part of GAS, the GNU Assembler.
7
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
ec2655a6 10 the Free Software Foundation; either version 3, or (at your option)
3d3d428f
NC
11 any later version.
12
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.
17
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. */
22
23#include "as.h"
24#include "safe-ctype.h"
25#include "dwarf2dbg.h"
26#include "opcode/cr16.h"
27#include "elf/cr16.h"
28
29
30/* Word is considered here as a 16-bit unsigned short int. */
31#define WORD_SHIFT 16
32
33/* Register is 2-byte size. */
34#define REG_SIZE 2
35
36/* Maximum size of a single instruction (in words). */
37#define INSN_MAX_SIZE 3
38
39/* Maximum bits which may be set in a `mask16' operand. */
40#define MAX_REGS_IN_MASK16 8
41
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)
45
46/* Operand errors. */
47typedef enum
48 {
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. */
52 }
53op_err;
54
55/* Opcode mnemonics hash table. */
56static struct hash_control *cr16_inst_hash;
57/* CR16 registers hash table. */
58static struct hash_control *reg_hash;
59/* CR16 register pair hash table. */
60static struct hash_control *regp_hash;
61/* CR16 processor registers hash table. */
62static struct hash_control *preg_hash;
63/* CR16 processor registers 32 bit hash table. */
64static struct hash_control *pregp_hash;
65/* Current instruction we're assembling. */
66const inst *instruction;
67
68
69static int code_label = 0;
70
71/* Global variables. */
72
73/* Array to hold an instruction encoding. */
74long output_opcode[2];
75
76/* Nonzero means a relocatable symbol. */
77int relocatable;
78
79/* A copy of the original instruction (used in error messages). */
80char ins_parse[MAX_INST_LEN];
81
82/* The current processed argument number. */
83int cur_arg_num;
84
85/* Generic assembler global variables which must be defined by all targets. */
86
87/* Characters which always start a comment. */
88const char comment_chars[] = "#";
89
90/* Characters which start a comment at the beginning of a line. */
91const char line_comment_chars[] = "#";
92
93/* This array holds machine specific line separator characters. */
94const char line_separator_chars[] = ";";
95
96/* Chars that can be used to separate mant from exp in floating point nums. */
97const char EXP_CHARS[] = "eE";
98
99/* Chars that mean this number is a floating point constant as in 0f12.456 */
100const char FLT_CHARS[] = "f'";
101
102/* Target-specific multicharacter options, not const-declared at usage. */
103const char *md_shortopts = "";
104struct option md_longopts[] =
105{
106 {NULL, no_argument, NULL, 0}
107};
108size_t md_longopts_size = sizeof (md_longopts);
109
110static void
111l_cons (int nbytes)
112{
113 int c;
114 expressionS exp;
115
116#ifdef md_flush_pending_output
117 md_flush_pending_output ();
118#endif
119
120 if (is_it_end_of_statement ())
121 {
122 demand_empty_rest_of_line ();
123 return;
124 }
125
126#ifdef TC_ADDRESS_BYTES
127 if (nbytes == 0)
128 nbytes = TC_ADDRESS_BYTES ();
129#endif
130
131#ifdef md_cons_align
132 md_cons_align (nbytes);
133#endif
134
135 c = 0;
136 do
137 {
138 unsigned int bits_available = BITS_PER_CHAR * nbytes;
139 char *hold = input_line_pointer;
140
141 expression (&exp);
142
143 if (*input_line_pointer == ':')
7fac7ff4
NC
144 {
145 /* Bitfields. */
146 long value = 0;
147
148 for (;;)
149 {
150 unsigned long width;
151
152 if (*input_line_pointer != ':')
153 {
154 input_line_pointer = hold;
155 break;
156 }
157 if (exp.X_op == O_absent)
158 {
159 as_warn (_("using a bit field width of zero"));
160 exp.X_add_number = 0;
161 exp.X_op = O_constant;
162 }
163
164 if (exp.X_op != O_constant)
165 {
166 *input_line_pointer = '\0';
167 as_bad (_("field width \"%s\" too complex for a bitfield"), hold);
168 *input_line_pointer = ':';
169 demand_empty_rest_of_line ();
170 return;
171 }
172
173 if ((width = exp.X_add_number) >
174 (unsigned int)(BITS_PER_CHAR * nbytes))
175 {
176 as_warn (_("field width %lu too big to fit in %d bytes: truncated to %d bits"), width, nbytes, (BITS_PER_CHAR * nbytes));
177 width = BITS_PER_CHAR * nbytes;
178 } /* Too big. */
179
180
181 if (width > bits_available)
182 {
183 /* FIXME-SOMEDAY: backing up and reparsing is wasteful. */
184 input_line_pointer = hold;
185 exp.X_add_number = value;
186 break;
187 }
188
189 /* Skip ':'. */
190 hold = ++input_line_pointer;
191
192 expression (&exp);
193 if (exp.X_op != O_constant)
194 {
195 char cache = *input_line_pointer;
196
197 *input_line_pointer = '\0';
198 as_bad (_("field value \"%s\" too complex for a bitfield"), hold);
199 *input_line_pointer = cache;
200 demand_empty_rest_of_line ();
201 return;
202 }
203
204 value |= ((~(-1 << width) & exp.X_add_number)
205 << ((BITS_PER_CHAR * nbytes) - bits_available));
206
207 if ((bits_available -= width) == 0
208 || is_it_end_of_statement ()
209 || *input_line_pointer != ',')
210 break;
211
212 hold = ++input_line_pointer;
213 expression (&exp);
214 }
215
216 exp.X_add_number = value;
217 exp.X_op = O_constant;
218 exp.X_unsigned = 1;
219 }
3d3d428f
NC
220
221 if ((*(input_line_pointer) == '@') && (*(input_line_pointer +1) == 'c'))
7fac7ff4 222 code_label = 1;
3d3d428f
NC
223 emit_expr (&exp, (unsigned int) nbytes);
224 ++c;
225 if ((*(input_line_pointer) == '@') && (*(input_line_pointer +1) == 'c'))
7fac7ff4
NC
226 {
227 input_line_pointer +=3;
228 break;
229 }
3d3d428f
NC
230 }
231 while ((*input_line_pointer++ == ','));
232
233 /* Put terminator back into stream. */
234 input_line_pointer--;
235
236 demand_empty_rest_of_line ();
237}
238
239
240/* This table describes all the machine specific pseudo-ops
241 the assembler has to support. The fields are:
242 *** Pseudo-op name without dot.
243 *** Function to call to execute this pseudo-op.
244 *** Integer arg to pass to the function. */
245
246const pseudo_typeS md_pseudo_table[] =
247{
248 /* In CR16 machine, align is in bytes (not a ptwo boundary). */
249 {"align", s_align_bytes, 0},
250 {"long", l_cons, 4 },
251 {0, 0, 0}
252};
253
254/* CR16 relaxation table. */
255const relax_typeS md_relax_table[] =
256{
257 /* bCC */
e9deb29d 258 {0x7f, -0x80, 2, 1}, /* 8 */
3d3d428f
NC
259 {0xfffe, -0x10000, 4, 2}, /* 16 */
260 {0xfffffe, -0x1000000, 6, 0}, /* 24 */
261};
262
263/* Return the bit size for a given operand. */
264
265static int
266get_opbits (operand_type op)
267{
268 if (op < MAX_OPRD)
269 return cr16_optab[op].bit_size;
270
271 return 0;
272}
273
274/* Return the argument type of a given operand. */
275
276static argtype
277get_optype (operand_type op)
278{
279 if (op < MAX_OPRD)
280 return cr16_optab[op].arg_type;
281 else
282 return nullargs;
283}
284
285/* Return the flags of a given operand. */
286
287static int
288get_opflags (operand_type op)
289{
290 if (op < MAX_OPRD)
291 return cr16_optab[op].flags;
292
293 return 0;
294}
295
296/* Get the cc code. */
297
298static int
299get_cc (char *cc_name)
300{
301 unsigned int i;
302
303 for (i = 0; i < cr16_num_cc; i++)
304 if (strcmp (cc_name, cr16_b_cond_tab[i]) == 0)
305 return i;
306
307 return -1;
308}
309
310/* Get the core processor register 'reg_name'. */
311
312static reg
313get_register (char *reg_name)
314{
315 const reg_entry *reg;
316
317 reg = (const reg_entry *) hash_find (reg_hash, reg_name);
318
319 if (reg != NULL)
320 return reg->value.reg_val;
321
322 return nullregister;
323}
324/* Get the core processor register-pair 'reg_name'. */
325
326static reg
327get_register_pair (char *reg_name)
328{
329 const reg_entry *reg;
330 char tmp_rp[16]="\0";
331
332 /* Add '(' and ')' to the reg pair, if its not present. */
333 if (reg_name[0] != '(')
334 {
335 tmp_rp[0] = '(';
336 strcat (tmp_rp, reg_name);
337 strcat (tmp_rp,")");
338 reg = (const reg_entry *) hash_find (regp_hash, tmp_rp);
339 }
340 else
341 reg = (const reg_entry *) hash_find (regp_hash, reg_name);
342
343 if (reg != NULL)
344 return reg->value.reg_val;
345
346 return nullregister;
347}
348
349/* Get the index register 'reg_name'. */
350
351static reg
352get_index_register (char *reg_name)
353{
354 const reg_entry *reg;
355
356 reg = (const reg_entry *) hash_find (reg_hash, reg_name);
357
358 if ((reg != NULL)
359 && ((reg->value.reg_val == 12) || (reg->value.reg_val == 13)))
360 return reg->value.reg_val;
361
362 return nullregister;
363}
364/* Get the core processor index register-pair 'reg_name'. */
365
366static reg
367get_index_register_pair (char *reg_name)
368{
369 const reg_entry *reg;
370
371 reg = (const reg_entry *) hash_find (regp_hash, reg_name);
372
373 if (reg != NULL)
374 {
375 if ((reg->value.reg_val != 1) || (reg->value.reg_val != 7)
7fac7ff4
NC
376 || (reg->value.reg_val != 9) || (reg->value.reg_val > 10))
377 return reg->value.reg_val;
3d3d428f
NC
378
379 as_bad (_("Unknown register pair - index relative mode: `%d'"), reg->value.reg_val);
380 }
381
382 return nullregister;
383}
384
385/* Get the processor register 'preg_name'. */
386
387static preg
388get_pregister (char *preg_name)
389{
390 const reg_entry *preg;
391
392 preg = (const reg_entry *) hash_find (preg_hash, preg_name);
393
394 if (preg != NULL)
395 return preg->value.preg_val;
396
397 return nullpregister;
398}
399
400/* Get the processor register 'preg_name 32 bit'. */
401
402static preg
403get_pregisterp (char *preg_name)
404{
405 const reg_entry *preg;
406
407 preg = (const reg_entry *) hash_find (pregp_hash, preg_name);
408
409 if (preg != NULL)
410 return preg->value.preg_val;
411
412 return nullpregister;
413}
414
415
416/* Round up a section size to the appropriate boundary. */
417
418valueT
419md_section_align (segT seg, valueT val)
420{
421 /* Round .text section to a multiple of 2. */
422 if (seg == text_section)
423 return (val + 1) & ~1;
424 return val;
425}
426
427/* Parse an operand that is machine-specific (remove '*'). */
428
429void
430md_operand (expressionS * exp)
431{
432 char c = *input_line_pointer;
433
434 switch (c)
435 {
436 case '*':
437 input_line_pointer++;
438 expression (exp);
439 break;
440 default:
441 break;
442 }
443}
444
445/* Reset global variables before parsing a new instruction. */
446
447static void
448reset_vars (char *op)
449{
450 cur_arg_num = relocatable = 0;
451 memset (& output_opcode, '\0', sizeof (output_opcode));
452
453 /* Save a copy of the original OP (used in error messages). */
454 strncpy (ins_parse, op, sizeof ins_parse - 1);
455 ins_parse [sizeof ins_parse - 1] = 0;
456}
457
458/* This macro decides whether a particular reloc is an entry in a
459 switch table. It is used when relaxing, because the linker needs
460 to know about all such entries so that it can adjust them if
461 necessary. */
462
463#define SWITCH_TABLE(fix) \
464 ( (fix)->fx_addsy != NULL \
465 && (fix)->fx_subsy != NULL \
466 && S_GET_SEGMENT ((fix)->fx_addsy) == \
467 S_GET_SEGMENT ((fix)->fx_subsy) \
468 && S_GET_SEGMENT (fix->fx_addsy) != undefined_section \
469 && ( (fix)->fx_r_type == BFD_RELOC_CR16_NUM8 \
470 || (fix)->fx_r_type == BFD_RELOC_CR16_NUM16 \
471 || (fix)->fx_r_type == BFD_RELOC_CR16_NUM32 \
472 || (fix)->fx_r_type == BFD_RELOC_CR16_NUM32a))
473
474/* See whether we need to force a relocation into the output file.
475 This is used to force out switch and PC relative relocations when
476 relaxing. */
477
478int
479cr16_force_relocation (fixS *fix)
480{
7fac7ff4 481 if (generic_force_reloc (fix) || SWITCH_TABLE (fix))
3d3d428f
NC
482 return 1;
483
484 return 0;
485}
486
487/* Record a fixup for a cons expression. */
488
489void
490cr16_cons_fix_new (fragS *frag, int offset, int len, expressionS *exp)
491{
492 int rtype;
493 switch (len)
494 {
495 default: rtype = BFD_RELOC_NONE; break;
496 case 1: rtype = BFD_RELOC_CR16_NUM8 ; break;
497 case 2: rtype = BFD_RELOC_CR16_NUM16; break;
498 case 4:
499 if (code_label)
7fac7ff4
NC
500 {
501 rtype = BFD_RELOC_CR16_NUM32a;
502 code_label = 0;
503 }
3d3d428f 504 else
7fac7ff4 505 rtype = BFD_RELOC_CR16_NUM32;
3d3d428f
NC
506 break;
507 }
508
509 fix_new_exp (frag, offset, len, exp, 0, rtype);
510}
511
512/* Generate a relocation entry for a fixup. */
513
514arelent *
515tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS * fixP)
516{
517 arelent * reloc;
518
519 reloc = xmalloc (sizeof (arelent));
520 reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
521 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy);
522 reloc->address = fixP->fx_frag->fr_address + fixP->fx_where;
523 reloc->addend = fixP->fx_offset;
524
525 if (fixP->fx_subsy != NULL)
526 {
527 if (SWITCH_TABLE (fixP))
528 {
529 /* Keep the current difference in the addend. */
530 reloc->addend = (S_GET_VALUE (fixP->fx_addsy)
531 - S_GET_VALUE (fixP->fx_subsy) + fixP->fx_offset);
532
533 switch (fixP->fx_r_type)
534 {
7fac7ff4
NC
535 case BFD_RELOC_CR16_NUM8:
536 fixP->fx_r_type = BFD_RELOC_CR16_SWITCH8;
537 break;
538 case BFD_RELOC_CR16_NUM16:
539 fixP->fx_r_type = BFD_RELOC_CR16_SWITCH16;
540 break;
541 case BFD_RELOC_CR16_NUM32:
542 fixP->fx_r_type = BFD_RELOC_CR16_SWITCH32;
543 break;
544 case BFD_RELOC_CR16_NUM32a:
545 fixP->fx_r_type = BFD_RELOC_CR16_NUM32a;
546 break;
547 default:
548 abort ();
549 break;
3d3d428f
NC
550 }
551 }
552 else
553 {
554 /* We only resolve difference expressions in the same section. */
555 as_bad_where (fixP->fx_file, fixP->fx_line,
556 _("can't resolve `%s' {%s section} - `%s' {%s section}"),
557 fixP->fx_addsy ? S_GET_NAME (fixP->fx_addsy) : "0",
558 segment_name (fixP->fx_addsy
559 ? S_GET_SEGMENT (fixP->fx_addsy)
560 : absolute_section),
561 S_GET_NAME (fixP->fx_subsy),
562 segment_name (S_GET_SEGMENT (fixP->fx_addsy)));
563 }
564 }
565
566 assert ((int) fixP->fx_r_type > 0);
567 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
568
569 if (reloc->howto == NULL)
570 {
571 as_bad_where (fixP->fx_file, fixP->fx_line,
572 _("internal error: reloc %d (`%s') not supported by object file format"),
573 fixP->fx_r_type,
574 bfd_get_reloc_code_name (fixP->fx_r_type));
575 return NULL;
576 }
577 assert (!fixP->fx_pcrel == !reloc->howto->pc_relative);
578
579 return reloc;
580}
581
582/* Prepare machine-dependent frags for relaxation. */
583
584int
585md_estimate_size_before_relax (fragS *fragp, asection *seg)
586{
587 /* If symbol is undefined or located in a different section,
588 select the largest supported relocation. */
589 relax_substateT subtype;
590 relax_substateT rlx_state[] = {0, 2};
591
592 for (subtype = 0; subtype < ARRAY_SIZE (rlx_state); subtype += 2)
593 {
594 if (fragp->fr_subtype == rlx_state[subtype]
595 && (!S_IS_DEFINED (fragp->fr_symbol)
596 || seg != S_GET_SEGMENT (fragp->fr_symbol)))
597 {
598 fragp->fr_subtype = rlx_state[subtype + 1];
599 break;
600 }
601 }
602
603 if (fragp->fr_subtype >= ARRAY_SIZE (md_relax_table))
604 abort ();
605
606 return md_relax_table[fragp->fr_subtype].rlx_length;
607}
608
609void
610md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, fragS *fragP)
611{
612 /* 'opcode' points to the start of the instruction, whether
613 we need to change the instruction's fixed encoding. */
7fac7ff4
NC
614 char *opcode = fragP->fr_literal + fragP->fr_fix;
615 bfd_reloc_code_real_type reloc;
3d3d428f
NC
616
617 subseg_change (sec, 0);
618
7fac7ff4
NC
619 switch (fragP->fr_subtype)
620 {
621 case 0:
622 reloc = BFD_RELOC_CR16_DISP8;
623 break;
624 case 1:
625 /* If the subtype is not changed due to :m operand qualifier,
626 then no need to update the opcode value. */
627 if ((int)opcode[1] != 0x18)
628 {
629 opcode[0] = (opcode[0] & 0xf0);
630 opcode[1] = 0x18;
631 }
632 reloc = BFD_RELOC_CR16_DISP16;
633 break;
634 case 2:
635 /* If the subtype is not changed due to :l operand qualifier,
636 then no need to update the opcode value. */
637 if ((int)opcode[1] != 0)
638 {
639 opcode[2] = opcode[0];
640 opcode[0] = opcode[1];
641 opcode[1] = 0x0;
642 }
643 reloc = BFD_RELOC_CR16_DISP24;
644 break;
645 default:
646 abort();
647 }
648
3d3d428f
NC
649 fix_new (fragP, fragP->fr_fix,
650 bfd_get_reloc_size (bfd_reloc_type_lookup (stdoutput, reloc)),
651 fragP->fr_symbol, fragP->fr_offset, 1, reloc);
652 fragP->fr_var = 0;
653 fragP->fr_fix += md_relax_table[fragP->fr_subtype].rlx_length;
654}
655
656/* Process machine-dependent command line options. Called once for
657 each option on the command line that the machine-independent part of
658 GAS does not understand. */
659
660int
661md_parse_option (int c ATTRIBUTE_UNUSED, char *arg ATTRIBUTE_UNUSED)
662{
663 return 0;
664}
665
666/* Machine-dependent usage-output. */
667
668void
669md_show_usage (FILE *stream ATTRIBUTE_UNUSED)
670{
671 return;
672}
673
674/* Turn a string in input_line_pointer into a floating point constant
675 of type TYPE, and store the appropriate bytes in *LITP. The number
676 of LITTLENUMS emitted is stored in *SIZEP. An error message is
677 returned, or NULL on OK. */
678
679char *
680md_atof (int type, char *litP, int *sizeP)
681{
682 int prec;
683 int i;
684 LITTLENUM_TYPE words[4];
685 char *t;
686
687 switch (type)
688 {
689 case 'f':
690 prec = 2;
691 break;
692
693 case 'd':
694 prec = 4;
695 break;
696
697 default:
698 *sizeP = 0;
699 return _("bad call to md_atof");
700 }
701
702 t = atof_ieee (input_line_pointer, type, words);
703 if (t)
704 input_line_pointer = t;
705
706 *sizeP = prec * 2;
707
708 if (! target_big_endian)
709 {
710 for (i = prec - 1; i >= 0; i--)
711 {
712 md_number_to_chars (litP, (valueT) words[i], 2);
713 litP += 2;
714 }
715 }
716 else
717 {
718 for (i = 0; i < prec; i++)
719 {
720 md_number_to_chars (litP, (valueT) words[i], 2);
721 litP += 2;
722 }
723 }
724
725 return NULL;
726}
727
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. */
733
734void
735md_apply_fix (fixS *fixP, valueT *valP, segT seg)
736{
737 valueT val = * valP;
738 char *buf = fixP->fx_frag->fr_literal + fixP->fx_where;
739 fixP->fx_offset = 0;
740
741 switch (fixP->fx_r_type)
742 {
743 case BFD_RELOC_CR16_NUM8:
744 bfd_put_8 (stdoutput, (unsigned char) val, buf);
745 break;
746 case BFD_RELOC_CR16_NUM16:
747 bfd_put_16 (stdoutput, val, buf);
748 break;
749 case BFD_RELOC_CR16_NUM32:
750 bfd_put_32 (stdoutput, val, buf);
751 break;
752 case BFD_RELOC_CR16_NUM32a:
753 bfd_put_32 (stdoutput, val, buf);
754 break;
755 default:
756 /* We shouldn't ever get here because linkrelax is nonzero. */
757 abort ();
758 break;
759 }
760
761 fixP->fx_done = 0;
762
763 if (fixP->fx_addsy == NULL
764 && fixP->fx_pcrel == 0)
765 fixP->fx_done = 1;
766
767 if (fixP->fx_pcrel == 1
768 && fixP->fx_addsy != NULL
769 && S_GET_SEGMENT (fixP->fx_addsy) == seg)
770 fixP->fx_done = 1;
771}
772
773/* The location from which a PC relative jump should be calculated,
774 given a PC relative reloc. */
775
776long
777md_pcrel_from (fixS *fixp)
778{
779 return fixp->fx_frag->fr_address + fixp->fx_where;
780}
781
782static void
783initialise_reg_hash_table (struct hash_control ** hash_table,
7fac7ff4
NC
784 const reg_entry * register_table,
785 const unsigned int num_entries)
3d3d428f
NC
786{
787 const reg_entry * reg;
788 const char *hashret;
789
790 if ((* hash_table = hash_new ()) == NULL)
791 as_fatal (_("Virtual memory exhausted"));
792
793 for (reg = register_table;
794 reg < (register_table + num_entries);
795 reg++)
796 {
797 hashret = hash_insert (* hash_table, reg->name, (char *) reg);
798 if (hashret)
7fac7ff4
NC
799 as_fatal (_("Internal Error: Can't hash %s: %s"),
800 reg->name, hashret);
3d3d428f
NC
801 }
802}
803
804/* This function is called once, at assembler startup time. This should
805 set up all the tables, etc that the MD part of the assembler needs. */
806
807void
808md_begin (void)
809{
810 int i = 0;
811
812 /* Set up a hash table for the instructions. */
813 if ((cr16_inst_hash = hash_new ()) == NULL)
814 as_fatal (_("Virtual memory exhausted"));
815
816 while (cr16_instruction[i].mnemonic != NULL)
817 {
818 const char *hashret;
819 const char *mnemonic = cr16_instruction[i].mnemonic;
820
821 hashret = hash_insert (cr16_inst_hash, mnemonic,
7fac7ff4 822 (char *)(cr16_instruction + i));
3d3d428f
NC
823
824 if (hashret != NULL && *hashret != '\0')
825 as_fatal (_("Can't hash `%s': %s\n"), cr16_instruction[i].mnemonic,
826 *hashret == 0 ? _("(unknown reason)") : hashret);
827
828 /* Insert unique names into hash table. The CR16 instruction set
829 has many identical opcode names that have different opcodes based
830 on the operands. This hash table then provides a quick index to
831 the first opcode with a particular name in the opcode table. */
832 do
833 {
834 ++i;
835 }
836 while (cr16_instruction[i].mnemonic != NULL
837 && streq (cr16_instruction[i].mnemonic, mnemonic));
838 }
839
840 /* Initialize reg_hash hash table. */
841 initialise_reg_hash_table (& reg_hash, cr16_regtab, NUMREGS);
842 /* Initialize regp_hash hash table. */
843 initialise_reg_hash_table (& regp_hash, cr16_regptab, NUMREGPS);
844 /* Initialize preg_hash hash table. */
845 initialise_reg_hash_table (& preg_hash, cr16_pregtab, NUMPREGS);
846 /* Initialize pregp_hash hash table. */
847 initialise_reg_hash_table (& pregp_hash, cr16_pregptab, NUMPREGPS);
848
849 /* Set linkrelax here to avoid fixups in most sections. */
850 linkrelax = 1;
851}
852
853/* Process constants (immediate/absolute)
854 and labels (jump targets/Memory locations). */
855
856static void
857process_label_constant (char *str, ins * cr16_ins)
858{
859 char *saved_input_line_pointer;
860 int symbol_with_at = 0;
861 int symbol_with_s = 0;
862 int symbol_with_m = 0;
863 int symbol_with_l = 0;
864 argument *cur_arg = cr16_ins->arg + cur_arg_num; /* Current argument. */
865
866 saved_input_line_pointer = input_line_pointer;
867 input_line_pointer = str;
868
869 expression (&cr16_ins->exp);
870
871 switch (cr16_ins->exp.X_op)
872 {
873 case O_big:
874 case O_absent:
875 /* Missing or bad expr becomes absolute 0. */
876 as_bad (_("missing or invalid displacement expression `%s' taken as 0"),
7fac7ff4 877 str);
3d3d428f
NC
878 cr16_ins->exp.X_op = O_constant;
879 cr16_ins->exp.X_add_number = 0;
880 cr16_ins->exp.X_add_symbol = NULL;
881 cr16_ins->exp.X_op_symbol = NULL;
882 /* Fall through. */
883
884 case O_constant:
885 cur_arg->X_op = O_constant;
886 cur_arg->constant = cr16_ins->exp.X_add_number;
887 break;
888
889 case O_symbol:
890 case O_subtract:
891 case O_add:
892 cur_arg->X_op = O_symbol;
893 cr16_ins->rtype = BFD_RELOC_NONE;
894 relocatable = 1;
895
896 if (strneq (input_line_pointer, "@c", 2))
7fac7ff4 897 symbol_with_at = 1;
3d3d428f
NC
898
899 if (strneq (input_line_pointer, "@l", 2)
7fac7ff4
NC
900 || strneq (input_line_pointer, ":l", 2))
901 symbol_with_l = 1;
3d3d428f
NC
902
903 if (strneq (input_line_pointer, "@m", 2)
7fac7ff4
NC
904 || strneq (input_line_pointer, ":m", 2))
905 symbol_with_m = 1;
3d3d428f
NC
906
907 if (strneq (input_line_pointer, "@s", 2)
7fac7ff4
NC
908 || strneq (input_line_pointer, ":s", 2))
909 symbol_with_s = 1;
3d3d428f
NC
910
911 switch (cur_arg->type)
912 {
7fac7ff4
NC
913 case arg_cr:
914 if (IS_INSN_TYPE (LD_STOR_INS) || IS_INSN_TYPE (CSTBIT_INS))
915 {
916 if (cur_arg->size == 20)
917 cr16_ins->rtype = BFD_RELOC_CR16_REGREL20;
918 else
919 cr16_ins->rtype = BFD_RELOC_CR16_REGREL20a;
920 }
921 break;
922
923 case arg_crp:
924 if (IS_INSN_TYPE (LD_STOR_INS) || IS_INSN_TYPE (CSTBIT_INS))
925 switch (instruction->size)
926 {
927 case 1:
928 switch (cur_arg->size)
929 {
930 case 0:
931 cr16_ins->rtype = BFD_RELOC_CR16_REGREL0;
932 break;
933 case 4:
934 if (IS_INSN_MNEMONIC ("loadb") || IS_INSN_MNEMONIC ("storb"))
935 cr16_ins->rtype = BFD_RELOC_CR16_REGREL4;
936 else
937 cr16_ins->rtype = BFD_RELOC_CR16_REGREL4a;
938 break;
939 default: break;
940 }
941 break;
942 case 2:
943 cr16_ins->rtype = BFD_RELOC_CR16_REGREL16;
944 break;
945 case 3:
946 if (cur_arg->size == 20)
947 cr16_ins->rtype = BFD_RELOC_CR16_REGREL20;
948 else
949 cr16_ins->rtype = BFD_RELOC_CR16_REGREL20a;
950 break;
951 default:
952 break;
953 }
954 break;
955
956 case arg_idxr:
957 if (IS_INSN_TYPE (LD_STOR_INS) || IS_INSN_TYPE (CSTBIT_INS))
958 cr16_ins->rtype = BFD_RELOC_CR16_REGREL20;
959 break;
960
961 case arg_idxrp:
962 if (IS_INSN_TYPE (LD_STOR_INS) || IS_INSN_TYPE (CSTBIT_INS))
963 switch (instruction->size)
964 {
965 case 1: cr16_ins->rtype = BFD_RELOC_CR16_REGREL0; break;
966 case 2: cr16_ins->rtype = BFD_RELOC_CR16_REGREL14; break;
967 case 3: cr16_ins->rtype = BFD_RELOC_CR16_REGREL20; break;
968 default: break;
969 }
970 break;
971
972 case arg_c:
973 if (IS_INSN_MNEMONIC ("bal"))
974 cr16_ins->rtype = BFD_RELOC_CR16_DISP24;
975 else if (IS_INSN_TYPE (BRANCH_INS))
976 {
977 if (symbol_with_l)
978 cr16_ins->rtype = BFD_RELOC_CR16_DISP24;
979 else if (symbol_with_m)
980 cr16_ins->rtype = BFD_RELOC_CR16_DISP16;
981 else
982 cr16_ins->rtype = BFD_RELOC_CR16_DISP8;
983 }
984 else if (IS_INSN_TYPE (STOR_IMM_INS) || IS_INSN_TYPE (LD_STOR_INS)
985 || IS_INSN_TYPE (CSTBIT_INS))
986 {
987 if (symbol_with_s)
988 as_bad (_("operand %d: illegal use expression: `%s`"), cur_arg_num + 1, str);
989 if (symbol_with_m)
990 cr16_ins->rtype = BFD_RELOC_CR16_ABS20;
991 else /* Default to (symbol_with_l) */
992 cr16_ins->rtype = BFD_RELOC_CR16_ABS24;
993 }
994 else if (IS_INSN_TYPE (BRANCH_NEQ_INS))
995 cr16_ins->rtype = BFD_RELOC_CR16_DISP4;
3d3d428f
NC
996 break;
997
998 case arg_ic:
999 if (IS_INSN_TYPE (ARITH_INS))
1000 {
1001 if (symbol_with_s)
1002 cr16_ins->rtype = BFD_RELOC_CR16_IMM4;
1003 else if (symbol_with_m)
1004 cr16_ins->rtype = BFD_RELOC_CR16_IMM20;
1005 else if (symbol_with_at)
1006 cr16_ins->rtype = BFD_RELOC_CR16_IMM32a;
1007 else /* Default to (symbol_with_l) */
1008 cr16_ins->rtype = BFD_RELOC_CR16_IMM32;
1009 }
1010 else if (IS_INSN_TYPE (ARITH_BYTE_INS))
7fac7ff4
NC
1011 {
1012 cr16_ins->rtype = BFD_RELOC_CR16_IMM16;
1013 }
3d3d428f
NC
1014 break;
1015 default:
1016 break;
7fac7ff4 1017 }
3d3d428f
NC
1018 break;
1019
1020 default:
1021 cur_arg->X_op = cr16_ins->exp.X_op;
1022 break;
1023 }
1024
1025 input_line_pointer = saved_input_line_pointer;
1026 return;
1027}
1028
1029/* Retrieve the opcode image of a given register.
1030 If the register is illegal for the current instruction,
1031 issue an error. */
1032
1033static int
1034getreg_image (reg r)
1035{
1036 const reg_entry *reg;
1037 char *reg_name;
1038 int is_procreg = 0; /* Nonzero means argument should be processor reg. */
1039
1040 /* Check whether the register is in registers table. */
1041 if (r < MAX_REG)
1042 reg = cr16_regtab + r;
1043 else /* Register not found. */
1044 {
1045 as_bad (_("Unknown register: `%d'"), r);
1046 return 0;
1047 }
1048
1049 reg_name = reg->name;
1050
1051/* Issue a error message when register is illegal. */
1052#define IMAGE_ERR \
1053 as_bad (_("Illegal register (`%s') in Instruction: `%s'"), \
1054 reg_name, ins_parse); \
1055 break;
1056
1057 switch (reg->type)
1058 {
1059 case CR16_R_REGTYPE:
1060 if (! is_procreg)
7fac7ff4 1061 return reg->image;
3d3d428f 1062 else
7fac7ff4 1063 IMAGE_ERR;
3d3d428f
NC
1064
1065 case CR16_P_REGTYPE:
1066 return reg->image;
1067 break;
1068
1069 default:
1070 IMAGE_ERR;
1071 }
1072
1073 return 0;
1074}
1075
1076/* Parsing different types of operands
1077 -> constants Immediate/Absolute/Relative numbers
1078 -> Labels Relocatable symbols
1079 -> (reg pair base) Register pair base
1080 -> (rbase) Register base
1081 -> disp(rbase) Register relative
1082 -> [rinx]disp(reg pair) Register index with reg pair mode
1083 -> disp(rbase,ridx,scl) Register index mode. */
1084
1085static void
1086set_operand (char *operand, ins * cr16_ins)
1087{
1088 char *operandS; /* Pointer to start of sub-opearand. */
1089 char *operandE; /* Pointer to end of sub-opearand. */
1090
1091 argument *cur_arg = &cr16_ins->arg[cur_arg_num]; /* Current argument. */
1092
1093 /* Initialize pointers. */
1094 operandS = operandE = operand;
1095
1096 switch (cur_arg->type)
1097 {
1098 case arg_ic: /* Case $0x18. */
1099 operandS++;
1100 case arg_c: /* Case 0x18. */
1101 /* Set constant. */
1102 process_label_constant (operandS, cr16_ins);
1103
1104 if (cur_arg->type != arg_ic)
1105 cur_arg->type = arg_c;
1106 break;
1107
1108 case arg_icr: /* Case $0x18(r1). */
1109 operandS++;
1110 case arg_cr: /* Case 0x18(r1). */
1111 /* Set displacement constant. */
1112 while (*operandE != '(')
1113 operandE++;
1114 *operandE = '\0';
1115 process_label_constant (operandS, cr16_ins);
1116 operandS = operandE;
1117 case arg_rbase: /* Case (r1) or (r1,r0). */
1118 operandS++;
1119 /* Set register base. */
1120 while (*operandE != ')')
1121 operandE++;
1122 *operandE = '\0';
1123 if ((cur_arg->r = get_register (operandS)) == nullregister)
1124 as_bad (_("Illegal register `%s' in Instruction `%s'"),
1125 operandS, ins_parse);
1126
1127 /* set the arg->rp, if reg is "r12" or "r13" or "14" or "15" */
1128 if ((cur_arg->type != arg_rbase)
7fac7ff4
NC
1129 && ((getreg_image (cur_arg->r) == 12)
1130 || (getreg_image (cur_arg->r) == 13)
1131 || (getreg_image (cur_arg->r) == 14)
1132 || (getreg_image (cur_arg->r) == 15)))
3d3d428f
NC
1133 {
1134 cur_arg->type = arg_crp;
1135 cur_arg->rp = cur_arg->r;
1136 }
1137 break;
1138
1139 case arg_crp: /* Case 0x18(r1,r0). */
1140 /* Set displacement constant. */
1141 while (*operandE != '(')
1142 operandE++;
1143 *operandE = '\0';
1144 process_label_constant (operandS, cr16_ins);
1145 operandS = operandE;
1146 operandS++;
1147 /* Set register pair base. */
1148 while (*operandE != ')')
1149 operandE++;
1150 *operandE = '\0';
1151 if ((cur_arg->rp = get_register_pair (operandS)) == nullregister)
1152 as_bad (_("Illegal register pair `%s' in Instruction `%s'"),
1153 operandS, ins_parse);
1154 break;
1155
1156 case arg_idxr:
1157 /* Set register pair base. */
1158 if ((strchr (operandS,'(') != NULL))
1159 {
1160 while ((*operandE != '(') && (! ISSPACE (*operandE)))
1161 operandE++;
1162 if ((cur_arg->rp = get_index_register_pair (operandE)) == nullregister)
1163 as_bad (_("Illegal register pair `%s' in Instruction `%s'"),
1164 operandS, ins_parse);
1165 *operandE++ = '\0';
1166 cur_arg->type = arg_idxrp;
1167 }
1168 else
7fac7ff4 1169 cur_arg->rp = -1;
3d3d428f
NC
1170
1171 operandE = operandS;
1172 /* Set displacement constant. */
1173 while (*operandE != ']')
1174 operandE++;
1175 process_label_constant (++operandE, cr16_ins);
1176 *operandE++ = '\0';
1177 operandE = operandS;
1178
1179 /* Set index register . */
1180 operandS = strchr (operandE,'[');
1181 if (operandS != NULL)
1182 { /* Eliminate '[', detach from rest of operand. */
1183 *operandS++ = '\0';
1184
1185 operandE = strchr (operandS, ']');
1186
1187 if (operandE == NULL)
1188 as_bad (_("unmatched '['"));
1189 else
1190 { /* Eliminate ']' and make sure it was the last thing
1191 in the string. */
1192 *operandE = '\0';
1193 if (*(operandE + 1) != '\0')
1194 as_bad (_("garbage after index spec ignored"));
1195 }
1196 }
1197
1198 if ((cur_arg->i_r = get_index_register (operandS)) == nullregister)
1199 as_bad (_("Illegal register `%s' in Instruction `%s'"),
1200 operandS, ins_parse);
1201 *operandE = '\0';
1202 *operandS = '\0';
1203 break;
1204
1205 default:
1206 break;
1207 }
1208}
1209
1210/* Parse a single operand.
1211 operand - Current operand to parse.
1212 cr16_ins - Current assembled instruction. */
1213
1214static void
1215parse_operand (char *operand, ins * cr16_ins)
1216{
1217 int ret_val;
1218 argument *cur_arg = cr16_ins->arg + cur_arg_num; /* Current argument. */
1219
1220 /* Initialize the type to NULL before parsing. */
1221 cur_arg->type = nullargs;
1222
1223 /* Check whether this is a condition code . */
1224 if ((IS_INSN_MNEMONIC ("b")) && ((ret_val = get_cc (operand)) != -1))
1225 {
1226 cur_arg->type = arg_cc;
1227 cur_arg->cc = ret_val;
1228 cur_arg->X_op = O_register;
1229 return;
1230 }
1231
1232 /* Check whether this is a general processor register. */
1233 if ((ret_val = get_register (operand)) != nullregister)
1234 {
1235 cur_arg->type = arg_r;
1236 cur_arg->r = ret_val;
1237 cur_arg->X_op = 0;
1238 return;
1239 }
1240
1241 /* Check whether this is a general processor register pair. */
1242 if ((operand[0] == '(')
1243 && ((ret_val = get_register_pair (operand)) != nullregister))
1244 {
1245 cur_arg->type = arg_rp;
1246 cur_arg->rp = ret_val;
1247 cur_arg->X_op = O_register;
1248 return;
1249 }
1250
1251 /* Check whether the operand is a processor register.
1252 For "lprd" and "sprd" instruction, only 32 bit
1253 processor registers used. */
1254 if (!(IS_INSN_MNEMONIC ("lprd") || (IS_INSN_MNEMONIC ("sprd")))
1255 && ((ret_val = get_pregister (operand)) != nullpregister))
1256 {
1257 cur_arg->type = arg_pr;
1258 cur_arg->pr = ret_val;
1259 cur_arg->X_op = O_register;
1260 return;
1261 }
1262
1263 /* Check whether this is a processor register - 32 bit. */
1264 if ((ret_val = get_pregisterp (operand)) != nullpregister)
1265 {
1266 cur_arg->type = arg_prp;
1267 cur_arg->prp = ret_val;
1268 cur_arg->X_op = O_register;
1269 return;
1270 }
1271
1272 /* Deal with special characters. */
1273 switch (operand[0])
1274 {
1275 case '$':
1276 if (strchr (operand, '(') != NULL)
7fac7ff4 1277 cur_arg->type = arg_icr;
3d3d428f 1278 else
7fac7ff4 1279 cur_arg->type = arg_ic;
3d3d428f
NC
1280 goto set_params;
1281 break;
1282
1283 case '(':
1284 cur_arg->type = arg_rbase;
1285 goto set_params;
1286 break;
1287
1288 case '[':
1289 cur_arg->type = arg_idxr;
1290 goto set_params;
1291 break;
1292
1293 default:
1294 break;
1295 }
1296
1297 if (strchr (operand, '(') != NULL)
1298 {
1299 if (strchr (operand, ',') != NULL
1300 && (strchr (operand, ',') > strchr (operand, '(')))
1301 cur_arg->type = arg_crp;
1302 else
1303 cur_arg->type = arg_cr;
1304 }
1305 else
1306 cur_arg->type = arg_c;
1307
1308/* Parse an operand according to its type. */
1309 set_params:
1310 cur_arg->constant = 0;
1311 set_operand (operand, cr16_ins);
1312}
1313
1314/* Parse the various operands. Each operand is then analyzed to fillup
1315 the fields in the cr16_ins data structure. */
1316
1317static void
1318parse_operands (ins * cr16_ins, char *operands)
1319{
1320 char *operandS; /* Operands string. */
1321 char *operandH, *operandT; /* Single operand head/tail pointers. */
1322 int allocated = 0; /* Indicates a new operands string was allocated.*/
1323 char *operand[MAX_OPERANDS];/* Separating the operands. */
1324 int op_num = 0; /* Current operand number we are parsing. */
1325 int bracket_flag = 0; /* Indicates a bracket '(' was found. */
1326 int sq_bracket_flag = 0; /* Indicates a square bracket '[' was found. */
1327
1328 /* Preprocess the list of registers, if necessary. */
1329 operandS = operandH = operandT = operands;
1330
1331 while (*operandT != '\0')
1332 {
1333 if (*operandT == ',' && bracket_flag != 1 && sq_bracket_flag != 1)
1334 {
1335 *operandT++ = '\0';
1336 operand[op_num++] = strdup (operandH);
1337 operandH = operandT;
1338 continue;
1339 }
1340
1341 if (*operandT == ' ')
1342 as_bad (_("Illegal operands (whitespace): `%s'"), ins_parse);
1343
1344 if (*operandT == '(')
1345 bracket_flag = 1;
1346 else if (*operandT == '[')
1347 sq_bracket_flag = 1;
1348
1349 if (*operandT == ')')
1350 {
1351 if (bracket_flag)
1352 bracket_flag = 0;
1353 else
1354 as_fatal (_("Missing matching brackets : `%s'"), ins_parse);
1355 }
1356 else if (*operandT == ']')
1357 {
1358 if (sq_bracket_flag)
1359 sq_bracket_flag = 0;
1360 else
1361 as_fatal (_("Missing matching brackets : `%s'"), ins_parse);
1362 }
1363
1364 if (bracket_flag == 1 && *operandT == ')')
1365 bracket_flag = 0;
1366 else if (sq_bracket_flag == 1 && *operandT == ']')
1367 sq_bracket_flag = 0;
1368
1369 operandT++;
1370 }
1371
1372 /* Adding the last operand. */
1373 operand[op_num++] = strdup (operandH);
1374 cr16_ins->nargs = op_num;
1375
1376 /* Verifying correct syntax of operands (all brackets should be closed). */
1377 if (bracket_flag || sq_bracket_flag)
1378 as_fatal (_("Missing matching brackets : `%s'"), ins_parse);
1379
1380 /* Now we parse each operand separately. */
1381 for (op_num = 0; op_num < cr16_ins->nargs; op_num++)
1382 {
1383 cur_arg_num = op_num;
1384 parse_operand (operand[op_num], cr16_ins);
1385 free (operand[op_num]);
1386 }
1387
1388 if (allocated)
1389 free (operandS);
1390}
1391
1392/* Get the trap index in dispatch table, given its name.
1393 This routine is used by assembling the 'excp' instruction. */
1394
1395static int
1396gettrap (char *s)
1397{
1398 const trap_entry *trap;
1399
1400 for (trap = cr16_traps; trap < (cr16_traps + NUMTRAPS); trap++)
1401 if (strcasecmp (trap->name, s) == 0)
1402 return trap->entry;
1403
1404 /* To make compatable with CR16 4.1 tools, the below 3-lines of
1405 * code added. Refer: Development Tracker item #123 */
1406 for (trap = cr16_traps; trap < (cr16_traps + NUMTRAPS); trap++)
1407 if (trap->entry == (unsigned int) atoi (s))
1408 return trap->entry;
1409
1410 as_bad (_("Unknown exception: `%s'"), s);
1411 return 0;
1412}
1413
1414/* Top level module where instruction parsing starts.
1415 cr16_ins - data structure holds some information.
1416 operands - holds the operands part of the whole instruction. */
1417
1418static void
1419parse_insn (ins *insn, char *operands)
1420{
1421 int i;
1422
1423 /* Handle instructions with no operands. */
1424 for (i = 0; cr16_no_op_insn[i] != NULL; i++)
1425 {
1426 if (streq (cr16_no_op_insn[i], instruction->mnemonic))
1427 {
1428 insn->nargs = 0;
1429 return;
1430 }
1431 }
1432
1433 /* Handle 'excp' instructions. */
1434 if (IS_INSN_MNEMONIC ("excp"))
1435 {
1436 insn->nargs = 1;
1437 insn->arg[0].type = arg_ic;
1438 insn->arg[0].constant = gettrap (operands);
1439 insn->arg[0].X_op = O_constant;
1440 return;
1441 }
1442
1443 if (operands != NULL)
1444 parse_operands (insn, operands);
1445}
1446
1447/* bCC instruction requires special handling. */
1448static char *
1449get_b_cc (char * op)
1450{
1451 unsigned int i;
1452 char op1[5];
1453
1454 for (i = 1; i < strlen (op); i++)
1455 op1[i-1] = op[i];
1456
1457 op1[i-1] = '\0';
1458
1459 for (i = 0; i < cr16_num_cc ; i++)
1460 if (streq (op1, cr16_b_cond_tab[i]))
1461 return (char *) cr16_b_cond_tab[i];
1462
1463 return NULL;
1464}
1465
1466/* bCC instruction requires special handling. */
1467static int
1468is_bcc_insn (char * op)
1469{
1470 if (!(streq (op, "bal") || streq (op, "beq0b") || streq (op, "bnq0b")
7fac7ff4 1471 || streq (op, "beq0w") || streq (op, "bnq0w")))
3d3d428f
NC
1472 if ((op[0] == 'b') && (get_b_cc (op) != NULL))
1473 return 1;
1474 return 0;
1475}
1476
1477/* Cinv instruction requires special handling. */
1478
1479static int
1480check_cinv_options (char * operand)
1481{
1482 char *p = operand;
1483 int i_used = 0, u_used = 0, d_used = 0;
1484
1485 while (*++p != ']')
1486 {
1487 if (*p == ',' || *p == ' ')
1488 continue;
1489
1490 else if (*p == 'i')
1491 i_used = 1;
1492 else if (*p == 'u')
1493 u_used = 1;
1494 else if (*p == 'd')
1495 d_used = 1;
1496 else
1497 as_bad (_("Illegal `cinv' parameter: `%c'"), *p);
1498 }
1499
1500 return 0;
1501}
1502
1503/* Retrieve the opcode image of a given register pair.
1504 If the register is illegal for the current instruction,
1505 issue an error. */
1506
1507static int
1508getregp_image (reg r)
1509{
1510 const reg_entry *reg;
1511 char *reg_name;
1512
1513 /* Check whether the register is in registers table. */
1514 if (r < MAX_REG)
1515 reg = cr16_regptab + r;
1516 /* Register not found. */
1517 else
1518 {
1519 as_bad (_("Unknown register pair: `%d'"), r);
1520 return 0;
1521 }
1522
1523 reg_name = reg->name;
1524
1525/* Issue a error message when register pair is illegal. */
1526#define RPAIR_IMAGE_ERR \
1527 as_bad (_("Illegal register pair (`%s') in Instruction: `%s'"), \
1528 reg_name, ins_parse); \
1529 break;
1530
1531 switch (reg->type)
1532 {
1533 case CR16_RP_REGTYPE:
1534 return reg->image;
1535 default:
1536 RPAIR_IMAGE_ERR;
1537 }
1538
1539 return 0;
1540}
1541
1542/* Retrieve the opcode image of a given index register pair.
1543 If the register is illegal for the current instruction,
1544 issue an error. */
1545
1546static int
1547getidxregp_image (reg r)
1548{
1549 const reg_entry *reg;
1550 char *reg_name;
1551
1552 /* Check whether the register is in registers table. */
1553 if (r < MAX_REG)
1554 reg = cr16_regptab + r;
1555 /* Register not found. */
1556 else
1557 {
1558 as_bad (_("Unknown register pair: `%d'"), r);
1559 return 0;
1560 }
1561
1562 reg_name = reg->name;
1563
1564/* Issue a error message when register pair is illegal. */
1565#define IDX_RPAIR_IMAGE_ERR \
1566 as_bad (_("Illegal index register pair (`%s') in Instruction: `%s'"), \
1567 reg_name, ins_parse); \
1568
1569 if (reg->type == CR16_RP_REGTYPE)
1570 {
1571 switch (reg->image)
7fac7ff4
NC
1572 {
1573 case 0: return 0; break;
1574 case 2: return 1; break;
1575 case 4: return 2; break;
1576 case 6: return 3; break;
1577 case 8: return 4; break;
1578 case 10: return 5; break;
1579 case 3: return 6; break;
1580 case 5: return 7; break;
1581 default:
1582 break;
1583 }
3d3d428f
NC
1584 }
1585
1586 IDX_RPAIR_IMAGE_ERR;
1587 return 0;
1588}
1589
1590/* Retrieve the opcode image of a given processort register.
1591 If the register is illegal for the current instruction,
1592 issue an error. */
1593static int
1594getprocreg_image (reg r)
1595{
1596 const reg_entry *reg;
1597 char *reg_name;
1598
1599 /* Check whether the register is in registers table. */
1600 if (r < MAX_PREG)
1601 reg = &cr16_pregtab[r - MAX_REG];
1602 /* Register not found. */
1603 else
1604 {
1605 as_bad (_("Unknown processor register : `%d'"), r);
1606 return 0;
1607 }
1608
1609 reg_name = reg->name;
1610
1611/* Issue a error message when register pair is illegal. */
1612#define PROCREG_IMAGE_ERR \
1613 as_bad (_("Illegal processor register (`%s') in Instruction: `%s'"), \
1614 reg_name, ins_parse); \
1615 break;
1616
1617 switch (reg->type)
1618 {
1619 case CR16_P_REGTYPE:
1620 return reg->image;
1621 default:
1622 PROCREG_IMAGE_ERR;
1623 }
1624
1625 return 0;
1626}
1627
1628/* Retrieve the opcode image of a given processort register.
1629 If the register is illegal for the current instruction,
1630 issue an error. */
1631static int
1632getprocregp_image (reg r)
1633{
1634 const reg_entry *reg;
1635 char *reg_name;
1636 int pregptab_disp = 0;
1637
1638 /* Check whether the register is in registers table. */
1639 if (r < MAX_PREG)
1640 {
1641 r = r - MAX_REG;
1642 switch (r)
1643 {
7fac7ff4
NC
1644 case 4: pregptab_disp = 1; break;
1645 case 6: pregptab_disp = 2; break;
1646 case 8:
1647 case 9:
1648 case 10:
1649 pregptab_disp = 3; break;
1650 case 12:
1651 pregptab_disp = 4; break;
1652 case 14:
1653 pregptab_disp = 5; break;
1654 default: break;
3d3d428f
NC
1655 }
1656 reg = &cr16_pregptab[r - pregptab_disp];
1657 }
1658 /* Register not found. */
1659 else
1660 {
1661 as_bad (_("Unknown processor register (32 bit) : `%d'"), r);
1662 return 0;
1663 }
1664
1665 reg_name = reg->name;
1666
1667/* Issue a error message when register pair is illegal. */
1668#define PROCREGP_IMAGE_ERR \
1669 as_bad (_("Illegal 32 bit - processor register (`%s') in Instruction: `%s'"),\
1670 reg_name, ins_parse); \
1671 break;
1672
1673 switch (reg->type)
1674 {
1675 case CR16_P_REGTYPE:
1676 return reg->image;
1677 default:
1678 PROCREGP_IMAGE_ERR;
1679 }
1680
1681 return 0;
1682}
1683
1684/* Routine used to represent integer X using NBITS bits. */
1685
1686static long
1687getconstant (long x, int nbits)
1688{
1689 /* The following expression avoids overflow if
1690 'nbits' is the number of bits in 'bfd_vma'. */
1691 return (x & ((((1 << (nbits - 1)) - 1) << 1) | 1));
1692}
1693
1694/* Print a constant value to 'output_opcode':
1695 ARG holds the operand's type and value.
1696 SHIFT represents the location of the operand to be print into.
1697 NBITS determines the size (in bits) of the constant. */
1698
1699static void
1700print_constant (int nbits, int shift, argument *arg)
1701{
1702 unsigned long mask = 0;
1703
1704 long constant = getconstant (arg->constant, nbits);
1705
1706 switch (nbits)
1707 {
1708 case 32:
1709 case 28:
1710 /* mask the upper part of the constant, that is, the bits
7fac7ff4
NC
1711 going to the lowest byte of output_opcode[0].
1712 The upper part of output_opcode[1] is always filled,
1713 therefore it is always masked with 0xFFFF. */
3d3d428f
NC
1714 mask = (1 << (nbits - 16)) - 1;
1715 /* Divide the constant between two consecutive words :
7fac7ff4
NC
1716 0 1 2 3
1717 +---------+---------+---------+---------+
1718 | | X X X X | x X x X | |
1719 +---------+---------+---------+---------+
1720 output_opcode[0] output_opcode[1] */
3d3d428f
NC
1721
1722 CR16_PRINT (0, (constant >> WORD_SHIFT) & mask, 0);
1723 CR16_PRINT (1, (constant & 0xFFFF), WORD_SHIFT);
1724 break;
1725
1726 case 21:
1727 if ((nbits == 21) && (IS_INSN_TYPE (LD_STOR_INS))) nbits = 20;
1728 case 24:
1729 case 22:
1730 case 20:
1731 /* mask the upper part of the constant, that is, the bits
7fac7ff4
NC
1732 going to the lowest byte of output_opcode[0].
1733 The upper part of output_opcode[1] is always filled,
1734 therefore it is always masked with 0xFFFF. */
3d3d428f
NC
1735 mask = (1 << (nbits - 16)) - 1;
1736 /* Divide the constant between two consecutive words :
7fac7ff4
NC
1737 0 1 2 3
1738 +---------+---------+---------+---------+
1739 | | X X X X | - X - X | |
1740 +---------+---------+---------+---------+
1741 output_opcode[0] output_opcode[1] */
3d3d428f
NC
1742
1743 if ((instruction->size > 2) && (shift == WORD_SHIFT))
7fac7ff4
NC
1744 {
1745 if (arg->type == arg_idxrp)
1746 {
1747 CR16_PRINT (0, ((constant >> WORD_SHIFT) & mask) << 8, 0);
1748 CR16_PRINT (1, (constant & 0xFFFF), WORD_SHIFT);
1749 }
1750 else
1751 {
1752 CR16_PRINT (0, (((((constant >> WORD_SHIFT) & mask) << 8) & 0x0f00) | ((((constant >> WORD_SHIFT) & mask) >> 4) & 0xf)),0);
1753 CR16_PRINT (1, (constant & 0xFFFF), WORD_SHIFT);
1754 }
1755 }
3d3d428f 1756 else
7fac7ff4 1757 CR16_PRINT (0, constant, shift);
3d3d428f
NC
1758 break;
1759
1760 case 14:
1761 if (arg->type == arg_idxrp)
7fac7ff4
NC
1762 {
1763 if (instruction->size == 2)
1764 {
1765 CR16_PRINT (0, ((constant) & 0xf), shift); /* 0-3 bits. */
1766 CR16_PRINT (0, ((constant >> 4) & 0x3), (shift + 20)); /* 4-5 bits. */
1767 CR16_PRINT (0, ((constant >> 6) & 0x3), (shift + 14)); /* 6-7 bits. */
1768 CR16_PRINT (0, ((constant >> 8) & 0x3f), (shift + 8)); /* 8-13 bits. */
1769 }
1770 else
1771 CR16_PRINT (0, constant, shift);
1772 }
3d3d428f
NC
1773 break;
1774
1775 case 16:
1776 case 12:
1777 /* When instruction size is 3 and 'shift' is 16, a 16-bit constant is
7fac7ff4
NC
1778 always filling the upper part of output_opcode[1]. If we mistakenly
1779 write it to output_opcode[0], the constant prefix (that is, 'match')
1780 will be overriden.
1781 0 1 2 3
1782 +---------+---------+---------+---------+
1783 | 'match' | | X X X X | |
1784 +---------+---------+---------+---------+
1785 output_opcode[0] output_opcode[1] */
3d3d428f
NC
1786
1787 if ((instruction->size > 2) && (shift == WORD_SHIFT))
7fac7ff4 1788 CR16_PRINT (1, constant, WORD_SHIFT);
3d3d428f 1789 else
7fac7ff4 1790 CR16_PRINT (0, constant, shift);
3d3d428f
NC
1791 break;
1792
1793 case 8:
7fac7ff4
NC
1794 CR16_PRINT (0, ((constant / 2) & 0xf), shift);
1795 CR16_PRINT (0, ((constant / 2) >> 4), (shift + 8));
3d3d428f
NC
1796 break;
1797
1798 default:
1799 CR16_PRINT (0, constant, shift);
1800 break;
1801 }
1802}
1803
1804/* Print an operand to 'output_opcode', which later on will be
1805 printed to the object file:
1806 ARG holds the operand's type, size and value.
1807 SHIFT represents the printing location of operand.
1808 NBITS determines the size (in bits) of a constant operand. */
1809
1810static void
1811print_operand (int nbits, int shift, argument *arg)
1812{
1813 switch (arg->type)
1814 {
1815 case arg_cc:
1816 CR16_PRINT (0, arg->cc, shift);
1817 break;
1818
1819 case arg_r:
1820 CR16_PRINT (0, getreg_image (arg->r), shift);
1821 break;
1822
1823 case arg_rp:
1824 CR16_PRINT (0, getregp_image (arg->rp), shift);
1825 break;
1826
1827 case arg_pr:
1828 CR16_PRINT (0, getprocreg_image (arg->pr), shift);
1829 break;
1830
1831 case arg_prp:
1832 CR16_PRINT (0, getprocregp_image (arg->prp), shift);
1833 break;
1834
1835 case arg_idxrp:
1836 /* 16 12 8 6 0
1837 +-----------------------------+
1838 | r_index | disp | rp_base |
1839 +-----------------------------+ */
1840
1841 if (instruction->size == 3)
7fac7ff4
NC
1842 {
1843 CR16_PRINT (0, getidxregp_image (arg->rp), 0);
1844 if (getreg_image (arg->i_r) == 12)
1845 CR16_PRINT (0, 0, 3);
1846 else
1847 CR16_PRINT (0, 1, 3);
1848 }
3d3d428f 1849 else
7fac7ff4
NC
1850 {
1851 CR16_PRINT (0, getidxregp_image (arg->rp), 16);
1852 if (getreg_image (arg->i_r) == 12)
1853 CR16_PRINT (0, 0, 19);
1854 else
1855 CR16_PRINT (0, 1, 19);
1856 }
3d3d428f
NC
1857 print_constant (nbits, shift, arg);
1858 break;
1859
1860 case arg_idxr:
1861 if (getreg_image (arg->i_r) == 12)
7fac7ff4
NC
1862 if (IS_INSN_MNEMONIC ("cbitb") || IS_INSN_MNEMONIC ("sbitb")
1863 || IS_INSN_MNEMONIC ("tbitb"))
1864 CR16_PRINT (0, 0, 23);
1865 else CR16_PRINT (0, 0, 24);
3d3d428f 1866 else
7fac7ff4
NC
1867 if (IS_INSN_MNEMONIC ("cbitb") || IS_INSN_MNEMONIC ("sbitb")
1868 || IS_INSN_MNEMONIC ("tbitb"))
1869 CR16_PRINT (0, 1, 23);
1870 else CR16_PRINT (0, 1, 24);
3d3d428f
NC
1871
1872 print_constant (nbits, shift, arg);
1873 break;
1874
1875 case arg_ic:
1876 case arg_c:
1877 print_constant (nbits, shift, arg);
1878 break;
1879
1880 case arg_rbase:
1881 CR16_PRINT (0, getreg_image (arg->r), shift);
1882 break;
1883
1884 case arg_cr:
1885 print_constant (nbits, shift , arg);
1886 /* Add the register argument to the output_opcode. */
1887 CR16_PRINT (0, getreg_image (arg->r), (shift+16));
1888 break;
1889
1890 case arg_crp:
1891 print_constant (nbits, shift , arg);
1892 if (instruction->size > 1)
7fac7ff4 1893 CR16_PRINT (0, getregp_image (arg->rp), (shift + 16));
3d3d428f 1894 else if (IS_INSN_TYPE (LD_STOR_INS) || (IS_INSN_TYPE (CSTBIT_INS)))
7fac7ff4
NC
1895 {
1896 if (instruction->size == 2)
1897 CR16_PRINT (0, getregp_image (arg->rp), (shift - 8));
1898 else if (instruction->size == 1)
1899 CR16_PRINT (0, getregp_image (arg->rp), 16);
1900 }
3d3d428f 1901 else
7fac7ff4 1902 CR16_PRINT (0, getregp_image (arg->rp), shift);
3d3d428f
NC
1903 break;
1904
1905 default:
1906 break;
1907 }
1908}
1909
1910/* Retrieve the number of operands for the current assembled instruction. */
1911
1912static int
1913get_number_of_operands (void)
1914{
1915 int i;
1916
1917 for (i = 0; instruction->operands[i].op_type && i < MAX_OPERANDS; i++)
1918 ;
1919 return i;
1920}
1921
1922/* Verify that the number NUM can be represented in BITS bits (that is,
1923 within its permitted range), based on the instruction's FLAGS.
1924 If UPDATE is nonzero, update the value of NUM if necessary.
1925 Return OP_LEGAL upon success, actual error type upon failure. */
1926
1927static op_err
1928check_range (long *num, int bits, int unsigned flags, int update)
1929{
1930 long min, max;
1931 int retval = OP_LEGAL;
1932 long value = *num;
1933
1934 if (bits == 0 && value > 0) return OP_OUT_OF_RANGE;
1935
1936 /* For hosts witah longs bigger than 32-bits make sure that the top
1937 bits of a 32-bit negative value read in by the parser are set,
1938 so that the correct comparisons are made. */
1939 if (value & 0x80000000)
1940 value |= (-1L << 31);
1941
1942
1943 /* Verify operand value is even. */
1944 if (flags & OP_EVEN)
1945 {
1946 if (value % 2)
1947 return OP_NOT_EVEN;
1948 }
1949
1950 if (flags & OP_DEC)
1951 {
1952 value -= 1;
1953 if (update)
1954 *num = value;
1955 }
1956
1957 if (flags & OP_SHIFT)
1958 {
1959 value >>= 1;
1960 if (update)
1961 *num = value;
1962 }
1963 else if (flags & OP_SHIFT_DEC)
1964 {
1965 value = (value >> 1) - 1;
1966 if (update)
1967 *num = value;
1968 }
1969
1970 if (flags & OP_ABS20)
1971 {
1972 if (value > 0xEFFFF)
1973 return OP_OUT_OF_RANGE;
1974 }
1975
1976 if (flags & OP_ESC)
1977 {
1978 if (value == 0xB || value == 0x9)
1979 return OP_OUT_OF_RANGE;
1980 else if (value == -1)
7fac7ff4
NC
1981 {
1982 if (update)
1983 *num = 9;
1984 return retval;
1985 }
3d3d428f
NC
1986 }
1987
1988 if (flags & OP_ESC1)
1989 {
1990 if (value > 13)
1991 return OP_OUT_OF_RANGE;
1992 }
1993
1994 if (flags & OP_SIGNED)
1995 {
1996 max = (1 << (bits - 1)) - 1;
1997 min = - (1 << (bits - 1));
1998 if ((value > max) || (value < min))
1999 retval = OP_OUT_OF_RANGE;
2000 }
2001 else if (flags & OP_UNSIGNED)
2002 {
2003 max = ((((1 << (bits - 1)) - 1) << 1) | 1);
2004 min = 0;
2005 if (((unsigned long) value > (unsigned long) max)
2006 || ((unsigned long) value < (unsigned long) min))
2007 retval = OP_OUT_OF_RANGE;
2008 }
2009 else if (flags & OP_NEG)
2010 {
2011 max = - 1;
7fac7ff4 2012 min = - ((1 << (bits - 1)) - 1);
3d3d428f
NC
2013 if ((value > max) || (value < min))
2014 retval = OP_OUT_OF_RANGE;
2015 }
2016 return retval;
2017}
2018
2019/* Bunch of error checkings.
2020 The checks are made after a matching instruction was found. */
2021
2022static void
2023warn_if_needed (ins *insn)
2024{
2025 /* If the post-increment address mode is used and the load/store
2026 source register is the same as rbase, the result of the
2027 instruction is undefined. */
2028 if (IS_INSN_TYPE (LD_STOR_INS_INC))
2029 {
2030 /* Enough to verify that one of the arguments is a simple reg. */
2031 if ((insn->arg[0].type == arg_r) || (insn->arg[1].type == arg_r))
2032 if (insn->arg[0].r == insn->arg[1].r)
2033 as_bad (_("Same src/dest register is used (`r%d'), result is undefined"), insn->arg[0].r);
2034 }
2035
2036 if (IS_INSN_MNEMONIC ("pop")
2037 || IS_INSN_MNEMONIC ("push")
2038 || IS_INSN_MNEMONIC ("popret"))
2039 {
2040 unsigned int count = insn->arg[0].constant, reg_val;
2041
2042 /* Check if count operand caused to save/retrive the RA twice
7fac7ff4 2043 to generate warning message. */
3d3d428f
NC
2044 if (insn->nargs > 2)
2045 {
2046 reg_val = getreg_image (insn->arg[1].r);
2047
2048 if ( ((reg_val == 9) && (count > 7))
7fac7ff4
NC
2049 || ((reg_val == 10) && (count > 6))
2050 || ((reg_val == 11) && (count > 5))
2051 || ((reg_val == 12) && (count > 4))
2052 || ((reg_val == 13) && (count > 2))
2053 || ((reg_val == 14) && (count > 0)))
3d3d428f
NC
2054 as_warn (_("RA register is saved twice."));
2055
2056 /* Check if the third operand is "RA" or "ra" */
2057 if (!(((insn->arg[2].r) == ra) || ((insn->arg[2].r) == RA)))
2058 as_bad (_("`%s' Illegal use of registers."), ins_parse);
2059 }
2060
2061 if (insn->nargs > 1)
2062 {
2063 reg_val = getreg_image (insn->arg[1].r);
2064
2065 /* If register is a register pair ie r12/r13/r14 in operand1, then
2066 the count constant should be validated. */
2067 if (((reg_val == 11) && (count > 7))
7fac7ff4
NC
2068 || ((reg_val == 12) && (count > 6))
2069 || ((reg_val == 13) && (count > 4))
2070 || ((reg_val == 14) && (count > 2))
2071 || ((reg_val == 15) && (count > 0)))
3d3d428f
NC
2072 as_bad (_("`%s' Illegal count-register combination."), ins_parse);
2073 }
2074 else
2075 {
2076 /* Check if the operand is "RA" or "ra" */
2077 if (!(((insn->arg[0].r) == ra) || ((insn->arg[0].r) == RA)))
2078 as_bad (_("`%s' Illegal use of register."), ins_parse);
2079 }
2080 }
2081
2082 /* Some instruction assume the stack pointer as rptr operand.
2083 Issue an error when the register to be loaded is also SP. */
2084 if (instruction->flags & NO_SP)
2085 {
2086 if (getreg_image (insn->arg[1].r) == getreg_image (sp))
2087 as_bad (_("`%s' has undefined result"), ins_parse);
2088 }
2089
2090 /* If the rptr register is specified as one of the registers to be loaded,
2091 the final contents of rptr are undefined. Thus, we issue an error. */
2092 if (instruction->flags & NO_RPTR)
2093 {
2094 if ((1 << getreg_image (insn->arg[0].r)) & insn->arg[1].constant)
2095 as_bad (_("Same src/dest register is used (`r%d'),result is undefined"),
2096 getreg_image (insn->arg[0].r));
2097 }
2098}
2099
2100/* In some cases, we need to adjust the instruction pointer although a
2101 match was already found. Here, we gather all these cases.
2102 Returns 1 if instruction pointer was adjusted, otherwise 0. */
2103
2104static int
2105adjust_if_needed (ins *insn ATTRIBUTE_UNUSED)
2106{
2107 int ret_value = 0;
2108
2109 if ((IS_INSN_TYPE (CSTBIT_INS)) || (IS_INSN_TYPE (LD_STOR_INS)))
2110 {
2111 if ((instruction->operands[0].op_type == abs24)
2112 && ((insn->arg[0].constant) > 0xF00000))
2113 {
2114 insn->arg[0].constant &= 0xFFFFF;
2115 instruction--;
2116 ret_value = 1;
2117 }
2118 }
2119
2120 return ret_value;
2121}
2122
2123/* Assemble a single instruction:
2124 INSN is already parsed (that is, all operand values and types are set).
2125 For instruction to be assembled, we need to find an appropriate template in
2126 the instruction table, meeting the following conditions:
2127 1: Has the same number of operands.
2128 2: Has the same operand types.
2129 3: Each operand size is sufficient to represent the instruction's values.
2130 Returns 1 upon success, 0 upon failure. */
2131
2132static int
2133assemble_insn (char *mnemonic, ins *insn)
2134{
2135 /* Type of each operand in the current template. */
2136 argtype cur_type[MAX_OPERANDS];
2137 /* Size (in bits) of each operand in the current template. */
2138 unsigned int cur_size[MAX_OPERANDS];
2139 /* Flags of each operand in the current template. */
2140 unsigned int cur_flags[MAX_OPERANDS];
2141 /* Instruction type to match. */
2142 unsigned int ins_type;
2143 /* Boolean flag to mark whether a match was found. */
2144 int match = 0;
2145 int i;
2146 /* Nonzero if an instruction with same number of operands was found. */
2147 int found_same_number_of_operands = 0;
2148 /* Nonzero if an instruction with same argument types was found. */
2149 int found_same_argument_types = 0;
2150 /* Nonzero if a constant was found within the required range. */
2151 int found_const_within_range = 0;
2152 /* Argument number of an operand with invalid type. */
2153 int invalid_optype = -1;
2154 /* Argument number of an operand with invalid constant value. */
2155 int invalid_const = -1;
2156 /* Operand error (used for issuing various constant error messages). */
2157 op_err op_error, const_err = OP_LEGAL;
2158
2159/* Retrieve data (based on FUNC) for each operand of a given instruction. */
2160#define GET_CURRENT_DATA(FUNC, ARRAY) \
2161 for (i = 0; i < insn->nargs; i++) \
2162 ARRAY[i] = FUNC (instruction->operands[i].op_type)
2163
2164#define GET_CURRENT_TYPE GET_CURRENT_DATA (get_optype, cur_type)
2165#define GET_CURRENT_SIZE GET_CURRENT_DATA (get_opbits, cur_size)
2166#define GET_CURRENT_FLAGS GET_CURRENT_DATA (get_opflags, cur_flags)
2167
2168 /* Instruction has no operands -> only copy the constant opcode. */
2169 if (insn->nargs == 0)
2170 {
2171 output_opcode[0] = BIN (instruction->match, instruction->match_bits);
2172 return 1;
2173 }
2174
2175 /* In some case, same mnemonic can appear with different instruction types.
2176 For example, 'storb' is supported with 3 different types :
2177 LD_STOR_INS, LD_STOR_INS_INC, STOR_IMM_INS.
2178 We assume that when reaching this point, the instruction type was
2179 pre-determined. We need to make sure that the type stays the same
2180 during a search for matching instruction. */
2181 ins_type = CR16_INS_TYPE (instruction->flags);
2182
2183 while (/* Check that match is still not found. */
2184 match != 1
2185 /* Check we didn't get to end of table. */
2186 && instruction->mnemonic != NULL
2187 /* Check that the actual mnemonic is still available. */
2188 && IS_INSN_MNEMONIC (mnemonic)
2189 /* Check that the instruction type wasn't changed. */
2190 && IS_INSN_TYPE (ins_type))
2191 {
2192 /* Check whether number of arguments is legal. */
2193 if (get_number_of_operands () != insn->nargs)
2194 goto next_insn;
2195 found_same_number_of_operands = 1;
2196
2197 /* Initialize arrays with data of each operand in current template. */
2198 GET_CURRENT_TYPE;
2199 GET_CURRENT_SIZE;
2200 GET_CURRENT_FLAGS;
2201
2202 /* Check for type compatibility. */
2203 for (i = 0; i < insn->nargs; i++)
2204 {
2205 if (cur_type[i] != insn->arg[i].type)
2206 {
2207 if (invalid_optype == -1)
2208 invalid_optype = i + 1;
2209 goto next_insn;
2210 }
2211 }
2212 found_same_argument_types = 1;
2213
2214 for (i = 0; i < insn->nargs; i++)
2215 {
2216 /* If 'bal' instruction size is '2' and reg operand is not 'ra'
2217 then goto next instruction. */
2218 if (IS_INSN_MNEMONIC ("bal") && (i == 0)
7fac7ff4 2219 && (instruction->size == 2) && (insn->arg[i].rp != 14))
3d3d428f
NC
2220 goto next_insn;
2221
2222 /* If 'storb' instruction with 'sp' reg and 16-bit disp of
2223 * reg-pair, leads to undifined trap, so this should use
2224 * 20-bit disp of reg-pair. */
2225 if (IS_INSN_MNEMONIC ("storb") && (instruction->size == 2)
7fac7ff4 2226 && (insn->arg[i].r == 15) && (insn->arg[i + 1].type == arg_crp))
3d3d428f
NC
2227 goto next_insn;
2228
2229 /* Only check range - don't update the constant's value, since the
2230 current instruction may not be the last we try to match.
2231 The constant's value will be updated later, right before printing
2232 it to the object file. */
2233 if ((insn->arg[i].X_op == O_constant)
2234 && (op_error = check_range (&insn->arg[i].constant, cur_size[i],
2235 cur_flags[i], 0)))
2236 {
2237 if (invalid_const == -1)
2238 {
2239 invalid_const = i + 1;
2240 const_err = op_error;
2241 }
2242 goto next_insn;
2243 }
2244 /* For symbols, we make sure the relocation size (which was already
2245 determined) is sufficient. */
2246 else if ((insn->arg[i].X_op == O_symbol)
2247 && ((bfd_reloc_type_lookup (stdoutput, insn->rtype))->bitsize
7fac7ff4 2248 > cur_size[i]))
3d3d428f
NC
2249 goto next_insn;
2250 }
2251 found_const_within_range = 1;
2252
2253 /* If we got till here -> Full match is found. */
2254 match = 1;
2255 break;
2256
2257/* Try again with next instruction. */
2258next_insn:
2259 instruction++;
2260 }
2261
2262 if (!match)
2263 {
2264 /* We haven't found a match - instruction can't be assembled. */
2265 if (!found_same_number_of_operands)
2266 as_bad (_("Incorrect number of operands"));
2267 else if (!found_same_argument_types)
2268 as_bad (_("Illegal type of operand (arg %d)"), invalid_optype);
2269 else if (!found_const_within_range)
2270 {
2271 switch (const_err)
2272 {
7fac7ff4
NC
2273 case OP_OUT_OF_RANGE:
2274 as_bad (_("Operand out of range (arg %d)"), invalid_const);
2275 break;
2276 case OP_NOT_EVEN:
2277 as_bad (_("Operand has odd displacement (arg %d)"), invalid_const);
2278 break;
2279 default:
2280 as_bad (_("Illegal operand (arg %d)"), invalid_const);
2281 break;
3d3d428f
NC
2282 }
2283 }
2284
2285 return 0;
2286 }
2287 else
2288 /* Full match - print the encoding to output file. */
2289 {
2290 /* Make further checkings (such that couldn't be made earlier).
2291 Warn the user if necessary. */
2292 warn_if_needed (insn);
2293
2294 /* Check whether we need to adjust the instruction pointer. */
2295 if (adjust_if_needed (insn))
2296 /* If instruction pointer was adjusted, we need to update
2297 the size of the current template operands. */
2298 GET_CURRENT_SIZE;
2299
2300 for (i = 0; i < insn->nargs; i++)
2301 {
2302 int j = instruction->flags & REVERSE_MATCH ?
2303 i == 0 ? 1 :
2304 i == 1 ? 0 : i :
2305 i;
2306
2307 /* This time, update constant value before printing it. */
2308 if ((insn->arg[j].X_op == O_constant)
2309 && (check_range (&insn->arg[j].constant, cur_size[j],
2310 cur_flags[j], 1) != OP_LEGAL))
2311 as_fatal (_("Illegal operand (arg %d)"), j+1);
2312 }
2313
2314 /* First, copy the instruction's opcode. */
2315 output_opcode[0] = BIN (instruction->match, instruction->match_bits);
2316
2317 for (i = 0; i < insn->nargs; i++)
2318 {
2319 /* For BAL (ra),disp17 instuction only. And also set the
2320 DISP24a relocation type. */
2321 if (IS_INSN_MNEMONIC ("bal") && (instruction->size == 2) && i == 0)
2322 {
2323 insn->rtype = BFD_RELOC_CR16_DISP24a;
2324 continue;
2325 }
2326 cur_arg_num = i;
2327 print_operand (cur_size[i], instruction->operands[i].shift,
2328 &insn->arg[i]);
2329 }
2330 }
2331
2332 return 1;
2333}
2334
2335/* Print the instruction.
2336 Handle also cases where the instruction is relaxable/relocatable. */
2337
2338static void
2339print_insn (ins *insn)
2340{
2341 unsigned int i, j, insn_size;
2342 char *this_frag;
2343 unsigned short words[4];
2344 int addr_mod;
2345
2346 /* Arrange the insn encodings in a WORD size array. */
2347 for (i = 0, j = 0; i < 2; i++)
2348 {
2349 words[j++] = (output_opcode[i] >> 16) & 0xFFFF;
2350 words[j++] = output_opcode[i] & 0xFFFF;
2351 }
2352
3d3d428f 2353 /* Handle relocation. */
7fac7ff4
NC
2354 if ((instruction->flags & RELAXABLE) && relocatable)
2355 {
2356 int relax_subtype;
2357 /* Write the maximal instruction size supported. */
2358 insn_size = INSN_MAX_SIZE;
2359
2360 if (IS_INSN_TYPE (BRANCH_INS))
2361 {
2362 switch (insn->rtype)
2363 {
2364 case BFD_RELOC_CR16_DISP24:
2365 relax_subtype = 2;
2366 break;
2367 case BFD_RELOC_CR16_DISP16:
2368 relax_subtype = 1;
2369 break;
2370 default:
2371 relax_subtype = 0;
2372 break;
2373 }
2374 }
2375 else
2376 abort ();
2377
2378 this_frag = frag_var (rs_machine_dependent, insn_size *2,
2379 4, relax_subtype,
2380 insn->exp.X_add_symbol,
2381 insn->exp.X_add_number,
2382 0);
2383 }
2384 else
3d3d428f 2385 {
7fac7ff4
NC
2386 insn_size = instruction->size;
2387 this_frag = frag_more (insn_size * 2);
3d3d428f 2388
7fac7ff4
NC
2389 if ((relocatable) && (insn->rtype != BFD_RELOC_NONE))
2390 {
2391 reloc_howto_type *reloc_howto;
2392 int size;
3d3d428f 2393
7fac7ff4
NC
2394 reloc_howto = bfd_reloc_type_lookup (stdoutput, insn->rtype);
2395
2396 if (!reloc_howto)
2397 abort ();
3d3d428f 2398
7fac7ff4 2399 size = bfd_get_reloc_size (reloc_howto);
3d3d428f 2400
7fac7ff4
NC
2401 if (size < 1 || size > 4)
2402 abort ();
3d3d428f 2403
7fac7ff4
NC
2404 fix_new_exp (frag_now, this_frag - frag_now->fr_literal,
2405 size, &insn->exp, reloc_howto->pc_relative,
2406 insn->rtype);
2407 }
3d3d428f
NC
2408 }
2409
2410 /* Verify a 2-byte code alignment. */
2411 addr_mod = frag_now_fix () & 1;
2412 if (frag_now->has_code && frag_now->insn_addr != addr_mod)
2413 as_bad (_("instruction address is not a multiple of 2"));
2414 frag_now->insn_addr = addr_mod;
2415 frag_now->has_code = 1;
2416
2417 /* Write the instruction encoding to frag. */
2418 for (i = 0; i < insn_size; i++)
2419 {
2420 md_number_to_chars (this_frag, (valueT) words[i], 2);
2421 this_frag += 2;
2422 }
2423}
2424
2425/* This is the guts of the machine-dependent assembler. OP points to a
2426 machine dependent instruction. This function is supposed to emit
2427 the frags/bytes it assembles to. */
2428
2429void
2430md_assemble (char *op)
2431{
2432 ins cr16_ins;
2433 char *param, param1[32];
2434 char c;
2435
2436 /* Reset global variables for a new instruction. */
2437 reset_vars (op);
2438
2439 /* Strip the mnemonic. */
2440 for (param = op; *param != 0 && !ISSPACE (*param); param++)
2441 ;
2442 c = *param;
2443 *param++ = '\0';
2444
2445 /* bCC instuctions and adjust the mnemonic by adding extra white spaces. */
2446 if (is_bcc_insn (op))
2447 {
2448 strcpy (param1, get_b_cc (op));
2449 op = "b";
2450 strcat (param1,",");
2451 strcat (param1, param);
2452 param = (char *) &param1;
2453 }
2454
2455 /* Checking the cinv options and adjust the mnemonic by removing the
2456 extra white spaces. */
2457 if (streq ("cinv", op))
2458 {
2459 /* Validate the cinv options. */
2460 check_cinv_options (param);
2461 strcat (op, param);
2462 }
2463
2464 /* MAPPING - SHIFT INSN, if imm4/imm16 positive values
2465 lsh[b/w] imm4/imm6, reg ==> ashu[b/w] imm4/imm16, reg
2466 as CR16 core doesn't support lsh[b/w] right shift operaions. */
2467 if ((streq ("lshb", op) || streq ("lshw", op) || streq ("lshd", op))
2468 && (param [0] == '$'))
2469 {
2470 strcpy (param1, param);
2471 /* Find the instruction. */
2472 instruction = (const inst *) hash_find (cr16_inst_hash, op);
2473 parse_operands (&cr16_ins, param1);
2474 if (((&cr16_ins)->arg[0].type == arg_ic)
7fac7ff4 2475 && ((&cr16_ins)->arg[0].constant >= 0))
3d3d428f
NC
2476 {
2477 if (streq ("lshb", op))
7fac7ff4 2478 op = "ashub";
3d3d428f 2479 else if (streq ("lshd", op))
7fac7ff4
NC
2480 op = "ashud";
2481 else
2482 op = "ashuw";
3d3d428f
NC
2483 }
2484 }
2485
2486 /* Find the instruction. */
2487 instruction = (const inst *) hash_find (cr16_inst_hash, op);
2488 if (instruction == NULL)
2489 {
2490 as_bad (_("Unknown opcode: `%s'"), op);
2491 return;
2492 }
2493
2494 /* Tie dwarf2 debug info to the address at the start of the insn. */
2495 dwarf2_emit_insn (0);
2496
2497 /* Parse the instruction's operands. */
2498 parse_insn (&cr16_ins, param);
2499
2500 /* Assemble the instruction - return upon failure. */
2501 if (assemble_insn (op, &cr16_ins) == 0)
2502 return;
2503
2504 /* Print the instruction. */
2505 print_insn (&cr16_ins);
2506}