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