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

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [binutils-2.18.50/] [gas/] [config/] [tc-cris.c] - Blame information for rev 455

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

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

powered by: WebSVN 2.1.0

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