tc-cr16.c: Use memmove to concatenate 2 overlapping strings
[deliverable/binutils-gdb.git] / gas / config / tc-crx.c
1 /* tc-crx.c -- Assembler code for the CRX CPU core.
2 Copyright (C) 2004-2020 Free Software Foundation, Inc.
3
4 Contributed by Tomer Levi, NSC, Israel.
5 Originally written for GAS 2.12 by Tomer Levi, NSC, Israel.
6 Updates, BFDizing, GNUifying and ELF support by Tomer Levi.
7
8 This file is part of GAS, the GNU Assembler.
9
10 GAS is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 3, or (at your option)
13 any later version.
14
15 GAS is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with GAS; see the file COPYING. If not, write to the
22 Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
23 MA 02110-1301, USA. */
24
25 #include "as.h"
26 #include "bfd_stdint.h"
27 #include "safe-ctype.h"
28 #include "dwarf2dbg.h"
29 #include "opcode/crx.h"
30 #include "elf/crx.h"
31
32 /* Word is considered here as a 16-bit unsigned short int. */
33 #define WORD_SHIFT 16
34
35 /* Register is 4-bit size. */
36 #define REG_SIZE 4
37
38 /* Maximum size of a single instruction (in words). */
39 #define INSN_MAX_SIZE 3
40
41 /* Maximum bits which may be set in a `mask16' operand. */
42 #define MAX_REGS_IN_MASK16 8
43
44 /* Utility macros for string comparison. */
45 #define streq(a, b) (strcmp (a, b) == 0)
46 #define strneq(a, b, c) (strncmp (a, b, c) == 0)
47
48 /* Assign a number NUM, shifted by SHIFT bytes, into a location
49 pointed by index BYTE of array 'output_opcode'. */
50 #define CRX_PRINT(BYTE, NUM, SHIFT) output_opcode[BYTE] |= (NUM << SHIFT)
51
52 /* Operand errors. */
53 typedef enum
54 {
55 OP_LEGAL = 0, /* Legal operand. */
56 OP_OUT_OF_RANGE, /* Operand not within permitted range. */
57 OP_NOT_EVEN, /* Operand is Odd number, should be even. */
58 OP_ILLEGAL_DISPU4, /* Operand is not within DISPU4 range. */
59 OP_ILLEGAL_CST4, /* Operand is not within CST4 range. */
60 OP_NOT_UPPER_64KB /* Operand is not within the upper 64KB
61 (0xFFFF0000-0xFFFFFFFF). */
62 }
63 op_err;
64
65 /* Opcode mnemonics hash table. */
66 static struct hash_control *crx_inst_hash;
67 /* CRX registers hash table. */
68 static struct hash_control *reg_hash;
69 /* CRX coprocessor registers hash table. */
70 static struct hash_control *copreg_hash;
71 /* Current instruction we're assembling. */
72 static const inst *instruction;
73
74 /* Global variables. */
75
76 /* Array to hold an instruction encoding. */
77 static long output_opcode[2];
78
79 /* Nonzero means a relocatable symbol. */
80 static int relocatable;
81
82 /* A copy of the original instruction (used in error messages). */
83 static char ins_parse[MAX_INST_LEN];
84
85 /* The current processed argument number. */
86 static int cur_arg_num;
87
88 /* Generic assembler global variables which must be defined by all targets. */
89
90 /* Characters which always start a comment. */
91 const char comment_chars[] = "#";
92
93 /* Characters which start a comment at the beginning of a line. */
94 const char line_comment_chars[] = "#";
95
96 /* This array holds machine specific line separator characters. */
97 const char line_separator_chars[] = ";";
98
99 /* Chars that can be used to separate mant from exp in floating point nums. */
100 const char EXP_CHARS[] = "eE";
101
102 /* Chars that mean this number is a floating point constant as in 0f12.456 */
103 const char FLT_CHARS[] = "f'";
104
105 /* Target-specific multicharacter options, not const-declared at usage. */
106 const char *md_shortopts = "";
107 struct option md_longopts[] =
108 {
109 {NULL, no_argument, NULL, 0}
110 };
111 size_t md_longopts_size = sizeof (md_longopts);
112
113 /* This table describes all the machine specific pseudo-ops
114 the assembler has to support. The fields are:
115 *** Pseudo-op name without dot.
116 *** Function to call to execute this pseudo-op.
117 *** Integer arg to pass to the function. */
118
119 const pseudo_typeS md_pseudo_table[] =
120 {
121 /* In CRX machine, align is in bytes (not a ptwo boundary). */
122 {"align", s_align_bytes, 0},
123 {0, 0, 0}
124 };
125
126 /* CRX relaxation table. */
127 const relax_typeS md_relax_table[] =
128 {
129 /* bCC */
130 {0xfa, -0x100, 2, 1}, /* 8 */
131 {0xfffe, -0x10000, 4, 2}, /* 16 */
132 {0xfffffffe, -0xfffffffe, 6, 0}, /* 32 */
133
134 /* bal */
135 {0xfffe, -0x10000, 4, 4}, /* 16 */
136 {0xfffffffe, -0xfffffffe, 6, 0}, /* 32 */
137
138 /* cmpbr/bcop */
139 {0xfe, -0x100, 4, 6}, /* 8 */
140 {0xfffffe, -0x1000000, 6, 0} /* 24 */
141 };
142
143 static void reset_vars (char *);
144 static reg get_register (char *);
145 static copreg get_copregister (char *);
146 static argtype get_optype (operand_type);
147 static int get_opbits (operand_type);
148 static int get_opflags (operand_type);
149 static int get_number_of_operands (void);
150 static void parse_operand (char *, ins *);
151 static int gettrap (const char *);
152 static void handle_LoadStor (const char *);
153 static int get_cinv_parameters (const char *);
154 static long getconstant (long, int);
155 static op_err check_range (long *, int, unsigned int, int);
156 static int getreg_image (reg);
157 static void parse_operands (ins *, char *);
158 static void parse_insn (ins *, char *);
159 static void print_operand (int, int, argument *);
160 static void print_constant (int, int, argument *);
161 static int exponent2scale (int);
162 static void mask_reg (int, unsigned short *);
163 static void process_label_constant (char *, ins *);
164 static void set_operand (char *, ins *);
165 static char * preprocess_reglist (char *, int *);
166 static int assemble_insn (char *, ins *);
167 static void print_insn (ins *);
168 static void warn_if_needed (ins *);
169 static int adjust_if_needed (ins *);
170
171 /* Return the bit size for a given operand. */
172
173 static int
174 get_opbits (operand_type op)
175 {
176 if (op < MAX_OPRD)
177 return crx_optab[op].bit_size;
178 else
179 return 0;
180 }
181
182 /* Return the argument type of a given operand. */
183
184 static argtype
185 get_optype (operand_type op)
186 {
187 if (op < MAX_OPRD)
188 return crx_optab[op].arg_type;
189 else
190 return nullargs;
191 }
192
193 /* Return the flags of a given operand. */
194
195 static int
196 get_opflags (operand_type op)
197 {
198 if (op < MAX_OPRD)
199 return crx_optab[op].flags;
200 else
201 return 0;
202 }
203
204 /* Get the core processor register 'reg_name'. */
205
206 static reg
207 get_register (char *reg_name)
208 {
209 const reg_entry *rreg;
210
211 rreg = (const reg_entry *) hash_find (reg_hash, reg_name);
212
213 if (rreg != NULL)
214 return rreg->value.reg_val;
215 else
216 return nullregister;
217 }
218
219 /* Get the coprocessor register 'copreg_name'. */
220
221 static copreg
222 get_copregister (char *copreg_name)
223 {
224 const reg_entry *coreg;
225
226 coreg = (const reg_entry *) hash_find (copreg_hash, copreg_name);
227
228 if (coreg != NULL)
229 return coreg->value.copreg_val;
230 else
231 return nullcopregister;
232 }
233
234 /* Round up a section size to the appropriate boundary. */
235
236 valueT
237 md_section_align (segT seg, valueT val)
238 {
239 /* Round .text section to a multiple of 2. */
240 if (seg == text_section)
241 return (val + 1) & ~1;
242 return val;
243 }
244
245 /* Parse an operand that is machine-specific (remove '*'). */
246
247 void
248 md_operand (expressionS * exp)
249 {
250 char c = *input_line_pointer;
251
252 switch (c)
253 {
254 case '*':
255 input_line_pointer++;
256 expression (exp);
257 break;
258 default:
259 break;
260 }
261 }
262
263 /* Reset global variables before parsing a new instruction. */
264
265 static void
266 reset_vars (char *op)
267 {
268 cur_arg_num = relocatable = 0;
269 memset (& output_opcode, '\0', sizeof (output_opcode));
270
271 /* Save a copy of the original OP (used in error messages). */
272 strncpy (ins_parse, op, sizeof ins_parse - 1);
273 ins_parse [sizeof ins_parse - 1] = 0;
274 }
275
276 /* This macro decides whether a particular reloc is an entry in a
277 switch table. It is used when relaxing, because the linker needs
278 to know about all such entries so that it can adjust them if
279 necessary. */
280
281 #define SWITCH_TABLE(fix) \
282 ( (fix)->fx_addsy != NULL \
283 && (fix)->fx_subsy != NULL \
284 && S_GET_SEGMENT ((fix)->fx_addsy) == \
285 S_GET_SEGMENT ((fix)->fx_subsy) \
286 && S_GET_SEGMENT (fix->fx_addsy) != undefined_section \
287 && ( (fix)->fx_r_type == BFD_RELOC_CRX_NUM8 \
288 || (fix)->fx_r_type == BFD_RELOC_CRX_NUM16 \
289 || (fix)->fx_r_type == BFD_RELOC_CRX_NUM32))
290
291 /* See whether we need to force a relocation into the output file.
292 This is used to force out switch and PC relative relocations when
293 relaxing. */
294
295 int
296 crx_force_relocation (fixS *fix)
297 {
298 if (generic_force_reloc (fix) || SWITCH_TABLE (fix))
299 return 1;
300
301 return 0;
302 }
303
304 /* Generate a relocation entry for a fixup. */
305
306 arelent *
307 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS * fixP)
308 {
309 arelent * reloc;
310
311 reloc = XNEW (arelent);
312 reloc->sym_ptr_ptr = XNEW (asymbol *);
313 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy);
314 reloc->address = fixP->fx_frag->fr_address + fixP->fx_where;
315 reloc->addend = fixP->fx_offset;
316
317 if (fixP->fx_subsy != NULL)
318 {
319 if (SWITCH_TABLE (fixP))
320 {
321 /* Keep the current difference in the addend. */
322 reloc->addend = (S_GET_VALUE (fixP->fx_addsy)
323 - S_GET_VALUE (fixP->fx_subsy) + fixP->fx_offset);
324
325 switch (fixP->fx_r_type)
326 {
327 case BFD_RELOC_CRX_NUM8:
328 fixP->fx_r_type = BFD_RELOC_CRX_SWITCH8;
329 break;
330 case BFD_RELOC_CRX_NUM16:
331 fixP->fx_r_type = BFD_RELOC_CRX_SWITCH16;
332 break;
333 case BFD_RELOC_CRX_NUM32:
334 fixP->fx_r_type = BFD_RELOC_CRX_SWITCH32;
335 break;
336 default:
337 abort ();
338 break;
339 }
340 }
341 else
342 {
343 /* We only resolve difference expressions in the same section. */
344 as_bad_where (fixP->fx_file, fixP->fx_line,
345 _("can't resolve `%s' {%s section} - `%s' {%s section}"),
346 fixP->fx_addsy ? S_GET_NAME (fixP->fx_addsy) : "0",
347 segment_name (fixP->fx_addsy
348 ? S_GET_SEGMENT (fixP->fx_addsy)
349 : absolute_section),
350 S_GET_NAME (fixP->fx_subsy),
351 segment_name (S_GET_SEGMENT (fixP->fx_addsy)));
352 }
353 }
354
355 gas_assert ((int) fixP->fx_r_type > 0);
356 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type);
357
358 if (reloc->howto == (reloc_howto_type *) NULL)
359 {
360 as_bad_where (fixP->fx_file, fixP->fx_line,
361 _("internal error: reloc %d (`%s') not supported by object file format"),
362 fixP->fx_r_type,
363 bfd_get_reloc_code_name (fixP->fx_r_type));
364 return NULL;
365 }
366 gas_assert (!fixP->fx_pcrel == !reloc->howto->pc_relative);
367
368 return reloc;
369 }
370
371 /* Prepare machine-dependent frags for relaxation. */
372
373 int
374 md_estimate_size_before_relax (fragS *fragp, asection *seg)
375 {
376 /* If symbol is undefined or located in a different section,
377 select the largest supported relocation. */
378 relax_substateT subtype;
379 relax_substateT rlx_state[] = {0, 2,
380 3, 4,
381 5, 6};
382
383 for (subtype = 0; subtype < ARRAY_SIZE (rlx_state); subtype += 2)
384 {
385 if (fragp->fr_subtype == rlx_state[subtype]
386 && (!S_IS_DEFINED (fragp->fr_symbol)
387 || seg != S_GET_SEGMENT (fragp->fr_symbol)))
388 {
389 fragp->fr_subtype = rlx_state[subtype + 1];
390 break;
391 }
392 }
393
394 if (fragp->fr_subtype >= ARRAY_SIZE (md_relax_table))
395 abort ();
396
397 return md_relax_table[fragp->fr_subtype].rlx_length;
398 }
399
400 void
401 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, fragS *fragP)
402 {
403 /* 'opcode' points to the start of the instruction, whether
404 we need to change the instruction's fixed encoding. */
405 char *opcode = fragP->fr_literal + fragP->fr_fix;
406 bfd_reloc_code_real_type reloc;
407
408 subseg_change (sec, 0);
409
410 switch (fragP->fr_subtype)
411 {
412 case 0:
413 reloc = BFD_RELOC_CRX_REL8;
414 break;
415 case 1:
416 *opcode = 0x7e;
417 reloc = BFD_RELOC_CRX_REL16;
418 break;
419 case 2:
420 *opcode = 0x7f;
421 reloc = BFD_RELOC_CRX_REL32;
422 break;
423 case 3:
424 reloc = BFD_RELOC_CRX_REL16;
425 break;
426 case 4:
427 *++opcode = 0x31;
428 reloc = BFD_RELOC_CRX_REL32;
429 break;
430 case 5:
431 reloc = BFD_RELOC_CRX_REL8_CMP;
432 break;
433 case 6:
434 *++opcode = 0x31;
435 reloc = BFD_RELOC_CRX_REL24;
436 break;
437 default:
438 abort ();
439 break;
440 }
441
442 fix_new (fragP, fragP->fr_fix,
443 bfd_get_reloc_size (bfd_reloc_type_lookup (stdoutput, reloc)),
444 fragP->fr_symbol, fragP->fr_offset, 1, reloc);
445 fragP->fr_var = 0;
446 fragP->fr_fix += md_relax_table[fragP->fr_subtype].rlx_length;
447 }
448
449 /* Process machine-dependent command line options. Called once for
450 each option on the command line that the machine-independent part of
451 GAS does not understand. */
452
453 int
454 md_parse_option (int c ATTRIBUTE_UNUSED, const char *arg ATTRIBUTE_UNUSED)
455 {
456 return 0;
457 }
458
459 /* Machine-dependent usage-output. */
460
461 void
462 md_show_usage (FILE *stream ATTRIBUTE_UNUSED)
463 {
464 return;
465 }
466
467 const char *
468 md_atof (int type, char *litP, int *sizeP)
469 {
470 return ieee_md_atof (type, litP, sizeP, target_big_endian);
471 }
472
473 /* Apply a fixS (fixup of an instruction or data that we didn't have
474 enough info to complete immediately) to the data in a frag.
475 Since linkrelax is nonzero and TC_LINKRELAX_FIXUP is defined to disable
476 relaxation of debug sections, this function is called only when
477 fixuping relocations of debug sections. */
478
479 void
480 md_apply_fix (fixS *fixP, valueT *valP, segT seg)
481 {
482 valueT val = * valP;
483 char *buf = fixP->fx_frag->fr_literal + fixP->fx_where;
484 fixP->fx_offset = 0;
485
486 switch (fixP->fx_r_type)
487 {
488 case BFD_RELOC_CRX_NUM8:
489 bfd_put_8 (stdoutput, (unsigned char) val, buf);
490 break;
491 case BFD_RELOC_CRX_NUM16:
492 bfd_put_16 (stdoutput, val, buf);
493 break;
494 case BFD_RELOC_CRX_NUM32:
495 bfd_put_32 (stdoutput, val, buf);
496 break;
497 default:
498 /* We shouldn't ever get here because linkrelax is nonzero. */
499 abort ();
500 break;
501 }
502
503 fixP->fx_done = 0;
504
505 if (fixP->fx_addsy == NULL
506 && fixP->fx_pcrel == 0)
507 fixP->fx_done = 1;
508
509 if (fixP->fx_pcrel == 1
510 && fixP->fx_addsy != NULL
511 && S_GET_SEGMENT (fixP->fx_addsy) == seg)
512 fixP->fx_done = 1;
513 }
514
515 /* The location from which a PC relative jump should be calculated,
516 given a PC relative reloc. */
517
518 long
519 md_pcrel_from (fixS *fixp)
520 {
521 return fixp->fx_frag->fr_address + fixp->fx_where;
522 }
523
524 /* This function is called once, at assembler startup time. This should
525 set up all the tables, etc that the MD part of the assembler needs. */
526
527 void
528 md_begin (void)
529 {
530 const char *hashret = NULL;
531 int i = 0;
532
533 /* Set up a hash table for the instructions. */
534 if ((crx_inst_hash = hash_new ()) == NULL)
535 as_fatal (_("Virtual memory exhausted"));
536
537 while (crx_instruction[i].mnemonic != NULL)
538 {
539 const char *mnemonic = crx_instruction[i].mnemonic;
540
541 hashret = hash_insert (crx_inst_hash, mnemonic,
542 (void *) &crx_instruction[i]);
543
544 if (hashret != NULL && *hashret != '\0')
545 as_fatal (_("Can't hash `%s': %s\n"), crx_instruction[i].mnemonic,
546 *hashret == 0 ? _("(unknown reason)") : hashret);
547
548 /* Insert unique names into hash table. The CRX instruction set
549 has many identical opcode names that have different opcodes based
550 on the operands. This hash table then provides a quick index to
551 the first opcode with a particular name in the opcode table. */
552 do
553 {
554 ++i;
555 }
556 while (crx_instruction[i].mnemonic != NULL
557 && streq (crx_instruction[i].mnemonic, mnemonic));
558 }
559
560 /* Initialize reg_hash hash table. */
561 if ((reg_hash = hash_new ()) == NULL)
562 as_fatal (_("Virtual memory exhausted"));
563
564 {
565 const reg_entry *regtab;
566
567 for (regtab = crx_regtab;
568 regtab < (crx_regtab + NUMREGS); regtab++)
569 {
570 hashret = hash_insert (reg_hash, regtab->name, (void *) regtab);
571 if (hashret)
572 as_fatal (_("Internal error: Can't hash %s: %s"),
573 regtab->name,
574 hashret);
575 }
576 }
577
578 /* Initialize copreg_hash hash table. */
579 if ((copreg_hash = hash_new ()) == NULL)
580 as_fatal (_("Virtual memory exhausted"));
581
582 {
583 const reg_entry *copregtab;
584
585 for (copregtab = crx_copregtab; copregtab < (crx_copregtab + NUMCOPREGS);
586 copregtab++)
587 {
588 hashret = hash_insert (copreg_hash, copregtab->name,
589 (void *) copregtab);
590 if (hashret)
591 as_fatal (_("Internal error: Can't hash %s: %s"),
592 copregtab->name,
593 hashret);
594 }
595 }
596 /* Set linkrelax here to avoid fixups in most sections. */
597 linkrelax = 1;
598 }
599
600 /* Process constants (immediate/absolute)
601 and labels (jump targets/Memory locations). */
602
603 static void
604 process_label_constant (char *str, ins * crx_ins)
605 {
606 char *saved_input_line_pointer;
607 argument *cur_arg = &crx_ins->arg[cur_arg_num]; /* Current argument. */
608
609 saved_input_line_pointer = input_line_pointer;
610 input_line_pointer = str;
611
612 expression (&crx_ins->exp);
613
614 switch (crx_ins->exp.X_op)
615 {
616 case O_big:
617 case O_absent:
618 /* Missing or bad expr becomes absolute 0. */
619 as_bad (_("missing or invalid displacement expression `%s' taken as 0"),
620 str);
621 crx_ins->exp.X_op = O_constant;
622 crx_ins->exp.X_add_number = 0;
623 crx_ins->exp.X_add_symbol = (symbolS *) 0;
624 crx_ins->exp.X_op_symbol = (symbolS *) 0;
625 /* Fall through. */
626
627 case O_constant:
628 cur_arg->X_op = O_constant;
629 cur_arg->constant = crx_ins->exp.X_add_number;
630 break;
631
632 case O_symbol:
633 case O_subtract:
634 case O_add:
635 cur_arg->X_op = O_symbol;
636 crx_ins->rtype = BFD_RELOC_NONE;
637 relocatable = 1;
638
639 switch (cur_arg->type)
640 {
641 case arg_cr:
642 if (IS_INSN_TYPE (LD_STOR_INS_INC))
643 crx_ins->rtype = BFD_RELOC_CRX_REGREL12;
644 else if (IS_INSN_TYPE (CSTBIT_INS)
645 || IS_INSN_TYPE (STOR_IMM_INS))
646 crx_ins->rtype = BFD_RELOC_CRX_REGREL28;
647 else
648 crx_ins->rtype = BFD_RELOC_CRX_REGREL32;
649 break;
650
651 case arg_idxr:
652 crx_ins->rtype = BFD_RELOC_CRX_REGREL22;
653 break;
654
655 case arg_c:
656 if (IS_INSN_MNEMONIC ("bal") || IS_INSN_TYPE (DCR_BRANCH_INS))
657 crx_ins->rtype = BFD_RELOC_CRX_REL16;
658 else if (IS_INSN_TYPE (BRANCH_INS))
659 crx_ins->rtype = BFD_RELOC_CRX_REL8;
660 else if (IS_INSN_TYPE (LD_STOR_INS) || IS_INSN_TYPE (STOR_IMM_INS)
661 || IS_INSN_TYPE (CSTBIT_INS))
662 crx_ins->rtype = BFD_RELOC_CRX_ABS32;
663 else if (IS_INSN_TYPE (BRANCH_NEQ_INS))
664 crx_ins->rtype = BFD_RELOC_CRX_REL4;
665 else if (IS_INSN_TYPE (CMPBR_INS) || IS_INSN_TYPE (COP_BRANCH_INS))
666 crx_ins->rtype = BFD_RELOC_CRX_REL8_CMP;
667 break;
668
669 case arg_ic:
670 if (IS_INSN_TYPE (ARITH_INS))
671 crx_ins->rtype = BFD_RELOC_CRX_IMM32;
672 else if (IS_INSN_TYPE (ARITH_BYTE_INS))
673 crx_ins->rtype = BFD_RELOC_CRX_IMM16;
674 break;
675 default:
676 break;
677 }
678 break;
679
680 default:
681 cur_arg->X_op = crx_ins->exp.X_op;
682 break;
683 }
684
685 input_line_pointer = saved_input_line_pointer;
686 return;
687 }
688
689 /* Get the values of the scale to be encoded -
690 used for the scaled index mode of addressing. */
691
692 static int
693 exponent2scale (int val)
694 {
695 int exponent;
696
697 /* If 'val' is 0, the following 'for' will be an endless loop. */
698 if (val == 0)
699 return 0;
700
701 for (exponent = 0; (val != 1); val >>= 1, exponent++)
702 ;
703
704 return exponent;
705 }
706
707 /* Parsing different types of operands
708 -> constants Immediate/Absolute/Relative numbers
709 -> Labels Relocatable symbols
710 -> (rbase) Register base
711 -> disp(rbase) Register relative
712 -> disp(rbase)+ Post-increment mode
713 -> disp(rbase,ridx,scl) Register index mode */
714
715 static void
716 set_operand (char *operand, ins * crx_ins)
717 {
718 char *operandS; /* Pointer to start of sub-operand. */
719 char *operandE; /* Pointer to end of sub-operand. */
720 expressionS scale;
721 int scale_val;
722 char *input_save, c;
723 argument *cur_arg = &crx_ins->arg[cur_arg_num]; /* Current argument. */
724
725 /* Initialize pointers. */
726 operandS = operandE = operand;
727
728 switch (cur_arg->type)
729 {
730 case arg_sc: /* Case *+0x18. */
731 case arg_ic: /* Case $0x18. */
732 operandS++;
733 /* Fall through. */
734 case arg_c: /* Case 0x18. */
735 /* Set constant. */
736 process_label_constant (operandS, crx_ins);
737
738 if (cur_arg->type != arg_ic)
739 cur_arg->type = arg_c;
740 break;
741
742 case arg_icr: /* Case $0x18(r1). */
743 operandS++;
744 case arg_cr: /* Case 0x18(r1). */
745 /* Set displacement constant. */
746 while (*operandE != '(')
747 operandE++;
748 *operandE = '\0';
749 process_label_constant (operandS, crx_ins);
750 operandS = operandE;
751 /* Fall through. */
752 case arg_rbase: /* Case (r1). */
753 operandS++;
754 /* Set register base. */
755 while (*operandE != ')')
756 operandE++;
757 *operandE = '\0';
758 if ((cur_arg->r = get_register (operandS)) == nullregister)
759 as_bad (_("Illegal register `%s' in instruction `%s'"),
760 operandS, ins_parse);
761
762 if (cur_arg->type != arg_rbase)
763 cur_arg->type = arg_cr;
764 break;
765
766 case arg_idxr:
767 /* Set displacement constant. */
768 while (*operandE != '(')
769 operandE++;
770 *operandE = '\0';
771 process_label_constant (operandS, crx_ins);
772 operandS = ++operandE;
773
774 /* Set register base. */
775 while ((*operandE != ',') && (! ISSPACE (*operandE)))
776 operandE++;
777 *operandE++ = '\0';
778 if ((cur_arg->r = get_register (operandS)) == nullregister)
779 as_bad (_("Illegal register `%s' in instruction `%s'"),
780 operandS, ins_parse);
781
782 /* Skip leading white space. */
783 while (ISSPACE (*operandE))
784 operandE++;
785 operandS = operandE;
786
787 /* Set register index. */
788 while ((*operandE != ')') && (*operandE != ','))
789 operandE++;
790 c = *operandE;
791 *operandE++ = '\0';
792
793 if ((cur_arg->i_r = get_register (operandS)) == nullregister)
794 as_bad (_("Illegal register `%s' in instruction `%s'"),
795 operandS, ins_parse);
796
797 /* Skip leading white space. */
798 while (ISSPACE (*operandE))
799 operandE++;
800 operandS = operandE;
801
802 /* Set the scale. */
803 if (c == ')')
804 cur_arg->scale = 0;
805 else
806 {
807 while (*operandE != ')')
808 operandE++;
809 *operandE = '\0';
810
811 /* Preprocess the scale string. */
812 input_save = input_line_pointer;
813 input_line_pointer = operandS;
814 expression (&scale);
815 input_line_pointer = input_save;
816
817 scale_val = scale.X_add_number;
818
819 /* Check if the scale value is legal. */
820 if (scale_val != 1 && scale_val != 2
821 && scale_val != 4 && scale_val != 8)
822 as_bad (_("Illegal Scale - `%d'"), scale_val);
823
824 cur_arg->scale = exponent2scale (scale_val);
825 }
826 break;
827
828 default:
829 break;
830 }
831 }
832
833 /* Parse a single operand.
834 operand - Current operand to parse.
835 crx_ins - Current assembled instruction. */
836
837 static void
838 parse_operand (char *operand, ins * crx_ins)
839 {
840 int ret_val;
841 argument *cur_arg = &crx_ins->arg[cur_arg_num]; /* Current argument. */
842
843 /* Initialize the type to NULL before parsing. */
844 cur_arg->type = nullargs;
845
846 /* Check whether this is a general processor register. */
847 if ((ret_val = get_register (operand)) != nullregister)
848 {
849 cur_arg->type = arg_r;
850 cur_arg->r = ret_val;
851 cur_arg->X_op = O_register;
852 return;
853 }
854
855 /* Check whether this is a core [special] coprocessor register. */
856 if ((ret_val = get_copregister (operand)) != nullcopregister)
857 {
858 cur_arg->type = arg_copr;
859 if (ret_val >= cs0)
860 cur_arg->type = arg_copsr;
861 cur_arg->cr = ret_val;
862 cur_arg->X_op = O_register;
863 return;
864 }
865
866 /* Deal with special characters. */
867 switch (operand[0])
868 {
869 case '$':
870 if (strchr (operand, '(') != NULL)
871 cur_arg->type = arg_icr;
872 else
873 cur_arg->type = arg_ic;
874 goto set_params;
875 break;
876
877 case '*':
878 cur_arg->type = arg_sc;
879 goto set_params;
880 break;
881
882 case '(':
883 cur_arg->type = arg_rbase;
884 goto set_params;
885 break;
886
887 default:
888 break;
889 }
890
891 if (strchr (operand, '(') != NULL)
892 {
893 if (strchr (operand, ',') != NULL
894 && (strchr (operand, ',') > strchr (operand, '(')))
895 cur_arg->type = arg_idxr;
896 else
897 cur_arg->type = arg_cr;
898 }
899 else
900 cur_arg->type = arg_c;
901 goto set_params;
902
903 /* Parse an operand according to its type. */
904 set_params:
905 cur_arg->constant = 0;
906 set_operand (operand, crx_ins);
907 }
908
909 /* Parse the various operands. Each operand is then analyzed to fillup
910 the fields in the crx_ins data structure. */
911
912 static void
913 parse_operands (ins * crx_ins, char *operands)
914 {
915 char *operandS; /* Operands string. */
916 char *operandH, *operandT; /* Single operand head/tail pointers. */
917 int allocated = 0; /* Indicates a new operands string was allocated. */
918 char *operand[MAX_OPERANDS]; /* Separating the operands. */
919 int op_num = 0; /* Current operand number we are parsing. */
920 int bracket_flag = 0; /* Indicates a bracket '(' was found. */
921 int sq_bracket_flag = 0; /* Indicates a square bracket '[' was found. */
922
923 /* Preprocess the list of registers, if necessary. */
924 operandS = operandH = operandT = (INST_HAS_REG_LIST) ?
925 preprocess_reglist (operands, &allocated) : operands;
926
927 while (*operandT != '\0')
928 {
929 if (*operandT == ',' && bracket_flag != 1 && sq_bracket_flag != 1)
930 {
931 *operandT++ = '\0';
932 operand[op_num++] = strdup (operandH);
933 operandH = operandT;
934 continue;
935 }
936
937 if (*operandT == ' ')
938 as_bad (_("Illegal operands (whitespace): `%s'"), ins_parse);
939
940 if (*operandT == '(')
941 bracket_flag = 1;
942 else if (*operandT == '[')
943 sq_bracket_flag = 1;
944
945 if (*operandT == ')')
946 {
947 if (bracket_flag)
948 bracket_flag = 0;
949 else
950 as_fatal (_("Missing matching brackets : `%s'"), ins_parse);
951 }
952 else if (*operandT == ']')
953 {
954 if (sq_bracket_flag)
955 sq_bracket_flag = 0;
956 else
957 as_fatal (_("Missing matching brackets : `%s'"), ins_parse);
958 }
959
960 if (bracket_flag == 1 && *operandT == ')')
961 bracket_flag = 0;
962 else if (sq_bracket_flag == 1 && *operandT == ']')
963 sq_bracket_flag = 0;
964
965 operandT++;
966 }
967
968 /* Adding the last operand. */
969 operand[op_num++] = strdup (operandH);
970 crx_ins->nargs = op_num;
971
972 /* Verifying correct syntax of operands (all brackets should be closed). */
973 if (bracket_flag || sq_bracket_flag)
974 as_fatal (_("Missing matching brackets : `%s'"), ins_parse);
975
976 /* Now we parse each operand separately. */
977 for (op_num = 0; op_num < crx_ins->nargs; op_num++)
978 {
979 cur_arg_num = op_num;
980 parse_operand (operand[op_num], crx_ins);
981 free (operand[op_num]);
982 }
983
984 if (allocated)
985 free (operandS);
986 }
987
988 /* Get the trap index in dispatch table, given its name.
989 This routine is used by assembling the 'excp' instruction. */
990
991 static int
992 gettrap (const char *s)
993 {
994 const trap_entry *trap;
995
996 for (trap = crx_traps; trap < (crx_traps + NUMTRAPS); trap++)
997 if (strcasecmp (trap->name, s) == 0)
998 return trap->entry;
999
1000 as_bad (_("Unknown exception: `%s'"), s);
1001 return 0;
1002 }
1003
1004 /* Post-Increment instructions, as well as Store-Immediate instructions, are a
1005 sub-group within load/stor instruction groups.
1006 Therefore, when parsing a Post-Increment/Store-Immediate insn, we have to
1007 advance the instruction pointer to the start of that sub-group (that is, up
1008 to the first instruction of that type).
1009 Otherwise, the insn will be mistakenly identified as of type LD_STOR_INS. */
1010
1011 static void
1012 handle_LoadStor (const char *operands)
1013 {
1014 /* Post-Increment instructions precede Store-Immediate instructions in
1015 CRX instruction table, hence they are handled before.
1016 This synchronization should be kept. */
1017
1018 /* Assuming Post-Increment insn has the following format :
1019 'MNEMONIC DISP(REG)+, REG' (e.g. 'loadw 12(r5)+, r6').
1020 LD_STOR_INS_INC are the only store insns containing a plus sign (+). */
1021 if (strstr (operands, ")+") != NULL)
1022 {
1023 while (! IS_INSN_TYPE (LD_STOR_INS_INC))
1024 instruction++;
1025 return;
1026 }
1027
1028 /* Assuming Store-Immediate insn has the following format :
1029 'MNEMONIC $DISP, ...' (e.g. 'storb $1, 12(r5)').
1030 STOR_IMM_INS are the only store insns containing a dollar sign ($). */
1031 if (strstr (operands, "$") != NULL)
1032 while (! IS_INSN_TYPE (STOR_IMM_INS))
1033 instruction++;
1034 }
1035
1036 /* Top level module where instruction parsing starts.
1037 crx_ins - data structure holds some information.
1038 operands - holds the operands part of the whole instruction. */
1039
1040 static void
1041 parse_insn (ins *insn, char *operands)
1042 {
1043 int i;
1044
1045 /* Handle instructions with no operands. */
1046 for (i = 0; crx_no_op_insn[i] != NULL; i++)
1047 {
1048 if (streq (crx_no_op_insn[i], instruction->mnemonic))
1049 {
1050 insn->nargs = 0;
1051 return;
1052 }
1053 }
1054
1055 /* Handle 'excp'/'cinv' instructions. */
1056 if (IS_INSN_MNEMONIC ("excp") || IS_INSN_MNEMONIC ("cinv"))
1057 {
1058 insn->nargs = 1;
1059 insn->arg[0].type = arg_ic;
1060 insn->arg[0].constant = IS_INSN_MNEMONIC ("excp") ?
1061 gettrap (operands) : get_cinv_parameters (operands);
1062 insn->arg[0].X_op = O_constant;
1063 return;
1064 }
1065
1066 /* Handle load/stor unique instructions before parsing. */
1067 if (IS_INSN_TYPE (LD_STOR_INS))
1068 handle_LoadStor (operands);
1069
1070 if (operands != NULL)
1071 parse_operands (insn, operands);
1072 }
1073
1074 /* Cinv instruction requires special handling. */
1075
1076 static int
1077 get_cinv_parameters (const char *operand)
1078 {
1079 const char *p = operand;
1080 int d_used = 0, i_used = 0, u_used = 0, b_used = 0;
1081
1082 while (*++p != ']')
1083 {
1084 if (*p == ',' || *p == ' ')
1085 continue;
1086
1087 if (*p == 'd')
1088 d_used = 1;
1089 else if (*p == 'i')
1090 i_used = 1;
1091 else if (*p == 'u')
1092 u_used = 1;
1093 else if (*p == 'b')
1094 b_used = 1;
1095 else
1096 as_bad (_("Illegal `cinv' parameter: `%c'"), *p);
1097 }
1098
1099 return ((b_used ? 8 : 0)
1100 + (d_used ? 4 : 0)
1101 + (i_used ? 2 : 0)
1102 + (u_used ? 1 : 0));
1103 }
1104
1105 /* Retrieve the opcode image of a given register.
1106 If the register is illegal for the current instruction,
1107 issue an error. */
1108
1109 static int
1110 getreg_image (reg r)
1111 {
1112 const reg_entry *rreg;
1113 char *reg_name;
1114 int is_procreg = 0; /* Nonzero means argument should be processor reg. */
1115
1116 if (((IS_INSN_MNEMONIC ("mtpr")) && (cur_arg_num == 1))
1117 || ((IS_INSN_MNEMONIC ("mfpr")) && (cur_arg_num == 0)) )
1118 is_procreg = 1;
1119
1120 /* Check whether the register is in registers table. */
1121 if (r < MAX_REG)
1122 rreg = &crx_regtab[r];
1123 /* Check whether the register is in coprocessor registers table. */
1124 else if (r < (int) MAX_COPREG)
1125 rreg = &crx_copregtab[r-MAX_REG];
1126 /* Register not found. */
1127 else
1128 {
1129 as_bad (_("Unknown register: `%d'"), r);
1130 return 0;
1131 }
1132
1133 reg_name = rreg->name;
1134
1135 /* Issue a error message when register is illegal. */
1136 #define IMAGE_ERR \
1137 as_bad (_("Illegal register (`%s') in instruction: `%s'"), \
1138 reg_name, ins_parse);
1139
1140 switch (rreg->type)
1141 {
1142 case CRX_U_REGTYPE:
1143 if (is_procreg || (instruction->flags & USER_REG))
1144 return rreg->image;
1145 else
1146 IMAGE_ERR;
1147 break;
1148
1149 case CRX_CFG_REGTYPE:
1150 if (is_procreg)
1151 return rreg->image;
1152 else
1153 IMAGE_ERR;
1154 break;
1155
1156 case CRX_R_REGTYPE:
1157 if (! is_procreg)
1158 return rreg->image;
1159 else
1160 IMAGE_ERR;
1161 break;
1162
1163 case CRX_C_REGTYPE:
1164 case CRX_CS_REGTYPE:
1165 return rreg->image;
1166 break;
1167
1168 default:
1169 IMAGE_ERR;
1170 break;
1171 }
1172
1173 return 0;
1174 }
1175
1176 /* Routine used to represent integer X using NBITS bits. */
1177
1178 static long
1179 getconstant (long x, int nbits)
1180 {
1181 return x & ((((1U << (nbits - 1)) - 1) << 1) | 1);
1182 }
1183
1184 /* Print a constant value to 'output_opcode':
1185 ARG holds the operand's type and value.
1186 SHIFT represents the location of the operand to be print into.
1187 NBITS determines the size (in bits) of the constant. */
1188
1189 static void
1190 print_constant (int nbits, int shift, argument *arg)
1191 {
1192 unsigned long mask = 0;
1193
1194 long constant = getconstant (arg->constant, nbits);
1195
1196 switch (nbits)
1197 {
1198 case 32:
1199 case 28:
1200 case 24:
1201 case 22:
1202 /* mask the upper part of the constant, that is, the bits
1203 going to the lowest byte of output_opcode[0].
1204 The upper part of output_opcode[1] is always filled,
1205 therefore it is always masked with 0xFFFF. */
1206 mask = (1 << (nbits - 16)) - 1;
1207 /* Divide the constant between two consecutive words :
1208 0 1 2 3
1209 +---------+---------+---------+---------+
1210 | | X X X X | X X X X | |
1211 +---------+---------+---------+---------+
1212 output_opcode[0] output_opcode[1] */
1213
1214 CRX_PRINT (0, (constant >> WORD_SHIFT) & mask, 0);
1215 CRX_PRINT (1, (constant & 0xFFFF), WORD_SHIFT);
1216 break;
1217
1218 case 16:
1219 case 12:
1220 /* Special case - in arg_cr, the SHIFT represents the location
1221 of the REGISTER, not the constant, which is itself not shifted. */
1222 if (arg->type == arg_cr)
1223 {
1224 CRX_PRINT (0, constant, 0);
1225 break;
1226 }
1227
1228 /* When instruction size is 3 and 'shift' is 16, a 16-bit constant is
1229 always filling the upper part of output_opcode[1]. If we mistakenly
1230 write it to output_opcode[0], the constant prefix (that is, 'match')
1231 will be overridden.
1232 0 1 2 3
1233 +---------+---------+---------+---------+
1234 | 'match' | | X X X X | |
1235 +---------+---------+---------+---------+
1236 output_opcode[0] output_opcode[1] */
1237
1238 if ((instruction->size > 2) && (shift == WORD_SHIFT))
1239 CRX_PRINT (1, constant, WORD_SHIFT);
1240 else
1241 CRX_PRINT (0, constant, shift);
1242 break;
1243
1244 default:
1245 CRX_PRINT (0, constant, shift);
1246 break;
1247 }
1248 }
1249
1250 /* Print an operand to 'output_opcode', which later on will be
1251 printed to the object file:
1252 ARG holds the operand's type, size and value.
1253 SHIFT represents the printing location of operand.
1254 NBITS determines the size (in bits) of a constant operand. */
1255
1256 static void
1257 print_operand (int nbits, int shift, argument *arg)
1258 {
1259 switch (arg->type)
1260 {
1261 case arg_r:
1262 CRX_PRINT (0, getreg_image (arg->r), shift);
1263 break;
1264
1265 case arg_copr:
1266 if (arg->cr < c0 || arg->cr > c15)
1267 as_bad (_("Illegal co-processor register in instruction `%s'"),
1268 ins_parse);
1269 CRX_PRINT (0, getreg_image (arg->cr), shift);
1270 break;
1271
1272 case arg_copsr:
1273 if (arg->cr < cs0 || arg->cr > cs15)
1274 as_bad (_("Illegal co-processor special register in instruction `%s'"),
1275 ins_parse);
1276 CRX_PRINT (0, getreg_image (arg->cr), shift);
1277 break;
1278
1279 case arg_idxr:
1280 /* 16 12 8 6 0
1281 +--------------------------------+
1282 | r_base | r_idx | scl| disp |
1283 +--------------------------------+ */
1284 CRX_PRINT (0, getreg_image (arg->r), 12);
1285 CRX_PRINT (0, getreg_image (arg->i_r), 8);
1286 CRX_PRINT (0, arg->scale, 6);
1287 /* Fall through. */
1288 case arg_ic:
1289 case arg_c:
1290 print_constant (nbits, shift, arg);
1291 break;
1292
1293 case arg_rbase:
1294 CRX_PRINT (0, getreg_image (arg->r), shift);
1295 break;
1296
1297 case arg_cr:
1298 /* case base_cst4. */
1299 if (instruction->flags & DISPU4MAP)
1300 print_constant (nbits, shift + REG_SIZE, arg);
1301 else
1302 /* rbase_disps<NN> and other such cases. */
1303 print_constant (nbits, shift, arg);
1304 /* Add the register argument to the output_opcode. */
1305 CRX_PRINT (0, getreg_image (arg->r), shift);
1306 break;
1307
1308 default:
1309 break;
1310 }
1311 }
1312
1313 /* Retrieve the number of operands for the current assembled instruction. */
1314
1315 static int
1316 get_number_of_operands (void)
1317 {
1318 int i;
1319
1320 for (i = 0; instruction->operands[i].op_type && i < MAX_OPERANDS; i++)
1321 ;
1322 return i;
1323 }
1324
1325 /* Verify that the number NUM can be represented in BITS bits (that is,
1326 within its permitted range), based on the instruction's FLAGS.
1327 If UPDATE is nonzero, update the value of NUM if necessary.
1328 Return OP_LEGAL upon success, actual error type upon failure. */
1329
1330 static op_err
1331 check_range (long *num, int bits, int unsigned flags, int update)
1332 {
1333 uint32_t max;
1334 op_err retval = OP_LEGAL;
1335 int bin;
1336 uint32_t upper_64kb = 0xffff0000;
1337 uint32_t value = *num;
1338
1339 /* Verify operand value is even. */
1340 if (flags & OP_EVEN)
1341 {
1342 if (value % 2)
1343 return OP_NOT_EVEN;
1344 }
1345
1346 if (flags & OP_UPPER_64KB)
1347 {
1348 /* Check if value is to be mapped to upper 64 KB memory area. */
1349 if ((value & upper_64kb) == upper_64kb)
1350 {
1351 value -= upper_64kb;
1352 if (update)
1353 *num = value;
1354 }
1355 else
1356 return OP_NOT_UPPER_64KB;
1357 }
1358
1359 if (flags & OP_SHIFT)
1360 {
1361 /* All OP_SHIFT args are also OP_SIGNED, so we want to keep the
1362 sign. However, right shift of a signed type with a negative
1363 value is implementation defined. See ISO C 6.5.7. So we use
1364 an unsigned type and sign extend afterwards. */
1365 value >>= 1;
1366 value = (value ^ 0x40000000) - 0x40000000;
1367 if (update)
1368 *num = value;
1369 }
1370 else if (flags & OP_SHIFT_DEC)
1371 {
1372 value = (value >> 1) - 1;
1373 if (update)
1374 *num = value;
1375 }
1376
1377 if (flags & OP_ESC)
1378 {
1379 /* 0x7e and 0x7f are reserved escape sequences of dispe9. */
1380 if (value == 0x7e || value == 0x7f)
1381 return OP_OUT_OF_RANGE;
1382 }
1383
1384 if (flags & OP_DISPU4)
1385 {
1386 int is_dispu4 = 0;
1387
1388 uint32_t mul = (instruction->flags & DISPUB4 ? 1
1389 : instruction->flags & DISPUW4 ? 2
1390 : instruction->flags & DISPUD4 ? 4
1391 : 0);
1392
1393 for (bin = 0; bin < crx_cst4_maps; bin++)
1394 {
1395 if (value == mul * bin)
1396 {
1397 is_dispu4 = 1;
1398 if (update)
1399 *num = bin;
1400 break;
1401 }
1402 }
1403 if (!is_dispu4)
1404 retval = OP_ILLEGAL_DISPU4;
1405 }
1406 else if (flags & OP_CST4)
1407 {
1408 int is_cst4 = 0;
1409
1410 for (bin = 0; bin < crx_cst4_maps; bin++)
1411 {
1412 if (value == (uint32_t) crx_cst4_map[bin])
1413 {
1414 is_cst4 = 1;
1415 if (update)
1416 *num = bin;
1417 break;
1418 }
1419 }
1420 if (!is_cst4)
1421 retval = OP_ILLEGAL_CST4;
1422 }
1423 else if (flags & OP_SIGNED)
1424 {
1425 max = 1;
1426 max = max << (bits - 1);
1427 value += max;
1428 max = ((max - 1) << 1) | 1;
1429 if (value > max)
1430 retval = OP_OUT_OF_RANGE;
1431 }
1432 else if (flags & OP_UNSIGNED)
1433 {
1434 max = 1;
1435 max = max << (bits - 1);
1436 max = ((max - 1) << 1) | 1;
1437 if (value > max)
1438 retval = OP_OUT_OF_RANGE;
1439 }
1440 return retval;
1441 }
1442
1443 /* Assemble a single instruction:
1444 INSN is already parsed (that is, all operand values and types are set).
1445 For instruction to be assembled, we need to find an appropriate template in
1446 the instruction table, meeting the following conditions:
1447 1: Has the same number of operands.
1448 2: Has the same operand types.
1449 3: Each operand size is sufficient to represent the instruction's values.
1450 Returns 1 upon success, 0 upon failure. */
1451
1452 static int
1453 assemble_insn (char *mnemonic, ins *insn)
1454 {
1455 /* Type of each operand in the current template. */
1456 argtype cur_type[MAX_OPERANDS];
1457 /* Size (in bits) of each operand in the current template. */
1458 unsigned int cur_size[MAX_OPERANDS];
1459 /* Flags of each operand in the current template. */
1460 unsigned int cur_flags[MAX_OPERANDS];
1461 /* Instruction type to match. */
1462 unsigned int ins_type;
1463 /* Boolean flag to mark whether a match was found. */
1464 int match = 0;
1465 int i;
1466 /* Nonzero if an instruction with same number of operands was found. */
1467 int found_same_number_of_operands = 0;
1468 /* Nonzero if an instruction with same argument types was found. */
1469 int found_same_argument_types = 0;
1470 /* Nonzero if a constant was found within the required range. */
1471 int found_const_within_range = 0;
1472 /* Argument number of an operand with invalid type. */
1473 int invalid_optype = -1;
1474 /* Argument number of an operand with invalid constant value. */
1475 int invalid_const = -1;
1476 /* Operand error (used for issuing various constant error messages). */
1477 op_err op_error, const_err = OP_LEGAL;
1478
1479 /* Retrieve data (based on FUNC) for each operand of a given instruction. */
1480 #define GET_CURRENT_DATA(FUNC, ARRAY) \
1481 for (i = 0; i < insn->nargs; i++) \
1482 ARRAY[i] = FUNC (instruction->operands[i].op_type)
1483
1484 #define GET_CURRENT_TYPE GET_CURRENT_DATA(get_optype, cur_type)
1485 #define GET_CURRENT_SIZE GET_CURRENT_DATA(get_opbits, cur_size)
1486 #define GET_CURRENT_FLAGS GET_CURRENT_DATA(get_opflags, cur_flags)
1487
1488 /* Instruction has no operands -> only copy the constant opcode. */
1489 if (insn->nargs == 0)
1490 {
1491 output_opcode[0] = BIN (instruction->match, instruction->match_bits);
1492 return 1;
1493 }
1494
1495 /* In some case, same mnemonic can appear with different instruction types.
1496 For example, 'storb' is supported with 3 different types :
1497 LD_STOR_INS, LD_STOR_INS_INC, STOR_IMM_INS.
1498 We assume that when reaching this point, the instruction type was
1499 pre-determined. We need to make sure that the type stays the same
1500 during a search for matching instruction. */
1501 ins_type = CRX_INS_TYPE(instruction->flags);
1502
1503 while (/* Check that match is still not found. */
1504 match != 1
1505 /* Check we didn't get to end of table. */
1506 && instruction->mnemonic != NULL
1507 /* Check that the actual mnemonic is still available. */
1508 && IS_INSN_MNEMONIC (mnemonic)
1509 /* Check that the instruction type wasn't changed. */
1510 && IS_INSN_TYPE(ins_type))
1511 {
1512 /* Check whether number of arguments is legal. */
1513 if (get_number_of_operands () != insn->nargs)
1514 goto next_insn;
1515 found_same_number_of_operands = 1;
1516
1517 /* Initialize arrays with data of each operand in current template. */
1518 GET_CURRENT_TYPE;
1519 GET_CURRENT_SIZE;
1520 GET_CURRENT_FLAGS;
1521
1522 /* Check for type compatibility. */
1523 for (i = 0; i < insn->nargs; i++)
1524 {
1525 if (cur_type[i] != insn->arg[i].type)
1526 {
1527 if (invalid_optype == -1)
1528 invalid_optype = i + 1;
1529 goto next_insn;
1530 }
1531 }
1532 found_same_argument_types = 1;
1533
1534 for (i = 0; i < insn->nargs; i++)
1535 {
1536 /* Reverse the operand indices for certain opcodes:
1537 Index 0 -->> 1
1538 Index 1 -->> 0
1539 Other index -->> stays the same. */
1540 int j = instruction->flags & REVERSE_MATCH ?
1541 i == 0 ? 1 :
1542 i == 1 ? 0 : i :
1543 i;
1544
1545 /* Only check range - don't update the constant's value, since the
1546 current instruction may not be the last we try to match.
1547 The constant's value will be updated later, right before printing
1548 it to the object file. */
1549 if ((insn->arg[j].X_op == O_constant)
1550 && (op_error = check_range (&insn->arg[j].constant, cur_size[j],
1551 cur_flags[j], 0)))
1552 {
1553 if (invalid_const == -1)
1554 {
1555 invalid_const = j + 1;
1556 const_err = op_error;
1557 }
1558 goto next_insn;
1559 }
1560 /* For symbols, we make sure the relocation size (which was already
1561 determined) is sufficient. */
1562 else if ((insn->arg[j].X_op == O_symbol)
1563 && ((bfd_reloc_type_lookup (stdoutput, insn->rtype))->bitsize
1564 > cur_size[j]))
1565 goto next_insn;
1566 }
1567 found_const_within_range = 1;
1568
1569 /* If we got till here -> Full match is found. */
1570 match = 1;
1571 break;
1572
1573 /* Try again with next instruction. */
1574 next_insn:
1575 instruction++;
1576 }
1577
1578 if (!match)
1579 {
1580 /* We haven't found a match - instruction can't be assembled. */
1581 if (!found_same_number_of_operands)
1582 as_bad (_("Incorrect number of operands"));
1583 else if (!found_same_argument_types)
1584 as_bad (_("Illegal type of operand (arg %d)"), invalid_optype);
1585 else if (!found_const_within_range)
1586 {
1587 switch (const_err)
1588 {
1589 case OP_OUT_OF_RANGE:
1590 as_bad (_("Operand out of range (arg %d)"), invalid_const);
1591 break;
1592 case OP_NOT_EVEN:
1593 as_bad (_("Operand has odd displacement (arg %d)"), invalid_const);
1594 break;
1595 case OP_ILLEGAL_DISPU4:
1596 as_bad (_("Invalid DISPU4 operand value (arg %d)"), invalid_const);
1597 break;
1598 case OP_ILLEGAL_CST4:
1599 as_bad (_("Invalid CST4 operand value (arg %d)"), invalid_const);
1600 break;
1601 case OP_NOT_UPPER_64KB:
1602 as_bad (_("Operand value is not within upper 64 KB (arg %d)"),
1603 invalid_const);
1604 break;
1605 default:
1606 as_bad (_("Illegal operand (arg %d)"), invalid_const);
1607 break;
1608 }
1609 }
1610
1611 return 0;
1612 }
1613 else
1614 /* Full match - print the encoding to output file. */
1615 {
1616 /* Make further checking (such that couldn't be made earlier).
1617 Warn the user if necessary. */
1618 warn_if_needed (insn);
1619
1620 /* Check whether we need to adjust the instruction pointer. */
1621 if (adjust_if_needed (insn))
1622 /* If instruction pointer was adjusted, we need to update
1623 the size of the current template operands. */
1624 GET_CURRENT_SIZE;
1625
1626 for (i = 0; i < insn->nargs; i++)
1627 {
1628 int j = instruction->flags & REVERSE_MATCH ?
1629 i == 0 ? 1 :
1630 i == 1 ? 0 : i :
1631 i;
1632
1633 /* This time, update constant value before printing it. */
1634 if ((insn->arg[j].X_op == O_constant)
1635 && (check_range (&insn->arg[j].constant, cur_size[j],
1636 cur_flags[j], 1) != OP_LEGAL))
1637 as_fatal (_("Illegal operand (arg %d)"), j+1);
1638 }
1639
1640 /* First, copy the instruction's opcode. */
1641 output_opcode[0] = BIN (instruction->match, instruction->match_bits);
1642
1643 for (i = 0; i < insn->nargs; i++)
1644 {
1645 cur_arg_num = i;
1646 print_operand (cur_size[i], instruction->operands[i].shift,
1647 &insn->arg[i]);
1648 }
1649 }
1650
1651 return 1;
1652 }
1653
1654 /* Bunch of error checking.
1655 The checks are made after a matching instruction was found. */
1656
1657 void
1658 warn_if_needed (ins *insn)
1659 {
1660 /* If the post-increment address mode is used and the load/store
1661 source register is the same as rbase, the result of the
1662 instruction is undefined. */
1663 if (IS_INSN_TYPE (LD_STOR_INS_INC))
1664 {
1665 /* Enough to verify that one of the arguments is a simple reg. */
1666 if ((insn->arg[0].type == arg_r) || (insn->arg[1].type == arg_r))
1667 if (insn->arg[0].r == insn->arg[1].r)
1668 as_bad (_("Same src/dest register is used (`r%d'), result is undefined"),
1669 insn->arg[0].r);
1670 }
1671
1672 /* Some instruction assume the stack pointer as rptr operand.
1673 Issue an error when the register to be loaded is also SP. */
1674 if (instruction->flags & NO_SP)
1675 {
1676 if (getreg_image (insn->arg[0].r) == getreg_image (sp))
1677 as_bad (_("`%s' has undefined result"), ins_parse);
1678 }
1679
1680 /* If the rptr register is specified as one of the registers to be loaded,
1681 the final contents of rptr are undefined. Thus, we issue an error. */
1682 if (instruction->flags & NO_RPTR)
1683 {
1684 if ((1 << getreg_image (insn->arg[0].r)) & insn->arg[1].constant)
1685 as_bad (_("Same src/dest register is used (`r%d'), result is undefined"),
1686 getreg_image (insn->arg[0].r));
1687 }
1688 }
1689
1690 /* In some cases, we need to adjust the instruction pointer although a
1691 match was already found. Here, we gather all these cases.
1692 Returns 1 if instruction pointer was adjusted, otherwise 0. */
1693
1694 int
1695 adjust_if_needed (ins *insn)
1696 {
1697 int ret_value = 0;
1698
1699 /* Special check for 'addub $0, r0' instruction -
1700 The opcode '0000 0000 0000 0000' is not allowed. */
1701 if (IS_INSN_MNEMONIC ("addub"))
1702 {
1703 if ((instruction->operands[0].op_type == cst4)
1704 && instruction->operands[1].op_type == regr)
1705 {
1706 if (insn->arg[0].constant == 0 && insn->arg[1].r == r0)
1707 {
1708 instruction++;
1709 ret_value = 1;
1710 }
1711 }
1712 }
1713
1714 /* Optimization: Omit a zero displacement in bit operations,
1715 saving 2-byte encoding space (e.g., 'cbitw $8, 0(r1)'). */
1716 if (IS_INSN_TYPE (CSTBIT_INS))
1717 {
1718 if ((instruction->operands[1].op_type == rbase_disps12)
1719 && (insn->arg[1].X_op == O_constant)
1720 && (insn->arg[1].constant == 0))
1721 {
1722 instruction--;
1723 ret_value = 1;
1724 }
1725 }
1726
1727 return ret_value;
1728 }
1729
1730 /* Set the appropriate bit for register 'r' in 'mask'.
1731 This indicates that this register is loaded or stored by
1732 the instruction. */
1733
1734 static void
1735 mask_reg (int r, unsigned short int *mask)
1736 {
1737 if ((reg)r > (reg)sp)
1738 {
1739 as_bad (_("Invalid register in register list"));
1740 return;
1741 }
1742
1743 *mask |= (1 << r);
1744 }
1745
1746 /* Preprocess register list - create a 16-bit mask with one bit for each
1747 of the 16 general purpose registers. If a bit is set, it indicates
1748 that this register is loaded or stored by the instruction. */
1749
1750 static char *
1751 preprocess_reglist (char *param, int *allocated)
1752 {
1753 char reg_name[MAX_REGNAME_LEN]; /* Current parsed register name. */
1754 char *regP; /* Pointer to 'reg_name' string. */
1755 int reg_counter = 0; /* Count number of parsed registers. */
1756 unsigned short int mask = 0; /* Mask for 16 general purpose registers. */
1757 char *new_param; /* New created operands string. */
1758 char *paramP = param; /* Pointer to original operands string. */
1759 char maskstring[10]; /* Array to print the mask as a string. */
1760 int hi_found = 0, lo_found = 0; /* Boolean flags for hi/lo registers. */
1761 reg r;
1762 copreg cr;
1763
1764 /* If 'param' is already in form of a number, no need to preprocess. */
1765 if (strchr (paramP, '{') == NULL)
1766 return param;
1767
1768 /* Verifying correct syntax of operand. */
1769 if (strchr (paramP, '}') == NULL)
1770 as_fatal (_("Missing matching brackets : `%s'"), ins_parse);
1771
1772 while (*paramP++ != '{');
1773
1774 new_param = XCNEWVEC (char, MAX_INST_LEN);
1775 *allocated = 1;
1776 strncpy (new_param, param, paramP - param - 1);
1777
1778 while (*paramP != '}')
1779 {
1780 regP = paramP;
1781 memset (&reg_name, '\0', sizeof (reg_name));
1782
1783 while (ISALNUM (*paramP))
1784 paramP++;
1785
1786 strncpy (reg_name, regP, paramP - regP);
1787
1788 /* Coprocessor register c<N>. */
1789 if (IS_INSN_TYPE (COP_REG_INS))
1790 {
1791 if (((cr = get_copregister (reg_name)) == nullcopregister)
1792 || (crx_copregtab[cr-MAX_REG].type != CRX_C_REGTYPE))
1793 as_fatal (_("Illegal register `%s' in cop-register list"), reg_name);
1794 mask_reg (getreg_image (cr - c0), &mask);
1795 }
1796 /* Coprocessor Special register cs<N>. */
1797 else if (IS_INSN_TYPE (COPS_REG_INS))
1798 {
1799 if (((cr = get_copregister (reg_name)) == nullcopregister)
1800 || (crx_copregtab[cr-MAX_REG].type != CRX_CS_REGTYPE))
1801 as_fatal (_("Illegal register `%s' in cop-special-register list"),
1802 reg_name);
1803 mask_reg (getreg_image (cr - cs0), &mask);
1804 }
1805 /* User register u<N>. */
1806 else if (instruction->flags & USER_REG)
1807 {
1808 if (streq(reg_name, "uhi"))
1809 {
1810 hi_found = 1;
1811 goto next_inst;
1812 }
1813 else if (streq(reg_name, "ulo"))
1814 {
1815 lo_found = 1;
1816 goto next_inst;
1817 }
1818 else if (((r = get_register (reg_name)) == nullregister)
1819 || (crx_regtab[r].type != CRX_U_REGTYPE))
1820 as_fatal (_("Illegal register `%s' in user register list"), reg_name);
1821
1822 mask_reg (getreg_image (r - u0), &mask);
1823 }
1824 /* General purpose register r<N>. */
1825 else
1826 {
1827 if (streq(reg_name, "hi"))
1828 {
1829 hi_found = 1;
1830 goto next_inst;
1831 }
1832 else if (streq(reg_name, "lo"))
1833 {
1834 lo_found = 1;
1835 goto next_inst;
1836 }
1837 else if (((r = get_register (reg_name)) == nullregister)
1838 || (crx_regtab[r].type != CRX_R_REGTYPE))
1839 as_fatal (_("Illegal register `%s' in register list"), reg_name);
1840
1841 mask_reg (getreg_image (r - r0), &mask);
1842 }
1843
1844 if (++reg_counter > MAX_REGS_IN_MASK16)
1845 as_bad (_("Maximum %d bits may be set in `mask16' operand"),
1846 MAX_REGS_IN_MASK16);
1847
1848 next_inst:
1849 while (!ISALNUM (*paramP) && *paramP != '}')
1850 paramP++;
1851 }
1852
1853 if (*++paramP != '\0')
1854 as_warn (_("rest of line ignored; first ignored character is `%c'"),
1855 *paramP);
1856
1857 switch (hi_found + lo_found)
1858 {
1859 case 0:
1860 /* At least one register should be specified. */
1861 if (mask == 0)
1862 as_bad (_("Illegal `mask16' operand, operation is undefined - `%s'"),
1863 ins_parse);
1864 break;
1865
1866 case 1:
1867 /* HI can't be specified without LO (and vise-versa). */
1868 as_bad (_("HI/LO registers should be specified together"));
1869 break;
1870
1871 case 2:
1872 /* HI/LO registers mustn't be masked with additional registers. */
1873 if (mask != 0)
1874 as_bad (_("HI/LO registers should be specified without additional registers"));
1875
1876 default:
1877 break;
1878 }
1879
1880 sprintf (maskstring, "$0x%x", mask);
1881 strcat (new_param, maskstring);
1882 return new_param;
1883 }
1884
1885 /* Print the instruction.
1886 Handle also cases where the instruction is relaxable/relocatable. */
1887
1888 void
1889 print_insn (ins *insn)
1890 {
1891 unsigned int i, j, insn_size;
1892 char *this_frag;
1893 unsigned short words[4];
1894 int addr_mod;
1895
1896 /* Arrange the insn encodings in a WORD size array. */
1897 for (i = 0, j = 0; i < 2; i++)
1898 {
1899 words[j++] = (output_opcode[i] >> 16) & 0xFFFF;
1900 words[j++] = output_opcode[i] & 0xFFFF;
1901 }
1902
1903 /* Handle relaxation. */
1904 if ((instruction->flags & RELAXABLE) && relocatable)
1905 {
1906 int relax_subtype;
1907
1908 /* Write the maximal instruction size supported. */
1909 insn_size = INSN_MAX_SIZE;
1910
1911 /* bCC */
1912 if (IS_INSN_TYPE (BRANCH_INS))
1913 relax_subtype = 0;
1914 /* bal */
1915 else if (IS_INSN_TYPE (DCR_BRANCH_INS) || IS_INSN_MNEMONIC ("bal"))
1916 relax_subtype = 3;
1917 /* cmpbr/bcop */
1918 else if (IS_INSN_TYPE (CMPBR_INS) || IS_INSN_TYPE (COP_BRANCH_INS))
1919 relax_subtype = 5;
1920 else
1921 abort ();
1922
1923 this_frag = frag_var (rs_machine_dependent, insn_size * 2,
1924 4, relax_subtype,
1925 insn->exp.X_add_symbol,
1926 insn->exp.X_add_number,
1927 0);
1928 }
1929 else
1930 {
1931 insn_size = instruction->size;
1932 this_frag = frag_more (insn_size * 2);
1933
1934 /* Handle relocation. */
1935 if ((relocatable) && (insn->rtype != BFD_RELOC_NONE))
1936 {
1937 reloc_howto_type *reloc_howto;
1938 int size;
1939
1940 reloc_howto = bfd_reloc_type_lookup (stdoutput, insn->rtype);
1941
1942 if (!reloc_howto)
1943 abort ();
1944
1945 size = bfd_get_reloc_size (reloc_howto);
1946
1947 if (size < 1 || size > 4)
1948 abort ();
1949
1950 fix_new_exp (frag_now, this_frag - frag_now->fr_literal,
1951 size, &insn->exp, reloc_howto->pc_relative,
1952 insn->rtype);
1953 }
1954 }
1955
1956 /* Verify a 2-byte code alignment. */
1957 addr_mod = frag_now_fix () & 1;
1958 if (frag_now->has_code && frag_now->insn_addr != addr_mod)
1959 as_bad (_("instruction address is not a multiple of 2"));
1960 frag_now->insn_addr = addr_mod;
1961 frag_now->has_code = 1;
1962
1963 /* Write the instruction encoding to frag. */
1964 for (i = 0; i < insn_size; i++)
1965 {
1966 md_number_to_chars (this_frag, (valueT) words[i], 2);
1967 this_frag += 2;
1968 }
1969 }
1970
1971 /* This is the guts of the machine-dependent assembler. OP points to a
1972 machine dependent instruction. This function is supposed to emit
1973 the frags/bytes it assembles to. */
1974
1975 void
1976 md_assemble (char *op)
1977 {
1978 ins crx_ins;
1979 char *param;
1980 char c;
1981
1982 /* Reset global variables for a new instruction. */
1983 reset_vars (op);
1984
1985 /* Strip the mnemonic. */
1986 for (param = op; *param != 0 && !ISSPACE (*param); param++)
1987 ;
1988 c = *param;
1989 *param++ = '\0';
1990
1991 /* Find the instruction. */
1992 instruction = (const inst *) hash_find (crx_inst_hash, op);
1993 if (instruction == NULL)
1994 {
1995 as_bad (_("Unknown opcode: `%s'"), op);
1996 param[-1] = c;
1997 return;
1998 }
1999
2000 /* Tie dwarf2 debug info to the address at the start of the insn. */
2001 dwarf2_emit_insn (0);
2002
2003 /* Parse the instruction's operands. */
2004 parse_insn (&crx_ins, param);
2005
2006 /* Assemble the instruction - return upon failure. */
2007 if (assemble_insn (op, &crx_ins) == 0)
2008 {
2009 param[-1] = c;
2010 return;
2011 }
2012
2013 /* Print the instruction. */
2014 param[-1] = c;
2015 print_insn (&crx_ins);
2016 }
This page took 0.076498 seconds and 4 git commands to generate.