Home | History | Annotate | Download | only in config
      1 /* tc-hppa.c -- Assemble for the PA
      2    Copyright (C) 1989-2014 Free Software Foundation, Inc.
      3 
      4    This file is part of GAS, the GNU Assembler.
      5 
      6    GAS is free software; you can redistribute it and/or modify
      7    it under the terms of the GNU General Public License as published by
      8    the Free Software Foundation; either version 3, or (at your option)
      9    any later version.
     10 
     11    GAS is distributed in the hope that it will be useful,
     12    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14    GNU General Public License for more details.
     15 
     16    You should have received a copy of the GNU General Public License
     17    along with GAS; see the file COPYING.  If not, write to the Free
     18    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
     19    02110-1301, USA.  */
     20 
     21 /* HP PA-RISC support was contributed by the Center for Software Science
     22    at the University of Utah.  */
     23 
     24 #include "as.h"
     25 #include "safe-ctype.h"
     26 #include "subsegs.h"
     27 #include "dw2gencfi.h"
     28 
     29 #include "bfd/libhppa.h"
     30 
     31 /* Be careful, this file includes data *declarations*.  */
     32 #include "opcode/hppa.h"
     33 
     34 #if defined (OBJ_ELF) && defined (OBJ_SOM)
     35 error only one of OBJ_ELF and OBJ_SOM can be defined
     36 #endif
     37 
     38 /* If we are using ELF, then we probably can support dwarf2 debug
     39    records.  Furthermore, if we are supporting dwarf2 debug records,
     40    then we want to use the assembler support for compact line numbers.  */
     41 #ifdef OBJ_ELF
     42 #include "dwarf2dbg.h"
     43 
     44 /* A "convenient" place to put object file dependencies which do
     45    not need to be seen outside of tc-hppa.c.  */
     46 
     47 /* Object file formats specify relocation types.  */
     48 typedef enum elf_hppa_reloc_type reloc_type;
     49 
     50 /* Object file formats specify BFD symbol types.  */
     51 typedef elf_symbol_type obj_symbol_type;
     52 #define symbol_arg_reloc_info(sym)\
     53   (((obj_symbol_type *) symbol_get_bfdsym (sym))->tc_data.hppa_arg_reloc)
     54 
     55 #if TARGET_ARCH_SIZE == 64
     56 /* How to generate a relocation.  */
     57 #define hppa_gen_reloc_type _bfd_elf64_hppa_gen_reloc_type
     58 #define elf_hppa_reloc_final_type elf64_hppa_reloc_final_type
     59 #else
     60 #define hppa_gen_reloc_type _bfd_elf32_hppa_gen_reloc_type
     61 #define elf_hppa_reloc_final_type elf32_hppa_reloc_final_type
     62 #endif
     63 
     64 /* ELF objects can have versions, but apparently do not have anywhere
     65    to store a copyright string.  */
     66 #define obj_version obj_elf_version
     67 #define obj_copyright obj_elf_version
     68 
     69 #define UNWIND_SECTION_NAME ".PARISC.unwind"
     70 #endif /* OBJ_ELF */
     71 
     72 #ifdef OBJ_SOM
     73 /* Names of various debugging spaces/subspaces.  */
     74 #define GDB_DEBUG_SPACE_NAME "$GDB_DEBUG$"
     75 #define GDB_STRINGS_SUBSPACE_NAME "$GDB_STRINGS$"
     76 #define GDB_SYMBOLS_SUBSPACE_NAME "$GDB_SYMBOLS$"
     77 #define UNWIND_SECTION_NAME "$UNWIND$"
     78 
     79 /* Object file formats specify relocation types.  */
     80 typedef int reloc_type;
     81 
     82 /* SOM objects can have both a version string and a copyright string.  */
     83 #define obj_version obj_som_version
     84 #define obj_copyright obj_som_copyright
     85 
     86 /* How to generate a relocation.  */
     87 #define hppa_gen_reloc_type hppa_som_gen_reloc_type
     88 
     89 /* Object file formats specify BFD symbol types.  */
     90 typedef som_symbol_type obj_symbol_type;
     91 #define symbol_arg_reloc_info(sym)\
     92   (((obj_symbol_type *) symbol_get_bfdsym (sym))->tc_data.ap.hppa_arg_reloc)
     93 
     94 /* This apparently isn't in older versions of hpux reloc.h.  */
     95 #ifndef R_DLT_REL
     96 #define R_DLT_REL 0x78
     97 #endif
     98 
     99 #ifndef R_N0SEL
    100 #define R_N0SEL 0xd8
    101 #endif
    102 
    103 #ifndef R_N1SEL
    104 #define R_N1SEL 0xd9
    105 #endif
    106 #endif /* OBJ_SOM */
    107 
    108 #if TARGET_ARCH_SIZE == 64
    109 #define DEFAULT_LEVEL 25
    110 #else
    111 #define DEFAULT_LEVEL 10
    112 #endif
    113 
    114 /* Various structures and types used internally in tc-hppa.c.  */
    115 
    116 /* Unwind table and descriptor.  FIXME: Sync this with GDB version.  */
    117 
    118 struct unwind_desc
    119   {
    120     unsigned int cannot_unwind:1;
    121     unsigned int millicode:1;
    122     unsigned int millicode_save_rest:1;
    123     unsigned int region_desc:2;
    124     unsigned int save_sr:2;
    125     unsigned int entry_fr:4;
    126     unsigned int entry_gr:5;
    127     unsigned int args_stored:1;
    128     unsigned int call_fr:5;
    129     unsigned int call_gr:5;
    130     unsigned int save_sp:1;
    131     unsigned int save_rp:1;
    132     unsigned int save_rp_in_frame:1;
    133     unsigned int extn_ptr_defined:1;
    134     unsigned int cleanup_defined:1;
    135 
    136     unsigned int hpe_interrupt_marker:1;
    137     unsigned int hpux_interrupt_marker:1;
    138     unsigned int reserved:3;
    139     unsigned int frame_size:27;
    140   };
    141 
    142 /* We can't rely on compilers placing bitfields in any particular
    143    place, so use these macros when dumping unwind descriptors to
    144    object files.  */
    145 #define UNWIND_LOW32(U) \
    146   (((U)->cannot_unwind << 31)		\
    147    | ((U)->millicode << 30)		\
    148    | ((U)->millicode_save_rest << 29)	\
    149    | ((U)->region_desc << 27)		\
    150    | ((U)->save_sr << 25)		\
    151    | ((U)->entry_fr << 21)		\
    152    | ((U)->entry_gr << 16)		\
    153    | ((U)->args_stored << 15)		\
    154    | ((U)->call_fr << 10)		\
    155    | ((U)->call_gr << 5)		\
    156    | ((U)->save_sp << 4)		\
    157    | ((U)->save_rp << 3)		\
    158    | ((U)->save_rp_in_frame << 2)	\
    159    | ((U)->extn_ptr_defined << 1)	\
    160    | ((U)->cleanup_defined << 0))
    161 
    162 #define UNWIND_HIGH32(U) \
    163   (((U)->hpe_interrupt_marker << 31)	\
    164    | ((U)->hpux_interrupt_marker << 30)	\
    165    | ((U)->frame_size << 0))
    166 
    167 struct unwind_table
    168   {
    169     /* Starting and ending offsets of the region described by
    170        descriptor.  */
    171     unsigned int start_offset;
    172     unsigned int end_offset;
    173     struct unwind_desc descriptor;
    174   };
    175 
    176 /* This structure is used by the .callinfo, .enter, .leave pseudo-ops to
    177    control the entry and exit code they generate. It is also used in
    178    creation of the correct stack unwind descriptors.
    179 
    180    NOTE:  GAS does not support .enter and .leave for the generation of
    181    prologues and epilogues.  FIXME.
    182 
    183    The fields in structure roughly correspond to the arguments available on the
    184    .callinfo pseudo-op.  */
    185 
    186 struct call_info
    187   {
    188     /* The unwind descriptor being built.  */
    189     struct unwind_table ci_unwind;
    190 
    191     /* Name of this function.  */
    192     symbolS *start_symbol;
    193 
    194     /* (temporary) symbol used to mark the end of this function.  */
    195     symbolS *end_symbol;
    196 
    197     /* Next entry in the chain.  */
    198     struct call_info *ci_next;
    199   };
    200 
    201 /* Operand formats for FP instructions.   Note not all FP instructions
    202    allow all four formats to be used (for example fmpysub only allows
    203    SGL and DBL).  */
    204 typedef enum
    205   {
    206     SGL, DBL, ILLEGAL_FMT, QUAD, W, UW, DW, UDW, QW, UQW
    207   }
    208 fp_operand_format;
    209 
    210 /* This fully describes the symbol types which may be attached to
    211    an EXPORT or IMPORT directive.  Only SOM uses this formation
    212    (ELF has no need for it).  */
    213 typedef enum
    214   {
    215     SYMBOL_TYPE_UNKNOWN,
    216     SYMBOL_TYPE_ABSOLUTE,
    217     SYMBOL_TYPE_CODE,
    218     SYMBOL_TYPE_DATA,
    219     SYMBOL_TYPE_ENTRY,
    220     SYMBOL_TYPE_MILLICODE,
    221     SYMBOL_TYPE_PLABEL,
    222     SYMBOL_TYPE_PRI_PROG,
    223     SYMBOL_TYPE_SEC_PROG,
    224   }
    225 pa_symbol_type;
    226 
    227 /* This structure contains information needed to assemble
    228    individual instructions.  */
    229 struct pa_it
    230   {
    231     /* Holds the opcode after parsing by pa_ip.  */
    232     unsigned long opcode;
    233 
    234     /* Holds an expression associated with the current instruction.  */
    235     expressionS exp;
    236 
    237     /* Does this instruction use PC-relative addressing.  */
    238     int pcrel;
    239 
    240     /* Floating point formats for operand1 and operand2.  */
    241     fp_operand_format fpof1;
    242     fp_operand_format fpof2;
    243 
    244     /* Whether or not we saw a truncation request on an fcnv insn.  */
    245     int trunc;
    246 
    247     /* Holds the field selector for this instruction
    248        (for example L%, LR%, etc).  */
    249     long field_selector;
    250 
    251     /* Holds any argument relocation bits associated with this
    252        instruction.  (instruction should be some sort of call).  */
    253     unsigned int arg_reloc;
    254 
    255     /* The format specification for this instruction.  */
    256     int format;
    257 
    258     /* The relocation (if any) associated with this instruction.  */
    259     reloc_type reloc;
    260   };
    261 
    262 /* PA-89 floating point registers are arranged like this:
    263 
    264    +--------------+--------------+
    265    |   0 or 16L   |  16 or 16R   |
    266    +--------------+--------------+
    267    |   1 or 17L   |  17 or 17R   |
    268    +--------------+--------------+
    269    |              |              |
    270 
    271    .              .              .
    272    .              .              .
    273    .              .              .
    274 
    275    |              |              |
    276    +--------------+--------------+
    277    |  14 or 30L   |  30 or 30R   |
    278    +--------------+--------------+
    279    |  15 or 31L   |  31 or 31R   |
    280    +--------------+--------------+  */
    281 
    282 /* Additional information needed to build argument relocation stubs.  */
    283 struct call_desc
    284   {
    285     /* The argument relocation specification.  */
    286     unsigned int arg_reloc;
    287 
    288     /* Number of arguments.  */
    289     unsigned int arg_count;
    290   };
    291 
    292 #ifdef OBJ_SOM
    293 /* This structure defines an entry in the subspace dictionary
    294    chain.  */
    295 
    296 struct subspace_dictionary_chain
    297   {
    298     /* Nonzero if this space has been defined by the user code.  */
    299     unsigned int ssd_defined;
    300 
    301     /* Name of this subspace.  */
    302     char *ssd_name;
    303 
    304     /* GAS segment and subsegment associated with this subspace.  */
    305     asection *ssd_seg;
    306     int ssd_subseg;
    307 
    308     /* Next space in the subspace dictionary chain.  */
    309     struct subspace_dictionary_chain *ssd_next;
    310   };
    311 
    312 typedef struct subspace_dictionary_chain ssd_chain_struct;
    313 
    314 /* This structure defines an entry in the subspace dictionary
    315    chain.  */
    316 
    317 struct space_dictionary_chain
    318   {
    319     /* Nonzero if this space has been defined by the user code or
    320        as a default space.  */
    321     unsigned int sd_defined;
    322 
    323     /* Nonzero if this spaces has been defined by the user code.  */
    324     unsigned int sd_user_defined;
    325 
    326     /* The space number (or index).  */
    327     unsigned int sd_spnum;
    328 
    329     /* The name of this subspace.  */
    330     char *sd_name;
    331 
    332     /* GAS segment to which this subspace corresponds.  */
    333     asection *sd_seg;
    334 
    335     /* Current subsegment number being used.  */
    336     int sd_last_subseg;
    337 
    338     /* The chain of subspaces contained within this space.  */
    339     ssd_chain_struct *sd_subspaces;
    340 
    341     /* The next entry in the space dictionary chain.  */
    342     struct space_dictionary_chain *sd_next;
    343   };
    344 
    345 typedef struct space_dictionary_chain sd_chain_struct;
    346 
    347 /* This structure defines attributes of the default subspace
    348    dictionary entries.  */
    349 
    350 struct default_subspace_dict
    351   {
    352     /* Name of the subspace.  */
    353     char *name;
    354 
    355     /* FIXME.  Is this still needed?  */
    356     char defined;
    357 
    358     /* Nonzero if this subspace is loadable.  */
    359     char loadable;
    360 
    361     /* Nonzero if this subspace contains only code.  */
    362     char code_only;
    363 
    364     /* Nonzero if this is a comdat subspace.  */
    365     char comdat;
    366 
    367     /* Nonzero if this is a common subspace.  */
    368     char common;
    369 
    370     /* Nonzero if this is a common subspace which allows symbols
    371        to be multiply defined.  */
    372     char dup_common;
    373 
    374     /* Nonzero if this subspace should be zero filled.  */
    375     char zero;
    376 
    377     /* Sort key for this subspace.  */
    378     unsigned char sort;
    379 
    380     /* Access control bits for this subspace.  Can represent RWX access
    381        as well as privilege level changes for gateways.  */
    382     int access;
    383 
    384     /* Index of containing space.  */
    385     int space_index;
    386 
    387     /* Alignment (in bytes) of this subspace.  */
    388     int alignment;
    389 
    390     /* Quadrant within space where this subspace should be loaded.  */
    391     int quadrant;
    392 
    393     /* An index into the default spaces array.  */
    394     int def_space_index;
    395 
    396     /* Subsegment associated with this subspace.  */
    397     subsegT subsegment;
    398   };
    399 
    400 /* This structure defines attributes of the default space
    401    dictionary entries.  */
    402 
    403 struct default_space_dict
    404   {
    405     /* Name of the space.  */
    406     char *name;
    407 
    408     /* Space number.  It is possible to identify spaces within
    409        assembly code numerically!  */
    410     int spnum;
    411 
    412     /* Nonzero if this space is loadable.  */
    413     char loadable;
    414 
    415     /* Nonzero if this space is "defined".  FIXME is still needed */
    416     char defined;
    417 
    418     /* Nonzero if this space can not be shared.  */
    419     char private;
    420 
    421     /* Sort key for this space.  */
    422     unsigned char sort;
    423 
    424     /* Segment associated with this space.  */
    425     asection *segment;
    426   };
    427 #endif
    428 
    429 /* Structure for previous label tracking.  Needed so that alignments,
    430    callinfo declarations, etc can be easily attached to a particular
    431    label.  */
    432 typedef struct label_symbol_struct
    433   {
    434     struct symbol *lss_label;
    435 #ifdef OBJ_SOM
    436     sd_chain_struct *lss_space;
    437 #endif
    438 #ifdef OBJ_ELF
    439     segT lss_segment;
    440 #endif
    441     struct label_symbol_struct *lss_next;
    442   }
    443 label_symbol_struct;
    444 
    445 /* Extra information needed to perform fixups (relocations) on the PA.  */
    446 struct hppa_fix_struct
    447   {
    448     /* The field selector.  */
    449     enum hppa_reloc_field_selector_type_alt fx_r_field;
    450 
    451     /* Type of fixup.  */
    452     int fx_r_type;
    453 
    454     /* Format of fixup.  */
    455     int fx_r_format;
    456 
    457     /* Argument relocation bits.  */
    458     unsigned int fx_arg_reloc;
    459 
    460     /* The segment this fixup appears in.  */
    461     segT segment;
    462   };
    463 
    464 /* Structure to hold information about predefined registers.  */
    465 
    466 struct pd_reg
    467   {
    468     char *name;
    469     int value;
    470   };
    471 
    472 /* This structure defines the mapping from a FP condition string
    473    to a condition number which can be recorded in an instruction.  */
    474 struct fp_cond_map
    475   {
    476     char *string;
    477     int cond;
    478   };
    479 
    480 /* This structure defines a mapping from a field selector
    481    string to a field selector type.  */
    482 struct selector_entry
    483   {
    484     char *prefix;
    485     int field_selector;
    486   };
    487 
    488 /* Prototypes for functions local to tc-hppa.c.  */
    489 
    490 #ifdef OBJ_SOM
    491 static void pa_check_current_space_and_subspace (void);
    492 #endif
    493 
    494 #if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
    495 static void pa_text (int);
    496 static void pa_data (int);
    497 static void pa_comm (int);
    498 #endif
    499 #ifdef OBJ_SOM
    500 static int exact_log2 (int);
    501 static void pa_compiler (int);
    502 static void pa_align (int);
    503 static void pa_space (int);
    504 static void pa_spnum (int);
    505 static void pa_subspace (int);
    506 static sd_chain_struct *create_new_space (char *, int, int,
    507 						  int, int, int,
    508 						  asection *, int);
    509 static ssd_chain_struct *create_new_subspace (sd_chain_struct *,
    510 						      char *, int, int,
    511 						      int, int, int, int,
    512 						      int, int, int, int,
    513 						      int, asection *);
    514 static ssd_chain_struct *update_subspace (sd_chain_struct *,
    515 						  char *, int, int, int,
    516 						  int, int, int, int,
    517 						  int, int, int, int,
    518 						  asection *);
    519 static sd_chain_struct *is_defined_space (char *);
    520 static ssd_chain_struct *is_defined_subspace (char *);
    521 static sd_chain_struct *pa_segment_to_space (asection *);
    522 static ssd_chain_struct *pa_subsegment_to_subspace (asection *,
    523 							    subsegT);
    524 static sd_chain_struct *pa_find_space_by_number (int);
    525 static unsigned int pa_subspace_start (sd_chain_struct *, int);
    526 static sd_chain_struct *pa_parse_space_stmt (char *, int);
    527 #endif
    528 
    529 /* File and globally scoped variable declarations.  */
    530 
    531 #ifdef OBJ_SOM
    532 /* Root and final entry in the space chain.  */
    533 static sd_chain_struct *space_dict_root;
    534 static sd_chain_struct *space_dict_last;
    535 
    536 /* The current space and subspace.  */
    537 static sd_chain_struct *current_space;
    538 static ssd_chain_struct *current_subspace;
    539 #endif
    540 
    541 /* Root of the call_info chain.  */
    542 static struct call_info *call_info_root;
    543 
    544 /* The last call_info (for functions) structure
    545    seen so it can be associated with fixups and
    546    function labels.  */
    547 static struct call_info *last_call_info;
    548 
    549 /* The last call description (for actual calls).  */
    550 static struct call_desc last_call_desc;
    551 
    552 /* handle of the OPCODE hash table */
    553 static struct hash_control *op_hash = NULL;
    554 
    555 /* These characters can be suffixes of opcode names and they may be
    556    followed by meaningful whitespace.  We don't include `,' and `!'
    557    as they never appear followed by meaningful whitespace.  */
    558 const char hppa_symbol_chars[] = "*?=<>";
    559 
    560 /* This array holds the chars that only start a comment at the beginning of
    561    a line.  If the line seems to have the form '# 123 filename'
    562    .line and .file directives will appear in the pre-processed output.
    563 
    564    Note that input_file.c hand checks for '#' at the beginning of the
    565    first line of the input file.  This is because the compiler outputs
    566    #NO_APP at the beginning of its output.
    567 
    568    Also note that C style comments will always work.  */
    569 const char line_comment_chars[] = "#";
    570 
    571 /* This array holds the chars that always start a comment.  If the
    572    pre-processor is disabled, these aren't very useful.  */
    573 const char comment_chars[] = ";";
    574 
    575 /* This array holds the characters which act as line separators.  */
    576 const char line_separator_chars[] = "!";
    577 
    578 /* Chars that can be used to separate mant from exp in floating point nums.  */
    579 const char EXP_CHARS[] = "eE";
    580 
    581 /* Chars that mean this number is a floating point constant.
    582    As in 0f12.456 or 0d1.2345e12.
    583 
    584    Be aware that MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT may have to be
    585    changed in read.c.  Ideally it shouldn't have to know about it
    586    at all, but nothing is ideal around here.  */
    587 const char FLT_CHARS[] = "rRsSfFdDxXpP";
    588 
    589 static struct pa_it the_insn;
    590 
    591 /* Points to the end of an expression just parsed by get_expression
    592    and friends.  FIXME.  This shouldn't be handled with a file-global
    593    variable.  */
    594 static char *expr_end;
    595 
    596 /* Nonzero if a .callinfo appeared within the current procedure.  */
    597 static int callinfo_found;
    598 
    599 /* Nonzero if the assembler is currently within a .entry/.exit pair.  */
    600 static int within_entry_exit;
    601 
    602 /* Nonzero if the assembler is currently within a procedure definition.  */
    603 static int within_procedure;
    604 
    605 /* Handle on structure which keep track of the last symbol
    606    seen in each subspace.  */
    607 static label_symbol_struct *label_symbols_rootp = NULL;
    608 
    609 /* Nonzero when strict matching is enabled.  Zero otherwise.
    610 
    611    Each opcode in the table has a flag which indicates whether or
    612    not strict matching should be enabled for that instruction.
    613 
    614    Mainly, strict causes errors to be ignored when a match failure
    615    occurs.  However, it also affects the parsing of register fields
    616    by pa_parse_number.  */
    617 static int strict;
    618 
    619 /* pa_parse_number returns values in `pa_number'.  Mostly
    620    pa_parse_number is used to return a register number, with floating
    621    point registers being numbered from FP_REG_BASE upwards.
    622    The bit specified with FP_REG_RSEL is set if the floating point
    623    register has a `r' suffix.  */
    624 #define FP_REG_BASE 64
    625 #define FP_REG_RSEL 128
    626 static int pa_number;
    627 
    628 #ifdef OBJ_SOM
    629 /* A dummy bfd symbol so that all relocations have symbols of some kind.  */
    630 static symbolS *dummy_symbol;
    631 #endif
    632 
    633 /* Nonzero if errors are to be printed.  */
    634 static int print_errors = 1;
    635 
    636 /* List of registers that are pre-defined:
    637 
    638    Each general register has one predefined name of the form
    639    %r<REGNUM> which has the value <REGNUM>.
    640 
    641    Space and control registers are handled in a similar manner,
    642    but use %sr<REGNUM> and %cr<REGNUM> as their predefined names.
    643 
    644    Likewise for the floating point registers, but of the form
    645    %fr<REGNUM>.  Floating point registers have additional predefined
    646    names with 'L' and 'R' suffixes (e.g. %fr19L, %fr19R) which
    647    again have the value <REGNUM>.
    648 
    649    Many registers also have synonyms:
    650 
    651    %r26 - %r23 have %arg0 - %arg3 as synonyms
    652    %r28 - %r29 have %ret0 - %ret1 as synonyms
    653    %fr4 - %fr7 have %farg0 - %farg3 as synonyms
    654    %r30 has %sp as a synonym
    655    %r27 has %dp as a synonym
    656    %r2  has %rp as a synonym
    657 
    658    Almost every control register has a synonym; they are not listed
    659    here for brevity.
    660 
    661    The table is sorted. Suitable for searching by a binary search.  */
    662 
    663 static const struct pd_reg pre_defined_registers[] =
    664 {
    665   {"%arg0",  26},
    666   {"%arg1",  25},
    667   {"%arg2",  24},
    668   {"%arg3",  23},
    669   {"%cr0",    0},
    670   {"%cr10",  10},
    671   {"%cr11",  11},
    672   {"%cr12",  12},
    673   {"%cr13",  13},
    674   {"%cr14",  14},
    675   {"%cr15",  15},
    676   {"%cr16",  16},
    677   {"%cr17",  17},
    678   {"%cr18",  18},
    679   {"%cr19",  19},
    680   {"%cr20",  20},
    681   {"%cr21",  21},
    682   {"%cr22",  22},
    683   {"%cr23",  23},
    684   {"%cr24",  24},
    685   {"%cr25",  25},
    686   {"%cr26",  26},
    687   {"%cr27",  27},
    688   {"%cr28",  28},
    689   {"%cr29",  29},
    690   {"%cr30",  30},
    691   {"%cr31",  31},
    692   {"%cr8",    8},
    693   {"%cr9",    9},
    694   {"%dp",    27},
    695   {"%eiem",  15},
    696   {"%eirr",  23},
    697   {"%farg0",  4 + FP_REG_BASE},
    698   {"%farg1",  5 + FP_REG_BASE},
    699   {"%farg2",  6 + FP_REG_BASE},
    700   {"%farg3",  7 + FP_REG_BASE},
    701   {"%fr0",    0 + FP_REG_BASE},
    702   {"%fr0l",   0 + FP_REG_BASE},
    703   {"%fr0r",   0 + FP_REG_BASE + FP_REG_RSEL},
    704   {"%fr1",    1 + FP_REG_BASE},
    705   {"%fr10",  10 + FP_REG_BASE},
    706   {"%fr10l", 10 + FP_REG_BASE},
    707   {"%fr10r", 10 + FP_REG_BASE + FP_REG_RSEL},
    708   {"%fr11",  11 + FP_REG_BASE},
    709   {"%fr11l", 11 + FP_REG_BASE},
    710   {"%fr11r", 11 + FP_REG_BASE + FP_REG_RSEL},
    711   {"%fr12",  12 + FP_REG_BASE},
    712   {"%fr12l", 12 + FP_REG_BASE},
    713   {"%fr12r", 12 + FP_REG_BASE + FP_REG_RSEL},
    714   {"%fr13",  13 + FP_REG_BASE},
    715   {"%fr13l", 13 + FP_REG_BASE},
    716   {"%fr13r", 13 + FP_REG_BASE + FP_REG_RSEL},
    717   {"%fr14",  14 + FP_REG_BASE},
    718   {"%fr14l", 14 + FP_REG_BASE},
    719   {"%fr14r", 14 + FP_REG_BASE + FP_REG_RSEL},
    720   {"%fr15",  15 + FP_REG_BASE},
    721   {"%fr15l", 15 + FP_REG_BASE},
    722   {"%fr15r", 15 + FP_REG_BASE + FP_REG_RSEL},
    723   {"%fr16",  16 + FP_REG_BASE},
    724   {"%fr16l", 16 + FP_REG_BASE},
    725   {"%fr16r", 16 + FP_REG_BASE + FP_REG_RSEL},
    726   {"%fr17",  17 + FP_REG_BASE},
    727   {"%fr17l", 17 + FP_REG_BASE},
    728   {"%fr17r", 17 + FP_REG_BASE + FP_REG_RSEL},
    729   {"%fr18",  18 + FP_REG_BASE},
    730   {"%fr18l", 18 + FP_REG_BASE},
    731   {"%fr18r", 18 + FP_REG_BASE + FP_REG_RSEL},
    732   {"%fr19",  19 + FP_REG_BASE},
    733   {"%fr19l", 19 + FP_REG_BASE},
    734   {"%fr19r", 19 + FP_REG_BASE + FP_REG_RSEL},
    735   {"%fr1l",   1 + FP_REG_BASE},
    736   {"%fr1r",   1 + FP_REG_BASE + FP_REG_RSEL},
    737   {"%fr2",    2 + FP_REG_BASE},
    738   {"%fr20",  20 + FP_REG_BASE},
    739   {"%fr20l", 20 + FP_REG_BASE},
    740   {"%fr20r", 20 + FP_REG_BASE + FP_REG_RSEL},
    741   {"%fr21",  21 + FP_REG_BASE},
    742   {"%fr21l", 21 + FP_REG_BASE},
    743   {"%fr21r", 21 + FP_REG_BASE + FP_REG_RSEL},
    744   {"%fr22",  22 + FP_REG_BASE},
    745   {"%fr22l", 22 + FP_REG_BASE},
    746   {"%fr22r", 22 + FP_REG_BASE + FP_REG_RSEL},
    747   {"%fr23",  23 + FP_REG_BASE},
    748   {"%fr23l", 23 + FP_REG_BASE},
    749   {"%fr23r", 23 + FP_REG_BASE + FP_REG_RSEL},
    750   {"%fr24",  24 + FP_REG_BASE},
    751   {"%fr24l", 24 + FP_REG_BASE},
    752   {"%fr24r", 24 + FP_REG_BASE + FP_REG_RSEL},
    753   {"%fr25",  25 + FP_REG_BASE},
    754   {"%fr25l", 25 + FP_REG_BASE},
    755   {"%fr25r", 25 + FP_REG_BASE + FP_REG_RSEL},
    756   {"%fr26",  26 + FP_REG_BASE},
    757   {"%fr26l", 26 + FP_REG_BASE},
    758   {"%fr26r", 26 + FP_REG_BASE + FP_REG_RSEL},
    759   {"%fr27",  27 + FP_REG_BASE},
    760   {"%fr27l", 27 + FP_REG_BASE},
    761   {"%fr27r", 27 + FP_REG_BASE + FP_REG_RSEL},
    762   {"%fr28",  28 + FP_REG_BASE},
    763   {"%fr28l", 28 + FP_REG_BASE},
    764   {"%fr28r", 28 + FP_REG_BASE + FP_REG_RSEL},
    765   {"%fr29",  29 + FP_REG_BASE},
    766   {"%fr29l", 29 + FP_REG_BASE},
    767   {"%fr29r", 29 + FP_REG_BASE + FP_REG_RSEL},
    768   {"%fr2l",   2 + FP_REG_BASE},
    769   {"%fr2r",   2 + FP_REG_BASE + FP_REG_RSEL},
    770   {"%fr3",    3 + FP_REG_BASE},
    771   {"%fr30",  30 + FP_REG_BASE},
    772   {"%fr30l", 30 + FP_REG_BASE},
    773   {"%fr30r", 30 + FP_REG_BASE + FP_REG_RSEL},
    774   {"%fr31",  31 + FP_REG_BASE},
    775   {"%fr31l", 31 + FP_REG_BASE},
    776   {"%fr31r", 31 + FP_REG_BASE + FP_REG_RSEL},
    777   {"%fr3l",   3 + FP_REG_BASE},
    778   {"%fr3r",   3 + FP_REG_BASE + FP_REG_RSEL},
    779   {"%fr4",    4 + FP_REG_BASE},
    780   {"%fr4l",   4 + FP_REG_BASE},
    781   {"%fr4r",   4 + FP_REG_BASE + FP_REG_RSEL},
    782   {"%fr5",    5 + FP_REG_BASE},
    783   {"%fr5l",   5 + FP_REG_BASE},
    784   {"%fr5r",   5 + FP_REG_BASE + FP_REG_RSEL},
    785   {"%fr6",    6 + FP_REG_BASE},
    786   {"%fr6l",   6 + FP_REG_BASE},
    787   {"%fr6r",   6 + FP_REG_BASE + FP_REG_RSEL},
    788   {"%fr7",    7 + FP_REG_BASE},
    789   {"%fr7l",   7 + FP_REG_BASE},
    790   {"%fr7r",   7 + FP_REG_BASE + FP_REG_RSEL},
    791   {"%fr8",    8 + FP_REG_BASE},
    792   {"%fr8l",   8 + FP_REG_BASE},
    793   {"%fr8r",   8 + FP_REG_BASE + FP_REG_RSEL},
    794   {"%fr9",    9 + FP_REG_BASE},
    795   {"%fr9l",   9 + FP_REG_BASE},
    796   {"%fr9r",   9 + FP_REG_BASE + FP_REG_RSEL},
    797   {"%fret",   4},
    798   {"%hta",   25},
    799   {"%iir",   19},
    800   {"%ior",   21},
    801   {"%ipsw",  22},
    802   {"%isr",   20},
    803   {"%itmr",  16},
    804   {"%iva",   14},
    805 #if TARGET_ARCH_SIZE == 64
    806   {"%mrp",    2},
    807 #else
    808   {"%mrp",   31},
    809 #endif
    810   {"%pcoq",  18},
    811   {"%pcsq",  17},
    812   {"%pidr1",  8},
    813   {"%pidr2",  9},
    814   {"%pidr3", 12},
    815   {"%pidr4", 13},
    816   {"%ppda",  24},
    817   {"%r0",     0},
    818   {"%r1",     1},
    819   {"%r10",   10},
    820   {"%r11",   11},
    821   {"%r12",   12},
    822   {"%r13",   13},
    823   {"%r14",   14},
    824   {"%r15",   15},
    825   {"%r16",   16},
    826   {"%r17",   17},
    827   {"%r18",   18},
    828   {"%r19",   19},
    829   {"%r2",     2},
    830   {"%r20",   20},
    831   {"%r21",   21},
    832   {"%r22",   22},
    833   {"%r23",   23},
    834   {"%r24",   24},
    835   {"%r25",   25},
    836   {"%r26",   26},
    837   {"%r27",   27},
    838   {"%r28",   28},
    839   {"%r29",   29},
    840   {"%r3",     3},
    841   {"%r30",   30},
    842   {"%r31",   31},
    843   {"%r4",     4},
    844   {"%r5",     5},
    845   {"%r6",     6},
    846   {"%r7",     7},
    847   {"%r8",     8},
    848   {"%r9",     9},
    849   {"%rctr",   0},
    850   {"%ret0",  28},
    851   {"%ret1",  29},
    852   {"%rp",     2},
    853   {"%sar",   11},
    854   {"%sp",    30},
    855   {"%sr0",    0},
    856   {"%sr1",    1},
    857   {"%sr2",    2},
    858   {"%sr3",    3},
    859   {"%sr4",    4},
    860   {"%sr5",    5},
    861   {"%sr6",    6},
    862   {"%sr7",    7},
    863   {"%t1",    22},
    864   {"%t2",    21},
    865   {"%t3",    20},
    866   {"%t4",    19},
    867   {"%tf1",   11},
    868   {"%tf2",   10},
    869   {"%tf3",    9},
    870   {"%tf4",    8},
    871   {"%tr0",   24},
    872   {"%tr1",   25},
    873   {"%tr2",   26},
    874   {"%tr3",   27},
    875   {"%tr4",   28},
    876   {"%tr5",   29},
    877   {"%tr6",   30},
    878   {"%tr7",   31}
    879 };
    880 
    881 /* This table is sorted by order of the length of the string. This is
    882    so we check for <> before we check for <. If we had a <> and checked
    883    for < first, we would get a false match.  */
    884 static const struct fp_cond_map fp_cond_map[] =
    885 {
    886   {"false?", 0},
    887   {"false", 1},
    888   {"true?", 30},
    889   {"true", 31},
    890   {"!<=>", 3},
    891   {"!?>=", 8},
    892   {"!?<=", 16},
    893   {"!<>", 7},
    894   {"!>=", 11},
    895   {"!?>", 12},
    896   {"?<=", 14},
    897   {"!<=", 19},
    898   {"!?<", 20},
    899   {"?>=", 22},
    900   {"!?=", 24},
    901   {"!=t", 27},
    902   {"<=>", 29},
    903   {"=t", 5},
    904   {"?=", 6},
    905   {"?<", 10},
    906   {"<=", 13},
    907   {"!>", 15},
    908   {"?>", 18},
    909   {">=", 21},
    910   {"!<", 23},
    911   {"<>", 25},
    912   {"!=", 26},
    913   {"!?", 28},
    914   {"?", 2},
    915   {"=", 4},
    916   {"<", 9},
    917   {">", 17}
    918 };
    919 
    920 static const struct selector_entry selector_table[] =
    921 {
    922   {"f", e_fsel},
    923   {"l", e_lsel},
    924   {"ld", e_ldsel},
    925   {"lp", e_lpsel},
    926   {"lr", e_lrsel},
    927   {"ls", e_lssel},
    928   {"lt", e_ltsel},
    929   {"ltp", e_ltpsel},
    930   {"n", e_nsel},
    931   {"nl", e_nlsel},
    932   {"nlr", e_nlrsel},
    933   {"p", e_psel},
    934   {"r", e_rsel},
    935   {"rd", e_rdsel},
    936   {"rp", e_rpsel},
    937   {"rr", e_rrsel},
    938   {"rs", e_rssel},
    939   {"rt", e_rtsel},
    940   {"rtp", e_rtpsel},
    941   {"t", e_tsel},
    942 };
    943 
    944 #ifdef OBJ_SOM
    945 /* default space and subspace dictionaries */
    946 
    947 #define GDB_SYMBOLS	GDB_SYMBOLS_SUBSPACE_NAME
    948 #define GDB_STRINGS	GDB_STRINGS_SUBSPACE_NAME
    949 
    950 /* pre-defined subsegments (subspaces) for the HPPA.  */
    951 #define SUBSEG_CODE   0
    952 #define SUBSEG_LIT    1
    953 #define SUBSEG_MILLI  2
    954 #define SUBSEG_DATA   0
    955 #define SUBSEG_BSS    2
    956 #define SUBSEG_UNWIND 3
    957 #define SUBSEG_GDB_STRINGS 0
    958 #define SUBSEG_GDB_SYMBOLS 1
    959 
    960 static struct default_subspace_dict pa_def_subspaces[] =
    961 {
    962   {"$CODE$", 1, 1, 1, 0, 0, 0, 0, 24, 0x2c, 0, 8, 0, 0, SUBSEG_CODE},
    963   {"$DATA$", 1, 1, 0, 0, 0, 0, 0, 24, 0x1f, 1, 8, 1, 1, SUBSEG_DATA},
    964   {"$LIT$", 1, 1, 0, 0, 0, 0, 0, 16, 0x2c, 0, 8, 0, 0, SUBSEG_LIT},
    965   {"$MILLICODE$", 1, 1, 0, 0, 0, 0, 0, 8, 0x2c, 0, 8, 0, 0, SUBSEG_MILLI},
    966   {"$BSS$", 1, 1, 0, 0, 0, 0, 1, 80, 0x1f, 1, 8, 1, 1, SUBSEG_BSS},
    967   {NULL, 0, 1, 0, 0, 0, 0, 0, 255, 0x1f, 0, 4, 0, 0, 0}
    968 };
    969 
    970 static struct default_space_dict pa_def_spaces[] =
    971 {
    972   {"$TEXT$", 0, 1, 1, 0, 8, ASEC_NULL},
    973   {"$PRIVATE$", 1, 1, 1, 1, 16, ASEC_NULL},
    974   {NULL, 0, 0, 0, 0, 0, ASEC_NULL}
    975 };
    976 
    977 /* Misc local definitions used by the assembler.  */
    978 
    979 /* These macros are used to maintain spaces/subspaces.  */
    980 #define SPACE_DEFINED(space_chain)	(space_chain)->sd_defined
    981 #define SPACE_USER_DEFINED(space_chain) (space_chain)->sd_user_defined
    982 #define SPACE_SPNUM(space_chain)	(space_chain)->sd_spnum
    983 #define SPACE_NAME(space_chain)		(space_chain)->sd_name
    984 
    985 #define SUBSPACE_DEFINED(ss_chain)	(ss_chain)->ssd_defined
    986 #define SUBSPACE_NAME(ss_chain)		(ss_chain)->ssd_name
    987 #endif
    988 
    989 /* Return nonzero if the string pointed to by S potentially represents
    990    a right or left half of a FP register  */
    991 #define IS_R_SELECT(S)   (*(S) == 'R' || *(S) == 'r')
    992 #define IS_L_SELECT(S)   (*(S) == 'L' || *(S) == 'l')
    993 
    994 /* Store immediate values of shift/deposit/extract functions.  */
    995 
    996 #define SAVE_IMMEDIATE(VALUE) \
    997   { \
    998     if (immediate_check) \
    999       { \
   1000 	if (pos == -1) \
   1001 	  pos = (VALUE); \
   1002 	else if (len == -1) \
   1003 	  len = (VALUE); \
   1004       } \
   1005   }
   1006 
   1007 /* Insert FIELD into OPCODE starting at bit START.  Continue pa_ip
   1008    main loop after insertion.  */
   1009 
   1010 #define INSERT_FIELD_AND_CONTINUE(OPCODE, FIELD, START) \
   1011   { \
   1012     ((OPCODE) |= (FIELD) << (START)); \
   1013     continue; \
   1014   }
   1015 
   1016 /* Simple range checking for FIELD against HIGH and LOW bounds.
   1017    IGNORE is used to suppress the error message.  */
   1018 
   1019 #define CHECK_FIELD(FIELD, HIGH, LOW, IGNORE) \
   1020   { \
   1021     if ((FIELD) > (HIGH) || (FIELD) < (LOW)) \
   1022       { \
   1023 	if (! IGNORE) \
   1024 	  as_bad (_("Field out of range [%d..%d] (%d)."), (LOW), (HIGH), \
   1025 		  (int) (FIELD));\
   1026 	break; \
   1027       } \
   1028   }
   1029 
   1030 /* Variant of CHECK_FIELD for use in md_apply_fix and other places where
   1031    the current file and line number are not valid.  */
   1032 
   1033 #define CHECK_FIELD_WHERE(FIELD, HIGH, LOW, FILENAME, LINE) \
   1034   { \
   1035     if ((FIELD) > (HIGH) || (FIELD) < (LOW)) \
   1036       { \
   1037 	as_bad_where ((FILENAME), (LINE), \
   1038 		      _("Field out of range [%d..%d] (%d)."), (LOW), (HIGH), \
   1039 		      (int) (FIELD));\
   1040 	break; \
   1041       } \
   1042   }
   1043 
   1044 /* Simple alignment checking for FIELD against ALIGN (a power of two).
   1045    IGNORE is used to suppress the error message.  */
   1046 
   1047 #define CHECK_ALIGN(FIELD, ALIGN, IGNORE) \
   1048   { \
   1049     if ((FIELD) & ((ALIGN) - 1)) \
   1050       { \
   1051 	if (! IGNORE) \
   1052 	  as_bad (_("Field not properly aligned [%d] (%d)."), (ALIGN), \
   1053 		  (int) (FIELD));\
   1054 	break; \
   1055       } \
   1056   }
   1057 
   1058 #define is_DP_relative(exp)			\
   1059   ((exp).X_op == O_subtract			\
   1060    && strcmp (S_GET_NAME ((exp).X_op_symbol), "$global$") == 0)
   1061 
   1062 #define is_SB_relative(exp)			\
   1063   ((exp).X_op == O_subtract			\
   1064    && strcmp (S_GET_NAME ((exp).X_op_symbol), "$segrel$") == 0)
   1065 
   1066 #define is_PC_relative(exp)			\
   1067   ((exp).X_op == O_subtract			\
   1068    && strcmp (S_GET_NAME ((exp).X_op_symbol), "$PIC_pcrel$0") == 0)
   1069 
   1070 #define is_tls_gdidx(exp)			\
   1071   ((exp).X_op == O_subtract			\
   1072    && strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_gdidx$") == 0)
   1073 
   1074 #define is_tls_ldidx(exp)			\
   1075   ((exp).X_op == O_subtract			\
   1076    && strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_ldidx$") == 0)
   1077 
   1078 #define is_tls_dtpoff(exp)			\
   1079   ((exp).X_op == O_subtract			\
   1080    && strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_dtpoff$") == 0)
   1081 
   1082 #define is_tls_ieoff(exp)			\
   1083   ((exp).X_op == O_subtract			\
   1084    && strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_ieoff$") == 0)
   1085 
   1086 #define is_tls_leoff(exp)			\
   1087   ((exp).X_op == O_subtract			\
   1088    && strcmp (S_GET_NAME ((exp).X_op_symbol), "$tls_leoff$") == 0)
   1089 
   1090 /* We need some complex handling for stabs (sym1 - sym2).  Luckily, we'll
   1091    always be able to reduce the expression to a constant, so we don't
   1092    need real complex handling yet.  */
   1093 #define is_complex(exp)				\
   1094   ((exp).X_op != O_constant && (exp).X_op != O_symbol)
   1095 
   1096 /* Actual functions to implement the PA specific code for the assembler.  */
   1097 
   1098 /* Called before writing the object file.  Make sure entry/exit and
   1099    proc/procend pairs match.  */
   1100 
   1101 void
   1102 pa_check_eof (void)
   1103 {
   1104   if (within_entry_exit)
   1105     as_fatal (_("Missing .exit\n"));
   1106 
   1107   if (within_procedure)
   1108     as_fatal (_("Missing .procend\n"));
   1109 }
   1110 
   1111 /* Returns a pointer to the label_symbol_struct for the current space.
   1112    or NULL if no label_symbol_struct exists for the current space.  */
   1113 
   1114 static label_symbol_struct *
   1115 pa_get_label (void)
   1116 {
   1117   label_symbol_struct *label_chain;
   1118 
   1119   for (label_chain = label_symbols_rootp;
   1120        label_chain;
   1121        label_chain = label_chain->lss_next)
   1122     {
   1123 #ifdef OBJ_SOM
   1124     if (current_space == label_chain->lss_space && label_chain->lss_label)
   1125       return label_chain;
   1126 #endif
   1127 #ifdef OBJ_ELF
   1128     if (now_seg == label_chain->lss_segment && label_chain->lss_label)
   1129       return label_chain;
   1130 #endif
   1131     }
   1132 
   1133   return NULL;
   1134 }
   1135 
   1136 /* Defines a label for the current space.  If one is already defined,
   1137    this function will replace it with the new label.  */
   1138 
   1139 void
   1140 pa_define_label (symbolS *symbol)
   1141 {
   1142   label_symbol_struct *label_chain = pa_get_label ();
   1143 
   1144   if (label_chain)
   1145     label_chain->lss_label = symbol;
   1146   else
   1147     {
   1148       /* Create a new label entry and add it to the head of the chain.  */
   1149       label_chain = xmalloc (sizeof (label_symbol_struct));
   1150       label_chain->lss_label = symbol;
   1151 #ifdef OBJ_SOM
   1152       label_chain->lss_space = current_space;
   1153 #endif
   1154 #ifdef OBJ_ELF
   1155       label_chain->lss_segment = now_seg;
   1156 #endif
   1157       label_chain->lss_next = NULL;
   1158 
   1159       if (label_symbols_rootp)
   1160 	label_chain->lss_next = label_symbols_rootp;
   1161 
   1162       label_symbols_rootp = label_chain;
   1163     }
   1164 
   1165 #ifdef OBJ_ELF
   1166   dwarf2_emit_label (symbol);
   1167 #endif
   1168 }
   1169 
   1170 /* Removes a label definition for the current space.
   1171    If there is no label_symbol_struct entry, then no action is taken.  */
   1172 
   1173 static void
   1174 pa_undefine_label (void)
   1175 {
   1176   label_symbol_struct *label_chain;
   1177   label_symbol_struct *prev_label_chain = NULL;
   1178 
   1179   for (label_chain = label_symbols_rootp;
   1180        label_chain;
   1181        label_chain = label_chain->lss_next)
   1182     {
   1183       if (1
   1184 #ifdef OBJ_SOM
   1185 	  && current_space == label_chain->lss_space && label_chain->lss_label
   1186 #endif
   1187 #ifdef OBJ_ELF
   1188 	  && now_seg == label_chain->lss_segment && label_chain->lss_label
   1189 #endif
   1190 	  )
   1191 	{
   1192 	  /* Remove the label from the chain and free its memory.  */
   1193 	  if (prev_label_chain)
   1194 	    prev_label_chain->lss_next = label_chain->lss_next;
   1195 	  else
   1196 	    label_symbols_rootp = label_chain->lss_next;
   1197 
   1198 	  free (label_chain);
   1199 	  break;
   1200 	}
   1201       prev_label_chain = label_chain;
   1202     }
   1203 }
   1204 
   1205 /* An HPPA-specific version of fix_new.  This is required because the HPPA
   1206    code needs to keep track of some extra stuff.  Each call to fix_new_hppa
   1207    results in the creation of an instance of an hppa_fix_struct.  An
   1208    hppa_fix_struct stores the extra information along with a pointer to the
   1209    original fixS.  This is attached to the original fixup via the
   1210    tc_fix_data field.  */
   1211 
   1212 static void
   1213 fix_new_hppa (fragS *frag,
   1214 	      int where,
   1215 	      int size,
   1216 	      symbolS *add_symbol,
   1217 	      offsetT offset,
   1218 	      expressionS *exp,
   1219 	      int pcrel,
   1220 	      bfd_reloc_code_real_type r_type,
   1221 	      enum hppa_reloc_field_selector_type_alt r_field,
   1222 	      int r_format,
   1223 	      unsigned int arg_reloc,
   1224 	      int unwind_bits ATTRIBUTE_UNUSED)
   1225 {
   1226   fixS *new_fix;
   1227   struct hppa_fix_struct *hppa_fix = obstack_alloc (&notes, sizeof (struct hppa_fix_struct));
   1228 
   1229   if (exp != NULL)
   1230     new_fix = fix_new_exp (frag, where, size, exp, pcrel, r_type);
   1231   else
   1232     new_fix = fix_new (frag, where, size, add_symbol, offset, pcrel, r_type);
   1233   new_fix->tc_fix_data = (void *) hppa_fix;
   1234   hppa_fix->fx_r_type = r_type;
   1235   hppa_fix->fx_r_field = r_field;
   1236   hppa_fix->fx_r_format = r_format;
   1237   hppa_fix->fx_arg_reloc = arg_reloc;
   1238   hppa_fix->segment = now_seg;
   1239 #ifdef OBJ_SOM
   1240   if (r_type == R_ENTRY || r_type == R_EXIT)
   1241     new_fix->fx_offset = unwind_bits;
   1242 #endif
   1243 
   1244   /* foo-$global$ is used to access non-automatic storage.  $global$
   1245      is really just a marker and has served its purpose, so eliminate
   1246      it now so as not to confuse write.c.  Ditto for $PIC_pcrel$0.  */
   1247   if (new_fix->fx_subsy
   1248       && (strcmp (S_GET_NAME (new_fix->fx_subsy), "$global$") == 0
   1249 	  || strcmp (S_GET_NAME (new_fix->fx_subsy), "$segrel$") == 0
   1250 	  || strcmp (S_GET_NAME (new_fix->fx_subsy), "$PIC_pcrel$0") == 0
   1251 	  || strcmp (S_GET_NAME (new_fix->fx_subsy), "$tls_gdidx$") == 0
   1252 	  || strcmp (S_GET_NAME (new_fix->fx_subsy), "$tls_ldidx$") == 0
   1253 	  || strcmp (S_GET_NAME (new_fix->fx_subsy), "$tls_dtpoff$") == 0
   1254 	  || strcmp (S_GET_NAME (new_fix->fx_subsy), "$tls_ieoff$") == 0
   1255 	  || strcmp (S_GET_NAME (new_fix->fx_subsy), "$tls_leoff$") == 0))
   1256     new_fix->fx_subsy = NULL;
   1257 }
   1258 
   1259 /* This fix_new is called by cons via TC_CONS_FIX_NEW.
   1260    hppa_field_selector is set by the parse_cons_expression_hppa.  */
   1261 
   1262 void
   1263 cons_fix_new_hppa (fragS *frag, int where, int size, expressionS *exp,
   1264 		   int hppa_field_selector)
   1265 {
   1266   unsigned int rel_type;
   1267 
   1268   /* Get a base relocation type.  */
   1269   if (is_DP_relative (*exp))
   1270     rel_type = R_HPPA_GOTOFF;
   1271   else if (is_PC_relative (*exp))
   1272     rel_type = R_HPPA_PCREL_CALL;
   1273 #ifdef OBJ_ELF
   1274   else if (is_SB_relative (*exp))
   1275     rel_type = R_PARISC_SEGREL32;
   1276   else if (is_tls_gdidx (*exp))
   1277     rel_type = R_PARISC_TLS_GD21L;
   1278   else if (is_tls_ldidx (*exp))
   1279     rel_type = R_PARISC_TLS_LDM21L;
   1280   else if (is_tls_dtpoff (*exp))
   1281     rel_type = R_PARISC_TLS_LDO21L;
   1282   else if (is_tls_ieoff (*exp))
   1283     rel_type = R_PARISC_TLS_IE21L;
   1284   else if (is_tls_leoff (*exp))
   1285     rel_type = R_PARISC_TLS_LE21L;
   1286 #endif
   1287   else if (is_complex (*exp))
   1288     rel_type = R_HPPA_COMPLEX;
   1289   else
   1290     rel_type = R_HPPA;
   1291 
   1292   if (hppa_field_selector != e_psel && hppa_field_selector != e_fsel)
   1293     {
   1294       as_warn (_("Invalid field selector.  Assuming F%%."));
   1295       hppa_field_selector = e_fsel;
   1296     }
   1297 
   1298   fix_new_hppa (frag, where, size,
   1299 		(symbolS *) NULL, (offsetT) 0, exp, 0, rel_type,
   1300 		hppa_field_selector, size * 8, 0, 0);
   1301 }
   1302 
   1303 /* Mark (via expr_end) the end of an expression (I think).  FIXME.  */
   1304 
   1305 static void
   1306 get_expression (char *str)
   1307 {
   1308   char *save_in;
   1309   asection *seg;
   1310 
   1311   save_in = input_line_pointer;
   1312   input_line_pointer = str;
   1313   seg = expression (&the_insn.exp);
   1314   if (!(seg == absolute_section
   1315 	|| seg == undefined_section
   1316 	|| SEG_NORMAL (seg)))
   1317     {
   1318       as_warn (_("Bad segment in expression."));
   1319       expr_end = input_line_pointer;
   1320       input_line_pointer = save_in;
   1321       return;
   1322     }
   1323   expr_end = input_line_pointer;
   1324   input_line_pointer = save_in;
   1325 }
   1326 
   1327 /* Parse a PA nullification completer (,n).  Return nonzero if the
   1328    completer was found; return zero if no completer was found.  */
   1329 
   1330 static int
   1331 pa_parse_nullif (char **s)
   1332 {
   1333   int nullif;
   1334 
   1335   nullif = 0;
   1336   if (**s == ',')
   1337     {
   1338       *s = *s + 1;
   1339       if (strncasecmp (*s, "n", 1) == 0)
   1340 	nullif = 1;
   1341       else
   1342 	{
   1343 	  as_bad (_("Invalid Nullification: (%c)"), **s);
   1344 	  nullif = 0;
   1345 	}
   1346       *s = *s + 1;
   1347     }
   1348 
   1349   return nullif;
   1350 }
   1351 
   1352 char *
   1353 md_atof (int type, char *litP, int *sizeP)
   1354 {
   1355   return ieee_md_atof (type, litP, sizeP, TRUE);
   1356 }
   1357 
   1358 /* Write out big-endian.  */
   1359 
   1360 void
   1361 md_number_to_chars (char *buf, valueT val, int n)
   1362 {
   1363   number_to_chars_bigendian (buf, val, n);
   1364 }
   1365 
   1366 /* Translate internal representation of relocation info to BFD target
   1367    format.  */
   1368 
   1369 arelent **
   1370 tc_gen_reloc (asection *section, fixS *fixp)
   1371 {
   1372   arelent *reloc;
   1373   struct hppa_fix_struct *hppa_fixp;
   1374   static arelent *no_relocs = NULL;
   1375   arelent **relocs;
   1376   reloc_type **codes;
   1377   reloc_type code;
   1378   int n_relocs;
   1379   int i;
   1380 
   1381   hppa_fixp = (struct hppa_fix_struct *) fixp->tc_fix_data;
   1382   if (fixp->fx_addsy == 0)
   1383     return &no_relocs;
   1384 
   1385   gas_assert (hppa_fixp != 0);
   1386   gas_assert (section != 0);
   1387 
   1388   reloc = xmalloc (sizeof (arelent));
   1389 
   1390   reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
   1391   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
   1392 
   1393   /* Allow fixup_segment to recognize hand-written pc-relative relocations.
   1394      When we went through cons_fix_new_hppa, we classified them as complex.  */
   1395   /* ??? It might be better to hide this +8 stuff in tc_cfi_emit_pcrel_expr,
   1396      undefine DIFF_EXPR_OK, and let these sorts of complex expressions fail
   1397      when R_HPPA_COMPLEX == R_PARISC_UNIMPLEMENTED.  */
   1398   if (fixp->fx_r_type == (bfd_reloc_code_real_type) R_HPPA_COMPLEX
   1399       && fixp->fx_pcrel)
   1400     {
   1401       fixp->fx_r_type = R_HPPA_PCREL_CALL;
   1402       fixp->fx_offset += 8;
   1403     }
   1404 
   1405   codes = hppa_gen_reloc_type (stdoutput,
   1406 			       fixp->fx_r_type,
   1407 			       hppa_fixp->fx_r_format,
   1408 			       hppa_fixp->fx_r_field,
   1409 			       fixp->fx_subsy != NULL,
   1410 			       symbol_get_bfdsym (fixp->fx_addsy));
   1411 
   1412   if (codes == NULL)
   1413     {
   1414       as_bad_where (fixp->fx_file, fixp->fx_line, _("Cannot handle fixup"));
   1415       abort ();
   1416     }
   1417 
   1418   for (n_relocs = 0; codes[n_relocs]; n_relocs++)
   1419     ;
   1420 
   1421   relocs = xmalloc (sizeof (arelent *) * n_relocs + 1);
   1422   reloc = xmalloc (sizeof (arelent) * n_relocs);
   1423   for (i = 0; i < n_relocs; i++)
   1424     relocs[i] = &reloc[i];
   1425 
   1426   relocs[n_relocs] = NULL;
   1427 
   1428 #ifdef OBJ_ELF
   1429   switch (fixp->fx_r_type)
   1430     {
   1431     default:
   1432       gas_assert (n_relocs == 1);
   1433 
   1434       code = *codes[0];
   1435 
   1436       /* Now, do any processing that is dependent on the relocation type.  */
   1437       switch (code)
   1438 	{
   1439 	case R_PARISC_DLTREL21L:
   1440 	case R_PARISC_DLTREL14R:
   1441 	case R_PARISC_DLTREL14F:
   1442 	case R_PARISC_PLABEL32:
   1443 	case R_PARISC_PLABEL21L:
   1444 	case R_PARISC_PLABEL14R:
   1445 	  /* For plabel relocations, the addend of the
   1446 	     relocation should be either 0 (no static link) or 2
   1447 	     (static link required).  This adjustment is done in
   1448 	     bfd/elf32-hppa.c:elf32_hppa_relocate_section.
   1449 
   1450 	     We also slam a zero addend into the DLT relative relocs;
   1451 	     it doesn't make a lot of sense to use any addend since
   1452 	     it gets you a different (eg unknown) DLT entry.  */
   1453 	  reloc->addend = 0;
   1454 	  break;
   1455 
   1456 #ifdef ELF_ARG_RELOC
   1457 	case R_PARISC_PCREL17R:
   1458 	case R_PARISC_PCREL17F:
   1459 	case R_PARISC_PCREL17C:
   1460 	case R_PARISC_DIR17R:
   1461 	case R_PARISC_DIR17F:
   1462 	case R_PARISC_PCREL21L:
   1463 	case R_PARISC_DIR21L:
   1464 	  reloc->addend = HPPA_R_ADDEND (hppa_fixp->fx_arg_reloc,
   1465 					 fixp->fx_offset);
   1466 	  break;
   1467 #endif
   1468 
   1469 	case R_PARISC_DIR32:
   1470 	  /* Facilitate hand-crafted unwind info.  */
   1471 	  if (strcmp (section->name, UNWIND_SECTION_NAME) == 0)
   1472 	    code = R_PARISC_SEGREL32;
   1473 	  /* Fall thru */
   1474 
   1475 	default:
   1476 	  reloc->addend = fixp->fx_offset;
   1477 	  break;
   1478 	}
   1479 
   1480       reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
   1481       *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
   1482       reloc->howto = bfd_reloc_type_lookup (stdoutput,
   1483 					    (bfd_reloc_code_real_type) code);
   1484       reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
   1485 
   1486       gas_assert (reloc->howto && (unsigned int) code == reloc->howto->type);
   1487       break;
   1488     }
   1489 #else /* OBJ_SOM */
   1490 
   1491   /* Walk over reach relocation returned by the BFD backend.  */
   1492   for (i = 0; i < n_relocs; i++)
   1493     {
   1494       code = *codes[i];
   1495 
   1496       relocs[i]->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
   1497       *relocs[i]->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
   1498       relocs[i]->howto =
   1499 	bfd_reloc_type_lookup (stdoutput,
   1500 			       (bfd_reloc_code_real_type) code);
   1501       relocs[i]->address = fixp->fx_frag->fr_address + fixp->fx_where;
   1502 
   1503       switch (code)
   1504 	{
   1505 	case R_COMP2:
   1506 	  /* The only time we ever use a R_COMP2 fixup is for the difference
   1507 	     of two symbols.  With that in mind we fill in all four
   1508 	     relocs now and break out of the loop.  */
   1509 	  gas_assert (i == 1);
   1510 	  relocs[0]->sym_ptr_ptr
   1511 	    = (asymbol **) bfd_abs_section_ptr->symbol_ptr_ptr;
   1512 	  relocs[0]->howto
   1513 	    = bfd_reloc_type_lookup (stdoutput,
   1514 				     (bfd_reloc_code_real_type) *codes[0]);
   1515 	  relocs[0]->address = fixp->fx_frag->fr_address + fixp->fx_where;
   1516 	  relocs[0]->addend = 0;
   1517 	  relocs[1]->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
   1518 	  *relocs[1]->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
   1519 	  relocs[1]->howto
   1520 	    = bfd_reloc_type_lookup (stdoutput,
   1521 				     (bfd_reloc_code_real_type) *codes[1]);
   1522 	  relocs[1]->address = fixp->fx_frag->fr_address + fixp->fx_where;
   1523 	  relocs[1]->addend = 0;
   1524 	  relocs[2]->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
   1525 	  *relocs[2]->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_subsy);
   1526 	  relocs[2]->howto
   1527 	    = bfd_reloc_type_lookup (stdoutput,
   1528 				     (bfd_reloc_code_real_type) *codes[2]);
   1529 	  relocs[2]->address = fixp->fx_frag->fr_address + fixp->fx_where;
   1530 	  relocs[2]->addend = 0;
   1531 	  relocs[3]->sym_ptr_ptr
   1532 	    = (asymbol **) bfd_abs_section_ptr->symbol_ptr_ptr;
   1533 	  relocs[3]->howto
   1534 	    = bfd_reloc_type_lookup (stdoutput,
   1535 				     (bfd_reloc_code_real_type) *codes[3]);
   1536 	  relocs[3]->address = fixp->fx_frag->fr_address + fixp->fx_where;
   1537 	  relocs[3]->addend = 0;
   1538 	  relocs[4]->sym_ptr_ptr
   1539 	    = (asymbol **) bfd_abs_section_ptr->symbol_ptr_ptr;
   1540 	  relocs[4]->howto
   1541 	    = bfd_reloc_type_lookup (stdoutput,
   1542 				     (bfd_reloc_code_real_type) *codes[4]);
   1543 	  relocs[4]->address = fixp->fx_frag->fr_address + fixp->fx_where;
   1544 	  relocs[4]->addend = 0;
   1545 	  goto done;
   1546 	case R_PCREL_CALL:
   1547 	case R_ABS_CALL:
   1548 	  relocs[i]->addend = HPPA_R_ADDEND (hppa_fixp->fx_arg_reloc, 0);
   1549 	  break;
   1550 
   1551 	case R_DLT_REL:
   1552 	case R_DATA_PLABEL:
   1553 	case R_CODE_PLABEL:
   1554 	  /* For plabel relocations, the addend of the
   1555 	     relocation should be either 0 (no static link) or 2
   1556 	     (static link required).
   1557 
   1558 	     FIXME: We always assume no static link!
   1559 
   1560 	     We also slam a zero addend into the DLT relative relocs;
   1561 	     it doesn't make a lot of sense to use any addend since
   1562 	     it gets you a different (eg unknown) DLT entry.  */
   1563 	  relocs[i]->addend = 0;
   1564 	  break;
   1565 
   1566 	case R_N_MODE:
   1567 	case R_S_MODE:
   1568 	case R_D_MODE:
   1569 	case R_R_MODE:
   1570 	case R_FSEL:
   1571 	case R_LSEL:
   1572 	case R_RSEL:
   1573 	case R_BEGIN_BRTAB:
   1574 	case R_END_BRTAB:
   1575 	case R_BEGIN_TRY:
   1576 	case R_N0SEL:
   1577 	case R_N1SEL:
   1578 	  /* There is no symbol or addend associated with these fixups.  */
   1579 	  relocs[i]->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
   1580 	  *relocs[i]->sym_ptr_ptr = symbol_get_bfdsym (dummy_symbol);
   1581 	  relocs[i]->addend = 0;
   1582 	  break;
   1583 
   1584 	case R_END_TRY:
   1585 	case R_ENTRY:
   1586 	case R_EXIT:
   1587 	  /* There is no symbol associated with these fixups.  */
   1588 	  relocs[i]->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
   1589 	  *relocs[i]->sym_ptr_ptr = symbol_get_bfdsym (dummy_symbol);
   1590 	  relocs[i]->addend = fixp->fx_offset;
   1591 	  break;
   1592 
   1593 	default:
   1594 	  relocs[i]->addend = fixp->fx_offset;
   1595 	}
   1596     }
   1597 
   1598  done:
   1599 #endif
   1600 
   1601   return relocs;
   1602 }
   1603 
   1604 /* Process any machine dependent frag types.  */
   1605 
   1606 void
   1607 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
   1608 		 asection *sec ATTRIBUTE_UNUSED,
   1609 		 fragS *fragP)
   1610 {
   1611   unsigned int address;
   1612 
   1613   if (fragP->fr_type == rs_machine_dependent)
   1614     {
   1615       switch ((int) fragP->fr_subtype)
   1616 	{
   1617 	case 0:
   1618 	  fragP->fr_type = rs_fill;
   1619 	  know (fragP->fr_var == 1);
   1620 	  know (fragP->fr_next);
   1621 	  address = fragP->fr_address + fragP->fr_fix;
   1622 	  if (address % fragP->fr_offset)
   1623 	    {
   1624 	      fragP->fr_offset =
   1625 		fragP->fr_next->fr_address
   1626 		- fragP->fr_address
   1627 		- fragP->fr_fix;
   1628 	    }
   1629 	  else
   1630 	    fragP->fr_offset = 0;
   1631 	  break;
   1632 	}
   1633     }
   1634 }
   1635 
   1636 /* Round up a section size to the appropriate boundary.  */
   1637 
   1638 valueT
   1639 md_section_align (asection *segment, valueT size)
   1640 {
   1641   int align = bfd_get_section_alignment (stdoutput, segment);
   1642   int align2 = (1 << align) - 1;
   1643 
   1644   return (size + align2) & ~align2;
   1645 }
   1646 
   1647 /* Return the approximate size of a frag before relaxation has occurred.  */
   1648 
   1649 int
   1650 md_estimate_size_before_relax (fragS *fragP, asection *segment ATTRIBUTE_UNUSED)
   1651 {
   1652   int size;
   1653 
   1654   size = 0;
   1655 
   1656   while ((fragP->fr_fix + size) % fragP->fr_offset)
   1657     size++;
   1658 
   1659   return size;
   1660 }
   1661 
   1662 #ifdef OBJ_ELF
   1664 # ifdef WARN_COMMENTS
   1665 const char *md_shortopts = "Vc";
   1666 # else
   1667 const char *md_shortopts = "V";
   1668 # endif
   1669 #else
   1670 # ifdef WARN_COMMENTS
   1671 const char *md_shortopts = "c";
   1672 # else
   1673 const char *md_shortopts = "";
   1674 # endif
   1675 #endif
   1676 
   1677 struct option md_longopts[] =
   1678 {
   1679 #ifdef WARN_COMMENTS
   1680   {"warn-comment", no_argument, NULL, 'c'},
   1681 #endif
   1682   {NULL, no_argument, NULL, 0}
   1683 };
   1684 size_t md_longopts_size = sizeof (md_longopts);
   1685 
   1686 int
   1687 md_parse_option (int c, char *arg ATTRIBUTE_UNUSED)
   1688 {
   1689   switch (c)
   1690     {
   1691     default:
   1692       return 0;
   1693 
   1694 #ifdef OBJ_ELF
   1695     case 'V':
   1696       print_version_id ();
   1697       break;
   1698 #endif
   1699 #ifdef WARN_COMMENTS
   1700     case 'c':
   1701       warn_comment = 1;
   1702       break;
   1703 #endif
   1704     }
   1705 
   1706   return 1;
   1707 }
   1708 
   1709 void
   1710 md_show_usage (FILE *stream ATTRIBUTE_UNUSED)
   1711 {
   1712 #ifdef OBJ_ELF
   1713   fprintf (stream, _("\
   1714   -Q                      ignored\n"));
   1715 #endif
   1716 #ifdef WARN_COMMENTS
   1717   fprintf (stream, _("\
   1718   -c                      print a warning if a comment is found\n"));
   1719 #endif
   1720 }
   1721 
   1722 /* We have no need to default values of symbols.  */
   1724 
   1725 symbolS *
   1726 md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
   1727 {
   1728   return NULL;
   1729 }
   1730 
   1731 #if defined (OBJ_SOM) || defined (ELF_ARG_RELOC)
   1732 #define nonzero_dibits(x) \
   1733   ((x) | (((x) & 0x55555555) << 1) | (((x) & 0xAAAAAAAA) >> 1))
   1734 #define arg_reloc_stub_needed(CALLER, CALLEE) \
   1735   (((CALLER) ^ (CALLEE)) & nonzero_dibits (CALLER) & nonzero_dibits (CALLEE))
   1736 #else
   1737 #define arg_reloc_stub_needed(CALLER, CALLEE) 0
   1738 #endif
   1739 
   1740 /* Apply a fixup to an instruction.  */
   1741 
   1742 void
   1743 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
   1744 {
   1745   char *fixpos;
   1746   struct hppa_fix_struct *hppa_fixP;
   1747   offsetT new_val;
   1748   int insn, val, fmt;
   1749 
   1750   /* SOM uses R_HPPA_ENTRY and R_HPPA_EXIT relocations which can
   1751      never be "applied" (they are just markers).  Likewise for
   1752      R_HPPA_BEGIN_BRTAB and R_HPPA_END_BRTAB.  */
   1753 #ifdef OBJ_SOM
   1754   if (fixP->fx_r_type == R_HPPA_ENTRY
   1755       || fixP->fx_r_type == R_HPPA_EXIT
   1756       || fixP->fx_r_type == R_HPPA_BEGIN_BRTAB
   1757       || fixP->fx_r_type == R_HPPA_END_BRTAB
   1758       || fixP->fx_r_type == R_HPPA_BEGIN_TRY)
   1759     return;
   1760 
   1761   /* Disgusting.  We must set fx_offset ourselves -- R_HPPA_END_TRY
   1762      fixups are considered not adjustable, which in turn causes
   1763      adjust_reloc_syms to not set fx_offset.  Ugh.  */
   1764   if (fixP->fx_r_type == R_HPPA_END_TRY)
   1765     {
   1766       fixP->fx_offset = * valP;
   1767       return;
   1768     }
   1769 #endif
   1770 #ifdef OBJ_ELF
   1771   if (fixP->fx_r_type == (int) R_PARISC_GNU_VTENTRY
   1772       || fixP->fx_r_type == (int) R_PARISC_GNU_VTINHERIT)
   1773     return;
   1774 #endif
   1775 
   1776   if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
   1777     fixP->fx_done = 1;
   1778 
   1779   /* There should be a HPPA specific fixup associated with the GAS fixup.  */
   1780   hppa_fixP = (struct hppa_fix_struct *) fixP->tc_fix_data;
   1781   if (hppa_fixP == NULL)
   1782     {
   1783       as_bad_where (fixP->fx_file, fixP->fx_line,
   1784 		    _("no hppa_fixup entry for fixup type 0x%x"),
   1785 		    fixP->fx_r_type);
   1786       return;
   1787     }
   1788 
   1789   fixpos = fixP->fx_frag->fr_literal + fixP->fx_where;
   1790 
   1791   if (fixP->fx_size != 4 || hppa_fixP->fx_r_format == 32)
   1792     {
   1793       /* Handle constant output. */
   1794       number_to_chars_bigendian (fixpos, *valP, fixP->fx_size);
   1795       return;
   1796     }
   1797 
   1798   insn = bfd_get_32 (stdoutput, fixpos);
   1799   fmt = bfd_hppa_insn2fmt (stdoutput, insn);
   1800 
   1801   /* If there is a symbol associated with this fixup, then it's something
   1802      which will need a SOM relocation (except for some PC-relative relocs).
   1803      In such cases we should treat the "val" or "addend" as zero since it
   1804      will be added in as needed from fx_offset in tc_gen_reloc.  */
   1805   if ((fixP->fx_addsy != NULL
   1806        || fixP->fx_r_type == (int) R_HPPA_NONE)
   1807 #ifdef OBJ_SOM
   1808       && fmt != 32
   1809 #endif
   1810       )
   1811     new_val = ((fmt == 12 || fmt == 17 || fmt == 22) ? 8 : 0);
   1812 #ifdef OBJ_SOM
   1813   /* These field selectors imply that we do not want an addend.  */
   1814   else if (hppa_fixP->fx_r_field == e_psel
   1815 	   || hppa_fixP->fx_r_field == e_rpsel
   1816 	   || hppa_fixP->fx_r_field == e_lpsel
   1817 	   || hppa_fixP->fx_r_field == e_tsel
   1818 	   || hppa_fixP->fx_r_field == e_rtsel
   1819 	   || hppa_fixP->fx_r_field == e_ltsel)
   1820     new_val = ((fmt == 12 || fmt == 17 || fmt == 22) ? 8 : 0);
   1821 #endif
   1822   else
   1823     new_val = hppa_field_adjust (* valP, 0, hppa_fixP->fx_r_field);
   1824 
   1825   /* Handle pc-relative exceptions from above.  */
   1826   if ((fmt == 12 || fmt == 17 || fmt == 22)
   1827       && fixP->fx_addsy
   1828       && fixP->fx_pcrel
   1829       && !arg_reloc_stub_needed (symbol_arg_reloc_info (fixP->fx_addsy),
   1830 				 hppa_fixP->fx_arg_reloc)
   1831 #ifdef OBJ_ELF
   1832       && (* valP - 8 + 8192 < 16384
   1833 	  || (fmt == 17 && * valP - 8 + 262144 < 524288)
   1834 	  || (fmt == 22 && * valP - 8 + 8388608 < 16777216))
   1835 #endif
   1836 #ifdef OBJ_SOM
   1837       && (* valP - 8 + 262144 < 524288
   1838 	  || (fmt == 22 && * valP - 8 + 8388608 < 16777216))
   1839 #endif
   1840       && !S_IS_EXTERNAL (fixP->fx_addsy)
   1841       && !S_IS_WEAK (fixP->fx_addsy)
   1842       && S_GET_SEGMENT (fixP->fx_addsy) == hppa_fixP->segment
   1843       && !(fixP->fx_subsy
   1844 	   && S_GET_SEGMENT (fixP->fx_subsy) != hppa_fixP->segment))
   1845     {
   1846       new_val = hppa_field_adjust (* valP, 0, hppa_fixP->fx_r_field);
   1847     }
   1848 
   1849   switch (fmt)
   1850     {
   1851     case 10:
   1852       CHECK_FIELD_WHERE (new_val, 8191, -8192,
   1853 			 fixP->fx_file, fixP->fx_line);
   1854       val = new_val;
   1855 
   1856       insn = (insn & ~ 0x3ff1) | (((val & 0x1ff8) << 1)
   1857 				  | ((val & 0x2000) >> 13));
   1858       break;
   1859     case -11:
   1860       CHECK_FIELD_WHERE (new_val, 8191, -8192,
   1861 			 fixP->fx_file, fixP->fx_line);
   1862       val = new_val;
   1863 
   1864       insn = (insn & ~ 0x3ff9) | (((val & 0x1ffc) << 1)
   1865 				  | ((val & 0x2000) >> 13));
   1866       break;
   1867       /* Handle all opcodes with the 'j' operand type.  */
   1868     case 14:
   1869       CHECK_FIELD_WHERE (new_val, 8191, -8192,
   1870 			 fixP->fx_file, fixP->fx_line);
   1871       val = new_val;
   1872 
   1873       insn = ((insn & ~ 0x3fff) | low_sign_unext (val, 14));
   1874       break;
   1875 
   1876       /* Handle all opcodes with the 'k' operand type.  */
   1877     case 21:
   1878       CHECK_FIELD_WHERE (new_val, 1048575, -1048576,
   1879 			 fixP->fx_file, fixP->fx_line);
   1880       val = new_val;
   1881 
   1882       insn = (insn & ~ 0x1fffff) | re_assemble_21 (val);
   1883       break;
   1884 
   1885       /* Handle all the opcodes with the 'i' operand type.  */
   1886     case 11:
   1887       CHECK_FIELD_WHERE (new_val, 1023, -1024,
   1888 			 fixP->fx_file, fixP->fx_line);
   1889       val = new_val;
   1890 
   1891       insn = (insn & ~ 0x7ff) | low_sign_unext (val, 11);
   1892       break;
   1893 
   1894       /* Handle all the opcodes with the 'w' operand type.  */
   1895     case 12:
   1896       CHECK_FIELD_WHERE (new_val - 8, 8191, -8192,
   1897 			 fixP->fx_file, fixP->fx_line);
   1898       val = new_val - 8;
   1899 
   1900       insn = (insn & ~ 0x1ffd) | re_assemble_12 (val >> 2);
   1901       break;
   1902 
   1903       /* Handle some of the opcodes with the 'W' operand type.  */
   1904     case 17:
   1905       {
   1906 	offsetT distance = * valP;
   1907 
   1908 	/* If this is an absolute branch (ie no link) with an out of
   1909 	   range target, then we want to complain.  */
   1910 	if (fixP->fx_r_type == (int) R_HPPA_PCREL_CALL
   1911 	    && (insn & 0xffe00000) == 0xe8000000)
   1912 	  CHECK_FIELD_WHERE (distance - 8, 262143, -262144,
   1913 			     fixP->fx_file, fixP->fx_line);
   1914 
   1915 	CHECK_FIELD_WHERE (new_val - 8, 262143, -262144,
   1916 			   fixP->fx_file, fixP->fx_line);
   1917 	val = new_val - 8;
   1918 
   1919 	insn = (insn & ~ 0x1f1ffd) | re_assemble_17 (val >> 2);
   1920 	break;
   1921       }
   1922 
   1923     case 22:
   1924       {
   1925 	offsetT distance = * valP;
   1926 
   1927 	/* If this is an absolute branch (ie no link) with an out of
   1928 	   range target, then we want to complain.  */
   1929 	if (fixP->fx_r_type == (int) R_HPPA_PCREL_CALL
   1930 	    && (insn & 0xffe00000) == 0xe8000000)
   1931 	  CHECK_FIELD_WHERE (distance - 8, 8388607, -8388608,
   1932 			     fixP->fx_file, fixP->fx_line);
   1933 
   1934 	CHECK_FIELD_WHERE (new_val - 8, 8388607, -8388608,
   1935 			   fixP->fx_file, fixP->fx_line);
   1936 	val = new_val - 8;
   1937 
   1938 	insn = (insn & ~ 0x3ff1ffd) | re_assemble_22 (val >> 2);
   1939 	break;
   1940       }
   1941 
   1942     case -10:
   1943       val = new_val;
   1944       insn = (insn & ~ 0xfff1) | re_assemble_16 (val & -8);
   1945       break;
   1946 
   1947     case -16:
   1948       val = new_val;
   1949       insn = (insn & ~ 0xfff9) | re_assemble_16 (val & -4);
   1950       break;
   1951 
   1952     case 16:
   1953       val = new_val;
   1954       insn = (insn & ~ 0xffff) | re_assemble_16 (val);
   1955       break;
   1956 
   1957     case 32:
   1958       insn = new_val;
   1959       break;
   1960 
   1961     default:
   1962       as_bad_where (fixP->fx_file, fixP->fx_line,
   1963 		    _("Unknown relocation encountered in md_apply_fix."));
   1964       return;
   1965     }
   1966 
   1967 #ifdef OBJ_ELF
   1968   switch (fixP->fx_r_type)
   1969     {
   1970       case R_PARISC_TLS_GD21L:
   1971       case R_PARISC_TLS_GD14R:
   1972       case R_PARISC_TLS_LDM21L:
   1973       case R_PARISC_TLS_LDM14R:
   1974       case R_PARISC_TLS_LE21L:
   1975       case R_PARISC_TLS_LE14R:
   1976       case R_PARISC_TLS_IE21L:
   1977       case R_PARISC_TLS_IE14R:
   1978 	if (fixP->fx_addsy)
   1979 	  S_SET_THREAD_LOCAL (fixP->fx_addsy);
   1980 	break;
   1981       default:
   1982 	break;
   1983     }
   1984 #endif
   1985 
   1986   /* Insert the relocation.  */
   1987   bfd_put_32 (stdoutput, insn, fixpos);
   1988 }
   1989 
   1990 /* Exactly what point is a PC-relative offset relative TO?
   1991    On the PA, they're relative to the address of the offset.  */
   1992 
   1993 long
   1994 md_pcrel_from (fixS *fixP)
   1995 {
   1996   return fixP->fx_where + fixP->fx_frag->fr_address;
   1997 }
   1998 
   1999 /* Return nonzero if the input line pointer is at the end of
   2000    a statement.  */
   2001 
   2002 static int
   2003 is_end_of_statement (void)
   2004 {
   2005   return ((*input_line_pointer == '\n')
   2006 	  || (*input_line_pointer == ';')
   2007 	  || (*input_line_pointer == '!'));
   2008 }
   2009 
   2010 #define REG_NAME_CNT	(sizeof (pre_defined_registers) / sizeof (struct pd_reg))
   2011 
   2012 /* Given NAME, find the register number associated with that name, return
   2013    the integer value associated with the given name or -1 on failure.  */
   2014 
   2015 static int
   2016 reg_name_search (char *name)
   2017 {
   2018   int middle, low, high;
   2019   int cmp;
   2020 
   2021   low = 0;
   2022   high = REG_NAME_CNT - 1;
   2023 
   2024   do
   2025     {
   2026       middle = (low + high) / 2;
   2027       cmp = strcasecmp (name, pre_defined_registers[middle].name);
   2028       if (cmp < 0)
   2029 	high = middle - 1;
   2030       else if (cmp > 0)
   2031 	low = middle + 1;
   2032       else
   2033 	return pre_defined_registers[middle].value;
   2034     }
   2035   while (low <= high);
   2036 
   2037   return -1;
   2038 }
   2039 
   2040 /* Read a number from S.  The number might come in one of many forms,
   2041    the most common will be a hex or decimal constant, but it could be
   2042    a pre-defined register (Yuk!), or an absolute symbol.
   2043 
   2044    Return 1 on success or 0 on failure.  If STRICT, then a missing
   2045    register prefix will cause a failure.  The number itself is
   2046    returned in `pa_number'.
   2047 
   2048    IS_FLOAT indicates that a PA-89 FP register number should be
   2049    parsed;  A `l' or `r' suffix is checked for if but 2 of IS_FLOAT is
   2050    not set.
   2051 
   2052    pa_parse_number can not handle negative constants and will fail
   2053    horribly if it is passed such a constant.  */
   2054 
   2055 static int
   2056 pa_parse_number (char **s, int is_float)
   2057 {
   2058   int num;
   2059   char *name;
   2060   char c;
   2061   symbolS *sym;
   2062   int status;
   2063   char *p = *s;
   2064   bfd_boolean have_prefix;
   2065 
   2066   /* Skip whitespace before the number.  */
   2067   while (*p == ' ' || *p == '\t')
   2068     p = p + 1;
   2069 
   2070   pa_number = -1;
   2071   have_prefix = 0;
   2072   num = 0;
   2073   if (!strict && ISDIGIT (*p))
   2074     {
   2075       /* Looks like a number.  */
   2076 
   2077       if (*p == '0' && (*(p + 1) == 'x' || *(p + 1) == 'X'))
   2078 	{
   2079 	  /* The number is specified in hex.  */
   2080 	  p += 2;
   2081 	  while (ISDIGIT (*p) || ((*p >= 'a') && (*p <= 'f'))
   2082 		 || ((*p >= 'A') && (*p <= 'F')))
   2083 	    {
   2084 	      if (ISDIGIT (*p))
   2085 		num = num * 16 + *p - '0';
   2086 	      else if (*p >= 'a' && *p <= 'f')
   2087 		num = num * 16 + *p - 'a' + 10;
   2088 	      else
   2089 		num = num * 16 + *p - 'A' + 10;
   2090 	      ++p;
   2091 	    }
   2092 	}
   2093       else
   2094 	{
   2095 	  /* The number is specified in decimal.  */
   2096 	  while (ISDIGIT (*p))
   2097 	    {
   2098 	      num = num * 10 + *p - '0';
   2099 	      ++p;
   2100 	    }
   2101 	}
   2102 
   2103       pa_number = num;
   2104 
   2105       /* Check for a `l' or `r' suffix.  */
   2106       if (is_float)
   2107 	{
   2108 	  pa_number += FP_REG_BASE;
   2109 	  if (! (is_float & 2))
   2110 	    {
   2111 	      if (IS_R_SELECT (p))
   2112 		{
   2113 		  pa_number += FP_REG_RSEL;
   2114 		  ++p;
   2115 		}
   2116 	      else if (IS_L_SELECT (p))
   2117 		{
   2118 		  ++p;
   2119 		}
   2120 	    }
   2121 	}
   2122     }
   2123   else if (*p == '%')
   2124     {
   2125       /* The number might be a predefined register.  */
   2126       have_prefix = 1;
   2127       name = p;
   2128       p++;
   2129       c = *p;
   2130       /* Tege hack: Special case for general registers as the general
   2131 	 code makes a binary search with case translation, and is VERY
   2132 	 slow.  */
   2133       if (c == 'r')
   2134 	{
   2135 	  p++;
   2136 	  if (*p == 'e' && *(p + 1) == 't'
   2137 	      && (*(p + 2) == '0' || *(p + 2) == '1'))
   2138 	    {
   2139 	      p += 2;
   2140 	      num = *p - '0' + 28;
   2141 	      p++;
   2142 	    }
   2143 	  else if (*p == 'p')
   2144 	    {
   2145 	      num = 2;
   2146 	      p++;
   2147 	    }
   2148 	  else if (!ISDIGIT (*p))
   2149 	    {
   2150 	      if (print_errors)
   2151 		as_bad (_("Undefined register: '%s'."), name);
   2152 	      num = -1;
   2153 	    }
   2154 	  else
   2155 	    {
   2156 	      do
   2157 		num = num * 10 + *p++ - '0';
   2158 	      while (ISDIGIT (*p));
   2159 	    }
   2160 	}
   2161       else
   2162 	{
   2163 	  /* Do a normal register search.  */
   2164 	  while (is_part_of_name (c))
   2165 	    {
   2166 	      p = p + 1;
   2167 	      c = *p;
   2168 	    }
   2169 	  *p = 0;
   2170 	  status = reg_name_search (name);
   2171 	  if (status >= 0)
   2172 	    num = status;
   2173 	  else
   2174 	    {
   2175 	      if (print_errors)
   2176 		as_bad (_("Undefined register: '%s'."), name);
   2177 	      num = -1;
   2178 	    }
   2179 	  *p = c;
   2180 	}
   2181 
   2182       pa_number = num;
   2183     }
   2184   else
   2185     {
   2186       /* And finally, it could be a symbol in the absolute section which
   2187 	 is effectively a constant, or a register alias symbol.  */
   2188       name = p;
   2189       c = *p;
   2190       while (is_part_of_name (c))
   2191 	{
   2192 	  p = p + 1;
   2193 	  c = *p;
   2194 	}
   2195       *p = 0;
   2196       if ((sym = symbol_find (name)) != NULL)
   2197 	{
   2198 	  if (S_GET_SEGMENT (sym) == reg_section)
   2199 	    {
   2200 	      num = S_GET_VALUE (sym);
   2201 	      /* Well, we don't really have one, but we do have a
   2202 		 register, so...  */
   2203 	      have_prefix = TRUE;
   2204 	    }
   2205 	  else if (S_GET_SEGMENT (sym) == bfd_abs_section_ptr)
   2206 	    num = S_GET_VALUE (sym);
   2207 	  else if (!strict)
   2208 	    {
   2209 	      if (print_errors)
   2210 		as_bad (_("Non-absolute symbol: '%s'."), name);
   2211 	      num = -1;
   2212 	    }
   2213 	}
   2214       else if (!strict)
   2215 	{
   2216 	  /* There is where we'd come for an undefined symbol
   2217 	     or for an empty string.  For an empty string we
   2218 	     will return zero.  That's a concession made for
   2219 	     compatibility with the braindamaged HP assemblers.  */
   2220 	  if (*name == 0)
   2221 	    num = 0;
   2222 	  else
   2223 	    {
   2224 	      if (print_errors)
   2225 		as_bad (_("Undefined absolute constant: '%s'."), name);
   2226 	      num = -1;
   2227 	    }
   2228 	}
   2229       *p = c;
   2230 
   2231       pa_number = num;
   2232     }
   2233 
   2234   if (!strict || have_prefix)
   2235     {
   2236       *s = p;
   2237       return 1;
   2238     }
   2239   return 0;
   2240 }
   2241 
   2242 /* Return nonzero if the given INSN and L/R information will require
   2243    a new PA-1.1 opcode.  */
   2244 
   2245 static int
   2246 need_pa11_opcode (void)
   2247 {
   2248   if ((pa_number & FP_REG_RSEL) != 0
   2249       && !(the_insn.fpof1 == DBL && the_insn.fpof2 == DBL))
   2250     {
   2251       /* If this instruction is specific to a particular architecture,
   2252 	 then set a new architecture.  */
   2253       if (bfd_get_mach (stdoutput) < pa11)
   2254 	{
   2255 	  if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, pa11))
   2256 	    as_warn (_("could not update architecture and machine"));
   2257 	}
   2258       return TRUE;
   2259     }
   2260   else
   2261     return FALSE;
   2262 }
   2263 
   2264 /* Parse a condition for a fcmp instruction.  Return the numerical
   2265    code associated with the condition.  */
   2266 
   2267 static int
   2268 pa_parse_fp_cmp_cond (char **s)
   2269 {
   2270   int cond, i;
   2271 
   2272   cond = 0;
   2273 
   2274   for (i = 0; i < 32; i++)
   2275     {
   2276       if (strncasecmp (*s, fp_cond_map[i].string,
   2277 		       strlen (fp_cond_map[i].string)) == 0)
   2278 	{
   2279 	  cond = fp_cond_map[i].cond;
   2280 	  *s += strlen (fp_cond_map[i].string);
   2281 	  /* If not a complete match, back up the input string and
   2282 	     report an error.  */
   2283 	  if (**s != ' ' && **s != '\t')
   2284 	    {
   2285 	      *s -= strlen (fp_cond_map[i].string);
   2286 	      break;
   2287 	    }
   2288 	  while (**s == ' ' || **s == '\t')
   2289 	    *s = *s + 1;
   2290 	  return cond;
   2291 	}
   2292     }
   2293 
   2294   as_bad (_("Invalid FP Compare Condition: %s"), *s);
   2295 
   2296   /* Advance over the bogus completer.  */
   2297   while (**s != ',' && **s != ' ' && **s != '\t')
   2298     *s += 1;
   2299 
   2300   return 0;
   2301 }
   2302 
   2303 /* Parse a graphics test complete for ftest.  */
   2304 
   2305 static int
   2306 pa_parse_ftest_gfx_completer (char **s)
   2307 {
   2308   int value;
   2309 
   2310   value = 0;
   2311   if (strncasecmp (*s, "acc8", 4) == 0)
   2312     {
   2313       value = 5;
   2314       *s += 4;
   2315     }
   2316   else if (strncasecmp (*s, "acc6", 4) == 0)
   2317     {
   2318       value = 9;
   2319       *s += 4;
   2320     }
   2321   else if (strncasecmp (*s, "acc4", 4) == 0)
   2322     {
   2323       value = 13;
   2324       *s += 4;
   2325     }
   2326   else if (strncasecmp (*s, "acc2", 4) == 0)
   2327     {
   2328       value = 17;
   2329       *s += 4;
   2330     }
   2331   else if (strncasecmp (*s, "acc", 3) == 0)
   2332     {
   2333       value = 1;
   2334       *s += 3;
   2335     }
   2336   else if (strncasecmp (*s, "rej8", 4) == 0)
   2337     {
   2338       value = 6;
   2339       *s += 4;
   2340     }
   2341   else if (strncasecmp (*s, "rej", 3) == 0)
   2342     {
   2343       value = 2;
   2344       *s += 3;
   2345     }
   2346   else
   2347     {
   2348       value = 0;
   2349       as_bad (_("Invalid FTEST completer: %s"), *s);
   2350     }
   2351 
   2352   return value;
   2353 }
   2354 
   2355 /* Parse an FP operand format completer returning the completer
   2356    type.  */
   2357 
   2358 static fp_operand_format
   2359 pa_parse_fp_cnv_format (char **s)
   2360 {
   2361   int format;
   2362 
   2363   format = SGL;
   2364   if (**s == ',')
   2365     {
   2366       *s += 1;
   2367       if (strncasecmp (*s, "sgl", 3) == 0)
   2368 	{
   2369 	  format = SGL;
   2370 	  *s += 4;
   2371 	}
   2372       else if (strncasecmp (*s, "dbl", 3) == 0)
   2373 	{
   2374 	  format = DBL;
   2375 	  *s += 4;
   2376 	}
   2377       else if (strncasecmp (*s, "quad", 4) == 0)
   2378 	{
   2379 	  format = QUAD;
   2380 	  *s += 5;
   2381 	}
   2382       else if (strncasecmp (*s, "w", 1) == 0)
   2383 	{
   2384 	  format = W;
   2385 	  *s += 2;
   2386 	}
   2387       else if (strncasecmp (*s, "uw", 2) == 0)
   2388 	{
   2389 	  format = UW;
   2390 	  *s += 3;
   2391 	}
   2392       else if (strncasecmp (*s, "dw", 2) == 0)
   2393 	{
   2394 	  format = DW;
   2395 	  *s += 3;
   2396 	}
   2397       else if (strncasecmp (*s, "udw", 3) == 0)
   2398 	{
   2399 	  format = UDW;
   2400 	  *s += 4;
   2401 	}
   2402       else if (strncasecmp (*s, "qw", 2) == 0)
   2403 	{
   2404 	  format = QW;
   2405 	  *s += 3;
   2406 	}
   2407       else if (strncasecmp (*s, "uqw", 3) == 0)
   2408 	{
   2409 	  format = UQW;
   2410 	  *s += 4;
   2411 	}
   2412       else
   2413 	{
   2414 	  format = ILLEGAL_FMT;
   2415 	  as_bad (_("Invalid FP Operand Format: %3s"), *s);
   2416 	}
   2417     }
   2418 
   2419   return format;
   2420 }
   2421 
   2422 /* Parse an FP operand format completer returning the completer
   2423    type.  */
   2424 
   2425 static fp_operand_format
   2426 pa_parse_fp_format (char **s)
   2427 {
   2428   int format;
   2429 
   2430   format = SGL;
   2431   if (**s == ',')
   2432     {
   2433       *s += 1;
   2434       if (strncasecmp (*s, "sgl", 3) == 0)
   2435 	{
   2436 	  format = SGL;
   2437 	  *s += 4;
   2438 	}
   2439       else if (strncasecmp (*s, "dbl", 3) == 0)
   2440 	{
   2441 	  format = DBL;
   2442 	  *s += 4;
   2443 	}
   2444       else if (strncasecmp (*s, "quad", 4) == 0)
   2445 	{
   2446 	  format = QUAD;
   2447 	  *s += 5;
   2448 	}
   2449       else
   2450 	{
   2451 	  format = ILLEGAL_FMT;
   2452 	  as_bad (_("Invalid FP Operand Format: %3s"), *s);
   2453 	}
   2454     }
   2455 
   2456   return format;
   2457 }
   2458 
   2459 /* Convert from a selector string into a selector type.  */
   2460 
   2461 static int
   2462 pa_chk_field_selector (char **str)
   2463 {
   2464   int middle, low, high;
   2465   int cmp;
   2466   char name[4];
   2467 
   2468   /* Read past any whitespace.  */
   2469   /* FIXME: should we read past newlines and formfeeds??? */
   2470   while (**str == ' ' || **str == '\t' || **str == '\n' || **str == '\f')
   2471     *str = *str + 1;
   2472 
   2473   if ((*str)[1] == '\'' || (*str)[1] == '%')
   2474     name[0] = TOLOWER ((*str)[0]),
   2475     name[1] = 0;
   2476   else if ((*str)[2] == '\'' || (*str)[2] == '%')
   2477     name[0] = TOLOWER ((*str)[0]),
   2478     name[1] = TOLOWER ((*str)[1]),
   2479     name[2] = 0;
   2480   else if ((*str)[3] == '\'' || (*str)[3] == '%')
   2481     name[0] = TOLOWER ((*str)[0]),
   2482     name[1] = TOLOWER ((*str)[1]),
   2483     name[2] = TOLOWER ((*str)[2]),
   2484     name[3] = 0;
   2485   else
   2486     return e_fsel;
   2487 
   2488   low = 0;
   2489   high = sizeof (selector_table) / sizeof (struct selector_entry) - 1;
   2490 
   2491   do
   2492     {
   2493       middle = (low + high) / 2;
   2494       cmp = strcmp (name, selector_table[middle].prefix);
   2495       if (cmp < 0)
   2496 	high = middle - 1;
   2497       else if (cmp > 0)
   2498 	low = middle + 1;
   2499       else
   2500 	{
   2501 	  *str += strlen (name) + 1;
   2502 #ifndef OBJ_SOM
   2503 	  if (selector_table[middle].field_selector == e_nsel)
   2504 	    return e_fsel;
   2505 #endif
   2506 	  return selector_table[middle].field_selector;
   2507 	}
   2508     }
   2509   while (low <= high);
   2510 
   2511   return e_fsel;
   2512 }
   2513 
   2514 /* Parse a .byte, .word, .long expression for the HPPA.  Called by
   2515    cons via the TC_PARSE_CONS_EXPRESSION macro.  */
   2516 
   2517 int
   2518 parse_cons_expression_hppa (expressionS *exp)
   2519 {
   2520   int hppa_field_selector = pa_chk_field_selector (&input_line_pointer);
   2521   expression (exp);
   2522   return hppa_field_selector;
   2523 }
   2524 
   2525 /* Evaluate an absolute expression EXP which may be modified by
   2526    the selector FIELD_SELECTOR.  Return the value of the expression.  */
   2527 static int
   2528 evaluate_absolute (struct pa_it *insn)
   2529 {
   2530   offsetT value;
   2531   expressionS exp;
   2532   int field_selector = insn->field_selector;
   2533 
   2534   exp = insn->exp;
   2535   value = exp.X_add_number;
   2536 
   2537   return hppa_field_adjust (0, value, field_selector);
   2538 }
   2539 
   2540 /* Mark (via expr_end) the end of an absolute expression.  FIXME.  */
   2541 
   2542 static int
   2543 pa_get_absolute_expression (struct pa_it *insn, char **strp)
   2544 {
   2545   char *save_in;
   2546 
   2547   insn->field_selector = pa_chk_field_selector (strp);
   2548   save_in = input_line_pointer;
   2549   input_line_pointer = *strp;
   2550   expression (&insn->exp);
   2551   expr_end = input_line_pointer;
   2552   input_line_pointer = save_in;
   2553   if (insn->exp.X_op != O_constant)
   2554     {
   2555       /* We have a non-match in strict mode.  */
   2556       if (!strict)
   2557 	as_bad (_("Bad segment (should be absolute)."));
   2558       return 0;
   2559     }
   2560   return evaluate_absolute (insn);
   2561 }
   2562 
   2563 /* Get an absolute number.  The input string is terminated at the
   2564    first whitespace character.  */
   2565 
   2566 static int
   2567 pa_get_number (struct pa_it *insn, char **strp)
   2568 {
   2569   char *save_in;
   2570   char *s, c;
   2571   int result;
   2572 
   2573   save_in = input_line_pointer;
   2574   input_line_pointer = *strp;
   2575 
   2576   /* The PA assembly syntax is ambiguous in a variety of ways.  Consider
   2577      this string "4 %r5"  Is that the number 4 followed by the register
   2578      r5, or is that 4 MOD r5?  This situation occurs for example in the
   2579      coprocessor load and store instructions.  Previously, calling
   2580      pa_get_absolute_expression directly results in r5 being entered
   2581      in the symbol table.
   2582 
   2583      So, when looking for an absolute number, we cut off the input string
   2584      at the first whitespace character.  Thus, expressions should generally
   2585      contain no whitespace.  */
   2586 
   2587   s = *strp;
   2588   while (*s != ',' && *s != ' ' && *s != '\t')
   2589     s++;
   2590 
   2591   c = *s;
   2592   *s = 0;
   2593 
   2594   result = pa_get_absolute_expression (insn, strp);
   2595 
   2596   input_line_pointer = save_in;
   2597   *s = c;
   2598   return result;
   2599 }
   2600 
   2601 /* Given an argument location specification return the associated
   2602    argument location number.  */
   2603 
   2604 static unsigned int
   2605 pa_build_arg_reloc (char *type_name)
   2606 {
   2607 
   2608   if (strncasecmp (type_name, "no", 2) == 0)
   2609     return 0;
   2610   if (strncasecmp (type_name, "gr", 2) == 0)
   2611     return 1;
   2612   else if (strncasecmp (type_name, "fr", 2) == 0)
   2613     return 2;
   2614   else if (strncasecmp (type_name, "fu", 2) == 0)
   2615     return 3;
   2616   else
   2617     as_bad (_("Invalid argument location: %s\n"), type_name);
   2618 
   2619   return 0;
   2620 }
   2621 
   2622 /* Encode and return an argument relocation specification for
   2623    the given register in the location specified by arg_reloc.  */
   2624 
   2625 static unsigned int
   2626 pa_align_arg_reloc (unsigned int reg, unsigned int arg_reloc)
   2627 {
   2628   unsigned int new_reloc;
   2629 
   2630   new_reloc = arg_reloc;
   2631   switch (reg)
   2632     {
   2633     case 0:
   2634       new_reloc <<= 8;
   2635       break;
   2636     case 1:
   2637       new_reloc <<= 6;
   2638       break;
   2639     case 2:
   2640       new_reloc <<= 4;
   2641       break;
   2642     case 3:
   2643       new_reloc <<= 2;
   2644       break;
   2645     default:
   2646       as_bad (_("Invalid argument description: %d"), reg);
   2647     }
   2648 
   2649   return new_reloc;
   2650 }
   2651 
   2652 /* Parse a non-negated compare/subtract completer returning the
   2653    number (for encoding in instructions) of the given completer.  */
   2654 
   2655 static int
   2656 pa_parse_nonneg_cmpsub_cmpltr (char **s)
   2657 {
   2658   int cmpltr;
   2659   char *name = *s + 1;
   2660   char c;
   2661   char *save_s = *s;
   2662   int nullify = 0;
   2663 
   2664   cmpltr = 0;
   2665   if (**s == ',')
   2666     {
   2667       *s += 1;
   2668       while (**s != ',' && **s != ' ' && **s != '\t')
   2669 	*s += 1;
   2670       c = **s;
   2671       **s = 0x00;
   2672 
   2673       if (strcmp (name, "=") == 0)
   2674 	{
   2675 	  cmpltr = 1;
   2676 	}
   2677       else if (strcmp (name, "<") == 0)
   2678 	{
   2679 	  cmpltr = 2;
   2680 	}
   2681       else if (strcmp (name, "<=") == 0)
   2682 	{
   2683 	  cmpltr = 3;
   2684 	}
   2685       else if (strcmp (name, "<<") == 0)
   2686 	{
   2687 	  cmpltr = 4;
   2688 	}
   2689       else if (strcmp (name, "<<=") == 0)
   2690 	{
   2691 	  cmpltr = 5;
   2692 	}
   2693       else if (strcasecmp (name, "sv") == 0)
   2694 	{
   2695 	  cmpltr = 6;
   2696 	}
   2697       else if (strcasecmp (name, "od") == 0)
   2698 	{
   2699 	  cmpltr = 7;
   2700 	}
   2701       /* If we have something like addb,n then there is no condition
   2702 	 completer.  */
   2703       else if (strcasecmp (name, "n") == 0)
   2704 	{
   2705 	  cmpltr = 0;
   2706 	  nullify = 1;
   2707 	}
   2708       else
   2709 	{
   2710 	  cmpltr = -1;
   2711 	}
   2712       **s = c;
   2713     }
   2714 
   2715   /* Reset pointers if this was really a ,n for a branch instruction.  */
   2716   if (nullify)
   2717     *s = save_s;
   2718 
   2719   return cmpltr;
   2720 }
   2721 
   2722 /* Parse a negated compare/subtract completer returning the
   2723    number (for encoding in instructions) of the given completer.  */
   2724 
   2725 static int
   2726 pa_parse_neg_cmpsub_cmpltr (char **s)
   2727 {
   2728   int cmpltr;
   2729   char *name = *s + 1;
   2730   char c;
   2731   char *save_s = *s;
   2732   int nullify = 0;
   2733 
   2734   cmpltr = 0;
   2735   if (**s == ',')
   2736     {
   2737       *s += 1;
   2738       while (**s != ',' && **s != ' ' && **s != '\t')
   2739 	*s += 1;
   2740       c = **s;
   2741       **s = 0x00;
   2742 
   2743       if (strcasecmp (name, "tr") == 0)
   2744 	{
   2745 	  cmpltr = 0;
   2746 	}
   2747       else if (strcmp (name, "<>") == 0)
   2748 	{
   2749 	  cmpltr = 1;
   2750 	}
   2751       else if (strcmp (name, ">=") == 0)
   2752 	{
   2753 	  cmpltr = 2;
   2754 	}
   2755       else if (strcmp (name, ">") == 0)
   2756 	{
   2757 	  cmpltr = 3;
   2758 	}
   2759       else if (strcmp (name, ">>=") == 0)
   2760 	{
   2761 	  cmpltr = 4;
   2762 	}
   2763       else if (strcmp (name, ">>") == 0)
   2764 	{
   2765 	  cmpltr = 5;
   2766 	}
   2767       else if (strcasecmp (name, "nsv") == 0)
   2768 	{
   2769 	  cmpltr = 6;
   2770 	}
   2771       else if (strcasecmp (name, "ev") == 0)
   2772 	{
   2773 	  cmpltr = 7;
   2774 	}
   2775       /* If we have something like addb,n then there is no condition
   2776 	 completer.  */
   2777       else if (strcasecmp (name, "n") == 0)
   2778 	{
   2779 	  cmpltr = 0;
   2780 	  nullify = 1;
   2781 	}
   2782       else
   2783 	{
   2784 	  cmpltr = -1;
   2785 	}
   2786       **s = c;
   2787     }
   2788 
   2789   /* Reset pointers if this was really a ,n for a branch instruction.  */
   2790   if (nullify)
   2791     *s = save_s;
   2792 
   2793   return cmpltr;
   2794 }
   2795 
   2796 /* Parse a 64 bit compare and branch completer returning the number (for
   2797    encoding in instructions) of the given completer.
   2798 
   2799    Nonnegated comparisons are returned as 0-7, negated comparisons are
   2800    returned as 8-15.  */
   2801 
   2802 static int
   2803 pa_parse_cmpb_64_cmpltr (char **s)
   2804 {
   2805   int cmpltr;
   2806   char *name = *s + 1;
   2807   char c;
   2808 
   2809   cmpltr = -1;
   2810   if (**s == ',')
   2811     {
   2812       *s += 1;
   2813       while (**s != ',' && **s != ' ' && **s != '\t')
   2814 	*s += 1;
   2815       c = **s;
   2816       **s = 0x00;
   2817 
   2818       if (strcmp (name, "*") == 0)
   2819 	{
   2820 	  cmpltr = 0;
   2821 	}
   2822       else if (strcmp (name, "*=") == 0)
   2823 	{
   2824 	  cmpltr = 1;
   2825 	}
   2826       else if (strcmp (name, "*<") == 0)
   2827 	{
   2828 	  cmpltr = 2;
   2829 	}
   2830       else if (strcmp (name, "*<=") == 0)
   2831 	{
   2832 	  cmpltr = 3;
   2833 	}
   2834       else if (strcmp (name, "*<<") == 0)
   2835 	{
   2836 	  cmpltr = 4;
   2837 	}
   2838       else if (strcmp (name, "*<<=") == 0)
   2839 	{
   2840 	  cmpltr = 5;
   2841 	}
   2842       else if (strcasecmp (name, "*sv") == 0)
   2843 	{
   2844 	  cmpltr = 6;
   2845 	}
   2846       else if (strcasecmp (name, "*od") == 0)
   2847 	{
   2848 	  cmpltr = 7;
   2849 	}
   2850       else if (strcasecmp (name, "*tr") == 0)
   2851 	{
   2852 	  cmpltr = 8;
   2853 	}
   2854       else if (strcmp (name, "*<>") == 0)
   2855 	{
   2856 	  cmpltr = 9;
   2857 	}
   2858       else if (strcmp (name, "*>=") == 0)
   2859 	{
   2860 	  cmpltr = 10;
   2861 	}
   2862       else if (strcmp (name, "*>") == 0)
   2863 	{
   2864 	  cmpltr = 11;
   2865 	}
   2866       else if (strcmp (name, "*>>=") == 0)
   2867 	{
   2868 	  cmpltr = 12;
   2869 	}
   2870       else if (strcmp (name, "*>>") == 0)
   2871 	{
   2872 	  cmpltr = 13;
   2873 	}
   2874       else if (strcasecmp (name, "*nsv") == 0)
   2875 	{
   2876 	  cmpltr = 14;
   2877 	}
   2878       else if (strcasecmp (name, "*ev") == 0)
   2879 	{
   2880 	  cmpltr = 15;
   2881 	}
   2882       else
   2883 	{
   2884 	  cmpltr = -1;
   2885 	}
   2886       **s = c;
   2887     }
   2888 
   2889   return cmpltr;
   2890 }
   2891 
   2892 /* Parse a 64 bit compare immediate and branch completer returning the number
   2893    (for encoding in instructions) of the given completer.  */
   2894 
   2895 static int
   2896 pa_parse_cmpib_64_cmpltr (char **s)
   2897 {
   2898   int cmpltr;
   2899   char *name = *s + 1;
   2900   char c;
   2901 
   2902   cmpltr = -1;
   2903   if (**s == ',')
   2904     {
   2905       *s += 1;
   2906       while (**s != ',' && **s != ' ' && **s != '\t')
   2907 	*s += 1;
   2908       c = **s;
   2909       **s = 0x00;
   2910 
   2911       if (strcmp (name, "*<<") == 0)
   2912 	{
   2913 	  cmpltr = 0;
   2914 	}
   2915       else if (strcmp (name, "*=") == 0)
   2916 	{
   2917 	  cmpltr = 1;
   2918 	}
   2919       else if (strcmp (name, "*<") == 0)
   2920 	{
   2921 	  cmpltr = 2;
   2922 	}
   2923       else if (strcmp (name, "*<=") == 0)
   2924 	{
   2925 	  cmpltr = 3;
   2926 	}
   2927       else if (strcmp (name, "*>>=") == 0)
   2928 	{
   2929 	  cmpltr = 4;
   2930 	}
   2931       else if (strcmp (name, "*<>") == 0)
   2932 	{
   2933 	  cmpltr = 5;
   2934 	}
   2935       else if (strcasecmp (name, "*>=") == 0)
   2936 	{
   2937 	  cmpltr = 6;
   2938 	}
   2939       else if (strcasecmp (name, "*>") == 0)
   2940 	{
   2941 	  cmpltr = 7;
   2942 	}
   2943       else
   2944 	{
   2945 	  cmpltr = -1;
   2946 	}
   2947       **s = c;
   2948     }
   2949 
   2950   return cmpltr;
   2951 }
   2952 
   2953 /* Parse a non-negated addition completer returning the number
   2954    (for encoding in instructions) of the given completer.  */
   2955 
   2956 static int
   2957 pa_parse_nonneg_add_cmpltr (char **s)
   2958 {
   2959   int cmpltr;
   2960   char *name = *s + 1;
   2961   char c;
   2962   char *save_s = *s;
   2963   int nullify = 0;
   2964 
   2965   cmpltr = 0;
   2966   if (**s == ',')
   2967     {
   2968       *s += 1;
   2969       while (**s != ',' && **s != ' ' && **s != '\t')
   2970 	*s += 1;
   2971       c = **s;
   2972       **s = 0x00;
   2973       if (strcmp (name, "=") == 0)
   2974 	{
   2975 	  cmpltr = 1;
   2976 	}
   2977       else if (strcmp (name, "<") == 0)
   2978 	{
   2979 	  cmpltr = 2;
   2980 	}
   2981       else if (strcmp (name, "<=") == 0)
   2982 	{
   2983 	  cmpltr = 3;
   2984 	}
   2985       else if (strcasecmp (name, "nuv") == 0)
   2986 	{
   2987 	  cmpltr = 4;
   2988 	}
   2989       else if (strcasecmp (name, "znv") == 0)
   2990 	{
   2991 	  cmpltr = 5;
   2992 	}
   2993       else if (strcasecmp (name, "sv") == 0)
   2994 	{
   2995 	  cmpltr = 6;
   2996 	}
   2997       else if (strcasecmp (name, "od") == 0)
   2998 	{
   2999 	  cmpltr = 7;
   3000 	}
   3001       /* If we have something like addb,n then there is no condition
   3002 	 completer.  */
   3003       else if (strcasecmp (name, "n") == 0)
   3004 	{
   3005 	  cmpltr = 0;
   3006 	  nullify = 1;
   3007 	}
   3008       else
   3009 	{
   3010 	  cmpltr = -1;
   3011 	}
   3012       **s = c;
   3013     }
   3014 
   3015   /* Reset pointers if this was really a ,n for a branch instruction.  */
   3016   if (nullify)
   3017     *s = save_s;
   3018 
   3019   return cmpltr;
   3020 }
   3021 
   3022 /* Parse a negated addition completer returning the number
   3023    (for encoding in instructions) of the given completer.  */
   3024 
   3025 static int
   3026 pa_parse_neg_add_cmpltr (char **s)
   3027 {
   3028   int cmpltr;
   3029   char *name = *s + 1;
   3030   char c;
   3031   char *save_s = *s;
   3032   int nullify = 0;
   3033 
   3034   cmpltr = 0;
   3035   if (**s == ',')
   3036     {
   3037       *s += 1;
   3038       while (**s != ',' && **s != ' ' && **s != '\t')
   3039 	*s += 1;
   3040       c = **s;
   3041       **s = 0x00;
   3042       if (strcasecmp (name, "tr") == 0)
   3043 	{
   3044 	  cmpltr = 0;
   3045 	}
   3046       else if (strcmp (name, "<>") == 0)
   3047 	{
   3048 	  cmpltr = 1;
   3049 	}
   3050       else if (strcmp (name, ">=") == 0)
   3051 	{
   3052 	  cmpltr = 2;
   3053 	}
   3054       else if (strcmp (name, ">") == 0)
   3055 	{
   3056 	  cmpltr = 3;
   3057 	}
   3058       else if (strcasecmp (name, "uv") == 0)
   3059 	{
   3060 	  cmpltr = 4;
   3061 	}
   3062       else if (strcasecmp (name, "vnz") == 0)
   3063 	{
   3064 	  cmpltr = 5;
   3065 	}
   3066       else if (strcasecmp (name, "nsv") == 0)
   3067 	{
   3068 	  cmpltr = 6;
   3069 	}
   3070       else if (strcasecmp (name, "ev") == 0)
   3071 	{
   3072 	  cmpltr = 7;
   3073 	}
   3074       /* If we have something like addb,n then there is no condition
   3075 	 completer.  */
   3076       else if (strcasecmp (name, "n") == 0)
   3077 	{
   3078 	  cmpltr = 0;
   3079 	  nullify = 1;
   3080 	}
   3081       else
   3082 	{
   3083 	  cmpltr = -1;
   3084 	}
   3085       **s = c;
   3086     }
   3087 
   3088   /* Reset pointers if this was really a ,n for a branch instruction.  */
   3089   if (nullify)
   3090     *s = save_s;
   3091 
   3092   return cmpltr;
   3093 }
   3094 
   3095 /* Parse a 64 bit wide mode add and branch completer returning the number (for
   3096    encoding in instructions) of the given completer.  */
   3097 
   3098 static int
   3099 pa_parse_addb_64_cmpltr (char **s)
   3100 {
   3101   int cmpltr;
   3102   char *name = *s + 1;
   3103   char c;
   3104   char *save_s = *s;
   3105   int nullify = 0;
   3106 
   3107   cmpltr = 0;
   3108   if (**s == ',')
   3109     {
   3110       *s += 1;
   3111       while (**s != ',' && **s != ' ' && **s != '\t')
   3112 	*s += 1;
   3113       c = **s;
   3114       **s = 0x00;
   3115       if (strcmp (name, "=") == 0)
   3116 	{
   3117 	  cmpltr = 1;
   3118 	}
   3119       else if (strcmp (name, "<") == 0)
   3120 	{
   3121 	  cmpltr = 2;
   3122 	}
   3123       else if (strcmp (name, "<=") == 0)
   3124 	{
   3125 	  cmpltr = 3;
   3126 	}
   3127       else if (strcasecmp (name, "nuv") == 0)
   3128 	{
   3129 	  cmpltr = 4;
   3130 	}
   3131       else if (strcasecmp (name, "*=") == 0)
   3132 	{
   3133 	  cmpltr = 5;
   3134 	}
   3135       else if (strcasecmp (name, "*<") == 0)
   3136 	{
   3137 	  cmpltr = 6;
   3138 	}
   3139       else if (strcasecmp (name, "*<=") == 0)
   3140 	{
   3141 	  cmpltr = 7;
   3142 	}
   3143       else if (strcmp (name, "tr") == 0)
   3144 	{
   3145 	  cmpltr = 8;
   3146 	}
   3147       else if (strcmp (name, "<>") == 0)
   3148 	{
   3149 	  cmpltr = 9;
   3150 	}
   3151       else if (strcmp (name, ">=") == 0)
   3152 	{
   3153 	  cmpltr = 10;
   3154 	}
   3155       else if (strcmp (name, ">") == 0)
   3156 	{
   3157 	  cmpltr = 11;
   3158 	}
   3159       else if (strcasecmp (name, "uv") == 0)
   3160 	{
   3161 	  cmpltr = 12;
   3162 	}
   3163       else if (strcasecmp (name, "*<>") == 0)
   3164 	{
   3165 	  cmpltr = 13;
   3166 	}
   3167       else if (strcasecmp (name, "*>=") == 0)
   3168 	{
   3169 	  cmpltr = 14;
   3170 	}
   3171       else if (strcasecmp (name, "*>") == 0)
   3172 	{
   3173 	  cmpltr = 15;
   3174 	}
   3175       /* If we have something like addb,n then there is no condition
   3176 	 completer.  */
   3177       else if (strcasecmp (name, "n") == 0)
   3178 	{
   3179 	  cmpltr = 0;
   3180 	  nullify = 1;
   3181 	}
   3182       else
   3183 	{
   3184 	  cmpltr = -1;
   3185 	}
   3186       **s = c;
   3187     }
   3188 
   3189   /* Reset pointers if this was really a ,n for a branch instruction.  */
   3190   if (nullify)
   3191     *s = save_s;
   3192 
   3193   return cmpltr;
   3194 }
   3195 
   3196 /* Do the real work for assembling a single instruction.  Store results
   3197    into the global "the_insn" variable.  */
   3198 
   3199 static void
   3200 pa_ip (char *str)
   3201 {
   3202   char *error_message = "";
   3203   char *s, c, *argstart, *name, *save_s;
   3204   const char *args;
   3205   int match = FALSE;
   3206   int comma = 0;
   3207   int cmpltr, nullif, flag, cond, need_cond, num;
   3208   int immediate_check = 0, pos = -1, len = -1;
   3209   unsigned long opcode;
   3210   struct pa_opcode *insn;
   3211 
   3212 #ifdef OBJ_SOM
   3213   /* We must have a valid space and subspace.  */
   3214   pa_check_current_space_and_subspace ();
   3215 #endif
   3216 
   3217   /* Convert everything up to the first whitespace character into lower
   3218      case.  */
   3219   for (s = str; *s != ' ' && *s != '\t' && *s != '\n' && *s != '\0'; s++)
   3220     *s = TOLOWER (*s);
   3221 
   3222   /* Skip to something interesting.  */
   3223   for (s = str;
   3224        ISUPPER (*s) || ISLOWER (*s) || (*s >= '0' && *s <= '3');
   3225        ++s)
   3226     ;
   3227 
   3228   switch (*s)
   3229     {
   3230 
   3231     case '\0':
   3232       break;
   3233 
   3234     case ',':
   3235       comma = 1;
   3236 
   3237       /*FALLTHROUGH */
   3238 
   3239     case ' ':
   3240       *s++ = '\0';
   3241       break;
   3242 
   3243     default:
   3244       as_bad (_("Unknown opcode: `%s'"), str);
   3245       return;
   3246     }
   3247 
   3248   /* Look up the opcode in the hash table.  */
   3249   if ((insn = (struct pa_opcode *) hash_find (op_hash, str)) == NULL)
   3250     {
   3251       as_bad (_("Unknown opcode: `%s'"), str);
   3252       return;
   3253     }
   3254 
   3255   if (comma)
   3256     *--s = ',';
   3257 
   3258   /* Mark the location where arguments for the instruction start, then
   3259      start processing them.  */
   3260   argstart = s;
   3261   for (;;)
   3262     {
   3263       /* Do some initialization.  */
   3264       opcode = insn->match;
   3265       strict = (insn->flags & FLAG_STRICT);
   3266       memset (&the_insn, 0, sizeof (the_insn));
   3267       need_cond = 1;
   3268 
   3269       the_insn.reloc = R_HPPA_NONE;
   3270 
   3271       if (insn->arch >= pa20
   3272 	  && bfd_get_mach (stdoutput) < insn->arch)
   3273 	goto failed;
   3274 
   3275       /* Build the opcode, checking as we go to make
   3276 	 sure that the operands match.  */
   3277       for (args = insn->args;; ++args)
   3278 	{
   3279 	  /* Absorb white space in instruction.  */
   3280 	  while (*s == ' ' || *s == '\t')
   3281 	    s++;
   3282 
   3283 	  switch (*args)
   3284 	    {
   3285 	    /* End of arguments.  */
   3286 	    case '\0':
   3287 	      if (*s == '\0')
   3288 		match = TRUE;
   3289 	      break;
   3290 
   3291 	    case '+':
   3292 	      if (*s == '+')
   3293 		{
   3294 		  ++s;
   3295 		  continue;
   3296 		}
   3297 	      if (*s == '-')
   3298 		continue;
   3299 	      break;
   3300 
   3301 	    /* These must match exactly.  */
   3302 	    case '(':
   3303 	    case ')':
   3304 	    case ',':
   3305 	    case ' ':
   3306 	      if (*s++ == *args)
   3307 		continue;
   3308 	      break;
   3309 
   3310 	    /* Handle a 5 bit register or control register field at 10.  */
   3311 	    case 'b':
   3312 	    case '^':
   3313 	      if (!pa_parse_number (&s, 0))
   3314 		break;
   3315 	      num = pa_number;
   3316 	      CHECK_FIELD (num, 31, 0, 0);
   3317 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 21);
   3318 
   3319 	    /* Handle %sar or %cr11.  No bits get set, we just verify that it
   3320 	       is there.  */
   3321 	    case '!':
   3322 	      /* Skip whitespace before register.  */
   3323 	      while (*s == ' ' || *s == '\t')
   3324 		s = s + 1;
   3325 
   3326 	      if (!strncasecmp (s, "%sar", 4))
   3327 		{
   3328 		  s += 4;
   3329 		  continue;
   3330 		}
   3331 	      else if (!strncasecmp (s, "%cr11", 5))
   3332 		{
   3333 		  s += 5;
   3334 		  continue;
   3335 		}
   3336 	      break;
   3337 
   3338 	    /* Handle a 5 bit register field at 15.  */
   3339 	    case 'x':
   3340 	      if (!pa_parse_number (&s, 0))
   3341 		break;
   3342 	      num = pa_number;
   3343 	      CHECK_FIELD (num, 31, 0, 0);
   3344 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 16);
   3345 
   3346 	    /* Handle a 5 bit register field at 31.  */
   3347 	    case 't':
   3348 	      if (!pa_parse_number (&s, 0))
   3349 		break;
   3350 	      num = pa_number;
   3351 	      CHECK_FIELD (num, 31, 0, 0);
   3352 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   3353 
   3354 	    /* Handle a 5 bit register field at 10 and 15.  */
   3355 	    case 'a':
   3356 	      if (!pa_parse_number (&s, 0))
   3357 		break;
   3358 	      num = pa_number;
   3359 	      CHECK_FIELD (num, 31, 0, 0);
   3360 	      opcode |= num << 16;
   3361 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 21);
   3362 
   3363 	    /* Handle a 5 bit field length at 31.  */
   3364 	    case 'T':
   3365 	      num = pa_get_absolute_expression (&the_insn, &s);
   3366 	      if (strict && the_insn.exp.X_op != O_constant)
   3367 		break;
   3368 	      s = expr_end;
   3369 	      CHECK_FIELD (num, 32, 1, 0);
   3370 	      SAVE_IMMEDIATE(num);
   3371 	      INSERT_FIELD_AND_CONTINUE (opcode, 32 - num, 0);
   3372 
   3373 	    /* Handle a 5 bit immediate at 15.  */
   3374 	    case '5':
   3375 	      num = pa_get_absolute_expression (&the_insn, &s);
   3376 	      if (strict && the_insn.exp.X_op != O_constant)
   3377 		break;
   3378 	      s = expr_end;
   3379 	      /* When in strict mode, we want to just reject this
   3380 		 match instead of giving an out of range error.  */
   3381 	      CHECK_FIELD (num, 15, -16, strict);
   3382 	      num = low_sign_unext (num, 5);
   3383 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 16);
   3384 
   3385 	    /* Handle a 5 bit immediate at 31.  */
   3386 	    case 'V':
   3387 	      num = pa_get_absolute_expression (&the_insn, &s);
   3388 	      if (strict && the_insn.exp.X_op != O_constant)
   3389 		break;
   3390 	      s = expr_end;
   3391 	      /* When in strict mode, we want to just reject this
   3392 		 match instead of giving an out of range error.  */
   3393 	      CHECK_FIELD (num, 15, -16, strict);
   3394 	      num = low_sign_unext (num, 5);
   3395 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   3396 
   3397 	    /* Handle an unsigned 5 bit immediate at 31.  */
   3398 	    case 'r':
   3399 	      num = pa_get_absolute_expression (&the_insn, &s);
   3400 	      if (strict && the_insn.exp.X_op != O_constant)
   3401 		break;
   3402 	      s = expr_end;
   3403 	      CHECK_FIELD (num, 31, 0, strict);
   3404 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   3405 
   3406 	    /* Handle an unsigned 5 bit immediate at 15.  */
   3407 	    case 'R':
   3408 	      num = pa_get_absolute_expression (&the_insn, &s);
   3409 	      if (strict && the_insn.exp.X_op != O_constant)
   3410 		break;
   3411 	      s = expr_end;
   3412 	      CHECK_FIELD (num, 31, 0, strict);
   3413 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 16);
   3414 
   3415 	    /* Handle an unsigned 10 bit immediate at 15.  */
   3416 	    case 'U':
   3417 	      num = pa_get_absolute_expression (&the_insn, &s);
   3418 	      if (strict && the_insn.exp.X_op != O_constant)
   3419 		break;
   3420 	      s = expr_end;
   3421 	      CHECK_FIELD (num, 1023, 0, strict);
   3422 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 16);
   3423 
   3424 	    /* Handle a 2 bit space identifier at 17.  */
   3425 	    case 's':
   3426 	      if (!pa_parse_number (&s, 0))
   3427 		break;
   3428 	      num = pa_number;
   3429 	      CHECK_FIELD (num, 3, 0, 1);
   3430 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 14);
   3431 
   3432 	    /* Handle a 3 bit space identifier at 18.  */
   3433 	    case 'S':
   3434 	      if (!pa_parse_number (&s, 0))
   3435 		break;
   3436 	      num = pa_number;
   3437 	      CHECK_FIELD (num, 7, 0, 1);
   3438 	      opcode |= re_assemble_3 (num);
   3439 	      continue;
   3440 
   3441 	    /* Handle all completers.  */
   3442 	    case 'c':
   3443 	      switch (*++args)
   3444 		{
   3445 
   3446 		/* Handle a completer for an indexing load or store.  */
   3447 		case 'X':
   3448 		case 'x':
   3449 		  {
   3450 		    int uu = 0;
   3451 		    int m = 0;
   3452 		    int i = 0;
   3453 		    while (*s == ',' && i < 2)
   3454 		      {
   3455 			s++;
   3456 			if (strncasecmp (s, "sm", 2) == 0)
   3457 			  {
   3458 			    uu = 1;
   3459 			    m = 1;
   3460 			    s++;
   3461 			    i++;
   3462 			  }
   3463 			else if (strncasecmp (s, "m", 1) == 0)
   3464 			  m = 1;
   3465 			else if ((strncasecmp (s, "s ", 2) == 0)
   3466 				 || (strncasecmp (s, "s,", 2) == 0))
   3467 			  uu = 1;
   3468 			else if (strict)
   3469 			  {
   3470 			    /* This is a match failure.  */
   3471 			    s--;
   3472 			    break;
   3473 			  }
   3474 			else
   3475 			  as_bad (_("Invalid Indexed Load Completer."));
   3476 			s++;
   3477 			i++;
   3478 		      }
   3479 		    if (i > 2)
   3480 		      as_bad (_("Invalid Indexed Load Completer Syntax."));
   3481 		    opcode |= m << 5;
   3482 		    INSERT_FIELD_AND_CONTINUE (opcode, uu, 13);
   3483 		  }
   3484 
   3485 		/* Handle a short load/store completer.  */
   3486 		case 'M':
   3487 		case 'm':
   3488 		case 'q':
   3489 		case 'J':
   3490 		case 'e':
   3491 		  {
   3492 		    int a = 0;
   3493 		    int m = 0;
   3494 		    if (*s == ',')
   3495 		      {
   3496 			s++;
   3497 			if (strncasecmp (s, "ma", 2) == 0)
   3498 			  {
   3499 			    a = 0;
   3500 			    m = 1;
   3501 			    s += 2;
   3502 			  }
   3503 			else if (strncasecmp (s, "mb", 2) == 0)
   3504 			  {
   3505 			    a = 1;
   3506 			    m = 1;
   3507 			    s += 2;
   3508 			  }
   3509 			else if (strict)
   3510 			  /* This is a match failure.  */
   3511 			  s--;
   3512 			else
   3513 			  {
   3514 			    as_bad (_("Invalid Short Load/Store Completer."));
   3515 			    s += 2;
   3516 			  }
   3517 		      }
   3518 		    /* If we did not get a ma/mb completer, then we do not
   3519 		       consider this a positive match for 'ce'.  */
   3520 		    else if (*args == 'e')
   3521 		      break;
   3522 
   3523 		   /* 'J', 'm', 'M' and 'q' are the same, except for where they
   3524 		       encode the before/after field.  */
   3525 		   if (*args == 'm' || *args == 'M')
   3526 		      {
   3527 			opcode |= m << 5;
   3528 			INSERT_FIELD_AND_CONTINUE (opcode, a, 13);
   3529 		      }
   3530 		    else if (*args == 'q')
   3531 		      {
   3532 			opcode |= m << 3;
   3533 			INSERT_FIELD_AND_CONTINUE (opcode, a, 2);
   3534 		      }
   3535 		    else if (*args == 'J')
   3536 		      {
   3537 			/* M bit is explicit in the major opcode.  */
   3538 			INSERT_FIELD_AND_CONTINUE (opcode, a, 2);
   3539 		      }
   3540 		    else if (*args == 'e')
   3541 		      {
   3542 			/* Stash the ma/mb flag temporarily in the
   3543 			   instruction.  We will use (and remove it)
   3544 			   later when handling 'J', 'K', '<' & '>'.  */
   3545 			opcode |= a;
   3546 			continue;
   3547 		      }
   3548 		  }
   3549 
   3550 		/* Handle a stbys completer.  */
   3551 		case 'A':
   3552 		case 's':
   3553 		  {
   3554 		    int a = 0;
   3555 		    int m = 0;
   3556 		    int i = 0;
   3557 		    while (*s == ',' && i < 2)
   3558 		      {
   3559 			s++;
   3560 			if (strncasecmp (s, "m", 1) == 0)
   3561 			  m = 1;
   3562 			else if ((strncasecmp (s, "b ", 2) == 0)
   3563 				 || (strncasecmp (s, "b,", 2) == 0))
   3564 			  a = 0;
   3565 			else if (strncasecmp (s, "e", 1) == 0)
   3566 			  a = 1;
   3567 			/* In strict mode, this is a match failure.  */
   3568 			else if (strict)
   3569 			  {
   3570 			    s--;
   3571 			    break;
   3572 			  }
   3573 			else
   3574 			  as_bad (_("Invalid Store Bytes Short Completer"));
   3575 			s++;
   3576 			i++;
   3577 		      }
   3578 		    if (i > 2)
   3579 		      as_bad (_("Invalid Store Bytes Short Completer"));
   3580 		    opcode |= m << 5;
   3581 		    INSERT_FIELD_AND_CONTINUE (opcode, a, 13);
   3582 		  }
   3583 
   3584 		/* Handle load cache hint completer.  */
   3585 		case 'c':
   3586 		  cmpltr = 0;
   3587 		  if (!strncmp (s, ",sl", 3))
   3588 		    {
   3589 		      s += 3;
   3590 		      cmpltr = 2;
   3591 		    }
   3592 		  INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 10);
   3593 
   3594 		/* Handle store cache hint completer.  */
   3595 		case 'C':
   3596 		  cmpltr = 0;
   3597 		  if (!strncmp (s, ",sl", 3))
   3598 		    {
   3599 		      s += 3;
   3600 		      cmpltr = 2;
   3601 		    }
   3602 		  else if (!strncmp (s, ",bc", 3))
   3603 		    {
   3604 		      s += 3;
   3605 		      cmpltr = 1;
   3606 		    }
   3607 		  INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 10);
   3608 
   3609 		/* Handle load and clear cache hint completer.  */
   3610 		case 'd':
   3611 		  cmpltr = 0;
   3612 		  if (!strncmp (s, ",co", 3))
   3613 		    {
   3614 		      s += 3;
   3615 		      cmpltr = 1;
   3616 		    }
   3617 		  INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 10);
   3618 
   3619 		/* Handle load ordering completer.  */
   3620 		case 'o':
   3621 		  if (strncmp (s, ",o", 2) != 0)
   3622 		    break;
   3623 		  s += 2;
   3624 		  continue;
   3625 
   3626 		/* Handle a branch gate completer.  */
   3627 		case 'g':
   3628 		  if (strncasecmp (s, ",gate", 5) != 0)
   3629 		    break;
   3630 		  s += 5;
   3631 		  continue;
   3632 
   3633 		/* Handle a branch link and push completer.  */
   3634 		case 'p':
   3635 		  if (strncasecmp (s, ",l,push", 7) != 0)
   3636 		    break;
   3637 		  s += 7;
   3638 		  continue;
   3639 
   3640 		/* Handle a branch link completer.  */
   3641 		case 'l':
   3642 		  if (strncasecmp (s, ",l", 2) != 0)
   3643 		    break;
   3644 		  s += 2;
   3645 		  continue;
   3646 
   3647 		/* Handle a branch pop completer.  */
   3648 		case 'P':
   3649 		  if (strncasecmp (s, ",pop", 4) != 0)
   3650 		    break;
   3651 		  s += 4;
   3652 		  continue;
   3653 
   3654 		/* Handle a local processor completer.  */
   3655 		case 'L':
   3656 		  if (strncasecmp (s, ",l", 2) != 0)
   3657 		    break;
   3658 		  s += 2;
   3659 		  continue;
   3660 
   3661 		/* Handle a PROBE read/write completer.  */
   3662 		case 'w':
   3663 		  flag = 0;
   3664 		  if (!strncasecmp (s, ",w", 2))
   3665 		    {
   3666 		      flag = 1;
   3667 		      s += 2;
   3668 		    }
   3669 		  else if (!strncasecmp (s, ",r", 2))
   3670 		    {
   3671 		      flag = 0;
   3672 		      s += 2;
   3673 		    }
   3674 
   3675 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 6);
   3676 
   3677 		/* Handle MFCTL wide completer.  */
   3678 		case 'W':
   3679 		  if (strncasecmp (s, ",w", 2) != 0)
   3680 		    break;
   3681 		  s += 2;
   3682 		  continue;
   3683 
   3684 		/* Handle an RFI restore completer.  */
   3685 		case 'r':
   3686 		  flag = 0;
   3687 		  if (!strncasecmp (s, ",r", 2))
   3688 		    {
   3689 		      flag = 5;
   3690 		      s += 2;
   3691 		    }
   3692 
   3693 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 5);
   3694 
   3695 		/* Handle a system control completer.  */
   3696 		case 'Z':
   3697 		  if (*s == ',' && (*(s + 1) == 'm' || *(s + 1) == 'M'))
   3698 		    {
   3699 		      flag = 1;
   3700 		      s += 2;
   3701 		    }
   3702 		  else
   3703 		    flag = 0;
   3704 
   3705 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 5);
   3706 
   3707 		/* Handle intermediate/final completer for DCOR.  */
   3708 		case 'i':
   3709 		  flag = 0;
   3710 		  if (!strncasecmp (s, ",i", 2))
   3711 		    {
   3712 		      flag = 1;
   3713 		      s += 2;
   3714 		    }
   3715 
   3716 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 6);
   3717 
   3718 		/* Handle zero/sign extension completer.  */
   3719 		case 'z':
   3720 		  flag = 1;
   3721 		  if (!strncasecmp (s, ",z", 2))
   3722 		    {
   3723 		      flag = 0;
   3724 		      s += 2;
   3725 		    }
   3726 
   3727 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 10);
   3728 
   3729 		/* Handle add completer.  */
   3730 		case 'a':
   3731 		  flag = 1;
   3732 		  if (!strncasecmp (s, ",l", 2))
   3733 		    {
   3734 		      flag = 2;
   3735 		      s += 2;
   3736 		    }
   3737 		  else if (!strncasecmp (s, ",tsv", 4))
   3738 		    {
   3739 		      flag = 3;
   3740 		      s += 4;
   3741 		    }
   3742 
   3743 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 10);
   3744 
   3745 		/* Handle 64 bit carry for ADD.  */
   3746 		case 'Y':
   3747 		  flag = 0;
   3748 		  if (!strncasecmp (s, ",dc,tsv", 7) ||
   3749 		      !strncasecmp (s, ",tsv,dc", 7))
   3750 		    {
   3751 		      flag = 1;
   3752 		      s += 7;
   3753 		    }
   3754 		  else if (!strncasecmp (s, ",dc", 3))
   3755 		    {
   3756 		      flag = 0;
   3757 		      s += 3;
   3758 		    }
   3759 		  else
   3760 		    break;
   3761 
   3762 		  /* Condition is not required with "dc".  */
   3763 		  need_cond = 0;
   3764 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
   3765 
   3766 		/* Handle 32 bit carry for ADD.  */
   3767 		case 'y':
   3768 		  flag = 0;
   3769 		  if (!strncasecmp (s, ",c,tsv", 6) ||
   3770 		      !strncasecmp (s, ",tsv,c", 6))
   3771 		    {
   3772 		      flag = 1;
   3773 		      s += 6;
   3774 		    }
   3775 		  else if (!strncasecmp (s, ",c", 2))
   3776 		    {
   3777 		      flag = 0;
   3778 		      s += 2;
   3779 		    }
   3780 		  else
   3781 		    break;
   3782 
   3783 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
   3784 
   3785 		/* Handle trap on signed overflow.  */
   3786 		case 'v':
   3787 		  flag = 0;
   3788 		  if (!strncasecmp (s, ",tsv", 4))
   3789 		    {
   3790 		      flag = 1;
   3791 		      s += 4;
   3792 		    }
   3793 
   3794 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
   3795 
   3796 		/* Handle trap on condition and overflow.  */
   3797 		case 't':
   3798 		  flag = 0;
   3799 		  if (!strncasecmp (s, ",tc,tsv", 7) ||
   3800 		      !strncasecmp (s, ",tsv,tc", 7))
   3801 		    {
   3802 		      flag = 1;
   3803 		      s += 7;
   3804 		    }
   3805 		  else if (!strncasecmp (s, ",tc", 3))
   3806 		    {
   3807 		      flag = 0;
   3808 		      s += 3;
   3809 		    }
   3810 		  else
   3811 		    break;
   3812 
   3813 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
   3814 
   3815 		/* Handle 64 bit borrow for SUB.  */
   3816 		case 'B':
   3817 		  flag = 0;
   3818 		  if (!strncasecmp (s, ",db,tsv", 7) ||
   3819 		      !strncasecmp (s, ",tsv,db", 7))
   3820 		    {
   3821 		      flag = 1;
   3822 		      s += 7;
   3823 		    }
   3824 		  else if (!strncasecmp (s, ",db", 3))
   3825 		    {
   3826 		      flag = 0;
   3827 		      s += 3;
   3828 		    }
   3829 		  else
   3830 		    break;
   3831 
   3832 		  /* Condition is not required with "db".  */
   3833 		  need_cond = 0;
   3834 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
   3835 
   3836 		/* Handle 32 bit borrow for SUB.  */
   3837 		case 'b':
   3838 		  flag = 0;
   3839 		  if (!strncasecmp (s, ",b,tsv", 6) ||
   3840 		      !strncasecmp (s, ",tsv,b", 6))
   3841 		    {
   3842 		      flag = 1;
   3843 		      s += 6;
   3844 		    }
   3845 		  else if (!strncasecmp (s, ",b", 2))
   3846 		    {
   3847 		      flag = 0;
   3848 		      s += 2;
   3849 		    }
   3850 		  else
   3851 		    break;
   3852 
   3853 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
   3854 
   3855 		/* Handle trap condition completer for UADDCM.  */
   3856 		case 'T':
   3857 		  flag = 0;
   3858 		  if (!strncasecmp (s, ",tc", 3))
   3859 		    {
   3860 		      flag = 1;
   3861 		      s += 3;
   3862 		    }
   3863 
   3864 		  INSERT_FIELD_AND_CONTINUE (opcode, flag, 6);
   3865 
   3866 		/* Handle signed/unsigned at 21.  */
   3867 		case 'S':
   3868 		  {
   3869 		    int sign = 1;
   3870 		    if (strncasecmp (s, ",s", 2) == 0)
   3871 		      {
   3872 			sign = 1;
   3873 			s += 2;
   3874 		      }
   3875 		    else if (strncasecmp (s, ",u", 2) == 0)
   3876 		      {
   3877 			sign = 0;
   3878 			s += 2;
   3879 		      }
   3880 
   3881 		    INSERT_FIELD_AND_CONTINUE (opcode, sign, 10);
   3882 		  }
   3883 
   3884 		/* Handle left/right combination at 17:18.  */
   3885 		case 'h':
   3886 		  if (*s++ == ',')
   3887 		    {
   3888 		      int lr = 0;
   3889 		      if (*s == 'r')
   3890 			lr = 2;
   3891 		      else if (*s == 'l')
   3892 			lr = 0;
   3893 		      else
   3894 			as_bad (_("Invalid left/right combination completer"));
   3895 
   3896 		      s++;
   3897 		      INSERT_FIELD_AND_CONTINUE (opcode, lr, 13);
   3898 		    }
   3899 		  else
   3900 		    as_bad (_("Invalid left/right combination completer"));
   3901 		  break;
   3902 
   3903 		/* Handle saturation at 24:25.  */
   3904 		case 'H':
   3905 		  {
   3906 		    int sat = 3;
   3907 		    if (strncasecmp (s, ",ss", 3) == 0)
   3908 		      {
   3909 			sat = 1;
   3910 			s += 3;
   3911 		      }
   3912 		    else if (strncasecmp (s, ",us", 3) == 0)
   3913 		      {
   3914 			sat = 0;
   3915 			s += 3;
   3916 		      }
   3917 
   3918 		    INSERT_FIELD_AND_CONTINUE (opcode, sat, 6);
   3919 		  }
   3920 
   3921 		/* Handle permutation completer.  */
   3922 		case '*':
   3923 		  if (*s++ == ',')
   3924 		    {
   3925 		      int permloc[4];
   3926 		      int perm = 0;
   3927 		      int i = 0;
   3928 		      permloc[0] = 13;
   3929 		      permloc[1] = 10;
   3930 		      permloc[2] = 8;
   3931 		      permloc[3] = 6;
   3932 		      for (; i < 4; i++)
   3933 			{
   3934 			  switch (*s++)
   3935 			    {
   3936 			    case '0':
   3937 			      perm = 0;
   3938 			      break;
   3939 			    case '1':
   3940 			      perm = 1;
   3941 			      break;
   3942 			    case '2':
   3943 			      perm = 2;
   3944 			      break;
   3945 			    case '3':
   3946 			      perm = 3;
   3947 			      break;
   3948 			    default:
   3949 			      as_bad (_("Invalid permutation completer"));
   3950 			    }
   3951 			  opcode |= perm << permloc[i];
   3952 			}
   3953 		      continue;
   3954 		    }
   3955 		  else
   3956 		    as_bad (_("Invalid permutation completer"));
   3957 		  break;
   3958 
   3959 		default:
   3960 		  abort ();
   3961 		}
   3962 	      break;
   3963 
   3964 	    /* Handle all conditions.  */
   3965 	    case '?':
   3966 	      {
   3967 		args++;
   3968 		switch (*args)
   3969 		  {
   3970 		  /* Handle FP compare conditions.  */
   3971 		  case 'f':
   3972 		    cond = pa_parse_fp_cmp_cond (&s);
   3973 		    INSERT_FIELD_AND_CONTINUE (opcode, cond, 0);
   3974 
   3975 		  /* Handle an add condition.  */
   3976 		  case 'A':
   3977 		  case 'a':
   3978 		    cmpltr = 0;
   3979 		    flag = 0;
   3980 		    if (*s == ',')
   3981 		      {
   3982 			s++;
   3983 
   3984 			/* 64 bit conditions.  */
   3985 			if (*args == 'A')
   3986 			  {
   3987 			    if (*s == '*')
   3988 			      s++;
   3989 			    else
   3990 			      break;
   3991 			  }
   3992 			else if (*s == '*')
   3993 			  break;
   3994 
   3995 			name = s;
   3996 			while (*s != ',' && *s != ' ' && *s != '\t')
   3997 			  s += 1;
   3998 			c = *s;
   3999 			*s = 0x00;
   4000 			if (strcmp (name, "=") == 0)
   4001 			  cmpltr = 1;
   4002 			else if (strcmp (name, "<") == 0)
   4003 			  cmpltr = 2;
   4004 			else if (strcmp (name, "<=") == 0)
   4005 			  cmpltr = 3;
   4006 			else if (strcasecmp (name, "nuv") == 0)
   4007 			  cmpltr = 4;
   4008 			else if (strcasecmp (name, "znv") == 0)
   4009 			  cmpltr = 5;
   4010 			else if (strcasecmp (name, "sv") == 0)
   4011 			  cmpltr = 6;
   4012 			else if (strcasecmp (name, "od") == 0)
   4013 			  cmpltr = 7;
   4014 			else if (strcasecmp (name, "tr") == 0)
   4015 			  {
   4016 			    cmpltr = 0;
   4017 			    flag = 1;
   4018 			  }
   4019 			else if (strcmp (name, "<>") == 0)
   4020 			  {
   4021 			    cmpltr = 1;
   4022 			    flag = 1;
   4023 			  }
   4024 			else if (strcmp (name, ">=") == 0)
   4025 			  {
   4026 			    cmpltr = 2;
   4027 			    flag = 1;
   4028 			  }
   4029 			else if (strcmp (name, ">") == 0)
   4030 			  {
   4031 			    cmpltr = 3;
   4032 			    flag = 1;
   4033 			  }
   4034 			else if (strcasecmp (name, "uv") == 0)
   4035 			  {
   4036 			    cmpltr = 4;
   4037 			    flag = 1;
   4038 			  }
   4039 			else if (strcasecmp (name, "vnz") == 0)
   4040 			  {
   4041 			    cmpltr = 5;
   4042 			    flag = 1;
   4043 			  }
   4044 			else if (strcasecmp (name, "nsv") == 0)
   4045 			  {
   4046 			    cmpltr = 6;
   4047 			    flag = 1;
   4048 			  }
   4049 			else if (strcasecmp (name, "ev") == 0)
   4050 			  {
   4051 			    cmpltr = 7;
   4052 			    flag = 1;
   4053 			  }
   4054 			/* ",*" is a valid condition.  */
   4055 			else if (*args == 'a' || *name)
   4056 			  as_bad (_("Invalid Add Condition: %s"), name);
   4057 			*s = c;
   4058 		      }
   4059 		    /* Except with "dc", we have a match failure with
   4060 		       'A' if we don't have a doubleword condition.  */
   4061 		    else if (*args == 'A' && need_cond)
   4062 		      break;
   4063 
   4064 		    opcode |= cmpltr << 13;
   4065 		    INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
   4066 
   4067 		  /* Handle non-negated add and branch condition.  */
   4068 		  case 'd':
   4069 		    cmpltr = pa_parse_nonneg_add_cmpltr (&s);
   4070 		    if (cmpltr < 0)
   4071 		      {
   4072 			as_bad (_("Invalid Add and Branch Condition"));
   4073 			cmpltr = 0;
   4074 		      }
   4075 		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
   4076 
   4077 		  /* Handle 64 bit wide-mode add and branch condition.  */
   4078 		  case 'W':
   4079 		    cmpltr = pa_parse_addb_64_cmpltr (&s);
   4080 		    if (cmpltr < 0)
   4081 		      {
   4082 			as_bad (_("Invalid Add and Branch Condition"));
   4083 			cmpltr = 0;
   4084 		      }
   4085 		    else
   4086 		      {
   4087 			/* Negated condition requires an opcode change.  */
   4088 			opcode |= (cmpltr & 8) << 24;
   4089 		      }
   4090 		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr & 7, 13);
   4091 
   4092 		  /* Handle a negated or non-negated add and branch
   4093 		     condition.  */
   4094 		  case '@':
   4095 		    save_s = s;
   4096 		    cmpltr = pa_parse_nonneg_add_cmpltr (&s);
   4097 		    if (cmpltr < 0)
   4098 		      {
   4099 			s = save_s;
   4100 			cmpltr = pa_parse_neg_add_cmpltr (&s);
   4101 			if (cmpltr < 0)
   4102 			  {
   4103 			    as_bad (_("Invalid Compare/Subtract Condition"));
   4104 			    cmpltr = 0;
   4105 			  }
   4106 			else
   4107 			  {
   4108 			    /* Negated condition requires an opcode change.  */
   4109 			    opcode |= 1 << 27;
   4110 			  }
   4111 		      }
   4112 		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
   4113 
   4114 		  /* Handle branch on bit conditions.  */
   4115 		  case 'B':
   4116 		  case 'b':
   4117 		    cmpltr = 0;
   4118 		    if (*s == ',')
   4119 		      {
   4120 			s++;
   4121 
   4122 			if (*args == 'B')
   4123 			  {
   4124 			    if (*s == '*')
   4125 			      s++;
   4126 			    else
   4127 			      break;
   4128 			  }
   4129 			else if (*s == '*')
   4130 			  break;
   4131 
   4132 			if (strncmp (s, "<", 1) == 0)
   4133 			  {
   4134 			    cmpltr = 0;
   4135 			    s++;
   4136 			  }
   4137 			else if (strncmp (s, ">=", 2) == 0)
   4138 			  {
   4139 			    cmpltr = 1;
   4140 			    s += 2;
   4141 			  }
   4142 			else
   4143 			  as_bad (_("Invalid Branch On Bit Condition: %c"), *s);
   4144 		      }
   4145 		    else
   4146 		      as_bad (_("Missing Branch On Bit Condition"));
   4147 
   4148 		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 15);
   4149 
   4150 		  /* Handle a compare/subtract condition.  */
   4151 		  case 'S':
   4152 		  case 's':
   4153 		    cmpltr = 0;
   4154 		    flag = 0;
   4155 		    if (*s == ',')
   4156 		      {
   4157 			s++;
   4158 
   4159 			/* 64 bit conditions.  */
   4160 			if (*args == 'S')
   4161 			  {
   4162 			    if (*s == '*')
   4163 			      s++;
   4164 			    else
   4165 			      break;
   4166 			  }
   4167 			else if (*s == '*')
   4168 			  break;
   4169 
   4170 			name = s;
   4171 			while (*s != ',' && *s != ' ' && *s != '\t')
   4172 			  s += 1;
   4173 			c = *s;
   4174 			*s = 0x00;
   4175 			if (strcmp (name, "=") == 0)
   4176 			  cmpltr = 1;
   4177 			else if (strcmp (name, "<") == 0)
   4178 			  cmpltr = 2;
   4179 			else if (strcmp (name, "<=") == 0)
   4180 			  cmpltr = 3;
   4181 			else if (strcasecmp (name, "<<") == 0)
   4182 			  cmpltr = 4;
   4183 			else if (strcasecmp (name, "<<=") == 0)
   4184 			  cmpltr = 5;
   4185 			else if (strcasecmp (name, "sv") == 0)
   4186 			  cmpltr = 6;
   4187 			else if (strcasecmp (name, "od") == 0)
   4188 			  cmpltr = 7;
   4189 			else if (strcasecmp (name, "tr") == 0)
   4190 			  {
   4191 			    cmpltr = 0;
   4192 			    flag = 1;
   4193 			  }
   4194 			else if (strcmp (name, "<>") == 0)
   4195 			  {
   4196 			    cmpltr = 1;
   4197 			    flag = 1;
   4198 			  }
   4199 			else if (strcmp (name, ">=") == 0)
   4200 			  {
   4201 			    cmpltr = 2;
   4202 			    flag = 1;
   4203 			  }
   4204 			else if (strcmp (name, ">") == 0)
   4205 			  {
   4206 			    cmpltr = 3;
   4207 			    flag = 1;
   4208 			  }
   4209 			else if (strcasecmp (name, ">>=") == 0)
   4210 			  {
   4211 			    cmpltr = 4;
   4212 			    flag = 1;
   4213 			  }
   4214 			else if (strcasecmp (name, ">>") == 0)
   4215 			  {
   4216 			    cmpltr = 5;
   4217 			    flag = 1;
   4218 			  }
   4219 			else if (strcasecmp (name, "nsv") == 0)
   4220 			  {
   4221 			    cmpltr = 6;
   4222 			    flag = 1;
   4223 			  }
   4224 			else if (strcasecmp (name, "ev") == 0)
   4225 			  {
   4226 			    cmpltr = 7;
   4227 			    flag = 1;
   4228 			  }
   4229 			/* ",*" is a valid condition.  */
   4230 			else if (*args != 'S' || *name)
   4231 			  as_bad (_("Invalid Compare/Subtract Condition: %s"),
   4232 				  name);
   4233 			*s = c;
   4234 		      }
   4235 		    /* Except with "db", we have a match failure with
   4236 		       'S' if we don't have a doubleword condition.  */
   4237 		    else if (*args == 'S' && need_cond)
   4238 		      break;
   4239 
   4240 		    opcode |= cmpltr << 13;
   4241 		    INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
   4242 
   4243 		  /* Handle a non-negated compare condition.  */
   4244 		  case 't':
   4245 		    cmpltr = pa_parse_nonneg_cmpsub_cmpltr (&s);
   4246 		    if (cmpltr < 0)
   4247 		      {
   4248 			as_bad (_("Invalid Compare/Subtract Condition"));
   4249 			cmpltr = 0;
   4250 		      }
   4251 		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
   4252 
   4253 		  /* Handle a 32 bit compare and branch condition.  */
   4254 		  case 'n':
   4255 		    save_s = s;
   4256 		    cmpltr = pa_parse_nonneg_cmpsub_cmpltr (&s);
   4257 		    if (cmpltr < 0)
   4258 		      {
   4259 			s = save_s;
   4260 			cmpltr = pa_parse_neg_cmpsub_cmpltr (&s);
   4261 			if (cmpltr < 0)
   4262 			  {
   4263 			    as_bad (_("Invalid Compare and Branch Condition"));
   4264 			    cmpltr = 0;
   4265 			  }
   4266 			else
   4267 			  {
   4268 			    /* Negated condition requires an opcode change.  */
   4269 			    opcode |= 1 << 27;
   4270 			  }
   4271 		      }
   4272 
   4273 		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
   4274 
   4275 		  /* Handle a 64 bit compare and branch condition.  */
   4276 		  case 'N':
   4277 		    cmpltr = pa_parse_cmpb_64_cmpltr (&s);
   4278 		    if (cmpltr >= 0)
   4279 		      {
   4280 			/* Negated condition requires an opcode change.  */
   4281 			opcode |= (cmpltr & 8) << 26;
   4282 		      }
   4283 		    else
   4284 		      /* Not a 64 bit cond.  Give 32 bit a chance.  */
   4285 		      break;
   4286 
   4287 		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr & 7, 13);
   4288 
   4289 		  /* Handle a 64 bit cmpib condition.  */
   4290 		  case 'Q':
   4291 		    cmpltr = pa_parse_cmpib_64_cmpltr (&s);
   4292 		    if (cmpltr < 0)
   4293 		      /* Not a 64 bit cond.  Give 32 bit a chance.  */
   4294 		      break;
   4295 
   4296 		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
   4297 
   4298 		  /* Handle a logical instruction condition.  */
   4299 		  case 'L':
   4300 		  case 'l':
   4301 		    cmpltr = 0;
   4302 		    flag = 0;
   4303 		    if (*s == ',')
   4304 		      {
   4305 			s++;
   4306 
   4307 			/* 64 bit conditions.  */
   4308 			if (*args == 'L')
   4309 			  {
   4310 			    if (*s == '*')
   4311 			      s++;
   4312 			    else
   4313 			      break;
   4314 			  }
   4315 			else if (*s == '*')
   4316 			  break;
   4317 
   4318 			name = s;
   4319 			while (*s != ',' && *s != ' ' && *s != '\t')
   4320 			  s += 1;
   4321 			c = *s;
   4322 			*s = 0x00;
   4323 
   4324 			if (strcmp (name, "=") == 0)
   4325 			  cmpltr = 1;
   4326 			else if (strcmp (name, "<") == 0)
   4327 			  cmpltr = 2;
   4328 			else if (strcmp (name, "<=") == 0)
   4329 			  cmpltr = 3;
   4330 			else if (strcasecmp (name, "od") == 0)
   4331 			  cmpltr = 7;
   4332 			else if (strcasecmp (name, "tr") == 0)
   4333 			  {
   4334 			    cmpltr = 0;
   4335 			    flag = 1;
   4336 			  }
   4337 			else if (strcmp (name, "<>") == 0)
   4338 			  {
   4339 			    cmpltr = 1;
   4340 			    flag = 1;
   4341 			  }
   4342 			else if (strcmp (name, ">=") == 0)
   4343 			  {
   4344 			    cmpltr = 2;
   4345 			    flag = 1;
   4346 			  }
   4347 			else if (strcmp (name, ">") == 0)
   4348 			  {
   4349 			    cmpltr = 3;
   4350 			    flag = 1;
   4351 			  }
   4352 			else if (strcasecmp (name, "ev") == 0)
   4353 			  {
   4354 			    cmpltr = 7;
   4355 			    flag = 1;
   4356 			  }
   4357 			/* ",*" is a valid condition.  */
   4358 			else if (*args != 'L' || *name)
   4359 			  as_bad (_("Invalid Logical Instruction Condition."));
   4360 			*s = c;
   4361 		      }
   4362 		    /* 32-bit is default for no condition.  */
   4363 		    else if (*args == 'L')
   4364 		      break;
   4365 
   4366 		    opcode |= cmpltr << 13;
   4367 		    INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
   4368 
   4369 		  /* Handle a shift/extract/deposit condition.  */
   4370 		  case 'X':
   4371 		  case 'x':
   4372 		  case 'y':
   4373 		    cmpltr = 0;
   4374 		    /* Check immediate values in shift/extract/deposit
   4375 		     * instructions if they will give undefined behaviour.  */
   4376 		    immediate_check = 1;
   4377 		    if (*s == ',')
   4378 		      {
   4379 			save_s = s++;
   4380 
   4381 			/* 64 bit conditions.  */
   4382 			if (*args == 'X')
   4383 			  {
   4384 			    if (*s == '*')
   4385 			      s++;
   4386 			    else
   4387 			      break;
   4388 			  }
   4389 			else if (*s == '*')
   4390 			  break;
   4391 
   4392 			name = s;
   4393 			while (*s != ',' && *s != ' ' && *s != '\t')
   4394 			  s += 1;
   4395 			c = *s;
   4396 			*s = 0x00;
   4397 			if (strcmp (name, "=") == 0)
   4398 			  cmpltr = 1;
   4399 			else if (strcmp (name, "<") == 0)
   4400 			  cmpltr = 2;
   4401 			else if (strcasecmp (name, "od") == 0)
   4402 			  cmpltr = 3;
   4403 			else if (strcasecmp (name, "tr") == 0)
   4404 			  cmpltr = 4;
   4405 			else if (strcmp (name, "<>") == 0)
   4406 			  cmpltr = 5;
   4407 			else if (strcmp (name, ">=") == 0)
   4408 			  cmpltr = 6;
   4409 			else if (strcasecmp (name, "ev") == 0)
   4410 			  cmpltr = 7;
   4411 			/* Handle movb,n.  Put things back the way they were.
   4412 			   This includes moving s back to where it started.  */
   4413 			else if (strcasecmp (name, "n") == 0 && *args == 'y')
   4414 			  {
   4415 			    *s = c;
   4416 			    s = save_s;
   4417 			    continue;
   4418 			  }
   4419 			/* ",*" is a valid condition.  */
   4420 			else if (*args != 'X' || *name)
   4421 			  as_bad (_("Invalid Shift/Extract/Deposit Condition."));
   4422 			*s = c;
   4423 		      }
   4424 
   4425 		    INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
   4426 
   4427 		  /* Handle a unit instruction condition.  */
   4428 		  case 'U':
   4429 		  case 'u':
   4430 		    cmpltr = 0;
   4431 		    flag = 0;
   4432 		    if (*s == ',')
   4433 		      {
   4434 			int uxor;
   4435 			s++;
   4436 
   4437 			/* 64 bit conditions.  */
   4438 			if (*args == 'U')
   4439 			  {
   4440 			    if (*s == '*')
   4441 			      s++;
   4442 			    else
   4443 			      break;
   4444 			  }
   4445 			else if (*s == '*')
   4446 			  break;
   4447 
   4448 			/* The uxor instruction only supports unit conditions
   4449 			   not involving carries.  */
   4450 			uxor = (opcode & 0xfc000fc0) == 0x08000380;
   4451 			if (strncasecmp (s, "sbz", 3) == 0)
   4452 			  {
   4453 			    cmpltr = 2;
   4454 			    s += 3;
   4455 			  }
   4456 			else if (strncasecmp (s, "shz", 3) == 0)
   4457 			  {
   4458 			    cmpltr = 3;
   4459 			    s += 3;
   4460 			  }
   4461 			else if (!uxor && strncasecmp (s, "sdc", 3) == 0)
   4462 			  {
   4463 			    cmpltr = 4;
   4464 			    s += 3;
   4465 			  }
   4466 			else if (!uxor && strncasecmp (s, "sbc", 3) == 0)
   4467 			  {
   4468 			    cmpltr = 6;
   4469 			    s += 3;
   4470 			  }
   4471 			else if (!uxor && strncasecmp (s, "shc", 3) == 0)
   4472 			  {
   4473 			    cmpltr = 7;
   4474 			    s += 3;
   4475 			  }
   4476 			else if (strncasecmp (s, "tr", 2) == 0)
   4477 			  {
   4478 			    cmpltr = 0;
   4479 			    flag = 1;
   4480 			    s += 2;
   4481 			  }
   4482 			else if (strncasecmp (s, "nbz", 3) == 0)
   4483 			  {
   4484 			    cmpltr = 2;
   4485 			    flag = 1;
   4486 			    s += 3;
   4487 			  }
   4488 			else if (strncasecmp (s, "nhz", 3) == 0)
   4489 			  {
   4490 			    cmpltr = 3;
   4491 			    flag = 1;
   4492 			    s += 3;
   4493 			  }
   4494 			else if (!uxor && strncasecmp (s, "ndc", 3) == 0)
   4495 			  {
   4496 			    cmpltr = 4;
   4497 			    flag = 1;
   4498 			    s += 3;
   4499 			  }
   4500 			else if (!uxor && strncasecmp (s, "nbc", 3) == 0)
   4501 			  {
   4502 			    cmpltr = 6;
   4503 			    flag = 1;
   4504 			    s += 3;
   4505 			  }
   4506 			else if (!uxor && strncasecmp (s, "nhc", 3) == 0)
   4507 			  {
   4508 			    cmpltr = 7;
   4509 			    flag = 1;
   4510 			    s += 3;
   4511 			  }
   4512 			else if (strncasecmp (s, "swz", 3) == 0)
   4513 			  {
   4514 			    cmpltr = 1;
   4515 			    flag = 0;
   4516 			    s += 3;
   4517 			  }
   4518 			else if (!uxor && strncasecmp (s, "swc", 3) == 0)
   4519 			  {
   4520 			    cmpltr = 5;
   4521 			    flag = 0;
   4522 			    s += 3;
   4523 			  }
   4524 			else if (strncasecmp (s, "nwz", 3) == 0)
   4525 			  {
   4526 			    cmpltr = 1;
   4527 			    flag = 1;
   4528 			    s += 3;
   4529 			  }
   4530 			else if (!uxor && strncasecmp (s, "nwc", 3) == 0)
   4531 			  {
   4532 			    cmpltr = 5;
   4533 			    flag = 1;
   4534 			    s += 3;
   4535 			  }
   4536 			/* ",*" is a valid condition.  */
   4537 			else if (*args != 'U' || (*s != ' ' && *s != '\t'))
   4538 			  as_bad (_("Invalid Unit Instruction Condition."));
   4539 		      }
   4540 		    /* 32-bit is default for no condition.  */
   4541 		    else if (*args == 'U')
   4542 		      break;
   4543 
   4544 		    opcode |= cmpltr << 13;
   4545 		    INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
   4546 
   4547 		  default:
   4548 		    abort ();
   4549 		  }
   4550 		break;
   4551 	      }
   4552 
   4553 	    /* Handle a nullification completer for branch instructions.  */
   4554 	    case 'n':
   4555 	      nullif = pa_parse_nullif (&s);
   4556 	      INSERT_FIELD_AND_CONTINUE (opcode, nullif, 1);
   4557 
   4558 	    /* Handle a nullification completer for copr and spop insns.  */
   4559 	    case 'N':
   4560 	      nullif = pa_parse_nullif (&s);
   4561 	      INSERT_FIELD_AND_CONTINUE (opcode, nullif, 5);
   4562 
   4563 	    /* Handle ,%r2 completer for new syntax branches.  */
   4564 	    case 'L':
   4565 	      if (*s == ',' && strncasecmp (s + 1, "%r2", 3) == 0)
   4566 		s += 4;
   4567 	      else if (*s == ',' && strncasecmp (s + 1, "%rp", 3) == 0)
   4568 		s += 4;
   4569 	      else
   4570 		break;
   4571 	      continue;
   4572 
   4573 	    /* Handle 3 bit entry into the fp compare array.   Valid values
   4574 	       are 0..6 inclusive.  */
   4575 	    case 'h':
   4576 	      get_expression (s);
   4577 	      s = expr_end;
   4578 	      if (the_insn.exp.X_op == O_constant)
   4579 		{
   4580 		  num = evaluate_absolute (&the_insn);
   4581 		  CHECK_FIELD (num, 6, 0, 0);
   4582 		  num++;
   4583 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 13);
   4584 		}
   4585 	      else
   4586 		break;
   4587 
   4588 	    /* Handle 3 bit entry into the fp compare array.   Valid values
   4589 	       are 0..6 inclusive.  */
   4590 	    case 'm':
   4591 	      get_expression (s);
   4592 	      if (the_insn.exp.X_op == O_constant)
   4593 		{
   4594 		  s = expr_end;
   4595 		  num = evaluate_absolute (&the_insn);
   4596 		  CHECK_FIELD (num, 6, 0, 0);
   4597 		  num = (num + 1) ^ 1;
   4598 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 13);
   4599 		}
   4600 	      else
   4601 		break;
   4602 
   4603 	    /* Handle graphics test completers for ftest */
   4604 	    case '=':
   4605 	      {
   4606 		num = pa_parse_ftest_gfx_completer (&s);
   4607 		INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   4608 	      }
   4609 
   4610 	    /* Handle a 11 bit immediate at 31.  */
   4611 	    case 'i':
   4612 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4613 	      get_expression (s);
   4614 	      s = expr_end;
   4615 	      if (the_insn.exp.X_op == O_constant)
   4616 		{
   4617 		  num = evaluate_absolute (&the_insn);
   4618 		  CHECK_FIELD (num, 1023, -1024, 0);
   4619 		  num = low_sign_unext (num, 11);
   4620 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   4621 		}
   4622 	      else
   4623 		{
   4624 		  if (is_DP_relative (the_insn.exp))
   4625 		    the_insn.reloc = R_HPPA_GOTOFF;
   4626 		  else if (is_PC_relative (the_insn.exp))
   4627 		    the_insn.reloc = R_HPPA_PCREL_CALL;
   4628 #ifdef OBJ_ELF
   4629 		  else if (is_tls_gdidx (the_insn.exp))
   4630 		    the_insn.reloc = R_PARISC_TLS_GD21L;
   4631 		  else if (is_tls_ldidx (the_insn.exp))
   4632 		    the_insn.reloc = R_PARISC_TLS_LDM21L;
   4633 		  else if (is_tls_dtpoff (the_insn.exp))
   4634 		    the_insn.reloc = R_PARISC_TLS_LDO21L;
   4635 		  else if (is_tls_ieoff (the_insn.exp))
   4636 		    the_insn.reloc = R_PARISC_TLS_IE21L;
   4637 		  else if (is_tls_leoff (the_insn.exp))
   4638 		    the_insn.reloc = R_PARISC_TLS_LE21L;
   4639 #endif
   4640 		  else
   4641 		    the_insn.reloc = R_HPPA;
   4642 		  the_insn.format = 11;
   4643 		  continue;
   4644 		}
   4645 
   4646 	    /* Handle a 14 bit immediate at 31.  */
   4647 	    case 'J':
   4648 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4649 	      get_expression (s);
   4650 	      s = expr_end;
   4651 	      if (the_insn.exp.X_op == O_constant)
   4652 		{
   4653 		  int mb;
   4654 
   4655 		  /* XXX the completer stored away tidbits of information
   4656 		     for us to extract.  We need a cleaner way to do this.
   4657 		     Now that we have lots of letters again, it would be
   4658 		     good to rethink this.  */
   4659 		  mb = opcode & 1;
   4660 		  opcode -= mb;
   4661 		  num = evaluate_absolute (&the_insn);
   4662 		  if (mb != (num < 0))
   4663 		    break;
   4664 		  CHECK_FIELD (num, 8191, -8192, 0);
   4665 		  num = low_sign_unext (num, 14);
   4666 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   4667 		}
   4668 	      break;
   4669 
   4670 	    /* Handle a 14 bit immediate at 31.  */
   4671 	    case 'K':
   4672 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4673 	      get_expression (s);
   4674 	      s = expr_end;
   4675 	      if (the_insn.exp.X_op == O_constant)
   4676 		{
   4677 		  int mb;
   4678 
   4679 		  mb = opcode & 1;
   4680 		  opcode -= mb;
   4681 		  num = evaluate_absolute (&the_insn);
   4682 		  if (mb == (num < 0))
   4683 		    break;
   4684 		  if (num % 4)
   4685 		    break;
   4686 		  CHECK_FIELD (num, 8191, -8192, 0);
   4687 		  num = low_sign_unext (num, 14);
   4688 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   4689 		}
   4690 	      break;
   4691 
   4692 	    /* Handle a 16 bit immediate at 31.  */
   4693 	    case '<':
   4694 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4695 	      get_expression (s);
   4696 	      s = expr_end;
   4697 	      if (the_insn.exp.X_op == O_constant)
   4698 		{
   4699 		  int mb;
   4700 
   4701 		  mb = opcode & 1;
   4702 		  opcode -= mb;
   4703 		  num = evaluate_absolute (&the_insn);
   4704 		  if (mb != (num < 0))
   4705 		    break;
   4706 		  CHECK_FIELD (num, 32767, -32768, 0);
   4707 		  num = re_assemble_16 (num);
   4708 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   4709 		}
   4710 	      break;
   4711 
   4712 	    /* Handle a 16 bit immediate at 31.  */
   4713 	    case '>':
   4714 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4715 	      get_expression (s);
   4716 	      s = expr_end;
   4717 	      if (the_insn.exp.X_op == O_constant)
   4718 		{
   4719 		  int mb;
   4720 
   4721 		  mb = opcode & 1;
   4722 		  opcode -= mb;
   4723 		  num = evaluate_absolute (&the_insn);
   4724 		  if (mb == (num < 0))
   4725 		    break;
   4726 		  if (num % 4)
   4727 		    break;
   4728 		  CHECK_FIELD (num, 32767, -32768, 0);
   4729 		  num = re_assemble_16 (num);
   4730 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   4731 		}
   4732 	      break;
   4733 
   4734 	    /* Handle 14 bit immediate, shifted left three times.  */
   4735 	    case '#':
   4736 	      if (bfd_get_mach (stdoutput) != pa20)
   4737 		break;
   4738 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4739 	      get_expression (s);
   4740 	      s = expr_end;
   4741 	      if (the_insn.exp.X_op == O_constant)
   4742 		{
   4743 		  num = evaluate_absolute (&the_insn);
   4744 		  if (num & 0x7)
   4745 		    break;
   4746 		  CHECK_FIELD (num, 8191, -8192, 0);
   4747 		  if (num < 0)
   4748 		    opcode |= 1;
   4749 		  num &= 0x1fff;
   4750 		  num >>= 3;
   4751 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 4);
   4752 		}
   4753 	      else
   4754 		{
   4755 		  if (is_DP_relative (the_insn.exp))
   4756 		    the_insn.reloc = R_HPPA_GOTOFF;
   4757 		  else if (is_PC_relative (the_insn.exp))
   4758 		    the_insn.reloc = R_HPPA_PCREL_CALL;
   4759 #ifdef OBJ_ELF
   4760 		  else if (is_tls_gdidx (the_insn.exp))
   4761 		    the_insn.reloc = R_PARISC_TLS_GD21L;
   4762 		  else if (is_tls_ldidx (the_insn.exp))
   4763 		    the_insn.reloc = R_PARISC_TLS_LDM21L;
   4764 		  else if (is_tls_dtpoff (the_insn.exp))
   4765 		    the_insn.reloc = R_PARISC_TLS_LDO21L;
   4766 		  else if (is_tls_ieoff (the_insn.exp))
   4767 		    the_insn.reloc = R_PARISC_TLS_IE21L;
   4768 		  else if (is_tls_leoff (the_insn.exp))
   4769 		    the_insn.reloc = R_PARISC_TLS_LE21L;
   4770 #endif
   4771 		  else
   4772 		    the_insn.reloc = R_HPPA;
   4773 		  the_insn.format = 14;
   4774 		  continue;
   4775 		}
   4776 	      break;
   4777 
   4778 	    /* Handle 14 bit immediate, shifted left twice.  */
   4779 	    case 'd':
   4780 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4781 	      get_expression (s);
   4782 	      s = expr_end;
   4783 	      if (the_insn.exp.X_op == O_constant)
   4784 		{
   4785 		  num = evaluate_absolute (&the_insn);
   4786 		  if (num & 0x3)
   4787 		    break;
   4788 		  CHECK_FIELD (num, 8191, -8192, 0);
   4789 		  if (num < 0)
   4790 		    opcode |= 1;
   4791 		  num &= 0x1fff;
   4792 		  num >>= 2;
   4793 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 3);
   4794 		}
   4795 	      else
   4796 		{
   4797 		  if (is_DP_relative (the_insn.exp))
   4798 		    the_insn.reloc = R_HPPA_GOTOFF;
   4799 		  else if (is_PC_relative (the_insn.exp))
   4800 		    the_insn.reloc = R_HPPA_PCREL_CALL;
   4801 #ifdef OBJ_ELF
   4802 		  else if (is_tls_gdidx (the_insn.exp))
   4803 		    the_insn.reloc = R_PARISC_TLS_GD21L;
   4804 		  else if (is_tls_ldidx (the_insn.exp))
   4805 		    the_insn.reloc = R_PARISC_TLS_LDM21L;
   4806 		  else if (is_tls_dtpoff (the_insn.exp))
   4807 		    the_insn.reloc = R_PARISC_TLS_LDO21L;
   4808 		  else if (is_tls_ieoff (the_insn.exp))
   4809 		    the_insn.reloc = R_PARISC_TLS_IE21L;
   4810 		  else if (is_tls_leoff (the_insn.exp))
   4811 		    the_insn.reloc = R_PARISC_TLS_LE21L;
   4812 #endif
   4813 		  else
   4814 		    the_insn.reloc = R_HPPA;
   4815 		  the_insn.format = 14;
   4816 		  continue;
   4817 		}
   4818 
   4819 	    /* Handle a 14 bit immediate at 31.  */
   4820 	    case 'j':
   4821 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4822 	      get_expression (s);
   4823 	      s = expr_end;
   4824 	      if (the_insn.exp.X_op == O_constant)
   4825 		{
   4826 		  num = evaluate_absolute (&the_insn);
   4827 		  CHECK_FIELD (num, 8191, -8192, 0);
   4828 		  num = low_sign_unext (num, 14);
   4829 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   4830 		}
   4831 	      else
   4832 		{
   4833 		  if (is_DP_relative (the_insn.exp))
   4834 		    the_insn.reloc = R_HPPA_GOTOFF;
   4835 		  else if (is_PC_relative (the_insn.exp))
   4836 		    the_insn.reloc = R_HPPA_PCREL_CALL;
   4837 #ifdef OBJ_ELF
   4838 		  else if (is_tls_gdidx (the_insn.exp))
   4839 		    the_insn.reloc = R_PARISC_TLS_GD21L;
   4840 		  else if (is_tls_ldidx (the_insn.exp))
   4841 		    the_insn.reloc = R_PARISC_TLS_LDM21L;
   4842 		  else if (is_tls_dtpoff (the_insn.exp))
   4843 		    the_insn.reloc = R_PARISC_TLS_LDO21L;
   4844 		  else if (is_tls_ieoff (the_insn.exp))
   4845 		    the_insn.reloc = R_PARISC_TLS_IE21L;
   4846 		  else if (is_tls_leoff (the_insn.exp))
   4847 		    the_insn.reloc = R_PARISC_TLS_LE21L;
   4848 #endif
   4849 		  else
   4850 		    the_insn.reloc = R_HPPA;
   4851 		  the_insn.format = 14;
   4852 		  continue;
   4853 		}
   4854 
   4855 	    /* Handle a 21 bit immediate at 31.  */
   4856 	    case 'k':
   4857 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4858 	      get_expression (s);
   4859 	      s = expr_end;
   4860 	      if (the_insn.exp.X_op == O_constant)
   4861 		{
   4862 		  num = evaluate_absolute (&the_insn);
   4863 		  CHECK_FIELD (num >> 11, 1048575, -1048576, 0);
   4864 		  opcode |= re_assemble_21 (num);
   4865 		  continue;
   4866 		}
   4867 	      else
   4868 		{
   4869 		  if (is_DP_relative (the_insn.exp))
   4870 		    the_insn.reloc = R_HPPA_GOTOFF;
   4871 		  else if (is_PC_relative (the_insn.exp))
   4872 		    the_insn.reloc = R_HPPA_PCREL_CALL;
   4873 #ifdef OBJ_ELF
   4874 		  else if (is_tls_gdidx (the_insn.exp))
   4875 		    the_insn.reloc = R_PARISC_TLS_GD21L;
   4876 		  else if (is_tls_ldidx (the_insn.exp))
   4877 		    the_insn.reloc = R_PARISC_TLS_LDM21L;
   4878 		  else if (is_tls_dtpoff (the_insn.exp))
   4879 		    the_insn.reloc = R_PARISC_TLS_LDO21L;
   4880 		  else if (is_tls_ieoff (the_insn.exp))
   4881 		    the_insn.reloc = R_PARISC_TLS_IE21L;
   4882 		  else if (is_tls_leoff (the_insn.exp))
   4883 		    the_insn.reloc = R_PARISC_TLS_LE21L;
   4884 #endif
   4885 		  else
   4886 		    the_insn.reloc = R_HPPA;
   4887 		  the_insn.format = 21;
   4888 		  continue;
   4889 		}
   4890 
   4891 	    /* Handle a 16 bit immediate at 31 (PA 2.0 wide mode only).  */
   4892 	    case 'l':
   4893 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4894 	      get_expression (s);
   4895 	      s = expr_end;
   4896 	      if (the_insn.exp.X_op == O_constant)
   4897 		{
   4898 		  num = evaluate_absolute (&the_insn);
   4899 		  CHECK_FIELD (num, 32767, -32768, 0);
   4900 		  opcode |= re_assemble_16 (num);
   4901 		  continue;
   4902 		}
   4903 	      else
   4904 		{
   4905 		  /* ??? Is this valid for wide mode?  */
   4906 		  if (is_DP_relative (the_insn.exp))
   4907 		    the_insn.reloc = R_HPPA_GOTOFF;
   4908 		  else if (is_PC_relative (the_insn.exp))
   4909 		    the_insn.reloc = R_HPPA_PCREL_CALL;
   4910 #ifdef OBJ_ELF
   4911 		  else if (is_tls_gdidx (the_insn.exp))
   4912 		    the_insn.reloc = R_PARISC_TLS_GD21L;
   4913 		  else if (is_tls_ldidx (the_insn.exp))
   4914 		    the_insn.reloc = R_PARISC_TLS_LDM21L;
   4915 		  else if (is_tls_dtpoff (the_insn.exp))
   4916 		    the_insn.reloc = R_PARISC_TLS_LDO21L;
   4917 		  else if (is_tls_ieoff (the_insn.exp))
   4918 		    the_insn.reloc = R_PARISC_TLS_IE21L;
   4919 		  else if (is_tls_leoff (the_insn.exp))
   4920 		    the_insn.reloc = R_PARISC_TLS_LE21L;
   4921 #endif
   4922 		  else
   4923 		    the_insn.reloc = R_HPPA;
   4924 		  the_insn.format = 14;
   4925 		  continue;
   4926 		}
   4927 
   4928 	    /* Handle a word-aligned 16-bit imm. at 31 (PA2.0 wide).  */
   4929 	    case 'y':
   4930 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4931 	      get_expression (s);
   4932 	      s = expr_end;
   4933 	      if (the_insn.exp.X_op == O_constant)
   4934 		{
   4935 		  num = evaluate_absolute (&the_insn);
   4936 		  CHECK_FIELD (num, 32767, -32768, 0);
   4937 		  CHECK_ALIGN (num, 4, 0);
   4938 		  opcode |= re_assemble_16 (num);
   4939 		  continue;
   4940 		}
   4941 	      else
   4942 		{
   4943 		  /* ??? Is this valid for wide mode?  */
   4944 		  if (is_DP_relative (the_insn.exp))
   4945 		    the_insn.reloc = R_HPPA_GOTOFF;
   4946 		  else if (is_PC_relative (the_insn.exp))
   4947 		    the_insn.reloc = R_HPPA_PCREL_CALL;
   4948 #ifdef OBJ_ELF
   4949 		  else if (is_tls_gdidx (the_insn.exp))
   4950 		    the_insn.reloc = R_PARISC_TLS_GD21L;
   4951 		  else if (is_tls_ldidx (the_insn.exp))
   4952 		    the_insn.reloc = R_PARISC_TLS_LDM21L;
   4953 		  else if (is_tls_dtpoff (the_insn.exp))
   4954 		    the_insn.reloc = R_PARISC_TLS_LDO21L;
   4955 		  else if (is_tls_ieoff (the_insn.exp))
   4956 		    the_insn.reloc = R_PARISC_TLS_IE21L;
   4957 		  else if (is_tls_leoff (the_insn.exp))
   4958 		    the_insn.reloc = R_PARISC_TLS_LE21L;
   4959 #endif
   4960 		  else
   4961 		    the_insn.reloc = R_HPPA;
   4962 		  the_insn.format = 14;
   4963 		  continue;
   4964 		}
   4965 
   4966 	    /* Handle a dword-aligned 16-bit imm. at 31 (PA2.0 wide).  */
   4967 	    case '&':
   4968 	      the_insn.field_selector = pa_chk_field_selector (&s);
   4969 	      get_expression (s);
   4970 	      s = expr_end;
   4971 	      if (the_insn.exp.X_op == O_constant)
   4972 		{
   4973 		  num = evaluate_absolute (&the_insn);
   4974 		  CHECK_FIELD (num, 32767, -32768, 0);
   4975 		  CHECK_ALIGN (num, 8, 0);
   4976 		  opcode |= re_assemble_16 (num);
   4977 		  continue;
   4978 		}
   4979 	      else
   4980 		{
   4981 		  /* ??? Is this valid for wide mode?  */
   4982 		  if (is_DP_relative (the_insn.exp))
   4983 		    the_insn.reloc = R_HPPA_GOTOFF;
   4984 		  else if (is_PC_relative (the_insn.exp))
   4985 		    the_insn.reloc = R_HPPA_PCREL_CALL;
   4986 #ifdef OBJ_ELF
   4987 		  else if (is_tls_gdidx (the_insn.exp))
   4988 		    the_insn.reloc = R_PARISC_TLS_GD21L;
   4989 		  else if (is_tls_ldidx (the_insn.exp))
   4990 		    the_insn.reloc = R_PARISC_TLS_LDM21L;
   4991 		  else if (is_tls_dtpoff (the_insn.exp))
   4992 		    the_insn.reloc = R_PARISC_TLS_LDO21L;
   4993 		  else if (is_tls_ieoff (the_insn.exp))
   4994 		    the_insn.reloc = R_PARISC_TLS_IE21L;
   4995 		  else if (is_tls_leoff (the_insn.exp))
   4996 		    the_insn.reloc = R_PARISC_TLS_LE21L;
   4997 #endif
   4998 		  else
   4999 		    the_insn.reloc = R_HPPA;
   5000 		  the_insn.format = 14;
   5001 		  continue;
   5002 		}
   5003 
   5004 	    /* Handle a 12 bit branch displacement.  */
   5005 	    case 'w':
   5006 	      the_insn.field_selector = pa_chk_field_selector (&s);
   5007 	      get_expression (s);
   5008 	      s = expr_end;
   5009 	      the_insn.pcrel = 1;
   5010 	      if (!the_insn.exp.X_add_symbol
   5011 		  || !strcmp (S_GET_NAME (the_insn.exp.X_add_symbol),
   5012 			      FAKE_LABEL_NAME))
   5013 		{
   5014 		  num = evaluate_absolute (&the_insn);
   5015 		  if (num % 4)
   5016 		    {
   5017 		      as_bad (_("Branch to unaligned address"));
   5018 		      break;
   5019 		    }
   5020 		  if (the_insn.exp.X_add_symbol)
   5021 		    num -= 8;
   5022 		  CHECK_FIELD (num, 8191, -8192, 0);
   5023 		  opcode |= re_assemble_12 (num >> 2);
   5024 		  continue;
   5025 		}
   5026 	      else
   5027 		{
   5028 		  the_insn.reloc = R_HPPA_PCREL_CALL;
   5029 		  the_insn.format = 12;
   5030 		  the_insn.arg_reloc = last_call_desc.arg_reloc;
   5031 		  memset (&last_call_desc, 0, sizeof (struct call_desc));
   5032 		  s = expr_end;
   5033 		  continue;
   5034 		}
   5035 
   5036 	    /* Handle a 17 bit branch displacement.  */
   5037 	    case 'W':
   5038 	      the_insn.field_selector = pa_chk_field_selector (&s);
   5039 	      get_expression (s);
   5040 	      s = expr_end;
   5041 	      the_insn.pcrel = 1;
   5042 	      if (!the_insn.exp.X_add_symbol
   5043 		  || !strcmp (S_GET_NAME (the_insn.exp.X_add_symbol),
   5044 			      FAKE_LABEL_NAME))
   5045 		{
   5046 		  num = evaluate_absolute (&the_insn);
   5047 		  if (num % 4)
   5048 		    {
   5049 		      as_bad (_("Branch to unaligned address"));
   5050 		      break;
   5051 		    }
   5052 		  if (the_insn.exp.X_add_symbol)
   5053 		    num -= 8;
   5054 		  CHECK_FIELD (num, 262143, -262144, 0);
   5055 		  opcode |= re_assemble_17 (num >> 2);
   5056 		  continue;
   5057 		}
   5058 	      else
   5059 		{
   5060 		  the_insn.reloc = R_HPPA_PCREL_CALL;
   5061 		  the_insn.format = 17;
   5062 		  the_insn.arg_reloc = last_call_desc.arg_reloc;
   5063 		  memset (&last_call_desc, 0, sizeof (struct call_desc));
   5064 		  continue;
   5065 		}
   5066 
   5067 	    /* Handle a 22 bit branch displacement.  */
   5068 	    case 'X':
   5069 	      the_insn.field_selector = pa_chk_field_selector (&s);
   5070 	      get_expression (s);
   5071 	      s = expr_end;
   5072 	      the_insn.pcrel = 1;
   5073 	      if (!the_insn.exp.X_add_symbol
   5074 		  || !strcmp (S_GET_NAME (the_insn.exp.X_add_symbol),
   5075 			      FAKE_LABEL_NAME))
   5076 		{
   5077 		  num = evaluate_absolute (&the_insn);
   5078 		  if (num % 4)
   5079 		    {
   5080 		      as_bad (_("Branch to unaligned address"));
   5081 		      break;
   5082 		    }
   5083 		  if (the_insn.exp.X_add_symbol)
   5084 		    num -= 8;
   5085 		  CHECK_FIELD (num, 8388607, -8388608, 0);
   5086 		  opcode |= re_assemble_22 (num >> 2);
   5087 		}
   5088 	      else
   5089 		{
   5090 		  the_insn.reloc = R_HPPA_PCREL_CALL;
   5091 		  the_insn.format = 22;
   5092 		  the_insn.arg_reloc = last_call_desc.arg_reloc;
   5093 		  memset (&last_call_desc, 0, sizeof (struct call_desc));
   5094 		  continue;
   5095 		}
   5096 
   5097 	    /* Handle an absolute 17 bit branch target.  */
   5098 	    case 'z':
   5099 	      the_insn.field_selector = pa_chk_field_selector (&s);
   5100 	      get_expression (s);
   5101 	      s = expr_end;
   5102 	      the_insn.pcrel = 0;
   5103 	      if (!the_insn.exp.X_add_symbol
   5104 		  || !strcmp (S_GET_NAME (the_insn.exp.X_add_symbol),
   5105 			      FAKE_LABEL_NAME))
   5106 		{
   5107 		  num = evaluate_absolute (&the_insn);
   5108 		  if (num % 4)
   5109 		    {
   5110 		      as_bad (_("Branch to unaligned address"));
   5111 		      break;
   5112 		    }
   5113 		  if (the_insn.exp.X_add_symbol)
   5114 		    num -= 8;
   5115 		  CHECK_FIELD (num, 262143, -262144, 0);
   5116 		  opcode |= re_assemble_17 (num >> 2);
   5117 		  continue;
   5118 		}
   5119 	      else
   5120 		{
   5121 		  the_insn.reloc = R_HPPA_ABS_CALL;
   5122 		  the_insn.format = 17;
   5123 		  the_insn.arg_reloc = last_call_desc.arg_reloc;
   5124 		  memset (&last_call_desc, 0, sizeof (struct call_desc));
   5125 		  continue;
   5126 		}
   5127 
   5128 	    /* Handle '%r1' implicit operand of addil instruction.  */
   5129 	    case 'Z':
   5130 	      if (*s == ',' && *(s + 1) == '%' && *(s + 3) == '1'
   5131 		  && (*(s + 2) == 'r' || *(s + 2) == 'R'))
   5132 		{
   5133 		  s += 4;
   5134 		  continue;
   5135 		}
   5136 	      else
   5137 		break;
   5138 
   5139 	    /* Handle '%sr0,%r31' implicit operand of be,l instruction.  */
   5140 	    case 'Y':
   5141 	      if (strncasecmp (s, "%sr0,%r31", 9) != 0)
   5142 		break;
   5143 	      s += 9;
   5144 	      continue;
   5145 
   5146 	    /* Handle immediate value of 0 for ordered load/store instructions.  */
   5147 	    case '@':
   5148 	      if (*s != '0')
   5149 		break;
   5150 	      s++;
   5151 	      continue;
   5152 
   5153 	    /* Handle a 2 bit shift count at 25.  */
   5154 	    case '.':
   5155 	      num = pa_get_absolute_expression (&the_insn, &s);
   5156 	      if (strict && the_insn.exp.X_op != O_constant)
   5157 		break;
   5158 	      s = expr_end;
   5159 	      CHECK_FIELD (num, 3, 1, strict);
   5160 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 6);
   5161 
   5162 	    /* Handle a 4 bit shift count at 25.  */
   5163 	    case '*':
   5164 	      num = pa_get_absolute_expression (&the_insn, &s);
   5165 	      if (strict && the_insn.exp.X_op != O_constant)
   5166 		break;
   5167 	      s = expr_end;
   5168 	      CHECK_FIELD (num, 15, 0, strict);
   5169 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 6);
   5170 
   5171 	    /* Handle a 5 bit shift count at 26.  */
   5172 	    case 'p':
   5173 	      num = pa_get_absolute_expression (&the_insn, &s);
   5174 	      if (strict && the_insn.exp.X_op != O_constant)
   5175 		break;
   5176 	      s = expr_end;
   5177 	      CHECK_FIELD (num, 31, 0, strict);
   5178 	      SAVE_IMMEDIATE(num);
   5179 	      INSERT_FIELD_AND_CONTINUE (opcode, 31 - num, 5);
   5180 
   5181 	    /* Handle a 6 bit shift count at 20,22:26.  */
   5182 	    case '~':
   5183 	      num = pa_get_absolute_expression (&the_insn, &s);
   5184 	      if (strict && the_insn.exp.X_op != O_constant)
   5185 		break;
   5186 	      s = expr_end;
   5187 	      CHECK_FIELD (num, 63, 0, strict);
   5188 	      SAVE_IMMEDIATE(num);
   5189 	      num = 63 - num;
   5190 	      opcode |= (num & 0x20) << 6;
   5191 	      INSERT_FIELD_AND_CONTINUE (opcode, num & 0x1f, 5);
   5192 
   5193 	    /* Handle a 6 bit field length at 23,27:31.  */
   5194 	    case '%':
   5195 	      flag = 0;
   5196 	      num = pa_get_absolute_expression (&the_insn, &s);
   5197 	      if (strict && the_insn.exp.X_op != O_constant)
   5198 		break;
   5199 	      s = expr_end;
   5200 	      CHECK_FIELD (num, 64, 1, strict);
   5201 	      SAVE_IMMEDIATE(num);
   5202 	      num--;
   5203 	      opcode |= (num & 0x20) << 3;
   5204 	      num = 31 - (num & 0x1f);
   5205 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   5206 
   5207 	    /* Handle a 6 bit field length at 19,27:31.  */
   5208 	    case '|':
   5209 	      num = pa_get_absolute_expression (&the_insn, &s);
   5210 	      if (strict && the_insn.exp.X_op != O_constant)
   5211 		break;
   5212 	      s = expr_end;
   5213 	      CHECK_FIELD (num, 64, 1, strict);
   5214 	      SAVE_IMMEDIATE(num);
   5215 	      num--;
   5216 	      opcode |= (num & 0x20) << 7;
   5217 	      num = 31 - (num & 0x1f);
   5218 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   5219 
   5220 	    /* Handle a 5 bit bit position at 26.  */
   5221 	    case 'P':
   5222 	      num = pa_get_absolute_expression (&the_insn, &s);
   5223 	      if (strict && the_insn.exp.X_op != O_constant)
   5224 		break;
   5225 	      s = expr_end;
   5226 	      CHECK_FIELD (num, 31, 0, strict);
   5227 	      SAVE_IMMEDIATE(num);
   5228 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 5);
   5229 
   5230 	    /* Handle a 6 bit bit position at 20,22:26.  */
   5231 	    case 'q':
   5232 	      num = pa_get_absolute_expression (&the_insn, &s);
   5233 	      if (strict && the_insn.exp.X_op != O_constant)
   5234 		break;
   5235 	      s = expr_end;
   5236 	      CHECK_FIELD (num, 63, 0, strict);
   5237 	      SAVE_IMMEDIATE(num);
   5238 	      opcode |= (num & 0x20) << 6;
   5239 	      INSERT_FIELD_AND_CONTINUE (opcode, num & 0x1f, 5);
   5240 
   5241 	    /* Handle a 5 bit immediate at 10 with 'd' as the complement
   5242 	       of the high bit of the immediate.  */
   5243 	    case 'B':
   5244 	      num = pa_get_absolute_expression (&the_insn, &s);
   5245 	      if (strict && the_insn.exp.X_op != O_constant)
   5246 		break;
   5247 	      s = expr_end;
   5248 	      CHECK_FIELD (num, 63, 0, strict);
   5249 	      if (num & 0x20)
   5250 		;
   5251 	      else
   5252 		opcode |= (1 << 13);
   5253 	      INSERT_FIELD_AND_CONTINUE (opcode, num & 0x1f, 21);
   5254 
   5255 	    /* Handle a 5 bit immediate at 10.  */
   5256 	    case 'Q':
   5257 	      num = pa_get_absolute_expression (&the_insn, &s);
   5258 	      if (strict && the_insn.exp.X_op != O_constant)
   5259 		break;
   5260 	      s = expr_end;
   5261 	      CHECK_FIELD (num, 31, 0, strict);
   5262 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 21);
   5263 
   5264 	    /* Handle a 9 bit immediate at 28.  */
   5265 	    case '$':
   5266 	      num = pa_get_absolute_expression (&the_insn, &s);
   5267 	      if (strict && the_insn.exp.X_op != O_constant)
   5268 		break;
   5269 	      s = expr_end;
   5270 	      CHECK_FIELD (num, 511, 1, strict);
   5271 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 3);
   5272 
   5273 	    /* Handle a 13 bit immediate at 18.  */
   5274 	    case 'A':
   5275 	      num = pa_get_absolute_expression (&the_insn, &s);
   5276 	      if (strict && the_insn.exp.X_op != O_constant)
   5277 		break;
   5278 	      s = expr_end;
   5279 	      CHECK_FIELD (num, 8191, 0, strict);
   5280 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 13);
   5281 
   5282 	    /* Handle a 26 bit immediate at 31.  */
   5283 	    case 'D':
   5284 	      num = pa_get_absolute_expression (&the_insn, &s);
   5285 	      if (strict && the_insn.exp.X_op != O_constant)
   5286 		break;
   5287 	      s = expr_end;
   5288 	      CHECK_FIELD (num, 67108863, 0, strict);
   5289 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   5290 
   5291 	    /* Handle a 3 bit SFU identifier at 25.  */
   5292 	    case 'v':
   5293 	      if (*s++ != ',')
   5294 		as_bad (_("Invalid SFU identifier"));
   5295 	      num = pa_get_number (&the_insn, &s);
   5296 	      if (strict && the_insn.exp.X_op != O_constant)
   5297 		break;
   5298 	      s = expr_end;
   5299 	      CHECK_FIELD (num, 7, 0, strict);
   5300 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 6);
   5301 
   5302 	    /* Handle a 20 bit SOP field for spop0.  */
   5303 	    case 'O':
   5304 	      num = pa_get_number (&the_insn, &s);
   5305 	      if (strict && the_insn.exp.X_op != O_constant)
   5306 		break;
   5307 	      s = expr_end;
   5308 	      CHECK_FIELD (num, 1048575, 0, strict);
   5309 	      num = (num & 0x1f) | ((num & 0x000fffe0) << 6);
   5310 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   5311 
   5312 	    /* Handle a 15bit SOP field for spop1.  */
   5313 	    case 'o':
   5314 	      num = pa_get_number (&the_insn, &s);
   5315 	      if (strict && the_insn.exp.X_op != O_constant)
   5316 		break;
   5317 	      s = expr_end;
   5318 	      CHECK_FIELD (num, 32767, 0, strict);
   5319 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 11);
   5320 
   5321 	    /* Handle a 10bit SOP field for spop3.  */
   5322 	    case '0':
   5323 	      num = pa_get_number (&the_insn, &s);
   5324 	      if (strict && the_insn.exp.X_op != O_constant)
   5325 		break;
   5326 	      s = expr_end;
   5327 	      CHECK_FIELD (num, 1023, 0, strict);
   5328 	      num = (num & 0x1f) | ((num & 0x000003e0) << 6);
   5329 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   5330 
   5331 	    /* Handle a 15 bit SOP field for spop2.  */
   5332 	    case '1':
   5333 	      num = pa_get_number (&the_insn, &s);
   5334 	      if (strict && the_insn.exp.X_op != O_constant)
   5335 		break;
   5336 	      s = expr_end;
   5337 	      CHECK_FIELD (num, 32767, 0, strict);
   5338 	      num = (num & 0x1f) | ((num & 0x00007fe0) << 6);
   5339 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   5340 
   5341 	    /* Handle a 3-bit co-processor ID field.  */
   5342 	    case 'u':
   5343 	      if (*s++ != ',')
   5344 		as_bad (_("Invalid COPR identifier"));
   5345 	      num = pa_get_number (&the_insn, &s);
   5346 	      if (strict && the_insn.exp.X_op != O_constant)
   5347 		break;
   5348 	      s = expr_end;
   5349 	      CHECK_FIELD (num, 7, 0, strict);
   5350 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 6);
   5351 
   5352 	    /* Handle a 22bit SOP field for copr.  */
   5353 	    case '2':
   5354 	      num = pa_get_number (&the_insn, &s);
   5355 	      if (strict && the_insn.exp.X_op != O_constant)
   5356 		break;
   5357 	      s = expr_end;
   5358 	      CHECK_FIELD (num, 4194303, 0, strict);
   5359 	      num = (num & 0x1f) | ((num & 0x003fffe0) << 4);
   5360 	      INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   5361 
   5362 	    /* Handle a source FP operand format completer.  */
   5363 	    case '{':
   5364 	      if (*s == ',' && *(s+1) == 't')
   5365 		{
   5366 		  the_insn.trunc = 1;
   5367 		  s += 2;
   5368 		}
   5369 	      else
   5370 		the_insn.trunc = 0;
   5371 	      flag = pa_parse_fp_cnv_format (&s);
   5372 	      the_insn.fpof1 = flag;
   5373 	      if (flag == W || flag == UW)
   5374 		flag = SGL;
   5375 	      if (flag == DW || flag == UDW)
   5376 		flag = DBL;
   5377 	      if (flag == QW || flag == UQW)
   5378 		flag = QUAD;
   5379 	      INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
   5380 
   5381 	    /* Handle a destination FP operand format completer.  */
   5382 	    case '_':
   5383 	      /* pa_parse_format needs the ',' prefix.  */
   5384 	      s--;
   5385 	      flag = pa_parse_fp_cnv_format (&s);
   5386 	      the_insn.fpof2 = flag;
   5387 	      if (flag == W || flag == UW)
   5388 		flag = SGL;
   5389 	      if (flag == DW || flag == UDW)
   5390 		flag = DBL;
   5391 	      if (flag == QW || flag == UQW)
   5392 		flag = QUAD;
   5393 	      opcode |= flag << 13;
   5394 	      if (the_insn.fpof1 == SGL
   5395 		  || the_insn.fpof1 == DBL
   5396 		  || the_insn.fpof1 == QUAD)
   5397 		{
   5398 		  if (the_insn.fpof2 == SGL
   5399 		      || the_insn.fpof2 == DBL
   5400 		      || the_insn.fpof2 == QUAD)
   5401 		    flag = 0;
   5402 		  else if (the_insn.fpof2 == W
   5403 		      || the_insn.fpof2 == DW
   5404 		      || the_insn.fpof2 == QW)
   5405 		    flag = 2;
   5406 		  else if (the_insn.fpof2 == UW
   5407 		      || the_insn.fpof2 == UDW
   5408 		      || the_insn.fpof2 == UQW)
   5409 		    flag = 6;
   5410 		  else
   5411 		    abort ();
   5412 		}
   5413 	      else if (the_insn.fpof1 == W
   5414 		       || the_insn.fpof1 == DW
   5415 		       || the_insn.fpof1 == QW)
   5416 		{
   5417 		  if (the_insn.fpof2 == SGL
   5418 		      || the_insn.fpof2 == DBL
   5419 		      || the_insn.fpof2 == QUAD)
   5420 		    flag = 1;
   5421 		  else
   5422 		    abort ();
   5423 		}
   5424 	      else if (the_insn.fpof1 == UW
   5425 		       || the_insn.fpof1 == UDW
   5426 		       || the_insn.fpof1 == UQW)
   5427 		{
   5428 		  if (the_insn.fpof2 == SGL
   5429 		      || the_insn.fpof2 == DBL
   5430 		      || the_insn.fpof2 == QUAD)
   5431 		    flag = 5;
   5432 		  else
   5433 		    abort ();
   5434 		}
   5435 	      flag |= the_insn.trunc;
   5436 	      INSERT_FIELD_AND_CONTINUE (opcode, flag, 15);
   5437 
   5438 	    /* Handle a source FP operand format completer.  */
   5439 	    case 'F':
   5440 	      flag = pa_parse_fp_format (&s);
   5441 	      the_insn.fpof1 = flag;
   5442 	      INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
   5443 
   5444 	    /* Handle a destination FP operand format completer.  */
   5445 	    case 'G':
   5446 	      /* pa_parse_format needs the ',' prefix.  */
   5447 	      s--;
   5448 	      flag = pa_parse_fp_format (&s);
   5449 	      the_insn.fpof2 = flag;
   5450 	      INSERT_FIELD_AND_CONTINUE (opcode, flag, 13);
   5451 
   5452 	    /* Handle a source FP operand format completer at 20.  */
   5453 	    case 'I':
   5454 	      flag = pa_parse_fp_format (&s);
   5455 	      the_insn.fpof1 = flag;
   5456 	      INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
   5457 
   5458 	    /* Handle a floating point operand format at 26.
   5459 	       Only allows single and double precision.  */
   5460 	    case 'H':
   5461 	      flag = pa_parse_fp_format (&s);
   5462 	      switch (flag)
   5463 		{
   5464 		case SGL:
   5465 		  opcode |= 0x20;
   5466 		case DBL:
   5467 		  the_insn.fpof1 = flag;
   5468 		  continue;
   5469 
   5470 		case QUAD:
   5471 		case ILLEGAL_FMT:
   5472 		default:
   5473 		  as_bad (_("Invalid Floating Point Operand Format."));
   5474 		}
   5475 	      break;
   5476 
   5477 	    /* Handle all floating point registers.  */
   5478 	    case 'f':
   5479 	      switch (*++args)
   5480 		{
   5481 		/* Float target register.  */
   5482 		case 't':
   5483 		  if (!pa_parse_number (&s, 3))
   5484 		    break;
   5485 		  /* RSEL should not be set.  */
   5486 		  if (pa_number & FP_REG_RSEL)
   5487 		    break;
   5488 		  num = pa_number - FP_REG_BASE;
   5489 		  CHECK_FIELD (num, 31, 0, 0);
   5490 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   5491 
   5492 		/* Float target register with L/R selection.  */
   5493 		case 'T':
   5494 		  {
   5495 		    if (!pa_parse_number (&s, 1))
   5496 		      break;
   5497 		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
   5498 		    CHECK_FIELD (num, 31, 0, 0);
   5499 		    opcode |= num;
   5500 
   5501 		    /* 0x30 opcodes are FP arithmetic operation opcodes
   5502 		       and need to be turned into 0x38 opcodes.  This
   5503 		       is not necessary for loads/stores.  */
   5504 		    if (need_pa11_opcode ()
   5505 			&& ((opcode & 0xfc000000) == 0x30000000))
   5506 		      opcode |= 1 << 27;
   5507 
   5508 		    opcode |= (pa_number & FP_REG_RSEL ? 1 << 6 : 0);
   5509 		    continue;
   5510 		  }
   5511 
   5512 		/* Float operand 1.  */
   5513 		case 'a':
   5514 		  {
   5515 		    if (!pa_parse_number (&s, 1))
   5516 		      break;
   5517 		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
   5518 		    CHECK_FIELD (num, 31, 0, 0);
   5519 		    opcode |= num << 21;
   5520 		    if (need_pa11_opcode ())
   5521 		      {
   5522 			opcode |= (pa_number & FP_REG_RSEL ? 1 << 7 : 0);
   5523 			opcode |= 1 << 27;
   5524 		      }
   5525 		    continue;
   5526 		  }
   5527 
   5528 		/* Float operand 1 with L/R selection.  */
   5529 		case 'X':
   5530 		case 'A':
   5531 		  {
   5532 		    if (!pa_parse_number (&s, 1))
   5533 		      break;
   5534 		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
   5535 		    CHECK_FIELD (num, 31, 0, 0);
   5536 		    opcode |= num << 21;
   5537 		    opcode |= (pa_number & FP_REG_RSEL ? 1 << 7 : 0);
   5538 		    continue;
   5539 		  }
   5540 
   5541 		/* Float operand 2.  */
   5542 		case 'b':
   5543 		  {
   5544 		    if (!pa_parse_number (&s, 1))
   5545 		      break;
   5546 		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
   5547 		    CHECK_FIELD (num, 31, 0, 0);
   5548 		    opcode |= num << 16;
   5549 		    if (need_pa11_opcode ())
   5550 		      {
   5551 			opcode |= (pa_number & FP_REG_RSEL ? 1 << 12 : 0);
   5552 			opcode |= 1 << 27;
   5553 		      }
   5554 		    continue;
   5555 		  }
   5556 
   5557 		/* Float operand 2 with L/R selection.  */
   5558 		case 'B':
   5559 		  {
   5560 		    if (!pa_parse_number (&s, 1))
   5561 		      break;
   5562 		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
   5563 		    CHECK_FIELD (num, 31, 0, 0);
   5564 		    opcode |= num << 16;
   5565 		    opcode |= (pa_number & FP_REG_RSEL ? 1 << 12 : 0);
   5566 		    continue;
   5567 		  }
   5568 
   5569 		/* Float operand 3 for fmpyfadd, fmpynfadd.  */
   5570 		case 'C':
   5571 		  {
   5572 		    if (!pa_parse_number (&s, 1))
   5573 		      break;
   5574 		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
   5575 		    CHECK_FIELD (num, 31, 0, 0);
   5576 		    opcode |= (num & 0x1c) << 11;
   5577 		    opcode |= (num & 0x03) << 9;
   5578 		    opcode |= (pa_number & FP_REG_RSEL ? 1 << 8 : 0);
   5579 		    continue;
   5580 		  }
   5581 
   5582 		/* Float mult operand 1 for fmpyadd, fmpysub */
   5583 		case 'i':
   5584 		  {
   5585 		    if (!pa_parse_number (&s, 1))
   5586 		      break;
   5587 		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
   5588 		    CHECK_FIELD (num, 31, 0, 0);
   5589 		    if (the_insn.fpof1 == SGL)
   5590 		      {
   5591 			if (num < 16)
   5592 			  {
   5593 			    as_bad  (_("Invalid register for single precision fmpyadd or fmpysub"));
   5594 			    break;
   5595 			  }
   5596 			num &= 0xF;
   5597 			num |= (pa_number & FP_REG_RSEL ? 1 << 4 : 0);
   5598 		      }
   5599 		    INSERT_FIELD_AND_CONTINUE (opcode, num, 21);
   5600 		  }
   5601 
   5602 		/* Float mult operand 2 for fmpyadd, fmpysub */
   5603 		case 'j':
   5604 		  {
   5605 		    if (!pa_parse_number (&s, 1))
   5606 		      break;
   5607 		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
   5608 		    CHECK_FIELD (num, 31, 0, 0);
   5609 		    if (the_insn.fpof1 == SGL)
   5610 		      {
   5611 			if (num < 16)
   5612 			  {
   5613 			    as_bad  (_("Invalid register for single precision fmpyadd or fmpysub"));
   5614 			    break;
   5615 			  }
   5616 			num &= 0xF;
   5617 			num |= (pa_number & FP_REG_RSEL ? 1 << 4 : 0);
   5618 		      }
   5619 		    INSERT_FIELD_AND_CONTINUE (opcode, num, 16);
   5620 		  }
   5621 
   5622 		/* Float mult target for fmpyadd, fmpysub */
   5623 		case 'k':
   5624 		  {
   5625 		    if (!pa_parse_number (&s, 1))
   5626 		      break;
   5627 		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
   5628 		    CHECK_FIELD (num, 31, 0, 0);
   5629 		    if (the_insn.fpof1 == SGL)
   5630 		      {
   5631 			if (num < 16)
   5632 			  {
   5633 			    as_bad  (_("Invalid register for single precision fmpyadd or fmpysub"));
   5634 			    break;
   5635 			  }
   5636 			num &= 0xF;
   5637 			num |= (pa_number & FP_REG_RSEL ? 1 << 4 : 0);
   5638 		      }
   5639 		    INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
   5640 		  }
   5641 
   5642 		/* Float add operand 1 for fmpyadd, fmpysub */
   5643 		case 'l':
   5644 		  {
   5645 		    if (!pa_parse_number (&s, 1))
   5646 		      break;
   5647 		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
   5648 		    CHECK_FIELD (num, 31, 0, 0);
   5649 		    if (the_insn.fpof1 == SGL)
   5650 		      {
   5651 			if (num < 16)
   5652 			  {
   5653 			    as_bad  (_("Invalid register for single precision fmpyadd or fmpysub"));
   5654 			    break;
   5655 			  }
   5656 			num &= 0xF;
   5657 			num |= (pa_number & FP_REG_RSEL ? 1 << 4 : 0);
   5658 		      }
   5659 		    INSERT_FIELD_AND_CONTINUE (opcode, num, 6);
   5660 		  }
   5661 
   5662 		/* Float add target for fmpyadd, fmpysub */
   5663 		case 'm':
   5664 		  {
   5665 		    if (!pa_parse_number (&s, 1))
   5666 		      break;
   5667 		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
   5668 		    CHECK_FIELD (num, 31, 0, 0);
   5669 		    if (the_insn.fpof1 == SGL)
   5670 		      {
   5671 			if (num < 16)
   5672 			  {
   5673 			    as_bad  (_("Invalid register for single precision fmpyadd or fmpysub"));
   5674 			    break;
   5675 			  }
   5676 			num &= 0xF;
   5677 			num |= (pa_number & FP_REG_RSEL ? 1 << 4 : 0);
   5678 		      }
   5679 		    INSERT_FIELD_AND_CONTINUE (opcode, num, 11);
   5680 		  }
   5681 
   5682 		/* Handle L/R register halves like 'x'.  */
   5683 		case 'E':
   5684 		case 'e':
   5685 		  {
   5686 		    if (!pa_parse_number (&s, 1))
   5687 		      break;
   5688 		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
   5689 		    CHECK_FIELD (num, 31, 0, 0);
   5690 		    opcode |= num << 16;
   5691 		    if (need_pa11_opcode ())
   5692 		      {
   5693 			opcode |= (pa_number & FP_REG_RSEL ? 1 << 1 : 0);
   5694 		      }
   5695 		    continue;
   5696 		  }
   5697 
   5698 		/* Float target register (PA 2.0 wide).  */
   5699 		case 'x':
   5700 		  if (!pa_parse_number (&s, 3))
   5701 		    break;
   5702 		  num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
   5703 		  CHECK_FIELD (num, 31, 0, 0);
   5704 		  INSERT_FIELD_AND_CONTINUE (opcode, num, 16);
   5705 
   5706 		default:
   5707 		  abort ();
   5708 		}
   5709 	      break;
   5710 
   5711 	    default:
   5712 	      abort ();
   5713 	    }
   5714 	  break;
   5715 	}
   5716 
   5717       /* If this instruction is specific to a particular architecture,
   5718 	 then set a new architecture.  This automatic promotion crud is
   5719 	 for compatibility with HP's old assemblers only.  */
   5720       if (match == TRUE
   5721 	  && bfd_get_mach (stdoutput) < insn->arch
   5722 	  && !bfd_set_arch_mach (stdoutput, bfd_arch_hppa, insn->arch))
   5723 	{
   5724 	  as_warn (_("could not update architecture and machine"));
   5725 	  match = FALSE;
   5726 	}
   5727 
   5728  failed:
   5729       /* Check if the args matched.  */
   5730       if (!match)
   5731 	{
   5732 	  if (&insn[1] - pa_opcodes < (int) NUMOPCODES
   5733 	      && !strcmp (insn->name, insn[1].name))
   5734 	    {
   5735 	      ++insn;
   5736 	      s = argstart;
   5737 	      continue;
   5738 	    }
   5739 	  else
   5740 	    {
   5741 	      as_bad (_("Invalid operands %s"), error_message);
   5742 	      return;
   5743 	    }
   5744 	}
   5745       break;
   5746     }
   5747 
   5748   if (immediate_check)
   5749     {
   5750       if (pos != -1 && len != -1 && pos < len - 1)
   5751         as_warn (_("Immediates %d and %d will give undefined behavior."),
   5752 			pos, len);
   5753     }
   5754 
   5755   the_insn.opcode = opcode;
   5756 }
   5757 
   5758 /* Assemble a single instruction storing it into a frag.  */
   5759 
   5760 void
   5761 md_assemble (char *str)
   5762 {
   5763   char *to;
   5764 
   5765   /* The had better be something to assemble.  */
   5766   gas_assert (str);
   5767 
   5768   /* If we are within a procedure definition, make sure we've
   5769      defined a label for the procedure; handle case where the
   5770      label was defined after the .PROC directive.
   5771 
   5772      Note there's not need to diddle with the segment or fragment
   5773      for the label symbol in this case.  We have already switched
   5774      into the new $CODE$ subspace at this point.  */
   5775   if (within_procedure && last_call_info->start_symbol == NULL)
   5776     {
   5777       label_symbol_struct *label_symbol = pa_get_label ();
   5778 
   5779       if (label_symbol)
   5780 	{
   5781 	  if (label_symbol->lss_label)
   5782 	    {
   5783 	      last_call_info->start_symbol = label_symbol->lss_label;
   5784 	      symbol_get_bfdsym (label_symbol->lss_label)->flags
   5785 		|= BSF_FUNCTION;
   5786 #ifdef OBJ_SOM
   5787 	      /* Also handle allocation of a fixup to hold the unwind
   5788 		 information when the label appears after the proc/procend.  */
   5789 	      if (within_entry_exit)
   5790 		{
   5791 		  char *where;
   5792 		  unsigned int u;
   5793 
   5794 		  where = frag_more (0);
   5795 		  u = UNWIND_LOW32 (&last_call_info->ci_unwind.descriptor);
   5796 		  fix_new_hppa (frag_now, where - frag_now->fr_literal, 0,
   5797 				NULL, (offsetT) 0, NULL,
   5798 				0, R_HPPA_ENTRY, e_fsel, 0, 0, u);
   5799 		}
   5800 #endif
   5801 	    }
   5802 	  else
   5803 	    as_bad (_("Missing function name for .PROC (corrupted label chain)"));
   5804 	}
   5805       else
   5806 	as_bad (_("Missing function name for .PROC"));
   5807     }
   5808 
   5809   /* Assemble the instruction.  Results are saved into "the_insn".  */
   5810   pa_ip (str);
   5811 
   5812   /* Get somewhere to put the assembled instruction.  */
   5813   to = frag_more (4);
   5814 
   5815   /* Output the opcode.  */
   5816   md_number_to_chars (to, the_insn.opcode, 4);
   5817 
   5818   /* If necessary output more stuff.  */
   5819   if (the_insn.reloc != R_HPPA_NONE)
   5820     fix_new_hppa (frag_now, (to - frag_now->fr_literal), 4, NULL,
   5821 		  (offsetT) 0, &the_insn.exp, the_insn.pcrel,
   5822 		  the_insn.reloc, the_insn.field_selector,
   5823 		  the_insn.format, the_insn.arg_reloc, 0);
   5824 
   5825 #ifdef OBJ_ELF
   5826   dwarf2_emit_insn (4);
   5827 #endif
   5828 }
   5829 
   5830 #ifdef OBJ_SOM
   5831 /* Handle an alignment directive.  Special so that we can update the
   5832    alignment of the subspace if necessary.  */
   5833 static void
   5834 pa_align (int bytes)
   5835 {
   5836   /* We must have a valid space and subspace.  */
   5837   pa_check_current_space_and_subspace ();
   5838 
   5839   /* Let the generic gas code do most of the work.  */
   5840   s_align_bytes (bytes);
   5841 
   5842   /* If bytes is a power of 2, then update the current subspace's
   5843      alignment if necessary.  */
   5844   if (exact_log2 (bytes) != -1)
   5845     record_alignment (current_subspace->ssd_seg, exact_log2 (bytes));
   5846 }
   5847 #endif
   5848 
   5849 /* Handle a .BLOCK type pseudo-op.  */
   5850 
   5851 static void
   5852 pa_block (int z ATTRIBUTE_UNUSED)
   5853 {
   5854   unsigned int temp_size;
   5855 
   5856 #ifdef OBJ_SOM
   5857   /* We must have a valid space and subspace.  */
   5858   pa_check_current_space_and_subspace ();
   5859 #endif
   5860 
   5861   temp_size = get_absolute_expression ();
   5862 
   5863   if (temp_size > 0x3FFFFFFF)
   5864     {
   5865       as_bad (_("Argument to .BLOCK/.BLOCKZ must be between 0 and 0x3fffffff"));
   5866       temp_size = 0;
   5867     }
   5868   else
   5869     {
   5870       /* Always fill with zeros, that's what the HP assembler does.  */
   5871       char *p = frag_var (rs_fill, 1, 1, 0, NULL, temp_size, NULL);
   5872       *p = 0;
   5873     }
   5874 
   5875   pa_undefine_label ();
   5876   demand_empty_rest_of_line ();
   5877 }
   5878 
   5879 /* Handle a .begin_brtab and .end_brtab pseudo-op.  */
   5880 
   5881 static void
   5882 pa_brtab (int begin ATTRIBUTE_UNUSED)
   5883 {
   5884 
   5885 #ifdef OBJ_SOM
   5886   /* The BRTAB relocations are only available in SOM (to denote
   5887      the beginning and end of branch tables).  */
   5888   char *where = frag_more (0);
   5889 
   5890   fix_new_hppa (frag_now, where - frag_now->fr_literal, 0,
   5891 		NULL, (offsetT) 0, NULL,
   5892 		0, begin ? R_HPPA_BEGIN_BRTAB : R_HPPA_END_BRTAB,
   5893 		e_fsel, 0, 0, 0);
   5894 #endif
   5895 
   5896   demand_empty_rest_of_line ();
   5897 }
   5898 
   5899 /* Handle a .begin_try and .end_try pseudo-op.  */
   5900 
   5901 static void
   5902 pa_try (int begin ATTRIBUTE_UNUSED)
   5903 {
   5904 #ifdef OBJ_SOM
   5905   expressionS exp;
   5906   char *where = frag_more (0);
   5907 
   5908   if (! begin)
   5909     expression (&exp);
   5910 
   5911   /* The TRY relocations are only available in SOM (to denote
   5912      the beginning and end of exception handling regions).  */
   5913 
   5914   fix_new_hppa (frag_now, where - frag_now->fr_literal, 0,
   5915 		NULL, (offsetT) 0, begin ? NULL : &exp,
   5916 		0, begin ? R_HPPA_BEGIN_TRY : R_HPPA_END_TRY,
   5917 		e_fsel, 0, 0, 0);
   5918 #endif
   5919 
   5920   demand_empty_rest_of_line ();
   5921 }
   5922 
   5923 /* Do the dirty work of building a call descriptor which describes
   5924    where the caller placed arguments to a function call.  */
   5925 
   5926 static void
   5927 pa_call_args (struct call_desc *call_desc)
   5928 {
   5929   char *name, c, *p;
   5930   unsigned int temp, arg_reloc;
   5931 
   5932   while (!is_end_of_statement ())
   5933     {
   5934       name = input_line_pointer;
   5935       c = get_symbol_end ();
   5936       /* Process a source argument.  */
   5937       if ((strncasecmp (name, "argw", 4) == 0))
   5938 	{
   5939 	  temp = atoi (name + 4);
   5940 	  p = input_line_pointer;
   5941 	  *p = c;
   5942 	  input_line_pointer++;
   5943 	  name = input_line_pointer;
   5944 	  c = get_symbol_end ();
   5945 	  arg_reloc = pa_build_arg_reloc (name);
   5946 	  call_desc->arg_reloc |= pa_align_arg_reloc (temp, arg_reloc);
   5947 	}
   5948       /* Process a return value.  */
   5949       else if ((strncasecmp (name, "rtnval", 6) == 0))
   5950 	{
   5951 	  p = input_line_pointer;
   5952 	  *p = c;
   5953 	  input_line_pointer++;
   5954 	  name = input_line_pointer;
   5955 	  c = get_symbol_end ();
   5956 	  arg_reloc = pa_build_arg_reloc (name);
   5957 	  call_desc->arg_reloc |= (arg_reloc & 0x3);
   5958 	}
   5959       else
   5960 	{
   5961 	  as_bad (_("Invalid .CALL argument: %s"), name);
   5962 	}
   5963       p = input_line_pointer;
   5964       *p = c;
   5965       if (!is_end_of_statement ())
   5966 	input_line_pointer++;
   5967     }
   5968 }
   5969 
   5970 /* Handle a .CALL pseudo-op.  This involves storing away information
   5971    about where arguments are to be found so the linker can detect
   5972    (and correct) argument location mismatches between caller and callee.  */
   5973 
   5974 static void
   5975 pa_call (int unused ATTRIBUTE_UNUSED)
   5976 {
   5977 #ifdef OBJ_SOM
   5978   /* We must have a valid space and subspace.  */
   5979   pa_check_current_space_and_subspace ();
   5980 #endif
   5981 
   5982   pa_call_args (&last_call_desc);
   5983   demand_empty_rest_of_line ();
   5984 }
   5985 
   5986 #ifdef OBJ_ELF
   5987 /* Build an entry in the UNWIND subspace from the given function
   5988    attributes in CALL_INFO.  This is not needed for SOM as using
   5989    R_ENTRY and R_EXIT relocations allow the linker to handle building
   5990    of the unwind spaces.  */
   5991 
   5992 static void
   5993 pa_build_unwind_subspace (struct call_info *call_info)
   5994 {
   5995   asection *seg, *save_seg;
   5996   subsegT save_subseg;
   5997   unsigned int unwind;
   5998   int reloc;
   5999   char *name, *p;
   6000   symbolS *symbolP;
   6001 
   6002   if ((bfd_get_section_flags (stdoutput, now_seg)
   6003        & (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
   6004       != (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
   6005     return;
   6006 
   6007   if (call_info->start_symbol == NULL)
   6008     /* This can happen if there were errors earlier on in the assembly.  */
   6009     return;
   6010 
   6011   /* Replace the start symbol with a local symbol that will be reduced
   6012      to a section offset.  This avoids problems with weak functions with
   6013      multiple definitions, etc.  */
   6014   name = xmalloc (strlen ("L$\001start_")
   6015 		  + strlen (S_GET_NAME (call_info->start_symbol))
   6016 		  + 1);
   6017   strcpy (name, "L$\001start_");
   6018   strcat (name, S_GET_NAME (call_info->start_symbol));
   6019 
   6020   /* If we have a .procend preceded by a .exit, then the symbol will have
   6021      already been defined.  In that case, we don't want another unwind
   6022      entry.  */
   6023   symbolP = symbol_find (name);
   6024   if (symbolP)
   6025     {
   6026       xfree (name);
   6027       return;
   6028     }
   6029   else
   6030     {
   6031       symbolP = symbol_new (name, now_seg,
   6032 			    S_GET_VALUE (call_info->start_symbol), frag_now);
   6033       gas_assert (symbolP);
   6034       S_CLEAR_EXTERNAL (symbolP);
   6035       symbol_table_insert (symbolP);
   6036     }
   6037 
   6038   reloc = R_PARISC_SEGREL32;
   6039   save_seg = now_seg;
   6040   save_subseg = now_subseg;
   6041   /* Get into the right seg/subseg.  This may involve creating
   6042      the seg the first time through.  Make sure to have the
   6043      old seg/subseg so that we can reset things when we are done.  */
   6044   seg = bfd_get_section_by_name (stdoutput, UNWIND_SECTION_NAME);
   6045   if (seg == ASEC_NULL)
   6046     {
   6047       seg = subseg_new (UNWIND_SECTION_NAME, 0);
   6048       bfd_set_section_flags (stdoutput, seg,
   6049 			     SEC_READONLY | SEC_HAS_CONTENTS
   6050 			     | SEC_LOAD | SEC_RELOC | SEC_ALLOC | SEC_DATA);
   6051       bfd_set_section_alignment (stdoutput, seg, 2);
   6052     }
   6053 
   6054   subseg_set (seg, 0);
   6055 
   6056   /* Get some space to hold relocation information for the unwind
   6057      descriptor.  */
   6058   p = frag_more (16);
   6059 
   6060   /* Relocation info. for start offset of the function.  */
   6061   md_number_to_chars (p, 0, 4);
   6062   fix_new_hppa (frag_now, p - frag_now->fr_literal, 4,
   6063 		symbolP, (offsetT) 0,
   6064 		(expressionS *) NULL, 0, reloc,
   6065 		e_fsel, 32, 0, 0);
   6066 
   6067   /* Relocation info. for end offset of the function.
   6068 
   6069      Because we allow reductions of 32bit relocations for ELF, this will be
   6070      reduced to section_sym + offset which avoids putting the temporary
   6071      symbol into the symbol table.  It (should) end up giving the same
   6072      value as call_info->start_symbol + function size once the linker is
   6073      finished with its work.  */
   6074   md_number_to_chars (p + 4, 0, 4);
   6075   fix_new_hppa (frag_now, p + 4 - frag_now->fr_literal, 4,
   6076 		call_info->end_symbol, (offsetT) 0,
   6077 		(expressionS *) NULL, 0, reloc,
   6078 		e_fsel, 32, 0, 0);
   6079 
   6080   /* Dump the descriptor.  */
   6081   unwind = UNWIND_LOW32 (&call_info->ci_unwind.descriptor);
   6082   md_number_to_chars (p + 8, unwind, 4);
   6083 
   6084   unwind = UNWIND_HIGH32 (&call_info->ci_unwind.descriptor);
   6085   md_number_to_chars (p + 12, unwind, 4);
   6086 
   6087   /* Return back to the original segment/subsegment.  */
   6088   subseg_set (save_seg, save_subseg);
   6089 }
   6090 #endif
   6091 
   6092 /* Process a .CALLINFO pseudo-op.  This information is used later
   6093    to build unwind descriptors and maybe one day to support
   6094    .ENTER and .LEAVE.  */
   6095 
   6096 static void
   6097 pa_callinfo (int unused ATTRIBUTE_UNUSED)
   6098 {
   6099   char *name, c, *p;
   6100   int temp;
   6101 
   6102 #ifdef OBJ_SOM
   6103   /* We must have a valid space and subspace.  */
   6104   pa_check_current_space_and_subspace ();
   6105 #endif
   6106 
   6107   /* .CALLINFO must appear within a procedure definition.  */
   6108   if (!within_procedure)
   6109     as_bad (_(".callinfo is not within a procedure definition"));
   6110 
   6111   /* Mark the fact that we found the .CALLINFO for the
   6112      current procedure.  */
   6113   callinfo_found = TRUE;
   6114 
   6115   /* Iterate over the .CALLINFO arguments.  */
   6116   while (!is_end_of_statement ())
   6117     {
   6118       name = input_line_pointer;
   6119       c = get_symbol_end ();
   6120       /* Frame size specification.  */
   6121       if ((strncasecmp (name, "frame", 5) == 0))
   6122 	{
   6123 	  p = input_line_pointer;
   6124 	  *p = c;
   6125 	  input_line_pointer++;
   6126 	  temp = get_absolute_expression ();
   6127 	  if ((temp & 0x3) != 0)
   6128 	    {
   6129 	      as_bad (_("FRAME parameter must be a multiple of 8: %d\n"), temp);
   6130 	      temp = 0;
   6131 	    }
   6132 
   6133 	  /* callinfo is in bytes and unwind_desc is in 8 byte units.  */
   6134 	  last_call_info->ci_unwind.descriptor.frame_size = temp / 8;
   6135 
   6136 	}
   6137       /* Entry register (GR, GR and SR) specifications.  */
   6138       else if ((strncasecmp (name, "entry_gr", 8) == 0))
   6139 	{
   6140 	  p = input_line_pointer;
   6141 	  *p = c;
   6142 	  input_line_pointer++;
   6143 	  temp = get_absolute_expression ();
   6144 	  /* The HP assembler accepts 19 as the high bound for ENTRY_GR
   6145 	     even though %r19 is caller saved.  I think this is a bug in
   6146 	     the HP assembler, and we are not going to emulate it.  */
   6147 	  if (temp < 3 || temp > 18)
   6148 	    as_bad (_("Value for ENTRY_GR must be in the range 3..18\n"));
   6149 	  last_call_info->ci_unwind.descriptor.entry_gr = temp - 2;
   6150 	}
   6151       else if ((strncasecmp (name, "entry_fr", 8) == 0))
   6152 	{
   6153 	  p = input_line_pointer;
   6154 	  *p = c;
   6155 	  input_line_pointer++;
   6156 	  temp = get_absolute_expression ();
   6157 	  /* Similarly the HP assembler takes 31 as the high bound even
   6158 	     though %fr21 is the last callee saved floating point register.  */
   6159 	  if (temp < 12 || temp > 21)
   6160 	    as_bad (_("Value for ENTRY_FR must be in the range 12..21\n"));
   6161 	  last_call_info->ci_unwind.descriptor.entry_fr = temp - 11;
   6162 	}
   6163       else if ((strncasecmp (name, "entry_sr", 8) == 0))
   6164 	{
   6165 	  p = input_line_pointer;
   6166 	  *p = c;
   6167 	  input_line_pointer++;
   6168 	  temp = get_absolute_expression ();
   6169 	  if (temp != 3)
   6170 	    as_bad (_("Value for ENTRY_SR must be 3\n"));
   6171 	}
   6172       /* Note whether or not this function performs any calls.  */
   6173       else if ((strncasecmp (name, "calls", 5) == 0) ||
   6174 	       (strncasecmp (name, "caller", 6) == 0))
   6175 	{
   6176 	  p = input_line_pointer;
   6177 	  *p = c;
   6178 	}
   6179       else if ((strncasecmp (name, "no_calls", 8) == 0))
   6180 	{
   6181 	  p = input_line_pointer;
   6182 	  *p = c;
   6183 	}
   6184       /* Should RP be saved into the stack.  */
   6185       else if ((strncasecmp (name, "save_rp", 7) == 0))
   6186 	{
   6187 	  p = input_line_pointer;
   6188 	  *p = c;
   6189 	  last_call_info->ci_unwind.descriptor.save_rp = 1;
   6190 	}
   6191       /* Likewise for SP.  */
   6192       else if ((strncasecmp (name, "save_sp", 7) == 0))
   6193 	{
   6194 	  p = input_line_pointer;
   6195 	  *p = c;
   6196 	  last_call_info->ci_unwind.descriptor.save_sp = 1;
   6197 	}
   6198       /* Is this an unwindable procedure.  If so mark it so
   6199 	 in the unwind descriptor.  */
   6200       else if ((strncasecmp (name, "no_unwind", 9) == 0))
   6201 	{
   6202 	  p = input_line_pointer;
   6203 	  *p = c;
   6204 	  last_call_info->ci_unwind.descriptor.cannot_unwind = 1;
   6205 	}
   6206       /* Is this an interrupt routine.  If so mark it in the
   6207 	 unwind descriptor.  */
   6208       else if ((strncasecmp (name, "hpux_int", 7) == 0))
   6209 	{
   6210 	  p = input_line_pointer;
   6211 	  *p = c;
   6212 	  last_call_info->ci_unwind.descriptor.hpux_interrupt_marker = 1;
   6213 	}
   6214       /* Is this a millicode routine.  "millicode" isn't in my
   6215 	 assembler manual, but my copy is old.  The HP assembler
   6216 	 accepts it, and there's a place in the unwind descriptor
   6217 	 to drop the information, so we'll accept it too.  */
   6218       else if ((strncasecmp (name, "millicode", 9) == 0))
   6219 	{
   6220 	  p = input_line_pointer;
   6221 	  *p = c;
   6222 	  last_call_info->ci_unwind.descriptor.millicode = 1;
   6223 	}
   6224       else
   6225 	{
   6226 	  as_bad (_("Invalid .CALLINFO argument: %s"), name);
   6227 	  *input_line_pointer = c;
   6228 	}
   6229       if (!is_end_of_statement ())
   6230 	input_line_pointer++;
   6231     }
   6232 
   6233   demand_empty_rest_of_line ();
   6234 }
   6235 
   6236 #if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
   6237 /* Switch to the text space.  Like s_text, but delete our
   6238    label when finished.  */
   6239 
   6240 static void
   6241 pa_text (int unused ATTRIBUTE_UNUSED)
   6242 {
   6243 #ifdef OBJ_SOM
   6244   current_space = is_defined_space ("$TEXT$");
   6245   current_subspace
   6246     = pa_subsegment_to_subspace (current_space->sd_seg, 0);
   6247 #endif
   6248 
   6249   s_text (0);
   6250   pa_undefine_label ();
   6251 }
   6252 
   6253 /* Switch to the data space.  As usual delete our label.  */
   6254 
   6255 static void
   6256 pa_data (int unused ATTRIBUTE_UNUSED)
   6257 {
   6258 #ifdef OBJ_SOM
   6259   current_space = is_defined_space ("$PRIVATE$");
   6260   current_subspace
   6261     = pa_subsegment_to_subspace (current_space->sd_seg, 0);
   6262 #endif
   6263   s_data (0);
   6264   pa_undefine_label ();
   6265 }
   6266 
   6267 /* This is different than the standard GAS s_comm(). On HP9000/800 machines,
   6268    the .comm pseudo-op has the following syntax:
   6269 
   6270    <label> .comm <length>
   6271 
   6272    where <label> is optional and is a symbol whose address will be the start of
   6273    a block of memory <length> bytes long. <length> must be an absolute
   6274    expression.  <length> bytes will be allocated in the current space
   6275    and subspace.
   6276 
   6277    Also note the label may not even be on the same line as the .comm.
   6278 
   6279    This difference in syntax means the colon function will be called
   6280    on the symbol before we arrive in pa_comm.  colon will set a number
   6281    of attributes of the symbol that need to be fixed here.  In particular
   6282    the value, section pointer, fragment pointer, flags, etc.  What
   6283    a pain.
   6284 
   6285    This also makes error detection all but impossible.  */
   6286 
   6287 static void
   6288 pa_comm (int unused ATTRIBUTE_UNUSED)
   6289 {
   6290   unsigned int size;
   6291   symbolS *symbol;
   6292   label_symbol_struct *label_symbol = pa_get_label ();
   6293 
   6294   if (label_symbol)
   6295     symbol = label_symbol->lss_label;
   6296   else
   6297     symbol = NULL;
   6298 
   6299   SKIP_WHITESPACE ();
   6300   size = get_absolute_expression ();
   6301 
   6302   if (symbol)
   6303     {
   6304       symbol_get_bfdsym (symbol)->flags |= BSF_OBJECT;
   6305       S_SET_VALUE (symbol, size);
   6306       S_SET_SEGMENT (symbol, bfd_com_section_ptr);
   6307       S_SET_EXTERNAL (symbol);
   6308 
   6309       /* colon() has already set the frag to the current location in the
   6310 	 current subspace; we need to reset the fragment to the zero address
   6311 	 fragment.  We also need to reset the segment pointer.  */
   6312       symbol_set_frag (symbol, &zero_address_frag);
   6313     }
   6314   demand_empty_rest_of_line ();
   6315 }
   6316 #endif /* !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD))) */
   6317 
   6318 /* Process a .END pseudo-op.  */
   6319 
   6320 static void
   6321 pa_end (int unused ATTRIBUTE_UNUSED)
   6322 {
   6323   demand_empty_rest_of_line ();
   6324 }
   6325 
   6326 /* Process a .ENTER pseudo-op.  This is not supported.  */
   6327 
   6328 static void
   6329 pa_enter (int unused ATTRIBUTE_UNUSED)
   6330 {
   6331 #ifdef OBJ_SOM
   6332   /* We must have a valid space and subspace.  */
   6333   pa_check_current_space_and_subspace ();
   6334 #endif
   6335 
   6336   as_bad (_("The .ENTER pseudo-op is not supported"));
   6337   demand_empty_rest_of_line ();
   6338 }
   6339 
   6340 /* Process a .ENTRY pseudo-op.  .ENTRY marks the beginning of the
   6341    procedure.  */
   6342 
   6343 static void
   6344 pa_entry (int unused ATTRIBUTE_UNUSED)
   6345 {
   6346 #ifdef OBJ_SOM
   6347   /* We must have a valid space and subspace.  */
   6348   pa_check_current_space_and_subspace ();
   6349 #endif
   6350 
   6351   if (!within_procedure)
   6352     as_bad (_("Misplaced .entry. Ignored."));
   6353   else
   6354     {
   6355       if (!callinfo_found)
   6356 	as_bad (_("Missing .callinfo."));
   6357     }
   6358   demand_empty_rest_of_line ();
   6359   within_entry_exit = TRUE;
   6360 
   6361 #ifdef OBJ_SOM
   6362   /* SOM defers building of unwind descriptors until the link phase.
   6363      The assembler is responsible for creating an R_ENTRY relocation
   6364      to mark the beginning of a region and hold the unwind bits, and
   6365      for creating an R_EXIT relocation to mark the end of the region.
   6366 
   6367      FIXME.  ELF should be using the same conventions!  The problem
   6368      is an unwind requires too much relocation space.  Hmmm.  Maybe
   6369      if we split the unwind bits up between the relocations which
   6370      denote the entry and exit points.  */
   6371   if (last_call_info->start_symbol != NULL)
   6372     {
   6373       char *where;
   6374       unsigned int u;
   6375 
   6376       where = frag_more (0);
   6377       u = UNWIND_LOW32 (&last_call_info->ci_unwind.descriptor);
   6378       fix_new_hppa (frag_now, where - frag_now->fr_literal, 0,
   6379 		    NULL, (offsetT) 0, NULL,
   6380 		    0, R_HPPA_ENTRY, e_fsel, 0, 0, u);
   6381     }
   6382 #endif
   6383 }
   6384 
   6385 /* Silly nonsense for pa_equ.  The only half-sensible use for this is
   6386    being able to subtract two register symbols that specify a range of
   6387    registers, to get the size of the range.  */
   6388 static int fudge_reg_expressions;
   6389 
   6390 int
   6391 hppa_force_reg_syms_absolute (expressionS *resultP,
   6392 			      operatorT op ATTRIBUTE_UNUSED,
   6393 			      expressionS *rightP)
   6394 {
   6395   if (fudge_reg_expressions
   6396       && rightP->X_op == O_register
   6397       && resultP->X_op == O_register)
   6398     {
   6399       rightP->X_op = O_constant;
   6400       resultP->X_op = O_constant;
   6401     }
   6402   return 0;  /* Continue normal expr handling.  */
   6403 }
   6404 
   6405 /* Handle a .EQU pseudo-op.  */
   6406 
   6407 static void
   6408 pa_equ (int reg)
   6409 {
   6410   label_symbol_struct *label_symbol = pa_get_label ();
   6411   symbolS *symbol;
   6412 
   6413   if (label_symbol)
   6414     {
   6415       symbol = label_symbol->lss_label;
   6416       if (reg)
   6417 	{
   6418 	  strict = 1;
   6419 	  if (!pa_parse_number (&input_line_pointer, 0))
   6420 	    as_bad (_(".REG expression must be a register"));
   6421 	  S_SET_VALUE (symbol, pa_number);
   6422 	  S_SET_SEGMENT (symbol, reg_section);
   6423 	}
   6424       else
   6425 	{
   6426 	  expressionS exp;
   6427 	  segT seg;
   6428 
   6429 	  fudge_reg_expressions = 1;
   6430 	  seg = expression (&exp);
   6431 	  fudge_reg_expressions = 0;
   6432 	  if (exp.X_op != O_constant
   6433 	      && exp.X_op != O_register)
   6434 	    {
   6435 	      if (exp.X_op != O_absent)
   6436 		as_bad (_("bad or irreducible absolute expression; zero assumed"));
   6437 	      exp.X_add_number = 0;
   6438 	      seg = absolute_section;
   6439 	    }
   6440 	  S_SET_VALUE (symbol, (unsigned int) exp.X_add_number);
   6441 	  S_SET_SEGMENT (symbol, seg);
   6442 	}
   6443     }
   6444   else
   6445     {
   6446       if (reg)
   6447 	as_bad (_(".REG must use a label"));
   6448       else
   6449 	as_bad (_(".EQU must use a label"));
   6450     }
   6451 
   6452   pa_undefine_label ();
   6453   demand_empty_rest_of_line ();
   6454 }
   6455 
   6456 #ifdef OBJ_ELF
   6457 /* Mark the end of a function so that it's possible to compute
   6458    the size of the function in elf_hppa_final_processing.  */
   6459 
   6460 static void
   6461 hppa_elf_mark_end_of_function (void)
   6462 {
   6463   /* ELF does not have EXIT relocations.  All we do is create a
   6464      temporary symbol marking the end of the function.  */
   6465   char *name;
   6466 
   6467   if (last_call_info == NULL || last_call_info->start_symbol == NULL)
   6468     {
   6469       /* We have already warned about a missing label,
   6470 	 or other problems.  */
   6471       return;
   6472     }
   6473 
   6474   name = xmalloc (strlen ("L$\001end_")
   6475 		  + strlen (S_GET_NAME (last_call_info->start_symbol))
   6476 		  + 1);
   6477   if (name)
   6478     {
   6479       symbolS *symbolP;
   6480 
   6481       strcpy (name, "L$\001end_");
   6482       strcat (name, S_GET_NAME (last_call_info->start_symbol));
   6483 
   6484       /* If we have a .exit followed by a .procend, then the
   6485 	 symbol will have already been defined.  */
   6486       symbolP = symbol_find (name);
   6487       if (symbolP)
   6488 	{
   6489 	  /* The symbol has already been defined!  This can
   6490 	     happen if we have a .exit followed by a .procend.
   6491 
   6492 	     This is *not* an error.  All we want to do is free
   6493 	     the memory we just allocated for the name and continue.  */
   6494 	  xfree (name);
   6495 	}
   6496       else
   6497 	{
   6498 	  /* symbol value should be the offset of the
   6499 	     last instruction of the function */
   6500 	  symbolP = symbol_new (name, now_seg, (valueT) (frag_now_fix () - 4),
   6501 				frag_now);
   6502 
   6503 	  gas_assert (symbolP);
   6504 	  S_CLEAR_EXTERNAL (symbolP);
   6505 	  symbol_table_insert (symbolP);
   6506 	}
   6507 
   6508       if (symbolP)
   6509 	last_call_info->end_symbol = symbolP;
   6510       else
   6511 	as_bad (_("Symbol '%s' could not be created."), name);
   6512 
   6513     }
   6514   else
   6515     as_bad (_("No memory for symbol name."));
   6516 }
   6517 #endif
   6518 
   6519 /* Helper function.  Does processing for the end of a function.  This
   6520    usually involves creating some relocations or building special
   6521    symbols to mark the end of the function.  */
   6522 
   6523 static void
   6524 process_exit (void)
   6525 {
   6526   char *where;
   6527 
   6528   where = frag_more (0);
   6529 
   6530 #ifdef OBJ_ELF
   6531   /* Mark the end of the function, stuff away the location of the frag
   6532      for the end of the function, and finally call pa_build_unwind_subspace
   6533      to add an entry in the unwind table.  */
   6534   (void) where;
   6535   hppa_elf_mark_end_of_function ();
   6536   pa_build_unwind_subspace (last_call_info);
   6537 #else
   6538   /* SOM defers building of unwind descriptors until the link phase.
   6539      The assembler is responsible for creating an R_ENTRY relocation
   6540      to mark the beginning of a region and hold the unwind bits, and
   6541      for creating an R_EXIT relocation to mark the end of the region.
   6542 
   6543      FIXME.  ELF should be using the same conventions!  The problem
   6544      is an unwind requires too much relocation space.  Hmmm.  Maybe
   6545      if we split the unwind bits up between the relocations which
   6546      denote the entry and exit points.  */
   6547   fix_new_hppa (frag_now, where - frag_now->fr_literal, 0,
   6548 		NULL, (offsetT) 0,
   6549 		NULL, 0, R_HPPA_EXIT, e_fsel, 0, 0,
   6550 		UNWIND_HIGH32 (&last_call_info->ci_unwind.descriptor));
   6551 #endif
   6552 }
   6553 
   6554 /* Process a .EXIT pseudo-op.  */
   6555 
   6556 static void
   6557 pa_exit (int unused ATTRIBUTE_UNUSED)
   6558 {
   6559 #ifdef OBJ_SOM
   6560   /* We must have a valid space and subspace.  */
   6561   pa_check_current_space_and_subspace ();
   6562 #endif
   6563 
   6564   if (!within_procedure)
   6565     as_bad (_(".EXIT must appear within a procedure"));
   6566   else
   6567     {
   6568       if (!callinfo_found)
   6569 	as_bad (_("Missing .callinfo"));
   6570       else
   6571 	{
   6572 	  if (!within_entry_exit)
   6573 	    as_bad (_("No .ENTRY for this .EXIT"));
   6574 	  else
   6575 	    {
   6576 	      within_entry_exit = FALSE;
   6577 	      process_exit ();
   6578 	    }
   6579 	}
   6580     }
   6581   demand_empty_rest_of_line ();
   6582 }
   6583 
   6584 /* Helper function to process arguments to a .EXPORT pseudo-op.  */
   6585 
   6586 static void
   6587 pa_type_args (symbolS *symbolP, int is_export)
   6588 {
   6589   char *name, c, *p;
   6590   unsigned int temp, arg_reloc;
   6591   pa_symbol_type type = SYMBOL_TYPE_UNKNOWN;
   6592   asymbol *bfdsym = symbol_get_bfdsym (symbolP);
   6593 
   6594   if (strncasecmp (input_line_pointer, "absolute", 8) == 0)
   6595     {
   6596       input_line_pointer += 8;
   6597       bfdsym->flags &= ~BSF_FUNCTION;
   6598       S_SET_SEGMENT (symbolP, bfd_abs_section_ptr);
   6599       type = SYMBOL_TYPE_ABSOLUTE;
   6600     }
   6601   else if (strncasecmp (input_line_pointer, "code", 4) == 0)
   6602     {
   6603       input_line_pointer += 4;
   6604       /* IMPORTing/EXPORTing CODE types for functions is meaningless for SOM,
   6605 	 instead one should be IMPORTing/EXPORTing ENTRY types.
   6606 
   6607 	 Complain if one tries to EXPORT a CODE type since that's never
   6608 	 done.  Both GCC and HP C still try to IMPORT CODE types, so
   6609 	 silently fix them to be ENTRY types.  */
   6610       if (S_IS_FUNCTION (symbolP))
   6611 	{
   6612 	  if (is_export)
   6613 	    as_tsktsk (_("Using ENTRY rather than CODE in export directive for %s"),
   6614 		       S_GET_NAME (symbolP));
   6615 
   6616 	  bfdsym->flags |= BSF_FUNCTION;
   6617 	  type = SYMBOL_TYPE_ENTRY;
   6618 	}
   6619       else
   6620 	{
   6621 	  bfdsym->flags &= ~BSF_FUNCTION;
   6622 	  type = SYMBOL_TYPE_CODE;
   6623 	}
   6624     }
   6625   else if (strncasecmp (input_line_pointer, "data", 4) == 0)
   6626     {
   6627       input_line_pointer += 4;
   6628       bfdsym->flags &= ~BSF_FUNCTION;
   6629       bfdsym->flags |= BSF_OBJECT;
   6630       type = SYMBOL_TYPE_DATA;
   6631     }
   6632   else if ((strncasecmp (input_line_pointer, "entry", 5) == 0))
   6633     {
   6634       input_line_pointer += 5;
   6635       bfdsym->flags |= BSF_FUNCTION;
   6636       type = SYMBOL_TYPE_ENTRY;
   6637     }
   6638   else if (strncasecmp (input_line_pointer, "millicode", 9) == 0)
   6639     {
   6640       input_line_pointer += 9;
   6641       bfdsym->flags |= BSF_FUNCTION;
   6642 #ifdef OBJ_ELF
   6643       {
   6644 	elf_symbol_type *elfsym = (elf_symbol_type *) bfdsym;
   6645 	elfsym->internal_elf_sym.st_info =
   6646 	  ELF_ST_INFO (ELF_ST_BIND (elfsym->internal_elf_sym.st_info),
   6647 		       STT_PARISC_MILLI);
   6648       }
   6649 #endif
   6650       type = SYMBOL_TYPE_MILLICODE;
   6651     }
   6652   else if (strncasecmp (input_line_pointer, "plabel", 6) == 0)
   6653     {
   6654       input_line_pointer += 6;
   6655       bfdsym->flags &= ~BSF_FUNCTION;
   6656       type = SYMBOL_TYPE_PLABEL;
   6657     }
   6658   else if (strncasecmp (input_line_pointer, "pri_prog", 8) == 0)
   6659     {
   6660       input_line_pointer += 8;
   6661       bfdsym->flags |= BSF_FUNCTION;
   6662       type = SYMBOL_TYPE_PRI_PROG;
   6663     }
   6664   else if (strncasecmp (input_line_pointer, "sec_prog", 8) == 0)
   6665     {
   6666       input_line_pointer += 8;
   6667       bfdsym->flags |= BSF_FUNCTION;
   6668       type = SYMBOL_TYPE_SEC_PROG;
   6669     }
   6670 
   6671   /* SOM requires much more information about symbol types
   6672      than BFD understands.  This is how we get this information
   6673      to the SOM BFD backend.  */
   6674 #ifdef obj_set_symbol_type
   6675   obj_set_symbol_type (bfdsym, (int) type);
   6676 #else
   6677   (void) type;
   6678 #endif
   6679 
   6680   /* Now that the type of the exported symbol has been handled,
   6681      handle any argument relocation information.  */
   6682   while (!is_end_of_statement ())
   6683     {
   6684       if (*input_line_pointer == ',')
   6685 	input_line_pointer++;
   6686       name = input_line_pointer;
   6687       c = get_symbol_end ();
   6688       /* Argument sources.  */
   6689       if ((strncasecmp (name, "argw", 4) == 0))
   6690 	{
   6691 	  p = input_line_pointer;
   6692 	  *p = c;
   6693 	  input_line_pointer++;
   6694 	  temp = atoi (name + 4);
   6695 	  name = input_line_pointer;
   6696 	  c = get_symbol_end ();
   6697 	  arg_reloc = pa_align_arg_reloc (temp, pa_build_arg_reloc (name));
   6698 #if defined (OBJ_SOM) || defined (ELF_ARG_RELOC)
   6699 	  symbol_arg_reloc_info (symbolP) |= arg_reloc;
   6700 #else
   6701 	  (void) arg_reloc;
   6702 #endif
   6703 	  *input_line_pointer = c;
   6704 	}
   6705       /* The return value.  */
   6706       else if ((strncasecmp (name, "rtnval", 6)) == 0)
   6707 	{
   6708 	  p = input_line_pointer;
   6709 	  *p = c;
   6710 	  input_line_pointer++;
   6711 	  name = input_line_pointer;
   6712 	  c = get_symbol_end ();
   6713 	  arg_reloc = pa_build_arg_reloc (name);
   6714 #if defined (OBJ_SOM) || defined (ELF_ARG_RELOC)
   6715 	  symbol_arg_reloc_info (symbolP) |= arg_reloc;
   6716 #else
   6717 	  (void) arg_reloc;
   6718 #endif
   6719 	  *input_line_pointer = c;
   6720 	}
   6721       /* Privilege level.  */
   6722       else if ((strncasecmp (name, "priv_lev", 8)) == 0)
   6723 	{
   6724 	  p = input_line_pointer;
   6725 	  *p = c;
   6726 	  input_line_pointer++;
   6727 	  temp = atoi (input_line_pointer);
   6728 #ifdef OBJ_SOM
   6729 	  ((obj_symbol_type *) bfdsym)->tc_data.ap.hppa_priv_level = temp;
   6730 #endif
   6731 	  c = get_symbol_end ();
   6732 	  *input_line_pointer = c;
   6733 	}
   6734       else
   6735 	{
   6736 	  as_bad (_("Undefined .EXPORT/.IMPORT argument (ignored): %s"), name);
   6737 	  p = input_line_pointer;
   6738 	  *p = c;
   6739 	}
   6740       if (!is_end_of_statement ())
   6741 	input_line_pointer++;
   6742     }
   6743 }
   6744 
   6745 /* Process a .EXPORT directive.  This makes functions external
   6746    and provides information such as argument relocation entries
   6747    to callers.  */
   6748 
   6749 static void
   6750 pa_export (int unused ATTRIBUTE_UNUSED)
   6751 {
   6752   char *name, c, *p;
   6753   symbolS *symbol;
   6754 
   6755   name = input_line_pointer;
   6756   c = get_symbol_end ();
   6757   /* Make sure the given symbol exists.  */
   6758   if ((symbol = symbol_find_or_make (name)) == NULL)
   6759     {
   6760       as_bad (_("Cannot define export symbol: %s\n"), name);
   6761       p = input_line_pointer;
   6762       *p = c;
   6763       input_line_pointer++;
   6764     }
   6765   else
   6766     {
   6767       /* OK.  Set the external bits and process argument relocations.
   6768 	 For the HP, weak and global are not mutually exclusive.
   6769 	 S_SET_EXTERNAL will not set BSF_GLOBAL if WEAK is set.
   6770 	 Call S_SET_EXTERNAL to get the other processing.  Manually
   6771 	 set BSF_GLOBAL when we get back.  */
   6772       S_SET_EXTERNAL (symbol);
   6773       symbol_get_bfdsym (symbol)->flags |= BSF_GLOBAL;
   6774       p = input_line_pointer;
   6775       *p = c;
   6776       if (!is_end_of_statement ())
   6777 	{
   6778 	  input_line_pointer++;
   6779 	  pa_type_args (symbol, 1);
   6780 	}
   6781     }
   6782 
   6783   demand_empty_rest_of_line ();
   6784 }
   6785 
   6786 /* Handle an .IMPORT pseudo-op.  Any symbol referenced in a given
   6787    assembly file must either be defined in the assembly file, or
   6788    explicitly IMPORTED from another.  */
   6789 
   6790 static void
   6791 pa_import (int unused ATTRIBUTE_UNUSED)
   6792 {
   6793   char *name, c, *p;
   6794   symbolS *symbol;
   6795 
   6796   name = input_line_pointer;
   6797   c = get_symbol_end ();
   6798 
   6799   symbol = symbol_find (name);
   6800   /* Ugh.  We might be importing a symbol defined earlier in the file,
   6801      in which case all the code below will really screw things up
   6802      (set the wrong segment, symbol flags & type, etc).  */
   6803   if (symbol == NULL || !S_IS_DEFINED (symbol))
   6804     {
   6805       symbol = symbol_find_or_make (name);
   6806       p = input_line_pointer;
   6807       *p = c;
   6808 
   6809       if (!is_end_of_statement ())
   6810 	{
   6811 	  input_line_pointer++;
   6812 	  pa_type_args (symbol, 0);
   6813 	}
   6814       else
   6815 	{
   6816 	  /* Sigh.  To be compatible with the HP assembler and to help
   6817 	     poorly written assembly code, we assign a type based on
   6818 	     the current segment.  Note only BSF_FUNCTION really
   6819 	     matters, we do not need to set the full SYMBOL_TYPE_* info.  */
   6820 	  if (now_seg == text_section)
   6821 	    symbol_get_bfdsym (symbol)->flags |= BSF_FUNCTION;
   6822 
   6823 	  /* If the section is undefined, then the symbol is undefined
   6824 	     Since this is an import, leave the section undefined.  */
   6825 	  S_SET_SEGMENT (symbol, bfd_und_section_ptr);
   6826 	}
   6827     }
   6828   else
   6829     {
   6830       /* The symbol was already defined.  Just eat everything up to
   6831 	 the end of the current statement.  */
   6832       while (!is_end_of_statement ())
   6833 	input_line_pointer++;
   6834     }
   6835 
   6836   demand_empty_rest_of_line ();
   6837 }
   6838 
   6839 /* Handle a .LABEL pseudo-op.  */
   6840 
   6841 static void
   6842 pa_label (int unused ATTRIBUTE_UNUSED)
   6843 {
   6844   char *name, c, *p;
   6845 
   6846   name = input_line_pointer;
   6847   c = get_symbol_end ();
   6848 
   6849   if (strlen (name) > 0)
   6850     {
   6851       colon (name);
   6852       p = input_line_pointer;
   6853       *p = c;
   6854     }
   6855   else
   6856     {
   6857       as_warn (_("Missing label name on .LABEL"));
   6858     }
   6859 
   6860   if (!is_end_of_statement ())
   6861     {
   6862       as_warn (_("extra .LABEL arguments ignored."));
   6863       ignore_rest_of_line ();
   6864     }
   6865   demand_empty_rest_of_line ();
   6866 }
   6867 
   6868 /* Handle a .LEAVE pseudo-op.  This is not supported yet.  */
   6869 
   6870 static void
   6871 pa_leave (int unused ATTRIBUTE_UNUSED)
   6872 {
   6873 #ifdef OBJ_SOM
   6874   /* We must have a valid space and subspace.  */
   6875   pa_check_current_space_and_subspace ();
   6876 #endif
   6877 
   6878   as_bad (_("The .LEAVE pseudo-op is not supported"));
   6879   demand_empty_rest_of_line ();
   6880 }
   6881 
   6882 /* Handle a .LEVEL pseudo-op.  */
   6883 
   6884 static void
   6885 pa_level (int unused ATTRIBUTE_UNUSED)
   6886 {
   6887   char *level;
   6888 
   6889   level = input_line_pointer;
   6890   if (strncmp (level, "1.0", 3) == 0)
   6891     {
   6892       input_line_pointer += 3;
   6893       if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, 10))
   6894 	as_warn (_("could not set architecture and machine"));
   6895     }
   6896   else if (strncmp (level, "1.1", 3) == 0)
   6897     {
   6898       input_line_pointer += 3;
   6899       if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, 11))
   6900 	as_warn (_("could not set architecture and machine"));
   6901     }
   6902   else if (strncmp (level, "2.0w", 4) == 0)
   6903     {
   6904       input_line_pointer += 4;
   6905       if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, 25))
   6906 	as_warn (_("could not set architecture and machine"));
   6907     }
   6908   else if (strncmp (level, "2.0", 3) == 0)
   6909     {
   6910       input_line_pointer += 3;
   6911       if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, 20))
   6912 	as_warn (_("could not set architecture and machine"));
   6913     }
   6914   else
   6915     {
   6916       as_bad (_("Unrecognized .LEVEL argument\n"));
   6917       ignore_rest_of_line ();
   6918     }
   6919   demand_empty_rest_of_line ();
   6920 }
   6921 
   6922 /* Handle a .ORIGIN pseudo-op.  */
   6923 
   6924 static void
   6925 pa_origin (int unused ATTRIBUTE_UNUSED)
   6926 {
   6927 #ifdef OBJ_SOM
   6928   /* We must have a valid space and subspace.  */
   6929   pa_check_current_space_and_subspace ();
   6930 #endif
   6931 
   6932   s_org (0);
   6933   pa_undefine_label ();
   6934 }
   6935 
   6936 /* Handle a .PARAM pseudo-op.  This is much like a .EXPORT, except it
   6937    is for static functions.  FIXME.  Should share more code with .EXPORT.  */
   6938 
   6939 static void
   6940 pa_param (int unused ATTRIBUTE_UNUSED)
   6941 {
   6942   char *name, c, *p;
   6943   symbolS *symbol;
   6944 
   6945   name = input_line_pointer;
   6946   c = get_symbol_end ();
   6947 
   6948   if ((symbol = symbol_find_or_make (name)) == NULL)
   6949     {
   6950       as_bad (_("Cannot define static symbol: %s\n"), name);
   6951       p = input_line_pointer;
   6952       *p = c;
   6953       input_line_pointer++;
   6954     }
   6955   else
   6956     {
   6957       S_CLEAR_EXTERNAL (symbol);
   6958       p = input_line_pointer;
   6959       *p = c;
   6960       if (!is_end_of_statement ())
   6961 	{
   6962 	  input_line_pointer++;
   6963 	  pa_type_args (symbol, 0);
   6964 	}
   6965     }
   6966 
   6967   demand_empty_rest_of_line ();
   6968 }
   6969 
   6970 /* Handle a .PROC pseudo-op.  It is used to mark the beginning
   6971    of a procedure from a syntactical point of view.  */
   6972 
   6973 static void
   6974 pa_proc (int unused ATTRIBUTE_UNUSED)
   6975 {
   6976   struct call_info *call_info;
   6977 
   6978 #ifdef OBJ_SOM
   6979   /* We must have a valid space and subspace.  */
   6980   pa_check_current_space_and_subspace ();
   6981 #endif
   6982 
   6983   if (within_procedure)
   6984     as_fatal (_("Nested procedures"));
   6985 
   6986   /* Reset global variables for new procedure.  */
   6987   callinfo_found = FALSE;
   6988   within_procedure = TRUE;
   6989 
   6990   /* Create another call_info structure.  */
   6991   call_info = xmalloc (sizeof (struct call_info));
   6992 
   6993   if (!call_info)
   6994     as_fatal (_("Cannot allocate unwind descriptor\n"));
   6995 
   6996   memset (call_info, 0, sizeof (struct call_info));
   6997 
   6998   call_info->ci_next = NULL;
   6999 
   7000   if (call_info_root == NULL)
   7001     {
   7002       call_info_root = call_info;
   7003       last_call_info = call_info;
   7004     }
   7005   else
   7006     {
   7007       last_call_info->ci_next = call_info;
   7008       last_call_info = call_info;
   7009     }
   7010 
   7011   /* set up defaults on call_info structure */
   7012 
   7013   call_info->ci_unwind.descriptor.cannot_unwind = 0;
   7014   call_info->ci_unwind.descriptor.region_desc = 1;
   7015   call_info->ci_unwind.descriptor.hpux_interrupt_marker = 0;
   7016 
   7017   /* If we got a .PROC pseudo-op, we know that the function is defined
   7018      locally.  Make sure it gets into the symbol table.  */
   7019   {
   7020     label_symbol_struct *label_symbol = pa_get_label ();
   7021 
   7022     if (label_symbol)
   7023       {
   7024 	if (label_symbol->lss_label)
   7025 	  {
   7026 	    last_call_info->start_symbol = label_symbol->lss_label;
   7027 	    symbol_get_bfdsym (label_symbol->lss_label)->flags |= BSF_FUNCTION;
   7028 	  }
   7029 	else
   7030 	  as_bad (_("Missing function name for .PROC (corrupted label chain)"));
   7031       }
   7032     else
   7033       last_call_info->start_symbol = NULL;
   7034   }
   7035 
   7036   demand_empty_rest_of_line ();
   7037 }
   7038 
   7039 /* Process the syntactical end of a procedure.  Make sure all the
   7040    appropriate pseudo-ops were found within the procedure.  */
   7041 
   7042 static void
   7043 pa_procend (int unused ATTRIBUTE_UNUSED)
   7044 {
   7045 #ifdef OBJ_SOM
   7046   /* We must have a valid space and subspace.  */
   7047   pa_check_current_space_and_subspace ();
   7048 #endif
   7049 
   7050   /* If we are within a procedure definition, make sure we've
   7051      defined a label for the procedure; handle case where the
   7052      label was defined after the .PROC directive.
   7053 
   7054      Note there's not need to diddle with the segment or fragment
   7055      for the label symbol in this case.  We have already switched
   7056      into the new $CODE$ subspace at this point.  */
   7057   if (within_procedure && last_call_info->start_symbol == NULL)
   7058     {
   7059       label_symbol_struct *label_symbol = pa_get_label ();
   7060 
   7061       if (label_symbol)
   7062 	{
   7063 	  if (label_symbol->lss_label)
   7064 	    {
   7065 	      last_call_info->start_symbol = label_symbol->lss_label;
   7066 	      symbol_get_bfdsym (label_symbol->lss_label)->flags
   7067 		|= BSF_FUNCTION;
   7068 #ifdef OBJ_SOM
   7069 	      /* Also handle allocation of a fixup to hold the unwind
   7070 		 information when the label appears after the proc/procend.  */
   7071 	      if (within_entry_exit)
   7072 		{
   7073 		  char *where;
   7074 		  unsigned int u;
   7075 
   7076 		  where = frag_more (0);
   7077 		  u = UNWIND_LOW32 (&last_call_info->ci_unwind.descriptor);
   7078 		  fix_new_hppa (frag_now, where - frag_now->fr_literal, 0,
   7079 				NULL, (offsetT) 0, NULL,
   7080 				0, R_HPPA_ENTRY, e_fsel, 0, 0, u);
   7081 		}
   7082 #endif
   7083 	    }
   7084 	  else
   7085 	    as_bad (_("Missing function name for .PROC (corrupted label chain)"));
   7086 	}
   7087       else
   7088 	as_bad (_("Missing function name for .PROC"));
   7089     }
   7090 
   7091   if (!within_procedure)
   7092     as_bad (_("misplaced .procend"));
   7093 
   7094   if (!callinfo_found)
   7095     as_bad (_("Missing .callinfo for this procedure"));
   7096 
   7097   if (within_entry_exit)
   7098     as_bad (_("Missing .EXIT for a .ENTRY"));
   7099 
   7100 #ifdef OBJ_ELF
   7101   /* ELF needs to mark the end of each function so that it can compute
   7102      the size of the function (apparently its needed in the symbol table).  */
   7103   hppa_elf_mark_end_of_function ();
   7104 #endif
   7105 
   7106   within_procedure = FALSE;
   7107   demand_empty_rest_of_line ();
   7108   pa_undefine_label ();
   7109 }
   7110 
   7111 #ifdef OBJ_SOM
   7112 /* If VALUE is an exact power of two between zero and 2^31, then
   7113    return log2 (VALUE).  Else return -1.  */
   7114 
   7115 static int
   7116 exact_log2 (int value)
   7117 {
   7118   int shift = 0;
   7119 
   7120   while ((1 << shift) != value && shift < 32)
   7121     shift++;
   7122 
   7123   if (shift >= 32)
   7124     return -1;
   7125   else
   7126     return shift;
   7127 }
   7128 
   7129 /* Check to make sure we have a valid space and subspace.  */
   7130 
   7131 static void
   7132 pa_check_current_space_and_subspace (void)
   7133 {
   7134   if (current_space == NULL)
   7135     as_fatal (_("Not in a space.\n"));
   7136 
   7137   if (current_subspace == NULL)
   7138     as_fatal (_("Not in a subspace.\n"));
   7139 }
   7140 
   7141 /* Parse the parameters to a .SPACE directive; if CREATE_FLAG is nonzero,
   7142    then create a new space entry to hold the information specified
   7143    by the parameters to the .SPACE directive.  */
   7144 
   7145 static sd_chain_struct *
   7146 pa_parse_space_stmt (char *space_name, int create_flag)
   7147 {
   7148   char *name, *ptemp, c;
   7149   char loadable, defined, private, sort;
   7150   int spnum;
   7151   asection *seg = NULL;
   7152   sd_chain_struct *space;
   7153 
   7154   /* Load default values.  */
   7155   spnum = 0;
   7156   sort = 0;
   7157   loadable = TRUE;
   7158   defined = TRUE;
   7159   private = FALSE;
   7160   if (strcmp (space_name, "$TEXT$") == 0)
   7161     {
   7162       seg = pa_def_spaces[0].segment;
   7163       defined = pa_def_spaces[0].defined;
   7164       private = pa_def_spaces[0].private;
   7165       sort = pa_def_spaces[0].sort;
   7166       spnum = pa_def_spaces[0].spnum;
   7167     }
   7168   else if (strcmp (space_name, "$PRIVATE$") == 0)
   7169     {
   7170       seg = pa_def_spaces[1].segment;
   7171       defined = pa_def_spaces[1].defined;
   7172       private = pa_def_spaces[1].private;
   7173       sort = pa_def_spaces[1].sort;
   7174       spnum = pa_def_spaces[1].spnum;
   7175     }
   7176 
   7177   if (!is_end_of_statement ())
   7178     {
   7179       print_errors = FALSE;
   7180       ptemp = input_line_pointer + 1;
   7181       /* First see if the space was specified as a number rather than
   7182 	 as a name.  According to the PA assembly manual the rest of
   7183 	 the line should be ignored.  */
   7184       strict = 0;
   7185       pa_parse_number (&ptemp, 0);
   7186       if (pa_number >= 0)
   7187 	{
   7188 	  spnum = pa_number;
   7189 	  input_line_pointer = ptemp;
   7190 	}
   7191       else
   7192 	{
   7193 	  while (!is_end_of_statement ())
   7194 	    {
   7195 	      input_line_pointer++;
   7196 	      name = input_line_pointer;
   7197 	      c = get_symbol_end ();
   7198 	      if ((strncasecmp (name, "spnum", 5) == 0))
   7199 		{
   7200 		  *input_line_pointer = c;
   7201 		  input_line_pointer++;
   7202 		  spnum = get_absolute_expression ();
   7203 		}
   7204 	      else if ((strncasecmp (name, "sort", 4) == 0))
   7205 		{
   7206 		  *input_line_pointer = c;
   7207 		  input_line_pointer++;
   7208 		  sort = get_absolute_expression ();
   7209 		}
   7210 	      else if ((strncasecmp (name, "unloadable", 10) == 0))
   7211 		{
   7212 		  *input_line_pointer = c;
   7213 		  loadable = FALSE;
   7214 		}
   7215 	      else if ((strncasecmp (name, "notdefined", 10) == 0))
   7216 		{
   7217 		  *input_line_pointer = c;
   7218 		  defined = FALSE;
   7219 		}
   7220 	      else if ((strncasecmp (name, "private", 7) == 0))
   7221 		{
   7222 		  *input_line_pointer = c;
   7223 		  private = TRUE;
   7224 		}
   7225 	      else
   7226 		{
   7227 		  as_bad (_("Invalid .SPACE argument"));
   7228 		  *input_line_pointer = c;
   7229 		  if (!is_end_of_statement ())
   7230 		    input_line_pointer++;
   7231 		}
   7232 	    }
   7233 	}
   7234       print_errors = TRUE;
   7235     }
   7236 
   7237   if (create_flag && seg == NULL)
   7238     seg = subseg_new (space_name, 0);
   7239 
   7240   /* If create_flag is nonzero, then create the new space with
   7241      the attributes computed above.  Else set the values in
   7242      an already existing space -- this can only happen for
   7243      the first occurrence of a built-in space.  */
   7244   if (create_flag)
   7245     space = create_new_space (space_name, spnum, loadable, defined,
   7246 			      private, sort, seg, 1);
   7247   else
   7248     {
   7249       space = is_defined_space (space_name);
   7250       SPACE_SPNUM (space) = spnum;
   7251       SPACE_DEFINED (space) = defined & 1;
   7252       SPACE_USER_DEFINED (space) = 1;
   7253     }
   7254 
   7255 #ifdef obj_set_section_attributes
   7256   obj_set_section_attributes (seg, defined, private, sort, spnum);
   7257 #endif
   7258 
   7259   return space;
   7260 }
   7261 
   7262 /* Handle a .SPACE pseudo-op; this switches the current space to the
   7263    given space, creating the new space if necessary.  */
   7264 
   7265 static void
   7266 pa_space (int unused ATTRIBUTE_UNUSED)
   7267 {
   7268   char *name, c, *space_name, *save_s;
   7269   sd_chain_struct *sd_chain;
   7270 
   7271   if (within_procedure)
   7272     {
   7273       as_bad (_("Can\'t change spaces within a procedure definition. Ignored"));
   7274       ignore_rest_of_line ();
   7275     }
   7276   else
   7277     {
   7278       /* Check for some of the predefined spaces.   FIXME: most of the code
   7279 	 below is repeated several times, can we extract the common parts
   7280 	 and place them into a subroutine or something similar?  */
   7281       /* FIXME Is this (and the next IF stmt) really right?
   7282 	 What if INPUT_LINE_POINTER points to "$TEXT$FOO"?  */
   7283       if (strncmp (input_line_pointer, "$TEXT$", 6) == 0)
   7284 	{
   7285 	  input_line_pointer += 6;
   7286 	  sd_chain = is_defined_space ("$TEXT$");
   7287 	  if (sd_chain == NULL)
   7288 	    sd_chain = pa_parse_space_stmt ("$TEXT$", 1);
   7289 	  else if (SPACE_USER_DEFINED (sd_chain) == 0)
   7290 	    sd_chain = pa_parse_space_stmt ("$TEXT$", 0);
   7291 
   7292 	  current_space = sd_chain;
   7293 	  subseg_set (text_section, sd_chain->sd_last_subseg);
   7294 	  current_subspace
   7295 	    = pa_subsegment_to_subspace (text_section,
   7296 					 sd_chain->sd_last_subseg);
   7297 	  demand_empty_rest_of_line ();
   7298 	  return;
   7299 	}
   7300       if (strncmp (input_line_pointer, "$PRIVATE$", 9) == 0)
   7301 	{
   7302 	  input_line_pointer += 9;
   7303 	  sd_chain = is_defined_space ("$PRIVATE$");
   7304 	  if (sd_chain == NULL)
   7305 	    sd_chain = pa_parse_space_stmt ("$PRIVATE$", 1);
   7306 	  else if (SPACE_USER_DEFINED (sd_chain) == 0)
   7307 	    sd_chain = pa_parse_space_stmt ("$PRIVATE$", 0);
   7308 
   7309 	  current_space = sd_chain;
   7310 	  subseg_set (data_section, sd_chain->sd_last_subseg);
   7311 	  current_subspace
   7312 	    = pa_subsegment_to_subspace (data_section,
   7313 					 sd_chain->sd_last_subseg);
   7314 	  demand_empty_rest_of_line ();
   7315 	  return;
   7316 	}
   7317       if (!strncasecmp (input_line_pointer,
   7318 			GDB_DEBUG_SPACE_NAME,
   7319 			strlen (GDB_DEBUG_SPACE_NAME)))
   7320 	{
   7321 	  input_line_pointer += strlen (GDB_DEBUG_SPACE_NAME);
   7322 	  sd_chain = is_defined_space (GDB_DEBUG_SPACE_NAME);
   7323 	  if (sd_chain == NULL)
   7324 	    sd_chain = pa_parse_space_stmt (GDB_DEBUG_SPACE_NAME, 1);
   7325 	  else if (SPACE_USER_DEFINED (sd_chain) == 0)
   7326 	    sd_chain = pa_parse_space_stmt (GDB_DEBUG_SPACE_NAME, 0);
   7327 
   7328 	  current_space = sd_chain;
   7329 
   7330 	  {
   7331 	    asection *gdb_section
   7332 	    = bfd_make_section_old_way (stdoutput, GDB_DEBUG_SPACE_NAME);
   7333 
   7334 	    subseg_set (gdb_section, sd_chain->sd_last_subseg);
   7335 	    current_subspace
   7336 	      = pa_subsegment_to_subspace (gdb_section,
   7337 					   sd_chain->sd_last_subseg);
   7338 	  }
   7339 	  demand_empty_rest_of_line ();
   7340 	  return;
   7341 	}
   7342 
   7343       /* It could be a space specified by number.  */
   7344       print_errors = 0;
   7345       save_s = input_line_pointer;
   7346       strict = 0;
   7347       pa_parse_number (&input_line_pointer, 0);
   7348       if (pa_number >= 0)
   7349 	{
   7350 	  if ((sd_chain = pa_find_space_by_number (pa_number)))
   7351 	    {
   7352 	      current_space = sd_chain;
   7353 
   7354 	      subseg_set (sd_chain->sd_seg, sd_chain->sd_last_subseg);
   7355 	      current_subspace
   7356 		= pa_subsegment_to_subspace (sd_chain->sd_seg,
   7357 					     sd_chain->sd_last_subseg);
   7358 	      demand_empty_rest_of_line ();
   7359 	      return;
   7360 	    }
   7361 	}
   7362 
   7363       /* Not a number, attempt to create a new space.  */
   7364       print_errors = 1;
   7365       input_line_pointer = save_s;
   7366       name = input_line_pointer;
   7367       c = get_symbol_end ();
   7368       space_name = xmalloc (strlen (name) + 1);
   7369       strcpy (space_name, name);
   7370       *input_line_pointer = c;
   7371 
   7372       sd_chain = pa_parse_space_stmt (space_name, 1);
   7373       current_space = sd_chain;
   7374 
   7375       subseg_set (sd_chain->sd_seg, sd_chain->sd_last_subseg);
   7376       current_subspace = pa_subsegment_to_subspace (sd_chain->sd_seg,
   7377 						  sd_chain->sd_last_subseg);
   7378       demand_empty_rest_of_line ();
   7379     }
   7380 }
   7381 
   7382 /* Switch to a new space.  (I think).  FIXME.  */
   7383 
   7384 static void
   7385 pa_spnum (int unused ATTRIBUTE_UNUSED)
   7386 {
   7387   char *name;
   7388   char c;
   7389   char *p;
   7390   sd_chain_struct *space;
   7391 
   7392   name = input_line_pointer;
   7393   c = get_symbol_end ();
   7394   space = is_defined_space (name);
   7395   if (space)
   7396     {
   7397       p = frag_more (4);
   7398       md_number_to_chars (p, SPACE_SPNUM (space), 4);
   7399     }
   7400   else
   7401     as_warn (_("Undefined space: '%s' Assuming space number = 0."), name);
   7402 
   7403   *input_line_pointer = c;
   7404   demand_empty_rest_of_line ();
   7405 }
   7406 
   7407 /* Handle a .SUBSPACE pseudo-op; this switches the current subspace to the
   7408    given subspace, creating the new subspace if necessary.
   7409 
   7410    FIXME.  Should mirror pa_space more closely, in particular how
   7411    they're broken up into subroutines.  */
   7412 
   7413 static void
   7414 pa_subspace (int create_new)
   7415 {
   7416   char *name, *ss_name, c;
   7417   char loadable, code_only, comdat, common, dup_common, zero, sort;
   7418   int i, access_ctr, space_index, alignment, quadrant, applicable, flags;
   7419   sd_chain_struct *space;
   7420   ssd_chain_struct *ssd;
   7421   asection *section;
   7422 
   7423   if (current_space == NULL)
   7424     as_fatal (_("Must be in a space before changing or declaring subspaces.\n"));
   7425 
   7426   if (within_procedure)
   7427     {
   7428       as_bad (_("Can\'t change subspaces within a procedure definition. Ignored"));
   7429       ignore_rest_of_line ();
   7430     }
   7431   else
   7432     {
   7433       name = input_line_pointer;
   7434       c = get_symbol_end ();
   7435       ss_name = xmalloc (strlen (name) + 1);
   7436       strcpy (ss_name, name);
   7437       *input_line_pointer = c;
   7438 
   7439       /* Load default values.  */
   7440       sort = 0;
   7441       access_ctr = 0x7f;
   7442       loadable = 1;
   7443       comdat = 0;
   7444       common = 0;
   7445       dup_common = 0;
   7446       code_only = 0;
   7447       zero = 0;
   7448       space_index = ~0;
   7449       alignment = 1;
   7450       quadrant = 0;
   7451 
   7452       space = current_space;
   7453       if (create_new)
   7454 	ssd = NULL;
   7455       else
   7456 	ssd = is_defined_subspace (ss_name);
   7457       /* Allow user to override the builtin attributes of subspaces.  But
   7458 	 only allow the attributes to be changed once!  */
   7459       if (ssd && SUBSPACE_DEFINED (ssd))
   7460 	{
   7461 	  subseg_set (ssd->ssd_seg, ssd->ssd_subseg);
   7462 	  current_subspace = ssd;
   7463 	  if (!is_end_of_statement ())
   7464 	    as_warn (_("Parameters of an existing subspace can\'t be modified"));
   7465 	  demand_empty_rest_of_line ();
   7466 	  return;
   7467 	}
   7468       else
   7469 	{
   7470 	  /* A new subspace.  Load default values if it matches one of
   7471 	     the builtin subspaces.  */
   7472 	  i = 0;
   7473 	  while (pa_def_subspaces[i].name)
   7474 	    {
   7475 	      if (strcasecmp (pa_def_subspaces[i].name, ss_name) == 0)
   7476 		{
   7477 		  loadable = pa_def_subspaces[i].loadable;
   7478 		  comdat = pa_def_subspaces[i].comdat;
   7479 		  common = pa_def_subspaces[i].common;
   7480 		  dup_common = pa_def_subspaces[i].dup_common;
   7481 		  code_only = pa_def_subspaces[i].code_only;
   7482 		  zero = pa_def_subspaces[i].zero;
   7483 		  space_index = pa_def_subspaces[i].space_index;
   7484 		  alignment = pa_def_subspaces[i].alignment;
   7485 		  quadrant = pa_def_subspaces[i].quadrant;
   7486 		  access_ctr = pa_def_subspaces[i].access;
   7487 		  sort = pa_def_subspaces[i].sort;
   7488 		  break;
   7489 		}
   7490 	      i++;
   7491 	    }
   7492 	}
   7493 
   7494       /* We should be working with a new subspace now.  Fill in
   7495 	 any information as specified by the user.  */
   7496       if (!is_end_of_statement ())
   7497 	{
   7498 	  input_line_pointer++;
   7499 	  while (!is_end_of_statement ())
   7500 	    {
   7501 	      name = input_line_pointer;
   7502 	      c = get_symbol_end ();
   7503 	      if ((strncasecmp (name, "quad", 4) == 0))
   7504 		{
   7505 		  *input_line_pointer = c;
   7506 		  input_line_pointer++;
   7507 		  quadrant = get_absolute_expression ();
   7508 		}
   7509 	      else if ((strncasecmp (name, "align", 5) == 0))
   7510 		{
   7511 		  *input_line_pointer = c;
   7512 		  input_line_pointer++;
   7513 		  alignment = get_absolute_expression ();
   7514 		  if (exact_log2 (alignment) == -1)
   7515 		    {
   7516 		      as_bad (_("Alignment must be a power of 2"));
   7517 		      alignment = 1;
   7518 		    }
   7519 		}
   7520 	      else if ((strncasecmp (name, "access", 6) == 0))
   7521 		{
   7522 		  *input_line_pointer = c;
   7523 		  input_line_pointer++;
   7524 		  access_ctr = get_absolute_expression ();
   7525 		}
   7526 	      else if ((strncasecmp (name, "sort", 4) == 0))
   7527 		{
   7528 		  *input_line_pointer = c;
   7529 		  input_line_pointer++;
   7530 		  sort = get_absolute_expression ();
   7531 		}
   7532 	      else if ((strncasecmp (name, "code_only", 9) == 0))
   7533 		{
   7534 		  *input_line_pointer = c;
   7535 		  code_only = 1;
   7536 		}
   7537 	      else if ((strncasecmp (name, "unloadable", 10) == 0))
   7538 		{
   7539 		  *input_line_pointer = c;
   7540 		  loadable = 0;
   7541 		}
   7542 	      else if ((strncasecmp (name, "comdat", 6) == 0))
   7543 		{
   7544 		  *input_line_pointer = c;
   7545 		  comdat = 1;
   7546 		}
   7547 	      else if ((strncasecmp (name, "common", 6) == 0))
   7548 		{
   7549 		  *input_line_pointer = c;
   7550 		  common = 1;
   7551 		}
   7552 	      else if ((strncasecmp (name, "dup_comm", 8) == 0))
   7553 		{
   7554 		  *input_line_pointer = c;
   7555 		  dup_common = 1;
   7556 		}
   7557 	      else if ((strncasecmp (name, "zero", 4) == 0))
   7558 		{
   7559 		  *input_line_pointer = c;
   7560 		  zero = 1;
   7561 		}
   7562 	      else if ((strncasecmp (name, "first", 5) == 0))
   7563 		as_bad (_("FIRST not supported as a .SUBSPACE argument"));
   7564 	      else
   7565 		as_bad (_("Invalid .SUBSPACE argument"));
   7566 	      if (!is_end_of_statement ())
   7567 		input_line_pointer++;
   7568 	    }
   7569 	}
   7570 
   7571       /* Compute a reasonable set of BFD flags based on the information
   7572 	 in the .subspace directive.  */
   7573       applicable = bfd_applicable_section_flags (stdoutput);
   7574       flags = 0;
   7575       if (loadable)
   7576 	flags |= (SEC_ALLOC | SEC_LOAD);
   7577       if (code_only)
   7578 	flags |= SEC_CODE;
   7579 
   7580       /* These flags are used to implement various flavors of initialized
   7581 	 common.  The SOM linker discards duplicate subspaces when they
   7582 	 have the same "key" symbol name.  This support is more like
   7583 	 GNU linkonce than BFD common.  Further, pc-relative relocations
   7584 	 are converted to section relative relocations in BFD common
   7585 	 sections.  This complicates the handling of relocations in
   7586 	 common sections containing text and isn't currently supported
   7587 	 correctly in the SOM BFD backend.  */
   7588       if (comdat || common || dup_common)
   7589 	flags |= SEC_LINK_ONCE;
   7590 
   7591       flags |= SEC_RELOC | SEC_HAS_CONTENTS;
   7592 
   7593       /* This is a zero-filled subspace (eg BSS).  */
   7594       if (zero)
   7595 	flags &= ~(SEC_LOAD | SEC_HAS_CONTENTS);
   7596 
   7597       applicable &= flags;
   7598 
   7599       /* If this is an existing subspace, then we want to use the
   7600 	 segment already associated with the subspace.
   7601 
   7602 	 FIXME NOW!  ELF BFD doesn't appear to be ready to deal with
   7603 	 lots of sections.  It might be a problem in the PA ELF
   7604 	 code, I do not know yet.  For now avoid creating anything
   7605 	 but the "standard" sections for ELF.  */
   7606       if (create_new)
   7607 	section = subseg_force_new (ss_name, 0);
   7608       else if (ssd)
   7609 	section = ssd->ssd_seg;
   7610       else
   7611 	section = subseg_new (ss_name, 0);
   7612 
   7613       if (zero)
   7614 	seg_info (section)->bss = 1;
   7615 
   7616       /* Now set the flags.  */
   7617       bfd_set_section_flags (stdoutput, section, applicable);
   7618 
   7619       /* Record any alignment request for this section.  */
   7620       record_alignment (section, exact_log2 (alignment));
   7621 
   7622       /* Set the starting offset for this section.  */
   7623       bfd_set_section_vma (stdoutput, section,
   7624 			   pa_subspace_start (space, quadrant));
   7625 
   7626       /* Now that all the flags are set, update an existing subspace,
   7627 	 or create a new one.  */
   7628       if (ssd)
   7629 
   7630 	current_subspace = update_subspace (space, ss_name, loadable,
   7631 					    code_only, comdat, common,
   7632 					    dup_common, sort, zero, access_ctr,
   7633 					    space_index, alignment, quadrant,
   7634 					    section);
   7635       else
   7636 	current_subspace = create_new_subspace (space, ss_name, loadable,
   7637 						code_only, comdat, common,
   7638 						dup_common, zero, sort,
   7639 						access_ctr, space_index,
   7640 						alignment, quadrant, section);
   7641 
   7642       demand_empty_rest_of_line ();
   7643       current_subspace->ssd_seg = section;
   7644       subseg_set (current_subspace->ssd_seg, current_subspace->ssd_subseg);
   7645     }
   7646   SUBSPACE_DEFINED (current_subspace) = 1;
   7647 }
   7648 
   7649 /* Create default space and subspace dictionaries.  */
   7650 
   7651 static void
   7652 pa_spaces_begin (void)
   7653 {
   7654   int i;
   7655 
   7656   space_dict_root = NULL;
   7657   space_dict_last = NULL;
   7658 
   7659   i = 0;
   7660   while (pa_def_spaces[i].name)
   7661     {
   7662       char *name;
   7663 
   7664       /* Pick the right name to use for the new section.  */
   7665       name = pa_def_spaces[i].name;
   7666 
   7667       pa_def_spaces[i].segment = subseg_new (name, 0);
   7668       create_new_space (pa_def_spaces[i].name, pa_def_spaces[i].spnum,
   7669 			pa_def_spaces[i].loadable, pa_def_spaces[i].defined,
   7670 			pa_def_spaces[i].private, pa_def_spaces[i].sort,
   7671 			pa_def_spaces[i].segment, 0);
   7672       i++;
   7673     }
   7674 
   7675   i = 0;
   7676   while (pa_def_subspaces[i].name)
   7677     {
   7678       char *name;
   7679       int applicable, subsegment;
   7680       asection *segment = NULL;
   7681       sd_chain_struct *space;
   7682 
   7683       /* Pick the right name for the new section and pick the right
   7684 	 subsegment number.  */
   7685       name = pa_def_subspaces[i].name;
   7686       subsegment = 0;
   7687 
   7688       /* Create the new section.  */
   7689       segment = subseg_new (name, subsegment);
   7690 
   7691       /* For SOM we want to replace the standard .text, .data, and .bss
   7692 	 sections with our own.   We also want to set BFD flags for
   7693 	 all the built-in subspaces.  */
   7694       if (!strcmp (pa_def_subspaces[i].name, "$CODE$"))
   7695 	{
   7696 	  text_section = segment;
   7697 	  applicable = bfd_applicable_section_flags (stdoutput);
   7698 	  bfd_set_section_flags (stdoutput, segment,
   7699 				 applicable & (SEC_ALLOC | SEC_LOAD
   7700 					       | SEC_RELOC | SEC_CODE
   7701 					       | SEC_READONLY
   7702 					       | SEC_HAS_CONTENTS));
   7703 	}
   7704       else if (!strcmp (pa_def_subspaces[i].name, "$DATA$"))
   7705 	{
   7706 	  data_section = segment;
   7707 	  applicable = bfd_applicable_section_flags (stdoutput);
   7708 	  bfd_set_section_flags (stdoutput, segment,
   7709 				 applicable & (SEC_ALLOC | SEC_LOAD
   7710 					       | SEC_RELOC
   7711 					       | SEC_HAS_CONTENTS));
   7712 
   7713 	}
   7714       else if (!strcmp (pa_def_subspaces[i].name, "$BSS$"))
   7715 	{
   7716 	  bss_section = segment;
   7717 	  applicable = bfd_applicable_section_flags (stdoutput);
   7718 	  bfd_set_section_flags (stdoutput, segment,
   7719 				 applicable & SEC_ALLOC);
   7720 	}
   7721       else if (!strcmp (pa_def_subspaces[i].name, "$LIT$"))
   7722 	{
   7723 	  applicable = bfd_applicable_section_flags (stdoutput);
   7724 	  bfd_set_section_flags (stdoutput, segment,
   7725 				 applicable & (SEC_ALLOC | SEC_LOAD
   7726 					       | SEC_RELOC
   7727 					       | SEC_READONLY
   7728 					       | SEC_HAS_CONTENTS));
   7729 	}
   7730       else if (!strcmp (pa_def_subspaces[i].name, "$MILLICODE$"))
   7731 	{
   7732 	  applicable = bfd_applicable_section_flags (stdoutput);
   7733 	  bfd_set_section_flags (stdoutput, segment,
   7734 				 applicable & (SEC_ALLOC | SEC_LOAD
   7735 					       | SEC_RELOC
   7736 					       | SEC_READONLY
   7737 					       | SEC_HAS_CONTENTS));
   7738 	}
   7739       else if (!strcmp (pa_def_subspaces[i].name, "$UNWIND$"))
   7740 	{
   7741 	  applicable = bfd_applicable_section_flags (stdoutput);
   7742 	  bfd_set_section_flags (stdoutput, segment,
   7743 				 applicable & (SEC_ALLOC | SEC_LOAD
   7744 					       | SEC_RELOC
   7745 					       | SEC_READONLY
   7746 					       | SEC_HAS_CONTENTS));
   7747 	}
   7748 
   7749       /* Find the space associated with this subspace.  */
   7750       space = pa_segment_to_space (pa_def_spaces[pa_def_subspaces[i].
   7751 						 def_space_index].segment);
   7752       if (space == NULL)
   7753 	{
   7754 	  as_fatal (_("Internal error: Unable to find containing space for %s."),
   7755 		    pa_def_subspaces[i].name);
   7756 	}
   7757 
   7758       create_new_subspace (space, name,
   7759 			   pa_def_subspaces[i].loadable,
   7760 			   pa_def_subspaces[i].code_only,
   7761 			   pa_def_subspaces[i].comdat,
   7762 			   pa_def_subspaces[i].common,
   7763 			   pa_def_subspaces[i].dup_common,
   7764 			   pa_def_subspaces[i].zero,
   7765 			   pa_def_subspaces[i].sort,
   7766 			   pa_def_subspaces[i].access,
   7767 			   pa_def_subspaces[i].space_index,
   7768 			   pa_def_subspaces[i].alignment,
   7769 			   pa_def_subspaces[i].quadrant,
   7770 			   segment);
   7771       i++;
   7772     }
   7773 }
   7774 
   7775 /* Create a new space NAME, with the appropriate flags as defined
   7776    by the given parameters.  */
   7777 
   7778 static sd_chain_struct *
   7779 create_new_space (char *name,
   7780 		  int spnum,
   7781 		  int loadable ATTRIBUTE_UNUSED,
   7782 		  int defined,
   7783 		  int private,
   7784 		  int sort,
   7785 		  asection *seg,
   7786 		  int user_defined)
   7787 {
   7788   sd_chain_struct *chain_entry;
   7789 
   7790   chain_entry = xmalloc (sizeof (sd_chain_struct));
   7791   if (!chain_entry)
   7792     as_fatal (_("Out of memory: could not allocate new space chain entry: %s\n"),
   7793 	      name);
   7794 
   7795   SPACE_NAME (chain_entry) = xmalloc (strlen (name) + 1);
   7796   strcpy (SPACE_NAME (chain_entry), name);
   7797   SPACE_DEFINED (chain_entry) = defined;
   7798   SPACE_USER_DEFINED (chain_entry) = user_defined;
   7799   SPACE_SPNUM (chain_entry) = spnum;
   7800 
   7801   chain_entry->sd_seg = seg;
   7802   chain_entry->sd_last_subseg = -1;
   7803   chain_entry->sd_subspaces = NULL;
   7804   chain_entry->sd_next = NULL;
   7805 
   7806   /* Find spot for the new space based on its sort key.  */
   7807   if (!space_dict_last)
   7808     space_dict_last = chain_entry;
   7809 
   7810   if (space_dict_root == NULL)
   7811     space_dict_root = chain_entry;
   7812   else
   7813     {
   7814       sd_chain_struct *chain_pointer;
   7815       sd_chain_struct *prev_chain_pointer;
   7816 
   7817       chain_pointer = space_dict_root;
   7818       prev_chain_pointer = NULL;
   7819 
   7820       while (chain_pointer)
   7821 	{
   7822 	  prev_chain_pointer = chain_pointer;
   7823 	  chain_pointer = chain_pointer->sd_next;
   7824 	}
   7825 
   7826       /* At this point we've found the correct place to add the new
   7827 	 entry.  So add it and update the linked lists as appropriate.  */
   7828       if (prev_chain_pointer)
   7829 	{
   7830 	  chain_entry->sd_next = chain_pointer;
   7831 	  prev_chain_pointer->sd_next = chain_entry;
   7832 	}
   7833       else
   7834 	{
   7835 	  space_dict_root = chain_entry;
   7836 	  chain_entry->sd_next = chain_pointer;
   7837 	}
   7838 
   7839       if (chain_entry->sd_next == NULL)
   7840 	space_dict_last = chain_entry;
   7841     }
   7842 
   7843   /* This is here to catch predefined spaces which do not get
   7844      modified by the user's input.  Another call is found at
   7845      the bottom of pa_parse_space_stmt to handle cases where
   7846      the user modifies a predefined space.  */
   7847 #ifdef obj_set_section_attributes
   7848   obj_set_section_attributes (seg, defined, private, sort, spnum);
   7849 #endif
   7850 
   7851   return chain_entry;
   7852 }
   7853 
   7854 /* Create a new subspace NAME, with the appropriate flags as defined
   7855    by the given parameters.
   7856 
   7857    Add the new subspace to the subspace dictionary chain in numerical
   7858    order as defined by the SORT entries.  */
   7859 
   7860 static ssd_chain_struct *
   7861 create_new_subspace (sd_chain_struct *space,
   7862 		     char *name,
   7863 		     int loadable ATTRIBUTE_UNUSED,
   7864 		     int code_only ATTRIBUTE_UNUSED,
   7865 		     int comdat,
   7866 		     int common,
   7867 		     int dup_common,
   7868 		     int is_zero ATTRIBUTE_UNUSED,
   7869 		     int sort,
   7870 		     int access_ctr,
   7871 		     int space_index ATTRIBUTE_UNUSED,
   7872 		     int alignment ATTRIBUTE_UNUSED,
   7873 		     int quadrant,
   7874 		     asection *seg)
   7875 {
   7876   ssd_chain_struct *chain_entry;
   7877 
   7878   chain_entry = xmalloc (sizeof (ssd_chain_struct));
   7879   if (!chain_entry)
   7880     as_fatal (_("Out of memory: could not allocate new subspace chain entry: %s\n"), name);
   7881 
   7882   SUBSPACE_NAME (chain_entry) = xmalloc (strlen (name) + 1);
   7883   strcpy (SUBSPACE_NAME (chain_entry), name);
   7884 
   7885   /* Initialize subspace_defined.  When we hit a .subspace directive
   7886      we'll set it to 1 which "locks-in" the subspace attributes.  */
   7887   SUBSPACE_DEFINED (chain_entry) = 0;
   7888 
   7889   chain_entry->ssd_subseg = 0;
   7890   chain_entry->ssd_seg = seg;
   7891   chain_entry->ssd_next = NULL;
   7892 
   7893   /* Find spot for the new subspace based on its sort key.  */
   7894   if (space->sd_subspaces == NULL)
   7895     space->sd_subspaces = chain_entry;
   7896   else
   7897     {
   7898       ssd_chain_struct *chain_pointer;
   7899       ssd_chain_struct *prev_chain_pointer;
   7900 
   7901       chain_pointer = space->sd_subspaces;
   7902       prev_chain_pointer = NULL;
   7903 
   7904       while (chain_pointer)
   7905 	{
   7906 	  prev_chain_pointer = chain_pointer;
   7907 	  chain_pointer = chain_pointer->ssd_next;
   7908 	}
   7909 
   7910       /* Now we have somewhere to put the new entry.  Insert it and update
   7911 	 the links.  */
   7912       if (prev_chain_pointer)
   7913 	{
   7914 	  chain_entry->ssd_next = chain_pointer;
   7915 	  prev_chain_pointer->ssd_next = chain_entry;
   7916 	}
   7917       else
   7918 	{
   7919 	  space->sd_subspaces = chain_entry;
   7920 	  chain_entry->ssd_next = chain_pointer;
   7921 	}
   7922     }
   7923 
   7924 #ifdef obj_set_subsection_attributes
   7925   obj_set_subsection_attributes (seg, space->sd_seg, access_ctr, sort,
   7926 				 quadrant, comdat, common, dup_common);
   7927 #endif
   7928 
   7929   return chain_entry;
   7930 }
   7931 
   7932 /* Update the information for the given subspace based upon the
   7933    various arguments.   Return the modified subspace chain entry.  */
   7934 
   7935 static ssd_chain_struct *
   7936 update_subspace (sd_chain_struct *space,
   7937 		 char *name,
   7938 		 int loadable ATTRIBUTE_UNUSED,
   7939 		 int code_only ATTRIBUTE_UNUSED,
   7940 		 int comdat,
   7941 		 int common,
   7942 		 int dup_common,
   7943 		 int sort,
   7944 		 int zero ATTRIBUTE_UNUSED,
   7945 		 int access_ctr,
   7946 		 int space_index ATTRIBUTE_UNUSED,
   7947 		 int alignment ATTRIBUTE_UNUSED,
   7948 		 int quadrant,
   7949 		 asection *section)
   7950 {
   7951   ssd_chain_struct *chain_entry;
   7952 
   7953   chain_entry = is_defined_subspace (name);
   7954 
   7955 #ifdef obj_set_subsection_attributes
   7956   obj_set_subsection_attributes (section, space->sd_seg, access_ctr, sort,
   7957 				 quadrant, comdat, common, dup_common);
   7958 #endif
   7959 
   7960   return chain_entry;
   7961 }
   7962 
   7963 /* Return the space chain entry for the space with the name NAME or
   7964    NULL if no such space exists.  */
   7965 
   7966 static sd_chain_struct *
   7967 is_defined_space (char *name)
   7968 {
   7969   sd_chain_struct *chain_pointer;
   7970 
   7971   for (chain_pointer = space_dict_root;
   7972        chain_pointer;
   7973        chain_pointer = chain_pointer->sd_next)
   7974     if (strcmp (SPACE_NAME (chain_pointer), name) == 0)
   7975       return chain_pointer;
   7976 
   7977   /* No mapping from segment to space was found.  Return NULL.  */
   7978   return NULL;
   7979 }
   7980 
   7981 /* Find and return the space associated with the given seg.  If no mapping
   7982    from the given seg to a space is found, then return NULL.
   7983 
   7984    Unlike subspaces, the number of spaces is not expected to grow much,
   7985    so a linear exhaustive search is OK here.  */
   7986 
   7987 static sd_chain_struct *
   7988 pa_segment_to_space (asection *seg)
   7989 {
   7990   sd_chain_struct *space_chain;
   7991 
   7992   /* Walk through each space looking for the correct mapping.  */
   7993   for (space_chain = space_dict_root;
   7994        space_chain;
   7995        space_chain = space_chain->sd_next)
   7996     if (space_chain->sd_seg == seg)
   7997       return space_chain;
   7998 
   7999   /* Mapping was not found.  Return NULL.  */
   8000   return NULL;
   8001 }
   8002 
   8003 /* Return the first space chain entry for the subspace with the name
   8004    NAME or NULL if no such subspace exists.
   8005 
   8006    When there are multiple subspaces with the same name, switching to
   8007    the first (i.e., default) subspace is preferable in most situations.
   8008    For example, it wouldn't be desirable to merge COMDAT data with non
   8009    COMDAT data.
   8010 
   8011    Uses a linear search through all the spaces and subspaces, this may
   8012    not be appropriate if we ever being placing each function in its
   8013    own subspace.  */
   8014 
   8015 static ssd_chain_struct *
   8016 is_defined_subspace (char *name)
   8017 {
   8018   sd_chain_struct *space_chain;
   8019   ssd_chain_struct *subspace_chain;
   8020 
   8021   /* Walk through each space.  */
   8022   for (space_chain = space_dict_root;
   8023        space_chain;
   8024        space_chain = space_chain->sd_next)
   8025     {
   8026       /* Walk through each subspace looking for a name which matches.  */
   8027       for (subspace_chain = space_chain->sd_subspaces;
   8028 	   subspace_chain;
   8029 	   subspace_chain = subspace_chain->ssd_next)
   8030 	if (strcmp (SUBSPACE_NAME (subspace_chain), name) == 0)
   8031 	  return subspace_chain;
   8032     }
   8033 
   8034   /* Subspace wasn't found.  Return NULL.  */
   8035   return NULL;
   8036 }
   8037 
   8038 /* Find and return the subspace associated with the given seg.  If no
   8039    mapping from the given seg to a subspace is found, then return NULL.
   8040 
   8041    If we ever put each procedure/function within its own subspace
   8042    (to make life easier on the compiler and linker), then this will have
   8043    to become more efficient.  */
   8044 
   8045 static ssd_chain_struct *
   8046 pa_subsegment_to_subspace (asection *seg, subsegT subseg)
   8047 {
   8048   sd_chain_struct *space_chain;
   8049   ssd_chain_struct *subspace_chain;
   8050 
   8051   /* Walk through each space.  */
   8052   for (space_chain = space_dict_root;
   8053        space_chain;
   8054        space_chain = space_chain->sd_next)
   8055     {
   8056       if (space_chain->sd_seg == seg)
   8057 	{
   8058 	  /* Walk through each subspace within each space looking for
   8059 	     the correct mapping.  */
   8060 	  for (subspace_chain = space_chain->sd_subspaces;
   8061 	       subspace_chain;
   8062 	       subspace_chain = subspace_chain->ssd_next)
   8063 	    if (subspace_chain->ssd_subseg == (int) subseg)
   8064 	      return subspace_chain;
   8065 	}
   8066     }
   8067 
   8068   /* No mapping from subsegment to subspace found.  Return NULL.  */
   8069   return NULL;
   8070 }
   8071 
   8072 /* Given a number, try and find a space with the name number.
   8073 
   8074    Return a pointer to a space dictionary chain entry for the space
   8075    that was found or NULL on failure.  */
   8076 
   8077 static sd_chain_struct *
   8078 pa_find_space_by_number (int number)
   8079 {
   8080   sd_chain_struct *space_chain;
   8081 
   8082   for (space_chain = space_dict_root;
   8083        space_chain;
   8084        space_chain = space_chain->sd_next)
   8085     {
   8086       if (SPACE_SPNUM (space_chain) == (unsigned int) number)
   8087 	return space_chain;
   8088     }
   8089 
   8090   /* No appropriate space found.  Return NULL.  */
   8091   return NULL;
   8092 }
   8093 
   8094 /* Return the starting address for the given subspace.  If the starting
   8095    address is unknown then return zero.  */
   8096 
   8097 static unsigned int
   8098 pa_subspace_start (sd_chain_struct *space, int quadrant)
   8099 {
   8100   /* FIXME.  Assumes everyone puts read/write data at 0x4000000, this
   8101      is not correct for the PA OSF1 port.  */
   8102   if ((strcmp (SPACE_NAME (space), "$PRIVATE$") == 0) && quadrant == 1)
   8103     return 0x40000000;
   8104   else if (space->sd_seg == data_section && quadrant == 1)
   8105     return 0x40000000;
   8106   else
   8107     return 0;
   8108   return 0;
   8109 }
   8110 #endif
   8111 
   8112 /* Helper function for pa_stringer.  Used to find the end of
   8113    a string.  */
   8114 
   8115 static unsigned int
   8116 pa_stringer_aux (char *s)
   8117 {
   8118   unsigned int c = *s & CHAR_MASK;
   8119 
   8120   switch (c)
   8121     {
   8122     case '\"':
   8123       c = NOT_A_CHAR;
   8124       break;
   8125     default:
   8126       break;
   8127     }
   8128   return c;
   8129 }
   8130 
   8131 /* Handle a .STRING type pseudo-op.  */
   8132 
   8133 static void
   8134 pa_stringer (int append_zero)
   8135 {
   8136   char *s, num_buf[4];
   8137   unsigned int c;
   8138   int i;
   8139 
   8140   /* Preprocess the string to handle PA-specific escape sequences.
   8141      For example, \xDD where DD is a hexadecimal number should be
   8142      changed to \OOO where OOO is an octal number.  */
   8143 
   8144 #ifdef OBJ_SOM
   8145   /* We must have a valid space and subspace.  */
   8146   pa_check_current_space_and_subspace ();
   8147 #endif
   8148 
   8149   /* Skip the opening quote.  */
   8150   s = input_line_pointer + 1;
   8151 
   8152   while (is_a_char (c = pa_stringer_aux (s++)))
   8153     {
   8154       if (c == '\\')
   8155 	{
   8156 	  c = *s;
   8157 	  switch (c)
   8158 	    {
   8159 	      /* Handle \x<num>.  */
   8160 	    case 'x':
   8161 	      {
   8162 		unsigned int number;
   8163 		int num_digit;
   8164 		char dg;
   8165 		char *s_start = s;
   8166 
   8167 		/* Get past the 'x'.  */
   8168 		s++;
   8169 		for (num_digit = 0, number = 0, dg = *s;
   8170 		     num_digit < 2
   8171 		     && (ISDIGIT (dg) || (dg >= 'a' && dg <= 'f')
   8172 			 || (dg >= 'A' && dg <= 'F'));
   8173 		     num_digit++)
   8174 		  {
   8175 		    if (ISDIGIT (dg))
   8176 		      number = number * 16 + dg - '0';
   8177 		    else if (dg >= 'a' && dg <= 'f')
   8178 		      number = number * 16 + dg - 'a' + 10;
   8179 		    else
   8180 		      number = number * 16 + dg - 'A' + 10;
   8181 
   8182 		    s++;
   8183 		    dg = *s;
   8184 		  }
   8185 		if (num_digit > 0)
   8186 		  {
   8187 		    switch (num_digit)
   8188 		      {
   8189 		      case 1:
   8190 			sprintf (num_buf, "%02o", number);
   8191 			break;
   8192 		      case 2:
   8193 			sprintf (num_buf, "%03o", number);
   8194 			break;
   8195 		      }
   8196 		    for (i = 0; i <= num_digit; i++)
   8197 		      s_start[i] = num_buf[i];
   8198 		  }
   8199 		break;
   8200 	      }
   8201 	    /* This might be a "\"", skip over the escaped char.  */
   8202 	    default:
   8203 	      s++;
   8204 	      break;
   8205 	    }
   8206 	}
   8207     }
   8208   stringer (8 + append_zero);
   8209   pa_undefine_label ();
   8210 }
   8211 
   8212 /* Handle a .VERSION pseudo-op.  */
   8213 
   8214 static void
   8215 pa_version (int unused ATTRIBUTE_UNUSED)
   8216 {
   8217   obj_version (0);
   8218   pa_undefine_label ();
   8219 }
   8220 
   8221 #ifdef OBJ_SOM
   8222 
   8223 /* Handle a .COMPILER pseudo-op.  */
   8224 
   8225 static void
   8226 pa_compiler (int unused ATTRIBUTE_UNUSED)
   8227 {
   8228   obj_som_compiler (0);
   8229   pa_undefine_label ();
   8230 }
   8231 
   8232 #endif
   8233 
   8234 /* Handle a .COPYRIGHT pseudo-op.  */
   8235 
   8236 static void
   8237 pa_copyright (int unused ATTRIBUTE_UNUSED)
   8238 {
   8239   obj_copyright (0);
   8240   pa_undefine_label ();
   8241 }
   8242 
   8243 /* Just like a normal cons, but when finished we have to undefine
   8244    the latest space label.  */
   8245 
   8246 static void
   8247 pa_cons (int nbytes)
   8248 {
   8249   cons (nbytes);
   8250   pa_undefine_label ();
   8251 }
   8252 
   8253 /* Like float_cons, but we need to undefine our label.  */
   8254 
   8255 static void
   8256 pa_float_cons (int float_type)
   8257 {
   8258   float_cons (float_type);
   8259   pa_undefine_label ();
   8260 }
   8261 
   8262 /* Like s_fill, but delete our label when finished.  */
   8263 
   8264 static void
   8265 pa_fill (int unused ATTRIBUTE_UNUSED)
   8266 {
   8267 #ifdef OBJ_SOM
   8268   /* We must have a valid space and subspace.  */
   8269   pa_check_current_space_and_subspace ();
   8270 #endif
   8271 
   8272   s_fill (0);
   8273   pa_undefine_label ();
   8274 }
   8275 
   8276 /* Like lcomm, but delete our label when finished.  */
   8277 
   8278 static void
   8279 pa_lcomm (int needs_align)
   8280 {
   8281 #ifdef OBJ_SOM
   8282   /* We must have a valid space and subspace.  */
   8283   pa_check_current_space_and_subspace ();
   8284 #endif
   8285 
   8286   s_lcomm (needs_align);
   8287   pa_undefine_label ();
   8288 }
   8289 
   8290 /* Like lsym, but delete our label when finished.  */
   8291 
   8292 static void
   8293 pa_lsym (int unused ATTRIBUTE_UNUSED)
   8294 {
   8295 #ifdef OBJ_SOM
   8296   /* We must have a valid space and subspace.  */
   8297   pa_check_current_space_and_subspace ();
   8298 #endif
   8299 
   8300   s_lsym (0);
   8301   pa_undefine_label ();
   8302 }
   8303 
   8304 /* This function is called once, at assembler startup time.  It should
   8305    set up all the tables, etc. that the MD part of the assembler will need.  */
   8306 
   8307 void
   8308 md_begin (void)
   8309 {
   8310   const char *retval = NULL;
   8311   int lose = 0;
   8312   unsigned int i = 0;
   8313 
   8314   last_call_info = NULL;
   8315   call_info_root = NULL;
   8316 
   8317   /* Set the default machine type.  */
   8318   if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, DEFAULT_LEVEL))
   8319     as_warn (_("could not set architecture and machine"));
   8320 
   8321   /* Folding of text and data segments fails miserably on the PA.
   8322      Warn user and disable "-R" option.  */
   8323   if (flag_readonly_data_in_text)
   8324     {
   8325       as_warn (_("-R option not supported on this target."));
   8326       flag_readonly_data_in_text = 0;
   8327     }
   8328 
   8329 #ifdef OBJ_SOM
   8330   pa_spaces_begin ();
   8331 #endif
   8332 
   8333   op_hash = hash_new ();
   8334 
   8335   while (i < NUMOPCODES)
   8336     {
   8337       const char *name = pa_opcodes[i].name;
   8338 
   8339       retval = hash_insert (op_hash, name, (struct pa_opcode *) &pa_opcodes[i]);
   8340       if (retval != NULL && *retval != '\0')
   8341 	{
   8342 	  as_fatal (_("Internal error: can't hash `%s': %s\n"), name, retval);
   8343 	  lose = 1;
   8344 	}
   8345 
   8346       do
   8347 	{
   8348 	  if ((pa_opcodes[i].match & pa_opcodes[i].mask)
   8349 	      != pa_opcodes[i].match)
   8350 	    {
   8351 	      fprintf (stderr, _("internal error: losing opcode: `%s' \"%s\"\n"),
   8352 		       pa_opcodes[i].name, pa_opcodes[i].args);
   8353 	      lose = 1;
   8354 	    }
   8355 	  ++i;
   8356 	}
   8357       while (i < NUMOPCODES && !strcmp (pa_opcodes[i].name, name));
   8358     }
   8359 
   8360   if (lose)
   8361     as_fatal (_("Broken assembler.  No assembly attempted."));
   8362 
   8363 #ifdef OBJ_SOM
   8364   /* SOM will change text_section.  To make sure we never put
   8365      anything into the old one switch to the new one now.  */
   8366   subseg_set (text_section, 0);
   8367 #endif
   8368 
   8369 #ifdef OBJ_SOM
   8370   dummy_symbol = symbol_find_or_make ("L$dummy");
   8371   S_SET_SEGMENT (dummy_symbol, text_section);
   8372   /* Force the symbol to be converted to a real symbol.  */
   8373   symbol_get_bfdsym (dummy_symbol)->flags |= BSF_KEEP;
   8374 #endif
   8375 }
   8376 
   8377 /* On the PA relocations which involve function symbols must not be
   8378    adjusted.  This so that the linker can know when/how to create argument
   8379    relocation stubs for indirect calls and calls to static functions.
   8380 
   8381    "T" field selectors create DLT relative fixups for accessing
   8382    globals and statics in PIC code; each DLT relative fixup creates
   8383    an entry in the DLT table.  The entries contain the address of
   8384    the final target (eg accessing "foo" would create a DLT entry
   8385    with the address of "foo").
   8386 
   8387    Unfortunately, the HP linker doesn't take into account any addend
   8388    when generating the DLT; so accessing $LIT$+8 puts the address of
   8389    $LIT$ into the DLT rather than the address of $LIT$+8.
   8390 
   8391    The end result is we can't perform relocation symbol reductions for
   8392    any fixup which creates entries in the DLT (eg they use "T" field
   8393    selectors).
   8394 
   8395    ??? Reject reductions involving symbols with external scope; such
   8396    reductions make life a living hell for object file editors.  */
   8397 
   8398 int
   8399 hppa_fix_adjustable (fixS *fixp)
   8400 {
   8401 #ifdef OBJ_ELF
   8402   reloc_type code;
   8403 #endif
   8404   struct hppa_fix_struct *hppa_fix;
   8405 
   8406   hppa_fix = (struct hppa_fix_struct *) fixp->tc_fix_data;
   8407 
   8408 #ifdef OBJ_ELF
   8409   /* LR/RR selectors are implicitly used for a number of different relocation
   8410      types.  We must ensure that none of these types are adjusted (see below)
   8411      even if they occur with a different selector.  */
   8412   code = elf_hppa_reloc_final_type (stdoutput, fixp->fx_r_type,
   8413 		  		    hppa_fix->fx_r_format,
   8414 				    hppa_fix->fx_r_field);
   8415 
   8416   switch (code)
   8417     {
   8418     /* Relocation types which use e_lrsel.  */
   8419     case R_PARISC_DIR21L:
   8420     case R_PARISC_DLTREL21L:
   8421     case R_PARISC_DPREL21L:
   8422     case R_PARISC_PLTOFF21L:
   8423 
   8424     /* Relocation types which use e_rrsel.  */
   8425     case R_PARISC_DIR14R:
   8426     case R_PARISC_DIR14DR:
   8427     case R_PARISC_DIR14WR:
   8428     case R_PARISC_DIR17R:
   8429     case R_PARISC_DLTREL14R:
   8430     case R_PARISC_DLTREL14DR:
   8431     case R_PARISC_DLTREL14WR:
   8432     case R_PARISC_DPREL14R:
   8433     case R_PARISC_DPREL14DR:
   8434     case R_PARISC_DPREL14WR:
   8435     case R_PARISC_PLTOFF14R:
   8436     case R_PARISC_PLTOFF14DR:
   8437     case R_PARISC_PLTOFF14WR:
   8438 
   8439     /* Other types that we reject for reduction.  */
   8440     case R_PARISC_GNU_VTENTRY:
   8441     case R_PARISC_GNU_VTINHERIT:
   8442       return 0;
   8443     default:
   8444       break;
   8445     }
   8446 #endif
   8447 
   8448   /* Reject reductions of symbols in sym1-sym2 expressions when
   8449      the fixup will occur in a CODE subspace.
   8450 
   8451      XXX FIXME: Long term we probably want to reject all of these;
   8452      for example reducing in the debug section would lose if we ever
   8453      supported using the optimizing hp linker.  */
   8454   if (fixp->fx_addsy
   8455       && fixp->fx_subsy
   8456       && (hppa_fix->segment->flags & SEC_CODE))
   8457     return 0;
   8458 
   8459   /* We can't adjust any relocs that use LR% and RR% field selectors.
   8460 
   8461      If a symbol is reduced to a section symbol, the assembler will
   8462      adjust the addend unless the symbol happens to reside right at
   8463      the start of the section.  Additionally, the linker has no choice
   8464      but to manipulate the addends when coalescing input sections for
   8465      "ld -r".  Since an LR% field selector is defined to round the
   8466      addend, we can't change the addend without risking that a LR% and
   8467      it's corresponding (possible multiple) RR% field will no longer
   8468      sum to the right value.
   8469 
   8470      eg. Suppose we have
   8471      .		ldil	LR%foo+0,%r21
   8472      .		ldw	RR%foo+0(%r21),%r26
   8473      .		ldw	RR%foo+4(%r21),%r25
   8474 
   8475      If foo is at address 4092 (decimal) in section `sect', then after
   8476      reducing to the section symbol we get
   8477      .			LR%sect+4092 == (L%sect)+0
   8478      .			RR%sect+4092 == (R%sect)+4092
   8479      .			RR%sect+4096 == (R%sect)-4096
   8480      and the last address loses because rounding the addend to 8k
   8481      multiples takes us up to 8192 with an offset of -4096.
   8482 
   8483      In cases where the LR% expression is identical to the RR% one we
   8484      will never have a problem, but is so happens that gcc rounds
   8485      addends involved in LR% field selectors to work around a HP
   8486      linker bug.  ie. We often have addresses like the last case
   8487      above where the LR% expression is offset from the RR% one.  */
   8488 
   8489   if (hppa_fix->fx_r_field == e_lrsel
   8490       || hppa_fix->fx_r_field == e_rrsel
   8491       || hppa_fix->fx_r_field == e_nlrsel)
   8492     return 0;
   8493 
   8494   /* Reject reductions of symbols in DLT relative relocs,
   8495      relocations with plabels.  */
   8496   if (hppa_fix->fx_r_field == e_tsel
   8497       || hppa_fix->fx_r_field == e_ltsel
   8498       || hppa_fix->fx_r_field == e_rtsel
   8499       || hppa_fix->fx_r_field == e_psel
   8500       || hppa_fix->fx_r_field == e_rpsel
   8501       || hppa_fix->fx_r_field == e_lpsel)
   8502     return 0;
   8503 
   8504   /* Reject absolute calls (jumps).  */
   8505   if (hppa_fix->fx_r_type == R_HPPA_ABS_CALL)
   8506     return 0;
   8507 
   8508   /* Reject reductions of function symbols.  */
   8509   if (fixp->fx_addsy != 0 && S_IS_FUNCTION (fixp->fx_addsy))
   8510     return 0;
   8511 
   8512   return 1;
   8513 }
   8514 
   8515 /* Return nonzero if the fixup in FIXP will require a relocation,
   8516    even it if appears that the fixup could be completely handled
   8517    within GAS.  */
   8518 
   8519 int
   8520 hppa_force_relocation (struct fix *fixp)
   8521 {
   8522   struct hppa_fix_struct *hppa_fixp;
   8523 
   8524   hppa_fixp = (struct hppa_fix_struct *) fixp->tc_fix_data;
   8525 #ifdef OBJ_SOM
   8526   if (fixp->fx_r_type == (int) R_HPPA_ENTRY
   8527       || fixp->fx_r_type == (int) R_HPPA_EXIT
   8528       || fixp->fx_r_type == (int) R_HPPA_BEGIN_BRTAB
   8529       || fixp->fx_r_type == (int) R_HPPA_END_BRTAB
   8530       || fixp->fx_r_type == (int) R_HPPA_BEGIN_TRY
   8531       || fixp->fx_r_type == (int) R_HPPA_END_TRY
   8532       || (fixp->fx_addsy != NULL && fixp->fx_subsy != NULL
   8533 	  && (hppa_fixp->segment->flags & SEC_CODE) != 0))
   8534     return 1;
   8535 #endif
   8536 #ifdef OBJ_ELF
   8537   if (fixp->fx_r_type == (int) R_PARISC_GNU_VTINHERIT
   8538       || fixp->fx_r_type == (int) R_PARISC_GNU_VTENTRY)
   8539     return 1;
   8540 #endif
   8541 
   8542   gas_assert (fixp->fx_addsy != NULL);
   8543 
   8544   /* Ensure we emit a relocation for global symbols so that dynamic
   8545      linking works.  */
   8546   if (S_FORCE_RELOC (fixp->fx_addsy, 1))
   8547     return 1;
   8548 
   8549   /* It is necessary to force PC-relative calls/jumps to have a relocation
   8550      entry if they're going to need either an argument relocation or long
   8551      call stub.  */
   8552   if (fixp->fx_pcrel
   8553       && arg_reloc_stub_needed (symbol_arg_reloc_info (fixp->fx_addsy),
   8554 				hppa_fixp->fx_arg_reloc))
   8555     return 1;
   8556 
   8557   /* Now check to see if we're going to need a long-branch stub.  */
   8558   if (fixp->fx_r_type == (int) R_HPPA_PCREL_CALL)
   8559     {
   8560       long pc = md_pcrel_from (fixp);
   8561       valueT distance, min_stub_distance;
   8562 
   8563       distance = fixp->fx_offset + S_GET_VALUE (fixp->fx_addsy) - pc - 8;
   8564 
   8565       /* Distance to the closest possible stub.  This will detect most
   8566 	 but not all circumstances where a stub will not work.  */
   8567       min_stub_distance = pc + 16;
   8568 #ifdef OBJ_SOM
   8569       if (last_call_info != NULL)
   8570 	min_stub_distance -= S_GET_VALUE (last_call_info->start_symbol);
   8571 #endif
   8572 
   8573       if ((distance + 8388608 >= 16777216
   8574 	   && min_stub_distance <= 8388608)
   8575 	  || (hppa_fixp->fx_r_format == 17
   8576 	      && distance + 262144 >= 524288
   8577 	      && min_stub_distance <= 262144)
   8578 	  || (hppa_fixp->fx_r_format == 12
   8579 	      && distance + 8192 >= 16384
   8580 	      && min_stub_distance <= 8192)
   8581 	  )
   8582 	return 1;
   8583     }
   8584 
   8585   if (fixp->fx_r_type == (int) R_HPPA_ABS_CALL)
   8586     return 1;
   8587 
   8588   /* No need (yet) to force another relocations to be emitted.  */
   8589   return 0;
   8590 }
   8591 
   8592 /* Now for some ELF specific code.  FIXME.  */
   8593 #ifdef OBJ_ELF
   8594 /* For ELF, this function serves one purpose:  to setup the st_size
   8595    field of STT_FUNC symbols.  To do this, we need to scan the
   8596    call_info structure list, determining st_size in by taking the
   8597    difference in the address of the beginning/end marker symbols.  */
   8598 
   8599 void
   8600 elf_hppa_final_processing (void)
   8601 {
   8602   struct call_info *call_info_pointer;
   8603 
   8604   for (call_info_pointer = call_info_root;
   8605        call_info_pointer;
   8606        call_info_pointer = call_info_pointer->ci_next)
   8607     {
   8608       elf_symbol_type *esym
   8609 	= ((elf_symbol_type *)
   8610 	   symbol_get_bfdsym (call_info_pointer->start_symbol));
   8611       esym->internal_elf_sym.st_size =
   8612 	S_GET_VALUE (call_info_pointer->end_symbol)
   8613 	- S_GET_VALUE (call_info_pointer->start_symbol) + 4;
   8614     }
   8615 }
   8616 
   8617 static void
   8618 pa_vtable_entry (int ignore ATTRIBUTE_UNUSED)
   8619 {
   8620   struct fix *new_fix;
   8621 
   8622   new_fix = obj_elf_vtable_entry (0);
   8623 
   8624   if (new_fix)
   8625     {
   8626       struct hppa_fix_struct * hppa_fix = obstack_alloc (&notes, sizeof (struct hppa_fix_struct));
   8627 
   8628       hppa_fix->fx_r_type = R_HPPA;
   8629       hppa_fix->fx_r_field = e_fsel;
   8630       hppa_fix->fx_r_format = 32;
   8631       hppa_fix->fx_arg_reloc = 0;
   8632       hppa_fix->segment = now_seg;
   8633       new_fix->tc_fix_data = (void *) hppa_fix;
   8634       new_fix->fx_r_type = (int) R_PARISC_GNU_VTENTRY;
   8635     }
   8636 }
   8637 
   8638 static void
   8639 pa_vtable_inherit (int ignore ATTRIBUTE_UNUSED)
   8640 {
   8641   struct fix *new_fix;
   8642 
   8643   new_fix = obj_elf_vtable_inherit (0);
   8644 
   8645   if (new_fix)
   8646     {
   8647       struct hppa_fix_struct * hppa_fix = obstack_alloc (&notes, sizeof (struct hppa_fix_struct));
   8648 
   8649       hppa_fix->fx_r_type = R_HPPA;
   8650       hppa_fix->fx_r_field = e_fsel;
   8651       hppa_fix->fx_r_format = 32;
   8652       hppa_fix->fx_arg_reloc = 0;
   8653       hppa_fix->segment = now_seg;
   8654       new_fix->tc_fix_data = (void *) hppa_fix;
   8655       new_fix->fx_r_type = (int) R_PARISC_GNU_VTINHERIT;
   8656     }
   8657 }
   8658 #endif
   8659 
   8660 /* Table of pseudo ops for the PA.  FIXME -- how many of these
   8661    are now redundant with the overall GAS and the object file
   8662    dependent tables?  */
   8663 const pseudo_typeS md_pseudo_table[] =
   8664 {
   8665   /* align pseudo-ops on the PA specify the actual alignment requested,
   8666      not the log2 of the requested alignment.  */
   8667 #ifdef OBJ_SOM
   8668   {"align", pa_align, 8},
   8669 #endif
   8670 #ifdef OBJ_ELF
   8671   {"align", s_align_bytes, 8},
   8672 #endif
   8673   {"begin_brtab", pa_brtab, 1},
   8674   {"begin_try", pa_try, 1},
   8675   {"block", pa_block, 1},
   8676   {"blockz", pa_block, 0},
   8677   {"byte", pa_cons, 1},
   8678   {"call", pa_call, 0},
   8679   {"callinfo", pa_callinfo, 0},
   8680 #if defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD))
   8681   {"code", obj_elf_text, 0},
   8682 #else
   8683   {"code", pa_text, 0},
   8684   {"comm", pa_comm, 0},
   8685 #endif
   8686 #ifdef OBJ_SOM
   8687   {"compiler", pa_compiler, 0},
   8688 #endif
   8689   {"copyright", pa_copyright, 0},
   8690 #if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
   8691   {"data", pa_data, 0},
   8692 #endif
   8693   {"double", pa_float_cons, 'd'},
   8694   {"dword", pa_cons, 8},
   8695   {"end", pa_end, 0},
   8696   {"end_brtab", pa_brtab, 0},
   8697 #if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
   8698   {"end_try", pa_try, 0},
   8699 #endif
   8700   {"enter", pa_enter, 0},
   8701   {"entry", pa_entry, 0},
   8702   {"equ", pa_equ, 0},
   8703   {"exit", pa_exit, 0},
   8704   {"export", pa_export, 0},
   8705   {"fill", pa_fill, 0},
   8706   {"float", pa_float_cons, 'f'},
   8707   {"half", pa_cons, 2},
   8708   {"import", pa_import, 0},
   8709   {"int", pa_cons, 4},
   8710   {"label", pa_label, 0},
   8711   {"lcomm", pa_lcomm, 0},
   8712   {"leave", pa_leave, 0},
   8713   {"level", pa_level, 0},
   8714   {"long", pa_cons, 4},
   8715   {"lsym", pa_lsym, 0},
   8716 #ifdef OBJ_SOM
   8717   {"nsubspa", pa_subspace, 1},
   8718 #endif
   8719   {"octa", pa_cons, 16},
   8720   {"org", pa_origin, 0},
   8721   {"origin", pa_origin, 0},
   8722   {"param", pa_param, 0},
   8723   {"proc", pa_proc, 0},
   8724   {"procend", pa_procend, 0},
   8725   {"quad", pa_cons, 8},
   8726   {"reg", pa_equ, 1},
   8727   {"short", pa_cons, 2},
   8728   {"single", pa_float_cons, 'f'},
   8729 #ifdef OBJ_SOM
   8730   {"space", pa_space, 0},
   8731   {"spnum", pa_spnum, 0},
   8732 #endif
   8733   {"string", pa_stringer, 0},
   8734   {"stringz", pa_stringer, 1},
   8735 #ifdef OBJ_SOM
   8736   {"subspa", pa_subspace, 0},
   8737 #endif
   8738 #if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
   8739   {"text", pa_text, 0},
   8740 #endif
   8741   {"version", pa_version, 0},
   8742 #ifdef OBJ_ELF
   8743   {"vtable_entry", pa_vtable_entry, 0},
   8744   {"vtable_inherit", pa_vtable_inherit, 0},
   8745 #endif
   8746   {"word", pa_cons, 4},
   8747   {NULL, 0, 0}
   8748 };
   8749 
   8750 #ifdef OBJ_ELF
   8751 void
   8752 hppa_cfi_frame_initial_instructions (void)
   8753 {
   8754   cfi_add_CFA_def_cfa (30, 0);
   8755 }
   8756 
   8757 int
   8758 hppa_regname_to_dw2regnum (char *regname)
   8759 {
   8760   unsigned int regnum = -1;
   8761   unsigned int i;
   8762   const char *p;
   8763   char *q;
   8764   static struct { char *name; int dw2regnum; } regnames[] =
   8765     {
   8766       { "sp", 30 }, { "rp", 2 },
   8767     };
   8768 
   8769   for (i = 0; i < ARRAY_SIZE (regnames); ++i)
   8770     if (strcmp (regnames[i].name, regname) == 0)
   8771       return regnames[i].dw2regnum;
   8772 
   8773   if (regname[0] == 'r')
   8774     {
   8775       p = regname + 1;
   8776       regnum = strtoul (p, &q, 10);
   8777       if (p == q || *q || regnum >= 32)
   8778 	return -1;
   8779     }
   8780   else if (regname[0] == 'f' && regname[1] == 'r')
   8781     {
   8782       p = regname + 2;
   8783       regnum = strtoul (p, &q, 10);
   8784 #if TARGET_ARCH_SIZE == 64
   8785       if (p == q || *q || regnum <= 4 || regnum >= 32)
   8786 	return -1;
   8787       regnum += 32 - 4;
   8788 #else
   8789       if (p == q
   8790 	  || (*q  && ((*q != 'L' && *q != 'R') || *(q + 1)))
   8791 	  || regnum <= 4 || regnum >= 32)
   8792 	return -1;
   8793       regnum = (regnum - 4) * 2 + 32;
   8794       if (*q == 'R')
   8795 	regnum++;
   8796 #endif
   8797     }
   8798   return regnum;
   8799 }
   8800 #endif
   8801