~angelsl/ubuntu/wily/binutils/mips-cross

« back to all changes in this revision

Viewing changes to bfd/cpu-m68k.c

  • Committer: angelsl
  • Date: 2015-11-03 15:54:40 UTC
  • Revision ID: angelsl-20151103155440-gbh6qo1olzlvaiqs
Import

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* BFD library support routines for architectures.
 
2
   Copyright (C) 1990-2014 Free Software Foundation, Inc.
 
3
   Hacked by Steve Chamberlain of Cygnus Support.
 
4
 
 
5
   This file is part of BFD, the Binary File Descriptor library.
 
6
 
 
7
   This program is free software; you can redistribute it and/or modify
 
8
   it under the terms of the GNU General Public License as published by
 
9
   the Free Software Foundation; either version 3 of the License, or
 
10
   (at your option) any later version.
 
11
 
 
12
   This program is distributed in the hope that it will be useful,
 
13
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 
14
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
15
   GNU General Public License for more details.
 
16
 
 
17
   You should have received a copy of the GNU General Public License
 
18
   along with this program; if not, write to the Free Software
 
19
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
 
20
   MA 02110-1301, USA.  */
 
21
 
 
22
#include "sysdep.h"
 
23
#include "bfd.h"
 
24
#include "libbfd.h"
 
25
#include "opcode/m68k.h"
 
26
 
 
27
static const bfd_arch_info_type *
 
28
bfd_m68k_compatible (const bfd_arch_info_type *a,
 
29
                     const bfd_arch_info_type *b);
 
30
 
 
31
#define N(name, print,d,next)  \
 
32
{  32, 32, 8, bfd_arch_m68k, name, "m68k",print,2,d,bfd_m68k_compatible, \
 
33
   bfd_default_scan, bfd_arch_default_fill, next, }
 
34
 
 
35
static const bfd_arch_info_type arch_info_struct[] =
 
36
  {
 
37
    N(bfd_mach_m68000,  "m68k:68000", FALSE, &arch_info_struct[1]),
 
38
    N(bfd_mach_m68008,  "m68k:68008", FALSE, &arch_info_struct[2]),
 
39
    N(bfd_mach_m68010,  "m68k:68010", FALSE, &arch_info_struct[3]),
 
40
    N(bfd_mach_m68020,  "m68k:68020", FALSE, &arch_info_struct[4]),
 
41
    N(bfd_mach_m68030,  "m68k:68030", FALSE, &arch_info_struct[5]),
 
42
    N(bfd_mach_m68040,  "m68k:68040", FALSE, &arch_info_struct[6]),
 
43
    N(bfd_mach_m68060,  "m68k:68060", FALSE, &arch_info_struct[7]),
 
44
    N(bfd_mach_cpu32,   "m68k:cpu32", FALSE, &arch_info_struct[8]),
 
45
    N(bfd_mach_fido,    "m68k:fido",  FALSE, &arch_info_struct[9]),
 
46
 
 
47
    /* Various combinations of CF architecture features */
 
48
    N(bfd_mach_mcf_isa_a_nodiv, "m68k:isa-a:nodiv",
 
49
      FALSE, &arch_info_struct[10]),
 
50
    N(bfd_mach_mcf_isa_a, "m68k:isa-a",
 
51
      FALSE, &arch_info_struct[11]),
 
52
    N(bfd_mach_mcf_isa_a_mac, "m68k:isa-a:mac",
 
53
      FALSE, &arch_info_struct[12]),
 
54
    N(bfd_mach_mcf_isa_a_emac, "m68k:isa-a:emac",
 
55
      FALSE, &arch_info_struct[13]),
 
56
    N(bfd_mach_mcf_isa_aplus, "m68k:isa-aplus",
 
57
      FALSE, &arch_info_struct[14]),
 
58
    N(bfd_mach_mcf_isa_aplus_mac, "m68k:isa-aplus:mac",
 
59
      FALSE, &arch_info_struct[15]),
 
60
    N(bfd_mach_mcf_isa_aplus_emac, "m68k:isa-aplus:emac",
 
61
      FALSE, &arch_info_struct[16]),
 
62
    N(bfd_mach_mcf_isa_b_nousp, "m68k:isa-b:nousp",
 
63
      FALSE, &arch_info_struct[17]),
 
64
    N(bfd_mach_mcf_isa_b_nousp_mac, "m68k:isa-b:nousp:mac",
 
65
      FALSE, &arch_info_struct[18]),
 
66
    N(bfd_mach_mcf_isa_b_nousp_emac, "m68k:isa-b:nousp:emac",
 
67
      FALSE, &arch_info_struct[19]),
 
68
    N(bfd_mach_mcf_isa_b, "m68k:isa-b",
 
69
      FALSE, &arch_info_struct[20]),
 
70
    N(bfd_mach_mcf_isa_b_mac, "m68k:isa-b:mac",
 
71
      FALSE, &arch_info_struct[21]),
 
72
    N(bfd_mach_mcf_isa_b_emac, "m68k:isa-b:emac",
 
73
      FALSE, &arch_info_struct[22]),
 
74
    N(bfd_mach_mcf_isa_b_float, "m68k:isa-b:float",
 
75
      FALSE, &arch_info_struct[23]),
 
76
    N(bfd_mach_mcf_isa_b_float_mac, "m68k:isa-b:float:mac",
 
77
      FALSE, &arch_info_struct[24]),
 
78
    N(bfd_mach_mcf_isa_b_float_emac, "m68k:isa-b:float:emac",
 
79
      FALSE, &arch_info_struct[25]),
 
80
    N(bfd_mach_mcf_isa_c, "m68k:isa-c",
 
81
      FALSE, &arch_info_struct[26]),
 
82
    N(bfd_mach_mcf_isa_c_mac, "m68k:isa-c:mac",
 
83
      FALSE, &arch_info_struct[27]),
 
84
    N(bfd_mach_mcf_isa_c_emac, "m68k:isa-c:emac",
 
85
      FALSE, &arch_info_struct[28]),
 
86
    N(bfd_mach_mcf_isa_c_nodiv, "m68k:isa-c:nodiv",
 
87
      FALSE, &arch_info_struct[29]),
 
88
    N(bfd_mach_mcf_isa_c_nodiv_mac, "m68k:isa-c:nodiv:mac",
 
89
      FALSE, &arch_info_struct[30]),
 
90
    N(bfd_mach_mcf_isa_c_nodiv_emac, "m68k:isa-c:nodiv:emac",
 
91
      FALSE, &arch_info_struct[31]),
 
92
 
 
93
    /* Legacy names for CF architectures */
 
94
    N(bfd_mach_mcf_isa_a_nodiv, "m68k:5200", FALSE, &arch_info_struct[32]),
 
95
    N(bfd_mach_mcf_isa_a_mac,"m68k:5206e", FALSE, &arch_info_struct[33]),
 
96
    N(bfd_mach_mcf_isa_a_mac, "m68k:5307", FALSE, &arch_info_struct[34]),
 
97
    N(bfd_mach_mcf_isa_b_nousp_mac, "m68k:5407", FALSE, &arch_info_struct[35]),
 
98
    N(bfd_mach_mcf_isa_aplus_emac, "m68k:528x", FALSE, &arch_info_struct[36]),
 
99
    N(bfd_mach_mcf_isa_aplus_emac, "m68k:521x", FALSE, &arch_info_struct[37]),
 
100
    N(bfd_mach_mcf_isa_a_emac, "m68k:5249", FALSE, &arch_info_struct[38]),
 
101
    N(bfd_mach_mcf_isa_b_float_emac, "m68k:547x",
 
102
      FALSE, &arch_info_struct[39]),
 
103
    N(bfd_mach_mcf_isa_b_float_emac, "m68k:548x",
 
104
      FALSE, &arch_info_struct[40]),
 
105
    N(bfd_mach_mcf_isa_b_float_emac, "m68k:cfv4e", FALSE, 0),
 
106
  };
 
107
 
 
108
const bfd_arch_info_type bfd_m68k_arch =
 
109
  N(0, "m68k", TRUE, &arch_info_struct[0]);
 
110
 
 
111
/* Table indexed by bfd_mach_arch number indicating which
 
112
   architectural features are supported.  */
 
113
static const unsigned m68k_arch_features[] =
 
114
{
 
115
  0,
 
116
  m68000|m68881|m68851,
 
117
  m68000|m68881|m68851,
 
118
  m68010|m68881|m68851,
 
119
  m68020|m68881|m68851,
 
120
  m68030|m68881|m68851,
 
121
  m68040|m68881|m68851,
 
122
  m68060|m68881|m68851,
 
123
  cpu32|m68881,
 
124
  fido_a|m68881,
 
125
  mcfisa_a,
 
126
  mcfisa_a|mcfhwdiv,
 
127
  mcfisa_a|mcfhwdiv|mcfmac,
 
128
  mcfisa_a|mcfhwdiv|mcfemac,
 
129
  mcfisa_a|mcfisa_aa|mcfhwdiv|mcfusp,
 
130
  mcfisa_a|mcfisa_aa|mcfhwdiv|mcfusp|mcfmac,
 
131
  mcfisa_a|mcfisa_aa|mcfhwdiv|mcfusp|mcfemac,
 
132
  mcfisa_a|mcfhwdiv|mcfisa_b,
 
133
  mcfisa_a|mcfhwdiv|mcfisa_b|mcfmac,
 
134
  mcfisa_a|mcfhwdiv|mcfisa_b|mcfemac,
 
135
  mcfisa_a|mcfhwdiv|mcfisa_b|mcfusp,
 
136
  mcfisa_a|mcfhwdiv|mcfisa_b|mcfusp|mcfmac,
 
137
  mcfisa_a|mcfhwdiv|mcfisa_b|mcfusp|mcfemac,
 
138
  mcfisa_a|mcfhwdiv|mcfisa_b|mcfusp|cfloat,
 
139
  mcfisa_a|mcfhwdiv|mcfisa_b|mcfusp|cfloat|mcfmac,
 
140
  mcfisa_a|mcfhwdiv|mcfisa_b|mcfusp|cfloat|mcfemac,
 
141
  mcfisa_a|mcfhwdiv|mcfisa_c|mcfusp,
 
142
  mcfisa_a|mcfhwdiv|mcfisa_c|mcfusp|mcfmac,
 
143
  mcfisa_a|mcfhwdiv|mcfisa_c|mcfusp|mcfemac,
 
144
  mcfisa_a|mcfisa_c|mcfusp,
 
145
  mcfisa_a|mcfisa_c|mcfusp|mcfmac,
 
146
  mcfisa_a|mcfisa_c|mcfusp|mcfemac,
 
147
};
 
148
 
 
149
/* Return the count of bits set in MASK  */
 
150
static unsigned
 
151
bit_count (unsigned mask)
 
152
{
 
153
  unsigned ix;
 
154
 
 
155
  for (ix = 0; mask; ix++)
 
156
    /* Clear the LSB set */
 
157
    mask ^= mask & -mask;
 
158
  return ix;
 
159
}
 
160
 
 
161
/* Return the architectural features supported by MACH */
 
162
 
 
163
unsigned
 
164
bfd_m68k_mach_to_features (int mach)
 
165
{
 
166
  if ((unsigned)mach
 
167
      >= sizeof (m68k_arch_features) / sizeof (m68k_arch_features[0]))
 
168
    mach = 0;
 
169
  return m68k_arch_features[mach];
 
170
}
 
171
 
 
172
/* Return the bfd machine that most closely represents the
 
173
   architectural features.  We find the machine with the smallest
 
174
   number of additional features.  If there is no such machine, we
 
175
   find the one with the smallest number of missing features.  */
 
176
 
 
177
int bfd_m68k_features_to_mach (unsigned features)
 
178
{
 
179
  int superset = 0, subset = 0;
 
180
  unsigned extra = 99, missing = 99;
 
181
  unsigned ix;
 
182
 
 
183
  for (ix = 0;
 
184
       ix != sizeof (m68k_arch_features) / sizeof (m68k_arch_features[0]);
 
185
       ix++)
 
186
    {
 
187
      unsigned this_extra, this_missing;
 
188
 
 
189
      if (m68k_arch_features[ix] == features)
 
190
        return ix;
 
191
      this_extra = bit_count (m68k_arch_features[ix] & ~features);
 
192
      if (this_extra < extra)
 
193
        {
 
194
          extra = this_extra;
 
195
          superset = ix;
 
196
        }
 
197
 
 
198
      this_missing = bit_count (features & ~m68k_arch_features[ix]);
 
199
      if (this_missing < missing)
 
200
        {
 
201
          missing = this_missing;
 
202
          superset = ix;
 
203
        }
 
204
    }
 
205
  return superset ? superset : subset;
 
206
}
 
207
 
 
208
static const bfd_arch_info_type *
 
209
bfd_m68k_compatible (const bfd_arch_info_type *a,
 
210
                     const bfd_arch_info_type *b)
 
211
{
 
212
  if (a->arch != b->arch)
 
213
    return NULL;
 
214
 
 
215
  if (a->bits_per_word != b->bits_per_word)
 
216
    return NULL;
 
217
 
 
218
  if (!a->mach)
 
219
    return b;
 
220
  if (!b->mach)
 
221
    return a;
 
222
 
 
223
  if (a->mach <= bfd_mach_m68060 && b->mach <= bfd_mach_m68060)
 
224
    /* Merge m68k machine. */
 
225
    return a->mach > b->mach ? a : b;
 
226
  else if (a->mach >= bfd_mach_cpu32 && b->mach >= bfd_mach_cpu32)
 
227
    {
 
228
      /* Merge the machine features.  */
 
229
      unsigned features = (bfd_m68k_mach_to_features (a->mach)
 
230
                           | bfd_m68k_mach_to_features (b->mach));
 
231
 
 
232
      /* CPU32 and Coldfire are incompatible.  */
 
233
      if ((~features & (cpu32 | mcfisa_a)) == 0)
 
234
        return NULL;
 
235
 
 
236
      /* Fido and Coldfire are incompatible.  */
 
237
      if ((~features & (fido_a | mcfisa_a)) == 0)
 
238
        return NULL;
 
239
 
 
240
      /* ISA A+ and ISA B are incompatible.  */
 
241
      if ((~features & (mcfisa_aa | mcfisa_b)) == 0)
 
242
        return NULL;
 
243
 
 
244
      /* ISA B and ISA C are incompatible.  */
 
245
      if ((~features & (mcfisa_b | mcfisa_c)) == 0)
 
246
        return NULL;
 
247
 
 
248
      /* MAC and EMAC code cannot be merged.  */
 
249
      if ((~features & (mcfmac | mcfemac)) == 0)
 
250
        return NULL;
 
251
 
 
252
      /* CPU32 is compatible with Fido except that Fido does not
 
253
         support tbl instructions.  Warn when the user wants to mix
 
254
         the two.  */
 
255
      if ((a->mach == bfd_mach_cpu32 && b->mach == bfd_mach_fido)
 
256
          || (a->mach == bfd_mach_fido && b->mach == bfd_mach_cpu32))
 
257
        {
 
258
          static int cpu32_fido_mix_warning;
 
259
          if (!cpu32_fido_mix_warning)
 
260
            {
 
261
              cpu32_fido_mix_warning = 1;
 
262
              (*_bfd_error_handler) ("warning: linking CPU32 objects with fido objects");
 
263
            }
 
264
          return bfd_lookup_arch (a->arch,
 
265
                                  bfd_m68k_features_to_mach (fido_a | m68881));
 
266
        }
 
267
 
 
268
      return bfd_lookup_arch (a->arch, bfd_m68k_features_to_mach (features));
 
269
    }
 
270
  else
 
271
    /* They are incompatible.  */
 
272
    return NULL;
 
273
}