]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gas/config/tc-tilegx.c
Improve TLS support on TILE-Gx/TILEPro:
[thirdparty/binutils-gdb.git] / gas / config / tc-tilegx.c
CommitLineData
aa137e4d
NC
1/* tc-tilegx.c -- Assemble for a Tile-Gx chip.
2 Copyright 2011 Free Software Foundation, Inc.
3
4 This file is part of GAS, the GNU Assembler.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
20
21#include "as.h"
22#include "struc-symbol.h"
23#include "subsegs.h"
24
25#include "elf/tilegx.h"
26#include "opcode/tilegx.h"
27
28#include "dwarf2dbg.h"
29#include "dw2gencfi.h"
30
31#include "safe-ctype.h"
32
33
34/* Special registers. */
35#define TREG_IDN0 57
36#define TREG_IDN1 58
37#define TREG_UDN0 59
38#define TREG_UDN1 60
39#define TREG_UDN2 61
40#define TREG_UDN3 62
41#define TREG_ZERO 63
42
43
44/* Generic assembler global variables which must be defined by all
45 targets. */
46
47/* The dwarf2 data alignment, adjusted for 32 or 64 bit. */
48int tilegx_cie_data_alignment;
49
50/* Characters which always start a comment. */
51const char comment_chars[] = "#";
52
53/* Characters which start a comment at the beginning of a line. */
54const char line_comment_chars[] = "#";
55
56/* Characters which may be used to separate multiple commands on a
57 single line. */
58const char line_separator_chars[] = ";";
59
60/* Characters which are used to indicate an exponent in a floating
61 point number. */
62const char EXP_CHARS[] = "eE";
63
64/* Characters which mean that a number is a floating point constant,
65 as in 0d1.0. */
66const char FLT_CHARS[] = "rRsSfFdDxXpP";
67
68/* Either 32 or 64. */
69static int tilegx_arch_size = 64;
70
71
72const char *
73tilegx_target_format (void)
74{
fb6cedde
WL
75 if (target_big_endian) {
76 return tilegx_arch_size == 64 ? "elf64-tilegx-be" : "elf32-tilegx-be";
77 } else {
78 return tilegx_arch_size == 64 ? "elf64-tilegx-le" : "elf32-tilegx-le";
79 }
aa137e4d
NC
80}
81
82
83#define OPTION_32 (OPTION_MD_BASE + 0)
84#define OPTION_64 (OPTION_MD_BASE + 1)
fb6cedde
WL
85#define OPTION_EB (OPTION_MD_BASE + 2)
86#define OPTION_EL (OPTION_MD_BASE + 3)
aa137e4d
NC
87
88const char *md_shortopts = "VQ:";
89
90struct option md_longopts[] =
91{
92 {"32", no_argument, NULL, OPTION_32},
93 {"64", no_argument, NULL, OPTION_64},
fb6cedde
WL
94 {"EB", no_argument, NULL, OPTION_EB },
95 {"EL", no_argument, NULL, OPTION_EL },
aa137e4d
NC
96 {NULL, no_argument, NULL, 0}
97};
98
99size_t md_longopts_size = sizeof (md_longopts);
100
101int
102md_parse_option (int c, char *arg ATTRIBUTE_UNUSED)
103{
104 switch (c)
105 {
106 /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
107 should be emitted or not. FIXME: Not implemented. */
108 case 'Q':
109 break;
110
111 /* -V: SVR4 argument to print version ID. */
112 case 'V':
113 print_version_id ();
114 break;
115
116 case OPTION_32:
117 tilegx_arch_size = 32;
118 break;
119
120 case OPTION_64:
121 tilegx_arch_size = 64;
122 break;
123
fb6cedde
WL
124 case OPTION_EB:
125 target_big_endian = 1;
126 break;
127
128 case OPTION_EL:
129 target_big_endian = 0;
130 break;
131
aa137e4d
NC
132 default:
133 return 0;
134 }
135
136 return 1;
137}
138
139void
140md_show_usage (FILE *stream)
141{
142 fprintf (stream, _("\
143 -Q ignored\n\
144 -V print assembler version number\n\
fb6cedde 145 -EB/-EL generate big-endian/little-endian code\n\
aa137e4d
NC
146 --32/--64 generate 32bit/64bit code\n"));
147}
148
149
150/* Extra expression types. */
151
152#define O_hw0 O_md1
153#define O_hw1 O_md2
154#define O_hw2 O_md3
155#define O_hw3 O_md4
156#define O_hw0_last O_md5
157#define O_hw1_last O_md6
158#define O_hw2_last O_md7
159#define O_hw0_got O_md8
6f7be959
WL
160#define O_hw0_last_got O_md9
161#define O_hw1_last_got O_md10
162#define O_plt O_md11
163#define O_hw0_tls_gd O_md12
164#define O_hw0_last_tls_gd O_md13
165#define O_hw1_last_tls_gd O_md14
166#define O_hw0_tls_ie O_md15
167#define O_hw0_last_tls_ie O_md16
168#define O_hw1_last_tls_ie O_md17
169#define O_hw0_tls_le O_md18
170#define O_hw0_last_tls_le O_md19
171#define O_hw1_last_tls_le O_md20
172#define O_tls_gd_call O_md21
173#define O_tls_gd_add O_md22
174#define O_tls_ie_load O_md23
175#define O_tls_add O_md24
aa137e4d
NC
176
177static struct hash_control *special_operator_hash;
178
179/* Hash tables for instruction mnemonic lookup. */
180static struct hash_control *op_hash;
181
182/* Hash table for spr lookup. */
183static struct hash_control *spr_hash;
184
185/* True temporarily while parsing an SPR expression. This changes the
186 * namespace to include SPR names. */
187static int parsing_spr;
188
189/* Are we currently inside `{ ... }'? */
190static int inside_bundle;
191
192struct tilegx_instruction
193{
194 const struct tilegx_opcode *opcode;
195 tilegx_pipeline pipe;
196 expressionS operand_values[TILEGX_MAX_OPERANDS];
197};
198
199/* This keeps track of the current bundle being built up. */
200static struct tilegx_instruction current_bundle[TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE];
201
202/* Index in current_bundle for the next instruction to parse. */
203static int current_bundle_index;
204
205/* Allow 'r63' in addition to 'zero', etc. Normally we disallow this as
206 'zero' is not a real register, so using it accidentally would be a
207 nasty bug. For other registers, such as 'sp', code using multiple names
208 for the same physical register is excessively confusing.
209
210 The '.require_canonical_reg_names' pseudo-op turns this error on,
211 and the '.no_require_canonical_reg_names' pseudo-op turns this off.
212 By default the error is on. */
213static int require_canonical_reg_names;
214
215/* Allow bundles that do undefined or suspicious things like write
216 two different values to the same register at the same time.
217
218 The '.no_allow_suspicious_bundles' pseudo-op turns this error on,
219 and the '.allow_suspicious_bundles' pseudo-op turns this off. */
220static int allow_suspicious_bundles;
221
222
223/* A hash table of main processor registers, mapping each register name
224 to its index.
225
226 Furthermore, if the register number is greater than the number
227 of registers for that processor, the user used an illegal alias
228 for that register (e.g. r63 instead of zero), so we should generate
229 a warning. The attempted register number can be found by clearing
230 NONCANONICAL_REG_NAME_FLAG. */
231static struct hash_control *main_reg_hash;
232
233
234/* We cannot unambiguously store a 0 in a hash table and look it up,
235 so we OR in this flag to every canonical register. */
236#define CANONICAL_REG_NAME_FLAG 0x1000
237
238/* By default we disallow register aliases like r63, but we record
239 them in the hash table in case the .no_require_canonical_reg_names
240 directive is used. Noncanonical names have this value added to them. */
241#define NONCANONICAL_REG_NAME_FLAG 0x2000
242
243/* Discards flags for register hash table entries and returns the
244 reg number. */
245#define EXTRACT_REGNO(p) ((p) & 63)
246
247/* This function is called once, at assembler startup time. It should
248 set up all the tables, etc., that the MD part of the assembler will
249 need. */
250
251void
252md_begin (void)
253{
254 const struct tilegx_opcode *op;
255 int i;
82590249
WL
256 int mach = (tilegx_arch_size == 64) ? bfd_mach_tilegx : bfd_mach_tilegx32;
257
258 if (! bfd_set_arch_mach (stdoutput, bfd_arch_tilegx, mach))
259 as_warn (_("Could not set architecture and machine"));
aa137e4d
NC
260
261 /* Guarantee text section is aligned. */
262 bfd_set_section_alignment (stdoutput, text_section,
263 TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES);
264
265 require_canonical_reg_names = 1;
266 allow_suspicious_bundles = 0;
267 current_bundle_index = 0;
268 inside_bundle = 0;
269
270 tilegx_cie_data_alignment = (tilegx_arch_size == 64 ? -8 : -4);
271
272 /* Initialize special operator hash table. */
273 special_operator_hash = hash_new ();
274#define INSERT_SPECIAL_OP(name) \
275 hash_insert (special_operator_hash, #name, (void *)O_##name)
276
277 INSERT_SPECIAL_OP (hw0);
278 INSERT_SPECIAL_OP (hw1);
279 INSERT_SPECIAL_OP (hw2);
280 INSERT_SPECIAL_OP (hw3);
281 INSERT_SPECIAL_OP (hw0_last);
282 INSERT_SPECIAL_OP (hw1_last);
283 INSERT_SPECIAL_OP (hw2_last);
284 /* hw3_last is a convenience alias for the equivalent hw3. */
285 hash_insert (special_operator_hash, "hw3_last", (void*)O_hw3);
286 INSERT_SPECIAL_OP (hw0_got);
aa137e4d
NC
287 INSERT_SPECIAL_OP (hw0_last_got);
288 INSERT_SPECIAL_OP (hw1_last_got);
aa137e4d
NC
289 INSERT_SPECIAL_OP(plt);
290 INSERT_SPECIAL_OP (hw0_tls_gd);
aa137e4d
NC
291 INSERT_SPECIAL_OP (hw0_last_tls_gd);
292 INSERT_SPECIAL_OP (hw1_last_tls_gd);
aa137e4d 293 INSERT_SPECIAL_OP (hw0_tls_ie);
aa137e4d
NC
294 INSERT_SPECIAL_OP (hw0_last_tls_ie);
295 INSERT_SPECIAL_OP (hw1_last_tls_ie);
6f7be959
WL
296 INSERT_SPECIAL_OP (hw0_tls_le);
297 INSERT_SPECIAL_OP (hw0_last_tls_le);
298 INSERT_SPECIAL_OP (hw1_last_tls_le);
299 INSERT_SPECIAL_OP (tls_gd_call);
300 INSERT_SPECIAL_OP (tls_gd_add);
301 INSERT_SPECIAL_OP (tls_ie_load);
302 INSERT_SPECIAL_OP (tls_add);
aa137e4d
NC
303#undef INSERT_SPECIAL_OP
304
305 /* Initialize op_hash hash table. */
306 op_hash = hash_new ();
307 for (op = &tilegx_opcodes[0]; op->name != NULL; op++)
308 {
309 const char *hash_err = hash_insert (op_hash, op->name, (void *)op);
310 if (hash_err != NULL)
311 as_fatal (_("Internal Error: Can't hash %s: %s"), op->name, hash_err);
312 }
313
314 /* Initialize the spr hash table. */
315 parsing_spr = 0;
316 spr_hash = hash_new ();
317 for (i = 0; i < tilegx_num_sprs; i++)
318 hash_insert (spr_hash, tilegx_sprs[i].name,
319 (void *) &tilegx_sprs[i]);
320
321 /* Set up the main_reg_hash table. We use this instead of
322 creating a symbol in the register section to avoid ambiguities
323 with labels that have the same names as registers. */
324 main_reg_hash = hash_new ();
325 for (i = 0; i < TILEGX_NUM_REGISTERS; i++)
326 {
327 char buf[64];
328
329 hash_insert (main_reg_hash, tilegx_register_names[i],
330 (void *) (long) (i | CANONICAL_REG_NAME_FLAG));
331
332 /* See if we should insert a noncanonical alias, like r63. */
333 sprintf (buf, "r%d", i);
334 if (strcmp (buf, tilegx_register_names[i]) != 0)
335 hash_insert (main_reg_hash, xstrdup (buf),
336 (void *) (long) (i | NONCANONICAL_REG_NAME_FLAG));
337 }
338}
339
340#define BUNDLE_TEMPLATE_MASK(p0, p1, p2) \
341 ((p0) | ((p1) << 8) | ((p2) << 16))
342#define BUNDLE_TEMPLATE(p0, p1, p2) \
343 { { (p0), (p1), (p2) }, \
344 BUNDLE_TEMPLATE_MASK(1 << (p0), 1 << (p1), (1 << (p2))) \
345 }
346
347#define NO_PIPELINE TILEGX_NUM_PIPELINE_ENCODINGS
348
349struct bundle_template
350{
351 tilegx_pipeline pipe[TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE];
352 unsigned int pipe_mask;
353};
354
355static const struct bundle_template bundle_templates[] =
356{
357 /* In Y format we must always have something in Y2, since it has
358 no fnop, so this conveys that Y2 must always be used. */
359 BUNDLE_TEMPLATE(TILEGX_PIPELINE_Y0, TILEGX_PIPELINE_Y2, NO_PIPELINE),
360 BUNDLE_TEMPLATE(TILEGX_PIPELINE_Y1, TILEGX_PIPELINE_Y2, NO_PIPELINE),
361 BUNDLE_TEMPLATE(TILEGX_PIPELINE_Y2, TILEGX_PIPELINE_Y0, NO_PIPELINE),
362 BUNDLE_TEMPLATE(TILEGX_PIPELINE_Y2, TILEGX_PIPELINE_Y1, NO_PIPELINE),
363
364 /* Y format has three instructions. */
365 BUNDLE_TEMPLATE(TILEGX_PIPELINE_Y0,TILEGX_PIPELINE_Y1,TILEGX_PIPELINE_Y2),
366 BUNDLE_TEMPLATE(TILEGX_PIPELINE_Y0,TILEGX_PIPELINE_Y2,TILEGX_PIPELINE_Y1),
367 BUNDLE_TEMPLATE(TILEGX_PIPELINE_Y1,TILEGX_PIPELINE_Y0,TILEGX_PIPELINE_Y2),
368 BUNDLE_TEMPLATE(TILEGX_PIPELINE_Y1,TILEGX_PIPELINE_Y2,TILEGX_PIPELINE_Y0),
369 BUNDLE_TEMPLATE(TILEGX_PIPELINE_Y2,TILEGX_PIPELINE_Y0,TILEGX_PIPELINE_Y1),
370 BUNDLE_TEMPLATE(TILEGX_PIPELINE_Y2,TILEGX_PIPELINE_Y1,TILEGX_PIPELINE_Y0),
371
372 /* X format has only two instructions. */
373 BUNDLE_TEMPLATE(TILEGX_PIPELINE_X0, TILEGX_PIPELINE_X1, NO_PIPELINE),
374 BUNDLE_TEMPLATE(TILEGX_PIPELINE_X1, TILEGX_PIPELINE_X0, NO_PIPELINE)
375};
376
377
378static void
379prepend_nop_to_bundle (tilegx_mnemonic mnemonic)
380{
381 memmove (&current_bundle[1], &current_bundle[0],
382 current_bundle_index * sizeof current_bundle[0]);
383 current_bundle[0].opcode = &tilegx_opcodes[mnemonic];
384 ++current_bundle_index;
385}
386
387static tilegx_bundle_bits
388insert_operand (tilegx_bundle_bits bits,
389 const struct tilegx_operand *operand,
390 int operand_value,
391 char *file,
392 unsigned lineno)
393{
394 /* Range-check the immediate. */
395 int num_bits = operand->num_bits;
396
397 operand_value >>= operand->rightshift;
398
399 if (bfd_check_overflow (operand->is_signed
400 ? complain_overflow_signed
401 : complain_overflow_unsigned,
402 num_bits,
403 0,
404 bfd_arch_bits_per_address (stdoutput),
405 operand_value)
406 != bfd_reloc_ok)
407 {
408 offsetT min, max;
409 if (operand->is_signed)
410 {
411 min = -(1 << (num_bits - 1));
412 max = (1 << (num_bits - 1)) - 1;
413 }
414 else
415 {
416 min = 0;
417 max = (1 << num_bits) - 1;
418 }
419 as_bad_value_out_of_range (_("operand"), operand_value, min, max,
420 file, lineno);
421 }
422
423 /* Write out the bits for the immediate. */
424 return bits | operand->insert (operand_value);
425}
426
427
428static int
429apply_special_operator (operatorT op, offsetT num, char *file, unsigned lineno)
430{
431 int ret;
432 int check_shift = -1;
433
434 switch (op)
435 {
aa137e4d
NC
436 case O_hw0_last:
437 check_shift = 0;
438 /* Fall through. */
aa137e4d
NC
439 case O_hw0:
440 ret = (signed short)num;
441 break;
442
aa137e4d
NC
443 case O_hw1_last:
444 check_shift = 16;
445 /* Fall through. */
aa137e4d
NC
446 case O_hw1:
447 ret = (signed short)(num >> 16);
448 break;
449
aa137e4d
NC
450 case O_hw2_last:
451 check_shift = 32;
452 /* Fall through. */
aa137e4d
NC
453 case O_hw2:
454 ret = (signed short)(num >> 32);
455 break;
456
aa137e4d
NC
457 case O_hw3:
458 ret = (signed short)(num >> 48);
459 break;
460
461 default:
462 abort ();
463 break;
464 }
465
466 if (check_shift >= 0 && ret != (num >> check_shift))
467 {
468 as_bad_value_out_of_range (_("operand"), num,
469 ~0ULL << (check_shift + 16 - 1),
470 ~0ULL >> (64 - (check_shift + 16 - 1)),
471 file, lineno);
472 }
473
474 return ret;
475}
476
477static tilegx_bundle_bits
478emit_tilegx_instruction (tilegx_bundle_bits bits,
479 int num_operands,
480 const unsigned char *operands,
481 expressionS *operand_values,
482 char *bundle_start)
483{
484 int i;
485
486 for (i = 0; i < num_operands; i++)
487 {
488 const struct tilegx_operand *operand =
489 &tilegx_operands[operands[i]];
490 expressionS *operand_exp = &operand_values[i];
491 int is_pc_relative = operand->is_pc_relative;
492
493 if (operand_exp->X_op == O_register
494 || (operand_exp->X_op == O_constant && !is_pc_relative))
495 {
496 /* We know what the bits are right now, so insert them. */
497 bits = insert_operand (bits, operand, operand_exp->X_add_number,
498 NULL, 0);
499 }
500 else
501 {
502 bfd_reloc_code_real_type reloc = operand->default_reloc;
503 expressionS subexp;
504 int die = 0, use_subexp = 0, require_symbol = 0;
505 fixS *fixP;
506
507 /* Take an expression like hw0(x) and turn it into x with
508 a different reloc type. */
509 switch (operand_exp->X_op)
510 {
511#define HANDLE_OP16(suffix) \
512 switch (reloc) \
513 { \
514 case BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST: \
515 reloc = BFD_RELOC_TILEGX_IMM16_X0_##suffix; \
516 break; \
517 case BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST: \
518 reloc = BFD_RELOC_TILEGX_IMM16_X1_##suffix; \
519 break; \
520 default: \
521 die = 1; \
522 break; \
523 } \
524 use_subexp = 1
525
526 case O_hw0:
527 HANDLE_OP16 (HW0);
528 break;
529
530 case O_hw1:
531 HANDLE_OP16 (HW1);
532 break;
533
534 case O_hw2:
535 HANDLE_OP16 (HW2);
536 break;
537
538 case O_hw3:
539 HANDLE_OP16 (HW3);
540 break;
541
542 case O_hw0_last:
543 HANDLE_OP16 (HW0_LAST);
544 break;
545
546 case O_hw1_last:
547 HANDLE_OP16 (HW1_LAST);
548 break;
549
550 case O_hw2_last:
551 HANDLE_OP16 (HW2_LAST);
552 break;
553
554 case O_hw0_got:
555 HANDLE_OP16 (HW0_GOT);
556 require_symbol = 1;
557 break;
558
aa137e4d
NC
559 case O_hw0_last_got:
560 HANDLE_OP16 (HW0_LAST_GOT);
561 require_symbol = 1;
562 break;
563
564 case O_hw1_last_got:
565 HANDLE_OP16 (HW1_LAST_GOT);
566 require_symbol = 1;
567 break;
568
aa137e4d
NC
569 case O_hw0_tls_gd:
570 HANDLE_OP16 (HW0_TLS_GD);
571 require_symbol = 1;
572 break;
573
6f7be959
WL
574 case O_hw0_last_tls_gd:
575 HANDLE_OP16 (HW0_LAST_TLS_GD);
aa137e4d
NC
576 require_symbol = 1;
577 break;
578
6f7be959
WL
579 case O_hw1_last_tls_gd:
580 HANDLE_OP16 (HW1_LAST_TLS_GD);
aa137e4d
NC
581 require_symbol = 1;
582 break;
583
6f7be959
WL
584 case O_hw0_tls_ie:
585 HANDLE_OP16 (HW0_TLS_IE);
aa137e4d
NC
586 require_symbol = 1;
587 break;
588
6f7be959
WL
589 case O_hw0_last_tls_ie:
590 HANDLE_OP16 (HW0_LAST_TLS_IE);
aa137e4d
NC
591 require_symbol = 1;
592 break;
593
6f7be959
WL
594 case O_hw1_last_tls_ie:
595 HANDLE_OP16 (HW1_LAST_TLS_IE);
aa137e4d
NC
596 require_symbol = 1;
597 break;
598
6f7be959
WL
599 case O_hw0_tls_le:
600 HANDLE_OP16 (HW0_TLS_LE);
aa137e4d
NC
601 require_symbol = 1;
602 break;
603
6f7be959
WL
604 case O_hw0_last_tls_le:
605 HANDLE_OP16 (HW0_LAST_TLS_LE);
aa137e4d
NC
606 require_symbol = 1;
607 break;
608
6f7be959
WL
609 case O_hw1_last_tls_le:
610 HANDLE_OP16 (HW1_LAST_TLS_LE);
aa137e4d
NC
611 require_symbol = 1;
612 break;
613
6f7be959 614#undef HANDLE_OP16
aa137e4d 615
6f7be959
WL
616 case O_plt:
617 switch (reloc)
618 {
619 case BFD_RELOC_TILEGX_JUMPOFF_X1:
620 reloc = BFD_RELOC_TILEGX_JUMPOFF_X1_PLT;
621 break;
622 default:
623 die = 1;
624 break;
625 }
626 use_subexp = 1;
aa137e4d
NC
627 require_symbol = 1;
628 break;
629
6f7be959
WL
630 case O_tls_gd_call:
631 switch (reloc)
632 {
633 case BFD_RELOC_TILEGX_JUMPOFF_X1:
634 reloc = BFD_RELOC_TILEGX_TLS_GD_CALL;
635 break;
636 default:
637 die = 1;
638 break;
639 }
640 use_subexp = 1;
aa137e4d
NC
641 require_symbol = 1;
642 break;
643
6f7be959
WL
644 case O_tls_gd_add:
645 switch (reloc)
646 {
647 case BFD_RELOC_TILEGX_IMM8_X0:
648 reloc = BFD_RELOC_TILEGX_IMM8_X0_TLS_GD_ADD;
649 break;
650 case BFD_RELOC_TILEGX_IMM8_X1:
651 reloc = BFD_RELOC_TILEGX_IMM8_X1_TLS_GD_ADD;
652 break;
653 case BFD_RELOC_TILEGX_IMM8_Y0:
654 reloc = BFD_RELOC_TILEGX_IMM8_Y0_TLS_GD_ADD;
655 break;
656 case BFD_RELOC_TILEGX_IMM8_Y1:
657 reloc = BFD_RELOC_TILEGX_IMM8_Y1_TLS_GD_ADD;
658 break;
659 default:
660 die = 1;
661 break;
662 }
663 use_subexp = 1;
aa137e4d
NC
664 require_symbol = 1;
665 break;
666
6f7be959
WL
667 case O_tls_ie_load:
668 switch (reloc)
669 {
670 case BFD_RELOC_TILEGX_IMM8_X1:
671 reloc = BFD_RELOC_TILEGX_TLS_IE_LOAD;
672 break;
673 default:
674 die = 1;
675 break;
676 }
677 use_subexp = 1;
aa137e4d
NC
678 require_symbol = 1;
679 break;
680
6f7be959 681 case O_tls_add:
aa137e4d
NC
682 switch (reloc)
683 {
6f7be959
WL
684 case BFD_RELOC_TILEGX_IMM8_X0:
685 reloc = BFD_RELOC_TILEGX_IMM8_X0_TLS_ADD;
686 break;
687 case BFD_RELOC_TILEGX_IMM8_X1:
688 reloc = BFD_RELOC_TILEGX_IMM8_X1_TLS_ADD;
689 break;
690 case BFD_RELOC_TILEGX_IMM8_Y0:
691 reloc = BFD_RELOC_TILEGX_IMM8_Y0_TLS_ADD;
692 break;
693 case BFD_RELOC_TILEGX_IMM8_Y1:
694 reloc = BFD_RELOC_TILEGX_IMM8_Y1_TLS_ADD;
aa137e4d
NC
695 break;
696 default:
697 die = 1;
698 break;
699 }
700 use_subexp = 1;
701 require_symbol = 1;
702 break;
703
704 default:
705 /* Do nothing. */
706 break;
707 }
708
709 if (die)
710 {
711 as_bad (_("Invalid operator for operand."));
712 }
713 else if (use_subexp)
714 {
715 /* Now that we've changed the reloc, change ha16(x) into x,
716 etc. */
717
718 if (operand_exp->X_add_symbol->sy_value.X_md)
719 {
aa137e4d
NC
720 /* HACK: We used X_md to mark this symbol as a fake wrapper
721 around a real expression. To unwrap it, we just grab its
722 value here. */
723 operand_exp = &operand_exp->X_add_symbol->sy_value;
e8b9f508
WL
724
725 if (require_symbol)
726 {
727 /* Look at the expression, and reject it if it's not a
728 plain symbol. */
729 if (operand_exp->X_op != O_symbol
730 || operand_exp->X_add_number != 0)
731 as_bad (_("Operator may only be applied to symbols."));
732 }
aa137e4d
NC
733 }
734 else
735 {
736 /* The value of this expression is an actual symbol, so
737 turn that into an expression. */
738 memset (&subexp, 0, sizeof subexp);
739 subexp.X_op = O_symbol;
740 subexp.X_add_symbol = operand_exp->X_add_symbol;
741 operand_exp = &subexp;
742 }
743 }
744
745 /* Create a fixup to handle this later. */
746 fixP = fix_new_exp (frag_now,
747 bundle_start - frag_now->fr_literal,
748 (operand->num_bits + 7) >> 3,
749 operand_exp,
750 is_pc_relative,
751 reloc);
752 fixP->tc_fix_data = operand;
753
754 /* Don't do overflow checking if we are applying a function like
755 ha16. */
756 fixP->fx_no_overflow |= use_subexp;
757 }
758 }
759 return bits;
760}
761
762
763/* Detects and complains if two instructions in current_bundle write
764 to the same register, either implicitly or explicitly, or if a
765 read-only register is written. */
766static void
767check_illegal_reg_writes (void)
768{
769 BFD_HOST_U_64_BIT all_regs_written = 0;
770 int j;
771
772 for (j = 0; j < current_bundle_index; j++)
773 {
774 const struct tilegx_instruction *instr = &current_bundle[j];
775 int k;
776 BFD_HOST_U_64_BIT regs =
777 ((BFD_HOST_U_64_BIT)1) << instr->opcode->implicitly_written_register;
778 BFD_HOST_U_64_BIT conflict;
779
780 for (k = 0; k < instr->opcode->num_operands; k++)
781 {
782 const struct tilegx_operand *operand =
783 &tilegx_operands[instr->opcode->operands[instr->pipe][k]];
784
785 if (operand->is_dest_reg)
786 {
787 int regno = instr->operand_values[k].X_add_number;
788 BFD_HOST_U_64_BIT mask = ((BFD_HOST_U_64_BIT)1) << regno;
789
790 if ((mask & ( (((BFD_HOST_U_64_BIT)1) << TREG_IDN1)
791 | (((BFD_HOST_U_64_BIT)1) << TREG_UDN1)
792 | (((BFD_HOST_U_64_BIT)1) << TREG_UDN2)
793 | (((BFD_HOST_U_64_BIT)1) << TREG_UDN3))) != 0
794 && !allow_suspicious_bundles)
795 {
796 as_bad (_("Writes to register '%s' are not allowed."),
797 tilegx_register_names[regno]);
798 }
799
800 regs |= mask;
801 }
802 }
803
804 /* Writing to the zero register doesn't count. */
805 regs &= ~(((BFD_HOST_U_64_BIT)1) << TREG_ZERO);
806
807 conflict = all_regs_written & regs;
808 if (conflict != 0 && !allow_suspicious_bundles)
809 {
810 /* Find which register caused the conflict. */
811 const char *conflicting_reg_name = "???";
812 int i;
813
814 for (i = 0; i < TILEGX_NUM_REGISTERS; i++)
815 {
816 if (((conflict >> i) & 1) != 0)
817 {
818 conflicting_reg_name = tilegx_register_names[i];
819 break;
820 }
821 }
822
823 as_bad (_("Two instructions in the same bundle both write "
824 "to register %s, which is not allowed."),
825 conflicting_reg_name);
826 }
827
828 all_regs_written |= regs;
829 }
830}
831
832
833static void
834tilegx_flush_bundle (void)
835{
836 unsigned i;
837 int j;
838 addressT addr_mod;
839 unsigned compatible_pipes;
840 const struct bundle_template *match;
841 char *f;
842
843 inside_bundle = 0;
844
845 switch (current_bundle_index)
846 {
847 case 0:
848 /* No instructions. */
849 return;
850 case 1:
851 if (current_bundle[0].opcode->can_bundle)
852 {
853 /* Simplify later logic by adding an explicit fnop. */
854 prepend_nop_to_bundle (TILEGX_OPC_FNOP);
855 }
856 else
857 {
858 /* This instruction cannot be bundled with anything else.
859 Prepend an explicit 'nop', rather than an 'fnop', because
860 fnops can be replaced by later binary-processing tools while
861 nops cannot. */
862 prepend_nop_to_bundle (TILEGX_OPC_NOP);
863 }
864 break;
865 default:
866 if (!allow_suspicious_bundles)
867 {
868 /* Make sure all instructions can be bundled with other
869 instructions. */
870 const struct tilegx_opcode *cannot_bundle = NULL;
871 bfd_boolean seen_non_nop = FALSE;
872
873 for (j = 0; j < current_bundle_index; j++)
874 {
875 const struct tilegx_opcode *op = current_bundle[j].opcode;
876
877 if (!op->can_bundle && cannot_bundle == NULL)
878 cannot_bundle = op;
879 else if (op->mnemonic != TILEGX_OPC_NOP
880 && op->mnemonic != TILEGX_OPC_INFO
881 && op->mnemonic != TILEGX_OPC_INFOL)
882 seen_non_nop = TRUE;
883 }
884
885 if (cannot_bundle != NULL && seen_non_nop)
886 {
887 current_bundle_index = 0;
888 as_bad (_("'%s' may not be bundled with other instructions."),
889 cannot_bundle->name);
890 return;
891 }
892 }
893 break;
894 }
895
896 compatible_pipes =
897 BUNDLE_TEMPLATE_MASK(current_bundle[0].opcode->pipes,
898 current_bundle[1].opcode->pipes,
899 (current_bundle_index == 3
900 ? current_bundle[2].opcode->pipes
901 : (1 << NO_PIPELINE)));
902
903 /* Find a template that works, if any. */
904 match = NULL;
905 for (i = 0; i < sizeof bundle_templates / sizeof bundle_templates[0]; i++)
906 {
907 const struct bundle_template *b = &bundle_templates[i];
908 if ((b->pipe_mask & compatible_pipes) == b->pipe_mask)
909 {
910 match = b;
911 break;
912 }
913 }
914
915 if (match == NULL)
916 {
917 current_bundle_index = 0;
918 as_bad (_("Invalid combination of instructions for bundle."));
919 return;
920 }
921
922 /* If the section seems to have no alignment set yet, go ahead and
923 make it large enough to hold code. */
924 if (bfd_get_section_alignment (stdoutput, now_seg) == 0)
925 bfd_set_section_alignment (stdoutput, now_seg,
926 TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES);
927
928 for (j = 0; j < current_bundle_index; j++)
929 current_bundle[j].pipe = match->pipe[j];
930
931 if (current_bundle_index == 2 && !tilegx_is_x_pipeline (match->pipe[0]))
932 {
933 /* We are in Y mode with only two instructions, so add an FNOP. */
934 prepend_nop_to_bundle (TILEGX_OPC_FNOP);
935
936 /* Figure out what pipe the fnop must be in via arithmetic.
937 * p0 + p1 + p2 must sum to the sum of TILEGX_PIPELINE_Y[012]. */
938 current_bundle[0].pipe =
939 (tilegx_pipeline)((TILEGX_PIPELINE_Y0
940 + TILEGX_PIPELINE_Y1
941 + TILEGX_PIPELINE_Y2) -
942 (current_bundle[1].pipe + current_bundle[2].pipe));
943 }
944
945 check_illegal_reg_writes ();
946
947 f = frag_more (TILEGX_BUNDLE_SIZE_IN_BYTES);
948
949 /* Check to see if this bundle is at an offset that is a multiple of 8-bytes
950 from the start of the frag. */
951 addr_mod = frag_now_fix () & (TILEGX_BUNDLE_ALIGNMENT_IN_BYTES - 1);
952 if (frag_now->has_code && frag_now->insn_addr != addr_mod)
953 as_bad (_("instruction address is not a multiple of 8"));
954 frag_now->insn_addr = addr_mod;
955 frag_now->has_code = 1;
956
957 tilegx_bundle_bits bits = 0;
958 for (j = 0; j < current_bundle_index; j++)
959 {
960 struct tilegx_instruction *instr = &current_bundle[j];
961 tilegx_pipeline pipeline = instr->pipe;
962 const struct tilegx_opcode *opcode = instr->opcode;
963
964 bits |= emit_tilegx_instruction (opcode->fixed_bit_values[pipeline],
965 opcode->num_operands,
966 &opcode->operands[pipeline][0],
967 instr->operand_values,
968 f);
969 }
970
971 number_to_chars_littleendian (f, bits, 8);
972 current_bundle_index = 0;
973
974 /* Emit DWARF2 debugging information. */
975 dwarf2_emit_insn (TILEGX_BUNDLE_SIZE_IN_BYTES);
976}
977
978
979/* Extend the expression parser to handle hw0(label), etc.
980 as well as SPR names when in the context of parsing an SPR. */
981
982int
983tilegx_parse_name (char *name, expressionS *e, char *nextcharP)
984{
985 operatorT op = O_illegal;
986
987 if (parsing_spr)
988 {
989 void* val = hash_find (spr_hash, name);
990 if (val == NULL)
991 return 0;
992
993 memset (e, 0, sizeof *e);
994 e->X_op = O_constant;
995 e->X_add_number = ((const struct tilegx_spr *)val)->number;
996 return 1;
997 }
998
999 if (*nextcharP != '(')
1000 {
1001 /* hw0, etc. not followed by a paren is just a label with that name. */
1002 return 0;
1003 }
1004 else
1005 {
1006 /* Look up the operator in our table. */
1007 void* val = hash_find (special_operator_hash, name);
1008 if (val == 0)
1009 return 0;
1010 op = (operatorT)(long)val;
1011 }
1012
1013 /* Restore old '(' and skip it. */
1014 *input_line_pointer = '(';
1015 ++input_line_pointer;
1016
1017 expression (e);
1018
1019 if (*input_line_pointer != ')')
1020 {
1021 as_bad (_("Missing ')'"));
1022 *nextcharP = *input_line_pointer;
1023 return 0;
1024 }
1025 /* Skip ')'. */
1026 ++input_line_pointer;
1027
1028 if (e->X_op == O_register || e->X_op == O_absent)
1029 {
1030 as_bad (_("Invalid expression."));
1031 e->X_op = O_constant;
1032 e->X_add_number = 0;
1033 }
1034 else
1035 {
1036 /* Wrap subexpression with a unary operator. */
1037 symbolS *sym = make_expr_symbol (e);
1038
1039 if (sym != e->X_add_symbol)
1040 {
1041 /* HACK: mark this symbol as a temporary wrapper around a proper
1042 expression, so we can unwrap it later once we have communicated
1043 the relocation type. */
1044 sym->sy_value.X_md = 1;
1045 }
1046
1047 memset (e, 0, sizeof *e);
1048 e->X_op = op;
1049 e->X_add_symbol = sym;
1050 e->X_add_number = 0;
1051 }
1052
1053 *nextcharP = *input_line_pointer;
1054 return 1;
1055}
1056
1057
1058/* Parses an expression which must be a register name. */
1059
1060static void
1061parse_reg_expression (expressionS* expression)
1062{
1063 /* Zero everything to make sure we don't miss any flags. */
1064 memset (expression, 0, sizeof *expression);
1065
1066 char* regname = input_line_pointer;
1067 char terminating_char = get_symbol_end ();
1068
1069 void* pval = hash_find (main_reg_hash, regname);
1070
1071 if (pval == NULL)
1072 {
1073 as_bad (_("Expected register, got '%s'."), regname);
1074 }
1075
1076 int regno_and_flags = (int)(size_t)pval;
1077 int regno = EXTRACT_REGNO(regno_and_flags);
1078
1079 if ((regno_and_flags & NONCANONICAL_REG_NAME_FLAG)
1080 && require_canonical_reg_names)
1081 {
1082 as_warn (_("Found use of non-canonical register name %s; "
1083 "use %s instead."),
1084 regname,
1085 tilegx_register_names[regno]);
1086 }
1087
1088 /* Restore the old character following the register name. */
1089 *input_line_pointer = terminating_char;
1090
1091 /* Fill in the expression fields to indicate it's a register. */
1092 expression->X_op = O_register;
1093 expression->X_add_number = regno;
1094}
1095
1096
1097/* Parses and type-checks comma-separated operands in input_line_pointer. */
1098
1099static void
1100parse_operands (const char *opcode_name,
1101 const unsigned char *operands,
1102 int num_operands,
1103 expressionS *operand_values)
1104{
1105 int i;
1106
1107 memset (operand_values, 0, num_operands * sizeof operand_values[0]);
1108
1109 SKIP_WHITESPACE ();
1110 for (i = 0; i < num_operands; i++)
1111 {
1112 tilegx_operand_type type = tilegx_operands[operands[i]].type;
1113
1114 SKIP_WHITESPACE ();
1115
1116 if (type == TILEGX_OP_TYPE_REGISTER)
1117 {
1118 parse_reg_expression (&operand_values[i]);
1119 }
1120 else if (*input_line_pointer == '}')
1121 {
1122 operand_values[i].X_op = O_absent;
1123 }
1124 else if (type == TILEGX_OP_TYPE_SPR)
1125 {
1126 /* Modify the expression parser to add SPRs to the namespace. */
1127 parsing_spr = 1;
1128 expression (&operand_values[i]);
1129 parsing_spr = 0;
1130 }
1131 else
1132 {
1133 expression (&operand_values[i]);
1134 }
1135
1136 SKIP_WHITESPACE ();
1137
1138 if (i + 1 < num_operands)
1139 {
1140 int separator = (unsigned char)*input_line_pointer++;
1141
1142 if (is_end_of_line[separator] || (separator == '}'))
1143 {
1144 as_bad (_("Too few operands to '%s'."), opcode_name);
1145 return;
1146 }
1147 else if (separator != ',')
1148 {
1149 as_bad (_("Unexpected character '%c' after operand %d to %s."),
1150 (char)separator, i + 1, opcode_name);
1151 return;
1152 }
1153 }
1154
1155 /* Arbitrarily use the first valid pipe to get the operand type,
1156 since they are all the same. */
1157 switch (tilegx_operands[operands[i]].type)
1158 {
1159 case TILEGX_OP_TYPE_REGISTER:
1160 /* Handled in parse_reg_expression already. */
1161 break;
1162 case TILEGX_OP_TYPE_SPR:
1163 /* Fall through */
1164 case TILEGX_OP_TYPE_IMMEDIATE:
1165 /* Fall through */
1166 case TILEGX_OP_TYPE_ADDRESS:
1167 if ( operand_values[i].X_op == O_register
1168 || operand_values[i].X_op == O_illegal
1169 || operand_values[i].X_op == O_absent)
1170 as_bad (_("Expected immediate expression"));
1171 break;
1172 default:
1173 abort();
1174 }
1175 }
1176
1177 if (!is_end_of_line[(unsigned char)*input_line_pointer])
1178 {
1179 switch (*input_line_pointer)
1180 {
1181 case '}':
1182 if (!inside_bundle)
1183 as_bad (_("Found '}' when not bundling."));
1184 ++input_line_pointer;
1185 inside_bundle = 0;
1186 demand_empty_rest_of_line ();
1187 break;
1188
1189 case ',':
1190 as_bad (_("Too many operands"));
1191 break;
1192
1193 default:
1194 /* Use default error for unrecognized garbage. */
1195 demand_empty_rest_of_line ();
1196 break;
1197 }
1198 }
1199}
1200
1201
1202/* This is the guts of the machine-dependent assembler. STR points to a
1203 machine dependent instruction. This function is supposed to emit the
1204 frags/bytes it assembles to. */
1205
1206void
1207md_assemble (char *str)
1208{
1209 char old_char;
1210 size_t opname_len;
1211 char *old_input_line_pointer;
1212 const struct tilegx_opcode *op;
1213 int first_pipe;
1214
1215 /* Split off the opcode and look it up. */
1216 opname_len = strcspn (str, " {}");
1217 old_char = str[opname_len];
1218 str[opname_len] = '\0';
1219
1220 op = hash_find(op_hash, str);
1221 str[opname_len] = old_char;
1222 if (op == NULL)
1223 {
1224 as_bad (_("Unknown opcode `%.*s'."), (int)opname_len, str);
1225 return;
1226 }
1227
1228 /* Prepare to parse the operands. */
1229 old_input_line_pointer = input_line_pointer;
1230 input_line_pointer = str + opname_len;
1231 SKIP_WHITESPACE ();
1232
1233 if (current_bundle_index == TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE)
1234 {
1235 as_bad (_("Too many instructions for bundle."));
1236 tilegx_flush_bundle ();
1237 }
1238
1239 /* Make sure we have room for the upcoming bundle before we
1240 create any fixups. Otherwise if we have to switch to a new
1241 frag the fixup dot_value fields will be wrong. */
1242 frag_grow (TILEGX_BUNDLE_SIZE_IN_BYTES);
1243
1244 /* Find a valid pipe for this opcode. */
1245 for (first_pipe = 0; (op->pipes & (1 << first_pipe)) == 0; first_pipe++)
1246 ;
1247
1248 /* Call the function that assembles this instruction. */
1249 current_bundle[current_bundle_index].opcode = op;
1250 parse_operands (op->name,
1251 &op->operands[first_pipe][0],
1252 op->num_operands,
1253 current_bundle[current_bundle_index].operand_values);
1254 ++current_bundle_index;
1255
1256 /* Restore the saved value of input_line_pointer. */
1257 input_line_pointer = old_input_line_pointer;
1258
1259 /* If we weren't inside curly braces, go ahead and emit
1260 this lone instruction as a bundle right now. */
1261 if (!inside_bundle)
1262 tilegx_flush_bundle ();
1263}
1264
1265
1266static void
1267s_require_canonical_reg_names (int require)
1268{
1269 demand_empty_rest_of_line ();
1270 require_canonical_reg_names = require;
1271}
1272
1273static void
1274s_allow_suspicious_bundles (int allow)
1275{
1276 demand_empty_rest_of_line ();
1277 allow_suspicious_bundles = allow;
1278}
1279
1280const pseudo_typeS md_pseudo_table[] =
1281{
1282 {"align", s_align_bytes, 0}, /* Defaulting is invalid (0). */
1283 {"word", cons, 4},
1284 {"require_canonical_reg_names", s_require_canonical_reg_names, 1 },
1285 {"no_require_canonical_reg_names", s_require_canonical_reg_names, 0 },
1286 {"allow_suspicious_bundles", s_allow_suspicious_bundles, 1 },
1287 {"no_allow_suspicious_bundles", s_allow_suspicious_bundles, 0 },
1288 { NULL, 0, 0 }
1289};
1290
1291/* Equal to MAX_PRECISION in atof-ieee.c */
1292#define MAX_LITTLENUMS 6
1293
fb6cedde
WL
1294void
1295md_number_to_chars (char * buf, valueT val, int n)
1296{
1297 if (target_big_endian)
1298 number_to_chars_bigendian (buf, val, n);
1299 else
1300 number_to_chars_littleendian (buf, val, n);
1301}
1302
aa137e4d
NC
1303/* Turn the string pointed to by litP into a floating point constant
1304 of type TYPE, and emit the appropriate bytes. The number of
1305 LITTLENUMS emitted is stored in *SIZEP. An error message is
1306 returned, or NULL on OK. */
1307
1308char *
1309md_atof (int type, char *litP, int *sizeP)
1310{
1311 int prec;
1312 LITTLENUM_TYPE words[MAX_LITTLENUMS];
1313 LITTLENUM_TYPE *wordP;
1314 char *t;
1315
1316 switch (type)
1317 {
1318 case 'f':
1319 case 'F':
1320 prec = 2;
1321 break;
1322
1323 case 'd':
1324 case 'D':
1325 prec = 4;
1326 break;
1327
1328 default:
1329 *sizeP = 0;
1330 return _("Bad call to md_atof ()");
1331 }
1332 t = atof_ieee (input_line_pointer, type, words);
1333 if (t)
1334 input_line_pointer = t;
1335
1336 *sizeP = prec * sizeof (LITTLENUM_TYPE);
1337 /* This loops outputs the LITTLENUMs in REVERSE order; in accord with
1338 the bigendian 386. */
1339 for (wordP = words + prec - 1; prec--;)
1340 {
1341 md_number_to_chars (litP, (valueT) (*wordP--), sizeof (LITTLENUM_TYPE));
1342 litP += sizeof (LITTLENUM_TYPE);
1343 }
1344 return 0;
1345}
1346
1347
1348/* We have no need to default values of symbols. */
1349
1350symbolS *
1351md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
1352{
1353 return NULL;
1354}
1355
1356
1357void
1358tilegx_cons_fix_new (fragS *frag,
1359 int where,
1360 int nbytes,
1361 expressionS *exp)
1362{
1363 expressionS subexp;
1364 bfd_reloc_code_real_type reloc = BFD_RELOC_NONE;
1365 int no_overflow = 0;
1366 fixS *fixP;
1367
1368 /* See if it's one of our special functions. */
1369 switch (exp->X_op)
1370 {
1371 case O_hw0:
1372 reloc = BFD_RELOC_TILEGX_HW0;
1373 no_overflow = 1;
1374 break;
1375 case O_hw1:
1376 reloc = BFD_RELOC_TILEGX_HW1;
1377 no_overflow = 1;
1378 break;
1379 case O_hw2:
1380 reloc = BFD_RELOC_TILEGX_HW2;
1381 no_overflow = 1;
1382 break;
1383 case O_hw3:
1384 reloc = BFD_RELOC_TILEGX_HW3;
1385 no_overflow = 1;
1386 break;
1387 case O_hw0_last:
1388 reloc = BFD_RELOC_TILEGX_HW0_LAST;
1389 break;
1390 case O_hw1_last:
1391 reloc = BFD_RELOC_TILEGX_HW1_LAST;
1392 break;
1393 case O_hw2_last:
1394 reloc = BFD_RELOC_TILEGX_HW2_LAST;
1395 break;
1396
1397 default:
1398 /* Do nothing. */
1399 break;
1400 }
1401
1402 if (reloc != BFD_RELOC_NONE)
1403 {
1404 if (nbytes != 2)
1405 {
1406 as_bad (_("This operator only produces two byte values."));
1407 nbytes = 2;
1408 }
1409
1410 memset (&subexp, 0, sizeof subexp);
1411 subexp.X_op = O_symbol;
1412 subexp.X_add_symbol = exp->X_add_symbol;
1413 exp = &subexp;
1414 }
1415 else
1416 {
1417 switch (nbytes)
1418 {
1419 case 1:
1420 reloc = BFD_RELOC_8;
1421 break;
1422 case 2:
1423 reloc = BFD_RELOC_16;
1424 break;
1425 case 4:
1426 reloc = BFD_RELOC_32;
1427 break;
1428 case 8:
1429 reloc = BFD_RELOC_64;
1430 break;
1431 default:
1432 as_bad (_("unsupported BFD relocation size %d"), nbytes);
1433 reloc = BFD_RELOC_64;
1434 break;
1435 }
1436 }
1437
1438 fixP = fix_new_exp (frag, where, nbytes, exp, 0, reloc);
1439 fixP->tc_fix_data = NULL;
1440 fixP->fx_no_overflow |= no_overflow;
1441}
1442
1443
1444void
1445md_apply_fix (fixS *fixP, valueT * valP, segT seg ATTRIBUTE_UNUSED)
1446{
1447 const struct tilegx_operand *operand;
1448 valueT value = *valP;
1449 operatorT special;
1450 char *p;
1451
1452 /* Leave these for the linker. */
1453 if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
1454 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1455 return;
1456
1457 if (fixP->fx_subsy != (symbolS *) NULL)
1458 {
1459 /* We can't actually support subtracting a symbol. */
1460 as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
1461 }
1462
1463 /* Correct relocation types for pc-relativeness. */
1464 switch (fixP->fx_r_type)
1465 {
1466#define FIX_PCREL(rtype) \
1467 case rtype: \
1468 if (fixP->fx_pcrel) \
1469 fixP->fx_r_type = rtype##_PCREL; \
1470 break; \
1471 \
1472 case rtype##_PCREL: \
1473 if (!fixP->fx_pcrel) \
1474 fixP->fx_r_type = rtype; \
1475 break
1476
1477 FIX_PCREL (BFD_RELOC_8);
1478 FIX_PCREL (BFD_RELOC_16);
1479 FIX_PCREL (BFD_RELOC_32);
1480 FIX_PCREL (BFD_RELOC_64);
1481 FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X0_HW0);
1482 FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X1_HW0);
1483 FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X0_HW1);
1484 FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X1_HW1);
1485 FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X0_HW2);
1486 FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X1_HW2);
1487 FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X0_HW3);
1488 FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X1_HW3);
1489 FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST);
1490 FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST);
1491 FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST);
1492 FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST);
1493 FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST);
1494 FIX_PCREL (BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST);
1495
1496#undef FIX_PCREL
1497
1498 default:
1499 /* Do nothing */
1500 break;
1501 }
1502
1503 if (fixP->fx_addsy != NULL)
1504 {
1505#ifdef OBJ_ELF
1506 switch (fixP->fx_r_type)
1507 {
6f7be959
WL
1508 case BFD_RELOC_TILEGX_IMM8_X0_TLS_ADD:
1509 case BFD_RELOC_TILEGX_IMM8_X1_TLS_ADD:
1510 case BFD_RELOC_TILEGX_IMM8_Y0_TLS_ADD:
1511 case BFD_RELOC_TILEGX_IMM8_Y1_TLS_ADD:
1512 case BFD_RELOC_TILEGX_IMM8_X0_TLS_GD_ADD:
1513 case BFD_RELOC_TILEGX_IMM8_X1_TLS_GD_ADD:
1514 case BFD_RELOC_TILEGX_IMM8_Y0_TLS_GD_ADD:
1515 case BFD_RELOC_TILEGX_IMM8_Y1_TLS_GD_ADD:
aa137e4d
NC
1516 case BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_GD:
1517 case BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_GD:
aa137e4d
NC
1518 case BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_GD:
1519 case BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_GD:
aa137e4d
NC
1520 case BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_GD:
1521 case BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_GD:
6f7be959
WL
1522 case BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_IE:
1523 case BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_IE:
1524 case BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_IE:
1525 case BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_IE:
aa137e4d
NC
1526 case BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_IE:
1527 case BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_IE:
6f7be959
WL
1528 case BFD_RELOC_TILEGX_IMM16_X0_HW0_TLS_LE:
1529 case BFD_RELOC_TILEGX_IMM16_X1_HW0_TLS_LE:
1530 case BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_TLS_LE:
1531 case BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_TLS_LE:
1532 case BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_TLS_LE:
1533 case BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_TLS_LE:
1534 case BFD_RELOC_TILEGX_TLS_GD_CALL:
1535 case BFD_RELOC_TILEGX_TLS_IE_LOAD:
aa137e4d
NC
1536 case BFD_RELOC_TILEGX_TLS_DTPMOD64:
1537 case BFD_RELOC_TILEGX_TLS_DTPOFF64:
1538 case BFD_RELOC_TILEGX_TLS_TPOFF64:
1539 case BFD_RELOC_TILEGX_TLS_DTPMOD32:
1540 case BFD_RELOC_TILEGX_TLS_DTPOFF32:
1541 case BFD_RELOC_TILEGX_TLS_TPOFF32:
1542 S_SET_THREAD_LOCAL (fixP->fx_addsy);
1543 break;
1544
1545 default:
1546 /* Do nothing */
1547 break;
1548 }
1549#endif
1550 return;
1551 }
1552
1553 /* Apply hw0, etc. */
1554 special = O_illegal;
1555 switch (fixP->fx_r_type)
1556 {
1557 case BFD_RELOC_TILEGX_HW0:
1558 case BFD_RELOC_TILEGX_IMM16_X0_HW0:
1559 case BFD_RELOC_TILEGX_IMM16_X1_HW0:
1560 case BFD_RELOC_TILEGX_IMM16_X0_HW0_PCREL:
1561 case BFD_RELOC_TILEGX_IMM16_X1_HW0_PCREL:
aa137e4d
NC
1562 special = O_hw0;
1563 break;
1564
1565 case BFD_RELOC_TILEGX_HW0_LAST:
1566 case BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST:
1567 case BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST:
1568 case BFD_RELOC_TILEGX_IMM16_X0_HW0_LAST_PCREL:
1569 case BFD_RELOC_TILEGX_IMM16_X1_HW0_LAST_PCREL:
aa137e4d
NC
1570 special = O_hw0_last;
1571 break;
1572
1573 case BFD_RELOC_TILEGX_HW1:
1574 case BFD_RELOC_TILEGX_IMM16_X0_HW1:
1575 case BFD_RELOC_TILEGX_IMM16_X1_HW1:
1576 case BFD_RELOC_TILEGX_IMM16_X0_HW1_PCREL:
1577 case BFD_RELOC_TILEGX_IMM16_X1_HW1_PCREL:
aa137e4d
NC
1578 special = O_hw1;
1579 break;
1580
1581 case BFD_RELOC_TILEGX_HW1_LAST:
1582 case BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST:
1583 case BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST:
1584 case BFD_RELOC_TILEGX_IMM16_X0_HW1_LAST_PCREL:
1585 case BFD_RELOC_TILEGX_IMM16_X1_HW1_LAST_PCREL:
aa137e4d
NC
1586 special = O_hw1_last;
1587 break;
1588
1589 case BFD_RELOC_TILEGX_HW2:
1590 case BFD_RELOC_TILEGX_IMM16_X0_HW2:
1591 case BFD_RELOC_TILEGX_IMM16_X1_HW2:
1592 case BFD_RELOC_TILEGX_IMM16_X0_HW2_PCREL:
1593 case BFD_RELOC_TILEGX_IMM16_X1_HW2_PCREL:
aa137e4d
NC
1594 special = O_hw2;
1595 break;
1596
1597 case BFD_RELOC_TILEGX_HW2_LAST:
1598 case BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST:
1599 case BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST:
1600 case BFD_RELOC_TILEGX_IMM16_X0_HW2_LAST_PCREL:
1601 case BFD_RELOC_TILEGX_IMM16_X1_HW2_LAST_PCREL:
aa137e4d
NC
1602 special = O_hw2_last;
1603 break;
1604
1605 case BFD_RELOC_TILEGX_HW3:
1606 case BFD_RELOC_TILEGX_IMM16_X0_HW3:
1607 case BFD_RELOC_TILEGX_IMM16_X1_HW3:
1608 case BFD_RELOC_TILEGX_IMM16_X0_HW3_PCREL:
1609 case BFD_RELOC_TILEGX_IMM16_X1_HW3_PCREL:
aa137e4d
NC
1610 special = O_hw3;
1611 break;
1612
1613 default:
1614 /* Do nothing */
1615 break;
1616 }
1617
1618 if (special != O_illegal)
1619 {
1620 *valP = value = apply_special_operator (special, value,
1621 fixP->fx_file, fixP->fx_line);
1622 }
1623
1624 p = fixP->fx_frag->fr_literal + fixP->fx_where;
1625
1626 operand = fixP->tc_fix_data;
1627 if (operand != NULL)
1628 {
1629 /* It's an instruction operand. */
1630 tilegx_bundle_bits bits =
1631 insert_operand (0, operand, value, fixP->fx_file, fixP->fx_line);
1632
1633 /* Note that we might either be writing out bits for a bundle
1634 or a static network instruction, which are different sizes, so it's
1635 important to stop touching memory once we run out of bits.
1636 ORing in values is OK since we know the existing bits for
1637 this operand are zero. */
1638 for (; bits != 0; bits >>= 8)
1639 *p++ |= (char)bits;
1640 }
1641 else
1642 {
1643 /* Some other kind of relocation. */
1644 switch (fixP->fx_r_type)
1645 {
1646 case BFD_RELOC_8:
1647 case BFD_RELOC_8_PCREL:
1648 md_number_to_chars (p, value, 1);
1649 break;
1650
1651 case BFD_RELOC_16:
1652 case BFD_RELOC_16_PCREL:
1653 md_number_to_chars (p, value, 2);
1654 break;
1655
1656 case BFD_RELOC_32:
1657 case BFD_RELOC_32_PCREL:
1658 md_number_to_chars (p, value, 4);
1659 break;
1660
1661 case BFD_RELOC_64:
1662 case BFD_RELOC_64_PCREL:
1663 md_number_to_chars (p, value, 8);
1664 break;
1665
1666 default:
1667 /* Leave it for the linker. */
1668 return;
1669 }
1670 }
1671
1672 fixP->fx_done = 1;
1673}
1674
1675
1676/* Generate the BFD reloc to be stuck in the object file from the
1677 fixup used internally in the assembler. */
1678
1679arelent *
1680tc_gen_reloc (asection *sec ATTRIBUTE_UNUSED, fixS *fixp)
1681{
1682 arelent *reloc;
1683
1684 reloc = (arelent *) xmalloc (sizeof (arelent));
1685 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
1686 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1687 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
1688
1689 /* Make sure none of our internal relocations make it this far.
1690 They'd better have been fully resolved by this point. */
1691 gas_assert ((int) fixp->fx_r_type > 0);
1692
1693 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
1694 if (reloc->howto == NULL)
1695 {
1696 as_bad_where (fixp->fx_file, fixp->fx_line,
1697 _("cannot represent `%s' relocation in object file"),
1698 bfd_get_reloc_code_name (fixp->fx_r_type));
1699 return NULL;
1700 }
1701
1702 if (!fixp->fx_pcrel != !reloc->howto->pc_relative)
1703 {
1704 as_fatal (_("internal error? cannot generate `%s' relocation (%d, %d)"),
1705 bfd_get_reloc_code_name (fixp->fx_r_type),
1706 fixp->fx_pcrel, reloc->howto->pc_relative);
1707 }
1708 gas_assert (!fixp->fx_pcrel == !reloc->howto->pc_relative);
1709
1710 reloc->addend = fixp->fx_offset;
1711
1712 return reloc;
1713}
1714
1715
1716/* The location from which a PC relative jump should be calculated,
1717 given a PC relative reloc. */
1718
1719long
1720md_pcrel_from (fixS *fixP)
1721{
1722 return fixP->fx_frag->fr_address + fixP->fx_where;
1723}
1724
1725
1726/* Return 1 if it's OK to adjust a reloc by replacing the symbol with
1727 a section symbol plus some offset. */
1728int
1729tilegx_fix_adjustable (fixS *fix)
1730{
1731 /* Prevent all adjustments to global symbols */
1732 if (S_IS_EXTERNAL (fix->fx_addsy) || S_IS_WEAK (fix->fx_addsy))
1733 return 0;
1734
1735 return 1;
1736}
1737
1738
1739int
1740tilegx_unrecognized_line (int ch)
1741{
1742 switch (ch)
1743 {
1744 case '{':
1745 if (inside_bundle)
1746 {
1747 as_bad (_("Found '{' when already bundling."));
1748 }
1749 else
1750 {
1751 inside_bundle = 1;
1752 current_bundle_index = 0;
1753 }
1754 return 1;
1755
1756 case '}':
1757 if (!inside_bundle)
1758 {
1759 as_bad (_("Found '}' when not bundling."));
1760 }
1761 else
1762 {
1763 tilegx_flush_bundle ();
1764 }
1765
1766 /* Allow '{' to follow on the same line. We also allow ";;", but that
1767 happens automatically because ';' is an end of line marker. */
1768 SKIP_WHITESPACE ();
1769 if (input_line_pointer[0] == '{')
1770 {
1771 input_line_pointer++;
1772 return tilegx_unrecognized_line ('{');
1773 }
1774
1775 demand_empty_rest_of_line ();
1776 return 1;
1777
1778 default:
1779 break;
1780 }
1781
1782 /* Not a valid line. */
1783 return 0;
1784}
1785
1786
1787/* This is called from HANDLE_ALIGN in write.c. Fill in the contents
1788 of an rs_align_code fragment. */
1789
1790void
1791tilegx_handle_align (fragS *fragp)
1792{
1793 addressT bytes, fix;
1794 char *p;
1795
1796 if (fragp->fr_type != rs_align_code)
1797 return;
1798
1799 bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
1800 p = fragp->fr_literal + fragp->fr_fix;
1801 fix = 0;
1802
1803 /* Determine the bits for NOP. */
1804 const struct tilegx_opcode *nop_opcode =
1805 &tilegx_opcodes[TILEGX_OPC_NOP];
1806 tilegx_bundle_bits nop =
1807 ( nop_opcode->fixed_bit_values[TILEGX_PIPELINE_X0]
1808 | nop_opcode->fixed_bit_values[TILEGX_PIPELINE_X1]);
1809
1810 if ((bytes & (TILEGX_BUNDLE_SIZE_IN_BYTES - 1)) != 0)
1811 {
1812 fix = bytes & (TILEGX_BUNDLE_SIZE_IN_BYTES - 1);
1813 memset (p, 0, fix);
1814 p += fix;
1815 bytes -= fix;
1816 }
1817
1818 number_to_chars_littleendian (p, nop, 8);
1819 fragp->fr_fix += fix;
1820 fragp->fr_var = TILEGX_BUNDLE_SIZE_IN_BYTES;
1821}
1822
1823/* Standard calling conventions leave the CFA at SP on entry. */
1824void
1825tilegx_cfi_frame_initial_instructions (void)
1826{
1827 cfi_add_CFA_def_cfa_register (54);
1828}
1829
1830int
1831tc_tilegx_regname_to_dw2regnum (char *regname)
1832{
1833 int i;
1834 for (i = 0; i < TILEGX_NUM_REGISTERS; i++)
1835 {
1836 if (!strcmp (regname, tilegx_register_names[i]))
1837 return i;
1838 }
1839
1840 return -1;
1841}