OpenCores
URL https://opencores.org/ocsvn/open8_urisc/open8_urisc/trunk

Subversion Repositories open8_urisc

[/] [open8_urisc/] [trunk/] [gnu/] [binutils/] [gas/] [config/] [tc-hppa.c] - Blame information for rev 146

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.