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

Subversion Repositories open8_urisc

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 16 khays
/* tc-cris.c -- Assembler code for the CRIS CPU core.
2
   Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
3
   Free Software Foundation, Inc.
4
 
5
   Contributed by Axis Communications AB, Lund, Sweden.
6
   Originally written for GAS 1.38.1 by Mikael Asker.
7
   Updates, BFDizing, GNUifying and ELF support by Hans-Peter Nilsson.
8
 
9
   This file is part of GAS, the GNU Assembler.
10
 
11
   GAS is free software; you can redistribute it and/or modify
12
   it under the terms of the GNU General Public License as published by
13
   the Free Software Foundation; either version 3, or (at your option)
14
   any later version.
15
 
16
   GAS is distributed in the hope that it will be useful,
17
   but WITHOUT ANY WARRANTY; without even the implied warranty of
18
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
   GNU General Public License for more details.
20
 
21
   You should have received a copy of the GNU General Public License
22
   along with GAS; see the file COPYING.  If not, write to the
23
   Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
24
   MA 02110-1301, USA.  */
25
 
26
#include "as.h"
27
#include "safe-ctype.h"
28
#include "subsegs.h"
29
#include "opcode/cris.h"
30
#include "dwarf2dbg.h"
31
 
32
/* Conventions used here:
33
   Generally speaking, pointers to binutils types such as "fragS" and
34
   "expressionS" get parameter and variable names ending in "P", such as
35
   "fragP", to harmonize with the rest of the binutils code.  Other
36
   pointers get a "p" suffix, such as "bufp".  Any function or type-name
37
   that could clash with a current or future binutils or GAS function get
38
   a "cris_" prefix.  */
39
 
40
#define SYNTAX_RELAX_REG_PREFIX "no_register_prefix"
41
#define SYNTAX_ENFORCE_REG_PREFIX "register_prefix"
42
#define SYNTAX_USER_SYM_LEADING_UNDERSCORE "leading_underscore"
43
#define SYNTAX_USER_SYM_NO_LEADING_UNDERSCORE "no_leading_underscore"
44
#define REGISTER_PREFIX_CHAR '$'
45
 
46
/* True for expressions where getting X_add_symbol and X_add_number is
47
   enough to get the "base" and "offset"; no need to make_expr_symbol.
48
   It's not enough to check if X_op_symbol is NULL; that misses unary
49
   operations like O_uminus.  */
50
#define SIMPLE_EXPR(EXP) \
51
 ((EXP)->X_op == O_constant || (EXP)->X_op == O_symbol)
52
 
53
/* Like in ":GOT", ":GOTOFF" etc.  Other ports use '@', but that's in
54
   line_separator_chars for CRIS, so we avoid it.  */
55
#define RELOC_SUFFIX_CHAR ':'
56
 
57
/* This might be CRIS_INSN_NONE if we're assembling a prefix-insn only.
58
   Note that some prefix-insns might be assembled as CRIS_INSN_NORMAL.  */
59
enum cris_insn_kind
60
{
61
  CRIS_INSN_NORMAL, CRIS_INSN_NONE, CRIS_INSN_BRANCH, CRIS_INSN_MUL
62
};
63
 
64
/* An instruction will have one of these prefixes.
65
   Although the same bit-pattern, we handle BDAP with an immediate
66
   expression (eventually quick or [pc+]) different from when we only have
67
   register expressions.  */
68
enum prefix_kind
69
{
70
  PREFIX_NONE, PREFIX_BDAP_IMM, PREFIX_BDAP, PREFIX_BIAP, PREFIX_DIP,
71
  PREFIX_PUSH
72
};
73
 
74
/* The prefix for an instruction.  */
75
struct cris_prefix
76
{
77
  enum prefix_kind kind;
78
  int base_reg_number;
79
  unsigned int opcode;
80
 
81
  /* There might be an expression to be evaluated, like I in [rN+I].  */
82
  expressionS expr;
83
 
84
  /* If there's an expression, we might need a relocation.  Here's the
85
     type of what relocation to start relaxaton with.
86
     The relocation is assumed to start immediately after the prefix insn,
87
     so we don't provide an offset.  */
88
  enum bfd_reloc_code_real reloc;
89
};
90
 
91
/* The description of the instruction being assembled.  */
92
struct cris_instruction
93
{
94
  /* If CRIS_INSN_NONE, then this insn is of zero length.  */
95
  enum cris_insn_kind insn_type;
96
 
97
  /* If a special register was mentioned, this is its description, else
98
     it is NULL.  */
99
  const struct cris_spec_reg *spec_reg;
100
 
101
  unsigned int opcode;
102
 
103
  /* An insn may have at most one expression; theoretically there could be
104
     another in its prefix (but I don't see how that could happen).  */
105
  expressionS expr;
106
 
107
  /* The expression might need a relocation.  Here's one to start
108
     relaxation with.  */
109
  enum bfd_reloc_code_real reloc;
110
 
111
  /* The size in bytes of an immediate expression, or zero if
112
     nonapplicable.  */
113
  int imm_oprnd_size;
114
};
115
 
116
enum cris_archs
117
{
118
  arch_cris_unknown,
119
  arch_crisv0, arch_crisv3, arch_crisv8, arch_crisv10,
120
  arch_cris_any_v0_v10, arch_crisv32, arch_cris_common_v10_v32
121
};
122
 
123
static enum cris_archs cris_arch_from_string (char **);
124
static int cris_insn_ver_valid_for_arch (enum cris_insn_version_usage,
125
                                         enum cris_archs);
126
 
127
static void cris_process_instruction (char *, struct cris_instruction *,
128
                                      struct cris_prefix *);
129
static int get_bwd_size_modifier (char **, int *);
130
static int get_bw_size_modifier (char **, int *);
131
static int get_gen_reg (char **, int *);
132
static int get_spec_reg (char **, const struct cris_spec_reg **);
133
static int get_sup_reg (char **, int *);
134
static int get_autoinc_prefix_or_indir_op (char **, struct cris_prefix *,
135
                                           int *, int *, int *,
136
                                           expressionS *);
137
static int get_3op_or_dip_prefix_op (char **, struct cris_prefix *);
138
static int cris_get_expression (char **, expressionS *);
139
static int get_flags (char **, int *);
140
static void gen_bdap (int, expressionS *);
141
static int branch_disp (int);
142
static void gen_cond_branch_32 (char *, char *, fragS *, symbolS *, symbolS *,
143
                                long int);
144
static void cris_number_to_imm (char *, long, int, fixS *, segT);
145
static void s_syntax (int);
146
static void s_cris_file (int);
147
static void s_cris_loc (int);
148
static void s_cris_arch (int);
149
static void s_cris_dtpoff (int);
150
 
151
/* Get ":GOT", ":GOTOFF", ":PLT" etc. suffixes.  */
152
static void cris_get_reloc_suffix (char **, bfd_reloc_code_real_type *,
153
                                   expressionS *);
154
static unsigned int cris_get_specified_reloc_size (bfd_reloc_code_real_type);
155
 
156
/* All the .syntax functions.  */
157
static void cris_force_reg_prefix (void);
158
static void cris_relax_reg_prefix (void);
159
static void cris_sym_leading_underscore (void);
160
static void cris_sym_no_leading_underscore (void);
161
static char *cris_insn_first_word_frag (void);
162
 
163
/* Handle to the opcode hash table.  */
164
static struct hash_control *op_hash = NULL;
165
 
166
/* If we target cris-axis-linux-gnu (as opposed to generic cris-axis-elf),
167
   we default to no underscore and required register-prefixes.  The
168
   difference is in the default values.  */
169
#ifdef TE_LINUX
170
#define DEFAULT_CRIS_AXIS_LINUX_GNU TRUE
171
#else
172
#define DEFAULT_CRIS_AXIS_LINUX_GNU FALSE
173
#endif
174
 
175
/* Whether we demand that registers have a `$' prefix.  Default here.  */
176
static bfd_boolean demand_register_prefix = DEFAULT_CRIS_AXIS_LINUX_GNU;
177
 
178
/* Whether global user symbols have a leading underscore.  Default here.  */
179
static bfd_boolean symbols_have_leading_underscore
180
  = !DEFAULT_CRIS_AXIS_LINUX_GNU;
181
 
182
/* Whether or not we allow PIC, and expand to PIC-friendly constructs.  */
183
static bfd_boolean pic = FALSE;
184
 
185
/* Whether or not we allow TLS suffixes.  For the moment, we always do.  */
186
static const bfd_boolean tls = TRUE;
187
 
188
/* If we're configured for "cris", default to allow all v0..v10
189
   instructions and register names.  */
190
#ifndef DEFAULT_CRIS_ARCH
191
#define DEFAULT_CRIS_ARCH cris_any_v0_v10
192
#endif
193
 
194
/* No whitespace in the CONCAT2 parameter list.  */
195
static enum cris_archs cris_arch = XCONCAT2 (arch_,DEFAULT_CRIS_ARCH);
196
 
197
const pseudo_typeS md_pseudo_table[] =
198
{
199
  {"dword", cons, 4},
200
  {"dtpoffd", s_cris_dtpoff, 4},
201
  {"syntax", s_syntax, 0},
202
  {"file", s_cris_file, 0},
203
  {"loc", s_cris_loc, 0},
204
  {"arch", s_cris_arch, 0},
205
  {NULL, 0, 0}
206
};
207
 
208
static int warn_for_branch_expansion = 0;
209
 
210
/* Whether to emit error when a MULS/MULU could be located last on a
211
   cache-line.  */
212
static int err_for_dangerous_mul_placement
213
 = (XCONCAT2 (arch_,DEFAULT_CRIS_ARCH) != arch_crisv32);
214
 
215
const char cris_comment_chars[] = ";";
216
 
217
/* This array holds the chars that only start a comment at the beginning of
218
   a line.  If the line seems to have the form '# 123 filename'
219
   .line and .file directives will appear in the pre-processed output.  */
220
/* Note that input_file.c hand-checks for '#' at the beginning of the
221
   first line of the input file.  This is because the compiler outputs
222
   #NO_APP at the beginning of its output.  */
223
/* Also note that slash-star will always start a comment.  */
224
const char line_comment_chars[] = "#";
225
const char line_separator_chars[] = "@";
226
 
227
/* Now all floating point support is shut off.  See md_atof.  */
228
const char EXP_CHARS[] = "";
229
const char FLT_CHARS[] = "";
230
 
231
/* For CRIS, we encode the relax_substateTs (in e.g. fr_substate) as:
232
                       2                 1                 0
233
      ---/ /--+-----------------+-----------------+-----------------+
234
              |  what state ?   |            how long ?             |
235
      ---/ /--+-----------------+-----------------+-----------------+
236
 
237
   The "how long" bits are 00 = byte, 01 = word, 10 = dword (long).
238
   Not all lengths are legit for a given value of (what state).
239
 
240
   Groups for CRIS address relaxing:
241
 
242
   1. Bcc (pre-V32)
243
      length: byte, word, 10-byte expansion
244
 
245
   2. BDAP
246
      length: byte, word, dword
247
 
248
   3. MULS/MULU
249
      Not really a relaxation (no infrastructure to get delay-slots
250
      right), just an alignment and placement checker for the v10
251
      multiply/cache-bug.
252
 
253
   4. Bcc (V32 and later)
254
      length: byte, word, 14-byte expansion
255
 
256
   5. Bcc (V10+V32)
257
      length: byte, word, error
258
 
259
   6. BA (V32)
260
      length: byte, word, dword
261
 
262
   7. LAPC (V32)
263
      length: byte, dword
264
  */
265
 
266
#define STATE_COND_BRANCH           (1)
267
#define STATE_BASE_PLUS_DISP_PREFIX (2)
268
#define STATE_MUL                   (3)
269
#define STATE_COND_BRANCH_V32       (4)
270
#define STATE_COND_BRANCH_COMMON    (5)
271
#define STATE_ABS_BRANCH_V32        (6)
272
#define STATE_LAPC                  (7)
273
#define STATE_COND_BRANCH_PIC       (8)
274
 
275
#define STATE_LENGTH_MASK           (3)
276
#define STATE_BYTE                  (0)
277
#define STATE_WORD                  (1)
278
#define STATE_DWORD                 (2)
279
/* Symbol undefined.  */
280
#define STATE_UNDF                  (3)
281
#define STATE_MAX_LENGTH            (3)
282
 
283
/* These displacements are relative to the address following the opcode
284
   word of the instruction.  The first letter is Byte, Word.  The 2nd
285
   letter is Forward, Backward.  */
286
 
287
#define BRANCH_BF ( 254)
288
#define BRANCH_BB (-256)
289
#define BRANCH_BF_V32 ( 252)
290
#define BRANCH_BB_V32 (-258)
291
#define BRANCH_WF (2 +  32767)
292
#define BRANCH_WB (2 + -32768)
293
#define BRANCH_WF_V32 (-2 + 32767)
294
#define BRANCH_WB_V32 (-2 + -32768)
295
 
296
#define BDAP_BF   ( 127)
297
#define BDAP_BB   (-128)
298
#define BDAP_WF   ( 32767)
299
#define BDAP_WB   (-32768)
300
 
301
#define ENCODE_RELAX(what, length) (((what) << 2) + (length))
302
 
303
const relax_typeS md_cris_relax_table[] =
304
{
305
  /* Error sentinel (0, 0).  */
306
  {1,         1,         0,  0},
307
 
308
  /* Unused (0, 1).  */
309
  {1,         1,         0,  0},
310
 
311
  /* Unused (0, 2).  */
312
  {1,         1,         0,  0},
313
 
314
  /* Unused (0, 3).  */
315
  {1,         1,         0,  0},
316
 
317
  /* Bcc o (1, 0).  */
318
  {BRANCH_BF, BRANCH_BB, 0,  ENCODE_RELAX (1, 1)},
319
 
320
  /* Bcc [PC+] (1, 1).  */
321
  {BRANCH_WF, BRANCH_WB, 2,  ENCODE_RELAX (1, 2)},
322
 
323
  /* BEXT/BWF, BA, JUMP (external), JUMP (always), Bnot_cc, JUMP (default)
324
     (1, 2).  */
325
  {0,          0,  10, 0},
326
 
327
  /* Unused (1, 3).  */
328
  {1,         1,         0,  0},
329
 
330
  /* BDAP o (2, 0).  */
331
  {BDAP_BF,   BDAP_BB,   0,  ENCODE_RELAX (2, 1)},
332
 
333
  /* BDAP.[bw] [PC+] (2, 1).  */
334
  {BDAP_WF,   BDAP_WB,   2,  ENCODE_RELAX (2, 2)},
335
 
336
  /* BDAP.d [PC+] (2, 2).  */
337
  {0,          0,  4,  0},
338
 
339
  /* Unused (2, 3).  */
340
  {1,         1,         0,  0},
341
 
342
  /* MULS/MULU (3, 0).  Positions (3, 1..3) are unused.  */
343
  {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0},
344
 
345
  /* V32: Bcc o (4, 0).  */
346
  {BRANCH_BF_V32, BRANCH_BB_V32, 0,  ENCODE_RELAX (4, 1)},
347
 
348
  /* V32: Bcc [PC+] (4, 1).  */
349
  {BRANCH_WF_V32, BRANCH_WB_V32, 2,  ENCODE_RELAX (4, 2)},
350
 
351
  /* V32: BA .+12; NOP; BA32 target; NOP; Bcc .-6  (4, 2).  */
352
  {0,          0,  12, 0},
353
 
354
  /* Unused (4, 3).  */
355
  {1,         1,         0,  0},
356
 
357
  /* COMMON: Bcc o (5, 0).  The offsets are calculated as for v32.  Code
358
     should contain two nop insns (or four if offset size is large or
359
     unknown) after every label.  */
360
  {BRANCH_BF_V32, BRANCH_BB_V32, 0,  ENCODE_RELAX (5, 1)},
361
 
362
  /* COMMON: Bcc [PC+] (5, 1).  */
363
  {BRANCH_WF_V32, BRANCH_WB_V32, 2,  ENCODE_RELAX (5, 2)},
364
 
365
  /* COMMON: FIXME: ???.  Treat as error currently.  */
366
  {0,          0,  12, 0},
367
 
368
  /* Unused (5, 3).  */
369
  {1,         1,         0,  0},
370
 
371
  /* V32: BA o (6, 0).  */
372
  {BRANCH_BF_V32, BRANCH_BB_V32, 0,  ENCODE_RELAX (6, 1)},
373
 
374
  /* V32: BA.W (6, 1).  */
375
  {BRANCH_WF_V32, BRANCH_WB_V32, 2,  ENCODE_RELAX (6, 2)},
376
 
377
  /* V32: BA.D (6, 2).  */
378
  {0,          0,  4, 0},
379
 
380
  /* Unused (6, 3).  */
381
  {1,         1,         0,  0},
382
 
383
  /* LAPC: LAPCQ .+0..15*2,Rn  (7, 0).  */
384
  {14*2,   -1*2,         0,  ENCODE_RELAX (7, 2)},
385
 
386
  /* Unused (7, 1).
387
     While there's a shorter sequence, e.g. LAPCQ + an ADDQ or SUBQ,
388
     that would affect flags, so we can't do that as it wouldn't be a
389
     proper insn expansion of LAPCQ.  This row is associated with a
390
     2-byte expansion, so it's unused rather than the next.  */
391
  {1,         1,         0,  0},
392
 
393
  /* LAPC: LAPC.D (7, 2).  */
394
  {0,          0,  4, 0},
395
 
396
  /* Unused (7, 3).  */
397
  {1,         1,         0,  0},
398
 
399
  /* PIC for pre-v32: Bcc o (8, 0).  */
400
  {BRANCH_BF, BRANCH_BB, 0,  ENCODE_RELAX (STATE_COND_BRANCH_PIC, 1)},
401
 
402
  /* Bcc [PC+] (8, 1).  */
403
  {BRANCH_WF, BRANCH_WB, 2,  ENCODE_RELAX (STATE_COND_BRANCH_PIC, 2)},
404
 
405
  /* 32-bit expansion, PIC (8, 2).  */
406
  {0,          0,  12, 0},
407
 
408
  /* Unused (8, 3).  */
409
  {1,         1,         0,  0}
410
};
411
 
412
#undef BDAP_BF
413
#undef BDAP_BB
414
#undef BDAP_WF
415
#undef BDAP_WB
416
 
417
/* Target-specific multicharacter options, not const-declared.  */
418
struct option md_longopts[] =
419
{
420
#define OPTION_NO_US (OPTION_MD_BASE + 0)
421
  {"no-underscore", no_argument, NULL, OPTION_NO_US},
422
#define OPTION_US (OPTION_MD_BASE + 1)
423
  {"underscore", no_argument, NULL, OPTION_US},
424
#define OPTION_PIC (OPTION_US + 1)
425
  {"pic", no_argument, NULL, OPTION_PIC},
426
#define OPTION_MULBUG_ABORT_ON (OPTION_PIC + 1)
427
  {"mul-bug-abort", no_argument, NULL, OPTION_MULBUG_ABORT_ON},
428
#define OPTION_MULBUG_ABORT_OFF (OPTION_MULBUG_ABORT_ON + 1)
429
  {"no-mul-bug-abort", no_argument, NULL, OPTION_MULBUG_ABORT_OFF},
430
#define OPTION_ARCH (OPTION_MULBUG_ABORT_OFF + 1)
431
  {"march", required_argument, NULL, OPTION_ARCH},
432
  {NULL, no_argument, NULL, 0}
433
};
434
 
435
/* Not const-declared.  */
436
size_t md_longopts_size = sizeof (md_longopts);
437
const char *md_shortopts = "hHN";
438
 
439
/* At first glance, this may seems wrong and should be 4 (ba + nop); but
440
   since a short_jump must skip a *number* of long jumps, it must also be
441
   a long jump.  Here, we hope to make it a "ba [16bit_offs]" and a "nop"
442
   for the delay slot and hope that the jump table at most needs
443
   32767/4=8191 long-jumps.  A branch is better than a jump, since it is
444
   relative; we will not have a reloc to fix up somewhere.
445
 
446
   Note that we can't add relocs, because relaxation uses these fixed
447
   numbers, and md_create_short_jump is called after relaxation.  */
448
 
449
int md_short_jump_size = 6;
450
 
451
/* The v32 version has a delay-slot, hence two bytes longer.
452
   The pre-v32 PIC version uses a prefixed insn.  */
453
#define cris_any_v0_v10_long_jump_size 6
454
#define cris_any_v0_v10_long_jump_size_pic 8
455
#define crisv32_long_jump_size 8
456
 
457
int md_long_jump_size = XCONCAT2 (DEFAULT_CRIS_ARCH,_long_jump_size);
458
 
459
/* Report output format.  Small changes in output format (like elf
460
   variants below) can happen until all options are parsed, but after
461
   that, the output format must remain fixed.  */
462
 
463
const char *
464
cris_target_format (void)
465
{
466
  switch (OUTPUT_FLAVOR)
467
    {
468
    case bfd_target_aout_flavour:
469
      return "a.out-cris";
470
 
471
    case bfd_target_elf_flavour:
472
      if (symbols_have_leading_underscore)
473
        return "elf32-us-cris";
474
      return "elf32-cris";
475
 
476
    default:
477
      abort ();
478
      return NULL;
479
    }
480
}
481
 
482
/* Return a bfd_mach_cris... value corresponding to the value of
483
   cris_arch.  */
484
 
485
unsigned int
486
cris_mach (void)
487
{
488
  unsigned int retval = 0;
489
 
490
  switch (cris_arch)
491
    {
492
    case arch_cris_common_v10_v32:
493
      retval = bfd_mach_cris_v10_v32;
494
      break;
495
 
496
    case arch_crisv32:
497
      retval = bfd_mach_cris_v32;
498
      break;
499
 
500
    case arch_crisv10:
501
    case arch_cris_any_v0_v10:
502
      retval = bfd_mach_cris_v0_v10;
503
      break;
504
 
505
    default:
506
      BAD_CASE (cris_arch);
507
    }
508
 
509
  return retval;
510
}
511
 
512
/* We need a port-specific relaxation function to cope with sym2 - sym1
513
   relative expressions with both symbols in the same segment (but not
514
   necessarily in the same frag as this insn), for example:
515
     move.d [pc+sym2-(sym1-2)],r10
516
    sym1:
517
   The offset can be 8, 16 or 32 bits long.  */
518
 
519
long
520
cris_relax_frag (segT seg ATTRIBUTE_UNUSED, fragS *fragP,
521
                 long stretch ATTRIBUTE_UNUSED)
522
{
523
  long growth;
524
  offsetT aim = 0;
525
  symbolS *symbolP;
526
  const relax_typeS *this_type;
527
  const relax_typeS *start_type;
528
  relax_substateT next_state;
529
  relax_substateT this_state;
530
  const relax_typeS *table = TC_GENERIC_RELAX_TABLE;
531
 
532
  /* We only have to cope with frags as prepared by
533
     md_estimate_size_before_relax.  The dword cases may get here
534
     because of the different reasons that they aren't relaxable.  */
535
  switch (fragP->fr_subtype)
536
    {
537
    case ENCODE_RELAX (STATE_COND_BRANCH_PIC, STATE_DWORD):
538
    case ENCODE_RELAX (STATE_COND_BRANCH, STATE_DWORD):
539
    case ENCODE_RELAX (STATE_COND_BRANCH_V32, STATE_DWORD):
540
    case ENCODE_RELAX (STATE_COND_BRANCH_COMMON, STATE_DWORD):
541
    case ENCODE_RELAX (STATE_ABS_BRANCH_V32, STATE_DWORD):
542
    case ENCODE_RELAX (STATE_LAPC, STATE_DWORD):
543
    case ENCODE_RELAX (STATE_BASE_PLUS_DISP_PREFIX, STATE_DWORD):
544
      /* When we get to these states, the frag won't grow any more.  */
545
      return 0;
546
 
547
    case ENCODE_RELAX (STATE_BASE_PLUS_DISP_PREFIX, STATE_WORD):
548
    case ENCODE_RELAX (STATE_BASE_PLUS_DISP_PREFIX, STATE_BYTE):
549
      if (fragP->fr_symbol == NULL
550
          || S_GET_SEGMENT (fragP->fr_symbol) != absolute_section)
551
        as_fatal (_("internal inconsistency problem in %s: fr_symbol %lx"),
552
                  __FUNCTION__, (long) fragP->fr_symbol);
553
      symbolP = fragP->fr_symbol;
554
      if (symbol_resolved_p (symbolP))
555
        as_fatal (_("internal inconsistency problem in %s: resolved symbol"),
556
                  __FUNCTION__);
557
      aim = S_GET_VALUE (symbolP);
558
      break;
559
 
560
    case ENCODE_RELAX (STATE_MUL, STATE_BYTE):
561
      /* Nothing to do here.  */
562
      return 0;
563
 
564
    default:
565
      as_fatal (_("internal inconsistency problem in %s: fr_subtype %d"),
566
                  __FUNCTION__, fragP->fr_subtype);
567
    }
568
 
569
  /* The rest is stolen from relax_frag.  There's no obvious way to
570
     share the code, but fortunately no requirement to keep in sync as
571
     long as fragP->fr_symbol does not have its segment changed.  */
572
 
573
  this_state = fragP->fr_subtype;
574
  start_type = this_type = table + this_state;
575
 
576
  if (aim < 0)
577
    {
578
      /* Look backwards.  */
579
      for (next_state = this_type->rlx_more; next_state;)
580
        if (aim >= this_type->rlx_backward)
581
          next_state = 0;
582
        else
583
          {
584
            /* Grow to next state.  */
585
            this_state = next_state;
586
            this_type = table + this_state;
587
            next_state = this_type->rlx_more;
588
          }
589
    }
590
  else
591
    {
592
      /* Look forwards.  */
593
      for (next_state = this_type->rlx_more; next_state;)
594
        if (aim <= this_type->rlx_forward)
595
          next_state = 0;
596
        else
597
          {
598
            /* Grow to next state.  */
599
            this_state = next_state;
600
            this_type = table + this_state;
601
            next_state = this_type->rlx_more;
602
          }
603
    }
604
 
605
  growth = this_type->rlx_length - start_type->rlx_length;
606
  if (growth != 0)
607
    fragP->fr_subtype = this_state;
608
  return growth;
609
}
610
 
611
/* Prepare machine-dependent frags for relaxation.
612
 
613
   Called just before relaxation starts. Any symbol that is now undefined
614
   will not become defined.
615
 
616
   Return the correct fr_subtype in the frag.
617
 
618
   Return the initial "guess for fr_var" to caller.  The guess for fr_var
619
   is *actually* the growth beyond fr_fix. Whatever we do to grow fr_fix
620
   or fr_var contributes to our returned value.
621
 
622
   Although it may not be explicit in the frag, pretend
623
   fr_var starts with a value.  */
624
 
625
int
626
md_estimate_size_before_relax (fragS *fragP, segT segment_type)
627
{
628
  int old_fr_fix;
629
  symbolS *symbolP = fragP->fr_symbol;
630
 
631
#define HANDLE_RELAXABLE(state)                                         \
632
    case ENCODE_RELAX (state, STATE_UNDF):                              \
633
      if (symbolP != NULL                                               \
634
          && S_GET_SEGMENT (symbolP) == segment_type                    \
635
          && !S_IS_WEAK (symbolP))                                      \
636
        /* The symbol lies in the same segment - a relaxable            \
637
           case.  */                                                    \
638
        fragP->fr_subtype                                               \
639
          = ENCODE_RELAX (state, STATE_BYTE);                           \
640
      else                                                              \
641
        /* Unknown or not the same segment, so not relaxable.  */       \
642
        fragP->fr_subtype                                               \
643
          = ENCODE_RELAX (state, STATE_DWORD);                          \
644
      fragP->fr_var                                                     \
645
        = md_cris_relax_table[fragP->fr_subtype].rlx_length;            \
646
      break
647
 
648
  old_fr_fix = fragP->fr_fix;
649
 
650
  switch (fragP->fr_subtype)
651
    {
652
      HANDLE_RELAXABLE (STATE_COND_BRANCH);
653
      HANDLE_RELAXABLE (STATE_COND_BRANCH_V32);
654
      HANDLE_RELAXABLE (STATE_COND_BRANCH_COMMON);
655
      HANDLE_RELAXABLE (STATE_COND_BRANCH_PIC);
656
      HANDLE_RELAXABLE (STATE_ABS_BRANCH_V32);
657
 
658
    case ENCODE_RELAX (STATE_LAPC, STATE_UNDF):
659
      if (symbolP != NULL
660
          && S_GET_SEGMENT (symbolP) == segment_type
661
          && !S_IS_WEAK (symbolP))
662
        {
663
          /* The symbol lies in the same segment - a relaxable case.
664
             Check if we currently have an odd offset; we can't code
665
             that into the instruction.  Relaxing presumably only cause
666
             multiple-of-two changes, so we should only need to adjust
667
             for that here.  */
668
          bfd_vma target_address
669
            = (symbolP
670
               ? S_GET_VALUE (symbolP)
671
               : 0) + fragP->fr_offset;
672
          bfd_vma var_part_offset = fragP->fr_fix;
673
          bfd_vma address_of_var_part = fragP->fr_address + var_part_offset;
674
          long offset = target_address - (address_of_var_part - 2);
675
 
676
          fragP->fr_subtype
677
            = (offset & 1)
678
            ? ENCODE_RELAX (STATE_LAPC, STATE_DWORD)
679
            : ENCODE_RELAX (STATE_LAPC, STATE_BYTE);
680
        }
681
      else
682
        /* Unknown or not the same segment, so not relaxable.  */
683
        fragP->fr_subtype
684
          = ENCODE_RELAX (STATE_LAPC, STATE_DWORD);
685
      fragP->fr_var
686
        = md_cris_relax_table[fragP->fr_subtype].rlx_length;
687
      break;
688
 
689
    case ENCODE_RELAX (STATE_BASE_PLUS_DISP_PREFIX, STATE_UNDF):
690
      /* Note that we can not do anything sane with relaxing
691
         [rX + a_known_symbol_in_text], it will have to be a 32-bit
692
         value.
693
 
694
         We could play tricks with managing a constant pool and make
695
         a_known_symbol_in_text a "bdap [pc + offset]" pointing there
696
         (like the GOT for ELF shared libraries), but that's no use, it
697
         would in general be no shorter or faster code, only more
698
         complicated.  */
699
 
700
      if (S_GET_SEGMENT (symbolP) != absolute_section)
701
        {
702
          /* Go for dword if not absolute or same segment.  */
703
          fragP->fr_subtype
704
            = ENCODE_RELAX (STATE_BASE_PLUS_DISP_PREFIX, STATE_DWORD);
705
          fragP->fr_var = md_cris_relax_table[fragP->fr_subtype].rlx_length;
706
        }
707
      else if (!symbol_resolved_p (fragP->fr_symbol))
708
        {
709
          /* The symbol will eventually be completely resolved as an
710
             absolute expression, but right now it depends on the result
711
             of relaxation and we don't know anything else about the
712
             value.  We start relaxation with the assumption that it'll
713
             fit in a byte.  */
714
          fragP->fr_subtype
715
            = ENCODE_RELAX (STATE_BASE_PLUS_DISP_PREFIX, STATE_BYTE);
716
          fragP->fr_var = md_cris_relax_table[fragP->fr_subtype].rlx_length;
717
        }
718
      else
719
        {
720
          /* Absolute expression.  */
721
          long int value;
722
          value = (symbolP != NULL
723
                   ? S_GET_VALUE (symbolP) : 0) + fragP->fr_offset;
724
 
725
          if (value >= -128 && value <= 127)
726
            {
727
              /* Byte displacement.  */
728
              (fragP->fr_opcode)[0] = value;
729
            }
730
          else
731
            {
732
              /* Word or dword displacement.  */
733
              int pow2_of_size = 1;
734
              char *writep;
735
 
736
              if (value < -32768 || value > 32767)
737
                {
738
                  /* Outside word range, make it a dword.  */
739
                  pow2_of_size = 2;
740
                }
741
 
742
              /* Modify the byte-offset BDAP into a word or dword offset
743
                 BDAP.  Or really, a BDAP rX,8bit into a
744
                 BDAP.[wd] rX,[PC+] followed by a word or dword.  */
745
              (fragP->fr_opcode)[0] = BDAP_PC_LOW + pow2_of_size * 16;
746
 
747
              /* Keep the register number in the highest four bits.  */
748
              (fragP->fr_opcode)[1] &= 0xF0;
749
              (fragP->fr_opcode)[1] |= BDAP_INCR_HIGH;
750
 
751
              /* It grew by two or four bytes.  */
752
              fragP->fr_fix += 1 << pow2_of_size;
753
              writep = fragP->fr_literal + old_fr_fix;
754
              md_number_to_chars (writep, value, 1 << pow2_of_size);
755
            }
756
          frag_wane (fragP);
757
        }
758
      break;
759
 
760
    case ENCODE_RELAX (STATE_COND_BRANCH, STATE_BYTE):
761
    case ENCODE_RELAX (STATE_COND_BRANCH, STATE_WORD):
762
    case ENCODE_RELAX (STATE_COND_BRANCH, STATE_DWORD):
763
    case ENCODE_RELAX (STATE_COND_BRANCH_PIC, STATE_BYTE):
764
    case ENCODE_RELAX (STATE_COND_BRANCH_PIC, STATE_WORD):
765
    case ENCODE_RELAX (STATE_COND_BRANCH_PIC, STATE_DWORD):
766
    case ENCODE_RELAX (STATE_COND_BRANCH_V32, STATE_BYTE):
767
    case ENCODE_RELAX (STATE_COND_BRANCH_V32, STATE_WORD):
768
    case ENCODE_RELAX (STATE_COND_BRANCH_V32, STATE_DWORD):
769
    case ENCODE_RELAX (STATE_COND_BRANCH_COMMON, STATE_BYTE):
770
    case ENCODE_RELAX (STATE_COND_BRANCH_COMMON, STATE_WORD):
771
    case ENCODE_RELAX (STATE_COND_BRANCH_COMMON, STATE_DWORD):
772
    case ENCODE_RELAX (STATE_ABS_BRANCH_V32, STATE_BYTE):
773
    case ENCODE_RELAX (STATE_ABS_BRANCH_V32, STATE_WORD):
774
    case ENCODE_RELAX (STATE_ABS_BRANCH_V32, STATE_DWORD):
775
    case ENCODE_RELAX (STATE_LAPC, STATE_BYTE):
776
    case ENCODE_RELAX (STATE_LAPC, STATE_DWORD):
777
    case ENCODE_RELAX (STATE_BASE_PLUS_DISP_PREFIX, STATE_BYTE):
778
    case ENCODE_RELAX (STATE_BASE_PLUS_DISP_PREFIX, STATE_WORD):
779
    case ENCODE_RELAX (STATE_BASE_PLUS_DISP_PREFIX, STATE_DWORD):
780
      /* When relaxing a section for the second time, we don't need to
781
         do anything except making sure that fr_var is set right.  */
782
      fragP->fr_var = md_cris_relax_table[fragP->fr_subtype].rlx_length;
783
      break;
784
 
785
    case ENCODE_RELAX (STATE_MUL, STATE_BYTE):
786
      /* Nothing to do here.  */
787
      break;
788
 
789
    default:
790
      BAD_CASE (fragP->fr_subtype);
791
    }
792
 
793
  return fragP->fr_var + (fragP->fr_fix - old_fr_fix);
794
}
795
 
796
/* Perform post-processing of machine-dependent frags after relaxation.
797
   Called after relaxation is finished.
798
   In:  Address of frag.
799
        fr_type == rs_machine_dependent.
800
        fr_subtype is what the address relaxed to.
801
 
802
   Out: Any fixS:s and constants are set up.
803
 
804
   The caller will turn the frag into a ".space 0".  */
805
 
806
void
807
md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT sec ATTRIBUTE_UNUSED,
808
                 fragS *fragP)
809
{
810
  /* Pointer to first byte in variable-sized part of the frag.  */
811
  char *var_partp;
812
 
813
  /* Pointer to first opcode byte in frag.  */
814
  char *opcodep;
815
 
816
  /* Used to check integrity of the relaxation.
817
     One of 2 = long, 1 = word, or 0 = byte.  */
818 166 khays
  int length_code ATTRIBUTE_UNUSED;
819 16 khays
 
820
  /* Size in bytes of variable-sized part of frag.  */
821
  int var_part_size = 0;
822
 
823
  /* This is part of *fragP.  It contains all information about addresses
824
     and offsets to varying parts.  */
825
  symbolS *symbolP;
826
  unsigned long var_part_offset;
827
 
828
  /* Where, in file space, is _var of *fragP?  */
829
  unsigned long address_of_var_part = 0;
830
 
831
  /* Where, in file space, does addr point?  */
832
  unsigned long target_address;
833
 
834
  know (fragP->fr_type == rs_machine_dependent);
835
 
836
  length_code = fragP->fr_subtype & STATE_LENGTH_MASK;
837
  know (length_code >= 0 && length_code < STATE_MAX_LENGTH);
838
 
839
  var_part_offset = fragP->fr_fix;
840
  var_partp = fragP->fr_literal + var_part_offset;
841
  opcodep = fragP->fr_opcode;
842
 
843
  symbolP = fragP->fr_symbol;
844
  target_address = (symbolP ? S_GET_VALUE (symbolP) : 0) + fragP->fr_offset;
845
  address_of_var_part = fragP->fr_address + var_part_offset;
846
 
847
  switch (fragP->fr_subtype)
848
    {
849
    case ENCODE_RELAX (STATE_COND_BRANCH, STATE_BYTE):
850
    case ENCODE_RELAX (STATE_COND_BRANCH_PIC, STATE_BYTE):
851
    case ENCODE_RELAX (STATE_COND_BRANCH_V32, STATE_BYTE):
852
    case ENCODE_RELAX (STATE_COND_BRANCH_COMMON, STATE_BYTE):
853
    case ENCODE_RELAX (STATE_ABS_BRANCH_V32, STATE_BYTE):
854
      opcodep[0] = branch_disp ((target_address - address_of_var_part));
855
      var_part_size = 0;
856
      break;
857
 
858
    case ENCODE_RELAX (STATE_COND_BRANCH, STATE_WORD):
859
    case ENCODE_RELAX (STATE_COND_BRANCH_PIC, STATE_WORD):
860
    case ENCODE_RELAX (STATE_COND_BRANCH_V32, STATE_WORD):
861
    case ENCODE_RELAX (STATE_COND_BRANCH_COMMON, STATE_WORD):
862
    case ENCODE_RELAX (STATE_ABS_BRANCH_V32, STATE_WORD):
863
      /* We had a quick immediate branch, now turn it into a word one i.e. a
864
         PC autoincrement.  */
865
      opcodep[0] = BRANCH_PC_LOW;
866
      opcodep[1] &= 0xF0;
867
      opcodep[1] |= BRANCH_INCR_HIGH;
868
      md_number_to_chars (var_partp,
869
                          (long)
870
                          (target_address
871
                           - (address_of_var_part
872
                              + (cris_arch == arch_crisv32
873
                                 || cris_arch == arch_cris_common_v10_v32
874
                                 ? -2 : 2))),
875
                          2);
876
      var_part_size = 2;
877
      break;
878
 
879
    case ENCODE_RELAX (STATE_COND_BRANCH, STATE_DWORD):
880
      gen_cond_branch_32 (fragP->fr_opcode, var_partp, fragP,
881
                          fragP->fr_symbol, (symbolS *) NULL,
882
                          fragP->fr_offset);
883
      /* Ten bytes added: a branch, nop and a jump.  */
884
      var_part_size = 2 + 2 + 4 + 2;
885
      break;
886
 
887
    case ENCODE_RELAX (STATE_COND_BRANCH_PIC, STATE_DWORD):
888
      gen_cond_branch_32 (fragP->fr_opcode, var_partp, fragP,
889
                          fragP->fr_symbol, (symbolS *) NULL,
890
                          fragP->fr_offset);
891
      /* Twelve bytes added: a branch, nop and a pic-branch-32.  */
892
      var_part_size = 2 + 2 + 4 + 2 + 2;
893
      break;
894
 
895
    case ENCODE_RELAX (STATE_COND_BRANCH_V32, STATE_DWORD):
896
      gen_cond_branch_32 (fragP->fr_opcode, var_partp, fragP,
897
                          fragP->fr_symbol, (symbolS *) NULL,
898
                          fragP->fr_offset);
899
      /* Twelve bytes added: a branch, nop and another branch and nop.  */
900
      var_part_size = 2 + 2 + 2 + 4 + 2;
901
      break;
902
 
903
    case ENCODE_RELAX (STATE_COND_BRANCH_COMMON, STATE_DWORD):
904
      as_bad_where (fragP->fr_file, fragP->fr_line,
905
                    _("Relaxation to long branches for .arch common_v10_v32\
906
 not implemented"));
907
      /* Pretend we have twelve bytes for sake of quelling further
908
         errors.  */
909
      var_part_size = 2 + 2 + 2 + 4 + 2;
910
      break;
911
 
912
    case ENCODE_RELAX (STATE_ABS_BRANCH_V32, STATE_DWORD):
913
      /* We had a quick immediate branch or a word immediate ba.  Now
914
         turn it into a dword one.  */
915
      opcodep[0] = BA_DWORD_OPCODE & 255;
916
      opcodep[1] = (BA_DWORD_OPCODE >> 8) & 255;
917
      fix_new (fragP, var_partp - fragP->fr_literal, 4, symbolP,
918
               fragP->fr_offset + 6, 1, BFD_RELOC_32_PCREL);
919
      var_part_size = 4;
920
      break;
921
 
922
    case ENCODE_RELAX (STATE_LAPC, STATE_BYTE):
923
      {
924
        long offset = target_address - (address_of_var_part - 2);
925
 
926
        /* This is mostly a sanity check; useful occurrences (if there
927
           really are any) should have been caught in
928
           md_estimate_size_before_relax.  We can (at least
929
           theoretically) stumble over invalid code with odd sizes and
930
           .p2aligns within the code, so emit an error if that happens.
931
           (The generic relaxation machinery is not fit to check this.)  */
932
 
933
        if (offset & 1)
934
          as_bad_where (fragP->fr_file, fragP->fr_line,
935
                    _("Complicated LAPC target operand is not\
936
 a multiple of two.  Use LAPC.D"));
937
 
938
        /* FIXME: This *is* a sanity check.  Remove when done with.  */
939
        if (offset > 15*2 || offset < 0)
940
          as_fatal (_("Internal error found in md_convert_frag: offset %ld.\
941
  Please report this."),
942
                    offset);
943
 
944
        opcodep[0] |= (offset / 2) & 0xf;
945
        var_part_size = 0;
946
      }
947
      break;
948
 
949
    case ENCODE_RELAX (STATE_LAPC, STATE_DWORD):
950
      {
951
        md_number_to_chars (opcodep,
952
                            LAPC_DWORD_OPCODE + (opcodep[1] & 0xf0) * 256,
953
                            2);
954
        /* Remember that the reloc is against the position *after* the
955
           relocated contents, so we need to adjust to the start of
956
           the insn.  */
957
        fix_new (fragP, var_partp - fragP->fr_literal, 4, fragP->fr_symbol,
958
                 fragP->fr_offset + 6, 1, BFD_RELOC_32_PCREL);
959
        var_part_size = 4;
960
      }
961
      break;
962
 
963
    case ENCODE_RELAX (STATE_BASE_PLUS_DISP_PREFIX, STATE_BYTE):
964
      if (symbolP == NULL)
965
        as_fatal (_("internal inconsistency in %s: bdapq no symbol"),
966
                    __FUNCTION__);
967
      opcodep[0] = S_GET_VALUE (symbolP);
968
      var_part_size = 0;
969
      break;
970
 
971
    case ENCODE_RELAX (STATE_BASE_PLUS_DISP_PREFIX, STATE_WORD):
972
      /* We had a BDAP 8-bit "quick immediate", now turn it into a 16-bit
973
         one that uses PC autoincrement.  */
974
      opcodep[0] = BDAP_PC_LOW + (1 << 4);
975
      opcodep[1] &= 0xF0;
976
      opcodep[1] |= BDAP_INCR_HIGH;
977
      if (symbolP == NULL)
978
        as_fatal (_("internal inconsistency in %s: bdap.w with no symbol"),
979
                  __FUNCTION__);
980
      md_number_to_chars (var_partp, S_GET_VALUE (symbolP), 2);
981
      var_part_size = 2;
982
      break;
983
 
984
    case ENCODE_RELAX (STATE_BASE_PLUS_DISP_PREFIX, STATE_DWORD):
985
      /* We had a BDAP 16-bit "word", change the offset to a dword.  */
986
      opcodep[0] = BDAP_PC_LOW + (2 << 4);
987
      opcodep[1] &= 0xF0;
988
      opcodep[1] |= BDAP_INCR_HIGH;
989
      if (fragP->fr_symbol == NULL)
990
        md_number_to_chars (var_partp, fragP->fr_offset, 4);
991
      else
992
        fix_new (fragP, var_partp - fragP->fr_literal, 4, fragP->fr_symbol,
993
                 fragP->fr_offset, 0, BFD_RELOC_32);
994
      var_part_size = 4;
995
      break;
996
 
997
    case ENCODE_RELAX (STATE_MUL, STATE_BYTE):
998
      /* This is the only time we check position and alignment of the
999
         placement-tracking frag.  */
1000
      if (sec->alignment_power < 2)
1001
        as_bad_where (fragP->fr_file, fragP->fr_line,
1002
                      _("section alignment must be >= 4 bytes to check MULS/MULU safeness"));
1003
      else
1004
        {
1005
          /* If the address after the MULS/MULU has alignment which is
1006
             that of the section and may be that of a cache-size of the
1007
             buggy versions, then the MULS/MULU can be placed badly.  */
1008
          if ((address_of_var_part
1009
               & ((1 << sec->alignment_power) - 1) & 31) == 0)
1010
            as_bad_where (fragP->fr_file, fragP->fr_line,
1011
                          _("dangerous MULS/MULU location; give it higher alignment"));
1012
        }
1013
      break;
1014
 
1015
    default:
1016
      BAD_CASE (fragP->fr_subtype);
1017
      break;
1018
    }
1019
 
1020
  fragP->fr_fix += var_part_size;
1021
}
1022
 
1023
/* Generate a short jump around a secondary jump table.
1024
   Also called from md_create_long_jump, when sufficient.  */
1025
 
1026
void
1027
md_create_short_jump (char *storep, addressT from_addr, addressT to_addr,
1028
                        fragS *fragP ATTRIBUTE_UNUSED,
1029
                        symbolS *to_symbol ATTRIBUTE_UNUSED)
1030
{
1031
  long int distance;
1032
 
1033
  /* See md_create_long_jump about the comment on the "+ 2".  */
1034
  long int max_minimal_minus_distance;
1035
  long int max_minimal_plus_distance;
1036
  long int max_minus_distance;
1037
  long int max_plus_distance;
1038
  int nop_opcode;
1039
 
1040
  if (cris_arch == arch_crisv32)
1041
    {
1042
      max_minimal_minus_distance = BRANCH_BB_V32 + 2;
1043
      max_minimal_plus_distance = BRANCH_BF_V32 + 2;
1044
      max_minus_distance = BRANCH_WB_V32 + 2;
1045
      max_plus_distance = BRANCH_WF_V32 + 2;
1046
      nop_opcode = NOP_OPCODE_V32;
1047
    }
1048
  else if (cris_arch == arch_cris_common_v10_v32)
1049
    /* Bail out for compatibility mode.  (It seems it can be implemented,
1050
       perhaps with a 10-byte sequence: "move.d NNNN,$pc/$acr", "jump
1051
       $acr", "nop"; but doesn't seem worth it at the moment.)  */
1052
    as_fatal (_("Out-of-range .word offset handling\
1053
 is not implemented for .arch common_v10_v32"));
1054
  else
1055
    {
1056
      max_minimal_minus_distance = BRANCH_BB + 2;
1057
      max_minimal_plus_distance = BRANCH_BF + 2;
1058
      max_minus_distance = BRANCH_WB + 2;
1059
      max_plus_distance = BRANCH_WF + 2;
1060
      nop_opcode = NOP_OPCODE;
1061
    }
1062
 
1063
  distance = to_addr - from_addr;
1064
 
1065
  if (max_minimal_minus_distance <= distance
1066
      && distance <= max_minimal_plus_distance)
1067
    {
1068
      /* Create a "short" short jump: "BA distance - 2".  */
1069
      storep[0] = branch_disp (distance - 2);
1070
      storep[1] = BA_QUICK_HIGH;
1071
 
1072
      /* A nop for the delay slot.  */
1073
      md_number_to_chars (storep + 2, nop_opcode, 2);
1074
 
1075
      /* The extra word should be filled with something sane too.  Make it
1076
         a nop to keep disassembly sane.  */
1077
      md_number_to_chars (storep + 4, nop_opcode, 2);
1078
    }
1079
  else if (max_minus_distance <= distance
1080
           && distance <= max_plus_distance)
1081
    {
1082
      /* Make it a "long" short jump: "BA (PC+)".  */
1083
      md_number_to_chars (storep, BA_PC_INCR_OPCODE, 2);
1084
 
1085
      /* ".WORD distance - 4".  */
1086
      md_number_to_chars (storep + 2,
1087
                          (long) (distance - 4
1088
                                  - (cris_arch == arch_crisv32
1089
                                     ? -4 : 0)),
1090
                          2);
1091
 
1092
      /* A nop for the delay slot.  */
1093
      md_number_to_chars (storep + 4, nop_opcode, 2);
1094
    }
1095
  else
1096
    as_bad_where (fragP->fr_file, fragP->fr_line,
1097
                  _(".word case-table handling failed: table too large"));
1098
}
1099
 
1100
/* Generate a long jump in a secondary jump table.
1101
 
1102
   storep  Where to store the jump instruction.
1103
   from_addr  Address of the jump instruction.
1104
   to_addr    Destination address of the jump.
1105
   fragP      Which frag the destination address operand
1106
              lies in.
1107
   to_symbol  Destination symbol.  */
1108
 
1109
void
1110
md_create_long_jump (char *storep, addressT from_addr, addressT to_addr,
1111
                     fragS *fragP, symbolS *to_symbol)
1112
{
1113
  long int distance;
1114
 
1115
  /* FIXME: What's that "+ 3"?  It comes from the magic numbers that
1116
     used to be here, it's just translated to the limit macros used in
1117
     the relax table.  But why + 3?  */
1118
  long int max_short_minus_distance
1119
    = cris_arch != arch_crisv32 ? BRANCH_WB + 3 : BRANCH_WB_V32 + 3;
1120
 
1121
  long int max_short_plus_distance
1122
    = cris_arch != arch_crisv32 ? BRANCH_WF + 3 : BRANCH_WF_V32 + 3;
1123
 
1124
  distance = to_addr - from_addr;
1125
 
1126
  if (max_short_minus_distance <= distance
1127
      && distance <= max_short_plus_distance)
1128
    /* Then make it a "short" long jump.  */
1129
    md_create_short_jump (storep, from_addr, to_addr, fragP,
1130
                            to_symbol);
1131
  else
1132
    {
1133
      /* We have a "long" long jump: "JUMP [PC+]".  If CRISv32, always
1134
         make it a BA.  Else make it an "MOVE [PC=PC+N],P0" if we're supposed
1135
         to emit PIC code.  */
1136
      md_number_to_chars (storep,
1137
                          cris_arch == arch_crisv32
1138
                          ? BA_DWORD_OPCODE
1139
                          : (pic ? MOVE_PC_INCR_OPCODE_PREFIX
1140
                             : JUMP_PC_INCR_OPCODE),
1141
                          2);
1142
 
1143
      /* Follow with a ".DWORD to_addr", PC-relative for PIC.  */
1144
      fix_new (fragP, storep + 2 - fragP->fr_literal, 4, to_symbol,
1145
               cris_arch == arch_crisv32 ? 6 : 0,
1146
               cris_arch == arch_crisv32 || pic ? 1 : 0,
1147
               cris_arch == arch_crisv32 || pic
1148
               ? BFD_RELOC_32_PCREL : BFD_RELOC_32);
1149
 
1150
      /* Follow it with a "NOP" for CRISv32.  */
1151
      if (cris_arch == arch_crisv32)
1152
        md_number_to_chars (storep + 6, NOP_OPCODE_V32, 2);
1153
      else if (pic)
1154
        /* ...and the rest of the move-opcode for pre-v32 PIC.  */
1155
        md_number_to_chars (storep + 6, MOVE_PC_INCR_OPCODE_SUFFIX, 2);
1156
    }
1157
}
1158
 
1159
/* Allocate space for the first piece of an insn, and mark it as the
1160
   start of the insn for debug-format use.  */
1161
 
1162
static char *
1163
cris_insn_first_word_frag (void)
1164
{
1165
  char *insnp = frag_more (2);
1166
 
1167
  /* We need to mark the start of the insn by passing dwarf2_emit_insn
1168
     the offset from the current fragment position.  This must be done
1169
     after the first fragment is created but before any other fragments
1170
     (fixed or varying) are created.  Note that the offset only
1171
     corresponds to the "size" of the insn for a fixed-size,
1172
     non-expanded insn.  */
1173
  if (OUTPUT_FLAVOR == bfd_target_elf_flavour)
1174
    dwarf2_emit_insn (2);
1175
 
1176
  return insnp;
1177
}
1178
 
1179
/* Port-specific assembler initialization.  */
1180
 
1181
void
1182
md_begin (void)
1183
{
1184
  const char *hashret = NULL;
1185
  int i = 0;
1186
 
1187
  /* Set up a hash table for the instructions.  */
1188
  op_hash = hash_new ();
1189
  if (op_hash == NULL)
1190
    as_fatal (_("Virtual memory exhausted"));
1191
 
1192
  /* Enable use of ".if ..asm.arch.cris.v32"
1193
     and ".if ..asm.arch.cris.common_v10_v32" and a few others.  */
1194
  symbol_table_insert (symbol_new ("..asm.arch.cris.v32", absolute_section,
1195
                                   (cris_arch == arch_crisv32),
1196
                                   &zero_address_frag));
1197
  symbol_table_insert (symbol_new ("..asm.arch.cris.v10", absolute_section,
1198
                                   (cris_arch == arch_crisv10),
1199
                                   &zero_address_frag));
1200
  symbol_table_insert (symbol_new ("..asm.arch.cris.common_v10_v32",
1201
                                   absolute_section,
1202
                                   (cris_arch == arch_cris_common_v10_v32),
1203
                                   &zero_address_frag));
1204
  symbol_table_insert (symbol_new ("..asm.arch.cris.any_v0_v10",
1205
                                   absolute_section,
1206
                                   (cris_arch == arch_cris_any_v0_v10),
1207
                                   &zero_address_frag));
1208
 
1209
  while (cris_opcodes[i].name != NULL)
1210
    {
1211
      const char *name = cris_opcodes[i].name;
1212
 
1213
      if (! cris_insn_ver_valid_for_arch (cris_opcodes[i].applicable_version,
1214
                                          cris_arch))
1215
        {
1216
          i++;
1217
          continue;
1218
        }
1219
 
1220
      /* Need to cast to get rid of "const".  FIXME: Fix hash_insert instead.  */
1221
      hashret = hash_insert (op_hash, name, (void *) &cris_opcodes[i]);
1222
 
1223
      if (hashret != NULL && *hashret != '\0')
1224
        as_fatal (_("Can't hash `%s': %s\n"), cris_opcodes[i].name,
1225
                  *hashret == 0 ? _("(unknown reason)") : hashret);
1226
      do
1227
        {
1228
          if (cris_opcodes[i].match & cris_opcodes[i].lose)
1229
            as_fatal (_("Buggy opcode: `%s' \"%s\"\n"), cris_opcodes[i].name,
1230
                      cris_opcodes[i].args);
1231
 
1232
          ++i;
1233
        }
1234
      while (cris_opcodes[i].name != NULL
1235
             && strcmp (cris_opcodes[i].name, name) == 0);
1236
    }
1237
}
1238
 
1239
/* Assemble a source line.  */
1240
 
1241
void
1242
md_assemble (char *str)
1243
{
1244
  struct cris_instruction output_instruction;
1245
  struct cris_prefix prefix;
1246
  char *opcodep;
1247
  char *p;
1248
 
1249
  know (str);
1250
 
1251
  /* Do the low-level grunt - assemble to bits and split up into a prefix
1252
     and ordinary insn.  */
1253
  cris_process_instruction (str, &output_instruction, &prefix);
1254
 
1255
  /* Handle any prefixes to the instruction.  */
1256
  switch (prefix.kind)
1257
    {
1258
    case PREFIX_NONE:
1259
      break;
1260
 
1261
      /* When the expression is unknown for a BDAP, it can need 0, 2 or 4
1262
         extra bytes, so we handle it separately.  */
1263
    case PREFIX_BDAP_IMM:
1264
      /* We only do it if the relocation is unspecified, i.e. not a PIC or TLS
1265
         relocation.  */
1266
      if (prefix.reloc == BFD_RELOC_NONE)
1267
        {
1268
          gen_bdap (prefix.base_reg_number, &prefix.expr);
1269
          break;
1270
        }
1271
      /* Fall through.  */
1272
    case PREFIX_BDAP:
1273
    case PREFIX_BIAP:
1274
    case PREFIX_DIP:
1275
      opcodep = cris_insn_first_word_frag ();
1276
 
1277
      /* Output the prefix opcode.  */
1278
      md_number_to_chars (opcodep, (long) prefix.opcode, 2);
1279
 
1280
      /* Having a specified reloc only happens for DIP and for BDAP with
1281
         PIC or TLS operands, but it is ok to drop through here for the other
1282
         prefixes as they can have no relocs specified.  */
1283
      if (prefix.reloc != BFD_RELOC_NONE)
1284
        {
1285
          unsigned int relocsize
1286
            = (prefix.kind == PREFIX_DIP
1287
               ? 4 : cris_get_specified_reloc_size (prefix.reloc));
1288
 
1289
          p = frag_more (relocsize);
1290
          fix_new_exp (frag_now, (p - frag_now->fr_literal), relocsize,
1291
                       &prefix.expr, 0, prefix.reloc);
1292
        }
1293
      break;
1294
 
1295
    case PREFIX_PUSH:
1296
      opcodep = cris_insn_first_word_frag ();
1297
 
1298
      /* Output the prefix opcode.  Being a "push", we add the negative
1299
         size of the register to "sp".  */
1300
      if (output_instruction.spec_reg != NULL)
1301
        {
1302
          /* Special register.  */
1303
          opcodep[0] = -output_instruction.spec_reg->reg_size;
1304
        }
1305
      else
1306
        {
1307
          /* General register.  */
1308
          opcodep[0] = -4;
1309
        }
1310
      opcodep[1] = (REG_SP << 4) + (BDAP_QUICK_OPCODE >> 8);
1311
      break;
1312
 
1313
    default:
1314
      BAD_CASE (prefix.kind);
1315
    }
1316
 
1317
  /* If we only had a prefix insn, we're done.  */
1318
  if (output_instruction.insn_type == CRIS_INSN_NONE)
1319
    return;
1320
 
1321
  /* Done with the prefix.  Continue with the main instruction.  */
1322
  if (prefix.kind == PREFIX_NONE)
1323
    opcodep = cris_insn_first_word_frag ();
1324
  else
1325
    opcodep = frag_more (2);
1326
 
1327
  /* Output the instruction opcode.  */
1328
  md_number_to_chars (opcodep, (long) (output_instruction.opcode), 2);
1329
 
1330
  /* Output the symbol-dependent instruction stuff.  */
1331
  if (output_instruction.insn_type == CRIS_INSN_BRANCH)
1332
    {
1333
      segT to_seg = absolute_section;
1334
      int is_undefined = 0;
1335
      int length_code;
1336
 
1337
      if (output_instruction.expr.X_op != O_constant)
1338
        {
1339
          to_seg = S_GET_SEGMENT (output_instruction.expr.X_add_symbol);
1340
 
1341
          if (to_seg == undefined_section)
1342
            is_undefined = 1;
1343
        }
1344
 
1345
      if (to_seg == now_seg || is_undefined
1346
          /* In CRISv32, there *is* a 32-bit absolute branch, so don't
1347
             emit the 12-byte sequence for known symbols in other
1348
             segments.  */
1349
          || (cris_arch == arch_crisv32
1350
              && output_instruction.opcode == BA_QUICK_OPCODE))
1351
        {
1352
          /* Handle complex expressions.  */
1353
          valueT addvalue
1354
            = (SIMPLE_EXPR (&output_instruction.expr)
1355
               ? output_instruction.expr.X_add_number
1356
               : 0);
1357
          symbolS *sym
1358
            = (SIMPLE_EXPR (&output_instruction.expr)
1359
               ? output_instruction.expr.X_add_symbol
1360
               : make_expr_symbol (&output_instruction.expr));
1361
 
1362
          /* If is_undefined, the expression may still become now_seg.
1363
             That case is handled by md_estimate_size_before_relax.  */
1364
          length_code = to_seg == now_seg ? STATE_BYTE : STATE_UNDF;
1365
 
1366
          /* Make room for max twelve bytes of variable length for v32 mode
1367
             or PIC, ten for v10 and older.  */
1368
          frag_var (rs_machine_dependent,
1369
                    (cris_arch == arch_crisv32
1370
                     || cris_arch == arch_cris_common_v10_v32
1371
                     || pic) ? 12 : 10, 0,
1372
                    ENCODE_RELAX (cris_arch == arch_crisv32
1373
                                  ? (output_instruction.opcode
1374
                                     == BA_QUICK_OPCODE
1375
                                     ? STATE_ABS_BRANCH_V32
1376
                                     : STATE_COND_BRANCH_V32)
1377
                                  : (cris_arch == arch_cris_common_v10_v32
1378
                                     ? STATE_COND_BRANCH_COMMON
1379
                                     : (pic ? STATE_COND_BRANCH_PIC
1380
                                        : STATE_COND_BRANCH)),
1381
                                  length_code),
1382
                    sym, addvalue, opcodep);
1383
        }
1384
      else
1385
        {
1386
          /* We have: to_seg != now_seg && to_seg != undefined_section.
1387
             This means it is a branch to a known symbol in another
1388
             section, perhaps an absolute address.  Emit a 32-bit branch.  */
1389
          char *cond_jump
1390
            = frag_more ((cris_arch == arch_crisv32
1391
                          || cris_arch == arch_cris_common_v10_v32
1392
                          || pic)
1393
                         ? 12 : 10);
1394
 
1395
          gen_cond_branch_32 (opcodep, cond_jump, frag_now,
1396
                              output_instruction.expr.X_add_symbol,
1397
                              (symbolS *) NULL,
1398
                              output_instruction.expr.X_add_number);
1399
        }
1400
    }
1401
  else if (output_instruction.insn_type == CRIS_INSN_MUL
1402
           && err_for_dangerous_mul_placement)
1403
    /* Create a frag which which we track the location of the mul insn
1404
       (in the last two bytes before the mul-frag).  */
1405
    frag_variant (rs_machine_dependent, 0, 0,
1406
                  ENCODE_RELAX (STATE_MUL, STATE_BYTE),
1407
                  NULL, 0, opcodep);
1408
  else
1409
    {
1410
      if (output_instruction.imm_oprnd_size > 0)
1411
        {
1412
          /* The instruction has an immediate operand.  */
1413
          enum bfd_reloc_code_real reloc = BFD_RELOC_NONE;
1414
 
1415
          switch (output_instruction.imm_oprnd_size)
1416
            {
1417
              /* Any byte-size immediate constants are treated as
1418
                 word-size.  FIXME: Thus overflow check does not work
1419
                 correctly.  */
1420
 
1421
            case 2:
1422
              /* Note that size-check for the explicit reloc has already
1423
                 been done when we get here.  */
1424
              if (output_instruction.reloc != BFD_RELOC_NONE)
1425
                reloc = output_instruction.reloc;
1426
              else
1427
                reloc = BFD_RELOC_16;
1428
              break;
1429
 
1430
            case 4:
1431
              /* Allow a relocation specified in the operand.  */
1432
              if (output_instruction.reloc != BFD_RELOC_NONE)
1433
                reloc = output_instruction.reloc;
1434
              else
1435
                reloc = BFD_RELOC_32;
1436
              break;
1437
 
1438
            default:
1439
              BAD_CASE (output_instruction.imm_oprnd_size);
1440
            }
1441
 
1442
          p = frag_more (output_instruction.imm_oprnd_size);
1443
          fix_new_exp (frag_now, (p - frag_now->fr_literal),
1444
                       output_instruction.imm_oprnd_size,
1445
                       &output_instruction.expr,
1446
                       reloc == BFD_RELOC_32_PCREL
1447
                       || reloc == BFD_RELOC_16_PCREL
1448
                       || reloc == BFD_RELOC_8_PCREL, reloc);
1449
        }
1450
      else if (output_instruction.reloc == BFD_RELOC_CRIS_LAPCQ_OFFSET
1451
               && output_instruction.expr.X_md != 0)
1452
        {
1453
          /* Handle complex expressions.  */
1454
          valueT addvalue
1455
            = (output_instruction.expr.X_op_symbol != NULL
1456
               ? 0 : output_instruction.expr.X_add_number);
1457
          symbolS *sym
1458
            = (output_instruction.expr.X_op_symbol != NULL
1459
               ? make_expr_symbol (&output_instruction.expr)
1460
               : output_instruction.expr.X_add_symbol);
1461
 
1462
          /* This is a relaxing construct, so we need a frag_var rather
1463
             than the fix_new_exp call below.  */
1464
          frag_var (rs_machine_dependent,
1465
                    4, 0,
1466
                    ENCODE_RELAX (STATE_LAPC, STATE_UNDF),
1467
                    sym, addvalue, opcodep);
1468
        }
1469
      else if (output_instruction.reloc != BFD_RELOC_NONE)
1470
        {
1471
          /* An immediate operand that has a relocation and needs to be
1472
             processed further.  */
1473
 
1474
          /* It is important to use fix_new_exp here and everywhere else
1475
             (and not fix_new), as fix_new_exp can handle "difference
1476
             expressions" - where the expression contains a difference of
1477
             two symbols in the same segment.  */
1478
          fix_new_exp (frag_now, (opcodep - frag_now->fr_literal), 2,
1479
                       &output_instruction.expr,
1480
                       output_instruction.reloc == BFD_RELOC_32_PCREL
1481
                       || output_instruction.reloc == BFD_RELOC_16_PCREL
1482
                       || output_instruction.reloc == BFD_RELOC_8_PCREL
1483
                       || (output_instruction.reloc
1484
                           == BFD_RELOC_CRIS_LAPCQ_OFFSET),
1485
                       output_instruction.reloc);
1486
        }
1487
    }
1488
}
1489
 
1490
/* Low level text-to-bits assembly.  */
1491
 
1492
static void
1493
cris_process_instruction (char *insn_text, struct cris_instruction *out_insnp,
1494
                          struct cris_prefix *prefixp)
1495
{
1496
  char *s;
1497
  char modified_char = 0;
1498
  const char *args;
1499
  struct cris_opcode *instruction;
1500
  char *operands;
1501
  int match = 0;
1502
  int mode;
1503
  int regno;
1504
  int size_bits;
1505
 
1506
  /* Reset these fields to a harmless state in case we need to return in
1507
     error.  */
1508
  prefixp->kind = PREFIX_NONE;
1509
  prefixp->reloc = BFD_RELOC_NONE;
1510
  out_insnp->insn_type = CRIS_INSN_NONE;
1511
  out_insnp->imm_oprnd_size = 0;
1512
 
1513
  /* Find the end of the opcode mnemonic.  We assume (true in 2.9.1)
1514
     that the caller has translated the opcode to lower-case, up to the
1515
     first non-letter.  */
1516
  for (operands = insn_text; ISLOWER (*operands); ++operands)
1517
    ;
1518
 
1519
  /* Terminate the opcode after letters, but save the character there if
1520
     it was of significance.  */
1521
  switch (*operands)
1522
    {
1523
    case '\0':
1524
      break;
1525
 
1526
    case '.':
1527
      /* Put back the modified character later.  */
1528
      modified_char = *operands;
1529
      /* Fall through.  */
1530
 
1531
    case ' ':
1532
      /* Consume the character after the mnemonic
1533
         and replace it with '\0'.  */
1534
      *operands++ = '\0';
1535
      break;
1536
 
1537
    default:
1538
      as_bad (_("Unknown opcode: `%s'"), insn_text);
1539
      return;
1540
    }
1541
 
1542
  /* Find the instruction.  */
1543
  instruction = (struct cris_opcode *) hash_find (op_hash, insn_text);
1544
  if (instruction == NULL)
1545
    {
1546
      as_bad (_("Unknown opcode: `%s'"), insn_text);
1547
      return;
1548
    }
1549
 
1550
  /* Put back the modified character.  */
1551
  switch (modified_char)
1552
    {
1553
    case 0:
1554
      break;
1555
 
1556
    default:
1557
      *--operands = modified_char;
1558
    }
1559
 
1560
  /* Try to match an opcode table slot.  */
1561
  for (s = operands;;)
1562
    {
1563
      int imm_expr_found;
1564
 
1565
      /* Initialize *prefixp, perhaps after being modified for a
1566
         "near match".  */
1567
      prefixp->kind = PREFIX_NONE;
1568
      prefixp->reloc = BFD_RELOC_NONE;
1569
 
1570
      /* Initialize *out_insnp.  */
1571
      memset (out_insnp, 0, sizeof (*out_insnp));
1572
      out_insnp->opcode = instruction->match;
1573
      out_insnp->reloc = BFD_RELOC_NONE;
1574
      out_insnp->insn_type = CRIS_INSN_NORMAL;
1575
      out_insnp->imm_oprnd_size = 0;
1576
 
1577
      imm_expr_found = 0;
1578
 
1579
      /* Build the opcode, checking as we go to make sure that the
1580
         operands match.  */
1581
      for (args = instruction->args;; ++args)
1582
        {
1583
          switch (*args)
1584
            {
1585
            case '\0':
1586
              /* If we've come to the end of arguments, we're done.  */
1587
              if (*s == '\0')
1588
                match = 1;
1589
              break;
1590
 
1591
            case '!':
1592
              /* Non-matcher character for disassembly.
1593
                 Ignore it here.  */
1594
              continue;
1595
 
1596
            case '[':
1597
            case ']':
1598
            case ',':
1599
            case ' ':
1600
              /* These must match exactly.  */
1601
              if (*s++ == *args)
1602
                continue;
1603
              break;
1604
 
1605
            case 'A':
1606
              /* "ACR", case-insensitive.
1607
                 Handle a sometimes-mandatory dollar sign as register
1608
                 prefix.  */
1609
              if (*s == REGISTER_PREFIX_CHAR)
1610
                s++;
1611
              else if (demand_register_prefix)
1612
                break;
1613
 
1614
              if ((*s++ != 'a' && s[-1] != 'A')
1615
                  || (*s++ != 'c' && s[-1] != 'C')
1616
                  || (*s++ != 'r' && s[-1] != 'R'))
1617
                break;
1618
              continue;
1619
 
1620
            case 'B':
1621
              /* This is not really an operand, but causes a "BDAP
1622
                 -size,SP" prefix to be output, for PUSH instructions.  */
1623
              prefixp->kind = PREFIX_PUSH;
1624
              continue;
1625
 
1626
            case 'b':
1627
              /* This letter marks an operand that should not be matched
1628
                 in the assembler. It is a branch with 16-bit
1629
                 displacement.  The assembler will create them from the
1630
                 8-bit flavor when necessary.  The assembler does not
1631
                 support the [rN+] operand, as the [r15+] that is
1632
                 generated for 16-bit displacements.  */
1633
              break;
1634
 
1635
            case 'c':
1636
              /* A 5-bit unsigned immediate in bits <4:0>.  */
1637
              if (! cris_get_expression (&s, &out_insnp->expr))
1638
                break;
1639
              else
1640
                {
1641
                  if (out_insnp->expr.X_op == O_constant
1642
                      && (out_insnp->expr.X_add_number < 0
1643
                          || out_insnp->expr.X_add_number > 31))
1644
                    as_bad (_("Immediate value not in 5 bit unsigned range: %ld"),
1645
                            out_insnp->expr.X_add_number);
1646
 
1647
                  out_insnp->reloc = BFD_RELOC_CRIS_UNSIGNED_5;
1648
                  continue;
1649
                }
1650
 
1651
            case 'C':
1652
              /* A 4-bit unsigned immediate in bits <3:0>.  */
1653
              if (! cris_get_expression (&s, &out_insnp->expr))
1654
                break;
1655
              else
1656
                {
1657
                  if (out_insnp->expr.X_op == O_constant
1658
                      && (out_insnp->expr.X_add_number < 0
1659
                          || out_insnp->expr.X_add_number > 15))
1660
                    as_bad (_("Immediate value not in 4 bit unsigned range: %ld"),
1661
                            out_insnp->expr.X_add_number);
1662
 
1663
                  out_insnp->reloc = BFD_RELOC_CRIS_UNSIGNED_4;
1664
                  continue;
1665
                }
1666
 
1667
              /* For 'd', check for an optional ".d" or ".D" at the
1668
                 start of the operands, followed by a space character.  */
1669
            case 'd':
1670
              if (modified_char == '.' && *s == '.')
1671
                {
1672
                  if ((s[1] != 'd' && s[1] == 'D')
1673
                      || ! ISSPACE (s[2]))
1674
                    break;
1675
                  s += 2;
1676
                  continue;
1677
                }
1678
              continue;
1679
 
1680
            case 'D':
1681
              /* General register in bits <15:12> and <3:0>.  */
1682
              if (! get_gen_reg (&s, &regno))
1683
                break;
1684
              else
1685
                {
1686
                  out_insnp->opcode |= regno /* << 0 */;
1687
                  out_insnp->opcode |= regno << 12;
1688
                  continue;
1689
                }
1690
 
1691
            case 'f':
1692
              /* Flags from the condition code register.  */
1693
              {
1694
                int flags = 0;
1695
 
1696
                if (! get_flags (&s, &flags))
1697
                  break;
1698
 
1699
                out_insnp->opcode |= ((flags & 0xf0) << 8) | (flags & 0xf);
1700
                continue;
1701
              }
1702
 
1703
            case 'i':
1704
              /* A 6-bit signed immediate in bits <5:0>.  */
1705
              if (! cris_get_expression (&s, &out_insnp->expr))
1706
                break;
1707
              else
1708
                {
1709
                  if (out_insnp->expr.X_op == O_constant
1710
                      && (out_insnp->expr.X_add_number < -32
1711
                          || out_insnp->expr.X_add_number > 31))
1712
                    as_bad (_("Immediate value not in 6 bit range: %ld"),
1713
                            out_insnp->expr.X_add_number);
1714
                  out_insnp->reloc = BFD_RELOC_CRIS_SIGNED_6;
1715
                  continue;
1716
                }
1717
 
1718
            case 'I':
1719
              /* A 6-bit unsigned immediate in bits <5:0>.  */
1720
              if (! cris_get_expression (&s, &out_insnp->expr))
1721
                break;
1722
              else
1723
                {
1724
                  if (out_insnp->expr.X_op == O_constant
1725
                      && (out_insnp->expr.X_add_number < 0
1726
                          || out_insnp->expr.X_add_number > 63))
1727
                    as_bad (_("Immediate value not in 6 bit unsigned range: %ld"),
1728
                            out_insnp->expr.X_add_number);
1729
                  out_insnp->reloc = BFD_RELOC_CRIS_UNSIGNED_6;
1730
                  continue;
1731
                }
1732
 
1733
            case 'M':
1734
              /* A size modifier, B, W or D, to be put in a bit position
1735
                 suitable for CLEAR instructions (i.e. reflecting a zero
1736
                 register).  */
1737
              if (! get_bwd_size_modifier (&s, &size_bits))
1738
                break;
1739
              else
1740
                {
1741
                  switch (size_bits)
1742
                    {
1743
                    case 0:
1744
                      out_insnp->opcode |= 0 << 12;
1745
                      break;
1746
 
1747
                    case 1:
1748
                      out_insnp->opcode |= 4 << 12;
1749
                      break;
1750
 
1751
                    case 2:
1752
                      out_insnp->opcode |= 8 << 12;
1753
                      break;
1754
                    }
1755
                  continue;
1756
                }
1757
 
1758
            case 'm':
1759
              /* A size modifier, B, W or D, to be put in bits <5:4>.  */
1760
              if (modified_char != '.'
1761
                  || ! get_bwd_size_modifier (&s, &size_bits))
1762
                break;
1763
              else
1764
                {
1765
                  out_insnp->opcode |= size_bits << 4;
1766
                  continue;
1767
                }
1768
 
1769
            case 'o':
1770
              /* A branch expression.  */
1771
              if (! cris_get_expression (&s, &out_insnp->expr))
1772
                break;
1773
              else
1774
                {
1775
                  out_insnp->insn_type = CRIS_INSN_BRANCH;
1776
                  continue;
1777
                }
1778
 
1779
            case 'Q':
1780
              /* A 8-bit quick BDAP expression, "expr,R".  */
1781
              if (! cris_get_expression (&s, &out_insnp->expr))
1782
                break;
1783
 
1784
              if (*s != ',')
1785
                break;
1786
 
1787
              s++;
1788
 
1789
              if (!get_gen_reg (&s, &regno))
1790
                break;
1791
 
1792
              out_insnp->opcode |= regno << 12;
1793
              out_insnp->reloc = BFD_RELOC_CRIS_SIGNED_8;
1794
              continue;
1795
 
1796
            case 'O':
1797
              /* A BDAP expression for any size, "expr,R".  */
1798
              if (! cris_get_expression (&s, &prefixp->expr))
1799
                break;
1800
              else
1801
                {
1802
                  if (*s != ',')
1803
                    break;
1804
 
1805
                  s++;
1806
 
1807
                  if (!get_gen_reg (&s, &prefixp->base_reg_number))
1808
                    break;
1809
 
1810
                  /* Since 'O' is used with an explicit bdap, we have no
1811
                     "real" instruction.  */
1812
                  prefixp->kind = PREFIX_BDAP_IMM;
1813
                  prefixp->opcode
1814
                    = BDAP_QUICK_OPCODE | (prefixp->base_reg_number << 12);
1815
 
1816
                  out_insnp->insn_type = CRIS_INSN_NONE;
1817
                  continue;
1818
                }
1819
 
1820
            case 'P':
1821
              /* Special register in bits <15:12>.  */
1822
              if (! get_spec_reg (&s, &out_insnp->spec_reg))
1823
                break;
1824
              else
1825
                {
1826
                  /* Use of some special register names come with a
1827
                     specific warning.  Note that we have no ".cpu type"
1828
                     pseudo yet, so some of this is just unused
1829
                     framework.  */
1830
                  if (out_insnp->spec_reg->warning)
1831
                    as_warn ("%s", out_insnp->spec_reg->warning);
1832
                  else if (out_insnp->spec_reg->applicable_version
1833
                           == cris_ver_warning)
1834
                    /* Others have a generic warning.  */
1835
                    as_warn (_("Unimplemented register `%s' specified"),
1836
                             out_insnp->spec_reg->name);
1837
 
1838
                  out_insnp->opcode
1839
                    |= out_insnp->spec_reg->number << 12;
1840
                  continue;
1841
                }
1842
 
1843
            case 'p':
1844
              /* This character is used in the disassembler to
1845
                 recognize a prefix instruction to fold into the
1846
                 addressing mode for the next instruction.  It is
1847
                 ignored here.  */
1848
              continue;
1849
 
1850
            case 'R':
1851
              /* General register in bits <15:12>.  */
1852
              if (! get_gen_reg (&s, &regno))
1853
                break;
1854
              else
1855
                {
1856
                  out_insnp->opcode |= regno << 12;
1857
                  continue;
1858
                }
1859
 
1860
            case 'r':
1861
              /* General register in bits <3:0>.  */
1862
              if (! get_gen_reg (&s, &regno))
1863
                break;
1864
              else
1865
                {
1866
                  out_insnp->opcode |= regno /* << 0 */;
1867
                  continue;
1868
                }
1869
 
1870
            case 'S':
1871
              /* Source operand in bit <10> and a prefix; a 3-operand
1872
                 prefix.  */
1873
              if (! get_3op_or_dip_prefix_op (&s, prefixp))
1874
                break;
1875
              else
1876
                continue;
1877
 
1878
            case 's':
1879
              /* Source operand in bits <10>, <3:0> and optionally a
1880
                 prefix; i.e. an indirect operand or an side-effect
1881
                 prefix (where valid).  */
1882
              if (! get_autoinc_prefix_or_indir_op (&s, prefixp, &mode,
1883
                                                    &regno,
1884
                                                    &imm_expr_found,
1885
                                                    &out_insnp->expr))
1886
                break;
1887
              else
1888
                {
1889
                  if (prefixp->kind != PREFIX_NONE)
1890
                    {
1891
                      /* A prefix, so it has the autoincrement bit
1892
                         set.  */
1893
                      out_insnp->opcode |= (AUTOINCR_BIT << 8);
1894
                    }
1895
                  else
1896
                    {
1897
                      /* No prefix.  The "mode" variable contains bits like
1898
                         whether or not this is autoincrement mode.  */
1899
                      out_insnp->opcode |= (mode << 10);
1900
 
1901
                      /* If there was a reloc specifier, then it was
1902
                         attached to the prefix.  Note that we can't check
1903
                         that the reloc size matches, since we don't have
1904
                         all the operands yet in all cases.  */
1905
                      if (prefixp->reloc != BFD_RELOC_NONE)
1906
                        out_insnp->reloc = prefixp->reloc;
1907
                    }
1908
 
1909
                  out_insnp->opcode |= regno /* << 0 */ ;
1910
                  continue;
1911
                }
1912
 
1913
            case 'N':
1914
            case 'Y':
1915
              /* Like 's', but immediate operand only.  Also do not
1916
                 modify insn.  There are no insns where an explicit reloc
1917
                 specifier makes sense.  */
1918
              if (cris_get_expression (&s, &out_insnp->expr))
1919
                {
1920
                  imm_expr_found = 1;
1921
                  continue;
1922
                }
1923
              break;
1924
 
1925
            case 'n':
1926
              /* Like 'N', but PC-relative to the start of the insn.
1927
                 There might be a :PLT to request a PLT entry.  */
1928
              if (cris_get_expression (&s, &out_insnp->expr))
1929
                {
1930
                  imm_expr_found = 1;
1931
                  out_insnp->reloc = BFD_RELOC_32_PCREL;
1932
 
1933
                  /* We have to adjust the expression, because that
1934
                     relocation is to the location *after* the
1935
                     relocation.  So add 2 for the insn and 4 for the
1936
                     relocation.  */
1937
                  out_insnp->expr.X_add_number += 6;
1938
 
1939
                  /* TLS specifiers do not make sense here.  */
1940
                  if (pic && *s == RELOC_SUFFIX_CHAR)
1941
                    cris_get_reloc_suffix (&s, &out_insnp->reloc,
1942
                                           &out_insnp->expr);
1943
 
1944
                  continue;
1945
                }
1946
              break;
1947
 
1948
            case 'U':
1949
              /* Maybe 'u', maybe 'n'.  Only for LAPC/LAPCQ.  */
1950
              if (cris_get_expression (&s, &out_insnp->expr))
1951
                {
1952
                  out_insnp->reloc = BFD_RELOC_CRIS_LAPCQ_OFFSET;
1953
 
1954
                  /* Define 1 as relaxing.  */
1955
                  out_insnp->expr.X_md = 1;
1956
                  continue;
1957
                }
1958
              break;
1959
 
1960
            case 'u':
1961
              /* Four PC-relative bits in <3:0> representing <4:1>:0 of
1962
                 an offset relative to the beginning of the current
1963
                 insn.  */
1964
              if (cris_get_expression (&s, &out_insnp->expr))
1965
                {
1966
                  out_insnp->reloc = BFD_RELOC_CRIS_LAPCQ_OFFSET;
1967
 
1968
                  /* Define 0 as non-relaxing.  */
1969
                  out_insnp->expr.X_md = 0;
1970
 
1971
                  /* We have to adjust the expression, because that
1972
                     relocation is to the location *after* the
1973
                     insn.  So add 2 for the insn.  */
1974
                  out_insnp->expr.X_add_number += 2;
1975
                  continue;
1976
                }
1977
              break;
1978
 
1979
            case 'x':
1980
              /* Rs.m in bits <15:12> and <5:4>.  */
1981
              if (! get_gen_reg (&s, &regno)
1982
                  || ! get_bwd_size_modifier (&s, &size_bits))
1983
                break;
1984
              else
1985
                {
1986
                  out_insnp->opcode |= (regno << 12) | (size_bits << 4);
1987
                  continue;
1988
                }
1989
 
1990
            case 'y':
1991
              /* Source operand in bits <10>, <3:0> and optionally a
1992
                 prefix; i.e. an indirect operand or an side-effect
1993
                 prefix.
1994
 
1995
                 The difference to 's' is that this does not allow an
1996
                 "immediate" expression.  */
1997
              if (! get_autoinc_prefix_or_indir_op (&s, prefixp,
1998
                                                    &mode, &regno,
1999
                                                    &imm_expr_found,
2000
                                                    &out_insnp->expr)
2001
                  || imm_expr_found)
2002
                break;
2003
              else
2004
                {
2005
                  if (prefixp->kind != PREFIX_NONE)
2006
                    {
2007
                      /* A prefix, and those matched here always have
2008
                         side-effects (see 's' case).  */
2009
                      out_insnp->opcode |= (AUTOINCR_BIT << 8);
2010
                    }
2011
                  else
2012
                    {
2013
                      /* No prefix.  The "mode" variable contains bits
2014
                         like whether or not this is autoincrement
2015
                         mode.  */
2016
                      out_insnp->opcode |= (mode << 10);
2017
                    }
2018
 
2019
                  out_insnp->opcode |= regno /* << 0 */;
2020
                  continue;
2021
                }
2022
 
2023
            case 'z':
2024
              /* Size modifier (B or W) in bit <4>.  */
2025
              if (! get_bw_size_modifier (&s, &size_bits))
2026
                break;
2027
              else
2028
                {
2029
                  out_insnp->opcode |= size_bits << 4;
2030
                  continue;
2031
                }
2032
 
2033
            case 'T':
2034
              if (cris_arch == arch_crisv32
2035
                  && get_sup_reg (&s, &regno))
2036
                {
2037
                  out_insnp->opcode |= regno << 12;
2038
                  continue;
2039
                }
2040
              break;
2041
 
2042
            default:
2043
              BAD_CASE (*args);
2044
            }
2045
 
2046
          /* We get here when we fail a match above or we found a
2047
             complete match.  Break out of this loop.  */
2048
          break;
2049
        }
2050
 
2051
      /* Was it a match or a miss?  */
2052
      if (match == 0)
2053
        {
2054
          /* If it's just that the args don't match, maybe the next
2055
             item in the table is the same opcode but with
2056
             matching operands.  First skip any invalid ones.  */
2057
          while (instruction[1].name != NULL
2058
                 && strcmp (instruction->name, instruction[1].name) == 0
2059
                 && ! cris_insn_ver_valid_for_arch (instruction[1]
2060
                                                    .applicable_version,
2061
                                                    cris_arch))
2062
            ++instruction;
2063
 
2064
          if (instruction[1].name != NULL
2065
              && strcmp (instruction->name, instruction[1].name) == 0
2066
              && cris_insn_ver_valid_for_arch (instruction[1]
2067
                                               .applicable_version,
2068
                                               cris_arch))
2069
            {
2070
              /* Yep.  Restart and try that one instead.  */
2071
              ++instruction;
2072
              s = operands;
2073
              continue;
2074
            }
2075
          else
2076
            {
2077
              /* We've come to the end of instructions with this
2078
                 opcode, so it must be an error.  */
2079
              as_bad (_("Illegal operands"));
2080
 
2081
              /* As discard_rest_of_line, but without continuing to the
2082
                 next line.  */
2083
              while (!is_end_of_line[(unsigned char) *input_line_pointer])
2084
                input_line_pointer++;
2085
              return;
2086
            }
2087
        }
2088
      else
2089
        {
2090
          /* We have a match.  Check if there's anything more to do.  */
2091
          if (imm_expr_found)
2092
            {
2093
              /* There was an immediate mode operand, so we must check
2094
                 that it has an appropriate size.  */
2095
              switch (instruction->imm_oprnd_size)
2096
                {
2097
                default:
2098
                case SIZE_NONE:
2099
                  /* Shouldn't happen; this one does not have immediate
2100
                     operands with different sizes.  */
2101
                  BAD_CASE (instruction->imm_oprnd_size);
2102
                  break;
2103
 
2104
                case SIZE_FIX_32:
2105
                  out_insnp->imm_oprnd_size = 4;
2106
                  break;
2107
 
2108
                case SIZE_SPEC_REG:
2109
                  if (cris_arch == arch_crisv32)
2110
                    /* All immediate loads of special registers are
2111
                       32-bit on CRISv32.  */
2112
                    out_insnp->imm_oprnd_size = 4;
2113
                  else
2114
                    switch (out_insnp->spec_reg->reg_size)
2115
                      {
2116
                      case 1:
2117
                        if (out_insnp->expr.X_op == O_constant
2118
                            && (out_insnp->expr.X_add_number < -128
2119
                                || out_insnp->expr.X_add_number > 255))
2120
                          as_bad (_("Immediate value not in 8 bit range: %ld"),
2121
                                  out_insnp->expr.X_add_number);
2122
                        /* Fall through.  */
2123
                      case 2:
2124
                        /* FIXME:  We need an indicator in the instruction
2125
                           table to pass on, to indicate if we need to check
2126
                           overflow for a signed or unsigned number.  */
2127
                        if (out_insnp->expr.X_op == O_constant
2128
                            && (out_insnp->expr.X_add_number < -32768
2129
                                || out_insnp->expr.X_add_number > 65535))
2130
                          as_bad (_("Immediate value not in 16 bit range: %ld"),
2131
                                  out_insnp->expr.X_add_number);
2132
                        out_insnp->imm_oprnd_size = 2;
2133
                        break;
2134
 
2135
                      case 4:
2136
                        out_insnp->imm_oprnd_size = 4;
2137
                        break;
2138
 
2139
                      default:
2140
                        BAD_CASE (out_insnp->spec_reg->reg_size);
2141
                      }
2142
                  break;
2143
 
2144
                case SIZE_FIELD:
2145
                case SIZE_FIELD_SIGNED:
2146
                case SIZE_FIELD_UNSIGNED:
2147
                  switch (size_bits)
2148
                    {
2149
                      /* FIXME: Find way to pass un/signedness to
2150
                         caller, and set reloc type instead, postponing
2151
                         this check until cris_number_to_imm.  That
2152
                         necessarily corrects the reloc type for the
2153
                         byte case, maybe requiring further changes.  */
2154
                    case 0:
2155
                      if (out_insnp->expr.X_op == O_constant)
2156
                        {
2157
                          if (instruction->imm_oprnd_size == SIZE_FIELD
2158
                              && (out_insnp->expr.X_add_number < -128
2159
                                  || out_insnp->expr.X_add_number > 255))
2160
                            as_bad (_("Immediate value not in 8 bit range: %ld"),
2161
                                    out_insnp->expr.X_add_number);
2162
                          else if (instruction->imm_oprnd_size == SIZE_FIELD_SIGNED
2163
                              && (out_insnp->expr.X_add_number < -128
2164
                                  || out_insnp->expr.X_add_number > 127))
2165
                            as_bad (_("Immediate value not in 8 bit signed range: %ld"),
2166
                                    out_insnp->expr.X_add_number);
2167
                          else if (instruction->imm_oprnd_size == SIZE_FIELD_UNSIGNED
2168
                                   && (out_insnp->expr.X_add_number < 0
2169
                                       || out_insnp->expr.X_add_number > 255))
2170
                            as_bad (_("Immediate value not in 8 bit unsigned range: %ld"),
2171
                                    out_insnp->expr.X_add_number);
2172
                        }
2173
 
2174
                      /* Fall through.  */
2175
                    case 1:
2176
                      if (out_insnp->expr.X_op == O_constant)
2177
                        {
2178
                          if (instruction->imm_oprnd_size == SIZE_FIELD
2179
                              && (out_insnp->expr.X_add_number < -32768
2180
                                  || out_insnp->expr.X_add_number > 65535))
2181
                            as_bad (_("Immediate value not in 16 bit range: %ld"),
2182
                                    out_insnp->expr.X_add_number);
2183
                          else if (instruction->imm_oprnd_size == SIZE_FIELD_SIGNED
2184
                              && (out_insnp->expr.X_add_number < -32768
2185
                                  || out_insnp->expr.X_add_number > 32767))
2186
                            as_bad (_("Immediate value not in 16 bit signed range: %ld"),
2187
                                    out_insnp->expr.X_add_number);
2188
                          else if (instruction->imm_oprnd_size == SIZE_FIELD_UNSIGNED
2189
                              && (out_insnp->expr.X_add_number < 0
2190
                                  || out_insnp->expr.X_add_number > 65535))
2191
                            as_bad (_("Immediate value not in 16 bit unsigned range: %ld"),
2192
                                    out_insnp->expr.X_add_number);
2193
                        }
2194
                      out_insnp->imm_oprnd_size = 2;
2195
                      break;
2196
 
2197
                    case 2:
2198
                      out_insnp->imm_oprnd_size = 4;
2199
                      break;
2200
 
2201
                    default:
2202
                      BAD_CASE (out_insnp->spec_reg->reg_size);
2203
                    }
2204
                }
2205
 
2206
              /* If there was a relocation specified for the immediate
2207
                 expression (i.e. it had a PIC or TLS modifier) check that the
2208
                 size of the relocation matches the size specified by
2209
                 the opcode.  */
2210
              if (out_insnp->reloc != BFD_RELOC_NONE
2211
                  && (cris_get_specified_reloc_size (out_insnp->reloc)
2212
                      != (unsigned int) out_insnp->imm_oprnd_size))
2213
                as_bad (out_insnp->reloc == BFD_RELOC_CRIS_32_GD
2214
                        || out_insnp->reloc == BFD_RELOC_CRIS_32_TPREL
2215
                        || out_insnp->reloc == BFD_RELOC_CRIS_16_TPREL
2216
                        || out_insnp->reloc == BFD_RELOC_CRIS_32_IE
2217
                        ? _("TLS relocation size does not match operand size")
2218
                        : _("PIC relocation size does not match operand size"));
2219
            }
2220
          else if (instruction->op == cris_muls_op
2221
                   || instruction->op == cris_mulu_op)
2222
            out_insnp->insn_type = CRIS_INSN_MUL;
2223
        }
2224
      break;
2225
    }
2226
}
2227
 
2228
/* Get a B, W, or D size modifier from the string pointed out by *cPP,
2229
   which must point to a '.' in front of the modifier.  On successful
2230
   return, *cPP is advanced to the character following the size
2231
   modifier, and is undefined otherwise.
2232
 
2233
   cPP          Pointer to pointer to string starting
2234
                with the size modifier.
2235
 
2236
   size_bitsp   Pointer to variable to contain the size bits on
2237
                successful return.
2238
 
2239
   Return 1 iff a correct size modifier is found, else 0.  */
2240
 
2241
static int
2242
get_bwd_size_modifier (char **cPP, int *size_bitsp)
2243
{
2244
  if (**cPP != '.')
2245
    return 0;
2246
  else
2247
    {
2248
      /* Consume the '.'.  */
2249
      (*cPP)++;
2250
 
2251
      switch (**cPP)
2252
        {
2253
        case 'B':
2254
        case 'b':
2255
          *size_bitsp = 0;
2256
          break;
2257
 
2258
        case 'W':
2259
        case 'w':
2260
          *size_bitsp = 1;
2261
          break;
2262
 
2263
        case 'D':
2264
        case 'd':
2265
          *size_bitsp = 2;
2266
          break;
2267
 
2268
        default:
2269
          return 0;
2270
        }
2271
 
2272
      /* Consume the size letter.  */
2273
      (*cPP)++;
2274
      return 1;
2275
    }
2276
}
2277
 
2278
/* Get a B or W size modifier from the string pointed out by *cPP,
2279
   which must point to a '.' in front of the modifier.  On successful
2280
   return, *cPP is advanced to the character following the size
2281
   modifier, and is undefined otherwise.
2282
 
2283
   cPP          Pointer to pointer to string starting
2284
                with the size modifier.
2285
 
2286
   size_bitsp   Pointer to variable to contain the size bits on
2287
                successful return.
2288
 
2289
   Return 1 iff a correct size modifier is found, else 0.  */
2290
 
2291
static int
2292
get_bw_size_modifier (char **cPP, int *size_bitsp)
2293
{
2294
  if (**cPP != '.')
2295
    return 0;
2296
  else
2297
    {
2298
      /* Consume the '.'.  */
2299
      (*cPP)++;
2300
 
2301
      switch (**cPP)
2302
        {
2303
        case 'B':
2304
        case 'b':
2305
          *size_bitsp = 0;
2306
          break;
2307
 
2308
        case 'W':
2309
        case 'w':
2310
          *size_bitsp = 1;
2311
          break;
2312
 
2313
        default:
2314
          return 0;
2315
        }
2316
 
2317
      /* Consume the size letter.  */
2318
      (*cPP)++;
2319
      return 1;
2320
    }
2321
}
2322
 
2323
/* Get a general register from the string pointed out by *cPP.  The
2324
   variable *cPP is advanced to the character following the general
2325
   register name on a successful return, and has its initial position
2326
   otherwise.
2327
 
2328
   cPP      Pointer to pointer to string, beginning with a general
2329
            register name.
2330
 
2331
   regnop   Pointer to int containing the register number.
2332
 
2333
   Return 1 iff a correct general register designator is found,
2334
            else 0.  */
2335
 
2336
static int
2337
get_gen_reg (char **cPP, int *regnop)
2338
{
2339
  char *oldp;
2340
  oldp = *cPP;
2341
 
2342
  /* Handle a sometimes-mandatory dollar sign as register prefix.  */
2343
  if (**cPP == REGISTER_PREFIX_CHAR)
2344
    (*cPP)++;
2345
  else if (demand_register_prefix)
2346
    return 0;
2347
 
2348
  switch (**cPP)
2349
    {
2350
    case 'P':
2351
    case 'p':
2352
      /* "P" as in "PC"?  Consume the "P".  */
2353
      (*cPP)++;
2354
 
2355
      if ((**cPP == 'C' || **cPP == 'c')
2356
          && ! ISALNUM ((*cPP)[1])
2357
          /* Here's a little twist: For v32 and the compatibility mode,
2358
             we only recognize PC as a register number if there's '+]'
2359
             after.  We don't consume that, but the presence can only be
2360
             valid after a register in a post-increment context, which
2361
             is also the only valid context for PC as a register for
2362
             v32.  Not that it's used very often, but saying "MOVE.D
2363
             [PC+],R5" should remain valid.  It's not supported for
2364
             jump-type insns or other insns with no [Rn+] mode, though.  */
2365
          && ((cris_arch != arch_crisv32
2366
               && cris_arch != arch_cris_common_v10_v32)
2367
              || ((*cPP)[1] == '+' && (*cPP)[2] == ']')))
2368
        {
2369
          /* It's "PC": consume the "c" and we're done.  */
2370
          (*cPP)++;
2371
          *regnop = REG_PC;
2372
          return 1;
2373
        }
2374
      break;
2375
 
2376
      /* Like with PC, we recognize ACR, but only if it's *not* followed
2377
         by '+', and only for v32.  */
2378
    case 'A':
2379
    case 'a':
2380
      if (cris_arch != arch_crisv32
2381
          || ((*cPP)[1] != 'c' && (*cPP)[1] != 'C')
2382
          || ((*cPP)[2] != 'r' && (*cPP)[2] != 'R')
2383
          || ISALNUM ((*cPP)[3])
2384
          || (*cPP)[3] == '+')
2385
        break;
2386
      (*cPP) += 3;
2387
      *regnop = 15;
2388
      return 1;
2389
 
2390
    case 'R':
2391
    case 'r':
2392
      /* Hopefully r[0-9] or r1[0-5].  Consume 'R' or 'r'.  */
2393
      (*cPP)++;
2394
 
2395
      if (ISDIGIT (**cPP))
2396
        {
2397
          /* It's r[0-9].  Consume and check the next digit.  */
2398
          *regnop = **cPP - '0';
2399
          (*cPP)++;
2400
 
2401
          if (! ISALNUM (**cPP))
2402
            {
2403
              /* No more digits, we're done.  */
2404
              return 1;
2405
            }
2406
          else
2407
            {
2408
              /* One more digit.  Consume and add.  */
2409
              *regnop = *regnop * 10 + (**cPP - '0');
2410
 
2411
              /* We need to check for a valid register number; Rn,
2412
 
2413
              if (*regnop <= MAX_REG)
2414
                {
2415
                  /* Consume second digit.  */
2416
                  (*cPP)++;
2417
                  return 1;
2418
                }
2419
            }
2420
        }
2421
      break;
2422
 
2423
    case 'S':
2424
    case 's':
2425
      /* "S" as in "SP"?  Consume the "S".  */
2426
      (*cPP)++;
2427
      if (**cPP == 'P' || **cPP == 'p')
2428
        {
2429
          /* It's "SP": consume the "p" and we're done.  */
2430
          (*cPP)++;
2431
          *regnop = REG_SP;
2432
          return 1;
2433
        }
2434
      break;
2435
 
2436
    default:
2437
      /* Just here to silence compilation warnings.  */
2438
      ;
2439
    }
2440
 
2441
  /* We get here if we fail.  Restore the pointer.  */
2442
  *cPP = oldp;
2443
  return 0;
2444
}
2445
 
2446
/* Get a special register from the string pointed out by *cPP. The
2447
   variable *cPP is advanced to the character following the special
2448
   register name if one is found, and retains its original position
2449
   otherwise.
2450
 
2451
   cPP      Pointer to pointer to string starting with a special register
2452
            name.
2453
 
2454
   sregpp   Pointer to Pointer to struct spec_reg, where a pointer to the
2455
            register description will be stored.
2456
 
2457
   Return 1 iff a correct special register name is found.  */
2458
 
2459
static int
2460
get_spec_reg (char **cPP, const struct cris_spec_reg **sregpp)
2461
{
2462
  char *s1;
2463
  const char *s2;
2464
  char *name_begin = *cPP;
2465
 
2466
  const struct cris_spec_reg *sregp;
2467
 
2468
  /* Handle a sometimes-mandatory dollar sign as register prefix.  */
2469
  if (*name_begin == REGISTER_PREFIX_CHAR)
2470
    name_begin++;
2471
  else if (demand_register_prefix)
2472
    return 0;
2473
 
2474
  /* Loop over all special registers.  */
2475
  for (sregp = cris_spec_regs; sregp->name != NULL; sregp++)
2476
    {
2477
      /* Start over from beginning of the supposed name.  */
2478
      s1 = name_begin;
2479
      s2 = sregp->name;
2480
 
2481
      while (*s2 != '\0' && TOLOWER (*s1) == *s2)
2482
        {
2483
          s1++;
2484
          s2++;
2485
        }
2486
 
2487
      /* For a match, we must have consumed the name in the table, and we
2488
         must be outside what could be part of a name.  Assume here that a
2489
         test for alphanumerics is sufficient for a name test.  */
2490
      if (*s2 == 0 && ! ISALNUM (*s1)
2491
          && cris_insn_ver_valid_for_arch (sregp->applicable_version,
2492
                                           cris_arch))
2493
        {
2494
          /* We have a match.  Update the pointer and be done.  */
2495
          *cPP = s1;
2496
          *sregpp = sregp;
2497
          return 1;
2498
        }
2499
    }
2500
 
2501
  /* If we got here, we did not find any name.  */
2502
  return 0;
2503
}
2504
 
2505
/* Get a support register from the string pointed out by *cPP. The
2506
   variable *cPP is advanced to the character following the support-
2507
   register name if one is found, and retains its original position
2508
   otherwise.
2509
 
2510
   cPP      Pointer to pointer to string starting with a support-register
2511
            name.
2512
 
2513
   sregpp   Pointer to int containing the register number.
2514
 
2515
   Return 1 iff a correct support-register name is found.  */
2516
 
2517
static int
2518
get_sup_reg (char **cPP, int *regnop)
2519
{
2520
  char *s1;
2521
  const char *s2;
2522
  char *name_begin = *cPP;
2523
 
2524
  const struct cris_support_reg *sregp;
2525
 
2526
  /* Handle a sometimes-mandatory dollar sign as register prefix.  */
2527
  if (*name_begin == REGISTER_PREFIX_CHAR)
2528
    name_begin++;
2529
  else if (demand_register_prefix)
2530
    return 0;
2531
 
2532
  /* Loop over all support-registers.  */
2533
  for (sregp = cris_support_regs; sregp->name != NULL; sregp++)
2534
    {
2535
      /* Start over from beginning of the supposed name.  */
2536
      s1 = name_begin;
2537
      s2 = sregp->name;
2538
 
2539
      while (*s2 != '\0' && TOLOWER (*s1) == *s2)
2540
        {
2541
          s1++;
2542
          s2++;
2543
        }
2544
 
2545
      /* For a match, we must have consumed the name in the table, and we
2546
         must be outside what could be part of a name.  Assume here that a
2547
         test for alphanumerics is sufficient for a name test.  */
2548
      if (*s2 == 0 && ! ISALNUM (*s1))
2549
        {
2550
          /* We have a match.  Update the pointer and be done.  */
2551
          *cPP = s1;
2552
          *regnop = sregp->number;
2553
          return 1;
2554
        }
2555
    }
2556
 
2557
  /* If we got here, we did not find any name.  */
2558
  return 0;
2559
}
2560
 
2561
/* Get an unprefixed or side-effect-prefix operand from the string pointed
2562
   out by *cPP.  The pointer *cPP is advanced to the character following
2563
   the indirect operand if we have success, else it contains an undefined
2564
   value.
2565
 
2566
   cPP           Pointer to pointer to string beginning with the first
2567
                 character of the supposed operand.
2568
 
2569
   prefixp       Pointer to structure containing an optional instruction
2570
                 prefix.
2571
 
2572
   is_autoincp   Pointer to int indicating the indirect or autoincrement
2573
                 bits.
2574
 
2575
   src_regnop    Pointer to int containing the source register number in
2576
                 the instruction.
2577
 
2578
   imm_foundp    Pointer to an int indicating if an immediate expression
2579
                 is found.
2580
 
2581
   imm_exprP     Pointer to a structure containing an immediate
2582
                 expression, if success and if *imm_foundp is nonzero.
2583
 
2584
   Return 1 iff a correct indirect operand is found.  */
2585
 
2586
static int
2587
get_autoinc_prefix_or_indir_op (char **cPP, struct cris_prefix *prefixp,
2588
                                int *is_autoincp, int *src_regnop,
2589
                                int *imm_foundp, expressionS *imm_exprP)
2590
{
2591
  /* Assume there was no immediate mode expression.  */
2592
  *imm_foundp = 0;
2593
 
2594
  if (**cPP == '[')
2595
    {
2596
      /* So this operand is one of:
2597
         Indirect: [rN]
2598
         Autoincrement: [rN+]
2599
         Indexed with assign: [rN=rM+rO.S]
2600
         Offset with assign: [rN=rM+I], [rN=rM+[rO].s], [rN=rM+[rO+].s]
2601
 
2602
         Either way, consume the '['.  */
2603
      (*cPP)++;
2604
 
2605
      /* Get the rN register.  */
2606
      if (! get_gen_reg (cPP, src_regnop))
2607
        /* If there was no register, then this cannot match.  */
2608
        return 0;
2609
      else
2610
        {
2611
          /* We got the register, now check the next character.  */
2612
          switch (**cPP)
2613
            {
2614
            case ']':
2615
              /* Indirect mode.  We're done here.  */
2616
              prefixp->kind = PREFIX_NONE;
2617
              *is_autoincp = 0;
2618
              break;
2619
 
2620
            case '+':
2621
              /* This must be an auto-increment mode, if there's a
2622
                 match.  */
2623
              prefixp->kind = PREFIX_NONE;
2624
              *is_autoincp = 1;
2625
 
2626
              /* We consume this character and break out to check the
2627
                 closing ']'.  */
2628
              (*cPP)++;
2629
              break;
2630
 
2631
            case '=':
2632
              /* This must be indexed with assign, or offset with assign
2633
                 to match.  Not supported for crisv32 or in
2634
                 compatibility mode.  */
2635
              if (cris_arch == arch_crisv32
2636
                  || cris_arch == arch_cris_common_v10_v32)
2637
                return 0;
2638
 
2639
              (*cPP)++;
2640
 
2641
              /* Either way, the next thing must be a register.  */
2642
              if (! get_gen_reg (cPP, &prefixp->base_reg_number))
2643
                /* No register, no match.  */
2644
                return 0;
2645
              else
2646
                {
2647
                  /* We've consumed "[rN=rM", so we must be looking at
2648
                     "+rO.s]" or "+I]", or "-I]", or "+[rO].s]" or
2649
                     "+[rO+].s]".  */
2650
                  if (**cPP == '+')
2651
                    {
2652
                      int index_reg_number;
2653
                      (*cPP)++;
2654
 
2655
                      if (**cPP == '[')
2656
                        {
2657
                          int size_bits;
2658
                          /* This must be [rx=ry+[rz].s] or
2659
                             [rx=ry+[rz+].s] or no match.  We must be
2660
                             looking at rz after consuming the '['.  */
2661
                          (*cPP)++;
2662
 
2663
                          if (!get_gen_reg (cPP, &index_reg_number))
2664
                            return 0;
2665
 
2666
                          prefixp->kind = PREFIX_BDAP;
2667
                          prefixp->opcode
2668
                            = (BDAP_INDIR_OPCODE
2669
                               + (prefixp->base_reg_number << 12)
2670
                               + index_reg_number);
2671
 
2672
                          if (**cPP == '+')
2673
                            {
2674
                              /* We've seen "[rx=ry+[rz+" here, so now we
2675
                                 know that there must be "].s]" left to
2676
                                 check.  */
2677
                              (*cPP)++;
2678
                              prefixp->opcode |= AUTOINCR_BIT << 8;
2679
                            }
2680
 
2681
                          /* If it wasn't autoincrement, we don't need to
2682
                             add anything.  */
2683
 
2684
                          /* Check the next-to-last ']'.  */
2685
                          if (**cPP != ']')
2686
                            return 0;
2687
 
2688
                          (*cPP)++;
2689
 
2690
                          /* Check the ".s" modifier.  */
2691
                          if (! get_bwd_size_modifier (cPP, &size_bits))
2692
                            return 0;
2693
 
2694
                          prefixp->opcode |= size_bits << 4;
2695
 
2696
                          /* Now we got [rx=ry+[rz+].s or [rx=ry+[rz].s.
2697
                             We break out to check the final ']'.  */
2698
                          break;
2699
                        }
2700
                      /* It wasn't an indirection.  Check if it's a
2701
                         register.  */
2702
                      else if (get_gen_reg (cPP, &index_reg_number))
2703
                        {
2704
                          int size_bits;
2705
 
2706
                          /* Indexed with assign mode: "[rN+rM.S]".  */
2707
                          prefixp->kind = PREFIX_BIAP;
2708
                          prefixp->opcode
2709
                            = (BIAP_OPCODE + (index_reg_number << 12)
2710
                               + prefixp->base_reg_number /* << 0 */);
2711
 
2712
                          if (! get_bwd_size_modifier (cPP, &size_bits))
2713
                            /* Size missing, this isn't a match.  */
2714
                            return 0;
2715
                          else
2716
                            {
2717
                              /* Size found, break out to check the
2718
                                 final ']'.  */
2719
                              prefixp->opcode |= size_bits << 4;
2720
                              break;
2721
                            }
2722
                        }
2723
                      /* Not a register.  Then this must be "[rN+I]".  */
2724
                      else if (cris_get_expression (cPP, &prefixp->expr))
2725
                        {
2726
                          /* We've got offset with assign mode.  Fill
2727
                             in the blanks and break out to match the
2728
                             final ']'.  */
2729
                          prefixp->kind = PREFIX_BDAP_IMM;
2730
 
2731
                          /* We tentatively put an opcode corresponding to
2732
                             a 32-bit operand here, although it may be
2733
                             relaxed when there's no relocation
2734
                             specifier for the operand.  */
2735
                          prefixp->opcode
2736
                            = (BDAP_INDIR_OPCODE
2737
                               | (prefixp->base_reg_number << 12)
2738
                               | (AUTOINCR_BIT << 8)
2739
                               | (2 << 4)
2740
                               | REG_PC /* << 0 */);
2741
 
2742
                          /* This can have a PIC suffix, specifying reloc
2743
                             type to use.  */
2744
                          if ((pic || tls) && **cPP == RELOC_SUFFIX_CHAR)
2745
                            {
2746
                              unsigned int relocsize;
2747
 
2748
                              cris_get_reloc_suffix (cPP, &prefixp->reloc,
2749
                                                     &prefixp->expr);
2750
 
2751
                              /* Tweak the size of the immediate operand
2752
                                 in the prefix opcode if it isn't what we
2753
                                 set.  */
2754
                              relocsize
2755
                                = cris_get_specified_reloc_size (prefixp->reloc);
2756
                              if (relocsize != 4)
2757
                                prefixp->opcode
2758
                                  = ((prefixp->opcode & ~(3 << 4))
2759
                                     | ((relocsize >> 1) << 4));
2760
                            }
2761
                          break;
2762
                        }
2763
                      else
2764
                        /* Neither register nor expression found, so
2765
                           this can't be a match.  */
2766
                        return 0;
2767
                    }
2768
                  /* Not "[rN+" but perhaps "[rN-"?  */
2769
                  else if (**cPP == '-')
2770
                    {
2771
                      /* We must have an offset with assign mode.  */
2772
                      if (! cris_get_expression (cPP, &prefixp->expr))
2773
                        /* No expression, no match.  */
2774
                        return 0;
2775
                      else
2776
                        {
2777
                          /* We've got offset with assign mode.  Fill
2778
                             in the blanks and break out to match the
2779
                             final ']'.
2780
 
2781
                             Note that we don't allow a relocation
2782
                             suffix for an operand with a minus
2783
                             sign.  */
2784
                          prefixp->kind = PREFIX_BDAP_IMM;
2785
                          break;
2786
                        }
2787
                    }
2788
                  else
2789
                    /* Neither '+' nor '-' after "[rN=rM".  Lose.  */
2790
                    return 0;
2791
                }
2792
            default:
2793
              /* Neither ']' nor '+' nor '=' after "[rN".  Lose.  */
2794
              return 0;
2795
            }
2796
        }
2797
 
2798
      /* When we get here, we have a match and will just check the closing
2799
         ']'.  We can still fail though.  */
2800
      if (**cPP != ']')
2801
        return 0;
2802
      else
2803
        {
2804
          /* Don't forget to consume the final ']'.
2805
             Then return in glory.  */
2806
          (*cPP)++;
2807
          return 1;
2808
        }
2809
    }
2810
  /* No indirection.  Perhaps a constant?  */
2811
  else if (cris_get_expression (cPP, imm_exprP))
2812
    {
2813
      /* Expression found, this is immediate mode.  */
2814
      prefixp->kind = PREFIX_NONE;
2815
      *is_autoincp = 1;
2816
      *src_regnop = REG_PC;
2817
      *imm_foundp = 1;
2818
 
2819
      /* This can have a PIC suffix, specifying reloc type to use.  The
2820
         caller must check that the reloc size matches the operand size.  */
2821
      if ((pic || tls) && **cPP == RELOC_SUFFIX_CHAR)
2822
        cris_get_reloc_suffix (cPP, &prefixp->reloc, imm_exprP);
2823
 
2824
      return 1;
2825
    }
2826
 
2827
  /* No luck today.  */
2828
  return 0;
2829
}
2830
 
2831
/* This function gets an indirect operand in a three-address operand
2832
   combination from the string pointed out by *cPP.  The pointer *cPP is
2833
   advanced to the character following the indirect operand on success, or
2834
   has an unspecified value on failure.
2835
 
2836
   cPP       Pointer to pointer to string beginning
2837
             with the operand
2838
 
2839
   prefixp   Pointer to structure containing an
2840
             instruction prefix
2841
 
2842
   Returns 1 iff a correct indirect operand is found.  */
2843
 
2844
static int
2845
get_3op_or_dip_prefix_op (char **cPP, struct cris_prefix *prefixp)
2846
{
2847
  int reg_number;
2848
 
2849
  if (**cPP != '[')
2850
    /* We must have a '[' or it's a clean failure.  */
2851
    return 0;
2852
 
2853
  /* Eat the first '['.  */
2854
  (*cPP)++;
2855
 
2856
  if (**cPP == '[')
2857
    {
2858
      /* A second '[', so this must be double-indirect mode.  */
2859
      (*cPP)++;
2860
      prefixp->kind = PREFIX_DIP;
2861
      prefixp->opcode = DIP_OPCODE;
2862
 
2863
      /* Get the register or fail entirely.  */
2864
      if (! get_gen_reg (cPP, &reg_number))
2865
        return 0;
2866
      else
2867
        {
2868
          prefixp->opcode |= reg_number /* << 0 */ ;
2869
          if (**cPP == '+')
2870
            {
2871
              /* Since we found a '+', this must be double-indirect
2872
                 autoincrement mode.  */
2873
              (*cPP)++;
2874
              prefixp->opcode |= AUTOINCR_BIT << 8;
2875
            }
2876
 
2877
          /* There's nothing particular to do, if this was a
2878
             double-indirect *without* autoincrement.  */
2879
        }
2880
 
2881
      /* Check the first ']'.  The second one is checked at the end.  */
2882
      if (**cPP != ']')
2883
        return 0;
2884
 
2885
      /* Eat the first ']', so we'll be looking at a second ']'.  */
2886
      (*cPP)++;
2887
    }
2888
  /* No second '['.  Then we should have a register here, making
2889
     it "[rN".  */
2890
  else if (get_gen_reg (cPP, &prefixp->base_reg_number))
2891
    {
2892
      /* This must be indexed or offset mode: "[rN+I]" or
2893
         "[rN+rM.S]" or "[rN+[rM].S]" or "[rN+[rM+].S]".  */
2894
      if (**cPP == '+')
2895
        {
2896
          int index_reg_number;
2897
 
2898
          (*cPP)++;
2899
 
2900
          if (**cPP == '[')
2901
            {
2902
              /* This is "[rx+["...  Expect a register next.  */
2903
              int size_bits;
2904
              (*cPP)++;
2905
 
2906
              if (!get_gen_reg (cPP, &index_reg_number))
2907
                return 0;
2908
 
2909
              prefixp->kind = PREFIX_BDAP;
2910
              prefixp->opcode
2911
                = (BDAP_INDIR_OPCODE
2912
                   + (prefixp->base_reg_number << 12)
2913
                   + index_reg_number);
2914
 
2915
              /* We've seen "[rx+[ry", so check if this is
2916
                 autoincrement.  */
2917
              if (**cPP == '+')
2918
                {
2919
                  /* Yep, now at "[rx+[ry+".  */
2920
                  (*cPP)++;
2921
                  prefixp->opcode |= AUTOINCR_BIT << 8;
2922
                }
2923
              /* If it wasn't autoincrement, we don't need to
2924
                 add anything.  */
2925
 
2926
              /* Check a first closing ']': "[rx+[ry]" or
2927
                 "[rx+[ry+]".  */
2928
              if (**cPP != ']')
2929
                return 0;
2930
              (*cPP)++;
2931
 
2932
              /* Now expect a size modifier ".S".  */
2933
              if (! get_bwd_size_modifier (cPP, &size_bits))
2934
                return 0;
2935
 
2936
              prefixp->opcode |= size_bits << 4;
2937
 
2938
              /* Ok, all interesting stuff has been seen:
2939
                 "[rx+[ry+].S" or "[rx+[ry].S".  We only need to
2940
                 expect a final ']', which we'll do in a common
2941
                 closing session.  */
2942
            }
2943
          /* Seen "[rN+", but not a '[', so check if we have a
2944
             register.  */
2945
          else if (get_gen_reg (cPP, &index_reg_number))
2946
            {
2947
              /* This is indexed mode: "[rN+rM.S]" or
2948
                 "[rN+rM.S+]".  */
2949
              int size_bits;
2950
              prefixp->kind = PREFIX_BIAP;
2951
              prefixp->opcode
2952
                = (BIAP_OPCODE
2953
                   | prefixp->base_reg_number /* << 0 */
2954
                   | (index_reg_number << 12));
2955
 
2956
              /* Consume the ".S".  */
2957
              if (! get_bwd_size_modifier (cPP, &size_bits))
2958
                /* Missing size, so fail.  */
2959
                return 0;
2960
              else
2961
                /* Size found.  Add that piece and drop down to
2962
                   the common checking of the closing ']'.  */
2963
                prefixp->opcode |= size_bits << 4;
2964
            }
2965
          /* Seen "[rN+", but not a '[' or a register, so then
2966
             it must be a constant "I".
2967
 
2968
             As a quality of implementation improvement, we check for a
2969
             closing ']', like in an erroneous "[rN+]".  If we don't,
2970
             the expression parser will emit a confusing "bad
2971
             expression" when it sees the ']', probably because it
2972
             doesn't like seeing no expression.  */
2973
          else if (**cPP != ']' && cris_get_expression (cPP, &prefixp->expr))
2974
            {
2975
              /* Expression found, so fill in the bits of offset
2976
                 mode and drop down to check the closing ']'.  */
2977
              prefixp->kind = PREFIX_BDAP_IMM;
2978
 
2979
              /* We tentatively put an opcode corresponding to a 32-bit
2980
                 operand here, although it may be relaxed when there's no
2981
                 PIC specifier for the operand.  */
2982
              prefixp->opcode
2983
                = (BDAP_INDIR_OPCODE
2984
                   | (prefixp->base_reg_number << 12)
2985
                   | (AUTOINCR_BIT << 8)
2986
                   | (2 << 4)
2987
                   | REG_PC /* << 0 */);
2988
 
2989
              /* This can have a PIC suffix, specifying reloc type to use.  */
2990
              if ((pic || tls) && **cPP == RELOC_SUFFIX_CHAR)
2991
                {
2992
                  unsigned int relocsize;
2993
 
2994
                  cris_get_reloc_suffix (cPP, &prefixp->reloc, &prefixp->expr);
2995
 
2996
                  /* Tweak the size of the immediate operand in the prefix
2997
                     opcode if it isn't what we set.  */
2998
                  relocsize = cris_get_specified_reloc_size (prefixp->reloc);
2999
                  if (relocsize != 4)
3000
                    prefixp->opcode
3001
                      = ((prefixp->opcode & ~(3 << 4))
3002
                         | ((relocsize >> 1) << 4));
3003
                }
3004
            }
3005
          else
3006
            /* Nothing valid here: lose.  */
3007
            return 0;
3008
        }
3009
      /* Seen "[rN" but no '+', so check if it's a '-'.  */
3010
      else if (**cPP == '-')
3011
        {
3012
          /* Yep, we must have offset mode.  */
3013
          if (! cris_get_expression (cPP, &prefixp->expr))
3014
            /* No expression, so we lose.  */
3015
            return 0;
3016
          else
3017
            {
3018
              /* Expression found to make this offset mode, so
3019
                 fill those bits and drop down to check the
3020
                 closing ']'.
3021
 
3022
                 Note that we don't allow a PIC suffix for
3023
                 an operand with a minus sign like this.  */
3024
              prefixp->kind = PREFIX_BDAP_IMM;
3025
            }
3026
        }
3027
      else
3028
        {
3029
          /* We've seen "[rN", but not '+' or '-'; rather a ']'.
3030
             Hmm.  Normally this is a simple indirect mode that we
3031
             shouldn't match, but if we expect ']', then we have a
3032
             zero offset, so it can be a three-address-operand,
3033
             like "[rN],rO,rP", thus offset mode.
3034
 
3035
             Don't eat the ']', that will be done in the closing
3036
             ceremony.  */
3037
          prefixp->expr.X_op = O_constant;
3038
          prefixp->expr.X_add_number = 0;
3039
          prefixp->expr.X_add_symbol = NULL;
3040
          prefixp->expr.X_op_symbol = NULL;
3041
          prefixp->kind = PREFIX_BDAP_IMM;
3042
        }
3043
    }
3044
  /* A '[', but no second '[', and no register.  Check if we
3045
     have an expression, making this "[I]" for a double-indirect
3046
     prefix.  */
3047
  else if (cris_get_expression (cPP, &prefixp->expr))
3048
    {
3049
      /* Expression found, the so called absolute mode for a
3050
         double-indirect prefix on PC.  */
3051
      prefixp->kind = PREFIX_DIP;
3052
      prefixp->opcode = DIP_OPCODE | (AUTOINCR_BIT << 8) | REG_PC;
3053
      prefixp->reloc = BFD_RELOC_32;
3054
 
3055
      /* For :GD and :IE, it makes sense to have TLS specifiers here.  */
3056
      if ((pic || tls) && **cPP == RELOC_SUFFIX_CHAR)
3057
        cris_get_reloc_suffix (cPP, &prefixp->reloc, &prefixp->expr);
3058
    }
3059
  else
3060
    /* Neither '[' nor register nor expression.  We lose.  */
3061
    return 0;
3062
 
3063
  /* We get here as a closing ceremony to a successful match.  We just
3064
     need to check the closing ']'.  */
3065
  if (**cPP != ']')
3066
    /* Oops.  Close but no air-polluter.  */
3067
    return 0;
3068
 
3069
  /* Don't forget to consume that ']', before returning in glory.  */
3070
  (*cPP)++;
3071
  return 1;
3072
}
3073
 
3074
/* Get an expression from the string pointed out by *cPP.
3075
   The pointer *cPP is advanced to the character following the expression
3076
   on a success, or retains its original value otherwise.
3077
 
3078
   cPP     Pointer to pointer to string beginning with the expression.
3079
 
3080
   exprP   Pointer to structure containing the expression.
3081
 
3082
   Return 1 iff a correct expression is found.  */
3083
 
3084
static int
3085
cris_get_expression (char **cPP, expressionS *exprP)
3086
{
3087
  char *saved_input_line_pointer;
3088
 
3089
  /* The "expression" function expects to find an expression at the
3090
     global variable input_line_pointer, so we have to save it to give
3091
     the impression that we don't fiddle with global variables.  */
3092
  saved_input_line_pointer = input_line_pointer;
3093
  input_line_pointer = *cPP;
3094
 
3095
  /* Avoid a common error, confusing addressing modes.  Beware that the
3096
     call to expression below does not signal that error; it treats []
3097
     as parentheses, unless #define NEED_INDEX_OPERATOR in which case it
3098
     gives them other confusing semantics rather than plain outlawing
3099
     them, which is what we want.  */
3100
  if (*input_line_pointer == '[')
3101
    {
3102
      input_line_pointer = saved_input_line_pointer;
3103
      return 0;
3104
    }
3105
 
3106
  expression (exprP);
3107
  if (exprP->X_op == O_illegal || exprP->X_op == O_absent)
3108
    {
3109
      input_line_pointer = saved_input_line_pointer;
3110
      return 0;
3111
    }
3112
 
3113
  /* Everything seems to be fine, just restore the global
3114
     input_line_pointer and say we're successful.  */
3115
  *cPP = input_line_pointer;
3116
  input_line_pointer = saved_input_line_pointer;
3117
  return 1;
3118
}
3119
 
3120
/* Get a sequence of flag characters from *spp.  The pointer *cPP is
3121
   advanced to the character following the expression.  The flag
3122
   characters are consecutive, no commas or spaces.
3123
 
3124
   cPP       Pointer to pointer to string beginning with the expression.
3125
 
3126
   flagp     Pointer to int to return the flags expression.
3127
 
3128
   Return 1 iff a correct flags expression is found.  */
3129
 
3130
static int
3131
get_flags (char **cPP, int *flagsp)
3132
{
3133
  for (;;)
3134
    {
3135
      switch (**cPP)
3136
        {
3137
        case 'd':
3138
        case 'D':
3139
          if (! cris_insn_ver_valid_for_arch (cris_ver_v0_3,
3140
                                              cris_arch))
3141
            return 0;
3142
          *flagsp |= 0x80;
3143
          break;
3144
 
3145
        case 'm':
3146
        case 'M':
3147
          if (! cris_insn_ver_valid_for_arch (cris_ver_v8_10,
3148
                                              cris_arch))
3149
            return 0;
3150
          *flagsp |= 0x80;
3151
          break;
3152
 
3153
        case 'e':
3154
        case 'E':
3155
          if (! cris_insn_ver_valid_for_arch (cris_ver_v0_3,
3156
                                              cris_arch))
3157
            return 0;
3158
          *flagsp |= 0x40;
3159
          break;
3160
 
3161
        case 'b':
3162
        case 'B':
3163
          if (! cris_insn_ver_valid_for_arch (cris_ver_v8_10,
3164
                                              cris_arch))
3165
            return 0;
3166
          *flagsp |= 0x40;
3167
          break;
3168
 
3169
        case 'p':
3170
        case 'P':
3171
          if (! cris_insn_ver_valid_for_arch (cris_ver_v32p,
3172
                                              cris_arch))
3173
            return 0;
3174
          *flagsp |= 0x80;
3175
          break;
3176
 
3177
        case 'u':
3178
        case 'U':
3179
          if (! cris_insn_ver_valid_for_arch (cris_ver_v32p,
3180
                                              cris_arch))
3181
            return 0;
3182
          *flagsp |= 0x40;
3183
          break;
3184
 
3185
        case 'i':
3186
        case 'I':
3187
          *flagsp |= 0x20;
3188
          break;
3189
 
3190
        case 'x':
3191
        case 'X':
3192
          *flagsp |= 0x10;
3193
          break;
3194
 
3195
        case 'n':
3196
        case 'N':
3197
          *flagsp |= 0x8;
3198
          break;
3199
 
3200
        case 'z':
3201
        case 'Z':
3202
          *flagsp |= 0x4;
3203
          break;
3204
 
3205
        case 'v':
3206
        case 'V':
3207
          *flagsp |= 0x2;
3208
          break;
3209
 
3210
        case 'c':
3211
        case 'C':
3212
          *flagsp |= 1;
3213
          break;
3214
 
3215
        default:
3216
          /* We consider this successful if we stop at a comma or
3217
             whitespace.  Anything else, and we consider it a failure.  */
3218
          if (**cPP != ','
3219
              && **cPP != 0
3220
              && ! ISSPACE (**cPP))
3221
            return 0;
3222
          else
3223
            return 1;
3224
        }
3225
 
3226
      /* Don't forget to consume each flag character.  */
3227
      (*cPP)++;
3228
    }
3229
}
3230
 
3231
/* Generate code and fixes for a BDAP prefix.
3232
   For v32, this handles ADDOQ because thankfully the opcodes are the
3233
   same.
3234
 
3235
   base_regno   Int containing the base register number.
3236
 
3237
   exprP        Pointer to structure containing the offset expression.  */
3238
 
3239
static void
3240
gen_bdap (int base_regno, expressionS *exprP)
3241
{
3242
  unsigned int opcode;
3243
  char *opcodep;
3244
 
3245
  /* Put out the prefix opcode; assume quick immediate mode at first.  */
3246
  opcode = BDAP_QUICK_OPCODE | (base_regno << 12);
3247
  opcodep = cris_insn_first_word_frag ();
3248
  md_number_to_chars (opcodep, opcode, 2);
3249
 
3250
  if (exprP->X_op == O_constant)
3251
    {
3252
      /* We have an absolute expression that we know the size of right
3253
         now.  */
3254
      long int value;
3255
      int size;
3256
 
3257
      value = exprP->X_add_number;
3258
      if (value < -32768 || value > 32767)
3259
        /* Outside range for a "word", make it a dword.  */
3260
        size = 2;
3261
      else
3262
        /* Assume "word" size.  */
3263
        size = 1;
3264
 
3265
      /* If this is a signed-byte value, we can fit it into the prefix
3266
         insn itself.  */
3267
      if (value >= -128 && value <= 127)
3268
        opcodep[0] = value;
3269
      else
3270
        {
3271
          /* This is a word or dword displacement, which will be put in a
3272
             word or dword after the prefix.  */
3273
          char *p;
3274
 
3275
          opcodep[0] = BDAP_PC_LOW + (size << 4);
3276
          opcodep[1] &= 0xF0;
3277
          opcodep[1] |= BDAP_INCR_HIGH;
3278
          p = frag_more (1 << size);
3279
          md_number_to_chars (p, value, 1 << size);
3280
        }
3281
    }
3282
  else
3283
    {
3284
      /* Handle complex expressions.  */
3285
      valueT addvalue
3286
        = SIMPLE_EXPR (exprP) ? exprP->X_add_number : 0;
3287
      symbolS *sym
3288
        = (SIMPLE_EXPR (exprP)
3289
           ? exprP->X_add_symbol : make_expr_symbol (exprP));
3290
 
3291
      /* The expression is not defined yet but may become absolute.  We
3292
         make it a relocation to be relaxed.  */
3293
      frag_var (rs_machine_dependent, 4, 0,
3294
                ENCODE_RELAX (STATE_BASE_PLUS_DISP_PREFIX, STATE_UNDF),
3295
                sym, addvalue, opcodep);
3296
    }
3297
}
3298
 
3299
/* Encode a branch displacement in the range -256..254 into the form used
3300
   by CRIS conditional branch instructions.
3301
 
3302
   offset  The displacement value in bytes.  */
3303
 
3304
static int
3305
branch_disp (int offset)
3306
{
3307
  int disp;
3308
 
3309
  /* Adjust all short branch offsets here.  */
3310
  if (cris_arch == arch_crisv32 || cris_arch == arch_cris_common_v10_v32)
3311
    offset += 2;
3312
 
3313
  disp = offset & 0xFE;
3314
 
3315
  if (offset < 0)
3316
    disp |= 1;
3317
 
3318
  return disp;
3319
}
3320
 
3321
/* Generate code and fixes for a 32-bit conditional branch instruction
3322
   created by "extending" an existing 8-bit branch instruction.
3323
 
3324
   opcodep    Pointer to the word containing the original 8-bit branch
3325
              instruction.
3326
 
3327
   writep     Pointer to "extension area" following the first instruction
3328
              word.
3329
 
3330
   fragP      Pointer to the frag containing the instruction.
3331
 
3332
   add_symP,  Parts of the destination address expression.
3333
   sub_symP,
3334
   add_num.  */
3335
 
3336
static void
3337
gen_cond_branch_32 (char *opcodep, char *writep, fragS *fragP,
3338
                    symbolS *add_symP, symbolS *sub_symP, long int add_num)
3339
{
3340
  int nop_opcode;
3341
  int opc_offset;
3342
  int branch_offset;
3343
 
3344
  if (cris_arch == arch_crisv32)
3345
    {
3346
      nop_opcode = NOP_OPCODE_V32;
3347
      opc_offset = 10;
3348
      branch_offset = -2 - 8;
3349
    }
3350
  else if (pic)
3351
    {
3352
      nop_opcode = NOP_OPCODE;
3353
      opc_offset = 10;
3354
      branch_offset = -2 - 8;
3355
    }
3356
  else
3357
    {
3358
      nop_opcode = NOP_OPCODE;
3359
      opc_offset = 8;
3360
      branch_offset = -2 - 6;
3361
    }
3362
 
3363
  /* We should never get here for compatibility mode.  */
3364
  if (cris_arch == arch_cris_common_v10_v32)
3365
    as_fatal (_("Calling gen_cond_branch_32 for .arch common_v10_v32\n"));
3366
 
3367
  if (warn_for_branch_expansion)
3368
    as_warn_where (fragP->fr_file, fragP->fr_line,
3369
                   _("32-bit conditional branch generated"));
3370
 
3371
  /* Here, writep points to what will be opcodep + 2.  First, we change
3372
     the actual branch in opcodep[0] and opcodep[1], so that in the
3373
     final insn, it will look like:
3374
       opcodep+10: Bcc .-6
3375
 
3376
     This means we don't have to worry about changing the opcode or
3377
     messing with the delay-slot instruction.  So, we move it to last in
3378
     the "extended" branch, and just change the displacement.  Admittedly,
3379
     it's not the optimal extended construct, but we should get this
3380
     rarely enough that it shouldn't matter.  */
3381
 
3382
  writep[opc_offset] = branch_disp (branch_offset);
3383
  writep[opc_offset + 1] = opcodep[1];
3384
 
3385
  /* Then, we change the branch to an unconditional branch over the
3386
     extended part, to the new location of the Bcc:
3387
       opcodep:   BA .+10
3388
       opcodep+2: NOP
3389
 
3390
     Note that these two writes are to currently different locations,
3391
     merged later.  */
3392
 
3393
  md_number_to_chars (opcodep, BA_QUICK_OPCODE
3394
                      + (cris_arch == arch_crisv32 ? 12 : (pic ? 10 : 8)),
3395
                      2);
3396
  md_number_to_chars (writep, nop_opcode, 2);
3397
 
3398
  /* Then the extended thing, the 32-bit jump insn.
3399
       opcodep+4: JUMP [PC+]
3400
     or, in the PIC case,
3401
       opcodep+4: MOVE [PC=PC+N],P0.  */
3402
 
3403
  md_number_to_chars (writep + 2,
3404
                      cris_arch == arch_crisv32
3405
                      ? BA_DWORD_OPCODE
3406
                      : (pic ? MOVE_PC_INCR_OPCODE_PREFIX
3407
                         : JUMP_PC_INCR_OPCODE), 2);
3408
 
3409
  /* We have to fill in the actual value too.
3410
       opcodep+6: .DWORD
3411
     This is most probably an expression, but we can cope with an absolute
3412
     value too.  FIXME: Testcase needed with and without pic.  */
3413
 
3414
  if (add_symP == NULL && sub_symP == NULL)
3415
    {
3416
      /* An absolute address.  */
3417
      if (pic || cris_arch == arch_crisv32)
3418
        fix_new (fragP, writep + 4 - fragP->fr_literal, 4,
3419
                 section_symbol (absolute_section),
3420
                 add_num
3421
                 + (cris_arch == arch_crisv32 ? 6 : 0),
3422
                 1, BFD_RELOC_32_PCREL);
3423
      else
3424
        md_number_to_chars (writep + 4, add_num, 4);
3425
    }
3426
  else
3427
    {
3428
      if (sub_symP != NULL)
3429
        as_bad_where (fragP->fr_file, fragP->fr_line,
3430
                      _("Complex expression not supported"));
3431
 
3432
      /* Not absolute, we have to make it a frag for later evaluation.  */
3433
      fix_new (fragP, writep + 4 - fragP->fr_literal, 4, add_symP,
3434
               add_num + (cris_arch == arch_crisv32 ? 6 : 0),
3435
               pic || cris_arch == arch_crisv32 ? 1 : 0,
3436
               pic || cris_arch == arch_crisv32
3437
               ? BFD_RELOC_32_PCREL : BFD_RELOC_32);
3438
    }
3439
 
3440
  if (cris_arch == arch_crisv32)
3441
    /* Follow it with a "NOP" for CRISv32.  */
3442
    md_number_to_chars (writep + 8, NOP_OPCODE_V32, 2);
3443
  else if (pic)
3444
    /* ...and the rest of the move-opcode for pre-v32 PIC.  */
3445
    md_number_to_chars (writep + 8, MOVE_PC_INCR_OPCODE_SUFFIX, 2);
3446
}
3447
 
3448
/* Get the size of an immediate-reloc in bytes.  Only valid for
3449
   specified relocs (TLS, PIC).  */
3450
 
3451
static unsigned int
3452
cris_get_specified_reloc_size (bfd_reloc_code_real_type reloc)
3453
{
3454
  return
3455
    reloc == BFD_RELOC_CRIS_16_GOTPLT
3456
    || reloc == BFD_RELOC_CRIS_16_GOT
3457
    || reloc == BFD_RELOC_CRIS_16_GOT_GD
3458
    || reloc == BFD_RELOC_CRIS_16_DTPREL
3459
    || reloc == BFD_RELOC_CRIS_16_GOT_TPREL
3460
    || reloc == BFD_RELOC_CRIS_16_TPREL
3461
    ? 2 : 4;
3462
}
3463
 
3464
/* Store a reloc type at *RELOCP corresponding to the PIC suffix at *CPP.
3465
   Adjust *EXPRP with any addend found after the PIC suffix.  */
3466
 
3467
static void
3468
cris_get_reloc_suffix (char **cPP, bfd_reloc_code_real_type *relocp,
3469
                       expressionS *exprP)
3470
{
3471
  char *s = *cPP;
3472
  unsigned int i;
3473
  expressionS const_expr;
3474
 
3475
  const struct pic_suffixes_struct
3476
  {
3477
    const char *const suffix;
3478
    unsigned int len;
3479
    bfd_reloc_code_real_type reloc;
3480
    bfd_boolean pic_p;
3481
    bfd_boolean tls_p;
3482
  } pic_suffixes[] =
3483
    {
3484
#undef PICMAP
3485
#define PICMAP(s, r) {s, sizeof (s) - 1, r, TRUE, FALSE}
3486
#define PICTLSMAP(s, r) {s, sizeof (s) - 1, r, TRUE, TRUE}
3487
#define TLSMAP(s, r) {s, sizeof (s) - 1, r, FALSE, TRUE}
3488
      /* Keep this in order with longest unambiguous prefix first.  */
3489
      PICMAP ("GOTPLT16", BFD_RELOC_CRIS_16_GOTPLT),
3490
      PICMAP ("GOTPLT", BFD_RELOC_CRIS_32_GOTPLT),
3491
      PICMAP ("PLTG", BFD_RELOC_CRIS_32_PLT_GOTREL),
3492
      PICMAP ("PLT", BFD_RELOC_CRIS_32_PLT_PCREL),
3493
      PICMAP ("GOTOFF", BFD_RELOC_CRIS_32_GOTREL),
3494
      PICMAP ("GOT16", BFD_RELOC_CRIS_16_GOT),
3495
      PICMAP ("GOT", BFD_RELOC_CRIS_32_GOT),
3496
      PICTLSMAP ("GDGOTREL16", BFD_RELOC_CRIS_16_GOT_GD),
3497
      PICTLSMAP ("GDGOTREL", BFD_RELOC_CRIS_32_GOT_GD),
3498
      TLSMAP ("GD", BFD_RELOC_CRIS_32_GD),
3499
      PICTLSMAP ("DTPREL16", BFD_RELOC_CRIS_16_DTPREL),
3500
      PICTLSMAP ("DTPREL", BFD_RELOC_CRIS_32_DTPREL),
3501
      TLSMAP ("IE", BFD_RELOC_CRIS_32_IE),
3502
      PICTLSMAP ("TPOFFGOT16", BFD_RELOC_CRIS_16_GOT_TPREL),
3503
      PICTLSMAP ("TPOFFGOT", BFD_RELOC_CRIS_32_GOT_TPREL),
3504
      TLSMAP ("TPOFF16", BFD_RELOC_CRIS_16_TPREL),
3505
      TLSMAP ("TPOFF", BFD_RELOC_CRIS_32_TPREL)
3506
    };
3507
 
3508
  /* We've already seen the ':', so consume it.  */
3509
  s++;
3510
 
3511
  for (i = 0; i < sizeof (pic_suffixes)/sizeof (pic_suffixes[0]); i++)
3512
    {
3513
      if (strncmp (s, pic_suffixes[i].suffix, pic_suffixes[i].len) == 0
3514
          && ! is_part_of_name (s[pic_suffixes[i].len])
3515
          /* PIC and non-PIC relocations are exclusive.  */
3516
          && (pic != 0) == (pic_suffixes[i].pic_p != 0)
3517
          /* But TLS can be active for non-TLS relocations too.  */
3518
          && (pic_suffixes[i].tls_p == 0 || tls))
3519
        {
3520
          /* We have a match.  Consume the suffix and set the relocation
3521
             type.   */
3522
          s += pic_suffixes[i].len;
3523
 
3524
          /* There can be a constant term appended.  If so, we will add it
3525
             to *EXPRP.  */
3526
          if (*s == '+' || *s == '-')
3527
            {
3528
              if (! cris_get_expression (&s, &const_expr))
3529
                /* There was some kind of syntax error.  Bail out.  */
3530
                break;
3531
 
3532
              /* Allow complex expressions as the constant part.  It still
3533
                 has to be an assembly-time constant or there will be an
3534
                 error emitting the reloc.  This makes the PIC qualifiers
3535
                 idempotent; foo:GOTOFF+32 == foo+32:GOTOFF.  The former we
3536
                 recognize here; the latter is parsed in the incoming
3537
                 expression.  */
3538
              exprP->X_add_symbol = make_expr_symbol (exprP);
3539
              exprP->X_op = O_add;
3540
              exprP->X_add_number = 0;
3541
              exprP->X_op_symbol = make_expr_symbol (&const_expr);
3542
            }
3543
 
3544
          *relocp = pic_suffixes[i].reloc;
3545
          *cPP = s;
3546
          return;
3547
        }
3548
    }
3549
 
3550
  /* No match.  Don't consume anything; fall back and there will be a
3551
     syntax error.  */
3552
}
3553
 
3554
/* This *could* have been:
3555
 
3556
   Turn a string in input_line_pointer into a floating point constant
3557
   of type TYPE, and store the appropriate bytes in *LITP.  The number
3558
   of LITTLENUMS emitted is stored in *SIZEP.
3559
 
3560
   type   A character from FLTCHARS that describes what kind of
3561
          floating-point number is wanted.
3562
 
3563
   litp   A pointer to an array that the result should be stored in.
3564
 
3565
   sizep  A pointer to an integer where the size of the result is stored.
3566
 
3567
   But we don't support floating point constants in assembly code *at all*,
3568
   since it's suboptimal and just opens up bug opportunities.  GCC emits
3569
   the bit patterns as hex.  All we could do here is to emit what GCC
3570
   would have done in the first place.  *Nobody* writes floating-point
3571
   code as assembly code, but if they do, they should be able enough to
3572
   find out the correct bit patterns and use them.  */
3573
 
3574
char *
3575
md_atof (int type ATTRIBUTE_UNUSED, char *litp ATTRIBUTE_UNUSED,
3576
         int *sizep ATTRIBUTE_UNUSED)
3577
{
3578
  /* FIXME:  Is this function mentioned in the internals.texi manual?  If
3579
     not, add it.  */
3580
  return  _("Bad call to md_atof () - floating point formats are not supported");
3581
}
3582
 
3583
/* Turn a number as a fixS * into a series of bytes that represents the
3584
   number on the target machine.  The purpose of this procedure is the
3585
   same as that of md_number_to_chars but this procedure is supposed to
3586
   handle general bit field fixes and machine-dependent fixups.
3587
 
3588
   bufp        Pointer to an array where the result should be stored.
3589
 
3590
   val        The value to store.
3591
 
3592
   n          The number of bytes in "val" that should be stored.
3593
 
3594
   fixP       The fix to be applied to the bit field starting at bufp.
3595
 
3596
   seg        The segment containing this number.  */
3597
 
3598
static void
3599
cris_number_to_imm (char *bufp, long val, int n, fixS *fixP, segT seg)
3600
{
3601
  segT sym_seg;
3602
 
3603
  know (n <= 4);
3604
  know (fixP);
3605
 
3606
  /* We put the relative "vma" for the other segment for inter-segment
3607
     relocations in the object data to stay binary "compatible" (with an
3608
     uninteresting old version) for the relocation.
3609
     Maybe delete some day.  */
3610
  if (fixP->fx_addsy
3611
      && (sym_seg = S_GET_SEGMENT (fixP->fx_addsy)) != seg)
3612
    val += sym_seg->vma;
3613
 
3614
  if (fixP->fx_addsy != NULL || fixP->fx_pcrel)
3615
    switch (fixP->fx_r_type)
3616
      {
3617
        /* These must be fully resolved when getting here.  */
3618
      case BFD_RELOC_16_PCREL:
3619
      case BFD_RELOC_8_PCREL:
3620
        as_bad_where (fixP->fx_file, fixP->fx_line,
3621
                      _("PC-relative relocation must be trivially resolved"));
3622
      default:
3623
        ;
3624
      }
3625
 
3626
  /* Only use the computed value for old-arch binaries.  For all
3627
     others, where we're going to output a relocation, put 0 in the
3628
     code.  */
3629
  if (cris_arch != arch_cris_any_v0_v10
3630
      && (fixP->fx_addsy != NULL || fixP->fx_pcrel))
3631
    val = 0;
3632
 
3633
  switch (fixP->fx_r_type)
3634
    {
3635
      /* Ditto here, we put the addend into the object code as
3636
         well as the reloc addend.  Keep it that way for now, to simplify
3637
         regression tests on the object file contents.  FIXME:  Seems
3638
         uninteresting now that we have a test suite.  */
3639
 
3640
    case BFD_RELOC_CRIS_32_GOT_GD:
3641
    case BFD_RELOC_CRIS_16_GOT_GD:
3642
    case BFD_RELOC_CRIS_32_GD:
3643
    case BFD_RELOC_CRIS_32_IE:
3644
    case BFD_RELOC_CRIS_32_DTPREL:
3645
    case BFD_RELOC_CRIS_16_DTPREL:
3646
    case BFD_RELOC_CRIS_32_GOT_TPREL:
3647
    case BFD_RELOC_CRIS_16_GOT_TPREL:
3648
    case BFD_RELOC_CRIS_32_TPREL:
3649
    case BFD_RELOC_CRIS_16_TPREL:
3650
#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
3651
      if (IS_ELF && fixP->fx_addsy != NULL)
3652
        S_SET_THREAD_LOCAL (fixP->fx_addsy);
3653
#endif
3654
      /* Fall through.  */
3655
 
3656
    case BFD_RELOC_CRIS_16_GOT:
3657
    case BFD_RELOC_CRIS_32_GOT:
3658
    case BFD_RELOC_CRIS_32_GOTREL:
3659
    case BFD_RELOC_CRIS_16_GOTPLT:
3660
    case BFD_RELOC_CRIS_32_GOTPLT:
3661
    case BFD_RELOC_CRIS_32_PLT_GOTREL:
3662
    case BFD_RELOC_CRIS_32_PLT_PCREL:
3663
      /* We don't want to put in any kind of non-zero bits in the data
3664
         being relocated for these.  */
3665
      md_number_to_chars (bufp, 0, n);
3666
      break;
3667
 
3668
    case BFD_RELOC_32_PCREL:
3669
      /* If this one isn't fully resolved, we don't want to put non-zero
3670
         in the object.  */
3671
      if (fixP->fx_addsy != NULL || fixP->fx_pcrel)
3672
        val = 0;
3673
 
3674
      /* Fall through.  */
3675
    case BFD_RELOC_32:
3676
      /* No use having warnings here, since most hosts have a 32-bit type
3677
         for "long" (which will probably change soon, now that I wrote
3678
         this).  */
3679
      bufp[3] = (val >> 24) & 0xFF;
3680
      bufp[2] = (val >> 16) & 0xFF;
3681
      bufp[1] = (val >> 8) & 0xFF;
3682
      bufp[0] = val & 0xFF;
3683
      break;
3684
 
3685
      /* FIXME: The 16 and 8-bit cases should have a way to check
3686
         whether a signed or unsigned (or any signedness) number is
3687
         accepted.  */
3688
 
3689
    case BFD_RELOC_16:
3690
    case BFD_RELOC_16_PCREL:
3691
      if (val > 0xffff || val < -32768)
3692
        as_bad_where (fixP->fx_file, fixP->fx_line,
3693
                      _("Value not in 16 bit range: %ld"), val);
3694
      bufp[1] = (val >> 8) & 0xFF;
3695
      bufp[0] = val & 0xFF;
3696
      break;
3697
 
3698
    case BFD_RELOC_CRIS_SIGNED_16:
3699
      if (val > 32767 || val < -32768)
3700
        as_bad_where (fixP->fx_file, fixP->fx_line,
3701
                      _("Value not in 16 bit signed range: %ld"), val);
3702
      bufp[1] = (val >> 8) & 0xFF;
3703
      bufp[0] = val & 0xFF;
3704
      break;
3705
 
3706
    case BFD_RELOC_8:
3707
    case BFD_RELOC_8_PCREL:
3708
      if (val > 255 || val < -128)
3709
        as_bad_where (fixP->fx_file, fixP->fx_line, _("Value not in 8 bit range: %ld"), val);
3710
      bufp[0] = val & 0xFF;
3711
      break;
3712
 
3713
    case BFD_RELOC_CRIS_SIGNED_8:
3714
      if (val > 127 || val < -128)
3715
        as_bad_where (fixP->fx_file, fixP->fx_line,
3716
                      _("Value not in 8 bit signed range: %ld"), val);
3717
      bufp[0] = val & 0xFF;
3718
      break;
3719
 
3720
    case BFD_RELOC_CRIS_LAPCQ_OFFSET:
3721
      /* FIXME: Test-cases for out-of-range values.  Probably also need
3722
         to use as_bad_where.  */
3723
    case BFD_RELOC_CRIS_UNSIGNED_4:
3724
      if (val > 15 || val < 0)
3725
        as_bad_where (fixP->fx_file, fixP->fx_line,
3726
                      _("Value not in 4 bit unsigned range: %ld"), val);
3727
      bufp[0] |= val & 0x0F;
3728
      break;
3729
 
3730
    case BFD_RELOC_CRIS_UNSIGNED_5:
3731
      if (val > 31 || val < 0)
3732
        as_bad_where (fixP->fx_file, fixP->fx_line,
3733
                      _("Value not in 5 bit unsigned range: %ld"), val);
3734
      bufp[0] |= val & 0x1F;
3735
      break;
3736
 
3737
    case BFD_RELOC_CRIS_SIGNED_6:
3738
      if (val > 31 || val < -32)
3739
        as_bad_where (fixP->fx_file, fixP->fx_line,
3740
                      _("Value not in 6 bit range: %ld"), val);
3741
      bufp[0] |= val & 0x3F;
3742
      break;
3743
 
3744
    case BFD_RELOC_CRIS_UNSIGNED_6:
3745
      if (val > 63 || val < 0)
3746
        as_bad_where (fixP->fx_file, fixP->fx_line,
3747
                      _("Value not in 6 bit unsigned range: %ld"), val);
3748
      bufp[0] |= val & 0x3F;
3749
      break;
3750
 
3751
    case BFD_RELOC_CRIS_BDISP8:
3752
      bufp[0] = branch_disp (val);
3753
      break;
3754
 
3755
    case BFD_RELOC_NONE:
3756
      /* May actually happen automatically.  For example at broken
3757
         words, if the word turns out not to be broken.
3758
         FIXME: When?  Which testcase?  */
3759
      if (! fixP->fx_addsy)
3760
        md_number_to_chars (bufp, val, n);
3761
      break;
3762
 
3763
    case BFD_RELOC_VTABLE_INHERIT:
3764
      /* This borrowed from tc-ppc.c on a whim.  */
3765
      if (fixP->fx_addsy
3766
          && !S_IS_DEFINED (fixP->fx_addsy)
3767
          && !S_IS_WEAK (fixP->fx_addsy))
3768
        S_SET_WEAK (fixP->fx_addsy);
3769
      /* Fall through.  */
3770
 
3771
    case BFD_RELOC_VTABLE_ENTRY:
3772
      fixP->fx_done = 0;
3773
      break;
3774
 
3775
    default:
3776
      BAD_CASE (fixP->fx_r_type);
3777
    }
3778
}
3779
 
3780
/* Processes machine-dependent command line options.  Called once for
3781
   each option on the command line that the machine-independent part of
3782
   GAS does not understand.  */
3783
 
3784
int
3785
md_parse_option (int arg, char *argp ATTRIBUTE_UNUSED)
3786
{
3787
  switch (arg)
3788
    {
3789
    case 'H':
3790
    case 'h':
3791
      printf (_("Please use --help to see usage and options for this assembler.\n"));
3792
      md_show_usage (stdout);
3793
      exit (EXIT_SUCCESS);
3794
 
3795
    case 'N':
3796
      warn_for_branch_expansion = 1;
3797
      break;
3798
 
3799
    case OPTION_NO_US:
3800
      demand_register_prefix = TRUE;
3801
 
3802
      if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
3803
        as_bad (_("--no-underscore is invalid with a.out format"));
3804
      else
3805
        symbols_have_leading_underscore = FALSE;
3806
      break;
3807
 
3808
    case OPTION_US:
3809
      demand_register_prefix = FALSE;
3810
      symbols_have_leading_underscore = TRUE;
3811
      break;
3812
 
3813
    case OPTION_PIC:
3814
      if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
3815
        as_bad (_("--pic is invalid for this object format"));
3816
      pic = TRUE;
3817
      if (cris_arch != arch_crisv32)
3818
        md_long_jump_size = cris_any_v0_v10_long_jump_size_pic;
3819
      else
3820
        md_long_jump_size = crisv32_long_jump_size;
3821
      break;
3822
 
3823
    case OPTION_ARCH:
3824
      {
3825
        char *str = argp;
3826
        enum cris_archs argarch = cris_arch_from_string (&str);
3827
 
3828
        if (argarch == arch_cris_unknown)
3829
            as_bad (_("invalid <arch> in --march=<arch>: %s"), argp);
3830
        else
3831
          cris_arch = argarch;
3832
 
3833
        if (argarch == arch_crisv32)
3834
          {
3835
            err_for_dangerous_mul_placement = 0;
3836
            md_long_jump_size = crisv32_long_jump_size;
3837
          }
3838
        else
3839
          {
3840
            if (pic)
3841
              md_long_jump_size = cris_any_v0_v10_long_jump_size_pic;
3842
            else
3843
              md_long_jump_size = cris_any_v0_v10_long_jump_size;
3844
          }
3845
      }
3846
      break;
3847
 
3848
    case OPTION_MULBUG_ABORT_OFF:
3849
      err_for_dangerous_mul_placement = 0;
3850
      break;
3851
 
3852
    case OPTION_MULBUG_ABORT_ON:
3853
      err_for_dangerous_mul_placement = 1;
3854
      break;
3855
 
3856
    default:
3857
      return 0;
3858
    }
3859
 
3860
  return 1;
3861
}
3862
 
3863
/* Round up a section size to the appropriate boundary.  */
3864
valueT
3865
md_section_align (segT segment, valueT size)
3866
{
3867
  /* Round all sects to multiple of 4, except the bss section, which
3868
     we'll round to word-size.
3869
 
3870
     FIXME: Check if this really matters.  All sections should be
3871
     rounded up, and all sections should (optionally) be assumed to be
3872
     dword-aligned, it's just that there is actual usage of linking to a
3873
     multiple of two.  */
3874
  if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
3875
    {
3876
      if (segment == bss_section)
3877
        return (size + 1) & ~1;
3878
      return (size + 3) & ~3;
3879
    }
3880
  else
3881
    {
3882
      /* FIXME: Is this wanted?  It matches the testsuite, but that's not
3883
         really a valid reason.  */
3884
      if (segment == text_section)
3885
        return (size + 3) & ~3;
3886
    }
3887
 
3888
  return size;
3889
}
3890
 
3891
/* Generate a machine-dependent relocation.  */
3892
arelent *
3893
tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixP)
3894
{
3895
  arelent *relP;
3896
  bfd_reloc_code_real_type code;
3897
 
3898
  switch (fixP->fx_r_type)
3899
    {
3900
    case BFD_RELOC_CRIS_SIGNED_8:
3901
      code = BFD_RELOC_8;
3902
      break;
3903
 
3904
    case BFD_RELOC_CRIS_SIGNED_16:
3905
      code = BFD_RELOC_16;
3906
      break;
3907
 
3908
    case BFD_RELOC_CRIS_16_GOT:
3909
    case BFD_RELOC_CRIS_32_GOT:
3910
    case BFD_RELOC_CRIS_16_GOTPLT:
3911
    case BFD_RELOC_CRIS_32_GOTPLT:
3912
    case BFD_RELOC_CRIS_32_GOTREL:
3913
    case BFD_RELOC_CRIS_32_PLT_GOTREL:
3914
    case BFD_RELOC_CRIS_32_PLT_PCREL:
3915
    case BFD_RELOC_32:
3916
    case BFD_RELOC_32_PCREL:
3917
    case BFD_RELOC_16:
3918
    case BFD_RELOC_8:
3919
    case BFD_RELOC_VTABLE_INHERIT:
3920
    case BFD_RELOC_VTABLE_ENTRY:
3921
    case BFD_RELOC_CRIS_UNSIGNED_8:
3922
    case BFD_RELOC_CRIS_UNSIGNED_16:
3923
    case BFD_RELOC_CRIS_LAPCQ_OFFSET:
3924
    case BFD_RELOC_CRIS_32_GOT_GD:
3925
    case BFD_RELOC_CRIS_16_GOT_GD:
3926
    case BFD_RELOC_CRIS_32_GD:
3927
    case BFD_RELOC_CRIS_32_IE:
3928
    case BFD_RELOC_CRIS_32_DTPREL:
3929
    case BFD_RELOC_CRIS_16_DTPREL:
3930
    case BFD_RELOC_CRIS_32_GOT_TPREL:
3931
    case BFD_RELOC_CRIS_16_GOT_TPREL:
3932
    case BFD_RELOC_CRIS_32_TPREL:
3933
    case BFD_RELOC_CRIS_16_TPREL:
3934
      code = fixP->fx_r_type;
3935
      break;
3936
    default:
3937
      as_bad_where (fixP->fx_file, fixP->fx_line,
3938
                    _("Semantics error.  This type of operand can not be relocated, it must be an assembly-time constant"));
3939
      return 0;
3940
    }
3941
 
3942
  relP = (arelent *) xmalloc (sizeof (arelent));
3943
  gas_assert (relP != 0);
3944
  relP->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
3945
  *relP->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy);
3946
  relP->address = fixP->fx_frag->fr_address + fixP->fx_where;
3947
 
3948
  relP->addend = fixP->fx_offset;
3949
 
3950
  /* This is the standard place for KLUDGEs to work around bugs in
3951
     bfd_install_relocation (first such note in the documentation
3952
     appears with binutils-2.8).
3953
 
3954
     That function bfd_install_relocation does the wrong thing with
3955
     putting stuff into the addend of a reloc (it should stay out) for a
3956
     weak symbol.  The really bad thing is that it adds the
3957
     "segment-relative offset" of the symbol into the reloc.  In this
3958
     case, the reloc should instead be relative to the symbol with no
3959
     other offset than the assembly code shows; and since the symbol is
3960
     weak, any local definition should be ignored until link time (or
3961
     thereafter).
3962
     To wit:  weaksym+42  should be weaksym+42 in the reloc,
3963
     not weaksym+(offset_from_segment_of_local_weaksym_definition)
3964
 
3965
     To "work around" this, we subtract the segment-relative offset of
3966
     "known" weak symbols.  This evens out the extra offset.
3967
 
3968
     That happens for a.out but not for ELF, since for ELF,
3969
     bfd_install_relocation uses the "special function" field of the
3970
     howto, and does not execute the code that needs to be undone.  */
3971
 
3972
  if (OUTPUT_FLAVOR == bfd_target_aout_flavour
3973
      && fixP->fx_addsy && S_IS_WEAK (fixP->fx_addsy)
3974
      && ! bfd_is_und_section (S_GET_SEGMENT (fixP->fx_addsy)))
3975
    {
3976
      relP->addend -= S_GET_VALUE (fixP->fx_addsy);
3977
    }
3978
 
3979
  relP->howto = bfd_reloc_type_lookup (stdoutput, code);
3980
  if (! relP->howto)
3981
    {
3982
      const char *name;
3983
 
3984
      name = S_GET_NAME (fixP->fx_addsy);
3985
      if (name == NULL)
3986
        name = _("<unknown>");
3987
      as_fatal (_("Cannot generate relocation type for symbol %s, code %s"),
3988
                name, bfd_get_reloc_code_name (code));
3989
    }
3990
 
3991
  return relP;
3992
}
3993
 
3994
/* Machine-dependent usage-output.  */
3995
 
3996
void
3997
md_show_usage (FILE *stream)
3998
{
3999
  /* The messages are formatted to line up with the generic options.  */
4000
  fprintf (stream, _("CRIS-specific options:\n"));
4001
  fprintf (stream, "%s",
4002
           _("  -h, -H                  Don't execute, print this help text.  Deprecated.\n"));
4003
  fprintf (stream, "%s",
4004
           _("  -N                      Warn when branches are expanded to jumps.\n"));
4005
  fprintf (stream, "%s",
4006
           _("  --underscore            User symbols are normally prepended with underscore.\n"));
4007
  fprintf (stream, "%s",
4008
           _("                          Registers will not need any prefix.\n"));
4009
  fprintf (stream, "%s",
4010
           _("  --no-underscore         User symbols do not have any prefix.\n"));
4011
  fprintf (stream, "%s",
4012
           _("                          Registers will require a `$'-prefix.\n"));
4013
#if defined (OBJ_ELF) || defined (OBJ_MAYBE_ELF)
4014
  fprintf (stream, "%s",
4015
           _("  --pic                   Enable generation of position-independent code.\n"));
4016
#endif
4017
  fprintf (stream, "%s",
4018
           _("  --march=<arch>          Generate code for <arch>.  Valid choices for <arch>\n\
4019
                                are v0_v10, v10, v32 and common_v10_v32.\n"));
4020
}
4021
 
4022
/* Apply a fixS (fixup of an instruction or data that we didn't have
4023
   enough info to complete immediately) to the data in a frag.  */
4024
 
4025
void
4026
md_apply_fix (fixS *fixP, valueT *valP, segT seg)
4027
{
4028
  /* This assignment truncates upper bits if valueT is 64 bits (as with
4029
     --enable-64-bit-bfd), which is fine here, though we cast to avoid
4030
     any compiler warnings.  */
4031
  long val = (long) *valP;
4032
  char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
4033
 
4034
  if (fixP->fx_addsy == 0 && !fixP->fx_pcrel)
4035
    fixP->fx_done = 1;
4036
 
4037
  if (fixP->fx_bit_fixP || fixP->fx_im_disp != 0)
4038
    {
4039
      as_bad_where (fixP->fx_file, fixP->fx_line, _("Invalid relocation"));
4040
      fixP->fx_done = 1;
4041
    }
4042
  else
4043
    {
4044
      /* We can't actually support subtracting a symbol.  */
4045
      if (fixP->fx_subsy != (symbolS *) NULL)
4046
        as_bad_where (fixP->fx_file, fixP->fx_line,
4047
                      _("expression too complex"));
4048
 
4049
      /* This operand-type is scaled.  */
4050
      if (fixP->fx_r_type == BFD_RELOC_CRIS_LAPCQ_OFFSET)
4051
        val /= 2;
4052
      cris_number_to_imm (buf, val, fixP->fx_size, fixP, seg);
4053
    }
4054
}
4055
 
4056
/* All relocations are relative to the location just after the fixup;
4057
   the address of the fixup plus its size.  */
4058
 
4059
long
4060
md_pcrel_from (fixS *fixP)
4061
{
4062
  valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
4063
 
4064
  /* FIXME:  We get here only at the end of assembly, when X in ".-X" is
4065
     still unknown.  Since we don't have pc-relative relocations in a.out,
4066
     this is invalid.  What to do if anything for a.out, is to add
4067
     pc-relative relocations everywhere including the elinux program
4068
     loader.  For ELF, allow straight-forward PC-relative relocations,
4069
     which are always relative to the location after the relocation.  */
4070
  if (OUTPUT_FLAVOR != bfd_target_elf_flavour
4071
      || (fixP->fx_r_type != BFD_RELOC_8_PCREL
4072
          && fixP->fx_r_type != BFD_RELOC_16_PCREL
4073
          && fixP->fx_r_type != BFD_RELOC_32_PCREL
4074
          && fixP->fx_r_type != BFD_RELOC_CRIS_LAPCQ_OFFSET))
4075
    as_bad_where (fixP->fx_file, fixP->fx_line,
4076
                  _("Invalid pc-relative relocation"));
4077
  return fixP->fx_size + addr;
4078
}
4079
 
4080
/* We have no need to give defaults for symbol-values.  */
4081
symbolS *
4082
md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
4083
{
4084
  return 0;
4085
}
4086
 
4087
/* If this function returns non-zero, it prevents the relocation
4088
   against symbol(s) in the FIXP from being replaced with relocations
4089
   against section symbols, and guarantees that a relocation will be
4090
   emitted even when the value can be resolved locally.  */
4091
int
4092
md_cris_force_relocation (struct fix *fixp)
4093
{
4094
  switch (fixp->fx_r_type)
4095
    {
4096
    case BFD_RELOC_CRIS_16_GOT:
4097
    case BFD_RELOC_CRIS_32_GOT:
4098
    case BFD_RELOC_CRIS_16_GOTPLT:
4099
    case BFD_RELOC_CRIS_32_GOTPLT:
4100
    case BFD_RELOC_CRIS_32_GOTREL:
4101
    case BFD_RELOC_CRIS_32_PLT_GOTREL:
4102
    case BFD_RELOC_CRIS_32_PLT_PCREL:
4103
      return 1;
4104
    default:
4105
      ;
4106
    }
4107
 
4108
  return generic_force_reloc (fixp);
4109
}
4110
 
4111
/* Check and emit error if broken-word handling has failed to fix up a
4112
   case-table.  This is called from write.c, after doing everything it
4113
   knows about how to handle broken words.  */
4114
 
4115
void
4116
tc_cris_check_adjusted_broken_word (offsetT new_offset, struct broken_word *brokwP)
4117
{
4118
  if (new_offset > 32767 || new_offset < -32768)
4119
    /* We really want a genuine error, not a warning, so make it one.  */
4120
    as_bad_where (brokwP->frag->fr_file, brokwP->frag->fr_line,
4121
                  _("Adjusted signed .word (%ld) overflows: `switch'-statement too large."),
4122
                  (long) new_offset);
4123
}
4124
 
4125
/* Make a leading REGISTER_PREFIX_CHAR mandatory for all registers.  */
4126
 
4127
static void
4128
cris_force_reg_prefix (void)
4129
{
4130
  demand_register_prefix = TRUE;
4131
}
4132
 
4133
/* Do not demand a leading REGISTER_PREFIX_CHAR for all registers.  */
4134
 
4135
static void
4136
cris_relax_reg_prefix (void)
4137
{
4138
  demand_register_prefix = FALSE;
4139
}
4140
 
4141
/* Adjust for having a leading '_' on all user symbols.  */
4142
 
4143
static void
4144
cris_sym_leading_underscore (void)
4145
{
4146
  /* We can't really do anything more than assert that what the program
4147
     thinks symbol starts with agrees with the command-line options, since
4148
     the bfd is already created.  */
4149
 
4150
  if (!symbols_have_leading_underscore)
4151
    as_bad (_(".syntax %s requires command-line option `--underscore'"),
4152
            SYNTAX_USER_SYM_LEADING_UNDERSCORE);
4153
}
4154
 
4155
/* Adjust for not having any particular prefix on user symbols.  */
4156
 
4157
static void cris_sym_no_leading_underscore (void)
4158
{
4159
  if (symbols_have_leading_underscore)
4160
    as_bad (_(".syntax %s requires command-line option `--no-underscore'"),
4161
            SYNTAX_USER_SYM_NO_LEADING_UNDERSCORE);
4162
}
4163
 
4164
/* Handle the .syntax pseudo, which takes an argument that decides what
4165
   syntax the assembly code has.  */
4166
 
4167
static void
4168
s_syntax (int ignore ATTRIBUTE_UNUSED)
4169
{
4170
  static const struct syntaxes
4171
  {
4172
    const char *const operand;
4173
    void (*fn) (void);
4174
  } syntax_table[] =
4175
    {{SYNTAX_ENFORCE_REG_PREFIX, cris_force_reg_prefix},
4176
     {SYNTAX_RELAX_REG_PREFIX, cris_relax_reg_prefix},
4177
     {SYNTAX_USER_SYM_LEADING_UNDERSCORE, cris_sym_leading_underscore},
4178
     {SYNTAX_USER_SYM_NO_LEADING_UNDERSCORE, cris_sym_no_leading_underscore}};
4179
 
4180
  const struct syntaxes *sp;
4181
 
4182
  for (sp = syntax_table;
4183
       sp < syntax_table + sizeof (syntax_table) / sizeof (syntax_table[0]);
4184
       sp++)
4185
    {
4186
      if (strncmp (input_line_pointer, sp->operand,
4187
                   strlen (sp->operand)) == 0)
4188
        {
4189
          (sp->fn) ();
4190
 
4191
          input_line_pointer += strlen (sp->operand);
4192
          demand_empty_rest_of_line ();
4193
          return;
4194
        }
4195
    }
4196
 
4197
  as_bad (_("Unknown .syntax operand"));
4198
}
4199
 
4200
/* Wrapper for dwarf2_directive_file to emit error if this is seen when
4201
   not emitting ELF.  */
4202
 
4203
static void
4204
s_cris_file (int dummy)
4205
{
4206
  if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
4207
    as_bad (_("Pseudodirective .file is only valid when generating ELF"));
4208
  else
4209
    dwarf2_directive_file (dummy);
4210
}
4211
 
4212
/* Wrapper for dwarf2_directive_loc to emit error if this is seen when not
4213
   emitting ELF.  */
4214
 
4215
static void
4216
s_cris_loc (int dummy)
4217
{
4218
  if (OUTPUT_FLAVOR != bfd_target_elf_flavour)
4219
    as_bad (_("Pseudodirective .loc is only valid when generating ELF"));
4220
  else
4221
    dwarf2_directive_loc (dummy);
4222
}
4223
 
4224
/* Worker for .dtpoffd: generate a R_CRIS_32_DTPREL reloc, as for
4225
   expr:DTPREL but for use in debug info.  */
4226
 
4227
static void
4228
s_cris_dtpoff (int bytes)
4229
{
4230
  expressionS ex;
4231
  char *p;
4232
 
4233
  if (bytes != 4)
4234
    as_fatal (_("internal inconsistency problem: %s called for %d bytes"),
4235
              __FUNCTION__, bytes);
4236
 
4237
  expression (&ex);
4238
 
4239
  p = frag_more (bytes);
4240
  md_number_to_chars (p, 0, bytes);
4241
  fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
4242
               BFD_RELOC_CRIS_32_DTPREL);
4243
 
4244
  demand_empty_rest_of_line ();
4245
}
4246
 
4247
 
4248
/* Translate a <arch> string (as common to --march=<arch> and .arch <arch>)
4249
   into an enum.  If the string *STR is recognized, *STR is updated to point
4250
   to the end of the string.  If the string is not recognized,
4251
   arch_cris_unknown is returned.  */
4252
 
4253
static enum cris_archs
4254
cris_arch_from_string (char **str)
4255
{
4256
  static const struct cris_arch_struct
4257
  {
4258
    const char *const name;
4259
    enum cris_archs arch;
4260
  } arch_table[] =
4261
      /* Keep in order longest-first for choices where one is a prefix
4262
         of another.  */
4263
    {{"v0_v10", arch_cris_any_v0_v10},
4264
     {"v10", arch_crisv10},
4265
     {"v32", arch_crisv32},
4266
     {"common_v10_v32", arch_cris_common_v10_v32}};
4267
 
4268
  const struct cris_arch_struct *ap;
4269
 
4270
  for (ap = arch_table;
4271
       ap < arch_table + sizeof (arch_table) / sizeof (arch_table[0]);
4272
       ap++)
4273
    {
4274
      int len = strlen (ap->name);
4275
 
4276
      if (strncmp (*str, ap->name, len) == 0
4277
          && (str[0][len] == 0 || ISSPACE (str[0][len])))
4278
        {
4279
          *str += strlen (ap->name);
4280
          return ap->arch;
4281
        }
4282
    }
4283
 
4284
  return arch_cris_unknown;
4285
}
4286
 
4287
/* Return nonzero if architecture version ARCH matches version range in
4288
   IVER.  */
4289
 
4290
static int
4291
cris_insn_ver_valid_for_arch (enum cris_insn_version_usage iver,
4292
                              enum cris_archs arch)
4293
{
4294
  switch (arch)
4295
    {
4296
    case arch_cris_any_v0_v10:
4297
      return
4298
        (iver == cris_ver_version_all
4299
         || iver == cris_ver_warning
4300
         || iver == cris_ver_v0_3
4301
         || iver == cris_ver_v3p
4302
         || iver == cris_ver_v0_10
4303
         || iver == cris_ver_sim_v0_10
4304
         || iver == cris_ver_v3_10
4305
         || iver == cris_ver_v8
4306
         || iver == cris_ver_v8p
4307
         || iver == cris_ver_v8_10
4308
         || iver == cris_ver_v10
4309
         || iver == cris_ver_v10p);
4310
 
4311
    case arch_crisv32:
4312
      return
4313
        (iver == cris_ver_version_all
4314
         || iver == cris_ver_v3p
4315
         || iver == cris_ver_v8p
4316
         || iver == cris_ver_v10p
4317
         || iver == cris_ver_v32p);
4318
 
4319
    case arch_cris_common_v10_v32:
4320
      return
4321
        (iver == cris_ver_version_all
4322
         || iver == cris_ver_v3p
4323
         || iver == cris_ver_v8p
4324
         || iver == cris_ver_v10p);
4325
 
4326
    case arch_crisv0:
4327
      return
4328
        (iver == cris_ver_version_all
4329
         || iver == cris_ver_v0_3
4330
         || iver == cris_ver_v0_10
4331
         || iver == cris_ver_sim_v0_10);
4332
 
4333
    case arch_crisv3:
4334
      return
4335
        (iver == cris_ver_version_all
4336
         || iver == cris_ver_v0_3
4337
         || iver == cris_ver_v3p
4338
         || iver == cris_ver_v0_10
4339
         || iver == cris_ver_sim_v0_10
4340
         || iver == cris_ver_v3_10);
4341
 
4342
    case arch_crisv8:
4343
      return
4344
        (iver == cris_ver_version_all
4345
         || iver == cris_ver_v3p
4346
         || iver == cris_ver_v0_10
4347
         || iver == cris_ver_sim_v0_10
4348
         || iver == cris_ver_v3_10
4349
         || iver == cris_ver_v8
4350
         || iver == cris_ver_v8p
4351
         || iver == cris_ver_v8_10);
4352
 
4353
    case arch_crisv10:
4354
      return
4355
        (iver == cris_ver_version_all
4356
         || iver == cris_ver_v3p
4357
         || iver == cris_ver_v0_10
4358
         || iver == cris_ver_sim_v0_10
4359
         || iver == cris_ver_v3_10
4360
         || iver == cris_ver_v8p
4361
         || iver == cris_ver_v8_10
4362
         || iver == cris_ver_v10
4363
         || iver == cris_ver_v10p);
4364
 
4365
    default:
4366
      BAD_CASE (arch);
4367
   }
4368
}
4369
 
4370
/* Assert that the .arch ARCHCHOICE1 is compatible with the specified or
4371
   default --march=<ARCHCHOICE2> option.  */
4372
 
4373
static void
4374
s_cris_arch (int dummy ATTRIBUTE_UNUSED)
4375
{
4376
  /* Right now we take the easy route and check for sameness.  It's not
4377
     obvious that allowing e.g. --march=v32 and .arch common_v0_v32
4378
     would be more useful than confusing, implementation-wise and
4379
     user-wise.  */
4380
 
4381
  char *str = input_line_pointer;
4382
  enum cris_archs arch = cris_arch_from_string (&str);
4383
 
4384
  if (arch == arch_cris_unknown)
4385
    {
4386
      as_bad (_("unknown operand to .arch"));
4387
 
4388
      /* For this one, str does not reflect the end of the operand,
4389
         since there was no matching arch.  Skip it manually; skip
4390
         things that can be part of a word (a name).  */
4391
      while (is_part_of_name (*str))
4392
        str++;
4393
    }
4394
  else if (arch != cris_arch)
4395
    as_bad (_(".arch <arch> requires a matching --march=... option"));
4396
 
4397
  input_line_pointer = str;
4398
  demand_empty_rest_of_line ();
4399
  return;
4400
}
4401
 
4402
/*
4403
 * Local variables:
4404
 * eval: (c-set-style "gnu")
4405
 * indent-tabs-mode: t
4406
 * End:
4407
 */

powered by: WebSVN 2.1.0

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