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