1 /* tc-tilepro.c -- Assemble for a TILEPro chip.
2    Copyright (C) 2011-2022 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 "subsegs.h"
23 
24 #include "elf/tilepro.h"
25 #include "opcode/tilepro.h"
26 
27 #include "dwarf2dbg.h"
28 #include "dw2gencfi.h"
29 
30 #include "safe-ctype.h"
31 
32 
33 /* Special registers. */
34 #define TREG_IDN0     57
35 #define TREG_IDN1     58
36 #define TREG_UDN0     59
37 #define TREG_UDN1     60
38 #define TREG_UDN2     61
39 #define TREG_UDN3     62
40 #define TREG_ZERO     63
41 
42 
43 /* Generic assembler global variables which must be defined by all
44    targets.  */
45 
46 /* Characters which always start a comment.  */
47 const char comment_chars[] = "#";
48 
49 /* Characters which start a comment at the beginning of a line.  */
50 const char line_comment_chars[] = "#";
51 
52 /* Characters which may be used to separate multiple commands on a
53    single line.  */
54 const char line_separator_chars[] = ";";
55 
56 /* Characters which are used to indicate an exponent in a floating
57    point number.  */
58 const char EXP_CHARS[] = "eE";
59 
60 /* Characters which mean that a number is a floating point constant,
61    as in 0d1.0.  */
62 const char FLT_CHARS[] = "rRsSfFdDxXpP";
63 
64 const char *md_shortopts = "VQ:";
65 
66 struct option md_longopts[] =
67 {
68   {NULL, no_argument, NULL, 0}
69 };
70 
71 size_t md_longopts_size = sizeof (md_longopts);
72 
73 int
md_parse_option(int c,const char * arg ATTRIBUTE_UNUSED)74 md_parse_option (int c, const char *arg ATTRIBUTE_UNUSED)
75 {
76   switch (c)
77     {
78       /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
79 	 should be emitted or not.  FIXME: Not implemented.  */
80     case 'Q':
81       break;
82 
83       /* -V: SVR4 argument to print version ID.  */
84     case 'V':
85       print_version_id ();
86       break;
87 
88     default:
89       return 0;
90     }
91 
92   return 1;
93 }
94 
95 void
md_show_usage(FILE * stream)96 md_show_usage (FILE *stream)
97 {
98   fprintf (stream, _("\
99   -Q                      ignored\n\
100   -V                      print assembler version number\n"));
101 }
102 
103 /* Extra expression types.  */
104 
105 #define O_lo16        O_md1
106 #define O_hi16        O_md2
107 #define O_ha16        O_md3
108 #define O_got         O_md4
109 #define O_got_lo16    O_md5
110 #define O_got_hi16    O_md6
111 #define O_got_ha16    O_md7
112 #define O_plt         O_md8
113 #define O_tls_gd      O_md9
114 #define O_tls_gd_lo16 O_md10
115 #define O_tls_gd_hi16 O_md11
116 #define O_tls_gd_ha16 O_md12
117 #define O_tls_ie      O_md13
118 #define O_tls_ie_lo16 O_md14
119 #define O_tls_ie_hi16 O_md15
120 #define O_tls_ie_ha16 O_md16
121 #define O_tls_le      O_md17
122 #define O_tls_le_lo16 O_md18
123 #define O_tls_le_hi16 O_md19
124 #define O_tls_le_ha16 O_md20
125 #define O_tls_gd_call O_md21
126 #define O_tls_gd_add  O_md22
127 #define O_tls_ie_load O_md23
128 
129 static htab_t special_operator_hash;
130 
131 /* Hash tables for instruction mnemonic lookup.  */
132 static htab_t op_hash;
133 
134 /* Hash table for spr lookup.  */
135 static htab_t spr_hash;
136 
137 /* True temporarily while parsing an SPR expression. This changes the
138  * namespace to include SPR names.  */
139 static int parsing_spr;
140 
141 /* Are we currently inside `{ ... }'?  */
142 static int inside_bundle;
143 
144 struct tilepro_instruction
145 {
146   const struct tilepro_opcode *opcode;
147   tilepro_pipeline pipe;
148   expressionS operand_values[TILEPRO_MAX_OPERANDS];
149 };
150 
151 /* This keeps track of the current bundle being built up.  */
152 static struct tilepro_instruction
153 current_bundle[TILEPRO_MAX_INSTRUCTIONS_PER_BUNDLE];
154 
155 /* Index in current_bundle for the next instruction to parse.  */
156 static int current_bundle_index;
157 
158 /* Allow 'r63' in addition to 'zero', etc. Normally we disallow this as
159    'zero' is not a real register, so using it accidentally would be a
160    nasty bug. For other registers, such as 'sp', code using multiple names
161    for the same physical register is excessively confusing.
162 
163    The '.require_canonical_reg_names' pseudo-op turns this error on,
164    and the '.no_require_canonical_reg_names' pseudo-op turns this off.
165    By default the error is on.  */
166 static int require_canonical_reg_names;
167 
168 /* Allow bundles that do undefined or suspicious things like write
169    two different values to the same register at the same time.
170 
171    The '.no_allow_suspicious_bundles' pseudo-op turns this error on,
172    and the '.allow_suspicious_bundles' pseudo-op turns this off.  */
173 static int allow_suspicious_bundles;
174 
175 
176 /* A hash table of main processor registers, mapping each register name
177    to its index.
178 
179    Furthermore, if the register number is greater than the number
180    of registers for that processor, the user used an illegal alias
181    for that register (e.g. r63 instead of zero), so we should generate
182    a warning. The attempted register number can be found by clearing
183    NONCANONICAL_REG_NAME_FLAG.  */
184 static htab_t main_reg_hash;
185 
186 
187 /* We cannot unambiguously store a 0 in a hash table and look it up,
188    so we OR in this flag to every canonical register.  */
189 #define CANONICAL_REG_NAME_FLAG    0x1000
190 
191 /* By default we disallow register aliases like r63, but we record
192    them in the hash table in case the .no_require_canonical_reg_names
193    directive is used. Noncanonical names have this value added to them.  */
194 #define NONCANONICAL_REG_NAME_FLAG 0x2000
195 
196 /* Discards flags for register hash table entries and returns the
197    reg number.  */
198 #define EXTRACT_REGNO(p) ((p) & 63)
199 
200 /* This function is called once, at assembler startup time.  It should
201    set up all the tables, etc., that the MD part of the assembler will
202    need.  */
203 void
md_begin(void)204 md_begin (void)
205 {
206   const struct tilepro_opcode *op;
207   int i;
208 
209   /* Guarantee text section is aligned.  */
210   bfd_set_section_alignment (text_section,
211                              TILEPRO_LOG2_BUNDLE_ALIGNMENT_IN_BYTES);
212 
213   require_canonical_reg_names = 1;
214   allow_suspicious_bundles = 0;
215   current_bundle_index = 0;
216   inside_bundle = 0;
217 
218   /* Initialize special operator hash table.  */
219   special_operator_hash = str_htab_create ();
220 #define INSERT_SPECIAL_OP(name)					\
221   str_hash_insert (special_operator_hash, #name, (void *) O_##name, 0)
222 
223   INSERT_SPECIAL_OP(lo16);
224   INSERT_SPECIAL_OP(hi16);
225   INSERT_SPECIAL_OP(ha16);
226   INSERT_SPECIAL_OP(got);
227   INSERT_SPECIAL_OP(got_lo16);
228   INSERT_SPECIAL_OP(got_hi16);
229   INSERT_SPECIAL_OP(got_ha16);
230   INSERT_SPECIAL_OP(plt);
231   INSERT_SPECIAL_OP(tls_gd);
232   INSERT_SPECIAL_OP(tls_gd_lo16);
233   INSERT_SPECIAL_OP(tls_gd_hi16);
234   INSERT_SPECIAL_OP(tls_gd_ha16);
235   INSERT_SPECIAL_OP(tls_ie);
236   INSERT_SPECIAL_OP(tls_ie_lo16);
237   INSERT_SPECIAL_OP(tls_ie_hi16);
238   INSERT_SPECIAL_OP(tls_ie_ha16);
239   INSERT_SPECIAL_OP(tls_le);
240   INSERT_SPECIAL_OP(tls_le_lo16);
241   INSERT_SPECIAL_OP(tls_le_hi16);
242   INSERT_SPECIAL_OP(tls_le_ha16);
243   INSERT_SPECIAL_OP(tls_gd_call);
244   INSERT_SPECIAL_OP(tls_gd_add);
245   INSERT_SPECIAL_OP(tls_ie_load);
246 #undef INSERT_SPECIAL_OP
247 
248   /* Initialize op_hash hash table.  */
249   op_hash = str_htab_create ();
250   for (op = &tilepro_opcodes[0]; op->name != NULL; op++)
251     if (str_hash_insert (op_hash, op->name, op, 0) != NULL)
252       as_fatal (_("duplicate %s"), op->name);
253 
254   /* Initialize the spr hash table.  */
255   parsing_spr = 0;
256   spr_hash = str_htab_create ();
257   for (i = 0; i < tilepro_num_sprs; i++)
258     str_hash_insert (spr_hash, tilepro_sprs[i].name, &tilepro_sprs[i], 0);
259 
260   /* Set up the main_reg_hash table. We use this instead of
261    * creating a symbol in the register section to avoid ambiguities
262    * with labels that have the same names as registers.  */
263   main_reg_hash = str_htab_create ();
264   for (i = 0; i < TILEPRO_NUM_REGISTERS; i++)
265     {
266       char buf[64];
267 
268       str_hash_insert (main_reg_hash, tilepro_register_names[i],
269 		       (void *) (long) (i | CANONICAL_REG_NAME_FLAG), 0);
270 
271       /* See if we should insert a noncanonical alias, like r63.  */
272       sprintf (buf, "r%d", i);
273       if (strcmp (buf, tilepro_register_names[i]) != 0)
274 	str_hash_insert (main_reg_hash, xstrdup (buf),
275 			 (void *) (long) (i | NONCANONICAL_REG_NAME_FLAG), 0);
276     }
277 
278   /* Insert obsolete backwards-compatibility register names.  */
279   str_hash_insert (main_reg_hash, "io0",
280 		   (void *) (long) (TREG_IDN0 | CANONICAL_REG_NAME_FLAG), 0);
281   str_hash_insert (main_reg_hash, "io1",
282 		   (void *) (long) (TREG_IDN1 | CANONICAL_REG_NAME_FLAG), 0);
283   str_hash_insert (main_reg_hash, "us0",
284 		   (void *) (long) (TREG_UDN0 | CANONICAL_REG_NAME_FLAG), 0);
285   str_hash_insert (main_reg_hash, "us1",
286 		   (void *) (long) (TREG_UDN1 | CANONICAL_REG_NAME_FLAG), 0);
287   str_hash_insert (main_reg_hash, "us2",
288 		   (void *) (long) (TREG_UDN2 | CANONICAL_REG_NAME_FLAG), 0);
289   str_hash_insert (main_reg_hash, "us3",
290 		   (void *) (long) (TREG_UDN3 | CANONICAL_REG_NAME_FLAG), 0);
291 
292 }
293 
294 
295 #define BUNDLE_TEMPLATE_MASK(p0, p1, p2) \
296   ((p0) | ((p1) << 8) | ((p2) << 16))
297 #define BUNDLE_TEMPLATE(p0, p1, p2) \
298   { { (p0), (p1), (p2) }, \
299      BUNDLE_TEMPLATE_MASK(1 << (p0), 1 << (p1), (1 << (p2))) \
300   }
301 
302 #define NO_PIPELINE TILEPRO_NUM_PIPELINE_ENCODINGS
303 
304 struct bundle_template
305 {
306   tilepro_pipeline pipe[TILEPRO_MAX_INSTRUCTIONS_PER_BUNDLE];
307   unsigned int pipe_mask;
308 };
309 
310 static const struct bundle_template bundle_templates[] =
311 {
312   /* In Y format we must always have something in Y2, since it has
313    * no fnop, so this conveys that Y2 must always be used.  */
314   BUNDLE_TEMPLATE(TILEPRO_PIPELINE_Y0, TILEPRO_PIPELINE_Y2, NO_PIPELINE),
315   BUNDLE_TEMPLATE(TILEPRO_PIPELINE_Y1, TILEPRO_PIPELINE_Y2, NO_PIPELINE),
316   BUNDLE_TEMPLATE(TILEPRO_PIPELINE_Y2, TILEPRO_PIPELINE_Y0, NO_PIPELINE),
317   BUNDLE_TEMPLATE(TILEPRO_PIPELINE_Y2, TILEPRO_PIPELINE_Y1, NO_PIPELINE),
318 
319   /* Y format has three instructions.  */
320   BUNDLE_TEMPLATE(TILEPRO_PIPELINE_Y0, TILEPRO_PIPELINE_Y1, TILEPRO_PIPELINE_Y2),
321   BUNDLE_TEMPLATE(TILEPRO_PIPELINE_Y0, TILEPRO_PIPELINE_Y2, TILEPRO_PIPELINE_Y1),
322   BUNDLE_TEMPLATE(TILEPRO_PIPELINE_Y1, TILEPRO_PIPELINE_Y0, TILEPRO_PIPELINE_Y2),
323   BUNDLE_TEMPLATE(TILEPRO_PIPELINE_Y1, TILEPRO_PIPELINE_Y2, TILEPRO_PIPELINE_Y0),
324   BUNDLE_TEMPLATE(TILEPRO_PIPELINE_Y2, TILEPRO_PIPELINE_Y0, TILEPRO_PIPELINE_Y1),
325   BUNDLE_TEMPLATE(TILEPRO_PIPELINE_Y2, TILEPRO_PIPELINE_Y1, TILEPRO_PIPELINE_Y0),
326 
327   /* X format has only two instructions.  */
328   BUNDLE_TEMPLATE(TILEPRO_PIPELINE_X0, TILEPRO_PIPELINE_X1, NO_PIPELINE),
329   BUNDLE_TEMPLATE(TILEPRO_PIPELINE_X1, TILEPRO_PIPELINE_X0, NO_PIPELINE)
330 };
331 
332 
333 static void
prepend_nop_to_bundle(tilepro_mnemonic mnemonic)334 prepend_nop_to_bundle (tilepro_mnemonic mnemonic)
335 {
336   memmove (&current_bundle[1], &current_bundle[0],
337 	   current_bundle_index * sizeof current_bundle[0]);
338   current_bundle[0].opcode = &tilepro_opcodes[mnemonic];
339   ++current_bundle_index;
340 }
341 
342 
343 static tilepro_bundle_bits
insert_operand(tilepro_bundle_bits bits,const struct tilepro_operand * operand,int operand_value,const char * file,unsigned lineno)344 insert_operand (tilepro_bundle_bits bits,
345                 const struct tilepro_operand *operand,
346                 int operand_value,
347                 const char *file,
348                 unsigned lineno)
349 {
350   /* Range-check the immediate.  */
351   int num_bits = operand->num_bits;
352 
353   operand_value >>= operand->rightshift;
354 
355   if (bfd_check_overflow (operand->is_signed
356                           ? complain_overflow_signed
357                           : complain_overflow_unsigned,
358                           num_bits,
359                           0,
360                           bfd_arch_bits_per_address (stdoutput),
361                           operand_value)
362       != bfd_reloc_ok)
363     {
364       offsetT min, max;
365       if (operand->is_signed)
366 	{
367 	  min = -(1 << (num_bits - 1));
368 	  max = (1 << (num_bits - 1)) - 1;
369 	}
370       else
371 	{
372 	  min = 0;
373 	  max = (1 << num_bits) - 1;
374 	}
375       as_bad_value_out_of_range (_("operand"), operand_value, min, max,
376 				 file, lineno);
377     }
378 
379   /* Write out the bits for the immediate.  */
380   return bits | operand->insert (operand_value);
381 }
382 
383 
384 static int
apply_special_operator(operatorT op,int num)385 apply_special_operator (operatorT op, int num)
386 {
387   switch (op)
388     {
389     case O_lo16:
390       return (signed short)num;
391 
392     case O_hi16:
393       return (signed short)(num >> 16);
394 
395     case O_ha16:
396       return (signed short)((num + 0x8000) >> 16);
397 
398     default:
399       abort ();
400     }
401 }
402 
403 
404 static tilepro_bundle_bits
emit_tilepro_instruction(tilepro_bundle_bits bits,int num_operands,const unsigned char * operands,expressionS * operand_values,char * bundle_start)405 emit_tilepro_instruction (tilepro_bundle_bits bits,
406 			  int num_operands,
407 			  const unsigned char *operands,
408 			  expressionS *operand_values,
409 			  char *bundle_start)
410 {
411   int i;
412 
413   for (i = 0; i < num_operands; i++)
414     {
415       const struct tilepro_operand *operand =
416 	&tilepro_operands[operands[i]];
417       expressionS *operand_exp = &operand_values[i];
418       int is_pc_relative = operand->is_pc_relative;
419 
420       if (operand_exp->X_op == O_register
421 	  || (operand_exp->X_op == O_constant && !is_pc_relative))
422 	{
423 	  /* We know what the bits are right now, so insert them.  */
424 	  bits = insert_operand (bits, operand, operand_exp->X_add_number,
425 				 NULL, 0);
426 	}
427       else
428 	{
429 	  bfd_reloc_code_real_type reloc = operand->default_reloc;
430 	  expressionS subexp;
431 	  int die = 0, use_subexp = 0, require_symbol = 0;
432 	  fixS *fixP;
433 
434 	  /* Take an expression like hi16(x) and turn it into x with
435 	     a different reloc type.  */
436 	  switch (operand_exp->X_op)
437 	    {
438 #define HANDLE_OP16(suffix)					\
439 	      switch (reloc)					\
440 		{                                               \
441 		case BFD_RELOC_TILEPRO_IMM16_X0:                \
442 		  reloc = BFD_RELOC_TILEPRO_IMM16_X0_##suffix;  \
443 		  break;                                        \
444 		case BFD_RELOC_TILEPRO_IMM16_X1:                \
445 		  reloc = BFD_RELOC_TILEPRO_IMM16_X1_##suffix;  \
446 		  break;                                        \
447 		default:                                        \
448 		  die = 1;                                      \
449 		  break;                                        \
450 		}                                               \
451 	      use_subexp = 1
452 
453 	    case O_lo16:
454 	      HANDLE_OP16 (LO);
455 	      break;
456 
457 	    case O_hi16:
458 	      HANDLE_OP16 (HI);
459 	      break;
460 
461 	    case O_ha16:
462 	      HANDLE_OP16 (HA);
463 	      break;
464 
465 	    case O_got:
466 	      HANDLE_OP16 (GOT);
467 	      require_symbol = 1;
468 	      break;
469 
470 	    case O_got_lo16:
471 	      HANDLE_OP16 (GOT_LO);
472 	      require_symbol = 1;
473 	      break;
474 
475 	    case O_got_hi16:
476 	      HANDLE_OP16 (GOT_HI);
477 	      require_symbol = 1;
478 	      break;
479 
480 	    case O_got_ha16:
481 	      HANDLE_OP16 (GOT_HA);
482 	      require_symbol = 1;
483 	      break;
484 
485 	    case O_tls_gd:
486 	      HANDLE_OP16 (TLS_GD);
487 	      require_symbol = 1;
488 	      break;
489 
490 	    case O_tls_gd_lo16:
491 	      HANDLE_OP16 (TLS_GD_LO);
492 	      require_symbol = 1;
493 	      break;
494 
495 	    case O_tls_gd_hi16:
496 	      HANDLE_OP16 (TLS_GD_HI);
497 	      require_symbol = 1;
498 	      break;
499 
500 	    case O_tls_gd_ha16:
501 	      HANDLE_OP16 (TLS_GD_HA);
502 	      require_symbol = 1;
503 	      break;
504 
505 	    case O_tls_ie:
506 	      HANDLE_OP16 (TLS_IE);
507 	      require_symbol = 1;
508 	      break;
509 
510 	    case O_tls_ie_lo16:
511 	      HANDLE_OP16 (TLS_IE_LO);
512 	      require_symbol = 1;
513 	      break;
514 
515 	    case O_tls_ie_hi16:
516 	      HANDLE_OP16 (TLS_IE_HI);
517 	      require_symbol = 1;
518 	      break;
519 
520 	    case O_tls_ie_ha16:
521 	      HANDLE_OP16 (TLS_IE_HA);
522 	      require_symbol = 1;
523 	      break;
524 
525 	    case O_tls_le:
526 	      HANDLE_OP16 (TLS_LE);
527 	      require_symbol = 1;
528 	      break;
529 
530 	    case O_tls_le_lo16:
531 	      HANDLE_OP16 (TLS_LE_LO);
532 	      require_symbol = 1;
533 	      break;
534 
535 	    case O_tls_le_hi16:
536 	      HANDLE_OP16 (TLS_LE_HI);
537 	      require_symbol = 1;
538 	      break;
539 
540 	    case O_tls_le_ha16:
541 	      HANDLE_OP16 (TLS_LE_HA);
542 	      require_symbol = 1;
543 	      break;
544 
545 #undef HANDLE_OP16
546 
547 	    case O_plt:
548 	      switch (reloc)
549 		{
550 		case BFD_RELOC_TILEPRO_JOFFLONG_X1:
551 		  reloc = BFD_RELOC_TILEPRO_JOFFLONG_X1_PLT;
552 		  break;
553 		default:
554 		  die = 1;
555 		  break;
556 		}
557 	      use_subexp = 1;
558 	      require_symbol = 1;
559 	      break;
560 
561 	    case O_tls_gd_call:
562 	      switch (reloc)
563 		{
564 		case BFD_RELOC_TILEPRO_JOFFLONG_X1:
565 		  reloc = BFD_RELOC_TILEPRO_TLS_GD_CALL;
566 		  break;
567 		default:
568 		  die = 1;
569 		  break;
570 		}
571 	      use_subexp = 1;
572 	      require_symbol = 1;
573 	      break;
574 
575 	    case O_tls_gd_add:
576 	      switch (reloc)
577 		{
578 		case BFD_RELOC_TILEPRO_IMM8_X0:
579 		  reloc = BFD_RELOC_TILEPRO_IMM8_X0_TLS_GD_ADD;
580 		  break;
581 		case BFD_RELOC_TILEPRO_IMM8_X1:
582 		  reloc = BFD_RELOC_TILEPRO_IMM8_X1_TLS_GD_ADD;
583 		  break;
584 		case BFD_RELOC_TILEPRO_IMM8_Y0:
585 		  reloc = BFD_RELOC_TILEPRO_IMM8_Y0_TLS_GD_ADD;
586 		  break;
587 		case BFD_RELOC_TILEPRO_IMM8_Y1:
588 		  reloc = BFD_RELOC_TILEPRO_IMM8_Y1_TLS_GD_ADD;
589 		  break;
590 		default:
591 		  die = 1;
592 		  break;
593 		}
594 	      use_subexp = 1;
595 	      require_symbol = 1;
596 	      break;
597 
598 	    case O_tls_ie_load:
599 	      switch (reloc)
600 		{
601 		case BFD_RELOC_TILEPRO_IMM8_X1:
602 		  reloc = BFD_RELOC_TILEPRO_TLS_IE_LOAD;
603 		  break;
604 		default:
605 		  die = 1;
606 		  break;
607 		}
608 	      use_subexp = 1;
609 	      require_symbol = 1;
610 	      break;
611 
612 	    default:
613 	      /* Do nothing.  */
614 	      break;
615 	    }
616 
617 	  if (die)
618 	    {
619 	      as_bad (_("Invalid operator for operand."));
620 	    }
621 	  else if (use_subexp)
622 	    {
623 	      expressionS *sval = NULL;
624 	      /* Now that we've changed the reloc, change ha16(x) into x,
625 		 etc.  */
626 
627 	      if (symbol_symbolS (operand_exp->X_add_symbol))
628 		sval = symbol_get_value_expression (operand_exp->X_add_symbol);
629 	      if (sval && sval->X_md)
630 		{
631 		  /* HACK: We used X_md to mark this symbol as a fake wrapper
632 		     around a real expression. To unwrap it, we just grab its
633 		     value here.  */
634 		  operand_exp = sval;
635 
636 		  if (require_symbol)
637 		    {
638 		      /* Look at the expression, and reject it if it's not a
639 			 plain symbol.  */
640 		      if (operand_exp->X_op != O_symbol
641 			  || operand_exp->X_add_number != 0)
642 			as_bad (_("Operator may only be applied to symbols."));
643 		    }
644 		}
645 	      else
646 		{
647 		  /* The value of this expression is an actual symbol, so
648 		     turn that into an expression.  */
649 		  memset (&subexp, 0, sizeof subexp);
650 		  subexp.X_op = O_symbol;
651 		  subexp.X_add_symbol = operand_exp->X_add_symbol;
652 		  operand_exp = &subexp;
653 		}
654 	    }
655 
656 	  /* Create a fixup to handle this later. */
657 	  fixP = fix_new_exp (frag_now,
658 			      bundle_start - frag_now->fr_literal,
659 			      (operand->num_bits + 7) >> 3,
660 			      operand_exp,
661 			      is_pc_relative,
662 			      reloc);
663 	  fixP->tc_fix_data = operand;
664 
665 	  /* Don't do overflow checking if we are applying a function like
666 	     ha16.  */
667 	  fixP->fx_no_overflow |= use_subexp;
668 	}
669     }
670   return bits;
671 }
672 
673 
674 /* Detects and complains if two instructions in current_bundle write
675    to the same register, either implicitly or explicitly, or if a
676    read-only register is written.  */
677 static void
check_illegal_reg_writes(void)678 check_illegal_reg_writes (void)
679 {
680   uint64_t all_regs_written = 0;
681   int j;
682 
683   for (j = 0; j < current_bundle_index; j++)
684     {
685       const struct tilepro_instruction *instr = &current_bundle[j];
686       int k;
687       uint64_t regs =
688 	(uint64_t) 1 << instr->opcode->implicitly_written_register;
689       uint64_t conflict;
690 
691       for (k = 0; k < instr->opcode->num_operands; k++)
692 	{
693 	  const struct tilepro_operand *operand =
694 	    &tilepro_operands[instr->opcode->operands[instr->pipe][k]];
695 
696 	  if (operand->is_dest_reg)
697 	    {
698 	      int regno = instr->operand_values[k].X_add_number;
699 	      uint64_t mask = (uint64_t) 1 << regno;
700 
701 	      if ((mask & (  ((uint64_t) 1 << TREG_IDN1)
702 			   | ((uint64_t) 1 << TREG_UDN1)
703 			   | ((uint64_t) 1 << TREG_UDN2)
704 			   | ((uint64_t) 1 << TREG_UDN3))) != 0
705 		  && !allow_suspicious_bundles)
706 		{
707 		  as_bad (_("Writes to register '%s' are not allowed."),
708 			  tilepro_register_names[regno]);
709 		}
710 
711 	      regs |= mask;
712 	    }
713 	}
714 
715       /* Writing to the zero register doesn't count.  */
716       regs &= ~((uint64_t) 1 << TREG_ZERO);
717 
718       conflict = all_regs_written & regs;
719       if (conflict != 0 && !allow_suspicious_bundles)
720 	{
721 	  /* Find which register caused the conflict.  */
722 	  const char *conflicting_reg_name = "???";
723 	  int i;
724 
725 	  for (i = 0; i < TILEPRO_NUM_REGISTERS; i++)
726 	    {
727 	      if (((conflict >> i) & 1) != 0)
728 		{
729 		  conflicting_reg_name = tilepro_register_names[i];
730 		  break;
731 		}
732 	    }
733 
734 	  as_bad (_("Two instructions in the same bundle both write "
735 		    "to register %s, which is not allowed."),
736 		  conflicting_reg_name);
737 	}
738 
739       all_regs_written |= regs;
740     }
741 }
742 
743 
744 static void
tilepro_flush_bundle(void)745 tilepro_flush_bundle (void)
746 {
747   unsigned i;
748   int j, addr_mod;
749   unsigned compatible_pipes;
750   const struct bundle_template *match;
751   char *f;
752 
753   inside_bundle = 0;
754 
755   switch (current_bundle_index)
756     {
757     case 0:
758       /* No instructions.  */
759       return;
760     case 1:
761       if (current_bundle[0].opcode->can_bundle)
762 	{
763 	  /* Simplify later logic by adding an explicit fnop.  */
764 	  prepend_nop_to_bundle (TILEPRO_OPC_FNOP);
765 	}
766       else
767 	{
768 	  /* This instruction cannot be bundled with anything else.
769 	     Prepend an explicit 'nop', rather than an 'fnop', because
770 	     fnops can be replaced by later binary-processing tools
771 	     while nops cannot.  */
772 	  prepend_nop_to_bundle (TILEPRO_OPC_NOP);
773 	}
774       break;
775     default:
776       if (!allow_suspicious_bundles)
777 	{
778 	  /* Make sure all instructions can be bundled with other
779 	     instructions.  */
780 	  const struct tilepro_opcode *cannot_bundle = NULL;
781 	  bool seen_non_nop = false;
782 
783 	  for (j = 0; j < current_bundle_index; j++)
784 	    {
785 	      const struct tilepro_opcode *op = current_bundle[j].opcode;
786 
787 	      if (!op->can_bundle && cannot_bundle == NULL)
788 		cannot_bundle = op;
789 	      else if (op->mnemonic != TILEPRO_OPC_NOP
790 		       && op->mnemonic != TILEPRO_OPC_INFO
791 		       && op->mnemonic != TILEPRO_OPC_INFOL)
792 		seen_non_nop = true;
793 	    }
794 
795 	  if (cannot_bundle != NULL && seen_non_nop)
796 	    {
797 	      current_bundle_index = 0;
798 	      as_bad (_("'%s' may not be bundled with other instructions."),
799 		      cannot_bundle->name);
800 	      return;
801 	    }
802 	}
803       break;
804     }
805 
806   compatible_pipes =
807     BUNDLE_TEMPLATE_MASK(current_bundle[0].opcode->pipes,
808                          current_bundle[1].opcode->pipes,
809                          (current_bundle_index == 3
810                           ? current_bundle[2].opcode->pipes
811                           : (1 << NO_PIPELINE)));
812 
813   /* Find a template that works, if any.  */
814   match = NULL;
815   for (i = 0; i < sizeof bundle_templates / sizeof bundle_templates[0]; i++)
816     {
817       const struct bundle_template *b = &bundle_templates[i];
818       if ((b->pipe_mask & compatible_pipes) == b->pipe_mask)
819 	{
820 	  match = b;
821 	  break;
822 	}
823     }
824 
825   if (match == NULL)
826     {
827       current_bundle_index = 0;
828       as_bad (_("Invalid combination of instructions for bundle."));
829       return;
830     }
831 
832   /* If the section seems to have no alignment set yet, go ahead and
833      make it large enough to hold code.  */
834   if (bfd_section_alignment (now_seg) == 0)
835     bfd_set_section_alignment (now_seg,
836                                TILEPRO_LOG2_BUNDLE_ALIGNMENT_IN_BYTES);
837 
838   for (j = 0; j < current_bundle_index; j++)
839     current_bundle[j].pipe = match->pipe[j];
840 
841   if (current_bundle_index == 2 && !tilepro_is_x_pipeline(match->pipe[0]))
842     {
843       /* We are in Y mode with only two instructions, so add an FNOP.  */
844       prepend_nop_to_bundle (TILEPRO_OPC_FNOP);
845 
846       /* Figure out what pipe the fnop must be in via arithmetic.
847        * p0 + p1 + p2 must sum to the sum of TILEPRO_PIPELINE_Y[012].  */
848       current_bundle[0].pipe =
849 	(tilepro_pipeline)((TILEPRO_PIPELINE_Y0
850 			    + TILEPRO_PIPELINE_Y1
851 			    + TILEPRO_PIPELINE_Y2) -
852 			   (current_bundle[1].pipe + current_bundle[2].pipe));
853     }
854 
855   check_illegal_reg_writes ();
856 
857   f = frag_more (TILEPRO_BUNDLE_SIZE_IN_BYTES);
858 
859   /* Check to see if this bundle is at an offset that is a multiple of 8-bytes
860      from the start of the frag.  */
861   addr_mod = frag_now_fix () & (TILEPRO_BUNDLE_ALIGNMENT_IN_BYTES - 1);
862   if (frag_now->has_code && frag_now->insn_addr != addr_mod)
863     as_bad (_("instruction address is not a multiple of 8"));
864   frag_now->insn_addr = addr_mod;
865   frag_now->has_code = 1;
866 
867   tilepro_bundle_bits bits = 0;
868   for (j = 0; j < current_bundle_index; j++)
869     {
870       struct tilepro_instruction *instr = &current_bundle[j];
871       tilepro_pipeline pipeline = instr->pipe;
872       const struct tilepro_opcode *opcode = instr->opcode;
873 
874       bits |= emit_tilepro_instruction (opcode->fixed_bit_values[pipeline],
875 					opcode->num_operands,
876 					&opcode->operands[pipeline][0],
877 					instr->operand_values,
878 					f);
879     }
880 
881   number_to_chars_littleendian (f, (unsigned int)bits, 4);
882   number_to_chars_littleendian (f + 4, (unsigned int)(bits >> 32), 4);
883   current_bundle_index = 0;
884 
885   /* Emit DWARF2 debugging information.  */
886   dwarf2_emit_insn (TILEPRO_BUNDLE_SIZE_IN_BYTES);
887 }
888 
889 
890 /* Extend the expression parser to handle hi16(label), etc.
891    as well as SPR names when in the context of parsing an SPR.  */
892 int
tilepro_parse_name(char * name,expressionS * e,char * nextcharP)893 tilepro_parse_name (char *name, expressionS *e, char *nextcharP)
894 {
895   operatorT op = O_illegal;
896 
897   if (parsing_spr)
898     {
899       void *val = str_hash_find (spr_hash, name);
900       if (val == NULL)
901 	return 0;
902 
903       memset (e, 0, sizeof *e);
904       e->X_op = O_constant;
905       e->X_add_number = ((const struct tilepro_spr *)val)->number;
906       return 1;
907     }
908 
909   if (*nextcharP != '(')
910     {
911       /* hi16, etc. not followed by a paren is just a label with that
912 	 name.  */
913       return 0;
914     }
915   else
916     {
917       /* Look up the operator in our table.  */
918       void *val = str_hash_find (special_operator_hash, name);
919       if (val == 0)
920 	return 0;
921       op = (operatorT)(long)val;
922     }
923 
924   /* Restore old '(' and skip it.  */
925   *input_line_pointer = '(';
926   ++input_line_pointer;
927 
928   expression (e);
929 
930   if (*input_line_pointer != ')')
931     {
932       as_bad (_("Missing ')'"));
933       *nextcharP = *input_line_pointer;
934       return 0;
935     }
936   /* Skip ')'.  */
937   ++input_line_pointer;
938 
939   if (e->X_op == O_register || e->X_op == O_absent)
940     {
941       as_bad (_("Invalid expression."));
942       e->X_op = O_constant;
943       e->X_add_number = 0;
944     }
945   else
946     {
947       /* Wrap subexpression with a unary operator.  */
948       symbolS *sym = make_expr_symbol (e);
949 
950       if (sym != e->X_add_symbol)
951 	{
952 	  /* HACK: mark this symbol as a temporary wrapper around a proper
953 	     expression, so we can unwrap it later once we have communicated
954 	     the relocation type.  */
955 	  symbol_get_value_expression (sym)->X_md = 1;
956 	}
957 
958       memset (e, 0, sizeof *e);
959       e->X_op = op;
960       e->X_add_symbol = sym;
961       e->X_add_number = 0;
962     }
963 
964   *nextcharP = *input_line_pointer;
965   return 1;
966 }
967 
968 
969 /* Parses an expression which must be a register name.  */
970 
971 static void
parse_reg_expression(expressionS * expression)972 parse_reg_expression (expressionS* expression)
973 {
974   /* Zero everything to make sure we don't miss any flags.  */
975   memset (expression, 0, sizeof *expression);
976 
977   char *regname;
978   char terminating_char = get_symbol_name (&regname);
979 
980   void* pval = str_hash_find (main_reg_hash, regname);
981 
982   if (pval == NULL)
983     as_bad (_("Expected register, got '%s'."), regname);
984 
985   int regno_and_flags = (int)(size_t)pval;
986   int regno = EXTRACT_REGNO(regno_and_flags);
987 
988   if ((regno_and_flags & NONCANONICAL_REG_NAME_FLAG)
989       && require_canonical_reg_names)
990     as_warn (_("Found use of non-canonical register name %s; "
991 	       "use %s instead."),
992 	       regname, tilepro_register_names[regno]);
993 
994   /* Restore the old character following the register name.  */
995   (void) restore_line_pointer (terminating_char);
996 
997   /* Fill in the expression fields to indicate it's a register.  */
998   expression->X_op = O_register;
999   expression->X_add_number = regno;
1000 }
1001 
1002 
1003 /* Parses and type-checks comma-separated operands in input_line_pointer.  */
1004 static void
parse_operands(const char * opcode_name,const unsigned char * operands,int num_operands,expressionS * operand_values)1005 parse_operands (const char *opcode_name,
1006                 const unsigned char *operands,
1007                 int num_operands,
1008                 expressionS *operand_values)
1009 {
1010   int i;
1011 
1012   memset (operand_values, 0, num_operands * sizeof operand_values[0]);
1013 
1014   SKIP_WHITESPACE ();
1015   for (i = 0; i < num_operands; i++)
1016     {
1017       tilepro_operand_type type = tilepro_operands[operands[i]].type;
1018 
1019       SKIP_WHITESPACE ();
1020 
1021       if (type == TILEPRO_OP_TYPE_REGISTER)
1022 	{
1023 	  parse_reg_expression (&operand_values[i]);
1024 	}
1025       else if (*input_line_pointer == '}')
1026 	{
1027 	  operand_values[i].X_op = O_absent;
1028 	}
1029       else if (type == TILEPRO_OP_TYPE_SPR)
1030 	{
1031 	  /* Modify the expression parser to add SPRs to the namespace.  */
1032 	  parsing_spr = 1;
1033 	  expression (&operand_values[i]);
1034 	  parsing_spr = 0;
1035 	}
1036       else
1037 	{
1038 	  expression (&operand_values[i]);
1039 	}
1040 
1041       SKIP_WHITESPACE ();
1042 
1043       if (i + 1 < num_operands)
1044 	{
1045 	  int separator = (unsigned char)*input_line_pointer++;
1046 
1047 	  if (is_end_of_line[separator] || (separator == '}'))
1048 	    {
1049 	      as_bad (_("Too few operands to '%s'."), opcode_name);
1050 	      return;
1051 	    }
1052 	  else if (separator != ',')
1053 	    {
1054 	      as_bad (_("Unexpected character '%c' after operand %d to %s."),
1055 		      (char)separator, i + 1, opcode_name);
1056 	      return;
1057 	    }
1058 	}
1059 
1060       /* Arbitrarily use the first valid pipe to get the operand type,
1061 	 since they are all the same.  */
1062       switch (tilepro_operands[operands[i]].type)
1063 	{
1064 	case TILEPRO_OP_TYPE_REGISTER:
1065 	  /* Handled in parse_reg_expression already.  */
1066 	  break;
1067 	case TILEPRO_OP_TYPE_SPR:
1068 	  /* Fall through  */
1069 	case TILEPRO_OP_TYPE_IMMEDIATE:
1070 	  /* Fall through  */
1071 	case TILEPRO_OP_TYPE_ADDRESS:
1072 	  if (   operand_values[i].X_op == O_register
1073 	      || operand_values[i].X_op == O_illegal
1074 	      || operand_values[i].X_op == O_absent)
1075 	    as_bad (_("Expected immediate expression"));
1076 	  break;
1077 	default:
1078 	  abort ();
1079 	}
1080     }
1081 
1082   if (!is_end_of_line[(unsigned char)*input_line_pointer])
1083     {
1084       switch (*input_line_pointer)
1085 	{
1086 	case '}':
1087 	  if (!inside_bundle)
1088 	    as_bad (_("Found '}' when not bundling."));
1089 	  ++input_line_pointer;
1090 	  inside_bundle = 0;
1091 	  demand_empty_rest_of_line ();
1092 	  break;
1093 
1094 	case ',':
1095 	  as_bad (_("Too many operands"));
1096 	  break;
1097 
1098 	default:
1099 	  /* Use default error for unrecognized garbage.  */
1100 	  demand_empty_rest_of_line ();
1101 	  break;
1102 	}
1103     }
1104 }
1105 
1106 
1107 /* This is the guts of the machine-dependent assembler.  STR points to a
1108    machine dependent instruction.  This function is supposed to emit
1109    the frags/bytes it assembles to.  */
1110 void
md_assemble(char * str)1111 md_assemble (char *str)
1112 {
1113   char old_char;
1114   size_t opname_len;
1115   char *old_input_line_pointer;
1116   const struct tilepro_opcode *op;
1117   int first_pipe;
1118 
1119   /* Split off the opcode and look it up.  */
1120   opname_len = strcspn (str, " {}");
1121   old_char = str[opname_len];
1122   str[opname_len] = '\0';
1123 
1124   op = str_hash_find (op_hash, str);
1125   str[opname_len] = old_char;
1126   if (op == NULL)
1127     {
1128       as_bad (_("Unknown opcode `%.*s'."), (int)opname_len, str);
1129       return;
1130     }
1131 
1132   /* Prepare to parse the operands.  */
1133   old_input_line_pointer = input_line_pointer;
1134   input_line_pointer = str + opname_len;
1135   SKIP_WHITESPACE ();
1136 
1137   if (current_bundle_index == TILEPRO_MAX_INSTRUCTIONS_PER_BUNDLE)
1138     {
1139       as_bad (_("Too many instructions for bundle."));
1140       tilepro_flush_bundle ();
1141     }
1142 
1143   /* Make sure we have room for the upcoming bundle before we
1144      create any fixups. Otherwise if we have to switch to a new
1145      frag the fixup dot_value fields will be wrong.  */
1146   frag_grow (TILEPRO_BUNDLE_SIZE_IN_BYTES);
1147 
1148   /* Find a valid pipe for this opcode. */
1149   for (first_pipe = 0; (op->pipes & (1 << first_pipe)) == 0; first_pipe++)
1150     ;
1151 
1152   /* Call the function that assembles this instruction.  */
1153   current_bundle[current_bundle_index].opcode = op;
1154   parse_operands (op->name,
1155                   &op->operands[first_pipe][0],
1156                   op->num_operands,
1157                   current_bundle[current_bundle_index].operand_values);
1158   ++current_bundle_index;
1159 
1160   /* Restore the saved value of input_line_pointer.  */
1161   input_line_pointer = old_input_line_pointer;
1162 
1163   /* If we weren't inside curly braces, go ahead and emit
1164      this lone instruction as a bundle right now.  */
1165   if (!inside_bundle)
1166     tilepro_flush_bundle ();
1167 }
1168 
1169 static void
s_require_canonical_reg_names(int require)1170 s_require_canonical_reg_names (int require)
1171 {
1172   demand_empty_rest_of_line ();
1173   require_canonical_reg_names = require;
1174 }
1175 
1176 static void
s_allow_suspicious_bundles(int allow)1177 s_allow_suspicious_bundles (int allow)
1178 {
1179   demand_empty_rest_of_line ();
1180   allow_suspicious_bundles = allow;
1181 }
1182 
1183 const pseudo_typeS md_pseudo_table[] =
1184 {
1185   {"align", s_align_bytes, 0},	/* Defaulting is invalid (0).  */
1186   {"word", cons, 4},
1187   {"require_canonical_reg_names", s_require_canonical_reg_names, 1 },
1188   {"no_require_canonical_reg_names", s_require_canonical_reg_names, 0 },
1189   {"allow_suspicious_bundles", s_allow_suspicious_bundles, 1 },
1190   {"no_allow_suspicious_bundles", s_allow_suspicious_bundles, 0 },
1191   { NULL, 0, 0 }
1192 };
1193 
1194 /* Turn the string pointed to by litP into a floating point constant
1195    of type TYPE, and emit the appropriate bytes.  The number of
1196    LITTLENUMS emitted is stored in *SIZEP.  An error message is
1197    returned, or NULL on OK.  */
1198 
1199 const char *
md_atof(int type,char * litP,int * sizeP)1200 md_atof (int type, char *litP, int *sizeP)
1201 {
1202   int prec;
1203   LITTLENUM_TYPE words[MAX_LITTLENUMS];
1204   LITTLENUM_TYPE *wordP;
1205   char *t;
1206 
1207   switch (type)
1208     {
1209     case 'f':
1210     case 'F':
1211       prec = 2;
1212       break;
1213 
1214     case 'd':
1215     case 'D':
1216       prec = 4;
1217       break;
1218 
1219     default:
1220       *sizeP = 0;
1221       return _("Bad call to md_atof ()");
1222     }
1223   t = atof_ieee (input_line_pointer, type, words);
1224   if (t)
1225     input_line_pointer = t;
1226 
1227   *sizeP = prec * sizeof (LITTLENUM_TYPE);
1228   /* This loops outputs the LITTLENUMs in REVERSE order; in accord with
1229      the bigendian 386.  */
1230   for (wordP = words + prec - 1; prec--;)
1231     {
1232       md_number_to_chars (litP, (valueT) (*wordP--), sizeof (LITTLENUM_TYPE));
1233       litP += sizeof (LITTLENUM_TYPE);
1234     }
1235   return 0;
1236 }
1237 
1238 
1239 /* We have no need to default values of symbols.  */
1240 
1241 symbolS *
md_undefined_symbol(char * name ATTRIBUTE_UNUSED)1242 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
1243 {
1244   return NULL;
1245 }
1246 
1247 
1248 void
tilepro_cons_fix_new(fragS * frag,int where,int nbytes,expressionS * exp)1249 tilepro_cons_fix_new (fragS *frag,
1250 		      int where,
1251 		      int nbytes,
1252 		      expressionS *exp)
1253 {
1254   expressionS subexp;
1255   bfd_reloc_code_real_type reloc = BFD_RELOC_NONE;
1256   int no_overflow = 0;
1257   fixS *fixP;
1258 
1259   /* See if it's one of our special functions.  */
1260   switch (exp->X_op)
1261     {
1262     case O_lo16:
1263       reloc = BFD_RELOC_LO16;
1264       no_overflow = 1;
1265       break;
1266     case O_hi16:
1267       reloc = BFD_RELOC_HI16;
1268       no_overflow = 1;
1269       break;
1270     case O_ha16:
1271       reloc = BFD_RELOC_HI16_S;
1272       no_overflow = 1;
1273       break;
1274 
1275     default:
1276       /* Do nothing.  */
1277       break;
1278     }
1279 
1280   if (reloc != BFD_RELOC_NONE)
1281     {
1282       if (nbytes != 2)
1283 	{
1284 	  as_bad (_("This operator only produces two byte values."));
1285 	  nbytes = 2;
1286 	}
1287 
1288       memset (&subexp, 0, sizeof subexp);
1289       subexp.X_op = O_symbol;
1290       subexp.X_add_symbol = exp->X_add_symbol;
1291       exp = &subexp;
1292     }
1293   else
1294     {
1295       switch (nbytes)
1296 	{
1297 	case 1:
1298 	  reloc = BFD_RELOC_8;
1299 	  break;
1300 	case 2:
1301 	  reloc = BFD_RELOC_16;
1302 	  break;
1303 	case 4:
1304 	  reloc = BFD_RELOC_32;
1305 	  break;
1306 	case 8:
1307 	  reloc = BFD_RELOC_64;
1308 	  break;
1309 	default:
1310 	  as_bad (_("unsupported BFD relocation size %d"), nbytes);
1311 	  reloc = BFD_RELOC_32;
1312 	  break;
1313 	}
1314     }
1315 
1316   fixP = fix_new_exp (frag, where, nbytes, exp, 0, reloc);
1317   fixP->tc_fix_data = NULL;
1318   fixP->fx_no_overflow |= no_overflow;
1319 }
1320 
1321 
1322 void
md_apply_fix(fixS * fixP,valueT * valP,segT seg ATTRIBUTE_UNUSED)1323 md_apply_fix (fixS *fixP, valueT * valP, segT seg ATTRIBUTE_UNUSED)
1324 {
1325   const struct tilepro_operand *operand;
1326   valueT value = *valP;
1327   char *p;
1328 
1329   /* Leave these for the linker.  */
1330   if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
1331       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1332     return;
1333 
1334   if (fixP->fx_subsy != (symbolS *) NULL)
1335     {
1336       /* We can't actually support subtracting a symbol.  */
1337       as_bad_subtract (fixP);
1338     }
1339 
1340   /* Correct relocation types for pc-relativeness.  */
1341   switch (fixP->fx_r_type)
1342     {
1343 #define FIX_PCREL(rtype)                        \
1344       case rtype:				\
1345 	if (fixP->fx_pcrel)			\
1346 	  fixP->fx_r_type = rtype##_PCREL;	\
1347       break;					\
1348                                                 \
1349     case rtype##_PCREL:				\
1350       if (!fixP->fx_pcrel)			\
1351 	fixP->fx_r_type = rtype;		\
1352       break
1353 
1354       FIX_PCREL (BFD_RELOC_8);
1355       FIX_PCREL (BFD_RELOC_16);
1356       FIX_PCREL (BFD_RELOC_32);
1357       FIX_PCREL (BFD_RELOC_TILEPRO_IMM16_X0);
1358       FIX_PCREL (BFD_RELOC_TILEPRO_IMM16_X1);
1359       FIX_PCREL (BFD_RELOC_TILEPRO_IMM16_X0_LO);
1360       FIX_PCREL (BFD_RELOC_TILEPRO_IMM16_X1_LO);
1361       FIX_PCREL (BFD_RELOC_TILEPRO_IMM16_X0_HI);
1362       FIX_PCREL (BFD_RELOC_TILEPRO_IMM16_X1_HI);
1363       FIX_PCREL (BFD_RELOC_TILEPRO_IMM16_X0_HA);
1364       FIX_PCREL (BFD_RELOC_TILEPRO_IMM16_X1_HA);
1365 
1366 #undef FIX_PCREL
1367 
1368     default:
1369       /* Do nothing */
1370       break;
1371     }
1372 
1373   if (fixP->fx_addsy != NULL)
1374     {
1375 #ifdef OBJ_ELF
1376       switch (fixP->fx_r_type)
1377 	{
1378 	case BFD_RELOC_TILEPRO_IMM8_X0_TLS_GD_ADD:
1379 	case BFD_RELOC_TILEPRO_IMM8_X1_TLS_GD_ADD:
1380 	case BFD_RELOC_TILEPRO_IMM8_Y0_TLS_GD_ADD:
1381 	case BFD_RELOC_TILEPRO_IMM8_Y1_TLS_GD_ADD:
1382 	case BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD:
1383 	case BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD:
1384 	case BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_LO:
1385 	case BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_LO:
1386 	case BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_HI:
1387 	case BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_HI:
1388 	case BFD_RELOC_TILEPRO_IMM16_X0_TLS_GD_HA:
1389 	case BFD_RELOC_TILEPRO_IMM16_X1_TLS_GD_HA:
1390 	case BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE:
1391 	case BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE:
1392 	case BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_LO:
1393 	case BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_LO:
1394 	case BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_HI:
1395 	case BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_HI:
1396 	case BFD_RELOC_TILEPRO_IMM16_X0_TLS_IE_HA:
1397 	case BFD_RELOC_TILEPRO_IMM16_X1_TLS_IE_HA:
1398 	case BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE:
1399 	case BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE:
1400 	case BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_LO:
1401 	case BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_LO:
1402 	case BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HI:
1403 	case BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HI:
1404 	case BFD_RELOC_TILEPRO_IMM16_X0_TLS_LE_HA:
1405 	case BFD_RELOC_TILEPRO_IMM16_X1_TLS_LE_HA:
1406 	case BFD_RELOC_TILEPRO_TLS_GD_CALL:
1407 	case BFD_RELOC_TILEPRO_TLS_IE_LOAD:
1408 	case BFD_RELOC_TILEPRO_TLS_DTPMOD32:
1409 	case BFD_RELOC_TILEPRO_TLS_DTPOFF32:
1410 	case BFD_RELOC_TILEPRO_TLS_TPOFF32:
1411 	  S_SET_THREAD_LOCAL (fixP->fx_addsy);
1412 	  break;
1413 
1414 	default:
1415 	  /* Do nothing */
1416 	  break;
1417 	}
1418 #endif
1419       return;
1420     }
1421 
1422   /* Apply lo16, hi16, ha16, etc. munging. */
1423   switch (fixP->fx_r_type)
1424     {
1425     case BFD_RELOC_LO16:
1426     case BFD_RELOC_TILEPRO_IMM16_X0_LO:
1427     case BFD_RELOC_TILEPRO_IMM16_X1_LO:
1428     case BFD_RELOC_TILEPRO_IMM16_X0_LO_PCREL:
1429     case BFD_RELOC_TILEPRO_IMM16_X1_LO_PCREL:
1430       *valP = value = apply_special_operator (O_lo16, value);
1431       break;
1432 
1433     case BFD_RELOC_HI16:
1434     case BFD_RELOC_TILEPRO_IMM16_X0_HI:
1435     case BFD_RELOC_TILEPRO_IMM16_X1_HI:
1436     case BFD_RELOC_TILEPRO_IMM16_X0_HI_PCREL:
1437     case BFD_RELOC_TILEPRO_IMM16_X1_HI_PCREL:
1438       *valP = value = apply_special_operator (O_hi16, value);
1439       break;
1440 
1441     case BFD_RELOC_HI16_S:
1442     case BFD_RELOC_TILEPRO_IMM16_X0_HA:
1443     case BFD_RELOC_TILEPRO_IMM16_X1_HA:
1444     case BFD_RELOC_TILEPRO_IMM16_X0_HA_PCREL:
1445     case BFD_RELOC_TILEPRO_IMM16_X1_HA_PCREL:
1446       *valP = value = apply_special_operator (O_ha16, value);
1447       break;
1448 
1449     default:
1450       /* Do nothing  */
1451       break;
1452     }
1453 
1454   p = fixP->fx_frag->fr_literal + fixP->fx_where;
1455 
1456   operand = fixP->tc_fix_data;
1457   if (operand != NULL)
1458     {
1459       /* It's an instruction operand.  */
1460       tilepro_bundle_bits bits =
1461 	insert_operand (0, operand, value, fixP->fx_file, fixP->fx_line);
1462 
1463       /* Note that we might either be writing out bits for a bundle or a
1464 	 static network instruction, which are different sizes, so it's
1465 	 important to stop touching memory once we run out of bits.  ORing in
1466 	 values is OK since we know the existing bits for this operand are
1467 	 zero.  */
1468       for (; bits != 0; bits >>= 8)
1469 	*p++ |= (char)bits;
1470     }
1471   else
1472     {
1473       /* Some other kind of relocation.  */
1474       switch (fixP->fx_r_type)
1475 	{
1476 	case BFD_RELOC_8:
1477 	case BFD_RELOC_8_PCREL:
1478 	  md_number_to_chars (p, value, 1);
1479 	  break;
1480 
1481 	case BFD_RELOC_16:
1482 	case BFD_RELOC_16_PCREL:
1483 	  md_number_to_chars (p, value, 2);
1484 	  break;
1485 
1486 	case BFD_RELOC_32:
1487 	case BFD_RELOC_32_PCREL:
1488 	  md_number_to_chars (p, value, 4);
1489 	  break;
1490 
1491 	default:
1492 	  /* Leave it for the linker.  */
1493 	  return;
1494 	}
1495     }
1496 
1497   fixP->fx_done = 1;
1498 }
1499 
1500 
1501 /* Generate the BFD reloc to be stuck in the object file from the
1502    fixup used internally in the assembler.  */
1503 
1504 arelent *
tc_gen_reloc(asection * sec ATTRIBUTE_UNUSED,fixS * fixp)1505 tc_gen_reloc (asection *sec ATTRIBUTE_UNUSED, fixS *fixp)
1506 {
1507   arelent *reloc;
1508 
1509   reloc = XNEW (arelent);
1510   reloc->sym_ptr_ptr = XNEW (asymbol *);
1511   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
1512   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
1513 
1514   /* Make sure none of our internal relocations make it this far.
1515      They'd better have been fully resolved by this point.  */
1516   gas_assert ((int) fixp->fx_r_type > 0);
1517 
1518   reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
1519   if (reloc->howto == NULL)
1520     {
1521       as_bad_where (fixp->fx_file, fixp->fx_line,
1522 		    _("cannot represent `%s' relocation in object file"),
1523 		    bfd_get_reloc_code_name (fixp->fx_r_type));
1524       return NULL;
1525     }
1526 
1527   if (!fixp->fx_pcrel != !reloc->howto->pc_relative)
1528     {
1529       as_fatal (_("internal error? cannot generate `%s' relocation (%d, %d)"),
1530 		bfd_get_reloc_code_name (fixp->fx_r_type),
1531                 fixp->fx_pcrel, reloc->howto->pc_relative);
1532     }
1533   gas_assert (!fixp->fx_pcrel == !reloc->howto->pc_relative);
1534 
1535   reloc->addend = fixp->fx_offset;
1536 
1537   return reloc;
1538 }
1539 
1540 
1541 /* The location from which a PC relative jump should be calculated,
1542    given a PC relative reloc.  */
1543 
1544 long
md_pcrel_from(fixS * fixP)1545 md_pcrel_from (fixS *fixP)
1546 {
1547   return fixP->fx_frag->fr_address + fixP->fx_where;
1548 }
1549 
1550 
1551 /* Return 1 if it's OK to adjust a reloc by replacing the symbol with
1552    a section symbol plus some offset.  */
1553 int
tilepro_fix_adjustable(fixS * fix)1554 tilepro_fix_adjustable (fixS *fix)
1555 {
1556   /* Prevent all adjustments to global symbols  */
1557   if (S_IS_EXTERNAL (fix->fx_addsy) || S_IS_WEAK (fix->fx_addsy))
1558     return 0;
1559 
1560   return 1;
1561 }
1562 
1563 
1564 int
tilepro_unrecognized_line(int ch)1565 tilepro_unrecognized_line (int ch)
1566 {
1567   switch (ch)
1568     {
1569     case '{':
1570       if (inside_bundle)
1571 	{
1572 	  as_bad (_("Found '{' when already bundling."));
1573 	}
1574       else
1575 	{
1576 	  inside_bundle = 1;
1577 	  current_bundle_index = 0;
1578 	}
1579       return 1;
1580 
1581     case '}':
1582       if (!inside_bundle)
1583 	{
1584 	  as_bad (_("Found '}' when not bundling."));
1585 	}
1586       else
1587 	{
1588 	  tilepro_flush_bundle ();
1589 	}
1590 
1591       /* Allow '{' to follow on the same line.  We also allow ";;", but that
1592 	 happens automatically because ';' is an end of line marker.  */
1593       SKIP_WHITESPACE ();
1594       if (input_line_pointer[0] == '{')
1595 	{
1596 	  input_line_pointer++;
1597 	  return tilepro_unrecognized_line ('{');
1598 	}
1599 
1600       demand_empty_rest_of_line ();
1601       return 1;
1602 
1603     default:
1604       break;
1605     }
1606 
1607   /* Not a valid line.  */
1608   return 0;
1609 }
1610 
1611 
1612 /* This is called from HANDLE_ALIGN in write.c.  Fill in the contents
1613    of an rs_align_code fragment.  */
1614 
1615 void
tilepro_handle_align(fragS * fragp)1616 tilepro_handle_align (fragS *fragp)
1617 {
1618   int bytes, fix;
1619   char *p;
1620 
1621   if (fragp->fr_type != rs_align_code)
1622     return;
1623 
1624   bytes = fragp->fr_next->fr_address - fragp->fr_address - fragp->fr_fix;
1625   p = fragp->fr_literal + fragp->fr_fix;
1626   fix = 0;
1627 
1628   /* Determine the bits for NOP.  */
1629   const struct tilepro_opcode *nop_opcode =
1630     &tilepro_opcodes[TILEPRO_OPC_NOP];
1631   tilepro_bundle_bits nop =
1632     (  nop_opcode->fixed_bit_values[TILEPRO_PIPELINE_X0]
1633        | nop_opcode->fixed_bit_values[TILEPRO_PIPELINE_X1]);
1634 
1635   if ((bytes & (TILEPRO_BUNDLE_SIZE_IN_BYTES - 1)) != 0)
1636     {
1637       fix = bytes & (TILEPRO_BUNDLE_SIZE_IN_BYTES - 1);
1638       memset (p, 0, fix);
1639       p += fix;
1640       bytes -= fix;
1641     }
1642 
1643   number_to_chars_littleendian (p, (unsigned int)nop, 4);
1644   number_to_chars_littleendian (p + 4, (unsigned int)(nop >> 32), 4);
1645   fragp->fr_fix += fix;
1646   fragp->fr_var = TILEPRO_BUNDLE_SIZE_IN_BYTES;
1647 }
1648 
1649 /* Standard calling conventions leave the CFA at SP on entry.  */
1650 void
tilepro_cfi_frame_initial_instructions(void)1651 tilepro_cfi_frame_initial_instructions (void)
1652 {
1653   cfi_add_CFA_def_cfa_register (54);
1654 }
1655 
1656 int
tc_tilepro_regname_to_dw2regnum(char * regname)1657 tc_tilepro_regname_to_dw2regnum (char *regname)
1658 {
1659   int i;
1660 
1661   for (i = 0; i < TILEPRO_NUM_REGISTERS; i++)
1662     {
1663       if (!strcmp (regname, tilepro_register_names[i]))
1664 	return i;
1665     }
1666 
1667   return -1;
1668 }
1669