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