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