OSDN Git Service

gas/
[pf3gnuchains/pf3gnuchains3x.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    2009  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         {
1192           /* No operands, check if all operands can be skipped.  */
1193           while (*opindex_ptr != 0 && operand->flags & S390_OPERAND_OPTIONAL)
1194             {
1195               if (operand->flags & S390_OPERAND_DISP)
1196                 {
1197                   /* An optional displacement makes the whole D(X,B)
1198                      D(L,B) or D(B) block optional.  */
1199                   do {
1200                     operand = s390_operands + *(++opindex_ptr);
1201                   } while (!(operand->flags & S390_OPERAND_BASE));
1202                 }
1203               operand = s390_operands + *(++opindex_ptr);
1204             }
1205           if (opindex_ptr[0] == '\0')
1206             break;
1207           as_bad (_("missing operand"));
1208         }
1209       else if (ex.X_op == O_register || ex.X_op == O_constant)
1210         {
1211           s390_lit_suffix (&str, &ex, ELF_SUFFIX_NONE);
1212
1213           if (ex.X_op != O_register && ex.X_op != O_constant)
1214             {
1215               /* We need to generate a fixup for the
1216                  expression returned by s390_lit_suffix.  */
1217               if (fc >= MAX_INSN_FIXUPS)
1218                 as_fatal (_("too many fixups"));
1219               fixups[fc].exp = ex;
1220               fixups[fc].opindex = *opindex_ptr;
1221               fixups[fc].reloc = BFD_RELOC_UNUSED;
1222               ++fc;
1223             }
1224           else
1225             {
1226               if ((operand->flags & S390_OPERAND_INDEX)
1227                   && ex.X_add_number == 0
1228                   && warn_areg_zero)
1229                 as_warn (_("index register specified but zero"));
1230               if ((operand->flags & S390_OPERAND_BASE)
1231                   && ex.X_add_number == 0
1232                   && warn_areg_zero)
1233                 as_warn (_("base register specified but zero"));
1234               s390_insert_operand (insn, operand, ex.X_add_number, NULL, 0);
1235             }
1236         }
1237       else
1238         {
1239           suffix = s390_elf_suffix (&str, &ex);
1240           suffix = s390_lit_suffix (&str, &ex, suffix);
1241           reloc = BFD_RELOC_UNUSED;
1242
1243           if (suffix == ELF_SUFFIX_GOT)
1244             {
1245               if ((operand->flags & S390_OPERAND_DISP) &&
1246                   (operand->bits == 12))
1247                 reloc = BFD_RELOC_390_GOT12;
1248               else if ((operand->flags & S390_OPERAND_DISP) &&
1249                        (operand->bits == 20))
1250                 reloc = BFD_RELOC_390_GOT20;
1251               else if ((operand->flags & S390_OPERAND_SIGNED)
1252                        && (operand->bits == 16))
1253                 reloc = BFD_RELOC_390_GOT16;
1254               else if ((operand->flags & S390_OPERAND_PCREL)
1255                        && (operand->bits == 32))
1256                 reloc = BFD_RELOC_390_GOTENT;
1257             }
1258           else if (suffix == ELF_SUFFIX_PLT)
1259             {
1260               if ((operand->flags & S390_OPERAND_PCREL)
1261                   && (operand->bits == 16))
1262                 reloc = BFD_RELOC_390_PLT16DBL;
1263               else if ((operand->flags & S390_OPERAND_PCREL)
1264                        && (operand->bits == 32))
1265                 reloc = BFD_RELOC_390_PLT32DBL;
1266             }
1267           else if (suffix == ELF_SUFFIX_GOTENT)
1268             {
1269               if ((operand->flags & S390_OPERAND_PCREL)
1270                   && (operand->bits == 32))
1271                 reloc = BFD_RELOC_390_GOTENT;
1272             }
1273           else if (suffix == ELF_SUFFIX_GOTOFF)
1274             {
1275               if ((operand->flags & S390_OPERAND_SIGNED)
1276                   && (operand->bits == 16))
1277                 reloc = BFD_RELOC_16_GOTOFF;
1278             }
1279           else if (suffix == ELF_SUFFIX_PLTOFF)
1280             {
1281               if ((operand->flags & S390_OPERAND_SIGNED)
1282                   && (operand->bits == 16))
1283                 reloc = BFD_RELOC_390_PLTOFF16;
1284             }
1285           else if (suffix == ELF_SUFFIX_GOTPLT)
1286             {
1287               if ((operand->flags & S390_OPERAND_DISP)
1288                   && (operand->bits == 12))
1289                 reloc = BFD_RELOC_390_GOTPLT12;
1290               else if ((operand->flags & S390_OPERAND_SIGNED)
1291                        && (operand->bits == 16))
1292                 reloc = BFD_RELOC_390_GOTPLT16;
1293               else if ((operand->flags & S390_OPERAND_PCREL)
1294                        && (operand->bits == 32))
1295                 reloc = BFD_RELOC_390_GOTPLTENT;
1296             }
1297           else if (suffix == ELF_SUFFIX_TLS_GOTIE)
1298             {
1299               if ((operand->flags & S390_OPERAND_DISP)
1300                   && (operand->bits == 12))
1301                 reloc = BFD_RELOC_390_TLS_GOTIE12;
1302               else if ((operand->flags & S390_OPERAND_DISP)
1303                        && (operand->bits == 20))
1304                 reloc = BFD_RELOC_390_TLS_GOTIE20;
1305             }
1306           else if (suffix == ELF_SUFFIX_TLS_IE)
1307             {
1308               if ((operand->flags & S390_OPERAND_PCREL)
1309                        && (operand->bits == 32))
1310                 reloc = BFD_RELOC_390_TLS_IEENT;
1311             }
1312
1313           if (suffix != ELF_SUFFIX_NONE && reloc == BFD_RELOC_UNUSED)
1314             as_bad (_("invalid operand suffix"));
1315           /* We need to generate a fixup of type 'reloc' for this
1316              expression.  */
1317           if (fc >= MAX_INSN_FIXUPS)
1318             as_fatal (_("too many fixups"));
1319           fixups[fc].exp = ex;
1320           fixups[fc].opindex = *opindex_ptr;
1321           fixups[fc].reloc = reloc;
1322           ++fc;
1323         }
1324
1325       /* Check the next character. The call to expression has advanced
1326          str past any whitespace.  */
1327       if (operand->flags & S390_OPERAND_DISP)
1328         {
1329           /* After a displacement a block in parentheses can start.  */
1330           if (*str != '(')
1331             {
1332               /* Check if parenthesized block can be skipped. If the next
1333                  operand is neiter an optional operand nor a base register
1334                  then we have a syntax error.  */
1335               operand = s390_operands + *(++opindex_ptr);
1336               if (!(operand->flags & (S390_OPERAND_INDEX|S390_OPERAND_BASE)))
1337                 as_bad (_("syntax error; missing '(' after displacement"));
1338
1339               /* Ok, skip all operands until S390_OPERAND_BASE.  */
1340               while (!(operand->flags & S390_OPERAND_BASE))
1341                 operand = s390_operands + *(++opindex_ptr);
1342
1343               /* If there is a next operand it must be separated by a comma.  */
1344               if (opindex_ptr[1] != '\0')
1345                 {
1346                   if (*str != ',')
1347                     {
1348                       while (opindex_ptr[1] != '\0')
1349                         {
1350                           operand = s390_operands + *(++opindex_ptr);
1351                           if (operand->flags & S390_OPERAND_OPTIONAL)
1352                             continue;
1353                           as_bad (_("syntax error; expected ,"));
1354                           break;
1355                         }
1356                     }
1357                   else
1358                     str++;
1359                 }
1360             }
1361           else
1362             {
1363               /* We found an opening parentheses.  */
1364               str++;
1365               for (f = str; *f != '\0'; f++)
1366                 if (*f == ',' || *f == ')')
1367                   break;
1368               /* If there is no comma until the closing parentheses OR
1369                  there is a comma right after the opening parentheses,
1370                  we have to skip optional operands.  */
1371               if (*f == ',' && f == str)
1372                 {
1373                   /* comma directly after '(' ? */
1374                   skip_optional = 1;
1375                   str++;
1376                 }
1377               else
1378                 skip_optional = (*f != ',');
1379             }
1380         }
1381       else if (operand->flags & S390_OPERAND_BASE)
1382         {
1383           /* After the base register the parenthesed block ends.  */
1384           if (*str++ != ')')
1385             as_bad (_("syntax error; missing ')' after base register"));
1386           skip_optional = 0;
1387           /* If there is a next operand it must be separated by a comma.  */
1388           if (opindex_ptr[1] != '\0')
1389             {
1390               if (*str != ',')
1391                 {
1392                   while (opindex_ptr[1] != '\0')
1393                     {
1394                       operand = s390_operands + *(++opindex_ptr);
1395                       if (operand->flags & S390_OPERAND_OPTIONAL)
1396                         continue;
1397                       as_bad (_("syntax error; expected ,"));
1398                       break;
1399                     }
1400                 }
1401               else
1402                 str++;
1403             }
1404         }
1405       else
1406         {
1407           /* We can find an 'early' closing parentheses in e.g. D(L) instead
1408              of D(L,B).  In this case the base register has to be skipped.  */
1409           if (*str == ')')
1410             {
1411               operand = s390_operands + *(++opindex_ptr);
1412
1413               if (!(operand->flags & S390_OPERAND_BASE))
1414                 as_bad (_("syntax error; ')' not allowed here"));
1415               str++;
1416             }
1417           /* If there is a next operand it must be separated by a comma.  */
1418           if (opindex_ptr[1] != '\0')
1419             {
1420               if (*str != ',')
1421                 {
1422                   while (opindex_ptr[1] != '\0')
1423                     {
1424                       operand = s390_operands + *(++opindex_ptr);
1425                       if (operand->flags & S390_OPERAND_OPTIONAL)
1426                         continue;
1427                       as_bad (_("syntax error; expected ,"));
1428                       break;
1429                     }
1430                 }
1431               else
1432                 str++;
1433             }
1434         }
1435     }
1436
1437   while (ISSPACE (*str))
1438     ++str;
1439
1440   /* Check for tls instruction marker.  */
1441   reloc = s390_tls_suffix (&str, &ex);
1442   if (reloc != BFD_RELOC_UNUSED)
1443     {
1444       /* We need to generate a fixup of type 'reloc' for this
1445          instruction.  */
1446       if (fc >= MAX_INSN_FIXUPS)
1447         as_fatal (_("too many fixups"));
1448       fixups[fc].exp = ex;
1449       fixups[fc].opindex = -1;
1450       fixups[fc].reloc = reloc;
1451       ++fc;
1452     }
1453
1454   if (*str != '\0')
1455     {
1456       char *linefeed;
1457
1458       if ((linefeed = strchr (str, '\n')) != NULL)
1459         *linefeed = '\0';
1460       as_bad (_("junk at end of line: `%s'"), str);
1461       if (linefeed != NULL)
1462         *linefeed = '\n';
1463     }
1464
1465   /* Write out the instruction.  */
1466   f = frag_more (opcode->oplen);
1467   memcpy (f, insn, opcode->oplen);
1468   dwarf2_emit_insn (opcode->oplen);
1469
1470   /* Create any fixups.  At this point we do not use a
1471      bfd_reloc_code_real_type, but instead just use the
1472      BFD_RELOC_UNUSED plus the operand index.  This lets us easily
1473      handle fixups for any operand type, although that is admittedly
1474      not a very exciting feature.  We pick a BFD reloc type in
1475      md_apply_fix.  */
1476   for (i = 0; i < fc; i++)
1477     {
1478
1479       if (fixups[i].opindex < 0)
1480         {
1481           /* Create tls instruction marker relocation.  */
1482           fix_new_exp (frag_now, f - frag_now->fr_literal, opcode->oplen,
1483                        &fixups[i].exp, 0, fixups[i].reloc);
1484           continue;
1485         }
1486
1487       operand = s390_operands + fixups[i].opindex;
1488
1489       if (fixups[i].reloc != BFD_RELOC_UNUSED)
1490         {
1491           reloc_howto_type *reloc_howto;
1492           fixS *fixP;
1493           int size;
1494
1495           reloc_howto = bfd_reloc_type_lookup (stdoutput, fixups[i].reloc);
1496           if (!reloc_howto)
1497             abort ();
1498
1499           size = bfd_get_reloc_size (reloc_howto);
1500
1501           if (size < 1 || size > 4)
1502             abort ();
1503
1504           fixP = fix_new_exp (frag_now,
1505                               f - frag_now->fr_literal + (operand->shift/8),
1506                               size, &fixups[i].exp, reloc_howto->pc_relative,
1507                               fixups[i].reloc);
1508           /* Turn off overflow checking in fixup_segment. This is necessary
1509              because fixup_segment will signal an overflow for large 4 byte
1510              quantities for GOT12 relocations.  */
1511           if (   fixups[i].reloc == BFD_RELOC_390_GOT12
1512               || fixups[i].reloc == BFD_RELOC_390_GOT20
1513               || fixups[i].reloc == BFD_RELOC_390_GOT16)
1514             fixP->fx_no_overflow = 1;
1515         }
1516       else
1517         fix_new_exp (frag_now, f - frag_now->fr_literal, 4, &fixups[i].exp,
1518                      (operand->flags & S390_OPERAND_PCREL) != 0,
1519                      ((bfd_reloc_code_real_type)
1520                       (fixups[i].opindex + (int) BFD_RELOC_UNUSED)));
1521     }
1522   return str;
1523 }
1524
1525 /* This routine is called for each instruction to be assembled.  */
1526
1527 void
1528 md_assemble (char *str)
1529 {
1530   const struct s390_opcode *opcode;
1531   unsigned char insn[6];
1532   char *s;
1533
1534   /* Get the opcode.  */
1535   for (s = str; *s != '\0' && ! ISSPACE (*s); s++)
1536     ;
1537   if (*s != '\0')
1538     *s++ = '\0';
1539
1540   /* Look up the opcode in the hash table.  */
1541   opcode = (struct s390_opcode *) hash_find (s390_opcode_hash, str);
1542   if (opcode == (const struct s390_opcode *) NULL)
1543     {
1544       as_bad (_("Unrecognized opcode: `%s'"), str);
1545       return;
1546     }
1547   else if (!(opcode->modes & current_mode_mask))
1548     {
1549       as_bad (_("Opcode %s not available in this mode"), str);
1550       return;
1551     }
1552   memcpy (insn, opcode->opcode, sizeof (insn));
1553   md_gather_operands (s, insn, opcode);
1554 }
1555
1556 #ifndef WORKING_DOT_WORD
1557 /* Handle long and short jumps. We don't support these */
1558 void
1559 md_create_short_jump (ptr, from_addr, to_addr, frag, to_symbol)
1560      char *ptr;
1561      addressT from_addr, to_addr;
1562      fragS *frag;
1563      symbolS *to_symbol;
1564 {
1565   abort ();
1566 }
1567
1568 void
1569 md_create_long_jump (ptr, from_addr, to_addr, frag, to_symbol)
1570      char *ptr;
1571      addressT from_addr, to_addr;
1572      fragS *frag;
1573      symbolS *to_symbol;
1574 {
1575   abort ();
1576 }
1577 #endif
1578
1579 void
1580 s390_bss (int ignore ATTRIBUTE_UNUSED)
1581 {
1582   /* We don't support putting frags in the BSS segment, we fake it
1583      by marking in_bss, then looking at s_skip for clues.  */
1584
1585   subseg_set (bss_section, 0);
1586   demand_empty_rest_of_line ();
1587 }
1588
1589 /* Pseudo-op handling.  */
1590
1591 void
1592 s390_insn (int ignore ATTRIBUTE_UNUSED)
1593 {
1594   expressionS exp;
1595   const struct s390_opcode *opformat;
1596   unsigned char insn[6];
1597   char *s;
1598
1599   /* Get the opcode format.  */
1600   s = input_line_pointer;
1601   while (*s != '\0' && *s != ',' && ! ISSPACE (*s))
1602     s++;
1603   if (*s != ',')
1604     as_bad (_("Invalid .insn format\n"));
1605   *s++ = '\0';
1606
1607   /* Look up the opcode in the hash table.  */
1608   opformat = (struct s390_opcode *)
1609     hash_find (s390_opformat_hash, input_line_pointer);
1610   if (opformat == (const struct s390_opcode *) NULL)
1611     {
1612       as_bad (_("Unrecognized opcode format: `%s'"), input_line_pointer);
1613       return;
1614     }
1615   input_line_pointer = s;
1616   expression (&exp);
1617   if (exp.X_op == O_constant)
1618     {
1619       if (   (   opformat->oplen == 6
1620               && (addressT) exp.X_add_number < (1ULL << 48))
1621           || (   opformat->oplen == 4
1622               && (addressT) exp.X_add_number < (1ULL << 32))
1623           || (   opformat->oplen == 2
1624               && (addressT) exp.X_add_number < (1ULL << 16)))
1625         md_number_to_chars ((char *) insn, exp.X_add_number, opformat->oplen);
1626       else
1627         as_bad (_("Invalid .insn format\n"));
1628     }
1629   else if (exp.X_op == O_big)
1630     {
1631       if (exp.X_add_number > 0
1632           && opformat->oplen == 6
1633           && generic_bignum[3] == 0)
1634         {
1635           md_number_to_chars ((char *) insn, generic_bignum[2], 2);
1636           md_number_to_chars ((char *) &insn[2], generic_bignum[1], 2);
1637           md_number_to_chars ((char *) &insn[4], generic_bignum[0], 2);
1638         }
1639       else
1640         as_bad (_("Invalid .insn format\n"));
1641     }
1642   else
1643     as_bad (_("second operand of .insn not a constant\n"));
1644
1645   if (strcmp (opformat->name, "e") != 0 && *input_line_pointer++ != ',')
1646     as_bad (_("missing comma after insn constant\n"));
1647
1648   if ((s = strchr (input_line_pointer, '\n')) != NULL)
1649     *s = '\0';
1650   input_line_pointer = md_gather_operands (input_line_pointer, insn,
1651                                            opformat);
1652   if (s != NULL)
1653     *s = '\n';
1654   demand_empty_rest_of_line ();
1655 }
1656
1657 /* The .byte pseudo-op.  This is similar to the normal .byte
1658    pseudo-op, but it can also take a single ASCII string.  */
1659
1660 static void
1661 s390_byte (int ignore ATTRIBUTE_UNUSED)
1662 {
1663   if (*input_line_pointer != '\"')
1664     {
1665       cons (1);
1666       return;
1667     }
1668
1669   /* Gather characters.  A real double quote is doubled.  Unusual
1670      characters are not permitted.  */
1671   ++input_line_pointer;
1672   while (1)
1673     {
1674       char c;
1675
1676       c = *input_line_pointer++;
1677
1678       if (c == '\"')
1679         {
1680           if (*input_line_pointer != '\"')
1681             break;
1682           ++input_line_pointer;
1683         }
1684
1685       FRAG_APPEND_1_CHAR (c);
1686     }
1687
1688   demand_empty_rest_of_line ();
1689 }
1690
1691 /* The .ltorg pseudo-op.This emits all literals defined since the last
1692    .ltorg or the invocation of gas. Literals are defined with the
1693    @lit suffix.  */
1694
1695 static void
1696 s390_literals (int ignore ATTRIBUTE_UNUSED)
1697 {
1698   struct s390_lpe *lpe;
1699
1700   if (lp_sym == NULL || lpe_count == 0)
1701     return;     /* Nothing to be done.  */
1702
1703   /* Emit symbol for start of literal pool.  */
1704   S_SET_SEGMENT (lp_sym, now_seg);
1705   S_SET_VALUE (lp_sym, (valueT) frag_now_fix ());
1706   lp_sym->sy_frag = frag_now;
1707
1708   while (lpe_list)
1709     {
1710       lpe = lpe_list;
1711       lpe_list = lpe_list->next;
1712       S_SET_SEGMENT (lpe->sym, now_seg);
1713       S_SET_VALUE (lpe->sym, (valueT) frag_now_fix ());
1714       lpe->sym->sy_frag = frag_now;
1715
1716       /* Emit literal pool entry.  */
1717       if (lpe->reloc != BFD_RELOC_UNUSED)
1718         {
1719           reloc_howto_type *reloc_howto =
1720             bfd_reloc_type_lookup (stdoutput, lpe->reloc);
1721           int size = bfd_get_reloc_size (reloc_howto);
1722           char *where;
1723
1724           if (size > lpe->nbytes)
1725             as_bad (_("%s relocations do not fit in %d bytes"),
1726                     reloc_howto->name, lpe->nbytes);
1727           where = frag_more (lpe->nbytes);
1728           md_number_to_chars (where, 0, size);
1729           fix_new_exp (frag_now, where - frag_now->fr_literal,
1730                        size, &lpe->ex, reloc_howto->pc_relative, lpe->reloc);
1731         }
1732       else
1733         {
1734           if (lpe->ex.X_op == O_big)
1735             {
1736               if (lpe->ex.X_add_number <= 0)
1737                 generic_floating_point_number = lpe->floatnum;
1738               else
1739                 memcpy (generic_bignum, lpe->bignum,
1740                         lpe->ex.X_add_number * sizeof (LITTLENUM_TYPE));
1741             }
1742           emit_expr (&lpe->ex, lpe->nbytes);
1743         }
1744
1745       lpe->next = lpe_free_list;
1746       lpe_free_list = lpe;
1747     }
1748   lpe_list_tail = NULL;
1749   lp_sym = NULL;
1750   lp_count++;
1751   lpe_count = 0;
1752 }
1753
1754 char *
1755 md_atof (int type, char *litp, int *sizep)
1756 {
1757   return ieee_md_atof (type, litp, sizep, TRUE);
1758 }
1759
1760 /* Align a section (I don't know why this is machine dependent).  */
1761
1762 valueT
1763 md_section_align (asection *seg, valueT addr)
1764 {
1765   int align = bfd_get_section_alignment (stdoutput, seg);
1766
1767   return ((addr + (1 << align) - 1) & (-1 << align));
1768 }
1769
1770 /* We don't have any form of relaxing.  */
1771
1772 int
1773 md_estimate_size_before_relax (fragS *fragp ATTRIBUTE_UNUSED,
1774                                asection *seg ATTRIBUTE_UNUSED)
1775 {
1776   abort ();
1777   return 0;
1778 }
1779
1780 /* Convert a machine dependent frag.  We never generate these.  */
1781
1782 void
1783 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
1784                  asection *sec ATTRIBUTE_UNUSED,
1785                  fragS *fragp ATTRIBUTE_UNUSED)
1786 {
1787   abort ();
1788 }
1789
1790 symbolS *
1791 md_undefined_symbol (char *name)
1792 {
1793   if (*name == '_' && *(name + 1) == 'G'
1794       && strcmp (name, "_GLOBAL_OFFSET_TABLE_") == 0)
1795     {
1796       if (!GOT_symbol)
1797         {
1798           if (symbol_find (name))
1799             as_bad (_("GOT already in symbol table"));
1800           GOT_symbol = symbol_new (name, undefined_section,
1801                                    (valueT) 0, &zero_address_frag);
1802         }
1803       return GOT_symbol;
1804     }
1805   return 0;
1806 }
1807
1808 /* Functions concerning relocs.  */
1809
1810 /* The location from which a PC relative jump should be calculated,
1811    given a PC relative reloc.  */
1812
1813 long
1814 md_pcrel_from_section (fixS *fixp, segT sec ATTRIBUTE_UNUSED)
1815 {
1816   return fixp->fx_frag->fr_address + fixp->fx_where;
1817 }
1818
1819 /* Here we decide which fixups can be adjusted to make them relative to
1820    the beginning of the section instead of the symbol.  Basically we need
1821    to make sure that the dynamic relocations are done correctly, so in
1822    some cases we force the original symbol to be used.  */
1823 int
1824 tc_s390_fix_adjustable (fixS *fixP)
1825 {
1826   /* Don't adjust references to merge sections.  */
1827   if ((S_GET_SEGMENT (fixP->fx_addsy)->flags & SEC_MERGE) != 0)
1828     return 0;
1829   /* adjust_reloc_syms doesn't know about the GOT.  */
1830   if (   fixP->fx_r_type == BFD_RELOC_16_GOTOFF
1831       || fixP->fx_r_type == BFD_RELOC_32_GOTOFF
1832       || fixP->fx_r_type == BFD_RELOC_390_GOTOFF64
1833       || fixP->fx_r_type == BFD_RELOC_390_PLTOFF16
1834       || fixP->fx_r_type == BFD_RELOC_390_PLTOFF32
1835       || fixP->fx_r_type == BFD_RELOC_390_PLTOFF64
1836       || fixP->fx_r_type == BFD_RELOC_390_PLT16DBL
1837       || fixP->fx_r_type == BFD_RELOC_390_PLT32
1838       || fixP->fx_r_type == BFD_RELOC_390_PLT32DBL
1839       || fixP->fx_r_type == BFD_RELOC_390_PLT64
1840       || fixP->fx_r_type == BFD_RELOC_390_GOT12
1841       || fixP->fx_r_type == BFD_RELOC_390_GOT20
1842       || fixP->fx_r_type == BFD_RELOC_390_GOT16
1843       || fixP->fx_r_type == BFD_RELOC_32_GOT_PCREL
1844       || fixP->fx_r_type == BFD_RELOC_390_GOT64
1845       || fixP->fx_r_type == BFD_RELOC_390_GOTENT
1846       || fixP->fx_r_type == BFD_RELOC_390_GOTPLT12
1847       || fixP->fx_r_type == BFD_RELOC_390_GOTPLT16
1848       || fixP->fx_r_type == BFD_RELOC_390_GOTPLT20
1849       || fixP->fx_r_type == BFD_RELOC_390_GOTPLT32
1850       || fixP->fx_r_type == BFD_RELOC_390_GOTPLT64
1851       || fixP->fx_r_type == BFD_RELOC_390_GOTPLTENT
1852       || fixP->fx_r_type == BFD_RELOC_390_TLS_LOAD
1853       || fixP->fx_r_type == BFD_RELOC_390_TLS_GDCALL
1854       || fixP->fx_r_type == BFD_RELOC_390_TLS_LDCALL
1855       || fixP->fx_r_type == BFD_RELOC_390_TLS_GD32
1856       || fixP->fx_r_type == BFD_RELOC_390_TLS_GD64
1857       || fixP->fx_r_type == BFD_RELOC_390_TLS_GOTIE12
1858       || fixP->fx_r_type == BFD_RELOC_390_TLS_GOTIE20
1859       || fixP->fx_r_type == BFD_RELOC_390_TLS_GOTIE32
1860       || fixP->fx_r_type == BFD_RELOC_390_TLS_GOTIE64
1861       || fixP->fx_r_type == BFD_RELOC_390_TLS_LDM32
1862       || fixP->fx_r_type == BFD_RELOC_390_TLS_LDM64
1863       || fixP->fx_r_type == BFD_RELOC_390_TLS_IE32
1864       || fixP->fx_r_type == BFD_RELOC_390_TLS_IE64
1865       || fixP->fx_r_type == BFD_RELOC_390_TLS_IEENT
1866       || fixP->fx_r_type == BFD_RELOC_390_TLS_LE32
1867       || fixP->fx_r_type == BFD_RELOC_390_TLS_LE64
1868       || fixP->fx_r_type == BFD_RELOC_390_TLS_LDO32
1869       || fixP->fx_r_type == BFD_RELOC_390_TLS_LDO64
1870       || fixP->fx_r_type == BFD_RELOC_390_TLS_DTPMOD
1871       || fixP->fx_r_type == BFD_RELOC_390_TLS_DTPOFF
1872       || fixP->fx_r_type == BFD_RELOC_390_TLS_TPOFF
1873       || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
1874       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
1875     return 0;
1876   return 1;
1877 }
1878
1879 /* Return true if we must always emit a reloc for a type and false if
1880    there is some hope of resolving it at assembly time.  */
1881 int
1882 tc_s390_force_relocation (struct fix *fixp)
1883 {
1884   /* Ensure we emit a relocation for every reference to the global
1885      offset table or to the procedure link table.  */
1886   switch (fixp->fx_r_type)
1887     {
1888     case BFD_RELOC_390_GOT12:
1889     case BFD_RELOC_390_GOT20:
1890     case BFD_RELOC_32_GOT_PCREL:
1891     case BFD_RELOC_32_GOTOFF:
1892     case BFD_RELOC_390_GOTOFF64:
1893     case BFD_RELOC_390_PLTOFF16:
1894     case BFD_RELOC_390_PLTOFF32:
1895     case BFD_RELOC_390_PLTOFF64:
1896     case BFD_RELOC_390_GOTPC:
1897     case BFD_RELOC_390_GOT16:
1898     case BFD_RELOC_390_GOTPCDBL:
1899     case BFD_RELOC_390_GOT64:
1900     case BFD_RELOC_390_GOTENT:
1901     case BFD_RELOC_390_PLT32:
1902     case BFD_RELOC_390_PLT16DBL:
1903     case BFD_RELOC_390_PLT32DBL:
1904     case BFD_RELOC_390_PLT64:
1905     case BFD_RELOC_390_GOTPLT12:
1906     case BFD_RELOC_390_GOTPLT16:
1907     case BFD_RELOC_390_GOTPLT20:
1908     case BFD_RELOC_390_GOTPLT32:
1909     case BFD_RELOC_390_GOTPLT64:
1910     case BFD_RELOC_390_GOTPLTENT:
1911       return 1;
1912     default:
1913       break;;
1914     }
1915
1916   return generic_force_reloc (fixp);
1917 }
1918
1919 /* Apply a fixup to the object code.  This is called for all the
1920    fixups we generated by the call to fix_new_exp, above.  In the call
1921    above we used a reloc code which was the largest legal reloc code
1922    plus the operand index.  Here we undo that to recover the operand
1923    index.  At this point all symbol values should be fully resolved,
1924    and we attempt to completely resolve the reloc.  If we can not do
1925    that, we determine the correct reloc code and put it back in the
1926    fixup.  */
1927
1928 void
1929 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
1930 {
1931   char *where;
1932   valueT value = *valP;
1933
1934   where = fixP->fx_frag->fr_literal + fixP->fx_where;
1935
1936   if (fixP->fx_subsy != NULL)
1937     as_bad_where (fixP->fx_file, fixP->fx_line,
1938                   _("cannot emit relocation %s against subsy symbol %s"),
1939                   bfd_get_reloc_code_name (fixP->fx_r_type),
1940                   S_GET_NAME (fixP->fx_subsy));
1941
1942   if (fixP->fx_addsy != NULL)
1943     {
1944       if (fixP->fx_pcrel)
1945         value += fixP->fx_frag->fr_address + fixP->fx_where;
1946     }
1947   else
1948     fixP->fx_done = 1;
1949
1950   if ((int) fixP->fx_r_type >= (int) BFD_RELOC_UNUSED)
1951     {
1952       const struct s390_operand *operand;
1953       int opindex;
1954
1955       opindex = (int) fixP->fx_r_type - (int) BFD_RELOC_UNUSED;
1956       operand = &s390_operands[opindex];
1957
1958       if (fixP->fx_done)
1959         {
1960           /* Insert the fully resolved operand value.  */
1961           s390_insert_operand ((unsigned char *) where, operand,
1962                                (offsetT) value, fixP->fx_file, fixP->fx_line);
1963           return;
1964         }
1965
1966       /* Determine a BFD reloc value based on the operand information.
1967          We are only prepared to turn a few of the operands into
1968          relocs.  */
1969       fixP->fx_offset = value;
1970       if (operand->bits == 12 && operand->shift == 20)
1971         {
1972           fixP->fx_size = 2;
1973           fixP->fx_where += 2;
1974           fixP->fx_r_type = BFD_RELOC_390_12;
1975         }
1976       else if (operand->bits == 12 && operand->shift == 36)
1977         {
1978           fixP->fx_size = 2;
1979           fixP->fx_where += 4;
1980           fixP->fx_r_type = BFD_RELOC_390_12;
1981         }
1982       else if (operand->bits == 20 && operand->shift == 20)
1983         {
1984           fixP->fx_size = 2;
1985           fixP->fx_where += 2;
1986           fixP->fx_r_type = BFD_RELOC_390_20;
1987         }
1988       else if (operand->bits == 8 && operand->shift == 8)
1989         {
1990           fixP->fx_size = 1;
1991           fixP->fx_where += 1;
1992           fixP->fx_r_type = BFD_RELOC_8;
1993         }
1994       else if (operand->bits == 16 && operand->shift == 16)
1995         {
1996           fixP->fx_size = 2;
1997           fixP->fx_where += 2;
1998           if (operand->flags & S390_OPERAND_PCREL)
1999             {
2000               fixP->fx_r_type = BFD_RELOC_390_PC16DBL;
2001               fixP->fx_offset += 2;
2002             }
2003           else
2004             fixP->fx_r_type = BFD_RELOC_16;
2005         }
2006       else if (operand->bits == 32 && operand->shift == 16
2007                && (operand->flags & S390_OPERAND_PCREL))
2008         {
2009           fixP->fx_size = 4;
2010           fixP->fx_where += 2;
2011           fixP->fx_offset += 2;
2012           fixP->fx_r_type = BFD_RELOC_390_PC32DBL;
2013         }
2014       else
2015         {
2016           char *sfile;
2017           unsigned int sline;
2018
2019           /* Use expr_symbol_where to see if this is an expression
2020              symbol.  */
2021           if (expr_symbol_where (fixP->fx_addsy, &sfile, &sline))
2022             as_bad_where (fixP->fx_file, fixP->fx_line,
2023                           _("unresolved expression that must be resolved"));
2024           else
2025             as_bad_where (fixP->fx_file, fixP->fx_line,
2026                           _("unsupported relocation type"));
2027           fixP->fx_done = 1;
2028           return;
2029         }
2030     }
2031   else
2032     {
2033       switch (fixP->fx_r_type)
2034         {
2035         case BFD_RELOC_8:
2036           if (fixP->fx_pcrel)
2037             abort ();
2038           if (fixP->fx_done)
2039             md_number_to_chars (where, value, 1);
2040           break;
2041         case BFD_RELOC_390_12:
2042         case BFD_RELOC_390_GOT12:
2043         case BFD_RELOC_390_GOTPLT12:
2044           if (fixP->fx_done)
2045             {
2046               unsigned short mop;
2047
2048               mop = bfd_getb16 ((unsigned char *) where);
2049               mop |= (unsigned short) (value & 0xfff);
2050               bfd_putb16 ((bfd_vma) mop, (unsigned char *) where);
2051             }
2052           break;
2053
2054         case BFD_RELOC_390_20:
2055         case BFD_RELOC_390_GOT20:
2056         case BFD_RELOC_390_GOTPLT20:
2057           if (fixP->fx_done)
2058             {
2059               unsigned int mop;
2060               mop = bfd_getb32 ((unsigned char *) where);
2061               mop |= (unsigned int) ((value & 0xfff) << 8 |
2062                                      (value & 0xff000) >> 12);
2063               bfd_putb32 ((bfd_vma) mop, (unsigned char *) where);
2064             } 
2065           break;
2066
2067         case BFD_RELOC_16:
2068         case BFD_RELOC_GPREL16:
2069         case BFD_RELOC_16_GOT_PCREL:
2070         case BFD_RELOC_16_GOTOFF:
2071           if (fixP->fx_pcrel)
2072             as_bad_where (fixP->fx_file, fixP->fx_line,
2073                           _("cannot emit PC relative %s relocation%s%s"),
2074                           bfd_get_reloc_code_name (fixP->fx_r_type),
2075                           fixP->fx_addsy != NULL ? " against " : "",
2076                           (fixP->fx_addsy != NULL
2077                            ? S_GET_NAME (fixP->fx_addsy)
2078                            : ""));
2079           if (fixP->fx_done)
2080             md_number_to_chars (where, value, 2);
2081           break;
2082         case BFD_RELOC_390_GOT16:
2083         case BFD_RELOC_390_PLTOFF16:
2084         case BFD_RELOC_390_GOTPLT16:
2085           if (fixP->fx_done)
2086             md_number_to_chars (where, value, 2);
2087           break;
2088         case BFD_RELOC_390_PC16DBL:
2089         case BFD_RELOC_390_PLT16DBL:
2090           value += 2;
2091           if (fixP->fx_done)
2092             md_number_to_chars (where, (offsetT) value >> 1, 2);
2093           break;
2094
2095         case BFD_RELOC_32:
2096           if (fixP->fx_pcrel)
2097             fixP->fx_r_type = BFD_RELOC_32_PCREL;
2098           else
2099             fixP->fx_r_type = BFD_RELOC_32;
2100           if (fixP->fx_done)
2101             md_number_to_chars (where, value, 4);
2102           break;
2103         case BFD_RELOC_32_PCREL:
2104         case BFD_RELOC_32_BASEREL:
2105           fixP->fx_r_type = BFD_RELOC_32_PCREL;
2106           if (fixP->fx_done)
2107             md_number_to_chars (where, value, 4);
2108           break;
2109         case BFD_RELOC_32_GOT_PCREL:
2110         case BFD_RELOC_390_PLTOFF32:
2111         case BFD_RELOC_390_PLT32:
2112         case BFD_RELOC_390_GOTPLT32:
2113           if (fixP->fx_done)
2114             md_number_to_chars (where, value, 4);
2115           break;
2116         case BFD_RELOC_390_PC32DBL:
2117         case BFD_RELOC_390_PLT32DBL:
2118         case BFD_RELOC_390_GOTPCDBL:
2119         case BFD_RELOC_390_GOTENT:
2120         case BFD_RELOC_390_GOTPLTENT:
2121           value += 2;
2122           if (fixP->fx_done)
2123             md_number_to_chars (where, (offsetT) value >> 1, 4);
2124           break;
2125
2126         case BFD_RELOC_32_GOTOFF:
2127           if (fixP->fx_done)
2128             md_number_to_chars (where, value, sizeof (int));
2129           break;
2130
2131         case BFD_RELOC_390_GOTOFF64:
2132           if (fixP->fx_done)
2133             md_number_to_chars (where, value, 8);
2134           break;
2135
2136         case BFD_RELOC_390_GOT64:
2137         case BFD_RELOC_390_PLTOFF64:
2138         case BFD_RELOC_390_PLT64:
2139         case BFD_RELOC_390_GOTPLT64:
2140           if (fixP->fx_done)
2141             md_number_to_chars (where, value, 8);
2142           break;
2143
2144         case BFD_RELOC_64:
2145           if (fixP->fx_pcrel)
2146             fixP->fx_r_type = BFD_RELOC_64_PCREL;
2147           else
2148             fixP->fx_r_type = BFD_RELOC_64;
2149           if (fixP->fx_done)
2150             md_number_to_chars (where, value, 8);
2151           break;
2152
2153         case BFD_RELOC_64_PCREL:
2154           fixP->fx_r_type = BFD_RELOC_64_PCREL;
2155           if (fixP->fx_done)
2156             md_number_to_chars (where, value, 8);
2157           break;
2158
2159         case BFD_RELOC_VTABLE_INHERIT:
2160         case BFD_RELOC_VTABLE_ENTRY:
2161           fixP->fx_done = 0;
2162           return;
2163
2164         case BFD_RELOC_390_TLS_LOAD:
2165         case BFD_RELOC_390_TLS_GDCALL:
2166         case BFD_RELOC_390_TLS_LDCALL:
2167         case BFD_RELOC_390_TLS_GD32:
2168         case BFD_RELOC_390_TLS_GD64:
2169         case BFD_RELOC_390_TLS_GOTIE12:
2170         case BFD_RELOC_390_TLS_GOTIE20:
2171         case BFD_RELOC_390_TLS_GOTIE32:
2172         case BFD_RELOC_390_TLS_GOTIE64:
2173         case BFD_RELOC_390_TLS_LDM32:
2174         case BFD_RELOC_390_TLS_LDM64:
2175         case BFD_RELOC_390_TLS_IE32:
2176         case BFD_RELOC_390_TLS_IE64:
2177         case BFD_RELOC_390_TLS_LE32:
2178         case BFD_RELOC_390_TLS_LE64:
2179         case BFD_RELOC_390_TLS_LDO32:
2180         case BFD_RELOC_390_TLS_LDO64:
2181         case BFD_RELOC_390_TLS_DTPMOD:
2182         case BFD_RELOC_390_TLS_DTPOFF:
2183         case BFD_RELOC_390_TLS_TPOFF:
2184           S_SET_THREAD_LOCAL (fixP->fx_addsy);
2185           /* Fully resolved at link time.  */
2186           break;
2187         case BFD_RELOC_390_TLS_IEENT:
2188           /* Fully resolved at link time.  */
2189           S_SET_THREAD_LOCAL (fixP->fx_addsy);
2190           value += 2;
2191           break;
2192
2193         default:
2194           {
2195             const char *reloc_name = bfd_get_reloc_code_name (fixP->fx_r_type);
2196
2197             if (reloc_name != NULL)
2198               as_fatal (_("Gas failure, reloc type %s\n"), reloc_name);
2199             else
2200               as_fatal (_("Gas failure, reloc type #%i\n"), fixP->fx_r_type);
2201           }
2202         }
2203
2204       fixP->fx_offset = value;
2205     }
2206 }
2207
2208 /* Generate a reloc for a fixup.  */
2209
2210 arelent *
2211 tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
2212 {
2213   bfd_reloc_code_real_type code;
2214   arelent *reloc;
2215
2216   code = fixp->fx_r_type;
2217   if (GOT_symbol && fixp->fx_addsy == GOT_symbol)
2218     {
2219       if (   (s390_arch_size == 32 && code == BFD_RELOC_32_PCREL)
2220           || (s390_arch_size == 64 && code == BFD_RELOC_64_PCREL))
2221         code = BFD_RELOC_390_GOTPC;
2222       if (code == BFD_RELOC_390_PC32DBL)
2223         code = BFD_RELOC_390_GOTPCDBL;
2224     }
2225
2226   reloc = (arelent *) xmalloc (sizeof (arelent));
2227   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
2228   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2229   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
2230   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
2231   if (reloc->howto == NULL)
2232     {
2233       as_bad_where (fixp->fx_file, fixp->fx_line,
2234                     _("cannot represent relocation type %s"),
2235                     bfd_get_reloc_code_name (code));
2236       /* Set howto to a garbage value so that we can keep going.  */
2237       reloc->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
2238       gas_assert (reloc->howto != NULL);
2239     }
2240   reloc->addend = fixp->fx_offset;
2241
2242   return reloc;
2243 }
2244
2245 void
2246 s390_cfi_frame_initial_instructions (void)
2247 {
2248   cfi_add_CFA_def_cfa (15, s390_arch_size == 64 ? 160 : 96);
2249 }
2250
2251 int
2252 tc_s390_regname_to_dw2regnum (char *regname)
2253 {
2254   int regnum = -1;
2255
2256   if (regname[0] != 'c' && regname[0] != 'a')
2257     {
2258       regnum = reg_name_search (pre_defined_registers, REG_NAME_CNT, regname);
2259       if (regname[0] == 'f' && regnum != -1)
2260         regnum += 16;
2261     }
2262   else if (strcmp (regname, "ap") == 0)
2263     regnum = 32;
2264   else if (strcmp (regname, "cc") == 0)
2265     regnum = 33;
2266   return regnum;
2267 }