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