oops - omitted from previous delta
[deliverable/binutils-gdb.git] / gas / config / tc-v850.c
1 /* tc-v850.c -- Assembler code for the NEC V850
2 Copyright 1996-2013 Free Software Foundation, Inc.
3
4 This file is part of GAS, the GNU Assembler.
5
6 GAS is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
10
11 GAS is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GAS; see the file COPYING. If not, write to
18 the Free Software Foundation, 51 Franklin Street - Fifth Floor,
19 Boston, MA 02110-1301, USA. */
20
21 #include "as.h"
22 #include "safe-ctype.h"
23 #include "subsegs.h"
24 #include "opcode/v850.h"
25 #include "dwarf2dbg.h"
26
27 /* Sign-extend a 16-bit number. */
28 #define SEXT16(x) ((((x) & 0xffff) ^ (~0x7fff)) + 0x8000)
29
30 /* Temporarily holds the reloc in a cons expression. */
31 static bfd_reloc_code_real_type hold_cons_reloc = BFD_RELOC_UNUSED;
32
33 /* Set to TRUE if we want to be pedantic about signed overflows. */
34 static bfd_boolean warn_signed_overflows = FALSE;
35 static bfd_boolean warn_unsigned_overflows = FALSE;
36
37 /* Indicates the target BFD machine number. */
38 static int machine = -1;
39
40
41 /* Indiciates the target BFD architecture. */
42 int v850_target_arch = bfd_arch_v850_rh850;
43 const char * v850_target_format = "elf32-v850-rh850";
44 static flagword v850_e_flags = 0;
45
46 /* Indicates the target processor(s) for the assemble. */
47 static int processor_mask = 0;
48 \f
49 /* Structure to hold information about predefined registers. */
50 struct reg_name
51 {
52 const char *name;
53 int value;
54 unsigned int processors;
55 };
56
57 /* Generic assembler global variables which must be defined by all
58 targets. */
59
60 /* Characters which always start a comment. */
61 const char comment_chars[] = "#";
62
63 /* Characters which start a comment at the beginning of a line. */
64 const char line_comment_chars[] = ";#";
65
66 /* Characters which may be used to separate multiple commands on a
67 single line. */
68 const char line_separator_chars[] = ";";
69
70 /* Characters which are used to indicate an exponent in a floating
71 point number. */
72 const char EXP_CHARS[] = "eE";
73
74 /* Characters which mean that a number is a floating point constant,
75 as in 0d1.0. */
76 const char FLT_CHARS[] = "dD";
77 \f
78 const relax_typeS md_relax_table[] =
79 {
80 /* Conditional branches.(V850/V850E, max 22bit) */
81 #define SUBYPTE_COND_9_22 0
82 {0xfe, -0x100, 2, SUBYPTE_COND_9_22 + 1},
83 {0x1ffffe + 2, -0x200000 + 2, 6, 0},
84 /* Conditional branches.(V850/V850E, max 22bit) */
85 #define SUBYPTE_SA_9_22 2
86 {0xfe, -0x100, 2, SUBYPTE_SA_9_22 + 1},
87 {0x1ffffe + 4, -0x200000 + 4, 8, 0},
88 /* Unconditional branches.(V850/V850E, max 22bit) */
89 #define SUBYPTE_UNCOND_9_22 4
90 {0xfe, -0x100, 2, SUBYPTE_UNCOND_9_22 + 1},
91 {0x1ffffe, -0x200000, 4, 0},
92 /* Conditional branches.(V850E2, max 32bit) */
93 #define SUBYPTE_COND_9_22_32 6
94 {0xfe, -0x100, 2, SUBYPTE_COND_9_22_32 + 1},
95 {0x1fffff + 2, -0x200000 + 2, 6, SUBYPTE_COND_9_22_32 + 2},
96 {0x7ffffffe, -0x80000000, 8, 0},
97 /* Conditional branches.(V850E2, max 32bit) */
98 #define SUBYPTE_SA_9_22_32 9
99 {0xfe, -0x100, 2, SUBYPTE_SA_9_22_32 + 1},
100 {0x1ffffe + 4, -0x200000 + 4, 8, SUBYPTE_SA_9_22_32 + 2},
101 {0x7ffffffe, -0x80000000, 10, 0},
102 /* Unconditional branches.(V850E2, max 32bit) */
103 #define SUBYPTE_UNCOND_9_22_32 12
104 {0xfe, -0x100, 2, SUBYPTE_UNCOND_9_22_32 + 1},
105 {0x1ffffe, -0x200000, 4, SUBYPTE_UNCOND_9_22_32 + 2},
106 {0x7ffffffe, -0x80000000, 6, 0},
107 /* Conditional branches.(V850E2R max 22bit) */
108 #define SUBYPTE_COND_9_17_22 15
109 {0xfe, -0x100, 2, SUBYPTE_COND_9_17_22 + 1},
110 {0xfffe, -0x10000, 4, SUBYPTE_COND_9_17_22 + 2},
111 {0x1ffffe + 2, -0x200000 + 2, 6, 0},
112 /* Conditional branches.(V850E2R max 22bit) */
113 #define SUBYPTE_SA_9_17_22 18
114 {0xfe, -0x100, 2, SUBYPTE_SA_9_17_22 + 1},
115 {0xfffe, -0x10000, 4, SUBYPTE_SA_9_17_22 + 2},
116 {0x1ffffe + 4, -0x200000 + 4, 8, 0},
117 /* Conditional branches.(V850E2R max 32bit) */
118 #define SUBYPTE_COND_9_17_22_32 21
119 {0xfe, -0x100, 2, SUBYPTE_COND_9_17_22_32 + 1},
120 {0xfffe, -0x10000, 4, SUBYPTE_COND_9_17_22_32 + 2},
121 {0x1ffffe + 2, -0x200000 + 2, 6, SUBYPTE_COND_9_17_22_32 + 3},
122 {0x7ffffffe, -0x80000000, 8, 0},
123 /* Conditional branches.(V850E2R max 32bit) */
124 #define SUBYPTE_SA_9_17_22_32 25
125 {0xfe, -0x100, 2, SUBYPTE_SA_9_17_22_32 + 1},
126 {0xfffe, -0x10000, 4, SUBYPTE_SA_9_17_22_32 + 2},
127 {0x1ffffe + 4, -0x200000 + 4, 8, SUBYPTE_SA_9_17_22_32 + 3},
128 {0x7ffffffe, -0x80000000, 10, 0},
129 /* Loop. (V850E2V4_UP, max 22-bit). */
130 #define SUBYPTE_LOOP_16_22 29
131 {0x0, -0x0fffe, 4, SUBYPTE_LOOP_16_22 + 1},
132 {0x1ffffe + 2, -0x200000 + 2, 6, 0},
133 };
134
135 static int v850_relax = 0;
136
137 /* Default branch disp size 22 or 32. */
138 static int default_disp_size = 22;
139
140 /* Default no using bcond17. */
141 static int no_bcond17 = 0;
142
143 /* Default no using ld/st 23bit offset. */
144 static int no_stld23 = 0;
145
146 /* Fixups. */
147 #define MAX_INSN_FIXUPS 5
148
149 struct v850_fixup
150 {
151 expressionS exp;
152 int opindex;
153 bfd_reloc_code_real_type reloc;
154 };
155
156 struct v850_fixup fixups[MAX_INSN_FIXUPS];
157 static int fc;
158
159 struct v850_seg_entry
160 {
161 segT s;
162 const char *name;
163 flagword flags;
164 };
165
166 struct v850_seg_entry v850_seg_table[] =
167 {
168 { NULL, ".sdata",
169 SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA | SEC_HAS_CONTENTS
170 | SEC_SMALL_DATA },
171 { NULL, ".tdata",
172 SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA | SEC_HAS_CONTENTS },
173 { NULL, ".zdata",
174 SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA | SEC_HAS_CONTENTS },
175 { NULL, ".sbss",
176 SEC_ALLOC | SEC_SMALL_DATA },
177 { NULL, ".tbss",
178 SEC_ALLOC },
179 { NULL, ".zbss",
180 SEC_ALLOC},
181 { NULL, ".rosdata",
182 SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_READONLY | SEC_DATA
183 | SEC_HAS_CONTENTS | SEC_SMALL_DATA },
184 { NULL, ".rozdata",
185 SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_READONLY | SEC_DATA
186 | SEC_HAS_CONTENTS },
187 { NULL, ".scommon",
188 SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA | SEC_HAS_CONTENTS
189 | SEC_SMALL_DATA | SEC_IS_COMMON },
190 { NULL, ".tcommon",
191 SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA | SEC_HAS_CONTENTS
192 | SEC_IS_COMMON },
193 { NULL, ".zcommon",
194 SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA | SEC_HAS_CONTENTS
195 | SEC_IS_COMMON },
196 { NULL, ".call_table_data",
197 SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA | SEC_HAS_CONTENTS },
198 { NULL, ".call_table_text",
199 SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_READONLY | SEC_CODE
200 | SEC_HAS_CONTENTS},
201 { NULL, ".bss",
202 SEC_ALLOC }
203 };
204
205 #define SDATA_SECTION 0
206 #define TDATA_SECTION 1
207 #define ZDATA_SECTION 2
208 #define SBSS_SECTION 3
209 #define TBSS_SECTION 4
210 #define ZBSS_SECTION 5
211 #define ROSDATA_SECTION 6
212 #define ROZDATA_SECTION 7
213 #define SCOMMON_SECTION 8
214 #define TCOMMON_SECTION 9
215 #define ZCOMMON_SECTION 10
216 #define CALL_TABLE_DATA_SECTION 11
217 #define CALL_TABLE_TEXT_SECTION 12
218 #define BSS_SECTION 13
219
220 static void
221 do_v850_seg (int i, subsegT sub)
222 {
223 struct v850_seg_entry *seg = v850_seg_table + i;
224
225 obj_elf_section_change_hook ();
226
227 if (seg->s != NULL)
228 subseg_set (seg->s, sub);
229 else
230 {
231 seg->s = subseg_new (seg->name, sub);
232 bfd_set_section_flags (stdoutput, seg->s, seg->flags);
233 if ((seg->flags & SEC_LOAD) == 0)
234 seg_info (seg->s)->bss = 1;
235 }
236 }
237
238 static void
239 v850_seg (int i)
240 {
241 subsegT sub = get_absolute_expression ();
242
243 do_v850_seg (i, sub);
244 demand_empty_rest_of_line ();
245 }
246
247 static void
248 v850_offset (int ignore ATTRIBUTE_UNUSED)
249 {
250 char *pfrag;
251 int temp = get_absolute_expression ();
252
253 pfrag = frag_var (rs_org, 1, 1, (relax_substateT)0, (symbolS *)0,
254 (offsetT) temp, (char *) 0);
255 *pfrag = 0;
256
257 demand_empty_rest_of_line ();
258 }
259
260 /* Copied from obj_elf_common() in gas/config/obj-elf.c. */
261
262 static void
263 v850_comm (int area)
264 {
265 char *name;
266 char c;
267 char *p;
268 int temp;
269 unsigned int size;
270 symbolS *symbolP;
271 int have_align;
272
273 name = input_line_pointer;
274 c = get_symbol_end ();
275
276 /* Just after name is now '\0'. */
277 p = input_line_pointer;
278 *p = c;
279
280 SKIP_WHITESPACE ();
281
282 if (*input_line_pointer != ',')
283 {
284 as_bad (_("Expected comma after symbol-name"));
285 ignore_rest_of_line ();
286 return;
287 }
288
289 /* Skip ','. */
290 input_line_pointer++;
291
292 if ((temp = get_absolute_expression ()) < 0)
293 {
294 /* xgettext:c-format */
295 as_bad (_(".COMMon length (%d.) < 0! Ignored."), temp);
296 ignore_rest_of_line ();
297 return;
298 }
299
300 size = temp;
301 *p = 0;
302 symbolP = symbol_find_or_make (name);
303 *p = c;
304
305 if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
306 {
307 as_bad (_("Ignoring attempt to re-define symbol"));
308 ignore_rest_of_line ();
309 return;
310 }
311
312 if (S_GET_VALUE (symbolP) != 0)
313 {
314 if (S_GET_VALUE (symbolP) != size)
315 /* xgettext:c-format */
316 as_warn (_("Length of .comm \"%s\" is already %ld. Not changed to %d."),
317 S_GET_NAME (symbolP), (long) S_GET_VALUE (symbolP), size);
318 }
319
320 know (symbol_get_frag (symbolP) == &zero_address_frag);
321
322 if (*input_line_pointer != ',')
323 have_align = 0;
324 else
325 {
326 have_align = 1;
327 input_line_pointer++;
328 SKIP_WHITESPACE ();
329 }
330
331 if (! have_align || *input_line_pointer != '"')
332 {
333 if (! have_align)
334 temp = 0;
335 else
336 {
337 temp = get_absolute_expression ();
338
339 if (temp < 0)
340 {
341 temp = 0;
342 as_warn (_("Common alignment negative; 0 assumed"));
343 }
344 }
345
346 if (symbol_get_obj (symbolP)->local)
347 {
348 segT old_sec;
349 int old_subsec;
350 char *pfrag;
351 int align;
352 flagword applicable;
353
354 old_sec = now_seg;
355 old_subsec = now_subseg;
356
357 applicable = bfd_applicable_section_flags (stdoutput);
358
359 applicable &= SEC_ALLOC;
360
361 switch (area)
362 {
363 case SCOMMON_SECTION:
364 do_v850_seg (SBSS_SECTION, 0);
365 break;
366
367 case ZCOMMON_SECTION:
368 do_v850_seg (ZBSS_SECTION, 0);
369 break;
370
371 case TCOMMON_SECTION:
372 do_v850_seg (TBSS_SECTION, 0);
373 break;
374 }
375
376 if (temp)
377 {
378 /* Convert to a power of 2 alignment. */
379 for (align = 0; (temp & 1) == 0; temp >>= 1, ++align)
380 ;
381
382 if (temp != 1)
383 {
384 as_bad (_("Common alignment not a power of 2"));
385 ignore_rest_of_line ();
386 return;
387 }
388 }
389 else
390 align = 0;
391
392 record_alignment (now_seg, align);
393
394 if (align)
395 frag_align (align, 0, 0);
396
397 switch (area)
398 {
399 case SCOMMON_SECTION:
400 if (S_GET_SEGMENT (symbolP) == v850_seg_table[SBSS_SECTION].s)
401 symbol_get_frag (symbolP)->fr_symbol = 0;
402 break;
403
404 case ZCOMMON_SECTION:
405 if (S_GET_SEGMENT (symbolP) == v850_seg_table[ZBSS_SECTION].s)
406 symbol_get_frag (symbolP)->fr_symbol = 0;
407 break;
408
409 case TCOMMON_SECTION:
410 if (S_GET_SEGMENT (symbolP) == v850_seg_table[TBSS_SECTION].s)
411 symbol_get_frag (symbolP)->fr_symbol = 0;
412 break;
413
414 default:
415 abort ();
416 }
417
418 symbol_set_frag (symbolP, frag_now);
419 pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP,
420 (offsetT) size, (char *) 0);
421 *pfrag = 0;
422 S_SET_SIZE (symbolP, size);
423
424 switch (area)
425 {
426 case SCOMMON_SECTION:
427 S_SET_SEGMENT (symbolP, v850_seg_table[SBSS_SECTION].s);
428 break;
429
430 case ZCOMMON_SECTION:
431 S_SET_SEGMENT (symbolP, v850_seg_table[ZBSS_SECTION].s);
432 break;
433
434 case TCOMMON_SECTION:
435 S_SET_SEGMENT (symbolP, v850_seg_table[TBSS_SECTION].s);
436 break;
437
438 default:
439 abort ();
440 }
441
442 S_CLEAR_EXTERNAL (symbolP);
443 obj_elf_section_change_hook ();
444 subseg_set (old_sec, old_subsec);
445 }
446 else
447 {
448 segT old_sec;
449 int old_subsec;
450
451 allocate_common:
452 old_sec = now_seg;
453 old_subsec = now_subseg;
454
455 S_SET_VALUE (symbolP, (valueT) size);
456 S_SET_ALIGN (symbolP, temp);
457 S_SET_EXTERNAL (symbolP);
458
459 switch (area)
460 {
461 case SCOMMON_SECTION:
462 case ZCOMMON_SECTION:
463 case TCOMMON_SECTION:
464 do_v850_seg (area, 0);
465 S_SET_SEGMENT (symbolP, v850_seg_table[area].s);
466 break;
467
468 default:
469 abort ();
470 }
471
472 obj_elf_section_change_hook ();
473 subseg_set (old_sec, old_subsec);
474 }
475 }
476 else
477 {
478 input_line_pointer++;
479
480 /* @@ Some use the dot, some don't. Can we get some consistency?? */
481 if (*input_line_pointer == '.')
482 input_line_pointer++;
483
484 /* @@ Some say data, some say bss. */
485 if (strncmp (input_line_pointer, "bss\"", 4)
486 && strncmp (input_line_pointer, "data\"", 5))
487 {
488 while (*--input_line_pointer != '"')
489 ;
490 input_line_pointer--;
491 goto bad_common_segment;
492 }
493
494 while (*input_line_pointer++ != '"')
495 ;
496
497 goto allocate_common;
498 }
499
500 symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT;
501
502 demand_empty_rest_of_line ();
503 return;
504
505 {
506 bad_common_segment:
507 p = input_line_pointer;
508 while (*p && *p != '\n')
509 p++;
510 c = *p;
511 *p = '\0';
512 as_bad (_("bad .common segment %s"), input_line_pointer + 1);
513 *p = c;
514 input_line_pointer = p;
515 ignore_rest_of_line ();
516 return;
517 }
518 }
519
520 static void
521 set_machine (int number)
522 {
523 machine = number;
524 bfd_set_arch_mach (stdoutput, v850_target_arch, machine);
525
526 switch (machine)
527 {
528 case 0: SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850); break;
529 case bfd_mach_v850: SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850); break;
530 case bfd_mach_v850e: SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E); break;
531 case bfd_mach_v850e1: SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E); break;
532 case bfd_mach_v850e2: SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E2); break;
533 case bfd_mach_v850e2v3:SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E2V3); break;
534 case bfd_mach_v850e3v5: SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E3V5); break;
535 }
536 }
537
538 static void
539 v850_longcode (int type)
540 {
541 expressionS ex;
542
543 if (! v850_relax)
544 {
545 if (type == 1)
546 as_warn (_(".longcall pseudo-op seen when not relaxing"));
547 else
548 as_warn (_(".longjump pseudo-op seen when not relaxing"));
549 }
550
551 expression (&ex);
552
553 if (ex.X_op != O_symbol || ex.X_add_number != 0)
554 {
555 as_bad (_("bad .longcall format"));
556 ignore_rest_of_line ();
557
558 return;
559 }
560
561 if (type == 1)
562 fix_new_exp (frag_now, frag_now_fix (), 4, & ex, 1,
563 BFD_RELOC_V850_LONGCALL);
564 else
565 fix_new_exp (frag_now, frag_now_fix (), 4, & ex, 1,
566 BFD_RELOC_V850_LONGJUMP);
567
568 demand_empty_rest_of_line ();
569 }
570
571 /* The target specific pseudo-ops which we support. */
572 const pseudo_typeS md_pseudo_table[] =
573 {
574 { "sdata", v850_seg, SDATA_SECTION },
575 { "tdata", v850_seg, TDATA_SECTION },
576 { "zdata", v850_seg, ZDATA_SECTION },
577 { "sbss", v850_seg, SBSS_SECTION },
578 { "tbss", v850_seg, TBSS_SECTION },
579 { "zbss", v850_seg, ZBSS_SECTION },
580 { "rosdata", v850_seg, ROSDATA_SECTION },
581 { "rozdata", v850_seg, ROZDATA_SECTION },
582 { "bss", v850_seg, BSS_SECTION },
583 { "offset", v850_offset, 0 },
584 { "word", cons, 4 },
585 { "zcomm", v850_comm, ZCOMMON_SECTION },
586 { "scomm", v850_comm, SCOMMON_SECTION },
587 { "tcomm", v850_comm, TCOMMON_SECTION },
588 { "v850", set_machine, 0 },
589 { "call_table_data", v850_seg, CALL_TABLE_DATA_SECTION },
590 { "call_table_text", v850_seg, CALL_TABLE_TEXT_SECTION },
591 { "v850e", set_machine, bfd_mach_v850e },
592 { "v850e1", set_machine, bfd_mach_v850e1 },
593 { "v850e2", set_machine, bfd_mach_v850e2 },
594 { "v850e2v3", set_machine, bfd_mach_v850e2v3 },
595 { "v850e2v4", set_machine, bfd_mach_v850e3v5 },
596 { "v850e3v5", set_machine, bfd_mach_v850e3v5 },
597 { "longcall", v850_longcode, 1 },
598 { "longjump", v850_longcode, 2 },
599 { NULL, NULL, 0 }
600 };
601
602 /* Opcode hash table. */
603 static struct hash_control *v850_hash;
604
605 /* This table is sorted. Suitable for searching by a binary search. */
606 static const struct reg_name pre_defined_registers[] =
607 {
608 { "ep", 30, PROCESSOR_ALL }, /* ep - element ptr. */
609 { "gp", 4, PROCESSOR_ALL }, /* gp - global ptr. */
610 { "hp", 2, PROCESSOR_ALL }, /* hp - handler stack ptr. */
611 { "lp", 31, PROCESSOR_ALL }, /* lp - link ptr. */
612 { "r0", 0, PROCESSOR_ALL },
613 { "r1", 1, PROCESSOR_ALL },
614 { "r10", 10, PROCESSOR_ALL },
615 { "r11", 11, PROCESSOR_ALL },
616 { "r12", 12, PROCESSOR_ALL },
617 { "r13", 13, PROCESSOR_ALL },
618 { "r14", 14, PROCESSOR_ALL },
619 { "r15", 15, PROCESSOR_ALL },
620 { "r16", 16, PROCESSOR_ALL },
621 { "r17", 17, PROCESSOR_ALL },
622 { "r18", 18, PROCESSOR_ALL },
623 { "r19", 19, PROCESSOR_ALL },
624 { "r2", 2, PROCESSOR_ALL },
625 { "r20", 20, PROCESSOR_ALL },
626 { "r21", 21, PROCESSOR_ALL },
627 { "r22", 22, PROCESSOR_ALL },
628 { "r23", 23, PROCESSOR_ALL },
629 { "r24", 24, PROCESSOR_ALL },
630 { "r25", 25, PROCESSOR_ALL },
631 { "r26", 26, PROCESSOR_ALL },
632 { "r27", 27, PROCESSOR_ALL },
633 { "r28", 28, PROCESSOR_ALL },
634 { "r29", 29, PROCESSOR_ALL },
635 { "r3", 3, PROCESSOR_ALL },
636 { "r30", 30, PROCESSOR_ALL },
637 { "r31", 31, PROCESSOR_ALL },
638 { "r4", 4, PROCESSOR_ALL },
639 { "r5", 5, PROCESSOR_ALL },
640 { "r6", 6, PROCESSOR_ALL },
641 { "r7", 7, PROCESSOR_ALL },
642 { "r8", 8, PROCESSOR_ALL },
643 { "r9", 9, PROCESSOR_ALL },
644 { "sp", 3, PROCESSOR_ALL }, /* sp - stack ptr. */
645 { "tp", 5, PROCESSOR_ALL }, /* tp - text ptr. */
646 { "zero", 0, PROCESSOR_ALL },
647 };
648
649 #define REG_NAME_CNT \
650 (sizeof (pre_defined_registers) / sizeof (struct reg_name))
651
652 static const struct reg_name system_registers[] =
653 {
654 { "asid", 23, PROCESSOR_NOT_V850 },
655 { "bpam", 25, PROCESSOR_NOT_V850 },
656 { "bpav", 24, PROCESSOR_NOT_V850 },
657 { "bpc", 22, PROCESSOR_NOT_V850 },
658 { "bpdm", 27, PROCESSOR_NOT_V850 },
659 { "bpdv", 26, PROCESSOR_NOT_V850 },
660 { "bsel", 31, PROCESSOR_V850E2_UP },
661 { "cfg", 7, PROCESSOR_V850E2V3_UP },
662 { "ctbp", 20, PROCESSOR_NOT_V850 },
663 { "ctpc", 16, PROCESSOR_NOT_V850 },
664 { "ctpsw", 17, PROCESSOR_NOT_V850 },
665 { "dbic", 15, PROCESSOR_V850E2_UP },
666 { "dbpc", 18, PROCESSOR_NOT_V850 },
667 { "dbpsw", 19, PROCESSOR_NOT_V850 },
668 { "dbwr", 30, PROCESSOR_V850E2_UP },
669 { "dir", 21, PROCESSOR_NOT_V850 },
670 { "dpa0l", 16, PROCESSOR_V850E2V3_UP },
671 { "dpa0u", 17, PROCESSOR_V850E2V3_UP },
672 { "dpa1l", 18, PROCESSOR_V850E2V3_UP },
673 { "dpa1u", 19, PROCESSOR_V850E2V3_UP },
674 { "dpa2l", 20, PROCESSOR_V850E2V3_UP },
675 { "dpa2u", 21, PROCESSOR_V850E2V3_UP },
676 { "dpa3l", 22, PROCESSOR_V850E2V3_UP },
677 { "dpa3u", 23, PROCESSOR_V850E2V3_UP },
678 { "dpa4l", 24, PROCESSOR_V850E2V3_UP },
679 { "dpa4u", 25, PROCESSOR_V850E2V3_UP },
680 { "dpa5l", 26, PROCESSOR_V850E2V3_UP },
681 { "dpa5u", 27, PROCESSOR_V850E2V3_UP },
682 { "ecr", 4, PROCESSOR_ALL },
683 { "eh_base", 3, PROCESSOR_V850E2V3_UP },
684 { "eh_cfg", 1, PROCESSOR_V850E2V3_UP },
685 { "eh_reset", 2, PROCESSOR_V850E2V3_UP },
686 { "eiic", 13, PROCESSOR_V850E2_UP },
687 { "eipc", 0, PROCESSOR_ALL },
688 { "eipsw", 1, PROCESSOR_ALL },
689 { "eiwr", 28, PROCESSOR_V850E2_UP },
690 { "feic", 14, PROCESSOR_V850E2_UP },
691 { "fepc", 2, PROCESSOR_ALL },
692 { "fepsw", 3, PROCESSOR_ALL },
693 { "fewr", 29, PROCESSOR_V850E2_UP },
694 { "fpcc", 9, PROCESSOR_V850E2V3_UP },
695 { "fpcfg", 10, PROCESSOR_V850E2V3_UP },
696 { "fpec", 11, PROCESSOR_V850E2V3_UP },
697 { "fpepc", 7, PROCESSOR_V850E2V3_UP },
698 { "fpspc", 27, PROCESSOR_V850E2V3_UP },
699 { "fpsr", 6, PROCESSOR_V850E2V3_UP },
700 { "fpst", 8, PROCESSOR_V850E2V3_UP },
701 { "ipa0l", 6, PROCESSOR_V850E2V3_UP },
702 { "ipa0u", 7, PROCESSOR_V850E2V3_UP },
703 { "ipa1l", 8, PROCESSOR_V850E2V3_UP },
704 { "ipa1u", 9, PROCESSOR_V850E2V3_UP },
705 { "ipa2l", 10, PROCESSOR_V850E2V3_UP },
706 { "ipa2u", 11, PROCESSOR_V850E2V3_UP },
707 { "ipa3l", 12, PROCESSOR_V850E2V3_UP },
708 { "ipa3u", 13, PROCESSOR_V850E2V3_UP },
709 { "ipa4l", 14, PROCESSOR_V850E2V3_UP },
710 { "ipa4u", 15, PROCESSOR_V850E2V3_UP },
711 { "mca", 24, PROCESSOR_V850E2V3_UP },
712 { "mcc", 26, PROCESSOR_V850E2V3_UP },
713 { "mcr", 27, PROCESSOR_V850E2V3_UP },
714 { "mcs", 25, PROCESSOR_V850E2V3_UP },
715 { "mpc", 1, PROCESSOR_V850E2V3_UP },
716 { "mpm", 0, PROCESSOR_V850E2V3_UP },
717 { "mpu10_dpa0l", 16, PROCESSOR_V850E2V3_UP },
718 { "mpu10_dpa0u", 17, PROCESSOR_V850E2V3_UP },
719 { "mpu10_dpa1l", 18, PROCESSOR_V850E2V3_UP },
720 { "mpu10_dpa1u", 19, PROCESSOR_V850E2V3_UP },
721 { "mpu10_dpa2l", 20, PROCESSOR_V850E2V3_UP },
722 { "mpu10_dpa2u", 21, PROCESSOR_V850E2V3_UP },
723 { "mpu10_dpa3l", 22, PROCESSOR_V850E2V3_UP },
724 { "mpu10_dpa3u", 23, PROCESSOR_V850E2V3_UP },
725 { "mpu10_dpa4l", 24, PROCESSOR_V850E2V3_UP },
726 { "mpu10_dpa4u", 25, PROCESSOR_V850E2V3_UP },
727 { "mpu10_dpa5l", 26, PROCESSOR_V850E2V3_UP },
728 { "mpu10_dpa5u", 27, PROCESSOR_V850E2V3_UP },
729 { "mpu10_ipa0l", 6, PROCESSOR_V850E2V3_UP },
730 { "mpu10_ipa0u", 7, PROCESSOR_V850E2V3_UP },
731 { "mpu10_ipa1l", 8, PROCESSOR_V850E2V3_UP },
732 { "mpu10_ipa1u", 9, PROCESSOR_V850E2V3_UP },
733 { "mpu10_ipa2l", 10, PROCESSOR_V850E2V3_UP },
734 { "mpu10_ipa2u", 11, PROCESSOR_V850E2V3_UP },
735 { "mpu10_ipa3l", 12, PROCESSOR_V850E2V3_UP },
736 { "mpu10_ipa3u", 13, PROCESSOR_V850E2V3_UP },
737 { "mpu10_ipa4l", 14, PROCESSOR_V850E2V3_UP },
738 { "mpu10_ipa4u", 15, PROCESSOR_V850E2V3_UP },
739 { "mpu10_mpc", 1, PROCESSOR_V850E2V3_UP },
740 { "mpu10_mpm", 0, PROCESSOR_V850E2V3_UP },
741 { "mpu10_tid", 2, PROCESSOR_V850E2V3_UP },
742 { "mpu10_vmadr", 5, PROCESSOR_V850E2V3_UP },
743 { "mpu10_vmecr", 3, PROCESSOR_V850E2V3_UP },
744 { "mpu10_vmtid", 4, PROCESSOR_V850E2V3_UP },
745 { "pid", 6, PROCESSOR_V850E2V3_UP },
746 { "pmcr0", 4, PROCESSOR_V850E2V3_UP },
747 { "pmis2", 14, PROCESSOR_V850E2V3_UP },
748 { "psw", 5, PROCESSOR_ALL },
749 { "scbp", 12, PROCESSOR_V850E2V3_UP },
750 { "sccfg", 11, PROCESSOR_V850E2V3_UP },
751 { "sr0", 0, PROCESSOR_ALL },
752 { "sr1", 1, PROCESSOR_ALL },
753 { "sr10", 10, PROCESSOR_ALL },
754 { "sr11", 11, PROCESSOR_ALL },
755 { "sr12", 12, PROCESSOR_ALL },
756 { "sr13", 13, PROCESSOR_ALL },
757 { "sr14", 14, PROCESSOR_ALL },
758 { "sr15", 15, PROCESSOR_ALL },
759 { "sr16", 16, PROCESSOR_ALL },
760 { "sr17", 17, PROCESSOR_ALL },
761 { "sr18", 18, PROCESSOR_ALL },
762 { "sr19", 19, PROCESSOR_ALL },
763 { "sr2", 2, PROCESSOR_ALL },
764 { "sr20", 20, PROCESSOR_ALL },
765 { "sr21", 21, PROCESSOR_ALL },
766 { "sr22", 22, PROCESSOR_ALL },
767 { "sr23", 23, PROCESSOR_ALL },
768 { "sr24", 24, PROCESSOR_ALL },
769 { "sr25", 25, PROCESSOR_ALL },
770 { "sr26", 26, PROCESSOR_ALL },
771 { "sr27", 27, PROCESSOR_ALL },
772 { "sr28", 28, PROCESSOR_ALL },
773 { "sr29", 29, PROCESSOR_ALL },
774 { "sr3", 3, PROCESSOR_ALL },
775 { "sr30", 30, PROCESSOR_ALL },
776 { "sr31", 31, PROCESSOR_ALL },
777 { "sr4", 4, PROCESSOR_ALL },
778 { "sr5", 5, PROCESSOR_ALL },
779 { "sr6", 6, PROCESSOR_ALL },
780 { "sr7", 7, PROCESSOR_ALL },
781 { "sr8", 8, PROCESSOR_ALL },
782 { "sr9", 9, PROCESSOR_ALL },
783 { "sw_base", 3, PROCESSOR_V850E2V3_UP },
784 { "sw_cfg", 1, PROCESSOR_V850E2V3_UP },
785 { "sw_ctl", 0, PROCESSOR_V850E2V3_UP },
786 { "tid", 2, PROCESSOR_V850E2V3_UP },
787 { "vmadr", 6, PROCESSOR_V850E2V3_UP },
788 { "vmecr", 4, PROCESSOR_V850E2V3_UP },
789 { "vmtid", 5, PROCESSOR_V850E2V3_UP },
790 { "vsadr", 2, PROCESSOR_V850E2V3_UP },
791 { "vsecr", 0, PROCESSOR_V850E2V3_UP },
792 { "vstid", 1, PROCESSOR_V850E2V3_UP },
793 };
794
795 #define SYSREG_NAME_CNT \
796 (sizeof (system_registers) / sizeof (struct reg_name))
797
798
799 static const struct reg_name cc_names[] =
800 {
801 { "c", 0x1, PROCESSOR_ALL },
802 { "e", 0x2, PROCESSOR_ALL },
803 { "ge", 0xe, PROCESSOR_ALL },
804 { "gt", 0xf, PROCESSOR_ALL },
805 { "h", 0xb, PROCESSOR_ALL },
806 { "l", 0x1, PROCESSOR_ALL },
807 { "le", 0x7, PROCESSOR_ALL },
808 { "lt", 0x6, PROCESSOR_ALL },
809 { "n", 0x4, PROCESSOR_ALL },
810 { "nc", 0x9, PROCESSOR_ALL },
811 { "ne", 0xa, PROCESSOR_ALL },
812 { "nh", 0x3, PROCESSOR_ALL },
813 { "nl", 0x9, PROCESSOR_ALL },
814 { "ns", 0xc, PROCESSOR_ALL },
815 { "nv", 0x8, PROCESSOR_ALL },
816 { "nz", 0xa, PROCESSOR_ALL },
817 { "p", 0xc, PROCESSOR_ALL },
818 { "s", 0x4, PROCESSOR_ALL },
819 #define COND_SA_NUM 0xd
820 { "sa", COND_SA_NUM, PROCESSOR_ALL },
821 { "t", 0x5, PROCESSOR_ALL },
822 { "v", 0x0, PROCESSOR_ALL },
823 { "z", 0x2, PROCESSOR_ALL },
824 };
825
826 #define CC_NAME_CNT \
827 (sizeof (cc_names) / sizeof (struct reg_name))
828
829 static const struct reg_name float_cc_names[] =
830 {
831 { "eq", 0x2, PROCESSOR_V850E2V3_UP }, /* true. */
832 { "f", 0x0, PROCESSOR_V850E2V3_UP }, /* true. */
833 { "ge", 0xd, PROCESSOR_V850E2V3_UP }, /* false. */
834 { "gl", 0xb, PROCESSOR_V850E2V3_UP }, /* false. */
835 { "gle", 0x9, PROCESSOR_V850E2V3_UP }, /* false. */
836 { "gt", 0xf, PROCESSOR_V850E2V3_UP }, /* false. */
837 { "le", 0xe, PROCESSOR_V850E2V3_UP }, /* true. */
838 { "lt", 0xc, PROCESSOR_V850E2V3_UP }, /* true. */
839 { "neq", 0x2, PROCESSOR_V850E2V3_UP }, /* false. */
840 { "nge", 0xd, PROCESSOR_V850E2V3_UP }, /* true. */
841 { "ngl", 0xb, PROCESSOR_V850E2V3_UP }, /* true. */
842 { "ngle",0x9, PROCESSOR_V850E2V3_UP }, /* true. */
843 { "ngt", 0xf, PROCESSOR_V850E2V3_UP }, /* true. */
844 { "nle", 0xe, PROCESSOR_V850E2V3_UP }, /* false. */
845 { "nlt", 0xc, PROCESSOR_V850E2V3_UP }, /* false. */
846 { "oge", 0x5, PROCESSOR_V850E2V3_UP }, /* false. */
847 { "ogl", 0x3, PROCESSOR_V850E2V3_UP }, /* false. */
848 { "ogt", 0x7, PROCESSOR_V850E2V3_UP }, /* false. */
849 { "ole", 0x6, PROCESSOR_V850E2V3_UP }, /* true. */
850 { "olt", 0x4, PROCESSOR_V850E2V3_UP }, /* true. */
851 { "or", 0x1, PROCESSOR_V850E2V3_UP }, /* false. */
852 { "seq", 0xa, PROCESSOR_V850E2V3_UP }, /* true. */
853 { "sf", 0x8, PROCESSOR_V850E2V3_UP }, /* true. */
854 { "sne", 0xa, PROCESSOR_V850E2V3_UP }, /* false. */
855 { "st", 0x8, PROCESSOR_V850E2V3_UP }, /* false. */
856 { "t", 0x0, PROCESSOR_V850E2V3_UP }, /* false. */
857 { "ueq", 0x3, PROCESSOR_V850E2V3_UP }, /* true. */
858 { "uge", 0x4, PROCESSOR_V850E2V3_UP }, /* false. */
859 { "ugt", 0x6, PROCESSOR_V850E2V3_UP }, /* false. */
860 { "ule", 0x7, PROCESSOR_V850E2V3_UP }, /* true. */
861 { "ult", 0x5, PROCESSOR_V850E2V3_UP }, /* true. */
862 { "un", 0x1, PROCESSOR_V850E2V3_UP }, /* true. */
863 };
864
865 #define FLOAT_CC_NAME_CNT \
866 (sizeof (float_cc_names) / sizeof (struct reg_name))
867
868
869 static const struct reg_name cacheop_names[] =
870 {
871 { "cfald", 0x44, PROCESSOR_V850E3V5_UP },
872 { "cfali", 0x40, PROCESSOR_V850E3V5_UP },
873 { "chbid", 0x04, PROCESSOR_V850E3V5_UP },
874 { "chbii", 0x00, PROCESSOR_V850E3V5_UP },
875 { "chbiwbd", 0x06, PROCESSOR_V850E3V5_UP },
876 { "chbwbd", 0x07, PROCESSOR_V850E3V5_UP },
877 { "cibid", 0x24, PROCESSOR_V850E3V5_UP },
878 { "cibii", 0x20, PROCESSOR_V850E3V5_UP },
879 { "cibiwbd", 0x26, PROCESSOR_V850E3V5_UP },
880 { "cibwbd", 0x27, PROCESSOR_V850E3V5_UP },
881 { "cildd", 0x65, PROCESSOR_V850E3V5_UP },
882 { "cildi", 0x61, PROCESSOR_V850E3V5_UP },
883 { "cistd", 0x64, PROCESSOR_V850E3V5_UP },
884 { "cisti", 0x60, PROCESSOR_V850E3V5_UP },
885 };
886
887 #define CACHEOP_NAME_CNT \
888 (sizeof (cacheop_names) / sizeof (struct reg_name))
889
890 static const struct reg_name prefop_names[] =
891 {
892 { "prefd", 0x04, PROCESSOR_V850E3V5_UP },
893 { "prefi", 0x00, PROCESSOR_V850E3V5_UP },
894 };
895
896 #define PREFOP_NAME_CNT \
897 (sizeof (prefop_names) / sizeof (struct reg_name))
898
899 static const struct reg_name vector_registers[] =
900 {
901 { "vr0", 0, PROCESSOR_V850E3V5_UP },
902 { "vr1", 1, PROCESSOR_V850E3V5_UP },
903 { "vr10", 10, PROCESSOR_V850E3V5_UP },
904 { "vr11", 11, PROCESSOR_V850E3V5_UP },
905 { "vr12", 12, PROCESSOR_V850E3V5_UP },
906 { "vr13", 13, PROCESSOR_V850E3V5_UP },
907 { "vr14", 14, PROCESSOR_V850E3V5_UP },
908 { "vr15", 15, PROCESSOR_V850E3V5_UP },
909 { "vr16", 16, PROCESSOR_V850E3V5_UP },
910 { "vr17", 17, PROCESSOR_V850E3V5_UP },
911 { "vr18", 18, PROCESSOR_V850E3V5_UP },
912 { "vr19", 19, PROCESSOR_V850E3V5_UP },
913 { "vr2", 2, PROCESSOR_V850E3V5_UP },
914 { "vr20", 20, PROCESSOR_V850E3V5_UP },
915 { "vr21", 21, PROCESSOR_V850E3V5_UP },
916 { "vr22", 22, PROCESSOR_V850E3V5_UP },
917 { "vr23", 23, PROCESSOR_V850E3V5_UP },
918 { "vr24", 24, PROCESSOR_V850E3V5_UP },
919 { "vr25", 25, PROCESSOR_V850E3V5_UP },
920 { "vr26", 26, PROCESSOR_V850E3V5_UP },
921 { "vr27", 27, PROCESSOR_V850E3V5_UP },
922 { "vr28", 28, PROCESSOR_V850E3V5_UP },
923 { "vr29", 29, PROCESSOR_V850E3V5_UP },
924 { "vr3", 3, PROCESSOR_V850E3V5_UP },
925 { "vr30", 30, PROCESSOR_V850E3V5_UP },
926 { "vr31", 31, PROCESSOR_V850E3V5_UP },
927 { "vr4", 4, PROCESSOR_V850E3V5_UP },
928 { "vr5", 5, PROCESSOR_V850E3V5_UP },
929 { "vr6", 6, PROCESSOR_V850E3V5_UP },
930 { "vr7", 7, PROCESSOR_V850E3V5_UP },
931 { "vr8", 8, PROCESSOR_V850E3V5_UP },
932 { "vr9", 9, PROCESSOR_V850E3V5_UP },
933 };
934
935 #define VREG_NAME_CNT \
936 (sizeof (vector_registers) / sizeof (struct reg_name))
937
938 /* Do a binary search of the given register table to see if NAME is a
939 valid regiter name. Return the register number from the array on
940 success, or -1 on failure. */
941
942 static int
943 reg_name_search (const struct reg_name *regs,
944 int regcount,
945 const char *name,
946 bfd_boolean accept_numbers)
947 {
948 int middle, low, high;
949 int cmp;
950 symbolS *symbolP;
951
952 /* If the register name is a symbol, then evaluate it. */
953 if ((symbolP = symbol_find (name)) != NULL)
954 {
955 /* If the symbol is an alias for another name then use that.
956 If the symbol is an alias for a number, then return the number. */
957 if (symbol_equated_p (symbolP))
958 name
959 = S_GET_NAME (symbol_get_value_expression (symbolP)->X_add_symbol);
960 else if (accept_numbers)
961 {
962 int reg = S_GET_VALUE (symbolP);
963 return reg;
964 }
965
966 /* Otherwise drop through and try parsing name normally. */
967 }
968
969 low = 0;
970 high = regcount - 1;
971
972 do
973 {
974 middle = (low + high) / 2;
975 cmp = strcasecmp (name, regs[middle].name);
976 if (cmp < 0)
977 high = middle - 1;
978 else if (cmp > 0)
979 low = middle + 1;
980 else
981 return ((regs[middle].processors & processor_mask)
982 ? regs[middle].value
983 : -1);
984 }
985 while (low <= high);
986 return -1;
987 }
988
989 /* Summary of register_name().
990
991 in: Input_line_pointer points to 1st char of operand.
992
993 out: An expressionS.
994 The operand may have been a register: in this case, X_op == O_register,
995 X_add_number is set to the register number, and truth is returned.
996 Input_line_pointer->(next non-blank) char after operand, or is in
997 its original state. */
998
999 static bfd_boolean
1000 register_name (expressionS *expressionP)
1001 {
1002 int reg_number;
1003 char *name;
1004 char *start;
1005 char c;
1006
1007 /* Find the spelling of the operand. */
1008 start = name = input_line_pointer;
1009
1010 c = get_symbol_end ();
1011
1012 reg_number = reg_name_search (pre_defined_registers, REG_NAME_CNT,
1013 name, FALSE);
1014
1015 /* Put back the delimiting char. */
1016 *input_line_pointer = c;
1017
1018 expressionP->X_add_symbol = NULL;
1019 expressionP->X_op_symbol = NULL;
1020
1021 /* Look to see if it's in the register table. */
1022 if (reg_number >= 0)
1023 {
1024 expressionP->X_op = O_register;
1025 expressionP->X_add_number = reg_number;
1026
1027 return TRUE;
1028 }
1029
1030 /* Reset the line as if we had not done anything. */
1031 input_line_pointer = start;
1032
1033 expressionP->X_op = O_illegal;
1034
1035 return FALSE;
1036 }
1037
1038 /* Summary of system_register_name().
1039
1040 in: INPUT_LINE_POINTER points to 1st char of operand.
1041 EXPRESSIONP points to an expression structure to be filled in.
1042 ACCEPT_NUMBERS is true iff numerical register names may be used.
1043
1044 out: An expressionS structure in expressionP.
1045 The operand may have been a register: in this case, X_op == O_register,
1046 X_add_number is set to the register number, and truth is returned.
1047 Input_line_pointer->(next non-blank) char after operand, or is in
1048 its original state. */
1049
1050 static bfd_boolean
1051 system_register_name (expressionS *expressionP,
1052 bfd_boolean accept_numbers)
1053 {
1054 int reg_number;
1055 char *name;
1056 char *start;
1057 char c;
1058
1059 /* Find the spelling of the operand. */
1060 start = name = input_line_pointer;
1061
1062 c = get_symbol_end ();
1063 reg_number = reg_name_search (system_registers, SYSREG_NAME_CNT, name,
1064 accept_numbers);
1065
1066 /* Put back the delimiting char. */
1067 *input_line_pointer = c;
1068
1069 if (reg_number < 0
1070 && accept_numbers)
1071 {
1072 /* Reset input_line pointer. */
1073 input_line_pointer = start;
1074
1075 if (ISDIGIT (*input_line_pointer))
1076 {
1077 reg_number = strtol (input_line_pointer, &input_line_pointer, 0);
1078 }
1079 }
1080
1081 expressionP->X_add_symbol = NULL;
1082 expressionP->X_op_symbol = NULL;
1083
1084 /* Look to see if it's in the register table. */
1085 if (reg_number >= 0)
1086 {
1087 expressionP->X_op = O_register;
1088 expressionP->X_add_number = reg_number;
1089
1090 return TRUE;
1091 }
1092
1093 /* Reset the line as if we had not done anything. */
1094 input_line_pointer = start;
1095
1096 expressionP->X_op = O_illegal;
1097
1098 return FALSE;
1099 }
1100
1101 /* Summary of cc_name().
1102
1103 in: INPUT_LINE_POINTER points to 1st char of operand.
1104
1105 out: An expressionS.
1106 The operand may have been a register: in this case, X_op == O_register,
1107 X_add_number is set to the register number, and truth is returned.
1108 Input_line_pointer->(next non-blank) char after operand, or is in
1109 its original state. */
1110
1111 static bfd_boolean
1112 cc_name (expressionS *expressionP,
1113 bfd_boolean accept_numbers)
1114 {
1115 int reg_number;
1116 char *name;
1117 char *start;
1118 char c;
1119
1120 /* Find the spelling of the operand. */
1121 start = name = input_line_pointer;
1122
1123 c = get_symbol_end ();
1124 reg_number = reg_name_search (cc_names, CC_NAME_CNT, name, accept_numbers);
1125
1126 /* Put back the delimiting char. */
1127 *input_line_pointer = c;
1128
1129 if (reg_number < 0
1130 && accept_numbers)
1131 {
1132 /* Reset input_line pointer. */
1133 input_line_pointer = start;
1134
1135 if (ISDIGIT (*input_line_pointer))
1136 {
1137 reg_number = strtol (input_line_pointer, &input_line_pointer, 0);
1138 }
1139 }
1140
1141 expressionP->X_add_symbol = NULL;
1142 expressionP->X_op_symbol = NULL;
1143
1144 /* Look to see if it's in the register table. */
1145 if (reg_number >= 0)
1146 {
1147 expressionP->X_op = O_constant;
1148 expressionP->X_add_number = reg_number;
1149
1150 return TRUE;
1151 }
1152
1153 /* Reset the line as if we had not done anything. */
1154 input_line_pointer = start;
1155
1156 expressionP->X_op = O_illegal;
1157 expressionP->X_add_number = 0;
1158
1159 return FALSE;
1160 }
1161
1162 static bfd_boolean
1163 float_cc_name (expressionS *expressionP,
1164 bfd_boolean accept_numbers)
1165 {
1166 int reg_number;
1167 char *name;
1168 char *start;
1169 char c;
1170
1171 /* Find the spelling of the operand. */
1172 start = name = input_line_pointer;
1173
1174 c = get_symbol_end ();
1175 reg_number = reg_name_search (float_cc_names, FLOAT_CC_NAME_CNT, name, accept_numbers);
1176
1177 /* Put back the delimiting char. */
1178 *input_line_pointer = c;
1179
1180 if (reg_number < 0
1181 && accept_numbers)
1182 {
1183 /* Reset input_line pointer. */
1184 input_line_pointer = start;
1185
1186 if (ISDIGIT (*input_line_pointer))
1187 {
1188 reg_number = strtol (input_line_pointer, &input_line_pointer, 0);
1189 }
1190 }
1191
1192 expressionP->X_add_symbol = NULL;
1193 expressionP->X_op_symbol = NULL;
1194
1195 /* Look to see if it's in the register table. */
1196 if (reg_number >= 0)
1197 {
1198 expressionP->X_op = O_constant;
1199 expressionP->X_add_number = reg_number;
1200
1201 return TRUE;
1202 }
1203
1204 /* Reset the line as if we had not done anything. */
1205 input_line_pointer = start;
1206
1207 expressionP->X_op = O_illegal;
1208 expressionP->X_add_number = 0;
1209
1210 return FALSE;
1211 }
1212
1213 static bfd_boolean
1214 cacheop_name (expressionS * expressionP,
1215 bfd_boolean accept_numbers)
1216 {
1217 int reg_number;
1218 char *name;
1219 char *start;
1220 char c;
1221
1222 /* Find the spelling of the operand. */
1223 start = name = input_line_pointer;
1224
1225 c = get_symbol_end ();
1226 reg_number = reg_name_search (cacheop_names, CACHEOP_NAME_CNT, name, accept_numbers);
1227
1228 /* Put back the delimiting char. */
1229 *input_line_pointer = c;
1230
1231 if (reg_number < 0
1232 && accept_numbers)
1233 {
1234 /* Reset input_line pointer. */
1235 input_line_pointer = start;
1236
1237 if (ISDIGIT (*input_line_pointer))
1238 reg_number = strtol (input_line_pointer, &input_line_pointer, 0);
1239 }
1240
1241 expressionP->X_add_symbol = NULL;
1242 expressionP->X_op_symbol = NULL;
1243
1244 /* Look to see if it's in the register table. */
1245 if (reg_number >= 0)
1246 {
1247 expressionP->X_op = O_constant;
1248 expressionP->X_add_number = reg_number;
1249
1250 return TRUE;
1251 }
1252
1253 /* Reset the line as if we had not done anything. */
1254 input_line_pointer = start;
1255
1256 expressionP->X_op = O_illegal;
1257 expressionP->X_add_number = 0;
1258
1259 return FALSE;
1260 }
1261
1262 static bfd_boolean
1263 prefop_name (expressionS * expressionP,
1264 bfd_boolean accept_numbers)
1265 {
1266 int reg_number;
1267 char *name;
1268 char *start;
1269 char c;
1270
1271 /* Find the spelling of the operand. */
1272 start = name = input_line_pointer;
1273
1274 c = get_symbol_end ();
1275 reg_number = reg_name_search (prefop_names, PREFOP_NAME_CNT, name, accept_numbers);
1276
1277 /* Put back the delimiting char. */
1278 *input_line_pointer = c;
1279
1280 if (reg_number < 0
1281 && accept_numbers)
1282 {
1283 /* Reset input_line pointer. */
1284 input_line_pointer = start;
1285
1286 if (ISDIGIT (*input_line_pointer))
1287 reg_number = strtol (input_line_pointer, &input_line_pointer, 0);
1288 }
1289
1290 expressionP->X_add_symbol = NULL;
1291 expressionP->X_op_symbol = NULL;
1292
1293 /* Look to see if it's in the register table. */
1294 if (reg_number >= 0)
1295 {
1296 expressionP->X_op = O_constant;
1297 expressionP->X_add_number = reg_number;
1298
1299 return TRUE;
1300 }
1301
1302 /* Reset the line as if we had not done anything. */
1303 input_line_pointer = start;
1304
1305 expressionP->X_op = O_illegal;
1306 expressionP->X_add_number = 0;
1307
1308 return FALSE;
1309 }
1310
1311 static bfd_boolean
1312 vector_register_name (expressionS *expressionP)
1313 {
1314 int reg_number;
1315 char *name;
1316 char *start;
1317 char c;
1318
1319 /* Find the spelling of the operand. */
1320 start = name = input_line_pointer;
1321
1322 c = get_symbol_end ();
1323
1324 reg_number = reg_name_search (vector_registers, VREG_NAME_CNT,
1325 name, FALSE);
1326
1327 /* Put back the delimiting char. */
1328 *input_line_pointer = c;
1329
1330 expressionP->X_add_symbol = NULL;
1331 expressionP->X_op_symbol = NULL;
1332
1333 /* Look to see if it's in the register table. */
1334 if (reg_number >= 0)
1335 {
1336 expressionP->X_op = O_register;
1337 expressionP->X_add_number = reg_number;
1338
1339 return TRUE;
1340 }
1341
1342 /* Reset the line as if we had not done anything. */
1343 input_line_pointer = start;
1344
1345 expressionP->X_op = O_illegal;
1346
1347 return FALSE;
1348 }
1349
1350 static void
1351 skip_white_space (void)
1352 {
1353 while (*input_line_pointer == ' '
1354 || *input_line_pointer == '\t')
1355 ++input_line_pointer;
1356 }
1357
1358 /* Summary of parse_register_list ().
1359
1360 in: INPUT_LINE_POINTER points to 1st char of a list of registers.
1361 INSN is the partially constructed instruction.
1362 OPERAND is the operand being inserted.
1363
1364 out: NULL if the parse completed successfully, otherwise a
1365 pointer to an error message is returned. If the parse
1366 completes the correct bit fields in the instruction
1367 will be filled in.
1368
1369 Parses register lists with the syntax:
1370
1371 { rX }
1372 { rX, rY }
1373 { rX - rY }
1374 { rX - rY, rZ }
1375 etc
1376
1377 and also parses constant expressions whoes bits indicate the
1378 registers in the lists. The LSB in the expression refers to
1379 the lowest numbered permissible register in the register list,
1380 and so on upwards. System registers are considered to be very
1381 high numbers. */
1382
1383 static char *
1384 parse_register_list (unsigned long *insn,
1385 const struct v850_operand *operand)
1386 {
1387 static int type1_regs[32] =
1388 {
1389 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1390 0, 0, 0, 0, 0, 31, 29, 28, 23, 22, 21, 20, 27, 26, 25, 24
1391 };
1392
1393 int *regs;
1394 expressionS exp;
1395
1396 /* Select a register array to parse. */
1397 switch (operand->shift)
1398 {
1399 case 0xffe00001: regs = type1_regs; break;
1400 default:
1401 as_bad (_("unknown operand shift: %x\n"), operand->shift);
1402 return _("internal failure in parse_register_list");
1403 }
1404
1405 skip_white_space ();
1406
1407 /* If the expression starts with a curly brace it is a register list.
1408 Otherwise it is a constant expression, whoes bits indicate which
1409 registers are to be included in the list. */
1410 if (*input_line_pointer != '{')
1411 {
1412 int reg;
1413 int i;
1414
1415 expression (&exp);
1416
1417 if (exp.X_op != O_constant)
1418 return _("constant expression or register list expected");
1419
1420 if (regs == type1_regs)
1421 {
1422 if (exp.X_add_number & 0xFFFFF000)
1423 return _("high bits set in register list expression");
1424
1425 for (reg = 20; reg < 32; reg++)
1426 if (exp.X_add_number & (1 << (reg - 20)))
1427 {
1428 for (i = 0; i < 32; i++)
1429 if (regs[i] == reg)
1430 *insn |= (1 << i);
1431 }
1432 }
1433
1434 return NULL;
1435 }
1436
1437 input_line_pointer++;
1438
1439 /* Parse the register list until a terminator (closing curly brace or
1440 new-line) is found. */
1441 for (;;)
1442 {
1443 skip_white_space ();
1444
1445 if (register_name (&exp))
1446 {
1447 int i;
1448
1449 /* Locate the given register in the list, and if it is there,
1450 insert the corresponding bit into the instruction. */
1451 for (i = 0; i < 32; i++)
1452 {
1453 if (regs[i] == exp.X_add_number)
1454 {
1455 *insn |= (1 << i);
1456 break;
1457 }
1458 }
1459
1460 if (i == 32)
1461 return _("illegal register included in list");
1462 }
1463 else if (system_register_name (&exp, TRUE))
1464 {
1465 if (regs == type1_regs)
1466 {
1467 return _("system registers cannot be included in list");
1468 }
1469 }
1470
1471 if (*input_line_pointer == '}')
1472 {
1473 input_line_pointer++;
1474 break;
1475 }
1476 else if (*input_line_pointer == ',')
1477 {
1478 input_line_pointer++;
1479 continue;
1480 }
1481 else if (*input_line_pointer == '-')
1482 {
1483 /* We have encountered a range of registers: rX - rY. */
1484 int j;
1485 expressionS exp2;
1486
1487 /* Skip the dash. */
1488 ++input_line_pointer;
1489
1490 /* Get the second register in the range. */
1491 if (! register_name (&exp2))
1492 {
1493 return _("second register should follow dash in register list");
1494 }
1495
1496 if (exp.X_add_number > exp2.X_add_number)
1497 {
1498 return _("second register should be greater than first register");
1499 }
1500
1501 /* Add the rest of the registers in the range. */
1502 for (j = exp.X_add_number + 1; j <= exp2.X_add_number; j++)
1503 {
1504 int i;
1505
1506 /* Locate the given register in the list, and if it is there,
1507 insert the corresponding bit into the instruction. */
1508 for (i = 0; i < 32; i++)
1509 {
1510 if (regs[i] == j)
1511 {
1512 *insn |= (1 << i);
1513 break;
1514 }
1515 }
1516
1517 if (i == 32)
1518 return _("illegal register included in list");
1519 }
1520
1521 exp = exp2;
1522 }
1523 else
1524 break;
1525 }
1526
1527 return NULL;
1528 }
1529
1530 const char *md_shortopts = "m:";
1531
1532 struct option md_longopts[] =
1533 {
1534 #define OPTION_DISP_SIZE_DEFAULT_22 (OPTION_MD_BASE)
1535 {"disp-size-default-22", no_argument, NULL, OPTION_DISP_SIZE_DEFAULT_22},
1536 #define OPTION_DISP_SIZE_DEFAULT_32 (OPTION_MD_BASE + 1)
1537 {"disp-size-default-32", no_argument, NULL, OPTION_DISP_SIZE_DEFAULT_32},
1538 {NULL, no_argument, NULL, 0}
1539 };
1540
1541 size_t md_longopts_size = sizeof (md_longopts);
1542
1543 void
1544 md_show_usage (FILE *stream)
1545 {
1546 fprintf (stream, _(" V850 options:\n"));
1547 fprintf (stream, _(" -mwarn-signed-overflow Warn if signed immediate values overflow\n"));
1548 fprintf (stream, _(" -mwarn-unsigned-overflow Warn if unsigned immediate values overflow\n"));
1549 fprintf (stream, _(" -mv850 The code is targeted at the v850\n"));
1550 fprintf (stream, _(" -mv850e The code is targeted at the v850e\n"));
1551 fprintf (stream, _(" -mv850e1 The code is targeted at the v850e1\n"));
1552 fprintf (stream, _(" -mv850e2 The code is targeted at the v850e2\n"));
1553 fprintf (stream, _(" -mv850e2v3 The code is targeted at the v850e2v3\n"));
1554 fprintf (stream, _(" -mv850e2v4 Alias for -mv850e3v5\n"));
1555 fprintf (stream, _(" -mv850e3v5 The code is targeted at the v850e3v5\n"));
1556 fprintf (stream, _(" -mrelax Enable relaxation\n"));
1557 fprintf (stream, _(" --disp-size-default-22 branch displacement with unknown size is 22 bits (default)\n"));
1558 fprintf (stream, _(" --disp-size-default-32 branch displacement with unknown size is 32 bits\n"));
1559 fprintf (stream, _(" -mextension enable extension opcode support\n"));
1560 fprintf (stream, _(" -mno-bcond17 disable b<cond> disp17 instruction\n"));
1561 fprintf (stream, _(" -mno-stld23 disable st/ld offset23 instruction\n"));
1562 fprintf (stream, _(" -mgcc-abi Mark the binary as using the old GCC ABI\n"));
1563 fprintf (stream, _(" -mrh850-abi Mark the binary as using the RH850 ABI (default)\n"));
1564 fprintf (stream, _(" -m8byte-align Mark the binary as using 64-bit alignment\n"));
1565 fprintf (stream, _(" -m4byte-align Mark the binary as using 32-bit alignment (default)\n"));
1566 }
1567
1568 int
1569 md_parse_option (int c, char *arg)
1570 {
1571 if (c != 'm')
1572 {
1573 switch (c)
1574 {
1575 case OPTION_DISP_SIZE_DEFAULT_22:
1576 default_disp_size = 22;
1577 return 1;
1578
1579 case OPTION_DISP_SIZE_DEFAULT_32:
1580 default_disp_size = 32;
1581 return 1;
1582 }
1583 return 0;
1584 }
1585
1586 if (strcmp (arg, "warn-signed-overflow") == 0)
1587 warn_signed_overflows = TRUE;
1588
1589 else if (strcmp (arg, "warn-unsigned-overflow") == 0)
1590 warn_unsigned_overflows = TRUE;
1591
1592 else if (strcmp (arg, "v850") == 0)
1593 {
1594 machine = 0;
1595 SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850);
1596 }
1597 else if (strcmp (arg, "v850e") == 0)
1598 {
1599 machine = bfd_mach_v850e;
1600 SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E);
1601 }
1602 else if (strcmp (arg, "v850e1") == 0)
1603 {
1604 machine = bfd_mach_v850e1;
1605 SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E1);
1606 }
1607 else if (strcmp (arg, "v850e2") == 0)
1608 {
1609 machine = bfd_mach_v850e2;
1610 SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E2);
1611 }
1612 else if (strcmp (arg, "v850e2v3") == 0)
1613 {
1614 machine = bfd_mach_v850e2v3;
1615 SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E2V3);
1616 }
1617 else if (strcmp (arg, "v850e2v4") == 0)
1618 {
1619 machine = bfd_mach_v850e3v5;
1620 SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E3V5);
1621 }
1622 else if (strcmp (arg, "v850e3v5") == 0)
1623 {
1624 machine = bfd_mach_v850e3v5;
1625 SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E3V5);
1626 }
1627 else if (strcmp (arg, "extension") == 0)
1628 {
1629 processor_mask |= PROCESSOR_OPTION_EXTENSION | PROCESSOR_OPTION_ALIAS;
1630 }
1631 else if (strcmp (arg, "no-bcond17") == 0)
1632 {
1633 no_bcond17 = 1;
1634 }
1635 else if (strcmp (arg, "no-stld23") == 0)
1636 {
1637 no_stld23 = 1;
1638 }
1639 else if (strcmp (arg, "relax") == 0)
1640 v850_relax = 1;
1641 else if (strcmp (arg, "gcc-abi") == 0)
1642 {
1643 v850_target_arch = bfd_arch_v850;
1644 v850_target_format = "elf32-v850";
1645 }
1646 else if (strcmp (arg, "rh850-abi") == 0)
1647 {
1648 v850_target_arch = bfd_arch_v850_rh850;
1649 v850_target_format = "elf32-v850-rh850";
1650 }
1651 else if (strcmp (arg, "8byte-align") == 0)
1652 v850_e_flags |= EF_RH850_DATA_ALIGN8;
1653 else if (strcmp (arg, "4byte-align") == 0)
1654 v850_e_flags &= ~ EF_RH850_DATA_ALIGN8;
1655 else
1656 return 0;
1657
1658 return 1;
1659 }
1660
1661 symbolS *
1662 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
1663 {
1664 return 0;
1665 }
1666
1667 char *
1668 md_atof (int type, char *litp, int *sizep)
1669 {
1670 return ieee_md_atof (type, litp, sizep, FALSE);
1671 }
1672
1673 /* Very gross. */
1674
1675 void
1676 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
1677 asection *sec,
1678 fragS *fragP)
1679 {
1680 union u
1681 {
1682 bfd_reloc_code_real_type fx_r_type;
1683 char * fr_opcode;
1684 }
1685 opcode_converter;
1686 subseg_change (sec, 0);
1687
1688 opcode_converter.fr_opcode = fragP->fr_opcode;
1689
1690 subseg_change (sec, 0);
1691
1692 if (fragP->fr_subtype == SUBYPTE_LOOP_16_22)
1693 {
1694 fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
1695 fragP->fr_offset, 1,
1696 BFD_RELOC_UNUSED + opcode_converter.fx_r_type);
1697 fragP->fr_fix += 4;
1698 }
1699 else if (fragP->fr_subtype == SUBYPTE_LOOP_16_22 + 1)
1700 {
1701 unsigned char * buffer =
1702 (unsigned char *) (fragP->fr_fix + fragP->fr_literal);
1703 int loop_reg = (buffer[0] & 0x1f);
1704
1705 /* Add -1.reg. */
1706 md_number_to_chars ((char *) buffer, 0x025f | (loop_reg << 11), 2);
1707 /* Now create the conditional branch + fixup to the final target. */
1708 /* 0x000107ea = bne LBL(disp17). */
1709 md_number_to_chars ((char *) buffer + 2, 0x000107ea, 4);
1710 fix_new (fragP, fragP->fr_fix+2, 4, fragP->fr_symbol,
1711 fragP->fr_offset, 1,
1712 BFD_RELOC_V850_17_PCREL);
1713 fragP->fr_fix += 6;
1714 }
1715 /* In range conditional or unconditional branch. */
1716 else if (fragP->fr_subtype == SUBYPTE_COND_9_22
1717 || fragP->fr_subtype == SUBYPTE_UNCOND_9_22
1718 || fragP->fr_subtype == SUBYPTE_COND_9_22_32
1719 || fragP->fr_subtype == SUBYPTE_UNCOND_9_22_32
1720 || fragP->fr_subtype == SUBYPTE_COND_9_17_22
1721 || fragP->fr_subtype == SUBYPTE_COND_9_17_22_32
1722 || fragP->fr_subtype == SUBYPTE_SA_9_22
1723 || fragP->fr_subtype == SUBYPTE_SA_9_22_32
1724 || fragP->fr_subtype == SUBYPTE_SA_9_17_22
1725 || fragP->fr_subtype == SUBYPTE_SA_9_17_22_32)
1726
1727 {
1728 fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
1729 fragP->fr_offset, 1,
1730 BFD_RELOC_UNUSED + opcode_converter.fx_r_type);
1731 fragP->fr_fix += 2;
1732 }
1733 /* V850e2r-v3 17bit conditional branch. */
1734 else if (fragP->fr_subtype == SUBYPTE_COND_9_17_22 + 1
1735 || fragP->fr_subtype == SUBYPTE_COND_9_17_22_32 + 1
1736 || fragP->fr_subtype == SUBYPTE_SA_9_17_22 + 1
1737 || fragP->fr_subtype == SUBYPTE_SA_9_17_22_32 + 1)
1738 {
1739 unsigned char *buffer =
1740 (unsigned char *) (fragP->fr_fix + fragP->fr_literal);
1741
1742 buffer[0] &= 0x0f; /* Use condition. */
1743 buffer[0] |= 0xe0;
1744 buffer[1] = 0x07;
1745
1746 /* Now create the unconditional branch + fixup to the final
1747 target. */
1748 md_number_to_chars ((char *) buffer + 2, 0x0001, 2);
1749 fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
1750 fragP->fr_offset, 1, BFD_RELOC_V850_17_PCREL);
1751 fragP->fr_fix += 4;
1752 }
1753 /* Out of range conditional branch. Emit a branch around a 22bit jump. */
1754 else if (fragP->fr_subtype == SUBYPTE_COND_9_22 + 1
1755 || fragP->fr_subtype == SUBYPTE_COND_9_22_32 + 1
1756 || fragP->fr_subtype == SUBYPTE_COND_9_17_22 + 2
1757 || fragP->fr_subtype == SUBYPTE_COND_9_17_22_32 + 2)
1758 {
1759 unsigned char *buffer =
1760 (unsigned char *) (fragP->fr_fix + fragP->fr_literal);
1761
1762 /* Reverse the condition of the first branch. */
1763 buffer[0] ^= 0x08;
1764 /* Mask off all the displacement bits. */
1765 buffer[0] &= 0x8f;
1766 buffer[1] &= 0x07;
1767 /* Now set the displacement bits so that we branch
1768 around the unconditional branch. */
1769 buffer[0] |= 0x30;
1770
1771 /* Now create the unconditional branch + fixup to the final
1772 target. */
1773 md_number_to_chars ((char *) buffer + 2, 0x00000780, 4);
1774 fix_new (fragP, fragP->fr_fix + 2, 4, fragP->fr_symbol,
1775 fragP->fr_offset, 1, BFD_RELOC_V850_22_PCREL);
1776 fragP->fr_fix += 6;
1777 }
1778 /* Out of range conditional branch. Emit a branch around a 32bit jump. */
1779 else if (fragP->fr_subtype == SUBYPTE_COND_9_22_32 + 2
1780 || fragP->fr_subtype == SUBYPTE_COND_9_17_22_32 + 3)
1781 {
1782 unsigned char *buffer =
1783 (unsigned char *) (fragP->fr_fix + fragP->fr_literal);
1784
1785 /* Reverse the condition of the first branch. */
1786 buffer[0] ^= 0x08;
1787 /* Mask off all the displacement bits. */
1788 buffer[0] &= 0x8f;
1789 buffer[1] &= 0x07;
1790 /* Now set the displacement bits so that we branch
1791 around the unconditional branch. */
1792 buffer[0] |= 0x40;
1793
1794 /* Now create the unconditional branch + fixup to the final
1795 target. */
1796 md_number_to_chars ((char *) buffer + 2, 0x02e0, 2);
1797 fix_new (fragP, fragP->fr_fix + 4, 4, fragP->fr_symbol,
1798 fragP->fr_offset + 2, 1, BFD_RELOC_V850_32_PCREL);
1799 fragP->fr_fix += 8;
1800 }
1801 /* Out of range unconditional branch. Emit a 22bit jump. */
1802 else if (fragP->fr_subtype == SUBYPTE_UNCOND_9_22 + 1
1803 || fragP->fr_subtype == SUBYPTE_UNCOND_9_22_32 + 1)
1804 {
1805 md_number_to_chars (fragP->fr_fix + fragP->fr_literal, 0x00000780, 4);
1806 fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
1807 fragP->fr_offset, 1, BFD_RELOC_V850_22_PCREL);
1808 fragP->fr_fix += 4;
1809 }
1810 /* Out of range unconditional branch. Emit a 32bit jump. */
1811 else if (fragP->fr_subtype == SUBYPTE_UNCOND_9_22_32 + 2)
1812 {
1813 md_number_to_chars (fragP->fr_fix + fragP->fr_literal, 0x02e0, 2);
1814 fix_new (fragP, fragP->fr_fix + 4, 4, fragP->fr_symbol,
1815 fragP->fr_offset + 2, 1, BFD_RELOC_V850_32_PCREL);
1816 fragP->fr_fix += 6;
1817 }
1818 /* Out of range SA conditional branch. Emit a branch to a 22bit jump. */
1819 else if (fragP->fr_subtype == SUBYPTE_SA_9_22 + 1
1820 || fragP->fr_subtype == SUBYPTE_SA_9_22_32 + 1
1821 || fragP->fr_subtype == SUBYPTE_SA_9_17_22 + 2
1822 || fragP->fr_subtype == SUBYPTE_SA_9_17_22_32 + 2)
1823 {
1824 unsigned char *buffer =
1825 (unsigned char *) (fragP->fr_fix + fragP->fr_literal);
1826
1827 /* bsa .+4 */
1828 buffer[0] &= 0x8f;
1829 buffer[0] |= 0x20;
1830 buffer[1] &= 0x07;
1831
1832 /* br .+6 */
1833 md_number_to_chars ((char *) buffer + 2, 0x05b5, 2);
1834
1835 /* Now create the unconditional branch + fixup to the final
1836 target. */
1837 /* jr SYM */
1838 md_number_to_chars ((char *) buffer + 4, 0x00000780, 4);
1839 fix_new (fragP, fragP->fr_fix + 4, 4, fragP->fr_symbol,
1840 fragP->fr_offset, 1,
1841 BFD_RELOC_V850_22_PCREL);
1842 fragP->fr_fix += 8;
1843 }
1844 /* Out of range SA conditional branch. Emit a branch around a 32bit jump. */
1845 else if (fragP->fr_subtype == SUBYPTE_SA_9_22_32 + 2
1846 || fragP->fr_subtype == SUBYPTE_SA_9_17_22_32 + 3)
1847 {
1848 unsigned char *buffer =
1849 (unsigned char *) (fragP->fr_fix + fragP->fr_literal);
1850
1851 /* bsa .+2 */
1852 buffer[0] &= 0x8f;
1853 buffer[0] |= 0x20;
1854 buffer[1] &= 0x07;
1855
1856 /* br .+8 */
1857 md_number_to_chars ((char *) buffer + 2, 0x05c5, 2);
1858
1859 /* Now create the unconditional branch + fixup to the final
1860 target. */
1861 /* jr SYM */
1862 md_number_to_chars ((char *) buffer + 4, 0x02e0, 2);
1863 fix_new (fragP, fragP->fr_fix + 6, 4, fragP->fr_symbol,
1864 fragP->fr_offset + 2, 1, BFD_RELOC_V850_32_PCREL);
1865
1866 fragP->fr_fix += 10;
1867 }
1868 else
1869 abort ();
1870 }
1871
1872 valueT
1873 md_section_align (asection *seg, valueT addr)
1874 {
1875 int align = bfd_get_section_alignment (stdoutput, seg);
1876 return ((addr + (1 << align) - 1) & (-1 << align));
1877 }
1878
1879 void
1880 md_begin (void)
1881 {
1882 char *prev_name = "";
1883 const struct v850_opcode *op;
1884
1885 if (strncmp (TARGET_CPU, "v850e3v5", 8) == 0)
1886 {
1887 if (machine == -1)
1888 machine = bfd_mach_v850e3v5;
1889
1890 if (!processor_mask)
1891 SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E3V5);
1892 }
1893 else if (strncmp (TARGET_CPU, "v850e2v4", 8) == 0)
1894 {
1895 if (machine == -1)
1896 machine = bfd_mach_v850e3v5;
1897
1898 if (!processor_mask)
1899 SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E3V5);
1900 }
1901 else if (strncmp (TARGET_CPU, "v850e2v3", 8) == 0)
1902 {
1903 if (machine == -1)
1904 machine = bfd_mach_v850e2v3;
1905
1906 if (!processor_mask)
1907 SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E2V3);
1908 }
1909 else if (strncmp (TARGET_CPU, "v850e2", 6) == 0)
1910 {
1911 if (machine == -1)
1912 machine = bfd_mach_v850e2;
1913
1914 if (!processor_mask)
1915 SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E2);
1916 }
1917 else if (strncmp (TARGET_CPU, "v850e1", 6) == 0)
1918 {
1919 if (machine == -1)
1920 machine = bfd_mach_v850e1;
1921
1922 if (!processor_mask)
1923 SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E1);
1924 }
1925 else if (strncmp (TARGET_CPU, "v850e", 5) == 0)
1926 {
1927 if (machine == -1)
1928 machine = bfd_mach_v850e;
1929
1930 if (!processor_mask)
1931 SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850E);
1932 }
1933 else if (strncmp (TARGET_CPU, "v850", 4) == 0)
1934 {
1935 if (machine == -1)
1936 machine = 0;
1937
1938 if (!processor_mask)
1939 SET_PROCESSOR_MASK (processor_mask, PROCESSOR_V850);
1940 }
1941 else
1942 /* xgettext:c-format */
1943 as_bad (_("Unable to determine default target processor from string: %s"),
1944 TARGET_CPU);
1945
1946 v850_hash = hash_new ();
1947
1948 /* Insert unique names into hash table. The V850 instruction set
1949 has many identical opcode names that have different opcodes based
1950 on the operands. This hash table then provides a quick index to
1951 the first opcode with a particular name in the opcode table. */
1952 op = v850_opcodes;
1953 while (op->name)
1954 {
1955 if (strcmp (prev_name, op->name))
1956 {
1957 prev_name = (char *) op->name;
1958 hash_insert (v850_hash, op->name, (char *) op);
1959 }
1960 op++;
1961 }
1962
1963 v850_seg_table[BSS_SECTION].s = bss_section;
1964 bfd_set_arch_mach (stdoutput, v850_target_arch, machine);
1965 bfd_set_private_flags (stdoutput, v850_e_flags);
1966 }
1967
1968
1969 static bfd_reloc_code_real_type
1970 handle_hi016 (const struct v850_operand *operand, const char **errmsg)
1971 {
1972 if (operand == NULL)
1973 return BFD_RELOC_HI16;
1974
1975 if (operand->default_reloc == BFD_RELOC_HI16)
1976 return BFD_RELOC_HI16;
1977
1978 if (operand->default_reloc == BFD_RELOC_HI16_S)
1979 return BFD_RELOC_HI16;
1980
1981 if (operand->default_reloc == BFD_RELOC_16)
1982 return BFD_RELOC_HI16;
1983
1984 *errmsg = _("hi0() relocation used on an instruction which does "
1985 "not support it");
1986 return BFD_RELOC_64; /* Used to indicate an error condition. */
1987 }
1988
1989 static bfd_reloc_code_real_type
1990 handle_hi16 (const struct v850_operand *operand, const char **errmsg)
1991 {
1992 if (operand == NULL)
1993 return BFD_RELOC_HI16_S;
1994
1995 if (operand->default_reloc == BFD_RELOC_HI16_S)
1996 return BFD_RELOC_HI16_S;
1997
1998 if (operand->default_reloc == BFD_RELOC_HI16)
1999 return BFD_RELOC_HI16_S;
2000
2001 if (operand->default_reloc == BFD_RELOC_16)
2002 return BFD_RELOC_HI16_S;
2003
2004 *errmsg = _("hi() relocation used on an instruction which does "
2005 "not support it");
2006 return BFD_RELOC_64; /* Used to indicate an error condition. */
2007 }
2008
2009 static bfd_reloc_code_real_type
2010 handle_lo16 (const struct v850_operand *operand, const char **errmsg)
2011 {
2012 if (operand == NULL)
2013 return BFD_RELOC_LO16;
2014
2015 if (operand->default_reloc == BFD_RELOC_LO16)
2016 return BFD_RELOC_LO16;
2017
2018 if (operand->default_reloc == BFD_RELOC_V850_16_SPLIT_OFFSET)
2019 return BFD_RELOC_V850_LO16_SPLIT_OFFSET;
2020
2021 if (operand->default_reloc == BFD_RELOC_V850_16_S1)
2022 return BFD_RELOC_V850_LO16_S1;
2023
2024 if (operand->default_reloc == BFD_RELOC_16)
2025 return BFD_RELOC_LO16;
2026
2027 *errmsg = _("lo() relocation used on an instruction which does "
2028 "not support it");
2029 return BFD_RELOC_64; /* Used to indicate an error condition. */
2030 }
2031
2032 static bfd_reloc_code_real_type
2033 handle_ctoff (const struct v850_operand *operand, const char **errmsg)
2034 {
2035 if (operand == NULL)
2036 return BFD_RELOC_V850_CALLT_16_16_OFFSET;
2037
2038 if (operand->default_reloc == BFD_RELOC_V850_CALLT_6_7_OFFSET)
2039 return operand->default_reloc;
2040
2041 if (operand->default_reloc == BFD_RELOC_V850_16_S1)
2042 return BFD_RELOC_V850_CALLT_15_16_OFFSET;
2043
2044 if (operand->default_reloc == BFD_RELOC_16)
2045 return BFD_RELOC_V850_CALLT_16_16_OFFSET;
2046
2047 *errmsg = _("ctoff() relocation used on an instruction which does not support it");
2048 return BFD_RELOC_64; /* Used to indicate an error condition. */
2049 }
2050
2051 static bfd_reloc_code_real_type
2052 handle_sdaoff (const struct v850_operand *operand, const char **errmsg)
2053 {
2054 if (operand == NULL)
2055 return BFD_RELOC_V850_SDA_16_16_OFFSET;
2056
2057 if (operand->default_reloc == BFD_RELOC_V850_16_SPLIT_OFFSET)
2058 return BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET;
2059
2060 if (operand->default_reloc == BFD_RELOC_16)
2061 return BFD_RELOC_V850_SDA_16_16_OFFSET;
2062
2063 if (operand->default_reloc == BFD_RELOC_V850_16_S1)
2064 return BFD_RELOC_V850_SDA_15_16_OFFSET;
2065
2066 *errmsg = _("sdaoff() relocation used on an instruction which does not support it");
2067 return BFD_RELOC_64; /* Used to indicate an error condition. */
2068 }
2069
2070 static bfd_reloc_code_real_type
2071 handle_zdaoff (const struct v850_operand *operand, const char **errmsg)
2072 {
2073 if (operand == NULL)
2074 return BFD_RELOC_V850_ZDA_16_16_OFFSET;
2075
2076 if (operand->default_reloc == BFD_RELOC_V850_16_SPLIT_OFFSET)
2077 return BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET;
2078
2079 if (operand->default_reloc == BFD_RELOC_16)
2080 return BFD_RELOC_V850_ZDA_16_16_OFFSET;
2081
2082 if (operand->default_reloc == BFD_RELOC_V850_16_S1)
2083 return BFD_RELOC_V850_ZDA_15_16_OFFSET;
2084
2085 *errmsg = _("zdaoff() relocation used on an instruction which does not support it");
2086 return BFD_RELOC_64; /* Used to indicate an error condition. */
2087 }
2088
2089 static bfd_reloc_code_real_type
2090 handle_tdaoff (const struct v850_operand *operand, const char **errmsg)
2091 {
2092 if (operand == NULL)
2093 /* Data item, not an instruction. */
2094 return BFD_RELOC_V850_TDA_16_16_OFFSET;
2095
2096 switch (operand->default_reloc)
2097 {
2098 /* sld.hu, operand: D5-4. */
2099 case BFD_RELOC_V850_TDA_4_5_OFFSET:
2100 /* sld.bu, operand: D4. */
2101 case BFD_RELOC_V850_TDA_4_4_OFFSET:
2102 /* sld.w/sst.w, operand: D8_6. */
2103 case BFD_RELOC_V850_TDA_6_8_OFFSET:
2104 /* sld.h/sst.h, operand: D8_7. */
2105 case BFD_RELOC_V850_TDA_7_8_OFFSET:
2106 /* sld.b/sst.b, operand: D7. */
2107 case BFD_RELOC_V850_TDA_7_7_OFFSET:
2108 return operand->default_reloc;
2109 default:
2110 break;
2111 }
2112
2113 if (operand->default_reloc == BFD_RELOC_16 && operand->shift == 16)
2114 /* set1 & chums, operands: D16. */
2115 return BFD_RELOC_V850_TDA_16_16_OFFSET;
2116
2117 *errmsg = _("tdaoff() relocation used on an instruction which does not support it");
2118 /* Used to indicate an error condition. */
2119 return BFD_RELOC_64;
2120 }
2121
2122 /* Warning: The code in this function relies upon the definitions
2123 in the v850_operands[] array (defined in opcodes/v850-opc.c)
2124 matching the hard coded values contained herein. */
2125
2126 static bfd_reloc_code_real_type
2127 v850_reloc_prefix (const struct v850_operand *operand, const char **errmsg)
2128 {
2129 bfd_boolean paren_skipped = FALSE;
2130
2131 /* Skip leading opening parenthesis. */
2132 if (*input_line_pointer == '(')
2133 {
2134 ++input_line_pointer;
2135 paren_skipped = TRUE;
2136 }
2137
2138 #define CHECK_(name, reloc) \
2139 if (strncmp (input_line_pointer, name "(", strlen (name) + 1) == 0) \
2140 { \
2141 input_line_pointer += strlen (name); \
2142 return reloc; \
2143 }
2144
2145 CHECK_ ("hi0", handle_hi016(operand, errmsg) );
2146 CHECK_ ("hi", handle_hi16(operand, errmsg) );
2147 CHECK_ ("lo", handle_lo16 (operand, errmsg) );
2148 CHECK_ ("sdaoff", handle_sdaoff (operand, errmsg));
2149 CHECK_ ("zdaoff", handle_zdaoff (operand, errmsg));
2150 CHECK_ ("tdaoff", handle_tdaoff (operand, errmsg));
2151 CHECK_ ("hilo", BFD_RELOC_32);
2152 CHECK_ ("lo23", BFD_RELOC_V850_23);
2153 CHECK_ ("ctoff", handle_ctoff (operand, errmsg) );
2154
2155 /* Restore skipped parenthesis. */
2156 if (paren_skipped)
2157 --input_line_pointer;
2158
2159 return BFD_RELOC_UNUSED;
2160 }
2161
2162 /* Insert an operand value into an instruction. */
2163
2164 static unsigned long
2165 v850_insert_operand (unsigned long insn,
2166 const struct v850_operand *operand,
2167 offsetT val,
2168 const char **errmsg)
2169 {
2170 if (operand->insert)
2171 {
2172 const char *message = NULL;
2173
2174 insn = operand->insert (insn, val, &message);
2175 if (message != NULL)
2176 {
2177 if ((operand->flags & V850_OPERAND_SIGNED)
2178 && ! warn_signed_overflows
2179 && v850_msg_is_out_of_range (message))
2180 {
2181 /* Skip warning... */
2182 }
2183 else if ((operand->flags & V850_OPERAND_SIGNED) == 0
2184 && ! warn_unsigned_overflows
2185 && v850_msg_is_out_of_range (message))
2186 {
2187 /* Skip warning... */
2188 }
2189 else
2190 {
2191 if (errmsg != NULL)
2192 *errmsg = message;
2193 }
2194 }
2195 }
2196 else if (operand->bits == -1
2197 || operand->flags & V850E_IMMEDIATE16
2198 || operand->flags & V850E_IMMEDIATE23
2199 || operand->flags & V850E_IMMEDIATE32)
2200 {
2201 abort ();
2202 }
2203 else
2204 {
2205 if (operand->bits < 32)
2206 {
2207 long min, max;
2208
2209 if ((operand->flags & V850_OPERAND_SIGNED) != 0)
2210 {
2211 if (! warn_signed_overflows)
2212 max = (1 << operand->bits) - 1;
2213 else
2214 max = (1 << (operand->bits - 1)) - 1;
2215
2216 min = -(1 << (operand->bits - 1));
2217 }
2218 else
2219 {
2220 max = (1 << operand->bits) - 1;
2221
2222 if (! warn_unsigned_overflows)
2223 min = -(1 << (operand->bits - 1));
2224 else
2225 min = 0;
2226 }
2227
2228 /* Some people write constants with the sign extension done by
2229 hand but only up to 32 bits. This shouldn't really be valid,
2230 but, to permit this code to assemble on a 64-bit host, we
2231 sign extend the 32-bit value to 64 bits if so doing makes the
2232 value valid. */
2233 if (val > max
2234 && (offsetT) (val - 0x80000000 - 0x80000000) >= min
2235 && (offsetT) (val - 0x80000000 - 0x80000000) <= max)
2236 val = val - 0x80000000 - 0x80000000;
2237
2238 /* Similarly, people write expressions like ~(1<<15), and expect
2239 this to be OK for a 32-bit unsigned value. */
2240 else if (val < min
2241 && (offsetT) (val + 0x80000000 + 0x80000000) >= min
2242 && (offsetT) (val + 0x80000000 + 0x80000000) <= max)
2243 val = val + 0x80000000 + 0x80000000;
2244
2245 else if (val < (offsetT) min || val > (offsetT) max)
2246 {
2247 static char buf [128];
2248
2249 /* Restore min and mix to expected values for decimal ranges. */
2250 if ((operand->flags & V850_OPERAND_SIGNED)
2251 && ! warn_signed_overflows)
2252 max = (1 << (operand->bits - 1)) - 1;
2253
2254 if (! (operand->flags & V850_OPERAND_SIGNED)
2255 && ! warn_unsigned_overflows)
2256 min = 0;
2257
2258 sprintf (buf, _("operand out of range (%d is not between %d and %d)"),
2259 (int) val, (int) min, (int) max);
2260 *errmsg = buf;
2261 }
2262
2263 insn |= (((long) val & ((1 << operand->bits) - 1)) << operand->shift);
2264 }
2265 else
2266 {
2267 insn |= (((long) val) << operand->shift);
2268 }
2269 }
2270
2271 return insn;
2272 }
2273 \f
2274 static char copy_of_instruction[128];
2275
2276 void
2277 md_assemble (char *str)
2278 {
2279 char *s;
2280 char *start_of_operands;
2281 struct v850_opcode *opcode;
2282 struct v850_opcode *next_opcode;
2283 const unsigned char *opindex_ptr;
2284 int next_opindex;
2285 int relaxable = 0;
2286 unsigned long insn;
2287 unsigned long insn_size;
2288 char *f = NULL;
2289 int i;
2290 int match;
2291 bfd_boolean extra_data_after_insn = FALSE;
2292 unsigned extra_data_len = 0;
2293 unsigned long extra_data = 0;
2294 char *saved_input_line_pointer;
2295 char most_match_errmsg[1024];
2296 int most_match_count = -1;
2297
2298 strncpy (copy_of_instruction, str, sizeof (copy_of_instruction) - 1);
2299 most_match_errmsg[0] = 0;
2300
2301 /* Get the opcode. */
2302 for (s = str; *s != '\0' && ! ISSPACE (*s); s++)
2303 continue;
2304
2305 if (*s != '\0')
2306 *s++ = '\0';
2307
2308 /* Find the first opcode with the proper name. */
2309 opcode = (struct v850_opcode *) hash_find (v850_hash, str);
2310 if (opcode == NULL)
2311 {
2312 /* xgettext:c-format */
2313 as_bad (_("Unrecognized opcode: `%s'"), str);
2314 ignore_rest_of_line ();
2315 return;
2316 }
2317
2318 str = s;
2319 while (ISSPACE (*str))
2320 ++str;
2321
2322 start_of_operands = str;
2323
2324 saved_input_line_pointer = input_line_pointer;
2325
2326 for (;;)
2327 {
2328 const char *errmsg = NULL;
2329 const char *warningmsg = NULL;
2330
2331 match = 0;
2332 opindex_ptr = opcode->operands;
2333
2334 if (no_stld23)
2335 {
2336 if ((strncmp (opcode->name, "st.", 3) == 0
2337 && v850_operands[opcode->operands[1]].bits == 23)
2338 || (strncmp (opcode->name, "ld.", 3) == 0
2339 && v850_operands[opcode->operands[0]].bits == 23))
2340 {
2341 errmsg = _("st/ld offset 23 instruction was disabled .");
2342 goto error;
2343 }
2344 }
2345
2346 if ((opcode->processors & processor_mask & PROCESSOR_MASK) == 0
2347 || (((opcode->processors & ~PROCESSOR_MASK) != 0)
2348 && ((opcode->processors & processor_mask & ~PROCESSOR_MASK) == 0)))
2349 {
2350 errmsg = _("Target processor does not support this instruction.");
2351 goto error;
2352 }
2353
2354 relaxable = 0;
2355 fc = 0;
2356 next_opindex = 0;
2357 insn = opcode->opcode;
2358 extra_data_len = 0;
2359 extra_data_after_insn = FALSE;
2360
2361 input_line_pointer = str = start_of_operands;
2362
2363 for (opindex_ptr = opcode->operands; *opindex_ptr != 0; opindex_ptr++)
2364 {
2365 const struct v850_operand *operand;
2366 char *hold;
2367 expressionS ex;
2368 bfd_reloc_code_real_type reloc;
2369
2370 if (next_opindex == 0)
2371 operand = &v850_operands[*opindex_ptr];
2372 else
2373 {
2374 operand = &v850_operands[next_opindex];
2375 next_opindex = 0;
2376 }
2377
2378 errmsg = NULL;
2379
2380 while (*str == ' ')
2381 ++str;
2382
2383 if (operand->flags & V850_OPERAND_BANG
2384 && *str == '!')
2385 ++str;
2386 else if (operand->flags & V850_OPERAND_PERCENT
2387 && *str == '%')
2388 ++str;
2389
2390 if (*str == ',' || *str == '[' || *str == ']')
2391 ++str;
2392
2393 while (*str == ' ')
2394 ++str;
2395
2396 if ( (strcmp (opcode->name, "pushsp") == 0
2397 || strcmp (opcode->name, "popsp") == 0
2398 || strcmp (opcode->name, "dbpush") == 0)
2399 && (*str == '-'))
2400 ++str;
2401
2402 if (operand->flags & V850_OPERAND_RELAX)
2403 relaxable = 1;
2404
2405 /* Gather the operand. */
2406 hold = input_line_pointer;
2407 input_line_pointer = str;
2408
2409 /* lo(), hi(), hi0(), etc... */
2410 if ((reloc = v850_reloc_prefix (operand, &errmsg)) != BFD_RELOC_UNUSED)
2411 {
2412 /* This is a fake reloc, used to indicate an error condition. */
2413 if (reloc == BFD_RELOC_64)
2414 {
2415 /* match = 1; */
2416 goto error;
2417 }
2418
2419 expression (&ex);
2420
2421 if (ex.X_op == O_constant)
2422 {
2423 switch (reloc)
2424 {
2425 case BFD_RELOC_V850_ZDA_16_16_OFFSET:
2426 case BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET:
2427 case BFD_RELOC_V850_ZDA_15_16_OFFSET:
2428 /* To cope with "not1 7, zdaoff(0xfffff006)[r0]"
2429 and the like. */
2430 /* Fall through. */
2431
2432 case BFD_RELOC_LO16:
2433 case BFD_RELOC_V850_LO16_S1:
2434 case BFD_RELOC_V850_LO16_SPLIT_OFFSET:
2435 {
2436 /* Truncate, then sign extend the value. */
2437 ex.X_add_number = SEXT16 (ex.X_add_number);
2438 break;
2439 }
2440
2441 case BFD_RELOC_HI16:
2442 {
2443 /* Truncate, then sign extend the value. */
2444 ex.X_add_number = SEXT16 (ex.X_add_number >> 16);
2445 break;
2446 }
2447
2448 case BFD_RELOC_HI16_S:
2449 {
2450 /* Truncate, then sign extend the value. */
2451 int temp = (ex.X_add_number >> 16) & 0xffff;
2452
2453 temp += (ex.X_add_number >> 15) & 1;
2454
2455 ex.X_add_number = SEXT16 (temp);
2456 break;
2457 }
2458
2459 case BFD_RELOC_V850_23:
2460 if ((operand->flags & V850E_IMMEDIATE23) == 0)
2461 {
2462 errmsg = _("immediate operand is too large");
2463 goto error;
2464 }
2465 break;
2466
2467 case BFD_RELOC_32:
2468 case BFD_RELOC_V850_32_ABS:
2469 case BFD_RELOC_V850_32_PCREL:
2470 if ((operand->flags & V850E_IMMEDIATE32) == 0)
2471 {
2472 errmsg = _("immediate operand is too large");
2473 goto error;
2474 }
2475
2476 break;
2477
2478 default:
2479 as_bad (_("AAARG -> unhandled constant reloc: %d"), reloc);
2480 break;
2481 }
2482
2483 if (operand->flags & V850E_IMMEDIATE32)
2484 {
2485 extra_data_after_insn = TRUE;
2486 extra_data_len = 4;
2487 extra_data = 0;
2488 }
2489 else if (operand->flags & V850E_IMMEDIATE23)
2490 {
2491 if (reloc != BFD_RELOC_V850_23)
2492 {
2493 errmsg = _("immediate operand is too large");
2494 goto error;
2495 }
2496 extra_data_after_insn = TRUE;
2497 extra_data_len = 2;
2498 extra_data = 0;
2499 }
2500 else if ((operand->flags & V850E_IMMEDIATE16)
2501 || (operand->flags & V850E_IMMEDIATE16HI))
2502 {
2503 if (operand->flags & V850E_IMMEDIATE16HI
2504 && reloc != BFD_RELOC_HI16
2505 && reloc != BFD_RELOC_HI16_S)
2506 {
2507 errmsg = _("immediate operand is too large");
2508 goto error;
2509 }
2510 else if (operand->flags & V850E_IMMEDIATE16
2511 && reloc != BFD_RELOC_LO16)
2512 {
2513 errmsg = _("immediate operand is too large");
2514 goto error;
2515 }
2516
2517 extra_data_after_insn = TRUE;
2518 extra_data_len = 2;
2519 extra_data = 0;
2520 }
2521
2522 if (fc > MAX_INSN_FIXUPS)
2523 as_fatal (_("too many fixups"));
2524
2525 fixups[fc].exp = ex;
2526 fixups[fc].opindex = *opindex_ptr;
2527 fixups[fc].reloc = reloc;
2528 fc++;
2529 }
2530 else /* ex.X_op != O_constant. */
2531 {
2532 if ((reloc == BFD_RELOC_32
2533 || reloc == BFD_RELOC_V850_32_ABS
2534 || reloc == BFD_RELOC_V850_32_PCREL)
2535 && operand->bits < 32)
2536 {
2537 errmsg = _("immediate operand is too large");
2538 goto error;
2539 }
2540 else if (reloc == BFD_RELOC_V850_23
2541 && (operand->flags & V850E_IMMEDIATE23) == 0)
2542 {
2543 errmsg = _("immediate operand is too large");
2544 goto error;
2545 }
2546 else if ((reloc == BFD_RELOC_HI16
2547 || reloc == BFD_RELOC_HI16_S)
2548 && operand->bits < 16)
2549 {
2550 errmsg = _("immediate operand is too large");
2551 goto error;
2552 }
2553
2554 if (operand->flags & V850E_IMMEDIATE32)
2555 {
2556 extra_data_after_insn = TRUE;
2557 extra_data_len = 4;
2558 extra_data = 0;
2559 }
2560 else if (operand->flags & V850E_IMMEDIATE23)
2561 {
2562 if (reloc != BFD_RELOC_V850_23)
2563 {
2564 errmsg = _("immediate operand is too large");
2565 goto error;
2566 }
2567 extra_data_after_insn = TRUE;
2568 extra_data_len = 2;
2569 extra_data = 0;
2570 }
2571 else if ((operand->flags & V850E_IMMEDIATE16)
2572 || (operand->flags & V850E_IMMEDIATE16HI))
2573 {
2574 if (operand->flags & V850E_IMMEDIATE16HI
2575 && reloc != BFD_RELOC_HI16
2576 && reloc != BFD_RELOC_HI16_S)
2577 {
2578 errmsg = _("immediate operand is too large");
2579 goto error;
2580 }
2581 else if (operand->flags & V850E_IMMEDIATE16
2582 && reloc != BFD_RELOC_LO16)
2583 {
2584 errmsg = _("immediate operand is too large");
2585 goto error;
2586 }
2587
2588 extra_data_after_insn = TRUE;
2589 extra_data_len = 2;
2590 extra_data = 0;
2591 }
2592
2593 if (fc > MAX_INSN_FIXUPS)
2594 as_fatal (_("too many fixups"));
2595
2596 fixups[fc].exp = ex;
2597 fixups[fc].opindex = *opindex_ptr;
2598 fixups[fc].reloc = reloc;
2599 fc++;
2600 }
2601 }
2602 else if (operand->flags & V850E_IMMEDIATE16
2603 || operand->flags & V850E_IMMEDIATE16HI)
2604 {
2605 expression (&ex);
2606
2607 switch (ex.X_op)
2608 {
2609 case O_constant:
2610 if (operand->flags & V850E_IMMEDIATE16HI)
2611 {
2612 if (ex.X_add_number & 0xffff)
2613 {
2614 errmsg = _("constant too big to fit into instruction");
2615 goto error;
2616 }
2617
2618 ex.X_add_number >>= 16;
2619 }
2620 if (operand->flags & V850E_IMMEDIATE16)
2621 {
2622 if ((ex.X_add_number & 0xffff8000)
2623 && ((ex.X_add_number & 0xffff8000) != 0xffff8000))
2624 {
2625 errmsg = _("constant too big to fit into instruction");
2626 goto error;
2627 }
2628 }
2629 break;
2630
2631 case O_illegal:
2632 errmsg = _("illegal operand");
2633 goto error;
2634
2635 case O_absent:
2636 errmsg = _("missing operand");
2637 goto error;
2638
2639 default:
2640 if (fc >= MAX_INSN_FIXUPS)
2641 as_fatal (_("too many fixups"));
2642
2643 fixups[fc].exp = ex;
2644 fixups[fc].opindex = *opindex_ptr;
2645 fixups[fc].reloc = operand->default_reloc;
2646 ++fc;
2647
2648 ex.X_add_number = 0;
2649 break;
2650 }
2651
2652 extra_data_after_insn = TRUE;
2653 extra_data_len = 2;
2654 extra_data = ex.X_add_number;
2655 }
2656 else if (operand->flags & V850E_IMMEDIATE23)
2657 {
2658 expression (&ex);
2659
2660 switch (ex.X_op)
2661 {
2662 case O_constant:
2663 break;
2664
2665 case O_illegal:
2666 errmsg = _("illegal operand");
2667 goto error;
2668
2669 case O_absent:
2670 errmsg = _("missing operand");
2671 goto error;
2672
2673 default:
2674 break;
2675 }
2676
2677 if (fc >= MAX_INSN_FIXUPS)
2678 as_fatal (_("too many fixups"));
2679
2680 fixups[fc].exp = ex;
2681 fixups[fc].opindex = *opindex_ptr;
2682 fixups[fc].reloc = operand->default_reloc;
2683 ++fc;
2684
2685 extra_data_after_insn = TRUE;
2686 extra_data_len = 2;
2687 extra_data = 0;
2688 }
2689 else if (operand->flags & V850E_IMMEDIATE32)
2690 {
2691 expression (&ex);
2692
2693 switch (ex.X_op)
2694 {
2695 case O_constant:
2696 if ((operand->default_reloc == BFD_RELOC_V850_32_ABS
2697 || operand->default_reloc == BFD_RELOC_V850_32_PCREL)
2698 && (ex.X_add_number & 1))
2699 {
2700 errmsg = _("odd number cannot be used here");
2701 goto error;
2702 }
2703 break;
2704
2705 case O_illegal:
2706 errmsg = _("illegal operand");
2707 goto error;
2708
2709 case O_absent:
2710 errmsg = _("missing operand");
2711 goto error;
2712
2713 default:
2714 if (fc >= MAX_INSN_FIXUPS)
2715 as_fatal (_("too many fixups"));
2716
2717 fixups[fc].exp = ex;
2718 fixups[fc].opindex = *opindex_ptr;
2719 fixups[fc].reloc = operand->default_reloc;
2720 ++fc;
2721
2722 ex.X_add_number = 0;
2723 break;
2724 }
2725
2726 extra_data_after_insn = TRUE;
2727 extra_data_len = 4;
2728 extra_data = ex.X_add_number;
2729 }
2730 else if (operand->flags & V850E_OPERAND_REG_LIST)
2731 {
2732 errmsg = parse_register_list (&insn, operand);
2733
2734 if (errmsg)
2735 goto error;
2736 }
2737 else
2738 {
2739 errmsg = NULL;
2740
2741 if ((operand->flags & V850_OPERAND_REG) != 0)
2742 {
2743 if (!register_name (&ex))
2744 {
2745 errmsg = _("invalid register name");
2746 }
2747
2748 if ((operand->flags & V850_NOT_R0)
2749 && ex.X_add_number == 0)
2750 {
2751 errmsg = _("register r0 cannot be used here");
2752 }
2753
2754 if (operand->flags & V850_REG_EVEN)
2755 {
2756 if (ex.X_add_number % 2)
2757 errmsg = _("odd register cannot be used here");
2758 ex.X_add_number = ex.X_add_number / 2;
2759 }
2760
2761 }
2762 else if ((operand->flags & V850_OPERAND_SRG) != 0)
2763 {
2764 if (!system_register_name (&ex, TRUE))
2765 {
2766 errmsg = _("invalid system register name");
2767 }
2768 }
2769 else if ((operand->flags & V850_OPERAND_EP) != 0)
2770 {
2771 char *start = input_line_pointer;
2772 char c = get_symbol_end ();
2773
2774 if (strcmp (start, "ep") != 0 && strcmp (start, "r30") != 0)
2775 {
2776 /* Put things back the way we found them. */
2777 *input_line_pointer = c;
2778 input_line_pointer = start;
2779 errmsg = _("expected EP register");
2780 goto error;
2781 }
2782
2783 *input_line_pointer = c;
2784 str = input_line_pointer;
2785 input_line_pointer = hold;
2786
2787 while (*str == ' ' || *str == ','
2788 || *str == '[' || *str == ']')
2789 ++str;
2790 continue;
2791 }
2792 else if ((operand->flags & V850_OPERAND_CC) != 0)
2793 {
2794 if (!cc_name (&ex, TRUE))
2795 {
2796 errmsg = _("invalid condition code name");
2797 }
2798
2799 if ((operand->flags & V850_NOT_SA)
2800 && ex.X_add_number == COND_SA_NUM)
2801 {
2802 errmsg = _("condition sa cannot be used here");
2803 }
2804 }
2805 else if ((operand->flags & V850_OPERAND_FLOAT_CC) != 0)
2806 {
2807 if (!float_cc_name (&ex, TRUE))
2808 {
2809 errmsg = _("invalid condition code name");
2810 }
2811 }
2812 else if ((operand->flags & V850_OPERAND_CACHEOP) != 0)
2813 {
2814 if (!cacheop_name (&ex, TRUE))
2815 errmsg = _("invalid cache oparation name");
2816 }
2817 else if ((operand->flags & V850_OPERAND_PREFOP) != 0)
2818 {
2819 if (!prefop_name (&ex, TRUE))
2820 errmsg = _("invalid pref oparation name");
2821 }
2822 else if ((operand->flags & V850_OPERAND_VREG) != 0)
2823 {
2824 if (!vector_register_name (&ex))
2825 errmsg = _("invalid vector register name");
2826 }
2827 else if ((register_name (&ex)
2828 && (operand->flags & V850_OPERAND_REG) == 0))
2829 {
2830 char c;
2831 int exists = 0;
2832
2833 /* It is possible that an alias has been defined that
2834 matches a register name. For example the code may
2835 include a ".set ZERO, 0" directive, which matches
2836 the register name "zero". Attempt to reparse the
2837 field as an expression, and only complain if we
2838 cannot generate a constant. */
2839
2840 input_line_pointer = str;
2841
2842 c = get_symbol_end ();
2843
2844 if (symbol_find (str) != NULL)
2845 exists = 1;
2846
2847 *input_line_pointer = c;
2848 input_line_pointer = str;
2849
2850 expression (&ex);
2851
2852 if (ex.X_op != O_constant)
2853 {
2854 /* If this register is actually occurring too early on
2855 the parsing of the instruction, (because another
2856 field is missing) then report this. */
2857 if (opindex_ptr[1] != 0
2858 && ((v850_operands[opindex_ptr[1]].flags
2859 & V850_OPERAND_REG)
2860 ||(v850_operands[opindex_ptr[1]].flags
2861 & V850_OPERAND_VREG)))
2862 errmsg = _("syntax error: value is missing before the register name");
2863 else
2864 errmsg = _("syntax error: register not expected");
2865
2866 /* If we created a symbol in the process of this
2867 test then delete it now, so that it will not
2868 be output with the real symbols... */
2869 if (exists == 0
2870 && ex.X_op == O_symbol)
2871 symbol_remove (ex.X_add_symbol,
2872 &symbol_rootP, &symbol_lastP);
2873 }
2874 }
2875 else if (system_register_name (&ex, FALSE)
2876 && (operand->flags & V850_OPERAND_SRG) == 0)
2877 {
2878 errmsg = _("syntax error: system register not expected");
2879 }
2880 else if (cc_name (&ex, FALSE)
2881 && (operand->flags & V850_OPERAND_CC) == 0)
2882 {
2883 errmsg = _("syntax error: condition code not expected");
2884 }
2885 else if (float_cc_name (&ex, FALSE)
2886 && (operand->flags & V850_OPERAND_FLOAT_CC) == 0)
2887 {
2888 errmsg = _("syntax error: condition code not expected");
2889 }
2890 else if (vector_register_name (&ex)
2891 && (operand->flags & V850_OPERAND_VREG) == 0)
2892 {
2893 errmsg = _("syntax error: vector register not expected");
2894 }
2895 else
2896 {
2897 expression (&ex);
2898
2899 if ((operand->flags & V850_NOT_IMM0)
2900 && ex.X_op == O_constant
2901 && ex.X_add_number == 0)
2902 {
2903 errmsg = _("immediate 0 cannot be used here");
2904 }
2905
2906 /* Special case:
2907 If we are assembling a MOV/JARL/JR instruction and the immediate
2908 value does not fit into the bits available then create a
2909 fake error so that the next MOV/JARL/JR instruction will be
2910 selected. This one has a 32 bit immediate field. */
2911
2912 if ((strcmp (opcode->name, "mov") == 0
2913 || strcmp (opcode->name, "jarl") == 0
2914 || strcmp (opcode->name, "jr") == 0)
2915 && ex.X_op == O_constant
2916 && (ex.X_add_number < (-(1 << (operand->bits - 1)))
2917 || ex.X_add_number > ((1 << (operand->bits - 1)) - 1)))
2918 {
2919 errmsg = _("immediate operand is too large");
2920 }
2921
2922 if ((strcmp (opcode->name, "jarl") == 0
2923 || strcmp (opcode->name, "jr") == 0)
2924 && ex.X_op != O_constant
2925 && operand->bits != default_disp_size)
2926 {
2927 errmsg = _("immediate operand is not match");
2928 }
2929
2930 /* Special case2 :
2931 If we are assembling a ld/st instruction and the immediate
2932 value does not fit into the bits available then create a
2933 fake error so that the next ld/st instruction will be
2934 selected. */
2935 if ( ( (strncmp (opcode->name, "st.", 3) == 0)
2936 || (strncmp (opcode->name, "ld.", 3) == 0))
2937 && ex.X_op == O_constant
2938 && (ex.X_add_number < (-(1 << (operand->bits - 1)))
2939 || ex.X_add_number > ((1 << (operand->bits - 1)) - 1)))
2940 errmsg = _("displacement is too large");
2941 }
2942
2943 if (errmsg)
2944 goto error;
2945
2946 switch (ex.X_op)
2947 {
2948 case O_illegal:
2949 errmsg = _("illegal operand");
2950 goto error;
2951 case O_absent:
2952 errmsg = _("missing operand");
2953 goto error;
2954 case O_register:
2955 if ((operand->flags
2956 & (V850_OPERAND_REG | V850_OPERAND_SRG | V850_OPERAND_VREG)) == 0)
2957 {
2958 errmsg = _("invalid operand");
2959 goto error;
2960 }
2961
2962 insn = v850_insert_operand (insn, operand,
2963 ex.X_add_number,
2964 &warningmsg);
2965
2966 break;
2967
2968 case O_constant:
2969 insn = v850_insert_operand (insn, operand, ex.X_add_number,
2970 &warningmsg);
2971 break;
2972
2973 default:
2974 /* We need to generate a fixup for this expression. */
2975 if (fc >= MAX_INSN_FIXUPS)
2976 as_fatal (_("too many fixups"));
2977
2978 fixups[fc].exp = ex;
2979 fixups[fc].opindex = *opindex_ptr;
2980 fixups[fc].reloc = BFD_RELOC_UNUSED;
2981 ++fc;
2982 break;
2983 }
2984 }
2985
2986 str = input_line_pointer;
2987 input_line_pointer = hold;
2988
2989 while (*str == ' ' || *str == ',' || *str == '[' || *str == ']'
2990 || *str == ')')
2991 ++str;
2992 }
2993
2994 while (ISSPACE (*str))
2995 ++str;
2996
2997 if (*str == '\0')
2998 match = 1;
2999
3000 error:
3001 if (match == 0)
3002 {
3003 if ((opindex_ptr - opcode->operands) >= most_match_count)
3004 {
3005 most_match_count = opindex_ptr - opcode->operands;
3006 if (errmsg != NULL)
3007 strncpy (most_match_errmsg, errmsg, sizeof (most_match_errmsg)-1);
3008 }
3009
3010 next_opcode = opcode + 1;
3011 if (next_opcode->name != NULL
3012 && strcmp (next_opcode->name, opcode->name) == 0)
3013 {
3014 opcode = next_opcode;
3015
3016 /* Skip versions that are not supported by the target
3017 processor. */
3018 if ((opcode->processors & processor_mask) == 0)
3019 goto error;
3020
3021 continue;
3022 }
3023
3024 if (most_match_errmsg[0] == 0)
3025 /* xgettext:c-format. */
3026 as_bad (_("junk at end of line: `%s'"), str);
3027 else
3028 as_bad ("%s: %s", copy_of_instruction, most_match_errmsg);
3029
3030 if (*input_line_pointer == ']')
3031 ++input_line_pointer;
3032
3033 ignore_rest_of_line ();
3034 input_line_pointer = saved_input_line_pointer;
3035 return;
3036 }
3037
3038 if (warningmsg != NULL)
3039 as_warn ("%s", warningmsg);
3040 break;
3041 }
3042
3043 input_line_pointer = str;
3044
3045 /* Tie dwarf2 debug info to the address at the start of the insn.
3046 We can't do this after the insn has been output as the current
3047 frag may have been closed off. eg. by frag_var. */
3048 dwarf2_emit_insn (0);
3049
3050 /* Write out the instruction. */
3051
3052 if (relaxable && fc > 0)
3053 {
3054 insn_size = 2;
3055 fc = 0;
3056
3057 if (strcmp (opcode->name, "loop") == 0)
3058 {
3059 if (((processor_mask & PROCESSOR_V850E3V5_UP) == 0) || default_disp_size == 22)
3060 {
3061 insn_size = 4;
3062 f = frag_var (rs_machine_dependent, 6, 2, SUBYPTE_LOOP_16_22,
3063 fixups[0].exp.X_add_symbol,
3064 fixups[0].exp.X_add_number,
3065 (char *)(size_t) fixups[0].opindex);
3066 md_number_to_chars (f, insn, insn_size);
3067 md_number_to_chars (f+4, 0, 4);
3068 }
3069 else
3070 {
3071 as_bad (_("loop: 32-bit displacement not supported"));
3072 }
3073 }
3074 else if (strcmp (opcode->name, "br") == 0
3075 || strcmp (opcode->name, "jbr") == 0)
3076 {
3077 if ((processor_mask & PROCESSOR_V850E2_UP) == 0 || default_disp_size == 22)
3078 {
3079 f = frag_var (rs_machine_dependent, 4, 2, SUBYPTE_UNCOND_9_22,
3080 fixups[0].exp.X_add_symbol,
3081 fixups[0].exp.X_add_number,
3082 (char *)(size_t) fixups[0].opindex);
3083 md_number_to_chars (f, insn, insn_size);
3084 md_number_to_chars (f + 2, 0, 2);
3085 }
3086 else
3087 {
3088 f = frag_var (rs_machine_dependent, 6, 4, SUBYPTE_UNCOND_9_22_32,
3089 fixups[0].exp.X_add_symbol,
3090 fixups[0].exp.X_add_number,
3091 (char *)(size_t) fixups[0].opindex);
3092 md_number_to_chars (f, insn, insn_size);
3093 md_number_to_chars (f + 2, 0, 4);
3094 }
3095 }
3096 else /* b<cond>, j<cond>. */
3097 {
3098 if (default_disp_size == 22
3099 || (processor_mask & PROCESSOR_V850E2_UP) == 0)
3100 {
3101 if (processor_mask & PROCESSOR_V850E2V3_UP && !no_bcond17)
3102 {
3103 if (strcmp (opcode->name, "bsa") == 0)
3104 {
3105 f = frag_var (rs_machine_dependent, 8, 6, SUBYPTE_SA_9_17_22,
3106 fixups[0].exp.X_add_symbol,
3107 fixups[0].exp.X_add_number,
3108 (char *)(size_t) fixups[0].opindex);
3109 md_number_to_chars (f, insn, insn_size);
3110 md_number_to_chars (f + 2, 0, 6);
3111 }
3112 else
3113 {
3114 f = frag_var (rs_machine_dependent, 6, 4, SUBYPTE_COND_9_17_22,
3115 fixups[0].exp.X_add_symbol,
3116 fixups[0].exp.X_add_number,
3117 (char *)(size_t) fixups[0].opindex);
3118 md_number_to_chars (f, insn, insn_size);
3119 md_number_to_chars (f + 2, 0, 4);
3120 }
3121 }
3122 else
3123 {
3124 if (strcmp (opcode->name, "bsa") == 0)
3125 {
3126 f = frag_var (rs_machine_dependent, 8, 6, SUBYPTE_SA_9_22,
3127 fixups[0].exp.X_add_symbol,
3128 fixups[0].exp.X_add_number,
3129 (char *)(size_t) fixups[0].opindex);
3130 md_number_to_chars (f, insn, insn_size);
3131 md_number_to_chars (f + 2, 0, 6);
3132 }
3133 else
3134 {
3135 f = frag_var (rs_machine_dependent, 6, 4, SUBYPTE_COND_9_22,
3136 fixups[0].exp.X_add_symbol,
3137 fixups[0].exp.X_add_number,
3138 (char *)(size_t) fixups[0].opindex);
3139 md_number_to_chars (f, insn, insn_size);
3140 md_number_to_chars (f + 2, 0, 4);
3141 }
3142 }
3143 }
3144 else
3145 {
3146 if (processor_mask & PROCESSOR_V850E2V3_UP && !no_bcond17)
3147 {
3148 if (strcmp (opcode->name, "bsa") == 0)
3149 {
3150 f = frag_var (rs_machine_dependent, 10, 8, SUBYPTE_SA_9_17_22_32,
3151 fixups[0].exp.X_add_symbol,
3152 fixups[0].exp.X_add_number,
3153 (char *)(size_t) fixups[0].opindex);
3154 md_number_to_chars (f, insn, insn_size);
3155 md_number_to_chars (f + 2, 0, 8);
3156 }
3157 else
3158 {
3159 f = frag_var (rs_machine_dependent, 8, 6, SUBYPTE_COND_9_17_22_32,
3160 fixups[0].exp.X_add_symbol,
3161 fixups[0].exp.X_add_number,
3162 (char *)(size_t) fixups[0].opindex);
3163 md_number_to_chars (f, insn, insn_size);
3164 md_number_to_chars (f + 2, 0, 6);
3165 }
3166 }
3167 else
3168 {
3169 if (strcmp (opcode->name, "bsa") == 0)
3170 {
3171 f = frag_var (rs_machine_dependent, 10, 8, SUBYPTE_SA_9_22_32,
3172 fixups[0].exp.X_add_symbol,
3173 fixups[0].exp.X_add_number,
3174 (char *)(size_t) fixups[0].opindex);
3175 md_number_to_chars (f, insn, insn_size);
3176 md_number_to_chars (f + 2, 0, 8);
3177 }
3178 else
3179 {
3180 f = frag_var (rs_machine_dependent, 8, 6, SUBYPTE_COND_9_22_32,
3181 fixups[0].exp.X_add_symbol,
3182 fixups[0].exp.X_add_number,
3183 (char *)(size_t) fixups[0].opindex);
3184 md_number_to_chars (f, insn, insn_size);
3185 md_number_to_chars (f + 2, 0, 6);
3186 }
3187 }
3188 }
3189 }
3190 }
3191 else
3192 {
3193 /* Four byte insns have an opcode with the two high bits on. */
3194 if ((insn & 0x0600) == 0x0600)
3195 insn_size = 4;
3196 else
3197 insn_size = 2;
3198
3199 /* Special case: 32 bit MOV. */
3200 if ((insn & 0xffe0) == 0x0620)
3201 insn_size = 2;
3202
3203 /* Special case: 32 bit JARL,JMP,JR. */
3204 if ((insn & 0x1ffe0) == 0x2e0 /* JARL. */
3205 || (insn & 0x1ffe0) == 0x6e0 /* JMP. */
3206 || (insn & 0x1ffff) == 0x2e0) /* JR. */
3207 insn_size = 2;
3208
3209 if (obstack_room (& frchain_now->frch_obstack) < (insn_size + extra_data_len))
3210 {
3211 frag_wane (frag_now);
3212 frag_new (0);
3213 }
3214
3215 f = frag_more (insn_size);
3216 md_number_to_chars (f, insn, insn_size);
3217
3218 if (extra_data_after_insn)
3219 {
3220 f = frag_more (extra_data_len);
3221 md_number_to_chars (f, extra_data, extra_data_len);
3222
3223 extra_data_after_insn = FALSE;
3224 }
3225 }
3226
3227 /* Create any fixups. At this point we do not use a
3228 bfd_reloc_code_real_type, but instead just use the
3229 BFD_RELOC_UNUSED plus the operand index. This lets us easily
3230 handle fixups for any operand type, although that is admittedly
3231 not a very exciting feature. We pick a BFD reloc type in
3232 md_apply_fix. */
3233 for (i = 0; i < fc; i++)
3234 {
3235 const struct v850_operand *operand;
3236 bfd_reloc_code_real_type reloc;
3237
3238 operand = &v850_operands[fixups[i].opindex];
3239
3240 reloc = fixups[i].reloc;
3241
3242 if (reloc != BFD_RELOC_UNUSED)
3243 {
3244 reloc_howto_type *reloc_howto =
3245 bfd_reloc_type_lookup (stdoutput, reloc);
3246 int size;
3247 int address;
3248 fixS *fixP;
3249
3250 if (!reloc_howto)
3251 abort ();
3252
3253 size = bfd_get_reloc_size (reloc_howto);
3254
3255 /* XXX This will abort on an R_V850_8 reloc -
3256 is this reloc actually used? */
3257 if (size != 2 && size != 4)
3258 abort ();
3259
3260 if (extra_data_len == 0)
3261 {
3262 address = (f - frag_now->fr_literal) + insn_size - size;
3263 }
3264 else
3265 {
3266 address = (f - frag_now->fr_literal) + extra_data_len - size;
3267 }
3268
3269 if ((operand->flags & V850E_IMMEDIATE32) && (operand->flags & V850_PCREL))
3270 {
3271 fixups[i].exp.X_add_number += 2;
3272 }
3273 else if (operand->default_reloc == BFD_RELOC_V850_16_PCREL)
3274 {
3275 fixups[i].exp.X_add_number += 2;
3276 address += 2;
3277 }
3278
3279 /* fprintf (stderr, "0x%x %d %ld\n", address, size, fixups[i].exp.X_add_number); */
3280 fixP = fix_new_exp (frag_now, address, size,
3281 &fixups[i].exp,
3282 reloc_howto->pc_relative,
3283 reloc);
3284
3285 fixP->tc_fix_data = (void *) operand;
3286
3287 switch (reloc)
3288 {
3289 case BFD_RELOC_LO16:
3290 case BFD_RELOC_V850_LO16_S1:
3291 case BFD_RELOC_V850_LO16_SPLIT_OFFSET:
3292 case BFD_RELOC_HI16:
3293 case BFD_RELOC_HI16_S:
3294 fixP->fx_no_overflow = 1;
3295 break;
3296 default:
3297 break;
3298 }
3299 }
3300 else
3301 {
3302 gas_assert (f != NULL);
3303 fix_new_exp (frag_now,
3304 f - frag_now->fr_literal, 4,
3305 & fixups[i].exp,
3306 (operand->flags & V850_PCREL) != 0,
3307 (bfd_reloc_code_real_type) (fixups[i].opindex
3308 + (int) BFD_RELOC_UNUSED));
3309 }
3310 }
3311
3312 input_line_pointer = saved_input_line_pointer;
3313 }
3314
3315 /* If while processing a fixup, a reloc really needs to be created
3316 then it is done here. */
3317
3318 arelent *
3319 tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
3320 {
3321 arelent *reloc;
3322
3323 reloc = xmalloc (sizeof (arelent));
3324 reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
3325 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
3326 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
3327
3328 if ( fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY
3329 || fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
3330 || fixp->fx_r_type == BFD_RELOC_V850_LONGCALL
3331 || fixp->fx_r_type == BFD_RELOC_V850_LONGJUMP
3332 || fixp->fx_r_type == BFD_RELOC_V850_ALIGN)
3333 reloc->addend = fixp->fx_offset;
3334 else
3335 {
3336 #if 0
3337 if (fixp->fx_r_type == BFD_RELOC_32
3338 && fixp->fx_pcrel)
3339 fixp->fx_r_type = BFD_RELOC_32_PCREL;
3340 #endif
3341
3342 reloc->addend = fixp->fx_addnumber;
3343 }
3344
3345 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
3346
3347 if (reloc->howto == NULL)
3348 {
3349 as_bad_where (fixp->fx_file, fixp->fx_line,
3350 /* xgettext:c-format */
3351 _("reloc %d not supported by object file format"),
3352 (int) fixp->fx_r_type);
3353
3354 xfree (reloc);
3355
3356 return NULL;
3357 }
3358
3359 return reloc;
3360 }
3361
3362 void
3363 v850_handle_align (fragS * frag)
3364 {
3365 if (v850_relax
3366 && frag->fr_type == rs_align
3367 && frag->fr_address + frag->fr_fix > 0
3368 && frag->fr_offset > 1
3369 && now_seg != bss_section
3370 && now_seg != v850_seg_table[SBSS_SECTION].s
3371 && now_seg != v850_seg_table[TBSS_SECTION].s
3372 && now_seg != v850_seg_table[ZBSS_SECTION].s)
3373 fix_new (frag, frag->fr_fix, 2, & abs_symbol, frag->fr_offset, 0,
3374 BFD_RELOC_V850_ALIGN);
3375 }
3376
3377 /* Return current size of variable part of frag. */
3378
3379 int
3380 md_estimate_size_before_relax (fragS *fragp, asection *seg ATTRIBUTE_UNUSED)
3381 {
3382 if (fragp->fr_subtype >= sizeof (md_relax_table) / sizeof (md_relax_table[0]))
3383 abort ();
3384
3385 return md_relax_table[fragp->fr_subtype].rlx_length;
3386 }
3387
3388 long
3389 v850_pcrel_from_section (fixS *fixp, segT section)
3390 {
3391 /* If the symbol is undefined, or in a section other than our own,
3392 or it is weak (in which case it may well be in another section,
3393 then let the linker figure it out. */
3394 if (fixp->fx_addsy != (symbolS *) NULL
3395 && (! S_IS_DEFINED (fixp->fx_addsy)
3396 || S_IS_WEAK (fixp->fx_addsy)
3397 || (S_GET_SEGMENT (fixp->fx_addsy) != section)))
3398 return 0;
3399
3400 return fixp->fx_frag->fr_address + fixp->fx_where;
3401 }
3402
3403 void
3404 md_apply_fix (fixS *fixP, valueT *valueP, segT seg ATTRIBUTE_UNUSED)
3405 {
3406 valueT value = * valueP;
3407 char *where;
3408
3409 if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
3410 || fixP->fx_r_type == BFD_RELOC_V850_LONGCALL
3411 || fixP->fx_r_type == BFD_RELOC_V850_LONGJUMP
3412 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
3413 {
3414 fixP->fx_done = 0;
3415 return;
3416 }
3417
3418 if (fixP->fx_addsy == (symbolS *) NULL)
3419 fixP->fx_addnumber = value,
3420 fixP->fx_done = 1;
3421
3422 else if (fixP->fx_pcrel)
3423 fixP->fx_addnumber = fixP->fx_offset;
3424
3425 else
3426 {
3427 value = fixP->fx_offset;
3428 if (fixP->fx_subsy != (symbolS *) NULL)
3429 {
3430 if (S_GET_SEGMENT (fixP->fx_subsy) == absolute_section)
3431 value -= S_GET_VALUE (fixP->fx_subsy);
3432 else
3433 /* We don't actually support subtracting a symbol. */
3434 as_bad_where (fixP->fx_file, fixP->fx_line,
3435 _("expression too complex"));
3436 }
3437 fixP->fx_addnumber = value;
3438 }
3439
3440 if ((int) fixP->fx_r_type >= (int) BFD_RELOC_UNUSED)
3441 {
3442 int opindex;
3443 const struct v850_operand *operand;
3444 unsigned long insn;
3445 const char *errmsg = NULL;
3446
3447 opindex = (int) fixP->fx_r_type - (int) BFD_RELOC_UNUSED;
3448 operand = &v850_operands[opindex];
3449
3450 /* Fetch the instruction, insert the fully resolved operand
3451 value, and stuff the instruction back again.
3452
3453 Note the instruction has been stored in little endian
3454 format! */
3455 where = fixP->fx_frag->fr_literal + fixP->fx_where;
3456
3457 if (fixP->fx_size > 2)
3458 insn = bfd_getl32 ((unsigned char *) where);
3459 else
3460 insn = bfd_getl16 ((unsigned char *) where);
3461
3462 /* When inserting loop offets a backwards displacement
3463 is encoded as a positive value. */
3464 if (operand->flags & V850_INVERSE_PCREL)
3465 value = - value;
3466
3467 insn = v850_insert_operand (insn, operand, (offsetT) value,
3468 &errmsg);
3469 if (errmsg)
3470 as_warn_where (fixP->fx_file, fixP->fx_line, "%s", errmsg);
3471
3472 if (fixP->fx_size > 2)
3473 bfd_putl32 ((bfd_vma) insn, (unsigned char *) where);
3474 else
3475 bfd_putl16 ((bfd_vma) insn, (unsigned char *) where);
3476
3477 if (fixP->fx_done)
3478 /* Nothing else to do here. */
3479 return;
3480
3481 /* Determine a BFD reloc value based on the operand information.
3482 We are only prepared to turn a few of the operands into relocs. */
3483
3484 if (operand->default_reloc == BFD_RELOC_NONE)
3485 {
3486 as_bad_where (fixP->fx_file, fixP->fx_line,
3487 _("unresolved expression that must be resolved"));
3488 fixP->fx_done = 1;
3489 return;
3490 }
3491
3492 {
3493 fixP->fx_r_type = operand->default_reloc;
3494 if (operand->default_reloc == BFD_RELOC_V850_16_PCREL)
3495 {
3496 fixP->fx_where += 2;
3497 fixP->fx_size = 2;
3498 fixP->fx_addnumber += 2;
3499 }
3500 }
3501 }
3502 else if (fixP->fx_done)
3503 {
3504 /* We still have to insert the value into memory! */
3505 where = fixP->fx_frag->fr_literal + fixP->fx_where;
3506
3507 if (fixP->tc_fix_data != NULL
3508 && ((struct v850_operand *) fixP->tc_fix_data)->insert != NULL)
3509 {
3510 const char * message = NULL;
3511 struct v850_operand * operand = (struct v850_operand *) fixP->tc_fix_data;
3512 unsigned long insn;
3513
3514 /* The variable "where" currently points at the exact point inside
3515 the insn where we need to insert the value. But we need to
3516 extract the entire insn so we probably need to move "where"
3517 back a few bytes. */
3518
3519 if (fixP->fx_size == 2)
3520 where -= 2;
3521 else if (fixP->fx_size == 1)
3522 where -= 3;
3523
3524 insn = bfd_getl32 ((unsigned char *) where);
3525
3526 /* Use the operand's insertion procedure, if present, in order to
3527 make sure that the value is correctly stored in the insn. */
3528 insn = operand->insert (insn, (offsetT) value, & message);
3529 /* Ignore message even if it is set. */
3530
3531 bfd_putl32 ((bfd_vma) insn, (unsigned char *) where);
3532 }
3533 else
3534 {
3535 switch (fixP->fx_r_type)
3536 {
3537 case BFD_RELOC_V850_32_ABS:
3538 case BFD_RELOC_V850_32_PCREL:
3539 bfd_putl32 (value & 0xfffffffe, (unsigned char *) where);
3540 break;
3541
3542 case BFD_RELOC_32:
3543 bfd_putl32 (value, (unsigned char *) where);
3544 break;
3545
3546 case BFD_RELOC_V850_23:
3547 bfd_putl32 (((value & 0x7f) << 4) | ((value & 0x7fff80) << (16-7))
3548 | (bfd_getl32 (where) & ~((0x7f << 4) | (0xffff << 16))),
3549 (unsigned char *) where);
3550 break;
3551
3552 case BFD_RELOC_16:
3553 case BFD_RELOC_HI16:
3554 case BFD_RELOC_HI16_S:
3555 case BFD_RELOC_LO16:
3556 case BFD_RELOC_V850_ZDA_16_16_OFFSET:
3557 case BFD_RELOC_V850_SDA_16_16_OFFSET:
3558 case BFD_RELOC_V850_TDA_16_16_OFFSET:
3559 case BFD_RELOC_V850_CALLT_16_16_OFFSET:
3560 bfd_putl16 (value & 0xffff, (unsigned char *) where);
3561 break;
3562
3563 case BFD_RELOC_8:
3564 *where = value & 0xff;
3565 break;
3566
3567 case BFD_RELOC_V850_9_PCREL:
3568 bfd_putl16 (((value & 0x1f0) << 7) | ((value & 0x0e) << 3)
3569 | (bfd_getl16 (where) & ~((0x1f0 << 7) | (0x0e << 3))), where);
3570 break;
3571
3572 case BFD_RELOC_V850_17_PCREL:
3573 bfd_putl32 (((value & 0x10000) >> (16 - 4)) | ((value & 0xfffe) << 16)
3574 | (bfd_getl32 (where) & ~((0x10000 >> (16 - 4)) | (0xfffe << 16))), where);
3575 break;
3576
3577 case BFD_RELOC_V850_16_PCREL:
3578 bfd_putl16 ((-value & 0xfffe) | (bfd_getl16 (where + 2) & 0x0001),
3579 (unsigned char *) (where + 2));
3580 break;
3581
3582 case BFD_RELOC_V850_22_PCREL:
3583 bfd_putl32 (((value & 0xfffe) << 16) | ((value & 0x3f0000) >> 16)
3584 | (bfd_getl32 (where) & ~((0xfffe << 16) | (0x3f0000 >> 16))), where);
3585 break;
3586
3587 case BFD_RELOC_V850_16_S1:
3588 case BFD_RELOC_V850_LO16_S1:
3589 case BFD_RELOC_V850_ZDA_15_16_OFFSET:
3590 case BFD_RELOC_V850_SDA_15_16_OFFSET:
3591 bfd_putl16 (value & 0xfffe, (unsigned char *) where);
3592 break;
3593
3594 case BFD_RELOC_V850_16_SPLIT_OFFSET:
3595 case BFD_RELOC_V850_LO16_SPLIT_OFFSET:
3596 case BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET:
3597 case BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET:
3598 bfd_putl32 (((value << 16) & 0xfffe0000)
3599 | ((value << 5) & 0x20)
3600 | (bfd_getl32 (where) & ~0xfffe0020), where);
3601 break;
3602
3603 case BFD_RELOC_V850_TDA_6_8_OFFSET:
3604 *where = (*where & ~0x7e) | ((value >> 1) & 0x7e);
3605 break;
3606
3607 case BFD_RELOC_V850_TDA_7_8_OFFSET:
3608 *where = (*where & ~0x7f) | ((value >> 1) & 0x7f);
3609 break;
3610
3611 case BFD_RELOC_V850_TDA_7_7_OFFSET:
3612 *where = (*where & ~0x7f) | (value & 0x7f);
3613 break;
3614
3615 case BFD_RELOC_V850_TDA_4_5_OFFSET:
3616 *where = (*where & ~0xf) | ((value >> 1) & 0xf);
3617 break;
3618
3619 case BFD_RELOC_V850_TDA_4_4_OFFSET:
3620 *where = (*where & ~0xf) | (value & 0xf);
3621 break;
3622
3623 case BFD_RELOC_V850_CALLT_6_7_OFFSET:
3624 *where = (*where & ~0x3f) | (value & 0x3f);
3625 break;
3626
3627 default:
3628 abort ();
3629 }
3630 }
3631 }
3632 }
3633
3634 /* Parse a cons expression. We have to handle hi(), lo(), etc
3635 on the v850. */
3636
3637 void
3638 parse_cons_expression_v850 (expressionS *exp)
3639 {
3640 const char *errmsg;
3641 /* See if there's a reloc prefix like hi() we have to handle. */
3642 hold_cons_reloc = v850_reloc_prefix (NULL, &errmsg);
3643
3644 /* Do normal expression parsing. */
3645 expression (exp);
3646 }
3647
3648 /* Create a fixup for a cons expression. If parse_cons_expression_v850
3649 found a reloc prefix, then we use that reloc, else we choose an
3650 appropriate one based on the size of the expression. */
3651
3652 void
3653 cons_fix_new_v850 (fragS *frag,
3654 int where,
3655 int size,
3656 expressionS *exp)
3657 {
3658 if (hold_cons_reloc == BFD_RELOC_UNUSED)
3659 {
3660 if (size == 4)
3661 hold_cons_reloc = BFD_RELOC_32;
3662 if (size == 2)
3663 hold_cons_reloc = BFD_RELOC_16;
3664 if (size == 1)
3665 hold_cons_reloc = BFD_RELOC_8;
3666 }
3667
3668 if (exp != NULL)
3669 fix_new_exp (frag, where, size, exp, 0, hold_cons_reloc);
3670 else
3671 fix_new (frag, where, size, NULL, 0, 0, hold_cons_reloc);
3672
3673 hold_cons_reloc = BFD_RELOC_UNUSED;
3674 }
3675
3676 bfd_boolean
3677 v850_fix_adjustable (fixS *fixP)
3678 {
3679 if (fixP->fx_addsy == NULL)
3680 return 1;
3681
3682 /* Don't adjust function names. */
3683 if (S_IS_FUNCTION (fixP->fx_addsy))
3684 return 0;
3685
3686 /* We need the symbol name for the VTABLE entries. */
3687 if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
3688 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
3689 return 0;
3690
3691 return 1;
3692 }
3693
3694 int
3695 v850_force_relocation (struct fix *fixP)
3696 {
3697 if (fixP->fx_r_type == BFD_RELOC_V850_LONGCALL
3698 || fixP->fx_r_type == BFD_RELOC_V850_LONGJUMP)
3699 return 1;
3700
3701 if (v850_relax
3702 && (fixP->fx_pcrel
3703 || fixP->fx_r_type == BFD_RELOC_V850_ALIGN
3704 || fixP->fx_r_type == BFD_RELOC_V850_9_PCREL
3705 || fixP->fx_r_type == BFD_RELOC_V850_16_PCREL
3706 || fixP->fx_r_type == BFD_RELOC_V850_17_PCREL
3707 || fixP->fx_r_type == BFD_RELOC_V850_22_PCREL
3708 || fixP->fx_r_type == BFD_RELOC_V850_32_PCREL
3709 || fixP->fx_r_type >= BFD_RELOC_UNUSED))
3710 return 1;
3711
3712 return generic_force_reloc (fixP);
3713 }
This page took 0.143167 seconds and 5 git commands to generate.