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