Banish PARAMS and PTR. Convert to ISO C.
[external/binutils.git] / gas / config / tc-s390.c
1 /* tc-s390.c -- Assemble for the S390
2    Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
3    Free Software Foundation, Inc.
4    Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
5
6    This file is part of GAS, the GNU Assembler.
7
8    GAS is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3, or (at your option)
11    any later version.
12
13    GAS is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with GAS; see the file COPYING.  If not, write to the Free
20    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
21    02110-1301, USA.  */
22
23 #include "as.h"
24 #include "safe-ctype.h"
25 #include "subsegs.h"
26 #include "struc-symbol.h"
27 #include "dwarf2dbg.h"
28 #include "dw2gencfi.h"
29
30 #include "opcode/s390.h"
31 #include "elf/s390.h"
32
33 /* The default architecture.  */
34 #ifndef DEFAULT_ARCH
35 #define DEFAULT_ARCH "s390"
36 #endif
37 static char *default_arch = DEFAULT_ARCH;
38 /* Either 32 or 64, selects file format.  */
39 static int s390_arch_size = 0;
40
41 static unsigned int current_mode_mask = 0;
42 static unsigned int current_cpu = -1U;
43
44 /* Whether to use user friendly register names. Default is TRUE.  */
45 #ifndef TARGET_REG_NAMES_P
46 #define TARGET_REG_NAMES_P TRUE
47 #endif
48
49 static bfd_boolean reg_names_p = TARGET_REG_NAMES_P;
50
51 /* Set to TRUE if we want to warn about zero base/index registers.  */
52 static bfd_boolean warn_areg_zero = FALSE;
53
54 /* Generic assembler global variables which must be defined by all
55    targets.  */
56
57 const char comment_chars[] = "#";
58
59 /* Characters which start a comment at the beginning of a line.  */
60 const char line_comment_chars[] = "#";
61
62 /* Characters which may be used to separate multiple commands on a
63    single line.  */
64 const char line_separator_chars[] = ";";
65
66 /* Characters which are used to indicate an exponent in a floating
67    point number.  */
68 const char EXP_CHARS[] = "eE";
69
70 /* Characters which mean that a number is a floating point constant,
71    as in 0d1.0.  */
72 const char FLT_CHARS[] = "dD";
73
74 /* The dwarf2 data alignment, adjusted for 32 or 64 bit.  */
75 int s390_cie_data_alignment;
76
77 /* The target specific pseudo-ops which we support.  */
78
79 /* Define the prototypes for the pseudo-ops */
80 static void s390_byte (int);
81 static void s390_elf_cons (int);
82 static void s390_bss (int);
83 static void s390_insn (int);
84 static void s390_literals (int);
85
86 const pseudo_typeS md_pseudo_table[] =
87 {
88   { "align", s_align_bytes, 0 },
89   /* Pseudo-ops which must be defined.  */
90   { "bss",      s390_bss,       0 },
91   { "insn",     s390_insn,      0 },
92   /* Pseudo-ops which must be overridden.  */
93   { "byte",     s390_byte,      0 },
94   { "short",    s390_elf_cons,  2 },
95   { "long",     s390_elf_cons,  4 },
96   { "quad",     s390_elf_cons,  8 },
97   { "ltorg",    s390_literals,  0 },
98   { "string",   stringer,       8 + 1 },
99   { NULL,       NULL,           0 }
100 };
101
102
103 /* Structure to hold information about predefined registers.  */
104 struct pd_reg
105   {
106     char *name;
107     int value;
108   };
109
110 /* List of registers that are pre-defined:
111
112    Each access register has a predefined name of the form:
113      a<reg_num> which has the value <reg_num>.
114
115    Each control register has a predefined name of the form:
116      c<reg_num> which has the value <reg_num>.
117
118    Each general register has a predefined name of the form:
119      r<reg_num> which has the value <reg_num>.
120
121    Each floating point register a has predefined name of the form:
122      f<reg_num> which has the value <reg_num>.
123
124    There are individual registers as well:
125      sp     has the value 15
126      lit    has the value 12
127
128    The table is sorted. Suitable for searching by a binary search.  */
129
130 static const struct pd_reg pre_defined_registers[] =
131 {
132   { "a0", 0 },     /* Access registers */
133   { "a1", 1 },
134   { "a10", 10 },
135   { "a11", 11 },
136   { "a12", 12 },
137   { "a13", 13 },
138   { "a14", 14 },
139   { "a15", 15 },
140   { "a2", 2 },
141   { "a3", 3 },
142   { "a4", 4 },
143   { "a5", 5 },
144   { "a6", 6 },
145   { "a7", 7 },
146   { "a8", 8 },
147   { "a9", 9 },
148
149   { "c0", 0 },     /* Control registers */
150   { "c1", 1 },
151   { "c10", 10 },
152   { "c11", 11 },
153   { "c12", 12 },
154   { "c13", 13 },
155   { "c14", 14 },
156   { "c15", 15 },
157   { "c2", 2 },
158   { "c3", 3 },
159   { "c4", 4 },
160   { "c5", 5 },
161   { "c6", 6 },
162   { "c7", 7 },
163   { "c8", 8 },
164   { "c9", 9 },
165
166   { "f0", 0 },     /* Floating point registers */
167   { "f1", 1 },
168   { "f10", 10 },
169   { "f11", 11 },
170   { "f12", 12 },
171   { "f13", 13 },
172   { "f14", 14 },
173   { "f15", 15 },
174   { "f2", 2 },
175   { "f3", 3 },
176   { "f4", 4 },
177   { "f5", 5 },
178   { "f6", 6 },
179   { "f7", 7 },
180   { "f8", 8 },
181   { "f9", 9 },
182
183   { "lit", 13 },   /* Pointer to literal pool */
184
185   { "r0", 0 },     /* General purpose registers */
186   { "r1", 1 },
187   { "r10", 10 },
188   { "r11", 11 },
189   { "r12", 12 },
190   { "r13", 13 },
191   { "r14", 14 },
192   { "r15", 15 },
193   { "r2", 2 },
194   { "r3", 3 },
195   { "r4", 4 },
196   { "r5", 5 },
197   { "r6", 6 },
198   { "r7", 7 },
199   { "r8", 8 },
200   { "r9", 9 },
201
202   { "sp", 15 },   /* Stack pointer */
203
204 };
205
206 #define REG_NAME_CNT (sizeof (pre_defined_registers) / sizeof (struct pd_reg))
207
208 /* Given NAME, find the register number associated with that name, return
209    the integer value associated with the given name or -1 on failure.  */
210
211 static int
212 reg_name_search (const struct pd_reg *regs, int regcount, const char *name)
213 {
214   int middle, low, high;
215   int cmp;
216
217   low = 0;
218   high = regcount - 1;
219
220   do
221     {
222       middle = (low + high) / 2;
223       cmp = strcasecmp (name, regs[middle].name);
224       if (cmp < 0)
225         high = middle - 1;
226       else if (cmp > 0)
227         low = middle + 1;
228       else
229         return regs[middle].value;
230     }
231   while (low <= high);
232
233   return -1;
234 }
235
236
237 /*
238  * Summary of register_name().
239  *
240  * in:  Input_line_pointer points to 1st char of operand.
241  *
242  * out: A expressionS.
243  *      The operand may have been a register: in this case, X_op == O_register,
244  *      X_add_number is set to the register number, and truth is returned.
245  *      Input_line_pointer->(next non-blank) char after operand, or is in its
246  *      original state.
247  */
248
249 static bfd_boolean
250 register_name (expressionS *expressionP)
251 {
252   int reg_number;
253   char *name;
254   char *start;
255   char c;
256
257   /* Find the spelling of the operand.  */
258   start = name = input_line_pointer;
259   if (name[0] == '%' && ISALPHA (name[1]))
260     name = ++input_line_pointer;
261   else
262     return FALSE;
263
264   c = get_symbol_end ();
265   reg_number = reg_name_search (pre_defined_registers, REG_NAME_CNT, name);
266
267   /* Put back the delimiting char.  */
268   *input_line_pointer = c;
269
270   /* Look to see if it's in the register table.  */
271   if (reg_number >= 0)
272     {
273       expressionP->X_op = O_register;
274       expressionP->X_add_number = reg_number;
275
276       /* Make the rest nice.  */
277       expressionP->X_add_symbol = NULL;
278       expressionP->X_op_symbol = NULL;
279       return TRUE;
280     }
281
282   /* Reset the line as if we had not done anything.  */
283   input_line_pointer = start;
284   return FALSE;
285 }
286
287 /* Local variables.  */
288
289 /* Opformat hash table.  */
290 static struct hash_control *s390_opformat_hash;
291
292 /* Opcode hash table.  */
293 static struct hash_control *s390_opcode_hash;
294
295 /* Flags to set in the elf header */
296 static flagword s390_flags = 0;
297
298 symbolS *GOT_symbol;            /* Pre-defined "_GLOBAL_OFFSET_TABLE_" */
299
300 #ifndef WORKING_DOT_WORD
301 int md_short_jump_size = 4;
302 int md_long_jump_size = 4;
303 #endif
304
305 const char *md_shortopts = "A:m:kVQ:";
306 struct option md_longopts[] = {
307   {NULL, no_argument, NULL, 0}
308 };
309 size_t md_longopts_size = sizeof (md_longopts);
310
311 /* Initialize the default opcode arch and word size from the default
312    architecture name if not specified by an option.  */
313 static void
314 init_default_arch (void)
315 {
316   if (strcmp (default_arch, "s390") == 0)
317     {
318       if (s390_arch_size == 0)
319         s390_arch_size = 32;
320     }
321   else if (strcmp (default_arch, "s390x") == 0)
322     {
323       if (s390_arch_size == 0)
324         s390_arch_size = 64;
325     }
326   else
327     as_fatal ("Invalid default architecture, broken assembler.");
328
329   if (current_mode_mask == 0)
330     {
331       if (s390_arch_size == 32)
332         current_mode_mask = 1 << S390_OPCODE_ESA;
333       else
334         current_mode_mask = 1 << S390_OPCODE_ZARCH;
335     }
336   if (current_cpu == -1U)
337     {
338       if (current_mode_mask == (1 << S390_OPCODE_ESA))
339         current_cpu = S390_OPCODE_G5;
340       else
341         current_cpu = S390_OPCODE_Z900;
342     }
343 }
344
345 /* Called by TARGET_FORMAT.  */
346 const char *
347 s390_target_format (void)
348 {
349   /* We don't get a chance to initialize anything before we're called,
350      so handle that now.  */
351   init_default_arch ();
352
353   return s390_arch_size == 64 ? "elf64-s390" : "elf32-s390";
354 }
355
356 int
357 md_parse_option (int c, char *arg)
358 {
359   switch (c)
360     {
361       /* -k: Ignore for FreeBSD compatibility.  */
362     case 'k':
363       break;
364     case 'm':
365       if (arg != NULL && strcmp (arg, "regnames") == 0)
366         reg_names_p = TRUE;
367
368       else if (arg != NULL && strcmp (arg, "no-regnames") == 0)
369         reg_names_p = FALSE;
370
371       else if (arg != NULL && strcmp (arg, "warn-areg-zero") == 0)
372         warn_areg_zero = TRUE;
373
374       else if (arg != NULL && strcmp (arg, "31") == 0)
375         s390_arch_size = 32;
376
377       else if (arg != NULL && strcmp (arg, "64") == 0)
378         s390_arch_size = 64;
379
380       else if (arg != NULL && strcmp (arg, "esa") == 0)
381         current_mode_mask = 1 << S390_OPCODE_ESA;
382
383       else if (arg != NULL && strcmp (arg, "zarch") == 0)
384         current_mode_mask = 1 << S390_OPCODE_ZARCH;
385
386       else if (arg != NULL && strncmp (arg, "arch=", 5) == 0)
387         {
388           if (strcmp (arg + 5, "g5") == 0)
389             current_cpu = S390_OPCODE_G5;
390           else if (strcmp (arg + 5, "g6") == 0)
391             current_cpu = S390_OPCODE_G6;
392           else if (strcmp (arg + 5, "z900") == 0)
393             current_cpu = S390_OPCODE_Z900;
394           else if (strcmp (arg + 5, "z990") == 0)
395             current_cpu = S390_OPCODE_Z990;
396           else if (strcmp (arg + 5, "z9-109") == 0)
397             current_cpu = S390_OPCODE_Z9_109;
398           else if (strcmp (arg + 5, "z9-ec") == 0)
399             current_cpu = S390_OPCODE_Z9_EC;
400           else if (strcmp (arg + 5, "z10") == 0)
401             current_cpu = S390_OPCODE_Z10;
402           else
403             {
404               as_bad (_("invalid switch -m%s"), arg);
405               return 0;
406             }
407         }
408
409       else
410         {
411           as_bad (_("invalid switch -m%s"), arg);
412           return 0;
413         }
414       break;
415
416     case 'A':
417       /* Option -A is deprecated. Still available for compatibility.  */
418       if (arg != NULL && strcmp (arg, "esa") == 0)
419         current_cpu = S390_OPCODE_G5;
420       else if (arg != NULL && strcmp (arg, "esame") == 0)
421         current_cpu = S390_OPCODE_Z900;
422       else
423         as_bad ("invalid architecture -A%s", arg);
424       break;
425
426       /* -V: SVR4 argument to print version ID.  */
427     case 'V':
428       print_version_id ();
429       break;
430
431       /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
432          should be emitted or not.  FIXME: Not implemented.  */
433     case 'Q':
434       break;
435
436     default:
437       return 0;
438     }
439
440   return 1;
441 }
442
443 void
444 md_show_usage (FILE *stream)
445 {
446   fprintf (stream, _("\
447         S390 options:\n\
448         -mregnames        Allow symbolic names for registers\n\
449         -mwarn-areg-zero  Warn about zero base/index registers\n\
450         -mno-regnames     Do not allow symbolic names for registers\n\
451         -m31              Set file format to 31 bit format\n\
452         -m64              Set file format to 64 bit format\n"));
453   fprintf (stream, _("\
454         -V                print assembler version number\n\
455         -Qy, -Qn          ignored\n"));
456 }
457
458 /* This function is called when the assembler starts up.  It is called
459    after the options have been parsed and the output file has been
460    opened.  */
461
462 void
463 md_begin (void)
464 {
465   register const struct s390_opcode *op;
466   const struct s390_opcode *op_end;
467   bfd_boolean dup_insn = FALSE;
468   const char *retval;
469
470   /* Give a warning if the combination -m64-bit and -Aesa is used.  */
471   if (s390_arch_size == 64 && current_cpu < S390_OPCODE_Z900)
472     as_warn ("The 64 bit file format is used without esame instructions.");
473
474   s390_cie_data_alignment = -s390_arch_size / 8;
475
476   /* Set the ELF flags if desired.  */
477   if (s390_flags)
478     bfd_set_private_flags (stdoutput, s390_flags);
479
480   /* Insert the opcode formats into a hash table.  */
481   s390_opformat_hash = hash_new ();
482
483   op_end = s390_opformats + s390_num_opformats;
484   for (op = s390_opformats; op < op_end; op++)
485     {
486       retval = hash_insert (s390_opformat_hash, op->name, (void *) op);
487       if (retval != (const char *) NULL)
488         {
489           as_bad (_("Internal assembler error for instruction format %s"),
490                   op->name);
491           dup_insn = TRUE;
492         }
493     }
494
495   /* Insert the opcodes into a hash table.  */
496   s390_opcode_hash = hash_new ();
497
498   op_end = s390_opcodes + s390_num_opcodes;
499   for (op = s390_opcodes; op < op_end; op++)
500     {
501       while (op < op_end - 1 && strcmp(op->name, op[1].name) == 0)
502         {
503           if (op->min_cpu <= current_cpu && (op->modes & current_mode_mask))
504             break;
505           op++;
506         }
507       retval = hash_insert (s390_opcode_hash, op->name, (void *) op);
508       if (retval != (const char *) NULL)
509         {
510           as_bad (_("Internal assembler error for instruction %s"),
511                   op->name);
512           dup_insn = TRUE;
513         }
514       while (op < op_end - 1 && strcmp (op->name, op[1].name) == 0)
515         op++;
516       }
517
518   if (dup_insn)
519     abort ();
520
521   record_alignment (text_section, 2);
522   record_alignment (data_section, 2);
523   record_alignment (bss_section, 2);
524
525 }
526
527 /* Called after all assembly has been done.  */
528 void
529 s390_md_end (void)
530 {
531   if (s390_arch_size == 64)
532     bfd_set_arch_mach (stdoutput, bfd_arch_s390, bfd_mach_s390_64);
533   else
534     bfd_set_arch_mach (stdoutput, bfd_arch_s390, bfd_mach_s390_31);
535 }
536
537 /* Insert an operand value into an instruction.  */
538
539 static void
540 s390_insert_operand (unsigned char *insn,
541                      const struct s390_operand *operand,
542                      offsetT val,
543                      char *file,
544                      unsigned int line)
545 {
546   addressT uval;
547   int offset;
548
549   if (operand->flags & (S390_OPERAND_SIGNED|S390_OPERAND_PCREL))
550     {
551       offsetT min, max;
552
553       max = ((offsetT) 1 << (operand->bits - 1)) - 1;
554       min = - ((offsetT) 1 << (operand->bits - 1));
555       /* Halve PCREL operands.  */
556       if (operand->flags & S390_OPERAND_PCREL)
557         val >>= 1;
558       /* Check for underflow / overflow.  */
559       if (val < min || val > max)
560         {
561           const char *err =
562             "operand out of range (%s not between %ld and %ld)";
563           char buf[100];
564
565           if (operand->flags & S390_OPERAND_PCREL)
566             {
567               val <<= 1;
568               min <<= 1;
569               max <<= 1;
570             }
571           sprint_value (buf, val);
572           if (file == (char *) NULL)
573             as_bad (err, buf, (int) min, (int) max);
574           else
575             as_bad_where (file, line, err, buf, (int) min, (int) max);
576           return;
577         }
578       /* val is ok, now restrict it to operand->bits bits.  */
579       uval = (addressT) val & ((((addressT) 1 << (operand->bits-1)) << 1) - 1);
580       /* val is restrict, now check for special case.  */
581       if (operand->bits == 20 && operand->shift == 20)
582         uval = (uval >> 12) | ((uval & 0xfff) << 8);
583     }
584   else
585     {
586       addressT min, max;
587
588       max = (((addressT) 1 << (operand->bits - 1)) << 1) - 1;
589       min = (offsetT) 0;
590       uval = (addressT) val;
591       /* Length x in an instructions has real length x+1.  */
592       if (operand->flags & S390_OPERAND_LENGTH)
593         uval--;
594       /* Check for underflow / overflow.  */
595       if (uval < min || uval > max)
596         {
597           if (operand->flags & S390_OPERAND_LENGTH)
598             {
599               uval++;
600               min++;
601               max++;
602             }
603
604           as_bad_value_out_of_range (_("operand"), uval, (offsetT) min, (offsetT) max, file, line);
605
606           return;
607         }
608     }
609
610   /* Insert fragments of the operand byte for byte.  */
611   offset = operand->shift + operand->bits;
612   uval <<= (-offset) & 7;
613   insn += (offset - 1) / 8;
614   while (uval != 0)
615     {
616       *insn-- |= uval;
617       uval >>= 8;
618     }
619 }
620
621 struct map_tls
622   {
623     char *string;
624     int length;
625     bfd_reloc_code_real_type reloc;
626   };
627
628 /* Parse tls marker and return the desired relocation.  */
629 static bfd_reloc_code_real_type
630 s390_tls_suffix (char **str_p, expressionS *exp_p)
631 {
632   static struct map_tls mapping[] =
633   {
634     { "tls_load", 8, BFD_RELOC_390_TLS_LOAD },
635     { "tls_gdcall", 10, BFD_RELOC_390_TLS_GDCALL  },
636     { "tls_ldcall", 10, BFD_RELOC_390_TLS_LDCALL  },
637     { NULL,  0, BFD_RELOC_UNUSED }
638   };
639   struct map_tls *ptr;
640   char *orig_line;
641   char *str;
642   char *ident;
643   int len;
644
645   str = *str_p;
646   if (*str++ != ':')
647     return BFD_RELOC_UNUSED;
648
649   ident = str;
650   while (ISIDNUM (*str))
651     str++;
652   len = str - ident;
653   if (*str++ != ':')
654     return BFD_RELOC_UNUSED;
655
656   orig_line = input_line_pointer;
657   input_line_pointer = str;
658   expression (exp_p);
659   str = input_line_pointer;
660   if (&input_line_pointer != str_p)
661     input_line_pointer = orig_line;
662
663   if (exp_p->X_op != O_symbol)
664     return BFD_RELOC_UNUSED;
665
666   for (ptr = &mapping[0]; ptr->length > 0; ptr++)
667     if (len == ptr->length
668         && strncasecmp (ident, ptr->string, ptr->length) == 0)
669       {
670         /* Found a matching tls suffix.  */
671         *str_p = str;
672         return ptr->reloc;
673       }
674   return BFD_RELOC_UNUSED;
675 }
676
677 /* Structure used to hold suffixes.  */
678 typedef enum
679   {
680     ELF_SUFFIX_NONE = 0,
681     ELF_SUFFIX_GOT,
682     ELF_SUFFIX_PLT,
683     ELF_SUFFIX_GOTENT,
684     ELF_SUFFIX_GOTOFF,
685     ELF_SUFFIX_GOTPLT,
686     ELF_SUFFIX_PLTOFF,
687     ELF_SUFFIX_TLS_GD,
688     ELF_SUFFIX_TLS_GOTIE,
689     ELF_SUFFIX_TLS_IE,
690     ELF_SUFFIX_TLS_LDM,
691     ELF_SUFFIX_TLS_LDO,
692     ELF_SUFFIX_TLS_LE
693   }
694 elf_suffix_type;
695
696 struct map_bfd
697   {
698     char *string;
699     int length;
700     elf_suffix_type suffix;
701   };
702
703
704 /* Parse @got/@plt/@gotoff. and return the desired relocation.  */
705 static elf_suffix_type
706 s390_elf_suffix (char **str_p, expressionS *exp_p)
707 {
708   static struct map_bfd mapping[] =
709   {
710     { "got", 3, ELF_SUFFIX_GOT  },
711     { "got12", 5, ELF_SUFFIX_GOT  },
712     { "plt", 3, ELF_SUFFIX_PLT  },
713     { "gotent", 6, ELF_SUFFIX_GOTENT },
714     { "gotoff", 6, ELF_SUFFIX_GOTOFF },
715     { "gotplt", 6, ELF_SUFFIX_GOTPLT },
716     { "pltoff", 6, ELF_SUFFIX_PLTOFF },
717     { "tlsgd", 5, ELF_SUFFIX_TLS_GD },
718     { "gotntpoff", 9, ELF_SUFFIX_TLS_GOTIE },
719     { "indntpoff", 9, ELF_SUFFIX_TLS_IE },
720     { "tlsldm", 6, ELF_SUFFIX_TLS_LDM },
721     { "dtpoff", 6, ELF_SUFFIX_TLS_LDO },
722     { "ntpoff", 6, ELF_SUFFIX_TLS_LE },
723     { NULL,  0, ELF_SUFFIX_NONE }
724   };
725
726   struct map_bfd *ptr;
727   char *str = *str_p;
728   char *ident;
729   int len;
730
731   if (*str++ != '@')
732     return ELF_SUFFIX_NONE;
733
734   ident = str;
735   while (ISALNUM (*str))
736     str++;
737   len = str - ident;
738
739   for (ptr = &mapping[0]; ptr->length > 0; ptr++)
740     if (len == ptr->length
741         && strncasecmp (ident, ptr->string, ptr->length) == 0)
742       {
743         if (exp_p->X_add_number != 0)
744           as_warn (_("identifier+constant@%s means identifier@%s+constant"),
745                    ptr->string, ptr->string);
746         /* Now check for identifier@suffix+constant.  */
747         if (*str == '-' || *str == '+')
748           {
749             char *orig_line = input_line_pointer;
750             expressionS new_exp;
751
752             input_line_pointer = str;
753             expression (&new_exp);
754
755             switch (new_exp.X_op)
756               {
757               case O_constant: /* X_add_number (a constant expression).  */
758                 exp_p->X_add_number += new_exp.X_add_number;
759                 str = input_line_pointer;
760                 break;
761               case O_symbol:   /* X_add_symbol + X_add_number.  */
762                 /* this case is used for e.g. xyz@PLT+.Label.  */
763                 exp_p->X_add_number += new_exp.X_add_number;
764                 exp_p->X_op_symbol = new_exp.X_add_symbol;
765                 exp_p->X_op = O_add;
766                 str = input_line_pointer;
767                 break;
768               case O_uminus:   /* (- X_add_symbol) + X_add_number.  */
769                 /* this case is used for e.g. xyz@PLT-.Label.  */
770                 exp_p->X_add_number += new_exp.X_add_number;
771                 exp_p->X_op_symbol = new_exp.X_add_symbol;
772                 exp_p->X_op = O_subtract;
773                 str = input_line_pointer;
774                 break;
775               default:
776                 break;
777               }
778
779             /* If s390_elf_suffix has not been called with
780                &input_line_pointer as first parameter, we have
781                clobbered the input_line_pointer. We have to
782                undo that.  */
783             if (&input_line_pointer != str_p)
784               input_line_pointer = orig_line;
785           }
786         *str_p = str;
787         return ptr->suffix;
788       }
789
790   return BFD_RELOC_UNUSED;
791 }
792
793 /* Structure used to hold a literal pool entry.  */
794 struct s390_lpe
795   {
796     struct s390_lpe *next;
797     expressionS ex;
798     FLONUM_TYPE floatnum;     /* used if X_op == O_big && X_add_number <= 0 */
799     LITTLENUM_TYPE bignum[4]; /* used if X_op == O_big && X_add_number > 0  */
800     int nbytes;
801     bfd_reloc_code_real_type reloc;
802     symbolS *sym;
803   };
804
805 static struct s390_lpe *lpe_free_list = NULL;
806 static struct s390_lpe *lpe_list = NULL;
807 static struct s390_lpe *lpe_list_tail = NULL;
808 static symbolS *lp_sym = NULL;
809 static int lp_count = 0;
810 static int lpe_count = 0;
811
812 static int
813 s390_exp_compare (expressionS *exp1, expressionS *exp2)
814 {
815   if (exp1->X_op != exp2->X_op)
816     return 0;
817
818   switch (exp1->X_op)
819     {
820     case O_constant:   /* X_add_number must be equal.  */
821     case O_register:
822       return exp1->X_add_number == exp2->X_add_number;
823
824     case O_big:
825       as_bad (_("Can't handle O_big in s390_exp_compare"));
826
827     case O_symbol:     /* X_add_symbol & X_add_number must be equal.  */
828     case O_symbol_rva:
829     case O_uminus:
830     case O_bit_not:
831     case O_logical_not:
832       return (exp1->X_add_symbol == exp2->X_add_symbol)
833         &&   (exp1->X_add_number == exp2->X_add_number);
834
835     case O_multiply:   /* X_add_symbol,X_op_symbol&X_add_number must be equal.  */
836     case O_divide:
837     case O_modulus:
838     case O_left_shift:
839     case O_right_shift:
840     case O_bit_inclusive_or:
841     case O_bit_or_not:
842     case O_bit_exclusive_or:
843     case O_bit_and:
844     case O_add:
845     case O_subtract:
846     case O_eq:
847     case O_ne:
848     case O_lt:
849     case O_le:
850     case O_ge:
851     case O_gt:
852     case O_logical_and:
853     case O_logical_or:
854       return (exp1->X_add_symbol == exp2->X_add_symbol)
855         &&   (exp1->X_op_symbol  == exp2->X_op_symbol)
856         &&   (exp1->X_add_number == exp2->X_add_number);
857     default:
858       return 0;
859     }
860 }
861
862 /* Test for @lit and if its present make an entry in the literal pool and
863    modify the current expression to be an offset into the literal pool.  */
864 static elf_suffix_type
865 s390_lit_suffix (char **str_p, expressionS *exp_p, elf_suffix_type suffix)
866 {
867   bfd_reloc_code_real_type reloc;
868   char tmp_name[64];
869   char *str = *str_p;
870   char *ident;
871   struct s390_lpe *lpe;
872   int nbytes, len;
873
874   if (*str++ != ':')
875     return suffix;       /* No modification.  */
876
877   /* We look for a suffix of the form "@lit1", "@lit2", "@lit4" or "@lit8".  */
878   ident = str;
879   while (ISALNUM (*str))
880     str++;
881   len = str - ident;
882   if (len != 4 || strncasecmp (ident, "lit", 3) != 0
883       || (ident[3]!='1' && ident[3]!='2' && ident[3]!='4' && ident[3]!='8'))
884     return suffix;      /* no modification */
885   nbytes = ident[3] - '0';
886
887   reloc = BFD_RELOC_UNUSED;
888   if (suffix == ELF_SUFFIX_GOT)
889     {
890       if (nbytes == 2)
891         reloc = BFD_RELOC_390_GOT16;
892       else if (nbytes == 4)
893         reloc = BFD_RELOC_32_GOT_PCREL;
894       else if (nbytes == 8)
895         reloc = BFD_RELOC_390_GOT64;
896     }
897   else if (suffix == ELF_SUFFIX_PLT)
898     {
899       if (nbytes == 4)
900         reloc = BFD_RELOC_390_PLT32;
901       else if (nbytes == 8)
902         reloc = BFD_RELOC_390_PLT64;
903     }
904
905   if (suffix != ELF_SUFFIX_NONE && reloc == BFD_RELOC_UNUSED)
906     as_bad (_("Invalid suffix for literal pool entry"));
907
908   /* Search the pool if the new entry is a duplicate.  */
909   if (exp_p->X_op == O_big)
910     {
911       /* Special processing for big numbers.  */
912       for (lpe = lpe_list; lpe != NULL; lpe = lpe->next)
913         {
914           if (lpe->ex.X_op == O_big)
915             {
916               if (exp_p->X_add_number <= 0 && lpe->ex.X_add_number <= 0)
917                 {
918                   if (memcmp (&generic_floating_point_number, &lpe->floatnum,
919                               sizeof (FLONUM_TYPE)) == 0)
920                     break;
921                 }
922               else if (exp_p->X_add_number == lpe->ex.X_add_number)
923                 {
924                   if (memcmp (generic_bignum, lpe->bignum,
925                               sizeof (LITTLENUM_TYPE)*exp_p->X_add_number) == 0)
926                     break;
927                 }
928             }
929         }
930     }
931   else
932     {
933       /* Processing for 'normal' data types.  */
934       for (lpe = lpe_list; lpe != NULL; lpe = lpe->next)
935         if (lpe->nbytes == nbytes && lpe->reloc == reloc
936             && s390_exp_compare (exp_p, &lpe->ex) != 0)
937           break;
938     }
939
940   if (lpe == NULL)
941     {
942       /* A new literal.  */
943       if (lpe_free_list != NULL)
944         {
945           lpe = lpe_free_list;
946           lpe_free_list = lpe_free_list->next;
947         }
948       else
949         {
950           lpe = (struct s390_lpe *) xmalloc (sizeof (struct s390_lpe));
951         }
952
953       lpe->ex = *exp_p;
954
955       if (exp_p->X_op == O_big)
956         {
957           if (exp_p->X_add_number <= 0)
958             lpe->floatnum = generic_floating_point_number;
959           else if (exp_p->X_add_number <= 4)
960             memcpy (lpe->bignum, generic_bignum,
961                     exp_p->X_add_number * sizeof (LITTLENUM_TYPE));
962           else
963             as_bad (_("Big number is too big"));
964         }
965
966       lpe->nbytes = nbytes;
967       lpe->reloc = reloc;
968       /* Literal pool name defined ?  */
969       if (lp_sym == NULL)
970         {
971           sprintf (tmp_name, ".L\001%i", lp_count);
972           lp_sym = symbol_make (tmp_name);
973         }
974
975       /* Make name for literal pool entry.  */
976       sprintf (tmp_name, ".L\001%i\002%i", lp_count, lpe_count);
977       lpe_count++;
978       lpe->sym = symbol_make (tmp_name);
979
980       /* Add to literal pool list.  */
981       lpe->next = NULL;
982       if (lpe_list_tail != NULL)
983         {
984           lpe_list_tail->next = lpe;
985           lpe_list_tail = lpe;
986         }
987       else
988         lpe_list = lpe_list_tail = lpe;
989     }
990
991   /* Now change exp_p to the offset into the literal pool.
992      Thats the expression: .L^Ax^By-.L^Ax   */
993   exp_p->X_add_symbol = lpe->sym;
994   exp_p->X_op_symbol = lp_sym;
995   exp_p->X_op = O_subtract;
996   exp_p->X_add_number = 0;
997
998   *str_p = str;
999
1000   /* We change the suffix type to ELF_SUFFIX_NONE, because
1001      the difference of two local labels is just a number.  */
1002   return ELF_SUFFIX_NONE;
1003 }
1004
1005 /* Like normal .long/.short/.word, except support @got, etc.
1006    clobbers input_line_pointer, checks end-of-line.  */
1007 static void
1008 s390_elf_cons (int nbytes /* 1=.byte, 2=.word, 4=.long */)
1009 {
1010   expressionS exp;
1011   elf_suffix_type suffix;
1012
1013   if (is_it_end_of_statement ())
1014     {
1015       demand_empty_rest_of_line ();
1016       return;
1017     }
1018
1019   do
1020     {
1021       expression (&exp);
1022
1023       if (exp.X_op == O_symbol
1024           && *input_line_pointer == '@'
1025           && (suffix = s390_elf_suffix (&input_line_pointer, &exp)) != ELF_SUFFIX_NONE)
1026         {
1027           bfd_reloc_code_real_type reloc;
1028           reloc_howto_type *reloc_howto;
1029           int size;
1030           char *where;
1031
1032           if (nbytes == 2)
1033             {
1034               static bfd_reloc_code_real_type tab2[] =
1035                 {
1036                   BFD_RELOC_UNUSED,             /* ELF_SUFFIX_NONE  */
1037                   BFD_RELOC_390_GOT16,          /* ELF_SUFFIX_GOT  */
1038                   BFD_RELOC_UNUSED,             /* ELF_SUFFIX_PLT  */
1039                   BFD_RELOC_UNUSED,             /* ELF_SUFFIX_GOTENT  */
1040                   BFD_RELOC_16_GOTOFF,          /* ELF_SUFFIX_GOTOFF  */
1041                   BFD_RELOC_UNUSED,             /* ELF_SUFFIX_GOTPLT  */
1042                   BFD_RELOC_390_PLTOFF16,       /* ELF_SUFFIX_PLTOFF  */
1043                   BFD_RELOC_UNUSED,             /* ELF_SUFFIX_TLS_GD  */
1044                   BFD_RELOC_UNUSED,             /* ELF_SUFFIX_TLS_GOTIE  */
1045                   BFD_RELOC_UNUSED,             /* ELF_SUFFIX_TLS_IE  */
1046                   BFD_RELOC_UNUSED,             /* ELF_SUFFIX_TLS_LDM  */
1047                   BFD_RELOC_UNUSED,             /* ELF_SUFFIX_TLS_LDO  */
1048                   BFD_RELOC_UNUSED              /* ELF_SUFFIX_TLS_LE  */
1049                 };
1050               reloc = tab2[suffix];
1051             }
1052           else if (nbytes == 4)
1053             {
1054               static bfd_reloc_code_real_type tab4[] =
1055                 {
1056                   BFD_RELOC_UNUSED,             /* ELF_SUFFIX_NONE  */
1057                   BFD_RELOC_32_GOT_PCREL,       /* ELF_SUFFIX_GOT  */
1058                   BFD_RELOC_390_PLT32,          /* ELF_SUFFIX_PLT  */
1059                   BFD_RELOC_UNUSED,             /* ELF_SUFFIX_GOTENT  */
1060                   BFD_RELOC_32_GOTOFF,          /* ELF_SUFFIX_GOTOFF  */
1061                   BFD_RELOC_390_GOTPLT32,       /* ELF_SUFFIX_GOTPLT  */
1062                   BFD_RELOC_390_PLTOFF32,       /* ELF_SUFFIX_PLTOFF  */
1063                   BFD_RELOC_390_TLS_GD32,       /* ELF_SUFFIX_TLS_GD  */
1064                   BFD_RELOC_390_TLS_GOTIE32,    /* ELF_SUFFIX_TLS_GOTIE  */
1065                   BFD_RELOC_390_TLS_IE32,       /* ELF_SUFFIX_TLS_IE  */
1066                   BFD_RELOC_390_TLS_LDM32,      /* ELF_SUFFIX_TLS_LDM  */
1067                   BFD_RELOC_390_TLS_LDO32,      /* ELF_SUFFIX_TLS_LDO  */
1068                   BFD_RELOC_390_TLS_LE32        /* ELF_SUFFIX_TLS_LE  */
1069                 };
1070               reloc = tab4[suffix];
1071             }
1072           else if (nbytes == 8)
1073             {
1074               static bfd_reloc_code_real_type tab8[] =
1075                 {
1076                   BFD_RELOC_UNUSED,             /* ELF_SUFFIX_NONE  */
1077                   BFD_RELOC_390_GOT64,          /* ELF_SUFFIX_GOT  */
1078                   BFD_RELOC_390_PLT64,          /* ELF_SUFFIX_PLT  */
1079                   BFD_RELOC_UNUSED,             /* ELF_SUFFIX_GOTENT  */
1080                   BFD_RELOC_390_GOTOFF64,       /* ELF_SUFFIX_GOTOFF  */
1081                   BFD_RELOC_390_GOTPLT64,       /* ELF_SUFFIX_GOTPLT  */
1082                   BFD_RELOC_390_PLTOFF64,       /* ELF_SUFFIX_PLTOFF  */
1083                   BFD_RELOC_390_TLS_GD64,       /* ELF_SUFFIX_TLS_GD  */
1084                   BFD_RELOC_390_TLS_GOTIE64,    /* ELF_SUFFIX_TLS_GOTIE  */
1085                   BFD_RELOC_390_TLS_IE64,       /* ELF_SUFFIX_TLS_IE  */
1086                   BFD_RELOC_390_TLS_LDM64,      /* ELF_SUFFIX_TLS_LDM  */
1087                   BFD_RELOC_390_TLS_LDO64,      /* ELF_SUFFIX_TLS_LDO  */
1088                   BFD_RELOC_390_TLS_LE64        /* ELF_SUFFIX_TLS_LE  */
1089                 };
1090               reloc = tab8[suffix];
1091             }
1092           else
1093             reloc = BFD_RELOC_UNUSED;
1094
1095           if (reloc != BFD_RELOC_UNUSED
1096               && (reloc_howto = bfd_reloc_type_lookup (stdoutput, reloc)))
1097             {
1098               size = bfd_get_reloc_size (reloc_howto);
1099               if (size > nbytes)
1100                 as_bad (_("%s relocations do not fit in %d bytes"),
1101                         reloc_howto->name, nbytes);
1102               where = frag_more (nbytes);
1103               md_number_to_chars (where, 0, size);
1104               /* To make fixup_segment do the pc relative conversion the
1105                  pcrel parameter on the fix_new_exp call needs to be FALSE.  */
1106               fix_new_exp (frag_now, where - frag_now->fr_literal,
1107                            size, &exp, FALSE, reloc);
1108             }
1109           else
1110             as_bad (_("relocation not applicable"));
1111         }
1112       else
1113         emit_expr (&exp, (unsigned int) nbytes);
1114     }
1115   while (*input_line_pointer++ == ',');
1116
1117   input_line_pointer--;         /* Put terminator back into stream.  */
1118   demand_empty_rest_of_line ();
1119 }
1120
1121 /* We need to keep a list of fixups.  We can't simply generate them as
1122    we go, because that would require us to first create the frag, and
1123    that would screw up references to ``.''.  */
1124
1125 struct s390_fixup
1126   {
1127     expressionS exp;
1128     int opindex;
1129     bfd_reloc_code_real_type reloc;
1130   };
1131
1132 #define MAX_INSN_FIXUPS (4)
1133
1134 /* This routine is called for each instruction to be assembled.  */
1135
1136 static char *
1137 md_gather_operands (char *str,
1138                     unsigned char *insn,
1139                     const struct s390_opcode *opcode)
1140 {
1141   struct s390_fixup fixups[MAX_INSN_FIXUPS];
1142   const struct s390_operand *operand;
1143   const unsigned char *opindex_ptr;
1144   expressionS ex;
1145   elf_suffix_type suffix;
1146   bfd_reloc_code_real_type reloc;
1147   int skip_optional;
1148   int parentheses;
1149   char *f;
1150   int fc, i;
1151
1152   while (ISSPACE (*str))
1153     str++;
1154
1155   parentheses = 0;
1156   skip_optional = 0;
1157
1158   /* Gather the operands.  */
1159   fc = 0;
1160   for (opindex_ptr = opcode->operands; *opindex_ptr != 0; opindex_ptr++)
1161     {
1162       char *hold;
1163
1164       operand = s390_operands + *opindex_ptr;
1165
1166       if (skip_optional && (operand->flags & S390_OPERAND_INDEX))
1167         {
1168           /* We do an early skip. For D(X,B) constructions the index
1169              register is skipped (X is optional). For D(L,B) the base
1170              register will be the skipped operand, because L is NOT
1171              optional.  */
1172           skip_optional = 0;
1173           continue;
1174         }
1175
1176       /* Gather the operand.  */
1177       hold = input_line_pointer;
1178       input_line_pointer = str;
1179
1180       /* Parse the operand.  */
1181       if (! register_name (&ex))
1182         expression (&ex);
1183
1184       str = input_line_pointer;
1185       input_line_pointer = hold;
1186
1187       /* Write the operand to the insn.  */
1188       if (ex.X_op == O_illegal)
1189         as_bad (_("illegal operand"));
1190       else if (ex.X_op == O_absent)
1191         as_bad (_("missing operand"));
1192       else if (ex.X_op == O_register || ex.X_op == O_constant)
1193         {
1194           s390_lit_suffix (&str, &ex, ELF_SUFFIX_NONE);
1195
1196           if (ex.X_op != O_register && ex.X_op != O_constant)
1197             {
1198               /* We need to generate a fixup for the
1199                  expression returned by s390_lit_suffix.  */
1200               if (fc >= MAX_INSN_FIXUPS)
1201                 as_fatal (_("too many fixups"));
1202               fixups[fc].exp = ex;
1203               fixups[fc].opindex = *opindex_ptr;
1204               fixups[fc].reloc = BFD_RELOC_UNUSED;
1205               ++fc;
1206             }
1207           else
1208             {
1209               if ((operand->flags & S390_OPERAND_INDEX)
1210                   && ex.X_add_number == 0
1211                   && warn_areg_zero)
1212                 as_warn ("index register specified but zero");
1213               if ((operand->flags & S390_OPERAND_BASE)
1214                   && ex.X_add_number == 0
1215                   && warn_areg_zero)
1216                 as_warn ("base register specified but zero");
1217               s390_insert_operand (insn, operand, ex.X_add_number, NULL, 0);
1218             }
1219         }
1220       else
1221         {
1222           suffix = s390_elf_suffix (&str, &ex);
1223           suffix = s390_lit_suffix (&str, &ex, suffix);
1224           reloc = BFD_RELOC_UNUSED;
1225
1226           if (suffix == ELF_SUFFIX_GOT)
1227             {
1228               if ((operand->flags & S390_OPERAND_DISP) &&
1229                   (operand->bits == 12))
1230                 reloc = BFD_RELOC_390_GOT12;
1231               else if ((operand->flags & S390_OPERAND_DISP) &&
1232                        (operand->bits == 20))
1233                 reloc = BFD_RELOC_390_GOT20;
1234               else if ((operand->flags & S390_OPERAND_SIGNED)
1235                        && (operand->bits == 16))
1236                 reloc = BFD_RELOC_390_GOT16;
1237               else if ((operand->flags & S390_OPERAND_PCREL)
1238                        && (operand->bits == 32))
1239                 reloc = BFD_RELOC_390_GOTENT;
1240             }
1241           else if (suffix == ELF_SUFFIX_PLT)
1242             {
1243               if ((operand->flags & S390_OPERAND_PCREL)
1244                   && (operand->bits == 16))
1245                 reloc = BFD_RELOC_390_PLT16DBL;
1246               else if ((operand->flags & S390_OPERAND_PCREL)
1247                        && (operand->bits == 32))
1248                 reloc = BFD_RELOC_390_PLT32DBL;
1249             }
1250           else if (suffix == ELF_SUFFIX_GOTENT)
1251             {
1252               if ((operand->flags & S390_OPERAND_PCREL)
1253                   && (operand->bits == 32))
1254                 reloc = BFD_RELOC_390_GOTENT;
1255             }
1256           else if (suffix == ELF_SUFFIX_GOTOFF)
1257             {
1258               if ((operand->flags & S390_OPERAND_SIGNED)
1259                   && (operand->bits == 16))
1260                 reloc = BFD_RELOC_16_GOTOFF;
1261             }
1262           else if (suffix == ELF_SUFFIX_PLTOFF)
1263             {
1264               if ((operand->flags & S390_OPERAND_SIGNED)
1265                   && (operand->bits == 16))
1266                 reloc = BFD_RELOC_390_PLTOFF16;
1267             }
1268           else if (suffix == ELF_SUFFIX_GOTPLT)
1269             {
1270               if ((operand->flags & S390_OPERAND_DISP)
1271                   && (operand->bits == 12))
1272                 reloc = BFD_RELOC_390_GOTPLT12;
1273               else if ((operand->flags & S390_OPERAND_SIGNED)
1274                        && (operand->bits == 16))
1275                 reloc = BFD_RELOC_390_GOTPLT16;
1276               else if ((operand->flags & S390_OPERAND_PCREL)
1277                        && (operand->bits == 32))
1278                 reloc = BFD_RELOC_390_GOTPLTENT;
1279             }
1280           else if (suffix == ELF_SUFFIX_TLS_GOTIE)
1281             {
1282               if ((operand->flags & S390_OPERAND_DISP)
1283                   && (operand->bits == 12))
1284                 reloc = BFD_RELOC_390_TLS_GOTIE12;
1285               else if ((operand->flags & S390_OPERAND_DISP)
1286                        && (operand->bits == 20))
1287                 reloc = BFD_RELOC_390_TLS_GOTIE20;
1288             }
1289           else if (suffix == ELF_SUFFIX_TLS_IE)
1290             {
1291               if ((operand->flags & S390_OPERAND_PCREL)
1292                        && (operand->bits == 32))
1293                 reloc = BFD_RELOC_390_TLS_IEENT;
1294             }
1295
1296           if (suffix != ELF_SUFFIX_NONE && reloc == BFD_RELOC_UNUSED)
1297             as_bad (_("invalid operand suffix"));
1298           /* We need to generate a fixup of type 'reloc' for this
1299              expression.  */
1300           if (fc >= MAX_INSN_FIXUPS)
1301             as_fatal (_("too many fixups"));
1302           fixups[fc].exp = ex;
1303           fixups[fc].opindex = *opindex_ptr;
1304           fixups[fc].reloc = reloc;
1305           ++fc;
1306         }
1307
1308       /* Check the next character. The call to expression has advanced
1309          str past any whitespace.  */
1310       if (operand->flags & S390_OPERAND_DISP)
1311         {
1312           /* After a displacement a block in parentheses can start.  */
1313           if (*str != '(')
1314             {
1315               /* Check if parenthesized block can be skipped. If the next
1316                  operand is neiter an optional operand nor a base register
1317                  then we have a syntax error.  */
1318               operand = s390_operands + *(++opindex_ptr);
1319               if (!(operand->flags & (S390_OPERAND_INDEX|S390_OPERAND_BASE)))
1320                 as_bad (_("syntax error; missing '(' after displacement"));
1321
1322               /* Ok, skip all operands until S390_OPERAND_BASE.  */
1323               while (!(operand->flags & S390_OPERAND_BASE))
1324                 operand = s390_operands + *(++opindex_ptr);
1325
1326               /* If there is a next operand it must be separated by a comma.  */
1327               if (opindex_ptr[1] != '\0')
1328                 {
1329                   if (*str != ',')
1330                     {
1331                       while (opindex_ptr[1] != '\0')
1332                         {
1333                           operand = s390_operands + *(++opindex_ptr);
1334                           if (operand->flags & S390_OPERAND_OPTIONAL)
1335                             continue;
1336                           as_bad (_("syntax error; expected ,"));
1337                           break;
1338                         }
1339                     }
1340                   else
1341                     str++;
1342                 }
1343             }
1344           else
1345             {
1346               /* We found an opening parentheses.  */
1347               str++;
1348               for (f = str; *f != '\0'; f++)
1349                 if (*f == ',' || *f == ')')
1350                   break;
1351               /* If there is no comma until the closing parentheses OR
1352                  there is a comma right after the opening parentheses,
1353                  we have to skip optional operands.  */
1354               if (*f == ',' && f == str)
1355                 {
1356                   /* comma directly after '(' ? */
1357                   skip_optional = 1;
1358                   str++;
1359                 }
1360               else
1361                 skip_optional = (*f != ',');
1362             }
1363         }
1364       else if (operand->flags & S390_OPERAND_BASE)
1365         {
1366           /* After the base register the parenthesed block ends.  */
1367           if (*str++ != ')')
1368             as_bad (_("syntax error; missing ')' after base register"));
1369           skip_optional = 0;
1370           /* If there is a next operand it must be separated by a comma.  */
1371           if (opindex_ptr[1] != '\0')
1372             {
1373               if (*str != ',')
1374                 {
1375                   while (opindex_ptr[1] != '\0')
1376                     {
1377                       operand = s390_operands + *(++opindex_ptr);
1378                       if (operand->flags & S390_OPERAND_OPTIONAL)
1379                         continue;
1380                       as_bad (_("syntax error; expected ,"));
1381                       break;
1382                     }
1383                 }
1384               else
1385                 str++;
1386             }
1387         }
1388       else
1389         {
1390           /* We can find an 'early' closing parentheses in e.g. D(L) instead
1391              of D(L,B).  In this case the base register has to be skipped.  */
1392           if (*str == ')')
1393             {
1394               operand = s390_operands + *(++opindex_ptr);
1395
1396               if (!(operand->flags & S390_OPERAND_BASE))
1397                 as_bad (_("syntax error; ')' not allowed here"));
1398               str++;
1399             }
1400           /* If there is a next operand it must be separated by a comma.  */
1401           if (opindex_ptr[1] != '\0')
1402             {
1403               if (*str != ',')
1404                 {
1405                   while (opindex_ptr[1] != '\0')
1406                     {
1407                       operand = s390_operands + *(++opindex_ptr);
1408                       if (operand->flags & S390_OPERAND_OPTIONAL)
1409                         continue;
1410                       as_bad (_("syntax error; expected ,"));
1411                       break;
1412                     }
1413                 }
1414               else
1415                 str++;
1416             }
1417         }
1418     }
1419
1420   while (ISSPACE (*str))
1421     ++str;
1422
1423   /* Check for tls instruction marker.  */
1424   reloc = s390_tls_suffix (&str, &ex);
1425   if (reloc != BFD_RELOC_UNUSED)
1426     {
1427       /* We need to generate a fixup of type 'reloc' for this
1428          instruction.  */
1429       if (fc >= MAX_INSN_FIXUPS)
1430         as_fatal (_("too many fixups"));
1431       fixups[fc].exp = ex;
1432       fixups[fc].opindex = -1;
1433       fixups[fc].reloc = reloc;
1434       ++fc;
1435     }
1436
1437   if (*str != '\0')
1438     {
1439       char *linefeed;
1440
1441       if ((linefeed = strchr (str, '\n')) != NULL)
1442         *linefeed = '\0';
1443       as_bad (_("junk at end of line: `%s'"), str);
1444       if (linefeed != NULL)
1445         *linefeed = '\n';
1446     }
1447
1448   /* Write out the instruction.  */
1449   f = frag_more (opcode->oplen);
1450   memcpy (f, insn, opcode->oplen);
1451   dwarf2_emit_insn (opcode->oplen);
1452
1453   /* Create any fixups.  At this point we do not use a
1454      bfd_reloc_code_real_type, but instead just use the
1455      BFD_RELOC_UNUSED plus the operand index.  This lets us easily
1456      handle fixups for any operand type, although that is admittedly
1457      not a very exciting feature.  We pick a BFD reloc type in
1458      md_apply_fix.  */
1459   for (i = 0; i < fc; i++)
1460     {
1461
1462       if (fixups[i].opindex < 0)
1463         {
1464           /* Create tls instruction marker relocation.  */
1465           fix_new_exp (frag_now, f - frag_now->fr_literal, opcode->oplen,
1466                        &fixups[i].exp, 0, fixups[i].reloc);
1467           continue;
1468         }
1469
1470       operand = s390_operands + fixups[i].opindex;
1471
1472       if (fixups[i].reloc != BFD_RELOC_UNUSED)
1473         {
1474           reloc_howto_type *reloc_howto;
1475           fixS *fixP;
1476           int size;
1477
1478           reloc_howto = bfd_reloc_type_lookup (stdoutput, fixups[i].reloc);
1479           if (!reloc_howto)
1480             abort ();
1481
1482           size = bfd_get_reloc_size (reloc_howto);
1483
1484           if (size < 1 || size > 4)
1485             abort ();
1486
1487           fixP = fix_new_exp (frag_now,
1488                               f - frag_now->fr_literal + (operand->shift/8),
1489                               size, &fixups[i].exp, reloc_howto->pc_relative,
1490                               fixups[i].reloc);
1491           /* Turn off overflow checking in fixup_segment. This is necessary
1492              because fixup_segment will signal an overflow for large 4 byte
1493              quantities for GOT12 relocations.  */
1494           if (   fixups[i].reloc == BFD_RELOC_390_GOT12
1495               || fixups[i].reloc == BFD_RELOC_390_GOT20
1496               || fixups[i].reloc == BFD_RELOC_390_GOT16)
1497             fixP->fx_no_overflow = 1;
1498         }
1499       else
1500         fix_new_exp (frag_now, f - frag_now->fr_literal, 4, &fixups[i].exp,
1501                      (operand->flags & S390_OPERAND_PCREL) != 0,
1502                      ((bfd_reloc_code_real_type)
1503                       (fixups[i].opindex + (int) BFD_RELOC_UNUSED)));
1504     }
1505   return str;
1506 }
1507
1508 /* This routine is called for each instruction to be assembled.  */
1509
1510 void
1511 md_assemble (char *str)
1512 {
1513   const struct s390_opcode *opcode;
1514   unsigned char insn[6];
1515   char *s;
1516
1517   /* Get the opcode.  */
1518   for (s = str; *s != '\0' && ! ISSPACE (*s); s++)
1519     ;
1520   if (*s != '\0')
1521     *s++ = '\0';
1522
1523   /* Look up the opcode in the hash table.  */
1524   opcode = (struct s390_opcode *) hash_find (s390_opcode_hash, str);
1525   if (opcode == (const struct s390_opcode *) NULL)
1526     {
1527       as_bad (_("Unrecognized opcode: `%s'"), str);
1528       return;
1529     }
1530   else if (!(opcode->modes & current_mode_mask))
1531     {
1532       as_bad ("Opcode %s not available in this mode", str);
1533       return;
1534     }
1535   memcpy (insn, opcode->opcode, sizeof (insn));
1536   md_gather_operands (s, insn, opcode);
1537 }
1538
1539 #ifndef WORKING_DOT_WORD
1540 /* Handle long and short jumps. We don't support these */
1541 void
1542 md_create_short_jump (ptr, from_addr, to_addr, frag, to_symbol)
1543      char *ptr;
1544      addressT from_addr, to_addr;
1545      fragS *frag;
1546      symbolS *to_symbol;
1547 {
1548   abort ();
1549 }
1550
1551 void
1552 md_create_long_jump (ptr, from_addr, to_addr, frag, to_symbol)
1553      char *ptr;
1554      addressT from_addr, to_addr;
1555      fragS *frag;
1556      symbolS *to_symbol;
1557 {
1558   abort ();
1559 }
1560 #endif
1561
1562 void
1563 s390_bss (int ignore ATTRIBUTE_UNUSED)
1564 {
1565   /* We don't support putting frags in the BSS segment, we fake it
1566      by marking in_bss, then looking at s_skip for clues.  */
1567
1568   subseg_set (bss_section, 0);
1569   demand_empty_rest_of_line ();
1570 }
1571
1572 /* Pseudo-op handling.  */
1573
1574 void
1575 s390_insn (int ignore ATTRIBUTE_UNUSED)
1576 {
1577   expressionS exp;
1578   const struct s390_opcode *opformat;
1579   unsigned char insn[6];
1580   char *s;
1581
1582   /* Get the opcode format.  */
1583   s = input_line_pointer;
1584   while (*s != '\0' && *s != ',' && ! ISSPACE (*s))
1585     s++;
1586   if (*s != ',')
1587     as_bad (_("Invalid .insn format\n"));
1588   *s++ = '\0';
1589
1590   /* Look up the opcode in the hash table.  */
1591   opformat = (struct s390_opcode *)
1592     hash_find (s390_opformat_hash, input_line_pointer);
1593   if (opformat == (const struct s390_opcode *) NULL)
1594     {
1595       as_bad (_("Unrecognized opcode format: `%s'"), input_line_pointer);
1596       return;
1597     }
1598   input_line_pointer = s;
1599   expression (&exp);
1600   if (exp.X_op == O_constant)
1601     {
1602       if (   (   opformat->oplen == 6
1603               && (addressT) exp.X_add_number < (1ULL << 48))
1604           || (   opformat->oplen == 4
1605               && (addressT) exp.X_add_number < (1ULL << 32))
1606           || (   opformat->oplen == 2
1607               && (addressT) exp.X_add_number < (1ULL << 16)))
1608         md_number_to_chars ((char *) insn, exp.X_add_number, opformat->oplen);
1609       else
1610         as_bad (_("Invalid .insn format\n"));
1611     }
1612   else if (exp.X_op == O_big)
1613     {
1614       if (exp.X_add_number > 0
1615           && opformat->oplen == 6
1616           && generic_bignum[3] == 0)
1617         {
1618           md_number_to_chars ((char *) insn, generic_bignum[2], 2);
1619           md_number_to_chars ((char *) &insn[2], generic_bignum[1], 2);
1620           md_number_to_chars ((char *) &insn[4], generic_bignum[0], 2);
1621         }
1622       else
1623         as_bad (_("Invalid .insn format\n"));
1624     }
1625   else
1626     as_bad (_("second operand of .insn not a constant\n"));
1627
1628   if (strcmp (opformat->name, "e") != 0 && *input_line_pointer++ != ',')
1629     as_bad (_("missing comma after insn constant\n"));
1630
1631   if ((s = strchr (input_line_pointer, '\n')) != NULL)
1632     *s = '\0';
1633   input_line_pointer = md_gather_operands (input_line_pointer, insn,
1634                                            opformat);
1635   if (s != NULL)
1636     *s = '\n';
1637   demand_empty_rest_of_line ();
1638 }
1639
1640 /* The .byte pseudo-op.  This is similar to the normal .byte
1641    pseudo-op, but it can also take a single ASCII string.  */
1642
1643 static void
1644 s390_byte (int ignore ATTRIBUTE_UNUSED)
1645 {
1646   if (*input_line_pointer != '\"')
1647     {
1648       cons (1);
1649       return;
1650     }
1651
1652   /* Gather characters.  A real double quote is doubled.  Unusual
1653      characters are not permitted.  */
1654   ++input_line_pointer;
1655   while (1)
1656     {
1657       char c;
1658
1659       c = *input_line_pointer++;
1660
1661       if (c == '\"')
1662         {
1663           if (*input_line_pointer != '\"')
1664             break;
1665           ++input_line_pointer;
1666         }
1667
1668       FRAG_APPEND_1_CHAR (c);
1669     }
1670
1671   demand_empty_rest_of_line ();
1672 }
1673
1674 /* The .ltorg pseudo-op.This emits all literals defined since the last
1675    .ltorg or the invocation of gas. Literals are defined with the
1676    @lit suffix.  */
1677
1678 static void
1679 s390_literals (int ignore ATTRIBUTE_UNUSED)
1680 {
1681   struct s390_lpe *lpe;
1682
1683   if (lp_sym == NULL || lpe_count == 0)
1684     return;     /* Nothing to be done.  */
1685
1686   /* Emit symbol for start of literal pool.  */
1687   S_SET_SEGMENT (lp_sym, now_seg);
1688   S_SET_VALUE (lp_sym, (valueT) frag_now_fix ());
1689   lp_sym->sy_frag = frag_now;
1690
1691   while (lpe_list)
1692     {
1693       lpe = lpe_list;
1694       lpe_list = lpe_list->next;
1695       S_SET_SEGMENT (lpe->sym, now_seg);
1696       S_SET_VALUE (lpe->sym, (valueT) frag_now_fix ());
1697       lpe->sym->sy_frag = frag_now;
1698
1699       /* Emit literal pool entry.  */
1700       if (lpe->reloc != BFD_RELOC_UNUSED)
1701         {
1702           reloc_howto_type *reloc_howto =
1703             bfd_reloc_type_lookup (stdoutput, lpe->reloc);
1704           int size = bfd_get_reloc_size (reloc_howto);
1705           char *where;
1706
1707           if (size > lpe->nbytes)
1708             as_bad (_("%s relocations do not fit in %d bytes"),
1709                     reloc_howto->name, lpe->nbytes);
1710           where = frag_more (lpe->nbytes);
1711           md_number_to_chars (where, 0, size);
1712           fix_new_exp (frag_now, where - frag_now->fr_literal,
1713                        size, &lpe->ex, reloc_howto->pc_relative, lpe->reloc);
1714         }
1715       else
1716         {
1717           if (lpe->ex.X_op == O_big)
1718             {
1719               if (lpe->ex.X_add_number <= 0)
1720                 generic_floating_point_number = lpe->floatnum;
1721               else
1722                 memcpy (generic_bignum, lpe->bignum,
1723                         lpe->ex.X_add_number * sizeof (LITTLENUM_TYPE));
1724             }
1725           emit_expr (&lpe->ex, lpe->nbytes);
1726         }
1727
1728       lpe->next = lpe_free_list;
1729       lpe_free_list = lpe;
1730     }
1731   lpe_list_tail = NULL;
1732   lp_sym = NULL;
1733   lp_count++;
1734   lpe_count = 0;
1735 }
1736
1737 char *
1738 md_atof (int type, char *litp, int *sizep)
1739 {
1740   return ieee_md_atof (type, litp, sizep, TRUE);
1741 }
1742
1743 /* Align a section (I don't know why this is machine dependent).  */
1744
1745 valueT
1746 md_section_align (asection *seg, valueT addr)
1747 {
1748   int align = bfd_get_section_alignment (stdoutput, seg);
1749
1750   return ((addr + (1 << align) - 1) & (-1 << align));
1751 }
1752
1753 /* We don't have any form of relaxing.  */
1754
1755 int
1756 md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
1757                                asection *seg ATTRIBUTE_UNUSED)
1758 {
1759   abort ();
1760   return 0;
1761 }
1762
1763 /* Convert a machine dependent frag.  We never generate these.  */
1764
1765 void
1766 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
1767                  asection *sec ATTRIBUTE_UNUSED,
1768                  fragS *fragp ATTRIBUTE_UNUSED)
1769 {
1770   abort ();
1771 }
1772
1773 symbolS *
1774 md_undefined_symbol (char *name)
1775 {
1776   if (*name == '_' && *(name + 1) == 'G'
1777       && strcmp (name, "_GLOBAL_OFFSET_TABLE_") == 0)
1778     {
1779       if (!GOT_symbol)
1780         {
1781           if (symbol_find (name))
1782             as_bad (_("GOT already in symbol table"));
1783           GOT_symbol = symbol_new (name, undefined_section,
1784                                    (valueT) 0, &zero_address_frag);
1785         }
1786       return GOT_symbol;
1787     }
1788   return 0;
1789 }
1790
1791 /* Functions concerning relocs.  */
1792
1793 /* The location from which a PC relative jump should be calculated,
1794    given a PC relative reloc.  */
1795
1796 long
1797 md_pcrel_from_section (fixS *fixp, segT sec ATTRIBUTE_UNUSED)
1798 {
1799   return fixp->fx_frag->fr_address + fixp->fx_where;
1800 }
1801
1802 /* Here we decide which fixups can be adjusted to make them relative to
1803    the beginning of the section instead of the symbol.  Basically we need
1804    to make sure that the dynamic relocations are done correctly, so in
1805    some cases we force the original symbol to be used.  */
1806 int
1807 tc_s390_fix_adjustable (fixS *fixP)
1808 {
1809   /* Don't adjust references to merge sections.  */
1810   if ((S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_MERGE) != 0)
1811     return 0;
1812   /* adjust_reloc_syms doesn't know about the GOT.  */
1813   if (   fixP->fx_r_type == BFD_RELOC_16_GOTOFF
1814       || fixP->fx_r_type == BFD_RELOC_32_GOTOFF
1815       || fixP->fx_r_type == BFD_RELOC_390_GOTOFF64
1816       || fixP->fx_r_type == BFD_RELOC_390_PLTOFF16
1817       || fixP->fx_r_type == BFD_RELOC_390_PLTOFF32
1818       || fixP->fx_r_type == BFD_RELOC_390_PLTOFF64
1819       || fixP->fx_r_type == BFD_RELOC_390_PLT16DBL
1820       || fixP->fx_r_type == BFD_RELOC_390_PLT32
1821       || fixP->fx_r_type == BFD_RELOC_390_PLT32DBL
1822       || fixP->fx_r_type == BFD_RELOC_390_PLT64
1823       || fixP->fx_r_type == BFD_RELOC_390_GOT12
1824       || fixP->fx_r_type == BFD_RELOC_390_GOT20
1825       || fixP->fx_r_type == BFD_RELOC_390_GOT16
1826       || fixP->fx_r_type == BFD_RELOC_32_GOT_PCREL
1827       || fixP->fx_r_type == BFD_RELOC_390_GOT64
1828       || fixP->fx_r_type == BFD_RELOC_390_GOTENT
1829       || fixP->fx_r_type == BFD_RELOC_390_GOTPLT12
1830       || fixP->fx_r_type == BFD_RELOC_390_GOTPLT16
1831       || fixP->fx_r_type == BFD_RELOC_390_GOTPLT20
1832       || fixP->fx_r_type == BFD_RELOC_390_GOTPLT32
1833       || fixP->fx_r_type == BFD_RELOC_390_GOTPLT64
1834       || fixP->fx_r_type == BFD_RELOC_390_GOTPLTENT
1835       || fixP->fx_r_type == BFD_RELOC_390_TLS_LOAD
1836       || fixP->fx_r_type == BFD_RELOC_390_TLS_GDCALL
1837       || fixP->fx_r_type == BFD_RELOC_390_TLS_LDCALL
1838       || fixP->fx_r_type == BFD_RELOC_390_TLS_GD32
1839       || fixP->fx_r_type == BFD_RELOC_390_TLS_GD64
1840       || fixP->fx_r_type == BFD_RELOC_390_TLS_GOTIE12
1841       || fixP->fx_r_type == BFD_RELOC_390_TLS_GOTIE20
1842       || fixP->fx_r_type == BFD_RELOC_390_TLS_GOTIE32
1843       || fixP->fx_r_type == BFD_RELOC_390_TLS_GOTIE64
1844       || fixP->fx_r_type == BFD_RELOC_390_TLS_LDM32
1845       || fixP->fx_r_type == BFD_RELOC_390_TLS_LDM64
1846       || fixP->fx_r_type == BFD_RELOC_390_TLS_IE32
1847       || fixP->fx_r_type == BFD_RELOC_390_TLS_IE64
1848       || fixP->fx_r_type == BFD_RELOC_390_TLS_IEENT
1849       || fixP->fx_r_type == BFD_RELOC_390_TLS_LE32
1850       || fixP->fx_r_type == BFD_RELOC_390_TLS_LE64
1851       || fixP->fx_r_type == BFD_RELOC_390_TLS_LDO32
1852       || fixP->fx_r_type == BFD_RELOC_390_TLS_LDO64
1853       || fixP->fx_r_type == BFD_RELOC_390_TLS_DTPMOD
1854       || fixP->fx_r_type == BFD_RELOC_390_TLS_DTPOFF
1855       || fixP->fx_r_type == BFD_RELOC_390_TLS_TPOFF
1856       || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
1857       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1858     return 0;
1859   return 1;
1860 }
1861
1862 /* Return true if we must always emit a reloc for a type and false if
1863    there is some hope of resolving it at assembly time.  */
1864 int
1865 tc_s390_force_relocation (struct fix *fixp)
1866 {
1867   /* Ensure we emit a relocation for every reference to the global
1868      offset table or to the procedure link table.  */
1869   switch (fixp->fx_r_type)
1870     {
1871     case BFD_RELOC_390_GOT12:
1872     case BFD_RELOC_390_GOT20:
1873     case BFD_RELOC_32_GOT_PCREL:
1874     case BFD_RELOC_32_GOTOFF:
1875     case BFD_RELOC_390_GOTOFF64:
1876     case BFD_RELOC_390_PLTOFF16:
1877     case BFD_RELOC_390_PLTOFF32:
1878     case BFD_RELOC_390_PLTOFF64:
1879     case BFD_RELOC_390_GOTPC:
1880     case BFD_RELOC_390_GOT16:
1881     case BFD_RELOC_390_GOTPCDBL:
1882     case BFD_RELOC_390_GOT64:
1883     case BFD_RELOC_390_GOTENT:
1884     case BFD_RELOC_390_PLT32:
1885     case BFD_RELOC_390_PLT16DBL:
1886     case BFD_RELOC_390_PLT32DBL:
1887     case BFD_RELOC_390_PLT64:
1888     case BFD_RELOC_390_GOTPLT12:
1889     case BFD_RELOC_390_GOTPLT16:
1890     case BFD_RELOC_390_GOTPLT20:
1891     case BFD_RELOC_390_GOTPLT32:
1892     case BFD_RELOC_390_GOTPLT64:
1893     case BFD_RELOC_390_GOTPLTENT:
1894       return 1;
1895     default:
1896       break;;
1897     }
1898
1899   return generic_force_reloc (fixp);
1900 }
1901
1902 /* Apply a fixup to the object code.  This is called for all the
1903    fixups we generated by the call to fix_new_exp, above.  In the call
1904    above we used a reloc code which was the largest legal reloc code
1905    plus the operand index.  Here we undo that to recover the operand
1906    index.  At this point all symbol values should be fully resolved,
1907    and we attempt to completely resolve the reloc.  If we can not do
1908    that, we determine the correct reloc code and put it back in the
1909    fixup.  */
1910
1911 void
1912 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
1913 {
1914   char *where;
1915   valueT value = *valP;
1916
1917   where = fixP->fx_frag->fr_literal + fixP->fx_where;
1918
1919   if (fixP->fx_subsy != NULL)
1920     as_bad_where (fixP->fx_file, fixP->fx_line,
1921                   "cannot emit relocation %s against subsy symbol %s",
1922                   bfd_get_reloc_code_name (fixP->fx_r_type),
1923                   S_GET_NAME (fixP->fx_subsy));
1924
1925   if (fixP->fx_addsy != NULL)
1926     {
1927       if (fixP->fx_pcrel)
1928         value += fixP->fx_frag->fr_address + fixP->fx_where;
1929     }
1930   else
1931     fixP->fx_done = 1;
1932
1933   if ((int) fixP->fx_r_type >= (int) BFD_RELOC_UNUSED)
1934     {
1935       const struct s390_operand *operand;
1936       int opindex;
1937
1938       opindex = (int) fixP->fx_r_type - (int) BFD_RELOC_UNUSED;
1939       operand = &s390_operands[opindex];
1940
1941       if (fixP->fx_done)
1942         {
1943           /* Insert the fully resolved operand value.  */
1944           s390_insert_operand ((unsigned char *) where, operand,
1945                                (offsetT) value, fixP->fx_file, fixP->fx_line);
1946           return;
1947         }
1948
1949       /* Determine a BFD reloc value based on the operand information.
1950          We are only prepared to turn a few of the operands into
1951          relocs.  */
1952       fixP->fx_offset = value;
1953       if (operand->bits == 12 && operand->shift == 20)
1954         {
1955           fixP->fx_size = 2;
1956           fixP->fx_where += 2;
1957           fixP->fx_r_type = BFD_RELOC_390_12;
1958         }
1959       else if (operand->bits == 12 && operand->shift == 36)
1960         {
1961           fixP->fx_size = 2;
1962           fixP->fx_where += 4;
1963           fixP->fx_r_type = BFD_RELOC_390_12;
1964         }
1965       else if (operand->bits == 20 && operand->shift == 20)
1966         {
1967           fixP->fx_size = 2;
1968           fixP->fx_where += 2;
1969           fixP->fx_r_type = BFD_RELOC_390_20;
1970         }
1971       else if (operand->bits == 8 && operand->shift == 8)
1972         {
1973           fixP->fx_size = 1;
1974           fixP->fx_where += 1;
1975           fixP->fx_r_type = BFD_RELOC_8;
1976         }
1977       else if (operand->bits == 16 && operand->shift == 16)
1978         {
1979           fixP->fx_size = 2;
1980           fixP->fx_where += 2;
1981           if (operand->flags & S390_OPERAND_PCREL)
1982             {
1983               fixP->fx_r_type = BFD_RELOC_390_PC16DBL;
1984               fixP->fx_offset += 2;
1985             }
1986           else
1987             fixP->fx_r_type = BFD_RELOC_16;
1988         }
1989       else if (operand->bits == 32 && operand->shift == 16
1990                && (operand->flags & S390_OPERAND_PCREL))
1991         {
1992           fixP->fx_size = 4;
1993           fixP->fx_where += 2;
1994           fixP->fx_offset += 2;
1995           fixP->fx_r_type = BFD_RELOC_390_PC32DBL;
1996         }
1997       else
1998         {
1999           char *sfile;
2000           unsigned int sline;
2001
2002           /* Use expr_symbol_where to see if this is an expression
2003              symbol.  */
2004           if (expr_symbol_where (fixP->fx_addsy, &sfile, &sline))
2005             as_bad_where (fixP->fx_file, fixP->fx_line,
2006                           _("unresolved expression that must be resolved"));
2007           else
2008             as_bad_where (fixP->fx_file, fixP->fx_line,
2009                           _("unsupported relocation type"));
2010           fixP->fx_done = 1;
2011           return;
2012         }
2013     }
2014   else
2015     {
2016       switch (fixP->fx_r_type)
2017         {
2018         case BFD_RELOC_8:
2019           if (fixP->fx_pcrel)
2020             abort ();
2021           if (fixP->fx_done)
2022             md_number_to_chars (where, value, 1);
2023           break;
2024         case BFD_RELOC_390_12:
2025         case BFD_RELOC_390_GOT12:
2026         case BFD_RELOC_390_GOTPLT12:
2027           if (fixP->fx_done)
2028             {
2029               unsigned short mop;
2030
2031               mop = bfd_getb16 ((unsigned char *) where);
2032               mop |= (unsigned short) (value & 0xfff);
2033               bfd_putb16 ((bfd_vma) mop, (unsigned char *) where);
2034             }
2035           break;
2036
2037         case BFD_RELOC_390_20:
2038         case BFD_RELOC_390_GOT20:
2039         case BFD_RELOC_390_GOTPLT20:
2040           if (fixP->fx_done)
2041             {
2042               unsigned int mop;
2043               mop = bfd_getb32 ((unsigned char *) where);
2044               mop |= (unsigned int) ((value & 0xfff) << 8 |
2045                                      (value & 0xff000) >> 12);
2046               bfd_putb32 ((bfd_vma) mop, (unsigned char *) where);
2047             } 
2048           break;
2049
2050         case BFD_RELOC_16:
2051         case BFD_RELOC_GPREL16:
2052         case BFD_RELOC_16_GOT_PCREL:
2053         case BFD_RELOC_16_GOTOFF:
2054           if (fixP->fx_pcrel)
2055             as_bad_where (fixP->fx_file, fixP->fx_line,
2056                           "cannot emit PC relative %s relocation%s%s",
2057                           bfd_get_reloc_code_name (fixP->fx_r_type),
2058                           fixP->fx_addsy != NULL ? " against " : "",
2059                           (fixP->fx_addsy != NULL
2060                            ? S_GET_NAME (fixP->fx_addsy)
2061                            : ""));
2062           if (fixP->fx_done)
2063             md_number_to_chars (where, value, 2);
2064           break;
2065         case BFD_RELOC_390_GOT16:
2066         case BFD_RELOC_390_PLTOFF16:
2067         case BFD_RELOC_390_GOTPLT16:
2068           if (fixP->fx_done)
2069             md_number_to_chars (where, value, 2);
2070           break;
2071         case BFD_RELOC_390_PC16DBL:
2072         case BFD_RELOC_390_PLT16DBL:
2073           value += 2;
2074           if (fixP->fx_done)
2075             md_number_to_chars (where, (offsetT) value >> 1, 2);
2076           break;
2077
2078         case BFD_RELOC_32:
2079           if (fixP->fx_pcrel)
2080             fixP->fx_r_type = BFD_RELOC_32_PCREL;
2081           else
2082             fixP->fx_r_type = BFD_RELOC_32;
2083           if (fixP->fx_done)
2084             md_number_to_chars (where, value, 4);
2085           break;
2086         case BFD_RELOC_32_PCREL:
2087         case BFD_RELOC_32_BASEREL:
2088           fixP->fx_r_type = BFD_RELOC_32_PCREL;
2089           if (fixP->fx_done)
2090             md_number_to_chars (where, value, 4);
2091           break;
2092         case BFD_RELOC_32_GOT_PCREL:
2093         case BFD_RELOC_390_PLTOFF32:
2094         case BFD_RELOC_390_PLT32:
2095         case BFD_RELOC_390_GOTPLT32:
2096           if (fixP->fx_done)
2097             md_number_to_chars (where, value, 4);
2098           break;
2099         case BFD_RELOC_390_PC32DBL:
2100         case BFD_RELOC_390_PLT32DBL:
2101         case BFD_RELOC_390_GOTPCDBL:
2102         case BFD_RELOC_390_GOTENT:
2103         case BFD_RELOC_390_GOTPLTENT:
2104           value += 2;
2105           if (fixP->fx_done)
2106             md_number_to_chars (where, (offsetT) value >> 1, 4);
2107           break;
2108
2109         case BFD_RELOC_32_GOTOFF:
2110           if (fixP->fx_done)
2111             md_number_to_chars (where, value, sizeof (int));
2112           break;
2113
2114         case BFD_RELOC_390_GOTOFF64:
2115           if (fixP->fx_done)
2116             md_number_to_chars (where, value, 8);
2117           break;
2118
2119         case BFD_RELOC_390_GOT64:
2120         case BFD_RELOC_390_PLTOFF64:
2121         case BFD_RELOC_390_PLT64:
2122         case BFD_RELOC_390_GOTPLT64:
2123           if (fixP->fx_done)
2124             md_number_to_chars (where, value, 8);
2125           break;
2126
2127         case BFD_RELOC_64:
2128           if (fixP->fx_pcrel)
2129             fixP->fx_r_type = BFD_RELOC_64_PCREL;
2130           else
2131             fixP->fx_r_type = BFD_RELOC_64;
2132           if (fixP->fx_done)
2133             md_number_to_chars (where, value, 8);
2134           break;
2135
2136         case BFD_RELOC_64_PCREL:
2137           fixP->fx_r_type = BFD_RELOC_64_PCREL;
2138           if (fixP->fx_done)
2139             md_number_to_chars (where, value, 8);
2140           break;
2141
2142         case BFD_RELOC_VTABLE_INHERIT:
2143         case BFD_RELOC_VTABLE_ENTRY:
2144           fixP->fx_done = 0;
2145           return;
2146
2147         case BFD_RELOC_390_TLS_LOAD:
2148         case BFD_RELOC_390_TLS_GDCALL:
2149         case BFD_RELOC_390_TLS_LDCALL:
2150         case BFD_RELOC_390_TLS_GD32:
2151         case BFD_RELOC_390_TLS_GD64:
2152         case BFD_RELOC_390_TLS_GOTIE12:
2153         case BFD_RELOC_390_TLS_GOTIE20:
2154         case BFD_RELOC_390_TLS_GOTIE32:
2155         case BFD_RELOC_390_TLS_GOTIE64:
2156         case BFD_RELOC_390_TLS_LDM32:
2157         case BFD_RELOC_390_TLS_LDM64:
2158         case BFD_RELOC_390_TLS_IE32:
2159         case BFD_RELOC_390_TLS_IE64:
2160         case BFD_RELOC_390_TLS_LE32:
2161         case BFD_RELOC_390_TLS_LE64:
2162         case BFD_RELOC_390_TLS_LDO32:
2163         case BFD_RELOC_390_TLS_LDO64:
2164         case BFD_RELOC_390_TLS_DTPMOD:
2165         case BFD_RELOC_390_TLS_DTPOFF:
2166         case BFD_RELOC_390_TLS_TPOFF:
2167           S_SET_THREAD_LOCAL (fixP->fx_addsy);
2168           /* Fully resolved at link time.  */
2169           break;
2170         case BFD_RELOC_390_TLS_IEENT:
2171           /* Fully resolved at link time.  */
2172           S_SET_THREAD_LOCAL (fixP->fx_addsy);
2173           value += 2;
2174           break;
2175
2176         default:
2177           {
2178             const char *reloc_name = bfd_get_reloc_code_name (fixP->fx_r_type);
2179
2180             if (reloc_name != NULL)
2181               fprintf (stderr, "Gas failure, reloc type %s\n", reloc_name);
2182             else
2183               fprintf (stderr, "Gas failure, reloc type #%i\n", fixP->fx_r_type);
2184             fflush (stderr);
2185             abort ();
2186           }
2187         }
2188
2189       fixP->fx_offset = value;
2190     }
2191 }
2192
2193 /* Generate a reloc for a fixup.  */
2194
2195 arelent *
2196 tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
2197 {
2198   bfd_reloc_code_real_type code;
2199   arelent *reloc;
2200
2201   code = fixp->fx_r_type;
2202   if (GOT_symbol && fixp->fx_addsy == GOT_symbol)
2203     {
2204       if (   (s390_arch_size == 32 && code == BFD_RELOC_32_PCREL)
2205           || (s390_arch_size == 64 && code == BFD_RELOC_64_PCREL))
2206         code = BFD_RELOC_390_GOTPC;
2207       if (code == BFD_RELOC_390_PC32DBL)
2208         code = BFD_RELOC_390_GOTPCDBL;
2209     }
2210
2211   reloc = (arelent *) xmalloc (sizeof (arelent));
2212   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
2213   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2214   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
2215   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
2216   if (reloc->howto == NULL)
2217     {
2218       as_bad_where (fixp->fx_file, fixp->fx_line,
2219                     _("cannot represent relocation type %s"),
2220                     bfd_get_reloc_code_name (code));
2221       /* Set howto to a garbage value so that we can keep going.  */
2222       reloc->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
2223       assert (reloc->howto != NULL);
2224     }
2225   reloc->addend = fixp->fx_offset;
2226
2227   return reloc;
2228 }
2229
2230 void
2231 s390_cfi_frame_initial_instructions (void)
2232 {
2233   cfi_add_CFA_def_cfa (15, s390_arch_size == 64 ? 160 : 96);
2234 }
2235
2236 int
2237 tc_s390_regname_to_dw2regnum (char *regname)
2238 {
2239   int regnum = -1;
2240
2241   if (regname[0] != 'c' && regname[0] != 'a')
2242     {
2243       regnum = reg_name_search (pre_defined_registers, REG_NAME_CNT, regname);
2244       if (regname[0] == 'f' && regnum != -1)
2245         regnum += 16;
2246     }
2247   else if (strcmp (regname, "ap") == 0)
2248     regnum = 32;
2249   else if (strcmp (regname, "cc") == 0)
2250     regnum = 33;
2251   return regnum;
2252 }