1/* tc-hppa.c -- Assemble for the PA
2   Copyright (C) 1989-2020 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 == (int) R_HPPA_COMPLEX
1369      && fixp->fx_pcrel)
1370    {
1371      fixp->fx_r_type = (int) R_HPPA_PCREL_CALL;
1372      fixp->fx_offset += 8;
1373    }
1374
1375  codes = hppa_gen_reloc_type (stdoutput,
1376			       (int) 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_section_alignment (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		opcode &= ~(1 << 13);
5220	      INSERT_FIELD_AND_CONTINUE (opcode, num & 0x1f, 21);
5221
5222	    /* Handle a 5 bit immediate at 10.  */
5223	    case 'Q':
5224	      num = pa_get_absolute_expression (&the_insn, &s);
5225	      if (strict && the_insn.exp.X_op != O_constant)
5226		break;
5227	      s = expr_end;
5228	      CHECK_FIELD (num, 31, 0, strict);
5229	      INSERT_FIELD_AND_CONTINUE (opcode, num, 21);
5230
5231	    /* Handle a 9 bit immediate at 28.  */
5232	    case '$':
5233	      num = pa_get_absolute_expression (&the_insn, &s);
5234	      if (strict && the_insn.exp.X_op != O_constant)
5235		break;
5236	      s = expr_end;
5237	      CHECK_FIELD (num, 511, 1, strict);
5238	      INSERT_FIELD_AND_CONTINUE (opcode, num, 3);
5239
5240	    /* Handle a 13 bit immediate at 18.  */
5241	    case 'A':
5242	      num = pa_get_absolute_expression (&the_insn, &s);
5243	      if (strict && the_insn.exp.X_op != O_constant)
5244		break;
5245	      s = expr_end;
5246	      CHECK_FIELD (num, 8191, 0, strict);
5247	      INSERT_FIELD_AND_CONTINUE (opcode, num, 13);
5248
5249	    /* Handle a 26 bit immediate at 31.  */
5250	    case 'D':
5251	      num = pa_get_absolute_expression (&the_insn, &s);
5252	      if (strict && the_insn.exp.X_op != O_constant)
5253		break;
5254	      s = expr_end;
5255	      CHECK_FIELD (num, 67108863, 0, strict);
5256	      INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
5257
5258	    /* Handle a 3 bit SFU identifier at 25.  */
5259	    case 'v':
5260	      if (*s++ != ',')
5261		as_bad (_("Invalid SFU identifier"));
5262	      num = pa_get_number (&the_insn, &s);
5263	      if (strict && the_insn.exp.X_op != O_constant)
5264		break;
5265	      s = expr_end;
5266	      CHECK_FIELD (num, 7, 0, strict);
5267	      INSERT_FIELD_AND_CONTINUE (opcode, num, 6);
5268
5269	    /* Handle a 20 bit SOP field for spop0.  */
5270	    case 'O':
5271	      num = pa_get_number (&the_insn, &s);
5272	      if (strict && the_insn.exp.X_op != O_constant)
5273		break;
5274	      s = expr_end;
5275	      CHECK_FIELD (num, 1048575, 0, strict);
5276	      num = (num & 0x1f) | ((num & 0x000fffe0) << 6);
5277	      INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
5278
5279	    /* Handle a 15bit SOP field for spop1.  */
5280	    case 'o':
5281	      num = pa_get_number (&the_insn, &s);
5282	      if (strict && the_insn.exp.X_op != O_constant)
5283		break;
5284	      s = expr_end;
5285	      CHECK_FIELD (num, 32767, 0, strict);
5286	      INSERT_FIELD_AND_CONTINUE (opcode, num, 11);
5287
5288	    /* Handle a 10bit SOP field for spop3.  */
5289	    case '0':
5290	      num = pa_get_number (&the_insn, &s);
5291	      if (strict && the_insn.exp.X_op != O_constant)
5292		break;
5293	      s = expr_end;
5294	      CHECK_FIELD (num, 1023, 0, strict);
5295	      num = (num & 0x1f) | ((num & 0x000003e0) << 6);
5296	      INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
5297
5298	    /* Handle a 15 bit SOP field for spop2.  */
5299	    case '1':
5300	      num = pa_get_number (&the_insn, &s);
5301	      if (strict && the_insn.exp.X_op != O_constant)
5302		break;
5303	      s = expr_end;
5304	      CHECK_FIELD (num, 32767, 0, strict);
5305	      num = (num & 0x1f) | ((num & 0x00007fe0) << 6);
5306	      INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
5307
5308	    /* Handle a 3-bit co-processor ID field.  */
5309	    case 'u':
5310	      if (*s++ != ',')
5311		as_bad (_("Invalid COPR identifier"));
5312	      num = pa_get_number (&the_insn, &s);
5313	      if (strict && the_insn.exp.X_op != O_constant)
5314		break;
5315	      s = expr_end;
5316	      CHECK_FIELD (num, 7, 0, strict);
5317	      INSERT_FIELD_AND_CONTINUE (opcode, num, 6);
5318
5319	    /* Handle a 22bit SOP field for copr.  */
5320	    case '2':
5321	      num = pa_get_number (&the_insn, &s);
5322	      if (strict && the_insn.exp.X_op != O_constant)
5323		break;
5324	      s = expr_end;
5325	      CHECK_FIELD (num, 4194303, 0, strict);
5326	      num = (num & 0x1f) | ((num & 0x003fffe0) << 4);
5327	      INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
5328
5329	    /* Handle a source FP operand format completer.  */
5330	    case '{':
5331	      if (*s == ',' && *(s+1) == 't')
5332		{
5333		  the_insn.trunc = 1;
5334		  s += 2;
5335		}
5336	      else
5337		the_insn.trunc = 0;
5338	      flag = pa_parse_fp_cnv_format (&s);
5339	      the_insn.fpof1 = flag;
5340	      if (flag == W || flag == UW)
5341		flag = SGL;
5342	      if (flag == DW || flag == UDW)
5343		flag = DBL;
5344	      if (flag == QW || flag == UQW)
5345		flag = QUAD;
5346	      INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
5347
5348	    /* Handle a destination FP operand format completer.  */
5349	    case '_':
5350	      /* pa_parse_format needs the ',' prefix.  */
5351	      s--;
5352	      flag = pa_parse_fp_cnv_format (&s);
5353	      the_insn.fpof2 = flag;
5354	      if (flag == W || flag == UW)
5355		flag = SGL;
5356	      if (flag == DW || flag == UDW)
5357		flag = DBL;
5358	      if (flag == QW || flag == UQW)
5359		flag = QUAD;
5360	      opcode |= flag << 13;
5361	      if (the_insn.fpof1 == SGL
5362		  || the_insn.fpof1 == DBL
5363		  || the_insn.fpof1 == QUAD)
5364		{
5365		  if (the_insn.fpof2 == SGL
5366		      || the_insn.fpof2 == DBL
5367		      || the_insn.fpof2 == QUAD)
5368		    flag = 0;
5369		  else if (the_insn.fpof2 == W
5370		      || the_insn.fpof2 == DW
5371		      || the_insn.fpof2 == QW)
5372		    flag = 2;
5373		  else if (the_insn.fpof2 == UW
5374		      || the_insn.fpof2 == UDW
5375		      || the_insn.fpof2 == UQW)
5376		    flag = 6;
5377		  else
5378		    abort ();
5379		}
5380	      else if (the_insn.fpof1 == W
5381		       || the_insn.fpof1 == DW
5382		       || the_insn.fpof1 == QW)
5383		{
5384		  if (the_insn.fpof2 == SGL
5385		      || the_insn.fpof2 == DBL
5386		      || the_insn.fpof2 == QUAD)
5387		    flag = 1;
5388		  else
5389		    abort ();
5390		}
5391	      else if (the_insn.fpof1 == UW
5392		       || the_insn.fpof1 == UDW
5393		       || the_insn.fpof1 == UQW)
5394		{
5395		  if (the_insn.fpof2 == SGL
5396		      || the_insn.fpof2 == DBL
5397		      || the_insn.fpof2 == QUAD)
5398		    flag = 5;
5399		  else
5400		    abort ();
5401		}
5402	      flag |= the_insn.trunc;
5403	      INSERT_FIELD_AND_CONTINUE (opcode, flag, 15);
5404
5405	    /* Handle a source FP operand format completer.  */
5406	    case 'F':
5407	      flag = pa_parse_fp_format (&s);
5408	      the_insn.fpof1 = flag;
5409	      INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
5410
5411	    /* Handle a destination FP operand format completer.  */
5412	    case 'G':
5413	      /* pa_parse_format needs the ',' prefix.  */
5414	      s--;
5415	      flag = pa_parse_fp_format (&s);
5416	      the_insn.fpof2 = flag;
5417	      INSERT_FIELD_AND_CONTINUE (opcode, flag, 13);
5418
5419	    /* Handle a source FP operand format completer at 20.  */
5420	    case 'I':
5421	      flag = pa_parse_fp_format (&s);
5422	      the_insn.fpof1 = flag;
5423	      INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
5424
5425	    /* Handle a floating point operand format at 26.
5426	       Only allows single and double precision.  */
5427	    case 'H':
5428	      flag = pa_parse_fp_format (&s);
5429	      switch (flag)
5430		{
5431		case SGL:
5432		  opcode |= 0x20;
5433		  /* Fall through.  */
5434		case DBL:
5435		  the_insn.fpof1 = flag;
5436		  continue;
5437
5438		case QUAD:
5439		case ILLEGAL_FMT:
5440		default:
5441		  as_bad (_("Invalid Floating Point Operand Format."));
5442		}
5443	      break;
5444
5445	    /* Handle all floating point registers.  */
5446	    case 'f':
5447	      switch (*++args)
5448		{
5449		/* Float target register.  */
5450		case 't':
5451		  if (!pa_parse_number (&s, 3))
5452		    break;
5453		  /* RSEL should not be set.  */
5454		  if (pa_number & FP_REG_RSEL)
5455		    break;
5456		  num = pa_number - FP_REG_BASE;
5457		  CHECK_FIELD (num, 31, 0, 0);
5458		  INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
5459
5460		/* Float target register with L/R selection.  */
5461		case 'T':
5462		  {
5463		    if (!pa_parse_number (&s, 1))
5464		      break;
5465		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5466		    CHECK_FIELD (num, 31, 0, 0);
5467		    opcode |= num;
5468
5469		    /* 0x30 opcodes are FP arithmetic operation opcodes
5470		       and need to be turned into 0x38 opcodes.  This
5471		       is not necessary for loads/stores.  */
5472		    if (need_pa11_opcode ()
5473			&& ((opcode & 0xfc000000) == 0x30000000))
5474		      opcode |= 1 << 27;
5475
5476		    opcode |= (pa_number & FP_REG_RSEL ? 1 << 6 : 0);
5477		    continue;
5478		  }
5479
5480		/* Float operand 1.  */
5481		case 'a':
5482		  {
5483		    if (!pa_parse_number (&s, 1))
5484		      break;
5485		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5486		    CHECK_FIELD (num, 31, 0, 0);
5487		    opcode |= num << 21;
5488		    if (need_pa11_opcode ())
5489		      {
5490			opcode |= (pa_number & FP_REG_RSEL ? 1 << 7 : 0);
5491			opcode |= 1 << 27;
5492		      }
5493		    continue;
5494		  }
5495
5496		/* Float operand 1 with L/R selection.  */
5497		case 'X':
5498		case 'A':
5499		  {
5500		    if (!pa_parse_number (&s, 1))
5501		      break;
5502		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5503		    CHECK_FIELD (num, 31, 0, 0);
5504		    opcode |= num << 21;
5505		    opcode |= (pa_number & FP_REG_RSEL ? 1 << 7 : 0);
5506		    continue;
5507		  }
5508
5509		/* Float operand 2.  */
5510		case 'b':
5511		  {
5512		    if (!pa_parse_number (&s, 1))
5513		      break;
5514		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5515		    CHECK_FIELD (num, 31, 0, 0);
5516		    opcode |= num << 16;
5517		    if (need_pa11_opcode ())
5518		      {
5519			opcode |= (pa_number & FP_REG_RSEL ? 1 << 12 : 0);
5520			opcode |= 1 << 27;
5521		      }
5522		    continue;
5523		  }
5524
5525		/* Float operand 2 with L/R selection.  */
5526		case 'B':
5527		  {
5528		    if (!pa_parse_number (&s, 1))
5529		      break;
5530		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5531		    CHECK_FIELD (num, 31, 0, 0);
5532		    opcode |= num << 16;
5533		    opcode |= (pa_number & FP_REG_RSEL ? 1 << 12 : 0);
5534		    continue;
5535		  }
5536
5537		/* Float operand 3 for fmpyfadd, fmpynfadd.  */
5538		case 'C':
5539		  {
5540		    if (!pa_parse_number (&s, 1))
5541		      break;
5542		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5543		    CHECK_FIELD (num, 31, 0, 0);
5544		    opcode |= (num & 0x1c) << 11;
5545		    opcode |= (num & 0x03) << 9;
5546		    opcode |= (pa_number & FP_REG_RSEL ? 1 << 8 : 0);
5547		    continue;
5548		  }
5549
5550		/* Float mult operand 1 for fmpyadd, fmpysub */
5551		case 'i':
5552		  {
5553		    if (!pa_parse_number (&s, 1))
5554		      break;
5555		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5556		    CHECK_FIELD (num, 31, 0, 0);
5557		    if (the_insn.fpof1 == SGL)
5558		      {
5559			if (num < 16)
5560			  {
5561			    as_bad  (_("Invalid register for single precision fmpyadd or fmpysub"));
5562			    break;
5563			  }
5564			num &= 0xF;
5565			num |= (pa_number & FP_REG_RSEL ? 1 << 4 : 0);
5566		      }
5567		    INSERT_FIELD_AND_CONTINUE (opcode, num, 21);
5568		  }
5569
5570		/* Float mult operand 2 for fmpyadd, fmpysub */
5571		case 'j':
5572		  {
5573		    if (!pa_parse_number (&s, 1))
5574		      break;
5575		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5576		    CHECK_FIELD (num, 31, 0, 0);
5577		    if (the_insn.fpof1 == SGL)
5578		      {
5579			if (num < 16)
5580			  {
5581			    as_bad  (_("Invalid register for single precision fmpyadd or fmpysub"));
5582			    break;
5583			  }
5584			num &= 0xF;
5585			num |= (pa_number & FP_REG_RSEL ? 1 << 4 : 0);
5586		      }
5587		    INSERT_FIELD_AND_CONTINUE (opcode, num, 16);
5588		  }
5589
5590		/* Float mult target for fmpyadd, fmpysub */
5591		case 'k':
5592		  {
5593		    if (!pa_parse_number (&s, 1))
5594		      break;
5595		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5596		    CHECK_FIELD (num, 31, 0, 0);
5597		    if (the_insn.fpof1 == SGL)
5598		      {
5599			if (num < 16)
5600			  {
5601			    as_bad  (_("Invalid register for single precision fmpyadd or fmpysub"));
5602			    break;
5603			  }
5604			num &= 0xF;
5605			num |= (pa_number & FP_REG_RSEL ? 1 << 4 : 0);
5606		      }
5607		    INSERT_FIELD_AND_CONTINUE (opcode, num, 0);
5608		  }
5609
5610		/* Float add operand 1 for fmpyadd, fmpysub */
5611		case 'l':
5612		  {
5613		    if (!pa_parse_number (&s, 1))
5614		      break;
5615		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5616		    CHECK_FIELD (num, 31, 0, 0);
5617		    if (the_insn.fpof1 == SGL)
5618		      {
5619			if (num < 16)
5620			  {
5621			    as_bad  (_("Invalid register for single precision fmpyadd or fmpysub"));
5622			    break;
5623			  }
5624			num &= 0xF;
5625			num |= (pa_number & FP_REG_RSEL ? 1 << 4 : 0);
5626		      }
5627		    INSERT_FIELD_AND_CONTINUE (opcode, num, 6);
5628		  }
5629
5630		/* Float add target for fmpyadd, fmpysub */
5631		case 'm':
5632		  {
5633		    if (!pa_parse_number (&s, 1))
5634		      break;
5635		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5636		    CHECK_FIELD (num, 31, 0, 0);
5637		    if (the_insn.fpof1 == SGL)
5638		      {
5639			if (num < 16)
5640			  {
5641			    as_bad  (_("Invalid register for single precision fmpyadd or fmpysub"));
5642			    break;
5643			  }
5644			num &= 0xF;
5645			num |= (pa_number & FP_REG_RSEL ? 1 << 4 : 0);
5646		      }
5647		    INSERT_FIELD_AND_CONTINUE (opcode, num, 11);
5648		  }
5649
5650		/* Handle L/R register halves like 'x'.  */
5651		case 'E':
5652		case 'e':
5653		  {
5654		    if (!pa_parse_number (&s, 1))
5655		      break;
5656		    num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5657		    CHECK_FIELD (num, 31, 0, 0);
5658		    opcode |= num << 16;
5659		    if (need_pa11_opcode ())
5660		      {
5661			opcode |= (pa_number & FP_REG_RSEL ? 1 << 1 : 0);
5662		      }
5663		    continue;
5664		  }
5665
5666		/* Float target register (PA 2.0 wide).  */
5667		case 'x':
5668		  if (!pa_parse_number (&s, 3))
5669		    break;
5670		  num = (pa_number & ~FP_REG_RSEL) - FP_REG_BASE;
5671		  CHECK_FIELD (num, 31, 0, 0);
5672		  INSERT_FIELD_AND_CONTINUE (opcode, num, 16);
5673
5674		default:
5675		  abort ();
5676		}
5677	      break;
5678
5679	    default:
5680	      abort ();
5681	    }
5682	  break;
5683	}
5684
5685      /* If this instruction is specific to a particular architecture,
5686	 then set a new architecture.  This automatic promotion crud is
5687	 for compatibility with HP's old assemblers only.  */
5688      if (match
5689	  && bfd_get_mach (stdoutput) < insn->arch
5690	  && !bfd_set_arch_mach (stdoutput, bfd_arch_hppa, insn->arch))
5691	{
5692	  as_warn (_("could not update architecture and machine"));
5693	  match = FALSE;
5694	}
5695
5696 failed:
5697      /* Check if the args matched.  */
5698      if (!match)
5699	{
5700	  if (&insn[1] - pa_opcodes < (int) NUMOPCODES
5701	      && !strcmp (insn->name, insn[1].name))
5702	    {
5703	      ++insn;
5704	      s = argstart;
5705	      continue;
5706	    }
5707	  else
5708	    {
5709	      as_bad (_("Invalid operands %s"), error_message);
5710	      return;
5711	    }
5712	}
5713      break;
5714    }
5715
5716  if (immediate_check)
5717    {
5718      if (pos != -1 && len != -1 && pos < len - 1)
5719        as_warn (_("Immediates %d and %d will give undefined behavior."),
5720			pos, len);
5721    }
5722
5723  the_insn.opcode = opcode;
5724}
5725
5726/* Assemble a single instruction storing it into a frag.  */
5727
5728void
5729md_assemble (char *str)
5730{
5731  char *to;
5732
5733  /* The had better be something to assemble.  */
5734  gas_assert (str);
5735
5736  /* If we are within a procedure definition, make sure we've
5737     defined a label for the procedure; handle case where the
5738     label was defined after the .PROC directive.
5739
5740     Note there's not need to diddle with the segment or fragment
5741     for the label symbol in this case.  We have already switched
5742     into the new $CODE$ subspace at this point.  */
5743  if (within_procedure && last_call_info->start_symbol == NULL)
5744    {
5745      label_symbol_struct *label_symbol = pa_get_label ();
5746
5747      if (label_symbol)
5748	{
5749	  if (label_symbol->lss_label)
5750	    {
5751	      last_call_info->start_symbol = label_symbol->lss_label;
5752	      symbol_get_bfdsym (label_symbol->lss_label)->flags
5753		|= BSF_FUNCTION;
5754#ifdef OBJ_SOM
5755	      /* Also handle allocation of a fixup to hold the unwind
5756		 information when the label appears after the proc/procend.  */
5757	      if (within_entry_exit)
5758		{
5759		  char *where;
5760		  unsigned int u;
5761
5762		  where = frag_more (0);
5763		  u = UNWIND_LOW32 (&last_call_info->ci_unwind.descriptor);
5764		  fix_new_hppa (frag_now, where - frag_now->fr_literal, 0,
5765				NULL, (offsetT) 0, NULL,
5766				0, R_HPPA_ENTRY, e_fsel, 0, 0, u);
5767		}
5768#endif
5769	    }
5770	  else
5771	    as_bad (_("Missing function name for .PROC (corrupted label chain)"));
5772	}
5773      else
5774	as_bad (_("Missing function name for .PROC"));
5775    }
5776
5777  /* Assemble the instruction.  Results are saved into "the_insn".  */
5778  pa_ip (str);
5779
5780  /* Get somewhere to put the assembled instruction.  */
5781  to = frag_more (4);
5782
5783  /* Output the opcode.  */
5784  md_number_to_chars (to, the_insn.opcode, 4);
5785
5786  /* If necessary output more stuff.  */
5787  if (the_insn.reloc != R_HPPA_NONE)
5788    fix_new_hppa (frag_now, (to - frag_now->fr_literal), 4, NULL,
5789		  (offsetT) 0, &the_insn.exp, the_insn.pcrel,
5790		  (int) the_insn.reloc, the_insn.field_selector,
5791		  the_insn.format, the_insn.arg_reloc, 0);
5792
5793#ifdef OBJ_ELF
5794  dwarf2_emit_insn (4);
5795#endif
5796}
5797
5798#ifdef OBJ_SOM
5799/* Handle an alignment directive.  Special so that we can update the
5800   alignment of the subspace if necessary.  */
5801static void
5802pa_align (int bytes)
5803{
5804  /* We must have a valid space and subspace.  */
5805  pa_check_current_space_and_subspace ();
5806
5807  /* Let the generic gas code do most of the work.  */
5808  s_align_bytes (bytes);
5809
5810  /* If bytes is a power of 2, then update the current subspace's
5811     alignment if necessary.  */
5812  if (exact_log2 (bytes) != -1)
5813    record_alignment (current_subspace->ssd_seg, exact_log2 (bytes));
5814}
5815#endif
5816
5817/* Handle a .BLOCK type pseudo-op.  */
5818
5819static void
5820pa_block (int z ATTRIBUTE_UNUSED)
5821{
5822  unsigned int temp_size;
5823
5824#ifdef OBJ_SOM
5825  /* We must have a valid space and subspace.  */
5826  pa_check_current_space_and_subspace ();
5827#endif
5828
5829  temp_size = get_absolute_expression ();
5830
5831  if (temp_size > 0x3FFFFFFF)
5832    {
5833      as_bad (_("Argument to .BLOCK/.BLOCKZ must be between 0 and 0x3fffffff"));
5834      temp_size = 0;
5835    }
5836  else
5837    {
5838      /* Always fill with zeros, that's what the HP assembler does.  */
5839      char *p = frag_var (rs_fill, 1, 1, 0, NULL, temp_size, NULL);
5840      *p = 0;
5841    }
5842
5843  pa_undefine_label ();
5844  demand_empty_rest_of_line ();
5845}
5846
5847/* Handle a .begin_brtab and .end_brtab pseudo-op.  */
5848
5849static void
5850pa_brtab (int begin ATTRIBUTE_UNUSED)
5851{
5852
5853#ifdef OBJ_SOM
5854  /* The BRTAB relocations are only available in SOM (to denote
5855     the beginning and end of branch tables).  */
5856  char *where = frag_more (0);
5857
5858  fix_new_hppa (frag_now, where - frag_now->fr_literal, 0,
5859		NULL, (offsetT) 0, NULL,
5860		0, begin ? R_HPPA_BEGIN_BRTAB : R_HPPA_END_BRTAB,
5861		e_fsel, 0, 0, 0);
5862#endif
5863
5864  demand_empty_rest_of_line ();
5865}
5866
5867/* Handle a .begin_try and .end_try pseudo-op.  */
5868
5869static void
5870pa_try (int begin ATTRIBUTE_UNUSED)
5871{
5872#ifdef OBJ_SOM
5873  expressionS exp;
5874  char *where = frag_more (0);
5875
5876  if (! begin)
5877    expression (&exp);
5878
5879  /* The TRY relocations are only available in SOM (to denote
5880     the beginning and end of exception handling regions).  */
5881
5882  fix_new_hppa (frag_now, where - frag_now->fr_literal, 0,
5883		NULL, (offsetT) 0, begin ? NULL : &exp,
5884		0, begin ? R_HPPA_BEGIN_TRY : R_HPPA_END_TRY,
5885		e_fsel, 0, 0, 0);
5886#endif
5887
5888  demand_empty_rest_of_line ();
5889}
5890
5891/* Do the dirty work of building a call descriptor which describes
5892   where the caller placed arguments to a function call.  */
5893
5894static void
5895pa_call_args (struct call_desc *call_desc)
5896{
5897  char *name, c;
5898  unsigned int temp, arg_reloc;
5899
5900  while (!is_end_of_statement ())
5901    {
5902      c = get_symbol_name (&name);
5903      /* Process a source argument.  */
5904      if ((strncasecmp (name, "argw", 4) == 0))
5905	{
5906	  temp = atoi (name + 4);
5907	  (void) restore_line_pointer (c);
5908	  input_line_pointer++;
5909	  c = get_symbol_name (&name);
5910	  arg_reloc = pa_build_arg_reloc (name);
5911	  call_desc->arg_reloc |= pa_align_arg_reloc (temp, arg_reloc);
5912	}
5913      /* Process a return value.  */
5914      else if ((strncasecmp (name, "rtnval", 6) == 0))
5915	{
5916	  (void) restore_line_pointer (c);
5917	  input_line_pointer++;
5918	  c = get_symbol_name (&name);
5919	  arg_reloc = pa_build_arg_reloc (name);
5920	  call_desc->arg_reloc |= (arg_reloc & 0x3);
5921	}
5922      else
5923	{
5924	  as_bad (_("Invalid .CALL argument: %s"), name);
5925	}
5926
5927      (void) restore_line_pointer (c);
5928      if (!is_end_of_statement ())
5929	input_line_pointer++;
5930    }
5931}
5932
5933/* Handle a .CALL pseudo-op.  This involves storing away information
5934   about where arguments are to be found so the linker can detect
5935   (and correct) argument location mismatches between caller and callee.  */
5936
5937static void
5938pa_call (int unused ATTRIBUTE_UNUSED)
5939{
5940#ifdef OBJ_SOM
5941  /* We must have a valid space and subspace.  */
5942  pa_check_current_space_and_subspace ();
5943#endif
5944
5945  pa_call_args (&last_call_desc);
5946  demand_empty_rest_of_line ();
5947}
5948
5949#ifdef OBJ_ELF
5950/* Build an entry in the UNWIND subspace from the given function
5951   attributes in CALL_INFO.  This is not needed for SOM as using
5952   R_ENTRY and R_EXIT relocations allow the linker to handle building
5953   of the unwind spaces.  */
5954
5955static void
5956pa_build_unwind_subspace (struct call_info *call_info)
5957{
5958  asection *seg, *save_seg;
5959  subsegT save_subseg;
5960  unsigned int unwind;
5961  int reloc;
5962  char *name, *p;
5963  symbolS *symbolP;
5964
5965  if ((bfd_section_flags (now_seg)
5966       & (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
5967      != (SEC_ALLOC | SEC_LOAD | SEC_READONLY))
5968    return;
5969
5970  if (call_info->start_symbol == NULL)
5971    /* This can happen if there were errors earlier on in the assembly.  */
5972    return;
5973
5974  /* Replace the start symbol with a local symbol that will be reduced
5975     to a section offset.  This avoids problems with weak functions with
5976     multiple definitions, etc.  */
5977  name = concat ("L$\001start_", S_GET_NAME (call_info->start_symbol),
5978		 (char *) NULL);
5979
5980  /* If we have a .procend preceded by a .exit, then the symbol will have
5981     already been defined.  In that case, we don't want another unwind
5982     entry.  */
5983  symbolP = symbol_find (name);
5984  if (symbolP)
5985    {
5986      xfree (name);
5987      return;
5988    }
5989  else
5990    {
5991      symbolP = symbol_new (name, now_seg,
5992			    S_GET_VALUE (call_info->start_symbol),
5993			    symbol_get_frag (call_info->start_symbol));
5994      gas_assert (symbolP);
5995      S_CLEAR_EXTERNAL (symbolP);
5996      symbol_table_insert (symbolP);
5997    }
5998
5999  reloc = R_PARISC_SEGREL32;
6000  save_seg = now_seg;
6001  save_subseg = now_subseg;
6002  /* Get into the right seg/subseg.  This may involve creating
6003     the seg the first time through.  Make sure to have the
6004     old seg/subseg so that we can reset things when we are done.  */
6005  seg = bfd_get_section_by_name (stdoutput, UNWIND_SECTION_NAME);
6006  if (seg == ASEC_NULL)
6007    {
6008      seg = subseg_new (UNWIND_SECTION_NAME, 0);
6009      bfd_set_section_flags (seg, (SEC_READONLY | SEC_HAS_CONTENTS | SEC_LOAD
6010				   | SEC_RELOC | SEC_ALLOC | SEC_DATA));
6011      bfd_set_section_alignment (seg, 2);
6012    }
6013
6014  subseg_set (seg, 0);
6015
6016  /* Get some space to hold relocation information for the unwind
6017     descriptor.  */
6018  p = frag_more (16);
6019
6020  /* Relocation info. for start offset of the function.  */
6021  md_number_to_chars (p, 0, 4);
6022  fix_new_hppa (frag_now, p - frag_now->fr_literal, 4,
6023		symbolP, (offsetT) 0,
6024		(expressionS *) NULL, 0, reloc,
6025		e_fsel, 32, 0, 0);
6026
6027  /* Relocation info. for end offset of the function.
6028
6029     Because we allow reductions of 32bit relocations for ELF, this will be
6030     reduced to section_sym + offset which avoids putting the temporary
6031     symbol into the symbol table.  It (should) end up giving the same
6032     value as call_info->start_symbol + function size once the linker is
6033     finished with its work.  */
6034  md_number_to_chars (p + 4, 0, 4);
6035  fix_new_hppa (frag_now, p + 4 - frag_now->fr_literal, 4,
6036		call_info->end_symbol, (offsetT) 0,
6037		(expressionS *) NULL, 0, reloc,
6038		e_fsel, 32, 0, 0);
6039
6040  /* Dump the descriptor.  */
6041  unwind = UNWIND_LOW32 (&call_info->ci_unwind.descriptor);
6042  md_number_to_chars (p + 8, unwind, 4);
6043
6044  unwind = UNWIND_HIGH32 (&call_info->ci_unwind.descriptor);
6045  md_number_to_chars (p + 12, unwind, 4);
6046
6047  /* Return back to the original segment/subsegment.  */
6048  subseg_set (save_seg, save_subseg);
6049}
6050#endif
6051
6052/* Process a .CALLINFO pseudo-op.  This information is used later
6053   to build unwind descriptors and maybe one day to support
6054   .ENTER and .LEAVE.  */
6055
6056static void
6057pa_callinfo (int unused ATTRIBUTE_UNUSED)
6058{
6059  char *name, c;
6060  int temp;
6061
6062#ifdef OBJ_SOM
6063  /* We must have a valid space and subspace.  */
6064  pa_check_current_space_and_subspace ();
6065#endif
6066
6067  /* .CALLINFO must appear within a procedure definition.  */
6068  if (!within_procedure)
6069    as_bad (_(".callinfo is not within a procedure definition"));
6070
6071  /* Mark the fact that we found the .CALLINFO for the
6072     current procedure.  */
6073  callinfo_found = TRUE;
6074
6075  /* Iterate over the .CALLINFO arguments.  */
6076  while (!is_end_of_statement ())
6077    {
6078      c = get_symbol_name (&name);
6079      /* Frame size specification.  */
6080      if ((strncasecmp (name, "frame", 5) == 0))
6081	{
6082	  (void) restore_line_pointer (c);
6083	  input_line_pointer++;
6084	  temp = get_absolute_expression ();
6085	  if ((temp & 0x3) != 0)
6086	    {
6087	      as_bad (_("FRAME parameter must be a multiple of 8: %d\n"), temp);
6088	      temp = 0;
6089	    }
6090
6091	  /* callinfo is in bytes and unwind_desc is in 8 byte units.  */
6092	  last_call_info->ci_unwind.descriptor.frame_size = temp / 8;
6093	}
6094      /* Entry register (GR, GR and SR) specifications.  */
6095      else if ((strncasecmp (name, "entry_gr", 8) == 0))
6096	{
6097	  (void) restore_line_pointer (c);
6098	  input_line_pointer++;
6099	  temp = get_absolute_expression ();
6100	  /* The HP assembler accepts 19 as the high bound for ENTRY_GR
6101	     even though %r19 is caller saved.  I think this is a bug in
6102	     the HP assembler, and we are not going to emulate it.  */
6103	  if (temp < 3 || temp > 18)
6104	    as_bad (_("Value for ENTRY_GR must be in the range 3..18\n"));
6105	  last_call_info->ci_unwind.descriptor.entry_gr = temp - 2;
6106	}
6107      else if ((strncasecmp (name, "entry_fr", 8) == 0))
6108	{
6109	  (void) restore_line_pointer (c);
6110	  input_line_pointer++;
6111	  temp = get_absolute_expression ();
6112	  /* Similarly the HP assembler takes 31 as the high bound even
6113	     though %fr21 is the last callee saved floating point register.  */
6114	  if (temp < 12 || temp > 21)
6115	    as_bad (_("Value for ENTRY_FR must be in the range 12..21\n"));
6116	  last_call_info->ci_unwind.descriptor.entry_fr = temp - 11;
6117	}
6118      else if ((strncasecmp (name, "entry_sr", 8) == 0))
6119	{
6120	  (void) restore_line_pointer (c);
6121	  input_line_pointer++;
6122	  temp = get_absolute_expression ();
6123	  if (temp != 3)
6124	    as_bad (_("Value for ENTRY_SR must be 3\n"));
6125	}
6126      /* Note whether or not this function performs any calls.  */
6127      else if ((strncasecmp (name, "calls", 5) == 0)
6128	       || (strncasecmp (name, "caller", 6) == 0))
6129	{
6130	  (void) restore_line_pointer (c);
6131	}
6132      else if ((strncasecmp (name, "no_calls", 8) == 0))
6133	{
6134	  (void) restore_line_pointer (c);
6135	}
6136      /* Should RP be saved into the stack.  */
6137      else if ((strncasecmp (name, "save_rp", 7) == 0))
6138	{
6139	  (void) restore_line_pointer (c);
6140	  last_call_info->ci_unwind.descriptor.save_rp = 1;
6141	}
6142      /* Likewise for SP.  */
6143      else if ((strncasecmp (name, "save_sp", 7) == 0))
6144	{
6145	  (void) restore_line_pointer (c);
6146	  last_call_info->ci_unwind.descriptor.save_sp = 1;
6147	}
6148      /* Is this an unwindable procedure.  If so mark it so
6149	 in the unwind descriptor.  */
6150      else if ((strncasecmp (name, "no_unwind", 9) == 0))
6151	{
6152	  (void) restore_line_pointer (c);
6153	  last_call_info->ci_unwind.descriptor.cannot_unwind = 1;
6154	}
6155      /* Is this an interrupt routine.  If so mark it in the
6156	 unwind descriptor.  */
6157      else if ((strncasecmp (name, "hpux_int", 7) == 0))
6158	{
6159	  (void) restore_line_pointer (c);
6160	  last_call_info->ci_unwind.descriptor.hpux_interrupt_marker = 1;
6161	}
6162      /* Is this a millicode routine.  "millicode" isn't in my
6163	 assembler manual, but my copy is old.  The HP assembler
6164	 accepts it, and there's a place in the unwind descriptor
6165	 to drop the information, so we'll accept it too.  */
6166      else if ((strncasecmp (name, "millicode", 9) == 0))
6167	{
6168	  (void) restore_line_pointer (c);
6169	  last_call_info->ci_unwind.descriptor.millicode = 1;
6170	}
6171      else
6172	{
6173	  as_bad (_("Invalid .CALLINFO argument: %s"), name);
6174	  (void) restore_line_pointer (c);
6175	}
6176
6177      if (!is_end_of_statement ())
6178	input_line_pointer++;
6179    }
6180
6181  demand_empty_rest_of_line ();
6182}
6183
6184#if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
6185/* Switch to the text space.  Like s_text, but delete our
6186   label when finished.  */
6187
6188static void
6189pa_text (int unused ATTRIBUTE_UNUSED)
6190{
6191#ifdef OBJ_SOM
6192  current_space = is_defined_space ("$TEXT$");
6193  current_subspace
6194    = pa_subsegment_to_subspace (current_space->sd_seg, 0);
6195#endif
6196
6197  s_text (0);
6198  pa_undefine_label ();
6199}
6200
6201/* Switch to the data space.  As usual delete our label.  */
6202
6203static void
6204pa_data (int unused ATTRIBUTE_UNUSED)
6205{
6206#ifdef OBJ_SOM
6207  current_space = is_defined_space ("$PRIVATE$");
6208  current_subspace
6209    = pa_subsegment_to_subspace (current_space->sd_seg, 0);
6210#endif
6211  s_data (0);
6212  pa_undefine_label ();
6213}
6214
6215/* This is different than the standard GAS s_comm(). On HP9000/800 machines,
6216   the .comm pseudo-op has the following syntax:
6217
6218   <label> .comm <length>
6219
6220   where <label> is optional and is a symbol whose address will be the start of
6221   a block of memory <length> bytes long. <length> must be an absolute
6222   expression.  <length> bytes will be allocated in the current space
6223   and subspace.
6224
6225   Also note the label may not even be on the same line as the .comm.
6226
6227   This difference in syntax means the colon function will be called
6228   on the symbol before we arrive in pa_comm.  colon will set a number
6229   of attributes of the symbol that need to be fixed here.  In particular
6230   the value, section pointer, fragment pointer, flags, etc.  What
6231   a pain.
6232
6233   This also makes error detection all but impossible.  */
6234
6235static void
6236pa_comm (int unused ATTRIBUTE_UNUSED)
6237{
6238  unsigned int size;
6239  symbolS *symbol;
6240  label_symbol_struct *label_symbol = pa_get_label ();
6241
6242  if (label_symbol)
6243    symbol = label_symbol->lss_label;
6244  else
6245    symbol = NULL;
6246
6247  SKIP_WHITESPACE ();
6248  size = get_absolute_expression ();
6249
6250  if (symbol)
6251    {
6252      symbol_get_bfdsym (symbol)->flags |= BSF_OBJECT;
6253      S_SET_VALUE (symbol, size);
6254      S_SET_SEGMENT (symbol, bfd_com_section_ptr);
6255      S_SET_EXTERNAL (symbol);
6256
6257      /* colon() has already set the frag to the current location in the
6258	 current subspace; we need to reset the fragment to the zero address
6259	 fragment.  We also need to reset the segment pointer.  */
6260      symbol_set_frag (symbol, &zero_address_frag);
6261    }
6262  demand_empty_rest_of_line ();
6263}
6264#endif /* !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD))) */
6265
6266/* Process a .END pseudo-op.  */
6267
6268static void
6269pa_end (int unused ATTRIBUTE_UNUSED)
6270{
6271  demand_empty_rest_of_line ();
6272}
6273
6274/* Process a .ENTER pseudo-op.  This is not supported.  */
6275
6276static void
6277pa_enter (int unused ATTRIBUTE_UNUSED)
6278{
6279#ifdef OBJ_SOM
6280  /* We must have a valid space and subspace.  */
6281  pa_check_current_space_and_subspace ();
6282#endif
6283
6284  as_bad (_("The .ENTER pseudo-op is not supported"));
6285  demand_empty_rest_of_line ();
6286}
6287
6288/* Process a .ENTRY pseudo-op.  .ENTRY marks the beginning of the
6289   procedure.  */
6290
6291static void
6292pa_entry (int unused ATTRIBUTE_UNUSED)
6293{
6294#ifdef OBJ_SOM
6295  /* We must have a valid space and subspace.  */
6296  pa_check_current_space_and_subspace ();
6297#endif
6298
6299  if (!within_procedure)
6300    as_bad (_("Misplaced .entry. Ignored."));
6301  else
6302    {
6303      if (!callinfo_found)
6304	as_bad (_("Missing .callinfo."));
6305    }
6306  demand_empty_rest_of_line ();
6307  within_entry_exit = TRUE;
6308
6309#ifdef OBJ_SOM
6310  /* SOM defers building of unwind descriptors until the link phase.
6311     The assembler is responsible for creating an R_ENTRY relocation
6312     to mark the beginning of a region and hold the unwind bits, and
6313     for creating an R_EXIT relocation to mark the end of the region.
6314
6315     FIXME.  ELF should be using the same conventions!  The problem
6316     is an unwind requires too much relocation space.  Hmmm.  Maybe
6317     if we split the unwind bits up between the relocations which
6318     denote the entry and exit points.  */
6319  if (last_call_info->start_symbol != NULL)
6320    {
6321      char *where;
6322      unsigned int u;
6323
6324      where = frag_more (0);
6325      u = UNWIND_LOW32 (&last_call_info->ci_unwind.descriptor);
6326      fix_new_hppa (frag_now, where - frag_now->fr_literal, 0,
6327		    NULL, (offsetT) 0, NULL,
6328		    0, R_HPPA_ENTRY, e_fsel, 0, 0, u);
6329    }
6330#endif
6331}
6332
6333/* Silly nonsense for pa_equ.  The only half-sensible use for this is
6334   being able to subtract two register symbols that specify a range of
6335   registers, to get the size of the range.  */
6336static int fudge_reg_expressions;
6337
6338int
6339hppa_force_reg_syms_absolute (expressionS *resultP,
6340			      operatorT op ATTRIBUTE_UNUSED,
6341			      expressionS *rightP)
6342{
6343  if (fudge_reg_expressions
6344      && rightP->X_op == O_register
6345      && resultP->X_op == O_register)
6346    {
6347      rightP->X_op = O_constant;
6348      resultP->X_op = O_constant;
6349    }
6350  return 0;  /* Continue normal expr handling.  */
6351}
6352
6353/* Handle a .EQU pseudo-op.  */
6354
6355static void
6356pa_equ (int reg)
6357{
6358  label_symbol_struct *label_symbol = pa_get_label ();
6359  symbolS *symbol;
6360
6361  if (label_symbol)
6362    {
6363      symbol = label_symbol->lss_label;
6364      if (reg)
6365	{
6366	  strict = 1;
6367	  if (!pa_parse_number (&input_line_pointer, 0))
6368	    as_bad (_(".REG expression must be a register"));
6369	  S_SET_VALUE (symbol, pa_number);
6370	  S_SET_SEGMENT (symbol, reg_section);
6371	}
6372      else
6373	{
6374	  expressionS exp;
6375	  segT seg;
6376
6377	  fudge_reg_expressions = 1;
6378	  seg = expression (&exp);
6379	  fudge_reg_expressions = 0;
6380	  if (exp.X_op != O_constant
6381	      && exp.X_op != O_register)
6382	    {
6383	      if (exp.X_op != O_absent)
6384		as_bad (_("bad or irreducible absolute expression; zero assumed"));
6385	      exp.X_add_number = 0;
6386	      seg = absolute_section;
6387	    }
6388	  S_SET_VALUE (symbol, (unsigned int) exp.X_add_number);
6389	  S_SET_SEGMENT (symbol, seg);
6390	}
6391    }
6392  else
6393    {
6394      if (reg)
6395	as_bad (_(".REG must use a label"));
6396      else
6397	as_bad (_(".EQU must use a label"));
6398    }
6399
6400  pa_undefine_label ();
6401  demand_empty_rest_of_line ();
6402}
6403
6404#ifdef OBJ_ELF
6405/* Mark the end of a function so that it's possible to compute
6406   the size of the function in elf_hppa_final_processing.  */
6407
6408static void
6409hppa_elf_mark_end_of_function (void)
6410{
6411  /* ELF does not have EXIT relocations.  All we do is create a
6412     temporary symbol marking the end of the function.  */
6413  char *name;
6414  symbolS *symbolP;
6415
6416  if (last_call_info == NULL || last_call_info->start_symbol == NULL)
6417    {
6418      /* We have already warned about a missing label,
6419	 or other problems.  */
6420      return;
6421    }
6422
6423  name = concat ("L$\001end_", S_GET_NAME (last_call_info->start_symbol),
6424		 (char *) NULL);
6425
6426  /* If we have a .exit followed by a .procend, then the
6427     symbol will have already been defined.  */
6428  symbolP = symbol_find (name);
6429  if (symbolP)
6430    {
6431      /* The symbol has already been defined!  This can
6432	 happen if we have a .exit followed by a .procend.
6433
6434	 This is *not* an error.  All we want to do is free
6435	 the memory we just allocated for the name and continue.  */
6436      xfree (name);
6437    }
6438  else
6439    {
6440      /* symbol value should be the offset of the
6441	 last instruction of the function */
6442      symbolP = symbol_new (name, now_seg, (valueT) (frag_now_fix () - 4),
6443			    frag_now);
6444
6445      gas_assert (symbolP);
6446      S_CLEAR_EXTERNAL (symbolP);
6447      symbol_table_insert (symbolP);
6448    }
6449
6450  if (symbolP)
6451    last_call_info->end_symbol = symbolP;
6452  else
6453    as_bad (_("Symbol '%s' could not be created."), name);
6454}
6455#endif
6456
6457/* Helper function.  Does processing for the end of a function.  This
6458   usually involves creating some relocations or building special
6459   symbols to mark the end of the function.  */
6460
6461static void
6462process_exit (void)
6463{
6464  char *where;
6465
6466  where = frag_more (0);
6467
6468#ifdef OBJ_ELF
6469  /* Mark the end of the function, stuff away the location of the frag
6470     for the end of the function, and finally call pa_build_unwind_subspace
6471     to add an entry in the unwind table.  */
6472  (void) where;
6473  hppa_elf_mark_end_of_function ();
6474  pa_build_unwind_subspace (last_call_info);
6475#else
6476  /* SOM defers building of unwind descriptors until the link phase.
6477     The assembler is responsible for creating an R_ENTRY relocation
6478     to mark the beginning of a region and hold the unwind bits, and
6479     for creating an R_EXIT relocation to mark the end of the region.
6480
6481     FIXME.  ELF should be using the same conventions!  The problem
6482     is an unwind requires too much relocation space.  Hmmm.  Maybe
6483     if we split the unwind bits up between the relocations which
6484     denote the entry and exit points.  */
6485  fix_new_hppa (frag_now, where - frag_now->fr_literal, 0,
6486		NULL, (offsetT) 0,
6487		NULL, 0, R_HPPA_EXIT, e_fsel, 0, 0,
6488		UNWIND_HIGH32 (&last_call_info->ci_unwind.descriptor));
6489#endif
6490}
6491
6492/* Process a .EXIT pseudo-op.  */
6493
6494static void
6495pa_exit (int unused ATTRIBUTE_UNUSED)
6496{
6497#ifdef OBJ_SOM
6498  /* We must have a valid space and subspace.  */
6499  pa_check_current_space_and_subspace ();
6500#endif
6501
6502  if (!within_procedure)
6503    as_bad (_(".EXIT must appear within a procedure"));
6504  else
6505    {
6506      if (!callinfo_found)
6507	as_bad (_("Missing .callinfo"));
6508      else
6509	{
6510	  if (!within_entry_exit)
6511	    as_bad (_("No .ENTRY for this .EXIT"));
6512	  else
6513	    {
6514	      within_entry_exit = FALSE;
6515	      process_exit ();
6516	    }
6517	}
6518    }
6519  demand_empty_rest_of_line ();
6520}
6521
6522/* Helper function to process arguments to a .EXPORT pseudo-op.  */
6523
6524static void
6525pa_type_args (symbolS *symbolP, int is_export)
6526{
6527  char *name, c;
6528  unsigned int temp, arg_reloc;
6529  pa_symbol_type type = SYMBOL_TYPE_UNKNOWN;
6530  asymbol *bfdsym = symbol_get_bfdsym (symbolP);
6531
6532  if (strncasecmp (input_line_pointer, "absolute", 8) == 0)
6533    {
6534      input_line_pointer += 8;
6535      bfdsym->flags &= ~BSF_FUNCTION;
6536      S_SET_SEGMENT (symbolP, bfd_abs_section_ptr);
6537      type = SYMBOL_TYPE_ABSOLUTE;
6538    }
6539  else if (strncasecmp (input_line_pointer, "code", 4) == 0)
6540    {
6541      input_line_pointer += 4;
6542      /* IMPORTing/EXPORTing CODE types for functions is meaningless for SOM,
6543	 instead one should be IMPORTing/EXPORTing ENTRY types.
6544
6545	 Complain if one tries to EXPORT a CODE type since that's never
6546	 done.  Both GCC and HP C still try to IMPORT CODE types, so
6547	 silently fix them to be ENTRY types.  */
6548      if (S_IS_FUNCTION (symbolP))
6549	{
6550	  if (is_export)
6551	    as_tsktsk (_("Using ENTRY rather than CODE in export directive for %s"),
6552		       S_GET_NAME (symbolP));
6553
6554	  bfdsym->flags |= BSF_FUNCTION;
6555	  type = SYMBOL_TYPE_ENTRY;
6556	}
6557      else
6558	{
6559	  bfdsym->flags &= ~BSF_FUNCTION;
6560	  type = SYMBOL_TYPE_CODE;
6561	}
6562    }
6563  else if (strncasecmp (input_line_pointer, "data", 4) == 0)
6564    {
6565      input_line_pointer += 4;
6566      bfdsym->flags &= ~BSF_FUNCTION;
6567      bfdsym->flags |= BSF_OBJECT;
6568      type = SYMBOL_TYPE_DATA;
6569    }
6570  else if ((strncasecmp (input_line_pointer, "entry", 5) == 0))
6571    {
6572      input_line_pointer += 5;
6573      bfdsym->flags |= BSF_FUNCTION;
6574      type = SYMBOL_TYPE_ENTRY;
6575    }
6576  else if (strncasecmp (input_line_pointer, "millicode", 9) == 0)
6577    {
6578      input_line_pointer += 9;
6579      bfdsym->flags |= BSF_FUNCTION;
6580#ifdef OBJ_ELF
6581      {
6582	elf_symbol_type *elfsym = (elf_symbol_type *) bfdsym;
6583	elfsym->internal_elf_sym.st_info =
6584	  ELF_ST_INFO (ELF_ST_BIND (elfsym->internal_elf_sym.st_info),
6585		       STT_PARISC_MILLI);
6586      }
6587#endif
6588      type = SYMBOL_TYPE_MILLICODE;
6589    }
6590  else if (strncasecmp (input_line_pointer, "plabel", 6) == 0)
6591    {
6592      input_line_pointer += 6;
6593      bfdsym->flags &= ~BSF_FUNCTION;
6594      type = SYMBOL_TYPE_PLABEL;
6595    }
6596  else if (strncasecmp (input_line_pointer, "pri_prog", 8) == 0)
6597    {
6598      input_line_pointer += 8;
6599      bfdsym->flags |= BSF_FUNCTION;
6600      type = SYMBOL_TYPE_PRI_PROG;
6601    }
6602  else if (strncasecmp (input_line_pointer, "sec_prog", 8) == 0)
6603    {
6604      input_line_pointer += 8;
6605      bfdsym->flags |= BSF_FUNCTION;
6606      type = SYMBOL_TYPE_SEC_PROG;
6607    }
6608
6609  /* SOM requires much more information about symbol types
6610     than BFD understands.  This is how we get this information
6611     to the SOM BFD backend.  */
6612#ifdef obj_set_symbol_type
6613  obj_set_symbol_type (bfdsym, (int) type);
6614#else
6615  (void) type;
6616#endif
6617
6618  /* Now that the type of the exported symbol has been handled,
6619     handle any argument relocation information.  */
6620  while (!is_end_of_statement ())
6621    {
6622      if (*input_line_pointer == ',')
6623	input_line_pointer++;
6624      c = get_symbol_name (&name);
6625      /* Argument sources.  */
6626      if ((strncasecmp (name, "argw", 4) == 0))
6627	{
6628	  (void) restore_line_pointer (c);
6629	  input_line_pointer++;
6630	  temp = atoi (name + 4);
6631	  c = get_symbol_name (&name);
6632	  arg_reloc = pa_align_arg_reloc (temp, pa_build_arg_reloc (name));
6633#if defined (OBJ_SOM) || defined (ELF_ARG_RELOC)
6634	  symbol_arg_reloc_info (symbolP) |= arg_reloc;
6635#else
6636	  (void) arg_reloc;
6637#endif
6638	  (void) restore_line_pointer (c);
6639	}
6640      /* The return value.  */
6641      else if ((strncasecmp (name, "rtnval", 6)) == 0)
6642	{
6643	  (void) restore_line_pointer (c);
6644	  input_line_pointer++;
6645	  c = get_symbol_name (&name);
6646	  arg_reloc = pa_build_arg_reloc (name);
6647#if defined (OBJ_SOM) || defined (ELF_ARG_RELOC)
6648	  symbol_arg_reloc_info (symbolP) |= arg_reloc;
6649#else
6650	  (void) arg_reloc;
6651#endif
6652	  (void) restore_line_pointer (c);
6653	}
6654      /* Privilege level.  */
6655      else if ((strncasecmp (name, "priv_lev", 8)) == 0)
6656	{
6657	  char *priv;
6658
6659	  (void) restore_line_pointer (c);
6660	  input_line_pointer++;
6661	  temp = atoi (input_line_pointer);
6662#ifdef OBJ_SOM
6663	  ((obj_symbol_type *) bfdsym)->tc_data.ap.hppa_priv_level = temp;
6664#endif
6665	  c = get_symbol_name (&priv);
6666	  (void) restore_line_pointer (c);
6667	}
6668      else
6669	{
6670	  as_bad (_("Undefined .EXPORT/.IMPORT argument (ignored): %s"), name);
6671	  (void) restore_line_pointer (c);
6672	}
6673
6674      if (!is_end_of_statement ())
6675	input_line_pointer++;
6676    }
6677}
6678
6679/* Process a .EXPORT directive.  This makes functions external
6680   and provides information such as argument relocation entries
6681   to callers.  */
6682
6683static void
6684pa_export (int unused ATTRIBUTE_UNUSED)
6685{
6686  char *name, c;
6687  symbolS *symbol;
6688
6689  c = get_symbol_name (&name);
6690  /* Make sure the given symbol exists.  */
6691  if ((symbol = symbol_find_or_make (name)) == NULL)
6692    {
6693      as_bad (_("Cannot define export symbol: %s\n"), name);
6694      restore_line_pointer (c);
6695      input_line_pointer++;
6696    }
6697  else
6698    {
6699      /* OK.  Set the external bits and process argument relocations.
6700	 For the HP, weak and global are not mutually exclusive.
6701	 S_SET_EXTERNAL will not set BSF_GLOBAL if WEAK is set.
6702	 Call S_SET_EXTERNAL to get the other processing.  Manually
6703	 set BSF_GLOBAL when we get back.  */
6704      S_SET_EXTERNAL (symbol);
6705      symbol_get_bfdsym (symbol)->flags |= BSF_GLOBAL;
6706      (void) restore_line_pointer (c);
6707      if (!is_end_of_statement ())
6708	{
6709	  input_line_pointer++;
6710	  pa_type_args (symbol, 1);
6711	}
6712    }
6713
6714  demand_empty_rest_of_line ();
6715}
6716
6717/* Handle an .IMPORT pseudo-op.  Any symbol referenced in a given
6718   assembly file must either be defined in the assembly file, or
6719   explicitly IMPORTED from another.  */
6720
6721static void
6722pa_import (int unused ATTRIBUTE_UNUSED)
6723{
6724  char *name, c;
6725  symbolS *symbol;
6726
6727  c = get_symbol_name (&name);
6728
6729  symbol = symbol_find (name);
6730  /* Ugh.  We might be importing a symbol defined earlier in the file,
6731     in which case all the code below will really screw things up
6732     (set the wrong segment, symbol flags & type, etc).  */
6733  if (symbol == NULL || !S_IS_DEFINED (symbol))
6734    {
6735      symbol = symbol_find_or_make (name);
6736      (void) restore_line_pointer (c);
6737
6738      if (!is_end_of_statement ())
6739	{
6740	  input_line_pointer++;
6741	  pa_type_args (symbol, 0);
6742	}
6743      else
6744	{
6745	  /* Sigh.  To be compatible with the HP assembler and to help
6746	     poorly written assembly code, we assign a type based on
6747	     the current segment.  Note only BSF_FUNCTION really
6748	     matters, we do not need to set the full SYMBOL_TYPE_* info.  */
6749	  if (now_seg == text_section)
6750	    symbol_get_bfdsym (symbol)->flags |= BSF_FUNCTION;
6751
6752	  /* If the section is undefined, then the symbol is undefined
6753	     Since this is an import, leave the section undefined.  */
6754	  S_SET_SEGMENT (symbol, bfd_und_section_ptr);
6755	}
6756    }
6757  else
6758    {
6759      /* The symbol was already defined.  Just eat everything up to
6760	 the end of the current statement.  */
6761      while (!is_end_of_statement ())
6762	input_line_pointer++;
6763    }
6764
6765  demand_empty_rest_of_line ();
6766}
6767
6768/* Handle a .LABEL pseudo-op.  */
6769
6770static void
6771pa_label (int unused ATTRIBUTE_UNUSED)
6772{
6773  char *name, c;
6774
6775  c = get_symbol_name (&name);
6776
6777  if (strlen (name) > 0)
6778    {
6779      colon (name);
6780      (void) restore_line_pointer (c);
6781    }
6782  else
6783    {
6784      as_warn (_("Missing label name on .LABEL"));
6785    }
6786
6787  if (!is_end_of_statement ())
6788    {
6789      as_warn (_("extra .LABEL arguments ignored."));
6790      ignore_rest_of_line ();
6791    }
6792  demand_empty_rest_of_line ();
6793}
6794
6795/* Handle a .LEAVE pseudo-op.  This is not supported yet.  */
6796
6797static void
6798pa_leave (int unused ATTRIBUTE_UNUSED)
6799{
6800#ifdef OBJ_SOM
6801  /* We must have a valid space and subspace.  */
6802  pa_check_current_space_and_subspace ();
6803#endif
6804
6805  as_bad (_("The .LEAVE pseudo-op is not supported"));
6806  demand_empty_rest_of_line ();
6807}
6808
6809/* Handle a .LEVEL pseudo-op.  */
6810
6811static void
6812pa_level (int unused ATTRIBUTE_UNUSED)
6813{
6814  char *level;
6815
6816  level = input_line_pointer;
6817  if (strncmp (level, "1.0", 3) == 0)
6818    {
6819      input_line_pointer += 3;
6820      if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, 10))
6821	as_warn (_("could not set architecture and machine"));
6822    }
6823  else if (strncmp (level, "1.1", 3) == 0)
6824    {
6825      input_line_pointer += 3;
6826      if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, 11))
6827	as_warn (_("could not set architecture and machine"));
6828    }
6829  else if (strncmp (level, "2.0w", 4) == 0)
6830    {
6831      input_line_pointer += 4;
6832      if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, 25))
6833	as_warn (_("could not set architecture and machine"));
6834    }
6835  else if (strncmp (level, "2.0", 3) == 0)
6836    {
6837      input_line_pointer += 3;
6838      if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, 20))
6839	as_warn (_("could not set architecture and machine"));
6840    }
6841  else
6842    {
6843      as_bad (_("Unrecognized .LEVEL argument\n"));
6844      ignore_rest_of_line ();
6845    }
6846  demand_empty_rest_of_line ();
6847}
6848
6849/* Handle a .ORIGIN pseudo-op.  */
6850
6851static void
6852pa_origin (int unused ATTRIBUTE_UNUSED)
6853{
6854#ifdef OBJ_SOM
6855  /* We must have a valid space and subspace.  */
6856  pa_check_current_space_and_subspace ();
6857#endif
6858
6859  s_org (0);
6860  pa_undefine_label ();
6861}
6862
6863/* Handle a .PARAM pseudo-op.  This is much like a .EXPORT, except it
6864   is for static functions.  FIXME.  Should share more code with .EXPORT.  */
6865
6866static void
6867pa_param (int unused ATTRIBUTE_UNUSED)
6868{
6869  char *name, c;
6870  symbolS *symbol;
6871
6872  c = get_symbol_name (&name);
6873
6874  if ((symbol = symbol_find_or_make (name)) == NULL)
6875    {
6876      as_bad (_("Cannot define static symbol: %s\n"), name);
6877      (void) restore_line_pointer (c);
6878      input_line_pointer++;
6879    }
6880  else
6881    {
6882      S_CLEAR_EXTERNAL (symbol);
6883      (void) restore_line_pointer (c);
6884      if (!is_end_of_statement ())
6885	{
6886	  input_line_pointer++;
6887	  pa_type_args (symbol, 0);
6888	}
6889    }
6890
6891  demand_empty_rest_of_line ();
6892}
6893
6894/* Handle a .PROC pseudo-op.  It is used to mark the beginning
6895   of a procedure from a syntactical point of view.  */
6896
6897static void
6898pa_proc (int unused ATTRIBUTE_UNUSED)
6899{
6900  struct call_info *call_info;
6901
6902#ifdef OBJ_SOM
6903  /* We must have a valid space and subspace.  */
6904  pa_check_current_space_and_subspace ();
6905#endif
6906
6907  if (within_procedure)
6908    as_fatal (_("Nested procedures"));
6909
6910  /* Reset global variables for new procedure.  */
6911  callinfo_found = FALSE;
6912  within_procedure = TRUE;
6913
6914  /* Create another call_info structure.  */
6915  call_info = XNEW (struct call_info);
6916
6917  if (!call_info)
6918    as_fatal (_("Cannot allocate unwind descriptor\n"));
6919
6920  memset (call_info, 0, sizeof (struct call_info));
6921
6922  call_info->ci_next = NULL;
6923
6924  if (call_info_root == NULL)
6925    {
6926      call_info_root = call_info;
6927      last_call_info = call_info;
6928    }
6929  else
6930    {
6931      last_call_info->ci_next = call_info;
6932      last_call_info = call_info;
6933    }
6934
6935  /* set up defaults on call_info structure */
6936
6937  call_info->ci_unwind.descriptor.cannot_unwind = 0;
6938  call_info->ci_unwind.descriptor.region_desc = 1;
6939  call_info->ci_unwind.descriptor.hpux_interrupt_marker = 0;
6940
6941  /* If we got a .PROC pseudo-op, we know that the function is defined
6942     locally.  Make sure it gets into the symbol table.  */
6943  {
6944    label_symbol_struct *label_symbol = pa_get_label ();
6945
6946    if (label_symbol)
6947      {
6948	if (label_symbol->lss_label)
6949	  {
6950	    last_call_info->start_symbol = label_symbol->lss_label;
6951	    symbol_get_bfdsym (label_symbol->lss_label)->flags |= BSF_FUNCTION;
6952	  }
6953	else
6954	  as_bad (_("Missing function name for .PROC (corrupted label chain)"));
6955      }
6956    else
6957      last_call_info->start_symbol = NULL;
6958  }
6959
6960  demand_empty_rest_of_line ();
6961}
6962
6963/* Process the syntactical end of a procedure.  Make sure all the
6964   appropriate pseudo-ops were found within the procedure.  */
6965
6966static void
6967pa_procend (int unused ATTRIBUTE_UNUSED)
6968{
6969#ifdef OBJ_SOM
6970  /* We must have a valid space and subspace.  */
6971  pa_check_current_space_and_subspace ();
6972#endif
6973
6974  /* If we are within a procedure definition, make sure we've
6975     defined a label for the procedure; handle case where the
6976     label was defined after the .PROC directive.
6977
6978     Note there's not need to diddle with the segment or fragment
6979     for the label symbol in this case.  We have already switched
6980     into the new $CODE$ subspace at this point.  */
6981  if (within_procedure && last_call_info->start_symbol == NULL)
6982    {
6983      label_symbol_struct *label_symbol = pa_get_label ();
6984
6985      if (label_symbol)
6986	{
6987	  if (label_symbol->lss_label)
6988	    {
6989	      last_call_info->start_symbol = label_symbol->lss_label;
6990	      symbol_get_bfdsym (label_symbol->lss_label)->flags
6991		|= BSF_FUNCTION;
6992#ifdef OBJ_SOM
6993	      /* Also handle allocation of a fixup to hold the unwind
6994		 information when the label appears after the proc/procend.  */
6995	      if (within_entry_exit)
6996		{
6997		  char *where;
6998		  unsigned int u;
6999
7000		  where = frag_more (0);
7001		  u = UNWIND_LOW32 (&last_call_info->ci_unwind.descriptor);
7002		  fix_new_hppa (frag_now, where - frag_now->fr_literal, 0,
7003				NULL, (offsetT) 0, NULL,
7004				0, R_HPPA_ENTRY, e_fsel, 0, 0, u);
7005		}
7006#endif
7007	    }
7008	  else
7009	    as_bad (_("Missing function name for .PROC (corrupted label chain)"));
7010	}
7011      else
7012	as_bad (_("Missing function name for .PROC"));
7013    }
7014
7015  if (!within_procedure)
7016    as_bad (_("misplaced .procend"));
7017
7018  if (!callinfo_found)
7019    as_bad (_("Missing .callinfo for this procedure"));
7020
7021  if (within_entry_exit)
7022    as_bad (_("Missing .EXIT for a .ENTRY"));
7023
7024#ifdef OBJ_ELF
7025  /* ELF needs to mark the end of each function so that it can compute
7026     the size of the function (apparently it's needed in the symbol table).  */
7027  hppa_elf_mark_end_of_function ();
7028#endif
7029
7030  within_procedure = FALSE;
7031  demand_empty_rest_of_line ();
7032  pa_undefine_label ();
7033}
7034
7035#ifdef OBJ_SOM
7036/* If VALUE is an exact power of two between zero and 2^31, then
7037   return log2 (VALUE).  Else return -1.  */
7038
7039static int
7040exact_log2 (int value)
7041{
7042  int shift = 0;
7043
7044  while ((1 << shift) != value && shift < 32)
7045    shift++;
7046
7047  if (shift >= 32)
7048    return -1;
7049  else
7050    return shift;
7051}
7052
7053/* Check to make sure we have a valid space and subspace.  */
7054
7055static void
7056pa_check_current_space_and_subspace (void)
7057{
7058  if (current_space == NULL)
7059    as_fatal (_("Not in a space.\n"));
7060
7061  if (current_subspace == NULL)
7062    as_fatal (_("Not in a subspace.\n"));
7063}
7064
7065/* Parse the parameters to a .SPACE directive; if CREATE_FLAG is nonzero,
7066   then create a new space entry to hold the information specified
7067   by the parameters to the .SPACE directive.  */
7068
7069static sd_chain_struct *
7070pa_parse_space_stmt (const char *space_name, int create_flag)
7071{
7072  char *name, *ptemp, c;
7073  char loadable, defined, private, sort;
7074  int spnum;
7075  asection *seg = NULL;
7076  sd_chain_struct *space;
7077
7078  /* Load default values.  */
7079  spnum = 0;
7080  sort = 0;
7081  loadable = TRUE;
7082  defined = TRUE;
7083  private = FALSE;
7084  if (strcmp (space_name, "$TEXT$") == 0)
7085    {
7086      seg = pa_def_spaces[0].segment;
7087      defined = pa_def_spaces[0].defined;
7088      private = pa_def_spaces[0].private;
7089      sort = pa_def_spaces[0].sort;
7090      spnum = pa_def_spaces[0].spnum;
7091    }
7092  else if (strcmp (space_name, "$PRIVATE$") == 0)
7093    {
7094      seg = pa_def_spaces[1].segment;
7095      defined = pa_def_spaces[1].defined;
7096      private = pa_def_spaces[1].private;
7097      sort = pa_def_spaces[1].sort;
7098      spnum = pa_def_spaces[1].spnum;
7099    }
7100
7101  if (!is_end_of_statement ())
7102    {
7103      print_errors = FALSE;
7104      ptemp = input_line_pointer + 1;
7105      /* First see if the space was specified as a number rather than
7106	 as a name.  According to the PA assembly manual the rest of
7107	 the line should be ignored.  */
7108      strict = 0;
7109      pa_parse_number (&ptemp, 0);
7110      if (pa_number >= 0)
7111	{
7112	  spnum = pa_number;
7113	  input_line_pointer = ptemp;
7114	}
7115      else
7116	{
7117	  while (!is_end_of_statement ())
7118	    {
7119	      input_line_pointer++;
7120	      c = get_symbol_name (&name);
7121	      if ((strncasecmp (name, "spnum", 5) == 0))
7122		{
7123		  (void) restore_line_pointer (c);
7124		  input_line_pointer++;
7125		  spnum = get_absolute_expression ();
7126		}
7127	      else if ((strncasecmp (name, "sort", 4) == 0))
7128		{
7129		  (void) restore_line_pointer (c);
7130		  input_line_pointer++;
7131		  sort = get_absolute_expression ();
7132		}
7133	      else if ((strncasecmp (name, "unloadable", 10) == 0))
7134		{
7135		  (void) restore_line_pointer (c);
7136		  loadable = FALSE;
7137		}
7138	      else if ((strncasecmp (name, "notdefined", 10) == 0))
7139		{
7140		  (void) restore_line_pointer (c);
7141		  defined = FALSE;
7142		}
7143	      else if ((strncasecmp (name, "private", 7) == 0))
7144		{
7145		  (void) restore_line_pointer (c);
7146		  private = TRUE;
7147		}
7148	      else
7149		{
7150		  as_bad (_("Invalid .SPACE argument"));
7151		  (void) restore_line_pointer (c);
7152		  if (!is_end_of_statement ())
7153		    input_line_pointer++;
7154		}
7155	    }
7156	}
7157      print_errors = TRUE;
7158    }
7159
7160  if (create_flag && seg == NULL)
7161    seg = subseg_new (space_name, 0);
7162
7163  /* If create_flag is nonzero, then create the new space with
7164     the attributes computed above.  Else set the values in
7165     an already existing space -- this can only happen for
7166     the first occurrence of a built-in space.  */
7167  if (create_flag)
7168    space = create_new_space (space_name, spnum, loadable, defined,
7169			      private, sort, seg, 1);
7170  else
7171    {
7172      space = is_defined_space (space_name);
7173      SPACE_SPNUM (space) = spnum;
7174      SPACE_DEFINED (space) = defined & 1;
7175      SPACE_USER_DEFINED (space) = 1;
7176    }
7177
7178#ifdef obj_set_section_attributes
7179  obj_set_section_attributes (seg, defined, private, sort, spnum);
7180#endif
7181
7182  return space;
7183}
7184
7185/* Handle a .SPACE pseudo-op; this switches the current space to the
7186   given space, creating the new space if necessary.  */
7187
7188static void
7189pa_space (int unused ATTRIBUTE_UNUSED)
7190{
7191  char *name, c, *space_name, *save_s;
7192  sd_chain_struct *sd_chain;
7193
7194  if (within_procedure)
7195    {
7196      as_bad (_("Can\'t change spaces within a procedure definition. Ignored"));
7197      ignore_rest_of_line ();
7198    }
7199  else
7200    {
7201      /* Check for some of the predefined spaces.   FIXME: most of the code
7202	 below is repeated several times, can we extract the common parts
7203	 and place them into a subroutine or something similar?  */
7204      /* FIXME Is this (and the next IF stmt) really right?
7205	 What if INPUT_LINE_POINTER points to "$TEXT$FOO"?  */
7206      if (strncmp (input_line_pointer, "$TEXT$", 6) == 0)
7207	{
7208	  input_line_pointer += 6;
7209	  sd_chain = is_defined_space ("$TEXT$");
7210	  if (sd_chain == NULL)
7211	    sd_chain = pa_parse_space_stmt ("$TEXT$", 1);
7212	  else if (SPACE_USER_DEFINED (sd_chain) == 0)
7213	    sd_chain = pa_parse_space_stmt ("$TEXT$", 0);
7214
7215	  current_space = sd_chain;
7216	  subseg_set (text_section, sd_chain->sd_last_subseg);
7217	  current_subspace
7218	    = pa_subsegment_to_subspace (text_section,
7219					 sd_chain->sd_last_subseg);
7220	  demand_empty_rest_of_line ();
7221	  return;
7222	}
7223      if (strncmp (input_line_pointer, "$PRIVATE$", 9) == 0)
7224	{
7225	  input_line_pointer += 9;
7226	  sd_chain = is_defined_space ("$PRIVATE$");
7227	  if (sd_chain == NULL)
7228	    sd_chain = pa_parse_space_stmt ("$PRIVATE$", 1);
7229	  else if (SPACE_USER_DEFINED (sd_chain) == 0)
7230	    sd_chain = pa_parse_space_stmt ("$PRIVATE$", 0);
7231
7232	  current_space = sd_chain;
7233	  subseg_set (data_section, sd_chain->sd_last_subseg);
7234	  current_subspace
7235	    = pa_subsegment_to_subspace (data_section,
7236					 sd_chain->sd_last_subseg);
7237	  demand_empty_rest_of_line ();
7238	  return;
7239	}
7240      if (!strncasecmp (input_line_pointer,
7241			GDB_DEBUG_SPACE_NAME,
7242			strlen (GDB_DEBUG_SPACE_NAME)))
7243	{
7244	  input_line_pointer += strlen (GDB_DEBUG_SPACE_NAME);
7245	  sd_chain = is_defined_space (GDB_DEBUG_SPACE_NAME);
7246	  if (sd_chain == NULL)
7247	    sd_chain = pa_parse_space_stmt (GDB_DEBUG_SPACE_NAME, 1);
7248	  else if (SPACE_USER_DEFINED (sd_chain) == 0)
7249	    sd_chain = pa_parse_space_stmt (GDB_DEBUG_SPACE_NAME, 0);
7250
7251	  current_space = sd_chain;
7252
7253	  {
7254	    asection *gdb_section
7255	    = bfd_make_section_old_way (stdoutput, GDB_DEBUG_SPACE_NAME);
7256
7257	    subseg_set (gdb_section, sd_chain->sd_last_subseg);
7258	    current_subspace
7259	      = pa_subsegment_to_subspace (gdb_section,
7260					   sd_chain->sd_last_subseg);
7261	  }
7262	  demand_empty_rest_of_line ();
7263	  return;
7264	}
7265
7266      /* It could be a space specified by number.  */
7267      print_errors = 0;
7268      save_s = input_line_pointer;
7269      strict = 0;
7270      pa_parse_number (&input_line_pointer, 0);
7271      if (pa_number >= 0)
7272	{
7273	  if ((sd_chain = pa_find_space_by_number (pa_number)))
7274	    {
7275	      current_space = sd_chain;
7276
7277	      subseg_set (sd_chain->sd_seg, sd_chain->sd_last_subseg);
7278	      current_subspace
7279		= pa_subsegment_to_subspace (sd_chain->sd_seg,
7280					     sd_chain->sd_last_subseg);
7281	      demand_empty_rest_of_line ();
7282	      return;
7283	    }
7284	}
7285
7286      /* Not a number, attempt to create a new space.  */
7287      print_errors = 1;
7288      input_line_pointer = save_s;
7289      c = get_symbol_name (&name);
7290      space_name = xstrdup (name);
7291      (void) restore_line_pointer (c);
7292
7293      sd_chain = pa_parse_space_stmt (space_name, 1);
7294      current_space = sd_chain;
7295
7296      subseg_set (sd_chain->sd_seg, sd_chain->sd_last_subseg);
7297      current_subspace = pa_subsegment_to_subspace (sd_chain->sd_seg,
7298						  sd_chain->sd_last_subseg);
7299      demand_empty_rest_of_line ();
7300    }
7301}
7302
7303/* Switch to a new space.  (I think).  FIXME.  */
7304
7305static void
7306pa_spnum (int unused ATTRIBUTE_UNUSED)
7307{
7308  char *name;
7309  char c;
7310  char *p;
7311  sd_chain_struct *space;
7312
7313  c = get_symbol_name (&name);
7314  space = is_defined_space (name);
7315  if (space)
7316    {
7317      p = frag_more (4);
7318      md_number_to_chars (p, SPACE_SPNUM (space), 4);
7319    }
7320  else
7321    as_warn (_("Undefined space: '%s' Assuming space number = 0."), name);
7322
7323  (void) restore_line_pointer (c);
7324  demand_empty_rest_of_line ();
7325}
7326
7327/* Handle a .SUBSPACE pseudo-op; this switches the current subspace to the
7328   given subspace, creating the new subspace if necessary.
7329
7330   FIXME.  Should mirror pa_space more closely, in particular how
7331   they're broken up into subroutines.  */
7332
7333static void
7334pa_subspace (int create_new)
7335{
7336  char *name, *ss_name, c;
7337  char loadable, code_only, comdat, common, dup_common, zero, sort;
7338  int i, access_ctr, space_index, alignment, quadrant, applicable, flags;
7339  sd_chain_struct *space;
7340  ssd_chain_struct *ssd;
7341  asection *section;
7342
7343  if (current_space == NULL)
7344    as_fatal (_("Must be in a space before changing or declaring subspaces.\n"));
7345
7346  if (within_procedure)
7347    {
7348      as_bad (_("Can\'t change subspaces within a procedure definition. Ignored"));
7349      ignore_rest_of_line ();
7350    }
7351  else
7352    {
7353      c = get_symbol_name (&name);
7354      ss_name = xstrdup (name);
7355      (void) restore_line_pointer (c);
7356
7357      /* Load default values.  */
7358      sort = 0;
7359      access_ctr = 0x7f;
7360      loadable = 1;
7361      comdat = 0;
7362      common = 0;
7363      dup_common = 0;
7364      code_only = 0;
7365      zero = 0;
7366      space_index = ~0;
7367      alignment = 1;
7368      quadrant = 0;
7369
7370      space = current_space;
7371      if (create_new)
7372	ssd = NULL;
7373      else
7374	ssd = is_defined_subspace (ss_name);
7375      /* Allow user to override the builtin attributes of subspaces.  But
7376	 only allow the attributes to be changed once!  */
7377      if (ssd && SUBSPACE_DEFINED (ssd))
7378	{
7379	  subseg_set (ssd->ssd_seg, ssd->ssd_subseg);
7380	  current_subspace = ssd;
7381	  if (!is_end_of_statement ())
7382	    as_warn (_("Parameters of an existing subspace can\'t be modified"));
7383	  demand_empty_rest_of_line ();
7384	  return;
7385	}
7386      else
7387	{
7388	  /* A new subspace.  Load default values if it matches one of
7389	     the builtin subspaces.  */
7390	  i = 0;
7391	  while (pa_def_subspaces[i].name)
7392	    {
7393	      if (strcasecmp (pa_def_subspaces[i].name, ss_name) == 0)
7394		{
7395		  loadable = pa_def_subspaces[i].loadable;
7396		  comdat = pa_def_subspaces[i].comdat;
7397		  common = pa_def_subspaces[i].common;
7398		  dup_common = pa_def_subspaces[i].dup_common;
7399		  code_only = pa_def_subspaces[i].code_only;
7400		  zero = pa_def_subspaces[i].zero;
7401		  space_index = pa_def_subspaces[i].space_index;
7402		  alignment = pa_def_subspaces[i].alignment;
7403		  quadrant = pa_def_subspaces[i].quadrant;
7404		  access_ctr = pa_def_subspaces[i].access;
7405		  sort = pa_def_subspaces[i].sort;
7406		  break;
7407		}
7408	      i++;
7409	    }
7410	}
7411
7412      /* We should be working with a new subspace now.  Fill in
7413	 any information as specified by the user.  */
7414      if (!is_end_of_statement ())
7415	{
7416	  input_line_pointer++;
7417	  while (!is_end_of_statement ())
7418	    {
7419	      c = get_symbol_name (&name);
7420	      if ((strncasecmp (name, "quad", 4) == 0))
7421		{
7422		  (void) restore_line_pointer (c);
7423		  input_line_pointer++;
7424		  quadrant = get_absolute_expression ();
7425		}
7426	      else if ((strncasecmp (name, "align", 5) == 0))
7427		{
7428		  (void) restore_line_pointer (c);
7429		  input_line_pointer++;
7430		  alignment = get_absolute_expression ();
7431		  if (exact_log2 (alignment) == -1)
7432		    {
7433		      as_bad (_("Alignment must be a power of 2"));
7434		      alignment = 1;
7435		    }
7436		}
7437	      else if ((strncasecmp (name, "access", 6) == 0))
7438		{
7439		  (void) restore_line_pointer (c);
7440		  input_line_pointer++;
7441		  access_ctr = get_absolute_expression ();
7442		}
7443	      else if ((strncasecmp (name, "sort", 4) == 0))
7444		{
7445		  (void) restore_line_pointer (c);
7446		  input_line_pointer++;
7447		  sort = get_absolute_expression ();
7448		}
7449	      else if ((strncasecmp (name, "code_only", 9) == 0))
7450		{
7451		  (void) restore_line_pointer (c);
7452		  code_only = 1;
7453		}
7454	      else if ((strncasecmp (name, "unloadable", 10) == 0))
7455		{
7456		  (void) restore_line_pointer (c);
7457		  loadable = 0;
7458		}
7459	      else if ((strncasecmp (name, "comdat", 6) == 0))
7460		{
7461		  (void) restore_line_pointer (c);
7462		  comdat = 1;
7463		}
7464	      else if ((strncasecmp (name, "common", 6) == 0))
7465		{
7466		  (void) restore_line_pointer (c);
7467		  common = 1;
7468		}
7469	      else if ((strncasecmp (name, "dup_comm", 8) == 0))
7470		{
7471		  (void) restore_line_pointer (c);
7472		  dup_common = 1;
7473		}
7474	      else if ((strncasecmp (name, "zero", 4) == 0))
7475		{
7476		  (void) restore_line_pointer (c);
7477		  zero = 1;
7478		}
7479	      else if ((strncasecmp (name, "first", 5) == 0))
7480		as_bad (_("FIRST not supported as a .SUBSPACE argument"));
7481	      else
7482		as_bad (_("Invalid .SUBSPACE argument"));
7483
7484	      if (!is_end_of_statement ())
7485		input_line_pointer++;
7486	    }
7487	}
7488
7489      /* Compute a reasonable set of BFD flags based on the information
7490	 in the .subspace directive.  */
7491      applicable = bfd_applicable_section_flags (stdoutput);
7492      flags = 0;
7493      if (loadable)
7494	flags |= (SEC_ALLOC | SEC_LOAD);
7495      if (code_only)
7496	flags |= SEC_CODE;
7497
7498      /* These flags are used to implement various flavors of initialized
7499	 common.  The SOM linker discards duplicate subspaces when they
7500	 have the same "key" symbol name.  This support is more like
7501	 GNU linkonce than BFD common.  Further, pc-relative relocations
7502	 are converted to section relative relocations in BFD common
7503	 sections.  This complicates the handling of relocations in
7504	 common sections containing text and isn't currently supported
7505	 correctly in the SOM BFD backend.  */
7506      if (comdat || common || dup_common)
7507	flags |= SEC_LINK_ONCE;
7508
7509      flags |= SEC_RELOC | SEC_HAS_CONTENTS;
7510
7511      /* This is a zero-filled subspace (eg BSS).  */
7512      if (zero)
7513	flags &= ~(SEC_LOAD | SEC_HAS_CONTENTS);
7514
7515      applicable &= flags;
7516
7517      /* If this is an existing subspace, then we want to use the
7518	 segment already associated with the subspace.
7519
7520	 FIXME NOW!  ELF BFD doesn't appear to be ready to deal with
7521	 lots of sections.  It might be a problem in the PA ELF
7522	 code, I do not know yet.  For now avoid creating anything
7523	 but the "standard" sections for ELF.  */
7524      if (create_new)
7525	section = subseg_force_new (ss_name, 0);
7526      else if (ssd)
7527	section = ssd->ssd_seg;
7528      else
7529	section = subseg_new (ss_name, 0);
7530
7531      if (zero)
7532	seg_info (section)->bss = 1;
7533
7534      /* Now set the flags.  */
7535      bfd_set_section_flags (section, applicable);
7536
7537      /* Record any alignment request for this section.  */
7538      record_alignment (section, exact_log2 (alignment));
7539
7540      /* Set the starting offset for this section.  */
7541      bfd_set_section_vma (section, pa_subspace_start (space, quadrant));
7542
7543      /* Now that all the flags are set, update an existing subspace,
7544	 or create a new one.  */
7545      if (ssd)
7546
7547	current_subspace = update_subspace (space, ss_name, loadable,
7548					    code_only, comdat, common,
7549					    dup_common, sort, zero, access_ctr,
7550					    space_index, alignment, quadrant,
7551					    section);
7552      else
7553	current_subspace = create_new_subspace (space, ss_name, loadable,
7554						code_only, comdat, common,
7555						dup_common, zero, sort,
7556						access_ctr, space_index,
7557						alignment, quadrant, section);
7558
7559      demand_empty_rest_of_line ();
7560      current_subspace->ssd_seg = section;
7561      subseg_set (current_subspace->ssd_seg, current_subspace->ssd_subseg);
7562    }
7563  SUBSPACE_DEFINED (current_subspace) = 1;
7564}
7565
7566/* Create default space and subspace dictionaries.  */
7567
7568static void
7569pa_spaces_begin (void)
7570{
7571  int i;
7572
7573  space_dict_root = NULL;
7574  space_dict_last = NULL;
7575
7576  i = 0;
7577  while (pa_def_spaces[i].name)
7578    {
7579      const char *name;
7580
7581      /* Pick the right name to use for the new section.  */
7582      name = pa_def_spaces[i].name;
7583
7584      pa_def_spaces[i].segment = subseg_new (name, 0);
7585      create_new_space (pa_def_spaces[i].name, pa_def_spaces[i].spnum,
7586			pa_def_spaces[i].loadable, pa_def_spaces[i].defined,
7587			pa_def_spaces[i].private, pa_def_spaces[i].sort,
7588			pa_def_spaces[i].segment, 0);
7589      i++;
7590    }
7591
7592  i = 0;
7593  while (pa_def_subspaces[i].name)
7594    {
7595      const char *name;
7596      int applicable, subsegment;
7597      asection *segment = NULL;
7598      sd_chain_struct *space;
7599
7600      /* Pick the right name for the new section and pick the right
7601	 subsegment number.  */
7602      name = pa_def_subspaces[i].name;
7603      subsegment = 0;
7604
7605      /* Create the new section.  */
7606      segment = subseg_new (name, subsegment);
7607
7608      /* For SOM we want to replace the standard .text, .data, and .bss
7609	 sections with our own.   We also want to set BFD flags for
7610	 all the built-in subspaces.  */
7611      if (!strcmp (pa_def_subspaces[i].name, "$CODE$"))
7612	{
7613	  text_section = segment;
7614	  applicable = bfd_applicable_section_flags (stdoutput);
7615	  bfd_set_section_flags (segment,
7616				 applicable & (SEC_ALLOC | SEC_LOAD
7617					       | SEC_RELOC | SEC_CODE
7618					       | SEC_READONLY
7619					       | SEC_HAS_CONTENTS));
7620	}
7621      else if (!strcmp (pa_def_subspaces[i].name, "$DATA$"))
7622	{
7623	  data_section = segment;
7624	  applicable = bfd_applicable_section_flags (stdoutput);
7625	  bfd_set_section_flags (segment,
7626				 applicable & (SEC_ALLOC | SEC_LOAD
7627					       | SEC_RELOC
7628					       | SEC_HAS_CONTENTS));
7629
7630	}
7631      else if (!strcmp (pa_def_subspaces[i].name, "$BSS$"))
7632	{
7633	  bss_section = segment;
7634	  applicable = bfd_applicable_section_flags (stdoutput);
7635	  bfd_set_section_flags (segment,
7636				 applicable & SEC_ALLOC);
7637	}
7638      else if (!strcmp (pa_def_subspaces[i].name, "$LIT$"))
7639	{
7640	  applicable = bfd_applicable_section_flags (stdoutput);
7641	  bfd_set_section_flags (segment,
7642				 applicable & (SEC_ALLOC | SEC_LOAD
7643					       | SEC_RELOC
7644					       | SEC_READONLY
7645					       | SEC_HAS_CONTENTS));
7646	}
7647      else if (!strcmp (pa_def_subspaces[i].name, "$MILLICODE$"))
7648	{
7649	  applicable = bfd_applicable_section_flags (stdoutput);
7650	  bfd_set_section_flags (segment,
7651				 applicable & (SEC_ALLOC | SEC_LOAD
7652					       | SEC_RELOC
7653					       | SEC_READONLY
7654					       | SEC_HAS_CONTENTS));
7655	}
7656      else if (!strcmp (pa_def_subspaces[i].name, "$UNWIND$"))
7657	{
7658	  applicable = bfd_applicable_section_flags (stdoutput);
7659	  bfd_set_section_flags (segment,
7660				 applicable & (SEC_ALLOC | SEC_LOAD
7661					       | SEC_RELOC
7662					       | SEC_READONLY
7663					       | SEC_HAS_CONTENTS));
7664	}
7665
7666      /* Find the space associated with this subspace.  */
7667      space = pa_segment_to_space (pa_def_spaces[pa_def_subspaces[i].
7668						 def_space_index].segment);
7669      if (space == NULL)
7670	{
7671	  as_fatal (_("Internal error: Unable to find containing space for %s."),
7672		    pa_def_subspaces[i].name);
7673	}
7674
7675      create_new_subspace (space, name,
7676			   pa_def_subspaces[i].loadable,
7677			   pa_def_subspaces[i].code_only,
7678			   pa_def_subspaces[i].comdat,
7679			   pa_def_subspaces[i].common,
7680			   pa_def_subspaces[i].dup_common,
7681			   pa_def_subspaces[i].zero,
7682			   pa_def_subspaces[i].sort,
7683			   pa_def_subspaces[i].access,
7684			   pa_def_subspaces[i].space_index,
7685			   pa_def_subspaces[i].alignment,
7686			   pa_def_subspaces[i].quadrant,
7687			   segment);
7688      i++;
7689    }
7690}
7691
7692/* Create a new space NAME, with the appropriate flags as defined
7693   by the given parameters.  */
7694
7695static sd_chain_struct *
7696create_new_space (const char *name,
7697		  int spnum,
7698		  int loadable ATTRIBUTE_UNUSED,
7699		  int defined,
7700		  int private,
7701		  int sort,
7702		  asection *seg,
7703		  int user_defined)
7704{
7705  sd_chain_struct *chain_entry;
7706
7707  chain_entry = XNEW (sd_chain_struct);
7708  SPACE_NAME (chain_entry) = xstrdup (name);
7709  SPACE_DEFINED (chain_entry) = defined;
7710  SPACE_USER_DEFINED (chain_entry) = user_defined;
7711  SPACE_SPNUM (chain_entry) = spnum;
7712
7713  chain_entry->sd_seg = seg;
7714  chain_entry->sd_last_subseg = -1;
7715  chain_entry->sd_subspaces = NULL;
7716  chain_entry->sd_next = NULL;
7717
7718  /* Find spot for the new space based on its sort key.  */
7719  if (!space_dict_last)
7720    space_dict_last = chain_entry;
7721
7722  if (space_dict_root == NULL)
7723    space_dict_root = chain_entry;
7724  else
7725    {
7726      sd_chain_struct *chain_pointer;
7727      sd_chain_struct *prev_chain_pointer;
7728
7729      chain_pointer = space_dict_root;
7730      prev_chain_pointer = NULL;
7731
7732      while (chain_pointer)
7733	{
7734	  prev_chain_pointer = chain_pointer;
7735	  chain_pointer = chain_pointer->sd_next;
7736	}
7737
7738      /* At this point we've found the correct place to add the new
7739	 entry.  So add it and update the linked lists as appropriate.  */
7740      if (prev_chain_pointer)
7741	{
7742	  chain_entry->sd_next = chain_pointer;
7743	  prev_chain_pointer->sd_next = chain_entry;
7744	}
7745      else
7746	{
7747	  space_dict_root = chain_entry;
7748	  chain_entry->sd_next = chain_pointer;
7749	}
7750
7751      if (chain_entry->sd_next == NULL)
7752	space_dict_last = chain_entry;
7753    }
7754
7755  /* This is here to catch predefined spaces which do not get
7756     modified by the user's input.  Another call is found at
7757     the bottom of pa_parse_space_stmt to handle cases where
7758     the user modifies a predefined space.  */
7759#ifdef obj_set_section_attributes
7760  obj_set_section_attributes (seg, defined, private, sort, spnum);
7761#endif
7762
7763  return chain_entry;
7764}
7765
7766/* Create a new subspace NAME, with the appropriate flags as defined
7767   by the given parameters.
7768
7769   Add the new subspace to the subspace dictionary chain in numerical
7770   order as defined by the SORT entries.  */
7771
7772static ssd_chain_struct *
7773create_new_subspace (sd_chain_struct *space,
7774		     const char *name,
7775		     int loadable ATTRIBUTE_UNUSED,
7776		     int code_only ATTRIBUTE_UNUSED,
7777		     int comdat,
7778		     int common,
7779		     int dup_common,
7780		     int is_zero ATTRIBUTE_UNUSED,
7781		     int sort,
7782		     int access_ctr,
7783		     int space_index ATTRIBUTE_UNUSED,
7784		     int alignment ATTRIBUTE_UNUSED,
7785		     int quadrant,
7786		     asection *seg)
7787{
7788  ssd_chain_struct *chain_entry;
7789
7790  chain_entry = XNEW (ssd_chain_struct);
7791  SUBSPACE_NAME (chain_entry) = xstrdup (name);
7792
7793  /* Initialize subspace_defined.  When we hit a .subspace directive
7794     we'll set it to 1 which "locks-in" the subspace attributes.  */
7795  SUBSPACE_DEFINED (chain_entry) = 0;
7796
7797  chain_entry->ssd_subseg = 0;
7798  chain_entry->ssd_seg = seg;
7799  chain_entry->ssd_next = NULL;
7800
7801  /* Find spot for the new subspace based on its sort key.  */
7802  if (space->sd_subspaces == NULL)
7803    space->sd_subspaces = chain_entry;
7804  else
7805    {
7806      ssd_chain_struct *chain_pointer;
7807      ssd_chain_struct *prev_chain_pointer;
7808
7809      chain_pointer = space->sd_subspaces;
7810      prev_chain_pointer = NULL;
7811
7812      while (chain_pointer)
7813	{
7814	  prev_chain_pointer = chain_pointer;
7815	  chain_pointer = chain_pointer->ssd_next;
7816	}
7817
7818      /* Now we have somewhere to put the new entry.  Insert it and update
7819	 the links.  */
7820      if (prev_chain_pointer)
7821	{
7822	  chain_entry->ssd_next = chain_pointer;
7823	  prev_chain_pointer->ssd_next = chain_entry;
7824	}
7825      else
7826	{
7827	  space->sd_subspaces = chain_entry;
7828	  chain_entry->ssd_next = chain_pointer;
7829	}
7830    }
7831
7832#ifdef obj_set_subsection_attributes
7833  obj_set_subsection_attributes (seg, space->sd_seg, access_ctr, sort,
7834				 quadrant, comdat, common, dup_common);
7835#endif
7836
7837  return chain_entry;
7838}
7839
7840/* Update the information for the given subspace based upon the
7841   various arguments.   Return the modified subspace chain entry.  */
7842
7843static ssd_chain_struct *
7844update_subspace (sd_chain_struct *space,
7845		 char *name,
7846		 int loadable ATTRIBUTE_UNUSED,
7847		 int code_only ATTRIBUTE_UNUSED,
7848		 int comdat,
7849		 int common,
7850		 int dup_common,
7851		 int sort,
7852		 int zero ATTRIBUTE_UNUSED,
7853		 int access_ctr,
7854		 int space_index ATTRIBUTE_UNUSED,
7855		 int alignment ATTRIBUTE_UNUSED,
7856		 int quadrant,
7857		 asection *section)
7858{
7859  ssd_chain_struct *chain_entry;
7860
7861  chain_entry = is_defined_subspace (name);
7862
7863#ifdef obj_set_subsection_attributes
7864  obj_set_subsection_attributes (section, space->sd_seg, access_ctr, sort,
7865				 quadrant, comdat, common, dup_common);
7866#endif
7867
7868  return chain_entry;
7869}
7870
7871/* Return the space chain entry for the space with the name NAME or
7872   NULL if no such space exists.  */
7873
7874static sd_chain_struct *
7875is_defined_space (const char *name)
7876{
7877  sd_chain_struct *chain_pointer;
7878
7879  for (chain_pointer = space_dict_root;
7880       chain_pointer;
7881       chain_pointer = chain_pointer->sd_next)
7882    if (strcmp (SPACE_NAME (chain_pointer), name) == 0)
7883      return chain_pointer;
7884
7885  /* No mapping from segment to space was found.  Return NULL.  */
7886  return NULL;
7887}
7888
7889/* Find and return the space associated with the given seg.  If no mapping
7890   from the given seg to a space is found, then return NULL.
7891
7892   Unlike subspaces, the number of spaces is not expected to grow much,
7893   so a linear exhaustive search is OK here.  */
7894
7895static sd_chain_struct *
7896pa_segment_to_space (asection *seg)
7897{
7898  sd_chain_struct *space_chain;
7899
7900  /* Walk through each space looking for the correct mapping.  */
7901  for (space_chain = space_dict_root;
7902       space_chain;
7903       space_chain = space_chain->sd_next)
7904    if (space_chain->sd_seg == seg)
7905      return space_chain;
7906
7907  /* Mapping was not found.  Return NULL.  */
7908  return NULL;
7909}
7910
7911/* Return the first space chain entry for the subspace with the name
7912   NAME or NULL if no such subspace exists.
7913
7914   When there are multiple subspaces with the same name, switching to
7915   the first (i.e., default) subspace is preferable in most situations.
7916   For example, it wouldn't be desirable to merge COMDAT data with non
7917   COMDAT data.
7918
7919   Uses a linear search through all the spaces and subspaces, this may
7920   not be appropriate if we ever being placing each function in its
7921   own subspace.  */
7922
7923static ssd_chain_struct *
7924is_defined_subspace (const char *name)
7925{
7926  sd_chain_struct *space_chain;
7927  ssd_chain_struct *subspace_chain;
7928
7929  /* Walk through each space.  */
7930  for (space_chain = space_dict_root;
7931       space_chain;
7932       space_chain = space_chain->sd_next)
7933    {
7934      /* Walk through each subspace looking for a name which matches.  */
7935      for (subspace_chain = space_chain->sd_subspaces;
7936	   subspace_chain;
7937	   subspace_chain = subspace_chain->ssd_next)
7938	if (strcmp (SUBSPACE_NAME (subspace_chain), name) == 0)
7939	  return subspace_chain;
7940    }
7941
7942  /* Subspace wasn't found.  Return NULL.  */
7943  return NULL;
7944}
7945
7946/* Find and return the subspace associated with the given seg.  If no
7947   mapping from the given seg to a subspace is found, then return NULL.
7948
7949   If we ever put each procedure/function within its own subspace
7950   (to make life easier on the compiler and linker), then this will have
7951   to become more efficient.  */
7952
7953static ssd_chain_struct *
7954pa_subsegment_to_subspace (asection *seg, subsegT subseg)
7955{
7956  sd_chain_struct *space_chain;
7957  ssd_chain_struct *subspace_chain;
7958
7959  /* Walk through each space.  */
7960  for (space_chain = space_dict_root;
7961       space_chain;
7962       space_chain = space_chain->sd_next)
7963    {
7964      if (space_chain->sd_seg == seg)
7965	{
7966	  /* Walk through each subspace within each space looking for
7967	     the correct mapping.  */
7968	  for (subspace_chain = space_chain->sd_subspaces;
7969	       subspace_chain;
7970	       subspace_chain = subspace_chain->ssd_next)
7971	    if (subspace_chain->ssd_subseg == (int) subseg)
7972	      return subspace_chain;
7973	}
7974    }
7975
7976  /* No mapping from subsegment to subspace found.  Return NULL.  */
7977  return NULL;
7978}
7979
7980/* Given a number, try and find a space with the name number.
7981
7982   Return a pointer to a space dictionary chain entry for the space
7983   that was found or NULL on failure.  */
7984
7985static sd_chain_struct *
7986pa_find_space_by_number (int number)
7987{
7988  sd_chain_struct *space_chain;
7989
7990  for (space_chain = space_dict_root;
7991       space_chain;
7992       space_chain = space_chain->sd_next)
7993    {
7994      if (SPACE_SPNUM (space_chain) == (unsigned int) number)
7995	return space_chain;
7996    }
7997
7998  /* No appropriate space found.  Return NULL.  */
7999  return NULL;
8000}
8001
8002/* Return the starting address for the given subspace.  If the starting
8003   address is unknown then return zero.  */
8004
8005static unsigned int
8006pa_subspace_start (sd_chain_struct *space, int quadrant)
8007{
8008  /* FIXME.  Assumes everyone puts read/write data at 0x4000000, this
8009     is not correct for the PA OSF1 port.  */
8010  if ((strcmp (SPACE_NAME (space), "$PRIVATE$") == 0) && quadrant == 1)
8011    return 0x40000000;
8012  else if (space->sd_seg == data_section && quadrant == 1)
8013    return 0x40000000;
8014  else
8015    return 0;
8016  return 0;
8017}
8018#endif
8019
8020/* Helper function for pa_stringer.  Used to find the end of
8021   a string.  */
8022
8023static unsigned int
8024pa_stringer_aux (char *s)
8025{
8026  unsigned int c = *s & CHAR_MASK;
8027
8028  switch (c)
8029    {
8030    case '\"':
8031      c = NOT_A_CHAR;
8032      break;
8033    default:
8034      break;
8035    }
8036  return c;
8037}
8038
8039/* Handle a .STRING type pseudo-op.  */
8040
8041static void
8042pa_stringer (int append_zero)
8043{
8044  char *s, num_buf[4];
8045  unsigned int c;
8046  int i;
8047
8048  /* Preprocess the string to handle PA-specific escape sequences.
8049     For example, \xDD where DD is a hexadecimal number should be
8050     changed to \OOO where OOO is an octal number.  */
8051
8052#ifdef OBJ_SOM
8053  /* We must have a valid space and subspace.  */
8054  pa_check_current_space_and_subspace ();
8055#endif
8056
8057  /* Skip the opening quote.  */
8058  s = input_line_pointer + 1;
8059
8060  while (is_a_char (c = pa_stringer_aux (s++)))
8061    {
8062      if (c == '\\')
8063	{
8064	  c = *s;
8065	  switch (c)
8066	    {
8067	      /* Handle \x<num>.  */
8068	    case 'x':
8069	      {
8070		unsigned int number;
8071		int num_digit;
8072		char dg;
8073		char *s_start = s;
8074
8075		/* Get past the 'x'.  */
8076		s++;
8077		for (num_digit = 0, number = 0, dg = *s;
8078		     num_digit < 2
8079		     && (ISDIGIT (dg) || (dg >= 'a' && dg <= 'f')
8080			 || (dg >= 'A' && dg <= 'F'));
8081		     num_digit++)
8082		  {
8083		    if (ISDIGIT (dg))
8084		      number = number * 16 + dg - '0';
8085		    else if (dg >= 'a' && dg <= 'f')
8086		      number = number * 16 + dg - 'a' + 10;
8087		    else
8088		      number = number * 16 + dg - 'A' + 10;
8089
8090		    s++;
8091		    dg = *s;
8092		  }
8093		if (num_digit > 0)
8094		  {
8095		    switch (num_digit)
8096		      {
8097		      case 1:
8098			sprintf (num_buf, "%02o", number);
8099			break;
8100		      case 2:
8101			sprintf (num_buf, "%03o", number);
8102			break;
8103		      }
8104		    for (i = 0; i <= num_digit; i++)
8105		      s_start[i] = num_buf[i];
8106		  }
8107		break;
8108	      }
8109	    /* This might be a "\"", skip over the escaped char.  */
8110	    default:
8111	      s++;
8112	      break;
8113	    }
8114	}
8115    }
8116  stringer (8 + append_zero);
8117  pa_undefine_label ();
8118}
8119
8120/* Handle a .VERSION pseudo-op.  */
8121
8122static void
8123pa_version (int unused ATTRIBUTE_UNUSED)
8124{
8125  obj_version (0);
8126  pa_undefine_label ();
8127}
8128
8129#ifdef OBJ_SOM
8130
8131/* Handle a .COMPILER pseudo-op.  */
8132
8133static void
8134pa_compiler (int unused ATTRIBUTE_UNUSED)
8135{
8136  obj_som_compiler (0);
8137  pa_undefine_label ();
8138}
8139
8140#endif
8141
8142/* Handle a .COPYRIGHT pseudo-op.  */
8143
8144static void
8145pa_copyright (int unused ATTRIBUTE_UNUSED)
8146{
8147  obj_copyright (0);
8148  pa_undefine_label ();
8149}
8150
8151/* Just like a normal cons, but when finished we have to undefine
8152   the latest space label.  */
8153
8154static void
8155pa_cons (int nbytes)
8156{
8157  cons (nbytes);
8158  pa_undefine_label ();
8159}
8160
8161/* Like float_cons, but we need to undefine our label.  */
8162
8163static void
8164pa_float_cons (int float_type)
8165{
8166  float_cons (float_type);
8167  pa_undefine_label ();
8168}
8169
8170/* Like s_fill, but delete our label when finished.  */
8171
8172static void
8173pa_fill (int unused ATTRIBUTE_UNUSED)
8174{
8175#ifdef OBJ_SOM
8176  /* We must have a valid space and subspace.  */
8177  pa_check_current_space_and_subspace ();
8178#endif
8179
8180  s_fill (0);
8181  pa_undefine_label ();
8182}
8183
8184/* Like lcomm, but delete our label when finished.  */
8185
8186static void
8187pa_lcomm (int needs_align)
8188{
8189#ifdef OBJ_SOM
8190  /* We must have a valid space and subspace.  */
8191  pa_check_current_space_and_subspace ();
8192#endif
8193
8194  s_lcomm (needs_align);
8195  pa_undefine_label ();
8196}
8197
8198/* Like lsym, but delete our label when finished.  */
8199
8200static void
8201pa_lsym (int unused ATTRIBUTE_UNUSED)
8202{
8203#ifdef OBJ_SOM
8204  /* We must have a valid space and subspace.  */
8205  pa_check_current_space_and_subspace ();
8206#endif
8207
8208  s_lsym (0);
8209  pa_undefine_label ();
8210}
8211
8212/* This function is called once, at assembler startup time.  It should
8213   set up all the tables, etc. that the MD part of the assembler will need.  */
8214
8215void
8216md_begin (void)
8217{
8218  const char *retval = NULL;
8219  int lose = 0;
8220  unsigned int i = 0;
8221
8222  last_call_info = NULL;
8223  call_info_root = NULL;
8224
8225  /* Set the default machine type.  */
8226  if (!bfd_set_arch_mach (stdoutput, bfd_arch_hppa, DEFAULT_LEVEL))
8227    as_warn (_("could not set architecture and machine"));
8228
8229  /* Folding of text and data segments fails miserably on the PA.
8230     Warn user and disable "-R" option.  */
8231  if (flag_readonly_data_in_text)
8232    {
8233      as_warn (_("-R option not supported on this target."));
8234      flag_readonly_data_in_text = 0;
8235    }
8236
8237#ifdef OBJ_SOM
8238  pa_spaces_begin ();
8239#endif
8240
8241  op_hash = hash_new ();
8242
8243  while (i < NUMOPCODES)
8244    {
8245      const char *name = pa_opcodes[i].name;
8246
8247      retval = hash_insert (op_hash, name, (struct pa_opcode *) &pa_opcodes[i]);
8248      if (retval != NULL && *retval != '\0')
8249	{
8250	  as_fatal (_("Internal error: can't hash `%s': %s\n"), name, retval);
8251	  lose = 1;
8252	}
8253
8254      do
8255	{
8256	  if ((pa_opcodes[i].match & pa_opcodes[i].mask)
8257	      != pa_opcodes[i].match)
8258	    {
8259	      fprintf (stderr, _("internal error: losing opcode: `%s' \"%s\"\n"),
8260		       pa_opcodes[i].name, pa_opcodes[i].args);
8261	      lose = 1;
8262	    }
8263	  ++i;
8264	}
8265      while (i < NUMOPCODES && !strcmp (pa_opcodes[i].name, name));
8266    }
8267
8268  if (lose)
8269    as_fatal (_("Broken assembler.  No assembly attempted."));
8270
8271#ifdef OBJ_SOM
8272  /* SOM will change text_section.  To make sure we never put
8273     anything into the old one switch to the new one now.  */
8274  subseg_set (text_section, 0);
8275#endif
8276
8277#ifdef OBJ_SOM
8278  dummy_symbol = symbol_find_or_make ("L$dummy");
8279  S_SET_SEGMENT (dummy_symbol, text_section);
8280  /* Force the symbol to be converted to a real symbol.  */
8281  symbol_get_bfdsym (dummy_symbol)->flags |= BSF_KEEP;
8282#endif
8283}
8284
8285/* On the PA relocations which involve function symbols must not be
8286   adjusted.  This so that the linker can know when/how to create argument
8287   relocation stubs for indirect calls and calls to static functions.
8288
8289   "T" field selectors create DLT relative fixups for accessing
8290   globals and statics in PIC code; each DLT relative fixup creates
8291   an entry in the DLT table.  The entries contain the address of
8292   the final target (eg accessing "foo" would create a DLT entry
8293   with the address of "foo").
8294
8295   Unfortunately, the HP linker doesn't take into account any addend
8296   when generating the DLT; so accessing $LIT$+8 puts the address of
8297   $LIT$ into the DLT rather than the address of $LIT$+8.
8298
8299   The end result is we can't perform relocation symbol reductions for
8300   any fixup which creates entries in the DLT (eg they use "T" field
8301   selectors).
8302
8303   ??? Reject reductions involving symbols with external scope; such
8304   reductions make life a living hell for object file editors.  */
8305
8306int
8307hppa_fix_adjustable (fixS *fixp)
8308{
8309#ifdef OBJ_ELF
8310  reloc_type code;
8311#endif
8312  struct hppa_fix_struct *hppa_fix;
8313
8314  hppa_fix = (struct hppa_fix_struct *) fixp->tc_fix_data;
8315
8316#ifdef OBJ_ELF
8317  /* LR/RR selectors are implicitly used for a number of different relocation
8318     types.  We must ensure that none of these types are adjusted (see below)
8319     even if they occur with a different selector.  */
8320  code = elf_hppa_reloc_final_type (stdoutput,
8321				    (int) fixp->fx_r_type,
8322		  		    hppa_fix->fx_r_format,
8323				    hppa_fix->fx_r_field);
8324
8325  switch (code)
8326    {
8327    /* Relocation types which use e_lrsel.  */
8328    case R_PARISC_DIR21L:
8329    case R_PARISC_DLTREL21L:
8330    case R_PARISC_DPREL21L:
8331    case R_PARISC_PLTOFF21L:
8332
8333    /* Relocation types which use e_rrsel.  */
8334    case R_PARISC_DIR14R:
8335    case R_PARISC_DIR14DR:
8336    case R_PARISC_DIR14WR:
8337    case R_PARISC_DIR17R:
8338    case R_PARISC_DLTREL14R:
8339    case R_PARISC_DLTREL14DR:
8340    case R_PARISC_DLTREL14WR:
8341    case R_PARISC_DPREL14R:
8342    case R_PARISC_DPREL14DR:
8343    case R_PARISC_DPREL14WR:
8344    case R_PARISC_PLTOFF14R:
8345    case R_PARISC_PLTOFF14DR:
8346    case R_PARISC_PLTOFF14WR:
8347
8348    /* Other types that we reject for reduction.  */
8349    case R_PARISC_GNU_VTENTRY:
8350    case R_PARISC_GNU_VTINHERIT:
8351      return 0;
8352    default:
8353      break;
8354    }
8355#endif
8356
8357  /* Reject reductions of symbols in sym1-sym2 expressions when
8358     the fixup will occur in a CODE subspace.
8359
8360     XXX FIXME: Long term we probably want to reject all of these;
8361     for example reducing in the debug section would lose if we ever
8362     supported using the optimizing hp linker.  */
8363  if (fixp->fx_addsy
8364      && fixp->fx_subsy
8365      && (hppa_fix->segment->flags & SEC_CODE))
8366    return 0;
8367
8368  /* We can't adjust any relocs that use LR% and RR% field selectors.
8369
8370     If a symbol is reduced to a section symbol, the assembler will
8371     adjust the addend unless the symbol happens to reside right at
8372     the start of the section.  Additionally, the linker has no choice
8373     but to manipulate the addends when coalescing input sections for
8374     "ld -r".  Since an LR% field selector is defined to round the
8375     addend, we can't change the addend without risking that a LR% and
8376     it's corresponding (possible multiple) RR% field will no longer
8377     sum to the right value.
8378
8379     eg. Suppose we have
8380     .		ldil	LR%foo+0,%r21
8381     .		ldw	RR%foo+0(%r21),%r26
8382     .		ldw	RR%foo+4(%r21),%r25
8383
8384     If foo is at address 4092 (decimal) in section `sect', then after
8385     reducing to the section symbol we get
8386     .			LR%sect+4092 == (L%sect)+0
8387     .			RR%sect+4092 == (R%sect)+4092
8388     .			RR%sect+4096 == (R%sect)-4096
8389     and the last address loses because rounding the addend to 8k
8390     multiples takes us up to 8192 with an offset of -4096.
8391
8392     In cases where the LR% expression is identical to the RR% one we
8393     will never have a problem, but is so happens that gcc rounds
8394     addends involved in LR% field selectors to work around a HP
8395     linker bug.  ie. We often have addresses like the last case
8396     above where the LR% expression is offset from the RR% one.  */
8397
8398  if (hppa_fix->fx_r_field == e_lrsel
8399      || hppa_fix->fx_r_field == e_rrsel
8400      || hppa_fix->fx_r_field == e_nlrsel)
8401    return 0;
8402
8403  /* Reject reductions of symbols in DLT relative relocs,
8404     relocations with plabels.  */
8405  if (hppa_fix->fx_r_field == e_tsel
8406      || hppa_fix->fx_r_field == e_ltsel
8407      || hppa_fix->fx_r_field == e_rtsel
8408      || hppa_fix->fx_r_field == e_psel
8409      || hppa_fix->fx_r_field == e_rpsel
8410      || hppa_fix->fx_r_field == e_lpsel)
8411    return 0;
8412
8413  /* Reject absolute calls (jumps).  */
8414  if (hppa_fix->fx_r_type == R_HPPA_ABS_CALL)
8415    return 0;
8416
8417  /* Reject reductions of function symbols.  */
8418  if (fixp->fx_addsy != 0 && S_IS_FUNCTION (fixp->fx_addsy))
8419    return 0;
8420
8421  return 1;
8422}
8423
8424/* Return nonzero if the fixup in FIXP will require a relocation,
8425   even it if appears that the fixup could be completely handled
8426   within GAS.  */
8427
8428int
8429hppa_force_relocation (struct fix *fixp)
8430{
8431  struct hppa_fix_struct *hppa_fixp;
8432
8433  hppa_fixp = (struct hppa_fix_struct *) fixp->tc_fix_data;
8434#ifdef OBJ_SOM
8435  if (fixp->fx_r_type == (int) R_HPPA_ENTRY
8436      || fixp->fx_r_type == (int) R_HPPA_EXIT
8437      || fixp->fx_r_type == (int) R_HPPA_BEGIN_BRTAB
8438      || fixp->fx_r_type == (int) R_HPPA_END_BRTAB
8439      || fixp->fx_r_type == (int) R_HPPA_BEGIN_TRY
8440      || fixp->fx_r_type == (int) R_HPPA_END_TRY
8441      || (fixp->fx_addsy != NULL && fixp->fx_subsy != NULL
8442	  && (hppa_fixp->segment->flags & SEC_CODE) != 0))
8443    return 1;
8444#endif
8445#ifdef OBJ_ELF
8446  if (fixp->fx_r_type == (int) R_PARISC_GNU_VTINHERIT
8447      || fixp->fx_r_type == (int) R_PARISC_GNU_VTENTRY)
8448    return 1;
8449#endif
8450
8451  gas_assert (fixp->fx_addsy != NULL);
8452
8453  /* Ensure we emit a relocation for global symbols so that dynamic
8454     linking works.  */
8455  if (S_FORCE_RELOC (fixp->fx_addsy, 1))
8456    return 1;
8457
8458  /* It is necessary to force PC-relative calls/jumps to have a relocation
8459     entry if they're going to need either an argument relocation or long
8460     call stub.  */
8461  if (fixp->fx_pcrel
8462      && arg_reloc_stub_needed (symbol_arg_reloc_info (fixp->fx_addsy),
8463				hppa_fixp->fx_arg_reloc))
8464    return 1;
8465
8466  /* Now check to see if we're going to need a long-branch stub.  */
8467  if (fixp->fx_r_type == (int) R_HPPA_PCREL_CALL)
8468    {
8469      long pc = md_pcrel_from (fixp);
8470      valueT distance, min_stub_distance;
8471
8472      distance = fixp->fx_offset + S_GET_VALUE (fixp->fx_addsy) - pc - 8;
8473
8474      /* Distance to the closest possible stub.  This will detect most
8475	 but not all circumstances where a stub will not work.  */
8476      min_stub_distance = pc + 16;
8477#ifdef OBJ_SOM
8478      if (last_call_info != NULL)
8479	min_stub_distance -= S_GET_VALUE (last_call_info->start_symbol);
8480#endif
8481
8482      if ((distance + 8388608 >= 16777216
8483	   && min_stub_distance <= 8388608)
8484	  || (hppa_fixp->fx_r_format == 17
8485	      && distance + 262144 >= 524288
8486	      && min_stub_distance <= 262144)
8487	  || (hppa_fixp->fx_r_format == 12
8488	      && distance + 8192 >= 16384
8489	      && min_stub_distance <= 8192)
8490	  )
8491	return 1;
8492    }
8493
8494  if (fixp->fx_r_type == (int) R_HPPA_ABS_CALL)
8495    return 1;
8496
8497  /* No need (yet) to force another relocations to be emitted.  */
8498  return 0;
8499}
8500
8501/* Now for some ELF specific code.  FIXME.  */
8502#ifdef OBJ_ELF
8503/* For ELF, this function serves one purpose:  to setup the st_size
8504   field of STT_FUNC symbols.  To do this, we need to scan the
8505   call_info structure list, determining st_size in by taking the
8506   difference in the address of the beginning/end marker symbols.  */
8507
8508void
8509elf_hppa_final_processing (void)
8510{
8511  struct call_info *call_info_pointer;
8512
8513  for (call_info_pointer = call_info_root;
8514       call_info_pointer;
8515       call_info_pointer = call_info_pointer->ci_next)
8516    {
8517      elf_symbol_type *esym
8518	= ((elf_symbol_type *)
8519	   symbol_get_bfdsym (call_info_pointer->start_symbol));
8520      esym->internal_elf_sym.st_size =
8521	S_GET_VALUE (call_info_pointer->end_symbol)
8522	- S_GET_VALUE (call_info_pointer->start_symbol) + 4;
8523    }
8524}
8525
8526static void
8527pa_vtable_entry (int ignore ATTRIBUTE_UNUSED)
8528{
8529  struct fix *new_fix;
8530
8531  new_fix = obj_elf_get_vtable_entry ();
8532
8533  if (new_fix)
8534    {
8535      struct hppa_fix_struct * hppa_fix = XOBNEW (&notes, struct hppa_fix_struct);
8536
8537      hppa_fix->fx_r_type = R_HPPA;
8538      hppa_fix->fx_r_field = e_fsel;
8539      hppa_fix->fx_r_format = 32;
8540      hppa_fix->fx_arg_reloc = 0;
8541      hppa_fix->segment = now_seg;
8542      new_fix->tc_fix_data = (void *) hppa_fix;
8543      new_fix->fx_r_type = (int) R_PARISC_GNU_VTENTRY;
8544    }
8545}
8546
8547static void
8548pa_vtable_inherit (int ignore ATTRIBUTE_UNUSED)
8549{
8550  struct fix *new_fix;
8551
8552  new_fix = obj_elf_get_vtable_inherit ();
8553
8554  if (new_fix)
8555    {
8556      struct hppa_fix_struct * hppa_fix = XOBNEW (&notes, struct hppa_fix_struct);
8557
8558      hppa_fix->fx_r_type = R_HPPA;
8559      hppa_fix->fx_r_field = e_fsel;
8560      hppa_fix->fx_r_format = 32;
8561      hppa_fix->fx_arg_reloc = 0;
8562      hppa_fix->segment = now_seg;
8563      new_fix->tc_fix_data = (void *) hppa_fix;
8564      new_fix->fx_r_type = (int) R_PARISC_GNU_VTINHERIT;
8565    }
8566}
8567#endif
8568
8569/* Table of pseudo ops for the PA.  FIXME -- how many of these
8570   are now redundant with the overall GAS and the object file
8571   dependent tables?  */
8572const pseudo_typeS md_pseudo_table[] =
8573{
8574  /* align pseudo-ops on the PA specify the actual alignment requested,
8575     not the log2 of the requested alignment.  */
8576#ifdef OBJ_SOM
8577  {"align", pa_align, 8},
8578#endif
8579#ifdef OBJ_ELF
8580  {"align", s_align_bytes, 8},
8581#endif
8582  {"begin_brtab", pa_brtab, 1},
8583  {"begin_try", pa_try, 1},
8584  {"block", pa_block, 1},
8585  {"blockz", pa_block, 0},
8586  {"byte", pa_cons, 1},
8587  {"call", pa_call, 0},
8588  {"callinfo", pa_callinfo, 0},
8589#if defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD))
8590  {"code", obj_elf_text, 0},
8591#else
8592  {"code", pa_text, 0},
8593  {"comm", pa_comm, 0},
8594#endif
8595#ifdef OBJ_SOM
8596  {"compiler", pa_compiler, 0},
8597#endif
8598  {"copyright", pa_copyright, 0},
8599#if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
8600  {"data", pa_data, 0},
8601#endif
8602  {"double", pa_float_cons, 'd'},
8603  {"dword", pa_cons, 8},
8604  {"end", pa_end, 0},
8605  {"end_brtab", pa_brtab, 0},
8606#if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
8607  {"end_try", pa_try, 0},
8608#endif
8609  {"enter", pa_enter, 0},
8610  {"entry", pa_entry, 0},
8611  {"equ", pa_equ, 0},
8612  {"exit", pa_exit, 0},
8613  {"export", pa_export, 0},
8614  {"fill", pa_fill, 0},
8615  {"float", pa_float_cons, 'f'},
8616  {"half", pa_cons, 2},
8617  {"import", pa_import, 0},
8618  {"int", pa_cons, 4},
8619  {"label", pa_label, 0},
8620  {"lcomm", pa_lcomm, 0},
8621  {"leave", pa_leave, 0},
8622  {"level", pa_level, 0},
8623  {"long", pa_cons, 4},
8624  {"lsym", pa_lsym, 0},
8625#ifdef OBJ_SOM
8626  {"nsubspa", pa_subspace, 1},
8627#endif
8628  {"octa", pa_cons, 16},
8629  {"org", pa_origin, 0},
8630  {"origin", pa_origin, 0},
8631  {"param", pa_param, 0},
8632  {"proc", pa_proc, 0},
8633  {"procend", pa_procend, 0},
8634  {"quad", pa_cons, 8},
8635  {"reg", pa_equ, 1},
8636  {"short", pa_cons, 2},
8637  {"single", pa_float_cons, 'f'},
8638#ifdef OBJ_SOM
8639  {"space", pa_space, 0},
8640  {"spnum", pa_spnum, 0},
8641#endif
8642  {"string", pa_stringer, 0},
8643  {"stringz", pa_stringer, 1},
8644#ifdef OBJ_SOM
8645  {"subspa", pa_subspace, 0},
8646#endif
8647#if !(defined (OBJ_ELF) && (defined (TE_LINUX) || defined (TE_NetBSD)))
8648  {"text", pa_text, 0},
8649#endif
8650  {"version", pa_version, 0},
8651#ifdef OBJ_ELF
8652  {"vtable_entry", pa_vtable_entry, 0},
8653  {"vtable_inherit", pa_vtable_inherit, 0},
8654#endif
8655  {"word", pa_cons, 4},
8656  {NULL, 0, 0}
8657};
8658
8659#ifdef OBJ_ELF
8660void
8661hppa_cfi_frame_initial_instructions (void)
8662{
8663  cfi_add_CFA_def_cfa (30, 0);
8664}
8665
8666int
8667hppa_regname_to_dw2regnum (char *regname)
8668{
8669  unsigned int regnum = -1;
8670  unsigned int i;
8671  const char *p;
8672  char *q;
8673  static struct { const char *name; int dw2regnum; } regnames[] =
8674    {
8675      { "sp", 30 }, { "rp", 2 },
8676    };
8677
8678  for (i = 0; i < ARRAY_SIZE (regnames); ++i)
8679    if (strcmp (regnames[i].name, regname) == 0)
8680      return regnames[i].dw2regnum;
8681
8682  if (regname[0] == 'r')
8683    {
8684      p = regname + 1;
8685      regnum = strtoul (p, &q, 10);
8686      if (p == q || *q || regnum >= 32)
8687	return -1;
8688    }
8689  else if (regname[0] == 'f' && regname[1] == 'r')
8690    {
8691      p = regname + 2;
8692      regnum = strtoul (p, &q, 10);
8693#if TARGET_ARCH_SIZE == 64
8694      if (p == q || *q || regnum <= 4 || regnum >= 32)
8695	return -1;
8696      regnum += 32 - 4;
8697#else
8698      if (p == q
8699	  || (*q  && ((*q != 'L' && *q != 'R') || *(q + 1)))
8700	  || regnum <= 4 || regnum >= 32)
8701	return -1;
8702      regnum = (regnum - 4) * 2 + 32;
8703      if (*q == 'R')
8704	regnum++;
8705#endif
8706    }
8707  return regnum;
8708}
8709#endif
8710