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