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