* symbols.c (S_FORCE_RELOC): Add "strict" param.
[external/binutils.git] / gas / config / tc-mmix.c
1 /* tc-mmix.c -- Assembler for Don Knuth's MMIX.
2    Copyright (C) 2001, 2002, 2003 Free Software Foundation.
3
4    This file is part of GAS, the GNU Assembler.
5
6    GAS 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 2, or (at your option)
9    any later version.
10
11    GAS 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 GAS; see the file COPYING.  If not, write to
18    the Free Software Foundation, 59 Temple Place - Suite 330,
19    Boston, MA 02111-1307, USA.  */
20
21 /* Knuth's assembler mmixal does not provide a relocatable format; mmo is
22    to be considered a final link-format.  In the final link, we make mmo,
23    but for relocatable files, we use ELF.
24
25    One goal is to provide a superset of what mmixal does, including
26    compatible syntax, but the main purpose is to serve GCC.  */
27
28
29 #include <stdio.h>
30 #include "as.h"
31 #include "subsegs.h"
32 #include "bfd.h"
33 #include "elf/mmix.h"
34 #include "opcode/mmix.h"
35 #include "safe-ctype.h"
36 #include "dwarf2dbg.h"
37 #include "obstack.h"
38
39 /* Something to describe what we need to do with a fixup before output,
40    for example assert something of what it became or make a relocation.  */
41
42 enum mmix_fixup_action
43  {
44    mmix_fixup_byte,
45    mmix_fixup_register,
46    mmix_fixup_register_or_adjust_for_byte
47  };
48
49 static int get_spec_regno PARAMS ((char *));
50 static int get_operands PARAMS ((int, char *, expressionS[]));
51 static int get_putget_operands
52   PARAMS ((struct mmix_opcode *, char *, expressionS[]));
53 static void s_prefix PARAMS ((int));
54 static void s_greg PARAMS ((int));
55 static void s_loc PARAMS ((int));
56 static void s_bspec PARAMS ((int));
57 static void s_espec PARAMS ((int));
58 static void mmix_s_local PARAMS ((int));
59 static void mmix_greg_internal PARAMS ((char *));
60 static void mmix_set_geta_branch_offset PARAMS ((char *, offsetT value));
61 static void mmix_set_jmp_offset PARAMS ((char *, offsetT));
62 static void mmix_fill_nops PARAMS ((char *, int));
63 static int cmp_greg_symbol_fixes PARAMS ((const PTR, const PTR));
64 static int cmp_greg_val_greg_symbol_fixes
65   PARAMS ((const PTR p1, const PTR p2));
66 static void mmix_handle_rest_of_empty_line PARAMS ((void));
67 static void mmix_discard_rest_of_line PARAMS ((void));
68 static void mmix_byte PARAMS ((void));
69 static void mmix_cons PARAMS ((int));
70
71 /* Continue the tradition of symbols.c; use control characters to enforce
72    magic.  These are used when replacing e.g. 8F and 8B so we can handle
73    such labels correctly with the common parser hooks.  */
74 #define MAGIC_FB_BACKWARD_CHAR '\003'
75 #define MAGIC_FB_FORWARD_CHAR '\004'
76
77 /* Copy the location of a frag to a fix.  */
78 #define COPY_FR_WHERE_TO_FX(FRAG, FIX)          \
79  do                                             \
80    {                                            \
81      (FIX)->fx_file = (FRAG)->fr_file;          \
82      (FIX)->fx_line = (FRAG)->fr_line;          \
83    }                                            \
84  while (0)
85
86 const char *md_shortopts = "x";
87 static int current_fb_label = -1;
88 static char *pending_label = NULL;
89
90 static bfd_vma lowest_text_loc = (bfd_vma) -1;
91 static int text_has_contents = 0;
92
93 /* The alignment of the previous instruction, and a boolean for whether we
94    want to avoid aligning the next WYDE, TETRA, OCTA or insn.  */
95 static int last_alignment = 0;
96 static int want_unaligned = 0;
97
98 static bfd_vma lowest_data_loc = (bfd_vma) -1;
99 static int data_has_contents = 0;
100
101 /* The fragS of the instruction being assembled.  Only valid from within
102    md_assemble.  */
103 fragS *mmix_opcode_frag = NULL;
104
105 /* Raw GREGs as appearing in input.  These may be fewer than the number
106    after relaxing.  */
107 static int n_of_raw_gregs = 0;
108 static struct
109  {
110    char *label;
111    expressionS exp;
112  } mmix_raw_gregs[MAX_GREGS];
113
114 /* Fixups for all unique GREG registers.  We store the fixups here in
115    md_convert_frag, then we use the array to convert
116    BFD_RELOC_MMIX_BASE_PLUS_OFFSET fixups in tc_gen_reloc.  The index is
117    just a running number and is not supposed to be correlated to a
118    register number.  */
119 static fixS *mmix_gregs[MAX_GREGS];
120 static int n_of_cooked_gregs = 0;
121
122 /* Pointing to the register section we use for output.  */
123 static asection *real_reg_section;
124
125 /* For each symbol; unknown or section symbol, we keep a list of GREG
126    definitions sorted on increasing offset.  It seems no use keeping count
127    to allocate less room than the maximum number of gregs when we've found
128    one for a section or symbol.  */
129 struct mmix_symbol_gregs
130  {
131    int n_gregs;
132    struct mmix_symbol_greg_fixes
133    {
134      fixS *fix;
135
136      /* A signed type, since we may have GREGs pointing slightly before the
137         contents of a section.  */
138      offsetT offs;
139    } greg_fixes[MAX_GREGS];
140  };
141
142 /* Should read insert a colon on something that starts in column 0 on
143    this line?  */
144 static int label_without_colon_this_line = 1;
145
146 /* Should we expand operands for external symbols?  */
147 static int expand_op = 1;
148
149 /* Should we warn when expanding operands?  FIXME: test-cases for when -x
150    is absent.  */
151 static int warn_on_expansion = 1;
152
153 /* Should we merge non-zero GREG register definitions?  */
154 static int merge_gregs = 1;
155
156 /* Should we pass on undefined BFD_RELOC_MMIX_BASE_PLUS_OFFSET relocs
157    (missing suitable GREG definitions) to the linker?  */
158 static int allocate_undefined_gregs_in_linker = 0;
159
160 /* Should we emit built-in symbols?  */
161 static int predefined_syms = 1;
162
163 /* Should we allow anything but the listed special register name
164    (e.g. equated symbols)?  */
165 static int equated_spec_regs = 1;
166
167 /* Do we require standard GNU syntax?  */
168 int mmix_gnu_syntax = 0;
169
170 /* Do we globalize all symbols?  */
171 int mmix_globalize_symbols = 0;
172
173 /* Do we know that the next semicolon is at the end of the operands field
174    (in mmixal mode; constant 1 in GNU mode)? */
175 int mmix_next_semicolon_is_eoln = 1;
176
177 /* Do we have a BSPEC in progress?  */
178 static int doing_bspec = 0;
179 static char *bspec_file;
180 static unsigned int bspec_line;
181
182 struct option md_longopts[] =
183  {
184 #define OPTION_RELAX  (OPTION_MD_BASE)
185 #define OPTION_NOEXPAND  (OPTION_RELAX + 1)
186 #define OPTION_NOMERGEGREG  (OPTION_NOEXPAND + 1)
187 #define OPTION_NOSYMS  (OPTION_NOMERGEGREG + 1)
188 #define OPTION_GNU_SYNTAX  (OPTION_NOSYMS + 1)
189 #define OPTION_GLOBALIZE_SYMBOLS  (OPTION_GNU_SYNTAX + 1)
190 #define OPTION_FIXED_SPEC_REGS  (OPTION_GLOBALIZE_SYMBOLS + 1)
191 #define OPTION_LINKER_ALLOCATED_GREGS  (OPTION_FIXED_SPEC_REGS + 1)
192    {"linkrelax", no_argument, NULL, OPTION_RELAX},
193    {"no-expand", no_argument, NULL, OPTION_NOEXPAND},
194    {"no-merge-gregs", no_argument, NULL, OPTION_NOMERGEGREG},
195    {"no-predefined-syms", no_argument, NULL, OPTION_NOSYMS},
196    {"gnu-syntax", no_argument, NULL, OPTION_GNU_SYNTAX},
197    {"globalize-symbols", no_argument, NULL, OPTION_GLOBALIZE_SYMBOLS},
198    {"fixed-special-register-names", no_argument, NULL,
199     OPTION_FIXED_SPEC_REGS},
200    {"linker-allocated-gregs", no_argument, NULL,
201     OPTION_LINKER_ALLOCATED_GREGS},
202    {NULL, no_argument, NULL, 0}
203  };
204
205 size_t md_longopts_size = sizeof (md_longopts);
206
207 static struct hash_control *mmix_opcode_hash;
208
209 /* We use these when implementing the PREFIX pseudo.  */
210 char *mmix_current_prefix;
211 struct obstack mmix_sym_obstack;
212
213
214 /* For MMIX, we encode the relax_substateT:s (in e.g. fr_substate) as one
215    bit length, and the relax-type shifted on top of that.  There seems to
216    be no point in making the relaxation more fine-grained; the linker does
217    that better and we might interfere by changing non-optimal relaxations
218    into other insns that cannot be relaxed as easily.
219
220    Groups for MMIX relaxing:
221
222    1. GETA
223       extra length: zero or three insns.
224
225    2. Bcc
226       extra length: zero or five insns.
227
228    3. PUSHJ
229       extra length: zero or four insns.
230
231    4. JMP
232       extra length: zero or four insns.  */
233
234 #define STATE_GETA      (1)
235 #define STATE_BCC       (2)
236 #define STATE_PUSHJ     (3)
237 #define STATE_JMP       (4)
238 #define STATE_GREG      (5)
239
240 /* No fine-grainedness here.  */
241 #define STATE_LENGTH_MASK           (1)
242
243 #define STATE_ZERO                  (0)
244 #define STATE_MAX                   (1)
245
246 /* More descriptive name for convenience.  */
247 /* FIXME: We should start on something different, not MAX.  */
248 #define STATE_UNDF                  STATE_MAX
249
250 /* FIXME: For GREG, we must have other definitions; UNDF == MAX isn't
251    appropriate; we need it the other way round.  This value together with
252    fragP->tc_frag_data shows what state the frag is in: tc_frag_data
253    non-NULL means 0, NULL means 8 bytes.  */
254 #define STATE_GREG_UNDF ENCODE_RELAX (STATE_GREG, STATE_ZERO)
255 #define STATE_GREG_DEF ENCODE_RELAX (STATE_GREG, STATE_MAX)
256
257 /* These displacements are relative to the adress following the opcode
258    word of the instruction.  The catch-all states have zero for "reach"
259    and "next" entries.  */
260
261 #define GETA_0F (65536 * 4 - 8)
262 #define GETA_0B (-65536 * 4 - 4)
263
264 #define GETA_MAX_LEN 4 * 4
265 #define GETA_3F 0
266 #define GETA_3B 0
267
268 #define BCC_0F GETA_0F
269 #define BCC_0B GETA_0B
270
271 #define BCC_MAX_LEN 6 * 4
272 #define BCC_5F GETA_3F
273 #define BCC_5B GETA_3B
274
275 #define PUSHJ_0F GETA_0F
276 #define PUSHJ_0B GETA_0B
277
278 #define PUSHJ_MAX_LEN 5 * 4
279 #define PUSHJ_4F GETA_3F
280 #define PUSHJ_4B GETA_3B
281
282 #define JMP_0F (65536 * 256 * 4 - 8)
283 #define JMP_0B (-65536 * 256 * 4 - 4)
284
285 #define JMP_MAX_LEN 5 * 4
286 #define JMP_4F 0
287 #define JMP_4B 0
288
289 #define RELAX_ENCODE_SHIFT 1
290 #define ENCODE_RELAX(what, length) (((what) << RELAX_ENCODE_SHIFT) + (length))
291
292 const relax_typeS mmix_relax_table[] =
293  {
294    /* Error sentinel (0, 0).  */
295    {1,          1,              0,      0},
296
297    /* Unused (0, 1).  */
298    {1,          1,              0,      0},
299
300    /* GETA (1, 0).  */
301    {GETA_0F,    GETA_0B,        0,      ENCODE_RELAX (STATE_GETA, STATE_MAX)},
302
303    /* GETA (1, 1).  */
304    {GETA_3F,    GETA_3B,
305                 GETA_MAX_LEN - 4,       0},
306
307    /* BCC (2, 0).  */
308    {BCC_0F,     BCC_0B,         0,      ENCODE_RELAX (STATE_BCC, STATE_MAX)},
309
310    /* BCC (2, 1).  */
311    {BCC_5F,     BCC_5B,
312                 BCC_MAX_LEN - 4,        0},
313
314    /* PUSHJ (3, 0).  */
315    {PUSHJ_0F,   PUSHJ_0B,       0,      ENCODE_RELAX (STATE_PUSHJ, STATE_MAX)},
316
317    /* PUSHJ (3, 1).  */
318    {PUSHJ_4F,   PUSHJ_4B,
319                 PUSHJ_MAX_LEN - 4,      0},
320
321    /* JMP (4, 0).  */
322    {JMP_0F,     JMP_0B,         0,      ENCODE_RELAX (STATE_JMP, STATE_MAX)},
323
324    /* JMP (4, 1).  */
325    {JMP_4F,     JMP_4B,
326                 JMP_MAX_LEN - 4,        0},
327
328    /* GREG (5, 0), (5, 1), though the table entry isn't used.  */
329    {0, 0, 0, 0}, {0, 0, 0, 0}
330 };
331
332 const pseudo_typeS md_pseudo_table[] =
333  {
334    /* Support " .greg sym,expr" syntax.  */
335    {"greg", s_greg, 0},
336
337    /* Support " .bspec expr" syntax.  */
338    {"bspec", s_bspec, 1},
339
340    /* Support " .espec" syntax.  */
341    {"espec", s_espec, 1},
342
343    /* Support " .local $45" syntax.  */
344    {"local", mmix_s_local, 1},
345
346    /* Support DWARF2 debugging info.  */
347    {"file", (void (*) PARAMS ((int))) dwarf2_directive_file, 0},
348    {"loc", dwarf2_directive_loc, 0},
349
350    {NULL, 0, 0}
351  };
352
353 const char mmix_comment_chars[] = "%!";
354
355 /* A ':' is a valid symbol character in mmixal.  It's the prefix
356    delimiter, but other than that, it works like a symbol character,
357    except that we strip one off at the beginning of symbols.  An '@' is a
358    symbol by itself (for the current location); space around it must not
359    be stripped.  */
360 const char mmix_symbol_chars[] = ":@";
361
362 const char line_comment_chars[] = "*#";
363
364 const char line_separator_chars[] = ";";
365
366 const char mmix_exp_chars[] = "eE";
367
368 const char mmix_flt_chars[] = "rf";
369
370
371 /* Fill in the offset-related part of GETA or Bcc.  */
372
373 static void
374 mmix_set_geta_branch_offset (opcodep, value)
375      char *opcodep;
376      offsetT value;
377 {
378   if (value < 0)
379     {
380       value += 65536 * 4;
381       opcodep[0] |= 1;
382     }
383
384   value /= 4;
385   md_number_to_chars (opcodep + 2, value, 2);
386 }
387
388 /* Fill in the offset-related part of JMP.  */
389
390 static void
391 mmix_set_jmp_offset (opcodep, value)
392      char *opcodep;
393      offsetT value;
394 {
395   if (value < 0)
396     {
397       value += 65536 * 256 * 4;
398       opcodep[0] |= 1;
399     }
400
401   value /= 4;
402   md_number_to_chars (opcodep + 1, value, 3);
403 }
404
405 /* Fill in NOP:s for the expanded part of GETA/JMP/Bcc/PUSHJ.  */
406
407 static void
408 mmix_fill_nops (opcodep, n)
409      char *opcodep;
410      int n;
411 {
412   int i;
413
414   for (i = 0; i < n; i++)
415     md_number_to_chars (opcodep + i * 4, SWYM_INSN_BYTE << 24, 4);
416 }
417
418 /* See macro md_parse_name in tc-mmix.h.  */
419
420 int
421 mmix_current_location (fn, exp)
422      void (*fn) PARAMS ((expressionS *));
423      expressionS *exp;
424 {
425   (*fn) (exp);
426
427   return 1;
428 }
429
430 /* Get up to three operands, filling them into the exp array.
431    General idea and code stolen from the tic80 port.  */
432
433 static int
434 get_operands (max_operands, s, exp)
435      int max_operands;
436      char *s;
437      expressionS exp[];
438 {
439   char *p = s;
440   int numexp = 0;
441   int nextchar = ',';
442
443   while (nextchar == ',')
444     {
445       /* Skip leading whitespace */
446       while (*p == ' ' || *p == '\t')
447         p++;
448
449       /* Check to see if we have any operands left to parse */
450       if (*p == 0 || *p == '\n' || *p == '\r')
451         {
452           break;
453         }
454       else if (numexp == max_operands)
455         {
456           /* This seems more sane than saying "too many operands".  We'll
457              get here only if the trailing trash starts with a comma.  */
458           as_bad (_("invalid operands"));
459           mmix_discard_rest_of_line ();
460           return 0;
461         }
462
463       /* Begin operand parsing at the current scan point.  */
464
465       input_line_pointer = p;
466       expression (&exp[numexp]);
467
468       if (exp[numexp].X_op == O_illegal)
469         {
470           as_bad (_("invalid operands"));
471         }
472       else if (exp[numexp].X_op == O_absent)
473         {
474           as_bad (_("missing operand"));
475         }
476
477       numexp++;
478       p = input_line_pointer;
479
480       /* Skip leading whitespace */
481       while (*p == ' ' || *p == '\t')
482         p++;
483       nextchar = *p++;
484     }
485
486   /* If we allow "naked" comments, ignore the rest of the line.  */
487   if (nextchar != ',')
488     {
489       mmix_handle_rest_of_empty_line ();
490       input_line_pointer--;
491     }
492
493   /* Mark the end of the valid operands with an illegal expression.  */
494   exp[numexp].X_op = O_illegal;
495
496   return (numexp);
497 }
498
499 /* Get the value of a special register, or -1 if the name does not match
500    one.  NAME is a null-terminated string.  */
501
502 static int
503 get_spec_regno (name)
504      char *name;
505 {
506   int i;
507
508   if (name == NULL)
509     return -1;
510
511   if (*name == ':')
512     name++;
513
514   /* Well, it's a short array and we'll most often just match the first
515      entry, rJ.  */
516   for (i = 0; mmix_spec_regs[i].name != NULL; i++)
517     if (strcmp (name, mmix_spec_regs[i].name) == 0)
518       return mmix_spec_regs[i].number;
519
520   return -1;
521 }
522
523 /* For GET and PUT, parse the register names "manually", so we don't use
524    user labels.  */
525 static int
526 get_putget_operands (insn, operands, exp)
527      struct mmix_opcode *insn;
528      char *operands;
529      expressionS exp[];
530 {
531   expressionS *expp_reg;
532   expressionS *expp_sreg;
533   char *sregp = NULL;
534   char *sregend = operands;
535   char *p = operands;
536   char c = *sregend;
537   int regno;
538
539   /* Skip leading whitespace */
540   while (*p == ' ' || *p == '\t')
541     p++;
542
543   input_line_pointer = p;
544
545   /* Initialize both possible operands to error state, in case we never
546      get further.  */
547   exp[0].X_op = O_illegal;
548   exp[1].X_op = O_illegal;
549
550   if (insn->operands == mmix_operands_get)
551     {
552       expp_reg = &exp[0];
553       expp_sreg = &exp[1];
554
555       expression (expp_reg);
556
557       p = input_line_pointer;
558
559       /* Skip whitespace */
560       while (*p == ' ' || *p == '\t')
561         p++;
562
563       if (*p == ',')
564         {
565           p++;
566
567           /* Skip whitespace */
568           while (*p == ' ' || *p == '\t')
569             p++;
570           sregp = p;
571           input_line_pointer = sregp;
572           c = get_symbol_end ();
573           sregend = input_line_pointer;
574         }
575     }
576   else
577     {
578       expp_sreg = &exp[0];
579       expp_reg = &exp[1];
580
581       sregp = p;
582       c = get_symbol_end ();
583       sregend = p = input_line_pointer;
584       *p = c;
585
586       /* Skip whitespace */
587       while (*p == ' ' || *p == '\t')
588         p++;
589
590       if (*p == ',')
591         {
592           p++;
593
594           /* Skip whitespace */
595           while (*p == ' ' || *p == '\t')
596             p++;
597
598           input_line_pointer = p;
599           expression (expp_reg);
600         }
601       *sregend = 0;
602     }
603
604   regno = get_spec_regno (sregp);
605   *sregend = c;
606
607   /* Let the caller issue errors; we've made sure the operands are
608      invalid.  */
609   if (expp_reg->X_op != O_illegal
610       && expp_reg->X_op != O_absent
611       && regno != -1)
612     {
613       expp_sreg->X_op = O_register;
614       expp_sreg->X_add_number = regno + 256;
615     }
616
617   return 2;
618 }
619
620 /* Handle MMIX-specific option.  */
621
622 int
623 md_parse_option (c, arg)
624      int c;
625      char *arg ATTRIBUTE_UNUSED;
626 {
627   switch (c)
628     {
629     case 'x':
630       warn_on_expansion = 0;
631       allocate_undefined_gregs_in_linker = 1;
632       break;
633
634     case OPTION_RELAX:
635       linkrelax = 1;
636       break;
637
638     case OPTION_NOEXPAND:
639       expand_op = 0;
640       break;
641
642     case OPTION_NOMERGEGREG:
643       merge_gregs = 0;
644       break;
645
646     case OPTION_NOSYMS:
647       predefined_syms = 0;
648       equated_spec_regs = 0;
649       break;
650
651     case OPTION_GNU_SYNTAX:
652       mmix_gnu_syntax = 1;
653       label_without_colon_this_line = 0;
654       break;
655
656     case OPTION_GLOBALIZE_SYMBOLS:
657       mmix_globalize_symbols = 1;
658       break;
659
660     case OPTION_FIXED_SPEC_REGS:
661       equated_spec_regs = 0;
662       break;
663
664     case OPTION_LINKER_ALLOCATED_GREGS:
665       allocate_undefined_gregs_in_linker = 1;
666       break;
667
668     default:
669       return 0;
670     }
671
672   return 1;
673 }
674
675 /* Display MMIX-specific help text.  */
676
677 void
678 md_show_usage (stream)
679      FILE * stream;
680 {
681   fprintf (stream, _(" MMIX-specific command line options:\n"));
682   fprintf (stream, _("\
683   -fixed-special-register-names\n\
684                           Allow only the original special register names.\n"));
685   fprintf (stream, _("\
686   -globalize-symbols      Make all symbols global.\n"));
687   fprintf (stream, _("\
688   -gnu-syntax             Turn off mmixal syntax compatibility.\n"));
689   fprintf (stream, _("\
690   -relax                  Create linker relaxable code.\n"));
691   fprintf (stream, _("\
692   -no-predefined-syms     Do not provide mmixal built-in constants.\n\
693                           Implies -fixed-special-register-names.\n"));
694   fprintf (stream, _("\
695   -no-expand              Do not expand GETA, branches, PUSHJ or JUMP\n\
696                           into multiple instructions.\n"));
697   fprintf (stream, _("\
698   -no-merge-gregs         Do not merge GREG definitions with nearby values.\n"));
699   fprintf (stream, _("\
700   -linker-allocated-gregs If there's no suitable GREG definition for the\
701                           operands of an instruction, let the linker resolve.\n"));
702   fprintf (stream, _("\
703   -x                      Do not warn when an operand to GETA, a branch,\n\
704                           PUSHJ or JUMP is not known to be within range.\n\
705                           The linker will catch any errors.  Implies\n\
706                           -linker-allocated-gregs."));
707 }
708
709 /* Step to end of line, but don't step over the end of the line.  */
710
711 static void
712 mmix_discard_rest_of_line ()
713 {
714   while (*input_line_pointer
715          && (! is_end_of_line[(unsigned char) *input_line_pointer]
716              || TC_EOL_IN_INSN (input_line_pointer)))
717     input_line_pointer++;
718 }
719
720 /* Act as demand_empty_rest_of_line if we're in strict GNU syntax mode,
721    otherwise just ignore the rest of the line (and skip the end-of-line
722    delimiter).  */
723
724 static void
725 mmix_handle_rest_of_empty_line ()
726 {
727   if (mmix_gnu_syntax)
728     demand_empty_rest_of_line ();
729   else
730     {
731       mmix_discard_rest_of_line ();
732       input_line_pointer++;
733     }
734 }
735
736 /* Initialize GAS MMIX specifics.  */
737
738 void
739 mmix_md_begin ()
740 {
741   int i;
742   const struct mmix_opcode *opcode;
743
744   /* We assume nobody will use this, so don't allocate any room.  */
745   obstack_begin (&mmix_sym_obstack, 0);
746
747   /* This will break the day the "lex" thingy changes.  For now, it's the
748      only way to make ':' part of a name, and a name beginner.  */
749   lex_type[':'] = (LEX_NAME | LEX_BEGIN_NAME);
750
751   mmix_opcode_hash = hash_new ();
752
753   real_reg_section
754     = bfd_make_section_old_way (stdoutput, MMIX_REG_SECTION_NAME);
755
756   for (opcode = mmix_opcodes; opcode->name; opcode++)
757     hash_insert (mmix_opcode_hash, opcode->name, (char *) opcode);
758
759   /* We always insert the ordinary registers 0..255 as registers.  */
760   for (i = 0; i < 256; i++)
761     {
762       char buf[5];
763
764       /* Alternatively, we could diddle with '$' and the following number,
765          but keeping the registers as symbols helps keep parsing simple.  */
766       sprintf (buf, "$%d", i);
767       symbol_table_insert (symbol_new (buf, reg_section, i,
768                                        &zero_address_frag));
769     }
770
771   /* Insert mmixal built-in names if allowed.  */
772   if (predefined_syms)
773     {
774       for (i = 0; mmix_spec_regs[i].name != NULL; i++)
775         symbol_table_insert (symbol_new (mmix_spec_regs[i].name,
776                                          reg_section,
777                                          mmix_spec_regs[i].number + 256,
778                                          &zero_address_frag));
779
780       /* FIXME: Perhaps these should be recognized as specials; as field
781          names for those instructions.  */
782       symbol_table_insert (symbol_new ("ROUND_CURRENT", reg_section, 512,
783                                        &zero_address_frag));
784       symbol_table_insert (symbol_new ("ROUND_OFF", reg_section, 512 + 1,
785                                        &zero_address_frag));
786       symbol_table_insert (symbol_new ("ROUND_UP", reg_section, 512 + 2,
787                                        &zero_address_frag));
788       symbol_table_insert (symbol_new ("ROUND_DOWN", reg_section, 512 + 3,
789                                        &zero_address_frag));
790       symbol_table_insert (symbol_new ("ROUND_NEAR", reg_section, 512 + 4,
791                                        &zero_address_frag));
792     }
793 }
794
795 /* Assemble one insn in STR.  */
796
797 void
798 md_assemble (str)
799      char *str;
800 {
801   char *operands = str;
802   char modified_char = 0;
803   struct mmix_opcode *instruction;
804   fragS *opc_fragP = NULL;
805   int max_operands = 3;
806
807   /* Note that the struct frag member fr_literal in frags.h is char[], so
808      I have to make this a plain char *.  */
809   /* unsigned */ char *opcodep = NULL;
810
811   expressionS exp[4];
812   int n_operands = 0;
813
814   /* Move to end of opcode.  */
815   for (operands = str;
816        is_part_of_name (*operands);
817        ++operands)
818     ;
819
820   if (ISSPACE (*operands))
821     {
822       modified_char = *operands;
823       *operands++ = '\0';
824     }
825
826   instruction = (struct mmix_opcode *) hash_find (mmix_opcode_hash, str);
827   if (instruction == NULL)
828     {
829       as_bad (_("unknown opcode: `%s'"), str);
830
831       /* Avoid "unhandled label" errors.  */
832       pending_label = NULL;
833       return;
834     }
835
836   /* Put back the character after the opcode.  */
837   if (modified_char != 0)
838     operands[-1] = modified_char;
839
840   input_line_pointer = operands;
841
842   /* Is this a mmixal pseudodirective?  */
843   if (instruction->type == mmix_type_pseudo)
844     {
845       /* For mmixal compatibility, a label for an instruction (and
846          emitting pseudo) refers to the _aligned_ address.  We emit the
847          label here for the pseudos that don't handle it themselves.  When
848          having an fb-label, emit it here, and increment the counter after
849          the pseudo.  */
850       switch (instruction->operands)
851         {
852         case mmix_operands_loc:
853         case mmix_operands_byte:
854         case mmix_operands_prefix:
855         case mmix_operands_local:
856         case mmix_operands_bspec:
857         case mmix_operands_espec:
858           if (current_fb_label >= 0)
859             colon (fb_label_name (current_fb_label, 1));
860           else if (pending_label != NULL)
861             {
862               colon (pending_label);
863               pending_label = NULL;
864             }
865           break;
866
867         default:
868           break;
869         }
870
871       /* Some of the pseudos emit contents, others don't.  Set a
872          contents-emitted flag when we emit something into .text   */
873       switch (instruction->operands)
874         {
875         case mmix_operands_loc:
876           /* LOC */
877           s_loc (0);
878           break;
879
880         case mmix_operands_byte:
881           /* BYTE */
882           mmix_byte ();
883           break;
884
885         case mmix_operands_wyde:
886           /* WYDE */
887           mmix_cons (2);
888           break;
889
890         case mmix_operands_tetra:
891           /* TETRA */
892           mmix_cons (4);
893           break;
894
895         case mmix_operands_octa:
896           /* OCTA */
897           mmix_cons (8);
898           break;
899
900         case mmix_operands_prefix:
901           /* PREFIX */
902           s_prefix (0);
903           break;
904
905         case mmix_operands_local:
906           /* LOCAL */
907           mmix_s_local (0);
908           break;
909
910         case mmix_operands_bspec:
911           /* BSPEC */
912           s_bspec (0);
913           break;
914
915         case mmix_operands_espec:
916           /* ESPEC */
917           s_espec (0);
918           break;
919
920         default:
921           BAD_CASE (instruction->operands);
922         }
923
924       /* These are all working like the pseudo functions in read.c:s_...,
925          in that they step over the end-of-line marker at the end of the
926          line.  We don't want that here.  */
927       input_line_pointer--;
928
929       /* Step up the fb-label counter if there was a definition on this
930          line.  */
931       if (current_fb_label >= 0)
932         {
933           fb_label_instance_inc (current_fb_label);
934           current_fb_label = -1;
935         }
936
937       /* Reset any don't-align-next-datum request, unless this was a LOC
938          directive.  */
939       if (instruction->operands != mmix_operands_loc)
940         want_unaligned = 0;
941
942       return;
943     }
944
945   /* Not a pseudo; we *will* emit contents.  */
946   if (now_seg == data_section)
947     {
948       if (lowest_data_loc != (bfd_vma) -1 && (lowest_data_loc & 3) != 0)
949         {
950           if (data_has_contents)
951             as_bad (_("specified location wasn't TETRA-aligned"));
952           else if (want_unaligned)
953             as_bad (_("unaligned data at an absolute location is not supported"));
954
955           lowest_data_loc &= ~(bfd_vma) 3;
956           lowest_data_loc += 4;
957         }
958
959       data_has_contents = 1;
960     }
961   else if (now_seg == text_section)
962     {
963       if (lowest_text_loc != (bfd_vma) -1 && (lowest_text_loc & 3) != 0)
964         {
965           if (text_has_contents)
966             as_bad (_("specified location wasn't TETRA-aligned"));
967           else if (want_unaligned)
968             as_bad (_("unaligned data at an absolute location is not supported"));
969
970           lowest_text_loc &= ~(bfd_vma) 3;
971           lowest_text_loc += 4;
972         }
973
974       text_has_contents = 1;
975     }
976
977   /* After a sequence of BYTEs or WYDEs, we need to get to instruction
978      alignment.  For other pseudos, a ".p2align 2" is supposed to be
979      inserted by the user.  */
980   if (last_alignment < 2 && ! want_unaligned)
981     {
982       frag_align (2, 0, 0);
983       record_alignment (now_seg, 2);
984       last_alignment = 2;
985     }
986   else
987     /* Reset any don't-align-next-datum request.  */
988     want_unaligned = 0;
989
990   /* For mmixal compatibility, a label for an instruction (and emitting
991      pseudo) refers to the _aligned_ address.  So we have to emit the
992      label here.  */
993   if (pending_label != NULL)
994     {
995       colon (pending_label);
996       pending_label = NULL;
997     }
998
999   /* We assume that mmix_opcodes keeps having unique mnemonics for each
1000      opcode, so we don't have to iterate over more than one opcode; if the
1001      syntax does not match, then there's a syntax error.  */
1002
1003   /* Operands have little or no context and are all comma-separated; it is
1004      easier to parse each expression first.   */
1005   switch (instruction->operands)
1006     {
1007     case mmix_operands_reg_yz:
1008     case mmix_operands_pop:
1009     case mmix_operands_regaddr:
1010     case mmix_operands_pushj:
1011     case mmix_operands_get:
1012     case mmix_operands_put:
1013     case mmix_operands_set:
1014     case mmix_operands_save:
1015     case mmix_operands_unsave:
1016       max_operands = 2;
1017       break;
1018
1019     case mmix_operands_sync:
1020     case mmix_operands_jmp:
1021     case mmix_operands_resume:
1022       max_operands = 1;
1023       break;
1024
1025       /* The original 3 is fine for the rest.  */
1026     default:
1027       break;
1028     }
1029
1030   /* If this is GET or PUT, and we don't do allow those names to be
1031      equated, we need to parse the names ourselves, so we don't pick up a
1032      user label instead of the special register.  */
1033   if (! equated_spec_regs
1034       && (instruction->operands == mmix_operands_get
1035           || instruction->operands == mmix_operands_put))
1036     n_operands = get_putget_operands (instruction, operands, exp);
1037   else
1038     n_operands = get_operands (max_operands, operands, exp);
1039
1040   /* If there's a fb-label on the current line, set that label.  This must
1041      be done *after* evaluating expressions of operands, since neither a
1042      "1B" nor a "1F" refers to "1H" on the same line.  */
1043   if (current_fb_label >= 0)
1044     {
1045       fb_label_instance_inc (current_fb_label);
1046       colon (fb_label_name (current_fb_label, 0));
1047       current_fb_label = -1;
1048     }
1049
1050   /* We also assume that the length of the instruction is at least 4, the
1051      size of an unexpanded instruction.  We need a self-contained frag
1052      since we want the relocation to point to the instruction, not the
1053      variant part.  */
1054
1055   opcodep = frag_more (4);
1056   mmix_opcode_frag = opc_fragP = frag_now;
1057   frag_now->fr_opcode = opcodep;
1058
1059   /* Mark start of insn for DWARF2 debug features.  */
1060   if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
1061     dwarf2_emit_insn (4);
1062
1063   md_number_to_chars (opcodep, instruction->match, 4);
1064
1065   switch (instruction->operands)
1066     {
1067     case mmix_operands_jmp:
1068       if (n_operands == 0 && ! mmix_gnu_syntax)
1069         /* Zeros are in place - nothing needs to be done when we have no
1070            operands.  */
1071         break;
1072
1073       /* Add a frag for a JMP relaxation; we need room for max four
1074          extra instructions.  We don't do any work around here to check if
1075          we can determine the offset right away.  */
1076       if (n_operands != 1 || exp[0].X_op == O_register)
1077         {
1078           as_bad (_("invalid operand to opcode %s: `%s'"),
1079                   instruction->name, operands);
1080           return;
1081         }
1082
1083       if (expand_op)
1084         frag_var (rs_machine_dependent, 4 * 4, 0,
1085                   ENCODE_RELAX (STATE_JMP, STATE_UNDF),
1086                   exp[0].X_add_symbol,
1087                   exp[0].X_add_number,
1088                   opcodep);
1089       else
1090         fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal, 4,
1091                      exp + 0, 1, BFD_RELOC_MMIX_ADDR27);
1092       break;
1093
1094     case mmix_operands_pushj:
1095       /* We take care of PUSHJ in full here.  */
1096       if (n_operands != 2
1097           || ((exp[0].X_op == O_constant || exp[0].X_op == O_register)
1098               && (exp[0].X_add_number > 255 || exp[0].X_add_number < 0)))
1099         {
1100           as_bad (_("invalid operands to opcode %s: `%s'"),
1101                   instruction->name, operands);
1102           return;
1103         }
1104
1105       if (exp[0].X_op == O_register || exp[0].X_op == O_constant)
1106         opcodep[1] = exp[0].X_add_number;
1107       else
1108         fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 1,
1109                      1, exp + 0, 0, BFD_RELOC_MMIX_REG_OR_BYTE);
1110
1111       if (expand_op)
1112         frag_var (rs_machine_dependent, PUSHJ_MAX_LEN - 4, 0,
1113                   ENCODE_RELAX (STATE_PUSHJ, STATE_UNDF),
1114                   exp[1].X_add_symbol,
1115                   exp[1].X_add_number,
1116                   opcodep);
1117       else
1118         fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal, 4,
1119                      exp + 1, 1, BFD_RELOC_MMIX_ADDR19);
1120       break;
1121
1122     case mmix_operands_regaddr:
1123       /* GETA/branch: Add a frag for relaxation.  We don't do any work
1124          around here to check if we can determine the offset right away.  */
1125       if (n_operands != 2 || exp[1].X_op == O_register)
1126         {
1127           as_bad (_("invalid operands to opcode %s: `%s'"),
1128                   instruction->name, operands);
1129           return;
1130         }
1131
1132       if (! expand_op)
1133         fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal, 4,
1134                      exp + 1, 1, BFD_RELOC_MMIX_ADDR19);
1135       else if (instruction->type == mmix_type_condbranch)
1136         frag_var (rs_machine_dependent, BCC_MAX_LEN - 4, 0,
1137                   ENCODE_RELAX (STATE_BCC, STATE_UNDF),
1138                   exp[1].X_add_symbol,
1139                   exp[1].X_add_number,
1140                   opcodep);
1141       else
1142         frag_var (rs_machine_dependent, GETA_MAX_LEN - 4, 0,
1143                   ENCODE_RELAX (STATE_GETA, STATE_UNDF),
1144                   exp[1].X_add_symbol,
1145                   exp[1].X_add_number,
1146                   opcodep);
1147       break;
1148
1149     default:
1150       break;
1151     }
1152
1153   switch (instruction->operands)
1154     {
1155     case mmix_operands_regs:
1156       /* We check the number of operands here, since we're in a
1157          FALLTHROUGH sequence in the next switch.  */
1158       if (n_operands != 3 || exp[2].X_op == O_constant)
1159         {
1160           as_bad (_("invalid operands to opcode %s: `%s'"),
1161                   instruction->name, operands);
1162           return;
1163         }
1164       /* FALLTHROUGH.  */
1165     case mmix_operands_regs_z:
1166       if (n_operands != 3)
1167         {
1168           as_bad (_("invalid operands to opcode %s: `%s'"),
1169                   instruction->name, operands);
1170           return;
1171         }
1172       /* FALLTHROUGH.  */
1173     case mmix_operands_reg_yz:
1174     case mmix_operands_roundregs_z:
1175     case mmix_operands_roundregs:
1176     case mmix_operands_regs_z_opt:
1177     case mmix_operands_neg:
1178     case mmix_operands_regaddr:
1179     case mmix_operands_get:
1180     case mmix_operands_set:
1181     case mmix_operands_save:
1182       if (n_operands < 1
1183           || (exp[0].X_op == O_register && exp[0].X_add_number > 255))
1184         {
1185           as_bad (_("invalid operands to opcode %s: `%s'"),
1186                   instruction->name, operands);
1187           return;
1188         }
1189
1190       if (exp[0].X_op == O_register)
1191         opcodep[1] = exp[0].X_add_number;
1192       else
1193         fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 1,
1194                      1, exp + 0, 0, BFD_RELOC_MMIX_REG);
1195       break;
1196
1197     default:
1198       ;
1199     }
1200
1201   /* A corresponding once-over for those who take an 8-bit constant as
1202      their first operand.  */
1203   switch (instruction->operands)
1204     {
1205     case mmix_operands_pushgo:
1206       /* PUSHGO: X is a constant, but can be expressed as a register.
1207          We handle X here and use the common machinery of T,X,3,$ for
1208          the rest of the operands.  */
1209       if (n_operands < 2
1210           || ((exp[0].X_op == O_constant || exp[0].X_op == O_register)
1211               && (exp[0].X_add_number > 255 || exp[0].X_add_number < 0)))
1212         {
1213           as_bad (_("invalid operands to opcode %s: `%s'"),
1214                   instruction->name, operands);
1215           return;
1216         }
1217       else if (exp[0].X_op == O_constant || exp[0].X_op == O_register)
1218         opcodep[1] = exp[0].X_add_number;
1219       else
1220         fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 1,
1221                      1, exp + 0, 0, BFD_RELOC_MMIX_REG_OR_BYTE);
1222       break;
1223
1224     case mmix_operands_pop:
1225       if ((n_operands == 0 || n_operands == 1) && ! mmix_gnu_syntax)
1226         break;
1227       /* FALLTHROUGH.  */
1228     case mmix_operands_x_regs_z:
1229       if (n_operands < 1
1230           || (exp[0].X_op == O_constant
1231               && (exp[0].X_add_number > 255
1232                   || exp[0].X_add_number < 0)))
1233         {
1234           as_bad (_("invalid operands to opcode %s: `%s'"),
1235                   instruction->name, operands);
1236           return;
1237         }
1238
1239       if (exp[0].X_op == O_constant)
1240         opcodep[1] = exp[0].X_add_number;
1241       else
1242         /* FIXME: This doesn't bring us unsignedness checking.  */
1243         fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 1,
1244                      1, exp + 0, 0, BFD_RELOC_8);
1245     default:
1246       ;
1247     }
1248
1249   /* Handle the rest.  */
1250   switch (instruction->operands)
1251     {
1252     case mmix_operands_set:
1253       /* SET: Either two registers, "$X,$Y", with Z field as zero, or
1254          "$X,YZ", meaning change the opcode to SETL.  */
1255       if (n_operands != 2
1256           || (exp[1].X_op == O_constant
1257               && (exp[1].X_add_number > 0xffff || exp[1].X_add_number < 0)))
1258         {
1259           as_bad (_("invalid operands to opcode %s: `%s'"),
1260                   instruction->name, operands);
1261           return;
1262         }
1263
1264       if (exp[1].X_op == O_constant)
1265         {
1266           /* There's an ambiguity with "SET $0,Y" when Y isn't defined
1267              yet.  To keep things simple, we assume that Y is then a
1268              register, and only change the opcode if Y is defined at this
1269              point.
1270
1271              There's no compatibility problem with mmixal, since it emits
1272              errors if the field is not defined at this point.  */
1273           md_number_to_chars (opcodep, SETL_INSN_BYTE, 1);
1274
1275           opcodep[2] = (exp[1].X_add_number >> 8) & 255;
1276           opcodep[3] = exp[1].X_add_number & 255;
1277           break;
1278         }
1279       /* FALLTHROUGH.  */
1280     case mmix_operands_x_regs_z:
1281       /* SYNCD: "X,$Y,$Z|Z".  */
1282       /* FALLTHROUGH.  */
1283     case mmix_operands_regs:
1284       /* Three registers, $X,$Y,$Z.  */
1285       /* FALLTHROUGH.  */
1286     case mmix_operands_regs_z:
1287       /* Operands "$X,$Y,$Z|Z", number of arguments checked above.  */
1288       /* FALLTHROUGH.  */
1289     case mmix_operands_pushgo:
1290       /* Operands "$X|X,$Y,$Z|Z", optional Z.  */
1291       /* FALLTHROUGH.  */
1292     case mmix_operands_regs_z_opt:
1293       /* Operands "$X,$Y,$Z|Z", with $Z|Z being optional, default 0.  Any
1294          operands not completely decided yet are postponed to later in
1295          assembly (but not until link-time yet).  */
1296
1297       if ((n_operands != 2 && n_operands != 3)
1298           || (exp[1].X_op == O_register && exp[1].X_add_number > 255)
1299           || (n_operands == 3
1300               && ((exp[2].X_op == O_register
1301                    && exp[2].X_add_number > 255
1302                    && mmix_gnu_syntax)
1303                   || (exp[2].X_op == O_constant
1304                       && (exp[2].X_add_number > 255
1305                           || exp[2].X_add_number < 0)))))
1306         {
1307           as_bad (_("invalid operands to opcode %s: `%s'"),
1308                   instruction->name, operands);
1309           return;
1310         }
1311
1312       if (n_operands == 2)
1313         {
1314           symbolS *sym;
1315
1316           /* The last operand is immediate whenever we see just two
1317              operands.  */
1318           opcodep[0] |= IMM_OFFSET_BIT;
1319
1320           /* Now, we could either have an implied "0" as the Z operand, or
1321              it could be the constant of a "base address plus offset".  It
1322              depends on whether it is allowed; only memory operations, as
1323              signified by instruction->type and "T" and "X" operand types,
1324              and it depends on whether we find a register in the second
1325              operand, exp[1].  */
1326           if (exp[1].X_op == O_register && exp[1].X_add_number <= 255)
1327             {
1328               /* A zero then; all done.  */
1329               opcodep[2] = exp[1].X_add_number;
1330               break;
1331             }
1332
1333           /* Not known as a register.  Is base address plus offset
1334              allowed, or can we assume that it is a register anyway?  */
1335           if ((instruction->operands != mmix_operands_regs_z_opt
1336                && instruction->operands != mmix_operands_x_regs_z
1337                && instruction->operands != mmix_operands_pushgo)
1338               || (instruction->type != mmix_type_memaccess_octa
1339                   && instruction->type != mmix_type_memaccess_tetra
1340                   && instruction->type != mmix_type_memaccess_wyde
1341                   && instruction->type != mmix_type_memaccess_byte
1342                   && instruction->type != mmix_type_memaccess_block
1343                   && instruction->type != mmix_type_jsr
1344                   && instruction->type != mmix_type_branch))
1345             {
1346               fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 2,
1347                            1, exp + 1, 0, BFD_RELOC_MMIX_REG);
1348               break;
1349             }
1350
1351           /* To avoid getting a NULL add_symbol for constants and then
1352              catching a SEGV in write_relocs since it doesn't handle
1353              constants well for relocs other than PC-relative, we need to
1354              pass expressions as symbols and use fix_new, not fix_new_exp.  */
1355           sym = make_expr_symbol (exp + 1);
1356
1357           /* Now we know it can be a "base address plus offset".  Add
1358              proper fixup types so we can handle this later, when we've
1359              parsed everything.  */
1360           fix_new (opc_fragP, opcodep - opc_fragP->fr_literal + 2,
1361                    8, sym, 0, 0, BFD_RELOC_MMIX_BASE_PLUS_OFFSET);
1362           break;
1363         }
1364
1365       if (exp[1].X_op == O_register)
1366         opcodep[2] = exp[1].X_add_number;
1367       else
1368         fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 2,
1369                      1, exp + 1, 0, BFD_RELOC_MMIX_REG);
1370
1371       /* In mmixal compatibility mode, we allow special registers as
1372          constants for the Z operand.  They have 256 added to their
1373          register numbers, so the right thing will happen if we just treat
1374          those as constants.  */
1375       if (exp[2].X_op == O_register && exp[2].X_add_number <= 255)
1376         opcodep[3] = exp[2].X_add_number;
1377       else if (exp[2].X_op == O_constant
1378                || (exp[2].X_op == O_register && exp[2].X_add_number > 255))
1379         {
1380           opcodep[3] = exp[2].X_add_number;
1381           opcodep[0] |= IMM_OFFSET_BIT;
1382         }
1383       else
1384         fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3,
1385                      1, exp + 2, 0,
1386                      (instruction->operands == mmix_operands_set
1387                       || instruction->operands == mmix_operands_regs)
1388                      ? BFD_RELOC_MMIX_REG : BFD_RELOC_MMIX_REG_OR_BYTE);
1389       break;
1390
1391     case mmix_operands_pop:
1392       /* POP, one eight and one 16-bit operand.  */
1393       if (n_operands == 0 && ! mmix_gnu_syntax)
1394         break;
1395       if (n_operands == 1 && ! mmix_gnu_syntax)
1396         goto a_single_24_bit_number_operand;
1397       /* FALLTHROUGH.  */
1398     case mmix_operands_reg_yz:
1399       /* A register and a 16-bit unsigned number.  */
1400       if (n_operands != 2
1401           || exp[1].X_op == O_register
1402           || (exp[1].X_op == O_constant
1403               && (exp[1].X_add_number > 0xffff || exp[1].X_add_number < 0)))
1404         {
1405           as_bad (_("invalid operands to opcode %s: `%s'"),
1406                   instruction->name, operands);
1407           return;
1408         }
1409
1410       if (exp[1].X_op == O_constant)
1411         {
1412           opcodep[2] = (exp[1].X_add_number >> 8) & 255;
1413           opcodep[3] = exp[1].X_add_number & 255;
1414         }
1415       else
1416         /* FIXME: This doesn't bring us unsignedness checking.  */
1417         fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 2,
1418                      2, exp + 1, 0, BFD_RELOC_16);
1419       break;
1420
1421     case mmix_operands_jmp:
1422       /* A JMP.  Everyhing is already done.  */
1423       break;
1424
1425     case mmix_operands_roundregs:
1426       /* Two registers with optional rounding mode or constant in between.  */
1427       if ((n_operands == 3 && exp[2].X_op == O_constant)
1428           || (n_operands == 2 && exp[1].X_op == O_constant))
1429         {
1430           as_bad (_("invalid operands to opcode %s: `%s'"),
1431                   instruction->name, operands);
1432           return;
1433         }
1434       /* FALLTHROUGH.  */
1435     case mmix_operands_roundregs_z:
1436       /* Like FLOT, "$X,ROUND_MODE,$Z|Z", but the rounding mode is
1437          optional and can be the corresponding constant.  */
1438       {
1439         /* Which exp index holds the second operand (not the rounding
1440            mode).  */
1441         int op2no = n_operands - 1;
1442
1443         if ((n_operands != 2 && n_operands != 3)
1444             || ((exp[op2no].X_op == O_register
1445                  && exp[op2no].X_add_number > 255)
1446                 || (exp[op2no].X_op == O_constant
1447                     && (exp[op2no].X_add_number > 255
1448                         || exp[op2no].X_add_number < 0)))
1449             || (n_operands == 3
1450                 /* We don't allow for the rounding mode to be deferred; it
1451                    must be determined in the "first pass".  It cannot be a
1452                    symbol equated to a rounding mode, but defined after
1453                    the first use.  */
1454                 && ((exp[1].X_op == O_register
1455                      && exp[1].X_add_number < 512)
1456                     || (exp[1].X_op == O_constant
1457                         && exp[1].X_add_number < 0
1458                         && exp[1].X_add_number > 4)
1459                     || (exp[1].X_op != O_register
1460                         && exp[1].X_op != O_constant))))
1461           {
1462             as_bad (_("invalid operands to opcode %s: `%s'"),
1463                     instruction->name, operands);
1464             return;
1465           }
1466
1467         /* Add rounding mode if present.  */
1468         if (n_operands == 3)
1469           opcodep[2] = exp[1].X_add_number & 255;
1470
1471         if (exp[op2no].X_op == O_register)
1472           opcodep[3] = exp[op2no].X_add_number;
1473         else if (exp[op2no].X_op == O_constant)
1474           {
1475             opcodep[3] = exp[op2no].X_add_number;
1476             opcodep[0] |= IMM_OFFSET_BIT;
1477           }
1478         else
1479           fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3,
1480                        1, exp + op2no, 0,
1481                        instruction->operands == mmix_operands_roundregs
1482                        ? BFD_RELOC_MMIX_REG
1483                        : BFD_RELOC_MMIX_REG_OR_BYTE);
1484         break;
1485       }
1486
1487     case mmix_operands_sync:
1488     a_single_24_bit_number_operand:
1489       if (n_operands != 1
1490           || exp[0].X_op == O_register
1491           || (exp[0].X_op == O_constant
1492               && (exp[0].X_add_number > 0xffffff || exp[0].X_add_number < 0)))
1493         {
1494           as_bad (_("invalid operands to opcode %s: `%s'"),
1495                   instruction->name, operands);
1496           return;
1497         }
1498
1499       if (exp[0].X_op == O_constant)
1500         {
1501           opcodep[1] = (exp[0].X_add_number >> 16) & 255;
1502           opcodep[2] = (exp[0].X_add_number >> 8) & 255;
1503           opcodep[3] = exp[0].X_add_number & 255;
1504         }
1505       else
1506         /* FIXME: This doesn't bring us unsignedness checking.  */
1507         fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 1,
1508                      3, exp + 0, 0, BFD_RELOC_24);
1509       break;
1510
1511     case mmix_operands_neg:
1512       /* Operands "$X,Y,$Z|Z"; NEG or NEGU.  Y is optional, 0 is default.  */
1513
1514       if ((n_operands != 3 && n_operands != 2)
1515           || (n_operands == 3 && exp[1].X_op == O_register)
1516           || ((exp[1].X_op == O_constant || exp[1].X_op == O_register)
1517               && (exp[1].X_add_number > 255 || exp[1].X_add_number < 0))
1518           || (n_operands == 3
1519               && ((exp[2].X_op == O_register && exp[2].X_add_number > 255)
1520                   || (exp[2].X_op == O_constant
1521                       && (exp[2].X_add_number > 255
1522                           || exp[2].X_add_number < 0)))))
1523         {
1524           as_bad (_("invalid operands to opcode %s: `%s'"),
1525                   instruction->name, operands);
1526           return;
1527         }
1528
1529       if (n_operands == 2)
1530         {
1531           if (exp[1].X_op == O_register)
1532             opcodep[3] = exp[1].X_add_number;
1533           else if (exp[1].X_op == O_constant)
1534             {
1535               opcodep[3] = exp[1].X_add_number;
1536               opcodep[0] |= IMM_OFFSET_BIT;
1537             }
1538           else
1539             fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3,
1540                          1, exp + 1, 0, BFD_RELOC_MMIX_REG_OR_BYTE);
1541           break;
1542         }
1543
1544       if (exp[1].X_op == O_constant)
1545         opcodep[2] = exp[1].X_add_number;
1546       else
1547         fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 2,
1548                      1, exp + 1, 0, BFD_RELOC_8);
1549
1550       if (exp[2].X_op == O_register)
1551         opcodep[3] = exp[2].X_add_number;
1552       else if (exp[2].X_op == O_constant)
1553         {
1554           opcodep[3] = exp[2].X_add_number;
1555           opcodep[0] |= IMM_OFFSET_BIT;
1556         }
1557       else
1558         fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3,
1559                      1, exp + 2, 0, BFD_RELOC_MMIX_REG_OR_BYTE);
1560       break;
1561
1562     case mmix_operands_regaddr:
1563       /* A GETA/branch-type.  */
1564       break;
1565
1566     case mmix_operands_get:
1567       /* "$X,spec_reg"; GET.
1568          Like with rounding modes, we demand that the special register or
1569          symbol is already defined when we get here at the point of use.  */
1570       if (n_operands != 2
1571           || (exp[1].X_op == O_register
1572               && (exp[1].X_add_number < 256 || exp[1].X_add_number >= 512))
1573           || (exp[1].X_op == O_constant
1574               && (exp[1].X_add_number < 0 || exp[1].X_add_number > 256))
1575           || (exp[1].X_op != O_constant && exp[1].X_op != O_register))
1576         {
1577           as_bad (_("invalid operands to opcode %s: `%s'"),
1578                   instruction->name, operands);
1579           return;
1580         }
1581
1582       opcodep[3] = exp[1].X_add_number - 256;
1583       break;
1584
1585     case mmix_operands_put:
1586       /* "spec_reg,$Z|Z"; PUT.  */
1587       if (n_operands != 2
1588           || (exp[0].X_op == O_register
1589               && (exp[0].X_add_number < 256 || exp[0].X_add_number >= 512))
1590           || (exp[0].X_op == O_constant
1591               && (exp[0].X_add_number < 0 || exp[0].X_add_number > 256))
1592           || (exp[0].X_op != O_constant && exp[0].X_op != O_register))
1593         {
1594           as_bad (_("invalid operands to opcode %s: `%s'"),
1595                   instruction->name, operands);
1596           return;
1597         }
1598
1599       opcodep[1] = exp[0].X_add_number - 256;
1600
1601       /* Note that the Y field is zero.  */
1602
1603       if (exp[1].X_op == O_register)
1604         opcodep[3] = exp[1].X_add_number;
1605       else if (exp[1].X_op == O_constant)
1606         {
1607           opcodep[3] = exp[1].X_add_number;
1608           opcodep[0] |= IMM_OFFSET_BIT;
1609         }
1610       else
1611         fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3,
1612                      1, exp + 1, 0, BFD_RELOC_MMIX_REG_OR_BYTE);
1613       break;
1614
1615     case mmix_operands_save:
1616       /* "$X,0"; SAVE.  */
1617       if (n_operands != 2
1618           || exp[1].X_op != O_constant
1619           || exp[1].X_add_number != 0)
1620         {
1621           as_bad (_("invalid operands to opcode %s: `%s'"),
1622                   instruction->name, operands);
1623           return;
1624         }
1625       break;
1626
1627     case mmix_operands_unsave:
1628       if (n_operands < 2 && ! mmix_gnu_syntax)
1629         {
1630           if (n_operands == 1)
1631             {
1632               if (exp[0].X_op == O_register)
1633                 opcodep[3] = exp[0].X_add_number;
1634               else
1635                 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3,
1636                              1, exp, 0, BFD_RELOC_MMIX_REG);
1637             }
1638           break;
1639         }
1640
1641       /* "0,$Z"; UNSAVE.  */
1642       if (n_operands != 2
1643           || exp[0].X_op != O_constant
1644           || exp[0].X_add_number != 0
1645           || exp[1].X_op == O_constant
1646           || (exp[1].X_op == O_register
1647               && exp[1].X_add_number > 255))
1648         {
1649           as_bad (_("invalid operands to opcode %s: `%s'"),
1650                   instruction->name, operands);
1651           return;
1652         }
1653
1654       if (exp[1].X_op == O_register)
1655         opcodep[3] = exp[1].X_add_number;
1656       else
1657         fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3,
1658                      1, exp + 1, 0, BFD_RELOC_MMIX_REG);
1659       break;
1660
1661     case mmix_operands_xyz_opt:
1662       /* SWYM, TRIP, TRAP: zero, one, two or three operands.  */
1663       if (n_operands == 0 && ! mmix_gnu_syntax)
1664         /* Zeros are in place - nothing needs to be done for zero
1665            operands.  We don't allow this in GNU syntax mode, because it
1666            was believed that the risk of missing to supply an operand is
1667            higher than the benefit of not having to specify a zero.  */
1668         ;
1669       else if (n_operands == 1 && exp[0].X_op != O_register)
1670         {
1671           if (exp[0].X_op == O_constant)
1672             {
1673               if (exp[0].X_add_number > 255*255*255
1674                   || exp[0].X_add_number < 0)
1675                 {
1676                   as_bad (_("invalid operands to opcode %s: `%s'"),
1677                           instruction->name, operands);
1678                   return;
1679                 }
1680               else
1681                 {
1682                   opcodep[1] = (exp[0].X_add_number >> 16) & 255;
1683                   opcodep[2] = (exp[0].X_add_number >> 8) & 255;
1684                   opcodep[3] = exp[0].X_add_number & 255;
1685                 }
1686             }
1687           else
1688             fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 1,
1689                          3, exp, 0, BFD_RELOC_24);
1690         }
1691       else if (n_operands == 2
1692                && exp[0].X_op != O_register
1693                && exp[1].X_op != O_register)
1694         {
1695           /* Two operands.  */
1696
1697           if (exp[0].X_op == O_constant)
1698             {
1699               if (exp[0].X_add_number > 255
1700                   || exp[0].X_add_number < 0)
1701                 {
1702                   as_bad (_("invalid operands to opcode %s: `%s'"),
1703                           instruction->name, operands);
1704                   return;
1705                 }
1706               else
1707                 opcodep[1] = exp[0].X_add_number & 255;
1708             }
1709           else
1710             fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 1,
1711                          1, exp, 0, BFD_RELOC_8);
1712
1713           if (exp[1].X_op == O_constant)
1714             {
1715               if (exp[1].X_add_number > 255*255
1716                   || exp[1].X_add_number < 0)
1717                 {
1718                   as_bad (_("invalid operands to opcode %s: `%s'"),
1719                           instruction->name, operands);
1720                   return;
1721                 }
1722               else
1723                 {
1724                   opcodep[2] = (exp[1].X_add_number >> 8) & 255;
1725                   opcodep[3] = exp[1].X_add_number & 255;
1726                 }
1727             }
1728           else
1729             fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 2,
1730                          2, exp + 1, 0, BFD_RELOC_16);
1731         }
1732       else if (n_operands == 3
1733                && exp[0].X_op != O_register
1734                && exp[1].X_op != O_register
1735                && exp[2].X_op != O_register)
1736         {
1737           /* Three operands.  */
1738
1739           if (exp[0].X_op == O_constant)
1740             {
1741               if (exp[0].X_add_number > 255
1742                   || exp[0].X_add_number < 0)
1743                 {
1744                   as_bad (_("invalid operands to opcode %s: `%s'"),
1745                           instruction->name, operands);
1746                   return;
1747                 }
1748               else
1749                 opcodep[1] = exp[0].X_add_number & 255;
1750             }
1751           else
1752             fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 1,
1753                          1, exp, 0, BFD_RELOC_8);
1754
1755           if (exp[1].X_op == O_constant)
1756             {
1757               if (exp[1].X_add_number > 255
1758                   || exp[1].X_add_number < 0)
1759                 {
1760                   as_bad (_("invalid operands to opcode %s: `%s'"),
1761                           instruction->name, operands);
1762                   return;
1763                 }
1764               else
1765                 opcodep[2] = exp[1].X_add_number & 255;
1766             }
1767           else
1768             fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 2,
1769                          1, exp + 1, 0, BFD_RELOC_8);
1770
1771           if (exp[2].X_op == O_constant)
1772             {
1773               if (exp[2].X_add_number > 255
1774                   || exp[2].X_add_number < 0)
1775                 {
1776                   as_bad (_("invalid operands to opcode %s: `%s'"),
1777                           instruction->name, operands);
1778                   return;
1779                 }
1780               else
1781                 opcodep[3] = exp[2].X_add_number & 255;
1782             }
1783           else
1784             fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3,
1785                          1, exp + 2, 0, BFD_RELOC_8);
1786         }
1787       else if (n_operands <= 3
1788                && (strcmp (instruction->name, "trip") == 0
1789                    || strcmp (instruction->name, "trap") == 0))
1790         {
1791           /* The meaning of operands to TRIP and TRAP are not defined, so
1792              we add combinations not handled above here as we find them.  */
1793           if (n_operands == 3)
1794             {
1795               /* Don't require non-register operands.  Always generate
1796                  fixups, so we don't have to copy lots of code and create
1797                  maintanance problems.  TRIP is supposed to be a rare
1798                  instruction, so the overhead should not matter.  We
1799                  aren't allowed to fix_new_exp for an expression which is
1800                  an  O_register at this point, however.  */
1801               if (exp[0].X_op == O_register)
1802                 opcodep[1] = exp[0].X_add_number;
1803               else
1804                 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 1,
1805                              1, exp, 0, BFD_RELOC_MMIX_REG_OR_BYTE);
1806               if (exp[1].X_op == O_register)
1807                 opcodep[2] = exp[1].X_add_number;
1808               else
1809                 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 2,
1810                              1, exp + 1, 0, BFD_RELOC_MMIX_REG_OR_BYTE);
1811               if (exp[2].X_op == O_register)
1812                 opcodep[3] = exp[2].X_add_number;
1813               else
1814                 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3,
1815                              1, exp + 2, 0, BFD_RELOC_MMIX_REG_OR_BYTE);
1816             }
1817           else if (n_operands == 2)
1818             {
1819               if (exp[0].X_op == O_register)
1820                 opcodep[2] = exp[0].X_add_number;
1821               else
1822                 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 2,
1823                              1, exp, 0, BFD_RELOC_MMIX_REG_OR_BYTE);
1824               if (exp[1].X_op == O_register)
1825                 opcodep[3] = exp[1].X_add_number;
1826               else
1827                 fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3,
1828                              1, exp + 1, 0, BFD_RELOC_MMIX_REG_OR_BYTE);
1829             }
1830           else
1831             {
1832               as_bad (_("unsupported operands to %s: `%s'"),
1833                       instruction->name, operands);
1834               return;
1835             }
1836         }
1837       else
1838         {
1839           as_bad (_("invalid operands to opcode %s: `%s'"),
1840                   instruction->name, operands);
1841           return;
1842         }
1843       break;
1844
1845     case mmix_operands_resume:
1846       if (n_operands == 0 && ! mmix_gnu_syntax)
1847         break;
1848
1849       if (n_operands != 1
1850           || exp[0].X_op == O_register
1851           || (exp[0].X_op == O_constant
1852               && (exp[0].X_add_number < 0
1853                   || exp[0].X_add_number > 255)))
1854         {
1855           as_bad (_("invalid operands to opcode %s: `%s'"),
1856                   instruction->name, operands);
1857           return;
1858         }
1859
1860       if (exp[0].X_op == O_constant)
1861         opcodep[3] = exp[0].X_add_number;
1862       else
1863         fix_new_exp (opc_fragP, opcodep - opc_fragP->fr_literal + 3,
1864                      1, exp + 0, 0, BFD_RELOC_8);
1865       break;
1866
1867     case mmix_operands_pushj:
1868       /* All is done for PUSHJ already.  */
1869       break;
1870
1871     default:
1872       BAD_CASE (instruction->operands);
1873     }
1874 }
1875
1876 /* For the benefit of insns that start with a digit, we assemble by way of
1877    tc_unrecognized_line too, through this function.  */
1878
1879 int
1880 mmix_assemble_return_nonzero (str)
1881      char *str;
1882 {
1883   int last_error_count = had_errors ();
1884   char *s2 = str;
1885   char c;
1886
1887   /* Normal instruction handling downcases, so we must too.  */
1888   while (ISALNUM (*s2))
1889     {
1890       if (ISUPPER ((unsigned char) *s2))
1891         *s2 = TOLOWER (*s2);
1892       s2++;
1893     }
1894
1895   /* Cut the line for sake of the assembly.  */
1896   for (s2 = str; *s2 && *s2 != '\n'; s2++)
1897     ;
1898
1899   c = *s2;
1900   *s2 = 0;
1901   md_assemble (str);
1902   *s2 = c;
1903
1904   return had_errors () == last_error_count;
1905 }
1906
1907 /* The PREFIX pseudo.  */
1908
1909 static void
1910 s_prefix (unused)
1911      int unused ATTRIBUTE_UNUSED;
1912 {
1913   char *p;
1914   int c;
1915
1916   SKIP_WHITESPACE ();
1917
1918   p = input_line_pointer;
1919
1920   c = get_symbol_end ();
1921
1922   /* Reseting prefix?  */
1923   if (*p == ':' && p[1] == 0)
1924     mmix_current_prefix = NULL;
1925   else
1926     {
1927       /* Put this prefix on the mmix symbols obstack.  We could malloc and
1928          free it separately, but then we'd have to worry about that.
1929          People using up memory on prefixes have other problems.  */
1930       obstack_grow (&mmix_sym_obstack, p, strlen (p) + 1);
1931       p = obstack_finish (&mmix_sym_obstack);
1932
1933       /* Accumulate prefixes, and strip a leading ':'.  */
1934       if (mmix_current_prefix != NULL || *p == ':')
1935         p = mmix_prefix_name (p);
1936
1937       mmix_current_prefix = p;
1938     }
1939
1940   *input_line_pointer = c;
1941
1942   mmix_handle_rest_of_empty_line ();
1943 }
1944
1945 /* We implement prefixes by using the tc_canonicalize_symbol_name hook,
1946    and store each prefixed name on a (separate) obstack.  This means that
1947    the name is on the "notes" obstack in non-prefixed form and on the
1948    mmix_sym_obstack in prefixed form, but currently it is not worth
1949    rewriting the whole GAS symbol handling to improve "hooking" to avoid
1950    that.  (It might be worth a rewrite for other reasons, though).  */
1951
1952 char *
1953 mmix_prefix_name (shortname)
1954      char *shortname;
1955 {
1956   if (*shortname == ':')
1957     return shortname + 1;
1958
1959   if (mmix_current_prefix == NULL)
1960     as_fatal (_("internal: mmix_prefix_name but empty prefix"));
1961
1962   if (*shortname == '$')
1963     return shortname;
1964
1965   obstack_grow (&mmix_sym_obstack, mmix_current_prefix,
1966                 strlen (mmix_current_prefix));
1967   obstack_grow (&mmix_sym_obstack, shortname, strlen (shortname) + 1);
1968   return obstack_finish (&mmix_sym_obstack);
1969 }
1970
1971 /* The GREG pseudo.  At LABEL, we have the name of a symbol that we
1972    want to make a register symbol, and which should be initialized with
1973    the value in the expression at INPUT_LINE_POINTER (defaulting to 0).
1974    Either and (perhaps less meaningful) both may be missing.  LABEL must
1975    be persistent, perhaps allocated on an obstack.  */
1976
1977 static void
1978 mmix_greg_internal (label)
1979      char *label;
1980 {
1981   expressionS *expP = &mmix_raw_gregs[n_of_raw_gregs].exp;
1982
1983   /* Don't set the section to register contents section before the
1984      expression has been parsed; it may refer to the current position.  */
1985   expression (expP);
1986
1987   /* FIXME: Check that no expression refers to the register contents
1988      section.  May need to be done in elf64-mmix.c.  */
1989   if (expP->X_op == O_absent)
1990     {
1991       /* Default to zero if the expression was absent.  */
1992       expP->X_op = O_constant;
1993       expP->X_add_number = 0;
1994       expP->X_unsigned = 0;
1995       expP->X_add_symbol = NULL;
1996       expP->X_op_symbol = NULL;
1997     }
1998
1999   /* We must handle prefixes here, as we save the labels and expressions
2000      to be output later.  */
2001   mmix_raw_gregs[n_of_raw_gregs].label
2002     = mmix_current_prefix == NULL ? label : mmix_prefix_name (label);
2003
2004   if (n_of_raw_gregs == MAX_GREGS - 1)
2005     as_bad (_("too many GREG registers allocated (max %d)"), MAX_GREGS);
2006   else
2007     n_of_raw_gregs++;
2008
2009   mmix_handle_rest_of_empty_line ();
2010 }
2011
2012 /* The ".greg label,expr" worker.  */
2013
2014 static void
2015 s_greg (unused)
2016      int unused ATTRIBUTE_UNUSED;
2017 {
2018   char *p;
2019   char c;
2020   p = input_line_pointer;
2021
2022   /* This will skip over what can be a symbol and zero out the next
2023      character, which we assume is a ',' or other meaningful delimiter.
2024      What comes after that is the initializer expression for the
2025      register.  */
2026   c = get_symbol_end ();
2027
2028   if (! is_end_of_line[(unsigned char) c])
2029     input_line_pointer++;
2030
2031   if (*p)
2032     {
2033       /* The label must be persistent; it's not used until after all input
2034          has been seen.  */
2035       obstack_grow (&mmix_sym_obstack, p, strlen (p) + 1);
2036       mmix_greg_internal (obstack_finish (&mmix_sym_obstack));
2037     }
2038   else
2039     mmix_greg_internal (NULL);
2040 }
2041
2042 /* The "BSPEC expr" worker.  */
2043
2044 static void
2045 s_bspec (unused)
2046      int unused ATTRIBUTE_UNUSED;
2047 {
2048   asection *expsec;
2049   asection *sec;
2050   char secname[sizeof (MMIX_OTHER_SPEC_SECTION_PREFIX) + 20]
2051     = MMIX_OTHER_SPEC_SECTION_PREFIX;
2052   expressionS exp;
2053   int n;
2054
2055   /* Get a constant expression which we can evaluate *now*.  Supporting
2056      more complex (though assembly-time computable) expressions is
2057      feasible but Too Much Work for something of unknown usefulness like
2058      BSPEC-ESPEC.  */
2059   expsec = expression (&exp);
2060   mmix_handle_rest_of_empty_line ();
2061
2062   /* Check that we don't have another BSPEC in progress.  */
2063   if (doing_bspec)
2064     {
2065       as_bad (_("BSPEC already active.  Nesting is not supported."));
2066       return;
2067     }
2068
2069   if (exp.X_op != O_constant
2070       || expsec != absolute_section
2071       || exp.X_add_number < 0
2072       || exp.X_add_number > 65535)
2073     {
2074       as_bad (_("invalid BSPEC expression"));
2075       exp.X_add_number = 0;
2076     }
2077
2078   n = (int) exp.X_add_number;
2079
2080   sprintf (secname + strlen (MMIX_OTHER_SPEC_SECTION_PREFIX), "%d", n);
2081   sec = bfd_get_section_by_name (stdoutput, secname);
2082   if (sec == NULL)
2083     {
2084       /* We need a non-volatile name as it will be stored in the section
2085          struct.  */
2086       char *newsecname = xstrdup (secname);
2087       sec = bfd_make_section (stdoutput, newsecname);
2088
2089       if (sec == NULL)
2090         as_fatal (_("can't create section %s"), newsecname);
2091
2092       if (!bfd_set_section_flags (stdoutput, sec,
2093                                   bfd_get_section_flags (stdoutput, sec)
2094                                   | SEC_READONLY))
2095         as_fatal (_("can't set section flags for section %s"), newsecname);
2096     }
2097
2098   /* Tell ELF about the pending section change.  */
2099   obj_elf_section_change_hook ();
2100   subseg_set (sec, 0);
2101
2102   /* Save position for missing ESPEC.  */
2103   as_where (&bspec_file, &bspec_line);
2104
2105   doing_bspec = 1;
2106 }
2107
2108 /* The "ESPEC" worker.  */
2109
2110 static void
2111 s_espec (unused)
2112      int unused ATTRIBUTE_UNUSED;
2113 {
2114   /* First, check that we *do* have a BSPEC in progress.  */
2115   if (! doing_bspec)
2116     {
2117       as_bad (_("ESPEC without preceding BSPEC"));
2118       return;
2119     }
2120
2121   mmix_handle_rest_of_empty_line ();
2122   doing_bspec = 0;
2123
2124   /* When we told ELF about the section change in s_bspec, it stored the
2125      previous section for us so we can get at it with the equivalent of a
2126      .previous pseudo.  */
2127   obj_elf_previous (0);
2128 }
2129
2130 /* The " .local expr" and " local expr" worker.  We make a BFD_MMIX_LOCAL
2131    relocation against the current position against the expression.
2132    Implementing this by means of contents in a section lost.  */
2133
2134 static void
2135 mmix_s_local (unused)
2136      int unused ATTRIBUTE_UNUSED;
2137 {
2138   expressionS exp;
2139
2140   /* Don't set the section to register contents section before the
2141      expression has been parsed; it may refer to the current position in
2142      some contorted way.  */
2143   expression (&exp);
2144
2145   if (exp.X_op == O_absent)
2146     {
2147       as_bad (_("missing local expression"));
2148       return;
2149     }
2150   else if (exp.X_op == O_register)
2151     {
2152       /* fix_new_exp doesn't like O_register.  Should be configurable.
2153          We're fine with a constant here, though.  */
2154       exp.X_op = O_constant;
2155     }
2156
2157   fix_new_exp (frag_now, 0, 0, &exp, 0, BFD_RELOC_MMIX_LOCAL);
2158   mmix_handle_rest_of_empty_line ();
2159 }
2160
2161 /* Set fragP->fr_var to the initial guess of the size of a relaxable insn
2162    and return it.  Sizes of other instructions are not known.  This
2163    function may be called multiple times.  */
2164
2165 int
2166 md_estimate_size_before_relax (fragP, segment)
2167      fragS *fragP;
2168      segT    segment;
2169 {
2170   int length;
2171
2172 #define HANDLE_RELAXABLE(state)                                         \
2173  case ENCODE_RELAX (state, STATE_UNDF):                                 \
2174    if (fragP->fr_symbol != NULL                                         \
2175        && S_GET_SEGMENT (fragP->fr_symbol) == segment                   \
2176        && !S_IS_WEAK (fragP->fr_symbol))                                \
2177      {                                                                  \
2178        /* The symbol lies in the same segment - a relaxable case.  */   \
2179        fragP->fr_subtype                                                \
2180          = ENCODE_RELAX (state, STATE_ZERO);                            \
2181      }                                                                  \
2182    break;
2183
2184   switch (fragP->fr_subtype)
2185     {
2186       HANDLE_RELAXABLE (STATE_GETA);
2187       HANDLE_RELAXABLE (STATE_BCC);
2188       HANDLE_RELAXABLE (STATE_PUSHJ);
2189       HANDLE_RELAXABLE (STATE_JMP);
2190
2191     case ENCODE_RELAX (STATE_GETA, STATE_ZERO):
2192     case ENCODE_RELAX (STATE_BCC, STATE_ZERO):
2193     case ENCODE_RELAX (STATE_PUSHJ, STATE_ZERO):
2194     case ENCODE_RELAX (STATE_JMP, STATE_ZERO):
2195       /* When relaxing a section for the second time, we don't need to do
2196          anything except making sure that fr_var is set right.  */
2197       break;
2198
2199     case STATE_GREG_DEF:
2200       length = fragP->tc_frag_data != NULL ? 0 : 8;
2201       fragP->fr_var = length;
2202
2203       /* Don't consult the relax_table; it isn't valid for this
2204          relaxation.  */
2205       return length;
2206       break;
2207
2208     default:
2209       BAD_CASE (fragP->fr_subtype);
2210     }
2211
2212   length = mmix_relax_table[fragP->fr_subtype].rlx_length;
2213   fragP->fr_var = length;
2214
2215   return length;
2216 }
2217
2218 /* Turn a string in input_line_pointer into a floating point constant of type
2219    type, and store the appropriate bytes in *litP.  The number of LITTLENUMS
2220    emitted is stored in *sizeP .  An error message is returned, or NULL on
2221    OK.  */
2222
2223 char *
2224 md_atof (type, litP, sizeP)
2225      int type;
2226      char *litP;
2227      int *sizeP;
2228 {
2229   int prec;
2230   LITTLENUM_TYPE words[4];
2231   char *t;
2232   int i;
2233
2234   switch (type)
2235     {
2236       /* FIXME: Having 'f' in mmix_flt_chars (and here) makes it
2237          problematic to also have a forward reference in an expression.
2238          The testsuite wants it, and it's customary.
2239          We'll deal with the real problems when they come; we share the
2240          problem with most other ports.  */
2241     case 'f':
2242     case 'r':
2243       prec = 2;
2244       break;
2245     case 'd':
2246       prec = 4;
2247       break;
2248     default:
2249       *sizeP = 0;
2250       return _("bad call to md_atof");
2251     }
2252
2253   t = atof_ieee (input_line_pointer, type, words);
2254   if (t)
2255     input_line_pointer = t;
2256
2257   *sizeP = prec * 2;
2258
2259   for (i = 0; i < prec; i++)
2260     {
2261       md_number_to_chars (litP, (valueT) words[i], 2);
2262       litP += 2;
2263     }
2264   return NULL;
2265 }
2266
2267 /* Convert variable-sized frags into one or more fixups.  */
2268
2269 void
2270 md_convert_frag (abfd, sec, fragP)
2271      bfd *abfd ATTRIBUTE_UNUSED;
2272      segT sec ATTRIBUTE_UNUSED;
2273      fragS *fragP;
2274 {
2275   /* Pointer to first byte in variable-sized part of the frag.  */
2276   char *var_partp;
2277
2278   /* Pointer to first opcode byte in frag.  */
2279   char *opcodep;
2280
2281   /* Size in bytes of variable-sized part of frag.  */
2282   int var_part_size = 0;
2283
2284   /* This is part of *fragP.  It contains all information about addresses
2285      and offsets to varying parts.  */
2286   symbolS *symbolP;
2287   unsigned long var_part_offset;
2288
2289   /* This is the frag for the opcode.  It, rather than fragP, must be used
2290      when emitting a frag for the opcode.  */
2291   fragS *opc_fragP = fragP->tc_frag_data;
2292   fixS *tmpfixP;
2293
2294   /* Where, in file space, does addr point?  */
2295   bfd_vma target_address;
2296   bfd_vma opcode_address;
2297
2298   know (fragP->fr_type == rs_machine_dependent);
2299
2300   var_part_offset = fragP->fr_fix;
2301   var_partp = fragP->fr_literal + var_part_offset;
2302   opcodep = fragP->fr_opcode;
2303
2304   symbolP = fragP->fr_symbol;
2305
2306   target_address
2307     = ((symbolP ? S_GET_VALUE (symbolP) : 0) + fragP->fr_offset);
2308
2309   /* The opcode that would be extended is the last four "fixed" bytes.  */
2310   opcode_address = fragP->fr_address + fragP->fr_fix - 4;
2311
2312   switch (fragP->fr_subtype)
2313     {
2314     case ENCODE_RELAX (STATE_GETA, STATE_ZERO):
2315     case ENCODE_RELAX (STATE_BCC, STATE_ZERO):
2316     case ENCODE_RELAX (STATE_PUSHJ, STATE_ZERO):
2317       mmix_set_geta_branch_offset (opcodep, target_address - opcode_address);
2318       if (linkrelax)
2319         {
2320           tmpfixP
2321             = fix_new (opc_fragP, opcodep - opc_fragP->fr_literal, 4,
2322                        fragP->fr_symbol, fragP->fr_offset, 1,
2323                        BFD_RELOC_MMIX_ADDR19);
2324           COPY_FR_WHERE_TO_FX (fragP, tmpfixP);
2325         }
2326       var_part_size = 0;
2327       break;
2328
2329     case ENCODE_RELAX (STATE_JMP, STATE_ZERO):
2330       mmix_set_jmp_offset (opcodep, target_address - opcode_address);
2331       if (linkrelax)
2332         {
2333           tmpfixP
2334             = fix_new (opc_fragP, opcodep - opc_fragP->fr_literal, 4,
2335                        fragP->fr_symbol, fragP->fr_offset, 1,
2336                        BFD_RELOC_MMIX_ADDR27);
2337           COPY_FR_WHERE_TO_FX (fragP, tmpfixP);
2338         }
2339       var_part_size = 0;
2340       break;
2341
2342     case STATE_GREG_DEF:
2343       if (fragP->tc_frag_data == NULL)
2344         {
2345           /* We must initialize data that's supposed to be "fixed up" to
2346              avoid emitting garbage, because md_apply_fix3 won't do
2347              anything for undefined symbols.  */
2348           md_number_to_chars (var_partp, 0, 8);
2349           tmpfixP
2350             = fix_new (fragP, var_partp - fragP->fr_literal, 8,
2351                        fragP->fr_symbol, fragP->fr_offset, 0, BFD_RELOC_64);
2352           COPY_FR_WHERE_TO_FX (fragP, tmpfixP);
2353           mmix_gregs[n_of_cooked_gregs++] = tmpfixP;
2354           var_part_size = 8;
2355         }
2356       else
2357         var_part_size = 0;
2358       break;
2359
2360 #define HANDLE_MAX_RELOC(state, reloc)                                  \
2361   case ENCODE_RELAX (state, STATE_MAX):                                 \
2362     var_part_size                                                       \
2363       = mmix_relax_table[ENCODE_RELAX (state, STATE_MAX)].rlx_length;   \
2364     mmix_fill_nops (var_partp, var_part_size / 4);                      \
2365     if (warn_on_expansion)                                              \
2366       as_warn_where (fragP->fr_file, fragP->fr_line,                    \
2367                      _("operand out of range, instruction expanded"));  \
2368     tmpfixP = fix_new (fragP, var_partp - fragP->fr_literal - 4, 8,     \
2369                        fragP->fr_symbol, fragP->fr_offset, 1, reloc);   \
2370     COPY_FR_WHERE_TO_FX (fragP, tmpfixP);                               \
2371     break
2372
2373       HANDLE_MAX_RELOC (STATE_GETA, BFD_RELOC_MMIX_GETA);
2374       HANDLE_MAX_RELOC (STATE_BCC, BFD_RELOC_MMIX_CBRANCH);
2375       HANDLE_MAX_RELOC (STATE_PUSHJ, BFD_RELOC_MMIX_PUSHJ);
2376       HANDLE_MAX_RELOC (STATE_JMP, BFD_RELOC_MMIX_JMP);
2377
2378     default:
2379       BAD_CASE (fragP->fr_subtype);
2380       break;
2381     }
2382
2383   fragP->fr_fix += var_part_size;
2384   fragP->fr_var = 0;
2385 }
2386
2387 /* Applies the desired value to the specified location.
2388    Also sets up addends for RELA type relocations.
2389    Stolen from tc-mcore.c.
2390
2391    Note that this function isn't called when linkrelax != 0.  */
2392
2393 void
2394 md_apply_fix3 (fixP, valP, segment)
2395      fixS *   fixP;
2396      valueT * valP;
2397      segT     segment;
2398 {
2399   char *buf  = fixP->fx_where + fixP->fx_frag->fr_literal;
2400   /* Note: use offsetT because it is signed, valueT is unsigned.  */
2401   offsetT val  = (offsetT) * valP;
2402   segT symsec
2403     = (fixP->fx_addsy == NULL
2404        ? absolute_section : S_GET_SEGMENT (fixP->fx_addsy));
2405
2406   /* If the fix is relative to a symbol which is not defined, or, (if
2407      pcrel), not in the same segment as the fix, we cannot resolve it
2408      here.  */
2409   if (fixP->fx_addsy != NULL
2410       && (! S_IS_DEFINED (fixP->fx_addsy)
2411           || S_IS_WEAK (fixP->fx_addsy)
2412           || (fixP->fx_pcrel && symsec != segment)
2413           || (! fixP->fx_pcrel
2414               && symsec != absolute_section
2415               && ((fixP->fx_r_type != BFD_RELOC_MMIX_REG
2416                    && fixP->fx_r_type != BFD_RELOC_MMIX_REG_OR_BYTE)
2417                   || symsec != reg_section))))
2418     {
2419       fixP->fx_done = 0;
2420       return;
2421     }
2422   else if (fixP->fx_r_type == BFD_RELOC_MMIX_LOCAL
2423            || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
2424            || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
2425     {
2426       /* These are never "fixed".  */
2427       fixP->fx_done = 0;
2428       return;
2429     }
2430   else
2431     /* We assume every other relocation is "fixed".  */
2432     fixP->fx_done = 1;
2433
2434   switch (fixP->fx_r_type)
2435     {
2436     case BFD_RELOC_64:
2437     case BFD_RELOC_32:
2438     case BFD_RELOC_24:
2439     case BFD_RELOC_16:
2440     case BFD_RELOC_8:
2441     case BFD_RELOC_64_PCREL:
2442     case BFD_RELOC_32_PCREL:
2443     case BFD_RELOC_24_PCREL:
2444     case BFD_RELOC_16_PCREL:
2445     case BFD_RELOC_8_PCREL:
2446       md_number_to_chars (buf, val, fixP->fx_size);
2447       break;
2448
2449     case BFD_RELOC_MMIX_ADDR19:
2450       if (expand_op)
2451         {
2452           /* This shouldn't happen.  */
2453           BAD_CASE (fixP->fx_r_type);
2454           break;
2455         }
2456       /* FALLTHROUGH.  */
2457     case BFD_RELOC_MMIX_GETA:
2458     case BFD_RELOC_MMIX_CBRANCH:
2459     case BFD_RELOC_MMIX_PUSHJ:
2460       /* If this fixup is out of range, punt to the linker to emit an
2461          error.  This should only happen with -no-expand.  */
2462       if (val < -(((offsetT) 1 << 19)/2)
2463           || val >= ((offsetT) 1 << 19)/2 - 1
2464           || (val & 3) != 0)
2465         {
2466           if (warn_on_expansion)
2467             as_warn_where (fixP->fx_file, fixP->fx_line,
2468                            _("operand out of range"));
2469           fixP->fx_done = 0;
2470           val = 0;
2471         }
2472       mmix_set_geta_branch_offset (buf, val);
2473       break;
2474
2475     case BFD_RELOC_MMIX_ADDR27:
2476       if (expand_op)
2477         {
2478           /* This shouldn't happen.  */
2479           BAD_CASE (fixP->fx_r_type);
2480           break;
2481         }
2482       /* FALLTHROUGH.  */
2483     case BFD_RELOC_MMIX_JMP:
2484       /* If this fixup is out of range, punt to the linker to emit an
2485          error.  This should only happen with -no-expand.  */
2486       if (val < -(((offsetT) 1 << 27)/2)
2487           || val >= ((offsetT) 1 << 27)/2 - 1
2488           || (val & 3) != 0)
2489         {
2490           if (warn_on_expansion)
2491             as_warn_where (fixP->fx_file, fixP->fx_line,
2492                            _("operand out of range"));
2493           fixP->fx_done = 0;
2494           val = 0;
2495         }
2496       mmix_set_jmp_offset (buf, val);
2497       break;
2498
2499     case BFD_RELOC_MMIX_REG_OR_BYTE:
2500       if (fixP->fx_addsy != NULL
2501           && (S_GET_SEGMENT (fixP->fx_addsy) != reg_section
2502               || S_GET_VALUE (fixP->fx_addsy) > 255)
2503           && S_GET_SEGMENT (fixP->fx_addsy) != absolute_section)
2504         {
2505           as_bad_where (fixP->fx_file, fixP->fx_line,
2506                         _("invalid operands"));
2507           /* We don't want this "symbol" appearing in output, because
2508              that will fail.  */
2509           fixP->fx_done = 1;
2510         }
2511
2512       buf[0] = val;
2513
2514       /* If this reloc is for a Z field, we need to adjust
2515          the opcode if we got a constant here.
2516          FIXME: Can we make this more robust?  */
2517
2518       if ((fixP->fx_where & 3) == 3
2519           && (fixP->fx_addsy == NULL
2520               || S_GET_SEGMENT (fixP->fx_addsy) == absolute_section))
2521         buf[-3] |= IMM_OFFSET_BIT;
2522       break;
2523
2524     case BFD_RELOC_MMIX_REG:
2525       if (fixP->fx_addsy == NULL
2526           || S_GET_SEGMENT (fixP->fx_addsy) != reg_section
2527           || S_GET_VALUE (fixP->fx_addsy) > 255)
2528         {
2529           as_bad_where (fixP->fx_file, fixP->fx_line,
2530                         _("invalid operands"));
2531           fixP->fx_done = 1;
2532         }
2533
2534       *buf = val;
2535       break;
2536
2537     case BFD_RELOC_MMIX_BASE_PLUS_OFFSET:
2538       /* These are never "fixed".  */
2539       fixP->fx_done = 0;
2540       return;
2541
2542     case BFD_RELOC_MMIX_PUSHJ_1:
2543     case BFD_RELOC_MMIX_PUSHJ_2:
2544     case BFD_RELOC_MMIX_PUSHJ_3:
2545     case BFD_RELOC_MMIX_CBRANCH_J:
2546     case BFD_RELOC_MMIX_CBRANCH_1:
2547     case BFD_RELOC_MMIX_CBRANCH_2:
2548     case BFD_RELOC_MMIX_CBRANCH_3:
2549     case BFD_RELOC_MMIX_GETA_1:
2550     case BFD_RELOC_MMIX_GETA_2:
2551     case BFD_RELOC_MMIX_GETA_3:
2552     case BFD_RELOC_MMIX_JMP_1:
2553     case BFD_RELOC_MMIX_JMP_2:
2554     case BFD_RELOC_MMIX_JMP_3:
2555     default:
2556       BAD_CASE (fixP->fx_r_type);
2557       break;
2558     }
2559
2560   if (fixP->fx_done)
2561     /* Make sure that for completed fixups we have the value around for
2562        use by e.g. mmix_frob_file.  */
2563     fixP->fx_offset = val;
2564 }
2565
2566 /* A bsearch function for looking up a value against offsets for GREG
2567    definitions.  */
2568
2569 static int
2570 cmp_greg_val_greg_symbol_fixes (p1, p2)
2571      const PTR p1;
2572      const PTR p2;
2573 {
2574   offsetT val1 = *(offsetT *) p1;
2575   offsetT val2 = ((struct mmix_symbol_greg_fixes *) p2)->offs;
2576
2577   if (val1 >= val2 && val1 < val2 + 255)
2578     return 0;
2579
2580   if (val1 > val2)
2581     return 1;
2582
2583   return -1;
2584 }
2585
2586 /* Generate a machine-dependent relocation.  */
2587
2588 arelent *
2589 tc_gen_reloc (section, fixP)
2590      asection *section ATTRIBUTE_UNUSED;
2591      fixS *fixP;
2592 {
2593   bfd_signed_vma val
2594     = fixP->fx_offset
2595     + (fixP->fx_addsy != NULL
2596        && !S_IS_WEAK (fixP->fx_addsy)
2597        && !S_IS_COMMON (fixP->fx_addsy)
2598        ? S_GET_VALUE (fixP->fx_addsy) : 0);
2599   arelent *relP;
2600   bfd_reloc_code_real_type code = BFD_RELOC_NONE;
2601   char *buf  = fixP->fx_where + fixP->fx_frag->fr_literal;
2602   symbolS *addsy = fixP->fx_addsy;
2603   asection *addsec = addsy == NULL ? NULL : S_GET_SEGMENT (addsy);
2604   asymbol *baddsy = addsy != NULL ? symbol_get_bfdsym (addsy) : NULL;
2605   bfd_vma addend
2606     = val - (baddsy == NULL || S_IS_COMMON (addsy) || S_IS_WEAK (addsy)
2607              ? 0 : bfd_asymbol_value (baddsy));
2608
2609   /* A single " LOCAL expression" in the wrong section will not work when
2610      linking to MMO; relocations for zero-content sections are then
2611      ignored.  Normally, relocations would modify section contents, and
2612      you'd never think or be able to do something like that.  The
2613      relocation resulting from a LOCAL directive doesn't have an obvious
2614      and mandatory location.  I can't figure out a way to do this better
2615      than just helping the user around this limitation here; hopefully the
2616      code using the local expression is around.  Putting the LOCAL
2617      semantics in a relocation still seems right; a section didn't do.  */
2618   if (bfd_section_size (section->owner, section) == 0)
2619     as_bad_where
2620       (fixP->fx_file, fixP->fx_line,
2621        fixP->fx_r_type == BFD_RELOC_MMIX_LOCAL
2622        /* The BFD_RELOC_MMIX_LOCAL-specific message is supposed to be
2623           user-friendly, though a little bit non-substantial.  */
2624        ? _("directive LOCAL must be placed in code or data")
2625        : _("internal confusion: relocation in a section without contents"));
2626
2627   /* FIXME: Range tests for all these.  */
2628   switch (fixP->fx_r_type)
2629     {
2630     case BFD_RELOC_64:
2631     case BFD_RELOC_32:
2632     case BFD_RELOC_24:
2633     case BFD_RELOC_16:
2634     case BFD_RELOC_8:
2635       code = fixP->fx_r_type;
2636
2637       if (addsy == NULL || bfd_is_abs_section (addsec))
2638         {
2639           /* Resolve this reloc now, as md_apply_fix3 would have done (not
2640              called if -linkrelax).  There is no point in keeping a reloc
2641              to an absolute symbol.  No reloc that is subject to
2642              relaxation must be to an absolute symbol; difference
2643              involving symbols in a specific section must be signalled as
2644              an error if the relaxing cannot be expressed; having a reloc
2645              to the resolved (now absolute) value does not help.  */
2646           md_number_to_chars (buf, val, fixP->fx_size);
2647           return NULL;
2648         }
2649       break;
2650
2651     case BFD_RELOC_64_PCREL:
2652     case BFD_RELOC_32_PCREL:
2653     case BFD_RELOC_24_PCREL:
2654     case BFD_RELOC_16_PCREL:
2655     case BFD_RELOC_8_PCREL:
2656     case BFD_RELOC_MMIX_LOCAL:
2657     case BFD_RELOC_VTABLE_INHERIT:
2658     case BFD_RELOC_VTABLE_ENTRY:
2659     case BFD_RELOC_MMIX_GETA:
2660     case BFD_RELOC_MMIX_GETA_1:
2661     case BFD_RELOC_MMIX_GETA_2:
2662     case BFD_RELOC_MMIX_GETA_3:
2663     case BFD_RELOC_MMIX_CBRANCH:
2664     case BFD_RELOC_MMIX_CBRANCH_J:
2665     case BFD_RELOC_MMIX_CBRANCH_1:
2666     case BFD_RELOC_MMIX_CBRANCH_2:
2667     case BFD_RELOC_MMIX_CBRANCH_3:
2668     case BFD_RELOC_MMIX_PUSHJ:
2669     case BFD_RELOC_MMIX_PUSHJ_1:
2670     case BFD_RELOC_MMIX_PUSHJ_2:
2671     case BFD_RELOC_MMIX_PUSHJ_3:
2672     case BFD_RELOC_MMIX_JMP:
2673     case BFD_RELOC_MMIX_JMP_1:
2674     case BFD_RELOC_MMIX_JMP_2:
2675     case BFD_RELOC_MMIX_JMP_3:
2676     case BFD_RELOC_MMIX_ADDR19:
2677     case BFD_RELOC_MMIX_ADDR27:
2678       code = fixP->fx_r_type;
2679       break;
2680
2681     case BFD_RELOC_MMIX_REG_OR_BYTE:
2682       /* If we have this kind of relocation to an unknown symbol or to the
2683          register contents section (that is, to a register), then we can't
2684          resolve the relocation here.  */
2685       if (addsy != NULL
2686           && (bfd_is_und_section (addsec)
2687               || strcmp (bfd_get_section_name (addsec->owner, addsec),
2688                          MMIX_REG_CONTENTS_SECTION_NAME) == 0))
2689         {
2690           code = fixP->fx_r_type;
2691           break;
2692         }
2693
2694       /* If the relocation is not to the register section or to the
2695          absolute section (a numeric value), then we have an error.  */
2696       if (addsy != NULL
2697           && (S_GET_SEGMENT (addsy) != real_reg_section
2698               || val > 255
2699               || val < 0)
2700           && ! bfd_is_abs_section (addsec))
2701         goto badop;
2702
2703       /* Set the "immediate" bit of the insn if this relocation is to Z
2704          field when the value is a numeric value, i.e. not a register.  */
2705       if ((fixP->fx_where & 3) == 3
2706           && (addsy == NULL || bfd_is_abs_section (addsec)))
2707         buf[-3] |= IMM_OFFSET_BIT;
2708
2709       buf[0] = val;
2710       return NULL;
2711
2712     case BFD_RELOC_MMIX_BASE_PLUS_OFFSET:
2713       if (addsy != NULL
2714           && strcmp (bfd_get_section_name (addsec->owner, addsec),
2715                      MMIX_REG_CONTENTS_SECTION_NAME) == 0)
2716         {
2717           /* This changed into a register; the relocation is for the
2718              register-contents section.  The constant part remains zero.  */
2719           code = BFD_RELOC_MMIX_REG;
2720           break;
2721         }
2722
2723       /* If we've found out that this was indeed a register, then replace
2724          with the register number.  The constant part is already zero.
2725
2726          If we encounter any other defined symbol, then we must find a
2727          suitable register and emit a reloc.  */
2728       if (addsy == NULL || addsec != real_reg_section)
2729         {
2730           struct mmix_symbol_gregs *gregs;
2731           struct mmix_symbol_greg_fixes *fix;
2732
2733           if (S_IS_DEFINED (addsy)
2734               && !bfd_is_com_section (addsec)
2735               && !S_IS_WEAK (addsy))
2736             {
2737               if (! symbol_section_p (addsy) && ! bfd_is_abs_section (addsec))
2738                 as_fatal (_("internal: BFD_RELOC_MMIX_BASE_PLUS_OFFSET not resolved to section"));
2739
2740               /* If this is an absolute symbol sufficiently near
2741                  lowest_data_loc, then we canonicalize on the data
2742                  section.  Note that val is signed here; we may subtract
2743                  lowest_data_loc which is unsigned.  Careful with those
2744                  comparisons.  */
2745               if (lowest_data_loc != (bfd_vma) -1
2746                   && (bfd_vma) val + 256 > lowest_data_loc
2747                   && bfd_is_abs_section (addsec))
2748                 {
2749                   val -= (offsetT) lowest_data_loc;
2750                   addsy = section_symbol (data_section);
2751                 }
2752               /* Likewise text section.  */
2753               else if (lowest_text_loc != (bfd_vma) -1
2754                        && (bfd_vma) val + 256 > lowest_text_loc
2755                        && bfd_is_abs_section (addsec))
2756                 {
2757                   val -= (offsetT) lowest_text_loc;
2758                   addsy = section_symbol (text_section);
2759                 }
2760             }
2761
2762           gregs = *symbol_get_tc (addsy);
2763
2764           /* If that symbol does not have any associated GREG definitions,
2765              we can't do anything.  */
2766           if (gregs == NULL
2767               || (fix = bsearch (&val, gregs->greg_fixes, gregs->n_gregs,
2768                                  sizeof (gregs->greg_fixes[0]),
2769                                  cmp_greg_val_greg_symbol_fixes)) == NULL
2770               /* The register must not point *after* the address we want.  */
2771               || fix->offs > val
2772               /* Neither must the register point more than 255 bytes
2773                  before the address we want.  */
2774               || fix->offs + 255 < val)
2775             {
2776               /* We can either let the linker allocate GREGs
2777                  automatically, or emit an error.  */
2778               if (allocate_undefined_gregs_in_linker)
2779                 {
2780                   /* The values in baddsy and addend are right.  */
2781                   code = fixP->fx_r_type;
2782                   break;
2783                 }
2784               else
2785                 as_bad_where (fixP->fx_file, fixP->fx_line,
2786                               _("no suitable GREG definition for operands"));
2787               return NULL;
2788             }
2789           else
2790             {
2791               /* Transform the base-plus-offset reloc for the actual area
2792                  to a reloc for the register with the address of the area.
2793                  Put addend for register in Z operand.  */
2794               buf[1] = val - fix->offs;
2795               code = BFD_RELOC_MMIX_REG;
2796               baddsy
2797                 = (bfd_get_section_by_name (stdoutput,
2798                                             MMIX_REG_CONTENTS_SECTION_NAME)
2799                    ->symbol);
2800
2801               addend = fix->fix->fx_frag->fr_address + fix->fix->fx_where;
2802             }
2803         }
2804       else if (S_GET_VALUE (addsy) > 255)
2805         as_bad_where (fixP->fx_file, fixP->fx_line,
2806                       _("invalid operands"));
2807       else
2808         {
2809           *buf = val;
2810           return NULL;
2811         }
2812       break;
2813
2814     case BFD_RELOC_MMIX_REG:
2815       if (addsy != NULL
2816           && (bfd_is_und_section (addsec)
2817               || strcmp (bfd_get_section_name (addsec->owner, addsec),
2818                          MMIX_REG_CONTENTS_SECTION_NAME) == 0))
2819         {
2820           code = fixP->fx_r_type;
2821           break;
2822         }
2823
2824       if (addsy != NULL
2825           && (addsec != real_reg_section
2826               || val > 255
2827               || val < 0)
2828           && ! bfd_is_und_section (addsec))
2829         /* Drop through to error message.  */
2830         ;
2831       else
2832         {
2833           buf[0] = val;
2834           return NULL;
2835         }
2836       /* FALLTHROUGH.  */
2837
2838       /* The others are supposed to be handled by md_apply_fix3.
2839          FIXME: ... which isn't called when -linkrelax.  Move over
2840          md_apply_fix3 code here for everything reasonable.  */
2841     badop:
2842     default:
2843       as_bad_where
2844         (fixP->fx_file, fixP->fx_line,
2845          _("operands were not reducible at assembly-time"));
2846
2847       /* Unmark this symbol as used in a reloc, so we don't bump into a BFD
2848          assert when trying to output reg_section.  FIXME: A gas bug.  */
2849       fixP->fx_addsy = NULL;
2850       return NULL;
2851     }
2852
2853   relP = (arelent *) xmalloc (sizeof (arelent));
2854   assert (relP != 0);
2855   relP->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
2856   *relP->sym_ptr_ptr = baddsy;
2857   relP->address = fixP->fx_frag->fr_address + fixP->fx_where;
2858
2859   relP->addend = addend;
2860
2861   /* If this had been a.out, we would have had a kludge for weak symbols
2862      here.  */
2863
2864   relP->howto = bfd_reloc_type_lookup (stdoutput, code);
2865   if (! relP->howto)
2866     {
2867       const char *name;
2868
2869       name = S_GET_NAME (addsy);
2870       if (name == NULL)
2871         name = _("<unknown>");
2872       as_fatal (_("cannot generate relocation type for symbol %s, code %s"),
2873                 name, bfd_get_reloc_code_name (code));
2874     }
2875
2876   return relP;
2877 }
2878
2879 /* Do some reformatting of a line.  FIXME: We could transform a mmixal
2880    line into traditional (GNU?) format, unless #NO_APP, and get rid of all
2881    ugly labels_without_colons etc.  */
2882
2883 void
2884 mmix_handle_mmixal ()
2885 {
2886   char *s0 = input_line_pointer;
2887   char *s;
2888   char *label = NULL;
2889   char c;
2890
2891   if (pending_label != NULL)
2892     as_fatal (_("internal: unhandled label %s"), pending_label);
2893
2894   if (mmix_gnu_syntax)
2895     return;
2896
2897   /* If the first character is a '.', then it's a pseudodirective, not a
2898      label.  Make GAS not handle label-without-colon on this line.  We
2899      also don't do mmixal-specific stuff on this line.  */
2900   if (input_line_pointer[0] == '.')
2901     {
2902       label_without_colon_this_line = 0;
2903       return;
2904     }
2905
2906   /* Don't handle empty lines here.  */
2907   while (1)
2908     {
2909       if (*s0 == 0 || is_end_of_line[(unsigned int) *s0])
2910         return;
2911
2912       if (! ISSPACE (*s0))
2913         break;
2914
2915       s0++;
2916     }
2917
2918   /* If we're on a line with a label, check if it's a mmixal fb-label.
2919      Save an indicator and skip the label; it must be set only after all
2920      fb-labels of expressions are evaluated.  */
2921   if (ISDIGIT (input_line_pointer[0])
2922       && input_line_pointer[1] == 'H'
2923       && ISSPACE (input_line_pointer[2]))
2924     {
2925       char *s;
2926       current_fb_label = input_line_pointer[0] - '0';
2927
2928       /* We have to skip the label, but also preserve the newlineness of
2929          the previous character, since the caller checks that.  It's a
2930          mess we blame on the caller.  */
2931       input_line_pointer[1] = input_line_pointer[-1];
2932       input_line_pointer += 2;
2933
2934       s = input_line_pointer;
2935       while (*s && ISSPACE (*s) && ! is_end_of_line[(unsigned int) *s])
2936         s++;
2937
2938       /* For errors emitted here, the book-keeping is off by one; the
2939          caller is about to bump the counters.  Adjust the error messages.  */
2940       if (is_end_of_line[(unsigned int) *s])
2941         {
2942           char *name;
2943           unsigned int line;
2944           as_where (&name, &line);
2945           as_bad_where (name, line + 1,
2946                         _("[0-9]H labels may not appear alone on a line"));
2947           current_fb_label = -1;
2948         }
2949       if (*s == '.')
2950         {
2951           char *name;
2952           unsigned int line;
2953           as_where (&name, &line);
2954           as_bad_where (name, line + 1,
2955                         _("[0-9]H labels do not mix with dot-pseudos"));
2956           current_fb_label = -1;
2957         }
2958     }
2959   else
2960     {
2961       current_fb_label = -1;
2962       if (is_name_beginner (input_line_pointer[0]))
2963         label = input_line_pointer;
2964     }
2965
2966   s0 = input_line_pointer;
2967   /* Skip over label.  */
2968   while (*s0 && is_part_of_name (*s0))
2969     s0++;
2970
2971   /* Remove trailing ":" off labels, as they'd otherwise be considered
2972      part of the name.  But don't do it for local labels.  */
2973   if (s0 != input_line_pointer && s0[-1] == ':'
2974       && (s0 - 2 != input_line_pointer
2975           || ! ISDIGIT (s0[-2])))
2976     s0[-1] = ' ';
2977   else if (label != NULL)
2978     {
2979       /* For labels that don't end in ":", we save it so we can later give
2980          it the same alignment and address as the associated instruction.  */
2981
2982       /* Make room for the label including the ending nul.  */
2983       int len_0 = s0 - label + 1;
2984
2985       /* Save this label on the MMIX symbol obstack.  Saving it on an
2986          obstack is needless for "IS"-pseudos, but it's harmless and we
2987          avoid a little code-cluttering.  */
2988       obstack_grow (&mmix_sym_obstack, label, len_0);
2989       pending_label = obstack_finish (&mmix_sym_obstack);
2990       pending_label[len_0 - 1] = 0;
2991     }
2992
2993   while (*s0 && ISSPACE (*s0) && ! is_end_of_line[(unsigned int) *s0])
2994     s0++;
2995
2996   if (pending_label != NULL && is_end_of_line[(unsigned int) *s0])
2997     /* Whoops, this was actually a lone label on a line.  Like :-ended
2998        labels, we don't attach such labels to the next instruction or
2999        pseudo.  */
3000     pending_label = NULL;
3001
3002   /* Find local labels of operands.  Look for "[0-9][FB]" where the
3003      characters before and after are not part of words.  Break if a single
3004      or double quote is seen anywhere.  It means we can't have local
3005      labels as part of list with mixed quoted and unquoted members for
3006      mmixal compatibility but we can't have it all.  For the moment.
3007      Replace the '<N>B' or '<N>F' with MAGIC_FB_BACKWARD_CHAR<N> and
3008      MAGIC_FB_FORWARD_CHAR<N> respectively.  */
3009
3010   /* First make sure we don't have any of the magic characters on the line
3011      appearing as input.  */
3012   s = s0;
3013   while (*s)
3014     {
3015       c = *s++;
3016       if (is_end_of_line[(unsigned int) c])
3017         break;
3018       if (c == MAGIC_FB_BACKWARD_CHAR || c == MAGIC_FB_FORWARD_CHAR)
3019         as_bad (_("invalid characters in input"));
3020     }
3021
3022   /* Scan again, this time looking for ';' after operands.  */
3023   s = s0;
3024
3025   /* Skip the insn.  */
3026   while (*s
3027          && ! ISSPACE (*s)
3028          && *s != ';'
3029          && ! is_end_of_line[(unsigned int) *s])
3030     s++;
3031
3032   /* Skip the spaces after the insn.  */
3033   while (*s
3034          && ISSPACE (*s)
3035          && *s != ';'
3036          && ! is_end_of_line[(unsigned int) *s])
3037     s++;
3038
3039   /* Skip the operands.  While doing this, replace [0-9][BF] with
3040      (MAGIC_FB_BACKWARD_CHAR|MAGIC_FB_FORWARD_CHAR)[0-9].  */
3041   while ((c = *s) != 0
3042          && ! ISSPACE (c)
3043          && c != ';'
3044          && ! is_end_of_line[(unsigned int) c])
3045     {
3046       if (c == '"')
3047         {
3048           s++;
3049
3050           /* FIXME: Test-case for semi-colon in string.  */
3051           while (*s
3052                  && *s != '"'
3053                  && (! is_end_of_line[(unsigned int) *s] || *s == ';'))
3054             s++;
3055
3056           if (*s == '"')
3057             s++;
3058         }
3059       else if (ISDIGIT (c))
3060         {
3061           if ((s[1] != 'B' && s[1] != 'F')
3062               || is_part_of_name (s[-1])
3063               || is_part_of_name (s[2]))
3064             s++;
3065           else
3066             {
3067               s[0] = (s[1] == 'B'
3068                       ? MAGIC_FB_BACKWARD_CHAR : MAGIC_FB_FORWARD_CHAR);
3069               s[1] = c;
3070             }
3071         }
3072       else
3073         s++;
3074     }
3075
3076   /* Skip any spaces after the operands.  */
3077   while (*s
3078          && ISSPACE (*s)
3079          && *s != ';'
3080          && !is_end_of_line[(unsigned int) *s])
3081     s++;
3082
3083   /* If we're now looking at a semi-colon, then it's an end-of-line
3084      delimiter.  */
3085   mmix_next_semicolon_is_eoln = (*s == ';');
3086
3087   /* Make IS into an EQU by replacing it with "= ".  Only match upper-case
3088      though; let lower-case be a syntax error.  */
3089   s = s0;
3090   if (s[0] == 'I' && s[1] == 'S' && ISSPACE (s[2]))
3091     {
3092       *s = '=';
3093       s[1] = ' ';
3094
3095       /* Since labels can start without ":", we have to handle "X IS 42"
3096          in full here, or "X" will be parsed as a label to be set at ".".  */
3097       input_line_pointer = s;
3098
3099       /* Right after this function ends, line numbers will be bumped if
3100          input_line_pointer[-1] = '\n'.  We want accurate line numbers for
3101          the equals call, so we bump them before the call, and make sure
3102          they aren't bumped afterwards.  */
3103       bump_line_counters ();
3104
3105       /* A fb-label is valid as an IS-label.  */
3106       if (current_fb_label >= 0)
3107         {
3108           char *fb_name;
3109
3110           /* We need to save this name on our symbol obstack, since the
3111              string we got in fb_label_name is volatile and will change
3112              with every call to fb_label_name, like those resulting from
3113              parsing the IS-operand.  */
3114           fb_name = fb_label_name (current_fb_label, 1);
3115           obstack_grow (&mmix_sym_obstack, fb_name, strlen (fb_name) + 1);
3116           equals (obstack_finish (&mmix_sym_obstack), 0);
3117           fb_label_instance_inc (current_fb_label);
3118           current_fb_label = -1;
3119         }
3120       else
3121         {
3122           if (pending_label == NULL)
3123             as_bad (_("empty label field for IS"));
3124           else
3125             equals (pending_label, 0);
3126           pending_label = NULL;
3127         }
3128
3129       /* For mmixal, we can have comments without a comment-start
3130          character.   */
3131       mmix_handle_rest_of_empty_line ();
3132       input_line_pointer--;
3133
3134       input_line_pointer[-1] = ' ';
3135     }
3136   else if (s[0] == 'G'
3137            && s[1] == 'R'
3138            && strncmp (s, "GREG", 4) == 0
3139            && (ISSPACE (s[4]) || is_end_of_line[(unsigned char) s[4]]))
3140     {
3141       input_line_pointer = s + 4;
3142
3143       /* Right after this function ends, line numbers will be bumped if
3144          input_line_pointer[-1] = '\n'.  We want accurate line numbers for
3145          the s_greg call, so we bump them before the call, and make sure
3146          they aren't bumped afterwards.  */
3147       bump_line_counters ();
3148
3149       /* A fb-label is valid as a GREG-label.  */
3150       if (current_fb_label >= 0)
3151         {
3152           char *fb_name;
3153
3154           /* We need to save this name on our symbol obstack, since the
3155              string we got in fb_label_name is volatile and will change
3156              with every call to fb_label_name, like those resulting from
3157              parsing the IS-operand.  */
3158           fb_name = fb_label_name (current_fb_label, 1);
3159
3160           /* Make sure we save the canonical name and don't get bitten by
3161              prefixes.  */
3162           obstack_1grow (&mmix_sym_obstack, ':');
3163           obstack_grow (&mmix_sym_obstack, fb_name, strlen (fb_name) + 1);
3164           mmix_greg_internal (obstack_finish (&mmix_sym_obstack));
3165           fb_label_instance_inc (current_fb_label);
3166           current_fb_label = -1;
3167         }
3168       else
3169         mmix_greg_internal (pending_label);
3170
3171       /* Back up before the end-of-line marker that was skipped in
3172          mmix_greg_internal.  */
3173       input_line_pointer--;
3174       input_line_pointer[-1] = ' ';
3175
3176       pending_label = NULL;
3177     }
3178   else if (pending_label != NULL)
3179     {
3180       input_line_pointer += strlen (pending_label);
3181
3182       /* See comment above about getting line numbers bumped.  */
3183       input_line_pointer[-1] = '\n';
3184     }
3185 }
3186
3187 /* Give the value of an fb-label rewritten as in mmix_handle_mmixal, when
3188    parsing an expression.
3189
3190    On valid calls, input_line_pointer points at a MAGIC_FB_BACKWARD_CHAR
3191    or MAGIC_FB_BACKWARD_CHAR, followed by an ascii digit for the label.
3192    We fill in the label as an expression.  */
3193
3194 void
3195 mmix_fb_label (expP)
3196      expressionS *expP;
3197 {
3198   symbolS *sym;
3199   char *fb_internal_name;
3200
3201   /* This doesn't happen when not using mmixal syntax.  */
3202   if (mmix_gnu_syntax
3203       || (input_line_pointer[0] != MAGIC_FB_BACKWARD_CHAR
3204           && input_line_pointer[0] != MAGIC_FB_FORWARD_CHAR))
3205     return;
3206
3207   /* The current backward reference has augmentation 0.  A forward
3208      reference has augmentation 1, unless it's the same as a fb-label on
3209      _this_ line, in which case we add one more so we don't refer to it.
3210      This is the semantics of mmixal; it differs to that of common
3211      fb-labels which refer to a here-label on the current line as a
3212      backward reference.  */
3213   fb_internal_name
3214     = fb_label_name (input_line_pointer[1] - '0',
3215                      (input_line_pointer[0] == MAGIC_FB_FORWARD_CHAR ? 1 : 0)
3216                      + ((input_line_pointer[1] - '0' == current_fb_label
3217                          && input_line_pointer[0] == MAGIC_FB_FORWARD_CHAR)
3218                         ? 1 : 0));
3219
3220   input_line_pointer += 2;
3221   sym = symbol_find_or_make (fb_internal_name);
3222
3223   /* We don't have to clean up unrelated fields here; we just do what the
3224      expr machinery does, but *not* just what it does for [0-9][fb], since
3225      we need to treat those as ordinary symbols sometimes; see testcases
3226      err-byte2.s and fb-2.s.  */
3227   if (S_GET_SEGMENT (sym) == absolute_section)
3228     {
3229       expP->X_op = O_constant;
3230       expP->X_add_number = S_GET_VALUE (sym);
3231     }
3232   else
3233     {
3234       expP->X_op = O_symbol;
3235       expP->X_add_symbol = sym;
3236       expP->X_add_number = 0;
3237     }
3238 }
3239
3240 /* See whether we need to force a relocation into the output file.
3241    This is used to force out switch and PC relative relocations when
3242    relaxing.  */
3243
3244 int
3245 mmix_force_relocation (fixP)
3246      fixS *fixP;
3247 {
3248   if (fixP->fx_r_type == BFD_RELOC_MMIX_LOCAL
3249       || fixP->fx_r_type == BFD_RELOC_MMIX_BASE_PLUS_OFFSET)
3250     return 1;
3251
3252   if (linkrelax)
3253     return 1;
3254
3255   /* All our pcrel relocations are must-keep.  Note that md_apply_fix3 is
3256      called *after* this, and will handle getting rid of the presumed
3257      reloc; a relocation isn't *forced* other than to be handled by
3258      md_apply_fix3 (or tc_gen_reloc if linkrelax).  */
3259   if (fixP->fx_pcrel)
3260     return 1;
3261
3262   return generic_force_reloc (fixP);
3263 }
3264
3265 /* The location from which a PC relative jump should be calculated,
3266    given a PC relative reloc.  */
3267
3268 long
3269 md_pcrel_from_section (fixP, sec)
3270      fixS * fixP;
3271      segT   sec;
3272 {
3273   if (fixP->fx_addsy != (symbolS *) NULL
3274       && (! S_IS_DEFINED (fixP->fx_addsy)
3275           || S_GET_SEGMENT (fixP->fx_addsy) != sec))
3276     {
3277       /* The symbol is undefined (or is defined but not in this section).
3278          Let the linker figure it out.  */
3279       return 0;
3280     }
3281
3282   return (fixP->fx_frag->fr_address + fixP->fx_where);
3283 }
3284
3285 /* Adjust the symbol table.  We make reg_section relative to the real
3286    register section.  */
3287
3288 void
3289 mmix_adjust_symtab ()
3290 {
3291   symbolS *sym;
3292   symbolS *regsec = section_symbol (reg_section);
3293
3294   for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
3295     if (S_GET_SEGMENT (sym) == reg_section)
3296       {
3297         if (sym == regsec)
3298           {
3299             if (S_IS_EXTERN (sym) || symbol_used_in_reloc_p (sym))
3300               abort ();
3301             symbol_remove (sym, &symbol_rootP, &symbol_lastP);
3302           }
3303         else
3304           /* Change section to the *real* register section, so it gets
3305              proper treatment when writing it out.  Only do this for
3306              global symbols.  This also means we don't have to check for
3307              $0..$255.  */
3308           S_SET_SEGMENT (sym, real_reg_section);
3309       }
3310 }
3311
3312 /* This is the expansion of LABELS_WITHOUT_COLONS.
3313    We let md_start_line_hook tweak label_without_colon_this_line, and then
3314    this function returns the tweaked value, and sets it to 1 for the next
3315    line.  FIXME: Very, very brittle.  Not sure it works the way I
3316    thought at the time I first wrote this.  */
3317
3318 int
3319 mmix_label_without_colon_this_line ()
3320 {
3321   int retval = label_without_colon_this_line;
3322
3323   if (! mmix_gnu_syntax)
3324     label_without_colon_this_line = 1;
3325
3326   return retval;
3327 }
3328
3329 /* This is the expansion of md_relax_frag.  We go through the ordinary
3330    relax table function except when the frag is for a GREG.  Then we have
3331    to check whether there's another GREG by the same value that we can
3332    join with.  */
3333
3334 long
3335 mmix_md_relax_frag (seg, fragP, stretch)
3336      segT seg;
3337      fragS *fragP;
3338      long stretch;
3339 {
3340   if (fragP->fr_subtype != STATE_GREG_DEF
3341       && fragP->fr_subtype != STATE_GREG_UNDF)
3342     return relax_frag (seg, fragP, stretch);
3343
3344   /* If we're defined, we don't grow.  */
3345   if (fragP->fr_subtype == STATE_GREG_DEF)
3346     return 0;
3347
3348   as_fatal (_("internal: unexpected relax type %d:%d"),
3349             fragP->fr_type, fragP->fr_subtype);
3350   return 0;
3351 }
3352
3353 /* Various things we punt until all input is seen.  */
3354
3355 void
3356 mmix_md_end ()
3357 {
3358   fragS *fragP;
3359   symbolS *mainsym;
3360   int i;
3361
3362   /* The first frag of GREG:s going into the register contents section.  */
3363   fragS *mmix_reg_contents_frags = NULL;
3364
3365   /* Reset prefix.  All labels reachable at this point must be
3366      canonicalized.  */
3367   mmix_current_prefix = NULL;
3368
3369   if (doing_bspec)
3370     as_bad_where (bspec_file, bspec_line, _("BSPEC without ESPEC."));
3371
3372   /* Emit the low LOC setting of .text.  */
3373   if (text_has_contents && lowest_text_loc != (bfd_vma) -1)
3374     {
3375       symbolS *symbolP;
3376       char locsymbol[sizeof (":") - 1
3377                     + sizeof (MMIX_LOC_SECTION_START_SYMBOL_PREFIX) - 1
3378                     + sizeof (".text")];
3379
3380       /* An exercise in non-ISO-C-ness, this one.  */
3381       sprintf (locsymbol, ":%s%s", MMIX_LOC_SECTION_START_SYMBOL_PREFIX,
3382                ".text");
3383       symbolP
3384         = symbol_new (locsymbol, absolute_section, lowest_text_loc,
3385                       &zero_address_frag);
3386       S_SET_EXTERNAL (symbolP);
3387     }
3388
3389   /* Ditto .data.  */
3390   if (data_has_contents && lowest_data_loc != (bfd_vma) -1)
3391     {
3392       symbolS *symbolP;
3393       char locsymbol[sizeof (":") - 1
3394                      + sizeof (MMIX_LOC_SECTION_START_SYMBOL_PREFIX) - 1
3395                      + sizeof (".data")];
3396
3397       sprintf (locsymbol, ":%s%s", MMIX_LOC_SECTION_START_SYMBOL_PREFIX,
3398                ".data");
3399       symbolP
3400         = symbol_new (locsymbol, absolute_section, lowest_data_loc,
3401                       &zero_address_frag);
3402       S_SET_EXTERNAL (symbolP);
3403     }
3404
3405   /* Unless GNU syntax mode, set "Main" to be a function, so the
3406      disassembler doesn't get confused when we write truly
3407      mmixal-compatible code (and don't use .type).  Similarly set it
3408      global (regardless of -globalize-symbols), so the linker sees it as
3409      the start symbol in ELF mode.  */
3410   mainsym = symbol_find (MMIX_START_SYMBOL_NAME);
3411   if (mainsym != NULL && ! mmix_gnu_syntax)
3412     {
3413       symbol_get_bfdsym (mainsym)->flags |= BSF_FUNCTION;
3414       S_SET_EXTERNAL (mainsym);
3415     }
3416
3417   if (n_of_raw_gregs != 0)
3418     {
3419       /* Emit GREGs.  They are collected in order of appearance, but must
3420          be emitted in opposite order to both have section address regno*8
3421          and the same allocation order (within a file) as mmixal.  */
3422       segT this_segment = now_seg;
3423       subsegT this_subsegment = now_subseg;
3424       asection *regsec
3425         = bfd_make_section_old_way (stdoutput,
3426                                     MMIX_REG_CONTENTS_SECTION_NAME);
3427       subseg_set (regsec, 0);
3428
3429       /* Finally emit the initialization-value.  Emit a variable frag, which
3430          we'll fix in md_estimate_size_before_relax.  We set the initializer
3431          for the tc_frag_data field to NULL, so we can use that field for
3432          relaxation purposes.  */
3433       mmix_opcode_frag = NULL;
3434
3435       frag_grow (0);
3436       mmix_reg_contents_frags = frag_now;
3437
3438       for (i = n_of_raw_gregs - 1; i >= 0; i--)
3439         {
3440           if (mmix_raw_gregs[i].label != NULL)
3441             /* There's a symbol.  Let it refer to this location in the
3442                register contents section.  The symbol must be globalized
3443                separately.  */
3444             colon (mmix_raw_gregs[i].label);
3445
3446           frag_var (rs_machine_dependent, 8, 0, STATE_GREG_UNDF,
3447                     make_expr_symbol (&mmix_raw_gregs[i].exp), 0, NULL);
3448         }
3449
3450       subseg_set (this_segment, this_subsegment);
3451     }
3452
3453   /* Iterate over frags resulting from GREGs and move those that evidently
3454      have the same value together and point one to another.
3455
3456      This works in time O(N^2) but since the upper bound for non-error use
3457      is 223, it's best to keep this simpler algorithm.  */
3458   for (fragP = mmix_reg_contents_frags; fragP != NULL; fragP = fragP->fr_next)
3459     {
3460       fragS **fpp;
3461       fragS *fp = NULL;
3462       fragS *osymfrag;
3463       offsetT osymval;
3464       expressionS *oexpP;
3465       symbolS *symbolP = fragP->fr_symbol;
3466
3467       if (fragP->fr_type != rs_machine_dependent
3468           || fragP->fr_subtype != STATE_GREG_UNDF)
3469         continue;
3470
3471       /* Whatever the outcome, we will have this GREG judged merged or
3472          non-merged.  Since the tc_frag_data is NULL at this point, we
3473          default to non-merged.  */
3474       fragP->fr_subtype = STATE_GREG_DEF;
3475
3476       /* If we're not supposed to merge GREG definitions, then just don't
3477          look for equivalents.  */
3478       if (! merge_gregs)
3479         continue;
3480
3481       osymval = (offsetT) S_GET_VALUE (symbolP);
3482       osymfrag = symbol_get_frag (symbolP);
3483
3484       /* If the symbol isn't defined, we can't say that another symbol
3485          equals this frag, then.  FIXME: We can look at the "deepest"
3486          defined name; if a = c and b = c then obviously a == b.  */
3487       if (! S_IS_DEFINED (symbolP))
3488         continue;
3489
3490       oexpP = symbol_get_value_expression (fragP->fr_symbol);
3491
3492       /* If the initialization value is zero, then we must not merge them.  */
3493       if (oexpP->X_op == O_constant && osymval == 0)
3494         continue;
3495
3496       /* Iterate through the frags downward this one.  If we find one that
3497          has the same non-zero value, move it to after this one and point
3498          to it as the equivalent.  */
3499       for (fpp = &fragP->fr_next; *fpp != NULL; fpp = &fpp[0]->fr_next)
3500         {
3501           fp = *fpp;
3502
3503           if (fp->fr_type != rs_machine_dependent
3504               || fp->fr_subtype != STATE_GREG_UNDF)
3505             continue;
3506
3507           /* Calling S_GET_VALUE may simplify the symbol, changing from
3508              expr_section etc. so call it first.  */
3509           if ((offsetT) S_GET_VALUE (fp->fr_symbol) == osymval
3510               && symbol_get_frag (fp->fr_symbol) == osymfrag)
3511             {
3512               /* Move the frag links so the one we found equivalent comes
3513                  after the current one, carefully considering that
3514                  sometimes fpp == &fragP->fr_next and the moves must be a
3515                  NOP then.  */
3516               *fpp = fp->fr_next;
3517               fp->fr_next = fragP->fr_next;
3518               fragP->fr_next = fp;
3519               break;
3520             }
3521         }
3522
3523       if (*fpp != NULL)
3524         fragP->tc_frag_data = fp;
3525     }
3526 }
3527
3528 /* qsort function for mmix_symbol_gregs.  */
3529
3530 static int
3531 cmp_greg_symbol_fixes (parg, qarg)
3532      const PTR parg;
3533      const PTR qarg;
3534 {
3535   const struct mmix_symbol_greg_fixes *p
3536     = (const struct mmix_symbol_greg_fixes *) parg;
3537   const struct mmix_symbol_greg_fixes *q
3538     = (const struct mmix_symbol_greg_fixes *) qarg;
3539
3540   return p->offs > q->offs ? 1 : p->offs < q->offs ? -1 : 0;
3541 }
3542
3543 /* Collect GREG definitions from mmix_gregs and hang them as lists sorted
3544    on increasing offsets onto each section symbol or undefined symbol.
3545
3546    Also, remove the register convenience section so it doesn't get output
3547    as an ELF section.  */
3548
3549 void
3550 mmix_frob_file ()
3551 {
3552   int i;
3553   struct mmix_symbol_gregs *all_greg_symbols[MAX_GREGS];
3554   int n_greg_symbols = 0;
3555
3556   /* Collect all greg fixups and decorate each corresponding symbol with
3557      the greg fixups for it.  */
3558   for (i = 0; i < n_of_cooked_gregs; i++)
3559     {
3560       offsetT offs;
3561       symbolS *sym;
3562       struct mmix_symbol_gregs *gregs;
3563       fixS *fixP;
3564
3565       fixP = mmix_gregs[i];
3566       know (fixP->fx_r_type == BFD_RELOC_64);
3567
3568       /* This case isn't doable in general anyway, methinks.  */
3569       if (fixP->fx_subsy != NULL)
3570         {
3571           as_bad_where (fixP->fx_file, fixP->fx_line,
3572                         _("GREG expression too complicated"));
3573           continue;
3574         }
3575
3576       sym = fixP->fx_addsy;
3577       offs = (offsetT) fixP->fx_offset;
3578
3579       /* If the symbol is defined, then it must be resolved to a section
3580          symbol at this time, or else we don't know how to handle it.  */
3581       if (S_IS_DEFINED (sym)
3582           && !bfd_is_com_section (S_GET_SEGMENT (sym))
3583           && !S_IS_WEAK (sym))
3584         {
3585           if (! symbol_section_p (sym)
3586               && ! bfd_is_abs_section (S_GET_SEGMENT (sym)))
3587             as_fatal (_("internal: GREG expression not resolved to section"));
3588
3589           offs += S_GET_VALUE (sym);
3590         }
3591
3592       /* If this is an absolute symbol sufficiently near lowest_data_loc,
3593          then we canonicalize on the data section.  Note that offs is
3594          signed here; we may subtract lowest_data_loc which is unsigned.
3595          Careful with those comparisons.  */
3596       if (lowest_data_loc != (bfd_vma) -1
3597           && (bfd_vma) offs + 256 > lowest_data_loc
3598           && bfd_is_abs_section (S_GET_SEGMENT (sym)))
3599         {
3600           offs -= (offsetT) lowest_data_loc;
3601           sym = section_symbol (data_section);
3602         }
3603       /* Likewise text section.  */
3604       else if (lowest_text_loc != (bfd_vma) -1
3605                && (bfd_vma) offs + 256 > lowest_text_loc
3606                && bfd_is_abs_section (S_GET_SEGMENT (sym)))
3607         {
3608           offs -= (offsetT) lowest_text_loc;
3609           sym = section_symbol (text_section);
3610         }
3611
3612       gregs = *symbol_get_tc (sym);
3613
3614       if (gregs == NULL)
3615         {
3616           gregs = xmalloc (sizeof (*gregs));
3617           gregs->n_gregs = 0;
3618           symbol_set_tc (sym, &gregs);
3619           all_greg_symbols[n_greg_symbols++] = gregs;
3620         }
3621
3622       gregs->greg_fixes[gregs->n_gregs].fix = fixP;
3623       gregs->greg_fixes[gregs->n_gregs++].offs = offs;
3624     }
3625
3626   /* For each symbol having a GREG definition, sort those definitions on
3627      offset.  */
3628   for (i = 0; i < n_greg_symbols; i++)
3629     qsort (all_greg_symbols[i]->greg_fixes, all_greg_symbols[i]->n_gregs,
3630            sizeof (all_greg_symbols[i]->greg_fixes[0]), cmp_greg_symbol_fixes);
3631
3632   if (real_reg_section != NULL)
3633     {
3634       asection **secpp;
3635
3636       /* FIXME: Pass error state gracefully.  */
3637       if (bfd_get_section_flags (stdoutput, real_reg_section) & SEC_HAS_CONTENTS)
3638         as_fatal (_("register section has contents\n"));
3639
3640       /* Really remove the section.  */
3641       for (secpp = &stdoutput->sections;
3642            *secpp != real_reg_section;
3643            secpp = &(*secpp)->next)
3644         ;
3645       bfd_section_list_remove (stdoutput, secpp);
3646       --stdoutput->section_count;
3647     }
3648
3649 }
3650
3651 /* Provide an expression for a built-in name provided when-used.
3652    Either a symbol that is a handler; living in 0x10*[1..8] and having
3653    name [DVWIOUZX]_Handler, or a mmixal built-in symbol.
3654
3655    If the name isn't a built-in name and parsed into *EXPP, return zero.  */
3656
3657 int
3658 mmix_parse_predefined_name (name, expP)
3659      char *name;
3660      expressionS *expP;
3661 {
3662   char *canon_name;
3663   char *handler_charp;
3664   const char handler_chars[] = "DVWIOUZX";
3665   symbolS *symp;
3666
3667   if (! predefined_syms)
3668     return 0;
3669
3670   canon_name = tc_canonicalize_symbol_name (name);
3671
3672   if (canon_name[1] == '_'
3673       && strcmp (canon_name + 2, "Handler") == 0
3674       && (handler_charp = strchr (handler_chars, *canon_name)) != NULL)
3675     {
3676       /* If the symbol doesn't exist, provide one relative to the .text
3677          section.
3678
3679          FIXME: We should provide separate sections, mapped in the linker
3680          script.  */
3681       symp = symbol_find (name);
3682       if (symp == NULL)
3683         symp = symbol_new (name, text_section,
3684                            0x10 * (handler_charp + 1 - handler_chars),
3685                            &zero_address_frag);
3686     }
3687   else
3688     {
3689       /* These symbols appear when referenced; needed for
3690          mmixal-compatible programs.  */
3691       unsigned int i;
3692
3693       static const struct
3694       {
3695         const char *name;
3696         valueT val;
3697       } predefined_abs_syms[] =
3698         {
3699           {"Data_Segment", (valueT) 0x20 << 56},
3700           {"Pool_Segment", (valueT) 0x40 << 56},
3701           {"Stack_Segment", (valueT) 0x60 << 56},
3702           {"StdIn", 0},
3703           {"StdOut", 1},
3704           {"StdErr", 2},
3705           {"TextRead", 0},
3706           {"TextWrite", 1},
3707           {"BinaryRead", 2},
3708           {"BinaryWrite", 3},
3709           {"BinaryReadWrite", 4},
3710           {"Halt", 0},
3711           {"Fopen", 1},
3712           {"Fclose", 2},
3713           {"Fread", 3},
3714           {"Fgets", 4},
3715           {"Fgetws", 5},
3716           {"Fwrite", 6},
3717           {"Fputs", 7},
3718           {"Fputws", 8},
3719           {"Fseek", 9},
3720           {"Ftell", 10},
3721           {"D_BIT", 0x80},
3722           {"V_BIT", 0x40},
3723           {"W_BIT", 0x20},
3724           {"I_BIT", 0x10},
3725           {"O_BIT", 0x08},
3726           {"U_BIT", 0x04},
3727           {"Z_BIT", 0x02},
3728           {"X_BIT", 0x01},
3729           {"Inf", 0x7ff00000}
3730         };
3731
3732       /* If it's already in the symbol table, we shouldn't do anything.  */
3733       symp = symbol_find (name);
3734       if (symp != NULL)
3735         return 0;
3736
3737       for (i = 0;
3738            i < sizeof (predefined_abs_syms) / sizeof (predefined_abs_syms[0]);
3739            i++)
3740         if (strcmp (canon_name, predefined_abs_syms[i].name) == 0)
3741           {
3742             symbol_table_insert (symbol_new (predefined_abs_syms[i].name,
3743                                              absolute_section,
3744                                              predefined_abs_syms[i].val,
3745                                              &zero_address_frag));
3746
3747             /* Let gas find the symbol we just created, through its
3748                ordinary lookup.  */
3749             return 0;
3750           }
3751
3752       /* Not one of those symbols.  Let gas handle it.  */
3753       return 0;
3754     }
3755
3756   expP->X_op = O_symbol;
3757   expP->X_add_number = 0;
3758   expP->X_add_symbol = symp;
3759   expP->X_op_symbol = NULL;
3760
3761   return 1;
3762 }
3763
3764 /* Just check that we don't have a BSPEC/ESPEC pair active when changing
3765    sections "normally", and get knowledge about alignment from the new
3766    section.  */
3767
3768 void
3769 mmix_md_elf_section_change_hook ()
3770 {
3771   if (doing_bspec)
3772     as_bad (_("section change from within a BSPEC/ESPEC pair is not supported"));
3773
3774   last_alignment = bfd_get_section_alignment (now_seg->owner, now_seg);
3775   want_unaligned = 0;
3776 }
3777
3778 /* The LOC worker.  This is like s_org, but we have to support changing
3779    section too.   */
3780
3781 static void
3782 s_loc (ignore)
3783      int ignore ATTRIBUTE_UNUSED;
3784 {
3785   segT section;
3786   expressionS exp;
3787   char *p;
3788   symbolS *sym;
3789   offsetT off;
3790
3791   /* Must not have a BSPEC in progress.  */
3792   if (doing_bspec)
3793     {
3794       as_bad (_("directive LOC from within a BSPEC/ESPEC pair is not supported"));
3795       return;
3796     }
3797
3798   section = expression (&exp);
3799
3800   if (exp.X_op == O_illegal
3801       || exp.X_op == O_absent
3802       || exp.X_op == O_big
3803       || section == undefined_section)
3804     {
3805       as_bad (_("invalid LOC expression"));
3806       return;
3807     }
3808
3809   if (section == absolute_section)
3810     {
3811       /* Translate a constant into a suitable section.  */
3812
3813       if (exp.X_add_number < ((offsetT) 0x20 << 56))
3814         {
3815           /* Lower than Data_Segment - assume it's .text.  */
3816           section = text_section;
3817
3818           /* Save the lowest seen location, so we can pass on this
3819              information to the linker.  We don't actually org to this
3820              location here, we just pass on information to the linker so
3821              it can put the code there for us.  */
3822
3823           /* If there was already a loc (that has to be set lower than
3824              this one), we org at (this - lower).  There's an implicit
3825              "LOC 0" before any entered code.  FIXME: handled by spurious
3826              settings of text_has_contents.  */
3827           if (exp.X_add_number < 0
3828               || exp.X_add_number < (offsetT) lowest_text_loc)
3829             {
3830               as_bad (_("LOC expression stepping backwards is not supported"));
3831               exp.X_op = O_absent;
3832             }
3833           else
3834             {
3835               if (text_has_contents && lowest_text_loc == (bfd_vma) -1)
3836                 lowest_text_loc = 0;
3837
3838               if (lowest_text_loc == (bfd_vma) -1)
3839                 {
3840                   lowest_text_loc = exp.X_add_number;
3841
3842                   /* We want only to change the section, not set an offset.  */
3843                   exp.X_op = O_absent;
3844                 }
3845               else
3846                 exp.X_add_number -= lowest_text_loc;
3847             }
3848         }
3849       else
3850         {
3851           /* Do the same for the .data section.  */
3852           section = data_section;
3853
3854           if (exp.X_add_number < (offsetT) lowest_data_loc)
3855             {
3856               as_bad (_("LOC expression stepping backwards is not supported"));
3857               exp.X_op = O_absent;
3858             }
3859           else
3860             {
3861               if (data_has_contents && lowest_data_loc == (bfd_vma) -1)
3862                 lowest_data_loc = (bfd_vma) 0x20 << 56;
3863
3864               if (lowest_data_loc == (bfd_vma) -1)
3865                 {
3866                   lowest_data_loc = exp.X_add_number;
3867
3868                   /* We want only to change the section, not set an offset.  */
3869                   exp.X_op = O_absent;
3870                 }
3871               else
3872                 exp.X_add_number -= lowest_data_loc;
3873             }
3874         }
3875     }
3876
3877   if (section != now_seg)
3878     {
3879       obj_elf_section_change_hook ();
3880       subseg_set (section, 0);
3881
3882       /* Call our section change hooks using the official hook.  */
3883       md_elf_section_change_hook ();
3884     }
3885
3886   if (exp.X_op != O_absent)
3887     {
3888       if (exp.X_op != O_constant && exp.X_op != O_symbol)
3889         {
3890           /* Handle complex expressions.  */
3891           sym = make_expr_symbol (&exp);
3892           off = 0;
3893         }
3894       else
3895         {
3896           sym = exp.X_add_symbol;
3897           off = exp.X_add_number;
3898         }
3899
3900       p = frag_var (rs_org, 1, 1, (relax_substateT) 0, sym, off, (char *) 0);
3901       *p = 0;
3902     }
3903
3904   mmix_handle_rest_of_empty_line ();
3905 }
3906
3907 /* The BYTE worker.  We have to support sequences of mixed "strings",
3908    numbers and other constant "first-pass" reducible expressions separated
3909    by comma.  */
3910
3911 static void
3912 mmix_byte ()
3913 {
3914   unsigned int c;
3915   char *start;
3916
3917   if (now_seg == text_section)
3918     text_has_contents = 1;
3919   else if (now_seg == data_section)
3920     data_has_contents = 1;
3921
3922   do
3923     {
3924       SKIP_WHITESPACE ();
3925       switch (*input_line_pointer)
3926         {
3927         case '\"':
3928           ++input_line_pointer;
3929           start = input_line_pointer;
3930           while (is_a_char (c = next_char_of_string ()))
3931             {
3932               FRAG_APPEND_1_CHAR (c);
3933             }
3934
3935           if (input_line_pointer[-1] != '\"')
3936             {
3937               /* We will only get here in rare cases involving #NO_APP,
3938                  where the unterminated string is not recognized by the
3939                  preformatting pass.  */
3940               as_bad (_("unterminated string"));
3941               mmix_discard_rest_of_line ();
3942               return;
3943             }
3944           break;
3945
3946         default:
3947           {
3948             expressionS exp;
3949             segT expseg = expression (&exp);
3950
3951             /* We have to allow special register names as constant numbers.  */
3952             if ((expseg != absolute_section && expseg != reg_section)
3953                 || (exp.X_op != O_constant
3954                     && (exp.X_op != O_register
3955                         || exp.X_add_number <= 255)))
3956               {
3957                 as_bad (_("BYTE expression not a pure number"));
3958                 mmix_discard_rest_of_line ();
3959                 return;
3960               }
3961             else if ((exp.X_add_number > 255 && exp.X_op != O_register)
3962                      || exp.X_add_number < 0)
3963               {
3964                 /* Note that mmixal does not allow negative numbers in
3965                    BYTE sequences, so neither should we.  */
3966                 as_bad (_("BYTE expression not in the range 0..255"));
3967                 mmix_discard_rest_of_line ();
3968                 return;
3969               }
3970
3971             FRAG_APPEND_1_CHAR (exp.X_add_number);
3972           }
3973           break;
3974         }
3975
3976       SKIP_WHITESPACE ();
3977       c = *input_line_pointer++;
3978     }
3979   while (c == ',');
3980
3981   input_line_pointer--;
3982
3983   if (mmix_gnu_syntax)
3984     demand_empty_rest_of_line ();
3985   else
3986     {
3987       mmix_discard_rest_of_line ();
3988       /* Do like demand_empty_rest_of_line and step over the end-of-line
3989          boundary.  */
3990       input_line_pointer++;
3991     }
3992
3993   /* Make sure we align for the next instruction.  */
3994   last_alignment = 0;
3995 }
3996
3997 /* Like cons_worker, but we have to ignore "naked comments", not barf on
3998    them.  Implements WYDE, TETRA and OCTA.  We're a little bit more
3999    lenient than mmix_byte but FIXME: they should eventually merge.  */
4000
4001 static void
4002 mmix_cons (nbytes)
4003      int nbytes;
4004 {
4005   expressionS exp;
4006   char *start;
4007
4008   /* If we don't have any contents, then it's ok to have a specified start
4009      address that is not a multiple of the max data size.  We will then
4010      align it as necessary when we get here.  Otherwise, it's a fatal sin.  */
4011   if (now_seg == text_section)
4012     {
4013       if (lowest_text_loc != (bfd_vma) -1
4014           && (lowest_text_loc & (nbytes - 1)) != 0)
4015         {
4016           if (text_has_contents)
4017             as_bad (_("data item with alignment larger than location"));
4018           else if (want_unaligned)
4019             as_bad (_("unaligned data at an absolute location is not supported"));
4020
4021           lowest_text_loc &= ~((bfd_vma) nbytes - 1);
4022           lowest_text_loc += (bfd_vma) nbytes;
4023         }
4024
4025       text_has_contents = 1;
4026     }
4027   else if (now_seg == data_section)
4028     {
4029       if (lowest_data_loc != (bfd_vma) -1
4030           && (lowest_data_loc & (nbytes - 1)) != 0)
4031         {
4032           if (data_has_contents)
4033             as_bad (_("data item with alignment larger than location"));
4034           else if (want_unaligned)
4035             as_bad (_("unaligned data at an absolute location is not supported"));
4036
4037           lowest_data_loc &= ~((bfd_vma) nbytes - 1);
4038           lowest_data_loc += (bfd_vma) nbytes;
4039         }
4040
4041       data_has_contents = 1;
4042     }
4043
4044   /* Always align these unless asked not to (valid for the current pseudo).  */
4045   if (! want_unaligned)
4046     {
4047       last_alignment = nbytes == 2 ? 1 : (nbytes == 4 ? 2 : 3);
4048       frag_align (last_alignment, 0, 0);
4049       record_alignment (now_seg, last_alignment);
4050     }
4051
4052   /* For mmixal compatibility, a label for an instruction (and emitting
4053      pseudo) refers to the _aligned_ address.  So we have to emit the
4054      label here.  */
4055   if (current_fb_label >= 0)
4056     colon (fb_label_name (current_fb_label, 1));
4057   else if (pending_label != NULL)
4058     {
4059       colon (pending_label);
4060       pending_label = NULL;
4061     }
4062
4063   SKIP_WHITESPACE ();
4064
4065   if (is_end_of_line[(unsigned int) *input_line_pointer])
4066     {
4067       /* Default to zero if the expression was absent.  */
4068
4069       exp.X_op = O_constant;
4070       exp.X_add_number = 0;
4071       exp.X_unsigned = 0;
4072       exp.X_add_symbol = NULL;
4073       exp.X_op_symbol = NULL;
4074       emit_expr (&exp, (unsigned int) nbytes);
4075     }
4076   else
4077     do
4078       {
4079         unsigned int c;
4080
4081         switch (*input_line_pointer)
4082           {
4083             /* We support strings here too; each character takes up nbytes
4084                bytes.  */
4085           case '\"':
4086             ++input_line_pointer;
4087             start = input_line_pointer;
4088             while (is_a_char (c = next_char_of_string ()))
4089               {
4090                 exp.X_op = O_constant;
4091                 exp.X_add_number = c;
4092                 exp.X_unsigned = 1;
4093                 emit_expr (&exp, (unsigned int) nbytes);
4094               }
4095
4096             if (input_line_pointer[-1] != '\"')
4097               {
4098                 /* We will only get here in rare cases involving #NO_APP,
4099                    where the unterminated string is not recognized by the
4100                    preformatting pass.  */
4101                 as_bad (_("unterminated string"));
4102                 mmix_discard_rest_of_line ();
4103                 return;
4104               }
4105             break;
4106
4107           default:
4108             {
4109               expression (&exp);
4110               emit_expr (&exp, (unsigned int) nbytes);
4111               SKIP_WHITESPACE ();
4112             }
4113             break;
4114           }
4115       }
4116     while (*input_line_pointer++ == ',');
4117
4118   input_line_pointer--;         /* Put terminator back into stream.  */
4119
4120   mmix_handle_rest_of_empty_line ();
4121
4122   /* We don't need to step up the counter for the current_fb_label here;
4123      that's handled by the caller.  */
4124 }
4125
4126 /* The md_do_align worker.  At present, we just record an alignment to
4127    nullify the automatic alignment we do for WYDE, TETRA and OCTA, as gcc
4128    does not use the unaligned macros when attribute packed is used.
4129    Arguably this is a GCC bug.  */
4130
4131 void
4132 mmix_md_do_align (n, fill, len, max)
4133      int n;
4134      char *fill ATTRIBUTE_UNUSED;
4135      int len ATTRIBUTE_UNUSED;
4136      int max ATTRIBUTE_UNUSED;
4137 {
4138   last_alignment = n;
4139   want_unaligned = n == 0;
4140 }