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