tc-bfin.c revision 1.1.1.11 1 1.1 skrll /* tc-bfin.c -- Assembler for the ADI Blackfin.
2 1.1.1.11 christos Copyright (C) 2005-2026 Free Software Foundation, Inc.
3 1.1 skrll
4 1.1 skrll This file is part of GAS, the GNU Assembler.
5 1.1 skrll
6 1.1 skrll GAS is free software; you can redistribute it and/or modify
7 1.1 skrll it under the terms of the GNU General Public License as published by
8 1.1 skrll the Free Software Foundation; either version 3, or (at your option)
9 1.1 skrll any later version.
10 1.1 skrll
11 1.1 skrll GAS is distributed in the hope that it will be useful,
12 1.1 skrll but WITHOUT ANY WARRANTY; without even the implied warranty of
13 1.1 skrll MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 1.1 skrll GNU General Public License for more details.
15 1.1 skrll
16 1.1 skrll You should have received a copy of the GNU General Public License
17 1.1 skrll along with GAS; see the file COPYING. If not, write to the Free
18 1.1 skrll Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
19 1.1 skrll 02110-1301, USA. */
20 1.1 skrll
21 1.1 skrll #include "as.h"
22 1.1 skrll #include "bfin-defs.h"
23 1.1 skrll #include "obstack.h"
24 1.1 skrll #include "safe-ctype.h"
25 1.1 skrll #ifdef OBJ_ELF
26 1.1 skrll #include "dwarf2dbg.h"
27 1.1 skrll #endif
28 1.1 skrll #include "elf/common.h"
29 1.1 skrll #include "elf/bfin.h"
30 1.1 skrll
31 1.1 skrll extern int yyparse (void);
32 1.1 skrll struct yy_buffer_state;
33 1.1 skrll typedef struct yy_buffer_state *YY_BUFFER_STATE;
34 1.1 skrll extern YY_BUFFER_STATE yy_scan_string (const char *yy_str);
35 1.1 skrll extern void yy_delete_buffer (YY_BUFFER_STATE b);
36 1.1 skrll static parse_state parse (char *line);
37 1.1 skrll
38 1.1 skrll /* Global variables. */
39 1.1 skrll struct bfin_insn *insn;
40 1.1 skrll int last_insn_size;
41 1.1 skrll
42 1.1 skrll extern struct obstack mempool;
43 1.1 skrll FILE *errorf;
44 1.1 skrll
45 1.1 skrll /* Flags to set in the elf header */
46 1.1 skrll #define DEFAULT_FLAGS 0
47 1.1 skrll
48 1.1 skrll #ifdef OBJ_FDPIC_ELF
49 1.1 skrll # define DEFAULT_FDPIC EF_BFIN_FDPIC
50 1.1 skrll #else
51 1.1 skrll # define DEFAULT_FDPIC 0
52 1.1 skrll #endif
53 1.1 skrll
54 1.1 skrll static flagword bfin_flags = DEFAULT_FLAGS | DEFAULT_FDPIC;
55 1.1.1.10 christos static const char *bfin_pic_flag = DEFAULT_FDPIC ? "-mfdpic" : NULL;
56 1.1 skrll
57 1.1 skrll /* Blackfin specific function to handle FD-PIC pointer initializations. */
58 1.1 skrll
59 1.1 skrll static void
60 1.1 skrll bfin_pic_ptr (int nbytes)
61 1.1 skrll {
62 1.1 skrll expressionS exp;
63 1.1 skrll char *p;
64 1.1 skrll
65 1.1 skrll if (nbytes != 4)
66 1.1 skrll abort ();
67 1.1 skrll
68 1.1 skrll #ifdef md_flush_pending_output
69 1.1 skrll md_flush_pending_output ();
70 1.1 skrll #endif
71 1.1 skrll
72 1.1 skrll if (is_it_end_of_statement ())
73 1.1 skrll {
74 1.1 skrll demand_empty_rest_of_line ();
75 1.1 skrll return;
76 1.1 skrll }
77 1.1 skrll
78 1.1 skrll #ifdef md_cons_align
79 1.1 skrll md_cons_align (nbytes);
80 1.1 skrll #endif
81 1.1 skrll
82 1.1 skrll do
83 1.1 skrll {
84 1.1 skrll bfd_reloc_code_real_type reloc_type = BFD_RELOC_BFIN_FUNCDESC;
85 1.1.1.2 christos
86 1.1 skrll if (strncasecmp (input_line_pointer, "funcdesc(", 9) == 0)
87 1.1 skrll {
88 1.1 skrll input_line_pointer += 9;
89 1.1 skrll expression (&exp);
90 1.1 skrll if (*input_line_pointer == ')')
91 1.1 skrll input_line_pointer++;
92 1.1 skrll else
93 1.1 skrll as_bad (_("missing ')'"));
94 1.1 skrll }
95 1.1 skrll else
96 1.1 skrll error ("missing funcdesc in picptr");
97 1.1 skrll
98 1.1 skrll p = frag_more (4);
99 1.1 skrll memset (p, 0, 4);
100 1.1 skrll fix_new_exp (frag_now, p - frag_now->fr_literal, 4, &exp, 0,
101 1.1 skrll reloc_type);
102 1.1 skrll }
103 1.1 skrll while (*input_line_pointer++ == ',');
104 1.1 skrll
105 1.1 skrll input_line_pointer--; /* Put terminator back into stream. */
106 1.1 skrll demand_empty_rest_of_line ();
107 1.1 skrll }
108 1.1 skrll
109 1.1 skrll const pseudo_typeS md_pseudo_table[] = {
110 1.1 skrll {"align", s_align_bytes, 0},
111 1.1 skrll {"byte2", cons, 2},
112 1.1 skrll {"byte4", cons, 4},
113 1.1 skrll {"picptr", bfin_pic_ptr, 4},
114 1.1 skrll {"code", obj_elf_section, 0},
115 1.1 skrll {"db", cons, 1},
116 1.1 skrll {"dd", cons, 4},
117 1.1 skrll {"dw", cons, 2},
118 1.1 skrll {"p", s_ignore, 0},
119 1.1 skrll {"pdata", s_ignore, 0},
120 1.1 skrll {"var", s_ignore, 0},
121 1.1 skrll {0, 0, 0}
122 1.1 skrll };
123 1.1 skrll
124 1.1 skrll /* Characters that are used to denote comments and line separators. */
125 1.1.1.2 christos const char comment_chars[] = "#";
126 1.1 skrll const char line_comment_chars[] = "#";
127 1.1 skrll const char line_separator_chars[] = ";";
128 1.1 skrll
129 1.1 skrll /* Characters that can be used to separate the mantissa from the
130 1.1 skrll exponent in floating point numbers. */
131 1.1 skrll const char EXP_CHARS[] = "eE";
132 1.1 skrll
133 1.1 skrll /* Characters that mean this number is a floating point constant.
134 1.1 skrll As in 0f12.456 or 0d1.2345e12. */
135 1.1 skrll const char FLT_CHARS[] = "fFdDxX";
136 1.1 skrll
137 1.1.1.2 christos typedef enum bfin_cpu_type
138 1.1.1.2 christos {
139 1.1.1.2 christos BFIN_CPU_UNKNOWN,
140 1.1.1.2 christos BFIN_CPU_BF504,
141 1.1.1.2 christos BFIN_CPU_BF506,
142 1.1.1.2 christos BFIN_CPU_BF512,
143 1.1.1.2 christos BFIN_CPU_BF514,
144 1.1.1.2 christos BFIN_CPU_BF516,
145 1.1.1.2 christos BFIN_CPU_BF518,
146 1.1.1.2 christos BFIN_CPU_BF522,
147 1.1.1.2 christos BFIN_CPU_BF523,
148 1.1.1.2 christos BFIN_CPU_BF524,
149 1.1.1.2 christos BFIN_CPU_BF525,
150 1.1.1.2 christos BFIN_CPU_BF526,
151 1.1.1.2 christos BFIN_CPU_BF527,
152 1.1.1.2 christos BFIN_CPU_BF531,
153 1.1.1.2 christos BFIN_CPU_BF532,
154 1.1.1.2 christos BFIN_CPU_BF533,
155 1.1.1.2 christos BFIN_CPU_BF534,
156 1.1.1.2 christos BFIN_CPU_BF536,
157 1.1.1.2 christos BFIN_CPU_BF537,
158 1.1.1.2 christos BFIN_CPU_BF538,
159 1.1.1.2 christos BFIN_CPU_BF539,
160 1.1.1.2 christos BFIN_CPU_BF542,
161 1.1.1.2 christos BFIN_CPU_BF542M,
162 1.1.1.2 christos BFIN_CPU_BF544,
163 1.1.1.2 christos BFIN_CPU_BF544M,
164 1.1.1.2 christos BFIN_CPU_BF547,
165 1.1.1.2 christos BFIN_CPU_BF547M,
166 1.1.1.2 christos BFIN_CPU_BF548,
167 1.1.1.2 christos BFIN_CPU_BF548M,
168 1.1.1.2 christos BFIN_CPU_BF549,
169 1.1.1.2 christos BFIN_CPU_BF549M,
170 1.1.1.2 christos BFIN_CPU_BF561,
171 1.1.1.2 christos BFIN_CPU_BF592,
172 1.1.1.2 christos } bfin_cpu_t;
173 1.1.1.2 christos
174 1.1.1.2 christos bfin_cpu_t bfin_cpu_type = BFIN_CPU_UNKNOWN;
175 1.1.1.2 christos /* -msi-revision support. There are three special values:
176 1.1.1.2 christos -1 -msi-revision=none.
177 1.1.1.2 christos 0xffff -msi-revision=any. */
178 1.1.1.2 christos int bfin_si_revision;
179 1.1.1.2 christos
180 1.1.1.2 christos unsigned int bfin_anomaly_checks = 0;
181 1.1.1.2 christos
182 1.1.1.2 christos struct bfin_cpu
183 1.1.1.2 christos {
184 1.1.1.2 christos const char *name;
185 1.1.1.2 christos bfin_cpu_t type;
186 1.1.1.2 christos int si_revision;
187 1.1.1.2 christos unsigned int anomaly_checks;
188 1.1.1.2 christos };
189 1.1.1.2 christos
190 1.1.1.2 christos struct bfin_cpu bfin_cpus[] =
191 1.1.1.2 christos {
192 1.1.1.2 christos {"bf504", BFIN_CPU_BF504, 0x0000, AC_05000074},
193 1.1.1.2 christos
194 1.1.1.2 christos {"bf506", BFIN_CPU_BF506, 0x0000, AC_05000074},
195 1.1.1.2 christos
196 1.1.1.2 christos {"bf512", BFIN_CPU_BF512, 0x0002, AC_05000074},
197 1.1.1.2 christos {"bf512", BFIN_CPU_BF512, 0x0001, AC_05000074},
198 1.1.1.2 christos {"bf512", BFIN_CPU_BF512, 0x0000, AC_05000074},
199 1.1.1.2 christos
200 1.1.1.2 christos {"bf514", BFIN_CPU_BF514, 0x0002, AC_05000074},
201 1.1.1.2 christos {"bf514", BFIN_CPU_BF514, 0x0001, AC_05000074},
202 1.1.1.2 christos {"bf514", BFIN_CPU_BF514, 0x0000, AC_05000074},
203 1.1.1.2 christos
204 1.1.1.2 christos {"bf516", BFIN_CPU_BF516, 0x0002, AC_05000074},
205 1.1.1.2 christos {"bf516", BFIN_CPU_BF516, 0x0001, AC_05000074},
206 1.1.1.2 christos {"bf516", BFIN_CPU_BF516, 0x0000, AC_05000074},
207 1.1.1.2 christos
208 1.1.1.2 christos {"bf518", BFIN_CPU_BF518, 0x0002, AC_05000074},
209 1.1.1.2 christos {"bf518", BFIN_CPU_BF518, 0x0001, AC_05000074},
210 1.1.1.2 christos {"bf518", BFIN_CPU_BF518, 0x0000, AC_05000074},
211 1.1.1.2 christos
212 1.1.1.2 christos {"bf522", BFIN_CPU_BF522, 0x0002, AC_05000074},
213 1.1.1.2 christos {"bf522", BFIN_CPU_BF522, 0x0001, AC_05000074},
214 1.1.1.2 christos {"bf522", BFIN_CPU_BF522, 0x0000, AC_05000074},
215 1.1.1.2 christos
216 1.1.1.2 christos {"bf523", BFIN_CPU_BF523, 0x0002, AC_05000074},
217 1.1.1.2 christos {"bf523", BFIN_CPU_BF523, 0x0001, AC_05000074},
218 1.1.1.2 christos {"bf523", BFIN_CPU_BF523, 0x0000, AC_05000074},
219 1.1.1.2 christos
220 1.1.1.2 christos {"bf524", BFIN_CPU_BF524, 0x0002, AC_05000074},
221 1.1.1.2 christos {"bf524", BFIN_CPU_BF524, 0x0001, AC_05000074},
222 1.1.1.2 christos {"bf524", BFIN_CPU_BF524, 0x0000, AC_05000074},
223 1.1.1.2 christos
224 1.1.1.2 christos {"bf525", BFIN_CPU_BF525, 0x0002, AC_05000074},
225 1.1.1.2 christos {"bf525", BFIN_CPU_BF525, 0x0001, AC_05000074},
226 1.1.1.2 christos {"bf525", BFIN_CPU_BF525, 0x0000, AC_05000074},
227 1.1.1.2 christos
228 1.1.1.2 christos {"bf526", BFIN_CPU_BF526, 0x0002, AC_05000074},
229 1.1.1.2 christos {"bf526", BFIN_CPU_BF526, 0x0001, AC_05000074},
230 1.1.1.2 christos {"bf526", BFIN_CPU_BF526, 0x0000, AC_05000074},
231 1.1.1.2 christos
232 1.1.1.2 christos {"bf527", BFIN_CPU_BF527, 0x0002, AC_05000074},
233 1.1.1.2 christos {"bf527", BFIN_CPU_BF527, 0x0001, AC_05000074},
234 1.1.1.2 christos {"bf527", BFIN_CPU_BF527, 0x0000, AC_05000074},
235 1.1.1.2 christos
236 1.1.1.2 christos {"bf531", BFIN_CPU_BF531, 0x0006, AC_05000074},
237 1.1.1.2 christos {"bf531", BFIN_CPU_BF531, 0x0005, AC_05000074},
238 1.1.1.2 christos {"bf531", BFIN_CPU_BF531, 0x0004, AC_05000074},
239 1.1.1.2 christos {"bf531", BFIN_CPU_BF531, 0x0003, AC_05000074},
240 1.1.1.2 christos
241 1.1.1.2 christos {"bf532", BFIN_CPU_BF532, 0x0006, AC_05000074},
242 1.1.1.2 christos {"bf532", BFIN_CPU_BF532, 0x0005, AC_05000074},
243 1.1.1.2 christos {"bf532", BFIN_CPU_BF532, 0x0004, AC_05000074},
244 1.1.1.2 christos {"bf532", BFIN_CPU_BF532, 0x0003, AC_05000074},
245 1.1.1.2 christos
246 1.1.1.2 christos {"bf533", BFIN_CPU_BF533, 0x0006, AC_05000074},
247 1.1.1.2 christos {"bf533", BFIN_CPU_BF533, 0x0005, AC_05000074},
248 1.1.1.2 christos {"bf533", BFIN_CPU_BF533, 0x0004, AC_05000074},
249 1.1.1.2 christos {"bf533", BFIN_CPU_BF533, 0x0003, AC_05000074},
250 1.1.1.2 christos
251 1.1.1.2 christos {"bf534", BFIN_CPU_BF534, 0x0003, AC_05000074},
252 1.1.1.2 christos {"bf534", BFIN_CPU_BF534, 0x0002, AC_05000074},
253 1.1.1.2 christos {"bf534", BFIN_CPU_BF534, 0x0001, AC_05000074},
254 1.1.1.2 christos
255 1.1.1.2 christos {"bf536", BFIN_CPU_BF536, 0x0003, AC_05000074},
256 1.1.1.2 christos {"bf536", BFIN_CPU_BF536, 0x0002, AC_05000074},
257 1.1.1.2 christos {"bf536", BFIN_CPU_BF536, 0x0001, AC_05000074},
258 1.1.1.2 christos
259 1.1.1.2 christos {"bf537", BFIN_CPU_BF537, 0x0003, AC_05000074},
260 1.1.1.2 christos {"bf537", BFIN_CPU_BF537, 0x0002, AC_05000074},
261 1.1.1.2 christos {"bf537", BFIN_CPU_BF537, 0x0001, AC_05000074},
262 1.1.1.2 christos
263 1.1.1.2 christos {"bf538", BFIN_CPU_BF538, 0x0005, AC_05000074},
264 1.1.1.2 christos {"bf538", BFIN_CPU_BF538, 0x0004, AC_05000074},
265 1.1.1.2 christos {"bf538", BFIN_CPU_BF538, 0x0003, AC_05000074},
266 1.1.1.2 christos {"bf538", BFIN_CPU_BF538, 0x0002, AC_05000074},
267 1.1.1.2 christos
268 1.1.1.2 christos {"bf539", BFIN_CPU_BF539, 0x0005, AC_05000074},
269 1.1.1.2 christos {"bf539", BFIN_CPU_BF539, 0x0004, AC_05000074},
270 1.1.1.2 christos {"bf539", BFIN_CPU_BF539, 0x0003, AC_05000074},
271 1.1.1.2 christos {"bf539", BFIN_CPU_BF539, 0x0002, AC_05000074},
272 1.1.1.2 christos
273 1.1.1.2 christos {"bf542m", BFIN_CPU_BF542M, 0x0003, AC_05000074},
274 1.1.1.2 christos
275 1.1.1.3 christos {"bf542", BFIN_CPU_BF542, 0x0004, AC_05000074},
276 1.1.1.2 christos {"bf542", BFIN_CPU_BF542, 0x0002, AC_05000074},
277 1.1.1.2 christos {"bf542", BFIN_CPU_BF542, 0x0001, AC_05000074},
278 1.1.1.2 christos {"bf542", BFIN_CPU_BF542, 0x0000, AC_05000074},
279 1.1.1.2 christos
280 1.1.1.2 christos {"bf544m", BFIN_CPU_BF544M, 0x0003, AC_05000074},
281 1.1.1.2 christos
282 1.1.1.3 christos {"bf544", BFIN_CPU_BF544, 0x0004, AC_05000074},
283 1.1.1.2 christos {"bf544", BFIN_CPU_BF544, 0x0002, AC_05000074},
284 1.1.1.2 christos {"bf544", BFIN_CPU_BF544, 0x0001, AC_05000074},
285 1.1.1.2 christos {"bf544", BFIN_CPU_BF544, 0x0000, AC_05000074},
286 1.1.1.2 christos
287 1.1.1.2 christos {"bf547m", BFIN_CPU_BF547M, 0x0003, AC_05000074},
288 1.1.1.2 christos
289 1.1.1.3 christos {"bf547", BFIN_CPU_BF547, 0x0004, AC_05000074},
290 1.1.1.2 christos {"bf547", BFIN_CPU_BF547, 0x0002, AC_05000074},
291 1.1.1.2 christos {"bf547", BFIN_CPU_BF547, 0x0001, AC_05000074},
292 1.1.1.2 christos {"bf547", BFIN_CPU_BF547, 0x0000, AC_05000074},
293 1.1.1.2 christos
294 1.1.1.2 christos {"bf548m", BFIN_CPU_BF548M, 0x0003, AC_05000074},
295 1.1.1.2 christos
296 1.1.1.3 christos {"bf548", BFIN_CPU_BF548, 0x0004, AC_05000074},
297 1.1.1.2 christos {"bf548", BFIN_CPU_BF548, 0x0002, AC_05000074},
298 1.1.1.2 christos {"bf548", BFIN_CPU_BF548, 0x0001, AC_05000074},
299 1.1.1.2 christos {"bf548", BFIN_CPU_BF548, 0x0000, AC_05000074},
300 1.1.1.2 christos
301 1.1.1.2 christos {"bf549m", BFIN_CPU_BF549M, 0x0003, AC_05000074},
302 1.1.1.2 christos
303 1.1.1.3 christos {"bf549", BFIN_CPU_BF549, 0x0004, AC_05000074},
304 1.1.1.2 christos {"bf549", BFIN_CPU_BF549, 0x0002, AC_05000074},
305 1.1.1.2 christos {"bf549", BFIN_CPU_BF549, 0x0001, AC_05000074},
306 1.1.1.2 christos {"bf549", BFIN_CPU_BF549, 0x0000, AC_05000074},
307 1.1.1.2 christos
308 1.1.1.2 christos {"bf561", BFIN_CPU_BF561, 0x0005, AC_05000074},
309 1.1.1.2 christos {"bf561", BFIN_CPU_BF561, 0x0003, AC_05000074},
310 1.1.1.2 christos {"bf561", BFIN_CPU_BF561, 0x0002, AC_05000074},
311 1.1.1.2 christos
312 1.1.1.2 christos {"bf592", BFIN_CPU_BF592, 0x0001, AC_05000074},
313 1.1.1.2 christos {"bf592", BFIN_CPU_BF592, 0x0000, AC_05000074},
314 1.1.1.2 christos };
315 1.1.1.2 christos
316 1.1 skrll /* Define bfin-specific command-line options (there are none). */
317 1.1.1.10 christos const char md_shortopts[] = "";
318 1.1 skrll
319 1.1 skrll #define OPTION_FDPIC (OPTION_MD_BASE)
320 1.1 skrll #define OPTION_NOPIC (OPTION_MD_BASE + 1)
321 1.1.1.2 christos #define OPTION_MCPU (OPTION_MD_BASE + 2)
322 1.1 skrll
323 1.1.1.10 christos const struct option md_longopts[] =
324 1.1 skrll {
325 1.1.1.2 christos { "mcpu", required_argument, NULL, OPTION_MCPU },
326 1.1 skrll { "mfdpic", no_argument, NULL, OPTION_FDPIC },
327 1.1 skrll { "mnopic", no_argument, NULL, OPTION_NOPIC },
328 1.1 skrll { "mno-fdpic", no_argument, NULL, OPTION_NOPIC },
329 1.1 skrll { NULL, no_argument, NULL, 0 },
330 1.1 skrll };
331 1.1 skrll
332 1.1.1.10 christos const size_t md_longopts_size = sizeof (md_longopts);
333 1.1 skrll
334 1.1 skrll
335 1.1 skrll int
336 1.1.1.5 christos md_parse_option (int c ATTRIBUTE_UNUSED, const char *arg ATTRIBUTE_UNUSED)
337 1.1 skrll {
338 1.1 skrll switch (c)
339 1.1 skrll {
340 1.1 skrll default:
341 1.1 skrll return 0;
342 1.1 skrll
343 1.1.1.2 christos case OPTION_MCPU:
344 1.1.1.2 christos {
345 1.1.1.5 christos const char *q;
346 1.1.1.5 christos unsigned int i;
347 1.1.1.2 christos
348 1.1.1.5 christos for (i = 0; i < ARRAY_SIZE (bfin_cpus); i++)
349 1.1.1.2 christos {
350 1.1.1.5 christos const char *p = bfin_cpus[i].name;
351 1.1.1.2 christos if (strncmp (arg, p, strlen (p)) == 0)
352 1.1.1.2 christos break;
353 1.1.1.2 christos }
354 1.1.1.2 christos
355 1.1.1.5 christos if (i == ARRAY_SIZE (bfin_cpus))
356 1.1.1.2 christos as_fatal ("-mcpu=%s is not valid", arg);
357 1.1.1.2 christos
358 1.1.1.2 christos bfin_cpu_type = bfin_cpus[i].type;
359 1.1.1.2 christos
360 1.1.1.5 christos q = arg + strlen (bfin_cpus[i].name);
361 1.1.1.2 christos
362 1.1.1.2 christos if (*q == '\0')
363 1.1.1.2 christos {
364 1.1.1.2 christos bfin_si_revision = bfin_cpus[i].si_revision;
365 1.1.1.2 christos bfin_anomaly_checks |= bfin_cpus[i].anomaly_checks;
366 1.1.1.2 christos }
367 1.1.1.2 christos else if (strcmp (q, "-none") == 0)
368 1.1.1.2 christos bfin_si_revision = -1;
369 1.1.1.2 christos else if (strcmp (q, "-any") == 0)
370 1.1.1.2 christos {
371 1.1.1.2 christos bfin_si_revision = 0xffff;
372 1.1.1.5 christos while (i < ARRAY_SIZE (bfin_cpus)
373 1.1.1.5 christos && bfin_cpus[i].type == bfin_cpu_type)
374 1.1.1.2 christos {
375 1.1.1.2 christos bfin_anomaly_checks |= bfin_cpus[i].anomaly_checks;
376 1.1.1.2 christos i++;
377 1.1.1.2 christos }
378 1.1.1.2 christos }
379 1.1.1.2 christos else
380 1.1.1.2 christos {
381 1.1.1.2 christos unsigned int si_major, si_minor;
382 1.1.1.2 christos int rev_len, n;
383 1.1.1.2 christos
384 1.1.1.2 christos rev_len = strlen (q);
385 1.1.1.2 christos
386 1.1.1.2 christos if (sscanf (q, "-%u.%u%n", &si_major, &si_minor, &n) != 2
387 1.1.1.2 christos || n != rev_len
388 1.1.1.2 christos || si_major > 0xff || si_minor > 0xff)
389 1.1.1.2 christos {
390 1.1.1.2 christos invalid_silicon_revision:
391 1.1.1.2 christos as_fatal ("-mcpu=%s has invalid silicon revision", arg);
392 1.1.1.2 christos }
393 1.1.1.2 christos
394 1.1.1.2 christos bfin_si_revision = (si_major << 8) | si_minor;
395 1.1.1.2 christos
396 1.1.1.5 christos while (i < ARRAY_SIZE (bfin_cpus)
397 1.1.1.5 christos && bfin_cpus[i].type == bfin_cpu_type
398 1.1.1.2 christos && bfin_cpus[i].si_revision != bfin_si_revision)
399 1.1.1.2 christos i++;
400 1.1.1.2 christos
401 1.1.1.5 christos if (i == ARRAY_SIZE (bfin_cpus)
402 1.1.1.5 christos || bfin_cpus[i].type != bfin_cpu_type)
403 1.1.1.2 christos goto invalid_silicon_revision;
404 1.1.1.2 christos
405 1.1.1.2 christos bfin_anomaly_checks |= bfin_cpus[i].anomaly_checks;
406 1.1.1.2 christos }
407 1.1.1.2 christos
408 1.1.1.2 christos break;
409 1.1.1.2 christos }
410 1.1.1.2 christos
411 1.1 skrll case OPTION_FDPIC:
412 1.1 skrll bfin_flags |= EF_BFIN_FDPIC;
413 1.1 skrll bfin_pic_flag = "-mfdpic";
414 1.1 skrll break;
415 1.1 skrll
416 1.1 skrll case OPTION_NOPIC:
417 1.1 skrll bfin_flags &= ~(EF_BFIN_FDPIC);
418 1.1 skrll bfin_pic_flag = 0;
419 1.1 skrll break;
420 1.1 skrll }
421 1.1 skrll
422 1.1 skrll return 1;
423 1.1 skrll }
424 1.1 skrll
425 1.1 skrll void
426 1.1.1.2 christos md_show_usage (FILE * stream)
427 1.1 skrll {
428 1.1.1.2 christos fprintf (stream, _(" Blackfin specific assembler options:\n"));
429 1.1.1.2 christos fprintf (stream, _(" -mcpu=<cpu[-sirevision]> specify the name of the target CPU\n"));
430 1.1.1.2 christos fprintf (stream, _(" -mfdpic assemble for the FDPIC ABI\n"));
431 1.1.1.2 christos fprintf (stream, _(" -mno-fdpic/-mnopic disable -mfdpic\n"));
432 1.1 skrll }
433 1.1 skrll
434 1.1 skrll /* Perform machine-specific initializations. */
435 1.1 skrll void
436 1.1.1.5 christos md_begin (void)
437 1.1 skrll {
438 1.1 skrll /* Set the ELF flags if desired. */
439 1.1 skrll if (bfin_flags)
440 1.1 skrll bfd_set_private_flags (stdoutput, bfin_flags);
441 1.1 skrll
442 1.1 skrll /* Set the default machine type. */
443 1.1 skrll if (!bfd_set_arch_mach (stdoutput, bfd_arch_bfin, 0))
444 1.1 skrll as_warn (_("Could not set architecture and machine."));
445 1.1 skrll
446 1.1 skrll /* Ensure that lines can begin with '(', for multiple
447 1.1 skrll register stack pops. */
448 1.1 skrll lex_type ['('] = LEX_BEGIN_NAME;
449 1.1.1.2 christos
450 1.1 skrll #ifdef OBJ_ELF
451 1.1 skrll record_alignment (text_section, 2);
452 1.1 skrll record_alignment (data_section, 2);
453 1.1 skrll record_alignment (bss_section, 2);
454 1.1 skrll #endif
455 1.1 skrll
456 1.1 skrll errorf = stderr;
457 1.1 skrll obstack_init (&mempool);
458 1.1 skrll
459 1.1 skrll #ifdef DEBUG
460 1.1 skrll extern int debug_codeselection;
461 1.1 skrll debug_codeselection = 1;
462 1.1.1.2 christos #endif
463 1.1 skrll
464 1.1 skrll last_insn_size = 0;
465 1.1 skrll }
466 1.1 skrll
467 1.1 skrll /* Perform the main parsing, and assembly of the input here. Also,
468 1.1 skrll call the required routines for alignment and fixups here.
469 1.1 skrll This is called for every line that contains real assembly code. */
470 1.1 skrll
471 1.1 skrll void
472 1.1 skrll md_assemble (char *line)
473 1.1 skrll {
474 1.1 skrll char *toP = 0;
475 1.1 skrll int size, insn_size;
476 1.1 skrll struct bfin_insn *tmp_insn;
477 1.1 skrll size_t len;
478 1.1 skrll static size_t buffer_len = 0;
479 1.1.1.5 christos static char *current_inputline;
480 1.1 skrll parse_state state;
481 1.1 skrll
482 1.1 skrll len = strlen (line);
483 1.1 skrll if (len + 2 > buffer_len)
484 1.1 skrll {
485 1.1 skrll buffer_len = len + 40;
486 1.1.1.5 christos current_inputline = XRESIZEVEC (char, current_inputline, buffer_len);
487 1.1 skrll }
488 1.1 skrll memcpy (current_inputline, line, len);
489 1.1 skrll current_inputline[len] = ';';
490 1.1 skrll current_inputline[len + 1] = '\0';
491 1.1 skrll
492 1.1 skrll state = parse (current_inputline);
493 1.1 skrll if (state == NO_INSN_GENERATED)
494 1.1 skrll return;
495 1.1 skrll
496 1.1 skrll for (insn_size = 0, tmp_insn = insn; tmp_insn; tmp_insn = tmp_insn->next)
497 1.1 skrll if (!tmp_insn->reloc || !tmp_insn->exp->symbol)
498 1.1 skrll insn_size += 2;
499 1.1 skrll
500 1.1 skrll if (insn_size)
501 1.1 skrll toP = frag_more (insn_size);
502 1.1 skrll
503 1.1 skrll last_insn_size = insn_size;
504 1.1 skrll
505 1.1 skrll #ifdef DEBUG
506 1.1 skrll printf ("INS:");
507 1.1 skrll #endif
508 1.1 skrll while (insn)
509 1.1 skrll {
510 1.1 skrll if (insn->reloc && insn->exp->symbol)
511 1.1 skrll {
512 1.1 skrll char *prev_toP = toP - 2;
513 1.1 skrll switch (insn->reloc)
514 1.1 skrll {
515 1.1 skrll case BFD_RELOC_BFIN_24_PCREL_JUMP_L:
516 1.1 skrll case BFD_RELOC_24_PCREL:
517 1.1 skrll case BFD_RELOC_BFIN_16_LOW:
518 1.1 skrll case BFD_RELOC_BFIN_16_HIGH:
519 1.1 skrll size = 4;
520 1.1 skrll break;
521 1.1 skrll default:
522 1.1 skrll size = 2;
523 1.1 skrll }
524 1.1 skrll
525 1.1 skrll /* Following if condition checks for the arithmetic relocations.
526 1.1 skrll If the case then it doesn't required to generate the code.
527 1.1 skrll It has been assumed that, their ID will be contiguous. */
528 1.1 skrll if ((BFD_ARELOC_BFIN_PUSH <= insn->reloc
529 1.1 skrll && BFD_ARELOC_BFIN_COMP >= insn->reloc)
530 1.1 skrll || insn->reloc == BFD_RELOC_BFIN_16_IMM)
531 1.1 skrll {
532 1.1 skrll size = 2;
533 1.1 skrll }
534 1.1 skrll if (insn->reloc == BFD_ARELOC_BFIN_CONST
535 1.1 skrll || insn->reloc == BFD_ARELOC_BFIN_PUSH)
536 1.1 skrll size = 4;
537 1.1 skrll
538 1.1 skrll fix_new (frag_now,
539 1.1 skrll (prev_toP - frag_now->fr_literal),
540 1.1 skrll size, insn->exp->symbol, insn->exp->value,
541 1.1 skrll insn->pcrel, insn->reloc);
542 1.1 skrll }
543 1.1 skrll else
544 1.1 skrll {
545 1.1 skrll md_number_to_chars (toP, insn->value, 2);
546 1.1 skrll toP += 2;
547 1.1 skrll }
548 1.1 skrll
549 1.1 skrll #ifdef DEBUG
550 1.1 skrll printf (" reloc :");
551 1.1 skrll printf (" %02x%02x", ((unsigned char *) &insn->value)[0],
552 1.1 skrll ((unsigned char *) &insn->value)[1]);
553 1.1 skrll printf ("\n");
554 1.1 skrll #endif
555 1.1 skrll insn = insn->next;
556 1.1 skrll }
557 1.1 skrll #ifdef OBJ_ELF
558 1.1 skrll dwarf2_emit_insn (insn_size);
559 1.1 skrll #endif
560 1.1.1.2 christos
561 1.1.1.2 christos while (*line++ != '\0')
562 1.1.1.2 christos if (*line == '\n')
563 1.1.1.2 christos bump_line_counters ();
564 1.1 skrll }
565 1.1 skrll
566 1.1 skrll /* Parse one line of instructions, and generate opcode for it.
567 1.1 skrll To parse the line, YACC and LEX are used, because the instruction set
568 1.1 skrll syntax doesn't confirm to the AT&T assembly syntax.
569 1.1 skrll To call a YACC & LEX generated parser, we must provide the input via
570 1.1 skrll a FILE stream, otherwise stdin is used by default. Below the input
571 1.1 skrll to the function will be put into a temporary file, then the generated
572 1.1 skrll parser uses the temporary file for parsing. */
573 1.1 skrll
574 1.1 skrll static parse_state
575 1.1 skrll parse (char *line)
576 1.1 skrll {
577 1.1 skrll parse_state state;
578 1.1 skrll YY_BUFFER_STATE buffstate;
579 1.1 skrll
580 1.1 skrll buffstate = yy_scan_string (line);
581 1.1 skrll
582 1.1 skrll /* our lex requires setting the start state to keyword
583 1.1 skrll every line as the first word may be a keyword.
584 1.1 skrll Fixes a bug where we could not have keywords as labels. */
585 1.1 skrll set_start_state ();
586 1.1 skrll
587 1.1 skrll /* Call yyparse here. */
588 1.1 skrll state = yyparse ();
589 1.1 skrll if (state == SEMANTIC_ERROR)
590 1.1 skrll {
591 1.1 skrll as_bad (_("Parse failed."));
592 1.1 skrll insn = 0;
593 1.1 skrll }
594 1.1 skrll
595 1.1 skrll yy_delete_buffer (buffstate);
596 1.1 skrll return state;
597 1.1 skrll }
598 1.1 skrll
599 1.1 skrll /* We need to handle various expressions properly.
600 1.1 skrll Such as, [SP--] = 34, concerned by md_assemble(). */
601 1.1 skrll
602 1.1 skrll void
603 1.1 skrll md_operand (expressionS * expressionP)
604 1.1 skrll {
605 1.1 skrll if (*input_line_pointer == '[')
606 1.1 skrll {
607 1.1 skrll as_tsktsk ("We found a '['!");
608 1.1 skrll input_line_pointer++;
609 1.1 skrll expression (expressionP);
610 1.1 skrll }
611 1.1 skrll }
612 1.1 skrll
613 1.1 skrll /* Handle undefined symbols. */
614 1.1 skrll symbolS *
615 1.1 skrll md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
616 1.1 skrll {
617 1.1.1.10 christos return NULL;
618 1.1 skrll }
619 1.1 skrll
620 1.1 skrll int
621 1.1 skrll md_estimate_size_before_relax (fragS * fragP ATTRIBUTE_UNUSED,
622 1.1 skrll segT segment ATTRIBUTE_UNUSED)
623 1.1 skrll {
624 1.1 skrll return 0;
625 1.1 skrll }
626 1.1 skrll
627 1.1 skrll /* Convert from target byte order to host byte order. */
628 1.1 skrll
629 1.1 skrll static int
630 1.1 skrll md_chars_to_number (char *val, int n)
631 1.1 skrll {
632 1.1 skrll int retval;
633 1.1 skrll
634 1.1 skrll for (retval = 0; n--;)
635 1.1 skrll {
636 1.1 skrll retval <<= 8;
637 1.1 skrll retval |= val[n];
638 1.1 skrll }
639 1.1 skrll return retval;
640 1.1 skrll }
641 1.1 skrll
642 1.1 skrll void
643 1.1 skrll md_apply_fix (fixS *fixP, valueT *valueP, segT seg ATTRIBUTE_UNUSED)
644 1.1 skrll {
645 1.1 skrll char *where = fixP->fx_frag->fr_literal + fixP->fx_where;
646 1.1 skrll
647 1.1 skrll long value = *valueP;
648 1.1 skrll long newval;
649 1.1 skrll
650 1.1 skrll switch (fixP->fx_r_type)
651 1.1 skrll {
652 1.1 skrll case BFD_RELOC_BFIN_GOT:
653 1.1 skrll case BFD_RELOC_BFIN_GOT17M4:
654 1.1 skrll case BFD_RELOC_BFIN_FUNCDESC_GOT17M4:
655 1.1 skrll fixP->fx_no_overflow = 1;
656 1.1 skrll newval = md_chars_to_number (where, 2);
657 1.1 skrll newval |= 0x0 & 0x7f;
658 1.1 skrll md_number_to_chars (where, newval, 2);
659 1.1 skrll break;
660 1.1 skrll
661 1.1 skrll case BFD_RELOC_BFIN_10_PCREL:
662 1.1 skrll if (!value)
663 1.1 skrll break;
664 1.1 skrll if (value < -1024 || value > 1022)
665 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line,
666 1.1 skrll _("pcrel too far BFD_RELOC_BFIN_10"));
667 1.1 skrll
668 1.1 skrll /* 11 bit offset even numbered, so we remove right bit. */
669 1.1 skrll value = value >> 1;
670 1.1 skrll newval = md_chars_to_number (where, 2);
671 1.1 skrll newval |= value & 0x03ff;
672 1.1 skrll md_number_to_chars (where, newval, 2);
673 1.1 skrll break;
674 1.1 skrll
675 1.1 skrll case BFD_RELOC_BFIN_12_PCREL_JUMP:
676 1.1 skrll case BFD_RELOC_BFIN_12_PCREL_JUMP_S:
677 1.1 skrll case BFD_RELOC_12_PCREL:
678 1.1 skrll if (!value)
679 1.1 skrll break;
680 1.1 skrll
681 1.1 skrll if (value < -4096 || value > 4094)
682 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far BFD_RELOC_BFIN_12"));
683 1.1 skrll /* 13 bit offset even numbered, so we remove right bit. */
684 1.1 skrll value = value >> 1;
685 1.1 skrll newval = md_chars_to_number (where, 2);
686 1.1 skrll newval |= value & 0xfff;
687 1.1 skrll md_number_to_chars (where, newval, 2);
688 1.1 skrll break;
689 1.1 skrll
690 1.1 skrll case BFD_RELOC_BFIN_16_LOW:
691 1.1 skrll case BFD_RELOC_BFIN_16_HIGH:
692 1.1.1.8 christos fixP->fx_done = false;
693 1.1 skrll break;
694 1.1 skrll
695 1.1 skrll case BFD_RELOC_BFIN_24_PCREL_JUMP_L:
696 1.1 skrll case BFD_RELOC_BFIN_24_PCREL_CALL_X:
697 1.1 skrll case BFD_RELOC_24_PCREL:
698 1.1 skrll if (!value)
699 1.1 skrll break;
700 1.1 skrll
701 1.1 skrll if (value < -16777216 || value > 16777214)
702 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far BFD_RELOC_BFIN_24"));
703 1.1 skrll
704 1.1 skrll /* 25 bit offset even numbered, so we remove right bit. */
705 1.1 skrll value = value >> 1;
706 1.1 skrll value++;
707 1.1 skrll
708 1.1 skrll md_number_to_chars (where - 2, value >> 16, 1);
709 1.1 skrll md_number_to_chars (where, value, 1);
710 1.1 skrll md_number_to_chars (where + 1, value >> 8, 1);
711 1.1 skrll break;
712 1.1 skrll
713 1.1 skrll case BFD_RELOC_BFIN_5_PCREL: /* LSETUP (a, b) : "a" */
714 1.1 skrll if (!value)
715 1.1 skrll break;
716 1.1 skrll if (value < 4 || value > 30)
717 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far BFD_RELOC_BFIN_5"));
718 1.1 skrll value = value >> 1;
719 1.1 skrll newval = md_chars_to_number (where, 1);
720 1.1 skrll newval = (newval & 0xf0) | (value & 0xf);
721 1.1 skrll md_number_to_chars (where, newval, 1);
722 1.1 skrll break;
723 1.1 skrll
724 1.1 skrll case BFD_RELOC_BFIN_11_PCREL: /* LSETUP (a, b) : "b" */
725 1.1 skrll if (!value)
726 1.1 skrll break;
727 1.1 skrll value += 2;
728 1.1 skrll if (value < 4 || value > 2046)
729 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line, _("pcrel too far BFD_RELOC_BFIN_11_PCREL"));
730 1.1 skrll /* 11 bit unsigned even, so we remove right bit. */
731 1.1 skrll value = value >> 1;
732 1.1 skrll newval = md_chars_to_number (where, 2);
733 1.1 skrll newval |= value & 0x03ff;
734 1.1 skrll md_number_to_chars (where, newval, 2);
735 1.1 skrll break;
736 1.1 skrll
737 1.1 skrll case BFD_RELOC_8:
738 1.1 skrll if (value < -0x80 || value >= 0x7f)
739 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line, _("rel too far BFD_RELOC_8"));
740 1.1 skrll md_number_to_chars (where, value, 1);
741 1.1 skrll break;
742 1.1 skrll
743 1.1 skrll case BFD_RELOC_BFIN_16_IMM:
744 1.1 skrll case BFD_RELOC_16:
745 1.1 skrll if (value < -0x8000 || value >= 0x7fff)
746 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line, _("rel too far BFD_RELOC_16"));
747 1.1 skrll md_number_to_chars (where, value, 2);
748 1.1 skrll break;
749 1.1 skrll
750 1.1 skrll case BFD_RELOC_32:
751 1.1 skrll md_number_to_chars (where, value, 4);
752 1.1 skrll break;
753 1.1 skrll
754 1.1 skrll case BFD_RELOC_BFIN_PLTPC:
755 1.1 skrll md_number_to_chars (where, value, 2);
756 1.1 skrll break;
757 1.1 skrll
758 1.1 skrll case BFD_RELOC_BFIN_FUNCDESC:
759 1.1 skrll case BFD_RELOC_VTABLE_INHERIT:
760 1.1 skrll case BFD_RELOC_VTABLE_ENTRY:
761 1.1.1.8 christos fixP->fx_done = false;
762 1.1 skrll break;
763 1.1 skrll
764 1.1 skrll default:
765 1.1 skrll if ((BFD_ARELOC_BFIN_PUSH > fixP->fx_r_type) || (BFD_ARELOC_BFIN_COMP < fixP->fx_r_type))
766 1.1 skrll {
767 1.1 skrll fprintf (stderr, "Relocation %d not handled in gas." " Contact support.\n", fixP->fx_r_type);
768 1.1 skrll return;
769 1.1 skrll }
770 1.1 skrll }
771 1.1 skrll
772 1.1 skrll if (!fixP->fx_addsy)
773 1.1.1.8 christos fixP->fx_done = true;
774 1.1 skrll
775 1.1 skrll }
776 1.1 skrll
777 1.1 skrll /* Round up a section size to the appropriate boundary. */
778 1.1 skrll valueT
779 1.1.1.5 christos md_section_align (segT segment, valueT size)
780 1.1 skrll {
781 1.1.1.7 christos int boundary = bfd_section_alignment (segment);
782 1.1.1.4 christos return ((size + (1 << boundary) - 1) & -(1 << boundary));
783 1.1 skrll }
784 1.1 skrll
785 1.1 skrll
786 1.1.1.5 christos const char *
787 1.1 skrll md_atof (int type, char * litP, int * sizeP)
788 1.1 skrll {
789 1.1.1.8 christos return ieee_md_atof (type, litP, sizeP, false);
790 1.1 skrll }
791 1.1 skrll
792 1.1 skrll
793 1.1 skrll /* If while processing a fixup, a reloc really needs to be created
794 1.1 skrll then it is done here. */
795 1.1 skrll
796 1.1 skrll arelent *
797 1.1.1.5 christos tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixp)
798 1.1 skrll {
799 1.1 skrll arelent *reloc;
800 1.1 skrll
801 1.1.1.10 christos reloc = notes_alloc (sizeof (arelent));
802 1.1.1.10 christos reloc->sym_ptr_ptr = notes_alloc (sizeof (asymbol *));
803 1.1 skrll *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
804 1.1.1.10 christos reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
805 1.1 skrll
806 1.1 skrll reloc->addend = fixp->fx_offset;
807 1.1 skrll reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
808 1.1 skrll
809 1.1.1.10 christos if (reloc->howto == NULL)
810 1.1 skrll {
811 1.1 skrll as_bad_where (fixp->fx_file, fixp->fx_line,
812 1.1 skrll /* xgettext:c-format. */
813 1.1 skrll _("reloc %d not supported by object file format"),
814 1.1 skrll (int) fixp->fx_r_type);
815 1.1 skrll return NULL;
816 1.1 skrll }
817 1.1 skrll
818 1.1 skrll return reloc;
819 1.1 skrll }
820 1.1 skrll
821 1.1 skrll /* The location from which a PC relative jump should be calculated,
822 1.1 skrll given a PC relative reloc. */
823 1.1 skrll
824 1.1 skrll long
825 1.1.1.5 christos md_pcrel_from_section (fixS *fixP, segT sec)
826 1.1 skrll {
827 1.1.1.10 christos if (fixP->fx_addsy != NULL
828 1.1 skrll && (!S_IS_DEFINED (fixP->fx_addsy)
829 1.1 skrll || S_GET_SEGMENT (fixP->fx_addsy) != sec))
830 1.1 skrll {
831 1.1 skrll /* The symbol is undefined (or is defined but not in this section).
832 1.1 skrll Let the linker figure it out. */
833 1.1 skrll return 0;
834 1.1 skrll }
835 1.1 skrll return fixP->fx_frag->fr_address + fixP->fx_where;
836 1.1 skrll }
837 1.1 skrll
838 1.1 skrll /* Return true if the fix can be handled by GAS, false if it must
839 1.1 skrll be passed through to the linker. */
840 1.1 skrll
841 1.1.1.8 christos bool
842 1.1 skrll bfin_fix_adjustable (fixS *fixP)
843 1.1.1.2 christos {
844 1.1 skrll switch (fixP->fx_r_type)
845 1.1.1.2 christos {
846 1.1 skrll /* Adjust_reloc_syms doesn't know about the GOT. */
847 1.1 skrll case BFD_RELOC_BFIN_GOT:
848 1.1 skrll case BFD_RELOC_BFIN_PLTPC:
849 1.1 skrll /* We need the symbol name for the VTABLE entries. */
850 1.1 skrll case BFD_RELOC_VTABLE_INHERIT:
851 1.1 skrll case BFD_RELOC_VTABLE_ENTRY:
852 1.1 skrll return 0;
853 1.1.1.2 christos
854 1.1 skrll default:
855 1.1 skrll return 1;
856 1.1 skrll }
857 1.1 skrll }
858 1.1 skrll
859 1.1 skrll /* Special extra functions that help bfin-parse.y perform its job. */
860 1.1 skrll
861 1.1 skrll struct obstack mempool;
862 1.1 skrll
863 1.1 skrll INSTR_T
864 1.1 skrll conscode (INSTR_T head, INSTR_T tail)
865 1.1 skrll {
866 1.1 skrll if (!head)
867 1.1 skrll return tail;
868 1.1 skrll head->next = tail;
869 1.1 skrll return head;
870 1.1 skrll }
871 1.1 skrll
872 1.1 skrll INSTR_T
873 1.1 skrll conctcode (INSTR_T head, INSTR_T tail)
874 1.1 skrll {
875 1.1 skrll INSTR_T temp = (head);
876 1.1 skrll if (!head)
877 1.1 skrll return tail;
878 1.1 skrll while (temp->next)
879 1.1 skrll temp = temp->next;
880 1.1 skrll temp->next = tail;
881 1.1 skrll
882 1.1 skrll return head;
883 1.1 skrll }
884 1.1 skrll
885 1.1 skrll INSTR_T
886 1.1 skrll note_reloc (INSTR_T code, Expr_Node * symbol, int reloc, int pcrel)
887 1.1 skrll {
888 1.1 skrll /* Assert that the symbol is not an operator. */
889 1.1.1.2 christos gas_assert (symbol->type == Expr_Node_Reloc);
890 1.1 skrll
891 1.1 skrll return note_reloc1 (code, symbol->value.s_value, reloc, pcrel);
892 1.1 skrll
893 1.1 skrll }
894 1.1 skrll
895 1.1 skrll INSTR_T
896 1.1 skrll note_reloc1 (INSTR_T code, const char *symbol, int reloc, int pcrel)
897 1.1 skrll {
898 1.1 skrll code->reloc = reloc;
899 1.1 skrll code->exp = mkexpr (0, symbol_find_or_make (symbol));
900 1.1 skrll code->pcrel = pcrel;
901 1.1 skrll return code;
902 1.1 skrll }
903 1.1 skrll
904 1.1 skrll INSTR_T
905 1.1 skrll note_reloc2 (INSTR_T code, const char *symbol, int reloc, int value, int pcrel)
906 1.1 skrll {
907 1.1 skrll code->reloc = reloc;
908 1.1 skrll code->exp = mkexpr (value, symbol_find_or_make (symbol));
909 1.1 skrll code->pcrel = pcrel;
910 1.1 skrll return code;
911 1.1 skrll }
912 1.1 skrll
913 1.1 skrll INSTR_T
914 1.1 skrll gencode (unsigned long x)
915 1.1 skrll {
916 1.1.1.5 christos INSTR_T cell = XOBNEW (&mempool, struct bfin_insn);
917 1.1 skrll memset (cell, 0, sizeof (struct bfin_insn));
918 1.1 skrll cell->value = (x);
919 1.1 skrll return cell;
920 1.1 skrll }
921 1.1 skrll
922 1.1 skrll int reloc;
923 1.1 skrll int ninsns;
924 1.1 skrll int count_insns;
925 1.1 skrll
926 1.1 skrll static void *
927 1.1.1.4 christos allocate (size_t n)
928 1.1 skrll {
929 1.1.1.2 christos return obstack_alloc (&mempool, n);
930 1.1 skrll }
931 1.1 skrll
932 1.1 skrll Expr_Node *
933 1.1 skrll Expr_Node_Create (Expr_Node_Type type,
934 1.1 skrll Expr_Node_Value value,
935 1.1 skrll Expr_Node *Left_Child,
936 1.1 skrll Expr_Node *Right_Child)
937 1.1 skrll {
938 1.1 skrll
939 1.1 skrll
940 1.1.1.10 christos Expr_Node *node = allocate (sizeof (Expr_Node));
941 1.1 skrll node->type = type;
942 1.1 skrll node->value = value;
943 1.1 skrll node->Left_Child = Left_Child;
944 1.1 skrll node->Right_Child = Right_Child;
945 1.1 skrll return node;
946 1.1 skrll }
947 1.1 skrll
948 1.1 skrll static const char *con = ".__constant";
949 1.1 skrll static const char *op = ".__operator";
950 1.1 skrll static INSTR_T Expr_Node_Gen_Reloc_R (Expr_Node * head);
951 1.1 skrll INSTR_T Expr_Node_Gen_Reloc (Expr_Node *head, int parent_reloc);
952 1.1 skrll
953 1.1 skrll INSTR_T
954 1.1 skrll Expr_Node_Gen_Reloc (Expr_Node * head, int parent_reloc)
955 1.1 skrll {
956 1.1.1.6 christos /* Top level relocation expression generator VDSP style.
957 1.1 skrll If the relocation is just by itself, generate one item
958 1.1 skrll else generate this convoluted expression. */
959 1.1 skrll
960 1.1 skrll INSTR_T note = NULL_CODE;
961 1.1 skrll INSTR_T note1 = NULL_CODE;
962 1.1.1.6 christos int pcrel = 1; /* Is the parent reloc pc-relative?
963 1.1 skrll This calculation here and HOWTO should match. */
964 1.1 skrll
965 1.1 skrll if (parent_reloc)
966 1.1 skrll {
967 1.1 skrll /* If it's 32 bit quantity then 16bit code needs to be added. */
968 1.1 skrll int value = 0;
969 1.1 skrll
970 1.1 skrll if (head->type == Expr_Node_Constant)
971 1.1 skrll {
972 1.1 skrll /* If note1 is not null code, we have to generate a right
973 1.1 skrll aligned value for the constant. Otherwise the reloc is
974 1.1 skrll a part of the basic command and the yacc file
975 1.1 skrll generates this. */
976 1.1 skrll value = head->value.i_value;
977 1.1 skrll }
978 1.1 skrll switch (parent_reloc)
979 1.1 skrll {
980 1.1 skrll /* Some relocations will need to allocate extra words. */
981 1.1 skrll case BFD_RELOC_BFIN_16_IMM:
982 1.1 skrll case BFD_RELOC_BFIN_16_LOW:
983 1.1 skrll case BFD_RELOC_BFIN_16_HIGH:
984 1.1 skrll note1 = conscode (gencode (value), NULL_CODE);
985 1.1 skrll pcrel = 0;
986 1.1 skrll break;
987 1.1 skrll case BFD_RELOC_BFIN_PLTPC:
988 1.1 skrll note1 = conscode (gencode (value), NULL_CODE);
989 1.1 skrll pcrel = 0;
990 1.1 skrll break;
991 1.1 skrll case BFD_RELOC_16:
992 1.1 skrll case BFD_RELOC_BFIN_GOT:
993 1.1 skrll case BFD_RELOC_BFIN_GOT17M4:
994 1.1 skrll case BFD_RELOC_BFIN_FUNCDESC_GOT17M4:
995 1.1 skrll note1 = conscode (gencode (value), NULL_CODE);
996 1.1 skrll pcrel = 0;
997 1.1 skrll break;
998 1.1 skrll case BFD_RELOC_24_PCREL:
999 1.1 skrll case BFD_RELOC_BFIN_24_PCREL_JUMP_L:
1000 1.1 skrll case BFD_RELOC_BFIN_24_PCREL_CALL_X:
1001 1.1 skrll /* These offsets are even numbered pcrel. */
1002 1.1 skrll note1 = conscode (gencode (value >> 1), NULL_CODE);
1003 1.1 skrll break;
1004 1.1 skrll default:
1005 1.1 skrll note1 = NULL_CODE;
1006 1.1 skrll }
1007 1.1 skrll }
1008 1.1 skrll if (head->type == Expr_Node_Constant)
1009 1.1 skrll note = note1;
1010 1.1 skrll else if (head->type == Expr_Node_Reloc)
1011 1.1 skrll {
1012 1.1 skrll note = note_reloc1 (gencode (0), head->value.s_value, parent_reloc, pcrel);
1013 1.1 skrll if (note1 != NULL_CODE)
1014 1.1 skrll note = conscode (note1, note);
1015 1.1 skrll }
1016 1.1 skrll else if (head->type == Expr_Node_Binop
1017 1.1 skrll && (head->value.op_value == Expr_Op_Type_Add
1018 1.1 skrll || head->value.op_value == Expr_Op_Type_Sub)
1019 1.1 skrll && head->Left_Child->type == Expr_Node_Reloc
1020 1.1 skrll && head->Right_Child->type == Expr_Node_Constant)
1021 1.1 skrll {
1022 1.1 skrll int val = head->Right_Child->value.i_value;
1023 1.1 skrll if (head->value.op_value == Expr_Op_Type_Sub)
1024 1.1 skrll val = -val;
1025 1.1 skrll note = conscode (note_reloc2 (gencode (0), head->Left_Child->value.s_value,
1026 1.1 skrll parent_reloc, val, 0),
1027 1.1 skrll NULL_CODE);
1028 1.1 skrll if (note1 != NULL_CODE)
1029 1.1 skrll note = conscode (note1, note);
1030 1.1 skrll }
1031 1.1 skrll else
1032 1.1 skrll {
1033 1.1 skrll /* Call the recursive function. */
1034 1.1 skrll note = note_reloc1 (gencode (0), op, parent_reloc, pcrel);
1035 1.1 skrll if (note1 != NULL_CODE)
1036 1.1 skrll note = conscode (note1, note);
1037 1.1 skrll note = conctcode (Expr_Node_Gen_Reloc_R (head), note);
1038 1.1 skrll }
1039 1.1 skrll return note;
1040 1.1 skrll }
1041 1.1 skrll
1042 1.1 skrll static INSTR_T
1043 1.1 skrll Expr_Node_Gen_Reloc_R (Expr_Node * head)
1044 1.1 skrll {
1045 1.1 skrll
1046 1.1 skrll INSTR_T note = 0;
1047 1.1 skrll INSTR_T note1 = 0;
1048 1.1 skrll
1049 1.1 skrll switch (head->type)
1050 1.1 skrll {
1051 1.1 skrll case Expr_Node_Constant:
1052 1.1 skrll note = conscode (note_reloc2 (gencode (0), con, BFD_ARELOC_BFIN_CONST, head->value.i_value, 0), NULL_CODE);
1053 1.1 skrll break;
1054 1.1 skrll case Expr_Node_Reloc:
1055 1.1 skrll note = conscode (note_reloc (gencode (0), head, BFD_ARELOC_BFIN_PUSH, 0), NULL_CODE);
1056 1.1 skrll break;
1057 1.1 skrll case Expr_Node_Binop:
1058 1.1 skrll note1 = conctcode (Expr_Node_Gen_Reloc_R (head->Left_Child), Expr_Node_Gen_Reloc_R (head->Right_Child));
1059 1.1 skrll switch (head->value.op_value)
1060 1.1 skrll {
1061 1.1 skrll case Expr_Op_Type_Add:
1062 1.1 skrll note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_ADD, 0), NULL_CODE));
1063 1.1 skrll break;
1064 1.1 skrll case Expr_Op_Type_Sub:
1065 1.1 skrll note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_SUB, 0), NULL_CODE));
1066 1.1 skrll break;
1067 1.1 skrll case Expr_Op_Type_Mult:
1068 1.1 skrll note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_MULT, 0), NULL_CODE));
1069 1.1 skrll break;
1070 1.1 skrll case Expr_Op_Type_Div:
1071 1.1 skrll note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_DIV, 0), NULL_CODE));
1072 1.1 skrll break;
1073 1.1 skrll case Expr_Op_Type_Mod:
1074 1.1 skrll note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_MOD, 0), NULL_CODE));
1075 1.1 skrll break;
1076 1.1 skrll case Expr_Op_Type_Lshift:
1077 1.1 skrll note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_LSHIFT, 0), NULL_CODE));
1078 1.1 skrll break;
1079 1.1 skrll case Expr_Op_Type_Rshift:
1080 1.1 skrll note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_RSHIFT, 0), NULL_CODE));
1081 1.1 skrll break;
1082 1.1 skrll case Expr_Op_Type_BAND:
1083 1.1 skrll note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_AND, 0), NULL_CODE));
1084 1.1 skrll break;
1085 1.1 skrll case Expr_Op_Type_BOR:
1086 1.1 skrll note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_OR, 0), NULL_CODE));
1087 1.1 skrll break;
1088 1.1 skrll case Expr_Op_Type_BXOR:
1089 1.1 skrll note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_XOR, 0), NULL_CODE));
1090 1.1 skrll break;
1091 1.1 skrll case Expr_Op_Type_LAND:
1092 1.1 skrll note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_LAND, 0), NULL_CODE));
1093 1.1 skrll break;
1094 1.1 skrll case Expr_Op_Type_LOR:
1095 1.1 skrll note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_LOR, 0), NULL_CODE));
1096 1.1 skrll break;
1097 1.1 skrll default:
1098 1.1 skrll fprintf (stderr, "%s:%d:Unknown operator found for arithmetic" " relocation", __FILE__, __LINE__);
1099 1.1 skrll
1100 1.1 skrll
1101 1.1 skrll }
1102 1.1 skrll break;
1103 1.1 skrll case Expr_Node_Unop:
1104 1.1 skrll note1 = conscode (Expr_Node_Gen_Reloc_R (head->Left_Child), NULL_CODE);
1105 1.1 skrll switch (head->value.op_value)
1106 1.1 skrll {
1107 1.1 skrll case Expr_Op_Type_NEG:
1108 1.1 skrll note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_NEG, 0), NULL_CODE));
1109 1.1 skrll break;
1110 1.1 skrll case Expr_Op_Type_COMP:
1111 1.1 skrll note = conctcode (note1, conscode (note_reloc1 (gencode (0), op, BFD_ARELOC_BFIN_COMP, 0), NULL_CODE));
1112 1.1 skrll break;
1113 1.1 skrll default:
1114 1.1 skrll fprintf (stderr, "%s:%d:Unknown operator found for arithmetic" " relocation", __FILE__, __LINE__);
1115 1.1 skrll }
1116 1.1 skrll break;
1117 1.1 skrll default:
1118 1.1 skrll fprintf (stderr, "%s:%d:Unknown node expression found during " "arithmetic relocation generation", __FILE__, __LINE__);
1119 1.1 skrll }
1120 1.1 skrll return note;
1121 1.1 skrll }
1122 1.1.1.2 christos
1123 1.1 skrll /* Blackfin opcode generation. */
1125 1.1 skrll
1126 1.1 skrll /* These functions are called by the generated parser
1127 1.1 skrll (from bfin-parse.y), the register type classification
1128 1.1 skrll happens in bfin-lex.l. */
1129 1.1 skrll
1130 1.1 skrll #include "bfin-aux.h"
1131 1.1 skrll #include "opcode/bfin.h"
1132 1.1 skrll
1133 1.1 skrll #define INIT(t) t c_code = init_##t
1134 1.1.1.2 christos #define ASSIGN(x) c_code.opcode |= ((x & c_code.mask_##x)<<c_code.bits_##x)
1135 1.1 skrll #define ASSIGNF(x,f) c_code.opcode |= ((x & c_code.mask_##f)<<c_code.bits_##f)
1136 1.1 skrll #define ASSIGN_R(x) c_code.opcode |= (((x ? (x->regno & CODE_MASK) : 0) & c_code.mask_##x)<<c_code.bits_##x)
1137 1.1 skrll
1138 1.1 skrll #define HI(x) ((x >> 16) & 0xffff)
1139 1.1 skrll #define LO(x) ((x ) & 0xffff)
1140 1.1 skrll
1141 1.1 skrll #define GROUP(x) ((x->regno & CLASS_MASK) >> 4)
1142 1.1 skrll
1143 1.1 skrll #define GEN_OPCODE32() \
1144 1.1 skrll conscode (gencode (HI (c_code.opcode)), \
1145 1.1 skrll conscode (gencode (LO (c_code.opcode)), NULL_CODE))
1146 1.1 skrll
1147 1.1 skrll #define GEN_OPCODE16() \
1148 1.1 skrll conscode (gencode (c_code.opcode), NULL_CODE)
1149 1.1 skrll
1150 1.1 skrll
1151 1.1 skrll /* 32 BIT INSTRUCTIONS. */
1152 1.1 skrll
1153 1.1 skrll
1154 1.1 skrll /* DSP32 instruction generation. */
1155 1.1 skrll
1156 1.1 skrll INSTR_T
1157 1.1 skrll bfin_gen_dsp32mac (int op1, int MM, int mmod, int w1, int P,
1158 1.1 skrll int h01, int h11, int h00, int h10, int op0,
1159 1.1 skrll REG_T dst, REG_T src0, REG_T src1, int w0)
1160 1.1 skrll {
1161 1.1 skrll INIT (DSP32Mac);
1162 1.1 skrll
1163 1.1 skrll ASSIGN (op0);
1164 1.1 skrll ASSIGN (op1);
1165 1.1 skrll ASSIGN (MM);
1166 1.1 skrll ASSIGN (mmod);
1167 1.1 skrll ASSIGN (w0);
1168 1.1 skrll ASSIGN (w1);
1169 1.1 skrll ASSIGN (h01);
1170 1.1 skrll ASSIGN (h11);
1171 1.1 skrll ASSIGN (h00);
1172 1.1 skrll ASSIGN (h10);
1173 1.1 skrll ASSIGN (P);
1174 1.1 skrll
1175 1.1 skrll /* If we have full reg assignments, mask out LSB to encode
1176 1.1 skrll single or simultaneous even/odd register moves. */
1177 1.1 skrll if (P)
1178 1.1 skrll {
1179 1.1 skrll dst->regno &= 0x06;
1180 1.1 skrll }
1181 1.1 skrll
1182 1.1 skrll ASSIGN_R (dst);
1183 1.1 skrll ASSIGN_R (src0);
1184 1.1 skrll ASSIGN_R (src1);
1185 1.1 skrll
1186 1.1 skrll return GEN_OPCODE32 ();
1187 1.1 skrll }
1188 1.1 skrll
1189 1.1 skrll INSTR_T
1190 1.1 skrll bfin_gen_dsp32mult (int op1, int MM, int mmod, int w1, int P,
1191 1.1 skrll int h01, int h11, int h00, int h10, int op0,
1192 1.1 skrll REG_T dst, REG_T src0, REG_T src1, int w0)
1193 1.1 skrll {
1194 1.1 skrll INIT (DSP32Mult);
1195 1.1 skrll
1196 1.1 skrll ASSIGN (op0);
1197 1.1 skrll ASSIGN (op1);
1198 1.1 skrll ASSIGN (MM);
1199 1.1 skrll ASSIGN (mmod);
1200 1.1 skrll ASSIGN (w0);
1201 1.1 skrll ASSIGN (w1);
1202 1.1 skrll ASSIGN (h01);
1203 1.1 skrll ASSIGN (h11);
1204 1.1 skrll ASSIGN (h00);
1205 1.1 skrll ASSIGN (h10);
1206 1.1 skrll ASSIGN (P);
1207 1.1 skrll
1208 1.1 skrll if (P)
1209 1.1 skrll {
1210 1.1 skrll dst->regno &= 0x06;
1211 1.1 skrll }
1212 1.1 skrll
1213 1.1 skrll ASSIGN_R (dst);
1214 1.1 skrll ASSIGN_R (src0);
1215 1.1 skrll ASSIGN_R (src1);
1216 1.1 skrll
1217 1.1 skrll return GEN_OPCODE32 ();
1218 1.1 skrll }
1219 1.1 skrll
1220 1.1 skrll INSTR_T
1221 1.1 skrll bfin_gen_dsp32alu (int HL, int aopcde, int aop, int s, int x,
1222 1.1 skrll REG_T dst0, REG_T dst1, REG_T src0, REG_T src1)
1223 1.1 skrll {
1224 1.1 skrll INIT (DSP32Alu);
1225 1.1 skrll
1226 1.1 skrll ASSIGN (HL);
1227 1.1 skrll ASSIGN (aopcde);
1228 1.1 skrll ASSIGN (aop);
1229 1.1 skrll ASSIGN (s);
1230 1.1 skrll ASSIGN (x);
1231 1.1 skrll ASSIGN_R (dst0);
1232 1.1 skrll ASSIGN_R (dst1);
1233 1.1 skrll ASSIGN_R (src0);
1234 1.1 skrll ASSIGN_R (src1);
1235 1.1 skrll
1236 1.1 skrll return GEN_OPCODE32 ();
1237 1.1 skrll }
1238 1.1 skrll
1239 1.1 skrll INSTR_T
1240 1.1 skrll bfin_gen_dsp32shift (int sopcde, REG_T dst0, REG_T src0,
1241 1.1 skrll REG_T src1, int sop, int HLs)
1242 1.1 skrll {
1243 1.1 skrll INIT (DSP32Shift);
1244 1.1 skrll
1245 1.1 skrll ASSIGN (sopcde);
1246 1.1 skrll ASSIGN (sop);
1247 1.1 skrll ASSIGN (HLs);
1248 1.1 skrll
1249 1.1 skrll ASSIGN_R (dst0);
1250 1.1 skrll ASSIGN_R (src0);
1251 1.1 skrll ASSIGN_R (src1);
1252 1.1 skrll
1253 1.1 skrll return GEN_OPCODE32 ();
1254 1.1 skrll }
1255 1.1 skrll
1256 1.1 skrll INSTR_T
1257 1.1 skrll bfin_gen_dsp32shiftimm (int sopcde, REG_T dst0, int immag,
1258 1.1 skrll REG_T src1, int sop, int HLs)
1259 1.1 skrll {
1260 1.1 skrll INIT (DSP32ShiftImm);
1261 1.1 skrll
1262 1.1 skrll ASSIGN (sopcde);
1263 1.1 skrll ASSIGN (sop);
1264 1.1 skrll ASSIGN (HLs);
1265 1.1 skrll
1266 1.1 skrll ASSIGN_R (dst0);
1267 1.1 skrll ASSIGN (immag);
1268 1.1 skrll ASSIGN_R (src1);
1269 1.1 skrll
1270 1.1 skrll return GEN_OPCODE32 ();
1271 1.1 skrll }
1272 1.1 skrll
1273 1.1 skrll /* LOOP SETUP. */
1274 1.1 skrll
1275 1.1 skrll INSTR_T
1276 1.1 skrll bfin_gen_loopsetup (Expr_Node * psoffset, REG_T c, int rop,
1277 1.1 skrll Expr_Node * peoffset, REG_T reg)
1278 1.1 skrll {
1279 1.1 skrll int soffset, eoffset;
1280 1.1 skrll INIT (LoopSetup);
1281 1.1 skrll
1282 1.1 skrll soffset = (EXPR_VALUE (psoffset) >> 1);
1283 1.1 skrll ASSIGN (soffset);
1284 1.1 skrll eoffset = (EXPR_VALUE (peoffset) >> 1);
1285 1.1 skrll ASSIGN (eoffset);
1286 1.1 skrll ASSIGN (rop);
1287 1.1 skrll ASSIGN_R (c);
1288 1.1 skrll ASSIGN_R (reg);
1289 1.1 skrll
1290 1.1 skrll return
1291 1.1 skrll conscode (gencode (HI (c_code.opcode)),
1292 1.1 skrll conctcode (Expr_Node_Gen_Reloc (psoffset, BFD_RELOC_BFIN_5_PCREL),
1293 1.1 skrll conctcode (gencode (LO (c_code.opcode)), Expr_Node_Gen_Reloc (peoffset, BFD_RELOC_BFIN_11_PCREL))));
1294 1.1 skrll
1295 1.1 skrll }
1296 1.1 skrll
1297 1.1 skrll /* Call, Link. */
1298 1.1 skrll
1299 1.1 skrll INSTR_T
1300 1.1 skrll bfin_gen_calla (Expr_Node * addr, int S)
1301 1.1 skrll {
1302 1.1 skrll int val;
1303 1.1.1.2 christos int high_val;
1304 1.1 skrll int rel = 0;
1305 1.1 skrll INIT (CALLa);
1306 1.1 skrll
1307 1.1.1.2 christos switch(S){
1308 1.1.1.2 christos case 0 : rel = BFD_RELOC_BFIN_24_PCREL_JUMP_L; break;
1309 1.1.1.2 christos case 1 : rel = BFD_RELOC_24_PCREL; break;
1310 1.1 skrll case 2 : rel = BFD_RELOC_BFIN_PLTPC; break;
1311 1.1 skrll default : break;
1312 1.1 skrll }
1313 1.1 skrll
1314 1.1 skrll ASSIGN (S);
1315 1.1 skrll
1316 1.1 skrll val = EXPR_VALUE (addr) >> 1;
1317 1.1 skrll high_val = val >> 16;
1318 1.1 skrll
1319 1.1.1.2 christos return conscode (gencode (HI (c_code.opcode) | (high_val & 0xff)),
1320 1.1 skrll Expr_Node_Gen_Reloc (addr, rel));
1321 1.1 skrll }
1322 1.1 skrll
1323 1.1 skrll INSTR_T
1324 1.1 skrll bfin_gen_linkage (int R, int framesize)
1325 1.1 skrll {
1326 1.1 skrll INIT (Linkage);
1327 1.1 skrll
1328 1.1 skrll ASSIGN (R);
1329 1.1 skrll ASSIGN (framesize);
1330 1.1 skrll
1331 1.1 skrll return GEN_OPCODE32 ();
1332 1.1 skrll }
1333 1.1 skrll
1334 1.1 skrll
1335 1.1 skrll /* Load and Store. */
1336 1.1 skrll
1337 1.1.1.2 christos INSTR_T
1338 1.1 skrll bfin_gen_ldimmhalf (REG_T reg, int H, int S, int Z, Expr_Node * phword, int rel)
1339 1.1 skrll {
1340 1.1 skrll int grp, hword;
1341 1.1 skrll unsigned val = EXPR_VALUE (phword);
1342 1.1 skrll INIT (LDIMMhalf);
1343 1.1 skrll
1344 1.1 skrll ASSIGN (H);
1345 1.1 skrll ASSIGN (S);
1346 1.1 skrll ASSIGN (Z);
1347 1.1 skrll
1348 1.1 skrll ASSIGN_R (reg);
1349 1.1 skrll grp = (GROUP (reg));
1350 1.1.1.2 christos ASSIGN (grp);
1351 1.1 skrll if (rel == 2)
1352 1.1 skrll {
1353 1.1 skrll return conscode (gencode (HI (c_code.opcode)), Expr_Node_Gen_Reloc (phword, BFD_RELOC_BFIN_16_IMM));
1354 1.1.1.2 christos }
1355 1.1 skrll else if (rel == 1)
1356 1.1 skrll {
1357 1.1 skrll return conscode (gencode (HI (c_code.opcode)), Expr_Node_Gen_Reloc (phword, IS_H (*reg) ? BFD_RELOC_BFIN_16_HIGH : BFD_RELOC_BFIN_16_LOW));
1358 1.1 skrll }
1359 1.1 skrll else
1360 1.1 skrll {
1361 1.1 skrll hword = val;
1362 1.1 skrll ASSIGN (hword);
1363 1.1 skrll }
1364 1.1 skrll return GEN_OPCODE32 ();
1365 1.1 skrll }
1366 1.1 skrll
1367 1.1 skrll INSTR_T
1368 1.1 skrll bfin_gen_ldstidxi (REG_T ptr, REG_T reg, int W, int sz, int Z, Expr_Node * poffset)
1369 1.1 skrll {
1370 1.1 skrll INIT (LDSTidxI);
1371 1.1 skrll
1372 1.1 skrll if (!IS_PREG (*ptr) || (!IS_DREG (*reg) && !Z))
1373 1.1 skrll {
1374 1.1 skrll fprintf (stderr, "Warning: possible mixup of Preg/Dreg\n");
1375 1.1 skrll return 0;
1376 1.1 skrll }
1377 1.1 skrll
1378 1.1 skrll ASSIGN_R (ptr);
1379 1.1 skrll ASSIGN_R (reg);
1380 1.1 skrll ASSIGN (W);
1381 1.1 skrll ASSIGN (sz);
1382 1.1 skrll
1383 1.1 skrll ASSIGN (Z);
1384 1.1 skrll
1385 1.1 skrll if (poffset->type != Expr_Node_Constant)
1386 1.1 skrll {
1387 1.1 skrll /* a GOT relocation such as R0 = [P5 + symbol@GOT] */
1388 1.1 skrll /* distinguish between R0 = [P5 + symbol@GOT] and
1389 1.1 skrll P5 = [P5 + _current_shared_library_p5_offset_]
1390 1.1 skrll */
1391 1.1 skrll if (poffset->type == Expr_Node_Reloc
1392 1.1 skrll && !strcmp (poffset->value.s_value,
1393 1.1 skrll "_current_shared_library_p5_offset_"))
1394 1.1 skrll {
1395 1.1 skrll return conscode (gencode (HI (c_code.opcode)),
1396 1.1 skrll Expr_Node_Gen_Reloc(poffset, BFD_RELOC_16));
1397 1.1 skrll }
1398 1.1 skrll else if (poffset->type != Expr_Node_GOT_Reloc)
1399 1.1 skrll abort ();
1400 1.1 skrll
1401 1.1 skrll return conscode (gencode (HI (c_code.opcode)),
1402 1.1 skrll Expr_Node_Gen_Reloc(poffset->Left_Child,
1403 1.1 skrll poffset->value.i_value));
1404 1.1 skrll }
1405 1.1 skrll else
1406 1.1 skrll {
1407 1.1 skrll int value, offset;
1408 1.1.1.2 christos switch (sz)
1409 1.1.1.2 christos { /* load/store access size */
1410 1.1 skrll case 0: /* 32 bit */
1411 1.1 skrll value = EXPR_VALUE (poffset) >> 2;
1412 1.1.1.2 christos break;
1413 1.1 skrll case 1: /* 16 bit */
1414 1.1 skrll value = EXPR_VALUE (poffset) >> 1;
1415 1.1.1.2 christos break;
1416 1.1 skrll case 2: /* 8 bit */
1417 1.1 skrll value = EXPR_VALUE (poffset);
1418 1.1 skrll break;
1419 1.1 skrll default:
1420 1.1 skrll abort ();
1421 1.1 skrll }
1422 1.1 skrll
1423 1.1 skrll offset = (value & 0xffff);
1424 1.1 skrll ASSIGN (offset);
1425 1.1 skrll return GEN_OPCODE32 ();
1426 1.1 skrll }
1427 1.1 skrll }
1428 1.1 skrll
1429 1.1 skrll
1430 1.1 skrll INSTR_T
1431 1.1 skrll bfin_gen_ldst (REG_T ptr, REG_T reg, int aop, int sz, int Z, int W)
1432 1.1 skrll {
1433 1.1 skrll INIT (LDST);
1434 1.1 skrll
1435 1.1 skrll if (!IS_PREG (*ptr) || (!IS_DREG (*reg) && !Z))
1436 1.1 skrll {
1437 1.1 skrll fprintf (stderr, "Warning: possible mixup of Preg/Dreg\n");
1438 1.1 skrll return 0;
1439 1.1 skrll }
1440 1.1 skrll
1441 1.1 skrll ASSIGN_R (ptr);
1442 1.1 skrll ASSIGN_R (reg);
1443 1.1 skrll ASSIGN (aop);
1444 1.1 skrll ASSIGN (sz);
1445 1.1 skrll ASSIGN (Z);
1446 1.1 skrll ASSIGN (W);
1447 1.1 skrll
1448 1.1 skrll return GEN_OPCODE16 ();
1449 1.1 skrll }
1450 1.1 skrll
1451 1.1.1.2 christos INSTR_T
1452 1.1 skrll bfin_gen_ldstii (REG_T ptr, REG_T reg, Expr_Node * poffset, int W, int opc)
1453 1.1 skrll {
1454 1.1 skrll int offset;
1455 1.1 skrll int value = 0;
1456 1.1 skrll INIT (LDSTii);
1457 1.1 skrll
1458 1.1 skrll if (!IS_PREG (*ptr))
1459 1.1 skrll {
1460 1.1 skrll fprintf (stderr, "Warning: possible mixup of Preg/Dreg\n");
1461 1.1 skrll return 0;
1462 1.1 skrll }
1463 1.1.1.2 christos
1464 1.1 skrll switch (opc)
1465 1.1 skrll {
1466 1.1 skrll case 1:
1467 1.1 skrll case 2:
1468 1.1 skrll value = EXPR_VALUE (poffset) >> 1;
1469 1.1 skrll break;
1470 1.1 skrll case 0:
1471 1.1 skrll case 3:
1472 1.1 skrll value = EXPR_VALUE (poffset) >> 2;
1473 1.1 skrll break;
1474 1.1 skrll }
1475 1.1 skrll
1476 1.1 skrll ASSIGN_R (ptr);
1477 1.1 skrll ASSIGN_R (reg);
1478 1.1 skrll
1479 1.1 skrll offset = value;
1480 1.1 skrll ASSIGN (offset);
1481 1.1.1.2 christos ASSIGN (W);
1482 1.1 skrll ASSIGNF (opc, op);
1483 1.1 skrll
1484 1.1 skrll return GEN_OPCODE16 ();
1485 1.1 skrll }
1486 1.1 skrll
1487 1.1 skrll INSTR_T
1488 1.1 skrll bfin_gen_ldstiifp (REG_T sreg, Expr_Node * poffset, int W)
1489 1.1 skrll {
1490 1.1 skrll /* Set bit 4 if it's a Preg. */
1491 1.1 skrll int reg = (sreg->regno & CODE_MASK) | (IS_PREG (*sreg) ? 0x8 : 0x0);
1492 1.1 skrll int offset = ((~(EXPR_VALUE (poffset) >> 2)) & 0x1f) + 1;
1493 1.1 skrll INIT (LDSTiiFP);
1494 1.1 skrll ASSIGN (reg);
1495 1.1 skrll ASSIGN (offset);
1496 1.1 skrll ASSIGN (W);
1497 1.1 skrll
1498 1.1 skrll return GEN_OPCODE16 ();
1499 1.1 skrll }
1500 1.1 skrll
1501 1.1 skrll INSTR_T
1502 1.1 skrll bfin_gen_ldstpmod (REG_T ptr, REG_T reg, int aop, int W, REG_T idx)
1503 1.1 skrll {
1504 1.1 skrll INIT (LDSTpmod);
1505 1.1 skrll
1506 1.1 skrll ASSIGN_R (ptr);
1507 1.1 skrll ASSIGN_R (reg);
1508 1.1 skrll ASSIGN (aop);
1509 1.1 skrll ASSIGN (W);
1510 1.1 skrll ASSIGN_R (idx);
1511 1.1 skrll
1512 1.1 skrll return GEN_OPCODE16 ();
1513 1.1 skrll }
1514 1.1 skrll
1515 1.1 skrll INSTR_T
1516 1.1 skrll bfin_gen_dspldst (REG_T i, REG_T reg, int aop, int W, int m)
1517 1.1 skrll {
1518 1.1 skrll INIT (DspLDST);
1519 1.1 skrll
1520 1.1 skrll ASSIGN_R (i);
1521 1.1 skrll ASSIGN_R (reg);
1522 1.1 skrll ASSIGN (aop);
1523 1.1 skrll ASSIGN (W);
1524 1.1 skrll ASSIGN (m);
1525 1.1 skrll
1526 1.1 skrll return GEN_OPCODE16 ();
1527 1.1 skrll }
1528 1.1 skrll
1529 1.1 skrll INSTR_T
1530 1.1 skrll bfin_gen_logi2op (int opc, int src, int dst)
1531 1.1 skrll {
1532 1.1 skrll INIT (LOGI2op);
1533 1.1 skrll
1534 1.1 skrll ASSIGN (opc);
1535 1.1 skrll ASSIGN (src);
1536 1.1 skrll ASSIGN (dst);
1537 1.1 skrll
1538 1.1 skrll return GEN_OPCODE16 ();
1539 1.1 skrll }
1540 1.1 skrll
1541 1.1 skrll INSTR_T
1542 1.1 skrll bfin_gen_brcc (int T, int B, Expr_Node * poffset)
1543 1.1 skrll {
1544 1.1 skrll int offset;
1545 1.1 skrll INIT (BRCC);
1546 1.1 skrll
1547 1.1 skrll ASSIGN (T);
1548 1.1 skrll ASSIGN (B);
1549 1.1 skrll offset = ((EXPR_VALUE (poffset) >> 1));
1550 1.1 skrll ASSIGN (offset);
1551 1.1 skrll return conscode (gencode (c_code.opcode), Expr_Node_Gen_Reloc (poffset, BFD_RELOC_BFIN_10_PCREL));
1552 1.1 skrll }
1553 1.1 skrll
1554 1.1 skrll INSTR_T
1555 1.1 skrll bfin_gen_ujump (Expr_Node * poffset)
1556 1.1 skrll {
1557 1.1 skrll int offset;
1558 1.1 skrll INIT (UJump);
1559 1.1 skrll
1560 1.1 skrll offset = ((EXPR_VALUE (poffset) >> 1));
1561 1.1 skrll ASSIGN (offset);
1562 1.1 skrll
1563 1.1 skrll return conscode (gencode (c_code.opcode),
1564 1.1 skrll Expr_Node_Gen_Reloc (
1565 1.1 skrll poffset, BFD_RELOC_BFIN_12_PCREL_JUMP_S));
1566 1.1 skrll }
1567 1.1 skrll
1568 1.1 skrll INSTR_T
1569 1.1 skrll bfin_gen_alu2op (REG_T dst, REG_T src, int opc)
1570 1.1 skrll {
1571 1.1 skrll INIT (ALU2op);
1572 1.1 skrll
1573 1.1 skrll ASSIGN_R (dst);
1574 1.1 skrll ASSIGN_R (src);
1575 1.1 skrll ASSIGN (opc);
1576 1.1 skrll
1577 1.1 skrll return GEN_OPCODE16 ();
1578 1.1 skrll }
1579 1.1 skrll
1580 1.1.1.2 christos INSTR_T
1581 1.1 skrll bfin_gen_compi2opd (REG_T dst, int src, int opc)
1582 1.1 skrll {
1583 1.1 skrll INIT (COMPI2opD);
1584 1.1 skrll
1585 1.1 skrll ASSIGN_R (dst);
1586 1.1.1.2 christos ASSIGN (src);
1587 1.1 skrll ASSIGNF (opc, op);
1588 1.1 skrll
1589 1.1 skrll return GEN_OPCODE16 ();
1590 1.1 skrll }
1591 1.1 skrll
1592 1.1.1.2 christos INSTR_T
1593 1.1 skrll bfin_gen_compi2opp (REG_T dst, int src, int opc)
1594 1.1 skrll {
1595 1.1 skrll INIT (COMPI2opP);
1596 1.1 skrll
1597 1.1 skrll ASSIGN_R (dst);
1598 1.1.1.2 christos ASSIGN (src);
1599 1.1 skrll ASSIGNF (opc, op);
1600 1.1 skrll
1601 1.1 skrll return GEN_OPCODE16 ();
1602 1.1 skrll }
1603 1.1 skrll
1604 1.1.1.2 christos INSTR_T
1605 1.1 skrll bfin_gen_dagmodik (REG_T i, int opc)
1606 1.1 skrll {
1607 1.1 skrll INIT (DagMODik);
1608 1.1 skrll
1609 1.1.1.2 christos ASSIGN_R (i);
1610 1.1 skrll ASSIGNF (opc, op);
1611 1.1 skrll
1612 1.1 skrll return GEN_OPCODE16 ();
1613 1.1 skrll }
1614 1.1 skrll
1615 1.1.1.2 christos INSTR_T
1616 1.1 skrll bfin_gen_dagmodim (REG_T i, REG_T m, int opc, int br)
1617 1.1 skrll {
1618 1.1 skrll INIT (DagMODim);
1619 1.1 skrll
1620 1.1 skrll ASSIGN_R (i);
1621 1.1.1.2 christos ASSIGN_R (m);
1622 1.1 skrll ASSIGNF (opc, op);
1623 1.1 skrll ASSIGN (br);
1624 1.1 skrll
1625 1.1 skrll return GEN_OPCODE16 ();
1626 1.1 skrll }
1627 1.1 skrll
1628 1.1 skrll INSTR_T
1629 1.1 skrll bfin_gen_ptr2op (REG_T dst, REG_T src, int opc)
1630 1.1 skrll {
1631 1.1 skrll INIT (PTR2op);
1632 1.1 skrll
1633 1.1 skrll ASSIGN_R (dst);
1634 1.1 skrll ASSIGN_R (src);
1635 1.1 skrll ASSIGN (opc);
1636 1.1 skrll
1637 1.1 skrll return GEN_OPCODE16 ();
1638 1.1 skrll }
1639 1.1 skrll
1640 1.1 skrll INSTR_T
1641 1.1 skrll bfin_gen_comp3op (REG_T src0, REG_T src1, REG_T dst, int opc)
1642 1.1 skrll {
1643 1.1 skrll INIT (COMP3op);
1644 1.1 skrll
1645 1.1 skrll ASSIGN_R (src0);
1646 1.1 skrll ASSIGN_R (src1);
1647 1.1 skrll ASSIGN_R (dst);
1648 1.1 skrll ASSIGN (opc);
1649 1.1 skrll
1650 1.1 skrll return GEN_OPCODE16 ();
1651 1.1 skrll }
1652 1.1 skrll
1653 1.1 skrll INSTR_T
1654 1.1 skrll bfin_gen_ccflag (REG_T x, int y, int opc, int I, int G)
1655 1.1 skrll {
1656 1.1 skrll INIT (CCflag);
1657 1.1 skrll
1658 1.1 skrll ASSIGN_R (x);
1659 1.1 skrll ASSIGN (y);
1660 1.1 skrll ASSIGN (opc);
1661 1.1 skrll ASSIGN (I);
1662 1.1 skrll ASSIGN (G);
1663 1.1 skrll
1664 1.1 skrll return GEN_OPCODE16 ();
1665 1.1 skrll }
1666 1.1 skrll
1667 1.1 skrll INSTR_T
1668 1.1 skrll bfin_gen_ccmv (REG_T src, REG_T dst, int T)
1669 1.1 skrll {
1670 1.1 skrll int s, d;
1671 1.1 skrll INIT (CCmv);
1672 1.1 skrll
1673 1.1 skrll ASSIGN_R (src);
1674 1.1 skrll ASSIGN_R (dst);
1675 1.1 skrll s = (GROUP (src));
1676 1.1 skrll ASSIGN (s);
1677 1.1 skrll d = (GROUP (dst));
1678 1.1 skrll ASSIGN (d);
1679 1.1 skrll ASSIGN (T);
1680 1.1 skrll
1681 1.1 skrll return GEN_OPCODE16 ();
1682 1.1 skrll }
1683 1.1 skrll
1684 1.1.1.2 christos INSTR_T
1685 1.1 skrll bfin_gen_cc2stat (int cbit, int opc, int D)
1686 1.1 skrll {
1687 1.1 skrll INIT (CC2stat);
1688 1.1 skrll
1689 1.1.1.2 christos ASSIGN (cbit);
1690 1.1 skrll ASSIGNF (opc, op);
1691 1.1 skrll ASSIGN (D);
1692 1.1 skrll
1693 1.1 skrll return GEN_OPCODE16 ();
1694 1.1 skrll }
1695 1.1 skrll
1696 1.1 skrll INSTR_T
1697 1.1 skrll bfin_gen_regmv (REG_T src, REG_T dst)
1698 1.1 skrll {
1699 1.1 skrll int gs, gd;
1700 1.1 skrll INIT (RegMv);
1701 1.1 skrll
1702 1.1 skrll ASSIGN_R (src);
1703 1.1 skrll ASSIGN_R (dst);
1704 1.1 skrll
1705 1.1 skrll gs = (GROUP (src));
1706 1.1 skrll ASSIGN (gs);
1707 1.1 skrll gd = (GROUP (dst));
1708 1.1 skrll ASSIGN (gd);
1709 1.1 skrll
1710 1.1 skrll return GEN_OPCODE16 ();
1711 1.1 skrll }
1712 1.1 skrll
1713 1.1.1.2 christos INSTR_T
1714 1.1 skrll bfin_gen_cc2dreg (int opc, REG_T reg)
1715 1.1 skrll {
1716 1.1 skrll INIT (CC2dreg);
1717 1.1.1.2 christos
1718 1.1 skrll ASSIGNF (opc, op);
1719 1.1 skrll ASSIGN_R (reg);
1720 1.1 skrll
1721 1.1 skrll return GEN_OPCODE16 ();
1722 1.1 skrll }
1723 1.1 skrll
1724 1.1 skrll INSTR_T
1725 1.1 skrll bfin_gen_progctrl (int prgfunc, int poprnd)
1726 1.1 skrll {
1727 1.1 skrll INIT (ProgCtrl);
1728 1.1 skrll
1729 1.1 skrll ASSIGN (prgfunc);
1730 1.1 skrll ASSIGN (poprnd);
1731 1.1 skrll
1732 1.1 skrll return GEN_OPCODE16 ();
1733 1.1 skrll }
1734 1.1 skrll
1735 1.1.1.2 christos INSTR_T
1736 1.1 skrll bfin_gen_cactrl (REG_T reg, int a, int opc)
1737 1.1 skrll {
1738 1.1 skrll INIT (CaCTRL);
1739 1.1 skrll
1740 1.1 skrll ASSIGN_R (reg);
1741 1.1.1.2 christos ASSIGN (a);
1742 1.1 skrll ASSIGNF (opc, op);
1743 1.1 skrll
1744 1.1 skrll return GEN_OPCODE16 ();
1745 1.1 skrll }
1746 1.1 skrll
1747 1.1 skrll INSTR_T
1748 1.1 skrll bfin_gen_pushpopmultiple (int dr, int pr, int d, int p, int W)
1749 1.1 skrll {
1750 1.1 skrll INIT (PushPopMultiple);
1751 1.1 skrll
1752 1.1 skrll ASSIGN (dr);
1753 1.1 skrll ASSIGN (pr);
1754 1.1 skrll ASSIGN (d);
1755 1.1 skrll ASSIGN (p);
1756 1.1 skrll ASSIGN (W);
1757 1.1 skrll
1758 1.1 skrll return GEN_OPCODE16 ();
1759 1.1 skrll }
1760 1.1 skrll
1761 1.1 skrll INSTR_T
1762 1.1 skrll bfin_gen_pushpopreg (REG_T reg, int W)
1763 1.1 skrll {
1764 1.1 skrll int grp;
1765 1.1 skrll INIT (PushPopReg);
1766 1.1 skrll
1767 1.1 skrll ASSIGN_R (reg);
1768 1.1 skrll grp = (GROUP (reg));
1769 1.1 skrll ASSIGN (grp);
1770 1.1 skrll ASSIGN (W);
1771 1.1 skrll
1772 1.1 skrll return GEN_OPCODE16 ();
1773 1.1 skrll }
1774 1.1 skrll
1775 1.1 skrll /* Pseudo Debugging Support. */
1776 1.1 skrll
1777 1.1 skrll INSTR_T
1778 1.1 skrll bfin_gen_pseudodbg (int fn, int reg, int grp)
1779 1.1 skrll {
1780 1.1 skrll INIT (PseudoDbg);
1781 1.1 skrll
1782 1.1 skrll ASSIGN (fn);
1783 1.1 skrll ASSIGN (reg);
1784 1.1 skrll ASSIGN (grp);
1785 1.1 skrll
1786 1.1 skrll return GEN_OPCODE16 ();
1787 1.1 skrll }
1788 1.1 skrll
1789 1.1 skrll INSTR_T
1790 1.1 skrll bfin_gen_pseudodbg_assert (int dbgop, REG_T regtest, int expected)
1791 1.1.1.2 christos {
1792 1.1 skrll int grp;
1793 1.1 skrll INIT (PseudoDbg_Assert);
1794 1.1 skrll
1795 1.1 skrll ASSIGN (dbgop);
1796 1.1.1.2 christos ASSIGN_R (regtest);
1797 1.1.1.2 christos grp = GROUP (regtest);
1798 1.1 skrll ASSIGN (grp);
1799 1.1 skrll ASSIGN (expected);
1800 1.1 skrll
1801 1.1 skrll return GEN_OPCODE32 ();
1802 1.1 skrll }
1803 1.1.1.2 christos
1804 1.1.1.2 christos INSTR_T
1805 1.1.1.2 christos bfin_gen_pseudochr (int ch)
1806 1.1.1.2 christos {
1807 1.1.1.2 christos INIT (PseudoChr);
1808 1.1.1.2 christos
1809 1.1.1.2 christos ASSIGN (ch);
1810 1.1.1.2 christos
1811 1.1.1.2 christos return GEN_OPCODE16 ();
1812 1.1.1.2 christos }
1813 1.1 skrll
1814 1.1 skrll /* Multiple instruction generation. */
1815 1.1 skrll
1816 1.1 skrll INSTR_T
1817 1.1 skrll bfin_gen_multi_instr (INSTR_T dsp32, INSTR_T dsp16_grp1, INSTR_T dsp16_grp2)
1818 1.1 skrll {
1819 1.1 skrll INSTR_T walk;
1820 1.1 skrll
1821 1.1 skrll /* If it's a 0, convert into MNOP. */
1822 1.1 skrll if (dsp32)
1823 1.1 skrll {
1824 1.1 skrll walk = dsp32->next;
1825 1.1 skrll SET_MULTI_INSTRUCTION_BIT (dsp32);
1826 1.1 skrll }
1827 1.1 skrll else
1828 1.1 skrll {
1829 1.1 skrll dsp32 = gencode (0xc803);
1830 1.1 skrll walk = gencode (0x1800);
1831 1.1 skrll dsp32->next = walk;
1832 1.1 skrll }
1833 1.1 skrll
1834 1.1 skrll if (!dsp16_grp1)
1835 1.1 skrll {
1836 1.1 skrll dsp16_grp1 = gencode (0x0000);
1837 1.1 skrll }
1838 1.1 skrll
1839 1.1 skrll if (!dsp16_grp2)
1840 1.1 skrll {
1841 1.1 skrll dsp16_grp2 = gencode (0x0000);
1842 1.1 skrll }
1843 1.1 skrll
1844 1.1 skrll walk->next = dsp16_grp1;
1845 1.1 skrll dsp16_grp1->next = dsp16_grp2;
1846 1.1 skrll dsp16_grp2->next = NULL_CODE;
1847 1.1 skrll
1848 1.1 skrll return dsp32;
1849 1.1 skrll }
1850 1.1 skrll
1851 1.1.1.2 christos INSTR_T
1852 1.1 skrll bfin_gen_loop (Expr_Node *exp, REG_T reg, int rop, REG_T preg)
1853 1.1 skrll {
1854 1.1 skrll const char *loopsym;
1855 1.1 skrll char *lbeginsym, *lendsym;
1856 1.1 skrll Expr_Node_Value lbeginval, lendval;
1857 1.1.1.2 christos Expr_Node *lbegin, *lend;
1858 1.1 skrll symbolS *sym;
1859 1.1.1.2 christos
1860 1.1.1.10 christos loopsym = exp->value.s_value;
1861 1.1.1.10 christos lbeginsym = xmalloc (strlen (loopsym) + strlen ("__BEGIN") + 5);
1862 1.1 skrll lendsym = xmalloc (strlen (loopsym) + strlen ("__END") + 5);
1863 1.1 skrll
1864 1.1 skrll lbeginsym[0] = 0;
1865 1.1 skrll lendsym[0] = 0;
1866 1.1 skrll
1867 1.1 skrll strcat (lbeginsym, "L$L$");
1868 1.1 skrll strcat (lbeginsym, loopsym);
1869 1.1 skrll strcat (lbeginsym, "__BEGIN");
1870 1.1 skrll
1871 1.1 skrll strcat (lendsym, "L$L$");
1872 1.1 skrll strcat (lendsym, loopsym);
1873 1.1 skrll strcat (lendsym, "__END");
1874 1.1 skrll
1875 1.1 skrll lbeginval.s_value = lbeginsym;
1876 1.1 skrll lendval.s_value = lendsym;
1877 1.1 skrll
1878 1.1 skrll lbegin = Expr_Node_Create (Expr_Node_Reloc, lbeginval, NULL, NULL);
1879 1.1 skrll lend = Expr_Node_Create (Expr_Node_Reloc, lendval, NULL, NULL);
1880 1.1.1.2 christos
1881 1.1.1.2 christos sym = symbol_find(loopsym);
1882 1.1.1.2 christos if (!S_IS_LOCAL (sym) || (S_IS_LOCAL (sym) && !symbol_used_p (sym)))
1883 1.1.1.2 christos symbol_remove (sym, &symbol_rootP, &symbol_lastP);
1884 1.1.1.2 christos
1885 1.1.1.2 christos return bfin_gen_loopsetup (lbegin, reg, rop, lend, preg);
1886 1.1.1.2 christos }
1887 1.1.1.2 christos
1888 1.1.1.2 christos void
1889 1.1.1.2 christos bfin_loop_attempt_create_label (Expr_Node *exp, int is_begin)
1890 1.1.1.2 christos {
1891 1.1.1.2 christos char *name;
1892 1.1.1.2 christos name = fb_label_name (exp->value.i_value, is_begin);
1893 1.1.1.2 christos exp->value.s_value = xstrdup (name);
1894 1.1.1.2 christos exp->type = Expr_Node_Reloc;
1895 1.1.1.2 christos }
1896 1.1.1.2 christos
1897 1.1.1.2 christos void
1898 1.1.1.2 christos bfin_loop_beginend (Expr_Node *exp, int begin)
1899 1.1.1.2 christos {
1900 1.1.1.2 christos const char *loopsym;
1901 1.1.1.2 christos char *label_name;
1902 1.1.1.2 christos symbolS *linelabel;
1903 1.1.1.2 christos const char *suffix = begin ? "__BEGIN" : "__END";
1904 1.1.1.2 christos
1905 1.1.1.10 christos loopsym = exp->value.s_value;
1906 1.1.1.2 christos label_name = xmalloc (strlen (loopsym) + strlen (suffix) + 5);
1907 1.1.1.2 christos
1908 1.1.1.2 christos label_name[0] = 0;
1909 1.1.1.2 christos
1910 1.1.1.2 christos strcat (label_name, "L$L$");
1911 1.1.1.2 christos strcat (label_name, loopsym);
1912 1.1 skrll strcat (label_name, suffix);
1913 1.1.1.2 christos
1914 1.1.1.2 christos linelabel = colon (label_name);
1915 1.1.1.2 christos
1916 1.1.1.2 christos /* LOOP_END follows the last instruction in the loop.
1917 1.1.1.2 christos Adjust label address. */
1918 1.1.1.7 christos if (!begin)
1919 1.1.1.10 christos *symbol_X_add_number (linelabel) -= last_insn_size;
1920 1.1.1.10 christos
1921 1.1 skrll free (label_name);
1922 1.1 skrll }
1923 1.1.1.8 christos
1924 1.1 skrll bool
1925 1.1 skrll bfin_eol_in_insn (char *line)
1926 1.1 skrll {
1927 1.1 skrll /* Allow a new-line to appear in the middle of a multi-issue instruction. */
1928 1.1 skrll
1929 1.1 skrll char *temp = line;
1930 1.1 skrll
1931 1.1.1.8 christos if (*line != '\n')
1932 1.1 skrll return false;
1933 1.1 skrll
1934 1.1 skrll /* A semi-colon followed by a newline is always the end of a line. */
1935 1.1.1.8 christos if (line[-1] == ';')
1936 1.1 skrll return false;
1937 1.1 skrll
1938 1.1.1.8 christos if (line[-1] == '|')
1939 1.1 skrll return true;
1940 1.1 skrll
1941 1.1 skrll /* If the || is on the next line, there might be leading whitespace. */
1942 1.1.1.10 christos temp++;
1943 1.1.1.10 christos while (is_whitespace (*temp))
1944 1.1 skrll temp++;
1945 1.1 skrll
1946 1.1.1.8 christos if (*temp == '|')
1947 1.1 skrll return true;
1948 1.1.1.8 christos
1949 1.1 skrll return false;
1950 1.1 skrll }
1951 1.1.1.8 christos
1952 1.1.1.4 christos bool
1953 1.1 skrll bfin_start_label (char *s)
1954 1.1.1.4 christos {
1955 1.1.1.2 christos while (*s != 0)
1956 1.1.1.2 christos {
1957 1.1.1.8 christos if (*s == '(' || *s == '[')
1958 1.1.1.2 christos return false;
1959 1.1.1.2 christos s++;
1960 1.1 skrll }
1961 1.1.1.8 christos
1962 1.1.1.2 christos return true;
1963 1.1 skrll }
1964 1.1 skrll
1965 1.1 skrll int
1966 1.1 skrll bfin_force_relocation (struct fix *fixp)
1967 1.1 skrll {
1968 1.1 skrll if (fixp->fx_r_type ==BFD_RELOC_BFIN_16_LOW
1969 1.1.1.8 christos || fixp->fx_r_type == BFD_RELOC_BFIN_16_HIGH)
1970 1.1 skrll return true;
1971 1.1 skrll
1972 1.1 skrll return generic_force_reloc (fixp);
1973 1.1.1.2 christos }
1974 1.1.1.2 christos
1975 1.1.1.2 christos /* This is a stripped down version of the disassembler. The only thing it
1977 1.1.1.2 christos does is return a mask of registers modified by an instruction. Only
1978 1.1.1.2 christos instructions that can occur in a parallel-issue bundle are handled, and
1979 1.1.1.2 christos only the registers that can cause a conflict are recorded. */
1980 1.1.1.2 christos
1981 1.1.1.2 christos #define DREG_MASK(n) (0x101 << (n))
1982 1.1.1.2 christos #define DREGH_MASK(n) (0x100 << (n))
1983 1.1.1.2 christos #define DREGL_MASK(n) (0x001 << (n))
1984 1.1.1.2 christos #define IREG_MASK(n) (1 << ((n) + 16))
1985 1.1.1.2 christos
1986 1.1.1.2 christos static int
1987 1.1.1.2 christos decode_ProgCtrl_0 (int iw0)
1988 1.1.1.2 christos {
1989 1.1.1.2 christos if (iw0 == 0)
1990 1.1.1.2 christos return 0;
1991 1.1.1.2 christos abort ();
1992 1.1.1.2 christos }
1993 1.1.1.2 christos
1994 1.1.1.2 christos static int
1995 1.1.1.2 christos decode_LDSTpmod_0 (int iw0)
1996 1.1.1.2 christos {
1997 1.1.1.2 christos /* LDSTpmod
1998 1.1.1.2 christos +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
1999 1.1.1.2 christos | 1 | 0 | 0 | 0 |.W.|.aop...|.reg.......|.idx.......|.ptr.......|
2000 1.1.1.2 christos +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
2001 1.1.1.2 christos int W = ((iw0 >> LDSTpmod_W_bits) & LDSTpmod_W_mask);
2002 1.1.1.2 christos int aop = ((iw0 >> LDSTpmod_aop_bits) & LDSTpmod_aop_mask);
2003 1.1.1.2 christos int idx = ((iw0 >> LDSTpmod_idx_bits) & LDSTpmod_idx_mask);
2004 1.1.1.2 christos int ptr = ((iw0 >> LDSTpmod_ptr_bits) & LDSTpmod_ptr_mask);
2005 1.1.1.2 christos int reg = ((iw0 >> LDSTpmod_reg_bits) & LDSTpmod_reg_mask);
2006 1.1.1.2 christos
2007 1.1.1.2 christos if (aop == 1 && W == 0 && idx == ptr)
2008 1.1.1.2 christos return DREGL_MASK (reg);
2009 1.1.1.2 christos else if (aop == 2 && W == 0 && idx == ptr)
2010 1.1.1.2 christos return DREGH_MASK (reg);
2011 1.1.1.2 christos else if (aop == 1 && W == 1 && idx == ptr)
2012 1.1.1.2 christos return 0;
2013 1.1.1.2 christos else if (aop == 2 && W == 1 && idx == ptr)
2014 1.1.1.2 christos return 0;
2015 1.1.1.2 christos else if (aop == 0 && W == 0)
2016 1.1.1.2 christos return DREG_MASK (reg);
2017 1.1.1.2 christos else if (aop == 1 && W == 0)
2018 1.1.1.2 christos return DREGL_MASK (reg);
2019 1.1.1.2 christos else if (aop == 2 && W == 0)
2020 1.1.1.2 christos return DREGH_MASK (reg);
2021 1.1.1.2 christos else if (aop == 3 && W == 0)
2022 1.1.1.2 christos return DREG_MASK (reg);
2023 1.1.1.2 christos else if (aop == 3 && W == 1)
2024 1.1.1.2 christos return DREG_MASK (reg);
2025 1.1.1.2 christos else if (aop == 0 && W == 1)
2026 1.1.1.2 christos return 0;
2027 1.1.1.2 christos else if (aop == 1 && W == 1)
2028 1.1.1.2 christos return 0;
2029 1.1.1.2 christos else if (aop == 2 && W == 1)
2030 1.1.1.2 christos return 0;
2031 1.1.1.2 christos else
2032 1.1.1.2 christos return 0;
2033 1.1.1.2 christos
2034 1.1.1.2 christos return 2;
2035 1.1.1.2 christos }
2036 1.1.1.2 christos
2037 1.1.1.2 christos static int
2038 1.1.1.2 christos decode_dagMODim_0 (int iw0)
2039 1.1.1.2 christos {
2040 1.1.1.2 christos /* dagMODim
2041 1.1.1.2 christos +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2042 1.1.1.2 christos | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 |.br| 1 | 1 |.op|.m.....|.i.....|
2043 1.1.1.2 christos +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
2044 1.1.1.2 christos int i = ((iw0 >> DagMODim_i_bits) & DagMODim_i_mask);
2045 1.1.1.2 christos int opc = ((iw0 >> DagMODim_op_bits) & DagMODim_op_mask);
2046 1.1.1.2 christos
2047 1.1.1.2 christos if (opc == 0 || opc == 1)
2048 1.1.1.2 christos return IREG_MASK (i);
2049 1.1.1.2 christos else
2050 1.1.1.2 christos return 0;
2051 1.1.1.2 christos
2052 1.1.1.2 christos return 2;
2053 1.1.1.2 christos }
2054 1.1.1.2 christos
2055 1.1.1.2 christos static int
2056 1.1.1.2 christos decode_dagMODik_0 (int iw0)
2057 1.1.1.2 christos {
2058 1.1.1.2 christos /* dagMODik
2059 1.1.1.2 christos +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2060 1.1.1.2 christos | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 |.op....|.i.....|
2061 1.1.1.2 christos +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
2062 1.1.1.2 christos int i = ((iw0 >> DagMODik_i_bits) & DagMODik_i_mask);
2063 1.1.1.2 christos return IREG_MASK (i);
2064 1.1.1.2 christos }
2065 1.1.1.2 christos
2066 1.1.1.2 christos /* GOOD */
2067 1.1.1.2 christos static int
2068 1.1.1.2 christos decode_dspLDST_0 (int iw0)
2069 1.1.1.2 christos {
2070 1.1.1.2 christos /* dspLDST
2071 1.1.1.2 christos +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2072 1.1.1.2 christos | 1 | 0 | 0 | 1 | 1 | 1 |.W.|.aop...|.m.....|.i.....|.reg.......|
2073 1.1.1.2 christos +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
2074 1.1.1.2 christos int i = ((iw0 >> DspLDST_i_bits) & DspLDST_i_mask);
2075 1.1.1.2 christos int m = ((iw0 >> DspLDST_m_bits) & DspLDST_m_mask);
2076 1.1.1.2 christos int W = ((iw0 >> DspLDST_W_bits) & DspLDST_W_mask);
2077 1.1.1.2 christos int aop = ((iw0 >> DspLDST_aop_bits) & DspLDST_aop_mask);
2078 1.1.1.2 christos int reg = ((iw0 >> DspLDST_reg_bits) & DspLDST_reg_mask);
2079 1.1.1.2 christos
2080 1.1.1.2 christos if (aop == 0 && W == 0 && m == 0)
2081 1.1.1.2 christos return DREG_MASK (reg) | IREG_MASK (i);
2082 1.1.1.2 christos else if (aop == 0 && W == 0 && m == 1)
2083 1.1.1.2 christos return DREGL_MASK (reg) | IREG_MASK (i);
2084 1.1.1.2 christos else if (aop == 0 && W == 0 && m == 2)
2085 1.1.1.2 christos return DREGH_MASK (reg) | IREG_MASK (i);
2086 1.1.1.2 christos else if (aop == 1 && W == 0 && m == 0)
2087 1.1.1.2 christos return DREG_MASK (reg) | IREG_MASK (i);
2088 1.1.1.2 christos else if (aop == 1 && W == 0 && m == 1)
2089 1.1.1.2 christos return DREGL_MASK (reg) | IREG_MASK (i);
2090 1.1.1.2 christos else if (aop == 1 && W == 0 && m == 2)
2091 1.1.1.2 christos return DREGH_MASK (reg) | IREG_MASK (i);
2092 1.1.1.2 christos else if (aop == 2 && W == 0 && m == 0)
2093 1.1.1.2 christos return DREG_MASK (reg);
2094 1.1.1.2 christos else if (aop == 2 && W == 0 && m == 1)
2095 1.1.1.2 christos return DREGL_MASK (reg);
2096 1.1.1.2 christos else if (aop == 2 && W == 0 && m == 2)
2097 1.1.1.2 christos return DREGH_MASK (reg);
2098 1.1.1.2 christos else if (aop == 0 && W == 1 && m == 0)
2099 1.1.1.2 christos return IREG_MASK (i);
2100 1.1.1.2 christos else if (aop == 0 && W == 1 && m == 1)
2101 1.1.1.2 christos return IREG_MASK (i);
2102 1.1.1.2 christos else if (aop == 0 && W == 1 && m == 2)
2103 1.1.1.2 christos return IREG_MASK (i);
2104 1.1.1.2 christos else if (aop == 1 && W == 1 && m == 0)
2105 1.1.1.2 christos return IREG_MASK (i);
2106 1.1.1.2 christos else if (aop == 1 && W == 1 && m == 1)
2107 1.1.1.2 christos return IREG_MASK (i);
2108 1.1.1.2 christos else if (aop == 1 && W == 1 && m == 2)
2109 1.1.1.2 christos return IREG_MASK (i);
2110 1.1.1.2 christos else if (aop == 2 && W == 1 && m == 0)
2111 1.1.1.2 christos return 0;
2112 1.1.1.2 christos else if (aop == 2 && W == 1 && m == 1)
2113 1.1.1.2 christos return 0;
2114 1.1.1.2 christos else if (aop == 2 && W == 1 && m == 2)
2115 1.1.1.2 christos return 0;
2116 1.1.1.2 christos else if (aop == 3 && W == 0)
2117 1.1.1.2 christos return DREG_MASK (reg) | IREG_MASK (i);
2118 1.1.1.2 christos else if (aop == 3 && W == 1)
2119 1.1.1.2 christos return IREG_MASK (i);
2120 1.1.1.2 christos
2121 1.1.1.2 christos abort ();
2122 1.1.1.2 christos }
2123 1.1.1.2 christos
2124 1.1.1.2 christos /* GOOD */
2125 1.1.1.2 christos static int
2126 1.1.1.2 christos decode_LDST_0 (int iw0)
2127 1.1.1.2 christos {
2128 1.1.1.2 christos /* LDST
2129 1.1.1.2 christos +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2130 1.1.1.2 christos | 1 | 0 | 0 | 1 |.sz....|.W.|.aop...|.Z.|.ptr.......|.reg.......|
2131 1.1.1.2 christos +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
2132 1.1.1.2 christos int Z = ((iw0 >> LDST_Z_bits) & LDST_Z_mask);
2133 1.1.1.2 christos int W = ((iw0 >> LDST_W_bits) & LDST_W_mask);
2134 1.1.1.2 christos int sz = ((iw0 >> LDST_sz_bits) & LDST_sz_mask);
2135 1.1.1.2 christos int aop = ((iw0 >> LDST_aop_bits) & LDST_aop_mask);
2136 1.1.1.2 christos int reg = ((iw0 >> LDST_reg_bits) & LDST_reg_mask);
2137 1.1.1.2 christos
2138 1.1.1.2 christos if (aop == 0 && sz == 0 && Z == 0 && W == 0)
2139 1.1.1.2 christos return DREG_MASK (reg);
2140 1.1.1.2 christos else if (aop == 0 && sz == 0 && Z == 1 && W == 0)
2141 1.1.1.2 christos return 0;
2142 1.1.1.2 christos else if (aop == 0 && sz == 1 && Z == 0 && W == 0)
2143 1.1.1.2 christos return DREG_MASK (reg);
2144 1.1.1.2 christos else if (aop == 0 && sz == 1 && Z == 1 && W == 0)
2145 1.1.1.2 christos return DREG_MASK (reg);
2146 1.1.1.2 christos else if (aop == 0 && sz == 2 && Z == 0 && W == 0)
2147 1.1.1.2 christos return DREG_MASK (reg);
2148 1.1.1.2 christos else if (aop == 0 && sz == 2 && Z == 1 && W == 0)
2149 1.1.1.2 christos return DREG_MASK (reg);
2150 1.1.1.2 christos else if (aop == 1 && sz == 0 && Z == 0 && W == 0)
2151 1.1.1.2 christos return DREG_MASK (reg);
2152 1.1.1.2 christos else if (aop == 1 && sz == 0 && Z == 1 && W == 0)
2153 1.1.1.2 christos return 0;
2154 1.1.1.2 christos else if (aop == 1 && sz == 1 && Z == 0 && W == 0)
2155 1.1.1.2 christos return DREG_MASK (reg);
2156 1.1.1.2 christos else if (aop == 1 && sz == 1 && Z == 1 && W == 0)
2157 1.1.1.2 christos return DREG_MASK (reg);
2158 1.1.1.2 christos else if (aop == 1 && sz == 2 && Z == 0 && W == 0)
2159 1.1.1.2 christos return DREG_MASK (reg);
2160 1.1.1.2 christos else if (aop == 1 && sz == 2 && Z == 1 && W == 0)
2161 1.1.1.2 christos return DREG_MASK (reg);
2162 1.1.1.2 christos else if (aop == 2 && sz == 0 && Z == 0 && W == 0)
2163 1.1.1.2 christos return DREG_MASK (reg);
2164 1.1.1.2 christos else if (aop == 2 && sz == 0 && Z == 1 && W == 0)
2165 1.1.1.2 christos return 0;
2166 1.1.1.2 christos else if (aop == 2 && sz == 1 && Z == 0 && W == 0)
2167 1.1.1.2 christos return DREG_MASK (reg);
2168 1.1.1.2 christos else if (aop == 2 && sz == 1 && Z == 1 && W == 0)
2169 1.1.1.2 christos return DREG_MASK (reg);
2170 1.1.1.2 christos else if (aop == 2 && sz == 2 && Z == 0 && W == 0)
2171 1.1.1.2 christos return DREG_MASK (reg);
2172 1.1.1.2 christos else if (aop == 2 && sz == 2 && Z == 1 && W == 0)
2173 1.1.1.2 christos return DREG_MASK (reg);
2174 1.1.1.2 christos else if (aop == 0 && sz == 0 && Z == 0 && W == 1)
2175 1.1.1.2 christos return 0;
2176 1.1.1.2 christos else if (aop == 0 && sz == 0 && Z == 1 && W == 1)
2177 1.1.1.2 christos return 0;
2178 1.1.1.2 christos else if (aop == 0 && sz == 1 && Z == 0 && W == 1)
2179 1.1.1.2 christos return 0;
2180 1.1.1.2 christos else if (aop == 0 && sz == 2 && Z == 0 && W == 1)
2181 1.1.1.2 christos return 0;
2182 1.1.1.2 christos else if (aop == 1 && sz == 0 && Z == 0 && W == 1)
2183 1.1.1.2 christos return 0;
2184 1.1.1.2 christos else if (aop == 1 && sz == 0 && Z == 1 && W == 1)
2185 1.1.1.2 christos return 0;
2186 1.1.1.2 christos else if (aop == 1 && sz == 1 && Z == 0 && W == 1)
2187 1.1.1.2 christos return 0;
2188 1.1.1.2 christos else if (aop == 1 && sz == 2 && Z == 0 && W == 1)
2189 1.1.1.2 christos return 0;
2190 1.1.1.2 christos else if (aop == 2 && sz == 0 && Z == 0 && W == 1)
2191 1.1.1.2 christos return 0;
2192 1.1.1.2 christos else if (aop == 2 && sz == 0 && Z == 1 && W == 1)
2193 1.1.1.2 christos return 0;
2194 1.1.1.2 christos else if (aop == 2 && sz == 1 && Z == 0 && W == 1)
2195 1.1.1.2 christos return 0;
2196 1.1.1.2 christos else if (aop == 2 && sz == 2 && Z == 0 && W == 1)
2197 1.1.1.2 christos return 0;
2198 1.1.1.2 christos
2199 1.1.1.2 christos abort ();
2200 1.1.1.2 christos }
2201 1.1.1.2 christos
2202 1.1.1.2 christos static int
2203 1.1.1.2 christos decode_LDSTiiFP_0 (int iw0)
2204 1.1.1.2 christos {
2205 1.1.1.2 christos /* LDSTiiFP
2206 1.1.1.2 christos +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2207 1.1.1.2 christos | 1 | 0 | 1 | 1 | 1 | 0 |.W.|.offset............|.reg...........|
2208 1.1.1.2 christos +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
2209 1.1.1.2 christos int reg = ((iw0 >> LDSTiiFP_reg_bits) & LDSTiiFP_reg_mask);
2210 1.1.1.2 christos int W = ((iw0 >> LDSTiiFP_W_bits) & LDSTiiFP_W_mask);
2211 1.1.1.2 christos
2212 1.1.1.2 christos if (W == 0)
2213 1.1.1.2 christos return reg < 8 ? DREG_MASK (reg) : 0;
2214 1.1.1.2 christos else
2215 1.1.1.2 christos return 0;
2216 1.1.1.2 christos }
2217 1.1.1.2 christos
2218 1.1.1.2 christos static int
2219 1.1.1.2 christos decode_LDSTii_0 (int iw0)
2220 1.1.1.2 christos {
2221 1.1.1.2 christos /* LDSTii
2222 1.1.1.2 christos +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2223 1.1.1.2 christos | 1 | 0 | 1 |.W.|.op....|.offset........|.ptr.......|.reg.......|
2224 1.1.1.2 christos +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
2225 1.1.1.2 christos int reg = ((iw0 >> LDSTii_reg_bit) & LDSTii_reg_mask);
2226 1.1.1.2 christos int opc = ((iw0 >> LDSTii_op_bit) & LDSTii_op_mask);
2227 1.1.1.2 christos int W = ((iw0 >> LDSTii_W_bit) & LDSTii_W_mask);
2228 1.1.1.2 christos
2229 1.1.1.2 christos if (W == 0 && opc != 3)
2230 1.1.1.2 christos return DREG_MASK (reg);
2231 1.1.1.2 christos else if (W == 0 && opc == 3)
2232 1.1.1.2 christos return 0;
2233 1.1.1.2 christos else if (W == 1 && opc == 0)
2234 1.1.1.2 christos return 0;
2235 1.1.1.2 christos else if (W == 1 && opc == 1)
2236 1.1.1.2 christos return 0;
2237 1.1.1.2 christos else if (W == 1 && opc == 3)
2238 1.1.1.2 christos return 0;
2239 1.1.1.2 christos
2240 1.1.1.2 christos abort ();
2241 1.1.1.2 christos }
2242 1.1.1.2 christos
2243 1.1.1.2 christos static int
2244 1.1.1.2 christos decode_dsp32mac_0 (int iw0, int iw1)
2245 1.1.1.2 christos {
2246 1.1.1.2 christos int result = 0;
2247 1.1.1.2 christos /* dsp32mac
2248 1.1.1.2 christos +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2249 1.1.1.2 christos | 1 | 1 | 0 | 0 |.M.| 0 | 0 |.mmod..........|.MM|.P.|.w1|.op1...|
2250 1.1.1.2 christos |.h01|.h11|.w0|.op0...|.h00|.h10|.dst.......|.src0......|.src1..|
2251 1.1.1.2 christos +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
2252 1.1.1.2 christos int op1 = ((iw0 >> (DSP32Mac_op1_bits - 16)) & DSP32Mac_op1_mask);
2253 1.1.1.2 christos int w1 = ((iw0 >> (DSP32Mac_w1_bits - 16)) & DSP32Mac_w1_mask);
2254 1.1.1.2 christos int P = ((iw0 >> (DSP32Mac_p_bits - 16)) & DSP32Mac_p_mask);
2255 1.1.1.2 christos int mmod = ((iw0 >> (DSP32Mac_mmod_bits - 16)) & DSP32Mac_mmod_mask);
2256 1.1.1.2 christos int w0 = ((iw1 >> DSP32Mac_w0_bits) & DSP32Mac_w0_mask);
2257 1.1.1.2 christos int MM = ((iw1 >> DSP32Mac_MM_bits) & DSP32Mac_MM_mask);
2258 1.1.1.2 christos int dst = ((iw1 >> DSP32Mac_dst_bits) & DSP32Mac_dst_mask);
2259 1.1.1.2 christos int op0 = ((iw1 >> DSP32Mac_op0_bits) & DSP32Mac_op0_mask);
2260 1.1.1.2 christos
2261 1.1.1.2 christos if (w0 == 0 && w1 == 0 && op1 == 3 && op0 == 3)
2262 1.1.1.2 christos return 0;
2263 1.1.1.2 christos
2264 1.1.1.2 christos if (op1 == 3 && MM)
2265 1.1.1.2 christos return 0;
2266 1.1.1.2 christos
2267 1.1.1.2 christos if ((w1 || w0) && mmod == M_W32)
2268 1.1.1.2 christos return 0;
2269 1.1.1.2 christos
2270 1.1.1.2 christos if (((1 << mmod) & (P ? 0x131b : 0x1b5f)) == 0)
2271 1.1.1.2 christos return 0;
2272 1.1.1.2 christos
2273 1.1.1.2 christos if (w1 == 1 || op1 != 3)
2274 1.1.1.2 christos {
2275 1.1.1.2 christos if (w1)
2276 1.1.1.2 christos {
2277 1.1.1.2 christos if (P)
2278 1.1.1.2 christos return DREG_MASK (dst + 1);
2279 1.1.1.2 christos else
2280 1.1.1.2 christos return DREGH_MASK (dst);
2281 1.1.1.2 christos }
2282 1.1.1.2 christos }
2283 1.1.1.2 christos
2284 1.1.1.2 christos if (w0 == 1 || op0 != 3)
2285 1.1.1.2 christos {
2286 1.1.1.2 christos if (w0)
2287 1.1.1.2 christos {
2288 1.1.1.2 christos if (P)
2289 1.1.1.2 christos return DREG_MASK (dst);
2290 1.1.1.2 christos else
2291 1.1.1.2 christos return DREGL_MASK (dst);
2292 1.1.1.2 christos }
2293 1.1.1.2 christos }
2294 1.1.1.2 christos
2295 1.1.1.2 christos return result;
2296 1.1.1.2 christos }
2297 1.1.1.2 christos
2298 1.1.1.2 christos static int
2299 1.1.1.2 christos decode_dsp32mult_0 (int iw0, int iw1)
2300 1.1.1.2 christos {
2301 1.1.1.2 christos /* dsp32mult
2302 1.1.1.2 christos +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2303 1.1.1.2 christos | 1 | 1 | 0 | 0 |.M.| 0 | 1 |.mmod..........|.MM|.P.|.w1|.op1...|
2304 1.1.1.2 christos |.h01|.h11|.w0|.op0...|.h00|.h10|.dst.......|.src0......|.src1..|
2305 1.1.1.2 christos +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
2306 1.1.1.2 christos int w1 = ((iw0 >> (DSP32Mac_w1_bits - 16)) & DSP32Mac_w1_mask);
2307 1.1.1.2 christos int P = ((iw0 >> (DSP32Mac_p_bits - 16)) & DSP32Mac_p_mask);
2308 1.1.1.2 christos int mmod = ((iw0 >> (DSP32Mac_mmod_bits - 16)) & DSP32Mac_mmod_mask);
2309 1.1.1.2 christos int w0 = ((iw1 >> DSP32Mac_w0_bits) & DSP32Mac_w0_mask);
2310 1.1.1.2 christos int dst = ((iw1 >> DSP32Mac_dst_bits) & DSP32Mac_dst_mask);
2311 1.1.1.2 christos int result = 0;
2312 1.1.1.2 christos
2313 1.1.1.2 christos if (w1 == 0 && w0 == 0)
2314 1.1.1.2 christos return 0;
2315 1.1.1.2 christos
2316 1.1.1.2 christos if (((1 << mmod) & (P ? 0x313 : 0x1b57)) == 0)
2317 1.1.1.2 christos return 0;
2318 1.1.1.2 christos
2319 1.1.1.2 christos if (w1)
2320 1.1.1.2 christos {
2321 1.1.1.2 christos if (P)
2322 1.1.1.2 christos return DREG_MASK (dst | 1);
2323 1.1.1.2 christos else
2324 1.1.1.2 christos return DREGH_MASK (dst);
2325 1.1.1.2 christos }
2326 1.1.1.2 christos
2327 1.1.1.2 christos if (w0)
2328 1.1.1.2 christos {
2329 1.1.1.2 christos if (P)
2330 1.1.1.2 christos return DREG_MASK (dst);
2331 1.1.1.2 christos else
2332 1.1.1.2 christos return DREGL_MASK (dst);
2333 1.1.1.2 christos }
2334 1.1.1.2 christos
2335 1.1.1.2 christos return result;
2336 1.1.1.2 christos }
2337 1.1.1.2 christos
2338 1.1.1.2 christos static int
2339 1.1.1.2 christos decode_dsp32alu_0 (int iw0, int iw1)
2340 1.1.1.2 christos {
2341 1.1.1.2 christos /* dsp32alu
2342 1.1.1.2 christos +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2343 1.1.1.2 christos | 1 | 1 | 0 | 0 |.M.| 1 | 0 | - | - | - |.HL|.aopcde............|
2344 1.1.1.2 christos |.aop...|.s.|.x.|.dst0......|.dst1......|.src0......|.src1......|
2345 1.1.1.2 christos +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
2346 1.1.1.2 christos int s = ((iw1 >> DSP32Alu_s_bits) & DSP32Alu_s_mask);
2347 1.1.1.2 christos int x = ((iw1 >> DSP32Alu_x_bits) & DSP32Alu_x_mask);
2348 1.1.1.2 christos int aop = ((iw1 >> DSP32Alu_aop_bits) & DSP32Alu_aop_mask);
2349 1.1.1.2 christos int dst0 = ((iw1 >> DSP32Alu_dst0_bits) & DSP32Alu_dst0_mask);
2350 1.1.1.2 christos int dst1 = ((iw1 >> DSP32Alu_dst1_bits) & DSP32Alu_dst1_mask);
2351 1.1.1.2 christos int HL = ((iw0 >> (DSP32Alu_HL_bits - 16)) & DSP32Alu_HL_mask);
2352 1.1.1.2 christos int aopcde = ((iw0 >> (DSP32Alu_aopcde_bits - 16)) & DSP32Alu_aopcde_mask);
2353 1.1.1.2 christos
2354 1.1.1.2 christos if (aop == 0 && aopcde == 9 && s == 0)
2355 1.1.1.2 christos return 0;
2356 1.1.1.2 christos else if (aop == 2 && aopcde == 9 && HL == 0 && s == 0)
2357 1.1.1.2 christos return 0;
2358 1.1.1.2 christos else if (aop >= x * 2 && aopcde == 5)
2359 1.1.1.2 christos return HL ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
2360 1.1.1.2 christos else if (HL == 0 && aopcde == 2)
2361 1.1.1.2 christos return DREGL_MASK (dst0);
2362 1.1.1.2 christos else if (HL == 1 && aopcde == 2)
2363 1.1.1.2 christos return DREGH_MASK (dst0);
2364 1.1.1.2 christos else if (HL == 0 && aopcde == 3)
2365 1.1.1.2 christos return DREGL_MASK (dst0);
2366 1.1.1.2 christos else if (HL == 1 && aopcde == 3)
2367 1.1.1.2 christos return DREGH_MASK (dst0);
2368 1.1.1.2 christos
2369 1.1.1.2 christos else if (aop == 0 && aopcde == 9 && s == 1)
2370 1.1.1.2 christos return 0;
2371 1.1.1.2 christos else if (aop == 1 && aopcde == 9 && s == 0)
2372 1.1.1.2 christos return 0;
2373 1.1.1.2 christos else if (aop == 2 && aopcde == 9 && s == 1)
2374 1.1.1.2 christos return 0;
2375 1.1.1.2 christos else if (aop == 3 && aopcde == 9 && s == 0)
2376 1.1.1.2 christos return 0;
2377 1.1.1.2 christos else if (aopcde == 8)
2378 1.1.1.2 christos return 0;
2379 1.1.1.2 christos else if (aop == 0 && aopcde == 11)
2380 1.1.1.2 christos return DREG_MASK (dst0);
2381 1.1.1.2 christos else if (aop == 1 && aopcde == 11)
2382 1.1.1.2 christos return HL ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
2383 1.1.1.2 christos else if (aopcde == 11)
2384 1.1.1.2 christos return 0;
2385 1.1.1.2 christos else if (aopcde == 22)
2386 1.1.1.2 christos return DREG_MASK (dst0);
2387 1.1.1.2 christos
2388 1.1.1.2 christos else if ((aop == 0 || aop == 1) && aopcde == 14)
2389 1.1.1.2 christos return 0;
2390 1.1.1.2 christos else if (aop == 3 && HL == 0 && aopcde == 14)
2391 1.1.1.2 christos return 0;
2392 1.1.1.2 christos
2393 1.1.1.2 christos else if (aop == 3 && HL == 0 && aopcde == 15)
2394 1.1.1.2 christos return DREG_MASK (dst0);
2395 1.1.1.2 christos
2396 1.1.1.2 christos else if (aop == 1 && aopcde == 16)
2397 1.1.1.2 christos return 0;
2398 1.1.1.2 christos
2399 1.1.1.2 christos else if (aop == 0 && aopcde == 16)
2400 1.1.1.2 christos return 0;
2401 1.1.1.2 christos
2402 1.1.1.2 christos else if (aop == 3 && HL == 0 && aopcde == 16)
2403 1.1.1.2 christos return 0;
2404 1.1.1.2 christos
2405 1.1.1.2 christos else if (aop == 3 && HL == 0 && aopcde == 7)
2406 1.1.1.2 christos return DREG_MASK (dst0);
2407 1.1.1.2 christos else if ((aop == 0 || aop == 1 || aop == 2) && aopcde == 7)
2408 1.1.1.2 christos return DREG_MASK (dst0);
2409 1.1.1.2 christos
2410 1.1.1.2 christos else if (aop == 0 && aopcde == 12)
2411 1.1.1.2 christos return DREG_MASK (dst0);
2412 1.1.1.2 christos else if (aop == 1 && aopcde == 12)
2413 1.1.1.2 christos return DREG_MASK (dst0) | DREG_MASK (dst1);
2414 1.1.1.2 christos else if (aop == 3 && aopcde == 12)
2415 1.1.1.2 christos return HL ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
2416 1.1.1.2 christos
2417 1.1.1.2 christos else if (aopcde == 0)
2418 1.1.1.2 christos return DREG_MASK (dst0);
2419 1.1.1.2 christos else if (aopcde == 1)
2420 1.1.1.2 christos return DREG_MASK (dst0) | DREG_MASK (dst1);
2421 1.1.1.2 christos
2422 1.1.1.2 christos else if (aop == 0 && aopcde == 10)
2423 1.1.1.2 christos return DREGL_MASK (dst0);
2424 1.1.1.2 christos else if (aop == 1 && aopcde == 10)
2425 1.1.1.2 christos return DREGL_MASK (dst0);
2426 1.1.1.2 christos
2427 1.1.1.2 christos else if ((aop == 1 || aop == 0) && aopcde == 4)
2428 1.1.1.2 christos return DREG_MASK (dst0);
2429 1.1.1.2 christos else if (aop == 2 && aopcde == 4)
2430 1.1.1.2 christos return DREG_MASK (dst0) | DREG_MASK (dst1);
2431 1.1.1.2 christos
2432 1.1.1.2 christos else if (aop == 0 && aopcde == 17)
2433 1.1.1.2 christos return DREG_MASK (dst0) | DREG_MASK (dst1);
2434 1.1.1.2 christos else if (aop == 1 && aopcde == 17)
2435 1.1.1.2 christos return DREG_MASK (dst0) | DREG_MASK (dst1);
2436 1.1.1.2 christos else if (aop == 0 && aopcde == 18)
2437 1.1.1.2 christos return 0;
2438 1.1.1.2 christos else if (aop == 3 && aopcde == 18)
2439 1.1.1.2 christos return 0;
2440 1.1.1.2 christos
2441 1.1.1.2 christos else if ((aop == 0 || aop == 1 || aop == 2) && aopcde == 6)
2442 1.1.1.2 christos return DREG_MASK (dst0);
2443 1.1.1.2 christos
2444 1.1.1.2 christos else if ((aop == 0 || aop == 1) && aopcde == 20)
2445 1.1.1.2 christos return DREG_MASK (dst0);
2446 1.1.1.2 christos
2447 1.1.1.2 christos else if ((aop == 0 || aop == 1) && aopcde == 21)
2448 1.1.1.2 christos return DREG_MASK (dst0) | DREG_MASK (dst1);
2449 1.1.1.2 christos
2450 1.1.1.2 christos else if (aop == 0 && aopcde == 23 && HL == 1)
2451 1.1.1.2 christos return DREG_MASK (dst0);
2452 1.1.1.2 christos else if (aop == 0 && aopcde == 23 && HL == 0)
2453 1.1.1.2 christos return DREG_MASK (dst0);
2454 1.1.1.2 christos
2455 1.1.1.2 christos else if (aop == 0 && aopcde == 24)
2456 1.1.1.2 christos return DREG_MASK (dst0);
2457 1.1.1.2 christos else if (aop == 1 && aopcde == 24)
2458 1.1.1.2 christos return DREG_MASK (dst0) | DREG_MASK (dst1);
2459 1.1.1.2 christos else if (aopcde == 13)
2460 1.1.1.2 christos return DREG_MASK (dst0) | DREG_MASK (dst1);
2461 1.1.1.2 christos else
2462 1.1.1.2 christos return 0;
2463 1.1.1.2 christos
2464 1.1.1.2 christos return 4;
2465 1.1.1.2 christos }
2466 1.1.1.2 christos
2467 1.1.1.2 christos static int
2468 1.1.1.2 christos decode_dsp32shift_0 (int iw0, int iw1)
2469 1.1.1.2 christos {
2470 1.1.1.2 christos /* dsp32shift
2471 1.1.1.2 christos +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2472 1.1.1.2 christos | 1 | 1 | 0 | 0 |.M.| 1 | 1 | 0 | 0 | - | - |.sopcde............|
2473 1.1.1.2 christos |.sop...|.HLs...|.dst0......| - | - | - |.src0......|.src1......|
2474 1.1.1.2 christos +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
2475 1.1.1.2 christos int HLs = ((iw1 >> DSP32Shift_HLs_bits) & DSP32Shift_HLs_mask);
2476 1.1.1.2 christos int sop = ((iw1 >> DSP32Shift_sop_bits) & DSP32Shift_sop_mask);
2477 1.1.1.2 christos int src0 = ((iw1 >> DSP32Shift_src0_bits) & DSP32Shift_src0_mask);
2478 1.1.1.2 christos int src1 = ((iw1 >> DSP32Shift_src1_bits) & DSP32Shift_src1_mask);
2479 1.1.1.2 christos int dst0 = ((iw1 >> DSP32Shift_dst0_bits) & DSP32Shift_dst0_mask);
2480 1.1.1.2 christos int sopcde = ((iw0 >> (DSP32Shift_sopcde_bits - 16)) & DSP32Shift_sopcde_mask);
2481 1.1.1.2 christos
2482 1.1.1.2 christos if (sop == 0 && sopcde == 0)
2483 1.1.1.2 christos return HLs & 2 ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
2484 1.1.1.2 christos else if (sop == 1 && sopcde == 0)
2485 1.1.1.2 christos return HLs & 2 ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
2486 1.1.1.2 christos else if (sop == 2 && sopcde == 0)
2487 1.1.1.2 christos return HLs & 2 ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
2488 1.1.1.2 christos else if (sop == 0 && sopcde == 3)
2489 1.1.1.2 christos return 0;
2490 1.1.1.2 christos else if (sop == 1 && sopcde == 3)
2491 1.1.1.2 christos return 0;
2492 1.1.1.2 christos else if (sop == 2 && sopcde == 3)
2493 1.1.1.2 christos return 0;
2494 1.1.1.2 christos else if (sop == 3 && sopcde == 3)
2495 1.1.1.2 christos return DREG_MASK (dst0);
2496 1.1.1.2 christos else if (sop == 0 && sopcde == 1)
2497 1.1.1.2 christos return DREG_MASK (dst0);
2498 1.1.1.2 christos else if (sop == 1 && sopcde == 1)
2499 1.1.1.2 christos return DREG_MASK (dst0);
2500 1.1.1.2 christos else if (sop == 2 && sopcde == 1)
2501 1.1.1.2 christos return DREG_MASK (dst0);
2502 1.1.1.2 christos else if (sopcde == 2)
2503 1.1.1.2 christos return DREG_MASK (dst0);
2504 1.1.1.2 christos else if (sopcde == 4)
2505 1.1.1.2 christos return DREG_MASK (dst0);
2506 1.1.1.2 christos else if (sop == 0 && sopcde == 5)
2507 1.1.1.2 christos return DREGL_MASK (dst0);
2508 1.1.1.2 christos else if (sop == 1 && sopcde == 5)
2509 1.1.1.2 christos return DREGL_MASK (dst0);
2510 1.1.1.2 christos else if (sop == 2 && sopcde == 5)
2511 1.1.1.2 christos return DREGL_MASK (dst0);
2512 1.1.1.2 christos else if (sop == 0 && sopcde == 6)
2513 1.1.1.2 christos return DREGL_MASK (dst0);
2514 1.1.1.2 christos else if (sop == 1 && sopcde == 6)
2515 1.1.1.2 christos return DREGL_MASK (dst0);
2516 1.1.1.2 christos else if (sop == 3 && sopcde == 6)
2517 1.1.1.2 christos return DREGL_MASK (dst0);
2518 1.1.1.2 christos else if (sop == 0 && sopcde == 7)
2519 1.1.1.2 christos return DREGL_MASK (dst0);
2520 1.1.1.2 christos else if (sop == 1 && sopcde == 7)
2521 1.1.1.2 christos return DREGL_MASK (dst0);
2522 1.1.1.2 christos else if (sop == 2 && sopcde == 7)
2523 1.1.1.2 christos return DREGL_MASK (dst0);
2524 1.1.1.2 christos else if (sop == 3 && sopcde == 7)
2525 1.1.1.2 christos return DREGL_MASK (dst0);
2526 1.1.1.2 christos else if (sop == 0 && sopcde == 8)
2527 1.1.1.2 christos return DREG_MASK (src0) | DREG_MASK (src1);
2528 1.1.1.2 christos #if 0
2529 1.1.1.2 christos {
2530 1.1.1.2 christos OUTS (outf, "BITMUX (");
2531 1.1.1.2 christos OUTS (outf, dregs (src0));
2532 1.1.1.2 christos OUTS (outf, ", ");
2533 1.1.1.2 christos OUTS (outf, dregs (src1));
2534 1.1.1.2 christos OUTS (outf, ", A0) (ASR)");
2535 1.1.1.2 christos }
2536 1.1.1.2 christos #endif
2537 1.1.1.2 christos else if (sop == 1 && sopcde == 8)
2538 1.1.1.2 christos return DREG_MASK (src0) | DREG_MASK (src1);
2539 1.1.1.2 christos #if 0
2540 1.1.1.2 christos {
2541 1.1.1.2 christos OUTS (outf, "BITMUX (");
2542 1.1.1.2 christos OUTS (outf, dregs (src0));
2543 1.1.1.2 christos OUTS (outf, ", ");
2544 1.1.1.2 christos OUTS (outf, dregs (src1));
2545 1.1.1.2 christos OUTS (outf, ", A0) (ASL)");
2546 1.1.1.2 christos }
2547 1.1.1.2 christos #endif
2548 1.1.1.2 christos else if (sopcde == 9)
2549 1.1.1.2 christos return sop < 2 ? DREGL_MASK (dst0) : DREG_MASK (dst0);
2550 1.1.1.2 christos else if (sopcde == 10)
2551 1.1.1.2 christos return DREG_MASK (dst0);
2552 1.1.1.2 christos else if (sop == 0 && sopcde == 11)
2553 1.1.1.2 christos return DREGL_MASK (dst0);
2554 1.1.1.2 christos else if (sop == 1 && sopcde == 11)
2555 1.1.1.2 christos return DREGL_MASK (dst0);
2556 1.1.1.2 christos else if (sop == 0 && sopcde == 12)
2557 1.1.1.2 christos return 0;
2558 1.1.1.2 christos else if (sop == 1 && sopcde == 12)
2559 1.1.1.2 christos return DREGL_MASK (dst0);
2560 1.1.1.2 christos else if (sop == 0 && sopcde == 13)
2561 1.1.1.2 christos return DREG_MASK (dst0);
2562 1.1.1.2 christos else if (sop == 1 && sopcde == 13)
2563 1.1.1.2 christos return DREG_MASK (dst0);
2564 1.1.1.2 christos else if (sop == 2 && sopcde == 13)
2565 1.1.1.2 christos return DREG_MASK (dst0);
2566 1.1.1.2 christos
2567 1.1.1.2 christos abort ();
2568 1.1.1.2 christos }
2569 1.1.1.2 christos
2570 1.1.1.2 christos static int
2571 1.1.1.2 christos decode_dsp32shiftimm_0 (int iw0, int iw1)
2572 1.1.1.2 christos {
2573 1.1.1.2 christos /* dsp32shiftimm
2574 1.1.1.2 christos +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+
2575 1.1.1.2 christos | 1 | 1 | 0 | 0 |.M.| 1 | 1 | 0 | 1 | - | - |.sopcde............|
2576 1.1.1.2 christos |.sop...|.HLs...|.dst0......|.immag.................|.src1......|
2577 1.1.1.2 christos +---+---+---+---|---+---+---+---|---+---+---+---|---+---+---+---+ */
2578 1.1.1.2 christos int sop = ((iw1 >> DSP32ShiftImm_sop_bits) & DSP32ShiftImm_sop_mask);
2579 1.1.1.2 christos int bit8 = ((iw1 >> 8) & 0x1);
2580 1.1.1.2 christos int dst0 = ((iw1 >> DSP32ShiftImm_dst0_bits) & DSP32ShiftImm_dst0_mask);
2581 1.1.1.2 christos int sopcde = ((iw0 >> (DSP32ShiftImm_sopcde_bits - 16)) & DSP32ShiftImm_sopcde_mask);
2582 1.1.1.2 christos int HLs = ((iw1 >> DSP32ShiftImm_HLs_bits) & DSP32ShiftImm_HLs_mask);
2583 1.1.1.2 christos
2584 1.1.1.2 christos
2585 1.1.1.2 christos if (sop == 0 && sopcde == 0)
2586 1.1.1.2 christos return HLs & 2 ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
2587 1.1.1.2 christos else if (sop == 1 && sopcde == 0 && bit8 == 0)
2588 1.1.1.2 christos return HLs & 2 ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
2589 1.1.1.2 christos else if (sop == 1 && sopcde == 0 && bit8 == 1)
2590 1.1.1.2 christos return HLs & 2 ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
2591 1.1.1.2 christos else if (sop == 2 && sopcde == 0 && bit8 == 0)
2592 1.1.1.2 christos return HLs & 2 ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
2593 1.1.1.2 christos else if (sop == 2 && sopcde == 0 && bit8 == 1)
2594 1.1.1.2 christos return HLs & 2 ? DREGH_MASK (dst0) : DREGL_MASK (dst0);
2595 1.1.1.2 christos else if (sop == 2 && sopcde == 3 && HLs == 1)
2596 1.1.1.2 christos return 0;
2597 1.1.1.2 christos else if (sop == 0 && sopcde == 3 && HLs == 0 && bit8 == 0)
2598 1.1.1.2 christos return 0;
2599 1.1.1.2 christos else if (sop == 0 && sopcde == 3 && HLs == 0 && bit8 == 1)
2600 1.1.1.2 christos return 0;
2601 1.1.1.2 christos else if (sop == 0 && sopcde == 3 && HLs == 1 && bit8 == 0)
2602 1.1.1.2 christos return 0;
2603 1.1.1.2 christos else if (sop == 0 && sopcde == 3 && HLs == 1 && bit8 == 1)
2604 1.1.1.2 christos return 0;
2605 1.1.1.2 christos else if (sop == 1 && sopcde == 3 && HLs == 0)
2606 1.1.1.2 christos return 0;
2607 1.1.1.2 christos else if (sop == 1 && sopcde == 3 && HLs == 1)
2608 1.1.1.2 christos return 0;
2609 1.1.1.2 christos else if (sop == 2 && sopcde == 3 && HLs == 0)
2610 1.1.1.2 christos return 0;
2611 1.1.1.2 christos else if (sop == 1 && sopcde == 1 && bit8 == 0)
2612 1.1.1.2 christos return DREG_MASK (dst0);
2613 1.1.1.2 christos else if (sop == 1 && sopcde == 1 && bit8 == 1)
2614 1.1.1.2 christos return DREG_MASK (dst0);
2615 1.1.1.2 christos else if (sop == 2 && sopcde == 1 && bit8 == 1)
2616 1.1.1.2 christos return DREG_MASK (dst0);
2617 1.1.1.2 christos else if (sop == 2 && sopcde == 1 && bit8 == 0)
2618 1.1.1.2 christos return DREG_MASK (dst0);
2619 1.1.1.2 christos else if (sop == 0 && sopcde == 1)
2620 1.1.1.2 christos return DREG_MASK (dst0);
2621 1.1.1.2 christos else if (sop == 1 && sopcde == 2)
2622 1.1.1.2 christos return DREG_MASK (dst0);
2623 1.1.1.2 christos else if (sop == 2 && sopcde == 2 && bit8 == 1)
2624 1.1.1.2 christos return DREG_MASK (dst0);
2625 1.1.1.2 christos else if (sop == 2 && sopcde == 2 && bit8 == 0)
2626 1.1.1.2 christos return DREG_MASK (dst0);
2627 1.1.1.2 christos else if (sop == 3 && sopcde == 2)
2628 1.1.1.2 christos return DREG_MASK (dst0);
2629 1.1.1.2 christos else if (sop == 0 && sopcde == 2)
2630 1.1.1.2 christos return DREG_MASK (dst0);
2631 1.1.1.2 christos
2632 1.1.1.2 christos abort ();
2633 1.1.1.2 christos }
2634 1.1.1.2 christos
2635 1.1.1.2 christos int
2636 1.1.1.2 christos insn_regmask (int iw0, int iw1)
2637 1.1.1.2 christos {
2638 1.1.1.2 christos if ((iw0 & 0xf7ff) == 0xc003 && iw1 == 0x1800)
2639 1.1.1.2 christos return 0; /* MNOP */
2640 1.1.1.2 christos else if ((iw0 & 0xff00) == 0x0000)
2641 1.1.1.2 christos return decode_ProgCtrl_0 (iw0);
2642 1.1.1.2 christos else if ((iw0 & 0xffc0) == 0x0240)
2643 1.1.1.2 christos abort ();
2644 1.1.1.2 christos else if ((iw0 & 0xff80) == 0x0100)
2645 1.1.1.2 christos abort ();
2646 1.1.1.2 christos else if ((iw0 & 0xfe00) == 0x0400)
2647 1.1.1.2 christos abort ();
2648 1.1.1.2 christos else if ((iw0 & 0xfe00) == 0x0600)
2649 1.1.1.2 christos abort ();
2650 1.1.1.2 christos else if ((iw0 & 0xf800) == 0x0800)
2651 1.1.1.2 christos abort ();
2652 1.1.1.2 christos else if ((iw0 & 0xffe0) == 0x0200)
2653 1.1.1.2 christos abort ();
2654 1.1.1.2 christos else if ((iw0 & 0xff00) == 0x0300)
2655 1.1.1.2 christos abort ();
2656 1.1.1.2 christos else if ((iw0 & 0xf000) == 0x1000)
2657 1.1.1.2 christos abort ();
2658 1.1.1.2 christos else if ((iw0 & 0xf000) == 0x2000)
2659 1.1.1.2 christos abort ();
2660 1.1.1.2 christos else if ((iw0 & 0xf000) == 0x3000)
2661 1.1.1.2 christos abort ();
2662 1.1.1.2 christos else if ((iw0 & 0xfc00) == 0x4000)
2663 1.1.1.2 christos abort ();
2664 1.1.1.2 christos else if ((iw0 & 0xfe00) == 0x4400)
2665 1.1.1.2 christos abort ();
2666 1.1.1.2 christos else if ((iw0 & 0xf800) == 0x4800)
2667 1.1.1.2 christos abort ();
2668 1.1.1.2 christos else if ((iw0 & 0xf000) == 0x5000)
2669 1.1.1.2 christos abort ();
2670 1.1.1.2 christos else if ((iw0 & 0xf800) == 0x6000)
2671 1.1.1.2 christos abort ();
2672 1.1.1.2 christos else if ((iw0 & 0xf800) == 0x6800)
2673 1.1.1.2 christos abort ();
2674 1.1.1.2 christos else if ((iw0 & 0xf000) == 0x8000)
2675 1.1.1.2 christos return decode_LDSTpmod_0 (iw0);
2676 1.1.1.2 christos else if ((iw0 & 0xff60) == 0x9e60)
2677 1.1.1.2 christos return decode_dagMODim_0 (iw0);
2678 1.1.1.2 christos else if ((iw0 & 0xfff0) == 0x9f60)
2679 1.1.1.2 christos return decode_dagMODik_0 (iw0);
2680 1.1.1.2 christos else if ((iw0 & 0xfc00) == 0x9c00)
2681 1.1.1.2 christos return decode_dspLDST_0 (iw0);
2682 1.1.1.2 christos else if ((iw0 & 0xf000) == 0x9000)
2683 1.1.1.2 christos return decode_LDST_0 (iw0);
2684 1.1.1.2 christos else if ((iw0 & 0xfc00) == 0xb800)
2685 1.1.1.2 christos return decode_LDSTiiFP_0 (iw0);
2686 1.1.1.2 christos else if ((iw0 & 0xe000) == 0xA000)
2687 1.1.1.2 christos return decode_LDSTii_0 (iw0);
2688 1.1.1.2 christos else if ((iw0 & 0xff80) == 0xe080 && (iw1 & 0x0C00) == 0x0000)
2689 1.1.1.2 christos abort ();
2690 1.1.1.2 christos else if ((iw0 & 0xff00) == 0xe100 && (iw1 & 0x0000) == 0x0000)
2691 1.1.1.2 christos abort ();
2692 1.1.1.2 christos else if ((iw0 & 0xfe00) == 0xe200 && (iw1 & 0x0000) == 0x0000)
2693 1.1.1.2 christos abort ();
2694 1.1.1.2 christos else if ((iw0 & 0xfc00) == 0xe400 && (iw1 & 0x0000) == 0x0000)
2695 1.1.1.2 christos abort ();
2696 1.1.1.2 christos else if ((iw0 & 0xfffe) == 0xe800 && (iw1 & 0x0000) == 0x0000)
2697 1.1.1.2 christos abort ();
2698 1.1.1.2 christos else if ((iw0 & 0xf600) == 0xc000 && (iw1 & 0x0000) == 0x0000)
2699 1.1.1.2 christos return decode_dsp32mac_0 (iw0, iw1);
2700 1.1.1.2 christos else if ((iw0 & 0xf600) == 0xc200 && (iw1 & 0x0000) == 0x0000)
2701 1.1.1.2 christos return decode_dsp32mult_0 (iw0, iw1);
2702 1.1.1.2 christos else if ((iw0 & 0xf7c0) == 0xc400 && (iw1 & 0x0000) == 0x0000)
2703 1.1.1.2 christos return decode_dsp32alu_0 (iw0, iw1);
2704 1.1.1.2 christos else if ((iw0 & 0xf780) == 0xc600 && (iw1 & 0x01c0) == 0x0000)
2705 1.1.1.2 christos return decode_dsp32shift_0 (iw0, iw1);
2706 1.1.1.2 christos else if ((iw0 & 0xf780) == 0xc680 && (iw1 & 0x0000) == 0x0000)
2707 1.1.1.2 christos return decode_dsp32shiftimm_0 (iw0, iw1);
2708 1.1.1.2 christos else if ((iw0 & 0xff00) == 0xf800)
2709 1.1.1.2 christos abort ();
2710 1.1.1.2 christos else if ((iw0 & 0xFFC0) == 0xf000 && (iw1 & 0x0000) == 0x0000)
2711 1.1.1.2 christos abort ();
2712 1.1.1.2 christos
2713 abort ();
2714 }
2715