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