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