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