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