160484Sobrien/* BFD PowerPC CPU definition
2218822Sdim   Copyright 1994, 1995, 1996, 2000, 2001, 2002, 2003, 2007
391041Sobrien   Free Software Foundation, Inc.
460484Sobrien   Contributed by Ian Lance Taylor, Cygnus Support.
560484Sobrien
660484SobrienThis file is part of BFD, the Binary File Descriptor library.
760484Sobrien
860484SobrienThis program is free software; you can redistribute it and/or modify
960484Sobrienit under the terms of the GNU General Public License as published by
1060484Sobrienthe Free Software Foundation; either version 2 of the License, or
1160484Sobrien(at your option) any later version.
1260484Sobrien
1360484SobrienThis program is distributed in the hope that it will be useful,
1460484Sobrienbut WITHOUT ANY WARRANTY; without even the implied warranty of
1560484SobrienMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1660484SobrienGNU General Public License for more details.
1760484Sobrien
1860484SobrienYou should have received a copy of the GNU General Public License
1960484Sobrienalong with this program; if not, write to the Free Software
20218822SdimFoundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
2160484Sobrien
22218822Sdim#include "sysdep.h"
2360484Sobrien#include "bfd.h"
2460484Sobrien#include "libbfd.h"
2560484Sobrien
2660484Sobrien/* The common PowerPC architecture is compatible with the RS/6000.  */
2760484Sobrien
2860484Sobrienstatic const bfd_arch_info_type *powerpc_compatible
2960484Sobrien  PARAMS ((const bfd_arch_info_type *, const bfd_arch_info_type *));
3060484Sobrien
3160484Sobrienstatic const bfd_arch_info_type *
3260484Sobrienpowerpc_compatible (a,b)
3360484Sobrien     const bfd_arch_info_type *a;
3460484Sobrien     const bfd_arch_info_type *b;
3560484Sobrien{
3660484Sobrien  BFD_ASSERT (a->arch == bfd_arch_powerpc);
3760484Sobrien  switch (b->arch)
3860484Sobrien    {
3960484Sobrien    default:
4060484Sobrien      return NULL;
4160484Sobrien    case bfd_arch_powerpc:
4260484Sobrien      return bfd_default_compatible (a, b);
4360484Sobrien    case bfd_arch_rs6000:
44130561Sobrien      if (b->mach == bfd_mach_rs6k)
4560484Sobrien	return a;
4660484Sobrien      return NULL;
4760484Sobrien    }
4860484Sobrien  /*NOTREACHED*/
4960484Sobrien}
5060484Sobrien
5191041Sobrienconst bfd_arch_info_type bfd_powerpc_archs[] =
5260484Sobrien{
53104834Sobrien#if BFD_DEFAULT_TARGET_SIZE == 64
54104834Sobrien  /* Default arch must come first.  */
5560484Sobrien  {
5699461Sobrien    64,	/* 64 bits in a word */
5799461Sobrien    64,	/* 64 bits in an address */
5899461Sobrien    8,	/* 8 bits in a byte */
5999461Sobrien    bfd_arch_powerpc,
6099461Sobrien    bfd_mach_ppc64,
6199461Sobrien    "powerpc",
6299461Sobrien    "powerpc:common64",
6399461Sobrien    3,
64130561Sobrien    TRUE, /* default for 64 bit target */
6599461Sobrien    powerpc_compatible,
6699461Sobrien    bfd_default_scan,
6799461Sobrien    &bfd_powerpc_archs[1]
6899461Sobrien  },
69104834Sobrien  /* elf32-ppc:ppc_elf_object_p relies on the default 32 bit arch
70104834Sobrien     being immediately after the 64 bit default.  */
7199461Sobrien  {
7260484Sobrien    32,	/* 32 bits in a word */
7360484Sobrien    32,	/* 32 bits in an address */
7460484Sobrien    8,	/* 8 bits in a byte */
7560484Sobrien    bfd_arch_powerpc,
7699461Sobrien    bfd_mach_ppc, /* for the POWER/PowerPC common architecture */
7799461Sobrien    "powerpc",
7899461Sobrien    "powerpc:common",
7999461Sobrien    3,
80130561Sobrien    FALSE,
8199461Sobrien    powerpc_compatible,
8299461Sobrien    bfd_default_scan,
8399461Sobrien    &bfd_powerpc_archs[2],
8499461Sobrien  },
8599461Sobrien#else
86104834Sobrien  /* Default arch must come first.  */
8799461Sobrien  {
8899461Sobrien    32,	/* 32 bits in a word */
8999461Sobrien    32,	/* 32 bits in an address */
9099461Sobrien    8,	/* 8 bits in a byte */
9199461Sobrien    bfd_arch_powerpc,
9299461Sobrien    bfd_mach_ppc, /* for the POWER/PowerPC common architecture */
9399461Sobrien    "powerpc",
9499461Sobrien    "powerpc:common",
9599461Sobrien    3,
96130561Sobrien    TRUE, /* default for 32 bit target */
9799461Sobrien    powerpc_compatible,
9899461Sobrien    bfd_default_scan,
9999461Sobrien    &bfd_powerpc_archs[1],
10099461Sobrien  },
101104834Sobrien  /* elf64-ppc:ppc64_elf_object_p relies on the default 64 bit arch
102104834Sobrien     being immediately after the 32 bit default.  */
10399461Sobrien  {
10499461Sobrien    64,	/* 64 bits in a word */
10599461Sobrien    64,	/* 64 bits in an address */
10699461Sobrien    8,	/* 8 bits in a byte */
10799461Sobrien    bfd_arch_powerpc,
10899461Sobrien    bfd_mach_ppc64,
10999461Sobrien    "powerpc",
11099461Sobrien    "powerpc:common64",
11199461Sobrien    3,
112130561Sobrien    FALSE,
11399461Sobrien    powerpc_compatible,
11499461Sobrien    bfd_default_scan,
11599461Sobrien    &bfd_powerpc_archs[2]
11699461Sobrien  },
11799461Sobrien#endif
11899461Sobrien  {
11999461Sobrien    32,	/* 32 bits in a word */
12099461Sobrien    32,	/* 32 bits in an address */
12199461Sobrien    8,	/* 8 bits in a byte */
12299461Sobrien    bfd_arch_powerpc,
12377298Sobrien    bfd_mach_ppc_603,
12460484Sobrien    "powerpc",
12560484Sobrien    "powerpc:603",
12660484Sobrien    3,
127130561Sobrien    FALSE, /* not the default */
12877298Sobrien    powerpc_compatible,
12960484Sobrien    bfd_default_scan,
13099461Sobrien    &bfd_powerpc_archs[3]
13160484Sobrien  },
13260484Sobrien  {
13360484Sobrien    32,	/* 32 bits in a word */
13460484Sobrien    32,	/* 32 bits in an address */
13560484Sobrien    8,	/* 8 bits in a byte */
13660484Sobrien    bfd_arch_powerpc,
13777298Sobrien    bfd_mach_ppc_ec603e,
13860484Sobrien    "powerpc",
13977298Sobrien    "powerpc:EC603e",
14060484Sobrien    3,
141130561Sobrien    FALSE, /* not the default */
14277298Sobrien    powerpc_compatible,
14360484Sobrien    bfd_default_scan,
14499461Sobrien    &bfd_powerpc_archs[4]
14560484Sobrien  },
14660484Sobrien  {
14760484Sobrien    32,	/* 32 bits in a word */
14860484Sobrien    32,	/* 32 bits in an address */
14960484Sobrien    8,	/* 8 bits in a byte */
15060484Sobrien    bfd_arch_powerpc,
15177298Sobrien    bfd_mach_ppc_604,
15260484Sobrien    "powerpc",
15377298Sobrien    "powerpc:604",
15460484Sobrien    3,
155130561Sobrien    FALSE, /* not the default */
15677298Sobrien    powerpc_compatible,
15760484Sobrien    bfd_default_scan,
15899461Sobrien    &bfd_powerpc_archs[5]
15960484Sobrien  },
16060484Sobrien  {
16160484Sobrien    32,	/* 32 bits in a word */
16260484Sobrien    32,	/* 32 bits in an address */
16360484Sobrien    8,	/* 8 bits in a byte */
16460484Sobrien    bfd_arch_powerpc,
16577298Sobrien    bfd_mach_ppc_403,
16660484Sobrien    "powerpc",
16777298Sobrien    "powerpc:403",
16877298Sobrien    3,
169130561Sobrien    FALSE, /* not the default */
17077298Sobrien    powerpc_compatible,
17177298Sobrien    bfd_default_scan,
17299461Sobrien    &bfd_powerpc_archs[6]
17377298Sobrien  },
17477298Sobrien  {
17577298Sobrien    32,	/* 32 bits in a word */
17677298Sobrien    32,	/* 32 bits in an address */
17777298Sobrien    8,	/* 8 bits in a byte */
17877298Sobrien    bfd_arch_powerpc,
17977298Sobrien    bfd_mach_ppc_601,
18077298Sobrien    "powerpc",
18160484Sobrien    "powerpc:601",
18260484Sobrien    3,
183130561Sobrien    FALSE, /* not the default */
18477298Sobrien    powerpc_compatible,
18560484Sobrien    bfd_default_scan,
18699461Sobrien    &bfd_powerpc_archs[7]
18777298Sobrien  },
18877298Sobrien  {
18977298Sobrien    64,	/* 64 bits in a word */
19077298Sobrien    64,	/* 64 bits in an address */
19177298Sobrien    8,	/* 8 bits in a byte */
19277298Sobrien    bfd_arch_powerpc,
19377298Sobrien    bfd_mach_ppc_620,
19477298Sobrien    "powerpc",
19577298Sobrien    "powerpc:620",
19677298Sobrien    3,
197130561Sobrien    FALSE, /* not the default */
19877298Sobrien    powerpc_compatible,
19977298Sobrien    bfd_default_scan,
20099461Sobrien    &bfd_powerpc_archs[8]
20177298Sobrien  },
20277298Sobrien  {
20377298Sobrien    64,	/* 64 bits in a word */
20477298Sobrien    64,	/* 64 bits in an address */
20577298Sobrien    8,	/* 8 bits in a byte */
20677298Sobrien    bfd_arch_powerpc,
20777298Sobrien    bfd_mach_ppc_630,
20877298Sobrien    "powerpc",
20977298Sobrien    "powerpc:630",
21077298Sobrien    3,
211130561Sobrien    FALSE, /* not the default */
21277298Sobrien    powerpc_compatible,
21377298Sobrien    bfd_default_scan,
21499461Sobrien    &bfd_powerpc_archs[9]
21577298Sobrien  },
21677298Sobrien  {
21777298Sobrien    64,	/* 64 bits in a word */
21877298Sobrien    64,	/* 64 bits in an address */
21977298Sobrien    8,	/* 8 bits in a byte */
22077298Sobrien    bfd_arch_powerpc,
22177298Sobrien    bfd_mach_ppc_a35,
22277298Sobrien    "powerpc",
22377298Sobrien    "powerpc:a35",
22477298Sobrien    3,
225130561Sobrien    FALSE, /* not the default */
22677298Sobrien    powerpc_compatible,
22777298Sobrien    bfd_default_scan,
22899461Sobrien    &bfd_powerpc_archs[10]
22977298Sobrien  },
23077298Sobrien  {
23177298Sobrien    64,	/* 64 bits in a word */
23277298Sobrien    64,	/* 64 bits in an address */
23377298Sobrien    8,	/* 8 bits in a byte */
23477298Sobrien    bfd_arch_powerpc,
23577298Sobrien    bfd_mach_ppc_rs64ii,
23677298Sobrien    "powerpc",
23777298Sobrien    "powerpc:rs64ii",
23877298Sobrien    3,
239130561Sobrien    FALSE, /* not the default */
24077298Sobrien    powerpc_compatible,
24177298Sobrien    bfd_default_scan,
24299461Sobrien    &bfd_powerpc_archs[11]
24377298Sobrien  },
24477298Sobrien  {
24577298Sobrien    64,	/* 64 bits in a word */
24677298Sobrien    64,	/* 64 bits in an address */
24777298Sobrien    8,	/* 8 bits in a byte */
24877298Sobrien    bfd_arch_powerpc,
24977298Sobrien    bfd_mach_ppc_rs64iii,
25077298Sobrien    "powerpc",
25177298Sobrien    "powerpc:rs64iii",
25277298Sobrien    3,
253130561Sobrien    FALSE, /* not the default */
25477298Sobrien    powerpc_compatible,
25577298Sobrien    bfd_default_scan,
25699461Sobrien    &bfd_powerpc_archs[12]
25777298Sobrien  },
25877298Sobrien  {
25977298Sobrien    32,	/* 32 bits in a word */
26077298Sobrien    32,	/* 32 bits in an address */
26177298Sobrien    8,	/* 8 bits in a byte */
26277298Sobrien    bfd_arch_powerpc,
26377298Sobrien    bfd_mach_ppc_7400,
26477298Sobrien    "powerpc",
26577298Sobrien    "powerpc:7400",
26677298Sobrien    3,
267130561Sobrien    FALSE, /* not the default */
26877298Sobrien    powerpc_compatible,
26977298Sobrien    bfd_default_scan,
27099461Sobrien    &bfd_powerpc_archs[13]
27177298Sobrien  },
27277298Sobrien  {
273130561Sobrien    32, /* 32 bits in a word */
274130561Sobrien    32, /* 32 bits in an address */
275130561Sobrien    8,  /* 8 bits in a byte */
276130561Sobrien    bfd_arch_powerpc,
277130561Sobrien    bfd_mach_ppc_e500,
278130561Sobrien    "powerpc",
279130561Sobrien    "powerpc:e500",
280130561Sobrien    3,
281130561Sobrien    FALSE,
282130561Sobrien    powerpc_compatible,
283130561Sobrien    bfd_default_scan,
284130561Sobrien    &bfd_powerpc_archs[14]
285130561Sobrien  },
286130561Sobrien  {
28777298Sobrien    32,       /* 32 bits in a word */
28877298Sobrien    32,       /* 32 bits in an address */
28977298Sobrien    8,        /* 8 bits in a byte */
29077298Sobrien    bfd_arch_powerpc,
29177298Sobrien    bfd_mach_ppc_860,
29277298Sobrien    "powerpc",
29377298Sobrien    "powerpc:MPC8XX",
29477298Sobrien    3,
295130561Sobrien    FALSE, /* not the default */
29677298Sobrien    powerpc_compatible,
29777298Sobrien    bfd_default_scan,
298218822Sdim    &bfd_powerpc_archs[15]
299218822Sdim  },
300218822Sdim  {
301218822Sdim    32, /* 32 bits in a word */
302218822Sdim    32, /* 32 bits in an address */
303218822Sdim    8,  /* 8 bits in a byte */
304218822Sdim    bfd_arch_powerpc,
305218822Sdim    bfd_mach_ppc_750,
306218822Sdim    "powerpc",
307218822Sdim    "powerpc:750",
308218822Sdim    3,
309218822Sdim    FALSE, /* not the default */
310218822Sdim    powerpc_compatible,
311218822Sdim    bfd_default_scan,
31291041Sobrien    0
31391041Sobrien  }
31491041Sobrien};
315