Resync config/ from GCC.
[deliverable/binutils-gdb.git] / bfd / cpu-i960.c
CommitLineData
252b5132 1/* BFD library support routines for the i960 architecture.
aa820537 2 Copyright 1990, 1991, 1993, 1994, 1996, 1999, 2000, 2001, 2002, 2005, 2006,
3db64b00 3 2007 Free Software Foundation, Inc.
252b5132
RH
4 Hacked by Steve Chamberlain of Cygnus Support.
5
0112cd26 6 This file is part of BFD, the Binary File Descriptor library.
252b5132 7
0112cd26
NC
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
cd123cb7 10 the Free Software Foundation; either version 3 of the License, or
0112cd26 11 (at your option) any later version.
252b5132 12
0112cd26
NC
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
252b5132 17
0112cd26
NC
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
cd123cb7
NC
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
252b5132 22
252b5132 23#include "sysdep.h"
3db64b00 24#include "bfd.h"
252b5132
RH
25#include "libbfd.h"
26
b34976b6 27static bfd_boolean scan_960_mach
dc810e39
AM
28 PARAMS ((const bfd_arch_info_type *, const char *));
29static const bfd_arch_info_type *compatible
30 PARAMS ((const bfd_arch_info_type *, const bfd_arch_info_type *));
31
252b5132
RH
32/* This routine is provided a string, and tries to work out if it
33 could possibly refer to the i960 machine pointed at in the
34 info_struct pointer */
35
b34976b6 36static bfd_boolean
252b5132
RH
37scan_960_mach (ap, string)
38 const bfd_arch_info_type *ap;
39 const char *string;
40{
41 unsigned long machine;
b34976b6 42 int fail_because_not_80960 = FALSE;
71f6b586 43
96f6d4c4 44 /* Look for the string i960 at the front of the string. */
6cbac8b9 45 if (strncasecmp ("i960", string, 4) == 0)
96f6d4c4
NC
46 {
47 string += 4;
48
49 /* i960 on it's own means core to us. */
50 if (* string == 0)
51 return ap->mach == bfd_mach_i960_core;
71f6b586 52
96f6d4c4
NC
53 /* "i960:*" is valid, anything else is not. */
54 if (* string != ':')
b34976b6 55 return FALSE;
96f6d4c4
NC
56
57 string ++;
58 }
59 /* In some bfds the cpu-id is written as "80960KA", "80960KB",
60 "80960CA" or "80960MC". */
0112cd26 61 else if (CONST_STRNEQ (string, "80960"))
96f6d4c4
NC
62 {
63 string += 5;
64
b34976b6
AM
65 /* Set this to TRUE here. If a correct matching postfix
66 is detected below it will be reset to FALSE. */
67 fail_because_not_80960 = TRUE;
96f6d4c4
NC
68 }
69 /* No match, can't be us. */
70 else
b34976b6 71 return FALSE;
71f6b586 72
96f6d4c4 73 if (* string == '\0')
b34976b6 74 return FALSE;
71f6b586 75
252b5132
RH
76 if (string[0] == 'c' && string[1] == 'o' && string[2] == 'r' &&
77 string[3] == 'e' && string[4] == '\0')
78 machine = bfd_mach_i960_core;
6cbac8b9 79 else if (strcasecmp (string, "ka_sa") == 0)
252b5132 80 machine = bfd_mach_i960_ka_sa;
6cbac8b9 81 else if (strcasecmp (string, "kb_sb") == 0)
252b5132 82 machine = bfd_mach_i960_kb_sb;
96f6d4c4 83 else if (string[1] == '\0' || string[2] != '\0') /* rest are 2-char. */
b34976b6 84 return FALSE;
252b5132 85 else if (string[0] == 'k' && string[1] == 'b')
b34976b6 86 { machine = bfd_mach_i960_kb_sb; fail_because_not_80960 = FALSE; }
252b5132
RH
87 else if (string[0] == 's' && string[1] == 'b')
88 machine = bfd_mach_i960_kb_sb;
89 else if (string[0] == 'm' && string[1] == 'c')
b34976b6 90 { machine = bfd_mach_i960_mc; fail_because_not_80960 = FALSE; }
252b5132
RH
91 else if (string[0] == 'x' && string[1] == 'a')
92 machine = bfd_mach_i960_xa;
93 else if (string[0] == 'c' && string[1] == 'a')
b34976b6 94 { machine = bfd_mach_i960_ca; fail_because_not_80960 = FALSE; }
252b5132 95 else if (string[0] == 'k' && string[1] == 'a')
b34976b6 96 { machine = bfd_mach_i960_ka_sa; fail_because_not_80960 = FALSE; }
252b5132
RH
97 else if (string[0] == 's' && string[1] == 'a')
98 machine = bfd_mach_i960_ka_sa;
99 else if (string[0] == 'j' && string[1] == 'x')
100 machine = bfd_mach_i960_jx;
101 else if (string[0] == 'h' && string[1] == 'x')
102 machine = bfd_mach_i960_hx;
103 else
b34976b6 104 return FALSE;
96f6d4c4
NC
105
106 if (fail_because_not_80960)
b34976b6 107 return FALSE;
71f6b586 108
96f6d4c4 109 if (machine == ap->mach)
b34976b6 110 return TRUE;
71f6b586 111
b34976b6 112 return FALSE;
252b5132
RH
113}
114
252b5132
RH
115/* This routine is provided two arch_infos and works out the i960
116 machine which would be compatible with both and returns a pointer
117 to its info structure */
118
119static const bfd_arch_info_type *
120compatible (a,b)
121 const bfd_arch_info_type *a;
122 const bfd_arch_info_type *b;
123{
124
125 /* The i960 has distinct subspecies which may not interbreed:
71f6b586 126 CORE CA
252b5132
RH
127 CORE KA KB MC XA
128 CORE HX JX
129 Any architecture on the same line is compatible, the one on
71f6b586
KH
130 the right is the least restrictive.
131
252b5132
RH
132 We represent this information in an array, each machine to a side */
133
134#define ERROR 0
71f6b586
KH
135#define CORE bfd_mach_i960_core /*1*/
136#define KA bfd_mach_i960_ka_sa /*2*/
252b5132
RH
137#define KB bfd_mach_i960_kb_sb /*3*/
138#define MC bfd_mach_i960_mc /*4*/
139#define XA bfd_mach_i960_xa /*5*/
140#define CA bfd_mach_i960_ca /*6*/
141#define JX bfd_mach_i960_jx /*7*/
142#define HX bfd_mach_i960_hx /*8*/
143#define MAX_ARCH ((int)HX)
144
dc810e39 145 static const unsigned long matrix[MAX_ARCH+1][MAX_ARCH+1] =
252b5132
RH
146 {
147 { ERROR, CORE, KA, KB, MC, XA, CA, JX, HX },
148 { CORE, CORE, KA, KB, MC, XA, CA, JX, HX },
149 { KA, KA, KA, KB, MC, XA, ERROR, ERROR, ERROR},
150 { KB, KB, KB, KB, MC, XA, ERROR, ERROR, ERROR},
151 { MC, MC, MC, MC, MC, XA, ERROR, ERROR, ERROR},
152 { XA, XA, XA, XA, XA, XA, ERROR, ERROR, ERROR},
153 { CA, CA, ERROR, ERROR, ERROR, ERROR, CA, ERROR, ERROR},
154 { JX, JX, ERROR, ERROR, ERROR, ERROR, ERROR, JX, HX },
155 { HX, HX, ERROR, ERROR, ERROR, ERROR, ERROR, HX, HX },
156 };
157
71f6b586 158 if (a->arch != b->arch || matrix[a->mach][b->mach] == ERROR)
252b5132
RH
159 {
160 return NULL;
161 }
71f6b586 162 else
252b5132
RH
163 {
164 return (a->mach == matrix[a->mach][b->mach]) ? a : b;
165 }
166}
167
252b5132 168#define N(a,b,d,n) \
b7761f11
L
169{ 32, 32, 8,bfd_arch_i960,a,"i960",b,3,d,compatible,scan_960_mach, \
170 bfd_arch_default_fill, n,}
252b5132 171
71f6b586
KH
172static const bfd_arch_info_type arch_info_struct[] =
173{
b34976b6
AM
174 N(bfd_mach_i960_ka_sa,"i960:ka_sa",FALSE, &arch_info_struct[1]),
175 N(bfd_mach_i960_kb_sb,"i960:kb_sb",FALSE, &arch_info_struct[2]),
176 N(bfd_mach_i960_mc, "i960:mc", FALSE, &arch_info_struct[3]),
177 N(bfd_mach_i960_xa, "i960:xa", FALSE, &arch_info_struct[4]),
178 N(bfd_mach_i960_ca, "i960:ca", FALSE, &arch_info_struct[5]),
179 N(bfd_mach_i960_jx, "i960:jx", FALSE, &arch_info_struct[6]),
180 N(bfd_mach_i960_hx, "i960:hx", FALSE, 0),
252b5132
RH
181};
182
183const bfd_arch_info_type bfd_i960_arch =
b34976b6 184 N(bfd_mach_i960_core, "i960:core", TRUE, &arch_info_struct[0]);
This page took 0.582521 seconds and 4 git commands to generate.