1 /* tc-v850.c -- Assembler code for the NEC V850
2    Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
3    Free Software Foundation, Inc.
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>
23 #include "as.h"
24 #include "safe-ctype.h"
25 #include "subsegs.h"
26 #include "opcode/v850.h"
27 #include "dwarf2dbg.h"
28 
29 /* Sign-extend a 16-bit number.  */
30 #define SEXT16(x)	((((x) & 0xffff) ^ (~0x7fff)) + 0x8000)
31 
32 /* Temporarily holds the reloc in a cons expression.  */
33 static bfd_reloc_code_real_type hold_cons_reloc = BFD_RELOC_UNUSED;
34 
35 /* Set to TRUE if we want to be pedantic about signed overflows.  */
36 static bfd_boolean warn_signed_overflows   = FALSE;
37 static bfd_boolean warn_unsigned_overflows = FALSE;
38 
39 /* Indicates the target BFD machine number.  */
40 static int machine = -1;
41 
42 /* Indicates the target processor(s) for the assemble.  */
43 static int processor_mask = -1;
44 
45 /* Structure to hold information about predefined registers.  */
46 struct reg_name {
47   const char *name;
48   int value;
49 };
50 
51 /* Generic assembler global variables which must be defined by all
52    targets.  */
53 
54 /* Characters which always start a comment.  */
55 const char comment_chars[] = "#";
56 
57 /* Characters which start a comment at the beginning of a line.  */
58 const char line_comment_chars[] = ";#";
59 
60 /* Characters which may be used to separate multiple commands on a
61    single line.  */
62 const char line_separator_chars[] = ";";
63 
64 /* Characters which are used to indicate an exponent in a floating
65    point number.  */
66 const char EXP_CHARS[] = "eE";
67 
68 /* Characters which mean that a number is a floating point constant,
69    as in 0d1.0.  */
70 const char FLT_CHARS[] = "dD";
71 
72 const relax_typeS md_relax_table[] = {
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 
81 static int  v850_relax = 0;
82 
83 /* Fixups.  */
84 #define MAX_INSN_FIXUPS (5)
85 struct v850_fixup {
86   expressionS exp;
87   int opindex;
88   bfd_reloc_code_real_type reloc;
89 };
90 
91 struct v850_fixup fixups[MAX_INSN_FIXUPS];
92 static int fc;
93 
94 struct v850_seg_entry
95 {
96   segT s;
97   const char *name;
98   flagword flags;
99 };
100 
101 struct v850_seg_entry v850_seg_table[] =
102 {
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 };
139 
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 
155 static void do_v850_seg PARAMS ((int, subsegT));
156 
157 static void
158 do_v850_seg (i, sub)
159      int i;
160      subsegT sub;
161 {
162   struct v850_seg_entry *seg = v850_seg_table + i;
163 
164   obj_elf_section_change_hook ();
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     }
176 }
177 
178 static void v850_seg PARAMS ((int i));
179 
180 static void
181 v850_seg (i)
182      int i;
183 {
184   subsegT sub = get_absolute_expression ();
185 
186   do_v850_seg (i, sub);
187   demand_empty_rest_of_line ();
188 }
189 
190 static void v850_offset PARAMS ((int));
191 
192 static void
193 v850_offset (ignore)
194      int ignore ATTRIBUTE_UNUSED;
195 {
196   char *pfrag;
197   int temp = get_absolute_expression ();
198 
199   pfrag = frag_var (rs_org, 1, 1, (relax_substateT)0, (symbolS *)0,
200 		    (offsetT) temp, (char *) 0);
201   *pfrag = 0;
202 
203   demand_empty_rest_of_line ();
204 }
205 
206 /* Copied from obj_elf_common() in gas/config/obj-elf.c.  */
207 
208 static void v850_comm PARAMS ((int));
209 
210 static void
211 v850_comm (area)
212      int area;
213 {
214   char *name;
215   char c;
216   char *p;
217   int temp;
218   unsigned int size;
219   symbolS *symbolP;
220   int have_align;
221 
222   name = input_line_pointer;
223   c = get_symbol_end ();
224 
225   /* Just after name is now '\0'.  */
226   p = input_line_pointer;
227   *p = c;
228 
229   SKIP_WHITESPACE ();
230 
231   if (*input_line_pointer != ',')
232     {
233       as_bad (_("Expected comma after symbol-name"));
234       ignore_rest_of_line ();
235       return;
236     }
237 
238   /* Skip ','.  */
239   input_line_pointer++;
240 
241   if ((temp = get_absolute_expression ()) < 0)
242     {
243       /* xgettext:c-format  */
244       as_bad (_(".COMMon length (%d.) < 0! Ignored."), temp);
245       ignore_rest_of_line ();
246       return;
247     }
248 
249   size = temp;
250   *p = 0;
251   symbolP = symbol_find_or_make (name);
252   *p = c;
253 
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     }
260 
261   if (S_GET_VALUE (symbolP) != 0)
262     {
263       if (S_GET_VALUE (symbolP) != size)
264 	{
265 	  /* xgettext:c-format  */
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     }
270 
271   know (symbol_get_frag (symbolP) == &zero_address_frag);
272 
273   if (*input_line_pointer != ',')
274     have_align = 0;
275   else
276     {
277       have_align = 1;
278       input_line_pointer++;
279       SKIP_WHITESPACE ();
280     }
281 
282   if (! have_align || *input_line_pointer != '"')
283     {
284       if (! have_align)
285 	temp = 0;
286       else
287 	{
288 	  temp = get_absolute_expression ();
289 
290 	  if (temp < 0)
291 	    {
292 	      temp = 0;
293 	      as_warn (_("Common alignment negative; 0 assumed"));
294 	    }
295 	}
296 
297       if (symbol_get_obj (symbolP)->local)
298 	{
299 	  segT old_sec;
300 	  int old_subsec;
301 	  char *pfrag;
302 	  int align;
303 	  flagword applicable;
304 
305 	  old_sec = now_seg;
306 	  old_subsec = now_subseg;
307 
308 	  applicable = bfd_applicable_section_flags (stdoutput);
309 
310 	  applicable &= SEC_ALLOC;
311 
312 	  switch (area)
313 	    {
314 	    case SCOMMON_SECTION:
315 	      do_v850_seg (SBSS_SECTION, 0);
316 	      break;
317 
318 	    case ZCOMMON_SECTION:
319 	      do_v850_seg (ZBSS_SECTION, 0);
320 	      break;
321 
322 	    case TCOMMON_SECTION:
323 	      do_v850_seg (TBSS_SECTION, 0);
324 	      break;
325 	    }
326 
327 	  if (temp)
328 	    {
329 	      /* Convert to a power of 2 alignment.  */
330 	      for (align = 0; (temp & 1) == 0; temp >>= 1, ++align)
331 		;
332 
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;
342 
343 	  record_alignment (now_seg, align);
344 
345 	  if (align)
346 	    frag_align (align, 0, 0);
347 
348 	  switch (area)
349 	    {
350 	    case SCOMMON_SECTION:
351 	      if (S_GET_SEGMENT (symbolP) == v850_seg_table[SBSS_SECTION].s)
352 		symbol_get_frag (symbolP)->fr_symbol = 0;
353 	      break;
354 
355 	    case ZCOMMON_SECTION:
356 	      if (S_GET_SEGMENT (symbolP) == v850_seg_table[ZBSS_SECTION].s)
357 		symbol_get_frag (symbolP)->fr_symbol = 0;
358 	      break;
359 
360 	    case TCOMMON_SECTION:
361 	      if (S_GET_SEGMENT (symbolP) == v850_seg_table[TBSS_SECTION].s)
362 		symbol_get_frag (symbolP)->fr_symbol = 0;
363 	      break;
364 
365 	    default:
366 	      abort ();
367 	    }
368 
369 	  symbol_set_frag (symbolP, frag_now);
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);
374 
375 	  switch (area)
376 	    {
377 	    case SCOMMON_SECTION:
378 	      S_SET_SEGMENT (symbolP, v850_seg_table[SBSS_SECTION].s);
379 	      break;
380 
381 	    case ZCOMMON_SECTION:
382 	      S_SET_SEGMENT (symbolP, v850_seg_table[ZBSS_SECTION].s);
383 	      break;
384 
385 	    case TCOMMON_SECTION:
386 	      S_SET_SEGMENT (symbolP, v850_seg_table[TBSS_SECTION].s);
387 	      break;
388 
389 	    default:
390 	      abort ();
391 	    }
392 
393 	  S_CLEAR_EXTERNAL (symbolP);
394 	  obj_elf_section_change_hook ();
395 	  subseg_set (old_sec, old_subsec);
396 	}
397       else
398 	{
399 	  segT   old_sec;
400 	  int    old_subsec;
401 
402 	allocate_common:
403 	  old_sec = now_seg;
404 	  old_subsec = now_subseg;
405 
406 	  S_SET_VALUE (symbolP, (valueT) size);
407 	  S_SET_ALIGN (symbolP, temp);
408 	  S_SET_EXTERNAL (symbolP);
409 
410 	  switch (area)
411 	    {
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);
417 	      break;
418 
419 	    default:
420 	      abort ();
421 	    }
422 
423 	  obj_elf_section_change_hook ();
424 	  subseg_set (old_sec, old_subsec);
425 	}
426     }
427   else
428     {
429       input_line_pointer++;
430 
431       /* @@ Some use the dot, some don't.  Can we get some consistency??  */
432       if (*input_line_pointer == '.')
433 	input_line_pointer++;
434 
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 
449   symbol_get_bfdsym (symbolP)->flags |= BSF_OBJECT;
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 
469 static void set_machine PARAMS ((int));
470 
471 static void
472 set_machine (number)
473      int number;
474 {
475   machine = number;
476   bfd_set_arch_mach (stdoutput, TARGET_ARCH, machine);
477 
478   switch (machine)
479     {
480     case 0:		  processor_mask = PROCESSOR_V850;   break;
481     case bfd_mach_v850e:  processor_mask = PROCESSOR_V850E;  break;
482     case bfd_mach_v850e1: processor_mask = PROCESSOR_V850E;  break;
483     }
484 }
485 
486 static void v850_longcode PARAMS ((int));
487 
488 static void
489 v850_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
499 	as_warn (".longjump pseudo-op seen when not relaxing");
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 
512   if (type == 1)
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 
522 /* The target specific pseudo-ops which we support.  */
523 const pseudo_typeS md_pseudo_table[] =
524 {
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		},
543   { "v850e1",		set_machine,		bfd_mach_v850e1 	},
544   { "longcall",		v850_longcode,		1			},
545   { "longjump",		v850_longcode,		2			},
546   { NULL,		NULL,			0			}
547 };
548 
549 /* Opcode hash table.  */
550 static struct hash_control *v850_hash;
551 
552 /* This table is sorted.  Suitable for searching by a binary search.  */
553 static const struct reg_name pre_defined_registers[] =
554 {
555   { "ep",  30 },		/* ep - element ptr */
556   { "gp",   4 },		/* gp - global ptr  */
557   { "hp",   2 },		/* hp - handler stack ptr  */
558   { "lp",  31 },		/* lp - link ptr  */
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 },
591   { "sp",   3 },		/* sp - stack ptr  */
592   { "tp",   5 },		/* tp - text ptr  */
593   { "zero", 0 },
594 };
595 
596 #define REG_NAME_CNT						\
597   (sizeof (pre_defined_registers) / sizeof (struct reg_name))
598 
599 static 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 },
607   { "ctbp",  20 },
608   { "ctpc",  16 },
609   { "ctpsw", 17 },
610   { "dbpc",  18 },
611   { "dbpsw", 19 },
612   { "dir",   21 },
613   { "ecr",    4 },
614   { "eipc",   0 },
615   { "eipsw",  1 },
616   { "fepc",   2 },
617   { "fepsw",  3 },
618   { "psw",    5 },
619 };
620 
621 #define SYSREG_NAME_CNT						\
622   (sizeof (system_registers) / sizeof (struct reg_name))
623 
624 static const struct reg_name system_list_registers[] =
625 {
626   {"PS",      5 },
627   {"SR",      0 + 1}
628 };
629 
630 #define SYSREGLIST_NAME_CNT					\
631   (sizeof (system_list_registers) / sizeof (struct reg_name))
632 
633 static const struct reg_name cc_names[] =
634 {
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 };
658 
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.  */
665 
666 static int reg_name_search
667   PARAMS ((const struct reg_name *, int, const char *, bfd_boolean));
668 
669 static int
670 reg_name_search (regs, regcount, name, accept_numbers)
671      const struct reg_name *regs;
672      int regcount;
673      const char *name;
674      bfd_boolean accept_numbers;
675 {
676   int middle, low, high;
677   int cmp;
678   symbolS *symbolP;
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.  */
685       if (symbol_equated_p (symbolP))
686 	{
687 	  name
688 	    = S_GET_NAME (symbol_get_value_expression (symbolP)->X_add_symbol);
689 	}
690       else if (accept_numbers)
691 	{
692 	  int reg = S_GET_VALUE (symbolP);
693 
694 	  if (reg >= 0 && reg <= 31)
695 	    return reg;
696 	}
697 
698       /* Otherwise drop through and try parsing name normally.  */
699     }
700 
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 
719 /* Summary of register_name().
720 
721    in: Input_line_pointer points to 1st char of operand.
722 
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.  */
728 
729 static bfd_boolean register_name PARAMS ((expressionS *));
730 
731 static bfd_boolean
732 register_name (expressionP)
733      expressionS *expressionP;
734 {
735   int reg_number;
736   char *name;
737   char *start;
738   char c;
739 
740   /* Find the spelling of the operand.  */
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 
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)
753     {
754       expressionP->X_op		= O_register;
755       expressionP->X_add_number = reg_number;
756 
757       /* Make the rest nice.  */
758       expressionP->X_add_symbol = NULL;
759       expressionP->X_op_symbol  = NULL;
760 
761       return TRUE;
762     }
763   else
764     {
765       /* Reset the line as if we had not done anything.  */
766       input_line_pointer = start;
767 
768       return FALSE;
769     }
770 }
771 
772 /* Summary of system_register_name().
773 
774    in:  INPUT_LINE_POINTER points to 1st char of operand.
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 
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.  */
785 
786 static bfd_boolean system_register_name
787   PARAMS ((expressionS *, bfd_boolean, bfd_boolean));
788 
789 static bfd_boolean
790 system_register_name (expressionP, accept_numbers, accept_list_names)
791      expressionS *expressionP;
792      bfd_boolean accept_numbers;
793      bfd_boolean accept_list_names;
794 {
795   int reg_number;
796   char *name;
797   char *start;
798   char c;
799 
800   /* Find the spelling of the operand.  */
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 
807   /* Put back the delimiting char.  */
808   *input_line_pointer = c;
809 
810   if (reg_number < 0
811       && accept_numbers)
812     {
813       /* Reset input_line pointer.  */
814       input_line_pointer = start;
815 
816       if (ISDIGIT (*input_line_pointer))
817 	{
818 	  reg_number = strtol (input_line_pointer, &input_line_pointer, 10);
819 
820 	  /* Make sure that the register number is allowable.  */
821 	  if (reg_number < 0
822 	      || (reg_number > 5 && reg_number < 16)
823 	      || reg_number > 27)
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 
834 	  /* Put back the delimiting char.  */
835 	  *input_line_pointer = c;
836 	}
837     }
838 
839   /* Look to see if it's in the register table.  */
840   if (reg_number >= 0)
841     {
842       expressionP->X_op		= O_register;
843       expressionP->X_add_number = reg_number;
844 
845       /* Make the rest nice.  */
846       expressionP->X_add_symbol = NULL;
847       expressionP->X_op_symbol  = NULL;
848 
849       return TRUE;
850     }
851   else
852     {
853       /* Reset the line as if we had not done anything.  */
854       input_line_pointer = start;
855 
856       return FALSE;
857     }
858 }
859 
860 /* Summary of cc_name().
861 
862    in: INPUT_LINE_POINTER points to 1st char of operand.
863 
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.  */
869 
870 static bfd_boolean cc_name PARAMS ((expressionS *));
871 
872 static bfd_boolean
873 cc_name (expressionP)
874      expressionS *expressionP;
875 {
876   int reg_number;
877   char *name;
878   char *start;
879   char c;
880 
881   /* Find the spelling of the operand.  */
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 
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)
892     {
893       expressionP->X_op		= O_constant;
894       expressionP->X_add_number = reg_number;
895 
896       /* Make the rest nice.  */
897       expressionP->X_add_symbol = NULL;
898       expressionP->X_op_symbol  = NULL;
899 
900       return TRUE;
901     }
902   else
903     {
904       /* Reset the line as if we had not done anything.  */
905       input_line_pointer = start;
906 
907       return FALSE;
908     }
909 }
910 
911 static void skip_white_space PARAMS ((void));
912 
913 static void
914 skip_white_space ()
915 {
916   while (*input_line_pointer == ' '
917 	 || *input_line_pointer == '\t')
918     ++input_line_pointer;
919 }
920 
921 /* Summary of parse_register_list ().
922 
923    in: INPUT_LINE_POINTER  points to 1st char of a list of registers.
924        INSN		   is the partially constructed instruction.
925        OPERAND		   is the operand being inserted.
926 
927    out: NULL if the parse completed successfully, otherwise a
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 
932    Parses register lists with the syntax:
933 
934      { rX }
935      { rX, rY }
936      { rX - rY }
937      { rX - rY, rZ }
938      etc
939 
940    and also parses constant expressions whoes bits indicate the
941    registers in the lists.  The LSB in the expression refers to
942    the lowest numbered permissible register in the register list,
943    and so on upwards.  System registers are considered to be very
944    high numbers.  */
945 
946 static char *parse_register_list
947   PARAMS ((unsigned long *, const struct v850_operand *));
948 
949 static char *
950 parse_register_list (insn, operand)
951      unsigned long *insn;
952      const struct v850_operand *operand;
953 {
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;
967   expressionS exp;
968 
969   /* Select a register array to parse.  */
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.  */
985   if (*input_line_pointer != '{')
986     {
987       int reg;
988       int i;
989 
990       expression (&exp);
991 
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");
999 
1000 	  for (reg = 20; reg < 32; reg++)
1001 	    if (exp.X_add_number & (1 << (reg - 20)))
1002 	      {
1003 		for (i = 0; i < 32; i++)
1004 		  if (regs[i] == reg)
1005 		    *insn |= (1 << i);
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");
1012 
1013 	  for (reg = 1; reg < 16; reg++)
1014 	    if (exp.X_add_number & (1 << (reg - 1)))
1015 	      {
1016 		for (i = 0; i < 32; i++)
1017 		  if (regs[i] == reg)
1018 		    *insn |= (1 << i);
1019 	      }
1020 
1021 	  if (exp.X_add_number & (1 << 15))
1022 	    *insn |= (1 << 3);
1023 
1024 	  if (exp.X_add_number & (1 << 16))
1025 	    *insn |= (1 << 19);
1026 	}
1027       else /* regs == type3_regs  */
1028 	{
1029 	  if (exp.X_add_number & 0xFFFE0000)
1030 	    return _("high bits set in register list expression");
1031 
1032 	  for (reg = 16; reg < 32; reg++)
1033 	    if (exp.X_add_number & (1 << (reg - 16)))
1034 	      {
1035 		for (i = 0; i < 32; i++)
1036 		  if (regs[i] == reg)
1037 		    *insn |= (1 << i);
1038 	      }
1039 
1040 	  if (exp.X_add_number & (1 << 16))
1041 	    *insn |= (1 << 19);
1042 	}
1043 
1044       return NULL;
1045     }
1046 
1047   input_line_pointer++;
1048 
1049   /* Parse the register list until a terminator (closing curly brace or
1050      new-line) is found.  */
1051   for (;;)
1052     {
1053       if (register_name (&exp))
1054 	{
1055 	  int i;
1056 
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 	    {
1061 	      if (regs[i] == exp.X_add_number)
1062 		{
1063 		  *insn |= (1 << i);
1064 		  break;
1065 		}
1066 	    }
1067 
1068 	  if (i == 32)
1069 	    return _("illegal register included in list");
1070 	}
1071       else if (system_register_name (&exp, TRUE, TRUE))
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
1082 		*insn |= 0x8;
1083 	    }
1084 	  else if (exp.X_add_number < 4)
1085 	    *insn |= 0x80000;
1086 	  else
1087 	    return _("High value system registers cannot be included in list");
1088 	}
1089       else if (*input_line_pointer == '}')
1090 	{
1091 	  input_line_pointer++;
1092 	  break;
1093 	}
1094       else if (*input_line_pointer == ',')
1095 	{
1096 	  input_line_pointer++;
1097 	  continue;
1098 	}
1099       else if (*input_line_pointer == '-')
1100 	{
1101 	  /* We have encountered a range of registers: rX - rY.  */
1102 	  int j;
1103 	  expressionS exp2;
1104 
1105 	  /* Skip the dash.  */
1106 	  ++input_line_pointer;
1107 
1108 	  /* Get the second register in the range.  */
1109 	  if (! register_name (&exp2))
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 	    {
1118 	      int i;
1119 
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 		{
1124 		  if (regs[i] == j)
1125 		    {
1126 		      *insn |= (1 << i);
1127 		      break;
1128 		    }
1129 		}
1130 
1131 	      if (i == 32)
1132 		return _("illegal register included in list");
1133 	    }
1134 	}
1135       else
1136 	break;
1137 
1138       skip_white_space ();
1139     }
1140 
1141   return NULL;
1142 }
1143 
1144 const char *md_shortopts = "m:";
1145 
1146 struct option md_longopts[] = {
1147   {NULL, no_argument, NULL, 0}
1148 };
1149 
1150 size_t md_longopts_size = sizeof (md_longopts);
1151 
1152 void
1153 md_show_usage (stream)
1154      FILE *stream;
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"));
1161   fprintf (stream, _("  -mv850e1                  The code is targeted at the v850e1\n"));
1162   fprintf (stream, _("  -mv850any                 The code is generic, despite any processor specific instructions\n"));
1163   fprintf (stream, _("  -mrelax                   Enable relaxation\n"));
1164 }
1165 
1166 int
1167 md_parse_option (c, arg)
1168      int c;
1169      char *arg;
1170 {
1171   if (c != 'm')
1172     {
1173       if (c != 'a')
1174 	/* xgettext:c-format  */
1175 	fprintf (stderr, _("unknown command line option: -%c%s\n"), c, arg);
1176       return 0;
1177     }
1178 
1179   if (strcmp (arg, "warn-signed-overflow") == 0)
1180     {
1181       warn_signed_overflows = TRUE;
1182     }
1183   else if (strcmp (arg, "warn-unsigned-overflow") == 0)
1184     {
1185       warn_unsigned_overflows = TRUE;
1186     }
1187   else if (strcmp (arg, "v850") == 0)
1188     {
1189       machine = 0;
1190       processor_mask = PROCESSOR_V850;
1191     }
1192   else if (strcmp (arg, "v850e") == 0)
1193     {
1194       machine = bfd_mach_v850e;
1195       processor_mask = PROCESSOR_V850E;
1196     }
1197   else if (strcmp (arg, "v850e1") == 0)
1198     {
1199       machine = bfd_mach_v850e1;
1200       processor_mask = PROCESSOR_V850E1;
1201     }
1202   else if (strcmp (arg, "v850any") == 0)
1203     {
1204       /* Tell the world that this is for any v850 chip.  */
1205       machine = 0;
1206 
1207       /* But support instructions for the extended versions.  */
1208       processor_mask = PROCESSOR_V850E;
1209       processor_mask |= PROCESSOR_V850E1;
1210     }
1211   else if (strcmp (arg, "relax") == 0)
1212     v850_relax = 1;
1213   else
1214     {
1215       /* xgettext:c-format  */
1216       fprintf (stderr, _("unknown command line option: -%c%s\n"), c, arg);
1217       return 0;
1218     }
1219 
1220   return 1;
1221 }
1222 
1223 symbolS *
1224 md_undefined_symbol (name)
1225      char *name ATTRIBUTE_UNUSED;
1226 {
1227   return 0;
1228 }
1229 
1230 char *
1231 md_atof (type, litp, sizep)
1232      int type;
1233      char *litp;
1234      int *sizep;
1235 {
1236   int prec;
1237   LITTLENUM_TYPE words[4];
1238   char *t;
1239   int i;
1240 
1241   switch (type)
1242     {
1243     case 'f':
1244       prec = 2;
1245       break;
1246 
1247     case 'd':
1248       prec = 4;
1249       break;
1250 
1251     default:
1252       *sizep = 0;
1253       return _("bad call to md_atof");
1254     }
1255 
1256   t = atof_ieee (input_line_pointer, type, words);
1257   if (t)
1258     input_line_pointer = t;
1259 
1260   *sizep = prec * 2;
1261 
1262   for (i = prec - 1; i >= 0; i--)
1263     {
1264       md_number_to_chars (litp, (valueT) words[i], 2);
1265       litp += 2;
1266     }
1267 
1268   return NULL;
1269 }
1270 
1271 /* Very gross.  */
1272 
1273 void
1274 md_convert_frag (abfd, sec, fragP)
1275      bfd *abfd ATTRIBUTE_UNUSED;
1276      asection *sec;
1277      fragS *fragP;
1278 {
1279   subseg_change (sec, 0);
1280 
1281   /* In range conditional or unconditional branch.  */
1282   if (fragP->fr_subtype == 0 || fragP->fr_subtype == 2)
1283     {
1284       fix_new (fragP, fragP->fr_fix, 2, fragP->fr_symbol,
1285 	       fragP->fr_offset, 1, BFD_RELOC_UNUSED + (int)fragP->fr_opcode);
1286       fragP->fr_fix += 2;
1287     }
1288   /* Out of range conditional branch.  Emit a branch around a jump.  */
1289   else if (fragP->fr_subtype == 1)
1290     {
1291       unsigned char *buffer =
1292 	(unsigned char *) (fragP->fr_fix + fragP->fr_literal);
1293 
1294       /* Reverse the condition of the first branch.  */
1295       buffer[0] ^= 0x08;
1296       /* Mask off all the displacement bits.  */
1297       buffer[0] &= 0x8f;
1298       buffer[1] &= 0x07;
1299       /* Now set the displacement bits so that we branch
1300 	 around the unconditional branch.  */
1301       buffer[0] |= 0x30;
1302 
1303       /* Now create the unconditional branch + fixup to the final
1304 	 target.  */
1305       md_number_to_chars (buffer + 2, 0x00000780, 4);
1306       fix_new (fragP, fragP->fr_fix + 2, 4, fragP->fr_symbol,
1307 	       fragP->fr_offset, 1, BFD_RELOC_UNUSED +
1308 	       (int) fragP->fr_opcode + 1);
1309       fragP->fr_fix += 6;
1310     }
1311   /* Out of range unconditional branch.  Emit a jump.  */
1312   else if (fragP->fr_subtype == 3)
1313     {
1314       md_number_to_chars (fragP->fr_fix + fragP->fr_literal, 0x00000780, 4);
1315       fix_new (fragP, fragP->fr_fix, 4, fragP->fr_symbol,
1316 	       fragP->fr_offset, 1, BFD_RELOC_UNUSED +
1317 	       (int) fragP->fr_opcode + 1);
1318       fragP->fr_fix += 4;
1319     }
1320   else
1321     abort ();
1322 }
1323 
1324 valueT
1325 md_section_align (seg, addr)
1326      asection *seg;
1327      valueT addr;
1328 {
1329   int align = bfd_get_section_alignment (stdoutput, seg);
1330   return ((addr + (1 << align) - 1) & (-1 << align));
1331 }
1332 
1333 void
1334 md_begin ()
1335 {
1336   char *prev_name = "";
1337   const struct v850_opcode *op;
1338 
1339   if (strncmp (TARGET_CPU, "v850e1", 6) == 0)
1340     {
1341       if (machine == -1)
1342 	machine = bfd_mach_v850e1;
1343 
1344       if (processor_mask == -1)
1345 	processor_mask = PROCESSOR_V850E1;
1346     }
1347   else if (strncmp (TARGET_CPU, "v850e", 5) == 0)
1348     {
1349       if (machine == -1)
1350 	machine = bfd_mach_v850e;
1351 
1352       if (processor_mask == -1)
1353 	processor_mask = PROCESSOR_V850E;
1354     }
1355   else if (strncmp (TARGET_CPU, "v850", 4) == 0)
1356     {
1357       if (machine == -1)
1358 	machine = 0;
1359 
1360       if (processor_mask == -1)
1361 	processor_mask = PROCESSOR_V850;
1362     }
1363   else
1364     /* xgettext:c-format  */
1365     as_bad (_("Unable to determine default target processor from string: %s"),
1366 	    TARGET_CPU);
1367 
1368   v850_hash = hash_new ();
1369 
1370   /* Insert unique names into hash table.  The V850 instruction set
1371      has many identical opcode names that have different opcodes based
1372      on the operands.  This hash table then provides a quick index to
1373      the first opcode with a particular name in the opcode table.  */
1374   op = v850_opcodes;
1375   while (op->name)
1376     {
1377       if (strcmp (prev_name, op->name))
1378 	{
1379 	  prev_name = (char *) op->name;
1380 	  hash_insert (v850_hash, op->name, (char *) op);
1381 	}
1382       op++;
1383     }
1384 
1385   v850_seg_table[BSS_SECTION].s = bss_section;
1386   bfd_set_arch_mach (stdoutput, TARGET_ARCH, machine);
1387 }
1388 
1389 static bfd_reloc_code_real_type handle_ctoff
1390   PARAMS ((const struct v850_operand *));
1391 
1392 static bfd_reloc_code_real_type
1393 handle_ctoff (operand)
1394      const struct v850_operand *operand;
1395 {
1396   if (operand == NULL)
1397     return BFD_RELOC_V850_CALLT_16_16_OFFSET;
1398 
1399   if (operand->bits != 6
1400       || operand->shift != 0)
1401     {
1402       as_bad (_("ctoff() relocation used on an instruction which does not support it"));
1403       return BFD_RELOC_64;  /* Used to indicate an error condition.  */
1404     }
1405 
1406   return BFD_RELOC_V850_CALLT_6_7_OFFSET;
1407 }
1408 
1409 static bfd_reloc_code_real_type handle_sdaoff
1410   PARAMS ((const struct v850_operand *));
1411 
1412 static bfd_reloc_code_real_type
1413 handle_sdaoff (operand)
1414      const struct v850_operand *operand;
1415 {
1416   if (operand == NULL)
1417     return BFD_RELOC_V850_SDA_16_16_OFFSET;
1418 
1419   if (operand->bits == 15 && operand->shift == 17)
1420     return BFD_RELOC_V850_SDA_15_16_OFFSET;
1421 
1422   if (operand->bits == -1)
1423     return BFD_RELOC_V850_SDA_16_16_SPLIT_OFFSET;
1424 
1425   if (operand->bits != 16
1426       || operand->shift != 16)
1427     {
1428       as_bad (_("sdaoff() relocation used on an instruction which does not support it"));
1429       return BFD_RELOC_64;  /* Used to indicate an error condition.  */
1430     }
1431 
1432   return BFD_RELOC_V850_SDA_16_16_OFFSET;
1433 }
1434 
1435 static bfd_reloc_code_real_type handle_zdaoff
1436   PARAMS ((const struct v850_operand *));
1437 
1438 static bfd_reloc_code_real_type
1439 handle_zdaoff (operand)
1440      const struct v850_operand *operand;
1441 {
1442   if (operand == NULL)
1443     return BFD_RELOC_V850_ZDA_16_16_OFFSET;
1444 
1445   if (operand->bits == 15 && operand->shift == 17)
1446     return BFD_RELOC_V850_ZDA_15_16_OFFSET;
1447 
1448   if (operand->bits == -1)
1449     return BFD_RELOC_V850_ZDA_16_16_SPLIT_OFFSET;
1450 
1451   if (operand->bits != 16
1452       || operand->shift != 16)
1453     {
1454       as_bad (_("zdaoff() relocation used on an instruction which does not support it"));
1455       /* Used to indicate an error condition.  */
1456       return BFD_RELOC_64;
1457     }
1458 
1459   return BFD_RELOC_V850_ZDA_16_16_OFFSET;
1460 }
1461 
1462 static bfd_reloc_code_real_type handle_tdaoff
1463   PARAMS ((const struct v850_operand *));
1464 
1465 static bfd_reloc_code_real_type
1466 handle_tdaoff (operand)
1467      const struct v850_operand *operand;
1468 {
1469   if (operand == NULL)
1470     /* Data item, not an instruction.  */
1471     return BFD_RELOC_V850_TDA_7_7_OFFSET;
1472 
1473   if (operand->bits == 6 && operand->shift == 1)
1474     /* sld.w/sst.w, operand: D8_6  */
1475     return BFD_RELOC_V850_TDA_6_8_OFFSET;
1476 
1477   if (operand->bits == 4 && operand->insert != NULL)
1478     /* sld.hu, operand: D5-4  */
1479     return BFD_RELOC_V850_TDA_4_5_OFFSET;
1480 
1481   if (operand->bits == 4 && operand->insert == NULL)
1482     /* sld.bu, operand: D4   */
1483     return BFD_RELOC_V850_TDA_4_4_OFFSET;
1484 
1485   if (operand->bits == 16 && operand->shift == 16)
1486     /* set1 & chums, operands: D16  */
1487     return BFD_RELOC_V850_TDA_16_16_OFFSET;
1488 
1489   if (operand->bits != 7)
1490     {
1491       as_bad (_("tdaoff() relocation used on an instruction which does not support it"));
1492       /* Used to indicate an error condition.  */
1493       return BFD_RELOC_64;
1494     }
1495 
1496   return  operand->insert != NULL
1497     ? BFD_RELOC_V850_TDA_7_8_OFFSET     /* sld.h/sst.h, operand: D8_7  */
1498     : BFD_RELOC_V850_TDA_7_7_OFFSET;    /* sld.b/sst.b, operand: D7    */
1499 }
1500 
1501 /* Warning: The code in this function relies upon the definitions
1502    in the v850_operands[] array (defined in opcodes/v850-opc.c)
1503    matching the hard coded values contained herein.  */
1504 
1505 static bfd_reloc_code_real_type v850_reloc_prefix
1506   PARAMS ((const struct v850_operand *));
1507 
1508 static bfd_reloc_code_real_type
1509 v850_reloc_prefix (operand)
1510      const struct v850_operand *operand;
1511 {
1512   bfd_boolean paren_skipped = FALSE;
1513 
1514   /* Skip leading opening parenthesis.  */
1515   if (*input_line_pointer == '(')
1516     {
1517       ++input_line_pointer;
1518       paren_skipped = TRUE;
1519     }
1520 
1521 #define CHECK_(name, reloc) 						\
1522   if (strncmp (input_line_pointer, name "(", strlen (name) + 1) == 0)	\
1523     {									\
1524       input_line_pointer += strlen (name);				\
1525       return reloc;							\
1526     }
1527 
1528   CHECK_ ("hi0",    BFD_RELOC_HI16	   );
1529   CHECK_ ("hi",	    BFD_RELOC_HI16_S	   );
1530   CHECK_ ("lo",	    BFD_RELOC_LO16	   );
1531   CHECK_ ("sdaoff", handle_sdaoff (operand));
1532   CHECK_ ("zdaoff", handle_zdaoff (operand));
1533   CHECK_ ("tdaoff", handle_tdaoff (operand));
1534   CHECK_ ("hilo",   BFD_RELOC_32	   );
1535   CHECK_ ("ctoff",  handle_ctoff (operand) );
1536 
1537   /* Restore skipped parenthesis.  */
1538   if (paren_skipped)
1539     --input_line_pointer;
1540 
1541   return BFD_RELOC_UNUSED;
1542 }
1543 
1544 /* Insert an operand value into an instruction.  */
1545 
1546 static unsigned long v850_insert_operand
1547   PARAMS ((unsigned long, const struct v850_operand *, offsetT, char *,
1548 	   unsigned int, char *));
1549 
1550 static unsigned long
1551 v850_insert_operand (insn, operand, val, file, line, str)
1552      unsigned long insn;
1553      const struct v850_operand *operand;
1554      offsetT val;
1555      char *file;
1556      unsigned int line;
1557      char *str;
1558 {
1559   if (operand->insert)
1560     {
1561       const char *message = NULL;
1562 
1563       insn = operand->insert (insn, val, &message);
1564       if (message != NULL)
1565 	{
1566 	  if ((operand->flags & V850_OPERAND_SIGNED)
1567 	      && ! warn_signed_overflows
1568 	      && strstr (message, "out of range") != NULL)
1569 	    {
1570 	      /* Skip warning...  */
1571 	    }
1572 	  else if ((operand->flags & V850_OPERAND_SIGNED) == 0
1573 		   && ! warn_unsigned_overflows
1574 		   && strstr (message, "out of range") != NULL)
1575 	    {
1576 	      /* Skip warning...  */
1577 	    }
1578 	  else if (str)
1579 	    {
1580 	      if (file == (char *) NULL)
1581 		as_warn ("%s: %s", str, message);
1582 	      else
1583 		as_warn_where (file, line, "%s: %s", str, message);
1584 	    }
1585 	  else
1586 	    {
1587 	      if (file == (char *) NULL)
1588 		as_warn (message);
1589 	      else
1590 		as_warn_where (file, line, message);
1591 	    }
1592 	}
1593     }
1594   else
1595     {
1596       if (operand->bits != 32)
1597 	{
1598 	  long min, max;
1599 
1600 	  if ((operand->flags & V850_OPERAND_SIGNED) != 0)
1601 	    {
1602 	      if (! warn_signed_overflows)
1603 		max = (1 << operand->bits) - 1;
1604 	      else
1605 		max = (1 << (operand->bits - 1)) - 1;
1606 
1607 	      min = -(1 << (operand->bits - 1));
1608 	    }
1609 	  else
1610 	    {
1611 	      max = (1 << operand->bits) - 1;
1612 
1613 	      if (! warn_unsigned_overflows)
1614 		min = -(1 << (operand->bits - 1));
1615 	      else
1616 		min = 0;
1617 	    }
1618 
1619 	  if (val < (offsetT) min || val > (offsetT) max)
1620 	    {
1621 	      /* xgettext:c-format  */
1622 	      const char *err =
1623 		_("operand out of range (%s not between %ld and %ld)");
1624 	      char buf[100];
1625 
1626 	      /* Restore min and mix to expected values for decimal ranges.  */
1627 	      if ((operand->flags & V850_OPERAND_SIGNED)
1628 		  && ! warn_signed_overflows)
1629 		max = (1 << (operand->bits - 1)) - 1;
1630 
1631 	      if (! (operand->flags & V850_OPERAND_SIGNED)
1632 		  && ! warn_unsigned_overflows)
1633 		min = 0;
1634 
1635 	      if (str)
1636 		{
1637 		  sprintf (buf, "%s: ", str);
1638 
1639 		  sprint_value (buf + strlen (buf), val);
1640 		}
1641 	      else
1642 		sprint_value (buf, val);
1643 
1644 	      if (file == (char *) NULL)
1645 		as_warn (err, buf, min, max);
1646 	      else
1647 		as_warn_where (file, line, err, buf, min, max);
1648 	    }
1649 	}
1650 
1651       insn |= (((long) val & ((1 << operand->bits) - 1)) << operand->shift);
1652     }
1653 
1654   return insn;
1655 }
1656 
1657 static char copy_of_instruction[128];
1658 
1659 void
1660 md_assemble (str)
1661      char *str;
1662 {
1663   char *s;
1664   char *start_of_operands;
1665   struct v850_opcode *opcode;
1666   struct v850_opcode *next_opcode;
1667   const unsigned char *opindex_ptr;
1668   int next_opindex;
1669   int relaxable = 0;
1670   unsigned long insn;
1671   unsigned long insn_size;
1672   char *f;
1673   int i;
1674   int match;
1675   bfd_boolean extra_data_after_insn = FALSE;
1676   unsigned extra_data_len = 0;
1677   unsigned long extra_data = 0;
1678   char *saved_input_line_pointer;
1679 
1680   strncpy (copy_of_instruction, str, sizeof (copy_of_instruction) - 1);
1681 
1682   /* Get the opcode.  */
1683   for (s = str; *s != '\0' && ! ISSPACE (*s); s++)
1684     continue;
1685 
1686   if (*s != '\0')
1687     *s++ = '\0';
1688 
1689   /* Find the first opcode with the proper name.  */
1690   opcode = (struct v850_opcode *) hash_find (v850_hash, str);
1691   if (opcode == NULL)
1692     {
1693       /* xgettext:c-format  */
1694       as_bad (_("Unrecognized opcode: `%s'"), str);
1695       ignore_rest_of_line ();
1696       return;
1697     }
1698 
1699   str = s;
1700   while (ISSPACE (*str))
1701     ++str;
1702 
1703   start_of_operands = str;
1704 
1705   saved_input_line_pointer = input_line_pointer;
1706 
1707   for (;;)
1708     {
1709       const char *errmsg = NULL;
1710 
1711       match = 0;
1712 
1713       if ((opcode->processors & processor_mask) == 0)
1714 	{
1715 	  errmsg = _("Target processor does not support this instruction.");
1716 	  goto error;
1717 	}
1718 
1719       relaxable = 0;
1720       fc = 0;
1721       next_opindex = 0;
1722       insn = opcode->opcode;
1723       extra_data_after_insn = FALSE;
1724 
1725       input_line_pointer = str = start_of_operands;
1726 
1727       for (opindex_ptr = opcode->operands; *opindex_ptr != 0; opindex_ptr++)
1728 	{
1729 	  const struct v850_operand *operand;
1730 	  char *hold;
1731 	  expressionS ex;
1732 	  bfd_reloc_code_real_type reloc;
1733 
1734 	  if (next_opindex == 0)
1735 	    {
1736 	      operand = &v850_operands[*opindex_ptr];
1737 	    }
1738 	  else
1739 	    {
1740 	      operand = &v850_operands[next_opindex];
1741 	      next_opindex = 0;
1742 	    }
1743 
1744 	  errmsg = NULL;
1745 
1746 	  while (*str == ' ' || *str == ',' || *str == '[' || *str == ']')
1747 	    ++str;
1748 
1749 	  if (operand->flags & V850_OPERAND_RELAX)
1750 	    relaxable = 1;
1751 
1752 	  /* Gather the operand.  */
1753 	  hold = input_line_pointer;
1754 	  input_line_pointer = str;
1755 
1756 	  /* lo(), hi(), hi0(), etc...  */
1757 	  if ((reloc = v850_reloc_prefix (operand)) != BFD_RELOC_UNUSED)
1758 	    {
1759 	      /* This is a fake reloc, used to indicate an error condition.  */
1760 	      if (reloc == BFD_RELOC_64)
1761 		{
1762 		  match = 1;
1763 		  goto error;
1764 		}
1765 
1766 	      expression (&ex);
1767 
1768 	      if (ex.X_op == O_constant)
1769 		{
1770 		  switch (reloc)
1771 		    {
1772 		    case BFD_RELOC_V850_ZDA_16_16_OFFSET:
1773 		      /* To cope with "not1 7, zdaoff(0xfffff006)[r0]"
1774 			 and the like.  */
1775 		      /* Fall through.  */
1776 
1777 		    case BFD_RELOC_LO16:
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.  */
1794 			int temp = (ex.X_add_number >> 16) & 0xffff;
1795 
1796 			temp += (ex.X_add_number >> 15) & 1;
1797 
1798 			ex.X_add_number = SEXT16 (temp);
1799 			break;
1800 		      }
1801 
1802 		    case BFD_RELOC_32:
1803 		      if ((operand->flags & V850E_IMMEDIATE32) == 0)
1804 			{
1805 			  errmsg = _("immediate operand is too large");
1806 			  goto error;
1807 			}
1808 
1809 		      extra_data_after_insn = TRUE;
1810 		      extra_data_len	    = 4;
1811 		      extra_data	    = 0;
1812 		      break;
1813 
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"));
1822 
1823 		  fixups[fc].exp     = ex;
1824 		  fixups[fc].opindex = *opindex_ptr;
1825 		  fixups[fc].reloc   = reloc;
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 			}
1837 
1838 		      extra_data_after_insn = TRUE;
1839 		      extra_data_len	    = 4;
1840 		      extra_data	    = ex.X_add_number;
1841 		    }
1842 
1843 		  if (fc > MAX_INSN_FIXUPS)
1844 		    as_fatal (_("too many fixups"));
1845 
1846 		  fixups[fc].exp     = ex;
1847 		  fixups[fc].opindex = *opindex_ptr;
1848 		  fixups[fc].reloc   = reloc;
1849 		  fc++;
1850 		}
1851 	    }
1852 	  else
1853 	    {
1854 	      errmsg = NULL;
1855 
1856 	      if ((operand->flags & V850_OPERAND_REG) != 0)
1857 		{
1858 		  if (!register_name (&ex))
1859 		    {
1860 		      errmsg = _("invalid register name");
1861 		    }
1862 		  else if ((operand->flags & V850_NOT_R0)
1863 			   && ex.X_add_number == 0)
1864 		    {
1865 		      errmsg = _("register r0 cannot be used here");
1866 
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 		}
1873 	      else if ((operand->flags & V850_OPERAND_SRG) != 0)
1874 		{
1875 		  if (!system_register_name (&ex, TRUE, FALSE))
1876 		    {
1877 		      errmsg = _("invalid system register name");
1878 		    }
1879 		}
1880 	      else if ((operand->flags & V850_OPERAND_EP) != 0)
1881 		{
1882 		  char *start = input_line_pointer;
1883 		  char c = get_symbol_end ();
1884 
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 		    }
1893 
1894 		  *input_line_pointer = c;
1895 		  str = input_line_pointer;
1896 		  input_line_pointer = hold;
1897 
1898 		  while (*str == ' ' || *str == ','
1899 			 || *str == '[' || *str == ']')
1900 		    ++str;
1901 		  continue;
1902 		}
1903 	      else if ((operand->flags & V850_OPERAND_CC) != 0)
1904 		{
1905 		  if (!cc_name (&ex))
1906 		    {
1907 		      errmsg = _("invalid condition code name");
1908 		    }
1909 		}
1910 	      else if (operand->flags & V850E_PUSH_POP)
1911 		{
1912 		  errmsg = parse_register_list (&insn, operand);
1913 
1914 		  /* The parse_register_list() function has already done
1915 		     everything, so fake a dummy expression.  */
1916 		  ex.X_op	  = O_constant;
1917 		  ex.X_add_number = 0;
1918 		}
1919 	      else if (operand->flags & V850E_IMMEDIATE16)
1920 		{
1921 		  expression (&ex);
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 		    }
1934 
1935 		  extra_data_after_insn = TRUE;
1936 		  extra_data_len	= 2;
1937 		  extra_data		= ex.X_add_number;
1938 		  ex.X_add_number	= 0;
1939 		}
1940 	      else if (operand->flags & V850E_IMMEDIATE32)
1941 		{
1942 		  expression (&ex);
1943 
1944 		  if (ex.X_op != O_constant)
1945 		    errmsg = _("constant expression expected");
1946 
1947 		  extra_data_after_insn = TRUE;
1948 		  extra_data_len	= 4;
1949 		  extra_data		= ex.X_add_number;
1950 		  ex.X_add_number	= 0;
1951 		}
1952 	      else if (register_name (&ex)
1953 		       && (operand->flags & V850_OPERAND_REG) == 0)
1954 		{
1955 		  char c;
1956 		  int exists = 0;
1957 
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 ();
1968 
1969 		  if (symbol_find (str) != NULL)
1970 		    exists = 1;
1971 
1972 		  *input_line_pointer = c;
1973 		  input_line_pointer = str;
1974 
1975 		  expression (&ex);
1976 
1977 		  if (ex.X_op != O_constant)
1978 		    {
1979 		      /* If this register is actually occurring too early on
1980 			 the parsing of the instruction, (because another
1981 			 field is missing) then report this.  */
1982 		      if (opindex_ptr[1] != 0
1983 			  && (v850_operands[opindex_ptr[1]].flags
1984 			      & V850_OPERAND_REG))
1985 			errmsg = _("syntax error: value is missing before the register name");
1986 		      else
1987 			errmsg = _("syntax error: register not expected");
1988 
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...  */
1992 		      if (exists == 0
1993 			  && ex.X_op == O_symbol)
1994 			symbol_remove (ex.X_add_symbol,
1995 				       &symbol_rootP, &symbol_lastP);
1996 		    }
1997 		}
1998 	      else if (system_register_name (&ex, FALSE, FALSE)
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 		{
2010 		  expression (&ex);
2011 		  /* Special case:
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.  */
2016 
2017 		  if (((insn & 0x07e0) == 0x0200)
2018 		      && operand->bits == 5 /* Do not match the CALLT instruction.  */
2019 		      && ex.X_op == O_constant
2020 		      && (ex.X_add_number < (-(1 << (operand->bits - 1)))
2021 			  || ex.X_add_number > ((1 << (operand->bits - 1)) - 1)))
2022 		    errmsg = _("immediate operand is too large");
2023 		}
2024 
2025 	      if (errmsg)
2026 		goto error;
2027 
2028 #if 0
2029 	      fprintf (stderr,
2030 		       " insn: %x, operand %d, op: %d, add_number: %d\n",
2031 		       insn, opindex_ptr - opcode->operands,
2032 		       ex.X_op, ex.X_add_number);
2033 #endif
2034 
2035 	      switch (ex.X_op)
2036 		{
2037 		case O_illegal:
2038 		  errmsg = _("illegal operand");
2039 		  goto error;
2040 		case O_absent:
2041 		  errmsg = _("missing operand");
2042 		  goto error;
2043 		case O_register:
2044 		  if ((operand->flags
2045 		       & (V850_OPERAND_REG | V850_OPERAND_SRG)) == 0)
2046 		    {
2047 		      errmsg = _("invalid operand");
2048 		      goto error;
2049 		    }
2050 		  insn = v850_insert_operand (insn, operand, ex.X_add_number,
2051 					      (char *) NULL, 0,
2052 					      copy_of_instruction);
2053 		  break;
2054 
2055 		case O_constant:
2056 		  insn = v850_insert_operand (insn, operand, ex.X_add_number,
2057 					      (char *) NULL, 0,
2058 					      copy_of_instruction);
2059 		  break;
2060 
2061 		default:
2062 		  /* We need to generate a fixup for this expression.  */
2063 		  if (fc >= MAX_INSN_FIXUPS)
2064 		    as_fatal (_("too many fixups"));
2065 
2066 		  fixups[fc].exp     = ex;
2067 		  fixups[fc].opindex = *opindex_ptr;
2068 		  fixups[fc].reloc   = BFD_RELOC_UNUSED;
2069 		  ++fc;
2070 		  break;
2071 		}
2072 	    }
2073 
2074 	  str = input_line_pointer;
2075 	  input_line_pointer = hold;
2076 
2077 	  while (*str == ' ' || *str == ',' || *str == '[' || *str == ']'
2078 		 || *str == ')')
2079 	    ++str;
2080 	}
2081       match = 1;
2082 
2083     error:
2084       if (match == 0)
2085 	{
2086 	  next_opcode = opcode + 1;
2087 	  if (next_opcode->name != NULL
2088 	      && strcmp (next_opcode->name, opcode->name) == 0)
2089 	    {
2090 	      opcode = next_opcode;
2091 
2092 	      /* Skip versions that are not supported by the target
2093 		 processor.  */
2094 	      if ((opcode->processors & processor_mask) == 0)
2095 		goto error;
2096 
2097 	      continue;
2098 	    }
2099 
2100 	  as_bad ("%s: %s", copy_of_instruction, errmsg);
2101 
2102 	  if (*input_line_pointer == ']')
2103 	    ++input_line_pointer;
2104 
2105 	  ignore_rest_of_line ();
2106 	  input_line_pointer = saved_input_line_pointer;
2107 	  return;
2108 	}
2109       break;
2110     }
2111 
2112   while (ISSPACE (*str))
2113     ++str;
2114 
2115   if (*str != '\0')
2116     /* xgettext:c-format  */
2117     as_bad (_("junk at end of line: `%s'"), str);
2118 
2119   input_line_pointer = str;
2120 
2121   /* Tie dwarf2 debug info to the address at the start of the insn.
2122      We can't do this after the insn has been output as the current
2123      frag may have been closed off.  eg. by frag_var.  */
2124   dwarf2_emit_insn (0);
2125 
2126   /* Write out the instruction.  */
2127 
2128   if (relaxable && fc > 0)
2129     {
2130       insn_size = 2;
2131       fc = 0;
2132 
2133       if (!strcmp (opcode->name, "br"))
2134 	{
2135 	  f = frag_var (rs_machine_dependent, 4, 2, 2,
2136 			fixups[0].exp.X_add_symbol,
2137 			fixups[0].exp.X_add_number,
2138 			(char *) fixups[0].opindex);
2139 	  md_number_to_chars (f, insn, insn_size);
2140 	  md_number_to_chars (f + 2, 0, 2);
2141 	}
2142       else
2143 	{
2144 	  f = frag_var (rs_machine_dependent, 6, 4, 0,
2145 			fixups[0].exp.X_add_symbol,
2146 			fixups[0].exp.X_add_number,
2147 			(char *) fixups[0].opindex);
2148 	  md_number_to_chars (f, insn, insn_size);
2149 	  md_number_to_chars (f + 2, 0, 4);
2150 	}
2151     }
2152   else
2153     {
2154       /* Four byte insns have an opcode with the two high bits on.  */
2155       if ((insn & 0x0600) == 0x0600)
2156 	insn_size = 4;
2157       else
2158 	insn_size = 2;
2159 
2160       /* Special case: 32 bit MOV.  */
2161       if ((insn & 0xffe0) == 0x0620)
2162 	insn_size = 2;
2163 
2164       f = frag_more (insn_size);
2165       md_number_to_chars (f, insn, insn_size);
2166 
2167       if (extra_data_after_insn)
2168 	{
2169 	  f = frag_more (extra_data_len);
2170 	  md_number_to_chars (f, extra_data, extra_data_len);
2171 
2172 	  extra_data_after_insn = FALSE;
2173 	}
2174     }
2175 
2176   /* Create any fixups.  At this point we do not use a
2177      bfd_reloc_code_real_type, but instead just use the
2178      BFD_RELOC_UNUSED plus the operand index.  This lets us easily
2179      handle fixups for any operand type, although that is admittedly
2180      not a very exciting feature.  We pick a BFD reloc type in
2181      md_apply_fix3.  */
2182   for (i = 0; i < fc; i++)
2183     {
2184       const struct v850_operand *operand;
2185       bfd_reloc_code_real_type reloc;
2186 
2187       operand = &v850_operands[fixups[i].opindex];
2188 
2189       reloc = fixups[i].reloc;
2190 
2191       if (reloc != BFD_RELOC_UNUSED)
2192 	{
2193 	  reloc_howto_type *reloc_howto =
2194 	    bfd_reloc_type_lookup (stdoutput, reloc);
2195 	  int size;
2196 	  int address;
2197 	  fixS *fixP;
2198 
2199 	  if (!reloc_howto)
2200 	    abort ();
2201 
2202 	  size = bfd_get_reloc_size (reloc_howto);
2203 
2204 	  /* XXX This will abort on an R_V850_8 reloc -
2205 	     is this reloc actually used?  */
2206 	  if (size != 2 && size != 4)
2207 	    abort ();
2208 
2209 	  address = (f - frag_now->fr_literal) + insn_size - size;
2210 
2211 	  if (reloc == BFD_RELOC_32)
2212 	    address += 2;
2213 
2214 	  fixP = fix_new_exp (frag_now, address, size,
2215 			      &fixups[i].exp,
2216 			      reloc_howto->pc_relative,
2217 			      reloc);
2218 
2219 	  switch (reloc)
2220 	    {
2221 	    case BFD_RELOC_LO16:
2222 	    case BFD_RELOC_HI16:
2223 	    case BFD_RELOC_HI16_S:
2224 	      fixP->fx_no_overflow = 1;
2225 	      break;
2226 	    default:
2227 	      break;
2228 	    }
2229 	}
2230       else
2231 	{
2232 	  fix_new_exp (frag_now,
2233 		       f - frag_now->fr_literal, 4,
2234 		       & fixups[i].exp,
2235 		       (operand->flags & V850_OPERAND_DISP) != 0,
2236 		       (bfd_reloc_code_real_type) (fixups[i].opindex
2237 						   + (int) BFD_RELOC_UNUSED));
2238 	}
2239     }
2240 
2241   input_line_pointer = saved_input_line_pointer;
2242 }
2243 
2244 /* If while processing a fixup, a reloc really needs to be created
2245    then it is done here.  */
2246 
2247 arelent *
2248 tc_gen_reloc (seg, fixp)
2249      asection *seg ATTRIBUTE_UNUSED;
2250      fixS *fixp;
2251 {
2252   arelent *reloc;
2253 
2254   reloc		      = (arelent *) xmalloc (sizeof (arelent));
2255   reloc->sym_ptr_ptr  = (asymbol **) xmalloc (sizeof (asymbol *));
2256   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2257   reloc->address      = fixp->fx_frag->fr_address + fixp->fx_where;
2258 
2259   if (   fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY
2260       || fixp->fx_r_type == BFD_RELOC_VTABLE_INHERIT
2261       || fixp->fx_r_type == BFD_RELOC_V850_LONGCALL
2262       || fixp->fx_r_type == BFD_RELOC_V850_LONGJUMP
2263       || fixp->fx_r_type == BFD_RELOC_V850_ALIGN)
2264     reloc->addend = fixp->fx_offset;
2265   else
2266     {
2267       if (fixp->fx_r_type == BFD_RELOC_32
2268 	  && fixp->fx_pcrel)
2269 	fixp->fx_r_type = BFD_RELOC_32_PCREL;
2270 
2271       reloc->addend = fixp->fx_addnumber;
2272     }
2273 
2274   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
2275 
2276   if (reloc->howto == (reloc_howto_type *) NULL)
2277     {
2278       as_bad_where (fixp->fx_file, fixp->fx_line,
2279 		    /* xgettext:c-format  */
2280 		    _("reloc %d not supported by object file format"),
2281 		    (int) fixp->fx_r_type);
2282 
2283       xfree (reloc);
2284 
2285       return NULL;
2286     }
2287 
2288   return reloc;
2289 }
2290 
2291 void
2292 v850_handle_align (frag)
2293      fragS * frag;
2294 {
2295   if (v850_relax
2296       && frag->fr_type == rs_align
2297       && frag->fr_address + frag->fr_fix > 0
2298       && frag->fr_offset > 1
2299       && now_seg != bss_section
2300       && now_seg != v850_seg_table[SBSS_SECTION].s
2301       && now_seg != v850_seg_table[TBSS_SECTION].s
2302       && now_seg != v850_seg_table[ZBSS_SECTION].s)
2303     fix_new (frag, frag->fr_fix, 2, & abs_symbol, frag->fr_offset, 0,
2304 	     BFD_RELOC_V850_ALIGN);
2305 }
2306 
2307 /* Return current size of variable part of frag.  */
2308 
2309 int
2310 md_estimate_size_before_relax (fragp, seg)
2311      fragS *fragp;
2312      asection *seg ATTRIBUTE_UNUSED;
2313 {
2314   if (fragp->fr_subtype >= sizeof (md_relax_table) / sizeof (md_relax_table[0]))
2315     abort ();
2316 
2317   return md_relax_table[fragp->fr_subtype].rlx_length;
2318 }
2319 
2320 long
2321 v850_pcrel_from_section (fixp, section)
2322      fixS *fixp;
2323      segT section;
2324 {
2325   /* If the symbol is undefined, or in a section other than our own,
2326      or it is weak (in which case it may well be in another section,
2327      then let the linker figure it out.  */
2328   if (fixp->fx_addsy != (symbolS *) NULL
2329       && (! S_IS_DEFINED (fixp->fx_addsy)
2330 	  || S_IS_WEAK (fixp->fx_addsy)
2331 	  || (S_GET_SEGMENT (fixp->fx_addsy) != section)))
2332     return 0;
2333 
2334   return fixp->fx_frag->fr_address + fixp->fx_where;
2335 }
2336 
2337 void
2338 md_apply_fix3 (fixP, valueP, seg)
2339      fixS *fixP;
2340      valueT *valueP;
2341      segT seg ATTRIBUTE_UNUSED;
2342 {
2343   valueT value = * valueP;
2344   char *where;
2345 
2346   if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
2347       || fixP->fx_r_type == BFD_RELOC_V850_LONGCALL
2348       || fixP->fx_r_type == BFD_RELOC_V850_LONGJUMP
2349       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
2350     {
2351       fixP->fx_done = 0;
2352       return;
2353     }
2354 
2355   if (fixP->fx_addsy == (symbolS *) NULL)
2356     fixP->fx_addnumber = value,
2357     fixP->fx_done = 1;
2358 
2359   else if (fixP->fx_pcrel)
2360     fixP->fx_addnumber = fixP->fx_offset;
2361 
2362   else
2363     {
2364       value = fixP->fx_offset;
2365       if (fixP->fx_subsy != (symbolS *) NULL)
2366 	{
2367 	  if (S_GET_SEGMENT (fixP->fx_subsy) == absolute_section)
2368 	    value -= S_GET_VALUE (fixP->fx_subsy);
2369 	  else
2370 	    {
2371 	      /* We don't actually support subtracting a symbol.  */
2372 	      as_bad_where (fixP->fx_file, fixP->fx_line,
2373 			    _("expression too complex"));
2374 	    }
2375 	}
2376       fixP->fx_addnumber = value;
2377     }
2378 
2379   if ((int) fixP->fx_r_type >= (int) BFD_RELOC_UNUSED)
2380     {
2381       int opindex;
2382       const struct v850_operand *operand;
2383       unsigned long insn;
2384 
2385       opindex = (int) fixP->fx_r_type - (int) BFD_RELOC_UNUSED;
2386       operand = &v850_operands[opindex];
2387 
2388       /* Fetch the instruction, insert the fully resolved operand
2389 	 value, and stuff the instruction back again.
2390 
2391 	 Note the instruction has been stored in little endian
2392 	 format!  */
2393       where = fixP->fx_frag->fr_literal + fixP->fx_where;
2394 
2395       insn = bfd_getl32 ((unsigned char *) where);
2396       insn = v850_insert_operand (insn, operand, (offsetT) value,
2397 				  fixP->fx_file, fixP->fx_line, NULL);
2398       bfd_putl32 ((bfd_vma) insn, (unsigned char *) where);
2399 
2400       if (fixP->fx_done)
2401 	/* Nothing else to do here.  */
2402 	return;
2403 
2404       /* Determine a BFD reloc value based on the operand information.
2405 	 We are only prepared to turn a few of the operands into relocs.  */
2406 
2407       if (operand->bits == 22)
2408 	fixP->fx_r_type = BFD_RELOC_V850_22_PCREL;
2409       else if (operand->bits == 9)
2410 	fixP->fx_r_type = BFD_RELOC_V850_9_PCREL;
2411       else
2412 	{
2413 #if 0
2414 	  fprintf (stderr, "bits: %d, insn: %x\n", operand->bits, insn);
2415 #endif
2416 
2417 	  as_bad_where (fixP->fx_file, fixP->fx_line,
2418 			_("unresolved expression that must be resolved"));
2419 	  fixP->fx_done = 1;
2420 	  return;
2421 	}
2422     }
2423   else if (fixP->fx_done)
2424     {
2425       /* We still have to insert the value into memory!  */
2426       where = fixP->fx_frag->fr_literal + fixP->fx_where;
2427 
2428       if (fixP->fx_size == 1)
2429 	*where = value & 0xff;
2430       else if (fixP->fx_size == 2)
2431 	bfd_putl16 (value & 0xffff, (unsigned char *) where);
2432       else if (fixP->fx_size == 4)
2433 	bfd_putl32 (value, (unsigned char *) where);
2434     }
2435 }
2436 
2437 /* Parse a cons expression.  We have to handle hi(), lo(), etc
2438    on the v850.  */
2439 
2440 void
2441 parse_cons_expression_v850 (exp)
2442      expressionS *exp;
2443 {
2444   /* See if there's a reloc prefix like hi() we have to handle.  */
2445   hold_cons_reloc = v850_reloc_prefix (NULL);
2446 
2447   /* Do normal expression parsing.  */
2448   expression (exp);
2449 }
2450 
2451 /* Create a fixup for a cons expression.  If parse_cons_expression_v850
2452    found a reloc prefix, then we use that reloc, else we choose an
2453    appropriate one based on the size of the expression.  */
2454 
2455 void
2456 cons_fix_new_v850 (frag, where, size, exp)
2457      fragS *frag;
2458      int where;
2459      int size;
2460      expressionS *exp;
2461 {
2462   if (hold_cons_reloc == BFD_RELOC_UNUSED)
2463     {
2464       if (size == 4)
2465 	hold_cons_reloc = BFD_RELOC_32;
2466       if (size == 2)
2467 	hold_cons_reloc = BFD_RELOC_16;
2468       if (size == 1)
2469 	hold_cons_reloc = BFD_RELOC_8;
2470     }
2471 
2472   if (exp != NULL)
2473     fix_new_exp (frag, where, size, exp, 0, hold_cons_reloc);
2474   else
2475     fix_new (frag, where, size, NULL, 0, 0, hold_cons_reloc);
2476 
2477   hold_cons_reloc = BFD_RELOC_UNUSED;
2478 }
2479 
2480 bfd_boolean
2481 v850_fix_adjustable (fixP)
2482      fixS *fixP;
2483 {
2484   if (fixP->fx_addsy == NULL)
2485     return 1;
2486 
2487   /* Don't adjust function names.  */
2488   if (S_IS_FUNCTION (fixP->fx_addsy))
2489     return 0;
2490 
2491   /* We need the symbol name for the VTABLE entries.  */
2492   if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
2493       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
2494     return 0;
2495 
2496   return 1;
2497 }
2498 
2499 int
2500 v850_force_relocation (fixP)
2501      struct fix *fixP;
2502 {
2503   if (fixP->fx_r_type == BFD_RELOC_V850_LONGCALL
2504       || fixP->fx_r_type == BFD_RELOC_V850_LONGJUMP)
2505     return 1;
2506 
2507   if (v850_relax
2508       && (fixP->fx_pcrel
2509 	  || fixP->fx_r_type == BFD_RELOC_V850_ALIGN
2510 	  || fixP->fx_r_type == BFD_RELOC_V850_22_PCREL
2511 	  || fixP->fx_r_type == BFD_RELOC_V850_9_PCREL
2512 	  || fixP->fx_r_type >= BFD_RELOC_UNUSED))
2513     return 1;
2514 
2515   return generic_force_reloc (fixP);
2516 }
2517