Fix copyright notices
[deliverable/binutils-gdb.git] / gas / config / tc-v850.c
CommitLineData
252b5132 1/* tc-v850.c -- Assembler code for the NEC V850
f7e42eb4 2 Copyright 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
252b5132
RH
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 2, 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, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
20
21#include <stdio.h>
22#include <ctype.h>
23#include "as.h"
28e4f854 24#include "subsegs.h"
252b5132 25#include "opcode/v850.h"
a8761a19 26#include "dwarf2dbg.h"
252b5132
RH
27
28#define AREA_ZDA 0
29#define AREA_SDA 1
30#define AREA_TDA 2
31
28e4f854
KH
32/* Sign-extend a 16-bit number. */
33#define SEXT16(x) ((((x) & 0xffff) ^ (~0x7fff)) + 0x8000)
252b5132
RH
34
35/* Temporarily holds the reloc in a cons expression. */
a8761a19 36static bfd_reloc_code_real_type hold_cons_reloc = BFD_RELOC_UNUSED;
252b5132
RH
37
38/* Set to TRUE if we want to be pedantic about signed overflows. */
39static boolean warn_signed_overflows = FALSE;
40static boolean warn_unsigned_overflows = FALSE;
41
42/* Indicates the target BFD machine number. */
28e4f854 43static int machine = -1;
252b5132
RH
44
45/* Indicates the target processor(s) for the assemble. */
28e4f854 46static int processor_mask = -1;
252b5132
RH
47\f
48/* Structure to hold information about predefined registers. */
19d63e5d 49struct reg_name {
28e4f854
KH
50 const char *name;
51 int value;
252b5132
RH
52};
53
28e4f854
KH
54/* Generic assembler global variables which must be defined by all
55 targets. */
252b5132 56
28e4f854 57/* Characters which always start a comment. */
252b5132
RH
58const char comment_chars[] = "#";
59
60/* Characters which start a comment at the beginning of a line. */
61const char line_comment_chars[] = ";#";
62
28e4f854 63/* Characters which may be used to separate multiple commands on a
252b5132
RH
64 single line. */
65const char line_separator_chars[] = ";";
66
28e4f854 67/* Characters which are used to indicate an exponent in a floating
252b5132
RH
68 point number. */
69const char EXP_CHARS[] = "eE";
70
28e4f854 71/* Characters which mean that a number is a floating point constant,
252b5132
RH
72 as in 0d1.0. */
73const char FLT_CHARS[] = "dD";
74\f
19d63e5d 75const relax_typeS md_relax_table[] = {
252b5132
RH
76 /* Conditional branches. */
77 {0xff, -0x100, 2, 1},
78 {0x1fffff, -0x200000, 6, 0},
79 /* Unconditional branches. */
80 {0xff, -0x100, 2, 3},
81 {0x1fffff, -0x200000, 4, 0},
82};
83
252b5132
RH
84static segT sdata_section = NULL;
85static segT tdata_section = NULL;
86static segT zdata_section = NULL;
87static segT sbss_section = NULL;
88static segT tbss_section = NULL;
89static segT zbss_section = NULL;
90static segT rosdata_section = NULL;
91static segT rozdata_section = NULL;
92static segT scommon_section = NULL;
93static segT tcommon_section = NULL;
94static segT zcommon_section = NULL;
95static segT call_table_data_section = NULL;
96static segT call_table_text_section = NULL;
97
28e4f854 98/* Fixups. */
252b5132 99#define MAX_INSN_FIXUPS (5)
19d63e5d 100struct v850_fixup {
28e4f854
KH
101 expressionS exp;
102 int opindex;
252b5132
RH
103 bfd_reloc_code_real_type reloc;
104};
105
28e4f854 106struct v850_fixup fixups[MAX_INSN_FIXUPS];
252b5132 107static int fc;
252b5132
RH
108\f
109void
5480ccf3 110v850_sdata (int ignore ATTRIBUTE_UNUSED)
252b5132 111{
28e4f854
KH
112 obj_elf_section_change_hook ();
113
252b5132
RH
114 subseg_set (sdata_section, (subsegT) get_absolute_expression ());
115
116 demand_empty_rest_of_line ();
117}
118
119void
5480ccf3 120v850_tdata (int ignore ATTRIBUTE_UNUSED)
252b5132 121{
28e4f854
KH
122 obj_elf_section_change_hook ();
123
252b5132 124 subseg_set (tdata_section, (subsegT) get_absolute_expression ());
28e4f854 125
252b5132
RH
126 demand_empty_rest_of_line ();
127}
128
129void
5480ccf3 130v850_zdata (int ignore ATTRIBUTE_UNUSED)
252b5132 131{
28e4f854
KH
132 obj_elf_section_change_hook ();
133
252b5132 134 subseg_set (zdata_section, (subsegT) get_absolute_expression ());
28e4f854 135
252b5132
RH
136 demand_empty_rest_of_line ();
137}
138
139void
5480ccf3 140v850_sbss (int ignore ATTRIBUTE_UNUSED)
252b5132 141{
28e4f854
KH
142 obj_elf_section_change_hook ();
143
252b5132 144 subseg_set (sbss_section, (subsegT) get_absolute_expression ());
28e4f854 145
252b5132
RH
146 demand_empty_rest_of_line ();
147}
148
149void
5480ccf3 150v850_tbss (int ignore ATTRIBUTE_UNUSED)
252b5132 151{
28e4f854
KH
152 obj_elf_section_change_hook ();
153
252b5132 154 subseg_set (tbss_section, (subsegT) get_absolute_expression ());
28e4f854 155
252b5132
RH
156 demand_empty_rest_of_line ();
157}
158
159void
5480ccf3 160v850_zbss (int ignore ATTRIBUTE_UNUSED)
252b5132 161{
28e4f854
KH
162 obj_elf_section_change_hook ();
163
252b5132 164 subseg_set (zbss_section, (subsegT) get_absolute_expression ());
28e4f854 165
252b5132
RH
166 demand_empty_rest_of_line ();
167}
168
169void
5480ccf3 170v850_rosdata (int ignore ATTRIBUTE_UNUSED)
252b5132 171{
28e4f854
KH
172 obj_elf_section_change_hook ();
173
252b5132 174 subseg_set (rosdata_section, (subsegT) get_absolute_expression ());
28e4f854 175
252b5132
RH
176 demand_empty_rest_of_line ();
177}
178
179void
5480ccf3 180v850_rozdata (int ignore ATTRIBUTE_UNUSED)
252b5132 181{
28e4f854
KH
182 obj_elf_section_change_hook ();
183
252b5132 184 subseg_set (rozdata_section, (subsegT) get_absolute_expression ());
28e4f854 185
252b5132
RH
186 demand_empty_rest_of_line ();
187}
188
189void
5480ccf3 190v850_call_table_data (int ignore ATTRIBUTE_UNUSED)
252b5132 191{
28e4f854
KH
192 obj_elf_section_change_hook ();
193
252b5132 194 subseg_set (call_table_data_section, (subsegT) get_absolute_expression ());
28e4f854 195
252b5132
RH
196 demand_empty_rest_of_line ();
197}
198
199void
5480ccf3 200v850_call_table_text (int ignore ATTRIBUTE_UNUSED)
252b5132 201{
28e4f854
KH
202 obj_elf_section_change_hook ();
203
252b5132 204 subseg_set (call_table_text_section, (subsegT) get_absolute_expression ());
28e4f854 205
252b5132
RH
206 demand_empty_rest_of_line ();
207}
208
209void
5480ccf3 210v850_bss (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
211{
212 register int temp = get_absolute_expression ();
213
28e4f854
KH
214 obj_elf_section_change_hook ();
215
252b5132 216 subseg_set (bss_section, (subsegT) temp);
28e4f854 217
252b5132
RH
218 demand_empty_rest_of_line ();
219}
220
221void
5480ccf3 222v850_offset (int ignore ATTRIBUTE_UNUSED)
252b5132
RH
223{
224 int temp = get_absolute_expression ();
28e4f854
KH
225
226 temp -= frag_now_fix ();
227
252b5132
RH
228 if (temp > 0)
229 (void) frag_more (temp);
28e4f854 230
252b5132
RH
231 demand_empty_rest_of_line ();
232}
233
28e4f854
KH
234/* Copied from obj_elf_common() in gas/config/obj-elf.c. */
235
252b5132
RH
236static void
237v850_comm (area)
238 int area;
239{
28e4f854
KH
240 char *name;
241 char c;
242 char *p;
243 int temp;
244 unsigned int size;
245 symbolS *symbolP;
246 int have_align;
252b5132
RH
247
248 name = input_line_pointer;
249 c = get_symbol_end ();
28e4f854
KH
250
251 /* Just after name is now '\0'. */
252b5132
RH
252 p = input_line_pointer;
253 *p = c;
28e4f854 254
252b5132 255 SKIP_WHITESPACE ();
28e4f854 256
252b5132
RH
257 if (*input_line_pointer != ',')
258 {
259 as_bad (_("Expected comma after symbol-name"));
260 ignore_rest_of_line ();
261 return;
262 }
28e4f854
KH
263
264 /* Skip ','. */
265 input_line_pointer++;
266
252b5132
RH
267 if ((temp = get_absolute_expression ()) < 0)
268 {
28e4f854 269 /* xgettext:c-format */
252b5132
RH
270 as_bad (_(".COMMon length (%d.) < 0! Ignored."), temp);
271 ignore_rest_of_line ();
272 return;
273 }
28e4f854 274
252b5132
RH
275 size = temp;
276 *p = 0;
277 symbolP = symbol_find_or_make (name);
278 *p = c;
28e4f854 279
252b5132
RH
280 if (S_IS_DEFINED (symbolP) && ! S_IS_COMMON (symbolP))
281 {
282 as_bad (_("Ignoring attempt to re-define symbol"));
283 ignore_rest_of_line ();
284 return;
285 }
28e4f854 286
252b5132
RH
287 if (S_GET_VALUE (symbolP) != 0)
288 {
289 if (S_GET_VALUE (symbolP) != size)
290 {
28e4f854 291 /* xgettext:c-format */
252b5132
RH
292 as_warn (_("Length of .comm \"%s\" is already %ld. Not changed to %d."),
293 S_GET_NAME (symbolP), (long) S_GET_VALUE (symbolP), size);
294 }
295 }
28e4f854
KH
296
297 know (symbol_get_frag (symbolP) == &zero_address_frag);
298
252b5132
RH
299 if (*input_line_pointer != ',')
300 have_align = 0;
301 else
302 {
303 have_align = 1;
304 input_line_pointer++;
305 SKIP_WHITESPACE ();
306 }
28e4f854 307
252b5132
RH
308 if (! have_align || *input_line_pointer != '"')
309 {
310 if (! have_align)
311 temp = 0;
312 else
313 {
314 temp = get_absolute_expression ();
28e4f854 315
252b5132
RH
316 if (temp < 0)
317 {
318 temp = 0;
319 as_warn (_("Common alignment negative; 0 assumed"));
320 }
321 }
28e4f854 322
cac58fa6 323 if (symbol_get_obj (symbolP)->local)
252b5132 324 {
28e4f854
KH
325 segT old_sec;
326 int old_subsec;
327 char *pfrag;
328 int align;
329 flagword applicable;
252b5132
RH
330
331 old_sec = now_seg;
332 old_subsec = now_subseg;
28e4f854 333
252b5132 334 applicable = bfd_applicable_section_flags (stdoutput);
28e4f854 335
252b5132 336 applicable &= SEC_ALLOC;
28e4f854 337
252b5132
RH
338 switch (area)
339 {
340 case AREA_SDA:
341 if (sbss_section == NULL)
342 {
343 sbss_section = subseg_new (".sbss", 0);
28e4f854 344
252b5132 345 bfd_set_section_flags (stdoutput, sbss_section, applicable);
28e4f854 346
252b5132
RH
347 seg_info (sbss_section)->bss = 1;
348 }
349 break;
28e4f854 350
252b5132
RH
351 case AREA_ZDA:
352 if (zbss_section == NULL)
353 {
354 zbss_section = subseg_new (".zbss", 0);
28e4f854 355
252b5132 356 bfd_set_section_flags (stdoutput, sbss_section, applicable);
28e4f854 357
252b5132
RH
358 seg_info (zbss_section)->bss = 1;
359 }
360 break;
28e4f854 361
252b5132
RH
362 case AREA_TDA:
363 if (tbss_section == NULL)
364 {
365 tbss_section = subseg_new (".tbss", 0);
28e4f854 366
252b5132 367 bfd_set_section_flags (stdoutput, tbss_section, applicable);
28e4f854 368
252b5132
RH
369 seg_info (tbss_section)->bss = 1;
370 }
371 break;
372 }
373
374 if (temp)
375 {
28e4f854 376 /* Convert to a power of 2 alignment. */
252b5132
RH
377 for (align = 0; (temp & 1) == 0; temp >>= 1, ++align)
378 ;
28e4f854 379
252b5132
RH
380 if (temp != 1)
381 {
382 as_bad (_("Common alignment not a power of 2"));
383 ignore_rest_of_line ();
384 return;
385 }
386 }
387 else
388 align = 0;
28e4f854 389
252b5132
RH
390 switch (area)
391 {
392 case AREA_SDA:
393 record_alignment (sbss_section, align);
28e4f854 394 obj_elf_section_change_hook ();
252b5132
RH
395 subseg_set (sbss_section, 0);
396 break;
397
398 case AREA_ZDA:
399 record_alignment (zbss_section, align);
28e4f854 400 obj_elf_section_change_hook ();
252b5132
RH
401 subseg_set (zbss_section, 0);
402 break;
403
404 case AREA_TDA:
405 record_alignment (tbss_section, align);
28e4f854 406 obj_elf_section_change_hook ();
252b5132
RH
407 subseg_set (tbss_section, 0);
408 break;
409
410 default:
28e4f854 411 abort ();
252b5132 412 }
28e4f854 413
252b5132
RH
414 if (align)
415 frag_align (align, 0, 0);
416
417 switch (area)
418 {
419 case AREA_SDA:
420 if (S_GET_SEGMENT (symbolP) == sbss_section)
7dcc9865 421 symbol_get_frag (symbolP)->fr_symbol = 0;
252b5132
RH
422 break;
423
424 case AREA_ZDA:
425 if (S_GET_SEGMENT (symbolP) == zbss_section)
7dcc9865 426 symbol_get_frag (symbolP)->fr_symbol = 0;
252b5132
RH
427 break;
428
429 case AREA_TDA:
430 if (S_GET_SEGMENT (symbolP) == tbss_section)
7dcc9865 431 symbol_get_frag (symbolP)->fr_symbol = 0;
252b5132
RH
432 break;
433
434 default:
cac58fa6 435 abort ();
252b5132 436 }
28e4f854 437
7dcc9865 438 symbol_set_frag (symbolP, frag_now);
252b5132
RH
439 pfrag = frag_var (rs_org, 1, 1, (relax_substateT) 0, symbolP,
440 (offsetT) size, (char *) 0);
441 *pfrag = 0;
442 S_SET_SIZE (symbolP, size);
28e4f854 443
252b5132
RH
444 switch (area)
445 {
446 case AREA_SDA:
447 S_SET_SEGMENT (symbolP, sbss_section);
448 break;
28e4f854 449
252b5132
RH
450 case AREA_ZDA:
451 S_SET_SEGMENT (symbolP, zbss_section);
452 break;
28e4f854 453
252b5132
RH
454 case AREA_TDA:
455 S_SET_SEGMENT (symbolP, tbss_section);
456 break;
28e4f854 457
252b5132 458 default:
28e4f854 459 abort ();
252b5132 460 }
28e4f854 461
252b5132 462 S_CLEAR_EXTERNAL (symbolP);
28e4f854 463 obj_elf_section_change_hook ();
252b5132
RH
464 subseg_set (old_sec, old_subsec);
465 }
466 else
467 {
468 allocate_common:
469 S_SET_VALUE (symbolP, (valueT) size);
470 S_SET_ALIGN (symbolP, temp);
471 S_SET_EXTERNAL (symbolP);
28e4f854 472
252b5132
RH
473 switch (area)
474 {
475 case AREA_SDA:
476 if (scommon_section == NULL)
477 {
28e4f854
KH
478 flagword applicable =
479 bfd_applicable_section_flags (stdoutput);
480
252b5132 481 scommon_section = subseg_new (".scommon", 0);
28e4f854 482
5480ccf3
NC
483 bfd_set_section_flags (stdoutput, scommon_section,
484 (applicable
252b5132 485 & (SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA
5480ccf3 486 | SEC_HAS_CONTENTS)) | SEC_IS_COMMON);
252b5132
RH
487 }
488 S_SET_SEGMENT (symbolP, scommon_section);
489 break;
28e4f854 490
252b5132
RH
491 case AREA_ZDA:
492 if (zcommon_section == NULL)
493 {
28e4f854
KH
494 flagword applicable =
495 bfd_applicable_section_flags (stdoutput);
496
252b5132 497 zcommon_section = subseg_new (".zcommon", 0);
28e4f854 498
5480ccf3
NC
499 bfd_set_section_flags (stdoutput, zcommon_section,
500 (applicable
252b5132 501 & (SEC_ALLOC | SEC_LOAD | SEC_RELOC | SEC_DATA
5480ccf3 502 | SEC_HAS_CONTENTS)) | SEC_IS_COMMON);
252b5132
RH
503 }
504 S_SET_SEGMENT (symbolP, zcommon_section);
505 break;
28e4f854 506
252b5132
RH
507 case AREA_TDA:
508 if (tcommon_section == NULL)
509 {
28e4f854
KH
510 flagword applicable =
511 bfd_applicable_section_flags (stdoutput);
512
252b5132 513 tcommon_section = subseg_new (".tcommon", 0);
28e4f854 514
5480ccf3 515 bfd_set_section_flags (stdoutput, tcommon_section,
28e4f854
KH
516 ((applicable
517 & (SEC_ALLOC | SEC_LOAD
518 | SEC_RELOC | SEC_DATA
519 | SEC_HAS_CONTENTS))
520 | SEC_IS_COMMON));
252b5132
RH
521 }
522 S_SET_SEGMENT (symbolP, tcommon_section);
523 break;
28e4f854 524
252b5132 525 default:
28e4f854 526 abort ();
252b5132
RH
527 }
528 }
529 }
530 else
531 {
532 input_line_pointer++;
28e4f854 533
252b5132
RH
534 /* @@ Some use the dot, some don't. Can we get some consistency?? */
535 if (*input_line_pointer == '.')
536 input_line_pointer++;
28e4f854 537
252b5132
RH
538 /* @@ Some say data, some say bss. */
539 if (strncmp (input_line_pointer, "bss\"", 4)
540 && strncmp (input_line_pointer, "data\"", 5))
541 {
542 while (*--input_line_pointer != '"')
543 ;
544 input_line_pointer--;
545 goto bad_common_segment;
546 }
547 while (*input_line_pointer++ != '"')
548 ;
549 goto allocate_common;
550 }
551
fed9b18a 552 symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT;
252b5132
RH
553
554 demand_empty_rest_of_line ();
555 return;
556
557 {
558 bad_common_segment:
559 p = input_line_pointer;
560 while (*p && *p != '\n')
561 p++;
562 c = *p;
563 *p = '\0';
564 as_bad (_("bad .common segment %s"), input_line_pointer + 1);
565 *p = c;
566 input_line_pointer = p;
567 ignore_rest_of_line ();
568 return;
569 }
570}
571
572void
573set_machine (int number)
574{
575 machine = number;
576 bfd_set_arch_mach (stdoutput, TARGET_ARCH, machine);
577
578 switch (machine)
579 {
28e4f854
KH
580 case 0: processor_mask = PROCESSOR_V850; break;
581 case bfd_mach_v850e: processor_mask = PROCESSOR_V850E; break;
252b5132
RH
582 case bfd_mach_v850ea: processor_mask = PROCESSOR_V850EA; break;
583 }
584}
585
586/* The target specific pseudo-ops which we support. */
19d63e5d 587const pseudo_typeS md_pseudo_table[] = {
252b5132
RH
588 {"sdata", v850_sdata, 0},
589 {"tdata", v850_tdata, 0},
590 {"zdata", v850_zdata, 0},
591 {"sbss", v850_sbss, 0},
592 {"tbss", v850_tbss, 0},
593 {"zbss", v850_zbss, 0},
594 {"rosdata", v850_rosdata, 0},
595 {"rozdata", v850_rozdata, 0},
596 {"bss", v850_bss, 0},
597 {"offset", v850_offset, 0},
598 {"word", cons, 4},
599 {"zcomm", v850_comm, AREA_ZDA},
600 {"scomm", v850_comm, AREA_SDA},
601 {"tcomm", v850_comm, AREA_TDA},
602 {"v850", set_machine, 0},
603 {"call_table_data", v850_call_table_data, 0},
604 {"call_table_text", v850_call_table_text, 0},
605 {"v850e", set_machine, bfd_mach_v850e},
606 {"v850ea", set_machine, bfd_mach_v850ea},
a8761a19
DD
607 {"file", dwarf2_directive_file },
608 {"loc", dwarf2_directive_loc },
252b5132
RH
609 { NULL, NULL, 0}
610};
611
612/* Opcode hash table. */
613static struct hash_control *v850_hash;
614
28e4f854 615/* This table is sorted. Suitable for searching by a binary search. */
19d63e5d 616static const struct reg_name pre_defined_registers[] = {
252b5132 617 { "ep", 30 }, /* ep - element ptr */
28e4f854
KH
618 { "gp", 4 }, /* gp - global ptr */
619 { "hp", 2 }, /* hp - handler stack ptr */
620 { "lp", 31 }, /* lp - link ptr */
252b5132
RH
621 { "r0", 0 },
622 { "r1", 1 },
623 { "r10", 10 },
624 { "r11", 11 },
625 { "r12", 12 },
626 { "r13", 13 },
627 { "r14", 14 },
628 { "r15", 15 },
629 { "r16", 16 },
630 { "r17", 17 },
631 { "r18", 18 },
632 { "r19", 19 },
633 { "r2", 2 },
634 { "r20", 20 },
635 { "r21", 21 },
636 { "r22", 22 },
637 { "r23", 23 },
638 { "r24", 24 },
639 { "r25", 25 },
640 { "r26", 26 },
641 { "r27", 27 },
642 { "r28", 28 },
643 { "r29", 29 },
644 { "r3", 3 },
645 { "r30", 30 },
646 { "r31", 31 },
647 { "r4", 4 },
648 { "r5", 5 },
649 { "r6", 6 },
650 { "r7", 7 },
651 { "r8", 8 },
652 { "r9", 9 },
28e4f854
KH
653 { "sp", 3 }, /* sp - stack ptr */
654 { "tp", 5 }, /* tp - text ptr */
252b5132
RH
655 { "zero", 0 },
656};
252b5132 657
28e4f854
KH
658#define REG_NAME_CNT \
659 (sizeof (pre_defined_registers) / sizeof (struct reg_name))
252b5132 660
19d63e5d 661static const struct reg_name system_registers[] = {
252b5132
RH
662 { "ctbp", 20 },
663 { "ctpc", 16 },
664 { "ctpsw", 17 },
665 { "dbpc", 18 },
666 { "dbpsw", 19 },
667 { "ecr", 4 },
668 { "eipc", 0 },
669 { "eipsw", 1 },
670 { "fepc", 2 },
671 { "fepsw", 3 },
672 { "psw", 5 },
673};
28e4f854
KH
674
675#define SYSREG_NAME_CNT \
676 (sizeof (system_registers) / sizeof (struct reg_name))
252b5132 677
19d63e5d 678static const struct reg_name system_list_registers[] = {
252b5132
RH
679 {"PS", 5 },
680 {"SR", 0 + 1}
681};
28e4f854
KH
682
683#define SYSREGLIST_NAME_CNT \
684 (sizeof (system_list_registers) / sizeof (struct reg_name))
252b5132 685
19d63e5d 686static const struct reg_name cc_names[] = {
252b5132
RH
687 { "c", 0x1 },
688 { "e", 0x2 },
689 { "ge", 0xe },
690 { "gt", 0xf },
691 { "h", 0xb },
692 { "l", 0x1 },
693 { "le", 0x7 },
694 { "lt", 0x6 },
695 { "n", 0x4 },
696 { "nc", 0x9 },
697 { "ne", 0xa },
698 { "nh", 0x3 },
699 { "nl", 0x9 },
700 { "ns", 0xc },
701 { "nv", 0x8 },
702 { "nz", 0xa },
703 { "p", 0xc },
704 { "s", 0x4 },
705 { "sa", 0xd },
706 { "t", 0x5 },
707 { "v", 0x0 },
708 { "z", 0x2 },
709};
252b5132 710
28e4f854
KH
711#define CC_NAME_CNT \
712 (sizeof (cc_names) / sizeof (struct reg_name))
713
714/* Do a binary search of the given register table to see if NAME is a
715 valid regiter name. Return the register number from the array on
716 success, or -1 on failure. */
252b5132
RH
717
718static int
719reg_name_search (regs, regcount, name, accept_numbers)
28e4f854
KH
720 const struct reg_name *regs;
721 int regcount;
722 const char *name;
723 boolean accept_numbers;
252b5132
RH
724{
725 int middle, low, high;
726 int cmp;
28e4f854 727 symbolS *symbolP;
252b5132
RH
728
729 /* If the register name is a symbol, then evaluate it. */
730 if ((symbolP = symbol_find (name)) != NULL)
731 {
732 /* If the symbol is an alias for another name then use that.
733 If the symbol is an alias for a number, then return the number. */
a77f5182 734 if (symbol_equated_p (symbolP))
252b5132 735 {
28e4f854
KH
736 name
737 = S_GET_NAME (symbol_get_value_expression (symbolP)->X_add_symbol);
252b5132
RH
738 }
739 else if (accept_numbers)
740 {
741 int reg = S_GET_VALUE (symbolP);
28e4f854 742
252b5132
RH
743 if (reg >= 0 && reg <= 31)
744 return reg;
745 }
746
747 /* Otherwise drop through and try parsing name normally. */
748 }
28e4f854 749
252b5132
RH
750 low = 0;
751 high = regcount - 1;
752
753 do
754 {
755 middle = (low + high) / 2;
756 cmp = strcasecmp (name, regs[middle].name);
757 if (cmp < 0)
758 high = middle - 1;
759 else if (cmp > 0)
760 low = middle + 1;
761 else
762 return regs[middle].value;
763 }
764 while (low <= high);
765 return -1;
766}
767
252b5132
RH
768/* Summary of register_name().
769 *
770 * in: Input_line_pointer points to 1st char of operand.
771 *
772 * out: A expressionS.
773 * The operand may have been a register: in this case, X_op == O_register,
774 * X_add_number is set to the register number, and truth is returned.
775 * Input_line_pointer->(next non-blank) char after operand, or is in
28e4f854
KH
776 * its original state. */
777
252b5132
RH
778static boolean
779register_name (expressionP)
28e4f854 780 expressionS *expressionP;
252b5132 781{
28e4f854
KH
782 int reg_number;
783 char *name;
784 char *start;
785 char c;
252b5132 786
28e4f854 787 /* Find the spelling of the operand. */
252b5132
RH
788 start = name = input_line_pointer;
789
790 c = get_symbol_end ();
791
792 reg_number = reg_name_search (pre_defined_registers, REG_NAME_CNT,
793 name, FALSE);
794
28e4f854
KH
795 /* Put back the delimiting char. */
796 *input_line_pointer = c;
797
798 /* Look to see if it's in the register table. */
799 if (reg_number >= 0)
252b5132
RH
800 {
801 expressionP->X_op = O_register;
802 expressionP->X_add_number = reg_number;
803
28e4f854 804 /* Make the rest nice. */
252b5132
RH
805 expressionP->X_add_symbol = NULL;
806 expressionP->X_op_symbol = NULL;
28e4f854 807
252b5132
RH
808 return true;
809 }
810 else
811 {
28e4f854 812 /* Reset the line as if we had not done anything. */
252b5132 813 input_line_pointer = start;
28e4f854 814
252b5132
RH
815 return false;
816 }
817}
818
819/* Summary of system_register_name().
820 *
28e4f854
KH
821 * in: INPUT_LINE_POINTER points to 1st char of operand.
822 * EXPRESSIONP points to an expression structure to be filled in.
823 * ACCEPT_NUMBERS is true iff numerical register names may be used.
824 * ACCEPT_LIST_NAMES is true iff the special names PS and SR may be
252b5132
RH
825 * accepted.
826 *
827 * out: A expressionS structure in expressionP.
828 * The operand may have been a register: in this case, X_op == O_register,
829 * X_add_number is set to the register number, and truth is returned.
830 * Input_line_pointer->(next non-blank) char after operand, or is in
28e4f854
KH
831 * its original state. */
832
252b5132
RH
833static boolean
834system_register_name (expressionP, accept_numbers, accept_list_names)
28e4f854
KH
835 expressionS *expressionP;
836 boolean accept_numbers;
837 boolean accept_list_names;
252b5132 838{
28e4f854
KH
839 int reg_number;
840 char *name;
841 char *start;
842 char c;
252b5132 843
28e4f854 844 /* Find the spelling of the operand. */
252b5132
RH
845 start = name = input_line_pointer;
846
847 c = get_symbol_end ();
848 reg_number = reg_name_search (system_registers, SYSREG_NAME_CNT, name,
849 accept_numbers);
850
28e4f854
KH
851 /* Put back the delimiting char. */
852 *input_line_pointer = c;
853
252b5132
RH
854 if (reg_number < 0
855 && accept_numbers)
856 {
28e4f854
KH
857 /* Reset input_line pointer. */
858 input_line_pointer = start;
252b5132 859
28e4f854 860 if (isdigit (*input_line_pointer))
252b5132 861 {
28e4f854 862 reg_number = strtol (input_line_pointer, &input_line_pointer, 10);
252b5132 863
28e4f854
KH
864 /* Make sure that the register number is allowable. */
865 if (reg_number < 0
5480ccf3 866 || (reg_number > 5 && reg_number < 16)
28e4f854 867 || reg_number > 20)
252b5132
RH
868 {
869 reg_number = -1;
870 }
871 }
872 else if (accept_list_names)
873 {
874 c = get_symbol_end ();
875 reg_number = reg_name_search (system_list_registers,
876 SYSREGLIST_NAME_CNT, name, FALSE);
877
28e4f854
KH
878 /* Put back the delimiting char. */
879 *input_line_pointer = c;
252b5132
RH
880 }
881 }
28e4f854
KH
882
883 /* Look to see if it's in the register table. */
884 if (reg_number >= 0)
252b5132
RH
885 {
886 expressionP->X_op = O_register;
887 expressionP->X_add_number = reg_number;
888
28e4f854 889 /* Make the rest nice. */
252b5132
RH
890 expressionP->X_add_symbol = NULL;
891 expressionP->X_op_symbol = NULL;
892
893 return true;
894 }
895 else
896 {
28e4f854 897 /* Reset the line as if we had not done anything. */
252b5132 898 input_line_pointer = start;
28e4f854 899
252b5132
RH
900 return false;
901 }
902}
903
904/* Summary of cc_name().
905 *
28e4f854 906 * in: INPUT_LINE_POINTER points to 1st char of operand.
252b5132
RH
907 *
908 * out: A expressionS.
909 * The operand may have been a register: in this case, X_op == O_register,
910 * X_add_number is set to the register number, and truth is returned.
911 * Input_line_pointer->(next non-blank) char after operand, or is in
28e4f854
KH
912 * its original state. */
913
252b5132
RH
914static boolean
915cc_name (expressionP)
28e4f854 916 expressionS *expressionP;
252b5132 917{
28e4f854
KH
918 int reg_number;
919 char *name;
920 char *start;
921 char c;
252b5132 922
28e4f854 923 /* Find the spelling of the operand. */
252b5132
RH
924 start = name = input_line_pointer;
925
926 c = get_symbol_end ();
927 reg_number = reg_name_search (cc_names, CC_NAME_CNT, name, FALSE);
928
28e4f854
KH
929 /* Put back the delimiting char. */
930 *input_line_pointer = c;
931
932 /* Look to see if it's in the register table. */
933 if (reg_number >= 0)
252b5132
RH
934 {
935 expressionP->X_op = O_constant;
936 expressionP->X_add_number = reg_number;
937
28e4f854 938 /* Make the rest nice. */
252b5132
RH
939 expressionP->X_add_symbol = NULL;
940 expressionP->X_op_symbol = NULL;
941
942 return true;
943 }
944 else
945 {
28e4f854 946 /* Reset the line as if we had not done anything. */
252b5132 947 input_line_pointer = start;
28e4f854 948
252b5132
RH
949 return false;
950 }
951}
952
953static void
954skip_white_space (void)
955{
28e4f854
KH
956 while (*input_line_pointer == ' '
957 || *input_line_pointer == '\t')
958 ++input_line_pointer;
252b5132
RH
959}
960
961/* Summary of parse_register_list ().
962 *
28e4f854
KH
963 * in: INPUT_LINE_POINTER points to 1st char of a list of registers.
964 * INSN is the partially constructed instruction.
965 * OPERAND is the operand being inserted.
252b5132
RH
966 *
967 * out: NULL if the parse completed successfully, otherwise a
968 * pointer to an error message is returned. If the parse
969 * completes the correct bit fields in the instruction
970 * will be filled in.
971 *
972 * Parses register lists with the syntax:
973 *
974 * { rX }
975 * { rX, rY }
976 * { rX - rY }
977 * { rX - rY, rZ }
978 * etc
979 *
980 * and also parses constant epxressions whoes bits indicate the
981 * registers in the lists. The LSB in the expression refers to
982 * the lowest numbered permissable register in the register list,
983 * and so on upwards. System registers are considered to be very
28e4f854
KH
984 * high numbers. */
985
252b5132 986static char *
28e4f854
KH
987parse_register_list (insn, operand)
988 unsigned long *insn;
989 const struct v850_operand *operand;
252b5132 990{
28e4f854
KH
991 static int type1_regs[32] = {
992 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
993 0, 0, 0, 0, 0, 31, 29, 28, 23, 22, 21, 20, 27, 26, 25, 24
994 };
995 static int type2_regs[32] = {
996 19, 18, 17, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
997 0, 0, 0, 0, 30, 31, 29, 28, 23, 22, 21, 20, 27, 26, 25, 24
998 };
999 static int type3_regs[32] = {
1000 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1001 0, 0, 0, 0, 14, 15, 13, 12, 7, 6, 5, 4, 11, 10, 9, 8
1002 };
1003 int *regs;
252b5132
RH
1004 expressionS exp;
1005
28e4f854 1006 /* Select a register array to parse. */
252b5132
RH
1007 switch (operand->shift)
1008 {
1009 case 0xffe00001: regs = type1_regs; break;
1010 case 0xfff8000f: regs = type2_regs; break;
1011 case 0xfff8001f: regs = type3_regs; break;
1012 default:
1013 as_bad (_("unknown operand shift: %x\n"), operand->shift);
1014 return _("internal failure in parse_register_list");
1015 }
1016
1017 skip_white_space ();
1018
1019 /* If the expression starts with a curly brace it is a register list.
1020 Otherwise it is a constant expression, whoes bits indicate which
1021 registers are to be included in the list. */
28e4f854
KH
1022
1023 if (*input_line_pointer != '{')
252b5132 1024 {
252b5132
RH
1025 int reg;
1026 int i;
28e4f854
KH
1027
1028 expression (&exp);
1029
252b5132
RH
1030 if (exp.X_op != O_constant)
1031 return _("constant expression or register list expected");
1032
1033 if (regs == type1_regs)
1034 {
1035 if (exp.X_add_number & 0xFFFFF000)
1036 return _("high bits set in register list expression");
28e4f854
KH
1037
1038 for (reg = 20; reg < 32; reg++)
252b5132
RH
1039 if (exp.X_add_number & (1 << (reg - 20)))
1040 {
1041 for (i = 0; i < 32; i++)
1042 if (regs[i] == reg)
28e4f854 1043 *insn |= (1 << i);
252b5132
RH
1044 }
1045 }
1046 else if (regs == type2_regs)
1047 {
1048 if (exp.X_add_number & 0xFFFE0000)
1049 return _("high bits set in register list expression");
28e4f854
KH
1050
1051 for (reg = 1; reg < 16; reg++)
252b5132
RH
1052 if (exp.X_add_number & (1 << (reg - 1)))
1053 {
1054 for (i = 0; i < 32; i++)
1055 if (regs[i] == reg)
28e4f854 1056 *insn |= (1 << i);
252b5132
RH
1057 }
1058
1059 if (exp.X_add_number & (1 << 15))
28e4f854
KH
1060 *insn |= (1 << 3);
1061
252b5132 1062 if (exp.X_add_number & (1 << 16))
28e4f854 1063 *insn |= (1 << 19);
252b5132 1064 }
28e4f854 1065 else /* regs == type3_regs */
252b5132
RH
1066 {
1067 if (exp.X_add_number & 0xFFFE0000)
1068 return _("high bits set in register list expression");
28e4f854
KH
1069
1070 for (reg = 16; reg < 32; reg++)
252b5132
RH
1071 if (exp.X_add_number & (1 << (reg - 16)))
1072 {
1073 for (i = 0; i < 32; i++)
1074 if (regs[i] == reg)
28e4f854 1075 *insn |= (1 << i);
252b5132
RH
1076 }
1077
1078 if (exp.X_add_number & (1 << 16))
28e4f854 1079 *insn |= (1 << 19);
252b5132
RH
1080 }
1081
1082 return NULL;
1083 }
1084
28e4f854 1085 input_line_pointer++;
252b5132
RH
1086
1087 /* Parse the register list until a terminator (closing curly brace or
1088 new-line) is found. */
1089 for (;;)
1090 {
28e4f854 1091 if (register_name (&exp))
252b5132 1092 {
28e4f854
KH
1093 int i;
1094
252b5132
RH
1095 /* Locate the given register in the list, and if it is there,
1096 insert the corresponding bit into the instruction. */
1097 for (i = 0; i < 32; i++)
1098 {
28e4f854 1099 if (regs[i] == exp.X_add_number)
252b5132 1100 {
28e4f854 1101 *insn |= (1 << i);
252b5132
RH
1102 break;
1103 }
1104 }
1105
1106 if (i == 32)
1107 {
1108 return _("illegal register included in list");
1109 }
1110 }
28e4f854 1111 else if (system_register_name (&exp, true, true))
252b5132
RH
1112 {
1113 if (regs == type1_regs)
1114 {
1115 return _("system registers cannot be included in list");
1116 }
1117 else if (exp.X_add_number == 5)
1118 {
1119 if (regs == type2_regs)
1120 return _("PSW cannot be included in list");
1121 else
28e4f854 1122 *insn |= 0x8;
252b5132
RH
1123 }
1124 else if (exp.X_add_number < 4)
28e4f854 1125 *insn |= 0x80000;
252b5132
RH
1126 else
1127 return _("High value system registers cannot be included in list");
1128 }
28e4f854 1129 else if (*input_line_pointer == '}')
252b5132 1130 {
28e4f854 1131 input_line_pointer++;
252b5132
RH
1132 break;
1133 }
28e4f854 1134 else if (*input_line_pointer == ',')
252b5132 1135 {
28e4f854 1136 input_line_pointer++;
252b5132
RH
1137 continue;
1138 }
28e4f854 1139 else if (*input_line_pointer == '-')
252b5132 1140 {
28e4f854
KH
1141 /* We have encountered a range of registers: rX - rY. */
1142 int j;
252b5132
RH
1143 expressionS exp2;
1144
1145 /* Skip the dash. */
28e4f854 1146 ++input_line_pointer;
252b5132
RH
1147
1148 /* Get the second register in the range. */
28e4f854 1149 if (! register_name (&exp2))
252b5132
RH
1150 {
1151 return _("second register should follow dash in register list");
1152 exp2.X_add_number = exp.X_add_number;
1153 }
1154
1155 /* Add the rest of the registers in the range. */
1156 for (j = exp.X_add_number + 1; j <= exp2.X_add_number; j++)
1157 {
28e4f854
KH
1158 int i;
1159
252b5132
RH
1160 /* Locate the given register in the list, and if it is there,
1161 insert the corresponding bit into the instruction. */
1162 for (i = 0; i < 32; i++)
1163 {
28e4f854 1164 if (regs[i] == j)
252b5132 1165 {
28e4f854 1166 *insn |= (1 << i);
252b5132
RH
1167 break;
1168 }
1169 }
1170
1171 if (i == 32)
1172 return _("illegal register included in list");
1173 }
1174 }
1175 else
1176 {
1177 break;
1178 }
1179
1180 skip_white_space ();
1181 }
1182
1183 return NULL;
1184}
1185
28e4f854 1186CONST char *md_shortopts = "m:";
252b5132 1187
19d63e5d 1188struct option md_longopts[] = {
252b5132
RH
1189 {NULL, no_argument, NULL, 0}
1190};
252b5132 1191
28e4f854 1192size_t md_longopts_size = sizeof (md_longopts);
252b5132
RH
1193
1194void
1195md_show_usage (stream)
28e4f854 1196 FILE *stream;
252b5132
RH
1197{
1198 fprintf (stream, _(" V850 options:\n"));
1199 fprintf (stream, _(" -mwarn-signed-overflow Warn if signed immediate values overflow\n"));
1200 fprintf (stream, _(" -mwarn-unsigned-overflow Warn if unsigned immediate values overflow\n"));
1201 fprintf (stream, _(" -mv850 The code is targeted at the v850\n"));
1202 fprintf (stream, _(" -mv850e The code is targeted at the v850e\n"));
1203 fprintf (stream, _(" -mv850ea The code is targeted at the v850ea\n"));
1204 fprintf (stream, _(" -mv850any The code is generic, despite any processor specific instructions\n"));
1205}
1206
1207int
1208md_parse_option (c, arg)
28e4f854
KH
1209 int c;
1210 char *arg;
252b5132
RH
1211{
1212 if (c != 'm')
1213 {
5480ccf3 1214 if (c != 'a')
28e4f854 1215 /* xgettext:c-format */
5480ccf3 1216 fprintf (stderr, _("unknown command line option: -%c%s\n"), c, arg);
252b5132
RH
1217 return 0;
1218 }
1219
1220 if (strcmp (arg, "warn-signed-overflow") == 0)
1221 {
1222 warn_signed_overflows = TRUE;
1223 }
1224 else if (strcmp (arg, "warn-unsigned-overflow") == 0)
1225 {
1226 warn_unsigned_overflows = TRUE;
1227 }
1228 else if (strcmp (arg, "v850") == 0)
1229 {
1230 machine = 0;
1231 processor_mask = PROCESSOR_V850;
1232 }
1233 else if (strcmp (arg, "v850e") == 0)
1234 {
1235 machine = bfd_mach_v850e;
1236 processor_mask = PROCESSOR_V850E;
1237 }
1238 else if (strcmp (arg, "v850ea") == 0)
1239 {
1240 machine = bfd_mach_v850ea;
1241 processor_mask = PROCESSOR_V850EA;
1242 }
1243 else if (strcmp (arg, "v850any") == 0)
1244 {
28e4f854
KH
1245 /* Tell the world that this is for any v850 chip. */
1246 machine = 0;
1247
1248 /* But support instructions for the extended versions. */
1249 processor_mask = PROCESSOR_V850EA;
252b5132
RH
1250 }
1251 else
1252 {
28e4f854 1253 /* xgettext:c-format */
252b5132
RH
1254 fprintf (stderr, _("unknown command line option: -%c%s\n"), c, arg);
1255 return 0;
1256 }
28e4f854 1257
252b5132
RH
1258 return 1;
1259}
1260
1261symbolS *
1262md_undefined_symbol (name)
28e4f854 1263 char *name ATTRIBUTE_UNUSED;
252b5132
RH
1264{
1265 return 0;
1266}
1267
1268char *
1269md_atof (type, litp, sizep)
28e4f854
KH
1270 int type;
1271 char *litp;
1272 int *sizep;
252b5132 1273{
28e4f854 1274 int prec;
252b5132 1275 LITTLENUM_TYPE words[4];
28e4f854
KH
1276 char *t;
1277 int i;
252b5132
RH
1278
1279 switch (type)
1280 {
1281 case 'f':
1282 prec = 2;
1283 break;
1284
1285 case 'd':
1286 prec = 4;
1287 break;
1288
1289 default:
1290 *sizep = 0;
1291 return _("bad call to md_atof");
1292 }
28e4f854 1293
252b5132
RH
1294 t = atof_ieee (input_line_pointer, type, words);
1295 if (t)
1296 input_line_pointer = t;
1297
1298 *sizep = prec * 2;
1299
1300 for (i = prec - 1; i >= 0; i--)
1301 {
1302 md_number_to_chars (litp, (valueT) words[i], 2);
1303 litp += 2;
1304 }
1305
1306 return NULL;
1307}
1308
252b5132 1309/* Very gross. */
28e4f854 1310
252b5132
RH
1311void
1312md_convert_frag (abfd, sec, fragP)
19d63e5d
KH
1313 bfd *abfd ATTRIBUTE_UNUSED;
1314 asection *sec;
1315 fragS *fragP;
252b5132
RH
1316{
1317 subseg_change (sec, 0);
28e4f854 1318
252b5132
RH
1319 /* In range conditional or unconditional branch. */
1320 if (fragP->fr_subtype == 0 || fragP->fr_subtype == 2)
1321 {
1322 fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
1323 fragP->fr_offset, 1, BFD_RELOC_UNUSED + (int)fragP->fr_opcode);
1324 fragP->fr_var = 0;
1325 fragP->fr_fix += 2;
1326 }
1327 /* Out of range conditional branch. Emit a branch around a jump. */
1328 else if (fragP->fr_subtype == 1)
1329 {
28e4f854 1330 unsigned char *buffer =
252b5132
RH
1331 (unsigned char *) (fragP->fr_fix + fragP->fr_literal);
1332
1333 /* Reverse the condition of the first branch. */
1334 buffer[0] ^= 0x08;
1335 /* Mask off all the displacement bits. */
1336 buffer[0] &= 0x8f;
1337 buffer[1] &= 0x07;
1338 /* Now set the displacement bits so that we branch
1339 around the unconditional branch. */
1340 buffer[0] |= 0x30;
1341
1342 /* Now create the unconditional branch + fixup to the final
1343 target. */
1344 md_number_to_chars (buffer + 2, 0x00000780, 4);
1345 fix_new (fragP, fragP->fr_fix + 2, 4, fragP->fr_symbol,
1346 fragP->fr_offset, 1, BFD_RELOC_UNUSED +
1347 (int) fragP->fr_opcode + 1);
1348 fragP->fr_var = 0;
1349 fragP->fr_fix += 6;
1350 }
1351 /* Out of range unconditional branch. Emit a jump. */
1352 else if (fragP->fr_subtype == 3)
1353 {
1354 md_number_to_chars (fragP->fr_fix + fragP->fr_literal, 0x00000780, 4);
1355 fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
1356 fragP->fr_offset, 1, BFD_RELOC_UNUSED +
1357 (int) fragP->fr_opcode + 1);
1358 fragP->fr_var = 0;
1359 fragP->fr_fix += 4;
1360 }
1361 else
1362 abort ();
1363}
1364
1365valueT
1366md_section_align (seg, addr)
28e4f854
KH
1367 asection *seg;
1368 valueT addr;
252b5132
RH
1369{
1370 int align = bfd_get_section_alignment (stdoutput, seg);
1371 return ((addr + (1 << align) - 1) & (-1 << align));
1372}
1373
1374void
1375md_begin ()
1376{
28e4f854
KH
1377 char *prev_name = "";
1378 register const struct v850_opcode *op;
1379 flagword applicable;
252b5132
RH
1380
1381 if (strncmp (TARGET_CPU, "v850ea", 6) == 0)
1382 {
1383 if (machine == -1)
1384 machine = bfd_mach_v850ea;
28e4f854 1385
252b5132
RH
1386 if (processor_mask == -1)
1387 processor_mask = PROCESSOR_V850EA;
1388 }
1389 else if (strncmp (TARGET_CPU, "v850e", 5) == 0)
1390 {
1391 if (machine == -1)
28e4f854
KH
1392 machine = bfd_mach_v850e;
1393
252b5132
RH
1394 if (processor_mask == -1)
1395 processor_mask = PROCESSOR_V850E;
1396 }
28e4f854 1397 else if (strncmp (TARGET_CPU, "v850", 4) == 0)
252b5132
RH
1398 {
1399 if (machine == -1)
28e4f854
KH
1400 machine = 0;
1401
252b5132
RH
1402 if (processor_mask == -1)
1403 processor_mask = PROCESSOR_V850;
1404 }
1405 else
28e4f854
KH
1406 /* xgettext:c-format */
1407 as_bad (_("Unable to determine default target processor from string: %s"),
252b5132
RH
1408 TARGET_CPU);
1409
19d63e5d 1410 v850_hash = hash_new ();
252b5132
RH
1411
1412 /* Insert unique names into hash table. The V850 instruction set
1413 has many identical opcode names that have different opcodes based
1414 on the operands. This hash table then provides a quick index to
1415 the first opcode with a particular name in the opcode table. */
1416
1417 op = v850_opcodes;
1418 while (op->name)
1419 {
28e4f854 1420 if (strcmp (prev_name, op->name))
252b5132
RH
1421 {
1422 prev_name = (char *) op->name;
1423 hash_insert (v850_hash, op->name, (char *) op);
1424 }
1425 op++;
1426 }
1427
1428 bfd_set_arch_mach (stdoutput, TARGET_ARCH, machine);
1429
1430 applicable = bfd_applicable_section_flags (stdoutput);
28e4f854 1431
252b5132
RH
1432 call_table_data_section = subseg_new (".call_table_data", 0);
1433 bfd_set_section_flags (stdoutput, call_table_data_section,
1434 applicable & (SEC_ALLOC | SEC_LOAD | SEC_RELOC
1435 | SEC_DATA | SEC_HAS_CONTENTS));
28e4f854 1436
252b5132
RH
1437 call_table_text_section = subseg_new (".call_table_text", 0);
1438 bfd_set_section_flags (stdoutput, call_table_text_section,
1439 applicable & (SEC_ALLOC | SEC_LOAD | SEC_READONLY
1440 | SEC_CODE));
28e4f854 1441
252b5132
RH
1442 /* Restore text section as the current default. */
1443 subseg_set (text_section, 0);
1444}
1445
252b5132 1446static bfd_reloc_code_real_type
28e4f854 1447handle_ctoff (const struct v850_operand *operand)
252b5132
RH
1448{
1449 if (operand == NULL)
1450 return BFD_RELOC_V850_CALLT_16_16_OFFSET;
1451
28e4f854 1452 if (operand->bits != 6
252b5132
RH
1453 || operand->shift != 0)
1454 {
1455 as_bad (_("ctoff() relocation used on an instruction which does not support it"));
1456 return BFD_RELOC_64; /* Used to indicate an error condition. */
1457 }
28e4f854 1458
252b5132
RH
1459 return BFD_RELOC_V850_CALLT_6_7_OFFSET;
1460}
1461
1462static bfd_reloc_code_real_type
28e4f854 1463handle_sdaoff (const struct v850_operand *operand)
252b5132 1464{
28e4f854
KH
1465 if (operand == NULL)
1466 return BFD_RELOC_V850_SDA_16_16_OFFSET;
1467
1468 if (operand->bits == 15 && operand->shift == 17)
1469 return BFD_RELOC_V850_SDA_15_16_OFFSET;
1470
1471 if (operand->bits == -1)
1472 return BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET;
1473
1474 if (operand->bits != 16
252b5132
RH
1475 || operand->shift != 16)
1476 {
1477 as_bad (_("sdaoff() relocation used on an instruction which does not support it"));
1478 return BFD_RELOC_64; /* Used to indicate an error condition. */
1479 }
28e4f854 1480
252b5132
RH
1481 return BFD_RELOC_V850_SDA_16_16_OFFSET;
1482}
1483
1484static bfd_reloc_code_real_type
28e4f854 1485handle_zdaoff (const struct v850_operand *operand)
252b5132 1486{
28e4f854
KH
1487 if (operand == NULL)
1488 return BFD_RELOC_V850_ZDA_16_16_OFFSET;
1489
1490 if (operand->bits == 15 && operand->shift == 17)
1491 return BFD_RELOC_V850_ZDA_15_16_OFFSET;
252b5132 1492
28e4f854
KH
1493 if (operand->bits == -1)
1494 return BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET;
1495
1496 if (operand->bits != 16
252b5132
RH
1497 || operand->shift != 16)
1498 {
1499 as_bad (_("zdaoff() relocation used on an instruction which does not support it"));
28e4f854
KH
1500 /* Used to indicate an error condition. */
1501 return BFD_RELOC_64;
252b5132 1502 }
28e4f854 1503
252b5132
RH
1504 return BFD_RELOC_V850_ZDA_16_16_OFFSET;
1505}
1506
1507static bfd_reloc_code_real_type
28e4f854 1508handle_tdaoff (const struct v850_operand *operand)
252b5132 1509{
28e4f854
KH
1510 if (operand == NULL)
1511 /* Data item, not an instruction. */
1512 return BFD_RELOC_V850_TDA_7_7_OFFSET;
1513
1514 if (operand->bits == 6 && operand->shift == 1)
1515 /* sld.w/sst.w, operand: D8_6 */
1516 return BFD_RELOC_V850_TDA_6_8_OFFSET;
1517
1518 if (operand->bits == 4 && operand->insert != NULL)
1519 /* sld.hu, operand: D5-4 */
1520 return BFD_RELOC_V850_TDA_4_5_OFFSET;
1521
1522 if (operand->bits == 4 && operand->insert == NULL)
1523 /* sld.bu, operand: D4 */
1524 return BFD_RELOC_V850_TDA_4_4_OFFSET;
1525
1526 if (operand->bits == 16 && operand->shift == 16)
1527 /* set1 & chums, operands: D16 */
1528 return BFD_RELOC_V850_TDA_16_16_OFFSET;
1529
252b5132
RH
1530 if (operand->bits != 7)
1531 {
1532 as_bad (_("tdaoff() relocation used on an instruction which does not support it"));
28e4f854
KH
1533 /* Used to indicate an error condition. */
1534 return BFD_RELOC_64;
252b5132 1535 }
28e4f854 1536
252b5132 1537 return operand->insert != NULL
28e4f854
KH
1538 ? BFD_RELOC_V850_TDA_7_8_OFFSET /* sld.h/sst.h, operand: D8_7 */
1539 : BFD_RELOC_V850_TDA_7_7_OFFSET; /* sld.b/sst.b, opreand: D7 */
252b5132
RH
1540}
1541
1542/* Warning: The code in this function relies upon the definitions
1543 in the v850_operands[] array (defined in opcodes/v850-opc.c)
1544 matching the hard coded values contained herein. */
1545
1546static bfd_reloc_code_real_type
28e4f854 1547v850_reloc_prefix (const struct v850_operand *operand)
252b5132
RH
1548{
1549 boolean paren_skipped = false;
1550
252b5132 1551 /* Skip leading opening parenthesis. */
28e4f854 1552 if (*input_line_pointer == '(')
252b5132 1553 {
28e4f854 1554 ++input_line_pointer;
252b5132
RH
1555 paren_skipped = true;
1556 }
1557
1558#define CHECK_(name, reloc) \
1559 if (strncmp (input_line_pointer, name##"(", strlen (name) + 1) == 0) \
1560 { \
1561 input_line_pointer += strlen (name); \
1562 return reloc; \
1563 }
28e4f854
KH
1564
1565 CHECK_ ("hi0", BFD_RELOC_HI16 );
1566 CHECK_ ("hi", BFD_RELOC_HI16_S );
1567 CHECK_ ("lo", BFD_RELOC_LO16 );
252b5132
RH
1568 CHECK_ ("sdaoff", handle_sdaoff (operand));
1569 CHECK_ ("zdaoff", handle_zdaoff (operand));
1570 CHECK_ ("tdaoff", handle_tdaoff (operand));
28e4f854
KH
1571 CHECK_ ("hilo", BFD_RELOC_32 );
1572 CHECK_ ("ctoff", handle_ctoff (operand) );
1573
252b5132
RH
1574 /* Restore skipped parenthesis. */
1575 if (paren_skipped)
28e4f854
KH
1576 --input_line_pointer;
1577
252b5132
RH
1578 return BFD_RELOC_UNUSED;
1579}
1580
1581/* Insert an operand value into an instruction. */
1582
1583static unsigned long
1584v850_insert_operand (insn, operand, val, file, line, str)
28e4f854
KH
1585 unsigned long insn;
1586 const struct v850_operand *operand;
1587 offsetT val;
1588 char *file;
1589 unsigned int line;
1590 char *str;
252b5132
RH
1591{
1592 if (operand->insert)
1593 {
28e4f854
KH
1594 const char *message = NULL;
1595
1596 insn = operand->insert (insn, val, &message);
252b5132
RH
1597 if (message != NULL)
1598 {
1599 if ((operand->flags & V850_OPERAND_SIGNED)
1600 && ! warn_signed_overflows
1601 && strstr (message, "out of range") != NULL)
1602 {
28e4f854 1603 /* Skip warning... */
252b5132
RH
1604 }
1605 else if ((operand->flags & V850_OPERAND_SIGNED) == 0
1606 && ! warn_unsigned_overflows
1607 && strstr (message, "out of range") != NULL)
1608 {
28e4f854 1609 /* Skip warning... */
252b5132
RH
1610 }
1611 else if (str)
1612 {
1613 if (file == (char *) NULL)
1614 as_warn ("%s: %s", str, message);
1615 else
1616 as_warn_where (file, line, "%s: %s", str, message);
1617 }
1618 else
1619 {
1620 if (file == (char *) NULL)
1621 as_warn (message);
1622 else
1623 as_warn_where (file, line, message);
1624 }
1625 }
1626 }
1627 else
1628 {
1629 if (operand->bits != 32)
1630 {
28e4f854 1631 long min, max;
252b5132
RH
1632
1633 if ((operand->flags & V850_OPERAND_SIGNED) != 0)
1634 {
1635 if (! warn_signed_overflows)
1636 max = (1 << operand->bits) - 1;
1637 else
1638 max = (1 << (operand->bits - 1)) - 1;
28e4f854
KH
1639
1640 min = -(1 << (operand->bits - 1));
252b5132
RH
1641 }
1642 else
1643 {
1644 max = (1 << operand->bits) - 1;
28e4f854 1645
252b5132 1646 if (! warn_unsigned_overflows)
28e4f854 1647 min = -(1 << (operand->bits - 1));
252b5132
RH
1648 else
1649 min = 0;
1650 }
28e4f854 1651
252b5132
RH
1652 if (val < (offsetT) min || val > (offsetT) max)
1653 {
28e4f854
KH
1654 /* xgettext:c-format */
1655 const char *err =
1656 _("operand out of range (%s not between %ld and %ld)");
1657 char buf[100];
1658
252b5132
RH
1659 /* Restore min and mix to expected values for decimal ranges. */
1660 if ((operand->flags & V850_OPERAND_SIGNED)
1661 && ! warn_signed_overflows)
1662 max = (1 << (operand->bits - 1)) - 1;
1663
1664 if (! (operand->flags & V850_OPERAND_SIGNED)
1665 && ! warn_unsigned_overflows)
1666 min = 0;
1667
1668 if (str)
1669 {
1670 sprintf (buf, "%s: ", str);
28e4f854 1671
252b5132
RH
1672 sprint_value (buf + strlen (buf), val);
1673 }
1674 else
1675 sprint_value (buf, val);
28e4f854 1676
252b5132
RH
1677 if (file == (char *) NULL)
1678 as_warn (err, buf, min, max);
1679 else
1680 as_warn_where (file, line, err, buf, min, max);
1681 }
1682 }
1683
1684 insn |= (((long) val & ((1 << operand->bits) - 1)) << operand->shift);
1685 }
28e4f854 1686
252b5132
RH
1687 return insn;
1688}
252b5132 1689\f
28e4f854 1690static char copy_of_instruction[128];
252b5132
RH
1691
1692void
28e4f854
KH
1693md_assemble (str)
1694 char *str;
252b5132 1695{
28e4f854
KH
1696 char *s;
1697 char *start_of_operands;
1698 struct v850_opcode *opcode;
1699 struct v850_opcode *next_opcode;
1700 const unsigned char *opindex_ptr;
1701 int next_opindex;
1702 int relaxable = 0;
1703 unsigned long insn;
1704 unsigned long insn_size;
a8761a19 1705 unsigned long total_insn_size = 0;
28e4f854
KH
1706 char *f;
1707 int i;
1708 int match;
1709 boolean extra_data_after_insn = false;
1710 unsigned extra_data_len = 0;
1711 unsigned long extra_data = 0;
1712 char *saved_input_line_pointer;
1713
252b5132 1714 strncpy (copy_of_instruction, str, sizeof (copy_of_instruction) - 1);
28e4f854 1715
252b5132
RH
1716 /* Get the opcode. */
1717 for (s = str; *s != '\0' && ! isspace (*s); s++)
1718 continue;
28e4f854 1719
252b5132
RH
1720 if (*s != '\0')
1721 *s++ = '\0';
1722
28e4f854 1723 /* Find the first opcode with the proper name. */
252b5132
RH
1724 opcode = (struct v850_opcode *) hash_find (v850_hash, str);
1725 if (opcode == NULL)
1726 {
28e4f854 1727 /* xgettext:c-format */
252b5132
RH
1728 as_bad (_("Unrecognized opcode: `%s'"), str);
1729 ignore_rest_of_line ();
1730 return;
1731 }
1732
1733 str = s;
28e4f854
KH
1734 while (isspace (*str))
1735 ++str;
252b5132
RH
1736
1737 start_of_operands = str;
1738
1739 saved_input_line_pointer = input_line_pointer;
28e4f854 1740
252b5132
RH
1741 for (;;)
1742 {
28e4f854 1743 const char *errmsg = NULL;
252b5132
RH
1744
1745 match = 0;
28e4f854 1746
252b5132
RH
1747 if ((opcode->processors & processor_mask) == 0)
1748 {
1749 errmsg = _("Target processor does not support this instruction.");
1750 goto error;
1751 }
28e4f854 1752
252b5132
RH
1753 relaxable = 0;
1754 fc = 0;
1755 next_opindex = 0;
1756 insn = opcode->opcode;
1757 extra_data_after_insn = false;
1758
1759 input_line_pointer = str = start_of_operands;
1760
28e4f854 1761 for (opindex_ptr = opcode->operands; *opindex_ptr != 0; opindex_ptr++)
252b5132 1762 {
28e4f854
KH
1763 const struct v850_operand *operand;
1764 char *hold;
1765 expressionS ex;
1766 bfd_reloc_code_real_type reloc;
252b5132
RH
1767
1768 if (next_opindex == 0)
1769 {
28e4f854 1770 operand = &v850_operands[*opindex_ptr];
252b5132
RH
1771 }
1772 else
1773 {
28e4f854 1774 operand = &v850_operands[next_opindex];
252b5132
RH
1775 next_opindex = 0;
1776 }
1777
1778 errmsg = NULL;
1779
1780 while (*str == ' ' || *str == ',' || *str == '[' || *str == ']')
28e4f854 1781 ++str;
252b5132
RH
1782
1783 if (operand->flags & V850_OPERAND_RELAX)
1784 relaxable = 1;
1785
28e4f854 1786 /* Gather the operand. */
252b5132
RH
1787 hold = input_line_pointer;
1788 input_line_pointer = str;
28e4f854
KH
1789
1790 /* lo(), hi(), hi0(), etc... */
252b5132
RH
1791 if ((reloc = v850_reloc_prefix (operand)) != BFD_RELOC_UNUSED)
1792 {
1793 /* This is a fake reloc, used to indicate an error condition. */
1794 if (reloc == BFD_RELOC_64)
1795 {
1796 match = 1;
1797 goto error;
1798 }
28e4f854
KH
1799
1800 expression (&ex);
252b5132
RH
1801
1802 if (ex.X_op == O_constant)
1803 {
1804 switch (reloc)
1805 {
1806 case BFD_RELOC_V850_ZDA_16_16_OFFSET:
1807 /* To cope with "not1 7, zdaoff(0xfffff006)[r0]"
1808 and the like. */
1809 /* Fall through. */
28e4f854 1810
252b5132
RH
1811 case BFD_RELOC_LO16:
1812 {
1813 /* Truncate, then sign extend the value. */
1814 ex.X_add_number = SEXT16 (ex.X_add_number);
1815 break;
1816 }
1817
1818 case BFD_RELOC_HI16:
1819 {
1820 /* Truncate, then sign extend the value. */
1821 ex.X_add_number = SEXT16 (ex.X_add_number >> 16);
1822 break;
1823 }
1824
1825 case BFD_RELOC_HI16_S:
1826 {
1827 /* Truncate, then sign extend the value. */
28e4f854 1828 int temp = (ex.X_add_number >> 16) & 0xffff;
252b5132
RH
1829
1830 temp += (ex.X_add_number >> 15) & 1;
1831
1832 ex.X_add_number = SEXT16 (temp);
1833 break;
1834 }
28e4f854 1835
252b5132
RH
1836 case BFD_RELOC_32:
1837 if ((operand->flags & V850E_IMMEDIATE32) == 0)
1838 {
1839 errmsg = _("immediate operand is too large");
1840 goto error;
1841 }
28e4f854 1842
252b5132
RH
1843 extra_data_after_insn = true;
1844 extra_data_len = 4;
1845 extra_data = ex.X_add_number;
1846 ex.X_add_number = 0;
1847 break;
28e4f854 1848
252b5132
RH
1849 default:
1850 fprintf (stderr, "reloc: %d\n", reloc);
1851 as_bad (_("AAARG -> unhandled constant reloc"));
1852 break;
1853 }
1854
1855 if (fc > MAX_INSN_FIXUPS)
1856 as_fatal (_("too many fixups"));
28e4f854
KH
1857
1858 fixups[fc].exp = ex;
1859 fixups[fc].opindex = *opindex_ptr;
1860 fixups[fc].reloc = reloc;
252b5132
RH
1861 fc++;
1862 }
1863 else
1864 {
1865 if (reloc == BFD_RELOC_32)
1866 {
1867 if ((operand->flags & V850E_IMMEDIATE32) == 0)
1868 {
1869 errmsg = _("immediate operand is too large");
1870 goto error;
1871 }
28e4f854 1872
252b5132
RH
1873 extra_data_after_insn = true;
1874 extra_data_len = 4;
1875 extra_data = ex.X_add_number;
1876 }
28e4f854 1877
252b5132
RH
1878 if (fc > MAX_INSN_FIXUPS)
1879 as_fatal (_("too many fixups"));
1880
28e4f854
KH
1881 fixups[fc].exp = ex;
1882 fixups[fc].opindex = *opindex_ptr;
1883 fixups[fc].reloc = reloc;
252b5132
RH
1884 fc++;
1885 }
1886 }
1887 else
1888 {
1889 errmsg = NULL;
28e4f854
KH
1890
1891 if ((operand->flags & V850_OPERAND_REG) != 0)
252b5132 1892 {
28e4f854 1893 if (!register_name (&ex))
252b5132
RH
1894 {
1895 errmsg = _("invalid register name");
1896 }
1897 else if ((operand->flags & V850_NOT_R0)
28e4f854 1898 && ex.X_add_number == 0)
252b5132
RH
1899 {
1900 errmsg = _("register r0 cannot be used here");
28e4f854 1901
252b5132
RH
1902 /* Force an error message to be generated by
1903 skipping over any following potential matches
1904 for this opcode. */
1905 opcode += 3;
1906 }
1907 }
28e4f854 1908 else if ((operand->flags & V850_OPERAND_SRG) != 0)
252b5132 1909 {
28e4f854 1910 if (!system_register_name (&ex, true, false))
252b5132
RH
1911 {
1912 errmsg = _("invalid system register name");
1913 }
1914 }
1915 else if ((operand->flags & V850_OPERAND_EP) != 0)
1916 {
28e4f854
KH
1917 char *start = input_line_pointer;
1918 char c = get_symbol_end ();
1919
252b5132
RH
1920 if (strcmp (start, "ep") != 0 && strcmp (start, "r30") != 0)
1921 {
1922 /* Put things back the way we found them. */
1923 *input_line_pointer = c;
1924 input_line_pointer = start;
1925 errmsg = _("expected EP register");
1926 goto error;
1927 }
28e4f854 1928
252b5132
RH
1929 *input_line_pointer = c;
1930 str = input_line_pointer;
1931 input_line_pointer = hold;
28e4f854
KH
1932
1933 while (*str == ' ' || *str == ','
1934 || *str == '[' || *str == ']')
1935 ++str;
252b5132
RH
1936 continue;
1937 }
28e4f854 1938 else if ((operand->flags & V850_OPERAND_CC) != 0)
252b5132 1939 {
28e4f854 1940 if (!cc_name (&ex))
252b5132
RH
1941 {
1942 errmsg = _("invalid condition code name");
1943 }
1944 }
28e4f854 1945 else if (operand->flags & V850E_PUSH_POP)
252b5132 1946 {
28e4f854
KH
1947 errmsg = parse_register_list (&insn, operand);
1948
252b5132
RH
1949 /* The parse_register_list() function has already done
1950 everything, so fake a dummy expression. */
1951 ex.X_op = O_constant;
1952 ex.X_add_number = 0;
1953 }
28e4f854 1954 else if (operand->flags & V850E_IMMEDIATE16)
252b5132 1955 {
28e4f854 1956 expression (&ex);
252b5132
RH
1957
1958 if (ex.X_op != O_constant)
1959 errmsg = _("constant expression expected");
1960 else if (ex.X_add_number & 0xffff0000)
1961 {
1962 if (ex.X_add_number & 0xffff)
1963 errmsg = _("constant too big to fit into instruction");
1964 else if ((insn & 0x001fffc0) == 0x00130780)
1965 ex.X_add_number >>= 16;
1966 else
1967 errmsg = _("constant too big to fit into instruction");
1968 }
28e4f854 1969
252b5132
RH
1970 extra_data_after_insn = true;
1971 extra_data_len = 2;
1972 extra_data = ex.X_add_number;
1973 ex.X_add_number = 0;
1974 }
28e4f854 1975 else if (operand->flags & V850E_IMMEDIATE32)
252b5132 1976 {
28e4f854
KH
1977 expression (&ex);
1978
252b5132
RH
1979 if (ex.X_op != O_constant)
1980 errmsg = _("constant expression expected");
28e4f854 1981
252b5132
RH
1982 extra_data_after_insn = true;
1983 extra_data_len = 4;
1984 extra_data = ex.X_add_number;
1985 ex.X_add_number = 0;
1986 }
28e4f854 1987 else if (register_name (&ex)
252b5132
RH
1988 && (operand->flags & V850_OPERAND_REG) == 0)
1989 {
1990 char c;
28e4f854
KH
1991 int exists = 0;
1992
252b5132
RH
1993 /* It is possible that an alias has been defined that
1994 matches a register name. For example the code may
1995 include a ".set ZERO, 0" directive, which matches
1996 the register name "zero". Attempt to reparse the
1997 field as an expression, and only complain if we
1998 cannot generate a constant. */
1999
2000 input_line_pointer = str;
2001
2002 c = get_symbol_end ();
28e4f854 2003
252b5132
RH
2004 if (symbol_find (str) != NULL)
2005 exists = 1;
28e4f854
KH
2006
2007 *input_line_pointer = c;
252b5132 2008 input_line_pointer = str;
28e4f854
KH
2009
2010 expression (&ex);
252b5132
RH
2011
2012 if (ex.X_op != O_constant)
2013 {
2014 /* If this register is actually occuring too early on
2015 the parsing of the instruction, (because another
2016 field is missing) then report this. */
2017 if (opindex_ptr[1] != 0
28e4f854
KH
2018 && (v850_operands[opindex_ptr[1]].flags
2019 & V850_OPERAND_REG))
252b5132
RH
2020 errmsg = _("syntax error: value is missing before the register name");
2021 else
2022 errmsg = _("syntax error: register not expected");
2023
28e4f854
KH
2024 /* If we created a symbol in the process of this
2025 test then delete it now, so that it will not
2026 be output with the real symbols... */
252b5132
RH
2027 if (exists == 0
2028 && ex.X_op == O_symbol)
2029 symbol_remove (ex.X_add_symbol,
28e4f854 2030 &symbol_rootP, &symbol_lastP);
252b5132
RH
2031 }
2032 }
28e4f854 2033 else if (system_register_name (&ex, false, false)
252b5132
RH
2034 && (operand->flags & V850_OPERAND_SRG) == 0)
2035 {
2036 errmsg = _("syntax error: system register not expected");
2037 }
2038 else if (cc_name (&ex)
2039 && (operand->flags & V850_OPERAND_CC) == 0)
2040 {
2041 errmsg = _("syntax error: condition code not expected");
2042 }
2043 else
2044 {
28e4f854 2045 expression (&ex);
252b5132
RH
2046 /* Special case:
2047 If we are assembling a MOV instruction (or a CALLT.... :-)
2048 and the immediate value does not fit into the bits
2049 available then create a fake error so that the next MOV
2050 instruction will be selected. This one has a 32 bit
2051 immediate field. */
2052
2053 if (((insn & 0x07e0) == 0x0200)
2054 && ex.X_op == O_constant
28e4f854 2055 && (ex.X_add_number < (-(1 << (operand->bits - 1)))
252b5132
RH
2056 || ex.X_add_number > ((1 << operand->bits) - 1)))
2057 errmsg = _("immediate operand is too large");
2058 }
2059
2060 if (errmsg)
2061 goto error;
252b5132 2062
28e4f854
KH
2063#if 0
2064 fprintf (stderr,
2065 " insn: %x, operand %d, op: %d, add_number: %d\n",
2066 insn, opindex_ptr - opcode->operands,
2067 ex.X_op, ex.X_add_number);
2068#endif
2069
2070 switch (ex.X_op)
252b5132
RH
2071 {
2072 case O_illegal:
2073 errmsg = _("illegal operand");
2074 goto error;
2075 case O_absent:
2076 errmsg = _("missing operand");
2077 goto error;
2078 case O_register:
28e4f854
KH
2079 if ((operand->flags
2080 & (V850_OPERAND_REG | V850_OPERAND_SRG)) == 0)
252b5132
RH
2081 {
2082 errmsg = _("invalid operand");
2083 goto error;
2084 }
2085 insn = v850_insert_operand (insn, operand, ex.X_add_number,
2086 (char *) NULL, 0,
2087 copy_of_instruction);
2088 break;
2089
2090 case O_constant:
2091 insn = v850_insert_operand (insn, operand, ex.X_add_number,
2092 (char *) NULL, 0,
2093 copy_of_instruction);
2094 break;
2095
2096 default:
2097 /* We need to generate a fixup for this expression. */
2098 if (fc >= MAX_INSN_FIXUPS)
2099 as_fatal (_("too many fixups"));
2100
28e4f854
KH
2101 fixups[fc].exp = ex;
2102 fixups[fc].opindex = *opindex_ptr;
2103 fixups[fc].reloc = BFD_RELOC_UNUSED;
252b5132
RH
2104 ++fc;
2105 break;
2106 }
2107 }
2108
2109 str = input_line_pointer;
2110 input_line_pointer = hold;
2111
2112 while (*str == ' ' || *str == ',' || *str == '[' || *str == ']'
2113 || *str == ')')
2114 ++str;
2115 }
2116 match = 1;
2117
2118 error:
2119 if (match == 0)
28e4f854 2120 {
252b5132
RH
2121 next_opcode = opcode + 1;
2122 if (next_opcode->name != NULL
2123 && strcmp (next_opcode->name, opcode->name) == 0)
2124 {
2125 opcode = next_opcode;
2126
2127 /* Skip versions that are not supported by the target
2128 processor. */
2129 if ((opcode->processors & processor_mask) == 0)
2130 goto error;
28e4f854 2131
252b5132
RH
2132 continue;
2133 }
28e4f854 2134
252b5132 2135 as_bad ("%s: %s", copy_of_instruction, errmsg);
28e4f854
KH
2136
2137 if (*input_line_pointer == ']')
2138 ++input_line_pointer;
2139
252b5132
RH
2140 ignore_rest_of_line ();
2141 input_line_pointer = saved_input_line_pointer;
2142 return;
28e4f854 2143 }
252b5132
RH
2144 break;
2145 }
28e4f854 2146
252b5132
RH
2147 while (isspace (*str))
2148 ++str;
2149
2150 if (*str != '\0')
28e4f854 2151 /* xgettext:c-format */
252b5132
RH
2152 as_bad (_("junk at end of line: `%s'"), str);
2153
2154 input_line_pointer = str;
2155
28e4f854
KH
2156 /* Write out the instruction. */
2157
252b5132
RH
2158 if (relaxable && fc > 0)
2159 {
2160 insn_size = 2;
2161 fc = 0;
2162
2163 if (!strcmp (opcode->name, "br"))
2164 {
2165 f = frag_var (rs_machine_dependent, 4, 2, 2,
2166 fixups[0].exp.X_add_symbol,
2167 fixups[0].exp.X_add_number,
28e4f854 2168 (char *) fixups[0].opindex);
252b5132
RH
2169 md_number_to_chars (f, insn, insn_size);
2170 md_number_to_chars (f + 2, 0, 2);
2171 }
2172 else
2173 {
2174 f = frag_var (rs_machine_dependent, 6, 4, 0,
2175 fixups[0].exp.X_add_symbol,
2176 fixups[0].exp.X_add_number,
28e4f854 2177 (char *) fixups[0].opindex);
252b5132
RH
2178 md_number_to_chars (f, insn, insn_size);
2179 md_number_to_chars (f + 2, 0, 4);
2180 }
a8761a19 2181 total_insn_size = insn_size;
252b5132 2182 }
28e4f854 2183 else
252b5132
RH
2184 {
2185 /* Four byte insns have an opcode with the two high bits on. */
2186 if ((insn & 0x0600) == 0x0600)
2187 insn_size = 4;
2188 else
2189 insn_size = 2;
2190
28e4f854 2191 /* Special case: 32 bit MOV. */
252b5132
RH
2192 if ((insn & 0xffe0) == 0x0620)
2193 insn_size = 2;
28e4f854 2194
252b5132 2195 f = frag_more (insn_size);
a8761a19 2196 total_insn_size = insn_size;
28e4f854 2197
252b5132
RH
2198 md_number_to_chars (f, insn, insn_size);
2199
2200 if (extra_data_after_insn)
2201 {
2202 f = frag_more (extra_data_len);
a8761a19 2203 total_insn_size += extra_data_len;
28e4f854 2204
252b5132
RH
2205 md_number_to_chars (f, extra_data, extra_data_len);
2206
2207 extra_data_after_insn = false;
2208 }
2209 }
2210
2211 /* Create any fixups. At this point we do not use a
2212 bfd_reloc_code_real_type, but instead just use the
2213 BFD_RELOC_UNUSED plus the operand index. This lets us easily
2214 handle fixups for any operand type, although that is admittedly
2215 not a very exciting feature. We pick a BFD reloc type in
28e4f854 2216 md_apply_fix. */
252b5132
RH
2217 for (i = 0; i < fc; i++)
2218 {
28e4f854
KH
2219 const struct v850_operand *operand;
2220 bfd_reloc_code_real_type reloc;
2221
2222 operand = &v850_operands[fixups[i].opindex];
252b5132
RH
2223
2224 reloc = fixups[i].reloc;
28e4f854 2225
252b5132
RH
2226 if (reloc != BFD_RELOC_UNUSED)
2227 {
28e4f854
KH
2228 reloc_howto_type *reloc_howto =
2229 bfd_reloc_type_lookup (stdoutput, reloc);
2230 int size;
2231 int address;
2232 fixS *fixP;
252b5132
RH
2233
2234 if (!reloc_howto)
28e4f854
KH
2235 abort ();
2236
252b5132
RH
2237 size = bfd_get_reloc_size (reloc_howto);
2238
2239 /* XXX This will abort on an R_V850_8 reloc -
28e4f854
KH
2240 is this reloc actually used? */
2241 if (size != 2 && size != 4)
252b5132
RH
2242 abort ();
2243
2244 address = (f - frag_now->fr_literal) + insn_size - size;
2245
2246 if (reloc == BFD_RELOC_32)
28e4f854
KH
2247 address += 2;
2248
252b5132 2249 fixP = fix_new_exp (frag_now, address, size,
28e4f854 2250 &fixups[i].exp,
252b5132
RH
2251 reloc_howto->pc_relative,
2252 reloc);
2253
2254 switch (reloc)
2255 {
2256 case BFD_RELOC_LO16:
2257 case BFD_RELOC_HI16:
2258 case BFD_RELOC_HI16_S:
2259 fixP->fx_no_overflow = 1;
2260 break;
5480ccf3
NC
2261 default:
2262 break;
252b5132
RH
2263 }
2264 }
2265 else
2266 {
28e4f854 2267 fix_new_exp (frag_now,
252b5132
RH
2268 f - frag_now->fr_literal, 4,
2269 & fixups[i].exp,
28e4f854 2270 1 /* FIXME: V850_OPERAND_RELATIVE ??? */,
252b5132 2271 (bfd_reloc_code_real_type) (fixups[i].opindex
28e4f854 2272 + (int) BFD_RELOC_UNUSED));
252b5132
RH
2273 }
2274 }
2275
2276 input_line_pointer = saved_input_line_pointer;
a8761a19 2277
4dc7ead9 2278 dwarf2_emit_insn (total_insn_size);
252b5132
RH
2279}
2280
28e4f854
KH
2281/* If while processing a fixup, a reloc really needs to be created
2282 then it is done here. */
252b5132 2283
252b5132
RH
2284arelent *
2285tc_gen_reloc (seg, fixp)
28e4f854
KH
2286 asection *seg ATTRIBUTE_UNUSED;
2287 fixS *fixp;
252b5132 2288{
28e4f854
KH
2289 arelent *reloc;
2290
2291 reloc = (arelent *) xmalloc (sizeof (arelent));
2292 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
2293 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2294 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
2295 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
252b5132
RH
2296
2297 if (reloc->howto == (reloc_howto_type *) NULL)
2298 {
2299 as_bad_where (fixp->fx_file, fixp->fx_line,
28e4f854
KH
2300 /* xgettext:c-format */
2301 _("reloc %d not supported by object file format"),
252b5132
RH
2302 (int) fixp->fx_r_type);
2303
2304 xfree (reloc);
28e4f854 2305
252b5132
RH
2306 return NULL;
2307 }
28e4f854
KH
2308
2309 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY
252b5132
RH
2310 || fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT)
2311 reloc->addend = fixp->fx_offset;
2312 else
2313 reloc->addend = fixp->fx_addnumber;
28e4f854 2314
252b5132
RH
2315 return reloc;
2316}
2317
2318/* Assume everything will fit in two bytes, then expand as necessary. */
28e4f854 2319
252b5132
RH
2320int
2321md_estimate_size_before_relax (fragp, seg)
28e4f854
KH
2322 fragS *fragp;
2323 asection *seg ATTRIBUTE_UNUSED;
252b5132
RH
2324{
2325 if (fragp->fr_subtype == 0)
2326 fragp->fr_var = 4;
2327 else if (fragp->fr_subtype == 2)
2328 fragp->fr_var = 2;
2329 else
2330 abort ();
2331 return 2;
28e4f854 2332}
252b5132
RH
2333
2334long
2335v850_pcrel_from_section (fixp, section)
28e4f854
KH
2336 fixS *fixp;
2337 segT section;
252b5132
RH
2338{
2339 /* If the symbol is undefined, or in a section other than our own,
d6c497c7 2340 or it is weak (in which case it may well be in another section,
252b5132
RH
2341 then let the linker figure it out. */
2342 if (fixp->fx_addsy != (symbolS *) NULL
2343 && (! S_IS_DEFINED (fixp->fx_addsy)
d6c497c7 2344 || S_IS_WEAK (fixp->fx_addsy)
252b5132 2345 || (S_GET_SEGMENT (fixp->fx_addsy) != section)))
d6c497c7 2346 return 0;
28e4f854 2347
252b5132
RH
2348 return fixp->fx_frag->fr_address + fixp->fx_where;
2349}
2350
2351int
2352md_apply_fix3 (fixp, valuep, seg)
28e4f854
KH
2353 fixS *fixp;
2354 valueT *valuep;
2355 segT seg ATTRIBUTE_UNUSED;
252b5132
RH
2356{
2357 valueT value;
28e4f854 2358 char *where;
252b5132 2359
28e4f854 2360 if (fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
252b5132
RH
2361 || fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
2362 {
2363 fixp->fx_done = 0;
2364 return 1;
2365 }
2366
2367 if (fixp->fx_addsy == (symbolS *) NULL)
2368 {
28e4f854 2369 value = *valuep;
252b5132
RH
2370 fixp->fx_done = 1;
2371 }
2372 else if (fixp->fx_pcrel)
28e4f854 2373 value = *valuep;
252b5132
RH
2374 else
2375 {
2376 value = fixp->fx_offset;
2377 if (fixp->fx_subsy != (symbolS *) NULL)
2378 {
2379 if (S_GET_SEGMENT (fixp->fx_subsy) == absolute_section)
2380 value -= S_GET_VALUE (fixp->fx_subsy);
2381 else
2382 {
2383 /* We don't actually support subtracting a symbol. */
2384 as_bad_where (fixp->fx_file, fixp->fx_line,
2385 _("expression too complex"));
2386 }
2387 }
2388 }
2389
2390 if ((int) fixp->fx_r_type >= (int) BFD_RELOC_UNUSED)
2391 {
28e4f854
KH
2392 int opindex;
2393 const struct v850_operand *operand;
2394 unsigned long insn;
252b5132
RH
2395
2396 opindex = (int) fixp->fx_r_type - (int) BFD_RELOC_UNUSED;
28e4f854 2397 operand = &v850_operands[opindex];
252b5132
RH
2398
2399 /* Fetch the instruction, insert the fully resolved operand
2400 value, and stuff the instruction back again.
2401
2402 Note the instruction has been stored in little endian
2403 format! */
2404 where = fixp->fx_frag->fr_literal + fixp->fx_where;
2405
2406 insn = bfd_getl32 ((unsigned char *) where);
2407 insn = v850_insert_operand (insn, operand, (offsetT) value,
2408 fixp->fx_file, fixp->fx_line, NULL);
2409 bfd_putl32 ((bfd_vma) insn, (unsigned char *) where);
2410
2411 if (fixp->fx_done)
2412 {
28e4f854 2413 /* Nothing else to do here. */
252b5132
RH
2414 return 1;
2415 }
2416
28e4f854
KH
2417 /* Determine a BFD reloc value based on the operand information.
2418 We are only prepared to turn a few of the operands into relocs. */
252b5132
RH
2419
2420 if (operand->bits == 22)
2421 fixp->fx_r_type = BFD_RELOC_V850_22_PCREL;
2422 else if (operand->bits == 9)
2423 fixp->fx_r_type = BFD_RELOC_V850_9_PCREL;
2424 else
2425 {
28e4f854
KH
2426#if 0
2427 fprintf (stderr, "bits: %d, insn: %x\n", operand->bits, insn);
2428#endif
2429
252b5132 2430 as_bad_where (fixp->fx_file, fixp->fx_line,
28e4f854 2431 _("unresolved expression that must be resolved"));
252b5132
RH
2432 fixp->fx_done = 1;
2433 return 1;
2434 }
2435 }
2436 else if (fixp->fx_done)
2437 {
2438 /* We still have to insert the value into memory! */
2439 where = fixp->fx_frag->fr_literal + fixp->fx_where;
2440
2441 if (fixp->fx_size == 1)
28e4f854 2442 *where = value & 0xff;
252b5132
RH
2443 else if (fixp->fx_size == 2)
2444 bfd_putl16 (value & 0xffff, (unsigned char *) where);
2445 else if (fixp->fx_size == 4)
2446 bfd_putl32 (value, (unsigned char *) where);
2447 }
28e4f854 2448
252b5132
RH
2449 fixp->fx_addnumber = value;
2450 return 1;
2451}
252b5132
RH
2452\f
2453/* Parse a cons expression. We have to handle hi(), lo(), etc
2454 on the v850. */
28e4f854 2455
252b5132
RH
2456void
2457parse_cons_expression_v850 (exp)
28e4f854 2458 expressionS *exp;
252b5132
RH
2459{
2460 /* See if there's a reloc prefix like hi() we have to handle. */
2461 hold_cons_reloc = v850_reloc_prefix (NULL);
2462
2463 /* Do normal expression parsing. */
2464 expression (exp);
2465}
2466
2467/* Create a fixup for a cons expression. If parse_cons_expression_v850
2468 found a reloc prefix, then we use that reloc, else we choose an
2469 appropriate one based on the size of the expression. */
28e4f854 2470
252b5132
RH
2471void
2472cons_fix_new_v850 (frag, where, size, exp)
28e4f854 2473 fragS *frag;
252b5132
RH
2474 int where;
2475 int size;
2476 expressionS *exp;
2477{
2478 if (hold_cons_reloc == BFD_RELOC_UNUSED)
2479 {
2480 if (size == 4)
2481 hold_cons_reloc = BFD_RELOC_32;
2482 if (size == 2)
2483 hold_cons_reloc = BFD_RELOC_16;
2484 if (size == 1)
2485 hold_cons_reloc = BFD_RELOC_8;
2486 }
2487
2488 if (exp != NULL)
2489 fix_new_exp (frag, where, size, exp, 0, hold_cons_reloc);
2490 else
2491 fix_new (frag, where, size, NULL, 0, 0, hold_cons_reloc);
a8761a19
DD
2492
2493 hold_cons_reloc = BFD_RELOC_UNUSED;
252b5132 2494}
d6c497c7 2495
252b5132
RH
2496boolean
2497v850_fix_adjustable (fixP)
28e4f854 2498 fixS *fixP;
252b5132 2499{
252b5132
RH
2500 if (fixP->fx_addsy == NULL)
2501 return 1;
28e4f854
KH
2502
2503 /* Prevent all adjustments to global symbols. */
252b5132
RH
2504 if (S_IS_EXTERN (fixP->fx_addsy))
2505 return 0;
28e4f854 2506
5480ccf3 2507 /* Similarly for weak symbols. */
252b5132
RH
2508 if (S_IS_WEAK (fixP->fx_addsy))
2509 return 0;
28e4f854
KH
2510
2511 /* Don't adjust function names. */
252b5132
RH
2512 if (S_IS_FUNCTION (fixP->fx_addsy))
2513 return 0;
2514
28e4f854
KH
2515 /* We need the symbol name for the VTABLE entries. */
2516 if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
252b5132
RH
2517 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
2518 return 0;
28e4f854 2519
252b5132
RH
2520 return 1;
2521}
28e4f854 2522
252b5132 2523int
d6c497c7 2524v850_force_relocation (fixP)
28e4f854 2525 struct fix *fixP;
252b5132 2526{
d6c497c7
NC
2527 if (fixP->fx_addsy && S_IS_WEAK (fixP->fx_addsy))
2528 return 1;
28e4f854
KH
2529
2530 if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
d6c497c7 2531 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
252b5132 2532 return 1;
28e4f854 2533
252b5132
RH
2534 return 0;
2535}
This page took 0.231572 seconds and 4 git commands to generate.