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