tc-d30v.c revision 1.1.1.2 1 1.1 skrll /* tc-d30v.c -- Assembler code for the Mitsubishi D30V
2 1.1.1.2 christos Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2006, 2007, 2008,
3 1.1.1.2 christos 2009, 2010 Free Software Foundation, Inc.
4 1.1 skrll
5 1.1 skrll This file is part of GAS, the GNU Assembler.
6 1.1 skrll
7 1.1 skrll GAS is free software; you can redistribute it and/or modify
8 1.1 skrll it under the terms of the GNU General Public License as published by
9 1.1 skrll the Free Software Foundation; either version 3, or (at your option)
10 1.1 skrll any later version.
11 1.1 skrll
12 1.1 skrll GAS is distributed in the hope that it will be useful,
13 1.1 skrll but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1 skrll MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 1.1 skrll GNU General Public License for more details.
16 1.1 skrll
17 1.1 skrll You should have received a copy of the GNU General Public License
18 1.1 skrll along with GAS; see the file COPYING. If not, write to
19 1.1 skrll the Free Software Foundation, 51 Franklin Street - Fifth Floor,
20 1.1 skrll Boston, MA 02110-1301, USA. */
21 1.1 skrll
22 1.1 skrll #include "as.h"
23 1.1 skrll #include "safe-ctype.h"
24 1.1 skrll #include "subsegs.h"
25 1.1 skrll #include "opcode/d30v.h"
26 1.1.1.2 christos #include "dwarf2dbg.h"
27 1.1 skrll
28 1.1 skrll const char comment_chars[] = ";";
29 1.1 skrll const char line_comment_chars[] = "#";
30 1.1 skrll const char line_separator_chars[] = "";
31 1.1 skrll const char *md_shortopts = "OnNcC";
32 1.1 skrll const char EXP_CHARS[] = "eE";
33 1.1 skrll const char FLT_CHARS[] = "dD";
34 1.1 skrll
35 1.1 skrll #if HAVE_LIMITS_H
36 1.1 skrll #include <limits.h>
37 1.1 skrll #endif
38 1.1 skrll
39 1.1 skrll #ifndef CHAR_BIT
40 1.1 skrll #define CHAR_BIT 8
41 1.1 skrll #endif
42 1.1 skrll
43 1.1 skrll #define NOP_MULTIPLY 1
44 1.1 skrll #define NOP_ALL 2
45 1.1 skrll static int warn_nops = 0;
46 1.1 skrll static int Optimizing = 0;
47 1.1 skrll static int warn_register_name_conflicts = 1;
48 1.1 skrll
49 1.1 skrll #define FORCE_SHORT 1
50 1.1 skrll #define FORCE_LONG 2
51 1.1 skrll
52 1.1 skrll /* EXEC types. */
53 1.1 skrll typedef enum _exec_type
54 1.1 skrll {
55 1.1 skrll EXEC_UNKNOWN, /* No order specified. */
56 1.1 skrll EXEC_PARALLEL, /* Done in parallel (FM=00). */
57 1.1 skrll EXEC_SEQ, /* Sequential (FM=01). */
58 1.1 skrll EXEC_REVSEQ /* Reverse sequential (FM=10). */
59 1.1 skrll } exec_type_enum;
60 1.1 skrll
61 1.1 skrll /* Fixups. */
62 1.1 skrll #define MAX_INSN_FIXUPS 5
63 1.1 skrll
64 1.1 skrll struct d30v_fixup
65 1.1 skrll {
66 1.1 skrll expressionS exp;
67 1.1 skrll int operand;
68 1.1 skrll int pcrel;
69 1.1 skrll int size;
70 1.1 skrll bfd_reloc_code_real_type reloc;
71 1.1 skrll };
72 1.1 skrll
73 1.1 skrll typedef struct _fixups
74 1.1 skrll {
75 1.1 skrll int fc;
76 1.1 skrll struct d30v_fixup fix[MAX_INSN_FIXUPS];
77 1.1 skrll struct _fixups *next;
78 1.1 skrll } Fixups;
79 1.1 skrll
80 1.1 skrll static Fixups FixUps[2];
81 1.1 skrll static Fixups *fixups;
82 1.1 skrll
83 1.1 skrll /* Whether current and previous instruction are word multiply insns. */
84 1.1 skrll static int cur_mul32_p = 0;
85 1.1 skrll static int prev_mul32_p = 0;
86 1.1 skrll
87 1.1 skrll /* The flag_explicitly_parallel is true iff the instruction being assembled
88 1.1 skrll has been explicitly written as a parallel short-instruction pair by the
89 1.1 skrll human programmer. It is used in parallel_ok () to distinguish between
90 1.1 skrll those dangerous parallelizations attempted by the human, which are to be
91 1.1 skrll allowed, and those attempted by the assembler, which are not. It is set
92 1.1 skrll from md_assemble (). */
93 1.1 skrll static int flag_explicitly_parallel = 0;
94 1.1 skrll static int flag_xp_state = 0;
95 1.1 skrll
96 1.1 skrll /* Whether current and previous left sub-instruction disables
97 1.1 skrll execution of right sub-instruction. */
98 1.1 skrll static int cur_left_kills_right_p = 0;
99 1.1 skrll static int prev_left_kills_right_p = 0;
100 1.1 skrll
101 1.1 skrll /* The known current alignment of the current section. */
102 1.1 skrll static int d30v_current_align;
103 1.1 skrll static segT d30v_current_align_seg;
104 1.1 skrll
105 1.1 skrll /* The last seen label in the current section. This is used to auto-align
106 1.1 skrll labels preceding instructions. */
107 1.1 skrll static symbolS *d30v_last_label;
108 1.1 skrll
109 1.1 skrll /* Two nops. */
110 1.1 skrll #define NOP_LEFT ((long long) NOP << 32)
111 1.1 skrll #define NOP_RIGHT ((long long) NOP)
112 1.1 skrll #define NOP2 (FM00 | NOP_LEFT | NOP_RIGHT)
113 1.1 skrll
114 1.1 skrll struct option md_longopts[] =
115 1.1 skrll {
116 1.1 skrll {NULL, no_argument, NULL, 0}
117 1.1 skrll };
118 1.1 skrll
119 1.1 skrll size_t md_longopts_size = sizeof (md_longopts);
120 1.1 skrll
121 1.1 skrll /* Opcode hash table. */
122 1.1 skrll static struct hash_control *d30v_hash;
123 1.1 skrll
124 1.1 skrll /* Do a binary search of the pre_defined_registers array to see if
125 1.1 skrll NAME is a valid regiter name. Return the register number from the
126 1.1 skrll array on success, or -1 on failure. */
127 1.1 skrll
128 1.1 skrll static int
129 1.1 skrll reg_name_search (char *name)
130 1.1 skrll {
131 1.1 skrll int middle, low, high;
132 1.1 skrll int cmp;
133 1.1 skrll
134 1.1 skrll low = 0;
135 1.1 skrll high = reg_name_cnt () - 1;
136 1.1 skrll
137 1.1 skrll do
138 1.1 skrll {
139 1.1 skrll middle = (low + high) / 2;
140 1.1 skrll cmp = strcasecmp (name, pre_defined_registers[middle].name);
141 1.1 skrll if (cmp < 0)
142 1.1 skrll high = middle - 1;
143 1.1 skrll else if (cmp > 0)
144 1.1 skrll low = middle + 1;
145 1.1 skrll else
146 1.1 skrll {
147 1.1 skrll if (symbol_find (name) != NULL)
148 1.1 skrll {
149 1.1 skrll if (warn_register_name_conflicts)
150 1.1 skrll as_warn (_("Register name %s conflicts with symbol of the same name"),
151 1.1 skrll name);
152 1.1 skrll }
153 1.1 skrll
154 1.1 skrll return pre_defined_registers[middle].value;
155 1.1 skrll }
156 1.1 skrll }
157 1.1 skrll while (low <= high);
158 1.1 skrll
159 1.1 skrll return -1;
160 1.1 skrll }
161 1.1 skrll
162 1.1 skrll /* Check the string at input_line_pointer to see if it is a valid
163 1.1 skrll register name. */
164 1.1 skrll
165 1.1 skrll static int
166 1.1 skrll register_name (expressionS *expressionP)
167 1.1 skrll {
168 1.1 skrll int reg_number;
169 1.1 skrll char c, *p = input_line_pointer;
170 1.1 skrll
171 1.1 skrll while (*p && *p != '\n' && *p != '\r' && *p != ',' && *p != ' ' && *p != ')')
172 1.1 skrll p++;
173 1.1 skrll
174 1.1 skrll c = *p;
175 1.1 skrll if (c)
176 1.1 skrll *p++ = 0;
177 1.1 skrll
178 1.1 skrll /* Look to see if it's in the register table. */
179 1.1 skrll reg_number = reg_name_search (input_line_pointer);
180 1.1 skrll if (reg_number >= 0)
181 1.1 skrll {
182 1.1 skrll expressionP->X_op = O_register;
183 1.1 skrll /* Temporarily store a pointer to the string here. */
184 1.1 skrll expressionP->X_op_symbol = (symbolS *) input_line_pointer;
185 1.1 skrll expressionP->X_add_number = reg_number;
186 1.1 skrll input_line_pointer = p;
187 1.1 skrll return 1;
188 1.1 skrll }
189 1.1 skrll if (c)
190 1.1 skrll *(p - 1) = c;
191 1.1 skrll return 0;
192 1.1 skrll }
193 1.1 skrll
194 1.1 skrll static int
195 1.1 skrll check_range (unsigned long num, int bits, int flags)
196 1.1 skrll {
197 1.1 skrll long min, max;
198 1.1 skrll
199 1.1 skrll /* Don't bother checking 32-bit values. */
200 1.1 skrll if (bits == 32)
201 1.1 skrll {
202 1.1 skrll if (sizeof (unsigned long) * CHAR_BIT == 32)
203 1.1 skrll return 0;
204 1.1 skrll
205 1.1 skrll /* We don't record signed or unsigned for 32-bit quantities.
206 1.1 skrll Allow either. */
207 1.1 skrll min = -((unsigned long) 1 << (bits - 1));
208 1.1 skrll max = ((unsigned long) 1 << bits) - 1;
209 1.1 skrll return (long) num < min || (long) num > max;
210 1.1 skrll }
211 1.1 skrll
212 1.1 skrll if (flags & OPERAND_SHIFT)
213 1.1 skrll {
214 1.1 skrll /* We know that all shifts are right by three bits. */
215 1.1 skrll num >>= 3;
216 1.1 skrll
217 1.1 skrll if (flags & OPERAND_SIGNED)
218 1.1 skrll {
219 1.1 skrll unsigned long sign_bit = ((unsigned long) -1L >> 4) + 1;
220 1.1 skrll num = (num ^ sign_bit) - sign_bit;
221 1.1 skrll }
222 1.1 skrll }
223 1.1 skrll
224 1.1 skrll if (flags & OPERAND_SIGNED)
225 1.1 skrll {
226 1.1 skrll max = ((unsigned long) 1 << (bits - 1)) - 1;
227 1.1 skrll min = - ((unsigned long) 1 << (bits - 1));
228 1.1 skrll return (long) num > max || (long) num < min;
229 1.1 skrll }
230 1.1 skrll else
231 1.1 skrll {
232 1.1 skrll max = ((unsigned long) 1 << bits) - 1;
233 1.1 skrll return num > (unsigned long) max;
234 1.1 skrll }
235 1.1 skrll }
236 1.1 skrll
237 1.1 skrll void
238 1.1 skrll md_show_usage (FILE *stream)
239 1.1 skrll {
240 1.1 skrll fprintf (stream, _("\nD30V options:\n\
241 1.1 skrll -O Make adjacent short instructions parallel if possible.\n\
242 1.1 skrll -n Warn about all NOPs inserted by the assembler.\n\
243 1.1 skrll -N Warn about NOPs inserted after word multiplies.\n\
244 1.1 skrll -c Warn about symbols whoes names match register names.\n\
245 1.1 skrll -C Opposite of -C. -c is the default.\n"));
246 1.1 skrll }
247 1.1 skrll
248 1.1 skrll int
249 1.1 skrll md_parse_option (int c, char *arg ATTRIBUTE_UNUSED)
250 1.1 skrll {
251 1.1 skrll switch (c)
252 1.1 skrll {
253 1.1 skrll /* Optimize. Will attempt to parallelize operations. */
254 1.1 skrll case 'O':
255 1.1 skrll Optimizing = 1;
256 1.1 skrll break;
257 1.1 skrll
258 1.1 skrll /* Warn about all NOPS that the assembler inserts. */
259 1.1 skrll case 'n':
260 1.1 skrll warn_nops = NOP_ALL;
261 1.1 skrll break;
262 1.1 skrll
263 1.1 skrll /* Warn about the NOPS that the assembler inserts because of the
264 1.1 skrll multiply hazard. */
265 1.1 skrll case 'N':
266 1.1 skrll warn_nops = NOP_MULTIPLY;
267 1.1 skrll break;
268 1.1 skrll
269 1.1 skrll case 'c':
270 1.1 skrll warn_register_name_conflicts = 1;
271 1.1 skrll break;
272 1.1 skrll
273 1.1 skrll case 'C':
274 1.1 skrll warn_register_name_conflicts = 0;
275 1.1 skrll break;
276 1.1 skrll
277 1.1 skrll default:
278 1.1 skrll return 0;
279 1.1 skrll }
280 1.1 skrll return 1;
281 1.1 skrll }
282 1.1 skrll
283 1.1 skrll symbolS *
284 1.1 skrll md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
285 1.1 skrll {
286 1.1 skrll return 0;
287 1.1 skrll }
288 1.1 skrll
289 1.1 skrll char *
290 1.1 skrll md_atof (int type, char *litP, int *sizeP)
291 1.1 skrll {
292 1.1 skrll return ieee_md_atof (type, litP, sizeP, TRUE);
293 1.1 skrll }
294 1.1 skrll
295 1.1 skrll void
296 1.1 skrll md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
297 1.1 skrll asection *sec ATTRIBUTE_UNUSED,
298 1.1 skrll fragS *fragP ATTRIBUTE_UNUSED)
299 1.1 skrll {
300 1.1 skrll abort ();
301 1.1 skrll }
302 1.1 skrll
303 1.1 skrll valueT
304 1.1 skrll md_section_align (asection *seg, valueT addr)
305 1.1 skrll {
306 1.1 skrll int align = bfd_get_section_alignment (stdoutput, seg);
307 1.1 skrll return ((addr + (1 << align) - 1) & (-1 << align));
308 1.1 skrll }
309 1.1 skrll
310 1.1 skrll void
311 1.1 skrll md_begin (void)
312 1.1 skrll {
313 1.1 skrll struct d30v_opcode *opcode;
314 1.1 skrll d30v_hash = hash_new ();
315 1.1 skrll
316 1.1 skrll /* Insert opcode names into a hash table. */
317 1.1 skrll for (opcode = (struct d30v_opcode *) d30v_opcode_table; opcode->name; opcode++)
318 1.1 skrll hash_insert (d30v_hash, opcode->name, (char *) opcode);
319 1.1 skrll
320 1.1 skrll fixups = &FixUps[0];
321 1.1 skrll FixUps[0].next = &FixUps[1];
322 1.1 skrll FixUps[1].next = &FixUps[0];
323 1.1 skrll
324 1.1 skrll d30v_current_align_seg = now_seg;
325 1.1 skrll }
326 1.1 skrll
327 1.1 skrll /* Remove the postincrement or postdecrement operator ( '+' or '-' )
328 1.1 skrll from an expression. */
329 1.1 skrll
330 1.1 skrll static int
331 1.1 skrll postfix (char *p)
332 1.1 skrll {
333 1.1 skrll while (*p != '-' && *p != '+')
334 1.1 skrll {
335 1.1 skrll if (*p == 0 || *p == '\n' || *p == '\r' || *p == ' ' || *p == ',')
336 1.1 skrll break;
337 1.1 skrll p++;
338 1.1 skrll }
339 1.1 skrll
340 1.1 skrll if (*p == '-')
341 1.1 skrll {
342 1.1 skrll *p = ' ';
343 1.1 skrll return -1;
344 1.1 skrll }
345 1.1 skrll
346 1.1 skrll if (*p == '+')
347 1.1 skrll {
348 1.1 skrll *p = ' ';
349 1.1 skrll return 1;
350 1.1 skrll }
351 1.1 skrll
352 1.1 skrll return 0;
353 1.1 skrll }
354 1.1 skrll
355 1.1 skrll static bfd_reloc_code_real_type
356 1.1 skrll get_reloc (const struct d30v_operand *op, int rel_flag)
357 1.1 skrll {
358 1.1 skrll switch (op->bits)
359 1.1 skrll {
360 1.1 skrll case 6:
361 1.1 skrll if (op->flags & OPERAND_SHIFT)
362 1.1 skrll return BFD_RELOC_D30V_9_PCREL;
363 1.1 skrll else
364 1.1 skrll return BFD_RELOC_D30V_6;
365 1.1 skrll break;
366 1.1 skrll case 12:
367 1.1 skrll if (!(op->flags & OPERAND_SHIFT))
368 1.1 skrll as_warn (_("unexpected 12-bit reloc type"));
369 1.1 skrll if (rel_flag == RELOC_PCREL)
370 1.1 skrll return BFD_RELOC_D30V_15_PCREL;
371 1.1 skrll else
372 1.1 skrll return BFD_RELOC_D30V_15;
373 1.1 skrll case 18:
374 1.1 skrll if (!(op->flags & OPERAND_SHIFT))
375 1.1 skrll as_warn (_("unexpected 18-bit reloc type"));
376 1.1 skrll if (rel_flag == RELOC_PCREL)
377 1.1 skrll return BFD_RELOC_D30V_21_PCREL;
378 1.1 skrll else
379 1.1 skrll return BFD_RELOC_D30V_21;
380 1.1 skrll case 32:
381 1.1 skrll if (rel_flag == RELOC_PCREL)
382 1.1 skrll return BFD_RELOC_D30V_32_PCREL;
383 1.1 skrll else
384 1.1 skrll return BFD_RELOC_D30V_32;
385 1.1 skrll default:
386 1.1 skrll return 0;
387 1.1 skrll }
388 1.1 skrll }
389 1.1 skrll
390 1.1 skrll /* Parse a string of operands and return an array of expressions. */
391 1.1 skrll
392 1.1 skrll static int
393 1.1 skrll get_operands (expressionS exp[], int cmp_hack)
394 1.1 skrll {
395 1.1 skrll char *p = input_line_pointer;
396 1.1 skrll int numops = 0;
397 1.1 skrll int post = 0;
398 1.1 skrll
399 1.1 skrll if (cmp_hack)
400 1.1 skrll {
401 1.1 skrll exp[numops].X_op = O_absent;
402 1.1 skrll exp[numops++].X_add_number = cmp_hack - 1;
403 1.1 skrll }
404 1.1 skrll
405 1.1 skrll while (*p)
406 1.1 skrll {
407 1.1 skrll while (*p == ' ' || *p == '\t' || *p == ',')
408 1.1 skrll p++;
409 1.1 skrll
410 1.1 skrll if (*p == 0 || *p == '\n' || *p == '\r')
411 1.1 skrll break;
412 1.1 skrll
413 1.1 skrll if (*p == '@')
414 1.1 skrll {
415 1.1 skrll p++;
416 1.1 skrll exp[numops].X_op = O_absent;
417 1.1 skrll if (*p == '(')
418 1.1 skrll {
419 1.1 skrll p++;
420 1.1 skrll exp[numops].X_add_number = OPERAND_ATPAR;
421 1.1 skrll post = postfix (p);
422 1.1 skrll }
423 1.1 skrll else if (*p == '-')
424 1.1 skrll {
425 1.1 skrll p++;
426 1.1 skrll exp[numops].X_add_number = OPERAND_ATMINUS;
427 1.1 skrll }
428 1.1 skrll else
429 1.1 skrll {
430 1.1 skrll exp[numops].X_add_number = OPERAND_ATSIGN;
431 1.1 skrll post = postfix (p);
432 1.1 skrll }
433 1.1 skrll numops++;
434 1.1 skrll continue;
435 1.1 skrll }
436 1.1 skrll
437 1.1 skrll if (*p == ')')
438 1.1 skrll {
439 1.1 skrll /* Just skip the trailing paren. */
440 1.1 skrll p++;
441 1.1 skrll continue;
442 1.1 skrll }
443 1.1 skrll
444 1.1 skrll input_line_pointer = p;
445 1.1 skrll
446 1.1 skrll /* Check to see if it might be a register name. */
447 1.1 skrll if (!register_name (&exp[numops]))
448 1.1 skrll {
449 1.1 skrll /* Parse as an expression. */
450 1.1 skrll expression (&exp[numops]);
451 1.1 skrll }
452 1.1 skrll
453 1.1 skrll if (exp[numops].X_op == O_illegal)
454 1.1 skrll as_bad (_("illegal operand"));
455 1.1 skrll else if (exp[numops].X_op == O_absent)
456 1.1 skrll as_bad (_("missing operand"));
457 1.1 skrll
458 1.1 skrll numops++;
459 1.1 skrll p = input_line_pointer;
460 1.1 skrll
461 1.1 skrll switch (post)
462 1.1 skrll {
463 1.1 skrll case -1:
464 1.1 skrll /* Postdecrement mode. */
465 1.1 skrll exp[numops].X_op = O_absent;
466 1.1 skrll exp[numops++].X_add_number = OPERAND_MINUS;
467 1.1 skrll break;
468 1.1 skrll case 1:
469 1.1 skrll /* Postincrement mode. */
470 1.1 skrll exp[numops].X_op = O_absent;
471 1.1 skrll exp[numops++].X_add_number = OPERAND_PLUS;
472 1.1 skrll break;
473 1.1 skrll }
474 1.1 skrll post = 0;
475 1.1 skrll }
476 1.1 skrll
477 1.1 skrll exp[numops].X_op = 0;
478 1.1 skrll
479 1.1 skrll return numops;
480 1.1 skrll }
481 1.1 skrll
482 1.1 skrll /* Generate the instruction.
483 1.1 skrll It does everything but write the FM bits. */
484 1.1 skrll
485 1.1 skrll static long long
486 1.1 skrll build_insn (struct d30v_insn *opcode, expressionS *opers)
487 1.1 skrll {
488 1.1.1.2 christos int i, bits, shift, flags;
489 1.1 skrll unsigned long number, id = 0;
490 1.1 skrll long long insn;
491 1.1 skrll struct d30v_opcode *op = opcode->op;
492 1.1 skrll struct d30v_format *form = opcode->form;
493 1.1 skrll
494 1.1 skrll insn =
495 1.1 skrll opcode->ecc << 28 | op->op1 << 25 | op->op2 << 20 | form->modifier << 18;
496 1.1 skrll
497 1.1 skrll for (i = 0; form->operands[i]; i++)
498 1.1 skrll {
499 1.1 skrll flags = d30v_operand_table[form->operands[i]].flags;
500 1.1 skrll
501 1.1 skrll /* Must be a register or number. */
502 1.1 skrll if (!(flags & OPERAND_REG) && !(flags & OPERAND_NUM)
503 1.1 skrll && !(flags & OPERAND_NAME) && !(flags & OPERAND_SPECIAL))
504 1.1 skrll continue;
505 1.1 skrll
506 1.1 skrll bits = d30v_operand_table[form->operands[i]].bits;
507 1.1 skrll if (flags & OPERAND_SHIFT)
508 1.1 skrll bits += 3;
509 1.1 skrll
510 1.1 skrll shift = 12 - d30v_operand_table[form->operands[i]].position;
511 1.1 skrll if (opers[i].X_op != O_symbol)
512 1.1 skrll number = opers[i].X_add_number;
513 1.1 skrll else
514 1.1 skrll number = 0;
515 1.1 skrll if (flags & OPERAND_REG)
516 1.1 skrll {
517 1.1 skrll /* Check for mvfsys or mvtsys control registers. */
518 1.1 skrll if (flags & OPERAND_CONTROL && (number & 0x7f) > MAX_CONTROL_REG)
519 1.1 skrll {
520 1.1 skrll /* PSWL or PSWH. */
521 1.1 skrll id = (number & 0x7f) - MAX_CONTROL_REG;
522 1.1 skrll number = 0;
523 1.1 skrll }
524 1.1 skrll else if (number & OPERAND_FLAG)
525 1.1 skrll /* NUMBER is a flag register. */
526 1.1 skrll id = 3;
527 1.1 skrll
528 1.1 skrll number &= 0x7F;
529 1.1 skrll }
530 1.1 skrll else if (flags & OPERAND_SPECIAL)
531 1.1 skrll number = id;
532 1.1 skrll
533 1.1 skrll if (opers[i].X_op != O_register && opers[i].X_op != O_constant
534 1.1 skrll && !(flags & OPERAND_NAME))
535 1.1 skrll {
536 1.1 skrll /* Now create a fixup. */
537 1.1 skrll if (fixups->fc >= MAX_INSN_FIXUPS)
538 1.1 skrll as_fatal (_("too many fixups"));
539 1.1 skrll
540 1.1 skrll fixups->fix[fixups->fc].reloc =
541 1.1 skrll get_reloc (d30v_operand_table + form->operands[i], op->reloc_flag);
542 1.1 skrll fixups->fix[fixups->fc].size = 4;
543 1.1 skrll fixups->fix[fixups->fc].exp = opers[i];
544 1.1 skrll fixups->fix[fixups->fc].operand = form->operands[i];
545 1.1 skrll if (fixups->fix[fixups->fc].reloc == BFD_RELOC_D30V_9_PCREL)
546 1.1 skrll fixups->fix[fixups->fc].pcrel = RELOC_PCREL;
547 1.1 skrll else
548 1.1 skrll fixups->fix[fixups->fc].pcrel = op->reloc_flag;
549 1.1 skrll (fixups->fc)++;
550 1.1 skrll }
551 1.1 skrll
552 1.1 skrll /* Truncate to the proper number of bits. */
553 1.1 skrll if ((opers[i].X_op == O_constant) && check_range (number, bits, flags))
554 1.1 skrll as_bad (_("operand out of range: %ld"), number);
555 1.1 skrll if (bits < 31)
556 1.1 skrll number &= 0x7FFFFFFF >> (31 - bits);
557 1.1 skrll if (flags & OPERAND_SHIFT)
558 1.1 skrll number >>= 3;
559 1.1 skrll if (bits == 32)
560 1.1 skrll {
561 1.1 skrll /* It's a LONG instruction. */
562 1.1 skrll insn |= ((number & 0xffffffff) >> 26); /* Top 6 bits. */
563 1.1 skrll insn <<= 32; /* Shift the first word over. */
564 1.1 skrll insn |= ((number & 0x03FC0000) << 2); /* Next 8 bits. */
565 1.1 skrll insn |= number & 0x0003FFFF; /* Bottom 18 bits. */
566 1.1 skrll }
567 1.1 skrll else
568 1.1 skrll insn |= number << shift;
569 1.1 skrll }
570 1.1 skrll
571 1.1 skrll return insn;
572 1.1 skrll }
573 1.1 skrll
574 1.1 skrll static void
575 1.1 skrll d30v_number_to_chars (char *buf, /* Return 'nbytes' of chars here. */
576 1.1 skrll long long value, /* The value of the bits. */
577 1.1 skrll int n) /* Number of bytes in the output. */
578 1.1 skrll {
579 1.1 skrll while (n--)
580 1.1 skrll {
581 1.1 skrll buf[n] = value & 0xff;
582 1.1 skrll value >>= 8;
583 1.1 skrll }
584 1.1 skrll }
585 1.1 skrll
586 1.1 skrll /* Write out a long form instruction. */
587 1.1 skrll
588 1.1 skrll static void
589 1.1 skrll write_long (struct d30v_insn *opcode ATTRIBUTE_UNUSED,
590 1.1 skrll long long insn,
591 1.1 skrll Fixups *fx)
592 1.1 skrll {
593 1.1 skrll int i, where;
594 1.1 skrll char *f = frag_more (8);
595 1.1 skrll
596 1.1.1.2 christos dwarf2_emit_insn (8);
597 1.1 skrll insn |= FM11;
598 1.1 skrll d30v_number_to_chars (f, insn, 8);
599 1.1 skrll
600 1.1 skrll for (i = 0; i < fx->fc; i++)
601 1.1 skrll {
602 1.1 skrll if (fx->fix[i].reloc)
603 1.1 skrll {
604 1.1 skrll where = f - frag_now->fr_literal;
605 1.1 skrll fix_new_exp (frag_now, where, fx->fix[i].size, &(fx->fix[i].exp),
606 1.1 skrll fx->fix[i].pcrel, fx->fix[i].reloc);
607 1.1 skrll }
608 1.1 skrll }
609 1.1 skrll
610 1.1 skrll fx->fc = 0;
611 1.1 skrll }
612 1.1 skrll
613 1.1 skrll /* Write out a short form instruction by itself. */
614 1.1 skrll
615 1.1 skrll static void
616 1.1 skrll write_1_short (struct d30v_insn *opcode,
617 1.1 skrll long long insn,
618 1.1 skrll Fixups *fx,
619 1.1 skrll int use_sequential)
620 1.1 skrll {
621 1.1 skrll char *f = frag_more (8);
622 1.1 skrll int i, where;
623 1.1 skrll
624 1.1.1.2 christos dwarf2_emit_insn (8);
625 1.1 skrll if (warn_nops == NOP_ALL)
626 1.1 skrll as_warn (_("%s NOP inserted"), use_sequential ?
627 1.1 skrll _("sequential") : _("parallel"));
628 1.1 skrll
629 1.1 skrll /* The other container needs to be NOP. */
630 1.1 skrll if (use_sequential)
631 1.1 skrll {
632 1.1 skrll /* Use a sequential NOP rather than a parallel one,
633 1.1 skrll as the current instruction is a FLAG_MUL32 type one
634 1.1 skrll and the next instruction is a load. */
635 1.1 skrll
636 1.1 skrll /* According to 4.3.1: for FM=01, sub-instructions performed
637 1.1 skrll only by IU cannot be encoded in L-container. */
638 1.1 skrll if (opcode->op->unit == IU)
639 1.1 skrll /* Right then left. */
640 1.1 skrll insn |= FM10 | NOP_LEFT;
641 1.1 skrll else
642 1.1 skrll /* Left then right. */
643 1.1 skrll insn = FM01 | (insn << 32) | NOP_RIGHT;
644 1.1 skrll }
645 1.1 skrll else
646 1.1 skrll {
647 1.1 skrll /* According to 4.3.1: for FM=00, sub-instructions performed
648 1.1 skrll only by IU cannot be encoded in L-container. */
649 1.1 skrll if (opcode->op->unit == IU)
650 1.1 skrll /* Right container. */
651 1.1 skrll insn |= FM00 | NOP_LEFT;
652 1.1 skrll else
653 1.1 skrll /* Left container. */
654 1.1 skrll insn = FM00 | (insn << 32) | NOP_RIGHT;
655 1.1 skrll }
656 1.1 skrll
657 1.1 skrll d30v_number_to_chars (f, insn, 8);
658 1.1 skrll
659 1.1 skrll for (i = 0; i < fx->fc; i++)
660 1.1 skrll {
661 1.1 skrll if (fx->fix[i].reloc)
662 1.1 skrll {
663 1.1 skrll where = f - frag_now->fr_literal;
664 1.1 skrll fix_new_exp (frag_now,
665 1.1 skrll where,
666 1.1 skrll fx->fix[i].size,
667 1.1 skrll &(fx->fix[i].exp),
668 1.1 skrll fx->fix[i].pcrel,
669 1.1 skrll fx->fix[i].reloc);
670 1.1 skrll }
671 1.1 skrll }
672 1.1 skrll
673 1.1 skrll fx->fc = 0;
674 1.1 skrll }
675 1.1 skrll
676 1.1 skrll /* Check 2 instructions and determine if they can be safely
677 1.1 skrll executed in parallel. Return 1 if they can be. */
678 1.1 skrll
679 1.1 skrll static int
680 1.1 skrll parallel_ok (struct d30v_insn *op1,
681 1.1 skrll unsigned long insn1,
682 1.1 skrll struct d30v_insn *op2,
683 1.1 skrll unsigned long insn2,
684 1.1 skrll exec_type_enum exec_type)
685 1.1 skrll {
686 1.1 skrll int i, j, shift, regno, bits, ecc;
687 1.1 skrll unsigned long flags, mask, flags_set1, flags_set2, flags_used1, flags_used2;
688 1.1 skrll unsigned long ins, mod_reg[2][3], used_reg[2][3], flag_reg[2];
689 1.1 skrll struct d30v_format *f;
690 1.1 skrll struct d30v_opcode *op;
691 1.1 skrll
692 1.1 skrll /* Section 4.3: Both instructions must not be IU or MU only. */
693 1.1 skrll if ((op1->op->unit == IU && op2->op->unit == IU)
694 1.1 skrll || (op1->op->unit == MU && op2->op->unit == MU))
695 1.1 skrll return 0;
696 1.1 skrll
697 1.1 skrll /* First instruction must not be a jump to safely optimize, unless this
698 1.1 skrll is an explicit parallel operation. */
699 1.1 skrll if (exec_type != EXEC_PARALLEL
700 1.1 skrll && (op1->op->flags_used & (FLAG_JMP | FLAG_JSR)))
701 1.1 skrll return 0;
702 1.1 skrll
703 1.1 skrll /* If one instruction is /TX or /XT and the other is /FX or /XF respectively,
704 1.1 skrll then it is safe to allow the two to be done as parallel ops, since only
705 1.1 skrll one will ever be executed at a time. */
706 1.1 skrll if ((op1->ecc == ECC_TX && op2->ecc == ECC_FX)
707 1.1 skrll || (op1->ecc == ECC_FX && op2->ecc == ECC_TX)
708 1.1 skrll || (op1->ecc == ECC_XT && op2->ecc == ECC_XF)
709 1.1 skrll || (op1->ecc == ECC_XF && op2->ecc == ECC_XT))
710 1.1 skrll return 1;
711 1.1 skrll
712 1.1 skrll /* [0] r0-r31
713 1.1 skrll [1] r32-r63
714 1.1 skrll [2] a0, a1, flag registers. */
715 1.1 skrll for (j = 0; j < 2; j++)
716 1.1 skrll {
717 1.1 skrll if (j == 0)
718 1.1 skrll {
719 1.1 skrll f = op1->form;
720 1.1 skrll op = op1->op;
721 1.1 skrll ecc = op1->ecc;
722 1.1 skrll ins = insn1;
723 1.1 skrll }
724 1.1 skrll else
725 1.1 skrll {
726 1.1 skrll f = op2->form;
727 1.1 skrll op = op2->op;
728 1.1 skrll ecc = op2->ecc;
729 1.1 skrll ins = insn2;
730 1.1 skrll }
731 1.1 skrll
732 1.1 skrll flag_reg[j] = 0;
733 1.1 skrll mod_reg[j][0] = mod_reg[j][1] = 0;
734 1.1 skrll used_reg[j][0] = used_reg[j][1] = 0;
735 1.1 skrll
736 1.1 skrll if (flag_explicitly_parallel)
737 1.1 skrll {
738 1.1 skrll /* For human specified parallel instructions we have been asked
739 1.1 skrll to ignore the possibility that both instructions could modify
740 1.1 skrll bits in the PSW, so we initialise the mod & used arrays to 0.
741 1.1 skrll We have been asked, however, to refuse to allow parallel
742 1.1 skrll instructions which explicitly set the same flag register,
743 1.1 skrll eg "cmpne f0,r1,0x10 || cmpeq f0, r5, 0x2", so further on we test
744 1.1 skrll for the use of a flag register and set a bit in the mod or used
745 1.1 skrll array appropriately. */
746 1.1 skrll mod_reg[j][2] = 0;
747 1.1 skrll used_reg[j][2] = 0;
748 1.1 skrll }
749 1.1 skrll else
750 1.1 skrll {
751 1.1 skrll mod_reg[j][2] = (op->flags_set & FLAG_ALL);
752 1.1 skrll used_reg[j][2] = (op->flags_used & FLAG_ALL);
753 1.1 skrll }
754 1.1 skrll
755 1.1 skrll /* BSR/JSR always sets R62. */
756 1.1 skrll if (op->flags_used & FLAG_JSR)
757 1.1 skrll mod_reg[j][1] = (1L << (62 - 32));
758 1.1 skrll
759 1.1 skrll /* Conditional execution affects the flags_used. */
760 1.1 skrll switch (ecc)
761 1.1 skrll {
762 1.1 skrll case ECC_TX:
763 1.1 skrll case ECC_FX:
764 1.1 skrll used_reg[j][2] |= flag_reg[j] = FLAG_0;
765 1.1 skrll break;
766 1.1 skrll
767 1.1 skrll case ECC_XT:
768 1.1 skrll case ECC_XF:
769 1.1 skrll used_reg[j][2] |= flag_reg[j] = FLAG_1;
770 1.1 skrll break;
771 1.1 skrll
772 1.1 skrll case ECC_TT:
773 1.1 skrll case ECC_TF:
774 1.1 skrll used_reg[j][2] |= flag_reg[j] = (FLAG_0 | FLAG_1);
775 1.1 skrll break;
776 1.1 skrll }
777 1.1 skrll
778 1.1 skrll for (i = 0; f->operands[i]; i++)
779 1.1 skrll {
780 1.1 skrll flags = d30v_operand_table[f->operands[i]].flags;
781 1.1 skrll shift = 12 - d30v_operand_table[f->operands[i]].position;
782 1.1 skrll bits = d30v_operand_table[f->operands[i]].bits;
783 1.1 skrll if (bits == 32)
784 1.1 skrll mask = 0xffffffff;
785 1.1 skrll else
786 1.1 skrll mask = 0x7FFFFFFF >> (31 - bits);
787 1.1 skrll
788 1.1 skrll if ((flags & OPERAND_PLUS) || (flags & OPERAND_MINUS))
789 1.1 skrll {
790 1.1 skrll /* This is a post-increment or post-decrement.
791 1.1 skrll The previous register needs to be marked as modified. */
792 1.1 skrll shift = 12 - d30v_operand_table[f->operands[i - 1]].position;
793 1.1 skrll regno = (ins >> shift) & 0x3f;
794 1.1 skrll if (regno >= 32)
795 1.1 skrll mod_reg[j][1] |= 1L << (regno - 32);
796 1.1 skrll else
797 1.1 skrll mod_reg[j][0] |= 1L << regno;
798 1.1 skrll }
799 1.1 skrll else if (flags & OPERAND_REG)
800 1.1 skrll {
801 1.1 skrll regno = (ins >> shift) & mask;
802 1.1 skrll /* The memory write functions don't have a destination
803 1.1 skrll register. */
804 1.1 skrll if ((flags & OPERAND_DEST) && !(op->flags_set & FLAG_MEM))
805 1.1 skrll {
806 1.1 skrll /* MODIFIED registers and flags. */
807 1.1 skrll if (flags & OPERAND_ACC)
808 1.1 skrll {
809 1.1 skrll if (regno == 0)
810 1.1 skrll mod_reg[j][2] |= FLAG_A0;
811 1.1 skrll else if (regno == 1)
812 1.1 skrll mod_reg[j][2] |= FLAG_A1;
813 1.1 skrll else
814 1.1 skrll abort ();
815 1.1 skrll }
816 1.1 skrll else if (flags & OPERAND_FLAG)
817 1.1 skrll mod_reg[j][2] |= 1L << regno;
818 1.1 skrll else if (!(flags & OPERAND_CONTROL))
819 1.1 skrll {
820 1.1 skrll int r, z;
821 1.1 skrll
822 1.1 skrll /* Need to check if there are two destination
823 1.1 skrll registers, for example ld2w. */
824 1.1 skrll if (flags & OPERAND_2REG)
825 1.1 skrll z = 1;
826 1.1 skrll else
827 1.1 skrll z = 0;
828 1.1 skrll
829 1.1 skrll for (r = regno; r <= regno + z; r++)
830 1.1 skrll {
831 1.1 skrll if (r >= 32)
832 1.1 skrll mod_reg[j][1] |= 1L << (r - 32);
833 1.1 skrll else
834 1.1 skrll mod_reg[j][0] |= 1L << r;
835 1.1 skrll }
836 1.1 skrll }
837 1.1 skrll }
838 1.1 skrll else
839 1.1 skrll {
840 1.1 skrll /* USED, but not modified registers and flags. */
841 1.1 skrll if (flags & OPERAND_ACC)
842 1.1 skrll {
843 1.1 skrll if (regno == 0)
844 1.1 skrll used_reg[j][2] |= FLAG_A0;
845 1.1 skrll else if (regno == 1)
846 1.1 skrll used_reg[j][2] |= FLAG_A1;
847 1.1 skrll else
848 1.1 skrll abort ();
849 1.1 skrll }
850 1.1 skrll else if (flags & OPERAND_FLAG)
851 1.1 skrll used_reg[j][2] |= 1L << regno;
852 1.1 skrll else if (!(flags & OPERAND_CONTROL))
853 1.1 skrll {
854 1.1 skrll int r, z;
855 1.1 skrll
856 1.1 skrll /* Need to check if there are two source
857 1.1 skrll registers, for example st2w. */
858 1.1 skrll if (flags & OPERAND_2REG)
859 1.1 skrll z = 1;
860 1.1 skrll else
861 1.1 skrll z = 0;
862 1.1 skrll
863 1.1 skrll for (r = regno; r <= regno + z; r++)
864 1.1 skrll {
865 1.1 skrll if (r >= 32)
866 1.1 skrll used_reg[j][1] |= 1L << (r - 32);
867 1.1 skrll else
868 1.1 skrll used_reg[j][0] |= 1L << r;
869 1.1 skrll }
870 1.1 skrll }
871 1.1 skrll }
872 1.1 skrll }
873 1.1 skrll }
874 1.1 skrll }
875 1.1 skrll
876 1.1 skrll flags_set1 = op1->op->flags_set;
877 1.1 skrll flags_set2 = op2->op->flags_set;
878 1.1 skrll flags_used1 = op1->op->flags_used;
879 1.1 skrll flags_used2 = op2->op->flags_used;
880 1.1 skrll
881 1.1 skrll /* Check for illegal combinations with ADDppp/SUBppp. */
882 1.1 skrll if (((flags_set1 & FLAG_NOT_WITH_ADDSUBppp) != 0
883 1.1 skrll && (flags_used2 & FLAG_ADDSUBppp) != 0)
884 1.1 skrll || ((flags_set2 & FLAG_NOT_WITH_ADDSUBppp) != 0
885 1.1 skrll && (flags_used1 & FLAG_ADDSUBppp) != 0))
886 1.1 skrll return 0;
887 1.1 skrll
888 1.1 skrll /* Load instruction combined with half-word multiply is illegal. */
889 1.1 skrll if (((flags_used1 & FLAG_MEM) != 0 && (flags_used2 & FLAG_MUL16))
890 1.1 skrll || ((flags_used2 & FLAG_MEM) != 0 && (flags_used1 & FLAG_MUL16)))
891 1.1 skrll return 0;
892 1.1 skrll
893 1.1 skrll /* Specifically allow add || add by removing carry, overflow bits dependency.
894 1.1 skrll This is safe, even if an addc follows since the IU takes the argument in
895 1.1 skrll the right container, and it writes its results last.
896 1.1 skrll However, don't paralellize add followed by addc or sub followed by
897 1.1 skrll subb. */
898 1.1 skrll if (mod_reg[0][2] == FLAG_CVVA && mod_reg[1][2] == FLAG_CVVA
899 1.1 skrll && (used_reg[0][2] & ~flag_reg[0]) == 0
900 1.1 skrll && (used_reg[1][2] & ~flag_reg[1]) == 0
901 1.1 skrll && op1->op->unit == EITHER && op2->op->unit == EITHER)
902 1.1 skrll {
903 1.1 skrll mod_reg[0][2] = mod_reg[1][2] = 0;
904 1.1 skrll }
905 1.1 skrll
906 1.1 skrll for (j = 0; j < 3; j++)
907 1.1 skrll {
908 1.1 skrll /* If the second instruction depends on the first, we obviously
909 1.1 skrll cannot parallelize. Note, the mod flag implies use, so
910 1.1 skrll check that as well. */
911 1.1 skrll /* If flag_explicitly_parallel is set, then the case of the
912 1.1 skrll second instruction using a register the first instruction
913 1.1 skrll modifies is assumed to be okay; we trust the human. We
914 1.1 skrll don't trust the human if both instructions modify the same
915 1.1 skrll register but we do trust the human if they modify the same
916 1.1 skrll flags. */
917 1.1 skrll /* We have now been requested not to trust the human if the
918 1.1 skrll instructions modify the same flag registers either. */
919 1.1 skrll if (flag_explicitly_parallel)
920 1.1 skrll {
921 1.1 skrll if ((mod_reg[0][j] & mod_reg[1][j]) != 0)
922 1.1 skrll return 0;
923 1.1 skrll }
924 1.1 skrll else
925 1.1 skrll if ((mod_reg[0][j] & (mod_reg[1][j] | used_reg[1][j])) != 0)
926 1.1 skrll return 0;
927 1.1 skrll }
928 1.1 skrll
929 1.1 skrll return 1;
930 1.1 skrll }
931 1.1 skrll
932 1.1 skrll /* Write out a short form instruction if possible.
933 1.1 skrll Return number of instructions not written out. */
934 1.1 skrll
935 1.1 skrll static int
936 1.1 skrll write_2_short (struct d30v_insn *opcode1,
937 1.1 skrll long long insn1,
938 1.1 skrll struct d30v_insn *opcode2,
939 1.1 skrll long long insn2,
940 1.1 skrll exec_type_enum exec_type,
941 1.1 skrll Fixups *fx)
942 1.1 skrll {
943 1.1 skrll long long insn = NOP2;
944 1.1 skrll char *f;
945 1.1 skrll int i, j, where;
946 1.1 skrll
947 1.1 skrll if (exec_type == EXEC_SEQ
948 1.1 skrll && (opcode1->op->flags_used & (FLAG_JMP | FLAG_JSR))
949 1.1 skrll && ((opcode1->op->flags_used & FLAG_DELAY) == 0)
950 1.1 skrll && ((opcode1->ecc == ECC_AL) || ! Optimizing))
951 1.1 skrll {
952 1.1 skrll /* Unconditional, non-delayed branches kill instructions in
953 1.1 skrll the right bin. Conditional branches don't always but if
954 1.1 skrll we are not optimizing, then we have been asked to produce
955 1.1 skrll an error about such constructs. For the purposes of this
956 1.1 skrll test, subroutine calls are considered to be branches. */
957 1.1 skrll write_1_short (opcode1, insn1, fx->next, FALSE);
958 1.1 skrll return 1;
959 1.1 skrll }
960 1.1 skrll
961 1.1 skrll /* Note: we do not have to worry about subroutine calls occurring
962 1.1 skrll in the right hand container. The return address is always
963 1.1 skrll aligned to the next 64 bit boundary, be that 64 or 32 bit away. */
964 1.1 skrll switch (exec_type)
965 1.1 skrll {
966 1.1 skrll case EXEC_UNKNOWN: /* Order not specified. */
967 1.1 skrll if (Optimizing
968 1.1 skrll && parallel_ok (opcode1, insn1, opcode2, insn2, exec_type)
969 1.1 skrll && ! ( (opcode1->op->unit == EITHER_BUT_PREFER_MU
970 1.1 skrll || opcode1->op->unit == MU)
971 1.1 skrll &&
972 1.1 skrll ( opcode2->op->unit == EITHER_BUT_PREFER_MU
973 1.1 skrll || opcode2->op->unit == MU)))
974 1.1 skrll {
975 1.1 skrll /* Parallel. */
976 1.1 skrll exec_type = EXEC_PARALLEL;
977 1.1 skrll
978 1.1 skrll if (opcode1->op->unit == IU
979 1.1 skrll || opcode2->op->unit == MU
980 1.1 skrll || opcode2->op->unit == EITHER_BUT_PREFER_MU)
981 1.1 skrll insn = FM00 | (insn2 << 32) | insn1;
982 1.1 skrll else
983 1.1 skrll {
984 1.1 skrll insn = FM00 | (insn1 << 32) | insn2;
985 1.1 skrll fx = fx->next;
986 1.1 skrll }
987 1.1 skrll }
988 1.1 skrll else if ((opcode1->op->flags_used & (FLAG_JMP | FLAG_JSR)
989 1.1 skrll && ((opcode1->op->flags_used & FLAG_DELAY) == 0))
990 1.1 skrll || opcode1->op->flags_used & FLAG_RP)
991 1.1 skrll {
992 1.1 skrll /* We must emit (non-delayed) branch type instructions
993 1.1 skrll on their own with nothing in the right container. */
994 1.1 skrll /* We must treat repeat instructions likewise, since the
995 1.1 skrll following instruction has to be separate from the repeat
996 1.1 skrll in order to be repeated. */
997 1.1 skrll write_1_short (opcode1, insn1, fx->next, FALSE);
998 1.1 skrll return 1;
999 1.1 skrll }
1000 1.1 skrll else if (prev_left_kills_right_p)
1001 1.1 skrll {
1002 1.1 skrll /* The left instruction kils the right slot, so we
1003 1.1 skrll must leave it empty. */
1004 1.1 skrll write_1_short (opcode1, insn1, fx->next, FALSE);
1005 1.1 skrll return 1;
1006 1.1 skrll }
1007 1.1 skrll else if (opcode1->op->unit == IU)
1008 1.1 skrll {
1009 1.1 skrll if (opcode2->op->unit == EITHER_BUT_PREFER_MU)
1010 1.1 skrll {
1011 1.1 skrll /* Case 103810 is a request from Mitsubishi that opcodes
1012 1.1 skrll with EITHER_BUT_PREFER_MU should not be executed in
1013 1.1 skrll reverse sequential order. */
1014 1.1 skrll write_1_short (opcode1, insn1, fx->next, FALSE);
1015 1.1 skrll return 1;
1016 1.1 skrll }
1017 1.1 skrll
1018 1.1 skrll /* Reverse sequential. */
1019 1.1 skrll insn = FM10 | (insn2 << 32) | insn1;
1020 1.1 skrll exec_type = EXEC_REVSEQ;
1021 1.1 skrll }
1022 1.1 skrll else
1023 1.1 skrll {
1024 1.1 skrll /* Sequential. */
1025 1.1 skrll insn = FM01 | (insn1 << 32) | insn2;
1026 1.1 skrll fx = fx->next;
1027 1.1 skrll exec_type = EXEC_SEQ;
1028 1.1 skrll }
1029 1.1 skrll break;
1030 1.1 skrll
1031 1.1 skrll case EXEC_PARALLEL: /* Parallel. */
1032 1.1 skrll flag_explicitly_parallel = flag_xp_state;
1033 1.1 skrll if (! parallel_ok (opcode1, insn1, opcode2, insn2, exec_type))
1034 1.1 skrll as_bad (_("Instructions may not be executed in parallel"));
1035 1.1 skrll else if (opcode1->op->unit == IU)
1036 1.1 skrll {
1037 1.1 skrll if (opcode2->op->unit == IU)
1038 1.1 skrll as_bad (_("Two IU instructions may not be executed in parallel"));
1039 1.1 skrll as_warn (_("Swapping instruction order"));
1040 1.1 skrll insn = FM00 | (insn2 << 32) | insn1;
1041 1.1 skrll }
1042 1.1 skrll else if (opcode2->op->unit == MU)
1043 1.1 skrll {
1044 1.1 skrll if (opcode1->op->unit == MU)
1045 1.1 skrll as_bad (_("Two MU instructions may not be executed in parallel"));
1046 1.1 skrll else if (opcode1->op->unit == EITHER_BUT_PREFER_MU)
1047 1.1 skrll as_warn (_("Executing %s in IU may not work"), opcode1->op->name);
1048 1.1 skrll as_warn (_("Swapping instruction order"));
1049 1.1 skrll insn = FM00 | (insn2 << 32) | insn1;
1050 1.1 skrll }
1051 1.1 skrll else
1052 1.1 skrll {
1053 1.1 skrll if (opcode2->op->unit == EITHER_BUT_PREFER_MU)
1054 1.1 skrll as_warn (_("Executing %s in IU may not work in parallel execution"),
1055 1.1 skrll opcode2->op->name);
1056 1.1 skrll
1057 1.1 skrll insn = FM00 | (insn1 << 32) | insn2;
1058 1.1 skrll fx = fx->next;
1059 1.1 skrll }
1060 1.1 skrll flag_explicitly_parallel = 0;
1061 1.1 skrll break;
1062 1.1 skrll
1063 1.1 skrll case EXEC_SEQ: /* Sequential. */
1064 1.1 skrll if (opcode1->op->unit == IU)
1065 1.1 skrll as_bad (_("IU instruction may not be in the left container"));
1066 1.1 skrll if (prev_left_kills_right_p)
1067 1.1 skrll as_bad (_("special left instruction `%s' kills instruction "
1068 1.1 skrll "`%s' in right container"),
1069 1.1 skrll opcode1->op->name, opcode2->op->name);
1070 1.1 skrll insn = FM01 | (insn1 << 32) | insn2;
1071 1.1 skrll fx = fx->next;
1072 1.1 skrll break;
1073 1.1 skrll
1074 1.1 skrll case EXEC_REVSEQ: /* Reverse sequential. */
1075 1.1 skrll if (opcode2->op->unit == MU)
1076 1.1 skrll as_bad (_("MU instruction may not be in the right container"));
1077 1.1 skrll if (opcode1->op->unit == EITHER_BUT_PREFER_MU)
1078 1.1 skrll as_warn (_("Executing %s in reverse serial with %s may not work"),
1079 1.1 skrll opcode1->op->name, opcode2->op->name);
1080 1.1 skrll else if (opcode2->op->unit == EITHER_BUT_PREFER_MU)
1081 1.1 skrll as_warn (_("Executing %s in IU in reverse serial may not work"),
1082 1.1 skrll opcode2->op->name);
1083 1.1 skrll insn = FM10 | (insn1 << 32) | insn2;
1084 1.1 skrll fx = fx->next;
1085 1.1 skrll break;
1086 1.1 skrll
1087 1.1 skrll default:
1088 1.1 skrll as_fatal (_("unknown execution type passed to write_2_short()"));
1089 1.1 skrll }
1090 1.1 skrll
1091 1.1 skrll f = frag_more (8);
1092 1.1.1.2 christos dwarf2_emit_insn (8);
1093 1.1 skrll d30v_number_to_chars (f, insn, 8);
1094 1.1 skrll
1095 1.1 skrll /* If the previous instruction was a 32-bit multiply but it is put into a
1096 1.1 skrll parallel container, mark the current instruction as being a 32-bit
1097 1.1 skrll multiply. */
1098 1.1 skrll if (prev_mul32_p && exec_type == EXEC_PARALLEL)
1099 1.1 skrll cur_mul32_p = 1;
1100 1.1 skrll
1101 1.1 skrll for (j = 0; j < 2; j++)
1102 1.1 skrll {
1103 1.1 skrll for (i = 0; i < fx->fc; i++)
1104 1.1 skrll {
1105 1.1 skrll if (fx->fix[i].reloc)
1106 1.1 skrll {
1107 1.1 skrll where = (f - frag_now->fr_literal) + 4 * j;
1108 1.1 skrll
1109 1.1 skrll fix_new_exp (frag_now,
1110 1.1 skrll where,
1111 1.1 skrll fx->fix[i].size,
1112 1.1 skrll &(fx->fix[i].exp),
1113 1.1 skrll fx->fix[i].pcrel,
1114 1.1 skrll fx->fix[i].reloc);
1115 1.1 skrll }
1116 1.1 skrll }
1117 1.1 skrll
1118 1.1 skrll fx->fc = 0;
1119 1.1 skrll fx = fx->next;
1120 1.1 skrll }
1121 1.1 skrll
1122 1.1 skrll return 0;
1123 1.1 skrll }
1124 1.1 skrll
1125 1.1 skrll /* Get a pointer to an entry in the format table.
1126 1.1 skrll It must look at all formats for an opcode and use the operands
1127 1.1 skrll to choose the correct one. Return NULL on error. */
1128 1.1 skrll
1129 1.1 skrll static struct d30v_format *
1130 1.1 skrll find_format (struct d30v_opcode *opcode,
1131 1.1 skrll expressionS myops[],
1132 1.1 skrll int fsize,
1133 1.1 skrll int cmp_hack)
1134 1.1 skrll {
1135 1.1.1.2 christos int match, opcode_index, i = 0, j, k;
1136 1.1 skrll struct d30v_format *fm;
1137 1.1 skrll
1138 1.1 skrll if (opcode == NULL)
1139 1.1 skrll return NULL;
1140 1.1 skrll
1141 1.1 skrll /* Get all the operands and save them as expressions. */
1142 1.1.1.2 christos get_operands (myops, cmp_hack);
1143 1.1 skrll
1144 1.1.1.2 christos while ((opcode_index = opcode->format[i++]) != 0)
1145 1.1 skrll {
1146 1.1.1.2 christos if (fsize == FORCE_SHORT && opcode_index >= LONG)
1147 1.1 skrll continue;
1148 1.1 skrll
1149 1.1.1.2 christos if (fsize == FORCE_LONG && opcode_index < LONG)
1150 1.1 skrll continue;
1151 1.1 skrll
1152 1.1.1.2 christos fm = (struct d30v_format *) &d30v_format_table[opcode_index];
1153 1.1.1.2 christos k = opcode_index;
1154 1.1.1.2 christos while (fm->form == opcode_index)
1155 1.1 skrll {
1156 1.1 skrll match = 1;
1157 1.1 skrll /* Now check the operands for compatibility. */
1158 1.1 skrll for (j = 0; match && fm->operands[j]; j++)
1159 1.1 skrll {
1160 1.1 skrll int flags = d30v_operand_table[fm->operands[j]].flags;
1161 1.1 skrll int bits = d30v_operand_table[fm->operands[j]].bits;
1162 1.1 skrll int X_op = myops[j].X_op;
1163 1.1 skrll int num = myops[j].X_add_number;
1164 1.1 skrll
1165 1.1 skrll if (flags & OPERAND_SPECIAL)
1166 1.1 skrll break;
1167 1.1 skrll else if (X_op == O_illegal)
1168 1.1 skrll match = 0;
1169 1.1 skrll else if (flags & OPERAND_REG)
1170 1.1 skrll {
1171 1.1 skrll if (X_op != O_register
1172 1.1 skrll || ((flags & OPERAND_ACC) && !(num & OPERAND_ACC))
1173 1.1 skrll || (!(flags & OPERAND_ACC) && (num & OPERAND_ACC))
1174 1.1 skrll || ((flags & OPERAND_FLAG) && !(num & OPERAND_FLAG))
1175 1.1 skrll || (!(flags & (OPERAND_FLAG | OPERAND_CONTROL)) && (num & OPERAND_FLAG))
1176 1.1 skrll || ((flags & OPERAND_CONTROL)
1177 1.1 skrll && !(num & (OPERAND_CONTROL | OPERAND_FLAG))))
1178 1.1 skrll match = 0;
1179 1.1 skrll }
1180 1.1 skrll else if (((flags & OPERAND_MINUS)
1181 1.1 skrll && (X_op != O_absent || num != OPERAND_MINUS))
1182 1.1 skrll || ((flags & OPERAND_PLUS)
1183 1.1 skrll && (X_op != O_absent || num != OPERAND_PLUS))
1184 1.1 skrll || ((flags & OPERAND_ATMINUS)
1185 1.1 skrll && (X_op != O_absent || num != OPERAND_ATMINUS))
1186 1.1 skrll || ((flags & OPERAND_ATPAR)
1187 1.1 skrll && (X_op != O_absent || num != OPERAND_ATPAR))
1188 1.1 skrll || ((flags & OPERAND_ATSIGN)
1189 1.1 skrll && (X_op != O_absent || num != OPERAND_ATSIGN)))
1190 1.1 skrll match = 0;
1191 1.1 skrll else if (flags & OPERAND_NUM)
1192 1.1 skrll {
1193 1.1 skrll /* A number can be a constant or symbol expression. */
1194 1.1 skrll
1195 1.1 skrll /* If we have found a register name, but that name
1196 1.1 skrll also matches a symbol, then re-parse the name as
1197 1.1 skrll an expression. */
1198 1.1 skrll if (X_op == O_register
1199 1.1 skrll && symbol_find ((char *) myops[j].X_op_symbol))
1200 1.1 skrll {
1201 1.1 skrll input_line_pointer = (char *) myops[j].X_op_symbol;
1202 1.1 skrll expression (&myops[j]);
1203 1.1 skrll }
1204 1.1 skrll
1205 1.1 skrll /* Turn an expression into a symbol for later resolution. */
1206 1.1 skrll if (X_op != O_absent && X_op != O_constant
1207 1.1 skrll && X_op != O_symbol && X_op != O_register
1208 1.1 skrll && X_op != O_big)
1209 1.1 skrll {
1210 1.1 skrll symbolS *sym = make_expr_symbol (&myops[j]);
1211 1.1 skrll myops[j].X_op = X_op = O_symbol;
1212 1.1 skrll myops[j].X_add_symbol = sym;
1213 1.1 skrll myops[j].X_add_number = num = 0;
1214 1.1 skrll }
1215 1.1 skrll
1216 1.1 skrll if (fm->form >= LONG)
1217 1.1 skrll {
1218 1.1 skrll /* If we're testing for a LONG format, either fits. */
1219 1.1 skrll if (X_op != O_constant && X_op != O_symbol)
1220 1.1 skrll match = 0;
1221 1.1 skrll }
1222 1.1 skrll else if (fm->form < LONG
1223 1.1 skrll && ((fsize == FORCE_SHORT && X_op == O_symbol)
1224 1.1 skrll || (fm->form == SHORT_D2 && j == 0)))
1225 1.1 skrll match = 1;
1226 1.1 skrll
1227 1.1 skrll /* This is the tricky part. Will the constant or symbol
1228 1.1 skrll fit into the space in the current format? */
1229 1.1 skrll else if (X_op == O_constant)
1230 1.1 skrll {
1231 1.1 skrll if (check_range (num, bits, flags))
1232 1.1 skrll match = 0;
1233 1.1 skrll }
1234 1.1 skrll else if (X_op == O_symbol
1235 1.1 skrll && S_IS_DEFINED (myops[j].X_add_symbol)
1236 1.1 skrll && S_GET_SEGMENT (myops[j].X_add_symbol) == now_seg
1237 1.1 skrll && opcode->reloc_flag == RELOC_PCREL)
1238 1.1 skrll {
1239 1.1 skrll /* If the symbol is defined, see if the value will fit
1240 1.1 skrll into the form we're considering. */
1241 1.1 skrll fragS *f;
1242 1.1 skrll long value;
1243 1.1 skrll
1244 1.1 skrll /* Calculate the current address by running through the
1245 1.1 skrll previous frags and adding our current offset. */
1246 1.1 skrll value = 0;
1247 1.1 skrll for (f = frchain_now->frch_root; f; f = f->fr_next)
1248 1.1 skrll value += f->fr_fix + f->fr_offset;
1249 1.1 skrll value = (S_GET_VALUE (myops[j].X_add_symbol) - value
1250 1.1 skrll - (obstack_next_free (&frchain_now->frch_obstack)
1251 1.1 skrll - frag_now->fr_literal));
1252 1.1 skrll if (check_range (value, bits, flags))
1253 1.1 skrll match = 0;
1254 1.1 skrll }
1255 1.1 skrll else
1256 1.1 skrll match = 0;
1257 1.1 skrll }
1258 1.1 skrll }
1259 1.1 skrll /* We're only done if the operands matched so far AND there
1260 1.1 skrll are no more to check. */
1261 1.1 skrll if (match && myops[j].X_op == 0)
1262 1.1 skrll {
1263 1.1 skrll /* Final check - issue a warning if an odd numbered register
1264 1.1 skrll is used as the first register in an instruction that reads
1265 1.1 skrll or writes 2 registers. */
1266 1.1 skrll
1267 1.1 skrll for (j = 0; fm->operands[j]; j++)
1268 1.1 skrll if (myops[j].X_op == O_register
1269 1.1 skrll && (myops[j].X_add_number & 1)
1270 1.1 skrll && (d30v_operand_table[fm->operands[j]].flags & OPERAND_2REG))
1271 1.1 skrll as_warn (_("Odd numbered register used as target of multi-register instruction"));
1272 1.1 skrll
1273 1.1 skrll return fm;
1274 1.1 skrll }
1275 1.1 skrll fm = (struct d30v_format *) &d30v_format_table[++k];
1276 1.1 skrll }
1277 1.1 skrll }
1278 1.1 skrll return NULL;
1279 1.1 skrll }
1280 1.1 skrll
1281 1.1 skrll /* Assemble a single instruction and return an opcode.
1282 1.1 skrll Return -1 (an invalid opcode) on error. */
1283 1.1 skrll
1284 1.1 skrll #define NAME_BUF_LEN 20
1285 1.1 skrll
1286 1.1 skrll static long long
1287 1.1 skrll do_assemble (char *str,
1288 1.1 skrll struct d30v_insn *opcode,
1289 1.1 skrll int shortp,
1290 1.1 skrll int is_parallel)
1291 1.1 skrll {
1292 1.1 skrll char *op_start;
1293 1.1 skrll char *save;
1294 1.1 skrll char *op_end;
1295 1.1 skrll char name[NAME_BUF_LEN];
1296 1.1 skrll int cmp_hack;
1297 1.1 skrll int nlen = 0;
1298 1.1 skrll int fsize = (shortp ? FORCE_SHORT : 0);
1299 1.1 skrll expressionS myops[6];
1300 1.1 skrll long long insn;
1301 1.1 skrll
1302 1.1 skrll /* Drop leading whitespace. */
1303 1.1 skrll while (*str == ' ')
1304 1.1 skrll str++;
1305 1.1 skrll
1306 1.1 skrll /* Find the opcode end. */
1307 1.1 skrll for (op_start = op_end = str;
1308 1.1 skrll *op_end
1309 1.1 skrll && nlen < (NAME_BUF_LEN - 1)
1310 1.1 skrll && *op_end != '/'
1311 1.1 skrll && !is_end_of_line[(unsigned char) *op_end] && *op_end != ' ';
1312 1.1 skrll op_end++)
1313 1.1 skrll {
1314 1.1 skrll name[nlen] = TOLOWER (op_start[nlen]);
1315 1.1 skrll nlen++;
1316 1.1 skrll }
1317 1.1 skrll
1318 1.1 skrll if (nlen == 0)
1319 1.1 skrll return -1;
1320 1.1 skrll
1321 1.1 skrll name[nlen] = 0;
1322 1.1 skrll
1323 1.1 skrll /* If there is an execution condition code, handle it. */
1324 1.1 skrll if (*op_end == '/')
1325 1.1 skrll {
1326 1.1 skrll int i = 0;
1327 1.1 skrll while ((i < ECC_MAX) && strncasecmp (d30v_ecc_names[i], op_end + 1, 2))
1328 1.1 skrll i++;
1329 1.1 skrll
1330 1.1 skrll if (i == ECC_MAX)
1331 1.1 skrll {
1332 1.1 skrll char tmp[4];
1333 1.1 skrll strncpy (tmp, op_end + 1, 2);
1334 1.1 skrll tmp[2] = 0;
1335 1.1 skrll as_bad (_("unknown condition code: %s"), tmp);
1336 1.1 skrll return -1;
1337 1.1 skrll }
1338 1.1 skrll opcode->ecc = i;
1339 1.1 skrll op_end += 3;
1340 1.1 skrll }
1341 1.1 skrll else
1342 1.1 skrll opcode->ecc = ECC_AL;
1343 1.1 skrll
1344 1.1 skrll /* CMP and CMPU change their name based on condition codes. */
1345 1.1 skrll if (!strncmp (name, "cmp", 3))
1346 1.1 skrll {
1347 1.1 skrll int p, i;
1348 1.1.1.2 christos char **d30v_str = (char **) d30v_cc_names;
1349 1.1.1.2 christos
1350 1.1 skrll if (name[3] == 'u')
1351 1.1 skrll p = 4;
1352 1.1 skrll else
1353 1.1 skrll p = 3;
1354 1.1 skrll
1355 1.1.1.2 christos for (i = 1; *d30v_str && strncmp (*d30v_str, &name[p], 2); i++, d30v_str++)
1356 1.1 skrll ;
1357 1.1 skrll
1358 1.1 skrll /* cmpu only supports some condition codes. */
1359 1.1 skrll if (p == 4)
1360 1.1 skrll {
1361 1.1 skrll if (i < 3 || i > 6)
1362 1.1 skrll {
1363 1.1 skrll name[p + 2] = 0;
1364 1.1 skrll as_bad (_("cmpu doesn't support condition code %s"), &name[p]);
1365 1.1 skrll }
1366 1.1 skrll }
1367 1.1 skrll
1368 1.1.1.2 christos if (!*d30v_str)
1369 1.1 skrll {
1370 1.1 skrll name[p + 2] = 0;
1371 1.1 skrll as_bad (_("unknown condition code: %s"), &name[p]);
1372 1.1 skrll }
1373 1.1 skrll
1374 1.1 skrll cmp_hack = i;
1375 1.1 skrll name[p] = 0;
1376 1.1 skrll }
1377 1.1 skrll else
1378 1.1 skrll cmp_hack = 0;
1379 1.1 skrll
1380 1.1 skrll /* Need to look for .s or .l. */
1381 1.1 skrll if (name[nlen - 2] == '.')
1382 1.1 skrll {
1383 1.1 skrll switch (name[nlen - 1])
1384 1.1 skrll {
1385 1.1 skrll case 's':
1386 1.1 skrll fsize = FORCE_SHORT;
1387 1.1 skrll break;
1388 1.1 skrll case 'l':
1389 1.1 skrll fsize = FORCE_LONG;
1390 1.1 skrll break;
1391 1.1 skrll }
1392 1.1 skrll name[nlen - 2] = 0;
1393 1.1 skrll }
1394 1.1 skrll
1395 1.1 skrll /* Find the first opcode with the proper name. */
1396 1.1 skrll opcode->op = (struct d30v_opcode *) hash_find (d30v_hash, name);
1397 1.1 skrll if (opcode->op == NULL)
1398 1.1 skrll {
1399 1.1 skrll as_bad (_("unknown opcode: %s"), name);
1400 1.1 skrll return -1;
1401 1.1 skrll }
1402 1.1 skrll
1403 1.1 skrll save = input_line_pointer;
1404 1.1 skrll input_line_pointer = op_end;
1405 1.1 skrll while (!(opcode->form = find_format (opcode->op, myops, fsize, cmp_hack)))
1406 1.1 skrll {
1407 1.1 skrll opcode->op++;
1408 1.1 skrll if (opcode->op->name == NULL || strcmp (opcode->op->name, name))
1409 1.1 skrll {
1410 1.1 skrll as_bad (_("operands for opcode `%s' do not match any valid format"),
1411 1.1 skrll name);
1412 1.1 skrll return -1;
1413 1.1 skrll }
1414 1.1 skrll }
1415 1.1 skrll input_line_pointer = save;
1416 1.1 skrll
1417 1.1 skrll insn = build_insn (opcode, myops);
1418 1.1 skrll
1419 1.1 skrll /* Propagate multiply status. */
1420 1.1 skrll if (insn != -1)
1421 1.1 skrll {
1422 1.1 skrll if (is_parallel && prev_mul32_p)
1423 1.1 skrll cur_mul32_p = 1;
1424 1.1 skrll else
1425 1.1 skrll {
1426 1.1 skrll prev_mul32_p = cur_mul32_p;
1427 1.1 skrll cur_mul32_p = (opcode->op->flags_used & FLAG_MUL32) != 0;
1428 1.1 skrll }
1429 1.1 skrll }
1430 1.1 skrll
1431 1.1 skrll /* Propagate left_kills_right status. */
1432 1.1 skrll if (insn != -1)
1433 1.1 skrll {
1434 1.1 skrll prev_left_kills_right_p = cur_left_kills_right_p;
1435 1.1 skrll
1436 1.1 skrll if (opcode->op->flags_set & FLAG_LKR)
1437 1.1 skrll {
1438 1.1 skrll cur_left_kills_right_p = 1;
1439 1.1 skrll
1440 1.1 skrll if (strcmp (opcode->op->name, "mvtsys") == 0)
1441 1.1 skrll {
1442 1.1 skrll /* Left kills right for only mvtsys only for
1443 1.1 skrll PSW/PSWH/PSWL/flags target. */
1444 1.1 skrll if ((myops[0].X_op == O_register) &&
1445 1.1 skrll ((myops[0].X_add_number == OPERAND_CONTROL) || /* psw */
1446 1.1 skrll (myops[0].X_add_number == OPERAND_CONTROL+MAX_CONTROL_REG+2) || /* pswh */
1447 1.1 skrll (myops[0].X_add_number == OPERAND_CONTROL+MAX_CONTROL_REG+1) || /* pswl */
1448 1.1 skrll (myops[0].X_add_number == OPERAND_FLAG+0) || /* f0 */
1449 1.1 skrll (myops[0].X_add_number == OPERAND_FLAG+1) || /* f1 */
1450 1.1 skrll (myops[0].X_add_number == OPERAND_FLAG+2) || /* f2 */
1451 1.1 skrll (myops[0].X_add_number == OPERAND_FLAG+3) || /* f3 */
1452 1.1 skrll (myops[0].X_add_number == OPERAND_FLAG+4) || /* f4 */
1453 1.1 skrll (myops[0].X_add_number == OPERAND_FLAG+5) || /* f5 */
1454 1.1 skrll (myops[0].X_add_number == OPERAND_FLAG+6) || /* f6 */
1455 1.1 skrll (myops[0].X_add_number == OPERAND_FLAG+7))) /* f7 */
1456 1.1 skrll {
1457 1.1 skrll cur_left_kills_right_p = 1;
1458 1.1 skrll }
1459 1.1 skrll else
1460 1.1 skrll {
1461 1.1 skrll /* Other mvtsys target registers don't kill right
1462 1.1 skrll instruction. */
1463 1.1 skrll cur_left_kills_right_p = 0;
1464 1.1 skrll }
1465 1.1 skrll } /* mvtsys */
1466 1.1 skrll }
1467 1.1 skrll else
1468 1.1 skrll cur_left_kills_right_p = 0;
1469 1.1 skrll }
1470 1.1 skrll
1471 1.1 skrll return insn;
1472 1.1 skrll }
1473 1.1 skrll
1474 1.1 skrll /* Called internally to handle all alignment needs. This takes care
1475 1.1 skrll of eliding calls to frag_align if'n the cached current alignment
1476 1.1 skrll says we've already got it, as well as taking care of the auto-aligning
1477 1.1 skrll labels wrt code. */
1478 1.1 skrll
1479 1.1 skrll static void
1480 1.1 skrll d30v_align (int n, char *pfill, symbolS *label)
1481 1.1 skrll {
1482 1.1 skrll /* The front end is prone to changing segments out from under us
1483 1.1 skrll temporarily when -g is in effect. */
1484 1.1 skrll int switched_seg_p = (d30v_current_align_seg != now_seg);
1485 1.1 skrll
1486 1.1 skrll /* Do not assume that if 'd30v_current_align >= n' and
1487 1.1 skrll '! switched_seg_p' that it is safe to avoid performing
1488 1.1 skrll this alignment request. The alignment of the current frag
1489 1.1 skrll can be changed under our feet, for example by a .ascii
1490 1.1 skrll directive in the source code. cf testsuite/gas/d30v/reloc.s */
1491 1.1 skrll d30v_cleanup (FALSE);
1492 1.1 skrll
1493 1.1 skrll if (pfill == NULL)
1494 1.1 skrll {
1495 1.1 skrll if (n > 2
1496 1.1 skrll && (bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0)
1497 1.1 skrll {
1498 1.1 skrll static char const nop[4] = { 0x00, 0xf0, 0x00, 0x00 };
1499 1.1 skrll
1500 1.1 skrll /* First, make sure we're on a four-byte boundary, in case
1501 1.1 skrll someone has been putting .byte values the text section. */
1502 1.1 skrll if (d30v_current_align < 2 || switched_seg_p)
1503 1.1 skrll frag_align (2, 0, 0);
1504 1.1 skrll frag_align_pattern (n, nop, sizeof nop, 0);
1505 1.1 skrll }
1506 1.1 skrll else
1507 1.1 skrll frag_align (n, 0, 0);
1508 1.1 skrll }
1509 1.1 skrll else
1510 1.1 skrll frag_align (n, *pfill, 0);
1511 1.1 skrll
1512 1.1 skrll if (!switched_seg_p)
1513 1.1 skrll d30v_current_align = n;
1514 1.1 skrll
1515 1.1 skrll if (label != NULL)
1516 1.1 skrll {
1517 1.1 skrll symbolS *sym;
1518 1.1 skrll int label_seen = FALSE;
1519 1.1 skrll struct frag *old_frag;
1520 1.1 skrll valueT old_value;
1521 1.1 skrll valueT new_value;
1522 1.1 skrll
1523 1.1.1.2 christos gas_assert (S_GET_SEGMENT (label) == now_seg);
1524 1.1 skrll
1525 1.1 skrll old_frag = symbol_get_frag (label);
1526 1.1 skrll old_value = S_GET_VALUE (label);
1527 1.1 skrll new_value = (valueT) frag_now_fix ();
1528 1.1 skrll
1529 1.1 skrll /* It is possible to have more than one label at a particular
1530 1.1 skrll address, especially if debugging is enabled, so we must
1531 1.1 skrll take care to adjust all the labels at this address in this
1532 1.1 skrll fragment. To save time we search from the end of the symbol
1533 1.1 skrll list, backwards, since the symbols we are interested in are
1534 1.1 skrll almost certainly the ones that were most recently added.
1535 1.1 skrll Also to save time we stop searching once we have seen at least
1536 1.1 skrll one matching label, and we encounter a label that is no longer
1537 1.1 skrll in the target fragment. Note, this search is guaranteed to
1538 1.1 skrll find at least one match when sym == label, so no special case
1539 1.1 skrll code is necessary. */
1540 1.1 skrll for (sym = symbol_lastP; sym != NULL; sym = symbol_previous (sym))
1541 1.1 skrll {
1542 1.1 skrll if (symbol_get_frag (sym) == old_frag
1543 1.1 skrll && S_GET_VALUE (sym) == old_value)
1544 1.1 skrll {
1545 1.1 skrll label_seen = TRUE;
1546 1.1 skrll symbol_set_frag (sym, frag_now);
1547 1.1 skrll S_SET_VALUE (sym, new_value);
1548 1.1 skrll }
1549 1.1 skrll else if (label_seen && symbol_get_frag (sym) != old_frag)
1550 1.1 skrll break;
1551 1.1 skrll }
1552 1.1 skrll }
1553 1.1 skrll
1554 1.1 skrll record_alignment (now_seg, n);
1555 1.1 skrll }
1556 1.1 skrll
1557 1.1 skrll /* This is the main entry point for the machine-dependent assembler.
1558 1.1 skrll STR points to a machine-dependent instruction. This function is
1559 1.1 skrll supposed to emit the frags/bytes it assembles to. For the D30V, it
1560 1.1 skrll mostly handles the special VLIW parsing and packing and leaves the
1561 1.1 skrll difficult stuff to do_assemble (). */
1562 1.1 skrll
1563 1.1 skrll static long long prev_insn = -1;
1564 1.1 skrll static struct d30v_insn prev_opcode;
1565 1.1 skrll static subsegT prev_subseg;
1566 1.1 skrll static segT prev_seg = 0;
1567 1.1 skrll
1568 1.1 skrll void
1569 1.1 skrll md_assemble (char *str)
1570 1.1 skrll {
1571 1.1 skrll struct d30v_insn opcode;
1572 1.1 skrll long long insn;
1573 1.1 skrll /* Execution type; parallel, etc. */
1574 1.1 skrll exec_type_enum extype = EXEC_UNKNOWN;
1575 1.1 skrll /* Saved extype. Used for multiline instructions. */
1576 1.1 skrll static exec_type_enum etype = EXEC_UNKNOWN;
1577 1.1 skrll char *str2;
1578 1.1 skrll
1579 1.1 skrll if ((prev_insn != -1) && prev_seg
1580 1.1 skrll && ((prev_seg != now_seg) || (prev_subseg != now_subseg)))
1581 1.1 skrll d30v_cleanup (FALSE);
1582 1.1 skrll
1583 1.1 skrll if (d30v_current_align < 3)
1584 1.1 skrll d30v_align (3, NULL, d30v_last_label);
1585 1.1 skrll else if (d30v_current_align > 3)
1586 1.1 skrll d30v_current_align = 3;
1587 1.1 skrll d30v_last_label = NULL;
1588 1.1 skrll
1589 1.1 skrll flag_explicitly_parallel = 0;
1590 1.1 skrll flag_xp_state = 0;
1591 1.1 skrll if (etype == EXEC_UNKNOWN)
1592 1.1 skrll {
1593 1.1 skrll /* Look for the special multiple instruction separators. */
1594 1.1 skrll str2 = strstr (str, "||");
1595 1.1 skrll if (str2)
1596 1.1 skrll {
1597 1.1 skrll extype = EXEC_PARALLEL;
1598 1.1 skrll flag_xp_state = 1;
1599 1.1 skrll }
1600 1.1 skrll else
1601 1.1 skrll {
1602 1.1 skrll str2 = strstr (str, "->");
1603 1.1 skrll if (str2)
1604 1.1 skrll extype = EXEC_SEQ;
1605 1.1 skrll else
1606 1.1 skrll {
1607 1.1 skrll str2 = strstr (str, "<-");
1608 1.1 skrll if (str2)
1609 1.1 skrll extype = EXEC_REVSEQ;
1610 1.1 skrll }
1611 1.1 skrll }
1612 1.1 skrll
1613 1.1 skrll /* STR2 points to the separator, if one. */
1614 1.1 skrll if (str2)
1615 1.1 skrll {
1616 1.1 skrll *str2 = 0;
1617 1.1 skrll
1618 1.1 skrll /* If two instructions are present and we already have one saved,
1619 1.1 skrll then first write it out. */
1620 1.1 skrll d30v_cleanup (FALSE);
1621 1.1 skrll
1622 1.1 skrll /* Assemble first instruction and save it. */
1623 1.1 skrll prev_insn = do_assemble (str, &prev_opcode, 1, 0);
1624 1.1 skrll if (prev_insn == -1)
1625 1.1 skrll as_bad (_("Cannot assemble instruction"));
1626 1.1 skrll if (prev_opcode.form != NULL && prev_opcode.form->form >= LONG)
1627 1.1 skrll as_bad (_("First opcode is long. Unable to mix instructions as specified."));
1628 1.1 skrll fixups = fixups->next;
1629 1.1 skrll str = str2 + 2;
1630 1.1 skrll prev_seg = now_seg;
1631 1.1 skrll prev_subseg = now_subseg;
1632 1.1 skrll }
1633 1.1 skrll }
1634 1.1 skrll
1635 1.1 skrll insn = do_assemble (str, &opcode,
1636 1.1 skrll (extype != EXEC_UNKNOWN || etype != EXEC_UNKNOWN),
1637 1.1 skrll extype == EXEC_PARALLEL);
1638 1.1 skrll if (insn == -1)
1639 1.1 skrll {
1640 1.1 skrll if (extype != EXEC_UNKNOWN)
1641 1.1 skrll etype = extype;
1642 1.1 skrll as_bad (_("Cannot assemble instruction"));
1643 1.1 skrll return;
1644 1.1 skrll }
1645 1.1 skrll
1646 1.1 skrll if (etype != EXEC_UNKNOWN)
1647 1.1 skrll {
1648 1.1 skrll extype = etype;
1649 1.1 skrll etype = EXEC_UNKNOWN;
1650 1.1 skrll }
1651 1.1 skrll
1652 1.1 skrll /* Word multiply instructions must not be followed by either a load or a
1653 1.1 skrll 16-bit multiply instruction in the next cycle. */
1654 1.1 skrll if ( (extype != EXEC_REVSEQ)
1655 1.1 skrll && prev_mul32_p
1656 1.1 skrll && (opcode.op->flags_used & (FLAG_MEM | FLAG_MUL16)))
1657 1.1 skrll {
1658 1.1 skrll /* However, load and multiply should able to be combined in a parallel
1659 1.1 skrll operation, so check for that first. */
1660 1.1 skrll if (prev_insn != -1
1661 1.1 skrll && (opcode.op->flags_used & FLAG_MEM)
1662 1.1 skrll && opcode.form->form < LONG
1663 1.1 skrll && (extype == EXEC_PARALLEL || (Optimizing && extype == EXEC_UNKNOWN))
1664 1.1 skrll && parallel_ok (&prev_opcode, (long) prev_insn,
1665 1.1 skrll &opcode, (long) insn, extype)
1666 1.1 skrll && write_2_short (&prev_opcode, (long) prev_insn,
1667 1.1 skrll &opcode, (long) insn, extype, fixups) == 0)
1668 1.1 skrll {
1669 1.1 skrll /* No instructions saved. */
1670 1.1 skrll prev_insn = -1;
1671 1.1 skrll return;
1672 1.1 skrll }
1673 1.1 skrll else
1674 1.1 skrll {
1675 1.1 skrll /* Can't parallelize, flush previous instruction and emit a
1676 1.1 skrll word of NOPS, unless the previous instruction is a NOP,
1677 1.1 skrll in which case just flush it, as this will generate a word
1678 1.1 skrll of NOPs for us. */
1679 1.1 skrll
1680 1.1 skrll if (prev_insn != -1 && (strcmp (prev_opcode.op->name, "nop") == 0))
1681 1.1 skrll d30v_cleanup (FALSE);
1682 1.1 skrll else
1683 1.1 skrll {
1684 1.1 skrll char *f;
1685 1.1 skrll
1686 1.1 skrll if (prev_insn != -1)
1687 1.1 skrll d30v_cleanup (TRUE);
1688 1.1 skrll else
1689 1.1 skrll {
1690 1.1 skrll f = frag_more (8);
1691 1.1.1.2 christos dwarf2_emit_insn (8);
1692 1.1 skrll d30v_number_to_chars (f, NOP2, 8);
1693 1.1 skrll
1694 1.1 skrll if (warn_nops == NOP_ALL || warn_nops == NOP_MULTIPLY)
1695 1.1 skrll {
1696 1.1 skrll if (opcode.op->flags_used & FLAG_MEM)
1697 1.1 skrll as_warn (_("word of NOPs added between word multiply and load"));
1698 1.1 skrll else
1699 1.1 skrll as_warn (_("word of NOPs added between word multiply and 16-bit multiply"));
1700 1.1 skrll }
1701 1.1 skrll }
1702 1.1 skrll }
1703 1.1 skrll
1704 1.1 skrll extype = EXEC_UNKNOWN;
1705 1.1 skrll }
1706 1.1 skrll }
1707 1.1 skrll else if ( (extype == EXEC_REVSEQ)
1708 1.1 skrll && cur_mul32_p
1709 1.1 skrll && (prev_opcode.op->flags_used & (FLAG_MEM | FLAG_MUL16)))
1710 1.1 skrll {
1711 1.1 skrll /* Can't parallelize, flush current instruction and add a
1712 1.1 skrll sequential NOP. */
1713 1.1 skrll write_1_short (&opcode, (long) insn, fixups->next->next, TRUE);
1714 1.1 skrll
1715 1.1 skrll /* Make the previous instruction the current one. */
1716 1.1 skrll extype = EXEC_UNKNOWN;
1717 1.1 skrll insn = prev_insn;
1718 1.1 skrll now_seg = prev_seg;
1719 1.1 skrll now_subseg = prev_subseg;
1720 1.1 skrll prev_insn = -1;
1721 1.1 skrll cur_mul32_p = prev_mul32_p;
1722 1.1 skrll prev_mul32_p = 0;
1723 1.1 skrll memcpy (&opcode, &prev_opcode, sizeof (prev_opcode));
1724 1.1 skrll }
1725 1.1 skrll
1726 1.1 skrll /* If this is a long instruction, write it and any previous short
1727 1.1 skrll instruction. */
1728 1.1 skrll if (opcode.form->form >= LONG)
1729 1.1 skrll {
1730 1.1 skrll if (extype != EXEC_UNKNOWN)
1731 1.1 skrll as_bad (_("Instruction uses long version, so it cannot be mixed as specified"));
1732 1.1 skrll d30v_cleanup (FALSE);
1733 1.1 skrll write_long (&opcode, insn, fixups);
1734 1.1 skrll prev_insn = -1;
1735 1.1 skrll }
1736 1.1 skrll else if ((prev_insn != -1)
1737 1.1 skrll && (write_2_short
1738 1.1 skrll (&prev_opcode, (long) prev_insn, &opcode,
1739 1.1 skrll (long) insn, extype, fixups) == 0))
1740 1.1 skrll {
1741 1.1 skrll /* No instructions saved. */
1742 1.1 skrll prev_insn = -1;
1743 1.1 skrll }
1744 1.1 skrll else
1745 1.1 skrll {
1746 1.1 skrll if (extype != EXEC_UNKNOWN)
1747 1.1 skrll as_bad (_("Unable to mix instructions as specified"));
1748 1.1 skrll
1749 1.1 skrll /* Save off last instruction so it may be packed on next pass. */
1750 1.1 skrll memcpy (&prev_opcode, &opcode, sizeof (prev_opcode));
1751 1.1 skrll prev_insn = insn;
1752 1.1 skrll prev_seg = now_seg;
1753 1.1 skrll prev_subseg = now_subseg;
1754 1.1 skrll fixups = fixups->next;
1755 1.1 skrll prev_mul32_p = cur_mul32_p;
1756 1.1 skrll }
1757 1.1 skrll }
1758 1.1 skrll
1759 1.1 skrll /* If while processing a fixup, a reloc really needs to be created,
1760 1.1 skrll then it is done here. */
1761 1.1 skrll
1762 1.1 skrll arelent *
1763 1.1 skrll tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
1764 1.1 skrll {
1765 1.1 skrll arelent *reloc;
1766 1.1 skrll reloc = xmalloc (sizeof (arelent));
1767 1.1 skrll reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
1768 1.1 skrll *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1769 1.1 skrll reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
1770 1.1 skrll reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
1771 1.1 skrll if (reloc->howto == NULL)
1772 1.1 skrll {
1773 1.1 skrll as_bad_where (fixp->fx_file, fixp->fx_line,
1774 1.1 skrll _("reloc %d not supported by object file format"),
1775 1.1 skrll (int) fixp->fx_r_type);
1776 1.1 skrll return NULL;
1777 1.1 skrll }
1778 1.1 skrll
1779 1.1 skrll reloc->addend = 0;
1780 1.1 skrll return reloc;
1781 1.1 skrll }
1782 1.1 skrll
1783 1.1 skrll int
1784 1.1 skrll md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
1785 1.1 skrll asection *seg ATTRIBUTE_UNUSED)
1786 1.1 skrll {
1787 1.1 skrll abort ();
1788 1.1 skrll return 0;
1789 1.1 skrll }
1790 1.1 skrll
1791 1.1 skrll long
1792 1.1 skrll md_pcrel_from_section (fixS *fixp, segT sec)
1793 1.1 skrll {
1794 1.1 skrll if (fixp->fx_addsy != (symbolS *) NULL
1795 1.1 skrll && (!S_IS_DEFINED (fixp->fx_addsy)
1796 1.1 skrll || (S_GET_SEGMENT (fixp->fx_addsy) != sec)))
1797 1.1 skrll return 0;
1798 1.1 skrll return fixp->fx_frag->fr_address + fixp->fx_where;
1799 1.1 skrll }
1800 1.1 skrll
1801 1.1 skrll /* Called after the assembler has finished parsing the input file or
1802 1.1 skrll after a label is defined. Because the D30V assembler sometimes
1803 1.1 skrll saves short instructions to see if it can package them with the
1804 1.1 skrll next instruction, there may be a short instruction that still needs
1805 1.1 skrll written. */
1806 1.1 skrll
1807 1.1 skrll int
1808 1.1 skrll d30v_cleanup (int use_sequential)
1809 1.1 skrll {
1810 1.1 skrll segT seg;
1811 1.1 skrll subsegT subseg;
1812 1.1 skrll
1813 1.1 skrll if (prev_insn != -1)
1814 1.1 skrll {
1815 1.1 skrll seg = now_seg;
1816 1.1 skrll subseg = now_subseg;
1817 1.1 skrll subseg_set (prev_seg, prev_subseg);
1818 1.1 skrll write_1_short (&prev_opcode, (long) prev_insn, fixups->next,
1819 1.1 skrll use_sequential);
1820 1.1 skrll subseg_set (seg, subseg);
1821 1.1 skrll prev_insn = -1;
1822 1.1 skrll if (use_sequential)
1823 1.1 skrll prev_mul32_p = FALSE;
1824 1.1 skrll }
1825 1.1 skrll
1826 1.1 skrll return 1;
1827 1.1 skrll }
1828 1.1 skrll
1829 1.1 skrll /* This function is called at the start of every line. It checks to
1830 1.1 skrll see if the first character is a '.', which indicates the start of a
1831 1.1 skrll pseudo-op. If it is, then write out any unwritten instructions. */
1832 1.1 skrll
1833 1.1 skrll void
1834 1.1 skrll d30v_start_line (void)
1835 1.1 skrll {
1836 1.1 skrll char *c = input_line_pointer;
1837 1.1 skrll
1838 1.1 skrll while (ISSPACE (*c))
1839 1.1 skrll c++;
1840 1.1 skrll
1841 1.1 skrll if (*c == '.')
1842 1.1 skrll d30v_cleanup (FALSE);
1843 1.1 skrll }
1844 1.1 skrll
1845 1.1 skrll static void
1846 1.1 skrll check_size (long value, int bits, char *file, int line)
1847 1.1 skrll {
1848 1.1 skrll int tmp, max;
1849 1.1 skrll
1850 1.1 skrll if (value < 0)
1851 1.1 skrll tmp = ~value;
1852 1.1 skrll else
1853 1.1 skrll tmp = value;
1854 1.1 skrll
1855 1.1 skrll max = (1 << (bits - 1)) - 1;
1856 1.1 skrll
1857 1.1 skrll if (tmp > max)
1858 1.1 skrll as_bad_where (file, line, _("value too large to fit in %d bits"), bits);
1859 1.1 skrll }
1860 1.1 skrll
1861 1.1 skrll /* d30v_frob_label() is called when after a label is recognized. */
1862 1.1 skrll
1863 1.1 skrll void
1864 1.1 skrll d30v_frob_label (symbolS *lab)
1865 1.1 skrll {
1866 1.1 skrll /* Emit any pending instructions. */
1867 1.1 skrll d30v_cleanup (FALSE);
1868 1.1 skrll
1869 1.1 skrll /* Update the label's address with the current output pointer. */
1870 1.1 skrll symbol_set_frag (lab, frag_now);
1871 1.1 skrll S_SET_VALUE (lab, (valueT) frag_now_fix ());
1872 1.1 skrll
1873 1.1 skrll /* Record this label for future adjustment after we find out what
1874 1.1 skrll kind of data it references, and the required alignment therewith. */
1875 1.1 skrll d30v_last_label = lab;
1876 1.1.1.2 christos
1877 1.1.1.2 christos dwarf2_emit_label (lab);
1878 1.1 skrll }
1879 1.1 skrll
1880 1.1 skrll /* Hook into cons for capturing alignment changes. */
1881 1.1 skrll
1882 1.1 skrll void
1883 1.1 skrll d30v_cons_align (int size)
1884 1.1 skrll {
1885 1.1 skrll int log_size;
1886 1.1 skrll
1887 1.1.1.2 christos /* Don't specially align anything in debug sections. */
1888 1.1.1.2 christos if ((now_seg->flags & SEC_ALLOC) == 0
1889 1.1.1.2 christos || strcmp (now_seg->name, ".eh_frame") == 0)
1890 1.1.1.2 christos return;
1891 1.1.1.2 christos
1892 1.1 skrll log_size = 0;
1893 1.1 skrll while ((size >>= 1) != 0)
1894 1.1 skrll ++log_size;
1895 1.1 skrll
1896 1.1 skrll if (d30v_current_align < log_size)
1897 1.1 skrll d30v_align (log_size, (char *) NULL, NULL);
1898 1.1 skrll else if (d30v_current_align > log_size)
1899 1.1 skrll d30v_current_align = log_size;
1900 1.1 skrll d30v_last_label = NULL;
1901 1.1 skrll }
1902 1.1 skrll
1903 1.1 skrll void
1904 1.1 skrll md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
1905 1.1 skrll {
1906 1.1 skrll char *where;
1907 1.1 skrll unsigned long insn, insn2;
1908 1.1 skrll long value = *valP;
1909 1.1 skrll
1910 1.1 skrll if (fixP->fx_addsy == (symbolS *) NULL)
1911 1.1 skrll fixP->fx_done = 1;
1912 1.1 skrll
1913 1.1 skrll /* We don't support subtracting a symbol. */
1914 1.1 skrll if (fixP->fx_subsy != (symbolS *) NULL)
1915 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
1916 1.1 skrll
1917 1.1 skrll /* Fetch the instruction, insert the fully resolved operand
1918 1.1 skrll value, and stuff the instruction back again. */
1919 1.1 skrll where = fixP->fx_frag->fr_literal + fixP->fx_where;
1920 1.1 skrll insn = bfd_getb32 ((unsigned char *) where);
1921 1.1 skrll
1922 1.1 skrll switch (fixP->fx_r_type)
1923 1.1 skrll {
1924 1.1 skrll case BFD_RELOC_8: /* Check for a bad .byte directive. */
1925 1.1 skrll if (fixP->fx_addsy != NULL)
1926 1.1 skrll as_bad (_("line %d: unable to place address of symbol '%s' into a byte"),
1927 1.1 skrll fixP->fx_line, S_GET_NAME (fixP->fx_addsy));
1928 1.1 skrll else if (((unsigned)value) > 0xff)
1929 1.1 skrll as_bad (_("line %d: unable to place value %lx into a byte"),
1930 1.1 skrll fixP->fx_line, value);
1931 1.1 skrll else
1932 1.1 skrll *(unsigned char *) where = value;
1933 1.1 skrll break;
1934 1.1 skrll
1935 1.1 skrll case BFD_RELOC_16: /* Check for a bad .short directive. */
1936 1.1 skrll if (fixP->fx_addsy != NULL)
1937 1.1 skrll as_bad (_("line %d: unable to place address of symbol '%s' into a short"),
1938 1.1 skrll fixP->fx_line, S_GET_NAME (fixP->fx_addsy));
1939 1.1 skrll else if (((unsigned)value) > 0xffff)
1940 1.1 skrll as_bad (_("line %d: unable to place value %lx into a short"),
1941 1.1 skrll fixP->fx_line, value);
1942 1.1 skrll else
1943 1.1 skrll bfd_putb16 ((bfd_vma) value, (unsigned char *) where);
1944 1.1 skrll break;
1945 1.1 skrll
1946 1.1 skrll case BFD_RELOC_64: /* Check for a bad .quad directive. */
1947 1.1 skrll if (fixP->fx_addsy != NULL)
1948 1.1 skrll as_bad (_("line %d: unable to place address of symbol '%s' into a quad"),
1949 1.1 skrll fixP->fx_line, S_GET_NAME (fixP->fx_addsy));
1950 1.1 skrll else
1951 1.1 skrll {
1952 1.1 skrll bfd_putb32 ((bfd_vma) value, (unsigned char *) where);
1953 1.1 skrll bfd_putb32 (0, ((unsigned char *) where) + 4);
1954 1.1 skrll }
1955 1.1 skrll break;
1956 1.1 skrll
1957 1.1 skrll case BFD_RELOC_D30V_6:
1958 1.1 skrll check_size (value, 6, fixP->fx_file, fixP->fx_line);
1959 1.1 skrll insn |= value & 0x3F;
1960 1.1 skrll bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1961 1.1 skrll break;
1962 1.1 skrll
1963 1.1 skrll case BFD_RELOC_D30V_9_PCREL:
1964 1.1 skrll if (fixP->fx_where & 0x7)
1965 1.1 skrll {
1966 1.1 skrll if (fixP->fx_done)
1967 1.1 skrll value += 4;
1968 1.1 skrll else
1969 1.1 skrll fixP->fx_r_type = BFD_RELOC_D30V_9_PCREL_R;
1970 1.1 skrll }
1971 1.1 skrll check_size (value, 9, fixP->fx_file, fixP->fx_line);
1972 1.1 skrll insn |= ((value >> 3) & 0x3F) << 12;
1973 1.1 skrll bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1974 1.1 skrll break;
1975 1.1 skrll
1976 1.1 skrll case BFD_RELOC_D30V_15:
1977 1.1 skrll check_size (value, 15, fixP->fx_file, fixP->fx_line);
1978 1.1 skrll insn |= (value >> 3) & 0xFFF;
1979 1.1 skrll bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1980 1.1 skrll break;
1981 1.1 skrll
1982 1.1 skrll case BFD_RELOC_D30V_15_PCREL:
1983 1.1 skrll if (fixP->fx_where & 0x7)
1984 1.1 skrll {
1985 1.1 skrll if (fixP->fx_done)
1986 1.1 skrll value += 4;
1987 1.1 skrll else
1988 1.1 skrll fixP->fx_r_type = BFD_RELOC_D30V_15_PCREL_R;
1989 1.1 skrll }
1990 1.1 skrll check_size (value, 15, fixP->fx_file, fixP->fx_line);
1991 1.1 skrll insn |= (value >> 3) & 0xFFF;
1992 1.1 skrll bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1993 1.1 skrll break;
1994 1.1 skrll
1995 1.1 skrll case BFD_RELOC_D30V_21:
1996 1.1 skrll check_size (value, 21, fixP->fx_file, fixP->fx_line);
1997 1.1 skrll insn |= (value >> 3) & 0x3FFFF;
1998 1.1 skrll bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
1999 1.1 skrll break;
2000 1.1 skrll
2001 1.1 skrll case BFD_RELOC_D30V_21_PCREL:
2002 1.1 skrll if (fixP->fx_where & 0x7)
2003 1.1 skrll {
2004 1.1 skrll if (fixP->fx_done)
2005 1.1 skrll value += 4;
2006 1.1 skrll else
2007 1.1 skrll fixP->fx_r_type = BFD_RELOC_D30V_21_PCREL_R;
2008 1.1 skrll }
2009 1.1 skrll check_size (value, 21, fixP->fx_file, fixP->fx_line);
2010 1.1 skrll insn |= (value >> 3) & 0x3FFFF;
2011 1.1 skrll bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
2012 1.1 skrll break;
2013 1.1 skrll
2014 1.1 skrll case BFD_RELOC_D30V_32:
2015 1.1 skrll insn2 = bfd_getb32 ((unsigned char *) where + 4);
2016 1.1 skrll insn |= (value >> 26) & 0x3F; /* Top 6 bits. */
2017 1.1 skrll insn2 |= ((value & 0x03FC0000) << 2); /* Next 8 bits. */
2018 1.1 skrll insn2 |= value & 0x0003FFFF; /* Bottom 18 bits. */
2019 1.1 skrll bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
2020 1.1 skrll bfd_putb32 ((bfd_vma) insn2, (unsigned char *) where + 4);
2021 1.1 skrll break;
2022 1.1 skrll
2023 1.1 skrll case BFD_RELOC_D30V_32_PCREL:
2024 1.1 skrll insn2 = bfd_getb32 ((unsigned char *) where + 4);
2025 1.1 skrll insn |= (value >> 26) & 0x3F; /* Top 6 bits. */
2026 1.1 skrll insn2 |= ((value & 0x03FC0000) << 2); /* Next 8 bits. */
2027 1.1 skrll insn2 |= value & 0x0003FFFF; /* Bottom 18 bits. */
2028 1.1 skrll bfd_putb32 ((bfd_vma) insn, (unsigned char *) where);
2029 1.1 skrll bfd_putb32 ((bfd_vma) insn2, (unsigned char *) where + 4);
2030 1.1 skrll break;
2031 1.1 skrll
2032 1.1 skrll case BFD_RELOC_32:
2033 1.1 skrll bfd_putb32 ((bfd_vma) value, (unsigned char *) where);
2034 1.1 skrll break;
2035 1.1 skrll
2036 1.1 skrll default:
2037 1.1 skrll as_bad (_("line %d: unknown relocation type: 0x%x"),
2038 1.1 skrll fixP->fx_line, fixP->fx_r_type);
2039 1.1 skrll }
2040 1.1 skrll }
2041 1.1 skrll
2042 1.1 skrll /* Handle the .align pseudo-op. This aligns to a power of two. We
2043 1.1 skrll hook here to latch the current alignment. */
2044 1.1 skrll
2045 1.1 skrll static void
2046 1.1 skrll s_d30v_align (int ignore ATTRIBUTE_UNUSED)
2047 1.1 skrll {
2048 1.1 skrll int align;
2049 1.1 skrll char fill, *pfill = NULL;
2050 1.1 skrll long max_alignment = 15;
2051 1.1 skrll
2052 1.1 skrll align = get_absolute_expression ();
2053 1.1 skrll if (align > max_alignment)
2054 1.1 skrll {
2055 1.1 skrll align = max_alignment;
2056 1.1 skrll as_warn (_("Alignment too large: %d assumed"), align);
2057 1.1 skrll }
2058 1.1 skrll else if (align < 0)
2059 1.1 skrll {
2060 1.1 skrll as_warn (_("Alignment negative: 0 assumed"));
2061 1.1 skrll align = 0;
2062 1.1 skrll }
2063 1.1 skrll
2064 1.1 skrll if (*input_line_pointer == ',')
2065 1.1 skrll {
2066 1.1 skrll input_line_pointer++;
2067 1.1 skrll fill = get_absolute_expression ();
2068 1.1 skrll pfill = &fill;
2069 1.1 skrll }
2070 1.1 skrll
2071 1.1 skrll d30v_last_label = NULL;
2072 1.1 skrll d30v_align (align, pfill, NULL);
2073 1.1 skrll
2074 1.1 skrll demand_empty_rest_of_line ();
2075 1.1 skrll }
2076 1.1 skrll
2077 1.1 skrll /* Handle the .text pseudo-op. This is like the usual one, but it
2078 1.1 skrll clears the saved last label and resets known alignment. */
2079 1.1 skrll
2080 1.1 skrll static void
2081 1.1 skrll s_d30v_text (int i)
2082 1.1 skrll
2083 1.1 skrll {
2084 1.1 skrll s_text (i);
2085 1.1 skrll d30v_last_label = NULL;
2086 1.1 skrll d30v_current_align = 0;
2087 1.1 skrll d30v_current_align_seg = now_seg;
2088 1.1 skrll }
2089 1.1 skrll
2090 1.1 skrll /* Handle the .data pseudo-op. This is like the usual one, but it
2091 1.1 skrll clears the saved last label and resets known alignment. */
2092 1.1 skrll
2093 1.1 skrll static void
2094 1.1 skrll s_d30v_data (int i)
2095 1.1 skrll {
2096 1.1 skrll s_data (i);
2097 1.1 skrll d30v_last_label = NULL;
2098 1.1 skrll d30v_current_align = 0;
2099 1.1 skrll d30v_current_align_seg = now_seg;
2100 1.1 skrll }
2101 1.1 skrll
2102 1.1 skrll /* Handle the .section pseudo-op. This is like the usual one, but it
2103 1.1 skrll clears the saved last label and resets known alignment. */
2104 1.1 skrll
2105 1.1 skrll static void
2106 1.1 skrll s_d30v_section (int ignore)
2107 1.1 skrll {
2108 1.1 skrll obj_elf_section (ignore);
2109 1.1 skrll d30v_last_label = NULL;
2110 1.1 skrll d30v_current_align = 0;
2111 1.1 skrll d30v_current_align_seg = now_seg;
2112 1.1 skrll }
2113 1.1 skrll
2114 1.1 skrll /* The target specific pseudo-ops which we support. */
2115 1.1 skrll const pseudo_typeS md_pseudo_table[] =
2116 1.1 skrll {
2117 1.1 skrll { "word", cons, 4 },
2118 1.1 skrll { "hword", cons, 2 },
2119 1.1 skrll { "align", s_d30v_align, 0 },
2120 1.1 skrll { "text", s_d30v_text, 0 },
2121 1.1 skrll { "data", s_d30v_data, 0 },
2122 1.1 skrll { "section", s_d30v_section, 0 },
2123 1.1 skrll { "section.s", s_d30v_section, 0 },
2124 1.1 skrll { "sect", s_d30v_section, 0 },
2125 1.1 skrll { "sect.s", s_d30v_section, 0 },
2126 1.1 skrll { NULL, NULL, 0 }
2127 1.1 skrll };
2128